/* ==========================================================================
   Hi-Black — фирменный магазин. Стили.

   1  Токены и база
   2  Элементы: кнопки, бейджи, чипы, поля, счётчик, звёзды
   3  Шапка: верхняя полоса, логотип, поиск, действия, меню категорий
   4  Мобильное меню
   5  Сетка страницы и боковая колонка
   6  Главная: слайдер, бренды, плитки, преимущества, о бренде
   7  Карточка товара в списке
   8  Каталог: фильтры, тулбар, пагинация
   9  Страница товара
   10 Корзина и оформление заказа
   11 Прочие страницы: сравнение, подбор, вход, текстовые
   12 Подвал
   13 Оверлеи: тост, лайтбокс, липкая панель покупки
   14 Адаптив: ≤1240 · ≤980 · ≤640 · ≤380
   ========================================================================== */

/* 1. Токены и база
   -------------------------------------------------------------------------- */
:root{
  --ink:#141414;--ink2:#33332f;--muted:#75746e;--muted2:#a3a29b;
  --line:#e7e6e1;--line2:#d6d5ce;--surface:#f6f5f1;--surface2:#eeede7;
  --yellow:#ffd200;--yellow2:#f0c400;--ytint:#fff4bf;
  --green:#1f8a4c;--gtint:#e3f3e9;--red:#d3403f;--rtint:#fbe7e6;
  --head:Manrope,"Golos Text",system-ui,-apple-system,"Segoe UI",Arial,sans-serif;
  --body:"Golos Text",system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;
  --shadow-card:0 14px 36px rgba(20,20,20,.09);
  --shadow-pop:0 18px 44px rgba(20,20,20,.07);
  --shadow-menu:0 30px 60px rgba(20,20,20,.14);
  /* Шапка в три полосы: служебная сверху тёмная, рабочая посередине
     светлее и заметнее, меню снизу снова тёмное. */
  --hdr:#171716;--hdr2:#0e0e0d;--hdr-mid:#26241f;--hdr-line:#3b362e;
  /* Поля по краям экрана. Одно значение на весь сайт: если менять его,
     то заодно и у блоков, которые «выезжают» за поля (.nav, .brands…). */
  --gut:32px;
}
*{box-sizing:border-box;margin:0;padding:0}
html{color-scheme:light;scroll-behavior:smooth;-webkit-text-size-adjust:100%}
body{background:#fff;color:var(--ink);font-family:var(--body);font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased;min-height:100vh}
a{color:inherit;text-decoration:none}
a:hover{color:#000}
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
button:focus-visible,a:focus-visible,select:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
input:focus-visible,textarea:focus-visible{outline:none}
img{max-width:100%;display:block}
svg.ic{flex:none}
[hidden]{display:none!important}
h1,h2,h3,h4{font-family:var(--head);font-weight:800;letter-spacing:-.015em;line-height:1.15;text-wrap:balance}
h1{font-size:36px}h2{font-size:28px}h3{font-size:20px}h4{font-size:16px}
.muted{color:var(--muted)}.small{font-size:14px}.xs{font-size:13px}
.wrap{max-width:1368px;margin:0 auto;padding-left:max(var(--gut),env(safe-area-inset-left,0px));padding-right:max(var(--gut),env(safe-area-inset-right,0px))}
.skip{position:absolute;left:-9999px;top:8px;z-index:300;background:var(--yellow);color:var(--ink);padding:10px 16px;border-radius:10px;font-weight:700}
.skip:focus{left:8px}
.noscroll{overflow:hidden}
.sec{margin-top:56px}
.sec-head{display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:24px;gap:12px 20px;flex-wrap:wrap}
.sec-head h2,.sec-head h3{min-width:0}
.sec-head a.more{display:inline-flex;align-items:center;gap:6px;font-weight:600;font-size:15px;white-space:nowrap;color:var(--ink2)}
.sec-head a.more:hover{color:var(--ink)}
.crumbs{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--muted);flex-wrap:wrap}
.crumbs a{color:var(--muted)}.crumbs a:hover{color:var(--ink)}
.crumbs svg{color:var(--muted2)}
.crumbs span{color:var(--ink)}
.lead{font-size:17px;color:var(--ink2);max-width:68ch;margin-top:14px;line-height:1.55}
/* Отметка о последнем обновлении цен: цены приходят из внешней системы,
   и покупателю важно видеть, насколько они свежие. */
.stamp{display:inline-flex;align-items:center;gap:8px;margin-top:18px;font-size:13px;color:var(--muted)}
.stamp svg{color:var(--muted2)}

/* 2. Элементы
   -------------------------------------------------------------------------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:10px;height:48px;padding:0 22px;border-radius:12px;font-family:var(--head);font-weight:700;font-size:15px;line-height:1;border:1px solid transparent;white-space:nowrap;color:var(--ink);cursor:pointer;transition:background .15s,border-color .15s,color .15s,transform .1s}
.btn:active{transform:translateY(1px)}
.btn-y{background:var(--yellow)}.btn-y:hover{background:var(--yellow2);color:var(--ink)}
.btn-k{background:var(--ink);color:#fff}.btn-k:hover{background:#000;color:#fff}
.btn-o{background:#fff;border-color:var(--line2)}.btn-o:hover{border-color:var(--ink);color:var(--ink)}
.btn-s{background:var(--surface)}.btn-s:hover{background:var(--surface2);color:var(--ink)}
.btn-sm{height:42px;padding:0 16px;font-size:14px;border-radius:10px}
/*
  «Уведомить о поступлении» — единственная кнопка витрины с длинной
  надписью, которая должна помещаться в карточку шириной в половину
  телефона. Базовый .btn запрещает перенос и держит фиксированную
  высоту: на 320–430 px текст вместе с иконкой вылезал за край карточки.

  Поэтому здесь перенос разрешён, высота растёт по содержимому, а
  иконка не отбирает ширину у текста. min-height сохраняет кнопку
  крупной для пальца даже в одну строку.
*/
.btn-alert{white-space:normal;height:auto;min-height:44px;padding:9px 12px;
  line-height:1.2;text-align:center;max-width:100%;overflow-wrap:anywhere}
.btn-alert svg{flex:none}
.btn-lg{height:56px;padding:0 28px;font-size:16px;border-radius:14px}
.btn-full{width:100%}
.btn.added{background:var(--gtint);color:var(--green)}
.ibtn{width:40px;height:40px;border-radius:10px;display:inline-flex;align-items:center;justify-content:center;background:#fff;border:1px solid var(--line);color:var(--ink2);transition:border-color .15s,color .15s}
.ibtn:hover{border-color:var(--ink);color:var(--ink)}
.ibtn.on{color:var(--red);border-color:var(--red)}
.ibtn.cmpb.on{color:var(--ink);border-color:var(--ink)}
.badge{display:inline-flex;align-items:center;height:24px;padding:0 9px;border-radius:7px;font-family:var(--head);font-weight:700;font-size:12px;line-height:1;letter-spacing:.02em;white-space:nowrap}
.badge-hit{background:var(--ink);color:var(--yellow)}
.badge-sale{background:var(--red);color:#fff}
.badge-new{background:var(--ytint);color:var(--ink)}
.chip{display:inline-flex;align-items:center;gap:8px;height:38px;padding:0 14px;border-radius:999px;border:1px solid var(--line2);background:#fff;font-size:14px;font-weight:500;white-space:nowrap;color:var(--ink);transition:border-color .15s,background .15s}
.chip:hover{border-color:var(--ink);color:var(--ink)}
.chip-on{background:var(--ytint);color:var(--ink);border-color:var(--yellow2);font-weight:700;box-shadow:inset 0 0 0 1px var(--yellow2)}
.chip-on:hover{border-color:var(--yellow2)}
.chip-y{background:var(--ytint);border-color:transparent}
.chip img{height:16px;width:auto}
.brands .chip{flex:0 0 auto}
.tags{display:flex;flex-wrap:wrap;gap:8px}
.avail{display:inline-flex;align-items:center;gap:7px;font-size:13px;color:var(--green);font-weight:500}
.avail i{width:8px;height:8px;border-radius:50%;background:var(--green);display:inline-block;flex:none}
.avail.out{color:var(--muted)}.avail.out i{background:var(--muted2)}
.price{font-family:var(--head);font-weight:800;font-size:22px;line-height:1;letter-spacing:-.02em;white-space:nowrap;font-variant-numeric:tabular-nums}
.price small{font-weight:500;font-size:14px;color:var(--muted);text-decoration:line-through;margin-left:8px;letter-spacing:0}
/* Процент скидки стоит там же, где зачёркнутая цена: только рядом с ней он
   что-то объясняет. Раньше он висел в строке с кодом товара и читался как
   часть артикула. */
.price .save{display:inline-block;margin-left:8px;padding:3px 7px;border-radius:6px;background:var(--rtint);color:var(--red);font-family:var(--head);font-weight:700;font-size:12px;letter-spacing:.02em;vertical-align:middle}
.saveline{display:flex;align-items:center;gap:8px;margin-top:-6px;font-size:13px;color:var(--red);font-weight:500}
.field{height:48px;border:1px solid var(--line2);border-radius:12px;background:#fff;display:flex;align-items:center;justify-content:space-between;padding:0 16px;font-size:15px;color:var(--muted);transition:border-color .15s}
.field:focus-within{border-color:var(--ink)}
.field input{border:0;outline:0;font:inherit;color:var(--ink);width:100%;background:transparent;min-width:0}
.check{position:relative;display:flex;align-items:center;gap:10px;font-size:14px;padding:6px 0;cursor:pointer;min-height:32px}
.check input{position:absolute;opacity:0;width:0;height:0}
.check i{width:20px;height:20px;border-radius:6px;border:1.5px solid var(--line2);display:inline-flex;align-items:center;justify-content:center;flex:none;background:#fff;color:var(--yellow)}
.check input:checked + i{background:var(--ink);border-color:var(--ink)}
.check input:focus-visible + i{outline:2px solid var(--ink);outline-offset:2px}
.check span.n{color:var(--muted2);margin-left:auto;font-size:13px}
.check.dis{opacity:.45}
.dot{width:12px;height:12px;border-radius:50%;display:inline-block;border:1px solid rgba(0,0,0,.15);flex:none}
.toggle{position:relative;display:flex;align-items:center;justify-content:space-between;font-size:14px;font-weight:500;padding:4px 0;cursor:pointer;min-height:36px}
.toggle input{position:absolute;opacity:0;width:0;height:0}
.toggle i{width:40px;height:24px;border-radius:12px;background:var(--line2);position:relative;display:inline-block;flex:none;transition:background .15s}
.toggle i::after{content:"";position:absolute;left:3px;top:3px;width:18px;height:18px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.2);transition:left .15s,background .15s}
.toggle input:checked + i{background:var(--ink)}
.toggle input:checked + i::after{left:19px;background:var(--yellow)}
.qty{display:inline-flex;align-items:center;height:48px;border:1px solid var(--line2);border-radius:12px;overflow:hidden;flex:none;background:#fff}
.qty button{width:46px;height:100%;display:flex;align-items:center;justify-content:center;color:var(--ink2)}
.qty button:hover{background:var(--surface)}
.qty span{width:44px;text-align:center;font-family:var(--head);font-weight:700;font-size:16px}
.stars{display:inline-flex;gap:1px;flex:none}
.stars .on{color:var(--yellow2);fill:var(--yellow)}
.stars .off{color:var(--line2)}
.blogo{height:18px;width:auto;display:inline-block}
.btext{font-family:var(--head);font-weight:800;font-size:13px;letter-spacing:.04em;text-transform:uppercase}
.sel{display:inline-flex;align-items:center;gap:8px;height:40px;padding:0 14px;border-radius:10px;border:1px solid var(--line2);font-size:14px;font-weight:500;background:#fff;cursor:pointer;white-space:nowrap}
/* Непопулярный порядок — не режим «по умолчанию»: подсвечиваем, чтобы было
   видно, что список отсортирован. */
.sel.picked{border-color:var(--ink);box-shadow:inset 0 0 0 1px var(--ink)}
.sel.picked svg{color:var(--ink)}
.sel select{appearance:none;-webkit-appearance:none;border:0;outline:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:var(--ink);cursor:pointer;padding-right:2px;min-width:0}
.sel .fn{font-style:normal;background:var(--yellow);border-radius:6px;padding:1px 6px;font-size:12px;font-family:var(--head);font-weight:700;margin-left:2px}
.empty{padding:48px 24px;text-align:center;border:1px dashed var(--line2);border-radius:20px;display:flex;flex-direction:column;align-items:center;gap:12px}
.empty p{color:var(--muted);max-width:520px}
.empty.big{margin:40px auto;max-width:720px;padding:56px 32px;border:1px solid var(--line);box-shadow:0 18px 44px rgba(20,20,20,.06)}
.empty .acts{display:flex;gap:10px;justify-content:center;flex-wrap:wrap;margin-top:8px}
.empty h1{font-size:32px}
.okmark{width:72px;height:72px;border-radius:50%;background:var(--yellow);display:flex;align-items:center;justify-content:center;margin-bottom:8px}

/* 3. Шапка
   -------------------------------------------------------------------------- */
/* Шапка тёмная: логотип и фирменный жёлтый читаются на ней заметно лучше,
   а витрина ниже остаётся светлой и не спорит с фотографиями товаров. */
.hdr{position:relative;z-index:30;background:var(--hdr);color:#fff}
.head{background:var(--hdr-mid);border-bottom:1px solid var(--hdr-line)}
.topbar{background:var(--hdr2);border-bottom:1px solid var(--hdr-line);font-size:15px;color:#bcbbb4}
.topbar .wrap{display:flex;align-items:center;justify-content:space-between;height:40px;gap:16px;overflow:hidden}
.topbar .l,.topbar .r{display:flex;gap:26px;align-items:center}
.topbar a{color:#a7a69f;white-space:nowrap}.topbar a:hover{color:#fff}
.topbar .l span{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.head .wrap{display:flex;align-items:center;gap:22px;height:104px}
.mobbtn,.mphone{display:none}
.logo{display:flex;flex-direction:column;align-items:flex-start;gap:5px;flex:none}
/* Знак Hi-Black чёрный на фирменной жёлтой плашке — как на официальном сайте.
   Плашка скошена под наклон самого знака; пропорции SVG не трогаем. */
.logo-plate{display:inline-flex;align-items:center;background:var(--yellow);padding:7px 16px 7px 13px;border-radius:4px;clip-path:polygon(9px 0,100% 0,calc(100% - 9px) 100%,0 100%)}
.logo-plate img{height:30px;width:auto;display:block}
.logo img{height:38px;width:auto}
.mm-head .logo-plate{padding:6px 14px 6px 11px}
.mm-head .logo-plate img{height:26px}
.logo-sub{font-size:13.5px;color:#b4b3ac;white-space:nowrap;font-weight:500;letter-spacing:.02em}
.search{flex:1 1 320px;min-width:210px;display:flex;height:54px;border:2px solid transparent;border-radius:14px;overflow:hidden;background:#fff;min-width:0;transition:box-shadow .15s}
.search:focus-within{box-shadow:0 0 0 4px rgba(255,210,0,.35)}
/* min-width:0 обязателен: без него поле не сжимается и уезжает под кнопку. */
.search input{flex:1 1 0;min-width:0;width:100%;border:0;outline:0;padding:0 20px;font:inherit;font-size:17px;color:var(--ink);background:transparent;text-overflow:ellipsis;-webkit-appearance:none;appearance:none}
.search input::placeholder{color:var(--muted)}
.search input::-webkit-search-cancel-button{-webkit-appearance:none}
.search .sbtn{width:132px;flex:none;background:var(--yellow);color:var(--ink);display:flex;align-items:center;justify-content:center;gap:8px;font-family:var(--head);font-weight:800;font-size:17px}
.search .sbtn:hover{background:var(--yellow2)}
.phone{display:flex;flex-direction:column;align-items:flex-start;flex:none}
.phone b{font-family:var(--head);font-weight:800;font-size:22px;letter-spacing:-.01em;display:flex;align-items:center;gap:8px;white-space:nowrap;color:#fff}
.phone b a{color:#fff}
.callback{margin-top:5px;padding:0;background:none;font:inherit;font-size:14px;color:#bcbbb4;border-bottom:1px dashed #7a786f;line-height:1.3;align-self:flex-start}
.callback:hover{color:#fff;border-bottom-color:#fff}
.hacts{display:flex;align-items:center;gap:4px;flex:none}
.hact{display:flex;flex-direction:column;align-items:center;gap:5px;width:76px;font-size:13px;color:#bcbbb4;position:relative;white-space:nowrap}
.hact:hover{color:#fff}
.hact svg{color:#e6e5df}
.hact .cnt{position:absolute;top:-7px;right:14px;min-width:18px;height:18px;border-radius:9px;background:var(--yellow);color:var(--ink);font-family:var(--head);font-weight:700;font-size:11px;line-height:18px;text-align:center;padding:0 5px}
.cartbtn{display:flex;align-items:center;justify-content:center;gap:8px;width:160px;min-width:160px;height:54px;padding:0 20px 0 16px;box-sizing:border-box;border-radius:14px;background:var(--yellow);color:var(--ink);margin-left:8px;white-space:nowrap;transition:background .15s}
.cartbtn:hover{background:var(--yellow2);color:var(--ink)}
.cartbtn .n{background:var(--ink);color:var(--yellow)}
/* Цены корзины можно вычислить только после загрузки каталога. До этого
   серверный «0 ₽» был виден и менял ширину шапки. Кнопка уже занимает свои
   окончательные 160px, а числа открываются атомарно после updateHeader(). */
.cartbtn:not(.cart-ready) .n,.cartbtn:not(.cart-ready) .sum{visibility:hidden}
/* Иконка и цифры крупнее, но коробка кнопки прежняя: рост иконки уводим в
   transform (в потоке она по-прежнему 22px), а лишние пиксели текста
   компенсируем зазором между элементами. */
.cartbtn svg{transform:scale(1.1)}
.cartbtn .n{background:var(--yellow);color:var(--ink);border-radius:7px;padding:3px 8px;font-family:var(--head);font-weight:800;font-size:15px;line-height:1.1}
.cartbtn .sum{font-family:var(--head);font-weight:800;font-size:18px}
.navbar{border-top:1px solid var(--hdr-line);border-bottom:0;position:relative;background:var(--hdr)}
.navbar .wrap{display:flex;align-items:center;gap:22px;height:64px}
/* Главный вход в каталог: надпись крупнее и жирнее, но коробка кнопки та же —
   прибавку в ширине забирают внутренние промежутки, а не padding. */
.catbtn{display:inline-flex;align-items:center;gap:8.5px;height:46px;padding:0 20px 0 18px;border-radius:12px;background:var(--yellow);color:var(--ink);font-family:var(--head);font-weight:800;font-size:17px;letter-spacing:-.01em;white-space:nowrap;flex:none}
.catbtn:hover{background:var(--yellow2)}
/*
  Значок меню раньше был залит тем же жёлтым, что и фон, и «проявлялся» только
  на hover, когда фон темнел. Он чёрный и непрозрачный во всех состояниях.
*/
.catbtn svg.y{color:var(--ink);opacity:1;flex:none}
.catbtn:hover svg.y,.catbtn:focus svg.y,.catbtn:focus-visible svg.y,.catbtn:active svg.y,.catbtn.open svg.y{color:var(--ink);opacity:1}
.catbtn .txt{flex:1;min-width:0}
.catbtn .chev{transition:transform .2s;flex:none}
.catbtn.open .chev{transform:rotate(180deg)}
.catbtn:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
.nav{display:flex;gap:18px;flex:1;min-width:0;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch}
.nav::-webkit-scrollbar{display:none}
.nav a{font-weight:500;font-size:16.5px;white-space:nowrap;padding:8px 0;color:#eceae4}
.nav a:hover{color:#fff}
.nav a.on{font-weight:700;color:var(--yellow)}
.nav .mob-only{display:none}
.navr{display:flex;gap:10px;align-items:center;flex:none}
.navr a{display:inline-flex;align-items:center;gap:8px;font-weight:600;font-size:15px;height:40px;padding:0 15px;border-radius:10px;white-space:nowrap}
.navr a{color:#e6e5df}
.navr a.y{background:rgba(255,210,0,.16);color:var(--yellow)}.navr a.y:hover{background:var(--yellow);color:var(--ink)}
.navr a.r{color:#ff8f8e}.navr a.r:hover{background:rgba(211,64,63,.2);color:#ff8f8e}
/*
  Большое меню каталога. Фон — фотография светлого офиса: техника справа,
  слева свободное место под категории. Поверх фотографии лежит белый градиент,
  иначе текст на светлом снимке теряется. Никакой рисованной графики и точек
  здесь нет — они возвращались при каждой пересборке и мешали.
*/
.catmenu{display:none;position:absolute;left:0;right:0;top:100%;color:var(--ink);border-bottom:1px solid var(--line);box-shadow:var(--shadow-menu);z-index:40;background:#fff url(../img/catalog-menu-light.webp) right center/cover no-repeat}
.catmenu.open{display:block}
.catmenu::before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,rgba(255,255,255,.97) 0%,rgba(255,255,255,.95) 40%,rgba(255,255,255,.88) 62%,rgba(255,255,255,.78) 100%)}
.catmenu .wrap{position:relative;display:grid;grid-template-columns:390px minmax(0,1fr);gap:0;align-items:stretch;height:auto;max-height:calc(100vh - 210px);overflow:auto;overscroll-behavior:contain}
.catmenu .cats{border-right:1px solid var(--line);padding:22px 28px 22px 0;display:flex;flex-direction:column;gap:2px}
.catmenu .cats a{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:15px 18px;border-radius:14px;font-weight:600;font-size:19px;transition:background .15s,color .15s}
.catmenu .cats a svg{color:var(--muted2);flex:none;width:20px;height:20px;transition:transform .15s,color .15s}
.catmenu .cats a:hover{background:var(--yellow);color:var(--ink)}
.catmenu .cats a:hover svg{color:var(--ink);transform:translateX(3px)}
.catmenu .cats a.on{background:var(--ink);color:#fff}
.catmenu .cats a.on svg{color:var(--yellow)}
.catmenu .cats a.sale{justify-content:flex-start;gap:10px;color:var(--red);margin-top:10px}
.catmenu .cats a.sale svg{color:var(--red)}
.catmenu .cats a.sale:hover{background:var(--rtint);color:var(--red)}
.catmenu .brands{padding:26px 0 30px 40px;min-width:0}
.catmenu .brands h4{font-size:16px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink2);margin-bottom:18px;font-weight:700}
.bgrid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}
.bgrid a{display:flex;align-items:center;gap:14px;height:72px;padding:0 18px;border:1px solid var(--line);border-radius:14px;font-size:16px;font-weight:500;background:rgba(255,255,255,.86);transition:border-color .15s,background .15s,box-shadow .15s}
.bgrid a:hover{border-color:var(--ink);background:#fff;box-shadow:var(--shadow-card)}
.bgrid a img{height:26px;width:auto;max-width:88px}
.bgrid a .btext{font-size:14px}

/* 4. Мобильное меню
   -------------------------------------------------------------------------- */
.mobmenu{position:fixed;inset:0;z-index:120;visibility:hidden;transition:visibility 0s .3s}
.mobmenu.open{visibility:visible;transition-delay:0s}
.mm-bd{position:absolute;inset:0;background:rgba(20,20,20,.5);opacity:0;transition:opacity .25s}
.mobmenu.open .mm-bd{opacity:1}
.mm-panel{position:absolute;left:0;top:0;bottom:0;width:min(360px,88vw);background:#fff;overflow-y:auto;overscroll-behavior:contain;transform:translateX(-102%);transition:transform .3s cubic-bezier(.2,.7,.2,1);display:flex;flex-direction:column;padding-bottom:max(20px,env(safe-area-inset-bottom))}
.mobmenu.open .mm-panel{transform:none}
.mm-head{display:flex;align-items:center;justify-content:space-between;padding:12px 12px 12px 20px;border-bottom:1px solid var(--line);flex:none}
.mm-head .logo img{height:28px}
.mm-head .x{width:44px;height:44px;border-radius:12px;border:1px solid var(--line);display:inline-flex;align-items:center;justify-content:center}
.mm-sec{padding:10px 0 4px;border-bottom:1px solid var(--line)}
.mm-sec:last-of-type{border-bottom:0}
.mm-sec .stitle{padding:8px 20px 4px}
.mm-sec a{display:flex;align-items:center;gap:12px;padding:0 20px;font-size:16px;font-weight:500;min-height:48px}
.mm-sec a:active{background:var(--surface)}
.mm-sec a svg{color:var(--muted2);margin-left:auto}
.mm-sec a.sale{color:var(--red);font-weight:600}
.mm-sec a.y{background:var(--ytint);margin:6px 16px 8px;border-radius:12px;font-weight:700;padding:0 14px;font-family:var(--head)}
.mm-sec a.y svg{color:var(--ink);margin:0}
.mm-contact{margin:16px 16px 0;padding:16px;border-radius:14px;background:var(--surface);display:flex;flex-direction:column;gap:4px}
.mm-contact b{font-family:var(--head);font-size:19px;font-weight:800;letter-spacing:-.01em}
.mm-contact span{font-size:13px;color:var(--muted);line-height:1.4}
.mm-contact .btn{margin-top:12px;align-self:flex-start}

/* 5. Сетка страницы и боковая колонка
   -------------------------------------------------------------------------- */
.layout{display:grid;grid-template-columns:264px minmax(0,1fr);gap:40px;padding:28px 0 0}
.layout > .content{min-width:0}
.side{display:flex;flex-direction:column;gap:24px;min-width:0}
.sbox{border:1px solid var(--line);border-radius:16px;padding:8px 0 10px;background:#fff}
.stitle{font-family:var(--head);font-weight:700;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);padding:12px 20px 6px}
.slist{display:flex;flex-direction:column}
.slist a{display:flex;align-items:center;justify-content:space-between;padding:10px 20px;font-size:15px;font-weight:500;line-height:1.3}
.slist a:hover{background:var(--surface)}
.slist a.on{background:var(--surface);font-weight:700}
.slist a svg{color:var(--muted2)}
.scat-row{display:flex;align-items:stretch;min-width:0}
.scat-row.on{background:var(--surface);font-weight:700}
.scat-row>a{flex:1;min-width:0;background:transparent!important}
.scat-row>button,.scat-chev{width:46px;flex:0 0 46px;border:0;background:transparent;color:var(--muted2);display:flex;align-items:center;justify-content:center}
.scat-row>button{cursor:pointer;border-radius:10px}
.scat-row>button:hover{color:var(--ink);background:#fff}
.slist .sub{display:flex;flex-direction:column;padding:2px 0 6px}
.slist .sub[hidden]{display:none}
.slist .sub a{padding:7px 20px 7px 36px;font-size:14px;font-weight:400;color:var(--ink2);justify-content:flex-start;gap:10px}
.slist .sub a.on{font-weight:700;color:var(--ink);background:none}
.slist .sub a.all{color:var(--muted);font-weight:500}
.spromo{border-radius:16px;background:var(--ink);color:#fff;padding:22px 22px 24px;display:flex;flex-direction:column;gap:10px}
.spromo b{font-family:var(--head);font-weight:800;font-size:18px;letter-spacing:-.01em}
.spromo p{font-size:13px;color:#b9b8b2;line-height:1.45}
.spromo .btn{background:var(--yellow);align-self:flex-start;margin-top:6px}
.side-head{display:none}
.ph1{padding:24px 0 0}
.layout.cat{padding-top:32px}
.ph1 h1{margin-top:14px;display:flex;align-items:baseline;gap:14px;flex-wrap:wrap}
.ph1 h1 span{font-family:var(--body);font-weight:400;font-size:16px;color:var(--muted);letter-spacing:0}

/* 6. Главная
   -------------------------------------------------------------------------- */
/* Все слайды лежат в одной ячейке грида и все участвуют в расчёте размера:
   высота блока равна самому высокому слайду, ширина колонок одинаковая.
   Поэтому при смене слайда ничего не прыгает — ни на экране, ни на
   телефоне. Скрытые слайды убраны из вкладки и с озвучки через
   visibility, но остаются в потоке, иначе высота снова поедет. */
.hslider{position:relative;overflow:hidden;background:#161616;display:grid;min-height:600px;color:#fff}
.hslider .slide{grid-area:1/1;position:relative;min-width:0;padding-bottom:66px;opacity:0;visibility:hidden;transition:opacity .7s ease,visibility 0s linear .7s;pointer-events:none;display:flex;align-items:center;background:#161616 center/cover no-repeat}
.hslider .slide.on{opacity:1;visibility:visible;pointer-events:auto;transition:opacity .7s ease,visibility 0s}
.hslider .slide::before{content:"";position:absolute;inset:0}
/* Фотографии сняты под этот баннер: техника справа, левая половина тёмная и
   пустая. Поверх — только мягкая тень слева под текст, справа снимок остаётся
   в полную силу. Никакой декоративной графики поверх фото нет. */
.hslider .s1{background-image:url(../img/banners/slide-1.webp);background-position:right center;color:#fff}
.hslider .s2{background-image:url(../img/banners/slide-2.webp);background-position:right center}
.hslider .s3{background-image:url(../img/banners/slide-3.webp);background-position:right center}
.hslider .slide::before{background:linear-gradient(90deg,rgba(11,11,10,.94) 0%,rgba(11,11,10,.86) 30%,rgba(11,11,10,.6) 48%,rgba(11,11,10,.18) 66%,rgba(11,11,10,0) 80%)}
/* Правая колонка пустая: там на фотографии стоит техника, текст в неё не лезет. */
.hslider .wrap{position:relative;width:100%;display:grid;grid-template-columns:minmax(0,1fr) 46%;gap:40px;align-items:center}
.hslider .stext{max-width:660px;padding:40px 0;min-width:0}
/* Логотип живёт в шапке и виден на любой странице, поэтому на слайдах он не
   повторяется: два знака подряд читаются как ошибка вёрстки. */
.hslider .slogo{display:none}
.hslider .eyebrow{display:inline-flex;align-items:center;gap:10px;font-family:var(--head);font-weight:700;font-size:12px;letter-spacing:.12em;text-transform:uppercase}
.hslider .eyebrow i{width:22px;height:2px;background:var(--yellow2);display:inline-block}
.hslider .s2 .eyebrow,.hslider .s3 .eyebrow{color:var(--yellow)}
.hslider h1,.hslider h2{font-size:44px;margin:16px 0 14px;line-height:1.1}
.hslider h1 em,.hslider h2 em{font-style:normal}
.hslider .s1 h1 em{color:var(--yellow)}
.hslider .s2 h2 em,.hslider .s3 h2 em{color:var(--yellow)}
.hslider p{font-size:17px;max-width:540px}
.hslider .s1 p{color:#c9c8c2}
.hslider .s2 p,.hslider .s3 p{color:#c9c8c2}
.hslider .hnote{margin-top:12px;font-size:13px;color:#a7a69f}
.hslider .hnote a{font-weight:600;color:var(--yellow)}
.hslider .sbtns{display:flex;gap:10px;margin-top:26px;flex-wrap:wrap}
.hslider .btn-w{background:transparent;border-color:rgba(255,255,255,.35);color:#fff}
.hslider .btn-w:hover{border-color:#fff;color:#fff}
.hslider .btn{text-decoration:none}
.hslider .sfeat{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:26px;max-width:560px}
.hslider .sfeat div{display:flex;gap:10px;align-items:flex-start;font-size:14px;color:#e6e5df;padding:12px 14px;border:1px solid rgba(255,255,255,.14);border-radius:12px;background:rgba(255,255,255,.04)}
.hslider .sfeat svg{color:var(--yellow);flex:none;margin-top:1px}
.hslider .sctrl{position:absolute;left:0;right:0;bottom:22px;pointer-events:none}
.hslider .sctrl .wrap{display:flex;align-items:center;justify-content:space-between;pointer-events:none}
.hslider .sdots{display:flex;gap:8px;pointer-events:auto}
.hslider .sdots button{width:34px;height:4px;border-radius:2px;background:rgba(128,128,128,.45);padding:0;position:relative}
.hslider .sdots button::before{content:"";position:absolute;inset:-12px 0}
.hslider .sdots button.on{background:var(--yellow)}
.hslider .sarr{display:flex;gap:8px;pointer-events:auto}
.hslider .sarr button{width:44px;height:44px;border-radius:12px;border:1px solid rgba(128,128,128,.4);display:flex;align-items:center;justify-content:center;color:inherit;background:rgba(255,255,255,.08);backdrop-filter:blur(6px)}
.hslider .sarr button:hover{background:rgba(255,255,255,.18)}
.hslider .s1 .sdots button{background:rgba(255,255,255,.28)}
.hslider .s1 .sdots button.on{background:var(--yellow)}
.hslider .sctrl{color:#fff}
.finder{margin-top:26px;display:flex;gap:8px;background:#fff;padding:8px;border-radius:16px;max-width:600px;box-shadow:0 14px 40px rgba(20,20,20,.12)}
.finder .finp{flex:1;height:50px;display:flex;align-items:center;padding:0 16px;border-radius:11px;background:var(--surface);min-width:0}
.finder .finp input{border:0;outline:0;background:transparent;font:inherit;font-size:15px;width:100%;color:var(--ink);min-width:0}
.finder .btn{height:50px;border-radius:11px}
select.fsel{appearance:none;-webkit-appearance:none;border:0;outline:0;font:inherit;font-size:15px;font-weight:500;color:var(--ink);background:var(--surface) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23141414' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") right 14px center/16px no-repeat;padding:0 40px 0 16px;height:50px;border-radius:11px;width:190px;cursor:pointer;flex:none}
.brandstrip{margin-top:20px;border:1px solid var(--line);border-radius:18px;padding:18px 24px;display:flex;align-items:center;gap:20px;flex-wrap:wrap}
.brandstrip .lbl{font-family:var(--head);font-weight:700;font-size:14px;white-space:nowrap;margin-right:8px}
.brandstrip .logos{display:flex;align-items:center;gap:8px;flex-wrap:wrap;flex:1;min-width:0}
.brandstrip .logos a{display:flex;align-items:center;justify-content:center;height:44px;padding:0 16px;border-radius:10px;border:1px solid transparent;flex:none}
.brandstrip .logos a:hover{border-color:var(--line2)}
.brandstrip .logos img{height:20px;width:auto;max-width:90px}
.tiles{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}
/*
  Снимки категорий приходят с разными пропорциями: тонер-картридж лежачий,
  струйный вертикальный, матричная лента — узкая полоска. Поэтому у каждой
  плитки одинаковая площадка под фото, а снимок вписывается в неё целиком:
  так три плитки читаются одним рядом, а не случайным набором.
  Площадка белая — у большинства снимков фон белый и сливается с ней.
*/
.tile{border:1px solid var(--line);border-radius:18px;background:var(--surface);display:flex;flex-direction:column;overflow:hidden;transition:border-color .15s,box-shadow .15s,transform .15s}
.tile:hover{border-color:var(--line2);box-shadow:var(--shadow-card);transform:translateY(-2px)}
.tile .ph{height:190px;flex:none;display:flex;align-items:center;justify-content:center;background:#fff;border-bottom:1px solid var(--line);padding:18px 22px}
.tile .ph img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain;transition:transform .25s}
.tile:hover .ph img{transform:scale(1.04)}
.tile .tt{display:flex;flex-direction:column;flex:1;min-width:0;padding:20px 22px 18px}
.tile h3{font-size:20px}
.tile p{font-size:14.5px;color:var(--muted);margin-top:7px;line-height:1.45}
.tile .cta{display:inline-flex;align-items:center;gap:7px;font-weight:600;font-size:14.5px;margin-top:auto;padding-top:16px}
.tile .cta svg{transition:transform .2s}
.tile:hover .cta svg{transform:translateX(3px)}
.tiles-s{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px;margin-top:20px}
.tile-s{border:1px solid var(--line);border-radius:16px;padding:14px 18px 14px 20px;display:flex;align-items:center;justify-content:space-between;gap:14px;background:#fff;min-height:96px;transition:border-color .15s,box-shadow .15s}
.tile-s:hover{border-color:var(--line2);box-shadow:var(--shadow-card)}
.tile-s > span:first-child{min-width:0}
.tile-s .ph{width:96px;height:72px;flex:none;display:flex;align-items:center;justify-content:center;overflow:hidden}
.tile-s .ph img{max-height:100%;max-width:100%;width:auto;height:auto;object-fit:contain;transition:transform .25s}
.tile-s:hover .ph img{transform:scale(1.05)}
.tile-s b{font-family:var(--head);font-weight:700;font-size:16px;display:block}
.tile-s span span{font-size:13px;color:var(--muted)}
.grid4{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:20px}
.grid3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}
.adv{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:20px}
.advi{display:flex;gap:14px;align-items:flex-start;padding:22px;border:1px solid var(--line);border-radius:16px;transition:border-color .15s}
.advi:hover{border-color:var(--ink)}
.advi .ico{width:46px;height:46px;border-radius:12px;background:var(--ytint);display:flex;align-items:center;justify-content:center;flex:none;color:var(--ink)}
.advi > div{min-width:0}
.advi b{display:block;font-family:var(--head);font-weight:700;font-size:15px;margin-bottom:4px;line-height:1.25;overflow-wrap:break-word}
.advi span{font-size:13px;color:var(--muted);line-height:1.45;overflow-wrap:break-word}
.about{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:40px;padding:40px;border-radius:22px;background:var(--surface)}
.about p{font-size:15px;color:var(--ink2);margin-top:14px;line-height:1.6}
.about .btn{margin-top:22px}
.lines{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.line-c{background:#fff;border-radius:14px;padding:16px 18px;border:1px solid var(--line);transition:border-color .15s}
a.line-c:hover{border-color:var(--ink)}
.line-c b{display:block;font-family:var(--head);font-weight:700;font-size:15px}
.line-c span{font-size:13px;color:var(--muted)}

/* 7. Карточка товара в списке
   -------------------------------------------------------------------------- */
.card{border:1px solid var(--line);border-radius:18px;background:#fff;display:flex;flex-direction:column;overflow:hidden;position:relative;transition:box-shadow .2s,border-color .2s;min-width:0}
.cmedia{position:relative;background:#fff;aspect-ratio:1/1;display:block;overflow:hidden;border-bottom:1px solid var(--line)}
.cmedia>img,.cmedia>.atimg{position:absolute;inset:0;margin:auto;width:76%;height:76%;object-fit:contain;transition:transform .25s}
/* Все поставщицкие снимки получают одинаковую внутреннюю рамку. У части
   файлов предмет обрезан точно по контуру, у части уже есть белые поля;
   единый предел не даёт банкам и флаконам внезапно занимать всю карточку. */
.cmedia .atimg{width:76%;height:76%}
.cbadges{position:absolute;left:14px;top:14px;display:flex;gap:6px;flex-wrap:wrap;max-width:calc(100% - 60px)}
.cbrand{position:absolute;left:14px;bottom:12px;display:inline-flex;align-items:center;height:28px;padding:0 10px;border-radius:8px;background:#fff;border:1px solid var(--line)}
.cbrand img{height:14px;width:auto;max-width:64px}
.cbrand .btext{font-size:11px}
.cacts{position:absolute;right:12px;top:12px;display:flex;flex-direction:column;gap:6px;z-index:2}
.cacts .ibtn{width:36px;height:36px;border-radius:9px;border-color:transparent;color:var(--muted);background:rgba(255,255,255,.9)}
.cacts .ibtn:hover{color:var(--ink);border-color:var(--line)}
.cacts .ibtn.on{color:var(--red);border-color:var(--red);background:#fff}
.cacts .ibtn.cmpb.on{color:var(--ink);border-color:var(--ink)}
.cbody{padding:16px 18px 10px;display:flex;flex-direction:column;gap:10px;flex:1;min-width:0}
.cside{padding:0 18px 18px;display:flex;flex-direction:column;gap:12px;min-width:0}
/*
  Название товара показывается целиком.

  Раньше здесь стоял -webkit-line-clamp: две строки в сетке, три на
  телефоне, — и «Тонер-картридж Hi-Black (HB-006R01160) для Xerox WC
  5325/5330/5335, 30K» обрывался на середине. Отличить такой товар от
  соседнего по видимой части было нельзя, а в выдаче по артикулу именно
  артикул и оказывался за обрезом.

  overflow-wrap: anywhere — про длинный артикул без пробелов
  (HB-EPS-RR-EP-DFX9000-BK-45m-ПУ). Он не влезает в колонку целиком, и
  без этого правила распирал бы карточку, утаскивая сетку за край
  экрана; с ним переносится по месту.
*/
.ctitle{font-weight:600;font-size:15px;line-height:1.35;overflow-wrap:anywhere}
.crate{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;min-width:0}
.crate a{color:var(--muted);font-weight:400;border-bottom:1px dashed var(--muted2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.crate a:hover{color:var(--ink)}
/*
  Свободная высота уходит СЮДА, а не в хвост карточки.

  Название теперь любой высоты, и в одном ряду сетки карточки
  выравниваются по самой длинной. Раньше запас копился после «В
  наличии», и строка наличия отрывалась от цены. margin-bottom:auto
  прижимает наличие к цене и кнопкам, а низ карточек в ряду остаётся на
  одной линии — ряд читается строкой, а не лесенкой.
*/
.cspecs{display:flex;flex-wrap:wrap;gap:4px 12px;font-size:13px;color:var(--muted);margin-bottom:auto}
.clist .cspecs{margin-bottom:0}
.cspecs b{color:var(--ink2);font-weight:500}
.cfoot{display:flex;flex-direction:column;align-items:stretch;gap:12px}
.cfoot .btn{width:100%;height:44px}
.oneclick{font-size:13px;color:var(--muted);border:0;border-bottom:1px dashed var(--muted2);line-height:1.3;background:none;padding:0;font-family:inherit;cursor:pointer}
.oneclick:hover{color:var(--ink)}
.oneclick:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
/* Нижний ряд карточки: покупка в один клик и заметная кнопка сравнения. */
.cbot{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
.cmp-b{display:inline-flex;align-items:center;gap:7px;height:34px;padding:0 12px;border:1px solid var(--line2);border-radius:9px;
  font:inherit;font-size:13px;font-weight:600;color:var(--ink2);background:#fff;cursor:pointer;white-space:nowrap;
  transition:border-color .15s,background .15s,color .15s}
.cmp-b svg{flex:none;color:var(--muted)}
.cmp-b:hover{border-color:var(--ink);color:var(--ink)}
.cmp-b:hover svg{color:var(--ink)}
.cmp-b:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
.cmp-b.on{background:var(--ink);border-color:var(--ink);color:#fff}
.cmp-b.on svg{color:var(--yellow)}

/*
  Список: одна карточка в строку — фото слева, название и характеристики по
  центру, цена и кнопки справа. Разметка карточки та же, меняется только сетка,
  поэтому в обоих видах одинаковые данные и одинаковые обработчики.
*/
.cards.clist{display:flex;flex-direction:column;gap:12px}
.clist .card{display:grid;grid-template-columns:200px minmax(0,1fr) 268px;align-items:stretch;border-radius:16px}
.clist .cmedia{aspect-ratio:auto;border-bottom:0;border-right:1px solid var(--line);padding:16px;min-height:180px}
.clist .cbadges{left:12px;top:12px;max-width:calc(100% - 24px)}
.clist .cbrand{left:12px;bottom:10px}
.clist .cacts{right:auto;left:12px;top:12px;flex-direction:row}
.clist .cbody{padding:20px 22px;gap:9px;justify-content:center}
.clist .ctitle{font-size:16px}
.clist .cspecs{gap:4px 16px}
.clist .cside{padding:20px 22px;border-left:1px solid var(--line);justify-content:center;gap:10px}
.clist .cbot{flex-direction:column;align-items:stretch;gap:8px}
.clist .cbot .oneclick{align-self:center}
.clist .cmp-b{justify-content:center;width:100%}
.clist .price{font-size:24px}
@media (hover:hover){
  .card:hover{box-shadow:var(--shadow-card);border-color:var(--line2)}
  .card:hover .cmedia img{transform:scale(1.04)}
}

/* 8. Каталог
   -------------------------------------------------------------------------- */
.brands{display:flex;gap:8px;margin-top:20px;flex-wrap:wrap}
.brand-select{height:44px;border:1px solid var(--line2);border-radius:10px;background:#fff;display:flex;align-items:center;padding:0 12px;gap:8px}
.brand-select select{appearance:none;-webkit-appearance:none;border:0;outline:0;background:transparent;color:var(--ink);font:inherit;font-size:14px;width:100%;min-width:0;cursor:pointer}
.brand-select svg{color:var(--muted2);flex:none}
.filters{display:flex;flex-direction:column;gap:6px}
.fgroup{border-bottom:1px solid var(--line);padding:16px 0 18px}
.fgroup:first-child{padding-top:0}
.fgroup .ft{display:flex;align-items:center;justify-content:space-between;font-family:var(--head);font-weight:700;font-size:15px;margin-bottom:10px}
.range{display:flex;gap:8px;align-items:center}
.range .field{flex:1;height:42px;padding:0 12px;font-size:14px;color:var(--ink);min-width:0}
.range .field span{color:var(--muted2);margin-right:6px}
.range .field input{width:100%;min-width:0;border:0;outline:0;font:inherit;font-size:14px;background:transparent;color:var(--ink);-moz-appearance:textfield}
.range .field input::-webkit-outer-spin-button,.range .field input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.fhint{font-size:12px;color:var(--muted2);margin-top:8px}
.fbtns{display:flex;flex-direction:column;gap:8px;padding-top:18px}
.toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px 16px;padding:0 0 18px;border-bottom:1px solid var(--line);margin-bottom:20px;flex-wrap:wrap}
.toolbar .l{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0}
.toolbar .r{display:flex;align-items:center;gap:12px}
.view{display:inline-flex;border:1px solid var(--line2);border-radius:10px;overflow:hidden;flex:none}
.view button{width:42px;height:42px;display:flex;align-items:center;justify-content:center;color:var(--muted);background:#fff;border:0;cursor:pointer;transition:background .15s,color .15s}
.view button + button{border-left:1px solid var(--line2)}
.view button:hover{color:var(--ink);background:var(--surface)}
.view button.on{background:var(--ink);color:#fff}
.view button.on:hover{background:var(--ink);color:#fff}
.view button:focus-visible{outline:2px solid var(--ink);outline-offset:-2px}
.mfilterbtn{display:none}
.applied{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:20px;align-items:center}
.applied .chip{height:32px;font-size:13px;gap:8px}
.applied .clear{font-size:13px;color:var(--muted);border-bottom:1px dashed var(--muted2);white-space:nowrap}
.pager{display:flex;align-items:center;justify-content:space-between;margin-top:32px;gap:16px;flex-wrap:wrap}
.pages{display:flex;gap:6px}
.pages a{width:44px;height:44px;border-radius:12px;border:1px solid var(--line2);display:flex;align-items:center;justify-content:center;font-family:var(--head);font-weight:700;font-size:15px}
.pages a:hover{border-color:var(--ink)}
.pages a.on{background:var(--ink);color:#fff;border-color:var(--ink)}
.pages span{width:44px;height:44px;display:flex;align-items:center;justify-content:center;color:var(--muted)}
.seo{margin-top:56px;padding:32px 36px;border-radius:20px;background:var(--surface)}
.seo h2{font-size:24px;line-height:1.25;margin:0 0 14px}
.seo h3{font-size:18px;line-height:1.35;margin:24px 0 8px}
.seo p{font-size:15px;color:var(--ink2);margin:0;line-height:1.7;max-width:980px}
.seo .seo-lead{font-size:16px;color:var(--ink);max-width:1040px}
.seo-section{max-width:1040px}

/* 9. Страница товара
   -------------------------------------------------------------------------- */
.pph{padding-bottom:0}
/*
  Шапка товара — полноширинная строка сетки над тремя колонками. Без max-width
  и без балансировки строк: заголовок должен использовать всю ширину контента,
  а не разбиваться на две короткие строки у левого края.
*/
.phead{grid-column:1/-1;min-width:0}
.phead h1{margin:0;font-size:clamp(24px,2.1vw + 12px,34px);line-height:1.16;text-wrap:pretty;overflow-wrap:break-word;max-width:none}
.pmeta{display:flex;align-items:center;gap:8px 18px;margin-top:12px;font-size:14px;color:var(--muted);flex-wrap:wrap;min-width:0}
.pmeta > span{min-width:0;overflow-wrap:anywhere}
.pmeta b{color:var(--ink);font-weight:600}
.pmeta .rate{display:inline-flex;align-items:center;gap:8px}
.pmeta .rate b{font-weight:700}
.pmeta .rate a{color:var(--muted);border-bottom:1px dashed var(--muted2)}
.pgrid{display:grid;grid-template-columns:520px minmax(0,1fr) 372px;gap:32px 32px;margin-top:16px;align-items:start}
.gallery{display:flex;flex-direction:column;gap:12px;min-width:0}
.gmain{position:relative;border:1px solid var(--line);border-radius:20px;background:#fff;height:600px;display:flex;align-items:center;justify-content:center;overflow:hidden;cursor:zoom-in;padding:18px}
.gmain img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain}
.gmain .zoom{position:absolute;right:16px;bottom:16px;display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 12px;border-radius:10px;background:#fff;border:1px solid var(--line);font-size:13px;color:var(--muted)}
.gmain .cbadges{left:16px;top:16px}
.gmain .gbrand{position:absolute;left:16px;bottom:16px;display:inline-flex;align-items:center;gap:8px;height:34px;padding:0 12px;border-radius:10px;background:#fff;border:1px solid var(--line);font-size:12px;color:var(--muted)}
.gmain .gbrand img{height:16px;width:auto}
.gmain .gcompat{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;padding:32px;text-align:center;background:var(--surface);cursor:default}
.gmain .gcompat img{height:34px;width:auto}
.gmain .gcompat h3{font-size:18px}
.gmain .gcompat .tags{display:flex;flex-wrap:wrap;justify-content:center;gap:6px;max-width:420px}
.gmain .gcompat .chip{height:32px;font-size:13px;padding:0 12px}
.thumbs{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px}
.thumb{position:relative;border:1px solid var(--line);border-radius:12px;background:#fff;aspect-ratio:1/1;display:flex;align-items:center;justify-content:center;overflow:hidden;padding:8px;cursor:pointer;min-width:0}
.thumb.on{border:2px solid var(--ink)}
.thumb img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain}
/* Миниатюра дополнительного кадра — такой же снимок, как основной. */
.thumb>img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain}
/* Крупный план: тот же файл, показанный вблизи. Не отдельная картинка —
   место на снимке, поэтому и в миниатюре, и на площадке это фон. */
.gzoom{position:absolute;inset:0;background-repeat:no-repeat;background-size:230%;cursor:zoom-in}
.thumb .tz{position:absolute;inset:0;background-repeat:no-repeat;background-size:230%}
.thumb.tcompat{flex-direction:column;gap:4px;font-size:11px;font-weight:600;color:var(--ink2);text-align:center}
.thumb.tcompat img{height:14px;width:auto}
.thumb.tcompat .tl{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pinfo{min-width:0}
.keyspecs h3{font-size:16px;margin-bottom:10px}
.krow{display:flex;justify-content:space-between;gap:16px;padding:10px 0;border-bottom:1px solid var(--line);font-size:14px}
.krow span{color:var(--muted);min-width:0}.krow b{font-weight:600;text-align:right;min-width:0;overflow-wrap:anywhere}
.compat{margin-top:22px}
.compat h3{font-size:16px;margin-bottom:10px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.compat h3 img{height:18px;width:auto}
.compat .tags{gap:6px}
.compat .chip{height:32px;font-size:13px;padding:0 12px}
/*
  Один и тот же раздел при любом наполнении.

  Блок совместимости есть у каждого товара и стоит на одном месте:
  перечень моделей, подтверждённое назначение или прямое «уточняйте по
  артикулу». Отличается содержимое, но не рамка и не заголовок — иначе
  покупатель снова решит, что у одного товара «что-то есть», а у
  соседнего «чего-то не хватает».
*/
.compat{margin-top:22px;padding:16px 18px;border:1px solid var(--line);border-radius:14px;background:var(--surface)}
.compat .cnote{margin-top:10px;font-size:13px;line-height:1.45;color:var(--muted)}
.compat .cnote a{color:var(--ink);border-bottom:1px solid var(--line2)}
.compat .cnote a:hover{border-color:var(--ink)}
.compat-note .cnote:first-of-type{margin-top:0}
.allspecs{display:inline-flex;align-items:center;gap:6px;font-weight:600;font-size:14px;margin-top:18px}
.buy{border:1px solid var(--line);border-radius:18px;padding:20px;display:flex;flex-direction:column;gap:13px;box-shadow:var(--shadow-pop);position:sticky;top:16px;background:#fff;min-width:0}
.buy .prow{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}
.buy .price{font-size:30px}
.buy .prow .per{font-size:13px;color:var(--muted)}
.buy .avail{font-size:13.5px}
.buy .stock{font-size:13px;color:var(--muted);margin-top:-8px}
.buy .brow{display:flex;gap:10px;align-items:center}
/* Итог по выбранному количеству — рядом со счётчиком, крупно и без скачков. */
.buy .qty button[disabled]{opacity:.35;cursor:default}
/* Крупнее и жирнее внутри прежней коробки: высота, ширина и отступы кнопок
   не меняются — растёт только начертание. */
.buy .btn-lg{flex:1;min-width:0;padding:0 16px;font-size:17px;font-weight:800;letter-spacing:-.01em}
.buy .btn-o.btn-full{font-size:16px;font-weight:800}
.buy .acts{display:flex;gap:8px}
.buy .acts button{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:7px;height:38px;border-radius:10px;border:1px solid var(--line);font-size:12.5px;font-weight:500;color:var(--ink2);min-width:0;white-space:nowrap}
.buy .acts button.on{border-color:var(--ink);background:var(--surface);color:var(--ink)}
.dlist{display:flex;flex-direction:column;gap:8px;padding-top:13px;border-top:1px solid var(--line)}
.dlist > div{display:flex;gap:10px;align-items:flex-start;font-size:13px}
.dlist svg{color:var(--ink2);margin-top:2px;flex:none}
.dlist b{font-weight:600;display:block;line-height:1.3}
.dlist span{color:var(--muted);font-size:12.5px;line-height:1.35}
.ask{display:flex;align-items:center;gap:11px;padding:12px 14px;border-radius:12px;background:var(--surface);font-size:13px}
.ask b{display:block;font-weight:600}
.ask span{color:var(--muted);font-size:12.5px}
/* Счёт для юрлиц вынесен отдельным блоком: для половины покупателей это
   решающее условие, и оно не должно теряться среди строк про доставку. */
.biz-note{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:12px;background:var(--ytint);font-size:14px;border:1px solid var(--yellow2)}
.biz-note svg{color:var(--ink);flex:none;margin-top:1px}
.biz-note b{display:block;font-weight:700;font-family:var(--head)}
.biz-note span{color:var(--ink2);font-size:13px;line-height:1.4}
.biz-note:hover{background:var(--yellow)}

/* Комплект по цветам: одна серия картриджей, которую берут целиком. */
/*
  Цвета серии — один блок под карточкой.

  Светлая цельная подложка отделяет набор от белой карточки, плитки внутри
  белые: так видно, что это самостоятельные товары, а не части одной
  карточки. У плитки две части: верх — ссылка на товар, низ — цена,
  статус и своя кнопка в корзину.
*/
.vars{margin-top:44px;border:1px solid var(--line);border-radius:20px;padding:24px;background:var(--surface)}
.vars-h h2{font-size:22px;letter-spacing:-.02em}
.vars-h p{font-size:14px;color:var(--muted);margin-top:6px;max-width:78ch}
.vars-l{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px;margin-top:18px}
.var{position:relative;display:flex;flex-direction:column;background:#fff;border:1px solid var(--line);
  border-radius:14px;padding:14px;transition:border-color .15s,box-shadow .15s}
.var:hover{border-color:var(--ink2)}
/* Текущий цвет отмечен рамкой и подложкой: одной рамки мало тем, кто
   плохо различает оттенки границ. */
.var.on{border-color:var(--yellow2);background:#fffdf3;box-shadow:inset 0 0 0 1px var(--yellow2)}
.var.out{opacity:.82}
.var-here{position:absolute;top:10px;right:10px;font-size:10.5px;font-weight:700;letter-spacing:.03em;
  text-transform:uppercase;color:var(--ink2);background:var(--yellow,#ffd84d);border-radius:999px;padding:2px 8px}
.var-top{display:block;text-align:center}
.var-img{display:flex;align-items:center;justify-content:center;height:96px;margin-bottom:10px;overflow:hidden}
.var-img img{max-width:100%;max-height:96px;width:auto;height:auto;object-fit:contain}
.var-img .hb-imgfail::before{font-size:11px}
.var-c b{display:block;font-family:var(--head);font-weight:700;font-size:15px;line-height:1.25}
.var-c span{display:block;font-size:11.5px;color:var(--muted);margin-top:2px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.var-b{margin-top:auto;padding-top:12px;text-align:center}
.var-p{font-family:var(--head);font-weight:800;font-size:19px;letter-spacing:-.02em}
.var-s{font-size:12px;color:var(--green,#137333);display:flex;align-items:center;justify-content:center;gap:6px;margin:4px 0 10px}
.var-s i{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}
.var-s.out{color:var(--muted)}
.var-add{width:100%;justify-content:center;font-size:14px;padding:9px 12px}
.vars-note{display:flex;gap:8px;align-items:flex-start;margin-top:14px;font-size:13px;color:var(--ink2)}
.vars-note svg{color:var(--red);flex:none;margin-top:2px}
.vars-foot{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;
  margin-top:16px;padding-top:16px;border-top:1px solid var(--line)}
.vars-sum{display:flex;align-items:baseline;gap:10px;font-size:14px;color:var(--muted)}
.vars-sum b{font-family:var(--head);font-weight:800;font-size:24px;letter-spacing:-.02em;color:var(--ink)}
/* На телефоне четыре плитки в ряд не встают — две в ряд читаются лучше
   длинного списка, а фото остаётся достаточно крупным, чтобы отличить
   цвет по этикетке. */
@media (max-width:640px){
  .vars{padding:16px;border-radius:16px}
  .vars-l{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
  .var{padding:10px}
  .var-img{height:72px}
  .var-img img{max-height:72px}
  .var-c b{font-size:13.5px}
  .var-p{font-size:17px}
  .vars-foot{flex-direction:column;align-items:stretch}
  .vars-foot .btn{justify-content:center}
}

.tabs{display:flex;gap:4px;border-bottom:1px solid var(--line);margin-top:56px;overflow-x:auto;scrollbar-width:none}
.tabs::-webkit-scrollbar{display:none}
.tabs button{padding:14px 20px;font-family:var(--head);font-weight:700;font-size:16px;color:var(--muted);border-bottom:2px solid transparent;margin-bottom:-1px;display:inline-flex;gap:8px;align-items:center;white-space:nowrap;flex:none}
.tabs button.on{color:var(--ink);border-color:var(--ink)}
.tabs button i{font-style:normal;font-size:12px;background:var(--surface2);border-radius:6px;padding:2px 7px;color:var(--muted)}
.tabbody{padding-top:32px}
.desc-grid{display:grid;grid-template-columns:minmax(0,1fr) 420px;gap:48px;align-items:start}
.desc-grid>.spec-t{align-self:start}
.desc h3{font-size:22px;margin-bottom:14px}
.desc p{font-size:16px;line-height:1.65;color:var(--ink2);margin-bottom:14px;max-width:760px;overflow-wrap:anywhere}
.desc ul{margin:0 0 14px 20px;color:var(--ink2);line-height:1.65}
.desc a{text-decoration:underline}
.desc a.btn,.desc a.chip,.desc a.cmpt-i{text-decoration:none}
.spec-t{border:1px solid var(--line);border-radius:16px;overflow:hidden}
.spec-t .sh{padding:16px 20px;font-family:var(--head);font-weight:800;font-size:16px;border-bottom:1px solid var(--line);background:var(--surface)}
.spec-t .sr{display:flex;justify-content:space-between;gap:16px;padding:11px 20px;font-size:14px;border-bottom:1px solid var(--line)}
.spec-t .sr:last-child{border:0}
.spec-t .sr span{color:var(--muted)}.spec-t .sr b{font-weight:600;text-align:right;min-width:0;overflow-wrap:anywhere}
.spec-full{max-width:820px}
.spec-full .sr{padding:13px 20px;font-size:15px}
.rev-grid{display:grid;grid-template-columns:320px minmax(0,1fr);gap:40px;align-items:start}
.rev-sum{border:1px solid var(--line);border-radius:20px;padding:24px;position:sticky;top:16px}
.rev-sum .big{display:flex;align-items:baseline;gap:10px}
.rev-sum .big b{font-family:var(--head);font-weight:800;font-size:44px;letter-spacing:-.03em;line-height:1}
.rev-sum .big span{color:var(--muted);font-size:14px}
.rev-sum .stars{margin:10px 0 4px}
.rev-sum .stars svg{width:20px;height:20px}
.rev-sum .cnt{font-size:14px;color:var(--muted)}
.bars{display:flex;flex-direction:column;gap:8px;margin:18px 0 20px}
.bars div{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--muted)}
.bars div span:first-child{width:14px;text-align:right;color:var(--ink);font-weight:600}
.bars i{flex:1;height:6px;border-radius:3px;background:var(--surface2);position:relative;overflow:hidden}
.bars i::after{content:"";position:absolute;left:0;top:0;bottom:0;width:var(--w);background:var(--yellow)}
.bars div span:last-child{width:22px}
.rev-sum .note{font-size:12px;color:var(--muted2);margin-top:12px;line-height:1.4}
.rev-list{display:flex;flex-direction:column;gap:16px;min-width:0}
.rev{border:1px solid var(--line);border-radius:18px;padding:22px 24px}
.rev .rh{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.rev .who{display:flex;align-items:center;gap:12px;min-width:0}
.rev .ava{width:40px;height:40px;border-radius:50%;background:var(--surface2);display:flex;align-items:center;justify-content:center;font-family:var(--head);font-weight:800;font-size:15px;color:var(--ink2);flex:none}
.rev .who b{display:block;font-weight:600;font-size:15px}
.rev .who span{font-size:13px;color:var(--muted)}
.rev .who .ver{display:inline-flex;align-items:center;gap:4px;color:var(--green);font-weight:500}
.rev .date{font-size:13px;color:var(--muted)}
.rev .rt{margin-top:12px;display:flex;align-items:center;gap:8px;font-size:13px;flex-wrap:wrap}
.rev .rt span{color:var(--muted)}
.rev p{font-size:15px;line-height:1.6;color:var(--ink2);margin-top:8px}
.rev .pm{margin-top:12px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.rev .pm div{font-size:14px;line-height:1.5;color:var(--ink2)}
.rev .pm b{display:block;font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);margin-bottom:2px}
.rev .useful{margin-top:14px;display:flex;gap:8px;align-items:center;font-size:13px;color:var(--muted);flex-wrap:wrap}
.rev .useful button{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border-radius:8px;border:1px solid var(--line);font-size:13px}
.rev .useful button.on{border-color:var(--green);color:var(--green)}
.rev-list > .btn{align-self:center}
.rev-form{border:1px solid var(--line);border-radius:18px;padding:24px;background:var(--surface);margin-top:8px}
.rev-form h3{font-size:18px;margin-bottom:6px}
.rev-form p{font-size:14px;color:var(--muted);margin-bottom:16px}
.rev-form .row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-bottom:12px}
/*
  Поля формы отзыва — со своим классом, а не с общим .field.

  Общий .field из оформления заказа задаёт высоту 48 px и раскладку в
  строку: подпись с полем в него не помещаются, и «Модель принтера»
  наезжала на поле «Ваше имя». Подпись здесь постоянная, а не placeholder:
  placeholder исчезает с первым символом, и человек перестаёт понимать,
  что заполняет.
*/
.rev-form .rfield{display:block;margin-bottom:12px}
.rev-form .rfield-wide{width:100%}
.rev-form .row .rfield{margin-bottom:0}
.rev-form .flabel{display:block;font-size:12.5px;font-weight:600;color:var(--ink2);margin-bottom:5px}
.rev-form .flabel i{font-style:normal;font-weight:400;color:var(--muted)}
.rev-form .rfield input{width:100%;border:1px solid var(--line2);border-radius:12px;padding:12px 16px;
  font:inherit;font-size:15px;background:#fff;outline:0;display:block}
.rev-form .rfield input:focus{border-color:var(--ink)}
.rev-form .rfield input:user-invalid{border-color:var(--red,#c0392b)}
.rev-form .rfield textarea{margin:0}
.rev-form textarea{width:100%;min-height:110px;border:1px solid var(--line2);border-radius:12px;padding:12px 16px;font:inherit;font-size:15px;background:#fff;resize:vertical;outline:0}
.rev-form textarea:focus{border-color:var(--ink)}
.rev-form .frate{display:flex;align-items:center;gap:12px;margin-bottom:12px;font-size:14px}
.rev-form .frate .stars svg{width:24px;height:24px;cursor:pointer}
.rev-form .fbtn{display:flex;gap:12px;align-items:center;margin-top:14px;flex-wrap:wrap}
.rev-form .fbtn span{font-size:12px;color:var(--muted)}
/*
  Панель покупки на телефоне — приподнятая карточка, а не полоса во всю ширину:
  на белом содержимом карточки товара сплошная белая плашка с одной линией
  сверху просто сливалась. Светлая подложка отделяет её от тёмных блоков,
  рамка и тень по периметру — от светлых.
*/
.buybar{position:fixed;left:50%;bottom:calc(16px + env(safe-area-inset-bottom,0px));z-index:60;
  width:min(700px,calc(100vw - 32px));
  background:#fff;border:1px solid var(--line2);border-radius:15px;
  padding:10px 12px 10px 16px;display:flex;align-items:center;gap:14px;overflow:hidden;
  box-shadow:0 10px 30px rgba(20,20,20,.16),0 2px 8px rgba(20,20,20,.08);
  transform:translate(-50%,calc(100% + 40px));visibility:hidden;
  transition:transform .24s ease,visibility 0s .24s}
/* Панель закреплена, поэтому появление и уход не двигают содержимое страницы:
   уезжает только она сама, за нижнюю кромку окна. */
.buybar.show{transform:translate(-50%,0);visibility:visible;
  transition:transform .24s ease,visibility 0s}
@media (prefers-reduced-motion:reduce){.buybar{transition:none}.buybar.show{transition:none}}
/* Тонкий жёлтый акцент по верхней кромке — держит фирменный тон, но не кричит. */
.buybar::before{content:"";position:absolute;left:0;right:0;top:0;height:2px;
  background:linear-gradient(90deg,rgba(255,210,0,0) 0%,var(--yellow) 22%,var(--yellow) 78%,rgba(255,210,0,0) 100%)}
.buybar .bbinfo{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px}
.buybar .bbproduct{display:flex;align-items:baseline;gap:8px;min-width:0}
.buybar .bbname{font-size:14px;line-height:1.3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.buybar .bbcode{font-size:11px;color:var(--muted);white-space:nowrap;flex:none}
.buybar .bbterms{display:flex;align-items:center;flex-wrap:wrap;gap:4px 12px;font-size:12px;color:var(--ink2);line-height:1.3}
.buybar .bbterms b{font-size:14px;color:var(--ink)}
.buybar .avail{font-size:11px;white-space:nowrap}
.buybar .btn{height:46px;padding:0 18px;flex:none}
/* Сколько этого товара уже в корзине: счётчик шапки панель закрывает собой. */
.buybar .bin{flex:none;display:inline-flex;align-items:center;gap:4px;
  font-size:11.5px;font-weight:700;white-space:nowrap;font-style:normal;
  background:var(--ink);color:var(--yellow);border-radius:999px;padding:2px 8px}
.buybar .bin i{font-style:normal;font-weight:500}

/*
  Телефон: панель складывается в столбец.

  В одну строку помещались либо название, либо кнопка. Название
  обрезалось на середине слова, а «Уведомить о поступлении» упиралось в
  свою ширину — то есть покупатель видел ни товар, ни действие целиком.
  В столбце название получает всю ширину и две строки, артикул и
  наличие стоят под ним, а кнопка идёт во всю ширину: попасть по ней
  пальцем проще, чем по узкой кнопке у края.
*/
@media (max-width:430px){
  .buybar{flex-direction:column;align-items:stretch;gap:8px;padding:10px 12px}
  .buybar .bbinfo{gap:3px}
  .buybar .bbproduct{display:block}
  .buybar .bbname{font-size:12.5px;line-height:1.25;white-space:normal;display:-webkit-box;
    -webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  .buybar .bbcode{display:inline;margin-top:0;font-size:11px}
  .buybar .bbterms{gap:2px 10px;font-size:11.5px}
  .buybar .bbterms b{font-size:12.5px}
  .buybar .avail{font-size:11px}
  .buybar .bin i{display:none}
  .buybar .btn{width:100%;padding:0 12px;font-size:13px;min-width:0}
  .buybar .btn-alert{padding:8px 12px}
}
/* На самых узких экранах длинное название не укладывается в две строки:
   даём третью, чтобы артикул в начале названия не обрезался. */
@media (max-width:360px){
  .buybar .bbname{-webkit-line-clamp:3}
}

/* Плашка cookie и всплывающее уведомление встают над панелью, а не под ней:
   иначе нажатие «В корзину» прячет собственный ответ. */
body.pg-product.bar-on .cookie{bottom:calc(var(--buybar-h,74px) + 28px + env(safe-area-inset-bottom,0px))}
body.pg-product.bar-on .toast{bottom:calc(var(--buybar-h,74px) + 28px + env(safe-area-inset-bottom,0px))}

/* 10. Корзина и оформление
   -------------------------------------------------------------------------- */
.steps{display:flex;align-items:center;margin-top:24px;border:1px solid var(--line);border-radius:16px;overflow:hidden}
.step{flex:1;display:flex;align-items:center;gap:12px;padding:16px 22px;font-size:14px;color:var(--muted);border-right:1px solid var(--line);white-space:nowrap;min-width:0}
.step:last-child{border:0}
.step i{width:28px;height:28px;border-radius:50%;border:1.5px solid var(--line2);display:inline-flex;align-items:center;justify-content:center;font-family:var(--head);font-weight:700;font-size:13px;font-style:normal;flex:none}
.step.on{color:var(--ink);font-weight:600;background:var(--surface)}
.step.on i{background:var(--yellow);border-color:var(--yellow);color:var(--ink)}
.step.done{color:var(--green)}
.step.done i{background:var(--gtint);border-color:var(--gtint);color:var(--green)}
a.step:hover{background:var(--surface)}
.cgrid{display:grid;grid-template-columns:minmax(0,1fr) 400px;gap:32px;margin-top:28px;align-items:start}
.cgrid .summary{grid-column:2;grid-row:1/span 2}
.cgrid .addon-sec{grid-column:1;margin-top:8px}
.addon-sec h3{font-size:22px}
.clist{border:1px solid var(--line);border-radius:20px;overflow:hidden;min-width:0}
.chead{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--line);background:var(--surface);font-size:14px;gap:12px;flex-wrap:wrap}
.chead .r{display:flex;gap:20px;flex-wrap:wrap}
.chead .r a{color:var(--muted);display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.chead .r a:hover{color:var(--ink)}
.item{display:grid;grid-template-columns:112px minmax(0,1fr) auto 40px;gap:20px;align-items:center;padding:20px 24px;border-bottom:1px solid var(--line)}
.item:last-child{border:0}
.item .img{width:112px;height:112px;border-radius:14px;background:#fff;border:1px solid var(--line);display:flex;align-items:center;justify-content:center;overflow:hidden;padding:8px}
.item .img img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain}
.item .ibody{min-width:0}
.item .t{font-weight:600;font-size:15px;line-height:1.35;display:block}
.item .m{font-size:13px;color:var(--muted);margin-top:6px;display:flex;gap:6px 12px;flex-wrap:wrap;align-items:center}
.item .m span{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.item .m img{height:12px;width:auto}
.item .u{font-size:14px;color:var(--ink2);font-weight:600;margin-top:8px}
.ictl{display:flex;align-items:center;gap:24px}
.item .qty{height:44px}
.item .qty button{width:42px}
.item .sum{text-align:right;min-width:150px}
.item .sum .price{font-size:20px}
.item .sum small{display:block;font-size:12px;color:var(--muted);margin-top:4px}
/* Расчёт строки стоит над суммой, поэтому отступ ему нужен снизу. */
.item .sum .calc{margin:0 0 3px;font-size:12.5px;white-space:nowrap}
.item .sum .disc{color:var(--green);font-weight:600;margin:0 0 3px}
.item .sum del{display:block;color:var(--muted);font-size:12px}
.item .rm{width:40px;height:40px;border-radius:10px;display:inline-flex;align-items:center;justify-content:center;color:var(--muted2)}
.item .rm:hover{color:var(--red);background:var(--rtint)}
.cfootr{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;background:var(--surface);gap:16px 20px;flex-wrap:wrap}
.cfootr .back{display:inline-flex;align-items:center;gap:8px;font-weight:600;font-size:14px;white-space:nowrap}
.promo{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.promo .field{width:240px;height:46px}
.promo .btn{height:46px}
.cfootr .ok{display:inline-flex;align-items:center;gap:6px;color:var(--green);font-size:13px;font-weight:500}
.cfootr .err{color:var(--red);font-size:13px}
.summary{border:1px solid var(--line);border-radius:20px;padding:24px;display:flex;flex-direction:column;gap:14px;box-shadow:var(--shadow-pop);position:sticky;top:16px;background:#fff;min-width:0}
.summary h3{font-size:20px}
.srow{display:flex;justify-content:space-between;font-size:15px;gap:16px}
.srow span{color:var(--muted)}
.srow .soft{font-weight:500;color:var(--muted)}
.srow.total{border-top:1px solid var(--line);padding-top:16px;margin-top:4px;align-items:baseline}
.srow.total b{font-family:var(--head);font-weight:800;font-size:30px;letter-spacing:-.02em;white-space:nowrap}
.srow.total span{color:var(--ink);font-weight:600;font-size:16px}
.summary .note{font-size:12px;color:var(--muted);line-height:1.5}
.summary .note a{text-decoration:underline}
.summary .payrow{display:flex;gap:6px;flex-wrap:wrap}
.summary .payrow span{border:1px solid var(--line2);border-radius:6px;padding:4px 8px;font-family:var(--head);font-weight:700;font-size:11px;letter-spacing:.04em}
.biz{display:flex;gap:12px;align-items:flex-start;padding:16px;border-radius:14px;background:var(--surface);font-size:13px;color:var(--muted)}
.biz svg{flex:none;color:var(--ink)}
.biz b{display:block;color:var(--ink);font-weight:600;font-size:14px;margin-bottom:2px}
.addon{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}
.mini{border:1px solid var(--line);border-radius:16px;padding:14px;display:flex;gap:14px;align-items:center;min-width:0}
.mini .img{width:76px;height:76px;border-radius:12px;background:#fff;border:1px solid var(--line);display:flex;align-items:center;justify-content:center;flex:none;overflow:hidden;padding:6px}
.mini .img img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain}
.mini .mb{flex:1;min-width:0}
/* Рекомендации — те же товары, и название в них тоже целиком. */
.mini .t{font-size:13px;font-weight:500;line-height:1.35;overflow-wrap:anywhere}
.mini .p{display:flex;align-items:center;justify-content:space-between;margin-top:8px;gap:8px}
.mini .price{font-size:16px}
.mini .add{width:36px;height:36px;border-radius:9px;background:var(--yellow);display:inline-flex;align-items:center;justify-content:center;flex:none}
.mini .add:hover{background:var(--yellow2)}
.trust{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}
.co{display:flex;flex-direction:column;gap:20px;min-width:0}
.cobox{border:1px solid var(--line);border-radius:20px;padding:24px}
.cobox h3{font-size:18px;margin-bottom:16px}
.cobox .fld{margin-top:14px}
.cobox .note{margin-top:12px;font-size:12px;color:var(--muted)}
.segs{display:inline-flex;background:var(--surface);border-radius:12px;padding:4px;margin-bottom:16px;max-width:100%}
.seg{position:relative;padding:0 18px;height:40px;display:inline-flex;align-items:center;justify-content:center;border-radius:9px;font-size:14px;font-weight:600;cursor:pointer;color:var(--muted);white-space:nowrap}
.seg input{position:absolute;opacity:0;width:0;height:0}
.seg.on{background:#fff;color:var(--ink);box-shadow:0 2px 8px rgba(20,20,20,.08)}
.fld{display:flex;flex-direction:column;gap:6px;font-size:13px;color:var(--muted)}
.fld input{height:48px;border:1px solid var(--line2);border-radius:12px;padding:0 16px;font:inherit;font-size:15px;color:var(--ink);outline:0;background:#fff;width:100%;min-width:0}
.fld input:focus{border-color:var(--ink)}
.row2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-bottom:12px}
.row2 .fld{margin-top:0}
.opts{display:flex;flex-direction:column;gap:8px}
.opt{position:relative;display:flex;align-items:center;gap:14px;padding:14px 16px;border:1px solid var(--line2);border-radius:14px;cursor:pointer}
.opt input{position:absolute;opacity:0;width:0;height:0}
.opt.on{border-color:var(--ink);background:var(--surface)}
.opt .rd{width:20px;height:20px;border-radius:50%;border:2px solid var(--line2);flex:none;position:relative}
.opt.on .rd{border-color:var(--ink)}
.opt.on .rd::after{content:"";position:absolute;inset:4px;border-radius:50%;background:var(--ink)}
.opt .ot{flex:1;display:flex;flex-direction:column;min-width:0}
.opt .ot b{font-weight:600;font-size:15px}
.opt .ot span{font-size:13px;color:var(--muted)}
.opt .oc{font-family:var(--head);font-weight:700;font-size:15px;white-space:nowrap}
.pickup{display:flex;gap:12px;align-items:flex-start;margin-top:14px;padding:14px 16px;border-radius:12px;background:var(--surface);font-size:14px}
.pickup b{display:block;font-weight:600}.pickup span{color:var(--muted);font-size:13px}
.colist{display:flex;flex-direction:column;gap:10px;padding-bottom:12px;border-bottom:1px solid var(--line)}
.coi{display:grid;grid-template-columns:44px minmax(0,1fr) auto;gap:10px;align-items:center;font-size:13px}
.coi img{width:44px;height:44px;object-fit:contain;border:1px solid var(--line);border-radius:8px;padding:3px}
.coi span{display:block;line-height:1.3;overflow-wrap:anywhere}
.coi-title{min-width:0}
.coi-title small{display:block;margin-top:3px;color:var(--muted);font-size:11px}
.coi b{font-weight:600;white-space:nowrap}

/* 11. Прочие страницы
   -------------------------------------------------------------------------- */
.cmp-wrap{overflow-x:auto;margin-top:28px;-webkit-overflow-scrolling:touch}
table.cmp{border-collapse:separate;border-spacing:0;width:auto;min-width:min(100%,720px)}
table.cmp th:not(:first-child),table.cmp td:not(:first-child){min-width:220px;max-width:320px}
table.cmp th,table.cmp td{padding:14px 16px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top;font-size:14px}
table.cmp th{vertical-align:bottom;width:24%}
table.cmp th a{display:flex;flex-direction:column;gap:10px;font-weight:600;font-size:14px;line-height:1.35}
table.cmp th img{height:120px;width:100%;object-fit:contain;border:1px solid var(--line);border-radius:12px;padding:8px;background:#fff}
table.cmp th .btn{margin-top:10px;width:100%}
table.cmp .rmc{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--muted);margin-top:8px}
table.cmp td:first-child,table.cmp th:first-child{color:var(--muted);font-weight:500;width:180px;min-width:140px;position:sticky;left:0;background:#fff;z-index:1}
.finder-page{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(0,1fr);gap:32px;margin-top:28px;align-items:start}
.fp-box{border:1px solid var(--line);border-radius:20px;padding:32px;min-width:0}
.fp-box > p{color:var(--ink2);margin-bottom:18px;font-size:16px}
.fp-box .finder{margin-top:0;box-shadow:none;border:1px solid var(--line2);max-width:none}
.fp-box h3{margin-top:28px}
.fp-box .tags{margin-top:12px}
.fp-side{background:var(--surface);border-radius:20px;padding:28px}
.fp-side ol{margin:14px 0 14px 20px;line-height:1.6;color:var(--ink2)}
.fp-side li{margin-bottom:6px}
.fp-side p{color:var(--muted);font-size:14px;margin-bottom:16px}
.login{max-width:440px;margin:24px auto 0;border:1px solid var(--line);border-radius:20px;padding:32px;display:flex;flex-direction:column;gap:12px}
.login h1{font-size:26px}
.login form{display:flex;flex-direction:column;gap:12px;margin-top:8px}
.login .lrow{display:flex;justify-content:space-between;font-size:14px;gap:12px;flex-wrap:wrap}
.login .lrow a{text-decoration:underline}
.login.account{max-width:920px;min-height:300px}
.account-loading{padding:70px 20px;text-align:center;color:var(--muted)}
.account-switch{display:grid;grid-template-columns:1fr 1fr;padding:4px;border:1px solid var(--line);border-radius:13px;gap:4px}
.account-switch button{border:0;background:transparent;border-radius:9px;padding:11px;font:inherit;font-weight:700;cursor:pointer}
.account-switch button.on{background:var(--yellow)}
.account form[hidden]{display:none}
.account-link{border:0;background:none;text-decoration:underline;font:inherit;color:var(--muted);cursor:pointer;padding:4px}
.account-msg{border:1px solid #dfc675;background:#fff9df;border-radius:12px;padding:12px 14px;margin-bottom:4px}
.account-msg.ok{border-color:#abd7bd;background:#effaf3;color:#176b38}
.account-msg.bad{border-color:#e9b2b2;background:#fff1f1;color:#9b2222}
.account-head{display:flex;align-items:flex-start;justify-content:space-between;gap:20px}
.account-head h1{margin:0 0 4px}.account-head p{margin:0;color:var(--muted)}
.account-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:20px 0 28px}
.account-stats div{border:1px solid var(--line);border-radius:14px;padding:16px;display:flex;flex-direction:column;gap:4px}
.account-stats b{font-size:22px}.account-stats span{font-size:13px;color:var(--muted)}
.account-orders{display:grid;gap:14px}.account-order{border:1px solid var(--line);border-radius:14px;padding:18px}
.account-order header{display:flex;justify-content:space-between;gap:16px}.account-order header div{display:flex;gap:10px;align-items:baseline}.account-order header span{color:var(--muted);font-size:13px}
.account-status{display:inline-flex;margin:10px 0;padding:5px 9px;border-radius:999px;background:#eef8f1;color:#18783c;font-size:12px;font-weight:700}
.account-order ul{list-style:none;margin:0;padding:0;display:grid;gap:8px}.account-order li{display:flex;justify-content:space-between;gap:18px;font-size:14px}.account-order li span{white-space:nowrap;color:var(--muted)}
.account-empty{text-align:center;padding:36px 12px}.account-empty p{color:var(--muted)}
@media(max-width:640px){.account-stats{grid-template-columns:1fr}.account-head{align-items:stretch;flex-direction:column}.account-order header,.account-order li{align-items:flex-start;flex-direction:column;gap:4px}}
.page-text h3{font-size:20px;margin:22px 0 10px}
.page-text h3:first-child{margin-top:0}
.page-text ul{margin:0 0 14px 20px;line-height:1.65;color:var(--ink2)}
.page-text .lines{margin-top:20px}
.page-text .tags{margin-top:22px}
.page-text .cta{margin-top:22px}
.contacts{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:32px}
.map-ph{border:1px dashed var(--line2);border-radius:20px;min-height:280px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;color:var(--muted);background:var(--surface)}

/* Контакты: карточки телефона/почты/режима, магазин, форма обращения. */
.ccards{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;margin:22px 0 6px}
.ccard{border:1px solid var(--line);border-radius:18px;padding:20px;background:#fff;display:flex;flex-direction:column;gap:4px;min-width:0}
.ccard .cico{width:42px;height:42px;border-radius:12px;background:var(--ytint);color:var(--ink);display:flex;align-items:center;justify-content:center;margin-bottom:8px}
.ccard .ct{font-size:13px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;font-weight:600}
.ccard b{font-family:var(--head);font-weight:700;font-size:21px;letter-spacing:-.01em;line-height:1.25;word-break:break-word}
.ccard b a{color:var(--ink)}
.ccard b a:hover{color:var(--ink2)}
.ccard > span{font-size:14px;color:var(--muted);line-height:1.45}
.cshop{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);gap:24px;align-items:stretch}
.cshop > div:first-child{align-self:center}
.cshop .map-ph{min-height:210px;margin:0}
.cform{margin-top:6px;max-width:760px}
.cform .fld{margin-bottom:12px}
.cform textarea,.cform select{border:1px solid var(--line2);border-radius:12px;padding:12px 16px;font:inherit;font-size:15px;color:var(--ink);outline:0;background:#fff;width:100%;min-width:0;resize:vertical}
.cform select{height:48px;padding:0 16px}
.cform textarea:focus,.cform select:focus{border-color:var(--ink)}
.cform .agree{margin:14px 0 16px;max-width:640px}
.cform .agree-err{margin:-8px 0 14px}
.chelp{border:1px solid var(--line);border-radius:18px;padding:22px;background:var(--surface)}
.chelp p{margin:0 0 14px;color:var(--ink2)}
.chelp .acts{display:flex;gap:10px;flex-wrap:wrap}

/* Раскрытие полного списка характеристик — на месте, без обрезки. */
.spec-more{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;height:48px;border-top:1px solid var(--line);background:var(--surface);font:inherit;font-size:14px;font-weight:600;color:var(--ink);cursor:pointer}
.spec-more:hover{background:var(--line)}
.spec-more svg{transition:transform .2s}
.spec-more.on svg{transform:rotate(180deg)}

/* B2B-блок под характеристиками: горизонтальный, во всю ширину. */
/*
  Вкладка «Доставка и оплата». Список условий, а не сплошной абзац:
  покупатель ищет глазами свой способ доставки и его цену, и читать ради
  этого четыре предложения подряд ему незачем.
*/
/* Площадка фото у товара без снимка: не кнопка, курсор обычный, вместо
   «Открыть фото» — честная пометка о том, что снимка нет. */
.gmain.no-photo{cursor:default}
.gmain.no-photo .zoom{display:none}
.gnote{position:absolute;left:14px;bottom:14px;display:inline-flex;align-items:center;gap:6px;
  padding:5px 10px;border-radius:999px;background:rgba(255,255,255,.92);border:1px solid var(--line);
  font-size:12.5px;color:var(--muted);line-height:1.2;max-width:calc(100% - 28px)}
.gnote svg{flex:none;color:var(--muted2)}
@media (max-width:640px){.gnote{left:10px;bottom:10px;font-size:12px;padding:4px 9px}}
.dlv{display:flex;flex-direction:column;gap:22px;max-width:860px}
.dlv-b h3{display:flex;align-items:center;gap:9px;font-family:var(--head);font-weight:800;
  font-size:19px;letter-spacing:-.01em;margin:0 0 12px}
.dlv-b h3 svg{color:var(--ink2);flex:none}
.drows{display:flex;flex-direction:column;gap:2px;border:1px solid var(--line);border-radius:14px;
  background:var(--surface);overflow:hidden}
.drow{padding:13px 16px;background:#fff}
.drow + .drow{border-top:1px solid var(--line)}
/* Цена стоит в одной строке с названием и не уезжает под него: на телефоне
   ряд переносится целиком, а не рвётся посередине. */
.dr-t{display:flex;align-items:baseline;justify-content:space-between;gap:10px 14px;flex-wrap:wrap}
.dr-t b{font-weight:700;font-size:14.5px;line-height:1.3;min-width:0}
/* Цена доставки — пометка при названии, а не второй заголовок: на узком
   экране она переносится на свою строку, и жирным читалась как ещё один
   способ доставки. */
.dr-c{margin-left:auto;font-size:13px;font-weight:600;color:var(--ink2);white-space:nowrap;flex:none;
  background:var(--surface2,#f2f3f5);border-radius:999px;padding:2px 9px}
.dr-c.num{color:var(--ink);font-family:var(--head);font-weight:700;font-size:13.5px}
.dr-d{display:block;margin-top:4px;color:var(--muted);font-size:13px;line-height:1.45}
.dlv-n{margin:10px 2px 0;color:var(--muted);font-size:13px;line-height:1.5}
.dlv-n a{font-weight:600;color:var(--ink);border-bottom:1px solid var(--line2)}
.dlv-warr{display:flex;gap:9px;align-items:flex-start;margin-top:0}
.dlv-warr svg{color:var(--ink2);flex:none;margin-top:2px}
.dlv .b2b{margin-top:0}
@media (max-width:640px){
  .dlv{gap:18px}
  .dlv-b h3{font-size:17px;margin-bottom:10px}
  .drow{padding:12px 13px}
  .dr-t b,.dr-c{font-size:13.5px}
  .dlv .b2b{padding:18px 16px}
  .dlv .b2b-h h2{font-size:19px}
}
.b2b{margin-top:32px;border:1px solid var(--yellow2);border-radius:20px;background:var(--ytint);padding:26px 28px}
.b2b-h{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.b2b-h > svg{color:var(--ink);flex:none}
.b2b-h > div{flex:1;min-width:220px}
.b2b-h h2{font-size:23px;margin:0}
.b2b-h p{color:var(--ink2);font-size:15px;margin:4px 0 0}
.b2b-h .btn{flex:none}
.b2b-l{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;margin-top:20px;padding-top:20px;border-top:1px solid var(--yellow2)}
.b2b-l > div{display:flex;gap:12px;align-items:flex-start;min-width:0}
.b2b-l svg{color:var(--ink);flex:none;margin-top:2px}
.b2b-l b{display:block;font-weight:600;font-size:15px}
.b2b-l span{color:var(--ink2);font-size:13.5px;line-height:1.45}
/* Продолжение блока, а не четвёртая колонка: одна строка во всю ширину. */
.b2b-note{display:flex;align-items:flex-start;gap:12px;margin:16px 0 0;padding:14px 16px;border-radius:12px;
  background:rgba(255,255,255,.6);border:1px solid var(--yellow2);font-size:14px;line-height:1.5;color:var(--ink2)}
.b2b-note svg{flex:none;margin-top:2px;color:var(--ink)}
.b2b-note a{font-weight:600;color:var(--ink);text-decoration:underline;white-space:nowrap}

/* 12. Подвал
   -------------------------------------------------------------------------- */
/* Фотография офиса лежит фоном во всю ширину, поверх — тёмная заливка:
   ссылки и реквизиты читаются, но снимок остаётся виден. */
.foot{position:relative;color:#d8d7d1;margin-top:80px;padding:56px 0 32px;font-size:16px;background:#141312 url(../img/banners/footer-office.webp) center/cover no-repeat}
.foot::before{content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(12,12,11,.9) 0%,rgba(12,12,11,.82) 40%,rgba(12,12,11,.9) 100%)}
.foot .wrap{position:relative}
.fgrid{display:grid;grid-template-columns:1.5fr 1fr 1fr 1fr 1.3fr;gap:32px}
.foot h4{color:#fff;font-size:17px;margin-bottom:18px;letter-spacing:.06em;text-transform:uppercase;font-weight:700}
.foot a{color:#d2d1cb}
.foot a:hover{color:#fff}
.fcol a{display:block;padding:7px 0;font-size:17.5px;font-weight:500}
.fbrand .logo img{height:30px;filter:brightness(0) invert(1)}
.fbrand .logo-sub{color:#a9a8a1}
.fbrand p{font-size:17px;color:#b3b2ab;line-height:1.55;margin-top:14px;max-width:330px}
.fcontact{display:flex;flex-direction:column;gap:12px;font-size:17px}
.fcontact b{color:#fff;font-family:var(--head);font-size:28px;font-weight:700;letter-spacing:-.015em}
.fcontact b a{color:#fff}
.fcontact span{display:flex;gap:10px;align-items:flex-start;color:#d2d1cb}
.fcontact span svg{margin-top:3px}
.fcontact a[href^="mailto:"]{font-size:18px;font-weight:500}
.fbottom{border-top:1px solid #33322d;margin-top:44px;padding-top:24px;display:flex;justify-content:space-between;align-items:center;font-size:15px;color:#b6b5ae;gap:16px 24px;flex-wrap:wrap}
.fbottom .links{display:flex;gap:20px;flex-wrap:wrap}
.fbottom .links a{color:#b6b5ae;font-size:15px}
.fbottom .links a:hover{color:#fff}
.pay{display:flex;gap:8px;flex-wrap:wrap}
.pay span{border:1px solid #45443e;border-radius:6px;padding:5px 10px;font-family:var(--head);font-weight:700;font-size:12px;color:#eceae4;letter-spacing:.04em}
.foot .credit{font-size:12px;color:#8c8b85;margin-top:14px;line-height:1.55}

/* Таблица совместимости: список моделей принтеров по брендам. */
.cmpt{margin-top:26px}
.cmpt-top{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-bottom:16px}
.cmpt-f{flex:1;min-width:260px;display:flex;align-items:center;gap:10px;height:52px;padding:0 16px;border:1.5px solid var(--line2);border-radius:13px;background:#fff;color:var(--muted);transition:border-color .15s}
.cmpt-f:focus-within{border-color:var(--ink)}
.cmpt-f input{flex:1;min-width:0;border:0;outline:0;background:transparent;font:inherit;font-size:16px;color:var(--ink);-webkit-appearance:none;appearance:none}
.cmpt-f input::-webkit-search-cancel-button{-webkit-appearance:none}
.cmpt-jump{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:26px}
.cmpt-b+.cmpt-b{margin-top:28px}
.cmpt-h{display:flex;align-items:center;gap:12px;padding-bottom:10px;border-bottom:1px solid var(--line);scroll-margin-top:20px}
.cmpt-h h3{font-size:19px}
.cmpt-h span{color:var(--muted);font-size:14px;margin-left:auto;white-space:nowrap}
.cmpt-h img{max-width:96px;object-fit:contain}
.cmpt-g{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:8px;margin-top:14px}
.cmpt-i,.cmpt-i:hover{text-decoration:none}
.cmpt-i{display:flex;flex-direction:column;gap:3px;padding:11px 14px;border:1px solid var(--line);border-radius:11px;background:#fff;transition:border-color .15s,box-shadow .15s}
.cmpt-i:hover{border-color:var(--line2);box-shadow:var(--shadow-card)}
.cmpt-i b{font-weight:600;font-size:15px}
.cmpt-i span{font-size:13px;color:var(--muted)}

/* Переходы между страницами и смена цветового варианта.

   Прокрутка при этом остаётся мгновенной: глобальный smooth возвращать нельзя,
   он ломал переход к началу страницы. Анимируется только содержимое. */
.app{will-change:auto}
.nav-out{opacity:.25;transform:translateY(4px);transition:opacity .18s ease,transform .18s ease}
.nav-in{animation:navIn .26s cubic-bezier(.22,.7,.3,1) both}
@keyframes navIn{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
.swap-out{opacity:.3;transition:opacity .19s ease}
.swap-in{animation:swapIn .19s ease both}
@keyframes swapIn{from{opacity:.3}to{opacity:1}}

/* Тонкая жёлтая полоса под шапкой на время перехода. */
.navline{position:fixed;left:0;top:0;height:3px;width:0;background:var(--yellow);z-index:250;opacity:0;pointer-events:none}
.navline.on{opacity:1;width:82%;transition:width .42s cubic-bezier(.2,.8,.3,1),opacity .1s}
.navline.on.done{width:100%;opacity:0;transition:width .16s ease,opacity .22s ease .1s}

/* Выбранный цвет в комплекте виден сразу, ещё до отрисовки новой карточки. */
.var.picking{border-color:var(--yellow2);box-shadow:0 0 0 2px var(--ytint)}

@media (prefers-reduced-motion:reduce){
  .nav-out,.swap-out{opacity:1;transform:none;transition:none}
  .nav-in,.swap-in{animation:none}
  .navline{display:none}
}

/* Уведомление о cookie: узкая полоса внизу, не перекрывает липкую панель
   покупки и нижнюю навигацию — на телефоне она поднимается над ними. */
.cookie{position:fixed;left:50%;transform:translateX(-50%);z-index:105;
  bottom:calc(20px + env(safe-area-inset-bottom,0px));
  width:min(680px,calc(100vw - 32px));max-width:680px;
  display:flex;align-items:center;gap:14px 16px;flex-wrap:wrap;
  padding:16px 18px;border-radius:16px;
  background:rgba(20,20,19,.97);color:#e6e5df;border:1px solid #464036;
  box-shadow:0 18px 48px rgba(0,0,0,.34);backdrop-filter:blur(8px)}
.cookie p{flex:1 1 300px;min-width:0;font-size:14px;line-height:1.45;margin:0}
.cookie a{color:var(--yellow);text-decoration:underline}
.cookie .btn{flex:none}
/* Карточка лежит ниже мобильного меню (120), модалки (130) и панели фильтров
   (110): она не должна перекрывать навигацию и кнопки поверх неё.
   --cookie-h ставит скрипт: это расстояние от верха карточки до низа экрана. */
body.has-cookie .toast,body.has-cookie.pg-product .toast{bottom:calc(var(--cookie-h,120px) + 14px)}

/* Быстрый заказ: короткая форма с резюме товара. */
.qprod{display:grid;grid-template-columns:60px minmax(0,1fr) auto;gap:12px;align-items:center;margin:4px 0 16px;padding:12px 14px;border:1px solid var(--line);border-radius:14px;background:var(--surface)}
.qprod img{width:60px;height:60px;object-fit:contain;background:#fff;border:1px solid var(--line);border-radius:10px;padding:4px}
.qp-t{min-width:0}
/* Быстрый заказ: покупатель должен видеть, что именно заказывает. */
.qp-t b{display:block;font-weight:600;font-size:14px;line-height:1.35;overflow-wrap:anywhere}
.qp-t span{display:block;color:var(--muted);font-size:12.5px;margin-top:3px}
.qp-s{text-align:right;white-space:nowrap}
.qp-s span{display:block;color:var(--muted);font-size:12.5px;margin-bottom:2px}
.qp-s b{font-family:var(--head);font-weight:700;font-size:19px}
#q-form .agrees{margin:14px 0 16px}
.fld-err{display:block;margin-top:5px;color:var(--red);font-size:13px;font-weight:500;line-height:1.35}
.fld.bad input{border-color:var(--red);background:var(--rtint)}

/* Обязательные согласия в формах. */
.agree{display:flex;align-items:flex-start;gap:11px;font-size:14px;line-height:1.45;cursor:pointer;padding:10px 12px;border:1px solid var(--line);border-radius:12px;background:#fff;transition:border-color .15s,background .15s}
.agree input{flex:none;width:20px;height:20px;margin:1px 0 0;accent-color:var(--ink);cursor:pointer}
.agree a{text-decoration:underline}
.agree:hover{border-color:var(--line2)}
.agree.bad{border-color:var(--red);background:var(--rtint)}
.agrees{display:flex;flex-direction:column;gap:10px;margin:18px 0 4px;scroll-margin-top:20px}
.agrees.bad .agree{border-color:var(--red)}
.agree-err{display:flex;align-items:flex-start;gap:9px;color:var(--red);font-size:14px;font-weight:500;line-height:1.4}
.agree-err svg{flex:none;margin-top:1px}

/* 13. Оверлеи
   -------------------------------------------------------------------------- */
.toast{position:fixed;left:50%;bottom:28px;transform:translateX(-50%) translateY(20px);background:var(--ink);color:#fff;padding:14px 20px;border-radius:14px;font-size:14px;font-weight:500;display:flex;align-items:center;gap:12px;opacity:0;pointer-events:none;transition:opacity .25s,transform .25s;z-index:100;box-shadow:0 18px 44px rgba(0,0,0,.3);white-space:nowrap;max-width:calc(100% - 32px)}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0);pointer-events:auto}
.toast a{color:var(--yellow);font-weight:700;white-space:nowrap}
/* Модальные окна: обратный звонок и всё, что появится дальше. */
.modal{position:fixed;inset:0;z-index:130;visibility:hidden;transition:visibility 0s .25s}
.modal.open{visibility:visible;transition-delay:0s}
.modal-bd{position:absolute;inset:0;background:rgba(12,12,11,.6);opacity:0;transition:opacity .25s;backdrop-filter:blur(2px)}
.modal.open .modal-bd{opacity:1}
.modal-w{position:absolute;left:50%;top:50%;transform:translate(-50%,-46%) scale(.97);opacity:0;transition:transform .25s,opacity .25s;width:min(440px,calc(100vw - 32px));max-height:calc(100vh - 32px);overflow:auto;background:#fff;border-radius:20px;padding:28px;box-shadow:var(--shadow-menu)}
.modal.open .modal-w{transform:translate(-50%,-50%) scale(1);opacity:1}
.modal-x{position:absolute;right:14px;top:14px;width:40px;height:40px;border-radius:11px;display:flex;align-items:center;justify-content:center;color:var(--muted)}
.modal-x:hover{background:var(--surface);color:var(--ink)}
.modal-w h3{font-size:22px;padding-right:44px}
.modal-w>p{margin-top:8px;font-size:14px;line-height:1.5}
.modal-w form{display:flex;flex-direction:column;gap:12px;margin-top:20px}
.modal-w .fld{display:flex;flex-direction:column;gap:6px}
.modal-w .fld>span{font-size:13px;color:var(--muted);font-weight:500}
.modal-w .fld>span i{font-style:normal;color:var(--muted2)}
.modal-w .fld.bad input{border-color:var(--red);background:var(--rtint)}
.modal-w .btn{margin-top:4px}
.modal-w form p{margin-top:2px;line-height:1.45}
.modal-w form p a{text-decoration:underline}
.stock-alert-modal .modal-w{width:min(480px,calc(100vw - 24px))}
.stock-alert-modal #stock-alert-product{font-weight:600;color:var(--ink);padding-right:12px}
.stock-alert-modal .agree{font-size:13px;margin-top:2px}
.stock-alert-modal .stock-alert-error{color:var(--red);font-size:13px;margin:0}
.item .ibody [data-stock-alert]{margin-top:10px;min-height:36px;padding:5px 12px;font-size:12px}
.cart-stock-warning{padding:12px;border:1px solid var(--line2);border-radius:12px;background:var(--surface);font-size:13px;line-height:1.45;margin:14px 0}

.lightbox{position:fixed;inset:0;background:rgba(20,20,20,.86);display:none;align-items:center;justify-content:center;z-index:200;padding:32px;cursor:zoom-out}
.lightbox.open{display:flex}
.lightbox[hidden]{display:none}
/*
  Сцена увеличения.

  Раньше у картинки стояли только max-width и max-height. Браузер без
  заданного размера рисует <img> в натуральную величину, и снимок
  400×283 открывался МЕНЬШЕ, чем он же на карточке, вписанный в площадку
  шире пятисот пикселей. Размер кадра теперь считает скрипт — от
  натурального размера файла и размера экрана, — а здесь только сцена,
  в которой он живёт, и правила движения.
*/
/* Снизу оставлено место под панель масштаба и оговорку о размере
   исходника: раньше подпись ложилась поверх снимка. */
.lb-stage{position:absolute;inset:72px 76px 28px;display:flex;align-items:center;justify-content:center;overflow:hidden;touch-action:none}
.lightbox img{display:block;background:#fff;border-radius:20px;box-shadow:0 40px 100px rgba(0,0,0,.5);
  transform-origin:50% 50%;will-change:transform;user-select:none;-webkit-user-drag:none;cursor:zoom-in}
.lightbox img:active{cursor:grabbing}
/* Панель масштаба: та же высота и тот же язык, что у крестика. */
.lightbox .lb-zoom{position:absolute;left:50%;bottom:22px;transform:translateX(-50%);display:flex;align-items:center;gap:4px;
  background:rgba(255,255,255,.94);border-radius:12px;padding:4px;box-shadow:0 6px 24px rgba(0,0,0,.35);z-index:2}
.lightbox .lb-zoom[hidden]{display:none}
.lightbox .lbz{width:40px;height:40px;border:0;border-radius:9px;background:transparent;color:var(--ink);
  display:flex;align-items:center;justify-content:center;cursor:pointer;font:inherit;font-size:13px;font-weight:600}
.lightbox .lbz-r{width:auto;padding:0 12px}
.lightbox .lbz:hover:not(:disabled){background:var(--surface)}
.lightbox .lbz:disabled{opacity:.35;cursor:default}
.lightbox .lbz:focus-visible{outline:2px solid var(--ink);outline-offset:-2px}
.lightbox .lb-scale{min-width:56px;text-align:center;font-size:13px;font-weight:600;color:var(--ink);font-variant-numeric:tabular-nums}
.lightbox .x{position:absolute;right:24px;top:24px;width:48px;height:48px;border-radius:12px;background:#fff;display:flex;align-items:center;justify-content:center;color:var(--ink)}
/* Листание кадров: появляется только там, где снимков правда несколько. */
.lightbox .lbn{position:absolute;top:50%;transform:translateY(-50%);width:52px;height:52px;border:0;border-radius:50%;
  background:rgba(255,255,255,.92);color:var(--ink);display:flex;align-items:center;justify-content:center;cursor:pointer;
  box-shadow:0 6px 24px rgba(0,0,0,.35)}
.lightbox .lbn[hidden]{display:none}
.lightbox .lbp{left:24px}
.lightbox .lbx{right:24px}
.lightbox .lbn:hover{background:#fff}
.lightbox .lbn:focus-visible{outline:2px solid var(--yellow);outline-offset:3px}
.lightbox .lb-count{position:absolute;left:50%;top:26px;transform:translateX(-50%);color:#f2f1ec;font-size:14px;
  font-weight:600;letter-spacing:.04em;background:rgba(0,0,0,.42);border-radius:999px;padding:5px 14px}
.lightbox .lb-count[hidden]{display:none}
@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}html{scroll-behavior:auto}}

/* 14. Адаптив
   ========================================================================== */

/* ---- 981–1240: шапка в одну строку уже не помещается --------------------- */
@media (min-width:981px) and (max-width:1240px){
  /* Логотип, телефон и действия занимают почти всю строку, и поле поиска
     сжималось до сорока пикселей. Переносим его на свою строку целиком. */
  .head .wrap{flex-wrap:wrap;height:auto;padding-top:14px;padding-bottom:14px;gap:12px 16px}
  .search{order:5;flex-basis:100%;height:50px}
  .phone{margin-left:auto}
}

/* ---- ≤1400: узкий десктоп ----------------------------------------------- */
@media (max-width:1400px){
  /* «Акции» есть отдельным пунктом в каталоге и в мобильном меню, поэтому
     в тесноте убираем её первой — иначе обрезается последний пункт меню. */
  .navr a.r{display:none}
  /* Ужимаем правую часть шапки, чтобы поиску осталась рабочая ширина. */
  .head .wrap{gap:18px}
  .hact{width:66px;font-size:12.5px}
  .phone b{font-size:20px}
}

/* ---- ≤1240: ноутбуки ---------------------------------------------------- */
@media (max-width:1240px){
  /* На ноутбуке верхняя полоса не влезает целиком: прячем по одному
     пункту слева и справа, оба продублированы ниже в меню и в подвале. */
  .topbar .l,.topbar .r{gap:20px}
  .topbar .l span:nth-child(3),.topbar .r a:nth-child(1){display:none}
  .navbar .wrap{gap:20px}
  .nav{gap:18px}
  .hslider .wrap{grid-template-columns:minmax(0,1fr) 40%}
  .hslider h1,.hslider h2{font-size:38px}
  .grid4{grid-template-columns:repeat(3,minmax(0,1fr))}
  .pgrid{grid-template-columns:minmax(0,1fr) 340px;grid-template-areas:"h h" "g b" "i b"}
  .pgrid .phead{grid-area:h}.pgrid .gallery{grid-area:g}.pgrid .pinfo{grid-area:i}.pgrid .buy{grid-area:b}
  .desc-grid{grid-template-columns:minmax(0,1fr)}
  .rev-grid{grid-template-columns:1fr}
  .rev-sum{position:static}
  .fgrid{grid-template-columns:1.2fr 1fr 1fr;row-gap:36px}
  .catmenu .wrap{grid-template-columns:330px minmax(0,1fr)}
  .catmenu .cats a{font-size:18px;padding:13px 16px}
  .bgrid a{height:66px;font-size:15px;padding:0 15px}
  .bgrid{grid-template-columns:repeat(3,minmax(0,1fr))}
}

/* ---- ≤980: планшеты и телефоны ------------------------------------------ */
@media (max-width:980px){
  :root{--gut:28px}
  .topbar{display:none}
  .head .wrap{flex-wrap:wrap;height:auto;padding-top:12px;padding-bottom:12px;gap:10px 12px}
  .mobbtn{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:12px;border:1px solid var(--hdr-line);color:#fff;flex:none;margin-left:-4px}
  .logo img{height:30px}
  .logo-plate{padding:6px 13px 6px 10px}
  .logo-plate img{height:24px}
  /*
    Планшетная строка шапки собирается по тому же правилу, что и телефонная:
    меню, логотип и корзина обязаны стоять на одном уровне, корзина — справа.

    Раньше здесь в первую строку не помещался блок телефона с «Заказать
    звонок», и вниз сваливались действия вместе с корзиной: на 768px корзина
    оказывалась на второй строке слева, да ещё и прыгала туда при появлении
    товаров. Теперь телефон намеренно уходит вниз, к поиску, где место есть,
    а в первой строке остаются меню, логотип и действия с корзиной.

    Гарантия та же, что и на телефоне: у логотипа нулевой flex-basis, поэтому
    в раскладку строки он входит с нулевой шириной и вытеснить корзину нечем.
    Растёт он только до max-content, а остаток места забирает margin-left:auto
    у группы действий и прижимает корзину к правому краю.
  */
  .head .wrap > .hblogo{flex:1 1 0;min-width:0;max-width:max-content}
  /* Обрезается вся текстовая колонка, а не только wordmark: подпись под ним
     шире его самого, и без этого она вылезала из своей коробки и наезжала на
     блок телефона, когда логотипу не хватало места. */
  .hblogo-txt{min-width:0;overflow:hidden}
  /* Свободное место забирает отступ перед телефоном — он уносит вправо и
     себя, и группу действий, так что корзина оказывается у самого края. */
  .phone{margin-left:auto;flex:none}
  .hacts{margin-left:0;flex:none}
  /* Поиск занимает отдельную строку целиком: с basis 100% он не может
     встать рядом с корзиной и оттеснить её от правого края. */
  .search{order:5;flex:0 0 100%;min-width:0;height:48px;border-width:1.5px;border-radius:12px}
  /*
    Сумма заказа в кнопке корзины — единственное, что здесь зависит от
    содержимого и может расти без предела. На узком планшете её приходится
    убирать: с ней фиксированная часть строки (меню, телефон, действия)
    доходит до 628px при 585px доступных на 641px — не помещается даже при
    нулевой ширине логотипа. Количество товаров остаётся, сумма видна в
    корзине.

    Порог 960px посчитан, а не выбран на глаз: со включённой суммой строке
    нужно 44 + 203 + 346 + 36 зазоров + 206 логотипа = 835px, и запас
    появляется только к 960px. Три значка
    (сравнение, избранное, вход) полезнее суммы: это навигация, а итог
    всё равно виден в самой корзине.
  */
  @media (max-width:960px){.cartbtn{width:auto;min-width:0}.cartbtn .sum{display:none}}
}

/*
  Узкий планшет и телефон: вместо блока с номером и «Заказать звонок» —
  компактная кнопка вызова. Блок телефона занимает 203px, и именно он
  отбирал ширину у логотипа: на 768px знаку оставалось 119px при нужных
  164px, и подпись вылезала на соседей, на 641px от «HI-BLACK» оставались
  две буквы. Порог 900px — с запасом: полному блоку телефона рядом с целым
  логотипом нужно 44 + 203 + 310 + 36 зазоров + 206 = 799px, и надёжный
  запас появляется только за 900px. Номер никуда не делся: кнопка звонит по тому же номеру
  в одно нажатие, а полный номер есть в меню и в подвале.
*/
@media (max-width:900px){
  .head .phone{display:none}
  .mphone{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:12px;border:1px solid var(--hdr-line);color:#fff;margin-left:auto;flex:none;-webkit-tap-highlight-color:transparent}
  /*
    Глобальное a:hover{color:#000} на тач-экране «залипает» после касания, и
    белая трубка на тёмной шапке оставалась чёрной. Цвет закреплён во всех
    состояниях, от нажатия остаётся только короткая подсветка фона.
  */
  .mphone,.mphone:hover,.mphone:focus,.mphone:visited{color:#fff}
  .mphone{position:relative;z-index:2;touch-action:manipulation}
  .mphone:active{background:rgba(255,255,255,.16);border-color:rgba(255,255,255,.45)}
  .mphone:focus-visible{outline:2px solid var(--yellow);outline-offset:2px}
  .search input{padding:0 14px;font-size:14px}
  .search .sbtn{width:100px}
  /* Подписи «Сравнение» и «Избранное» шире отведённых 52px и наезжали друг на
     друга — на планшете оставляем только иконки, названия видны в меню. */
  .hact{width:44px;font-size:0;gap:0}
  .hact .cnt{font-size:11px;right:2px}
  .cartbtn{height:44px;padding:0 14px 0 12px;border-radius:12px;margin-left:4px}
  .navbar .wrap{height:auto;gap:0;padding-top:8px;padding-bottom:8px}
  .nav{gap:6px;margin:0 calc(var(--gut)*-1);padding:0 var(--gut);flex:1 1 100%}
  .nav a{display:inline-flex;align-items:center;height:36px;padding:0 13px;border:1px solid var(--hdr-line);border-radius:999px;font-size:13.5px;font-weight:500;line-height:1}
  .nav a.on{background:var(--yellow);color:var(--ink);border-color:var(--yellow);font-weight:600}
  .nav .mob-only{display:inline-flex}
  .nav a.y{background:rgba(255,210,0,.16);border-color:transparent;color:var(--yellow);font-weight:600}
  .nav a.r{color:#ff8f8e;border-color:rgba(211,64,63,.35);background:rgba(211,64,63,.15);font-weight:600}
  .navr{display:none!important}
  .layout{grid-template-columns:minmax(0,1fr);gap:24px;padding-top:20px}
  .side{display:none}
  .ph1{padding-top:18px}
  .sec{margin-top:40px}
  /* Снизу слайдер держит высоту, чтобы фотография не превращалась в полоску. */
  .hslider{min-height:520px}
  .hslider .wrap{grid-template-columns:1fr;gap:0}
  .hslider .slide{padding-bottom:60px}
  .hslider .stext{padding:30px 0;max-width:none}
  /* На планшете кадр остаётся фоном во всю ширину: cover не искажает пропорции,
     а точку интереса задаём каждому снимку отдельно — иначе техника уезжает
     за край. Поверх — вертикальное затемнение под текст. */
  .hslider .slide{background-size:cover}
  .hslider .s1{background-position:68% center}
  .hslider .s2{background-position:60% center}
  .hslider .s3{background-position:74% center}
  .hslider .slide::before{background:linear-gradient(180deg,rgba(11,11,10,.88) 0%,rgba(11,11,10,.74) 42%,rgba(11,11,10,.55) 72%,rgba(11,11,10,.86) 100%)}
  .hslider .sfeat{max-width:none}
  .finder{max-width:none}
  .tiles,.tiles-s{grid-template-columns:repeat(2,minmax(0,1fr))}
  .grid4,.grid3{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
  .clist .card{grid-template-columns:170px minmax(0,1fr) 226px}
  .clist .cside{padding:16px 18px}
  .clist .cbody{padding:16px 18px}
  .adv{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
  .ccards{grid-template-columns:repeat(2,minmax(0,1fr))}
  .cshop{grid-template-columns:1fr;gap:18px}
  .cshop .map-ph{min-height:170px}
  .about{grid-template-columns:1fr;padding:28px;gap:24px}
  /* каталог: фильтры в выдвижной панели */
  .mfilterbtn{display:inline-flex}
  .layout.cat .side{display:none;position:fixed;inset:0;z-index:110;background:#fff;overflow:auto;overscroll-behavior:contain;padding:12px 16px 24px;gap:12px}
  .layout.cat .side.open{display:flex}
  .layout.cat .side.open .sbox:not(.fbox),.layout.cat .side.open .spromo{display:none}
  .layout.cat .side .side-head{display:flex;align-items:center;justify-content:space-between;font-family:var(--head);font-weight:800;font-size:20px;padding:4px 0 10px;position:sticky;top:-12px;background:#fff;z-index:2;margin-top:-12px;padding-top:16px}
  .layout.cat .side .side-head button{width:44px;height:44px;border-radius:12px;border:1px solid var(--line);display:inline-flex;align-items:center;justify-content:center}
  .layout.cat .side.open .sbox.fbox{border:0;padding:0!important}
  .layout.cat .side.open .fbtns{position:sticky;bottom:-24px;background:#fff;padding:12px 0 24px;margin-top:6px;box-shadow:0 -12px 16px #fff}
  /* товар */
  .pgrid{grid-template-columns:1fr;grid-template-areas:"h" "g" "b" "i";gap:24px}
  .gmain{height:480px;padding:14px}
  .buy{position:static}
  .tabs{margin-top:40px}
  /* На узком экране панель во всю ширину: кнопка должна быть крупной. */
  .buybar{left:12px;right:12px;width:auto;bottom:calc(12px + env(safe-area-inset-bottom,0px));
    transform:translateY(calc(100% + 28px))}
  .buybar.show{transform:none}
  .buybar .btn{height:50px}

  /*
    Запас под закреплённой панелью — в самом футере, а не в body.

    Отступ у body рисуется его фоном, то есть белым, и на телефоне под
    тёмным футером появлялась белая полоса во всю ширину экрана: 150 px
    пустоты после конца страницы. Причин было две — запас стоял не на том
    элементе и был взят с потолка, вдвое больше нужного.

    Теперь запас живёт внутри футера (фон у него свой, полосы не будет) и
    считается от настоящей высоты панели: её измеряет app.js и кладёт в
    --buybar-h. Резерв нужен, только пока панель на экране, поэтому он
    висит на .bar-on; переключается он у верха страницы, где смены высоты
    документа не видно.
  */
  body.pg-product.bar-on .foot{
    padding-bottom:calc(32px + var(--buybar-h,74px) + 12px + env(safe-area-inset-bottom,0px));
  }
  .toast{bottom:96px}
  /* корзина */
  .cgrid{grid-template-columns:1fr;gap:24px}
  .cgrid .summary{grid-column:auto;grid-row:auto;position:static}
  .cgrid .addon-sec{grid-column:auto;margin-top:12px}
  .addon,.trust{grid-template-columns:repeat(2,minmax(0,1fr))}
  .steps{overflow-x:auto;scrollbar-width:none}
  .steps::-webkit-scrollbar{display:none}
  .step{padding:14px 16px}
  .finder-page,.contacts{grid-template-columns:1fr}
  .fgrid{grid-template-columns:1fr 1fr}
  /* Подвал здесь вытягивается в высокий столбец, и cover раздул бы
     горизонтальный снимок вдвое. Поэтому он идёт полосой во всю ширину
     сверху и плавно растворяется в тёмном фоне. */
  .foot{background-size:200% auto;background-position:center top}
  .foot::before{background:linear-gradient(180deg,rgba(12,12,11,.72) 0px,rgba(12,12,11,.86) 120px,rgba(12,12,11,.97) 185px,#141312 240px)}
}

/* ---- 701–980: планшет, меню каталога перестраивается в две колонки ------- */
@media (min-width:701px) and (max-width:980px){
  .catmenu .wrap{grid-template-columns:1fr;max-height:calc(100vh - 150px)}
  .catmenu .cats{border-right:0;border-bottom:1px solid var(--line);padding:16px 0 16px;display:grid;grid-template-columns:1fr 1fr;gap:6px 12px}
  .catmenu .cats a{font-size:17px;padding:13px 16px}
  .catmenu .cats a.sale{margin-top:0}
  .catmenu .brands{padding:20px 0 26px}
  .bgrid{grid-template-columns:repeat(2,minmax(0,1fr))}
}

/* ---- ≤700: телефон, каталог живёт в выдвижной панели --------------------- */
@media (max-width:700px){
  /* На телефоне список складывается в столбец: фото сверху во всю ширину,
     под ним данные, ещё ниже цена и кнопки — узкой колонки не остаётся. */
  .clist .card{grid-template-columns:1fr}
  .clist .cmedia{border-right:0;border-bottom:1px solid var(--line);aspect-ratio:4/3;min-height:0}
  .clist .cbody{padding:14px 16px 4px}
  .clist .cside{border-left:0;padding:10px 16px 16px}
  .clist .cbot{flex-direction:row;align-items:center}
  .clist .cmp-b{width:auto}
  .clist .price{font-size:22px}

  .catbtn{display:none}
  .catmenu{display:none!important}
  /* Панель — единственный каталог на телефоне, поэтому зоны нажатия крупнее. */
  .mm-sec a{font-size:17px;min-height:56px;padding:0 22px}
  .mm-sec .stitle{padding:10px 22px 6px;font-size:18px}
  .mm-sec a.y{min-height:58px;font-size:17px}
}

/* ---- ≤640: телефоны ----------------------------------------------------- */
@media (max-width:640px){
  :root{--gut:22px}
  body{font-size:15px}
  h1{font-size:26px}h2{font-size:22px}h3{font-size:18px}
  .btn{height:46px;padding:0 18px;font-size:14px}
  .btn-lg{height:52px;padding:0 22px;font-size:15px}
  .chip{height:36px;padding:0 13px;font-size:13px}
  .sec{margin-top:36px}
  .sec-head{margin-bottom:16px;gap:6px 16px}
  .sec-head a.more{font-size:14px}
  /* шапка */
  .head .wrap{gap:8px 7px;padding-top:10px;padding-bottom:10px}
  /*
    Верхняя строка на телефоне: меню слева, логотип рядом с ним, телефон и
    корзина прижаты вправо. Корзина не должна уезжать под логотип ни при
    каком содержимом — а раньше уезжала: строка держалась только на том,
    что сумма ширин случайно укладывалась в экран, и запас был 6–7px. Стоило
    счётчику стать двузначным, и корзина сваливалась на второй ряд (на 320px
    не помещалась даже с пустой корзиной).

    Теперь это не совпадение, а структура. Ключевой момент: флексбокс решает,
    что перенести, по ГИПОТЕТИЧЕСКОЙ ширине элементов — то есть по flex-basis,
    ещё до всякого сжатия. Поэтому одного min-width:0 мало, он бы сработал
    слишком поздно. У логотипа basis нулевой (flex:1 1 0), и в раскладку
    строки он входит с нулевой шириной: строка — это три кнопки, они
    помещаются на любом телефоне, и корзине просто нечем быть вытесненной.

    Дальше логотип растёт в свободное место, но упирается в max-content —
    свою же естественную ширину. Так он не превращается в огромную
    невидимую ссылку поверх пустоты, а остаток свободного места достаётся
    margin-left:auto у телефона, который и прижимает телефон с корзиной
    вправо. Если места мало, логотип получает сколько есть, и лишнее у
    wordmark обрезается — но корзина остаётся на месте. На 320–640 wordmark
    помещается целиком, обрезка нужна только как аварийный запас.
  */
  /* min-height — только под палец: на 320px сам знак 22px высотой, и область
     нажатия была бы вдвое ниже соседних кнопок. Строка и так не ниже 40px
     из-за меню и корзины, поэтому на вид ничего не меняется. */
  .head .wrap > .hblogo{flex:1 1 0;min-width:0;max-width:max-content;min-height:40px}
  .hblogo-txt{min-width:0;overflow:hidden}
  .logo img{height:28px}
  .logo-plate{padding:5px 11px 5px 9px}
  .logo-plate img{height:21px}
  .logo-sub{display:none}
  .hact{display:none}
  /* Корзина прижата к правому краю строки и остаётся последней.
     Отступы ужаты до предела осознанно: трёхзначный счётчик добавляет
     кнопке 12px, и ровно этих 12px не хватало логотипу на 320–390px —
     знак начинал обрезаться. Кнопка от этого не стала мельче: её высота
     и площадь нажатия прежние. */
  .hacts{gap:0;flex:none;margin-left:0}
  .cartbtn{margin-left:0;gap:5px;padding:0 8px;flex:none}
  .cartbtn .sum{display:none}
  /* Счётчик фиксированной ширины: одно- и двузначное число занимают
     одинаково, поэтому строка не «дышит» при добавлении товаров. */
  .cartbtn .n{min-width:1.1em;text-align:center}
  .search{height:46px}
  .search .sbtn{width:54px;gap:0}
  .search .sbtn .txt{display:none}
  /* главная */
  /*
    Телефон. Кадр 2400×900 в портретной колонке пришлось бы увеличивать втрое —
    снимок выглядел растянутым и рассыпался на пиксели. Поэтому на узком экране
    слайд разбирается на две части: сверху фотография своей полосой с честными
    пропорциями (cover внутри 16:9 — без искажений), снизу тёмное поле с
    текстом. Между ними градиент, чтобы стыка не было видно.
  */
  .hslider{min-height:0}
  .hslider .slide{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;padding-bottom:52px;background-image:none;background-color:#101010}
  .hslider .slide::after{content:"";display:block;order:-1;width:100%;aspect-ratio:16/9;background-size:cover;background-repeat:no-repeat}
  .hslider .s1::after{background-image:url(../img/banners/slide-1.webp);background-position:64% center}
  .hslider .s2::after{background-image:url(../img/banners/slide-2.webp);background-position:56% center}
  .hslider .s3::after{background-image:url(../img/banners/slide-3.webp);background-position:72% center}
  /* Затемнение лежит только на фотографии и растворяется к тексту. */
  .hslider .slide::before{top:0;bottom:auto;height:calc(56.25vw + 34px);
    background:linear-gradient(180deg,rgba(16,16,16,.12) 0%,rgba(16,16,16,.3) 46%,rgba(16,16,16,.86) 84%,#101010 100%)}
  .hslider .wrap{align-items:start}
  .hslider .stext{padding:18px 0 4px}
  .hslider h1,.hslider h2{font-size:26px;margin:11px 0 10px;text-wrap:balance}
  .hslider p{font-size:15px}
  .hslider .sfeat{gap:8px;margin-top:18px}
  .hslider .sfeat div{padding:9px 10px;font-size:12.5px;gap:8px;border-radius:10px}
  .hslider .sctrl{bottom:14px}
  .hslider .sarr button{width:40px;height:40px}
  .hslider .sbtns{gap:8px}
  .hslider .sbtns .btn{flex:1 1 140px;min-width:0}
  .finder{flex-direction:column;margin-top:20px;padding:8px}
  select.fsel{width:100%}
  .finder .finp{height:46px}
  .finder .btn{height:46px}
  .brandstrip{display:block;padding:14px var(--gut) 12px;margin-top:16px}
  .brandstrip .lbl{display:block;margin:0 0 8px}
  .brandstrip .logos{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;margin:0 calc(var(--gut)*-1);padding:0 var(--gut);-webkit-overflow-scrolling:touch}
  .brandstrip .logos::-webkit-scrollbar{display:none}
  .brandstrip .logos a{height:40px;padding:0 12px}
  .brandstrip .logos img{height:16px;max-width:76px}
  .tiles{grid-template-columns:1fr;gap:12px}
  .tile{flex-direction:row;align-items:stretch}
  .tile .ph{width:104px;height:auto;padding:10px 8px;border-bottom:0;border-right:1px solid var(--line)}
  /* На телефоне плитки идут в столбик: ограничиваем высоту снимка, иначе
     вертикальная коробка вытягивает свою плитку вдвое выше соседних. */
  .tile .ph img{max-height:110px}
  .tile .tt{flex:1;padding:13px 14px}
  .tile h3{font-size:17px;text-wrap:normal}
  .tile p{font-size:13px;margin-top:4px}
  .tile .cta{margin-top:auto;padding-top:10px;font-size:13.5px}
  .tiles-s{grid-template-columns:1fr;gap:12px;margin-top:12px}
  .tile-s{min-height:0;padding:12px 16px}
  .tile-s .ph{width:72px;height:56px}
  .tile-s .ph img{max-height:56px;max-width:72px}
  .grid4,.grid3{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
  .adv{grid-template-columns:1fr;gap:10px}
  .ccards{grid-template-columns:1fr;gap:12px;margin:18px 0 4px}
  .ccard{padding:16px 18px;border-radius:16px}
  .ccard b{font-size:19px}
  .b2b{padding:20px;border-radius:16px;margin-top:26px}
  .b2b-h h2{font-size:20px}
  .b2b-h .btn{width:100%}
  .b2b-l{grid-template-columns:1fr;gap:12px;margin-top:16px;padding-top:16px}
  .chelp{padding:18px}
  .chelp .acts .btn{flex:1 1 160px}
  .advi{padding:14px 16px;gap:12px;align-items:center}
  .advi .ico{width:40px;height:40px;border-radius:10px}
  .advi b{font-size:14px;margin-bottom:2px}
  .advi span{font-size:12px}
  .tags{gap:6px}
  .about{padding:22px 18px;border-radius:18px;gap:18px}
  .about h2{font-size:20px}
  .about p{font-size:14px;margin-top:10px}
  .about .btn{margin-top:16px}
  .lines{gap:8px}
  .line-c{padding:12px 14px;border-radius:12px}
  .line-c b{font-size:14px}
  .line-c span{font-size:12px}
  /* карточка в списке */
  .card{border-radius:14px}
  .cmedia{padding:14px}
  .cbadges{left:8px;top:8px;gap:4px}
  .badge{height:22px;font-size:11px;padding:0 7px}
  .cbrand{left:8px;bottom:8px;height:24px;padding:0 8px;border-radius:7px}
  .cbrand img{height:12px;max-width:52px}
  .cacts{display:none}
  .cbody{padding:10px 12px 12px;gap:7px}
  .ctitle{font-size:13px;line-height:1.3}
  .crate{font-size:12px;gap:5px}
  .crate .stars svg{width:12px;height:12px}
  .crate a{border:0}
  .crate .rw{display:none}
  .crate a::before{content:"("}
  .crate a::after{content:")"}
  .cspecs{font-size:12px;gap:2px 8px}
  .avail{font-size:12px}
  .price{font-size:17px}
  .price small{font-size:12px;margin-left:6px}
  .cfoot{gap:8px;padding-top:4px}
  .cfoot .btn{height:40px;font-size:13px;gap:8px;padding:0 10px}
  /* У кнопки с переносом высота считается по строкам, иначе вторая
     строка вылезает за нижнюю кромку. */
  .cfoot .btn-alert{height:auto;min-height:40px;padding:7px 8px;gap:6px;line-height:1.15}
  .oneclick{font-size:12px}
  /* каталог */
  .ph1 h1{gap:10px}
  .ph1 h1 span{font-size:14px}
  /*
    Лента брендов. Без flex:0 0 auto чипы сжимались ниже своей ширины, и
    логотип наезжал на обрезанное название. Название рядом с логотипом на
    телефоне не показываем — оно и так написано на самом логотипе, а для
    доступности остаётся aria-label чипа.
  */
  .brands{overflow-x:auto;flex-wrap:nowrap;gap:9px;padding-bottom:4px;margin:16px calc(var(--gut)*-1) 0;padding-left:var(--gut);padding-right:var(--gut);scrollbar-width:none;
    scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain}
  .brands::-webkit-scrollbar{display:none}
  .brands .chip{flex:0 0 auto;scroll-snap-align:start;padding:0 14px;height:38px}
  /* Высоту логотипа выставляет inline-стиль общего помощника brandLogo, поэтому
     здесь нужен !important: на телефоне подписи рядом нет и логотип крупнее. */
  .brands .chip img{height:18px!important;max-width:104px}
  .brands .bname{display:none}
  .layout.cat{padding-top:20px}
  /*
    Панель каталога на телефоне в две строки: сверху фильтры и переключатель
    вида, снизу сортировка и количество на странице. display:contents убирает
    промежуточную обёртку, чтобы все четыре элемента раскладывались одной
    сеткой, а не жались в одну узкую строку.
  */
  .toolbar{padding-bottom:12px;margin-bottom:14px;gap:8px}
  .toolbar .l{display:contents}
  .toolbar .r{display:flex;order:2;flex:none}
  .mfilterbtn{order:1;flex:1 1 auto;height:42px}
  .toolbar .sel{height:42px}
  /* Каждому селекту своя строка: «Показывать по 12» в половину ширины
     телефона обрезается прямо посередине слова. */
  .toolbar .sel-sort{order:3;flex:1 1 100%;min-width:0}
  .toolbar .sel-sort select{flex:1;width:100%;min-width:0}
  .toolbar .sel-pp{order:4;display:inline-flex;flex:1 1 100%;min-width:0}
  .toolbar .sel-pp select{flex:1;width:100%;min-width:0}
  .view button{width:40px;height:42px}
  .applied{overflow-x:auto;flex-wrap:nowrap;margin:0 calc(var(--gut)*-1) 14px;padding:0 var(--gut);scrollbar-width:none}
  .applied::-webkit-scrollbar{display:none}
  .pager{flex-direction:column;align-items:stretch;margin-top:20px}
  .pager .btn{width:100%}
  /* На узком экране номеров больше, чем помещается в строку: даём переносить,
     иначе последняя кнопка выходит за край и появляется горизонтальный скролл. */
  .pages{justify-content:center;flex-wrap:wrap;row-gap:8px}
  .pages a,.pages span{width:42px;height:42px}
  .seo{padding:20px 18px;margin-top:36px;border-radius:16px}
  .seo h3{font-size:18px}
  .seo p{font-size:14px}
  /* товар */
  .phead h1{font-size:clamp(20px,5.4vw,24px);line-height:1.2}
  .pmeta{font-size:13px;gap:6px 14px;margin-top:10px}
  .pgrid{gap:18px;margin-top:12px}
  .gmain{height:360px;padding:10px;border-radius:16px}
  .gmain .zoom{height:32px;font-size:12px}
  .gmain .gcompat{padding:18px;gap:10px}
  .gmain .gcompat h3{font-size:16px}
  .thumbs{grid-template-columns:repeat(4,minmax(0,1fr));gap:8px}
  .thumb.tcompat{font-size:10px}
  .buy{padding:18px;border-radius:16px;gap:14px}
  .buy .price{font-size:28px}
  .buy .brow{gap:8px}
  .buy .acts button{font-size:12px;padding:0 6px}
  .tabs{margin-top:32px;margin-left:calc(var(--gut)*-1);margin-right:calc(var(--gut)*-1);padding:0 var(--gut)}
  .tabs button{padding:12px 12px;font-size:14px}
  .tabbody{padding-top:22px}
  .desc h3{font-size:19px}
  .desc p{font-size:15px}
  .spec-t .sh{padding:14px 16px;font-size:15px}
  .spec-t .sr,.spec-full .sr{padding:10px 16px;font-size:14px}
  .vars{margin-top:32px}
  .vars-h h2{font-size:19px}
  .biz-note{padding:12px 14px}
  .rev{padding:16px}
  .rev .pm{grid-template-columns:1fr}
  .rev-sum{padding:18px}
  .rev-form{padding:18px}
  .rev-form .row{grid-template-columns:1fr}
  /* корзина */
  .steps{margin-top:16px;border-radius:12px}
  .step{padding:12px 12px;gap:8px;font-size:13px;flex:0 0 auto}
  .step.on{flex:1}
  .step:not(.on) span{display:none}
  .step i{width:26px;height:26px}
  .chead{padding:12px 14px}
  .item{grid-template-columns:72px minmax(0,1fr) 36px;gap:12px;padding:14px;align-items:start}
  .item .img{width:72px;height:72px;border-radius:10px;padding:4px}
  .item .t{font-size:14px}
  .item .m{margin-top:4px;font-size:12px}
  .item .u{margin-top:4px;font-size:12px}
  .item .img{grid-column:1;grid-row:1}
  .item .ibody{grid-column:2;grid-row:1}
  .item .rm{width:36px;height:36px;grid-column:3;grid-row:1;justify-self:end;margin:-6px -6px 0 0}
  .ictl{grid-column:1/-1;grid-row:2;justify-content:space-between;gap:12px}
  .item .qty{height:40px}
  .item .qty button{width:38px}
  .item .qty span{width:36px;font-size:15px}
  .item .sum{min-width:0}
  .item .sum .price{font-size:18px}
  .cfootr{flex-direction:column;align-items:stretch;padding:14px}
  .promo{flex-wrap:wrap}
  .promo .field{width:auto;flex:1;min-width:140px}
  .addon,.trust{grid-template-columns:1fr;gap:10px}
  .summary{padding:18px;border-radius:16px}
  .srow.total b{font-size:26px}
  .cobox{padding:18px;border-radius:16px}
  .segs{display:flex;width:100%}
  .seg{flex:1;padding:0 8px;font-size:13px}
  .row2{grid-template-columns:1fr;gap:12px}
  .row2 > span{display:none}
  .opt{padding:12px 14px;gap:12px}
  .opt .ot b{font-size:14px}
  .opt .ot span{font-size:12px}
  .empty{padding:32px 18px}
  .empty.big{margin:24px auto;padding:36px 20px}
  .empty h1{font-size:24px}
  .fp-box{padding:20px 16px}
  .fp-side{padding:20px 18px}
  .login{padding:22px 18px;margin-top:16px}
  /* подвал */
  .foot{padding:36px 0 24px;margin-top:48px}
  .fgrid{grid-template-columns:1fr 1fr;gap:24px 16px}
  .fbrand,.fcontact{grid-column:1/-1}
  .fbrand p{font-size:13px;margin-top:10px}
  .foot h4{margin-bottom:10px;font-size:12px}
  .fcol a{padding:4px 0;font-size:13px}
  .fcontact{gap:8px;font-size:13px}
  .fbottom{margin-top:28px;padding-top:18px;gap:12px}
  .fbottom .links{gap:6px 16px}
  /* На узком экране резюме товара перестраивается: название получает всю
     ширину, а расчёт уходит отдельной строкой под ним. */
  .qprod{grid-template-columns:52px minmax(0,1fr);gap:10px 12px;padding:12px}
  .qprod img{width:52px;height:52px}
  .qp-t span{white-space:nowrap}
  .qp-s{grid-column:1/-1;display:flex;align-items:baseline;justify-content:space-between;gap:10px;text-align:left;border-top:1px solid var(--line);padding-top:9px}
  .qp-s span{margin:0}
  /* оверлеи */
  .cookie{width:calc(100vw - 24px);bottom:calc(14px + env(safe-area-inset-bottom,0px));padding:14px 16px;gap:12px;border-radius:14px}
  .cookie p{flex:1 1 100%;font-size:13.5px}
  .cookie .btn{width:100%}
  body.pg-product.bar-on .cookie{bottom:calc(var(--buybar-h,74px) + 24px + env(safe-area-inset-bottom,0px))}
  .toast{white-space:normal;padding:12px 16px;font-size:13px;left:16px;right:16px;transform:translateY(20px);max-width:none;bottom:20px}
  .toast.show{transform:translateY(0)}
  body.pg-product.bar-on .toast{bottom:calc(var(--buybar-h,74px) + 24px + env(safe-area-inset-bottom,0px))}
  .lightbox{padding:12px}
  .lightbox img{border-radius:14px}
  .lb-stage{inset:64px 12px 12px}
  .lightbox .lb-zoom{bottom:12px;padding:3px}
  .lightbox .lbz{width:38px;height:38px}
  .lightbox .lb-scale{min-width:48px;font-size:12px}
  .lightbox .x{right:12px;top:12px;width:44px;height:44px}
  /* На телефоне кадры листаются пальцем, стрелки прижимаются к краям и
     не наезжают на снимок. */
  .lightbox .lbn{width:44px;height:44px}
  .lightbox .lbp{left:6px}
  .lightbox .lbx{right:6px}
  .lightbox .lb-count{top:14px;font-size:13px;padding:4px 12px}
  .buybar .btn{padding:0 12px}
}

/* ---- ≤380: узкие телефоны ------------------------------------------------ */
@media (max-width:380px){
  /* На 360px корзина срывалась на вторую строку и шапка вырастала вдвое:
     ужимаем плашку логотипа и кнопки, чтобы всё осталось в одну строку. */
  .logo-plate{padding:5px 9px 5px 7px}
  .logo-plate img{height:18px}
  .mphone{width:40px;height:40px}
  .cartbtn{height:40px;padding:0 10px;gap:6px}
  .mobbtn{width:40px;height:40px}
  .grid4,.grid3{gap:8px}
  .ctitle{font-size:12px}
  .cfoot .btn{font-size:12px;gap:6px}
  .cfoot .btn svg{display:none}
  .cfoot .btn-alert{font-size:11.5px;padding:7px 6px}
  .hslider h1,.hslider h2{font-size:24px}
  .tile .ph{width:88px;height:72px}
  .thumbs{gap:6px}
  .buy .acts{flex-direction:column}
}

/* 16. Логотип Hi-Black в шапке
   --------------------------------------------------------------------------
   Знак собран разметкой, а не картинкой: жёлтая скруглённая плашка с «HB»,
   справа плоский белый wordmark «HI-BLACK» и подпись под ним. Никакого
   объёма, бликов, теней и свечения — только заливка и текст.

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

   Весь размер задан одной переменной --u (сторона плашки): всё внутри —
   скругление, кегль букв, зазор, подпись — считается от неё. Поэтому на
   узких экранах достаточно поменять одно число, и пропорции сохранятся.
   Пороги найдены перебором с замером высоты строки .head: выше этих значений
   корзина срывается на отдельный ряд. */
.hblogo{flex-direction:row;align-items:center;gap:calc(var(--u) * .26);--u:54px}
.hblogo-mark{flex:none;width:var(--u);height:var(--u);border-radius:calc(var(--u) * .22);
  background:var(--yellow);color:var(--ink);display:flex;align-items:center;justify-content:center;
  font-family:var(--head);font-weight:800;font-size:calc(var(--u) * .62);letter-spacing:-.02em;
  line-height:1}
.hblogo-txt{display:flex;flex-direction:column;align-items:flex-start;gap:calc(var(--u) * .07);min-width:0}
.hblogo-word{font-family:var(--head);font-weight:800;font-size:calc(var(--u) * .60);
  letter-spacing:.012em;line-height:1;color:#fff;white-space:nowrap}
/* У подписи есть нижний предел: на узких экранах доля от --u ушла бы
   в нечитаемые 8px, а строчка должна оставаться разборчивой. */
.hblogo-sub{font-size:max(10.5px, calc(var(--u) * .215));color:#b4b3ac;white-space:nowrap;
  font-weight:500;letter-spacing:.01em;line-height:1.2}

/* В выдвижном меню знак компактнее и без подписи — там он только
   опознавательный. Панель меню светлая, поэтому wordmark там тёмный:
   белый на белом просто пропадал. */
.mm-head .hblogo{--u:34px}
.mm-head .hblogo-word{color:var(--ink)}

/* Пороги найдены перебором: на каждой ширине --u увеличивали до тех пор,
   пока строка шапки не срывалась на лишний ряд. Самое узкое место — 768px,
   где рядом стоят поиск, телефон и корзина: там знак держится до 37px. */
@media (max-width:980px){.hblogo{--u:50px}}
@media (max-width:820px){.hblogo{--u:36px}}
/* На телефоне подпись убирается. Её минимальная читаемая ширина — около
   110px, и вместе со знаком строка шапки переставала помещаться в один ряд:
   корзина срывалась вниз. Лучше показать крупные и разборчивые «HB» и
   «HI-BLACK», чем втиснуть подпись кеглем, который всё равно не прочесть. */
@media (max-width:640px){.hblogo-sub{display:none}}
/* Размеры на узких экранах подобраны под худшее состояние корзины, а не под
   пустую: трёхзначный счётчик добавляет кнопке 12px, и на 320–360px ровно
   этих пикселей логотипу не хватало — знак обрезался по «K». Разница с
   прежними значениями около 6%, на глаз незаметна, зато знак цел в любом
   состоянии корзины. */
@media (max-width:380px){.hblogo{--u:30px}}
@media (max-width:355px){.hblogo{--u:27px}}
@media (max-width:330px){.hblogo{--u:21px}}

/* 17. Лёгкий тематический фон светлой зоны
   --------------------------------------------------------------------------
   Рисунок лежит фоном самого <main class="app">, а не отдельным слоем поверх
   содержимого. Так он физически не может перехватить нажатие и всегда
   печатается под контентом: карточки, формы, модальные окна и ссылки
   оказываются выше без единого нового z-index и без правки существующей
   раскладки. Шапка и подвал лежат вне .app, а тёмные блоки внутри (.hslider,
   .card, .buybar и прочие) закрашены своими непрозрачными фонами — паттерна
   там нет.
   Два тайла разного размера, 440 и 317 px. 317 — простое число, поэтому
   рисунки совпадают только через 139 480 px: очевидной однообразной плитки на
   экране не видно. Непрозрачность вшита в сами SVG (обводка 4,25% и 3,6%, точки
   5,1% и 4,25% от #2c3542) — цветных изображений, надписей и логотипов в тайлах
   нет, белый остаётся белым. */
.app{
  background-color:#fff;
  background-image:url(../img/pattern/tech-a.svg),url(../img/pattern/tech-b.svg);
  background-size:440px 440px,317px 317px;
  background-position:0 0,113px 57px;
  background-repeat:repeat,repeat;
}
@media (max-width:640px){
  /* На телефоне реже и тише: второй тайл снят совсем, первый разрежен, а
     поверх него лежит белая вуаль, гасящая рисунок ещё на 30%. */
  .app{
    background-image:linear-gradient(rgba(255,255,255,.3),rgba(255,255,255,.3)),url(../img/pattern/tech-a.svg);
    background-size:auto,408px 408px;
    background-position:0 0,0 0;
  }
}

/* 18. Канал связи в мессенджере MAX
   --------------------------------------------------------------------------
   Четыре точки: карточка товара, страница контактов, подвал и корзина. Адрес
   во всех четырёх приходит из одной константы messengers.max, в разметке не
   дублируется. Контейнеры намеренно собраны из уже существующих в системе
   приёмов: карточка товара повторяет жёлтую плашку .biz-note, контакты —
   обычную .ccard, подвал — строку .fcontact, корзина — тихую строку под
   итогом. Никаких плавающих виджетов и попапов. */

/* Карточка товара: заметный, но спокойный CTA на месте прежней строки
   «Задать вопрос о товаре». Жёлтая плашка — тот же приём, что у счёта
   юрлицам, поэтому блок читается как часть страницы, а не как реклама. */
/* Знак MAX. Файл официальный (assets/img/max-icon.svg), поэтому он нигде не
   перекрашивается и не обрезается — только масштабируется. Подложек под ним
   нет: у знака своя градиентная заливка, и любой квадрат или круг под ним
   спорил бы с ней. */
.maxico{flex:none;display:block;width:26px;height:26px;object-fit:contain}
.maxico-lg{width:42px;height:42px;margin-bottom:8px}

/* Подпись — синяя, в тон знаку. Цвет взят из его же градиента: так строка
   читается как канал MAX, а не как ещё одна кнопка магазина. */
:root{--max:#1962ff;--max-d:#7ba3ff}

/* Карточка товара: строка на месте прежнего «Задать вопрос о товаре».
   Намеренно без заливки и рамки — рядом уже стоят жёлтая кнопка корзины и
   плашка счёта юрлицам, третья плашка сделала бы колонку пёстрой. */
.ask-max{display:flex;align-items:center;gap:12px;padding:14px 2px 2px;
  border-top:1px solid var(--line);margin-top:2px}
.ask-max b{display:block;font-family:var(--head);font-weight:800;font-size:15px;
  letter-spacing:-.01em;color:var(--max)}
.ask-max span{display:block;color:var(--muted);font-size:12.5px;line-height:1.4}
.ask-max .ext{margin-left:auto;color:var(--max);opacity:.55}
.ask-max:hover b{text-decoration:underline}
.ask-max:hover .ext{opacity:.9}
.ask-max:focus-visible{outline:2px solid var(--max);outline-offset:3px;border-radius:4px}

/* Контакты: MAX стоит четвёртой карточкой рядом с телефоном, почтой и
   режимом работы — равноправный канал, а не приписка. */
.ccard-max b .maxlink{color:var(--max);line-height:1.15}
.ccard-max b a.maxlink:hover{text-decoration:underline}
.ccard-max b a.maxlink:focus-visible{outline:2px solid var(--max);outline-offset:3px}
.ccard-max .maxnote{font-size:13px;margin-top:2px}

/* Подвал: компактная строка в столбце контактов, доступна со всех страниц.
   На тёмном фоне синий берём светлее — иначе подпись теряет контраст. */
.fmax{display:inline-flex;align-items:center;gap:10px;color:var(--max-d);font-size:17px;
  width:fit-content;padding:2px 0;transition:color .16s}
.fmax:hover{color:#a9c4ff}
.fmax:focus-visible{outline:2px solid var(--max-d);outline-offset:3px;border-radius:4px}

/* Корзина: тихая строка под итогом, отделённая линией от суммы заказа. */
.maxhelp{display:flex;align-items:center;gap:10px;margin-top:14px;padding-top:14px;
  border-top:1px solid var(--line);color:var(--max);font-size:14px;transition:color .16s}
.maxhelp:hover{text-decoration:underline}
.maxhelp:focus-visible{outline:2px solid var(--max);outline-offset:2px;border-radius:4px}

/* Состояние «адреса ещё нет». Пока messengers.max.confirmed !== true или URL
   не прошёл проверку, сборка выдаёт те же четыре блока, но как span с
   aria-disabled: без href, без перехода и без внешней стрелки. Знак и подпись
   остаются на месте для согласования, однако элемент не притворяется рабочим —
   курсор обычный, подчёркивания по наведению нет, а короткая подпись прямо
   говорит, что ссылка появится позже. Когда адрес проставят, те же самые
   классы вернутся на <a target="_blank"> — отдельной вёрстки не нужно. */
.is-off{cursor:default}
.is-off:hover,.is-off:hover b{text-decoration:none}
.maxnote{font-style:normal;font-weight:400;font-family:var(--body);font-size:12px;
  line-height:1.35;letter-spacing:0;color:var(--muted)}
.fmax .maxnote{flex:0 0 100%;box-sizing:border-box;padding-left:36px;color:#8d8b84}
.fmax.is-off{flex-wrap:wrap}
.maxhelp .maxnote{flex:0 0 100%;box-sizing:border-box;padding-left:36px;margin-top:2px}
.maxhelp.is-off{flex-wrap:wrap;align-items:flex-start;color:var(--max)}

@media (max-width:640px){
  .ask-max .ext{display:none}
  .fmax{font-size:16px}
}

/* 18б. Выбор цвета и честное состояние отзывов
   --------------------------------------------------------------------------
   Пометок «ДЕМО» здесь больше нет: импортированные позиции — настоящие
   товары поставщика, и служебная плашка над ними вводила в заблуждение.
   Вместо неё два блока, которых карточке не хватало: переключатель цвета
   и честный пустой блок отзывов.

   Переключатель цвета живёт в левой колонке под галереей, то есть до
   кнопки покупки: цвет выбирают раньше, чем количество. На телефоне
   колонки складываются в один столбец, и порядок сохраняется сам.
*/
/* Отзывов нет — так и написано. Пустые звёзды рядом с нулём читаются как
   «оценили на ноль», поэтому в этом состоянии звёзд нет вовсе. */
.rate-none a,.crate-none a{color:var(--muted);border-bottom:1px dashed var(--muted2)}
.rate-none a:hover,.crate-none a:hover{color:var(--ink)}
.rev-sum-empty{text-align:left}
.rev-none{display:flex;flex-direction:column;gap:8px;align-items:flex-start;margin-bottom:16px}
.rev-none svg{color:var(--muted2)}
.rev-none b{font-family:var(--head);font-weight:800;font-size:20px;letter-spacing:-.02em}
.rev-none span{font-size:13.5px;color:var(--muted);line-height:1.5}

/* Оценка в форме — настоящие переключатели, а не картинка со звёздами:
   прежние звёзды выглядели кликабельными, но ничего не выбирали. */
.rev-form .frate .fstar{position:relative;cursor:pointer}
.rev-form .frate .fstar input{position:absolute;opacity:0;width:100%;height:100%;margin:0;cursor:pointer}
.rev-form .frate .fstar span{display:inline-flex;align-items:center;justify-content:center;
  width:34px;height:34px;border:1px solid var(--line2);border-radius:9px;background:#fff;
  font-family:var(--head);font-weight:700;font-size:14px}
.rev-form .frate .fstar input:checked+span{border-color:var(--yellow2);background:var(--yellow,#ffd84d);color:var(--ink)}
.rev-form .frate .fstar input:focus-visible+span{outline:2px solid var(--ink);outline-offset:2px}
/*
  Оценка обязательна и заранее не выбрана. Подпись и подсказка стоят
  постоянно — по пустой строке переключателей иначе не понять, что это
  вообще поле и что его надо заполнить.
*/
.rev-form .frate .flabel{font-family:var(--head);font-weight:700;font-size:13px;color:var(--ink2)}
.rev-form .frate .fhint{font-size:12px;color:var(--muted)}
/* Пропущенную оценку показываем на самом поле, а не только строкой
   внизу формы: до неё ещё надо долистать. */
.rev-form .frate.bad .fstar span{border-color:var(--red)}
.rev-form .frate.bad .flabel,.rev-form .frate.bad .fhint{color:var(--red)}
@media (max-width:640px){
  .rev-form .frate{flex-wrap:wrap;gap:8px}
  .rev-form .frate .flabel{width:100%}
  .rev-form .frate .fhint{width:100%}
}
/* Ответ формы. Он появляется только после настоящей попытки отправки и
   говорит то, что произошло на самом деле. */
.rev-msg{margin-top:12px;padding:10px 12px;border-radius:10px;font-size:13.5px;line-height:1.45}
.rev-msg-ok{background:#f0fdf4;border:1px solid #bbf7d0;color:#14532d}
.rev-msg-bad{background:#fef2f2;border:1px solid #fecaca;color:#7f1d1d}
.rreply{margin-top:12px;padding:10px 12px;border-left:3px solid #ddd6fe;background:#fff;border-radius:0 10px 10px 0}
.rreply b{display:block;font-size:12.5px;color:#5b21b6;margin-bottom:3px}
.rreply p{margin:0;font-size:13.5px;color:var(--ink2)}
/* Описание поставщика отделено от собственного текста магазина. */
.supplier-desc{margin-top:12px;padding-top:12px;border-top:1px solid var(--line);color:var(--ink2);font-size:14px}

/* 19. Кнопка звонка: нажатие принадлежит ссылке
   --------------------------------------------------------------------------
   Правило намеренно стоит последним в файле и не заключено в медиазапрос:
   раньше оно жило внутри @media (max-width:700px), и на любой другой ширине
   getComputedStyle у иконки возвращал pointer-events: auto. Нажатие должно
   попадать в саму ссылку в любом окружении, поэтому !important и никаких
   условий. */
a.mphone > svg,
a.mphone > svg *,
a.mphone .ic,
a.mphone .ic *{pointer-events:none!important}

/* 20. Цена по запросу
   --------------------------------------------------------------------------
   У 972 позиций из 9 483 поставщик не передал цену — в выгрузке там −1.
   Ноль в ценнике читался бы как «бесплатно», поэтому цифры нет вовсе, а
   вместо кнопки покупки стоит запрос менеджеру. Размер шрифта меньше
   обычного ценника: это не сумма, и притворяться суммой не должно. */
.price-ask{font-size:17px;font-weight:600;color:var(--ink2);white-space:nowrap}
.oneclick-off{color:var(--ink3,#8b8b8b);cursor:default;text-decoration:none;border:0}
@media (max-width:700px){.price-ask{font-size:15px}}

/* 21. Картинка не загрузилась
   --------------------------------------------------------------------------
   Пустой прямоугольник вместо товара читается как поломка витрины, поэтому
   место картинки подписывается.

   Подпись при этом ровно одна и та же для двух разных причин быть не
   должна. «Фото не передано» — это утверждение о поставщике, и у
   HB-TK-8115BK оно попросту неверно: адрес снимка поставщик прислал,
   не загрузился он уже у нас (во фрейме превью чужие картинки
   блокируются). Поэтому здесь текст про загрузку, а «не передано»
   осталось только там, где фотографии у поставщика действительно нет. */
.hb-imgfail{position:relative;background:#f4f4f2;min-height:64px}
.hb-imgfail img[data-imgfail]{visibility:hidden}
.hb-imgfail::before{content:"Фото не загрузилось";position:absolute;inset:0;display:flex;
  align-items:center;justify-content:center;padding:6px;text-align:center;
  color:#8b8b8b;font-size:12px;line-height:1.3;pointer-events:none}

/* 22. Миниатюра из атласа
   --------------------------------------------------------------------------
   Там, где картинки поставщика во фрейме не грузятся, уменьшенные копии
   лежат внутри публикации — по сто сорок четыре штуки в одном файле.
   Ячейка показывается фоном со смещением: <img> так не умеет. Квадрат
   выбран не случайно — раскладка атласа квадратная, и при другом
   соотношении сторон ячейка «переехала» бы на соседнюю. */
.atimg{display:block;width:100%;aspect-ratio:1/1;background-repeat:no-repeat;background-color:#fff}
.cmedia .atimg{width:76%;height:76%}
/* Плитка раздела: ячейка атласа — квадрат, и в площадку под фото она
   должна вписываться по высоте, как вписывался прежний <img>. */
.tile .ph .atimg,.tile-s .ph .atimg{height:100%;width:auto;aspect-ratio:1/1}
.item .img .atimg{width:100%;height:auto}
/*
  Снимок из атласа показывается в своём размере — 240 пикселей, — а не
  растягивается на 520. Прежнее правило увеличивало ячейку в 2,2 раза, и
  фотография на карточке выглядела мыльной: подробностей в источнике
  ровно столько, сколько в нём есть, и растягивание их не добавляет.
  Площадка под фото при этом ниже, чтобы вокруг снимка не оставалось
  полупустой рамы.
*/
.gmain.has-atlas{height:420px}
.gmain .g-atlas-img{width:240px;height:240px;flex:0 0 auto;image-rendering:auto}
/* Оригинал поставщика лежит поверх ячейки атласа и закрывает её целиком.
   Не загрузился — сам себя убирает, и снова видно ячейку. */
.gmain .g-full{position:absolute;inset:18px;margin:auto;max-width:calc(100% - 36px);max-height:calc(100% - 36px);
  width:auto;height:auto;object-fit:contain;background:#fff}
@media (max-width:980px){.gmain .g-full{inset:14px;max-width:calc(100% - 28px);max-height:calc(100% - 28px)}}
@media (max-width:640px){.gmain .g-full{inset:10px;max-width:calc(100% - 20px);max-height:calc(100% - 20px)}}
/* Увеличение доступно и с клавиатуры: рамка фокуса обязана быть видна. */
.gmain{cursor:zoom-in}
.gmain:focus-visible{outline:2px solid var(--ink);outline-offset:3px}
.lightbox .lb-atlas{display:block;background-repeat:no-repeat;transform-origin:50% 50%;will-change:transform;cursor:zoom-in;
  background-color:#fff;border-radius:20px;padding:0;box-shadow:0 40px 100px rgba(0,0,0,.5)}
.lightbox .lb-note{position:absolute;left:0;right:0;bottom:76px;text-align:center;color:#e6e5df;font-size:13px;
  padding:0 24px;line-height:1.45}
@media (max-width:640px){
  .gmain.has-atlas{height:300px}
  .lightbox .lb-note{bottom:62px;font-size:12px;padding:0 12px}
}
.thumb .atimg,.var-img .atimg,.mini .img .atimg,.coi .atimg,.cmp .atimg{width:100%;height:auto}

/* Выбранный снимок показывается целиком, без режима масштабирования. */
.lightbox img,.lightbox img:active,.lightbox .lb-atlas{cursor:default;will-change:auto}
.lb-stage{touch-action:pan-y}

.compat-group + .compat-group { margin-top: 14px; }
.compat-group h4 { margin: 0 0 7px; font-size: 14px; }
.compat-group .tags { display: flex; flex-wrap: wrap; gap: 6px; }
.compat-group .chip { max-width: 100%; overflow-wrap: anywhere; }
.compat-brands{font-size:14px;color:var(--muted);line-height:1.5;margin:0 0 10px;overflow-wrap:anywhere}
.compat-more summary{display:flex;align-items:center;justify-content:space-between;gap:10px;cursor:pointer;font-size:14px;font-weight:600;list-style:none;min-height:36px;overflow-wrap:anywhere}
.compat-more summary::-webkit-details-marker{display:none}
.compat-more summary:focus-visible{outline:2px solid var(--yellow);outline-offset:4px;border-radius:4px}
.compat-more summary .ic{flex-shrink:0;transition:transform .15s}
.compat-hide{display:none}
.compat-more[open] .compat-show{display:none}
.compat-more[open] .compat-hide{display:inline}
.compat-more[open] summary .ic{transform:rotate(180deg)}
.compat-models{padding-top:14px}
.logistics{margin-top:28px;padding-top:24px;border-top:1px solid var(--line);min-width:0}
.logistics h3{font-size:20px;margin:0 0 8px}
.logistics-note{font-size:14px;line-height:1.5;color:var(--muted);margin:8px 0 16px;overflow-wrap:anywhere}
.logistics-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
.logistics-grid .spec-t{min-width:0}
@media(max-width:700px){.logistics-grid{grid-template-columns:minmax(0,1fr)}.logistics{margin-top:22px;padding-top:18px}}

/* CDEK checkout: city autocomplete, pickup point and confirmed quote. */
.cdek-box{margin-top:14px;padding:16px;border:1px solid var(--line);border-radius:14px;background:var(--soft,#f8f7f3);position:relative}
.cdek-box .fld{margin-top:0}
.cdek-box .fld+.fld{margin-top:12px}
.cdek-box select{height:48px;border:1px solid var(--line2);border-radius:12px;padding:0 42px 0 16px;font:inherit;font-size:14px;color:var(--ink);outline:0;background:#fff;width:100%;min-width:0}
.cdek-box select:focus{border-color:var(--ink)}
.cdek-city{position:relative}
.cdek-cities{position:absolute;z-index:15;left:0;right:0;top:100%;margin-top:4px;padding:6px;background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow-pop);max-height:270px;overflow:auto}
.cdek-cities:empty,.cdek-cities[hidden]{display:none}
.cdek-cities button{display:flex;align-items:baseline;gap:8px;width:100%;padding:10px;border:0;border-radius:8px;background:transparent;text-align:left;color:var(--ink);cursor:pointer}
.cdek-cities button:hover,.cdek-cities button:focus{background:var(--ytint,#fff8d8);outline:0}
.cdek-cities button b{font-size:14px}
.cdek-cities button span{font-size:12px;color:var(--muted)}
.cdek-result{display:flex;gap:9px;align-items:flex-start;margin-top:12px;padding:11px 12px;border-radius:10px;background:#fff;border:1px solid var(--line);font-size:13px;line-height:1.4}
.cdek-result svg{flex:0 0 auto;color:var(--green)}
.cdek-result div{display:flex;flex-direction:column;gap:2px}
.cdek-result b{font-size:16px;color:var(--ink)}
.cdek-result span{color:var(--muted)}
.cdek-result.bad{border-color:#e5b4b4;background:#fff5f5;color:var(--red)}
.cdek-note{margin:10px 0 0;color:var(--muted);font-size:12px;line-height:1.45}
@media(max-width:640px){.cdek-box{padding:13px}.cdek-cities button{flex-direction:column;gap:2px}}
