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

.vh{
  position:absolute; width:1px; height:1px; overflow:hidden;
  clip:rect(0 0 0 0); clip-path:inset(50%); white-space:nowrap;
}

/* ─────────────────────────────────────────────
   ПОИСК В ШАПКЕ СТРАНИЦЫ
   ───────────────────────────────────────────── */
.phero-shop .hero-search{
  display:grid;
  grid-template-columns:1fr auto;
  gap:12px;
  max-width:820px;
  margin-top:46px;
}
.hero-search input[type="search"]{
  width:100%;
  height:60px;
  padding:0 22px;
  border:1px solid rgba(255,255,255,0.22);
  border-radius:var(--r);
  background:rgba(255,255,255,0.05);
  font-family:var(--sans);
  font-size:16px;
  color:var(--tx-on-dark);
  transition:border-color .2s, background .2s;
  appearance:none;
}
.hero-search input::placeholder{ color:var(--tx-on-dark-mute); }
.hero-search input:hover{ border-color:rgba(255,255,255,0.34); }
.hero-search input:focus{
  outline:none;
  border-color:var(--bronze-lift);
  background:rgba(255,255,255,0.08);
}
.hero-search .btn{ height:60px; padding:0 34px; }
.hero-search-note{
  margin-top:14px;
  font-size:12.5px;
  color:var(--tx-on-dark-mute);
}

/* ─────────────────────────────────────────────
   РАЗДЕЛЫ КАТАЛОГА — крупные входы
   Та же сетка на линейках, что и «преимущества» на других страницах:
   ничего нового в языке сайта, просто ещё одно её применение.
   ───────────────────────────────────────────── */
.cat-grid{
  display:grid;
  grid-template-columns:repeat(5,1fr);
  gap:1px;
  background:var(--rule);
  border:1px solid var(--rule);
}
.cat-cell{
  display:flex;
  align-items:flex-start;
  gap:16px;
  width:100%;
  text-align:left;
  background:var(--paper);
  border:0;
  padding:24px 22px 26px;
  cursor:pointer;
  transition:background .3s ease;
}
.cat-cell:hover{ background:rgba(27,75,143,0.03); }
.cat-ic{
  flex:none;
  width:40px; height:40px;
  color:var(--blue);
  opacity:.85;
  transition:opacity .3s ease, transform .5s cubic-bezier(.2,.7,.3,1);
}
.cat-cell:hover .cat-ic{ opacity:1; transform:translateY(-2px); }
.cat-tx{ min-width:0; }
.cat-cell b{
  display:block;
  font-family:var(--serif);
  font-size:16.5px;
  font-weight:400;
  line-height:1.3;
  color:var(--tx-strong);
  overflow-wrap:anywhere;
}
.cat-tx > span{
  display:block;
  margin-top:9px;
  font-size:11px;
  letter-spacing:0.12em;
  text-transform:uppercase;
  color:var(--tx-mute);
  font-variant-numeric:tabular-nums;
}
.cat-cell.all b{ color:var(--blue); }

/* стрелка-уголок: у раздела есть что развернуть */
.cat-chev{
  position:absolute;
  right:18px; top:26px;
  width:7px; height:7px;
  border-right:1px solid var(--tx-mute);
  border-bottom:1px solid var(--tx-mute);
  transform:rotate(45deg);
  transition:transform .3s ease, border-color .3s ease;
}
.cat-cell{ position:relative; }
.cat-cell:hover .cat-chev{ border-color:var(--blue); }
.cat-cell[data-open="1"]{ background:var(--white); }
.cat-cell[data-open="1"] .cat-chev{ transform:rotate(-135deg); border-color:var(--blue); }
.cat-cell[data-open="1"] b{ color:var(--blue); }

/* ─────────────────────────────────────────────
   ПОДРАЗДЕЛЫ

   Панель занимает всю ширину сетки и встаёт после последнего элемента
   того ряда, где стоит раскрытый раздел, — тогда ряд не разрывается.
   ───────────────────────────────────────────── */
.cat-sub{
  grid-column:1 / -1;
  background:var(--white);
  padding:26px 28px 30px;
  animation:sub-in .3s ease both;
}
@keyframes sub-in{
  from{ opacity:0; transform:translateY(-6px); }
  to{ opacity:1; transform:none; }
}
.cat-sub-head{
  display:flex; align-items:baseline; justify-content:space-between;
  gap:20px; flex-wrap:wrap;
  padding-bottom:16px; margin-bottom:20px;
  border-bottom:1px solid var(--rule);
}
.cat-sub-head b{
  font-family:var(--serif); font-size:18px; font-weight:400;
  color:var(--tx-strong);
}
.sub-all{
  background:none; border:0; padding:0;
  font-family:var(--sans); font-size:11.5px; font-weight:600;
  letter-spacing:.12em; text-transform:uppercase;
  color:var(--blue); cursor:pointer;
}
.sub-all:hover{ color:var(--blue-lift); text-decoration:underline; text-underline-offset:4px; }

.cat-sub-grid{
  display:grid;
  grid-template-columns:repeat(auto-fill,minmax(215px,1fr));
  gap:2px;
}
.sub-cell{
  display:flex; align-items:center; gap:13px;
  width:100%; text-align:left;
  background:none; border:0;
  padding:12px 12px 12px 10px;
  border-radius:var(--r);
  cursor:pointer;
  transition:background .25s ease;
}
.sub-cell:hover{ background:var(--paper-alt); }
.sub-ic{
  flex:none; width:32px; height:32px;
  color:var(--blue); opacity:.75;
  transition:opacity .25s ease;
}
.sub-cell:hover .sub-ic{ opacity:1; }
.sub-tx{ min-width:0; }
.sub-tx b{
  display:block;
  font-family:var(--sans); font-size:13.5px; font-weight:500; line-height:1.32;
  color:var(--tx-strong);
  overflow-wrap:anywhere;
}
.sub-tx > span{
  display:block; margin-top:3px;
  font-size:11px; color:var(--tx-mute);
  font-variant-numeric:tabular-nums;
}

/* ─────────────────────────────────────────────
   СЕТКА: РАЗДЕЛЫ СЛЕВА, ТОВАРЫ СПРАВА
   ───────────────────────────────────────────── */
.shop-grid{
  display:grid;
  grid-template-columns:262px 1fr;
  gap:52px;
  align-items:start;
}
.shop-side-in{ position:sticky; top:130px; }

/* Поиск в колонке разделов — компактнее, чем в шапке: он там второй,
   а не главный. */
