/* ============================================================
   ДАЛИНИ · стыковка макета с OpenCart
   Здесь только то, чего нет в theme.css: оформление виджетов,
   разметку которых диктует движок (корзина в шапке, меню каталога).
   theme.css остаётся зеркалом макета из design/ и правится там.
   ============================================================ */

/* ---------- гасим протечки из stylesheet.css стандартной темы ----------
   Он подключён ради страниц, ещё не перенесённых в тему, и задаёт
   #logo, #search и #cart нижний отступ 10px. В шапке это флекс-ряд с
   align-items:center, поэтому такой отступ поднимает элемент на 5px. */
.header #search,
.header #cart,
.header #logo{margin:0}

/* ---------- корзина в шапке ---------- */
.hcart{position:relative;flex:none}
.hcart > button{width:64px}
.hcart > button::after{display:none}          /* стрелка bootstrap-дропдауна не нужна */

/* У .hact иконка и подпись — прямые потомки, а корзину common.js оборачивает
   в #cart-total и переписывает её при каждом изменении. Убрать обёртку нельзя,
   поэтому повторяем раскладку .hact внутри неё, иначе блок съезжает вверх. */
.hcart #cart-total{
  display:flex;flex-direction:column;align-items:center;
  width:100%;line-height:inherit;
  gap:0;                       /* см. ниже — зазор задаём маргином */
}
/* gap здесь нельзя: бейдж .cnt хоть и position:absolute, но как потомок
   флекс-контейнера всё равно добавляет один зазор, и блок корзины
   становится на 3px выше соседних. Отступ вешаем прямо на подпись. */
.hcart #cart-total .hact__t{margin-top:3px}
.hcart__drop{
  left:auto;right:0;min-width:340px;padding:14px;margin-top:8px;
  border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow-l);
}
.hcart__table{width:100%;margin:0 0 10px;font-size:13px}
.hcart__table td{padding:8px 6px;border-top:1px solid var(--line-2);vertical-align:middle}
.hcart__table tr:first-child td{border-top:0}
.hcart__table img{width:44px;height:44px;object-fit:contain;border:1px solid var(--line-2);border-radius:8px}
.hcart__totals{width:100%;margin:0 0 12px;font-size:13px}
.hcart__totals td{padding:3px 6px}
.hcart__actions{display:flex;gap:8px;justify-content:flex-end;margin:0}
.hcart__empty{margin:0;padding:18px 6px;color:var(--muted);text-align:center}


/* ---------- страницы, ещё не перенесённые в тему ----------
   Они отрисовываются шаблонами default на Bootstrap. Глобальное правило
   section{padding:88px 0} из theme.css протекает в их разметку — гасим.
   Скоуп именно .container: перенесённые страницы бутстраповскую обёртку
   не используют, и их собственные <section> отступы сохраняют. */
.container section{padding:0}

/* ---------- витрина товаров (модули featured / bestseller / latest / special) ---------- */
/* Колонка-флекс, а не обычный блок. Причина в отступах модулей ниже:
   в блочном потоке смежные вертикальные margin схлопываются, и 44 снизу
   плюс 44 сверху дали бы 44, а не 88. У флекс-элементов margin не
   схлопываются — арифметика становится такой же, как у padding. */
.page-home > #content{display:flex;flex-direction:column}
.mod-products{padding:56px 0 0}
.mod-products .sechead{margin-bottom:24px}
/* .card__img в макете — div; у нас это ссылка на товар, ей нужен block */
.card__img{display:block}
.card__name{display:block;color:inherit}
.card__name:hover{color:var(--amber-d)}
.card__foot .price small{display:inline;margin-left:6px;font-size:12px;color:var(--muted)}

/* ---------- мобильная раскладка ----------
   В макете кнопка корзины — третий ребёнок .hactions, и правило
   .hact:nth-child(1),.hact:nth-child(2){display:none} прячет «Закладки»
   и «Кабинет». У нас корзина обёрнута в #cart и внутри него становится
   первым ребёнком, попадая под то же правило. Возвращаем её. */
@media(max-width:820px){
  .hcart > .hact:nth-child(1){display:flex}
}

/* ---------- страница категории ---------- */

/* Подкатегории. Отдельный класс: .chipset в макете занят активными
   фильтрами Mega Filter, смешивать их с навигацией нельзя. */
