/* ===================================================================
   ЭТЛ-Импульс — финальная сборка «Протокол».
   Основа: макет 08 (бланк протокола). Плакатный заголовок — из 05,
   но в умеренном кегле. Рубрикатор-листы — из 03.
   Палитра: брендовая синий/красный. Светлая тема, без стекла.
   =================================================================== */

:root{
  --ink:#0E1F33;
  --ink-2:#33445A;
  --ink-3:#5A6B80;
  --paper:#FFFFFF;
  --desk:#E9EEF4;          /* серо-голубая «парта», на которой лежит лист */
  --desk-2:#DFE7F0;
  --rule:#C4D2E0;
  --rule-2:#E4EBF3;
  --primary:#0A4E80;
  --primary-ink:#073A5E;
  --accent:#C3171C;
  --accent-strong:#D8151B;
  --pen:#0A4E80;           /* «синяя ручка» */
  --stamp:#C3171C;         /* штамп — красный бренд */
  --sans: Arial, Helvetica, sans-serif;
  --narrow: Arial, Helvetica, sans-serif;
  --serif: Georgia, "Times New Roman", serif;
  --hand: Georgia, "Times New Roman", serif;
  --mono: Arial, Helvetica, sans-serif; /* цифры и служебные подписи */
  --wrap:1200px;
  --chk:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M4.4 10.6c1.2.1 2.2 1.1 3.1 2.5.6-1.6 1.6-4.1 2.9-6.1 1.3-2 2.9-3.4 4.2-4.1' fill='none' stroke='%23C3171C' stroke-width='2.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
body{margin:0;font:400 17px/1.5 var(--sans);color:var(--ink);background:var(--desk)}
a{color:var(--primary);text-decoration-thickness:1px;text-underline-offset:3px}
a:hover{color:var(--accent)}
:focus-visible{outline:3px solid var(--accent);outline-offset:3px;box-shadow:0 0 0 6px #fff}
.top a:focus-visible,.contact a:focus-visible{box-shadow:0 0 0 6px var(--ink)}

.wrap{width:min(var(--wrap),100% - 48px);margin-inline:auto}
.visually-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}
.skip{position:absolute;left:12px;top:-60px;z-index:50;background:var(--ink);color:#fff;padding:10px 14px;font:600 14px/1 var(--sans);text-decoration:none}
.skip:focus{top:12px}

.hand{font-family:var(--serif);font-style:italic;font-weight:700;letter-spacing:.005em;color:var(--pen);font-size:1.06em;line-height:1.3}

/* ---------- Шапка ---------- */
.top{position:sticky;top:0;z-index:20;background:var(--paper);border-bottom:1px solid var(--rule)}
.top__row{display:flex;align-items:center;gap:24px;min-height:74px;padding-block:10px}
.brand{display:flex;align-items:center;gap:14px;text-decoration:none;flex:0 0 auto}
.brand__logo{width:auto;height:44px;display:block;flex:none}
.brand__sub{display:block;font:600 10px/1.35 var(--narrow);letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3);border-left:1px solid var(--rule);padding-left:14px}
.top__nav{display:flex;gap:24px;margin-left:auto}
.top__nav a{color:var(--ink-2);text-decoration:none;font:600 12.5px/1 var(--sans);letter-spacing:.09em;text-transform:uppercase;padding:10px 0;border-bottom:2px solid transparent}
.top__nav a:hover{color:var(--primary);border-bottom-color:var(--accent)}
.top__tel{display:flex;flex-direction:column;align-items:flex-end;gap:2px;border-left:1px solid var(--rule);padding-left:20px}
.tel{color:var(--ink);text-decoration:none;font:700 20px/1.1 var(--narrow);letter-spacing:.03em}
.tel:hover{color:var(--primary)}
.tel--alt{font:400 11.5px/1.1 var(--sans);color:var(--ink-3);letter-spacing:.03em}

/* =================== ЭКРАН 1: лист протокола =================== */
.sheet-wrap{padding:clamp(20px,4vw,48px) 0 clamp(28px,5vw,60px)}
.sheet{
  --cut:14px;
  position:relative;width:min(1080px,100% - 40px);margin-inline:auto;
  padding:clamp(24px,3.6vw,44px) clamp(22px,4.2vw,54px) clamp(26px,3.4vw,42px);
  background:
    repeating-linear-gradient(180deg,transparent 0 31px,rgba(10,78,128,.05) 31px 32px) 0 0/100% 100%,
    var(--paper);
  box-shadow:0 2px 0 rgba(10,30,50,.06),0 24px 48px -26px rgba(10,30,50,.35);
  -webkit-mask:
    linear-gradient(#000 0 0) top/100% calc(100% - var(--cut)) no-repeat,
    radial-gradient(circle at 50% -10px,#0000 20px,#000 20.5px) bottom/var(--cut) var(--cut) repeat-x;
  mask:
    linear-gradient(#000 0 0) top/100% calc(100% - var(--cut)) no-repeat,
    radial-gradient(circle at 50% -10px,#0000 20px,#000 20.5px) bottom/var(--cut) var(--cut) repeat-x;
}
.sheet::before{content:"";position:absolute;inset:0 0 auto 0;height:5px;background:var(--primary)}
.sheet::after{content:"";position:absolute;right:0;top:5px;width:5px;height:calc(100% - 5px);background:linear-gradient(180deg,var(--primary),var(--accent))}

.sheet__head{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,1.1fr) auto;gap:18px 36px;align-items:start;padding-bottom:16px;border-bottom:2px solid var(--ink)}
.sheet__org{display:flex;flex-direction:column;gap:2px}
.sheet__org strong{font:700 13px/1.3 var(--narrow);letter-spacing:.12em;text-transform:uppercase;color:var(--ink)}
.sheet__org span{font:400 12px/1.5 var(--mono);letter-spacing:.04em;color:var(--ink-3)}
.sheet__meta p{margin:0;font:600 11.5px/1.5 var(--narrow);letter-spacing:.14em;text-transform:uppercase;color:var(--ink-2)}
.sheet__meta p:nth-child(2){font-weight:400;letter-spacing:.06em;text-transform:none;color:var(--ink-3);font-family:var(--mono);font-size:11.5px}
.sheet__meta .hand{font-size:15px;letter-spacing:.02em;text-transform:none;margin-left:4px}
.sheet__date{display:flex;flex-direction:column;align-items:flex-end;gap:1px}
.sheet__date span:first-child{font:600 10px/1.4 var(--narrow);letter-spacing:.16em;text-transform:uppercase;color:var(--ink-3)}
.sheet__date .hand{font-size:19px;border-bottom:1.5px solid var(--pen);padding:0 4px 1px}

/* Заголовок: плакатная подача в нормальном кегле, две строки */
.sheet__title{
  margin:clamp(22px,3vw,34px) 0 clamp(18px,2.4vw,26px);
  font:700 clamp(30px,4.1vw,54px)/1.04 var(--narrow);
  letter-spacing:-.005em;text-transform:uppercase;color:var(--ink);
  max-width:24ch;text-wrap:balance;
}
.mark{position:relative;white-space:nowrap;color:var(--accent)}
.mark::after{content:"";position:absolute;left:-2px;right:-2px;bottom:.02em;height:.13em;background:var(--primary);opacity:.25}

/* Поля протокола */
.fields{display:grid;gap:0;margin:0;padding:0;border-top:1px solid var(--rule)}
.fields__row{display:grid;grid-template-columns:220px minmax(0,1fr);gap:16px 24px;padding:10px 0;border-bottom:1px solid var(--rule-2)}
.fields__row--wide{grid-template-columns:220px minmax(0,1fr)}
.fields dt{font:600 11px/1.9 var(--narrow);letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3)}
.fields dd{margin:0;min-width:0}
.fields dd.hand{font-size:clamp(17px,1.6vw,20px)}

/* Чекбоксы */
.checks{display:flex;flex-wrap:wrap;gap:8px 26px;padding-block:2px}
.tick{display:inline-flex;align-items:center;gap:9px;font:500 15px/1.3 var(--sans);color:var(--ink)}
.tick__box{position:relative;flex:0 0 auto;width:16px;height:16px;border:1.5px solid var(--primary)}
.tick__box::after{content:"";position:absolute;left:-6px;top:-7px;width:28px;height:28px;background:var(--chk) center/100% 100% no-repeat}
.chk{display:inline-flex;align-items:center;gap:9px;cursor:pointer;font:500 15px/1.3 var(--sans);color:var(--ink)}
.chk input{position:absolute;opacity:0;width:1px;height:1px;pointer-events:none}
.chk__box{position:relative;flex:0 0 auto;width:18px;height:18px;border:2px solid var(--ink);background:#fff}
.chk__box::after{content:"";position:absolute;left:-8px;top:-9px;width:36px;height:36px;background:var(--chk) center/100% 100% no-repeat;transform:scale(0);transform-origin:50% 50%;transition:transform .18s ease-out}
.chk input:checked + .chk__box{border-color:var(--stamp)}
.chk input:checked + .chk__box::after{transform:scale(1)}
.chk:hover .chk__box{border-color:var(--primary)}
.chk input:focus-visible + .chk__box{outline:3px solid var(--accent);outline-offset:3px;box-shadow:0 0 0 6px #fff}

/* Подпись + штамп + звонок */
.sheet__sign{display:grid;grid-template-columns:1fr auto 1fr;gap:clamp(16px,3vw,40px);align-items:end;margin-top:clamp(20px,2.6vw,30px)}
.sign__label{display:block;font:600 10.5px/1.6 var(--narrow);letter-spacing:.16em;text-transform:uppercase;color:var(--ink-3)}
.sign__hand{display:block;width:max-content;max-width:100%;font-size:clamp(22px,2.4vw,28px);border-bottom:1.5px solid var(--pen);padding:4px 6px 2px 2px;transform:rotate(-2deg)}
.seal{justify-self:center;display:grid;place-items:center;transform:rotate(-7deg);color:var(--stamp);opacity:.9}
.seal__box{display:grid;place-items:center;padding:8px 6px;border:3px double var(--stamp)}
.seal__ink{position:relative;display:grid;place-items:center;gap:1px;text-align:center;font:700 9.5px/1.35 var(--narrow);letter-spacing:.16em;text-transform:uppercase}
.seal__ink strong{font:700 clamp(15px,1.7vw,19px)/1 var(--sans);letter-spacing:.14em;padding-block:3px}
.seal__ring{position:absolute;inset:2px;border:1.5px solid var(--stamp);opacity:0;pointer-events:none}
.sheet__call{justify-self:end;display:flex;flex-direction:column;gap:2px;text-align:right}
.bigtel{font:700 clamp(22px,2.6vw,32px)/1.05 var(--narrow);letter-spacing:.02em;color:var(--ink);text-decoration:none;border-bottom:2px solid var(--accent);padding-bottom:2px;font-variant-numeric:tabular-nums}
.bigtel:hover{color:var(--primary);border-bottom-color:var(--primary)}
.bigtel--sm{font-size:clamp(16px,1.6vw,19px);border-bottom-width:1px;color:var(--ink-2);margin-top:4px;align-self:flex-end}
.sheet__foot{margin-top:clamp(18px,2.4vw,28px);padding-top:12px;border-top:1px solid var(--rule);display:flex;flex-wrap:wrap;gap:6px 28px;font:400 12px/1.5 var(--mono);color:var(--ink-3)}

/* =================== Экран 2: рубрикатор-лист (из 03) =================== */
.works{padding:clamp(36px,5vw,68px) 0 clamp(38px,5vw,72px);background:var(--paper);border-top:3px solid var(--ink)}
.works__head{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,360px);grid-template-areas:"eyebrow eyebrow" "title lead";gap:10px 40px;align-items:end;margin-bottom:clamp(18px,2.6vw,28px);padding-bottom:14px;border-bottom:3px solid var(--ink);position:relative}
.works__head h2{grid-area:title}
.works__head .works__lead{grid-area:lead}

.eyebrow{margin:0 0 8px;font:700 11px/1.4 var(--narrow);letter-spacing:.22em;text-transform:uppercase;color:var(--accent)}
.works__head .eyebrow{grid-area:eyebrow}
.works h2{margin:0;font:700 clamp(30px,3.6vw,44px)/1 var(--narrow);letter-spacing:-.005em;text-transform:uppercase}
.works__lead{margin:0;color:var(--ink-2);font-size:14.5px;line-height:1.55}

.depts{display:grid;gap:0;border-top:1px solid var(--rule)}
.dept{display:grid;grid-template-columns:64px minmax(0,1.05fr) minmax(0,1.6fr);gap:24px 32px;padding:20px 0;border-bottom:1px solid var(--rule)}
.dept__no{font:700 13px/1.4 var(--mono);color:var(--accent);letter-spacing:.08em}
.dept__title{margin:0;font:700 clamp(18px,1.9vw,23px)/1.15 var(--narrow);text-transform:uppercase;letter-spacing:.01em;color:var(--ink)}
.dept__title small{display:block;font:400 11px/1.4 var(--mono);letter-spacing:.1em;color:var(--ink-3);text-transform:none;margin-top:5px}
.dept__list{margin:0;padding:0;list-style:none;display:grid;gap:6px}
.dept__list li{position:relative;padding-left:18px;font-size:15px;line-height:1.45;color:var(--ink-2)}
.dept__list li::before{content:"";position:absolute;left:0;top:.62em;width:8px;height:2px;background:var(--primary)}
.dept__list em{font:600 11px/1 var(--mono);font-style:normal;color:var(--ink-3);white-space:nowrap;padding-left:6px}
.tag{display:inline-block;margin-left:6px;padding:1px 5px;border:1px solid var(--accent);color:var(--accent);font:700 9.5px/1.5 var(--narrow);letter-spacing:.1em;text-transform:uppercase;vertical-align:2px}

/* Таблица протокола */
.price{margin-top:clamp(24px,3.4vw,36px);background:var(--paper);border:1px solid var(--rule)}
.price__note{margin:0;padding:12px 16px;border-top:1px solid var(--rule);font:italic 400 13px/1.55 var(--serif);color:var(--ink-3)}
.price caption{text-align:left;padding:14px 16px 12px;font:700 13px/1.3 var(--sans);letter-spacing:.12em;text-transform:uppercase;color:var(--ink);border-bottom:1px solid var(--rule)}
.tbl{margin-top:clamp(24px,3.4vw,36px);background:var(--paper);border:1px solid var(--rule)}
.price table,.tbl table{width:100%;border-collapse:collapse;table-layout:fixed}
.price thead th,.tbl thead th{background:var(--ink);color:#fff;font:600 10.5px/1.3 var(--narrow);letter-spacing:.14em;text-transform:uppercase;padding:11px 14px;text-align:left}
.price tbody td,.tbl tbody td{padding:10px 14px;border-bottom:1px solid var(--rule-2);font-size:15px;color:var(--ink-2)}
.price tbody tr:hover td,.tbl tbody tr:hover td{background:var(--desk-2)}
.price .c-chk,.tbl .c-chk{width:52px;padding-right:0}
.price .c-no,.tbl .c-no{width:64px;font-family:var(--mono);font-size:12.5px;letter-spacing:.04em;color:var(--ink-3)}
.price .c-norm,.tbl .c-norm{width:170px;font-family:var(--mono);font-size:12px;color:var(--ink-3);white-space:nowrap}
.price .c-res,.tbl .c-res{width:150px;white-space:nowrap}
.price thead th.c-norm,.price thead th.c-res,.tbl thead th.c-norm,.tbl thead th.c-res{font-size:9.5px;letter-spacing:.08em}
.price tr.group td,.price tr.group th,.tbl tr.group td,.tbl tr.group th{background:var(--desk-2);font:700 10.5px/1.3 var(--narrow);letter-spacing:.16em;text-transform:uppercase;color:var(--primary);border-bottom:1px solid var(--rule);padding:8px 14px}
.tbl .chk{font-size:0}
.tbl .chk__box{display:block}
.tbl .chk__box::after{left:-7px;top:-8px;width:32px;height:32px}
.works__note{margin:16px 0 0;font:400 12px/1.6 var(--mono);color:var(--ink-3)}
.works__note a{font-family:var(--sans);font-size:13.5px}

/* Аттестат + ПИЛ */
.doc{padding:clamp(36px,5vw,64px) 0;background:var(--desk)}
.doc__grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.15fr);gap:clamp(24px,4vw,56px);align-items:start}
.doc h2{margin:0 0 18px;font:700 clamp(26px,3vw,38px)/1.05 var(--narrow);text-transform:uppercase;letter-spacing:-.005em;color:var(--ink)}
.doc__list{margin:0;padding:0;list-style:none;border-top:2px solid var(--ink)}
.doc__list li{display:grid;grid-template-columns:150px minmax(0,1fr);gap:14px;padding:9px 0;border-bottom:1px solid var(--rule)}
.doc__list span{font:600 10.5px/1.9 var(--narrow);letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3)}
.doc__list strong{font-weight:700;color:var(--ink);font-size:15px}
.doc__list .hand{font-size:18px}
.doc__addr{margin:14px 0 0;font:400 12px/1.6 var(--mono);color:var(--ink-3)}
.pil{margin:0;background:var(--paper);border:1px solid var(--rule);padding:10px 10px 0;align-self:start}
.pil img{width:100%;height:auto;max-height:420px;object-fit:cover;object-position:50% 60%;border:1px solid var(--rule);filter:saturate(.95)}
.pil figcaption{padding:9px 2px 12px;font-size:13px;line-height:1.5;color:var(--ink-2)}
.pil figcaption .hand{font-size:15px;font-weight:700}

/* Контакты */
.contact{padding:clamp(34px,5vw,60px) 0;background:var(--ink);color:#fff}
.contact__grid{display:grid;grid-template-columns:minmax(0,.8fr) minmax(0,1.3fr) minmax(0,.9fr);gap:32px;align-items:center}
.contact h2{margin:0;font:700 clamp(24px,3vw,34px)/1.05 var(--narrow);text-transform:uppercase;letter-spacing:.01em;color:#fff}
.contact__tel{list-style:none;margin:0;padding:0;display:grid;gap:10px}
.contact__tel a{display:flex;align-items:baseline;gap:14px;color:#fff;text-decoration:none;font:700 clamp(19px,2.3vw,27px)/1.1 var(--narrow);letter-spacing:.03em;border-bottom:1px solid rgba(255,255,255,.25);padding-bottom:8px}
.contact__tel a:hover{color:#FFD9DA;border-bottom-color:var(--accent-strong)}
.contact__tel span{flex:0 0 150px;font:500 10.5px/1.5 var(--narrow);letter-spacing:.13em;text-transform:uppercase;color:#9FB4C8}
.contact__mail a{color:#fff;font:600 15px/1.4 var(--sans);text-decoration:none;border-bottom:1px solid var(--accent-strong)}
.contact__mail a:hover{color:#FFD9DA}
.contact__mail p{margin:8px 0 0;font:400 12px/1.6 var(--mono);color:#9FB4C8}

.foot{background:var(--ink);color:#7E93A8;padding:0 0 26px}
.foot>.wrap{border-top:1px solid rgba(255,255,255,.16);padding-top:16px}
.foot__row{display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap;font:400 11.5px/1.6 var(--mono)}

/* Мобильная панель звонка */
.callbar{display:none}

@media (max-width:1000px){
  .top__nav{display:none}
  .top__tel{margin-left:auto}
  .sheet__head{grid-template-columns:1fr auto;gap:12px 20px}
  .sheet__meta{grid-column:1/-1;order:3}
  .works__head{grid-template-columns:1fr}
  .dept{grid-template-columns:44px minmax(0,1fr);gap:8px 16px}
  .dept__list{grid-column:2}
  .doc__grid{grid-template-columns:1fr}
  .contact__grid{grid-template-columns:1fr;gap:22px}
  .contact__tel a{font-size:22px}
}
@media (max-width:640px){
  body{font-size:16px}
  .wrap{width:calc(100% - 24px)}
  .top__row{min-height:auto;flex-wrap:wrap;gap:8px;padding-block:9px}
  .brand__logo{width:auto;height:30px}
  .brand__sub{display:none}
  .tel{font-size:16px}
  .tel--alt{display:none}
  .sheet{width:calc(100% - 16px);padding:20px 16px 26px}
  .sheet__title{font-size:clamp(25px,7.6vw,34px);max-width:100%}
  .fields__row,.fields__row--wide{grid-template-columns:1fr;gap:2px}
  .checks{gap:8px 18px}
  .sheet__sign{grid-template-columns:1fr;justify-items:start;gap:16px;text-align:left}
  .sheet__call{justify-self:start;text-align:left}
  .bigtel{align-self:flex-start}
  .stamp{justify-self:start}
  .tbl{overflow-x:auto}
  .price .c-norm,.tbl .c-norm{display:none}
  .price .c-res,.tbl .c-res{width:84px}
  .contact__tel a{flex-direction:column;gap:2px}
  .contact__tel span{flex:none}
  body{padding-bottom:70px}
  .callbar{display:flex;position:fixed;left:0;right:0;bottom:0;z-index:50;align-items:center;justify-content:center;min-height:56px;background:var(--accent);color:#fff;font:700 16px/1.2 var(--narrow);letter-spacing:.06em;text-transform:uppercase;text-decoration:none}
  .callbar:hover{color:#fff;background:var(--accent-strong)}
}

/* =================== Пределы лаборатории =================== */
/* Полоса пределов стоит с отступом от листа: бланк должен читаться листом,
   а зубчики снизу — его край. Вплотную прилепленная тёмная полоса их съедает. */
.meter{background:var(--ink);color:#fff;padding:clamp(12px,1.6vw,18px) 0 clamp(14px,1.8vw,20px)}
.meter__row{display:grid;grid-template-columns:132px minmax(0,1fr) 64px;gap:clamp(12px,2vw,24px);align-items:center}
.meter__tag{display:grid;gap:2px;align-content:center}
.meter__title{margin:0;font:700 11px/1.3 var(--narrow);letter-spacing:.18em;text-transform:uppercase;color:#fff}
.meter__title::before{content:"";display:inline-block;width:8px;height:8px;background:var(--accent);margin-right:8px;vertical-align:1px}
.meter__scope{margin:0;font:400 10px/1.4 var(--mono);letter-spacing:.04em;color:#9FB4C8}
.meter__read{margin:0;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border-left:1px solid rgba(255,255,255,.28)}
.meter__item{display:grid;gap:1px;align-content:center;padding:2px 10px 2px 14px;border-right:1px solid rgba(255,255,255,.18);min-width:0}
.meter__cap{margin:0;font:600 8.5px/1.4 var(--narrow);letter-spacing:.1em;text-transform:uppercase;color:#9FB4C8;white-space:nowrap}
.meter__val{margin:0;display:flex;align-items:baseline;gap:4px;font:700 clamp(20px,2.2vw,28px)/1.05 var(--narrow);letter-spacing:-.01em;color:#fff;font-variant-numeric:tabular-nums;white-space:nowrap}
.meter__sub{margin:0;font:400 10.5px/1.4 var(--mono);color:#7E93A8;white-space:nowrap}
.meter__item--on .meter__val{color:#FF4A4E}
.meter__item--on .meter__cap{color:#FFD9DA}
.meter__stack{position:relative;margin:0;width:64px;height:30px;display:grid;gap:6px;align-content:center}
.meter__stack i{display:block;height:2px;background:#fff;transform:scaleX(0);transform-origin:0 50%}
.meter__stack i:nth-child(2){background:var(--accent-strong)}
.meter__stack i:nth-child(3){background:#9FB4C8;height:1.5px}

/* =================== Анимация: бланк заполняется, печать ставится =================== */
/* Только transform, opacity и clip. Текст не двигается и ни на что не наезжает:
   поле проявляется слева направо, как будто его проводят ручкой.
   Без класса js (скрипт не отработал) всё стоит сразу готовым. */

/* --- Синяя ручка: поля бланка вписываются слева направо --- */
html.js .fields__row dd.hand,
html.js .sheet__date .hand,
html.js .sign__hand{
  animation-delay:0s;
  clip-path:inset(-14% 100% -14% -6%);
  animation:v-write 720ms cubic-bezier(.33,.05,.27,.99) both;
}
html.js .fields__row:nth-child(1) dd.hand{animation-delay:140ms}
html.js .fields__row:nth-child(2) dd.hand{animation-delay:400ms}
html.js .fields__row:nth-child(3) dd.hand{animation-delay:800ms}
html.js .fields__row:nth-child(4) dd.hand{animation-delay:1200ms}
html.js .sheet__date .hand{animation-delay:260ms}
html.js .sign__hand{animation-delay:1520ms}

/* --- Галочки ставятся по очереди после полей --- */
html.js .tick .tick__box::after{animation:v-tick 160ms cubic-bezier(.2,0,0,1) both}
html.js .tick:nth-child(2) .tick__box::after{animation-delay:1660ms}
html.js .tick:nth-child(3) .tick__box::after{animation-delay:1780ms}
html.js .tick:nth-child(4) .tick__box::after{animation-delay:1900ms}
html.js .tick:nth-child(5) .tick__box::after{animation-delay:2020ms}

/* --- Печать ставится последней --- */
html.js .seal__ink{animation:v-stamp 480ms cubic-bezier(.42,0,.58,1) 2150ms both}
html.js .seal__ring{animation:v-ring 300ms ease-out 2560ms both}
html.js .meter__stack i{animation:v-skn 260ms cubic-bezier(.2,0,0,1) both}
html.js .meter__stack i:nth-child(1){animation-delay:2700ms}
html.js .meter__stack i:nth-child(2){animation-delay:2810ms}
html.js .meter__stack i:nth-child(3){animation-delay:2920ms}

@keyframes v-write{from{clip-path:inset(-14% 100% -14% -6%)}to{clip-path:inset(-14% -6% -14% -6%)}}
@keyframes v-tick{from{transform:scale(0)}60%{transform:scale(1.18)}to{transform:scale(1)}}
@keyframes v-stamp{
  0%{opacity:0;transform:translateY(-230px) rotate(6deg)}
  35%{opacity:.35}
  60%{opacity:.8}
  100%{opacity:1;transform:translateY(0) rotate(0)}
}
@keyframes v-ring{0%{opacity:.85;transform:scale(.92)}100%{opacity:0;transform:scale(1.06)}}
@keyframes v-skn{from{transform:scaleX(0)}to{transform:scaleX(1)}}

/* Рамка печати одного размера всегда, на всё время анимации. Воздух над
   ней на время полёта даёт не рамка, а высота полёта в самом кадре: печать
   сдвигается на столько же, на сколько раньше рамка была больше. */
html.js .seal__box{overflow:hidden;padding:8px 6px}


/* =================== Анимация: остальные экраны =================== */
/* Общий приём один: элемент проявляется слева направо или по строкам,
   ничего не подпрыгивает и не сдвигается по вертикали, поэтому текст
   читается с первого кадра, а движение только добавляет ему ход.

   Класс is-live живёт на элементе, пока он в кадре, и снимается после:
   подсветки и проявления не копятся в памяти. Без JS (нет класса js) и
   при reduce всё стоит готовым, класс is-live ни на что не влияет. */

/* --- Шапка раздела: надзаголовок и черта --- */
html.js .works__head.is-live .eyebrow{animation:w-fade 320ms ease-out both}
html.js .works__head.is-live h2{animation:w-sketch 420ms cubic-bezier(.2,0,0,1) 90ms both}
html.js .works__head.is-live .works__lead{animation:w-fade 360ms ease-out 150ms both}
/* Черта под шапкой — та же рамка снизу, только проведённая слева направо:
   фон-подложка нужной толщины подчиняется по горизонтали, сам текст стоит. */
html.js .works__head.is-live{animation:w-underline 460ms cubic-bezier(.2,0,0,1) 40ms both}
@keyframes w-underline{
  from{border-bottom-color:transparent;background:linear-gradient(var(--ink),var(--ink)) left bottom/0 3px no-repeat}
  to{border-bottom-color:var(--ink);background:linear-gradient(var(--ink),var(--ink)) left bottom/100% 3px no-repeat}
}

/* --- Четыре направления: у каждого свой номер и свои часы --- */
/* Часы теперь у каждого блока СВОИ: класс is-live ставит сам anim.js,
   когда блок сам входит в кадр. Поэтому триггер — .dept, а номер блока
   функция от тега (.dept:nth-child), а не шаг к общему контейнеру. Часы
   внутри блока одни: номер, заголовок, подпись, пункты по очереди.
   На телефоне раздел не влезает в экран целиком, и общий старт на .depts
   отыгрывал все четыре блока сразу, пока человек видел только первый. */
html.js .dept.is-live .dept__no{animation:w-ignite 900ms ease-out both}
html.js .dept.is-live .dept__title{animation:w-fade 300ms ease-out 100ms both}
html.js .dept.is-live .dept__list li{animation:w-fade 260ms ease-out both}
html.js .dept.is-live .dept__list li:nth-child(1){animation-delay:160ms}
html.js .dept.is-live .dept__list li:nth-child(2){animation-delay:220ms}
html.js .dept.is-live .dept__list li:nth-child(3){animation-delay:280ms}
html.js .dept.is-live .dept__list li:nth-child(4){animation-delay:340ms}
html.js .dept.is-live .dept__list li:nth-child(5){animation-delay:400ms}

/* Блоки 02-04 короткие, поэтому идут одним ходом: номер вспыхивает,
   заголовок и пункты проявляются почти одновременно. */
html.js .dept:nth-child(n+2).is-live .dept__no{animation:w-flare 480ms ease-out both}
html.js .dept:nth-child(n+2).is-live .dept__title{animation:w-fade 280ms ease-out 60ms both}
html.js .dept:nth-child(n+2).is-live .dept__list li:nth-child(1){animation-delay:110ms}
html.js .dept:nth-child(n+2).is-live .dept__list li:nth-child(2){animation-delay:160ms}
html.js .dept:nth-child(n+2).is-live .dept__list li:nth-child(3){animation-delay:210ms}
html.js .dept:nth-child(n+2).is-live .dept__list li:nth-child(4){animation-delay:260ms}
html.js .dept:nth-child(n+2).is-live .dept__list li:nth-child(5){animation-delay:310ms}

/* --- Таблица: она цитирует нумерацию работ, поэтому блоки отвечают в тот же ход ---
   Подсветка живёт на псевдоэлементе ::before, а не на самом .dept: у .dept
   теперь свои часы (нумер + пункты по is-live), а свойство animation —
   одно на элемент. Анимация на .dept перекрывала бы их, и блок после
   восстановления на ::before (снятие is-citing) оставался без хода. */
html.js .depts .dept{position:relative}
html.js .depts .dept::before{content:"";position:absolute;inset:0;
  pointer-events:none;opacity:0}
html.js .depts.is-citing .dept::before{animation:w-redraw 460ms cubic-bezier(.2,0,0,1) both}
html.js .depts.is-citing .dept:nth-child(1)::before{animation-delay:40ms}
html.js .depts.is-citing .dept:nth-child(2)::before{animation-delay:90ms}
html.js .depts.is-citing .dept:nth-child(3)::before{animation-delay:140ms}
html.js .depts.is-citing .dept:nth-child(4)::before{animation-delay:190ms}
/* Строки идут волной сверху вниз, как абзацы бланка: шаг 55 мс, сам ход
   260 мс. Групповые строки (ЭЛЕКТРОТЕХНИЧЕСКИЕ ИЗМЕРЕНИЯ и т.д.) идут
   первыми в своей тройке: они открывают раздел. */
html.js .price.is-citing tbody tr{animation:w-reveal 260ms ease-out both}
html.js .price.is-citing thead tr{animation:w-fade 220ms ease-out both}
html.js .price.is-citing tbody tr:nth-child(1){animation-delay:80ms}
html.js .price.is-citing tbody tr:nth-child(2){animation-delay:125ms}
html.js .price.is-citing tbody tr:nth-child(3){animation-delay:170ms}
html.js .price.is-citing tbody tr:nth-child(4){animation-delay:215ms}
html.js .price.is-citing tbody tr:nth-child(5){animation-delay:260ms}
html.js .price.is-citing tbody tr:nth-child(6){animation-delay:305ms}
html.js .price.is-citing tbody tr:nth-child(7){animation-delay:350ms}
html.js .price.is-citing tbody tr:nth-child(8){animation-delay:395ms}
html.js .price.is-citing tbody tr:nth-child(9){animation-delay:440ms}
html.js .price.is-citing tbody tr:nth-child(10){animation-delay:485ms}
html.js .price.is-citing tbody tr:nth-child(11){animation-delay:530ms}
html.js .price.is-citing tbody tr:nth-child(12){animation-delay:575ms}
html.js .price.is-citing tbody tr:nth-child(13){animation-delay:620ms}
html.js .price.is-citing caption{animation:w-fade 260ms ease-out both}
html.js .price.is-citing .price__note{animation:w-fade 300ms ease-out 700ms both}

/* --- Аттестат: строки вписываются по очереди, как в первом бланке --- */
html.js .doc__text.is-live .doc__list li,
html.js .doc__text.is-live h2,
html.js .doc__text.is-live .eyebrow{
  animation:w-reveal 340ms ease-out both;
}
html.js .doc__text.is-live .eyebrow{animation-delay:0ms}
html.js .doc__text.is-live h2{animation-delay:90ms}
html.js .doc__text.is-live .doc__list li:nth-child(1){animation-delay:220ms}
html.js .doc__text.is-live .doc__list li:nth-child(2){animation-delay:290ms}
html.js .doc__text.is-live .doc__list li:nth-child(3){animation-delay:360ms}
html.js .doc__text.is-live .doc__list li:nth-child(4){animation-delay:430ms}
html.js .doc__text.is-live .doc__list li:nth-child(5){animation-delay:500ms}
html.js .doc__text.is-live .doc__list strong.hand{
  animation:w-write 480ms cubic-bezier(.33,.05,.27,.99) both;
}
html.js .doc__text.is-live .doc__list li:nth-child(1) strong.hand{animation-delay:320ms}
html.js .doc__text.is-live .doc__list li:nth-child(2) strong.hand{animation-delay:390ms}
html.js .doc__text.is-live .doc__list li:nth-child(5) strong.hand{animation-delay:600ms}


/* --- Ключевые кадры --- */
@keyframes w-fade{from{opacity:0}to{opacity:1}}
@keyframes w-reveal{
  from{opacity:0;clip-path:inset(0 100% 0 0)}
  to{opacity:1;clip-path:inset(0 0 0 0)}
}
@keyframes w-write{from{opacity:0;clip-path:inset(-14% 100% -14% -4%)}to{opacity:1;clip-path:inset(-14% -4% -14% -4%)}}
@keyframes w-sketch{
  from{opacity:0;transform:translateX(-14px)}
  to{opacity:1;transform:none}
}
@keyframes w-ignite{
  0%{color:var(--ink-3);transform:scale(.9)}
  50%{color:var(--accent);transform:scale(1.08)}
  100%{color:var(--accent);transform:none}
}
@keyframes w-flare{
  0%{color:var(--ink-3);transform:translateX(-6px)}
  55%{color:var(--accent);transform:translateX(0)}
  100%{color:var(--accent);transform:none}
}
@keyframes w-frame{from{clip-path:inset(0 0 100% 0)}to{clip-path:inset(0 0 0 0)}}
@keyframes w-redraw{0%{box-shadow:inset 0 0 0 0 transparent}40%{box-shadow:inset 0 -2px 0 0 var(--accent)}100%{box-shadow:inset 0 0 0 0 transparent}}
/* Снимок не масштабируем: он не должен выходить за свою рамку и налезать
   на соседнюю колонку. Только цвет и контраст, рамка обрезает сверху вниз. */
@keyframes w-develop{
  from{filter:grayscale(.9) contrast(1.1) brightness(.92)}
  to{filter:grayscale(0) contrast(1) brightness(1)}
}

/* --- ПИЛ: снимок проявляется и кадрируется, без подъёма страницы --- */
html.js .pil.is-live{animation:w-frame 520ms cubic-bezier(.2,0,0,1) 60ms both}
html.js .pil.is-live img{animation:w-develop 900ms ease-out 80ms both}
html.js .pil.is-live figcaption{animation:w-fade 300ms ease-out 260ms both}

/* --- Контакты: заголовок и номера выставляются по одному --- */
html.js .contact.is-live h2{animation:w-reveal 380ms ease-out both}
html.js .contact.is-live .contact__tel li{animation:w-reveal 380ms ease-out both}
html.js .contact.is-live .contact__tel li:nth-child(1){animation-delay:140ms}
html.js .contact.is-live .contact__tel li:nth-child(2){animation-delay:230ms}
html.js .contact.is-live .contact__tel li:nth-child(3){animation-delay:320ms}
html.js .contact.is-live .contact__mail{animation:w-reveal 380ms ease-out 380ms both}

@media (prefers-reduced-motion:reduce){
  html.js .fields__row dd.hand,
  html.js .sheet__date .hand,
  html.js .sign__hand{animation:none!important;clip-path:none!important}
  html.js .seal__ink{animation:none!important;opacity:1;transform:none}
  html.js .seal__ring{display:none}
  html.js .tick .tick__box::after{animation:none!important;transform:none}
  html.js .meter__stack i{animation:none!important;transform:scaleX(1)}
  /* Экраны ниже первого: всё стоит готовым, ни одного хода. */
  html.js .is-live *,
  html.js .is-citing *{animation:none!important;opacity:1!important;transform:none!important;clip-path:none!important}
  html.js .is-live::after{animation:none!important;transform:none!important}
  html.js .pil img{filter:saturate(.95)}
}

@media (max-width:760px){
  .meter__row{grid-template-columns:1fr;gap:10px}
  .meter__read{grid-template-columns:repeat(2,minmax(0,1fr));border-left:0;gap:10px 0}
  .meter__stack{display:none}
  .meter__item{padding-block:4px}
  .meter__item:nth-child(1),.meter__item:nth-child(2){border-bottom:1px solid rgba(255,255,255,.18)}
  .meter__item:nth-child(odd){border-left:1px solid rgba(255,255,255,.28)}
  .meter__sub{white-space:normal}
  /* Мобильная полоса «Позвонить» прижата к низу окна: даём ей высоту в
     отступе, иначе строка табло уходит под кнопку. */
  .meter{padding-bottom:calc(22px + 56px)}
}

@media (prefers-reduced-motion:reduce){
  html.js .seal__ink{animation:none!important;opacity:1;transform:none}
  html.js .seal__ring{display:none}
  html.js .tick .tick__box::after{animation:none!important;transform:none}
  html.js .meter__stack i{animation:none!important;transform:scaleX(1)}
}

@media (prefers-reduced-motion:reduce){*{transition:none!important;scroll-behavior:auto!important}}
@media print{
  body{background:#fff}
  .top,.contact,.foot,.callbar,.works,.meter{display:none}
  .sheet{box-shadow:none;-webkit-mask:none;mask:none;width:100%}
}

/* ===================================================================
   Мобильная вёрстка: работы и контакты (агент B)
   -------------------------------------------------------------------
   Зона: .works (шапка раздела, направления, таблица работ, строка
   телефонов), .doc (аттестат + ПИЛ), .contact, .foot.
   Всё дописано в конец файла: исходные строки не менялись, мешающее
   переопределено составными селекторами (html body .works …), поэтому
   порядок правил выше по файлу на результат не влияет.
   Только max-width: 360, 430, 640, 768, 1000. Без JS и inline-стилей.

   Правка по разметке (агент A): eyebrow/h2/lead обёрнуты в
   <div class="wrap"> внутри .works__head. Шапка сама лежит в .wrap,
   вложенная обёртка нейтрализована (width:auto; margin:0) на всех
   ширинах, а на <1000 шапка — обычный поток блоков.
   =================================================================== */

/* ---------- 1. Мера строки и переносы: ни одного разрыва посреди слова ---------- */
/* Перенос по слогам и неудержимые длинные токены рвут «Могилевская»,
   «лаборатория» и «63-99-94». В зоне выключаем hyphens, слова ломаются
   только если физически не влезли (overflow-wrap), а телефоны, e-mail,
   адрес и подвал с УНП не рвутся никогда. */
html body .works,
html body .doc,
html body .contact,
html body .foot{-webkit-hyphens:none;hyphens:none;overflow-wrap:break-word}
html body .works a[href^="tel:"],
html body .contact a[href^="tel:"],
html body .works a[href^="mailto:"],
html body .contact a[href^="mailto:"],
html body .doc .doc__addr,
html body .foot .foot__row span{overflow-wrap:normal;word-break:normal}
html body .contact a[href^="tel:"]{white-space:nowrap}

/* ---------- 2. Шапка раздела «Что выполняем»: поток в одну колонку ---------- */
/* База держит решётку «eyebrow» / «title | lead» с колонкой лида 360px.
   На узком экране лид встаёт справа от заголовка и сжимается до 105px
   (на 320 — столбик из 10–12 букв). Решётка снята с 1000: eyebrow →
   заголовок → лид; мера лида 64ch; заголовок — во всю ширину раздела. */
html body .works .works__head .wrap{width:auto;margin:0;max-width:none}
@media (max-width:1000px){
  html body .works .works__head{display:block}
  html body .works .works__head .wrap{display:block;width:auto;margin:0;
    max-width:none}
  html body .works .works__head .eyebrow{margin:0 0 10px}
  html body .works .works__head h2{max-width:100%;margin:0 0 12px}
  html body .works .works__lead{max-width:64ch;margin:0;hyphens:none;
    overflow-wrap:break-word}
}

/* ---------- 3. Направления .dept: карточка «номер + заголовок + список» ---------- */
/* База на <1000 переводит карточку в 44px + 1fr, и <small> под заголовком
   слипается с ним («Электротехнические измеренияустановки до 1000 В»).
   Здесь номер — строка-метка с линейкой, заголовок под ним на всю ширину,
   <small> отдельным блоком с отступом, список — ниже, на всю ширину. */
@media (max-width:768px){
  html body .works .depts{border-top:2px solid var(--ink)}
  html body .works .dept{grid-template-columns:minmax(0,1fr);gap:0;
    padding:16px 0 18px;border-bottom:1px solid var(--rule)}
  html body .works .dept__no{display:flex;align-items:baseline;gap:8px;
    font-size:12.5px;line-height:1.2;letter-spacing:.1em;margin:0 0 6px}
  html body .works .dept__no::after{content:"";flex:1 1 auto;height:1px;
    background:var(--rule-2);transform:translateY(-3px)}
  html body .works .dept__title{min-width:0;margin:0;font-size:clamp(17px,4.6vw,21px);
    line-height:1.2;letter-spacing:.01em;hyphens:none;overflow-wrap:break-word}
  html body .works .dept__title small{display:block;margin:6px 0 0;
    font:400 11.5px/1.45 var(--sans);letter-spacing:.01em;color:var(--ink-3);
    white-space:normal}
  html body .works .dept__list{grid-column:1 / -1;display:grid;gap:8px;
    margin:12px 0 0;padding:0}
  html body .works .dept__list li{min-width:0;padding-left:16px;font-size:15px;
    line-height:1.45;letter-spacing:0;hyphens:none;overflow-wrap:break-word}
  html body .works .dept__list li::before{top:.66em;width:7px}
  /* номер позиции области — отдельной строкой под пунктом, а не
     приклеенным к последнему слову («…и контура  20.2») */
  html body .works .dept__list em{display:block;padding:3px 0 0;font-size:11.5px;
    line-height:1.3;letter-spacing:.06em;color:var(--ink-3);white-space:nowrap}
}

/* ---------- 4. Таблица работ .price: карточки вместо узкой таблицы ---------- */
/* На <640 база прячет колонку «Объект», и от неё остаются пустые места:
   строка превращается в «1.1 / Заземление, / контур / заземления /
   в аккредитации» на 4–6 строк. Здесь каждая работа — карточка:

       № 1.1
       Заземление, контур заземления
       ОБЪЕКТ    установки до 1000 В
       ДОКУМЕНТ  протокол

   Данные не дублируются и текст не меняется: подписи полей даёт
   ::before (content), значения берутся из исходных ячеек <td>. Групповые
   строки остаются заголовками групп на всю ширину, <table> и <th scope>
   остаются в DOM для скринридера.
   ВАЖНО: база (max-width:640px) даёт .price .c-norm display:none, а
   .c-res width:84px и .price .c-norm width:170px остаются из базовых
   правил. Всё это перекрывается здесь: таблица снимается в block,
   ячейкам возвращается width:auto и display:flex, иначе ячейки встают
   колонками поверх друг друга. */
@media (max-width:640px){
  /* <caption> позиционируется от табличной рамки, а thead на мобиле
     скрыта клипом — подпись обрезалась вместе с ней. Уводим .price в
     relative и прибиваем подпись к контейнеру. */
  html body .works .price{position:relative;margin-top:20px;padding-top:40px;
    border:0;background:transparent}
  html body .works .price caption{position:absolute;left:0;right:0;top:0;margin:0;
    padding:0 0 10px;font-size:12px;letter-spacing:.1em;
    border-bottom:2px solid var(--ink)}
  html body .works .price table,
  html body .works .price tbody,
  html body .works .price tbody tr,
  html body .works .price tbody td{display:block;width:auto;float:none}
  /* Шапка столбцов: подписи уже стоят у каждого поля, зрячим она не
     нужна, но остаётся в дереве доступности (приём .visually-hidden).
     Кегль 11px — только для внутреннего измерения: глазам она не видна. */
  html body .works .price thead{position:absolute;width:1px;height:1px;margin:-1px;
    padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);
    white-space:nowrap;border:0}
  html body .works .price thead th{font-size:11px;line-height:1.3}
  html body .works .price tbody{border-top:0}

  /* Групповой заголовок — широкий бэнд с чертой сверху */
  html body .works .price tbody tr.group{margin:14px 0 0;border:0;
    border-top:2px solid var(--ink)}
  html body .works .price tbody tr.group th{display:block;width:auto;padding:9px 0 8px;
    background:transparent;border:0;border-bottom:1px solid var(--rule);
    font-size:11px;line-height:1.35;letter-spacing:.14em;color:var(--primary)}
  html body .works .price tbody tr.group:hover th{background:transparent}

  /* Строка работы — карточка с синей полоской-пометкой слева.
     Всё в строку: номер, название, объект и документ идут на одной
     строке с переносом. Раньше каждое поле было отдельным блоком
     с собственным межстрочным зазором, и карточка на одно определение
     занимала ~193px при двух строках текста. Подписи ОБЪЕКТ и ДОКУМЕНТ
     заменяются значком: таблица в DOM <thead> несёт заголовки столбцов
     для скринридера, а зрячему достаточно «·». */
  html body .works .price tbody tr:not(.group){display:flex;flex-wrap:wrap;
    align-items:baseline;column-gap:10px;row-gap:3px;margin-top:8px;
    padding:9px 11px;border:1px solid var(--rule);
    border-left:3px solid var(--primary);background:var(--paper);
    border-radius:0 2px 2px 0}
  html body .works .price tbody tr:not(.group):hover td{background:transparent}
  html body .works .price tbody td{min-width:0;padding:0;border:0;
    background:transparent}

  html body .works .price tbody td.c-no{flex:0 0 auto;width:auto;margin:0;
    font:700 11px/1.25 var(--mono);letter-spacing:.08em;color:var(--primary)}
  html body .works .price tbody td:not(.c-no):not(.c-norm):not(.c-res){flex:1 1 auto;
    width:auto;font-size:14.5px;line-height:1.3;font-weight:700;color:var(--ink)}
  html body .works .price tbody td.c-norm,
  html body .works .price tbody td.c-res{display:inline-flex;align-items:baseline;
    gap:6px;width:auto;margin:0;white-space:normal;
    font:400 12.5px/1.35 var(--sans);color:var(--ink-2)}
  /* Метка поля — короткая и без ::before-слова: «Объект  установки
     до 1000 В» на 390px занимает всю строку сама по себе. */
  html body .works .price tbody td.c-norm::before,
  html body .works .price tbody td.c-res::before{flex:0 0 auto;
    width:14px;height:14px;background:no-repeat center/contain;
    color:var(--ink-3);text-align:center;line-height:14px;font:700 10px/14px var(--mono);
    content:"";border:1px solid var(--rule-2);border-radius:2px}
  html body .works .price tbody td.c-norm::before{content:"О"}
  html body .works .price tbody td.c-res::before{content:"Д"}
  html body .works .price__note{padding:12px 0 0;font-size:13px;line-height:1.55;
    border-top:0;color:var(--ink-3)}
}

/* 360: карточки плотнее, подписи полей не отъедают половину строки */
@media (max-width:360px){
  html body .works .price tbody tr:not(.group){padding:11px 10px 9px}
  html body .works .price tbody td:not(.c-no):not(.c-norm):not(.c-res){font-size:15px}
  html body .works .price tbody td.c-norm,
  html body .works .price tbody td.c-res{font-size:13px}
}

/* 640–768: таблица в обычном табличном виде. «Документ» переносится по
   словам («вне аккредитации» в две строки), а не в 3 колонки по букве,
   «Работа» получает оставшуюся ширину. */
@media (max-width:768px){
  html body .works .price .c-res{white-space:normal}
  html body .works .price .c-no{width:52px}
  html body .works .price thead th{padding:10px 12px;font-size:10px;letter-spacing:.1em}
  html body .works .price tbody td{padding:10px 12px}
}

/* ---------- 5. Строка телефонов под таблицей .works__note ---------- */
/* На 320 три ссылки шли одной строкой и уезжали за край (scrollWidth 360
   при ширине 320). Здесь подпись — своей строкой, ниже телефон и e-mail
   карточками-тап-зонами 46px на всю ширину; каждая ссылка — своя строка.
   Подпись обёрнута в <span class="works__note-line"> (текст не менялся),
   поэтому голыми текстовыми узлами остались только разделители « · » и
   переносы: кегль контейнера 0 убирает их, кегли подписи и ссылок
   возвращаются явно. */
html body .works .works__note{margin-top:18px;font-size:12.5px;line-height:1.55;
  color:var(--ink-3)}
@media (max-width:640px){
  html body .works .works__note{display:grid;grid-template-columns:minmax(0,1fr);
    gap:0;margin-top:16px;padding:0 8px;font-size:0;line-height:0}
  html body .works .works__note br{display:none}
  html body .works .works__note .works__note-line{display:block;font-size:13px;
    line-height:1.5;color:var(--ink-3)}
  html body .works .works__note a{display:flex;align-items:center;min-height:46px;
    margin-top:6px;padding:0 12px;border:1px solid var(--rule);
    border-left:3px solid var(--primary);border-radius:0 2px 2px 0;
    background:var(--paper);font:700 15px/1.2 var(--sans);letter-spacing:.02em;
    color:var(--primary);text-decoration:none;white-space:nowrap}
  html body .works .works__note a:hover{color:var(--accent);
    border-left-color:var(--accent)}
  html body .works .works__note a[href^="mailto:"]{font-size:14px;letter-spacing:0}
}
@media (max-width:360px){
  html body .works .works__note a{padding:0 10px;font-size:14px}
  html body .works .works__note a[href^="mailto:"]{font-size:12.5px}
}

/* ---------- 6. Аттестат .doc: label и значение не слипаются ---------- */
/* База держит решётку 150px + 1fr и на мобиле: 10.5px подпись впритык к
   значению читается как «Выдан30.03.2022». Здесь подпись — строка-метка
   над значением, строки разделены, значение 16px, ссылка реестра —
   тап-зона 44px. */
@media (max-width:768px){
  html body .doc{padding:28px 0 30px}
  html body .doc .doc__grid{grid-template-columns:minmax(0,1fr);gap:22px}
  html body .doc .doc__text{min-width:0}
  html body .doc h2{margin:0 0 14px;font-size:clamp(24px,7vw,30px);line-height:1.08;
    letter-spacing:-.01em;overflow-wrap:break-word}
  html body .doc .eyebrow{margin:0 0 8px;font-size:11px;letter-spacing:.16em;
    line-height:1.4}
  html body .doc .doc__list{border-top:2px solid var(--ink)}
  html body .doc .doc__list li{display:grid;grid-template-columns:minmax(0,1fr);
    gap:1px;padding:9px 0}
  html body .doc .doc__list span{font:600 10.5px/1.5 var(--narrow);letter-spacing:.14em;
    color:var(--ink-3)}
  html body .doc .doc__list strong{display:block;min-width:0;font-size:16px;
    line-height:1.4;letter-spacing:0;overflow-wrap:break-word}
  html body .doc .doc__list .hand{font-size:17px;line-height:1.35}
  html body .doc .doc__list strong a{display:inline-flex;align-items:center;
    min-height:44px;padding:0 2px;font-weight:700}
  html body .doc .doc__addr{margin-top:12px;font-size:12.5px;line-height:1.6;
    color:var(--ink-3)}
}

/* ПИЛ: снимок по ширине колонки без обрезки и переполнения */
@media (max-width:768px){
  html body .doc .pil{padding:8px 8px 0;margin:0;max-width:100%}
  html body .doc .pil img{display:block;width:100%;height:auto;max-width:100%;
    max-height:none;object-fit:contain;aspect-ratio:1280 / 714}
  html body .doc .pil figcaption{padding:9px 2px 11px;font-size:13.5px;line-height:1.5}
  html body .doc .pil figcaption .hand{font-size:15px}
}

/* ---------- 7. Контакты .contact: тёмная плашка, номера крупно ---------- */
@media (max-width:1000px){
  html body .contact .contact__grid{grid-template-columns:minmax(0,1fr);gap:20px;
    align-items:start}
}
@media (max-width:640px){
  html body .contact{padding:28px 0 30px}
  html body .contact h2{font-size:clamp(22px,6.8vw,28px);line-height:1.1;
    letter-spacing:0;overflow-wrap:break-word}
  html body .contact .contact__tel{list-style:none;margin:0;padding:0;display:grid;
    gap:8px}
  /* номер одной строкой; подпись «основной / второй / директор» — мелким
     uppercase над номером; весь номер — тап-зона 56px */
  html body .contact .contact__tel li{margin:0;padding:0}
  html body .contact .contact__tel a{display:flex;flex-direction:column;
    align-items:stretch;justify-content:center;gap:2px;min-height:56px;
    padding:8px 0 10px;border-bottom:1px solid rgba(255,255,255,.25);
    font:700 clamp(22px,6.8vw,26px)/1.1 var(--narrow);letter-spacing:.02em;
    color:#fff;text-decoration:none;white-space:nowrap}
  html body .contact .contact__tel a:hover{color:#FFD9DA;
    border-bottom-color:var(--accent-strong)}
  html body .contact .contact__tel span{flex:none;font:600 10.5px/1.3 var(--narrow);
    letter-spacing:.16em;text-transform:uppercase;color:#9FB4C8}
  html body .contact .contact__mail a{display:flex;align-items:center;min-height:44px;
    font-size:15px;line-height:1.4;color:#fff;text-decoration:underline;
    text-decoration-color:var(--accent-strong);text-decoration-thickness:2px;
    text-underline-offset:4px}
  html body .contact .contact__mail a:hover{color:#FFD9DA}
  html body .contact .contact__mail p{margin:2px 0 0;font-size:12.5px;line-height:1.6;
    color:#AFC1D2}
}
@media (max-width:360px){
  html body .contact h2{font-size:22px}
  html body .contact .contact__tel a{font-size:22px;min-height:54px}
  html body .contact .contact__mail a{font-size:14px}
}

/* ---------- 8. Подвал .foot ---------- */
/* Длинная строка «© ОДО "ЭТЛ-Импульс" · УНП 490493560 · адрес» на узком
   экране рвалась посередине слова. Здесь подвал — три строки по 1fr,
   между ними волосяная рамка, перенос по слогам выключен, ссылка
   bsca.by — тап-зона 44px. Высоту callbar резервирует отступ body. */
@media (max-width:640px){
  html body .foot{padding:0 0 18px}
  html body .foot>.wrap{padding-top:14px}
  html body .foot .foot__row{display:grid;grid-template-columns:minmax(0,1fr);
    gap:0;font-size:12px;line-height:1.65;letter-spacing:0}
  html body .foot .foot__row span{display:block;min-width:0;padding:7px 0;
    hyphens:none}
  html body .foot .foot__row span+span{border-top:1px solid rgba(255,255,255,.12)}
  html body .foot .foot__row a{display:inline-flex;align-items:center;min-height:44px;
    color:#fff;font-weight:600;text-underline-offset:3px}
}
@media (max-width:360px){
  html body .foot .foot__row{font-size:11.5px;line-height:1.6}
}/* ===================================================================
   Мобильная вёрстка: агент A — шапка, первый экран, полоса пределов
   -------------------------------------------------------------------
   Всё ниже дописано в конец файла, исходные строки не менялись:
   мешающее переопределено составными селекторами (html body .sheet ...).
   Только max-width: 360, 430, 640, 768, 1000. Без JS и inline-стилей.
   Зона листа (.sheet*) перехватывает базу 640 по печати (.sheet__foot)
   и потому лежит здесь, ниже правила @media (max-width:640px).
   Порядок блоков: 1 — шапка и якоря, 2 — лист протокола, 3 — полоса
   пределов .meter, 4 — callbar и запас под неё. Первым идёт лист
   (см. строку выше), остальное — после.
   =================================================================== */

/* ---------- 2. Лист протокола: первая страница бланка ---------- */
/* Главная тонкость: .sheet — флекс-колонка (порядок чтения ниже), а её
   min-content в флексе считается по max-content детей. Решётка, где хоть
   одна дорожка auto, распирает лист: «ОДО "ЭТЛ-Импульс"» рвётся по слогам.
   Поэтому ни у одной решётки листа нет auto-дорожки в ширину — только
   minmax(0,1fr), а «числитель + название» делятся двумя дорожками. */
@media (max-width:640px){
  /* Бланк начинается сразу под шапкой: над листом нет «воздуха».
     Верх — 8px: 8 + 96 (лист, см. ниже) даёт нужный зазор от липкой шапки,
     дальше правит scroll-margin-top для якорей. */
  html body .sheet-wrap{padding-top:8px;padding-bottom:clamp(20px,4vw,32px)}

  html body .sheet{display:flex;flex-direction:column;align-items:stretch;
    width:calc(100% - 16px);padding:14px 16px 22px;--cut:11px}
  html body .sheet::after{width:4px}

  /* Шапка бланка: одна колонка, три яруса — организация, аттестат, дата */
  html body .sheet .sheet__head{order:1;display:grid;grid-template-columns:minmax(0,1fr);
    gap:0;margin:0 -16px;padding:0 16px 8px;border-bottom-width:1px}
  html body .sheet .sheet__head .sheet__org{display:grid;
    grid-template-columns:minmax(0,1fr);row-gap:1px;padding-bottom:8px;
    border-bottom:1px solid var(--rule-2);margin-bottom:8px}
  /* Название — газетной строкой бланка: по всей ширине, с переносом слов,
     без переносов по слогам */
  html body .sheet .sheet__head .sheet__org strong{grid-column:1;font-size:13.5px;
    font-weight:700;letter-spacing:.06em;text-transform:uppercase;line-height:1.25;
    overflow-wrap:break-word;hyphens:none}
  /* Адрес — соло-строкой. Регистр не трогаем: .visually-hidden внутри span
     стал бы верхним регистром, если применить text-transform к span. */
  html body .sheet .sheet__head .sheet__org span{grid-column:1;font-size:12px;
    line-height:1.45;letter-spacing:.01em;color:var(--ink-2);overflow-wrap:break-word;
    hyphens:none}
  /* Аттестат — служебный ярлык: число и срок справа, реестр не болтается */
  html body .sheet .sheet__head .sheet__org span:last-of-type{display:flex;
    flex-wrap:wrap;align-items:baseline;column-gap:6px;row-gap:0;width:fit-content;
    margin:6px 0 4px;padding:3px 7px 3px 8px;border-left:2px solid var(--rule);
    font-size:10.5px;line-height:1.35;letter-spacing:.06em;text-transform:uppercase;
    color:var(--ink-3)}
  /* Дата выезда — строка под ярлыком: подпись слева, «по заявке» справа */
  html body .sheet .sheet__head .sheet__meta{display:none}
  html body .sheet .sheet__head .sheet__date{grid-column:1;display:grid;
    grid-template-columns:auto minmax(0,1fr);align-items:baseline;column-gap:8px}
  html body .sheet .sheet__head .sheet__date span:first-child{font-size:11px;
    line-height:1.4;letter-spacing:.1em;white-space:nowrap}
  html body .sheet .sheet__head .sheet__date .hand{font-size:19px;padding:0 2px 1px;
    justify-self:end;text-align:right;white-space:nowrap}

  /* Заголовок: 28→34px, «ИЗМЕРЕНИЯ» + «НА ВАШЕМ ОБЪЕКТЕ» — самая широкая пара */
  html body .sheet .sheet__title{order:2;margin:12px 0 10px;
    font-size:clamp(28px,8vw,34px);line-height:1.03;letter-spacing:-.01em;
    text-transform:uppercase;hyphens:none;max-width:100%;display:block;
    overflow-wrap:break-word}
  html body .sheet .sheet__title .mark{white-space:normal}

  /* Поля: подпись над значением, две «кривые» колонки убраны */
  html body .sheet .fields{order:3;display:block;margin:0}
  html body .sheet .fields .fields__row{display:block;grid-template-columns:none;
    margin:0;padding:9px 0;border-bottom:1px solid var(--rule-2)}
  html body .sheet .fields dt{font-size:11px;line-height:1.45;letter-spacing:.1em;
    color:var(--ink-3)}
  html body .sheet .fields dd{margin:2px 0 0;min-width:0}
  html body .sheet .fields dd.hand{font-size:17px;line-height:1.35;font-style:italic;
    font-weight:700;letter-spacing:0;overflow-wrap:break-word}

  /* Галочки — ровным столбиком по 30px: без «рваных» переносов 2+1+1+1 */
  html body .sheet .checks{display:grid;grid-template-columns:minmax(0,1fr);
    gap:2px;padding:4px 0 0}
  html body .sheet .tick{display:flex;align-items:center;gap:11px;min-height:30px;
    padding:3px 0;font-size:15px;line-height:1.3;font-weight:500;color:var(--ink);
    hyphens:none}

  html body .sheet .sheet__sign{order:4}

  /* Нижний «зубец» — тёмный ярлык пределов. Служебные строки (адрес, реестр)
     уже стоят в шапке бланка; обёртка .sheet__col — разметка, без неё ломается
     порядок чтения полей на ≤640. */
  html body .sheet .sheet__col{display:contents}
  html body .sheet .sheet__foot{order:5;display:grid;
    grid-template-columns:repeat(2,minmax(0,1fr));gap:5px 8px;margin-top:18px;
    padding:10px 8px 11px;background:var(--ink);border-top:3px solid var(--accent);
    border-radius:0 0 3px 3px}
  /* Прямой ребёнок — и только он: .visually-hidden внутри строки не должен
     получить display:flex и маркер-ромб */
  html body .sheet .sheet__foot > span{display:flex;align-items:flex-start;gap:5px;
    min-width:0;font:600 11.5px/1.35 var(--narrow);letter-spacing:.01em;
    color:#D6E0EB;overflow-wrap:break-word;hyphens:none}
  html body .sheet .sheet__foot > span::before{content:"";flex:0 0 auto;width:4px;
    height:4px;margin-top:5px;background:var(--accent)}
}
@media (max-width:430px){
  html body .sheet .sheet__title{font-size:clamp(26px,8.3vw,32px)}
}
@media (max-width:360px){
  html body .sheet-wrap .sheet{padding:14px 13px 20px}
  html body .sheet .sheet__head{margin:0 -13px;padding:0 13px 8px}
  html body .sheet .sheet__head .sheet__org strong{font-size:12.5px;letter-spacing:.03em}
  html body .sheet .sheet__head .sheet__org span{font-size:11.5px}
  html body .sheet .sheet__head .sheet__org span:last-of-type{font-size:10px;
    margin:5px 0 3px;padding-left:6px}
  html body .sheet .sheet__title{font-size:clamp(23px,7.3vw,26px)}
  html body .sheet .sheet__foot{grid-template-columns:minmax(0,1fr);gap:3px;
    padding:9px 8px 10px}
}
/* Подпись → печать → телефоны. Третий уровень (html body .sheet …):
   база 640 правит .sheet__sign и .seal двумя классами. */
@media (max-width:640px){
  html body .sheet .sheet__sign{display:grid;grid-template-columns:minmax(0,1fr);
    gap:16px;justify-items:stretch;margin-top:18px;padding-top:14px;
    border-top:1px solid var(--rule)}
  html body .sheet .sheet__sign .sign__label{font-size:11px;letter-spacing:.1em;line-height:1.45}
  html body .sheet .sheet__sign .sign__hand{font-size:22px;line-height:1.2;width:auto;
    max-width:100%;padding:3px 4px 2px 2px;transform:rotate(-1.2deg);display:block;
    overflow-wrap:break-word;hyphens:none}
  /* Ссылка «в реестре» — внутри строки .sign__label: строку 11px делаем
     тап-зоной 36px, не ломая базовую линию */
  html body .sheet .sheet__sign .sign__label a{display:inline-block;font-size:12px;
    line-height:1.3;padding:10px 2px;margin:-10px 0;vertical-align:top;white-space:normal}

  /* Печать — у левого края, под подписью, не по центру листа */
  html body .sheet .sheet__sign .seal{justify-self:start;margin:0 0 2px 4px}
  html body .sheet .sheet__sign .seal .seal__box{padding:6px 9px;border-width:3px}
  html body .sheet .sheet__sign .seal .seal__ink{font-size:10px;letter-spacing:.1em;line-height:1.3}

  /* Телефоны: каждый номер — тап-зона ≥ 44px, подчёркивание как у подписи */
  html body .sheet .sheet__sign .sheet__call{justify-self:stretch;display:flex;
    flex-direction:column;align-items:stretch;gap:0;text-align:left;min-width:0}
  html body .sheet .sheet__sign .sheet__call .sign__label{font-size:11px}
  html body .sheet .sheet__sign .sheet__call .bigtel{display:flex;align-items:center;
    min-height:48px;margin-top:4px;padding:0 0 3px;align-self:stretch;min-width:0;
    font-size:clamp(21px,6.6vw,26px);white-space:nowrap;hyphens:none;
    border-bottom:1.5px solid var(--pen)}
  html body .sheet .sheet__sign .sheet__call .bigtel--sm{min-height:44px;margin-top:2px;
    font-size:16px;align-self:flex-start;border-bottom:1.5px solid var(--pen)}
}


/* ---------- 3. Полоса пределов .meter ---------- */
/* Сетка 2×2 на 320–430. Шаг: подпись 11px (переносится по словам) →
   строка «цифра слева, пояснение справа у самой цифры». База 760 растягивает
   подписи (nowrap) и растит .meter снизу на 56px под callbar. Здесь липнет
   сам .meter (bottom:0): callbar фиксирован и прячет только низ страницы,
   а если .meter — последнее над callbar, sticky сам не даёт строке уйти
   под кнопку. Отступ снизу — единый: env(safe-area-inset-bottom). */
@media (max-width:768px){
  html body .meter{position:sticky;bottom:0;z-index:5;
    padding:16px 0 calc(12px + env(safe-area-inset-bottom,0px))}
  html body .meter .meter__row{grid-template-columns:minmax(0,1fr);gap:10px}
  html body .meter .meter__tag{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
  html body .meter .meter__title{font-size:12px;line-height:1.3;letter-spacing:.12em}
  html body .meter .meter__scope{font-size:11px;line-height:1.4;letter-spacing:0}
  html body .meter .meter__read{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
    border-left:0;border-top:1px solid rgba(255,255,255,.28);gap:0}
  html body .meter .meter__item{display:grid;grid-template-columns:minmax(0,1fr);
    align-content:start;row-gap:5px;padding:10px 10px 10px 0;border-right:0;
    border-bottom:1px solid rgba(255,255,255,.18)}
  html body .meter .meter__item:nth-child(odd){padding-left:0}
  html body .meter .meter__item:nth-child(even){padding-left:12px;
    border-left:1px solid rgba(255,255,255,.18)}
  html body .meter .meter__item:nth-child(3),
  html body .meter .meter__item:nth-child(4){border-bottom:0}
  /* Каждое свойство задаётся явно: база 8.5px/nowrap в font-шорткате даёт
     нечитаемую подпись и «столбики» */
  html body .meter .meter__cap{margin:0;font-family:var(--narrow);font-weight:600;
    font-style:normal;font-size:11px;line-height:1.3;letter-spacing:.03em;
    text-transform:uppercase;white-space:normal;color:#AFC1D2;display:block;
    grid-column:1;grid-row:1;hyphens:none;overflow-wrap:break-word}
  /* Цифра — своим кеглем; пояснение — вбок, у цифры, с переносом по словам */
  html body .meter .meter__val{display:flex;align-items:baseline;gap:0;
    grid-column:1;grid-row:2;font-size:clamp(24px,7vw,30px);line-height:1.05;
    letter-spacing:-.02em;white-space:normal}
  html body .meter .meter__sub{margin:0 0 0 8px;font-family:var(--sans);font-weight:400;
    font-style:normal;font-size:11.5px;line-height:1.25;letter-spacing:0;
    white-space:normal;color:#AFC1D2;display:inline;hyphens:none;text-transform:none}
  html body .meter .meter__item--on .meter__cap{color:#FFD9DA}
  html body .meter .meter__item--on .meter__sub{color:#FFD9DA}
  html body .meter .meter__stack{display:none}
}
@media (max-width:360px){
  html body .meter{padding:14px 0 calc(10px + env(safe-area-inset-bottom,0px))}
  html body .meter .meter__row{gap:8px}
  html body .meter .meter__title{font-size:11px}
  html body .meter .meter__scope{font-size:11px;line-height:1.3}
  html body .meter .meter__item{padding:9px 8px 9px 0;row-gap:4px}
  html body .meter .meter__item:nth-child(even){padding-left:10px}
  html body .meter .meter__val{font-size:24px}
  html body .meter .meter__sub{margin-left:6px;font-size:11px}
}

/* ---------- 4. Нижняя кнопка звонка, safe-area и запас под неё ---------- */
/* callbar: min-height 56px, отступ снизу == env(safe-area-inset-bottom).
   Кнопка фиксирована и прячет низ страницы: в отступ документа (body) уходит
   её высота целиком, поэтому контент до конца доскролливается, а не прячется. */
html body .callbar{box-sizing:border-box;height:auto;min-height:56px;
  padding:8px 12px;padding-bottom:calc(8px + env(safe-area-inset-bottom,0px));
  justify-content:center;text-align:center;gap:6px;font-size:15px;letter-spacing:.04em;
  line-height:1.2}
:root{--callbar-h:calc(56px + env(safe-area-inset-bottom,0px))}
@media (max-width:640px){
  html body{padding-bottom:calc(var(--callbar-h) + 12px)}
  /* подвал — вне зоны агента A, но его низ не должен прятаться под callbar */
  html body .foot{padding-bottom:calc(26px + var(--callbar-h))}
}
@media (max-width:360px){
  html body .callbar{font-size:14px;letter-spacing:.02em;padding-inline:10px}
}

/* ---------- 1. Липкая шапка и якоря под ней ---------- */
/* Шапка: 30px лого + кнопка 44px + отступы ≈ 66px. Высота записана числом
   в scroll-padding-top (запас под якоря) и scroll-margin-top (зазор 16px
   над секцией, по брифу): calc() с переменными в scroll-padding-top
   Chrome считает от scrollHeight и уводит якорь на 94px вместо 78. */
:root{--top-h:96px}
html{scroll-padding-top:96px}
@media (max-width:1000px){:root{--top-h:80px}html{scroll-padding-top:88px}}
@media (max-width:640px){:root{--top-h:78px}html{scroll-padding-top:78px}}
body>section[id],body>main>section[id],main section[id]{scroll-margin-top:96px}
@media (max-width:1000px){main section[id]{scroll-margin-top:88px}}
@media (max-width:640px){main section[id]{scroll-margin-top:78px}}

/* На 320–640 в шапке два элемента: лого и кнопка «Позвонить». База 640
   (.top__row) разрешает перенос и прячет второй номер, оставляя номер
   текстовой строкой 18px — здесь он становится кнопкой 44px. */
@media (max-width:640px){
  html body .top{border-bottom-width:2px;overflow-x:clip}
  html body .top .top__row{flex-wrap:nowrap;align-items:center;column-gap:12px;
    row-gap:0;padding-block:10px;min-height:auto}
  html body .top .brand{min-width:0;min-height:44px;margin-right:auto;
    flex-shrink:1;overflow:hidden}
  html body .top .brand__logo{height:30px;width:auto;flex:0 1 auto;
    max-width:100%;min-width:0}
  html body .top .top__tel{margin-left:0;flex:0 0 auto;padding-left:0;
    border-left:0;gap:0}
  html body .top .top__tel .tel{display:inline-flex;align-items:center;
    justify-content:center;min-height:44px;min-width:44px;padding:0 14px;
    border:2px solid var(--primary);border-radius:6px;background:var(--primary);
    color:#fff;text-decoration:none;font:700 14px/1 var(--narrow);
    letter-spacing:.04em;white-space:nowrap;flex-shrink:0}
  html body .top .top__tel .tel:hover{background:var(--primary-ink);color:#fff}
  html body .top .top__tel .tel:focus-visible{background:var(--primary-ink);
    color:#fff;box-shadow:0 0 0 3px #fff,0 0 0 6px var(--ink)}
  html body .top .top__tel .tel--alt{display:none}
  /* «К телефонам» в покое не занимает ни пикселя: тот же абсолютный якорь
     1×1, что у .visually-hidden. Виден только с клавиатуры. */
  html body .skip{position:absolute;top:0;left:12px;width:1px;height:1px;
    margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);
    clip-path:inset(50%);white-space:nowrap;border:0}
  html body .skip:focus{position:fixed;top:calc(var(--top-h) + 8px);left:12px;
    width:auto;height:auto;margin:0;padding:12px 16px;overflow:visible;
    clip:auto;clip-path:none;white-space:normal;min-height:44px;
    display:inline-flex;align-items:center;z-index:60}
}

/* 320: «8 (0232) 63-99-94» в кнопку 44px рядом с лого не помещается —
   лого 28px и номер плотнее. Номер остаётся целиком, текст не меняем. */
@media (max-width:360px){
  html body .top .top__row{column-gap:10px}
  html body .top .brand__logo{height:28px}
  html body .top .top__tel .tel{font-size:12.5px;letter-spacing:0;padding:0 10px}
}

/* ---------- 5a. Поправка: текст e-mail в карточке .works__note ---------- */
/* 1) у контейнера на <640 стоит font-size:0 (чтобы прятать голые « · »),
   а ссылка e-mail наследует 0 → карточка пустая. Даём ей кегль явно. */
/* 2) правило майлто выше (font-size:12.5px) проигрывает шорткату font:
   в .works__note a — поднимаем специфичность тем же префиксом html body. */
html body .works .works__note a[href^="mailto:"]{font-size:13px;letter-spacing:0}
@media (max-width:360px){
  html body .works .works__note a[href^="mailto:"]{font-size:12px}
  /* длинный адрес не рвётся по центру: переносим только как целое */
  html body .works .works__note a[href^="mailto:"]{white-space:normal;
    overflow-wrap:anywhere}
}

/* ---------- 5b. Поправка: подписи .doc__list не слипаются со значением ---------- */
/* В скриншоте «ВЫДАН» шло вплотную к дате, когда у span стоял нулевой
   нижний отступ. Подстраховываемся: у подписи всегда своя строка. */
@media (max-width:768px){
  html body .doc .doc__list li>span{display:block;margin:0 0 2px}
  html body .doc .doc__list li>strong{display:block}
}
/* ---------- 13. Тап-зона ссылки «в реестре» в подписи бланка ---------- */
/* Стоит внутри строки .sign__label: растягиваем только по вертикали,
   горизонталь оставляем тексту, чтобы подпись не расползлась. */
@media (max-width:768px){
  html body .sheet .sheet__sign .sign__label a{display:inline-block;
    min-height:28px;line-height:28px;padding:0 2px;margin:-4px 0}
}
/* ===================================================================
   Правка верстки: полоса пределов не липнет, кнопка звонка ниже
   -------------------------------------------------------------------
   1) .meter на <=768 была position:sticky; bottom:0 — тёмная полоса
      прилипала к низу экрана и висела пол-экрана до прокрутки мимо.
      Возвращаем её в поток: обычный участок страницы, без липкости.
   2) Красная кнопка звонка была 56px + паддинги + uppercase 15px.
      Делаем её компактнее: 46px, кегль 14px, без лишнего вертикального
      паддинга. Отступ body и подвала пересчитывается через --callbar-h,
      поэтому контент по-прежнему не уходит под кнопку.
   =================================================================== */
@media (max-width:768px){
  html body .meter{position:static;bottom:auto;z-index:auto}
}

:root{--callbar-h:calc(46px + env(safe-area-inset-bottom,0px))}
html body .callbar{min-height:46px;padding:4px 12px;
  padding-bottom:calc(4px + env(safe-area-inset-bottom,0px));
  font-size:14px;letter-spacing:.04em;line-height:1.15}
@media (max-width:360px){
  html body .callbar{font-size:13px;padding-inline:10px}
}
@media (max-width:640px){
  html body{padding-bottom:calc(var(--callbar-h) + 10px)}
  html body .foot{padding-bottom:calc(20px + var(--callbar-h))}
}
/* ===================================================================
   Логотип в шапке: крупнее, шапка при этом ниже
   -------------------------------------------------------------------
   Лого — широкий плоский вордмарк (1625.9 x 602.4, около 2.7:1), и пустое
   место вокруг него давала не картинка, а высота кнопки звонка.
   Кнопка 44px задирала лого до 30px и оставляла по 10px паддинга
   сверху и снизу. Здесь наоборот: лого растёт до 38px, кнопка ужимается
   до 40px (это по-прежнему комфортная тап-зона), паддинги шапки
   срезаются до 4px — шапка становится даже ниже (56px вместо 66px),
   а лого крупнее примерно на 27%.
   --top-h и scroll-padding-top пересчитаны под новую высоту, иначе якоря
   (#works, #doc, #contact) уедут под липкую шапку.
   =================================================================== */
@media (max-width:640px){
  :root{--top-h:56px}
  html{scroll-padding-top:56px}
  main section[id]{scroll-margin-top:56px}
  html body .top .top__row{padding-block:4px}
  html body .top .brand{min-height:40px;align-items:center}
  html body .top .brand__logo{height:38px}
  html body .top .top__tel .tel{min-height:40px;padding:0 12px;
    font-size:13.5px}
  html body .skip:focus{top:calc(var(--top-h) + 8px)}
}
/* 320: рядом с кнопкой лого раньше падало до 28px; держим 34px и режем
   горизонталь, а не высоту. */
@media (max-width:360px){
  html body .top .brand__logo{height:34px}
  html body .top .top__tel .tel{font-size:12.5px;padding:0 10px}
}
/* ===================================================================
   Компактный рубрикатор «Что выполняем» на телефоне
   -------------------------------------------------------------------
   Опора — правила @media (max-width:768px) выше (html body .works .dept…):
   там каждый блок раскладывался в одну колонку, номер занимал отдельную
   строку с чертой во всю ширину, а позиция приложения шла отдельной
   строкой под каждым пунктом. Блок на 2-5 коротких строк занимал
   220-430px, а весь раздел вместе с таблицей — три с лишним экрана.

   Здесь от 360px: номер и заголовок с подписью — одна строка (номер в
   левой колонке, до конца блока), пункты сразу под ней, позиция снова
   в конце фразы. На 320px левая колонка 26px + отступы съедают ширину
   тексту, поэтому там остаётся раскладка в одну колонку, но без черты
   под номером и с позицией в строке. */
@media (max-width:768px){
  /* Позиция приложения: отдельная строка под пунктом -> в конец фразы.
     Здесь li — блочный флекс-элемент (display:none у маркера не меняет
     поток внутри), поэтому обычный inline-поток раскладывает текст, метку
     и перенос сам. Тело пункта обёрнуто в span в разметке: без обёртки
     textContent у li — не однородный текст, и браузер разбивает пункт на
     отдельные анонимные блоки, а с растянутым по высоте li это давало
     пустые строки между фразой и меткой. */
  html body .works .dept__list li .dept__li{display:inline}
  html body .works .dept__list li{display:flow-root}
  /* Стрелка вертикального выравнивания устроена так, что высокий строчный
     бокс картинкой топит baseline. Поэтому метку держим чуть выше: 4px
     шрифт 11px — ещё в строке, не уходит в подстрочник. */
  html body .works .dept__list em{display:inline-flex;align-items:baseline;
    vertical-align:4px;padding:0;font-size:11px;line-height:1.3;
    letter-spacing:.04em;white-space:nowrap}
}
@media (max-width:640px){
  html body .works{padding-block:26px 30px}
  html body .works .works__head{gap:6px;margin-bottom:14px;
    padding-bottom:12px}
  html body .works .works__head h2{font-size:clamp(26px,8vw,32px)}
  html body .works .works__lead{font-size:13.5px;line-height:1.5}

  html body .works .dept{grid-template-columns:26px minmax(0,1fr);
    column-gap:10px;row-gap:6px;padding:13px 0}
  html body .works .dept__no{grid-row:1/-1;grid-column:1;
    display:block;margin:0;padding-top:3px;letter-spacing:.06em}
  html body .works .dept__no::after{display:none}
  html body .works .dept__title{grid-row:1;grid-column:2;
    display:flex;flex-wrap:wrap;align-items:baseline;column-gap:8px;
    row-gap:1px;font-size:17.5px;line-height:1.15}
  html body .works .dept__title small{display:inline;margin:0;
    font-size:11.5px;line-height:1.3}
  html body .works .dept__list{grid-row:2;grid-column:2;
    gap:5px;margin:0}
  html body .works .dept__list li{font-size:14px;line-height:1.4;
    padding-left:13px}
  html body .works .dept__list li::before{width:6px;top:.66em}

  /* --- Таблица в карточках: убираем пустоту --- */
  html body .works .price{margin-top:18px;padding-top:32px}
  html body .works .price caption{padding:0 0 8px;font-size:11.5px}
  /* Двойная черта: у .works рамка сверху есть у всего раздела, а база
     .depts рисует ещё одну. На мобиле это два подчёркнутых заголовка
     подряд с пустым зазором перед первой карточкой. Оставляем одну. */
  html body .works .depts{border-top:0}
  html body .works .price tbody tr.group{margin:10px 0 0}
  html body .works .price tbody tr.group th{padding:6px 0 5px}
  /* Карточка: поля укладываются строками по высоте текста. Обнулять
     padding у ячеек нужно после правила базы (max-width:768px), где
     td{padding:10px 12px}: в каскаде оно идёт позже и иначе даёт
     36px высоты у каждой «строки» из-за разных font-family. */
  html body .works .price tbody tr:not(.group){margin-top:6px;
    padding:7px 9px;row-gap:1px}
  html body .works .price tbody tr:not(.group) td{padding:0}
  /* Зазор между «названием» и метками только по горизонтали. Иначе
     «Документ» уезжает на правый край той же строки (у «1.2» и «1.5»
     это сбивало ритм), а метки обеих строк стоят ровной колонкой. */
  html body .works .price tbody td:not(.c-no):not(.c-norm):not(.c-res){
    margin-right:10px}
  html body .works .price tbody td.c-no{font-size:10.5px}
  html body .works .price tbody td:not(.c-no):not(.c-norm):not(.c-res){
    font-size:14px;line-height:1.3}
  html body .works .price tbody td.c-norm,
  html body .works .price tbody td.c-res{font-size:12px;line-height:1.3}
  html body .works .price__note{padding-top:10px;font-size:12.5px;
    line-height:1.5}
}