.side-search{ margin-bottom:22px; }
.side-search input[type="search"]{
  width:100%;
  height:44px;
  padding:0 14px 0 36px;
  border:1px solid var(--rule-strong);
  border-radius:var(--r);
  background:var(--white)
    url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' fill='none' stroke='%238A959C' stroke-width='1.6'><circle cx='6' cy='6' r='4.6'/><path d='M9.6 9.6L13 13'/></svg>")
    no-repeat left 13px center;
  font-family:var(--sans);
  font-size:13.5px;
  color:var(--tx-strong);
  transition:border-color .2s;
  appearance:none;
}
.side-search input::placeholder{ color:var(--tx-mute); }
.side-search input:focus{ outline:none; border-color:var(--blue); }

/* ─────────────────────────────────────────────
   ПОДСКАЗКИ ПРИ НАБОРЕ

   Панель под полем поиска. Лежит внутри <form>, поэтому обе — и в
   шапке, и в колонке разделов — позиционируются относительно своего
   поля и не разъезжаются при прокрутке.

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

   display специально не задаём — иначе перестанет работать атрибут
   hidden, которым панель и закрывается.
   ───────────────────────────────────────────── */
.ac{
  position:absolute; z-index:700;    /* ниже модальных окон, выше шапки */
  max-height:min(58vh,460px); overflow-y:auto;
  background:var(--white); border:1px solid var(--rule-strong);
  border-radius:var(--r);
  box-shadow:0 18px 40px rgba(10,21,32,.13);
}