.subcats{display:flex;flex-wrap:wrap;gap:8px;padding-bottom:22px}
.subcats a{display:inline-flex;align-items:center;height:34px;padding:0 14px;border:1px solid var(--line);border-radius:99px;font-size:13px;background:var(--surface);transition:.18s var(--ease)}
.subcats a:hover{background:#fff;border-color:var(--ink)}

/* Пагинацию рисует system/library/pagination.php — <ul class="pagination">
   с <li>. Разметку не переопределить, поэтому подгоняем её под .pager из макета. */
.pager .pagination{display:flex;align-items:center;gap:6px;flex-wrap:wrap;list-style:none;margin:0;padding:0}
.pager .pagination > li{display:block}
/* Скрытые скриптом «в начало» и «в конец»: правило выше перебивает браузерное
   [hidden]{display:none}, поэтому гасим их явно. */
.pager .pagination > li[hidden]{display:none}
/* Селектор .pagination > li > a у Bootstrap специфичнее, чем .pager a из макета,
   и перебивает рамку с отступами. Пока bootstrap.css подключён ради
   непереносённых страниц, бьём его тем же оружием. */
.pager .pagination > li > a,
.pager .pagination > li > span{
  min-width:42px;height:42px;padding:0 12px;float:none;
  display:grid;place-items:center;
  border:1px solid var(--line);border-radius:var(--r-s);
  font-size:14px;font-weight:500;line-height:1;
  background:#fff;color:var(--ink);
}
.pager .pagination > li > a:hover{border-color:var(--ink);background:#fff;color:var(--ink)}
.pager .pagination > li.active > span{background:var(--ink);color:#fff;border-color:var(--ink)}

/* Кнопки «Назад» и «Вперёд» подписывает dalini.js — им нужна ширина по тексту. */
.pager .pagination > li.pager__nav > a{padding:0 18px;font-weight:600}

/* Разрыв «…» перед последней страницей — вставляется тем же скриптом. */
.pager .pagination > li.gap{
  min-width:auto;padding:0 4px;color:var(--muted);
  display:grid;place-items:center;height:42px;border:0;background:none;
}

/* Подпись «Показано …» остаётся в рамке — в макете она именно такая,
   светлой пилюлей справа на одной строке с кнопками. Ширину не ограничиваем,
   чтобы текст не переносился. */
.pager > .pager__info{min-width:auto;white-space:nowrap}

/* Сайдбар отдаёт модуль Mega Filter своей вёрсткой на Bootstrap.
   Пока не перенесён — просто вписываем его в колонку макета. */
.side > div{max-width:100%}
.side .panel,
.side .list-group{margin-bottom:16px}

/* ---------- боковые колонки ----------
   Классы col-sm-3 hidden-xs убраны в dalini/template/common/column_left.twig:
   внутри .side они ужимали фильтр до четверти ширины. Но тот же шаблон рисует
   колонку и на страницах, ещё не перенесённых в тему, — там разметка
   бутстраповская и колонке нужны её 25% сетки. Возвращаем их точечно. */
.container > .row > #column-left,
.container > .row > #column-right{width:25%;float:left;padding:0 15px}

/* В нашей колонке фильтр занимает всю ширину. */
.side #column-left,
.side #column-right{width:100%;float:none;padding:0;border:0}

/* ---------- информационные страницы ----------
   .layout — жёсткая сетка 266px + 1fr, сайдбар всегда слева. Если админ
   поставил модуль в правую колонку, порядок надо развернуть, иначе контент
   уедет в 266 пикселей. */
.layout--right{grid-template-columns:minmax(0,1fr) 266px}

/* Страница каталога без фильтра, поиск без сайдбара и т.п.: класс .layout
   не ставится, иначе единственная колонка встанет в дорожку 266px,
   отведённую под сайдбар. Вместе с классом теряется и его нижний отступ —
   возвращаем, чтобы низ страницы не прилипал к футеру. */
.layout--full{padding-bottom:88px}

/* Нижний отступ страницы несёт .pagetail — но только когда SEO-текст её
   и замыкает. На странице разделов под текстом идёт ещё витрина товаров:
   там 88px превратились бы в дыру посреди страницы, поэтому у текста
   остаётся отбивка поменьше, а отступ страницы возвращается контейнеру. */
.layout--full:has(.pagetail:last-child){padding-bottom:0}
.seo.pagetail:not(:last-child){padding-bottom:44px}

/* Шапка блока подбора под разделами каталога. В макете секция отбита
   сверху на 76px, снизу отступ даёт сам .sechead. */
.sechead--finder{margin-top:76px}

/* Описание страницы приходит из визуального редактора, и таблицы в нём
   обычные, а не таблицы характеристик. Снимаем моноширинный первый столбец,
   который .art__body ставит ради карточки товара. */
.page__body td:first-child{font-family:inherit;font-weight:inherit;color:inherit;white-space:normal}

/* В макетах информационные страницы разбиты на несколько секций .wrap.
   Если такую разметку вставят в описание целиком, вложенный .wrap добавит
   ещё 24px отступа с каждой стороны. Обезвреживаем. */
.wrap .wrap{max-width:none;padding:0}

/* ---------- обводка при клике ----------
   Bootstrap 3 вешает outline на :focus, и после клика мышью по ссылке или
   кнопке остаётся чёрная рамка. Снимаем её для указателя и возвращаем для
   клавиатуры через :focus-visible — иначе страница становится непроходимой
   с Tab. Порядок важен: сначала гасим, потом возвращаем. */
a:focus, button:focus, .btn:focus, .btn.focus, .btn.active:focus,
.btn.active.focus, .btn:active:focus, .btn:active.focus,
input:focus, select:focus, textarea:focus,
input[type="checkbox"]:focus, input[type="radio"]:focus,
input[type="file"]:focus{outline:0}

a:focus-visible, button:focus-visible, .btn:focus-visible,
.btn.active:focus-visible, .btn:active:focus-visible,
input:focus-visible, select:focus-visible, textarea:focus-visible,
[tabindex]:focus-visible{outline:2px solid var(--ink);outline-offset:2px}

/* ---------- карта сайта ----------
   Два столбца, как в дефолтном шаблоне, но сеткой вместо бутстраповских
   колонок. Вложенность показываем отступом и цветом, маркеры убираем. */
.sitemap{display:grid;grid-template-columns:repeat(2,1fr);gap:32px 48px;padding-bottom:72px}
@media(max-width:760px){.sitemap{grid-template-columns:1fr}}
.sitemap--blog{border-top:1px solid var(--line-2);padding-top:32px}
.sitemap__col,.sitemap__col ul{list-style:none;margin:0;padding:0}
.sitemap__col li{padding:5px 0}
.sitemap__col ul{padding-left:18px;border-left:1px solid var(--line-2);margin-top:5px}
.sitemap__col > li > a{font-weight:600;color:var(--ink)}
.sitemap__col ul a{color:var(--ink-2);font-size:14.5px}
.sitemap__col a:hover{color:var(--amber-d)}

/* ============================================================
   ВЫПАДАЮЩЕЕ МЕНЮ КАТАЛОГА (.mega)
   Две панели: слева разделы, справа подразделы выбранного раздела.
   Переключение — dalini.js, по наведению и с клавиатуры.
   ============================================================ */
.catbtn-wrap{position:relative;flex:none}

/* Кнопка «Каталог» — это <button>, а не ссылка: без JS она ничего
   не открывает, но и никуда не ведёт, поэтому пустого перехода нет. */
.catbtn{border:0;font:inherit;cursor:pointer}
.catbtn[aria-expanded="true"]{background:var(--amber-d)}

.mega{
  position:absolute;top:calc(100% + 8px);left:0;z-index:60;
  display:grid;grid-template-columns:264px minmax(560px,1fr);
  min-height:340px;max-height:min(560px,calc(100vh - 180px));
  border:1px solid var(--line);border-radius:var(--r);background:#fff;
  box-shadow:var(--shadow-l);overflow:hidden;
}
/* display:grid выше — авторское правило, и оно сильнее браузерного
   [hidden]{display:none}. Без этой строки меню было бы раскрыто всегда. */
.mega[hidden]{display:none}

/* ---------- левая колонка: разделы ---------- */
.mega__list{
  display:flex;flex-direction:column;padding:8px;gap:1px;
  background:var(--surface);border-right:1px solid var(--line-2);overflow-y:auto;
}
.mega__item{
  display:flex;align-items:center;gap:10px;width:100%;
  padding:11px 12px;border:0;border-radius:8px;background:none;
  font:inherit;font-size:14.5px;color:var(--ink-2);text-align:left;
  cursor:pointer;transition:.14s var(--ease);
}
.mega__item span{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mega__item svg{flex:none;width:15px;height:15px;stroke:var(--muted);fill:none;stroke-width:2;opacity:0}
.mega__item:hover{background:#fff;color:var(--ink)}
.mega__item.on{background:#fff;color:var(--ink);font-weight:600;box-shadow:var(--shadow)}
.mega__item.on svg{opacity:1;stroke:var(--amber-d)}

/* ---------- правая колонка: подразделы ---------- */
.mega__panels{position:relative;display:flex;flex-direction:column;overflow-y:auto;padding:24px 28px}
.mega__panel{display:none}
/* Видимая панель — флекс-колонка во всю высоту: так «Показать все»
   прижимается к низу, а не липнет к последней колонке ссылок. */
.mega__panel.on{display:flex;flex-direction:column;flex:1 1 auto}

.mega__title{
  display:inline-flex;align-items:center;gap:9px;
  font-size:18px;font-weight:700;letter-spacing:-.02em;color:var(--ink);margin-bottom:18px;
}
.mega__title svg{width:17px;height:17px;stroke:var(--amber-d);fill:none;stroke-width:2;
  transition:transform .18s var(--ease)}
.mega__title:hover{color:var(--amber-d)}
.mega__title:hover svg{transform:translateX(3px)}

/* Плоский список подразделов в колонках. columns, а не grid: колонки
   заполняются сверху вниз, как в каталогах маркетплейсов, и высота
   выравнивается сама при любом числе пунктов. */
.mega__cols{columns:3;column-gap:32px;margin-bottom:20px}
@media(max-width:1200px){.mega__cols{columns:2}}
.mega__cols a{
  display:block;break-inside:avoid;padding:6px 0;
  font-size:14px;line-height:1.4;color:var(--ink-2);transition:.14s;
}
.mega__cols a:hover{color:var(--amber-d)}

/* «Показать все» прижата к правому нижнему углу панели.
   Панели — флекс-колонка, поэтому margin-top:auto опускает кнопку вниз
   независимо от того, сколько подразделов над ней. */
.mega__all{
  margin-top:auto;align-self:flex-end;
  display:inline-flex;align-items:center;gap:8px;height:40px;padding:0 16px;
  border:1px solid var(--line);border-radius:var(--r-s);
  font-size:13.5px;font-weight:600;color:var(--ink);
  transition:.16s var(--ease);
}
.mega__all svg{width:15px;height:15px;stroke:var(--amber-d);fill:none;stroke-width:2;
  transition:transform .18s var(--ease)}
.mega__all:hover{border-color:var(--ink);color:var(--ink)}
.mega__all:hover svg{transform:translateX(3px)}

/* Последний пункт списка — переход во весь каталог. Отделён линией
   и не переключает панель, это обычная ссылка. */
.mega__item--root{margin-top:8px;padding-top:16px;border-top:1px solid var(--line);
  border-radius:0;font-weight:600;color:var(--ink)}
.mega__item--root svg{opacity:1;stroke:var(--amber-d)}
.mega__item--root:hover{background:none;color:var(--amber-d)}

/* ---------- узкие экраны ----------
   Две панели рядом не помещаются: разворачиваем в одну колонку,
   правая панель показывается под выбранным разделом. */
@media(max-width:900px){
  .mega{
    position:fixed;left:12px;right:12px;top:auto;width:auto;
    grid-template-columns:1fr;min-height:0;max-height:calc(100vh - 150px);
  }
  .mega__list{border-right:0;border-bottom:1px solid var(--line-2);flex-direction:row;
    overflow-x:auto;scrollbar-width:none}
  .mega__list::-webkit-scrollbar{display:none}
  .mega__item{width:auto;white-space:nowrap}
  .mega__item span{overflow:visible}
  .mega__panels{padding:18px 20px}
  .mega__cols{columns:1}
}

/* ---------- разделы карточками (страница «Каталог») ----------
   В макете catalog.html разделов ровно шесть, и сетка задана жёстко —
   repeat(6,1fr). На сайте их четыре, и две пустые колонки выглядели бы
   обрывом строки. auto-fit с минимумом 180px даёт те же шесть колонок
   на широком экране и ровно заполняет ряд при любом другом числе. */
.rootcats{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));margin-bottom:36px}

/* Карточка без картинки: .rcat__ph не выводится, если у раздела её нет,
   и заголовок не должен упираться в верхний край. */
.rcat > .rcat__b:first-child{padding-top:18px}

/* Без картинки наклейка с числом позиций становится обычной плашкой в теле
   карточки: висеть ей больше не на чем. */
.rcat__cnt--flat{position:static;align-self:flex-start;background:var(--surface)}

/* «ещё N» — такая же плашка, как подраздел, но с акцентным цветом:
   это не раздел, а ссылка на полный список. */
.rcat__more{font-size:11.5px;font-weight:600;color:var(--amber-d);padding:4px 8px;border-radius:99px;background:var(--surface);position:relative;z-index:2}
.rcat__more:hover{background:var(--ink);color:#fff}

/* В макете разделов ровно шесть, и сетка задана жёстко в шесть колонок.
   В магазине их бывает четыре или девять — auto-fit схлопывает пустые
   дорожки, поэтому ряд заполняется целиком, а карточка не становится уже
   180px. Правило идёт после theme.css и перекрывает в том числе его
   ступени по ширине — они этой сетке уже не нужны, кроме самой узкой:
   на телефоне две колонки по 180px не помещаются по-человечески. */
.rootcats{grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}
@media(max-width:420px){.rootcats{grid-template-columns:1fr}}

/* ============================================================
   МОДУЛИ ГЛАВНОЙ
   ============================================================ */

/* ---------- слайдер баннеров ----------
   В макете слайд двухколоночный: слева текст, справа фото. Модуль
   слайдшоу отдаёт только картинку со ссылкой, поэтому его слайд —
   одна картинка во всю ширину. Оболочка .hslider остаётся общей:
   рамка, стрелки, точки и автопрокрутка из theme.js работают так же. */
.hslide--banner{display:block;padding:0;min-height:0;grid-template-columns:none}
.hslide--banner img{display:block;width:100%;height:auto}
.hslide--banner a{display:block}

/* Точки в макете лежат на светлой подложке слайда. На картинке они могут
   потеряться, поэтому под ними тонкая подложка. */
.hslider__dots{padding:6px 8px;border-radius:99px;background:rgba(255,255,255,.72);left:26px}

/* ---------- лента брендов ----------
   Логотипы — картинки, а .brand свёрстан под текст. */
.brand--logo{padding:18px 22px}
.brand--logo img{max-width:100%;max-height:56px;width:auto;height:auto;object-fit:contain;
  filter:grayscale(1);opacity:.62;transition:.24s var(--ease)}
.brand--logo:hover img{filter:none;opacity:1}

/* ---------- баннеры ---------- */
.bannerset{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:16px}
.bannerset__i{display:block;border-radius:var(--r);overflow:hidden;border:1px solid var(--line-2)}
.bannerset__i img{display:block;width:100%;height:auto}

/* ---------- список категорий в колонке ----------
   Второй уровень отбиваем отступом и полосой, чтобы вложенность читалась
   без маркеров. */
.anav__sub{padding-left:34px;font-size:14px;color:var(--muted)}
.anav__sub::before{content:"";position:absolute;left:22px;width:1px;height:100%;background:var(--line-2)}
.anav a{position:relative}

/* ---------- произвольный HTML ---------- */
.mod-html + .mod-html{margin-top:0}
.mod-html .page__body > *:first-child{margin-top:0}

/* ---------- вертикальный ритм главной ----------
   Отбивку задаёт контейнер: 24px сверху (в макете блок подбора поджат
   к шапке) и 88px снизу. Модули между первым и последним добавляют
   по 44px с каждой стороны, так что между двумя соседями получается 88.

   Отступ у модулей внешний, а не внутренний. У блока подбора, слайдера,
   ленты брендов и списков корень — это карточка с рамкой и фоном:
   padding отбил бы содержимое внутри рамки, а саму карточку от соседей
   не отодвинул. К тому же padding-шорткат затёр бы горизонтальные
   отступы карточек, заданные при вёрстке. */
.page-home #content{padding-top:24px;padding-bottom:88px}
.page-home #content > *{margin:44px 0}
.page-home #content > *:first-child{margin-top:0}
.page-home #content > *:last-child{margin-bottom:0}

/* У витрин товаров отбивка уже своя — они <section>, а theme.css задаёт
   section{padding:88px 0}. Здесь ритм общий, поэтому её снимаем. */
.page-home #content > section{padding:0}

/* ---------- герой на главной ----------
   Приезжает HTML-модулем, поэтому лежит внутри .wrap страницы. Его
   собственный .wrap распускает правило .wrap .wrap выше — вместе с боковыми
   отступами снимаются и вертикальные 72/96 из макета. Так и нужно:
   расстояние до соседних модулей задаёт общий ритм главной, а не сам блок.

   Нижнюю линию убираем. В макете герой во всю ширину экрана и линия читается
   как граница секции; по ширине контента она выглядела бы случайной чертой.

   Селектор без «> .hero» намеренно: HTML-модуль оборачивает вставленную
   разметку в .mod-html > .page__body, и прямым потомком #content герой
   не является. */
.page-home .hero{border-bottom:0}

/* Композиция в герое собрана из трёх снимков, и им нужна квадратная область.
   Если картинок не будет — блок не должен схлопнуться в полоску. */
.page-home .hero__art{min-height:320px}

/* ---------- плитки каталога на главной ----------
   Значок приходит разметкой SVG из карточки категории и обёрнут в
   <span class="ci">: класс на самом <svg> ставить необязательно, писать
   разметку будет редактор. Размер, цвет и толщину линии задаём здесь —
   в разметке их указывать не нужно, а если указаны, наши правила
   с двумя классами всё равно окажутся сильнее. */
.cat .ci{display:block;width:34px;height:34px;flex:none}
.cat .ci svg{
  width:100%;height:100%;display:block;
  stroke:var(--ink);fill:none;stroke-width:1.4;
  stroke-linecap:round;stroke-linejoin:round;
  transition:stroke .24s var(--ease);
}
.cat:hover .ci svg{stroke:var(--amber-d)}

/* Число разделов задаёт админ, и жёсткие шесть колонок из макета оставили бы
   пустой хвост. Минимум шире макетного: в плитке теперь и подразделы,
   а в 170px они бы рассыпались по одному слову в строку. */
.cats{grid-template-columns:repeat(auto-fit,minmax(230px,1fr))}

/* ---------- подразделы в плитке ----------
   Плитка стала <div>, кликабельность даёт растяжка у заголовка. Ссылки
   на подразделы лежат над ней, иначе клик по ним уходил бы в раздел. */
.cat__link{color:inherit}
.cat__link::after{content:"";position:absolute;inset:0;z-index:1}
.cat b{margin-top:auto;margin-bottom:0}
.cat__sub{display:flex;flex-wrap:wrap;gap:5px;position:relative;z-index:2}
.cat__sub a{
  font-size:11.5px;line-height:1.3;color:var(--ink-2);
  padding:4px 8px;border-radius:99px;background:var(--surface);transition:.18s;
}
.cat__sub a:hover{background:var(--ink);color:#fff}
/* Счётчик прижат к низу плитки, остальное — к верху. В макете плитка
   состояла из значка, названия и числа, и название уводил вниз
   .cat b{margin-top:auto} из theme.css. С подразделами так нельзя:
   в ряду у плиток разное число ссылок, и названия оказывались на разной
   высоте. Отменяем тот отступ и переносим его на счётчик. */
.cat{gap:10px}
.cat b{margin-top:0}
.cat__cnt{margin-top:auto;font-size:12px;color:var(--muted)}

/* ---------- вкладки над витринами ----------
   Контейнер создаёт dalini.js: витрины, стоящие подряд, собираются
   в один блок с переключателем. Внутри него секции больше не прямые
   потомки #content, поэтому им возвращается section{padding:88px 0}
   из theme.css — снимаем. */
.mod-tabs .mod-products{padding:0}
.mod-tabs .tabs{margin-bottom:28px}

/* Заголовок секции переехал во вкладку. Если рядом осталась ссылка
   «Смотреть все», шапка не удаляется — прижимаем её вправо. */
.mod-tabs .sechead{justify-content:flex-end;margin-bottom:20px}

/* ---------- преимущества и цифры ----------
   Обе секции в макете — полосы во всю ширину экрана: у .usp светлая
   заливка с линиями сверху и снизу, у .stats тёмный фон. Блоки приезжают
   HTML-модулями и лежат внутри .wrap, поэтому их приходится «выпускать»
   наружу отрицательными полями.

   Проценты в margin и padding считаются от ширины родителя — одного
   и того же для обоих свойств. Поэтому поле вытягивает край до границы
   экрана, а такой же по величине внутренний отступ возвращает содержимое
   на прежнее место: текст остаётся выровненным с остальной страницей.

   Про --sbw. Единица vw включает полосу прокрутки, а проценты — нет,
   и на десктопе блок вылезает за экран ровно на её ширину: появляется
   горизонтальная прокрутка. Ширину полосы измеряет dalini.js и кладёт
   в --sbw; половина уходит на каждую сторону. Замер стоит прямо в шапке,
   до отрисовки — иначе страница мелькнула бы с прокруткой.

   overflow-x:clip на body ниже — только подстраховка на случай, когда
   скрипты выключены: переменная тогда равна нулю. Именно clip, а не
   hidden: hidden создал бы контейнер прокрутки и сломал position:sticky
   у меню кабинета и сайдбара фильтра. */
.usp--bleed,
.stats--bleed{
  margin-left:calc(50% - 50vw + var(--sbw, 0px) / 2);
  margin-right:calc(50% - 50vw + var(--sbw, 0px) / 2);
  padding-left:calc(50vw - 50% - var(--sbw, 0px) / 2);
  padding-right:calc(50vw - 50% - var(--sbw, 0px) / 2);
  border-radius:0;
}
.usp--bleed{padding-top:56px;padding-bottom:56px}
.stats--bleed{padding-top:64px;padding-bottom:64px}

body{overflow-x:clip}

/* Полосы стоят вплотную друг к другу, как в макете: там это соседние
   секции, и их фоны смыкаются без просвета. Внешние отступы у модуля
   с полосой снимаем совсем — расстояние даёт её собственный внутренний
   отступ, 56 и 64 пикселя. К обычному соседу полоса при этом не липнет:
   у того остаются свои 44 пикселя.

   Обнуляем оба отступа, а не только верхний: #content — флекс-колонка,
   а у флекс-элементов вертикальные поля не схлопываются, и 44 снизу
   всё равно дали бы просвет.

   :has() читает содержимое модуля — иначе снаружи не отличить блок
   с полосой от обычного. В браузерах, которые его не знают, останутся
   прежние 88 пикселей между полосами: только зазор, ничего не ломается. */
.page-home #content > *:has([class*="--bleed"]){margin-top:0;margin-bottom:0}

/* Та же история с нижним отступом самого #content: под последней полосой
   он оставляет белую ленту до подвала. Полоса и подвал в макете смыкаются,
   поэтому отступ снимаем — но только когда полоса действительно последняя. */
.page-home #content:has(> :last-child [class*="--bleed"]),
.page-home #content:has(> [class*="--bleed"]:last-child){padding-bottom:0}

/* Внутренние отступы .usp__item в макете считались от края экрана;
   в карточке первый столбец уже прижат к её padding. */
@media(max-width:900px){
  .usp__grid{grid-template-columns:repeat(2,1fr);gap:28px 0}
  .usp__item:nth-child(odd){padding-left:0;border-left:0}
}
@media(max-width:560px){
  .usp__grid{grid-template-columns:1fr}
  .usp__item{padding-left:0;border-left:0}
  .stats__grid{grid-template-columns:repeat(2,1fr)}
  .usp--bleed{padding-top:40px;padding-bottom:40px}
  .stats--bleed{padding-top:44px;padding-bottom:44px}
}

/* ---------- производство по чертежам ----------
   Двухколоночная карточка, на узких экранах — в одну колонку. */
@media(max-width:820px){
  .custom{grid-template-columns:1fr}
  .custom__l,.custom__r{padding:34px 28px}
}

/* ---------- лента блога ----------
   Карточка статьи — ссылка целиком, поэтому у заголовка снимаем
   собственный цвет ссылки: подсветку на наведении даёт .post:hover b. */
.mod-posts .post{color:inherit}
.post__meta{font-size:12px;color:var(--muted)}

/* В макете на месте картинки лежал svg, и theme.css растягивает только его.
   Из модулей приходит <img> произвольных пропорций — вписываем в ту же
   рамку 16:10 по центру, иначе плитки поедут разной высоты. */
.post__img img{display:block;width:100%;height:100%;object-fit:cover}
@media(max-width:900px){.posts{grid-template-columns:repeat(2,1fr)}}
@media(max-width:600px){.posts{grid-template-columns:1fr}}

/* ---------- витрина на главной по тегам ----------
   Полоса вкладок идёт под шапкой секции, поэтому у самой шапки отступ
   снизу меньше макетного: там между заголовком и товарами ничего не было. */
.mod-showcase .sechead{margin-bottom:18px}
.mod-showcase .tabs{margin-bottom:28px}

/* Кнопки вкладок — <button>, у него свои поля и фон по умолчанию. */
.mod-showcase .tab{
  border:0;background:none;cursor:pointer;font:inherit;
  padding:12px 16px;font-size:15px;font-weight:500;
  transition:color .2s var(--ease);
}

/* ---------- бегущая линия под активной вкладкой ----------
   В макете активную вкладку держит border-bottom у самой кнопки. Границу
   нельзя переместить — она только появляется и исчезает, и переключение
   выглядит как мигание. Поэтому линия вынесена отдельным элементом,
   его создаёт dalini.js и двигает трансформацией. Собственную границу
   кнопок при этом гасим, иначе линий станет две. */
.mod-showcase .tabs{position:relative}
.mod-showcase .tab{border-bottom:0;margin-bottom:0}
.mod-showcase .tabs__ink{
  position:absolute;left:0;bottom:-1px;height:2px;width:0;
  background:var(--amber);border-radius:2px;pointer-events:none;
  transition:transform .32s var(--ease), width .32s var(--ease);
}

/* Панель проявляется со сдвигом — так видно, что содержимое сменилось,
   а не просто мигнуло. Анимация на появлении, без обратного хода:
   уходящая панель скрывается мгновенно, ждать её незачем. */
@keyframes dalini-pane-in{
  from{opacity:0;transform:translateY(10px)}
  to{opacity:1;transform:none}
}
.mod-showcase .grid4.is-in{animation:dalini-pane-in .34s var(--ease) both}

/* Тем, кто просил меньше движения, отдаём простое переключение. */
@media(prefers-reduced-motion:reduce){
  .mod-showcase .tabs__ink{transition:none}
  .mod-showcase .grid4.is-in{animation:none}
}

/* Панель скрывается атрибутом hidden, а .grid4 задаёт display:grid —
   авторское правило сильнее браузерного [hidden]{display:none}.
   Та же история, что с выпадающим меню каталога. */
.mod-showcase .grid4[hidden]{display:none}

/* Bootstrap красит любую ссылку при наведении: a:focus,a:hover{color:#23527c}.
   Селектор из тега с псевдоклассом специфичнее одного класса, поэтому
   кнопка-ссылка теряет свой цвет и текст уходит в тёмно-синий — на
   чёрной заливке его просто не видно. Возвращаем цвет каждой заливке.

   Контурной кнопки это не касается: у неё цвет задан в самом правиле
   наведения, и оно спор выигрывает. */
a.btn--primary:hover,a.btn--primary:focus{color:#fff}
a.btn--amber:hover,a.btn--amber:focus{color:var(--ink)}

/* «Смотреть все N товаров» под витриной. Раньше стояла ссылкой в углу
   заголовка и терялась: её замечали до того, как посмотрят товары,
   то есть ровно тогда, когда она не нужна. Теперь кнопка по центру
   под плиткой — на пути взгляда, когда ряд досмотрен.

   Ширину задаём минимумом, а не фиксируем: подпись меняется вместе
   с вкладкой («117 товаров» против «8 товаров»), и кнопка не должна
   прыгать при каждом переключении. */
.showcase__more{display:flex;justify-content:center;margin-top:34px}
.showcase__more .btn{min-width:300px}
.showcase__more .btn svg{width:18px;height:18px;flex:none;transition:transform .2s var(--ease)}
.showcase__more .btn:hover svg{transform:translateX(4px)}
@media(max-width:560px){
  .showcase__more{margin-top:26px}
  .showcase__more .btn{width:100%;min-width:0}
}

/* ---------- теги товара в карточке ----------
   Тегов у позиции бывает четыре-пять, и все они словами: «Собственный
   бренд», «Новинка». Значок .badge из макета для этого не годится —
   он заглавными, с разрядкой и на тёмной заливке: пять таких превращают
   карточку в пёстрое полотно и вдвое шире по ширине.

   Поэтому у тегов свой вид — светлая пилюля обычным текстом. Янтарная
   «Акция» остаётся единственным акцентом, и её видно сразу. */
.badge--tag{
  text-transform:none;letter-spacing:0;font-weight:500;font-size:11.5px;
  padding:4px 9px;border-radius:99px;
  background:var(--surface);color:var(--ink-2);border:1px solid var(--line-2);
}
.card:hover .badge--tag{border-color:var(--line)}

/* Свёрнутый остаток: «+2». Тот же размер, но без рамки и с моноширинной
   цифрой — читается как счётчик, а не как ещё один тег. В title лежит
   полный список, он всплывает по наведению. */
.badge--more{
  text-transform:none;letter-spacing:0;font-weight:600;font-size:11.5px;
  padding:4px 8px;border-radius:99px;
  background:var(--line-2);color:var(--muted);border:1px solid transparent;
  font-family:"JetBrains Mono",ui-monospace,monospace;cursor:default;
}

/* Значки переносятся на вторую строку — зазор между строками меньше,
   чем между самими значками, иначе блок распухает. */
.card__badges{row-gap:4px}

/* В списочном виде значки стоят в первой колонке под названием, места там
   больше — но и текст рядом длиннее, поэтому перенос всё равно нужен. */
.is-list .card__badges{max-width:100%}

/* ---------- цвета тегов ----------
   Четыре смысловых значка заливаются цветом, остальные остаются нейтральными.
   Класс ставит шаблон по вхождению корня в название тега: имена приходят
   из 1С и могут меняться — «Хит» сегодня, «Хит продаж» завтра.

   «Новинка» зелёная: красный и янтарный уже заняты хитом и акцией, а она
   должна читаться как «появилось», а не как «выгодно». Ставит её обмен
   по дате создания товара, поэтому в карточке она всегда первой. */
.badge--tag.is-new{background:var(--green);border-color:var(--green);color:#fff;font-weight:600}
.badge--tag.is-hit{background:#C8102E;border-color:#C8102E;color:#fff;font-weight:600}
.badge--tag.is-sale{background:var(--amber);border-color:var(--amber);color:var(--ink);font-weight:600}
.badge--tag.is-own{background:var(--steel);border-color:var(--steel);color:var(--amber);font-weight:600}

/* Наведение на карточку подсвечивает рамку только у нейтральных пилюль —
   у цветных рамка совпадает с заливкой, и менять её незачем. */
.card:hover .badge--tag.is-new,
.card:hover .badge--tag.is-hit,
.card:hover .badge--tag.is-sale,
.card:hover .badge--tag.is-own{border-color:transparent}

/* Цены нет: на месте ценника спокойная надпись «Под заказ». Ростом
   поменьше ценника и не чёрным — это не сумма, а причина, по которой
   суммы нет. В карточке товара то же самое, но крупнее. */
.price--order{font-size:15px;font-weight:600;color:var(--muted);letter-spacing:0}
.buybox__price--order b{font-size:22px;font-weight:700;color:var(--ink-2);letter-spacing:-.02em}

/* ---------- блок брендов ----------
   Подпись у своей марки в theme.css вшита строкой прямо в content,
   то есть непереводима. Берём её из атрибута — значение кладёт шаблон
   из языкового файла. */
.brand.own[data-own]::after{content:attr(data-own)}

/* Плитка без ссылки — это <span>, ему нужен обычный курсор. */
span.brand{cursor:default}


/* ---------- цвет заголовков ----------
   stylesheet.css темы по умолчанию красит все заголовки в #444:

       h1, h2, h3, h4, h5, h6 { color: #444 }

   Наш theme.css цвет им не задаёт вовсе — в макете заголовки берут его
   по наследству от родителя. Но собственное правило всегда сильнее
   наследования, поэтому в тёмных блоках заголовок оставался серым:
   «Пришлите чертёж» в блоке производства, заголовок тёмного слайда
   промо-слайдера. На белом фоне подмена была незаметна.

   Возвращаем наследование. Заголовок теперь чёрный на белом и белый
   на тёмном — ровно как задумано в макете. */
h1, h2, h3, h4, h5, h6{color:inherit}

/* ---------- поля формы в тёмном блоке ----------
   Вид полям задаёт .formrow input, то есть правило зависит от обёртки
   <form class="formrow">. Визуальный редактор в админке форму из разметки
   может выкинуть — многие это делают, считая её небезопасной, — и тогда
   поля остаются голыми: белый прямоугольник на тёмном фоне.

   Дублируем правила без опоры на форму: внутри тёмной колонки поле
   выглядит правильно, даже если обёртки не осталось. */
/* flex тут намеренно не задаём. Когда форма на месте, ряд строит
   .formrow input{flex:1} из theme.css. Когда формы нет, поле становится
   прямым потомком .custom__r — а это колонка-флекс, и flex:1 растянул бы
   его по высоте на всю свободную высоту блока. */
.custom__r input[type="text"],
.custom__r input:not([type]),
.custom__r input[type="tel"],
.custom__r input[type="email"]{
  height:50px;border-radius:var(--r-s);
  border:1px solid rgba(255,255,255,.18);background:rgba(255,255,255,.06);
  color:#fff;padding:0 16px;font:inherit;font-size:15px;outline:0;
}
.custom__r input::placeholder{color:#8A8A93}
.custom__r input:focus{border-color:rgba(255,255,255,.4);background:rgba(255,255,255,.1)}

/* Без формы поля и кнопка встают в столбик — задаём ряд самому блоку. */
.custom__r .formrow,
.custom__r form{display:flex;gap:10px;flex-wrap:wrap}

/* ---------- блок заявки ----------
   Ловушка для роботов: поле должно быть в разметке, но не на экране.
   Не display:none и не type="hidden" — и то, и другое бот распознаёт
   и пропускает. Уводим за пределы видимой области. */
/* !important здесь по делу, а не от лени. На это поле целятся сразу
   несколько правил с разной специфичностью — .formrow input из theme.css
   и .custom__r input[type="text"] отсюда же, — и каждое возвращает ему
   то размеры, то отступы. Ловушка обязана быть невидимой при любом
   раскладе: если она покажется, посетитель заполнит её и заявка
   уйдёт в отказ. Проверял оба раза замером: без important оставалось
   34×50 пикселей. */
input.dalini-trap{
  position:absolute !important;
  width:1px !important;height:1px !important;min-width:0 !important;
  padding:0 !important;margin:-1px !important;border:0 !important;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;opacity:0;
}

/* Ответ сервера под формой. */
.formrow__msg{
  margin-top:14px;padding:12px 14px;border-radius:var(--r-s);
  font-size:14px;line-height:1.5;
}
.formrow__msg.is-ok{background:rgba(20,154,90,.16);color:#7BE0AC}
.formrow__msg.is-error{background:rgba(200,16,46,.18);color:#FF9FAE}
.formrow__msg[hidden]{display:none}

/* Капча в форме заявки. Разметку даёт выбранная в магазине капча, и она
   бутстраповская: fieldset с legend и сетка col-sm-2 / col-sm-10. В нашей
   тёмной карточке это выглядит чужим, поэтому сетку распускаем, а поля
   отдаём правилу .formrow input из theme.css — оно уже описывает поля
   этой формы. Занимает всю ширину ряда: .formrow — флекс, иначе капча
   встала бы третьей колонкой рядом с именем и телефоном.

   reCAPTCHA v3 невидима и рисует только скрытое поле — ей отсюда ничего
   не нужно, правила ниже просто ни на что не попадут. */
.formrow__captcha{flex:1 0 100%}

/* Согласие в блоке заявки: своя строка на всю ширину ряда и цвета
   тёмной колонки — .agreebox из темы рассчитан на белый фон. */
.agreebox--wide{flex:1 0 100%;margin-top:2px}
/* Внутри .formrow поля получают рамку, фон и высоту 50px — галочке
   всё это ни к чему. */
.formrow .agreebox input{height:17px;padding:0;border:0;background:none;border-radius:0}
.custom__r .agreebox{color:#8A8A93}
.custom__r .agreebox a{color:#C9C9CF;border-bottom-color:rgba(255,255,255,.25)}
.custom__r .agreebox a:hover{color:#fff}
.formrow__captcha fieldset{border:0;margin:0;padding:0;min-width:0}
.formrow__captcha legend,
.formrow__captcha label{display:block;float:none;width:auto;padding:0;margin:0 0 8px;border:0;
  font-size:12px;letter-spacing:.04em;color:#A7A7A7;text-transform:uppercase;line-height:1.4}
.formrow__captcha .form-group{margin:0}
.formrow__captcha [class*="col-sm-"]{float:none;width:auto;padding:0}
.formrow__captcha img{display:block;margin-top:10px;border-radius:var(--r-s)}
.formrow__captcha .g-recaptcha{margin-top:4px}
.formrow__captcha .text-danger{color:#FF9A8B;font-size:13px;margin-top:6px}

/* ---------- страница статьи ----------
   Теги статьи выглядят как рубрики: это такие же ссылки на подборку. */
.art__tags{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:28px;font-size:13px;color:var(--muted)}

/* Якоря оглавления: шапка сайта липкая, без запаса заголовок уезжает под неё. */
.art__body h2{scroll-margin-top:96px}

/* Блоки после статьи. У самой статьи нижний отступ есть, у того,
   что идёт следом, — нет. */
.art + .mod-products,
.art ~ .mod-posts{padding-bottom:88px}

/* Комментарии. Форму и список рисует расширение бутстраповской разметкой,
   вид ей задаёт forms.css через .page__body — здесь только сама лента. */
.art__comments{max-width:900px;padding-bottom:88px}
.comments{display:flex;flex-direction:column;gap:18px;margin-bottom:32px}
.comment{border:1px solid var(--line);border-radius:var(--r);padding:18px 20px;background:#fff}
.comment__head{display:flex;gap:12px;align-items:baseline;margin-bottom:8px}
.comment__head b{font-size:15px}
.comment__head time{font-size:12px;color:var(--muted)}
.comment p{margin:0;font-size:15px;line-height:1.6;color:var(--ink-2)}
.comments__empty{color:var(--muted);margin-bottom:24px}

/* ---------- корзина ----------
   Сертификат — не товар: ни количества, ни галочки у него нет, поэтому
   в ряду четыре ячейки вместо шести. */
.citem--voucher{grid-template-columns:92px 1fr 108px 34px}

/* Выбранные опции, бонусы и подписка — мелкой строкой под названием. */
.citem__opts{display:flex;flex-direction:column;gap:2px;font-size:12.5px;color:var(--muted);margin-top:6px}

/* Ядро отдаёт в корзину только признак наличия, без остатка. Красным
   помечаем то, чего нет, — зелёная строка с остатком тут неоткуда взяться. */
.citem__stock--out{color:#C8102E}

/* Купон, сертификат, бонусы, расчёт доставки. Каждый модуль рисует свою
   форму бутстрапом; вид даёт forms.css через .page__body, здесь только
   рамка блока в колонке итогов. */
.cartmods{margin-top:16px;border:1px solid var(--line);border-radius:var(--r);background:#fff;padding:6px 18px 18px}
.cartmods .panel,
.cartmods .panel-default{border:0;box-shadow:none;margin:0}
.cartmods .panel-heading{padding:14px 0 0;background:none;border:0}
.cartmods .panel-title{font-size:14px;font-weight:600}
.cartmods .panel-title a{color:var(--ink)}
.cartmods .panel-body{padding:12px 0 0;border:0}

/* Поле с кнопкой модули рисуют бутстраповской .input-group — это таблица,
   и в колонке шириной 356px поле сжимается до полутора сотен пикселей.
   Ставим их друг под другом. */
.cartmods .input-group{display:flex;flex-direction:column;gap:10px;width:100%}
.cartmods .input-group .form-control{width:100%}
.cartmods .input-group-btn{display:block;width:100%}
.cartmods .input-group-btn .btn{width:100%}

/* ---------- карточка товара ----------
   Строка под ценой: налог и остаток. В макете это подпись «Цена за штуку
   с НДС · на складе 34 шт.», собранная из данных магазина. */
.buybox__note{font-size:13.5px;opacity:.75;margin-top:6px}

/* Минимальный заказ — предупреждение ядра, в макете места под него нет. */
.buybox__min{font-size:12.5px;color:var(--muted);margin-top:10px}

/* Опции товара и форма отзыва размечены бутстрапом, вид им даёт forms.css
   через .page__body; здесь только отбивка внутри блока покупки. */
.popts{margin:16px 0 4px}
.popts .form-group{margin-bottom:14px}
.popts .form-group:last-child{margin-bottom:0}

/* Оценка в форме отзыва: пять переключателей в строку. */
.prating{display:flex;align-items:center;gap:14px;flex-wrap:wrap;font-size:14px;color:var(--ink-2)}
.prating label{display:inline-flex;align-items:center;gap:6px;margin:0;font-weight:500;cursor:pointer}
.prating input{margin:0;accent-color:var(--amber)}

/* Аналоги в правой колонке: ссылок бывает много, поэтому список
   ограничен по высоте и прокручивается, чтобы не отодвигать кнопку
   покупки за пределы экрана. */
.panalogs__l{max-height:104px;overflow:auto}

/* ---------- всплывающие окна ----------
   Окно — нативный <dialog>: модальный режим, фокус и Esc он умеет сам,
   нам остаётся вид. Затемнение рисует ::backdrop. */
.pop{
  width:min(440px, calc(100vw - 32px));padding:0;border:0;border-radius:var(--r);
  background:#fff;color:var(--ink);box-shadow:0 24px 60px rgba(14,14,16,.24);overflow:visible;
}
.pop::backdrop{background:rgba(14,14,16,.55)}
.pop__b{padding:30px 28px 28px;display:flex;flex-direction:column;gap:14px}
.pop__b h3{font-size:22px;letter-spacing:-.03em;line-height:1.2}
.pop__t{font-size:14px;color:var(--ink-2);line-height:1.5;margin:-4px 0 2px}

/* Товар, о котором идёт запрос. Окно одно на всю страницу, название
   в него подставляет скрипт по нажатой кнопке — без этой строки
   непонятно, по какой позиции уходит заявка. */
.pop__prod{margin:0;padding:11px 13px;border-radius:var(--r-s);background:var(--surface);font-size:13.5px;font-weight:600;color:var(--ink);line-height:1.4}
.pop__prod[hidden]{display:none}

/* Крестик лежит в углу самого окна, поэтому у .pop не должно быть
   overflow:hidden — иначе он обрежется. */
.pop__x{
  position:absolute;top:10px;right:10px;width:34px;height:34px;display:flex;
  align-items:center;justify-content:center;border:0;border-radius:50%;
  background:none;color:var(--muted);cursor:pointer;padding:0;
}
.pop__x:hover{background:var(--surface);color:var(--ink)}
.pop__x svg{width:18px;height:18px}

.pop__form{display:flex;flex-direction:column;gap:10px}
.pop__form input[type="text"],
.pop__form input[type="tel"],
.pop__form textarea{
  height:50px;border-radius:var(--r-s);border:1px solid var(--line);background:#fff;
  color:var(--ink);padding:0 16px;font:inherit;font-size:15px;outline:0;width:100%;
}
.pop__form textarea{height:auto;padding:14px 16px;line-height:1.5;resize:vertical}
.pop__form input::placeholder,
.pop__form textarea::placeholder{color:var(--muted)}
.pop__form input:focus,
.pop__form textarea:focus{border-color:var(--ink)}
.pop__form .btn{width:100%;margin-top:4px}
.pop__captcha .form-group{margin:0}
.pop__captcha label{display:block;font-size:12px;color:var(--muted);margin-bottom:6px}
.pop__captcha [class*="col-sm-"]{float:none;width:auto;padding:0}
.pop__captcha img{display:block;margin-top:8px;border-radius:var(--r-s)}

.pop__msg{margin:14px 0 0;font-size:14px;line-height:1.5}
.pop__msg.is-ok{color:var(--green)}
.pop__msg.is-error{color:#C8102E}

/* Кнопки «Купить в один клик» и «Задать вопрос» выглядят как ссылки
   .pact из макета, но это <button> — снимаем ему системный вид. */
button.pact{background:none;font:inherit;cursor:pointer;text-align:left}

/* ---------- оформление заказа ----------
   Разметка наша, но внутри шагов остаются куски от модуля: скрытые поля,
   блоки с галочками, капча. Всё, что не поле, занимает обе колонки —
   иначе такие блоки встают половиной ширины рядом с полем. */
.costep .fgrid2 > *:not(.fld2){grid-column:1/-1}
.costep .fgrid2 > .hide,
.costep .fgrid2 > input.hide,
.costep .fgrid2 > select.hide{display:none !important}

/* Заголовок внутри шага — «Адрес доставки» перед способами. */
.costep__sub{font-size:14px;font-weight:600;margin:0 0 14px}
.costep #shipping-method{margin-top:22px}

/* Поля модуля размечены бутстрапом; вид им задаёт .fld2 из макета,
   но у самих .form-control остаются свои поля и рамка. */
.costep .form-control{box-shadow:none}
.costep .checkbox,
.costep .radio{margin:6px 0}
.costep .checkbox label,
.costep .radio label{display:inline-flex;align-items:center;gap:8px;font-size:14px;color:var(--ink-2);font-weight:400}
.costep .required > label::after,
.costep .fld2.required label::after{content:" *";color:#C8102E}

/* Вход над формой покупателя. */
#login-box{padding-bottom:18px;margin-bottom:18px;border-bottom:1px solid var(--line-2)}
#login-box .or{margin-top:14px;font-size:13px;color:var(--muted);text-align:center}

/* Состав заказа в колонке итогов. */
.totals__t{font-size:12.5px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;opacity:.6;margin-bottom:12px}
.olist__n a{color:inherit;font-weight:600}
.olist__n a:hover{color:var(--amber-d)}
.olist--out{opacity:.55}

/* Счётчик количества прямо в списке заказа — мелкий, чтобы не спорить
   с суммой справа. */
.olist__q{display:flex;align-items:center;gap:4px;margin-top:8px}
.olist__q button{width:24px;height:24px;border:1px solid var(--line);border-radius:6px;background:#fff;color:var(--ink-2);font-size:14px;line-height:1;cursor:pointer;padding:0}
.olist__q button:hover{border-color:var(--ink);color:var(--ink)}
.olist__q input{width:44px;height:24px;text-align:center;border:1px solid var(--line);border-radius:6px;font:inherit;font-size:12px;padding:0}

/* Купон, сертификат, бонусы. */
.cofield{margin-top:14px}
.cofield label{display:block;font-size:12.5px;font-weight:600;color:var(--muted);margin-bottom:7px}
.cofield__r{display:flex;gap:8px}
.cofield__r .form-control{flex:1;height:44px;border-radius:var(--r-s);border:1px solid var(--line);padding:0 14px;font:inherit;font-size:14px;box-shadow:none}
.cofield__r .btn{flex:none}

/* Согласие и кнопка подтверждения. */
.terms{margin-top:18px;display:flex;flex-direction:column;gap:14px}
.terms .btn{width:100%}
.coconfirm__t{margin-top:18px}

@media(max-width:900px){
  .costep .fgrid2{grid-template-columns:1fr}
}

/* ---------- страница «готово» ----------
   Заказ оформлен, подписка сохранена. Текст приходит из ядра, поэтому
   типографику ему даёт .art__body, а рамку и галочку — блок вокруг. */
.cosuccess{max-width:640px;border:1px solid var(--line);border-radius:var(--r);background:#fff;padding:34px 32px;margin-bottom:88px}
.cosuccess__i{width:52px;height:52px;border-radius:50%;background:#EAF7EF;color:var(--green);display:grid;place-items:center;margin-bottom:20px}
.cosuccess__i svg{width:26px;height:26px}
.cosuccess__a{margin-top:26px}

/* Оценка в списке отзывов: пять точек, закрашены по рейтингу. */
.comment__rate{margin-left:auto;display:flex;gap:3px}
.comment__rate i{width:9px;height:9px;border-radius:50%;background:var(--line);display:block}
.comment__rate i.on{background:var(--amber)}

/* ---------- контакты и заглушка ---------- */
.cocontacts{display:grid;grid-template-columns:1fr 420px;gap:24px;align-items:start;margin-bottom:44px}
.cocards{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.cocard{border:1px solid var(--line);border-radius:var(--r);background:#fff;padding:20px;display:flex;flex-direction:column;gap:6px}
.cocard svg{width:20px;height:20px;stroke:var(--amber-d);fill:none;margin-bottom:4px}
.cocard b{font-size:12px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
.cocard a{font-size:16px;font-weight:600;letter-spacing:-.02em}
.cocard a:hover{color:var(--amber-d)}
.cocard span{font-size:14px;color:var(--ink-2);line-height:1.5}
.cocard__t{font-size:13px;color:var(--muted)}
.cocard--wide{grid-column:1/-1}
.cocard--form{padding:26px 24px}
.cocard--form h2{font-size:20px;margin-bottom:16px}
.cocard .link-more{margin-top:8px;font-size:13.5px}
.cocard img{border-radius:var(--r-s);margin:4px 0}
.cosuccess__i--wait{background:#FFF7E0;color:var(--amber-d)}
@media(max-width:980px){
  .cocontacts{grid-template-columns:1fr}
  .cocards{grid-template-columns:1fr}
}

/* ---------- сообщения ядра ----------
   Те, что вставляет common.js после действий с корзиной и закладками,
   помечены классом alert-dismissible. Показываем их всплывающей плашкой
   в углу: раньше они распирали страницу во всю ширину и сдвигали
   содержимое вниз. Сообщения из наших шаблонов идут без dismissible
   и остаются в потоке — для них правила ниже. */
.alert-dismissible{
  position:fixed;top:18px;right:18px;z-index:200;width:min(420px, calc(100vw - 36px));
  margin:0;padding:15px 44px 15px 18px;border-radius:var(--r);border:1px solid var(--line);
  background:#fff;color:var(--ink);box-shadow:0 18px 44px rgba(14,14,16,.18);
  font-size:14.5px;line-height:1.45;animation:dalini-toast .28s var(--ease) both;
}
@keyframes dalini-toast{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:none}}
.alert-dismissible.alert-success{border-left:3px solid var(--green)}
.alert-dismissible.alert-danger{border-left:3px solid #C8102E}
.alert-dismissible.alert-info,
.alert-dismissible.alert-warning{border-left:3px solid var(--amber)}
.alert-dismissible .fa{margin-right:8px;color:var(--green)}
.alert-dismissible.alert-danger .fa{color:#C8102E}
.alert-dismissible .close{
  position:absolute;top:10px;right:10px;width:28px;height:28px;border:0;border-radius:50%;
  background:none;color:var(--muted);font-size:20px;line-height:1;opacity:1;text-shadow:none;cursor:pointer;
}
.alert-dismissible .close:hover{background:var(--surface);color:var(--ink)}

/* Сообщения в потоке страницы — карточкой, а не полосой во всю ширину. */
.alert:not(.alert-dismissible){
  border-radius:var(--r);border:1px solid var(--line);background:#fff;color:var(--ink);
  padding:14px 18px;font-size:14.5px;line-height:1.45;margin-bottom:18px;
}
.alert:not(.alert-dismissible).alert-success{border-left:3px solid var(--green)}
.alert:not(.alert-dismissible).alert-danger{border-left:3px solid #C8102E}
.alert:not(.alert-dismissible).alert-info{border-left:3px solid var(--amber)}

/* ---------- выпадающая корзина в шапке ---------- */
.hcart__drop{padding:0;border:1px solid var(--line);border-radius:var(--r);box-shadow:0 18px 44px rgba(14,14,16,.16);min-width:380px;overflow:hidden}
.hcart__drop > li{padding:0;list-style:none}
.hcart__drop .olist{padding:8px 16px;margin:0;max-height:320px;overflow:auto}

/* Позиции в выпадашке — дивы, а не li: common.js перезагружает список
   селектором 'ul li' и вытащил бы пункты вложенного списка наружу. */
.olist--sm .olist__i{display:flex;gap:12px;align-items:center;padding:12px 0;border-bottom:1px solid var(--line-2);font-size:13.5px}
.olist--sm .olist__i:last-child{border-bottom:0}
.olist--sm .olist__ph{width:48px;height:48px}
.olist--sm .olist__n a{font-weight:600;color:inherit}
.olist--sm .olist__n a:hover{color:var(--amber-d)}
.hcart__foot{padding:14px 16px 16px;border-top:1px solid var(--line-2);background:var(--surface)}
.hcart__actions{display:flex;gap:8px;margin-top:12px}
.hcart__actions .btn{flex:1}
.hcart__empty{padding:26px 16px;text-align:center;color:var(--muted);font-size:14px;margin:0}

/* Крестик у позиции — тихая кнопка, а не красный прямоугольник. */
.olist__x{width:26px;height:26px;flex:none;border:0;border-radius:50%;background:none;color:var(--muted);cursor:pointer;padding:0;display:grid;place-items:center;align-self:center}
.olist__x:hover{background:var(--surface);color:#C8102E}
.olist__x svg{width:15px;height:15px}

/* ---------- закладки ----------
   Отложенный товар: сердечко закрашено и не прячется до наведения —
   это состояние, а не кнопка, которую надо искать. */
.card__fav.on,
.pact.on{color:#E5486B;opacity:1;transform:none}
.card__fav.on svg,
.pact.on svg{fill:currentColor;stroke:currentColor}
.card__fav.on:hover,
.pact.on:hover{color:#C8102E}

/* Значок с числом у ссылки «Закладки» — такой же, как у корзины. */
#wishlist-total{position:relative}

/* ---------- стандартное оформление заказа ----------
   Резервный вариант: включается, если отключить Quick Checkout. Разметка
   гармошки от ядра — её переписывает собственный скрипт оформления, —
   поэтому вид задаём стилями: те же карточки, что и у шагов быстрого
   оформления. */
#checkout-checkout .panel-group{margin:0;display:flex;flex-direction:column;gap:16px}
#checkout-checkout .panel{border:1px solid var(--line);border-radius:var(--r);background:#fff;box-shadow:none;margin:0}
#checkout-checkout .panel-heading{padding:18px 20px;background:none;border:0;border-bottom:1px solid var(--line-2)}
#checkout-checkout .panel-title{font-size:18px;font-weight:700;letter-spacing:-.02em;color:var(--ink)}
#checkout-checkout .panel-title a{color:var(--ink);display:flex;align-items:center;gap:10px}
#checkout-checkout .panel-title a:hover{color:var(--amber-d)}
#checkout-checkout .panel-body{padding:20px;border:0}
#checkout-checkout .fgrid2 > *:not(.fld2){grid-column:1/-1}
#checkout-checkout .well{border:1px solid var(--line);border-radius:var(--r);background:var(--surface);padding:20px;box-shadow:none}
#checkout-checkout .well h2{font-size:17px;margin-bottom:10px}
#checkout-checkout .radio{margin:6px 0}
#checkout-checkout .radio label{display:inline-flex;align-items:center;gap:8px;font-weight:400;color:var(--ink-2)}

/* Кнопка перехода к следующему шагу и согласие рядом с ней. */
.costep__go{display:flex;align-items:center;justify-content:flex-end;gap:16px;flex-wrap:wrap;margin-top:20px}
.costep__go .agreebox{margin:0}

@media(max-width:760px){
  .costep__go{justify-content:stretch}
  .costep__go .btn{width:100%}
}

/* ---------- сравнение товаров ---------- */
.cmp{overflow-x:auto;border:1px solid var(--line);border-radius:var(--r);background:#fff;margin-bottom:88px}
.cmp__t{border-collapse:collapse;width:100%;min-width:640px}
.cmp__t th,
.cmp__t td{padding:14px 16px;border-bottom:1px solid var(--line-2);text-align:left;vertical-align:top;font-size:14px;color:var(--ink-2)}
.cmp__t th{width:180px;font-size:12.5px;font-weight:600;letter-spacing:.03em;color:var(--muted);background:var(--surface);position:sticky;left:0;z-index:1}
.cmp__head td{vertical-align:bottom}
.cmp__ph{display:block;aspect-ratio:1;max-width:150px;border:1px solid var(--line-2);border-radius:var(--r-s);overflow:hidden;background:#fff;margin-bottom:10px}
.cmp__ph img{width:100%;height:100%;object-fit:contain}
.cmp__n{display:block;font-size:15px;font-weight:600;letter-spacing:-.015em;line-height:1.35;color:var(--ink)}
.cmp__n:hover{color:var(--amber-d)}
.cmp__p{margin-top:8px;font-size:17px;font-weight:700;color:var(--ink)}
.cmp__p s{font-size:13px;font-weight:400;color:var(--muted);margin-left:6px}
.cmp__b{display:flex;align-items:center;gap:8px;margin-top:12px}
.cmp__x{width:34px;height:34px;flex:none;display:grid;place-items:center;border:1px solid var(--line);border-radius:var(--r-s);color:var(--muted)}
.cmp__x:hover{border-color:#C8102E;color:#C8102E}
.cmp__x svg{width:16px;height:16px}
.cmp__sm{font-size:13px;color:var(--muted);line-height:1.5}
.cmp__group th{background:var(--ink);color:#fff;font-size:13px;letter-spacing:.04em;position:static}

/* ---------- аналоги ----------
   Во вкладке аналогов вторая колонка — цена и остаток, ей нужна ширина
   по содержимому, иначе таблица растягивает её на половину строки. */
.tabpane[data-pane="anal"] .specs td:last-child{width:1%;white-space:nowrap}

/* ---------- область поиска в шапке ----------
   «Весь каталог» — янтарным, как кнопка поиска: это выбор, с которого
   начинается запрос, и на белом поле он терялся.

   Меняем только цвет фона, текста и стрелку: положение и повтор
   подложки заданы в theme.css отдельными свойствами и переживают
   эту правку. Стрелку перекрашиваем в тёмную — серая на янтарном
   почти не видна. */
.search select{
  background-color:var(--amber);
  color:var(--ink);
  font-weight:600;
  border-right-color:var(--amber);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' fill='none' stroke='%230E0E10' stroke-width='1.8'%3E%3Cpath d='M1 1l5 5 5-5'/%3E%3C/svg%3E");
}
.search select:hover{background-color:#ffc824}

/* ---------- ссылки под кнопками карточки ----------
   Сертификаты и доставка — справка, а не действие. Кнопками их делать
   нельзя: рядом с «Купить в один клик» и «Задать вопрос» получится
   четыре одинаковых прямоугольника и ни одного главного. Поэтому
   строка тихих ссылок, без рамок, в одну линию. */
.plinks{display:flex;flex-wrap:wrap;gap:8px 22px;margin-top:14px}
.plinks a{display:inline-flex;align-items:center;gap:8px;font-size:13.5px;color:var(--muted)}
.plinks a:hover{color:var(--ink)}
.plinks svg{width:16px;height:16px;flex:none;stroke:currentColor;fill:none}

/* ---------- «Есть аналоги: N» ----------
   Сколько того же изделия лежит на складе под другими обозначениями.

   Оформлено как продолжение строки наличия, а не как новый призыв:
   зелёный значок и та же мелкая гарнитура, что у остатка, — кнопки
   в карточке уже есть, и ещё одна яркая была бы лишней. Число выделено
   начертанием: остальное покупатель прочтёт один раз, а цифру ищет
   глазами каждый раз. */
.anchip{
  display:inline-flex;align-items:center;gap:7px;
  font-size:12px;font-weight:500;line-height:1.25;color:var(--ink-2);
  background:rgba(20,154,90,.07);border:1px solid rgba(20,154,90,.18);
  border-radius:8px;padding:6px 10px;
}
.anchip b{font-weight:700;color:var(--ink)}
.anchip svg{
  width:14px;height:14px;flex:none;
  fill:none;stroke:var(--green);stroke-width:1.9;
  stroke-linecap:round;stroke-linejoin:round;
}

/* В карточке товара это кнопка: открывает вкладку «Аналоги» и подводит
   её к глазам. Крупнее витринной — рядом ценник и кнопка покупки,
   мелкая пилюля там теряется. */
.anchip--act{
  margin-top:16px;font-size:13px;padding:8px 12px;
  cursor:pointer;transition:.18s var(--ease);
}
.anchip--act:hover{background:rgba(20,154,90,.13);border-color:rgba(20,154,90,.34)}

/* В витрине пилюля живёт в подвале карточки, рядом с ценой и остатком.
   В плитке подвал — строка, поэтому обёртке даём всю ширину и она
   переносит пилюлю под цену; в списке подвал уже колонка, и обёртка
   просто встаёт следующей строкой. Ширину держит пилюля, а не обёртка:
   растянутая на всю карточку плашка выглядела бы кнопкой. */
.card__foot{flex-wrap:wrap}
.card__an{flex:1 0 100%;margin-top:3px}
.is-list .card__an{flex:0 0 auto;margin-top:4px}
@media(max-width:620px){
  .is-list .card__an{flex:1 0 100%;margin-top:3px}
}

/* Во вкладке «Аналоги» название — ссылка целиком, вместе с моделью.
   Модель набрана тем же моноширинным, что и артикулы в каталоге:
   по ней сверяются с упаковкой, и цифры должны стоять ровно.

   Цвет ссылки поднимаем до основного, а подчёркивание показываем
   на наведении: без этого строка таблицы выглядит обычным текстом,
   и то, что каждое название ведёт в карточку, никак не прочитать. */
.tabpane[data-pane="anal"] .specs td:first-child a{color:var(--ink)}
.tabpane[data-pane="anal"] .specs td:first-child a b{
  font-family:'JetBrains Mono',monospace;font-weight:600;
}
.tabpane[data-pane="anal"] .specs td:first-child a:hover{
  text-decoration:underline;text-decoration-color:var(--amber);
  text-decoration-thickness:2px;text-underline-offset:3px;
}

/* ---------- пилюли под ценой ----------
   Зелёная — персональная скидка: «вам дешевле лично». Нейтральные —
   приглашение войти и условия «от N штук», одинаковые для всех.
   Двумя зелёными плашками подряд эта разница не читалась бы.

   Нейтральным нужен белый фон с рамкой, а не серый из макета: блок
   покупки сам стоит на сером, и серая плашка на нём пропадает —
   в макете эти состояния рядом не показывали. */
.pdisc--qty,
.pdisc--guest{background:#fff;border:1px solid var(--line);color:var(--ink-2)}
.pdisc--qty b{color:var(--ink)}

/* Условий объёма бывает несколько — держим их одной строкой с зазором,
   иначе пилюли слипаются и переносятся вразнобой. */
.pdiscs{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}
.pdiscs .pdisc{margin-top:0}

/* ---------- отступы внутри выпадающей корзины ----------
   Дефолтная тема правит любой div внутри выпадашки:

     #cart .dropdown-menu li > div { min-width:427px; padding:0 10px }

   Вес у этого правила выше нашего (идентификатор плюс класс против
   одного класса), поэтому оно стирало вертикальные отступы — и кнопки
   «Перейти в корзину» и «Оформить заказ» прилипали к нижнему краю.
   Отвечаем тем же весом, но только по нашим блокам.

   Ширину не трогаем: min-width из той же строки держит выпадашку
   шире наших 380px, и сузить её значило бы поменять вид, о котором
   никто не просил. */
#cart .hcart__drop li > .olist{padding:8px 16px}
#cart .hcart__drop li > .hcart__foot{padding:14px 16px 16px}
#cart .hcart__drop li > .hcart__empty{margin:0;padding:26px 16px}

/* Строка активных фильтров пуста, пока её не наполнит скрипт. Правило
   .chipset{display:flex} из макета сильнее браузерного [hidden], поэтому
   прячем явно — иначе пустая строка занимала бы отступ. */
.chipset[hidden]{display:none}

/* ---------- ожидание при фильтрации ----------
   Пока фильтр пересчитывает витрину, страница должна честно сказать,
   что занята: иначе после клика по значению секунду-другую ничего
   не происходит, и по значению кликают второй раз.

   Занавес светлый, а не тёмный: результаты за ним видно, и подмена
   содержимого не выглядит провалом в пустоту. Кольцо на белой таблетке —
   чтобы читалось и на снимках товаров, и на светлом фоне списка. */
.floader{
  position:fixed;inset:0;z-index:190;
  display:none;place-items:center;
  background:rgba(255,255,255,.55);backdrop-filter:blur(2px);
}
.floader.is-on{display:grid}
.floader__ring{
  width:56px;height:56px;border-radius:50%;
  background:#fff;box-shadow:0 12px 32px -14px rgba(14,14,16,.45);
  display:grid;place-items:center;
}
.floader__ring::after{
  content:'';width:26px;height:26px;border-radius:50%;
  border:3px solid var(--line-2);border-top-color:var(--amber);
  animation:floader-spin .7s linear infinite;
}
@keyframes floader-spin{to{transform:rotate(360deg)}}
/* Тем, кому анимация мешает, крутим медленно, но не гасим совсем:
   иначе непонятно, идёт работа или всё зависло. */
@media (prefers-reduced-motion:reduce){
  .floader__ring::after{animation-duration:2.4s}
}

/* ---------- отступ под формой уточнения запроса ----------
   В макете воздух под ней даёт обёртка следующего блока. У нас за формой
   идёт то панель сортировки, то пустая выдача, и обёртки нет ни у той,
   ни у другой — блок прилипал к форме. Проще задать отступ самой форме,
   чем помнить про него в двух местах. Величина из макета. */
.bigsearch{margin-bottom:34px}

/* ---------- сопутствующие товары ----------
   Шапка и сетка — общие с остальными витринами (.mod-products), свой
   только отступ снизу: блок обычно стоит последним на странице, и под
   корзиной за ним сразу подвал. Задаём его модулю, а не странице:
   повесить блок можно куда угодно, и везде он должен отделяться
   от того, что идёт следом. */
.mod-related{padding-bottom:88px}

/* ---------- строка корзины: производитель и размер ----------
   Тот же порядок, что в карточке витрины: марка мелкой строкой над
   названием, под ним размер и обозначение чипами. Размер выделен —
   по нему сверяются с тем, что стоит в узле. */
.citem__brand{font-size:11px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.citem__meta i.is-size{
  font-size:12.5px;font-weight:600;padding:3px 9px;
  color:var(--ink);background:#FFF6DC;border:1px solid #F3D77A;
}

/* ---------- быстрое оформление: поверх чужих стилей ----------
   Обе беды видны только на живой странице: расширение и тема
   по умолчанию подключают свои стили вместе с нашими.

   Звёздочка у обязательного поля рисовалась дважды. Одну ставим мы
   после подписи, вторую — правило div.required .control-label:before
   из стандартной темы: наш класс .fld2.required под него подошёл.
   Гасим чужую, свою оставляем — она в стиле макета.

   Серую рамку вокруг полей рисует .quickcheckout-content самого
   расширения. В макете поля стоят на белом, без коробки. */
.costep div.required .control-label::before{content:none}

/* Поля модуля размечены бутстрапом, и на живой странице их размер
   шрифта оказывался сильнее нашего .fld2 — подписи макета стояли над
   мелким чужим текстом. Задаём явно, в области шага: два класса плюс
   элемент перебивают любые чужие правила по .form-control. */
.costep .fld2 input,
.costep .fld2 select,
.costep .fld2 textarea{font-size:15px}
.costep .quickcheckout-content{border:0;padding:0;margin:0;overflow:visible}

/* ---------- нумерация шагов оформления ----------
   Номера считает CSS, а не разметка. Шаг с реквизитами появляется
   и пропадает по галочке, а шаг доставки — по составу заказа; держать
   номера в шаблоне значило бы пересчитывать их в двух местах и всё
   равно однажды разойтись. Скрытый шаг счётчик не трогает. */
.costeps{counter-reset:costep}
.costep__n{counter-increment:costep}
.costep__n::before{content:counter(costep)}

/* Переключатели в первом шаге: «регистрация или вход» и «физлицо или
   компания». Оба — .tabsw, вид берут оттуда.

   Раньше под #company-toggle была галочка внизу формы, и правило
   добавляло ей отступ с чертой сверху. Когда галочку сменил
   переключатель, это правило осталось и перебило .tabsw — id сильнее
   класса: над кнопками повисла лишняя черта, а активная кнопка
   выезжала из рамки. Поэтому здесь теперь только отступы. */
#account-mode{margin-bottom:22px}
#company-toggle{margin-bottom:22px}

/* ---------- значок и цена в карточке способа ----------
   Значок необязателен: у штатных расширений доставки и оплаты его нет,
   и карточка без него должна выглядеть ровно так же, как раньше. */
.rcard__ico{width:34px;height:34px;flex:none;display:grid;place-items:center;color:var(--ink-2)}
.rcard__ico svg{width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:1.7}
.rcard__ico img{max-width:34px;max-height:34px}
.rcard.on .rcard__ico{color:var(--amber-d)}

/* Выбранный способ оплаты на странице подтверждения. */
.cochosen{padding:14px 16px;border:1px solid var(--line);border-radius:var(--r-s);background:var(--surface);margin-bottom:18px}
.cochosen b{display:block;font-size:15px}
.cochosen span{display:block;margin-top:4px;font-size:13.5px;color:var(--muted);line-height:1.5}

/* ---------- состав заказа списком ----------
   .olist — это ul, и браузер даёт ему свой отступ слева: снимок товара
   в «Вашем заказе» съезжал от края. В выпадающей корзине отступ задан
   своим правилом, поэтому там это было не видно. */
.olist{margin:0;padding:0;list-style:none}

/* Согласия под полями покупателя: отделяем их чертой, как и галочку
   компании, — это уже не данные, а условия. */
#agree-slot:not(:empty){margin-top:18px}
#agree-slot .agreebox:first-child{margin-top:0}

/* Пустые контейнеры модуля: дополнительные поля и капча.

   Дополнительные поля лежат внутри сетки .fgrid2, и пустой блок там
   не безобиден — он всё равно занимает строку, а вместе с ней зазор
   в 16 пикселей. Отсюда и пустое место под формой, хотя показывать
   нечего.

   :empty не годится: внутри переводы строк из шаблона, и для CSS
   такой блок не пуст. Поэтому смотрим на детей-элементы — пробелы
   и переносы в :has() не считаются. */
#custom-field-payment:not(:has(*)),
#captcha-checkout:not(:has(*)){display:none}

/* Служебные поля модуля под формой покупателя. Когда все они скрыты —
   а при выключенном гостевом заказе так и есть, — блок не должен
   занимать ни пикселя: иначе под полями висит пустая полоса. */
.qc-flags{clear:both}
.qc-flags > label{display:inline-flex;align-items:center;gap:9px;margin:14px 0 0;font-size:14px;color:var(--ink-2)}
.qc-flags > label input{width:17px;height:17px;margin:0;accent-color:var(--amber)}

/* ---------- ссылка внутри согласия ----------
   Текст согласия приходит из языкового файла разметкой:
   «Я прочитал и согласен с <a class="agree"><b>Соглашение</b></a>».
   Жирное начертание там от разработчиков модуля — в макете ссылка
   в строке обычного веса, отличается только подчёркиванием. */
.agreebox a{display:inline;font-weight:inherit}
.agreebox a b{font-weight:inherit}

/* Оформление: подписка и согласие под паролем нового кабинета.
   Скрытые галочки модуль кладёт с классом .hide — если видимых
   подписей нет, строка не должна оставлять пустой отступ. */
.qc-reg-extra{margin-top:14px}
.qc-reg-extra:not(:has(label)){display:none}
.qc-reg-extra .agreebox:first-child{margin-top:0}

/* Оформление: карточка вошедшего покупателя вместо выбора адреса. */
.cobuyer{grid-column:1/-1;display:flex;align-items:flex-start;justify-content:space-between;gap:16px;flex-wrap:wrap;
  padding:16px 18px;border:1px solid var(--line);border-radius:var(--r-s);background:var(--surface)}
.cobuyer__main{min-width:0}
.cobuyer__main b{display:block;font-size:15px;font-weight:600;letter-spacing:-.015em}
.cobuyer__main span{display:block;margin-top:4px;font-size:13.5px;color:var(--ink-2);line-height:1.5;overflow-wrap:anywhere}
.cobuyer__out{font-size:13px;color:var(--muted);border-bottom:1px solid var(--line);white-space:nowrap}
.cobuyer__out:hover{color:var(--ink);border-bottom-color:var(--ink)}

/* Оформление: «Назад» под кнопкой подтверждения. */
.coback{display:inline-block;margin-top:14px;font-size:13px;color:var(--muted);border-bottom:1px solid var(--line)}
.coback:hover{color:var(--ink);border-bottom-color:var(--ink)}

/* Оформление: адрес под способом доставки. У .fgrid2 свой display:grid,
   он сильнее браузерного [hidden] — гасим явно. */
.coaddr{margin-top:22px}
.coaddr[hidden],.coaddr [hidden]{display:none}
/* Форма нового адреса у вошедшего клиента теперь из одних скрытых полей —
   пустая ячейка сетки не должна давать отступ. */
#payment-new:not(:has(.fld2)){display:none !important}

/* Оформление: выбор сохранённого адреса или нового под способом доставки.
   Обёртка .coaddr больше не сетка — отступы между видимыми частями. */
.coaddr > :not([hidden]) ~ :not([hidden]){margin-top:16px}
.coaddr__carrier{max-width:calc(50% - 8px)}
.coaddr__saved .costep__sub{margin-bottom:10px}
@media(max-width:620px){.coaddr__carrier{max-width:none}}

/* Шапка: вошедший клиент — «Фамилия И.» ссылкой в кабинет и «Выход». */
.topbar .tbuser{display:inline-flex;align-items:center;gap:6px;color:var(--ink)}
.topbar .tbuser b{font-weight:600;max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.topbar .tbuser svg{flex:none;color:var(--muted)}
.topbar .tblogout{color:var(--muted);border-bottom:1px solid var(--line)}
.topbar .tblogout:hover{color:var(--ink);border-bottom-color:var(--ink)}

/* Кабинет: таблицы и кнопки из макета внутри .acct__main. */
.acct__main .block__h a{font-size:13.5px;border-bottom:1px solid currentColor}
.acct__main .block__h .block__note{font-size:13.5px;opacity:.7}
.acct__main .tbl2 .tbl2__act{text-align:right;white-space:nowrap}
.acct__main .tbl2 .tbl2__act a,.acct__main .tbl2 .tbl2__act button.linklike{font-size:13.5px;border:0;border-bottom:1px solid currentColor;background:none;padding:0;color:inherit;cursor:pointer}
.acct__main .tbl2 .tbl2__act .is-done{color:var(--green);border-bottom-color:currentColor}
.acct__main .tbl2 td a.tbl2__name{color:inherit}
.acct__main .tbl2 td a.tbl2__name:hover{border-bottom:1px solid currentColor}
.acct__main .acard__mgr a{color:inherit}
.acct__main .block:last-child{margin-bottom:0}
/* forms.css растягивает любую .btn в кабинете до 46px, у маленькой кнопки из макета своя высота. */
.acct__main .btn.btn--sm{height:34px;padding:0 14px;font-size:13px}
.acct__main .btn.btn--amber{background:var(--amber);border-color:var(--amber);color:var(--ink)}
.acct__main .btn.btn--amber:hover{background:var(--amber-d);border-color:var(--amber-d)}
.acct__main .btn.btn--amber:disabled{opacity:.7;cursor:default}

/* Информационные страницы (например, «О компании»): тёмная полоса .stats
   вставлена сниппетом прямо в описание страницы и лежит внутри .page__body,
   то есть в ширине контента. Выпускаем её на всю ширину экрана тем же
   приёмом, что .stats--bleed на главной (см. выше про --sbw), — без правки
   разметки сниппета. Вертикальные отступы у секции свои, их не трогаем. */
.page__body .stats{
  margin-left:calc(50% - 50vw + var(--sbw, 0px) / 2);
  margin-right:calc(50% - 50vw + var(--sbw, 0px) / 2);
  padding-left:calc(50vw - 50% - var(--sbw, 0px) / 2);
  padding-right:calc(50vw - 50% - var(--sbw, 0px) / 2);
  border-radius:0;
}

/* Сниппеты страниц «О компании», «Доставка», «Оптовикам» взяты из макета
   вместе со встроенной сеткой: style="grid-template-columns:repeat(4,1fr)".
   Встроенный стиль сильнее мобильных правил темы, поэтому на телефоне
   карточки не складывались и распирали страницу вбок. Перебиваем его
   только на узких экранах. */
@media(max-width:980px){
  .cblocks[style*="grid-template-columns"],
  .cteam[style*="grid-template-columns"],
  .usp__grid[style*="grid-template-columns"]{grid-template-columns:repeat(2,1fr) !important}
}
@media(max-width:560px){
  .cblocks[style*="grid-template-columns"],
  .cteam[style*="grid-template-columns"],
  .usp__grid[style*="grid-template-columns"]{grid-template-columns:1fr !important}
}

/* Сертификаты (модуль «ДАЛИНИ · Сертификаты»): табы категорий, пометка «истёк». */
.mod-certs .sugg{padding-top:0;padding-bottom:26px}
.mod-certs .sugg a.on{background:var(--ink);border-color:var(--ink);color:#fff}
.mod-certs .cert[hidden]{display:none}
.cert__badge{display:inline-block;vertical-align:middle;margin-left:6px;padding:2px 8px;border-radius:99px;
  background:rgba(200,16,46,.09);color:#C8102E;font-size:11.5px;font-weight:600;letter-spacing:0;line-height:1.5}
.cert--expired .cert__ph{opacity:.55}
.cert--expired .cert__d dd{color:var(--muted)}

/* Страница «Контакты» (расширение «ДАЛИНИ · Контакты и сотрудники»). */
.contacts__main{display:flex;flex-direction:column;gap:20px;min-width:0}
.cmap--frame{display:block;place-items:initial}
.cmap--frame iframe{display:block;width:100%;height:100%;border:0}
.contacts__form .agreebox{margin-top:14px}
.contacts__team{padding-bottom:88px}
.cperson em a{color:inherit}
.cperson em a:hover{color:var(--ink)}
/* Сообщение формы: базовые цвета .formrow__msg подобраны под тёмную колонку
   блока заявки, здесь форма на белом. */
.contacts__form ~ .formrow__msg{margin-top:14px}
.contacts__form ~ .formrow__msg.is-ok{background:rgba(20,154,90,.10);color:var(--green)}
.contacts__form ~ .formrow__msg.is-error{background:rgba(200,16,46,.08);color:#C8102E}

/* Статичные страницы (information/information): основной текст чёрный.
   У .art__body в теме приглушённый --ink-2 — он для статей блога.
   Блоки из сниппетов со своими цветами (.lead, подписи карточек) не трогаем. */
.page__body.art__body{color:var(--ink)}

/* ---------- соцсети на главной ----------
   Тёмная полоса во всю ширину экрана, как «Далини в цифрах»: тот же приём
   с --sbw (см. выше). Внутри — плитки-ссылки на сообщества. */
.socs--bleed{
  margin-left:calc(50% - 50vw + var(--sbw, 0px) / 2);
  margin-right:calc(50% - 50vw + var(--sbw, 0px) / 2);
  padding-left:calc(50vw - 50% - var(--sbw, 0px) / 2);
  padding-right:calc(50vw - 50% - var(--sbw, 0px) / 2);
  padding-top:64px;padding-bottom:64px;border-radius:0;
}
.socbar{background:var(--ink);color:#fff}
.socbar .sechead{margin-bottom:28px}
.socbar .eyebrow{color:#8A8A93}
.socbar h2{color:#fff}
.socbar .lead{color:#A7A7A7;max-width:46ch}

.socgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}
@media(max-width:980px){.socgrid{grid-template-columns:1fr 1fr}}
@media(max-width:560px){.socgrid{grid-template-columns:1fr}}

.soccard{
  display:flex;flex-direction:column;min-height:100%;
  padding:22px;border:1px solid rgba(255,255,255,.14);border-radius:var(--r);
  background:rgba(255,255,255,.03);color:#fff;
  transition:background-color .24s var(--ease),border-color .24s var(--ease),transform .24s var(--ease);
}
.soccard:hover{background:rgba(255,255,255,.07);border-color:rgba(247,183,11,.55);transform:translateY(-2px)}
.soccard:focus-visible{outline:2px solid var(--amber);outline-offset:3px}

.soccard__ico{
  width:46px;height:46px;display:grid;place-items:center;margin-bottom:16px;
  border-radius:12px;background:rgba(255,255,255,.08);color:#fff;
  transition:background-color .24s var(--ease),color .24s var(--ease);
}
.soccard__ico b{font-size:13.5px;font-weight:700;letter-spacing:.04em}
.soccard__ico svg{width:23px;height:23px;fill:none;stroke:currentColor;stroke-width:1.6}
/* Треугольник «плей» — заливкой, а не обводкой: так он читается на 23 пикселях. */
.soccard__ico svg .socplay{fill:currentColor;stroke:none}
.soccard:hover .soccard__ico{background:var(--amber);color:var(--ink)}

.soccard__n{display:block;font-size:17px;font-weight:600;letter-spacing:-.02em}
.soccard__t{display:block;margin-top:7px;font-size:13.5px;line-height:1.55;color:#A7A7A7}
.soccard__go{
  display:inline-flex;align-items:center;gap:8px;margin-top:auto;padding-top:18px;
  font-size:13.5px;font-weight:600;color:var(--amber);
}
.soccard__go svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2;transition:transform .2s var(--ease)}
.soccard:hover .soccard__go svg{transform:translateX(4px)}
@media(max-width:820px){.socs--bleed{padding-top:44px;padding-bottom:44px}}
/* Заголовок и подпись — в строку, как в остальных секциях. .sechead
   переносит их, когда заголовку не хватает места; ограничиваем его
   колонку, чтобы подпись осталась справа. */
@media(min-width:981px){.socbar .sechead>div{max-width:52%}.socbar .lead{max-width:42ch;text-align:right}}