.ac-row{
  display:grid; grid-template-columns:44px 1fr auto; align-items:center;
  gap:12px; width:100%; padding:9px 12px;
  border:0; border-bottom:1px solid var(--rule); background:none;
  text-align:left; cursor:pointer; font-family:var(--sans);
}
.ac-row:last-of-type{ border-bottom:0; }
.ac-row:hover,.ac-row.on{ background:var(--paper-alt); }
.ac-fig{
  width:44px; height:44px; border:1px solid var(--rule);
  background:var(--white); overflow:hidden;
}
.ac-fig img{ width:100%; height:100%; object-fit:contain; padding:3px; }
.ac-txt{ min-width:0; }                     /* иначе длинное имя растянет сетку */
.ac-nm{
  display:block; font-size:13.5px; line-height:1.35; color:var(--tx-strong);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.ac-meta{ display:block; font-size:11.5px; color:var(--tx-mute); margin-top:2px; }
.ac-pr{
  font-size:13.5px; color:var(--tx-strong); white-space:nowrap;
  font-variant-numeric:tabular-nums;
}
/* Совпавший кусок — фоном, не цветом текста: цвет пришлось бы делать
   контрастным, и строка распалась бы на разноцветные куски. */
.ac mark{ background:rgba(27,75,143,.13); color:inherit; }
.ac-all{
  display:block; width:100%; padding:11px 12px;
  border:0; border-top:1px solid var(--rule); background:var(--paper-alt);
  font-family:var(--sans); font-size:12.5px; color:var(--blue);
  text-align:left; cursor:pointer;
}
.ac-all:hover{ text-decoration:underline; }

.shop-cats{
  border-top:1px solid var(--rule);
  max-height:52vh;
  overflow-y:auto;
  padding-right:6px;
}
.shop-cats::-webkit-scrollbar{ width:3px; }
.shop-cats::-webkit-scrollbar-thumb{ background:var(--rule-strong); }

.shop-cat{
  display:flex;
  justify-content:space-between;
  gap:10px;
  align-items:baseline;
  padding:9px 0;
  border-bottom:1px solid var(--rule);
  font-size:13.5px;
  color:var(--tx-body);
  cursor:pointer;
  transition:color .18s;
  width:100%;
  text-align:left;
  background:none;
  border-left:0; border-right:0; border-top:0;
}
.shop-cat:hover{ color:var(--tx-strong); }
.shop-cat.on{ color:var(--blue); font-weight:600; }
.shop-cat .n{ font-size:11.5px; color:var(--tx-mute); font-variant-numeric:tabular-nums; flex:none; }
.shop-cat.lvl1{ padding-left:14px; font-size:13px; }
.shop-cat.lvl2{ padding-left:28px; font-size:12.5px; }
.shop-cat.root{ font-family:var(--serif); font-size:15.5px; color:var(--tx-strong); }

.shop-facets{ margin-top:30px; }
.facet{ border-top:1px solid var(--rule); padding:16px 0 4px; }
.facet h3{
  font-family:var(--sans);
  font-size:11px; font-weight:600;
  letter-spacing:.16em; text-transform:uppercase;
  color:var(--tx-mute);
  margin-bottom:12px;
}
.facet label{
  display:flex; align-items:baseline; gap:9px;
  font-size:13px; padding:4px 0; cursor:pointer;
}
.facet input{ flex:none; accent-color:var(--blue); margin:0; }
.facet .n{ margin-left:auto; font-size:11px; color:var(--tx-mute); font-variant-numeric:tabular-nums; }
/* Выбранный бренд: имя чуть плотнее, а вместо счётчика — «снять».
   Цифра выбранному не нужна — она и так равна тому, что на экране. */
.facet label.picked{ font-weight:600; }
.facet .n-off{
  font-size:11px; letter-spacing:.06em; text-transform:uppercase;
  color:var(--blue); font-weight:500;
}
.facet label.picked:hover .n-off{ text-decoration:underline; text-underline-offset:2px; }
.facet-more{
  font-size:12px; color:var(--blue); background:none; border:0;
  padding:6px 0; cursor:pointer;
}
.facet-price{ display:flex; gap:8px; align-items:center; }
.facet-price input{
  /* flex:1 1 0 вместе с min-width:0 — обязательная пара.
     С width:100% каждое поле занимало всю ширину колонки, а сжаться не
     могло: у элемента внутри flex по умолчанию min-width:auto, то есть
     «не уже собственного содержимого». Два поля по 262px в колонке
     шириной 262px — и второе уезжало прямо на карточки товаров. */
  flex:1 1 0;
  min-width:0;
  height:38px; padding:0 10px;
  border:1px solid var(--rule-strong); border-radius:var(--r);
  background:var(--white); font-family:var(--sans); font-size:13px;
  color:var(--tx-strong);
}
.facet-price input:focus{ outline:none; border-color:var(--blue); }

/* Стрелки-крутилки у полей с числами съедают и без того узкую колонку,
   а цену всё равно набирают с клавиатуры. */
.facet-price input::-webkit-outer-spin-button,
.facet-price input::-webkit-inner-spin-button{ -webkit-appearance:none; margin:0; }
.facet-price input[type=number]{ -moz-appearance:textfield; appearance:textfield; }

/* Страховка для всей колонки фильтров: длинное название бренда или
   значения характеристики не должно распирать её наружу. */
.shop-side,.shop-side-in,.shop-facets,.facet{ min-width:0; }
.facet label{ overflow-wrap:anywhere; }

/* ─────────────────────────────────────────────
   ПАНЕЛЬ НАД СПИСКОМ
   ───────────────────────────────────────────── */
.shop-bar{
  display:flex; align-items:center; justify-content:space-between;
  gap:20px; flex-wrap:wrap;
  padding-bottom:16px; margin-bottom:22px;
  border-bottom:1px solid var(--rule);
}
.shop-crumbs{ font-size:13px; color:var(--tx-mute); }
.shop-crumbs b{ color:var(--tx-strong); font-weight:600; }
.shop-tools{ display:flex; gap:10px; align-items:center; }
.shop-tools select{
  height:44px; padding:0 34px 0 14px;
  border:1px solid var(--rule-strong); border-radius:var(--r);
  background:var(--white)
    url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6'><path d='M0 0l5 6 5-6z' fill='%238A959C'/></svg>")
    no-repeat right 13px center;
  font-family:var(--sans); font-size:13px; color:var(--tx-strong);
  appearance:none; cursor:pointer;
}
.shop-tools select:focus{ outline:none; border-color:var(--blue); }
.shop-side-toggle{ display:none; }

.shop-chips{ display:flex; flex-wrap:wrap; gap:8px; margin-bottom:22px; }
.shop-chips:empty{ margin-bottom:0; }
.chip{
  display:inline-flex; align-items:center; gap:8px;
  padding:6px 12px;
  border:1px solid var(--rule-strong); border-radius:var(--r);
  background:var(--white);
  font-size:12px; color:var(--tx-body); cursor:pointer;
}
.chip:hover{ border-color:var(--ink); color:var(--tx-strong); }
.chip b{ font-weight:600; color:var(--tx-strong); }
.chip::after{ content:"\00d7"; font-size:14px; color:var(--tx-mute); }

/* Плашка сезонной подборки. Отличается от остальных намеренно: прочие
   фильтры человек поставил сам и помнит о них, а подборку наложила
   ссылка с главной — про неё он не знает, пока не увидит. */
.chip-set{
  border-color:var(--bronze);
  background:var(--white);
  color:var(--bronze-ink);
}
.chip-set:hover{ border-color:var(--bronze-ink); color:var(--bronze-ink); }
.chip-set b{ color:var(--bronze-ink); }
.chip-set::after{ color:var(--bronze); }

/* Пояснение под плашкой — одной строкой, чтобы человек понял, по
   какому признаку собран список, а не гадал, куда делся каталог. */
.shop-set-note{
  margin:10px 0 0;
  font-size:13px;
  line-height:1.5;
  color:var(--tx-mute);
  max-width:70ch;
}

/* ─────────────────────────────────────────────
   КАРТОЧКИ ТОВАРОВ

   Раньше это были залитые белые коробки со сплошной сеткой-швом,
   тенью при наведении и цветной плашкой статуса — единственное такое
   место на всём сайте, поэтому они и лезли в глаза. Здесь тот же
   приём, что в портфолио: снимок, тонкая линейка, под ней текст.
   Ни заливки, ни тени, статус — строчка капителью с точкой.
   ───────────────────────────────────────────── */
.shop-list{
  display:grid;
  grid-template-columns:repeat(auto-fill,minmax(232px,1fr));
  gap:36px 28px;
}
/* Карточка — ссылка (у неё есть адрес, её можно открыть в новой вкладке
   и по ней ходит поисковик), поэтому гасим подчёркивание и наследуем
   цвет: выглядеть она должна ровно как раньше. */
.prod{
  display:flex;
  flex-direction:column;
  background:none;
  border:0;
  padding:0;
  text-align:left;
  cursor:pointer;
  color:inherit;
  text-decoration:none;
}
.prod-fig{
  position:relative;
  aspect-ratio:1/1;
  margin-bottom:0;
  background:var(--white);
  border:1px solid var(--rule);
  overflow:hidden;
}
.sec-alt .prod-fig{ background:var(--white); }
.prod-fig img{
  position:absolute; inset:0;
  width:100%; height:100%;
  object-fit:contain;
  padding:16px;
  transition:transform .7s cubic-bezier(.2,.7,.3,1);
}
.prod:hover .prod-fig img{ transform:scale(1.045); }

.prod-brand{
  display:block;
  margin-top:16px;
  font-size:10.5px;
  letter-spacing:0.14em;
  text-transform:uppercase;
  color:var(--tx-mute);
}
.prod-name{
  font-family:var(--serif);
  font-size:15.5px;
  line-height:1.36;
  color:var(--tx-strong);
  margin-top:7px;
  margin-bottom:auto;
  display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical;
  overflow:hidden;
  transition:color .2s;
}
.prod:hover .prod-name{ color:var(--blue); }
.prod-btm{
  margin-top:14px;
  padding-top:13px;
  border-top:1px solid var(--rule);
}
.prod-price{
  display:block;
  font-family:var(--serif);
  font-size:19px;
  line-height:1.2;
  color:var(--tx-strong);
  font-variant-numeric:tabular-nums;
}
.prod-sku{
  display:block;
  margin-top:4px;
  font-size:11px;
  color:var(--tx-mute);
  font-variant-numeric:tabular-nums;
}

/* Статус — строчка, а не плашка. Точка слева несёт цвет,
   и этого достаточно, чтобы «в корзину» отличалось от «по заявке». */
.prod-tag{
  display:flex;
  align-items:center;
  gap:7px;
  margin-top:11px;
  font-size:10.5px;
  font-weight:600;
  letter-spacing:0.12em;
  text-transform:uppercase;
  color:var(--tx-mute);
}
.prod-tag::before{
  content:"";
  width:5px; height:5px;
  border-radius:50%;
  background:currentColor;
  flex:none;
}
.tag-buy{ color:var(--blue); }
/* Оплата по счёту — бронзой, а не синим: синий на этой странице значит
   «можно нажать и заплатить», и красить им противоположный случай
   значило бы стирать единственное различие, ради которого ярлык и
   существует. */
.tag-bill{ color:var(--bronze-ink); }
.tag-ask{ color:var(--tx-body); }
.tag-out{ color:var(--tx-mute); }
.tag-out::before{ background:none; box-shadow:inset 0 0 0 1px var(--rule-strong); }

.shop-empty{
  grid-column:1 / -1;
  border:1px solid var(--rule);
  background:var(--white);
  padding:70px 30px;
  text-align:center;
}
.shop-empty h3{ font-size:22px; margin-bottom:10px; }
.shop-empty p{ font-size:14.5px; color:var(--tx-body); max-width:46ch; margin:0 auto 22px; }

.shop-more{ margin-top:32px; text-align:center; }
.shop-count{ font-size:12.5px; color:var(--tx-mute); margin-top:14px; }

/* ─────────────────────────────────────────────
   КАРТОЧКА ТОВАРА (СЛОЙ)
   ───────────────────────────────────────────── */
.modal-item,.modal-cart{ position:relative; display:block; max-width:1000px; }
.modal-cart{ max-width:640px; }

.item-body{ display:grid; grid-template-columns:1fr 1fr; }
.item-gal{ background:var(--paper-alt); padding:34px; }
.item-shot{
  position:relative; aspect-ratio:1/1; background:var(--white);
  overflow:hidden; margin-bottom:12px;
}
.item-shot img{ position:absolute; inset:0; width:100%; height:100%; object-fit:contain; padding:16px; }
.item-thumbs{ display:flex; gap:8px; flex-wrap:wrap; }
.item-thumb{
  width:56px; height:56px; padding:0; border:1px solid var(--rule);
  background:var(--white); cursor:pointer;
}
.item-thumb.on{ border-color:var(--blue); }
.item-thumb img{ width:100%; height:100%; object-fit:contain; padding:4px; }

.item-info{ padding:40px 42px; overflow-y:auto; max-height:86vh; }
.item-info h3{ font-size:clamp(20px,2.2vw,27px); line-height:1.24; margin:10px 0 14px; }
.item-meta{ font-size:12px; color:var(--tx-mute); }
.item-price{
  font-family:var(--serif); font-size:32px; color:var(--tx-strong);
  font-variant-numeric:tabular-nums;
  margin:20px 0 6px;
}
.item-intro{ font-size:14.5px; line-height:1.6; margin:16px 0 24px; }
.item-actions{ display:flex; gap:10px; flex-wrap:wrap; align-items:center; margin-bottom:26px; }
/* Подпись под кнопкой у позиций без онлайн-оплаты. Занимает всю
   ширину ряда, чтобы встать под кнопкой, а не рядом с ней: сбоку она
   выглядела бы примечанием к счётчику количества. */
.item-hint{
  flex:1 0 100%; margin:2px 0 0;
  font-size:12.5px; line-height:1.5; color:var(--tx-mute);
}
.item-qty{ display:flex; align-items:center; border:1px solid var(--rule-strong); border-radius:var(--r); }
.item-qty button{
  width:44px; height:52px; border:0; background:none; cursor:pointer;
  font-size:17px; color:var(--tx-body);
}
/* Заливка задана явно. Без неё поле берёт цвет от браузера, и при
   color-scheme: dark это серый прямоугольник посреди карточки —
   единственное пятно чужого оттенка на всей странице. */
.item-qty input{
  width:46px; height:52px; border:0; text-align:center;
  background:transparent;
  font-family:var(--sans); font-size:15px; color:var(--tx-strong);
  font-variant-numeric:tabular-nums;
}
.item-qty input:focus{ outline:none; }
/* Выбор размера. Кнопки нарочно тихие — рамка в волос и никакой
   заливки: в ряду из тридцати трёх переходников любая заливка
   превращает карточку в мозаику. Выбранный отмечен синей рамкой, как
   и активная миниатюра выше, — один язык на всю карточку.

   Приглушённые — те, которых нет у поставщика. Одного цвета для этого
   мало: полагаться на него нельзя, поэтому у таких кнопок ещё и
   пунктирная рамка, всплывающая подсказка и слово «под заказ» в
   разметке для тех, кто слушает страницу голосом. */
.item-vars{ margin:22px 0 26px; }
.item-vars-t{
  font-size:11px; letter-spacing:.14em; text-transform:uppercase;
  color:var(--tx-mute); margin-bottom:10px;
}
.v-row{ display:flex; flex-wrap:wrap; gap:8px; }
.v-opt{
  min-width:64px; padding:9px 13px; border:1px solid var(--rule-strong);
  border-radius:var(--r); background:var(--white); cursor:pointer;
  font-family:var(--sans); font-size:13.5px; color:var(--tx-body);
  font-variant-numeric:tabular-nums; white-space:nowrap;
  transition:border-color .15s, color .15s;
  /* Высота задана явно: 20 + 9 + 9 + рамка = 40. От неё считается
     обрезка длинного ряда на телефоне, и без фиксированной высоты
     строки третий ряд кнопок резался бы пополам. */
  line-height:20px;
}
.v-opt:hover{ border-color:var(--blue); color:var(--tx-strong); }
.v-opt.on{
  border-color:var(--blue); color:var(--tx-strong);
  box-shadow:inset 0 0 0 1px var(--blue);
}
.v-opt.v-out{ border-style:dashed; color:var(--tx-mute); }
.v-opt.v-out.on{ color:var(--tx-strong); }
/* Ряд с длинными подписями — столбиком.

   Кнопки размеров («63 мм») в строку ложатся хорошо. Подписи реагентов
   («Calcium Hardness N°1, Кальциевая жесткость») в строку не ложатся
   никак: получается лесенка из кнопок разной ширины, по которой глаз не
   может идти сверху вниз. Столбик читается как список, чем он и
   является. */
.v-row-long{ display:block; }
.v-row-long .v-opt{
  display:block;
  width:100%;
  text-align:left;
  white-space:normal;
  line-height:1.4;
  padding:10px 13px;
}
.v-row-long .v-opt + .v-opt{ margin-top:6px; }
/* Латинское обозначение реагента — то, что написано на блистере, и
   искать глазами будут именно его. Отделяем от русской расшифровки. */
.v-row-long .v-opt b{ font-weight:600; color:var(--tx-strong); }

.item-vars-n{ font-size:12px; color:var(--tx-mute); margin-top:9px; }
.v-more{
  display:none; margin-top:9px; padding:0; border:0; background:none;
  cursor:pointer; font-family:var(--sans); font-size:12.5px;
  color:var(--blue); border-bottom:1px solid currentColor;
}

.item-specs{ width:100%; border-collapse:collapse; font-size:13.5px; }
.item-specs th,.item-specs td{
  text-align:left; padding:9px 0; border-bottom:1px solid var(--rule);
  vertical-align:top;
}
.item-specs th{ font-weight:400; color:var(--tx-mute); width:46%; padding-right:16px; }
.item-specs td{ color:var(--tx-strong); }

/* ─────────────────────────────────────────────
   КОРЗИНА
   ───────────────────────────────────────────── */
.cart-body{ padding:44px 46px; max-height:88vh; overflow-y:auto; }
.cart-body h3{ font-size:26px; margin-bottom:22px; }
.cart-line{
  display:grid; grid-template-columns:1fr auto auto;
  gap:14px; align-items:baseline;
  padding:14px 0; border-bottom:1px solid var(--rule);
  font-size:14px;
}
.cart-line .nm{ color:var(--tx-strong); }
.cart-line .sk{ display:block; font-size:11px; color:var(--tx-mute); }
.cart-line .pr{ font-variant-numeric:tabular-nums; white-space:nowrap; }
.cart-line .rm{ background:none; border:0; color:var(--tx-mute); cursor:pointer; font-size:15px; }
.cart-line .rm:hover{ color:var(--blue); }
.cart-sum{
  display:flex; justify-content:space-between; align-items:baseline;
  padding:18px 0 6px; font-family:var(--serif); font-size:20px; color:var(--tx-strong);
}
.cart-sum span:last-child{ font-variant-numeric:tabular-nums; }

/* Доставка — строка того же строя, что «Итого», но тише: это не то, за
   что человек платит прямо сейчас, а условие. Заканчивает блок
   отбивкой, которую раньше давал сам .cart-sum. */
.cart-dlv{
  display:flex; justify-content:space-between; align-items:baseline;
  padding-bottom:20px; font-size:14px; color:var(--tx-body);
}
.cart-dlv span:last-child{ font-variant-numeric:tabular-nums; }
.cart-dlv .dlv-free{ color:var(--blue); }
.cart-dlv-n{
  font-size:12px; line-height:1.5; color:var(--tx-mute);
  margin:-12px 0 20px;
}
.cart-note{ font-size:12px; color:var(--tx-mute); margin-top:14px; }
/* Сообщение о возврате с оплаты стоит ПЕРВЫМ в корзине и обязано
   читаться сразу: человек только что вернулся со страницы банка и
   ищет глазами ответ на один вопрос — списали или нет. Поэтому не
   мелкий серый шрифт остальных примечаний, а врезка в цвете бронзы. */
.cart-note-pay{
  font-size:13px; line-height:1.55; color:var(--tx-body);
  margin:0 0 20px; padding:13px 16px;
  border:1px solid var(--rule-strong);
  border-left:2px solid var(--bronze);
  border-radius:var(--r);
  background:var(--paper-alt);
}
.cart-term{ font-size:12px; line-height:1.5; color:var(--tx-mute); margin-top:10px; }
.cart-empty{ font-size:14.5px; color:var(--tx-body); padding:10px 0 24px; }

/* Кнопка корзины садится над плавающей «Оставить заявку»: обе живут в
   правом нижнем углу, и наезжать друг на друга им нельзя. */
/* Корзина использует общие стили плавающих кнопок из style.css
   (.fab-wrap / .fab / .fab-tag / .fab-cnt) — своих здесь не осталось.
   Раньше тут лежала отдельная широкая кнопка «Корзина 3», и она жила
   своей жизнью: свой размер, свой отступ, свой шрифт. Две плавающие
   кнопки на одной странице должны быть одинаковыми, иначе угол экрана
   выглядит собранным из разных сайтов. */

/* ─────────────────────────────────────────────
   АДАПТИВ
   ───────────────────────────────────────────── */
@media (max-width:1180px){
  .shop-grid{ grid-template-columns:230px 1fr; gap:36px; }
}
@media (max-width:980px){
  .shop-grid{ grid-template-columns:1fr; }
  .shop-side{
    display:none;
    border:1px solid var(--rule); background:var(--white);
    padding:20px 22px; margin-bottom:26px;
  }
  .shop-side.open{ display:block; }
  .shop-side-in{ position:static; }
  .shop-cats{ max-height:44vh; }
  .shop-side-toggle{ display:inline-flex; }
  .item-body{ grid-template-columns:1fr; }
  .item-gal{ padding:24px; }
  .item-info{ padding:28px 26px 34px; max-height:none; }
  /* Ниже этой ширины карточка становится одноколоночной и прокручивается
     всей страницей — вот тут длинный размерный ряд и превращается в
     экран кнопок между ценой и описанием. Три ряда, остальное по
     кнопке. На широком экране ряд виден целиком, и .v-clamp ничего не
     делает. */
  /* Ровно три ряда: 3 кнопки по 40 плюс два просвета по 8. */
  .v-row.v-clamp{ max-height:136px; overflow:hidden; }
  .v-more{ display:inline-block; }
}
@media (max-width:640px){
  .shop-search{ grid-template-columns:1fr; }
  .shop-search .btn{ width:100%; }
  .shop-list{ grid-template-columns:repeat(auto-fill,minmax(148px,1fr)); gap:28px 18px; }
  .prod-name{ font-size:13.5px; }
  .prod-price{ font-size:17px; }
  .cart-body{ padding:32px 22px; }
}

.fld-opt{ font-weight:400; letter-spacing:0; text-transform:none; color:var(--tx-mute); }
.cart-pay-note{
  font-size:12.5px; color:var(--tx-body);
  background:var(--blue-pale); color:var(--blue);
  padding:11px 14px; border-radius:var(--r); margin-bottom:18px;
}

/* Приписка к «Заказ принят»: кнопка обещала оплату картой, а страницы
   банка не будет. Тоном это не тревога — заказ-то принят, — но и не
   мелкий шрифт: человек ждал оплаты и должен понять, что её не было. */
.order-ok-note{
  margin-top:14px; font-size:13px; line-height:1.55;
  color:var(--tx-body); max-width:42ch;
}

/* ─────────────────────────────────────────────
   ВЫ СМОТРЕЛИ
   Одна строка, не сетка: это подсказка вернуться, а не второй каталог.
   ───────────────────────────────────────────── */
.recent-list{
  grid-template-columns:repeat(auto-fill,minmax(178px,1fr));
  gap:28px 24px;
}
.recent-list .prod-name{ -webkit-line-clamp:2; font-size:14.5px; }
.recent-list .prod-price{ font-size:17px; }
.recent-list .prod-tag{ display:none; }

@media (max-width:1180px){
  .cat-grid{ grid-template-columns:repeat(3,1fr); }
}
@media (max-width:820px){
  .phero-shop .hero-search{ grid-template-columns:1fr; }
  .hero-search .btn{ width:100%; }
  .cat-grid{ grid-template-columns:repeat(2,1fr); }
  .cat-cell{ padding:18px 16px 20px; gap:12px; }
  .cat-ic{ width:32px; height:32px; }
  .cat-cell b{ font-size:15px; }
  .cat-chev{ right:12px; top:21px; }
  .cat-sub{ padding:20px 18px 24px; }
  .cat-sub-grid{ grid-template-columns:1fr; }
}

/* Пункты списка из описания: то, что не разложилось на «свойство —
   значение». У наборов это состав, у оборудования — что оно умеет. */
.item-feats{
  margin:0 0 24px;
  padding:0;
  list-style:none;
}
.item-feats li{
  position:relative;
  padding-left:18px;
  font-size:14px;
  line-height:1.55;
  color:var(--tx-body);
}
.item-feats li + li{ margin-top:7px; }
.item-feats li::before{
  content:"";
  position:absolute;
  left:0; top:9px;
  width:5px; height:5px;
  border-radius:50%;
  background:var(--bronze);
}

/* ─────────────────────────────────────────────
   ЗОНА ДОСТАВКИ
   Подтверждение — одной строкой, отказ — блоком с контактами: человека
   нельзя оставить перед закрытой дверью без ручки.
   ───────────────────────────────────────────── */
.dlv-ok{
  margin:-8px 0 18px;
  font-size:12.5px;
  color:var(--blue);
}
.dlv-ok::before{
  content:"";
  display:inline-block;
  width:5px; height:5px;
  border-radius:50%;
  background:var(--blue);
  margin-right:8px;
  vertical-align:middle;
}
.dlv-no{
  margin:-4px 0 20px;
  padding:16px 18px 18px;
  border:1px solid var(--rule-strong);
  border-left:2px solid var(--bronze);
  border-radius:var(--r);
  background:var(--paper-alt);
}
.dlv-no b{
  display:block;
  font-family:var(--serif);
  font-size:16px; font-weight:400;
  color:var(--tx-strong);
  margin-bottom:8px;
}
.dlv-no p{ font-size:13px; line-height:1.55; color:var(--tx-body); }
.dlv-links{ display:flex; flex-wrap:wrap; gap:8px 18px; margin-top:12px; }
.dlv-links a{
  font-size:12px; font-weight:600;
  letter-spacing:.08em; text-transform:uppercase;
  color:var(--blue);
  border-bottom:1px solid transparent;
  transition:border-color .2s;
}
.dlv-links a:hover{ border-bottom-color:var(--blue); }

/* Вне зоны доставки строка про оплату картой не показывается. */
.cart-lines.no-pay .cart-pay-note,
#cart-lines.no-pay .cart-pay-note{ display:none; }

/* ═══════════════════════════════════════════════
   ПОДБОР ОБОРУДОВАНИЯ (podbor.html)

   Стили лежат в shop.css, а не в style.css: страница подбора живёт по
   тем же законам, что и каталог — карточки товара, цены, фотографии, —
   и грузится только там, где нужна.
   ═══════════════════════════════════════════════ */
.pb-grid{
  display:grid; grid-template-columns:minmax(0,1.15fr) minmax(0,1fr); gap:var(--gut);
  align-items:start;
}
.pb-out{ display:flex; flex-direction:column; gap:18px; }

.pb-mode{ border:0; padding:26px 0 0; margin:0; }
.pb-mode legend{
  padding:0; font-size:11px; letter-spacing:.14em; text-transform:uppercase;
  color:var(--tx-mute);
}
.pb-radio{
  display:flex; gap:12px; align-items:flex-start; cursor:pointer;
  padding:14px 0; border-bottom:1px solid var(--rule);
}
.pb-radio:last-child{ border-bottom:0; }
.pb-radio input{ margin-top:3px; flex:none; accent-color:var(--blue); }
.pb-radio span{ font-size:13.5px; line-height:1.5; color:var(--tx-mute); }
.pb-radio b{ display:block; font-weight:500; color:var(--tx-strong); margin-bottom:2px; }
/* Второй набор переключателей идёт следом за первым — без линии они
   сливаются в один длинный список и легенда теряется. */
.pb-type{ border-top:1px solid var(--rule); margin-top:20px; }

/* Подобранное. Три позиции в ряд — это ответ, а не витрина, поэтому
   карточки крупнее каталожных и подписаны, чем именно они подошли. */
/* minmax(0,1fr), а не 1fr: у элемента сетки минимальная ширина по
   умолчанию равна ширине его содержимого, и длинное название товара
   растягивало колонку шире экрана. Та же ловушка, что и с полями цены
   в фильтрах. */
.pb-picks{
  display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:26px;
}
.pb-card{
  display:flex; flex-direction:column;
  border:1px solid var(--rule); background:var(--white);
  padding:22px 22px 24px; color:inherit; text-decoration:none;
}
.pb-card:hover{ border-color:var(--rule-strong); }
.pb-kind{
  font-size:11px; letter-spacing:.14em; text-transform:uppercase;
  color:var(--bronze-ink); margin-bottom:16px;
}
.pb-fig{
  display:block; aspect-ratio:4/3; background:var(--paper-alt);
  overflow:hidden; margin-bottom:16px;
}
.pb-fig img{ width:100%; height:100%; object-fit:contain; padding:12px; }
.pb-nm{ font-size:14.5px; line-height:1.4; color:var(--tx-strong); overflow-wrap:anywhere; }
.pb-why{ font-size:12.5px; color:var(--tx-mute); margin-top:6px; }
.pb-pr{
  font-family:var(--serif); font-size:22px; color:var(--tx-strong);
  margin-top:auto; padding-top:16px; font-variant-numeric:tabular-nums;
}
.pb-card-no{ color:var(--tx-mute); font-size:13.5px; line-height:1.55; }
.pb-card-no p:last-child{ margin-top:8px; }

.pb-lead{ max-width:680px; }
.pb-lead .agree{ display:flex; gap:10px; align-items:flex-start; margin:18px 0 22px; }
.pb-lead .agree span{ font-size:12px; line-height:1.5; color:var(--tx-mute); }
.pb-lead-note{ font-size:13px; color:var(--bronze-ink); margin-top:14px; }
.pb-done h3{ font-size:22px; margin-bottom:10px; }
.pb-done p{ font-size:14.5px; line-height:1.6; color:var(--tx-mute); max-width:520px; }

@media (max-width:980px){
  .pb-grid{ grid-template-columns:minmax(0,1fr); gap:34px; }
  .pb-picks{ grid-template-columns:minmax(0,1fr); gap:20px; }
}

/* Вход в подбор с первого экрана магазина. Ровно та же строка, что и
   подсказка про артикулы, только кликабельная: человек, который не
   знает названия нужного насоса, — самый частый гость каталога. */
/* Вход в подбор под строкой поиска. Вопрос отдельной строкой, действие
   кнопкой: без вопроса кнопка непонятна, без кнопки вопрос не зовёт
   нажать. На узком экране кнопка занимает всю ширину — иначе длинная
   надпись переносится и ломает высоту. */
.hero-pb{
  display:flex; align-items:center; gap:18px; flex-wrap:wrap;
  margin-top:22px; padding-top:20px;
  border-top:1px solid rgba(255,255,255,.14);
}
.hero-pb-q{
  margin:0; font-size:13px; color:var(--tx-on-dark-soft);
}
.hero-pb .btn{ white-space:normal; text-align:center; }
@media (max-width:560px){
  .hero-pb .btn{ width:100%; height:auto; min-height:44px; padding:12px 18px; line-height:1.4; }
}

/* ─────────────────────────────────────────────
   ДОСТАВКА: КУДА, ПОЧЁМ, КОГДА
   Три колонки одного ответа. Список посёлков набран в две-три полосы —
   семнадцать названий в столбик выглядели бы жалобой, а не охватом.
   ───────────────────────────────────────────── */
.dlv-cols{
  display:grid; grid-template-columns:minmax(0,1.4fr) minmax(0,1fr) minmax(0,1fr);
  gap:var(--gut); align-items:start;
}
.dlv-col h3{
  font-size:11px; letter-spacing:.14em; text-transform:uppercase;
  color:var(--tx-mute); font-weight:400;
  padding-bottom:12px; margin-bottom:18px; border-bottom:1px solid var(--rule);
}
.dlv-places{
  columns:2; column-gap:26px; margin:0 0 16px; padding:0; list-style:none;
  font-size:14px; line-height:1.85; color:var(--tx-strong);
}
.dlv-places li{ break-inside:avoid; }
.dlv-big{
  font-family:var(--serif); font-size:30px; line-height:1.15;
  color:var(--tx-strong); margin-bottom:16px;
}
.dlv-big span{
  display:block; font-family:var(--sans); font-size:12.5px;
  color:var(--tx-mute); margin-top:8px;
}
.dlv-small{ font-size:13px; line-height:1.6; color:var(--tx-mute); }

@media (max-width:980px){
  .dlv-cols{ grid-template-columns:minmax(0,1fr); gap:34px; }
  .dlv-places{ columns:2; }
}
@media (max-width:520px){
  .dlv-places{ columns:2; column-gap:18px; font-size:13.5px; }
  .dlv-big{ font-size:26px; }
}

/* ─────────────────────────────────────────────
   МОЖЕТ ПОНАДОБИТЬСЯ
   Три спутника под характеристиками. Мельче карточек каталога: это
   подсказка в конце разговора, а не второй прилавок.
   ───────────────────────────────────────────── */
/* Предложение посчитать — только в карточках насосов и фильтров, где
   вопрос «а сколько мне нужно кубов в час» и возникает. Ставим после
   характеристик: человек уже увидел производительность и ровно в этот
   момент думает, его ли это цифра. */
.item-pb{
  display:flex; align-items:center; justify-content:space-between; gap:18px;
  margin-top:26px; padding:15px 18px;
  border:1px solid var(--rule-strong);
  border-left:2px solid var(--blue);
  border-radius:var(--r);
  background:var(--paper);
  transition:background .25s ease, border-color .25s ease;
}
.item-pb:hover{ background:var(--blue-pale); border-color:var(--blue); border-left-color:var(--blue); }
.item-pb b{
  display:block; margin-bottom:3px;
  font-family:var(--sans); font-size:13px; font-weight:600; color:var(--tx-strong);
}
.item-pb-tx{ font-size:12.5px; line-height:1.5; color:var(--tx-mute); }
.item-pb-go{ flex:none; color:var(--blue); font-size:17px; line-height:1; }

.item-rel{ margin-top:30px; padding-top:24px; border-top:1px solid var(--rule); }
.item-rel-t{
  font-size:11px; letter-spacing:.14em; text-transform:uppercase;
  color:var(--tx-mute); margin-bottom:16px;
}
.rel-row{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:14px; }
.rel-card{ display:flex; flex-direction:column; color:inherit; text-decoration:none; }
.rel-fig{
  display:block; aspect-ratio:1/1; border:1px solid var(--rule);
  background:var(--white); overflow:hidden; margin-bottom:9px;
}
.rel-card:hover .rel-fig{ border-color:var(--blue); }
.rel-fig img{ width:100%; height:100%; object-fit:contain; padding:8px; }
.rel-nm{
  font-size:12px; line-height:1.35; color:var(--tx-body);
  overflow:hidden; text-overflow:ellipsis; display:-webkit-box;
  -webkit-line-clamp:3; -webkit-box-orient:vertical;
}
.rel-pr{
  font-size:12.5px; color:var(--tx-strong); margin-top:6px;
  font-variant-numeric:tabular-nums;
}

/* ─────────────────────────────────────────────
   РАЗРЕЗ ЧАШИ НА СТРАНИЦЕ ПОДБОРА

   Тот же язык, что у чертежей в шапках страниц: тонкая линия, никакой
   заливки, движение медленное и небольшое. Задача рисунка — показать
   человеку введённые им цифры, а не развлечь: увидев вытянутую ванну
   вместо купели, ошибку в запятой замечают сразу.

   Толщины линий расставлены по важности: борта чаши — самое жирное,
   вода и оборудование тоньше, грунт и размерные линии почти незаметны.
   Так рисунок читается с одного взгляда, а не рассыпается на равные по
   весу штрихи.
   ───────────────────────────────────────────── */
.pb-art{ margin:0 0 4px; }
.pb-art svg{
  display:block; width:100%; max-width:520px; height:auto;
  color:var(--tx-strong);
}

/* Бетон чаши — заливка, а не линия. Закладные врезаются в тело стенки,
   и без толщины скиммеру просто некуда встать. */
.pb-art .pb-shell{ fill:currentColor; fill-opacity:.09; stroke:none; }
.pb-art .pb-bowl{ stroke-width:1.3; opacity:.85; }

/* Вода синим, железо чернилами. Разделение по смыслу читается быстрее
   любой подписи: что мокрое — голубое, что железное — серое. */
.pb-art .pb-water{ fill:var(--blue); fill-opacity:.05; stroke:none; }
.pb-art .pb-rows{ stroke:var(--blue); stroke-width:.7; opacity:.16; }
.pb-art .pb-wave-line{ stroke:var(--blue); stroke-width:1.3; opacity:.7; }
.pb-art .pb-wave-line2{ stroke:var(--blue); stroke-width:.8; opacity:.28; }
.pb-art .pb-gutwater{ stroke:var(--blue); stroke-width:1; opacity:.5; stroke-linecap:round; }
.pb-art .pb-jet-flow{ stroke:var(--blue); stroke-width:1; opacity:.4; stroke-linecap:round; }
.pb-art .pb-tank-in{ stroke:var(--blue); stroke-width:.9; opacity:.5; }

/* Закладные. Тонко и мелко: скиммер на восьмиметровой чаше — ящик
   размером с ладонь, и на честном масштабе он и должен быть еле
   заметным прямоугольником в теле стенки. Крупные значки «чтобы
   разглядеть» превращают чертёж в инфографику. */
.pb-art .pb-skim,
.pb-art .pb-jet,
.pb-art .pb-drain,
.pb-art .pb-gutter{ stroke-width:1; opacity:.62; }
.pb-art .pb-grate{ stroke-width:.8; opacity:.4; }
.pb-art .pb-floor{ stroke-width:1; opacity:.5; }

.pb-art .pb-ground{ stroke-width:1; opacity:.45; }
.pb-art .pb-hatch{ stroke-width:.7; opacity:.22; }
.pb-art .pb-pipe{ stroke-width:1.1; opacity:.45; }

/* Аппараты заливаем цветом бумаги: труба проходит за корпусом, а не
   сквозь него — так рисуют на настоящих схемах. */
.pb-art .pb-box,
.pb-art .pb-tank{ stroke-width:1.1; opacity:.6; fill:var(--paper); }
.pb-art .pb-box-in{ stroke-width:.7; opacity:.28; }
.pb-art .pb-valve{ stroke-width:1; opacity:.5; fill:var(--paper); }
.pb-art .pb-pump{ stroke-width:1.1; opacity:.6; fill:var(--paper); }
.pb-art .pb-pump-in{ stroke-width:.9; opacity:.5; }

.pb-art .pb-dim{ stroke-width:.7; opacity:.35; }
.pb-art .pb-dim-t{
  font-family:var(--sans); font-size:9px; fill:var(--tx-mute);
  stroke:none; letter-spacing:.06em;
}
/* Подписи узлов. Схема без них — набор фигур; с ними видно, что это
   чертёж, а не украшение. */
.pb-art .pb-lb{
  font-family:var(--sans); font-size:7px; fill:var(--tx-mute);
  stroke:none; letter-spacing:.06em; text-transform:uppercase;
}
/* Пустые размеры — рисунок гаснет, но не исчезает: пропадающий и
   возвращающийся блок дёргал бы колонку по высоте. */
.pb-art svg.pb-empty{ opacity:.25; }

/* Две линии поверхности с разной скоростью: одна выглядит плоской
   лентой, две дают ощущение толщи воды. Разнесены на 8 единиц при
   амплитудах 2 и 1,2 — с зазором 4,8 они не пересекаются никогда.
   Раньше зазор был 4 при суммарном размахе 3,9: линии шли навстречу
   друг другу и слипались на гребнях в чёрные пятна. Это и выглядело
   как «анимация накладывается». */
.pb-art .pb-wave{ animation:pb-wave 6s ease-in-out infinite; }
.pb-art .pb-wave-slow{ animation-duration:9s; animation-direction:reverse; }
@keyframes pb-wave{
  0%,100%{ transform:translateX(0); }
  50%{ transform:translateX(-38px); }
}

/* Вода в жёлобе и в баке живёт по тем же правилам, что и в чаше, но со
   своим шагом: сдвиг обязан равняться периоду волны, иначе на стыке
   рывок. Периоды разные — 10 и 12 против 38 в чаше, — потому что рябь
   должна быть по размеру ёмкости. Скорости тоже разные: одинаковые
   заставили бы три поверхности качаться строем, а это выглядит как
   механизм, а не как вода. */
.pb-art .pb-wave-g{ animation:pb-wave-g 3.4s ease-in-out infinite; }
@keyframes pb-wave-g{
  0%,100%{ transform:translateX(0); }
  50%{ transform:translateX(-10px); }
}
.pb-art .pb-wave-t{ animation:pb-wave-t 4.6s ease-in-out infinite; animation-direction:reverse; }
@keyframes pb-wave-t{
  0%,100%{ transform:translateX(0); }
  50%{ transform:translateX(-12px); }
}

/* Точка идёт по контуру фильтрации. Длительность ставит скрипт: она и
   есть выбранный оборот — три часа заметно быстрее четырёх. */
#pb-dot{
  offset-rotate:0deg;
  animation:pb-run 6.4s linear infinite;
}
@keyframes pb-run{ to{ offset-distance:100%; } }

@media (prefers-reduced-motion:reduce){
  /* Именно animation:none, а не transform:none: анимация в каскаде
     сильнее обычного объявления, и прежняя строка ничего не
     останавливала — движение оставалось. */
  .pb-art .pb-wave{ animation:none; transform:none; }
  #pb-dot{ display:none; }
}

/* ─────────────────────────────────────────────
   ВТОРАЯ КАРТОЧКА: СРАВНЕНИЕ

   Спутник из блока «Может понадобиться» открывается рядом с исходным
   товаром, а не вместо него. Обе карточки лежат в одном затемнённом
   слое: два затемнения друг на друге дали бы почти чёрный фон, и
   сравнивать стало бы нечего.

   Вторая смещена вниз и вправо — так видно, что она пришла поверх, а
   не была тут с самого начала. Обе сужаются: рядом им нужно вдвое
   меньше места каждой, и внутренняя сетка «фотография | описание»
   переключается на одну колонку, иначе в 600 пикселях характеристики
   встают в два слова на строку.
   ───────────────────────────────────────────── */
.modal-cmp[hidden]{ display:none; }

.ov.cmp-on{ gap:22px; align-items:flex-start; padding-top:5vh; }
.ov.cmp-on .modal-item{ max-width:min(46vw, 620px); max-height:86vh; }
.ov.cmp-on .item-body{ grid-template-columns:1fr; }
.ov.cmp-on .item-info{ max-height:none; padding:28px 30px; }
.ov.cmp-on .item-gal{ padding:22px; }
/* Фотография в режиме сравнения ужимается: сравнивают характеристики и
   цену, а не снимки. Квадрат на пол-экрана отодвигал бы таблицу вниз, и
   ради каждой строки пришлось бы прокручивать обе карточки. */
.ov.cmp-on .item-shot{ aspect-ratio:16/9; max-height:210px; }
.ov.cmp-on .item-thumbs{ display:none; }

/* Смещение и тень — вторая карточка читается как положенная сверху. */
.ov.cmp-on .modal-cmp{
  margin-top:34px;
  box-shadow:0 26px 60px rgba(6,14,22,.45);
}

/* Узкие экраны: сравнение не предлагается вовсе (об этом знает и
   скрипт), но если окно уменьшили уже с открытой парой — прячем
   вторую, чтобы не остаться с двумя нечитаемыми колонками. */
@media (max-width:1199px){
  .ov.cmp-on{ gap:0; padding-top:24px; align-items:center; }
  .ov.cmp-on .modal-item{ max-width:1000px; }
  .ov.cmp-on .modal-cmp{ display:none; }
  .ov.cmp-on .item-body{ grid-template-columns:1fr 1fr; }
}
