/*
 * Витрина магазина.
 *
 * ⚠ Палитра снята ЗАМЕРОМ с работающей витрины texnoline.uz (getComputedStyle),
 * а не подобрана на глаз: плитка 222 px, паддинг 14, радиус 10, рамка 0.8 px
 * #E5E7EB, цена 18px/700, синяя кнопка #0D6EFD. Покупатель не должен заметить,
 * что магазин переехал на другой движок.
 *
 * ⚠ Это НЕ кабинет. Токены кабинета (--accent #1b6ca8) здесь не используются
 * намеренно: у витрины свой синий #0D6EFD, и связывать их значило бы, что
 * смена темы кабинета перекрашивает магазин покупателю.
 */
:root {
	--sh-bg: #f8f9fa;
	--sh-card: #fff;
	--sh-line: #e5e7eb;
	--sh-ink: #212529;
	--sh-muted: #6c757d;
	--sh-blue: #0d6efd;
	--sh-soft: #e7f1ff;
	--sh-ok: #1b8f4a;
	--sh-warn: #a01c1c;

	/*
	 * Красный АКЦИИ — отдельный от красного предупреждения, и это не
	 * вкусовщина. `--sh-warn` означает «осторожно»: им подсвечено «убрать» в
	 * списках и сердце избранного. Скидка — противоположное чувство, и
	 * привяжи мы её к тому же токену, первая же правка оттенка предупреждения
	 * перекрасила бы ценники. Три оттенка вместо одного нужны потому, что
	 * красный работает тремя способами сразу: цифрой, чипом и плашкой, и на
	 * плашке поверх фотографии белый текст обязан читаться в обеих темах.
	 */
	--sh-sale: #c1121f;
	--sh-sale-soft: #fdeaec;
	--sh-sale-deep: #9b1c2e;

	/* Скругление и шрифт выбирает арендатор в «Шаблоне витрины». Здесь —
	   умолчание на случай, когда не выбирал; выбранное подставляет строкой
	   в <head> партиал app/partials/shop-look.php, ниже этого файла. */
	--sh-radius: 10px;
	--sh-font: system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif;

	/* Тень под липкой шапкой. Токеном, а не числом в правиле: чёрная тень на
	   тёмной странице не видна вовсе, и в тёмной теме её приходится сгущать. */
	--sh-lift: 0 4px 14px rgba(0, 0, 0, .09);
}

* { box-sizing: border-box; }

body.shop {
	margin: 0;
	background: var(--sh-bg);
	color: var(--sh-ink);
	font: 15px/1.5 var(--sh-font);
}

.shop a { color: var(--sh-blue); text-decoration: none; }
.shop a:hover { text-decoration: underline; }
.shop .wrap { max-width: 1440px; margin: 0 auto; padding: 0 32px; }

/* ── шапка ── */

/*
 * ⚠ Шапка липкая — `sticky`, а не `fixed`. Fixed вынимает её из потока, и
 * каждой странице пришлось бы отодвигать верх ровно на высоту шапки; высота же
 * у неё разная — 75 пикселей на широком экране, 116 на планшете и 168 на
 * телефоне, где значки и поиск уезжают на свои строки. Sticky держит это место
 * сам, и первый экран не начинается ни под шапкой, ни пустой полосой.
 *
 * ⚠ Опорой для мега-меню шапка остаётся: `sticky` — тоже позиционирование, и
 * `.shcat` с `top: 100%` по-прежнему считает от неё, а не от страницы. Поменяй
 * здесь `sticky` на `static` — каталог уедет в левый верхний угол окна.
 *
 * ⚠ Свой слой обязателен. Без `z-index` под шапку не проезжают только те, у
 * кого своего слоя нет: подсказки `[data-tip]` и плашки на плитках всплывают
 * над ней. 50 взято с запасом — на странице выше 5 ничего не поднимается, — а
 * подложка каталога (39) и само меню (40) лежат ВНУТРИ шапки и меряются между
 * собой, а не с ней.
 *
 * ⚠ Фон обязан остаться непрозрачным и токеном: под шапкой теперь едет
 * страница, любая прозрачность покажет её насквозь, а зашитый #fff остался бы
 * белым в тёмной теме.
 */
.sh { background: var(--sh-card); border-bottom: 1px solid var(--sh-line);
	position: sticky; top: 0; z-index: 50; }

/*
 * Тень под шапкой — только у прокрученной страницы: пока страница стоит на
 * месте, шапка ничего не перекрывает, и тень обещала бы слой, которого нет.
 *
 * ⚠ Кадры двигает прокрутка, а не время (`animation-timeline`). Слушать scroll
 * из JS ради одной тени — это обработчик на каждый пиксель прокрутки на всех
 * страницах магазина.
 *
 * ⚠ Всё под @supports: где прокруточных таймлайнов нет (Safari), правило
 * выключается целиком. Без проверки анимация досталась бы обычному таймлайну и
 * тень висела бы всегда — в том числе у нетронутой страницы.
 */
@supports (animation-timeline: scroll()) {
	@keyframes sh-lift { to { box-shadow: var(--sh-lift); } }

	.sh { animation: sh-lift linear both; animation-timeline: scroll(root block); animation-range: 0 20px; }
}
.sh__in { max-width: 1440px; margin: 0 auto; padding: 14px 32px; display: flex; align-items: center; gap: 16px; }
.sh__logo { display: block; color: var(--sh-ink); }
.sh__logo:hover { text-decoration: none; }
.sh__logo b { display: block; font-size: 20px; letter-spacing: .02em; }
.sh__logo span { display: block; font-size: 11px; color: var(--sh-muted); }

.sh__cat { display: inline-flex; align-items: center; gap: 9px; border: 0; cursor: pointer;
	background: var(--sh-blue); color: #fff; font: inherit; font-size: 14px; font-weight: 600;
	padding: 11px 18px; border-radius: 8px; white-space: nowrap; }
/*
 * ⚠ Тёмный оттенок под наведением берётся токеном, а не числом. Зашитый
 * #0b5ed7 не знал ни про выбранный арендатором цвет (ShopTheme красит витрину
 * целиком, и зелёная кнопка синела под курсором), ни про тёмную тему, где
 * синий поднят до #4c8dff, — кнопка на наведении проваливалась в почти
 * чёрный. Запасное значение оставлено на случай, если `--sh-blue-dark` не
 * доехал: без него наведение просто перестало бы менять цвет.
 */
.sh__cat:hover { background: var(--sh-blue-dark, #0b5ed7); }
.sh__bars { display: inline-flex; flex-direction: column; gap: 3px; }
.sh__bars i { display: block; width: 14px; height: 2px; border-radius: 1px; background: #fff; }

/*
 * Поиск. Кнопка — лупа ВНУТРИ поля, а не синий прямоугольник рядом.
 *
 * ⚠ Заливка того же цвета, что «Каталог» и «В корзину», перетягивала взгляд на
 * себя, хотя нажимают её редко: в поле пишут и жмут Enter. Три ярких пятна в
 * одной строке спорят между собой, и глазу не за что зацепиться первым.
 *
 * ⚠ Кнопка остаётся кнопкой формы, просто выглядит значком: без неё поиск с
 * телефона нечем отправить — экранная клавиатура не всегда показывает Enter.
 */
.sh__find { position: relative; flex: 1; display: flex; min-width: 220px; }
.sh__find input { flex: 1; padding: 11px 44px 11px 14px; border: 1px solid var(--sh-line);
	border-radius: 8px; background: var(--sh-bg); font: inherit; font-size: 14px; color: var(--sh-ink); }
.sh__find input:focus { outline: 2px solid var(--sh-blue); outline-offset: -1px; }

.sh__find button {
	position: absolute;
	right: 4px;
	top: 50%;
	transform: translateY(-50%);
	display: grid;
	place-items: center;
	width: 34px;
	height: 34px;
	padding: 0;
	border: 0;
	border-radius: 8px;
	background: none;
	color: var(--sh-muted);
	cursor: pointer;
}

.sh__find button:hover { background: var(--sh-soft); color: var(--sh-blue); }
/* ⚠ Промежуток маленький: значки стоят подряд и читаются как один блок, а
   у каждого свои 44 пикселя цели для пальца — воздух уже внутри них. */
.sh__side { display: flex; align-items: center; gap: 2px; font-size: 13px; }

/* ── мега-меню каталога ── */

/*
 * Подложка под открытым каталогом.
 *
 * ⚠ Цвет и прозрачность взяты из макета: #17212b при 35 %. Не чёрный —
 * чистый чёрный поверх светлой страницы выглядит как сбой отрисовки, а не
 * как «страница отошла на второй план».
 *
 * ⚠ `position: fixed`, а не `absolute`: гасить надо всё окно, включая то, что
 * ниже сгиба. При `absolute` подложка кончалась бы вместе с шапкой.
 *
 * ⚠ Ниже меню по z-index, но выше всей страницы: она обязана перехватывать
 * нажатия — в этом половина её работы.
 */
.shcat__veil {
	position: fixed;
	inset: 0;
	z-index: 39;
	background: #17212b;
	opacity: .35;
}

.shcat__veil[hidden] { display: none; }

.shcat { position: absolute; left: 0; right: 0; top: 100%; z-index: 40; padding: 0 32px 20px; }
.shcat[hidden] { display: none; }
.shcat__in { max-width: 1376px; margin: 0 auto; display: grid; grid-template-columns: 300px minmax(0, 1fr);
	background: var(--sh-card); border: 1px solid var(--sh-line); border-radius: var(--sh-radius);
	box-shadow: 0 18px 50px rgba(0, 0, 0, .12); overflow: hidden; }
.shcat__roots { padding: 12px 10px; }
.shcat__root { display: flex; align-items: center; gap: 8px; padding: 9px 12px; border-radius: 8px;
	color: var(--sh-ink); font-size: 14px; }
.shcat__root span { flex: 1; }
.shcat__root i { font-style: normal; font-size: 12px; color: var(--sh-muted); }
.shcat__root:hover { background: var(--sh-bg); text-decoration: none; }
.shcat__root.is-on { background: var(--sh-soft); color: var(--sh-blue); font-weight: 600; }
.shcat__root.is-on i { color: var(--sh-blue); }

.shcat__inner { background: var(--sh-bg); padding: 16px 20px; }
.shcat__branch { display: none; }
.shcat__branch.is-on { display: block; }
.shcat__head { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
.shcat__head b { font-size: 16px; }
.shcat__head a { margin-left: auto; font-size: 13px; font-weight: 600; }
.shcat__kids { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; }
.shcat__kids a { display: flex; align-items: center; gap: 8px; padding: 9px 12px; background: var(--sh-card);
	border: 1px solid var(--sh-line); border-radius: 8px; color: var(--sh-ink); font-size: 13px; }
.shcat__kids a span { flex: 1; }
.shcat__kids a i { font-style: normal; font-size: 12px; color: var(--sh-muted); }
.shcat__kids a:hover { border-color: var(--sh-blue); text-decoration: none; }
.shcat__none { margin: 0; color: var(--sh-muted); font-size: 13px; }

/* ── общее для страниц ── */
.shop main { padding: 18px 0 40px; }
.shop .crumbs { font-size: 12px; color: var(--sh-muted); margin: 0 0 10px; }
.shop .crumbs a { color: var(--sh-muted); }
.shop h1 { margin: 0; font-size: 24px; }
.shop .h1row { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
.shop .h1row .n { font-size: 13px; color: var(--sh-muted); }

/* ── строка отбора ── */
.filters { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; background: var(--sh-card);
	border: 1px solid var(--sh-line); border-radius: var(--sh-radius); padding: 10px 14px; margin-bottom: 14px; font-size: 13px; }
.filters .lbl { color: var(--sh-muted); }
.filters .sep { width: 1px; height: 22px; background: var(--sh-line); }
.filters .chip { padding: 5px 13px; border: 1px solid var(--sh-line); border-radius: 999px;
	color: var(--sh-muted); background: var(--sh-card); }
.filters .chip:hover { text-decoration: none; border-color: var(--sh-blue); }
.filters .chip.is-on { background: var(--sh-blue); border-color: var(--sh-blue); color: #fff; }
.filters input[type="number"] { width: 110px; padding: 7px 12px; border: 1px solid var(--sh-line);
	border-radius: 8px; font: inherit; font-size: 13px; }
.filters label.have { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; }
.filters .reset { margin-left: auto; }

/* ── сетка и плитка ── */
.grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(222px, 1fr)); gap: 16px; }

.pcard { position: relative; background: var(--sh-card); border: .8px solid var(--sh-line); border-radius: var(--sh-radius);
	padding: 14px; display: flex; flex-direction: column; gap: 8px; }

/*
 * Сердце «в избранное» — в углу картинки, проявляется при наведении.
 *
 * ⚠ У отмеченного товара сердце видно ВСЕГДА. Иначе, чтобы понять, что уже
 * отложено, покупателю пришлось бы водить мышью по каждой плитке подряд.
 *
 * ⚠ Считаем от плитки, а не от картинки: форма лежит рядом со ссылкой на
 * карточку, а не внутри неё — внутри `<a>` форма невалидна, и браузер
 * выбрасывает её из ссылки сам, роняя кнопку в случайное место плитки.
 */
.pcard__fav { position: absolute; right: 10px; top: 10px; z-index: 2; margin: 0; opacity: 0; transition: opacity .15s ease; }
.pcard:hover .pcard__fav,
.pcard__fav:focus-within,
.pcard__fav.is-on { opacity: 1; }

.pcard__fav button {
	display: grid; place-items: center; width: 34px; height: 34px; padding: 0;
	border: .8px solid var(--sh-line); border-radius: 999px;
	background: var(--sh-card); color: var(--sh-muted); cursor: pointer;
}

/* ⚠ Красный берём токеном, а не своим числом: зашитый #d34b4b оставался
   одинаковым в обеих темах, и на тёмной плитке сердце светилось грязным
   пятном мимо палитры. `--sh-warn` — единственный красный витрины, тем же
   помечен «убрать» в списках (lists.css), и это та же семья действий. */
.pcard__fav button:hover,
.pcard__fav.is-on button { border-color: var(--sh-warn); color: var(--sh-warn); }

/* На телефоне наведения нет вовсе — там сердце видно всегда, иначе до него
   не добраться ни одним касанием. */
@media (hover: none) {
	.pcard__fav { opacity: 1; }
}

.pcard__pic { position: relative; }
.pcard__pic .pic { display: block; width: 100%; aspect-ratio: 192 / 170; object-fit: contain;
	background: var(--sh-bg); border-radius: 8px; }
.pcard__pic .pic--none { display: grid; place-items: center; color: var(--sh-muted); font-size: 13px; }
/* ⚠ Рамка замешана из синего витрины, а не задана числом. Светло-голубой
   #b8d4ff не темнел вместе с темой и обводил плашку яркой ниткой поверх
   тёмной подложки. Первая строка — запасная для браузеров без color-mix:
   у них рамка сольётся с заливкой, но плашка останется целой. */
.pcard__badge { position: absolute; left: 0; top: 0; font-size: 11px; font-weight: 600; color: var(--sh-blue);
	background: var(--sh-soft); border: .8px solid var(--sh-soft);
	border-color: color-mix(in srgb, var(--sh-blue) 30%, var(--sh-card));
	border-radius: 999px; padding: 1px 9px; }
.pcard__name { font-size: 14px; font-weight: 500; color: var(--sh-ink); }
.pcard__name:hover { text-decoration: none; color: var(--sh-blue); }
.pcard__price { font-size: 18px; font-weight: 700; }

/* ── акция на плитке ──
 *
 * ⚠ Ни одно из этих правил не меняет РАЗМЕРОВ плитки. Скидка есть у одного
 * товара из тридцати, и подрасти плитка на две строки — ряд каталога поехал бы
 * ступенькой. Поэтому «было» и срок — мелкий текст в тех же 14 px строки, а
 * плашка лежит поверх фотографии, ничего не занимая.
 */

/* Колонка в углу фотографии: плашка скидки, под ней плашки складов. */
.pcard__flags { position: absolute; left: 8px; top: 8px; display: flex; flex-direction: column;
	align-items: flex-start; gap: 6px; }

.pcard__sale { font-size: 11px; font-weight: 700; line-height: 1.5; color: #fff;
	background: var(--sh-sale-deep); border-radius: 999px; padding: 2px 9px; white-space: nowrap; }
/* ⚠ Скрытая плашка обязана СХЛОПНУТЬСЯ, а не побледнеть: в колонке она
   держала бы место, и плашки складов уехали бы вниз на товаре без скидки.
   Правило нужно поимённо — `hidden` из браузера слабее любого нашего
   `display`, а он тут есть у соседей по колонке. */
.pcard__sale[hidden] { display: none; }

/* «Было» и выгода — одной строкой над ценой. */
.pcard__was { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-height: 0; }
.pcard__was[hidden] { display: none; }
.pcard__was s { font-size: 13px; color: var(--sh-muted); text-decoration-thickness: 1px; }
.pcard__cut { font-size: 11px; font-weight: 600; color: var(--sh-sale);
	background: var(--sh-sale-soft); border-radius: 999px; padding: 1px 7px; white-space: nowrap; }

/* ⚠ Красная цена — единственный способ отличить её от обычной, когда
   зачёркнутая строка уехала под обрез узкой плитки. Цвет ставится модификатором,
   а не через `.pcard__was + .pcard__price`: переключатель состояний меняет их
   по отдельности, и соседский селектор пришлось бы держать в голове ещё и в JS. */
.pcard__price--sale { color: var(--sh-sale); }

.pcard__till { font-size: 12px; color: var(--sh-muted); }
.pcard__till[hidden] { display: none; }
.pcard__ask { font-size: 14px; font-weight: 500; color: var(--sh-muted); }
.pcard__have { font-size: 12px; color: var(--sh-ok); }
.pcard__have--none { color: var(--sh-muted); }
.pcard__go { display: block; text-align: center; padding: 10px 0; border-radius: 8px;
	background: var(--sh-blue); color: #fff; font-size: 14px; font-weight: 600; }
.pcard__go:hover { background: var(--sh-blue-dark, #0b5ed7); text-decoration: none; color: #fff; }

/* ── карточка товара ── */

/*
 * Три колонки: галерея, «что это за вещь» и блок покупки.
 *
 * ⚠ Раскладка ИМЕНОВАННЫМИ областями, а не порядком колонок. Разметка идёт в
 * том порядке, в каком её читают вслух и без стилей — галерея, название с
 * характеристиками, покупка, — а на узком экране блок покупки обязан остаться
 * справа, рядом с ценой, а не уехать под описание третьим экраном прокрутки.
 * Областями это одна строка правки в медиа-запросе; перестановкой колонок
 * пришлось бы двигать саму разметку.
 *
 * ⚠ 476 — это 64 ленты миниатюр + 12 промежутка + 400 крупного снимка, ровно
 * как в макете. Число собрано из трёх, а не подобрано на глаз: поменяется
 * ширина ленты — здесь придётся сложить заново.
 */
.tovar { display: grid; grid-template-columns: 476px minmax(0, 1fr) 320px; gap: 20px;
	align-items: start; grid-template-areas: "pic main buy"; }

.tovar__shots { grid-area: pic; display: flex; gap: 12px; }

/*
 * ⚠ Лента миниатюр — колонкой СЛЕВА и без переноса. Ряд под снимком уводил
 * взгляд вниз, к описанию, мимо названия и цены; вертикальная лента остаётся в
 * стороне и не отнимает у снимка высоту.
 */
.tovar__thumbs { flex: 0 0 64px; display: flex; flex-direction: column; gap: 8px; }
.tovar__thumbs img { width: 64px; height: 64px; object-fit: contain; background: var(--sh-card);
	border: .8px solid var(--sh-line); border-radius: 8px; cursor: pointer; }
.tovar__thumbs img.is-on { border-color: var(--sh-blue); }

/* ⚠ `relative` — только ради плашки скидки, и она на СНИМКЕ, а не на всей
   колонке: считайся плашка от колонки, на товаре с несколькими фотографиями
   она села бы на первую миниатюру. Раскладку это не трогает: у потомков в
   потоке позиция своя. */
.tovar__pic { flex: 1; min-width: 0; position: relative; display: flex; }

.tovar__big { flex: 1; min-width: 0; aspect-ratio: 400 / 368; object-fit: contain;
	background: var(--sh-card); border: .8px solid var(--sh-line); border-radius: var(--sh-radius); }
.tovar__big--none { display: grid; place-items: center; color: var(--sh-muted); font-size: 13px; }

.tovar__main { grid-area: main; min-width: 0; }
.tovar__main h1 { font-size: 24px; margin-bottom: 4px; }

.tovar__buy { grid-area: buy; background: var(--sh-card); border: .8px solid var(--sh-line);
	border-radius: var(--sh-radius); padding: 18px; }
/* Первым в блоке стоит цена, и её собственный отступ сверху здесь лишний:
   он отодвигал бы сумму от края карточки на полтора десятка пикселей. */
.tovar__buy > :first-child { margin-top: 0; }
.tovar__sub { font-size: 12px; color: var(--sh-muted); margin: 0 0 12px; }
.tovar__price { font-size: 26px; font-weight: 700; margin: 10px 0; }

/*
 * ⚠ Своя точка перелома, отдельно от общей 900px. Три колонки требуют 476 + 320
 * плюс промежутки — на 1100 пикселях средней колонке остаётся полоска, в
 * которой название переносится по слогам. Галерея и название встают друг под
 * друга, а покупка остаётся справа: это то, ради чего затевались области.
 */
@media (max-width: 1200px) {
	.tovar { grid-template-columns: minmax(0, 1fr) 320px; grid-template-areas: "pic buy" "main buy"; }
}

/* ── акция в карточке товара ── */

/* ⚠ Плашка стоит НАД снимком, а не над всей колонкой: под снимком лежат
   миниатюры, и угол колонки на товаре с одним фото оказался бы в пустоте. */
.tovar__sale { position: absolute; left: 12px; top: 12px; z-index: 1;
	font-size: 13px; font-weight: 700; line-height: 1.5; color: #fff;
	background: var(--sh-sale-deep); border-radius: 999px; padding: 3px 12px; }

.tovar__was { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 10px; }
.tovar__was s { font-size: 15px; color: var(--sh-muted); text-decoration-thickness: 1px; }
/* Выгода суммой — чипом, а не строкой: рядом с зачёркнутой ценой две обычные
   строки читаются как две цены, и человек ищет, какая из них настоящая. */
.tovar__cut { font-size: 13px; font-weight: 600; color: var(--sh-sale);
	background: var(--sh-sale-soft); border-radius: 999px; padding: 2px 9px; }

/* ⚠ Зачёркнутая цена уже стоит над крупной, поэтому у неё свой отступ сверху,
   а у цены он гасится: иначе между ними встал бы двойной воздух и они
   перестали бы читаться одной парой «было — стало». */
.tovar__was + .tovar__price { margin-top: 2px; }
.tovar__price--sale { color: var(--sh-sale); }

.tovar__promo { background: var(--sh-sale-soft); border-radius: 8px; padding: 10px 12px; margin-bottom: 12px; }
.tovar__promo b { display: block; font-size: 14px; color: var(--sh-sale); }
.tovar__promo span { display: block; font-size: 12px; color: var(--sh-muted); margin-top: 2px; }
.tovar__stock { background: var(--sh-bg); border-radius: 8px; padding: 10px 12px; margin-bottom: 12px; }
.tovar__stock b { color: var(--sh-ok); font-size: 14px; }
.tovar__stock b.none { color: var(--sh-muted); }
.tovar__stock span { display: block; font-size: 12px; color: var(--sh-muted); margin-top: 2px; }
.tovar__act { display: block; text-align: center; padding: 14px 0; border-radius: var(--sh-radius);
	background: var(--sh-blue); color: #fff; font-size: 15px; font-weight: 600; }
.tovar__act:hover { background: var(--sh-blue-dark, #0b5ed7); text-decoration: none; color: #fff; }
/* ⚠ Селектор с тегом (a.tovar__act) намеренно: общее правило `.shop a` красит
   ссылки синим и перебивает `color: #fff` строкой выше — специфичность 0,1,1
   против 0,1,0. Пока этой строки не было, кнопка на карточке товара выходила
   синим текстом на синем фоне: покупатель видел пустую плашку вместо «Спросить
   о поступлении» и «Узнать цену по телефону» — то есть ровно там, где товара
   нет или нет цены и звонок остаётся единственным действием. «В корзину» это
   не задевало: она <button>, под `.shop a` не подпадает. Замер на живой
   витрине 03.09.2026, тот же приём применён к a.sf__phone в подвале. */
a.tovar__act { color: #fff; }
.tovar__note { font-size: 12px; color: var(--sh-muted); margin: 12px 0 0; }

.tovar__block { background: var(--sh-card); border: .8px solid var(--sh-line); border-radius: var(--sh-radius);
	padding: 16px 18px; margin-top: 16px; }
.tovar__block h2 { margin: 0 0 10px; font-size: 16px; }
.tovar__block p { margin: 0; font-size: 13px; line-height: 1.6; }

/* Описание покупателю приходит СВОЕЙ разметкой — подзаголовки, абзацы, списки
   и подписи к фото (ProductStory). Ужать его в один абзац нельзя: внутри `<p>`
   ни заголовок, ни список стоять не могут, и браузер такую вёрстку разорвёт. */
.tovar__story h2 { margin: 16px 0 8px; font-size: 14px; }
.tovar__story p { margin: 0 0 10px; font-size: 13px; line-height: 1.6; }
.tovar__story ul { margin: 0 0 10px; padding-left: 20px; font-size: 13px; line-height: 1.6; }
.tovar__story li { margin: 0 0 4px; }
.tovar__story .story-photo { font-size: 12px; color: var(--sh-muted); }
.tovar__story > :first-child { margin-top: 0; }
.tovar__story > :last-child { margin-bottom: 0; }

/* ── постранично ── */
.pages { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 18px; }
.pages a, .pages span { padding: 6px 12px; border: 1px solid var(--sh-line); border-radius: 8px;
	font-size: 13px; background: var(--sh-card); }
.pages span.on { background: var(--sh-blue); border-color: var(--sh-blue); color: #fff; }

.empty { background: var(--sh-card); border: 1px solid var(--sh-line); border-radius: var(--sh-radius);
	padding: 28px; text-align: center; color: var(--sh-muted); }

@media (max-width: 900px) {
	.shop .wrap { padding: 0 16px; }
	/* ⚠ Поля и промежутки в шапке урезаны сильнее, чем просит вёрстка. Шапка
	   липкая, а на узком экране она разъезжается на три строки — 192 пикселя
	   из 812 отняты у товара насовсем. Сжатие возвращает экрану четверть этой
	   высоты и не трогает ни один значок: 44 пикселя цели под палец у них
	   остаются. */
	.sh__in { padding: 8px 16px; gap: 8px; flex-wrap: wrap; }
	.sh__find { order: 3; flex-basis: 100%; }
	.shcat { padding: 0 16px 16px; }
	.shcat__in { grid-template-columns: minmax(0, 1fr); }
	/* ⚠ Одна колонка: галерея, название с характеристиками и покупка встают
	   стопкой в том же порядке, в каком их читают. */
	.tovar { grid-template-columns: minmax(0, 1fr); grid-template-areas: "pic" "main" "buy"; }
}

/* ── значки в шапке ── */

/*
 * Правый угол шапки — значки без подписей: язык, избранное, сравнение,
 * корзина, вход.
 *
 * ⚠ Подписи убраны намеренно. «Сравнение · 2 Избранное · 3 Корзина · 1 Войти»
 * занимали половину строки, и поле поиска сжималось до трети экрана. Слово
 * приходит подсказкой при наведении — тем же приёмом `[data-tip]`, что и у
 * плашек на плитке, то есть сразу, а не через полторы секунды.
 *
 * ⚠ Значок стоит в шапке ВСЕГДА, даже когда счётчик пуст. Раньше «Сравнение»
 * и «Избранное» появлялись, только если в них что-то лежало, — и покупатель
 * не знал, что такие разделы существуют.
 */
.sh__ico {
	position: relative;
	display: inline-grid;
	place-items: center;
	width: 44px;
	height: 44px;
	border-radius: 10px;
	color: var(--sh-ink);
	cursor: pointer;
	border: 0;
	background: none;
	padding: 0;
}

.sh__ico:hover { background: var(--sh-soft); color: var(--sh-blue); text-decoration: none; }
.sh__ico.is-on { color: var(--sh-blue); }

/* Язык пока не переключается: витрина целиком на русском. Значок на месте,
   чтобы место под него в шапке было занято заранее, но он не зовёт нажать. */
.sh__ico--dead { color: var(--sh-muted); cursor: default; }
.sh__ico--dead:hover { background: none; color: var(--sh-muted); }

.sh__ico .sh__lang {
	position: absolute;
	right: 2px;
	bottom: 4px;
	font-style: normal;
	font-size: 9px;
	font-weight: 700;
	letter-spacing: .02em;
}

/*
 * Счётчик — кружок поверх значка, а не строка рядом. «Корзина · 3» шире
 * вчетверо, а говорит ровно то же самое.
 */
.sh__num {
	position: absolute;
	top: 4px;
	right: 3px;
	min-width: 17px;
	padding: 0 4px;
	border-radius: 999px;
	background: var(--sh-blue);
	color: #fff;
	font-style: normal;
	font-size: 10px;
	font-weight: 700;
	line-height: 17px;
	text-align: center;
}

/* ── список вошедшего покупателя ── */

.sh__me { position: relative; }

/*
 * ⚠ Список открывается ПО НАЖАТИЮ, как и меню каталога. По наведению он
 * раскрывался бы у любого, кто просто ведёт мышь к телефону, а на телефоне
 * не открывался бы вовсе — палец не умеет наводить.
 */
.sh__menu {
	position: absolute;
	right: 0;
	top: calc(100% + 8px);
	z-index: 41;
	min-width: 210px;
	padding: 6px 0;
	background: var(--sh-card);
	border: 1px solid var(--sh-line);
	border-radius: 10px;
	box-shadow: 0 12px 30px rgba(0, 0, 0, .12);
}

.sh__menu[hidden] { display: none; }

.sh__who { padding: 8px 14px 10px; border-bottom: 1px solid var(--sh-line); margin-bottom: 6px; }
.sh__who b { display: block; font-size: 14px; }
.sh__who span { display: block; font-size: 11px; color: var(--sh-muted); }

.sh__menu a,
.sh__menu button {
	display: block;
	width: 100%;
	padding: 9px 14px;
	border: 0;
	background: none;
	color: var(--sh-ink);
	font: inherit;
	font-size: 13px;
	text-align: left;
	cursor: pointer;
}

/* Текущий язык в списке отмечен, а не просто выбран мышью. */
.sh__menu a.is-on { background: var(--sh-soft); color: var(--sh-blue); font-weight: 600; }
.sh__menu a:hover,
.sh__menu button:hover { background: var(--sh-bg); text-decoration: none; }
/* Выход приглушён: это не то, ради чего сюда заходят. */
.sh__menu button { color: var(--sh-muted); }
.sh__menu form { margin: 0; }

/*
 * На узком экране шапка отдаёт язык и сравнение, но оставляет избранное,
 * корзину и вход: позвонить и оплатить можно с телефона, а сравнивать шесть
 * видеокарт — нет.
 */
@media (max-width: 900px) {
	.sh__ico--dead { display: none; }
	.sh__ico[href="/sravnenie/"] { display: none; }
	.sh__side { gap: 2px; }
}

/* ── кнопка «в корзину» на плитке ── */
.pcard__buy { margin: 0; }
.pcard__buy button { display: block; width: 100%; padding: 10px 0; border: 0; border-radius: 8px;
	background: var(--sh-blue); color: #fff; font: inherit; font-size: 14px; font-weight: 600; cursor: pointer; }
.pcard__buy button:hover { background: var(--sh-blue-dark, #0b5ed7); }

/* Кнопка на карточке — тот же вид, но это <button> внутри формы. */
button.tovar__act { display: block; width: 100%; border: 0; cursor: pointer; font: inherit;
	font-size: 15px; font-weight: 600; }

/* ── страница корзины ── */
.basket { display: grid; grid-template-columns: minmax(0, 1fr) 380px; gap: 20px; align-items: start; }
.basket__list { display: flex; flex-direction: column; gap: 12px; }

.bline { display: flex; align-items: center; gap: 14px; background: var(--sh-card);
	border: .8px solid var(--sh-line); border-radius: var(--sh-radius); padding: 14px 16px; }
.bline--gone { background: var(--sh-bg); }
.bline__pic { width: 84px; height: 84px; flex: none; display: grid; place-items: center;
	background: var(--sh-bg); border-radius: 8px; overflow: hidden; }
.bline__pic img { width: 100%; height: 100%; object-fit: contain; }
.bline__pic--none { color: var(--sh-muted); font-size: 11px; }
.bline__about { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.bline__name { font-size: 15px; font-weight: 600; color: var(--sh-ink); }
.bline__kind { font-size: 12px; color: var(--sh-muted); }
.bline__ok { font-size: 12px; color: var(--sh-ok); }
.bline__warn { font-size: 12px; color: var(--sh-warn); }

.bline__steps { display: flex; align-items: center; border: .8px solid var(--sh-line);
	border-radius: 8px; overflow: hidden; margin: 0; }
.bline__steps button { width: 38px; height: 38px; border: 0; background: var(--sh-card);
	font: inherit; font-size: 16px; color: var(--sh-muted); cursor: pointer; }
.bline__steps button:hover { background: var(--sh-bg); color: var(--sh-ink); }
.bline__steps b { width: 46px; text-align: center; font-size: 15px; }
.bline__sum { width: 160px; text-align: right; font-size: 17px; font-weight: 700; }
/* ⚠ Зачёркнутая сумма и имя акции — блоками, а не строчными: `.bline__sum`
   выровнена по правому краю, и строчные элементы склеились бы с итогом в одну
   ленту чисел. */
.bline__was { display: block; font-size: 13px; font-weight: 400; color: var(--sh-muted);
	text-decoration-thickness: 1px; }
.bline__sale { color: var(--sh-sale); }
.bline__promo { display: block; font-size: 11px; font-weight: 400; color: var(--sh-muted); margin-top: 2px; }
.bline__ask { font-size: 13px; font-weight: 500; color: var(--sh-muted); }
.bline__drop { border: 0; background: none; color: var(--sh-muted); font-size: 15px; cursor: pointer; padding: 6px; }
.bline__drop:hover { color: var(--sh-warn); }

.basket__side { display: flex; flex-direction: column; gap: 14px; }
.basket__total, .basket__keep { background: var(--sh-card); border: .8px solid var(--sh-line);
	border-radius: var(--sh-radius); padding: 18px; display: flex; flex-direction: column; gap: 10px; }
.basket__total > b { font-size: 15px; }
.basket__row { display: flex; gap: 10px; font-size: 13px; color: var(--sh-muted); }
.basket__row span:last-child { margin-left: auto; color: var(--sh-ink); text-align: right; }
/* ⚠ Красным окрашено ЧИСЛО, а не подпись. Красная подпись в столбце итогов
   читается как предупреждение — «что-то не так с заказом», — а тут ровно
   наоборот. */
.basket__row--sale span:last-child { color: var(--sh-sale); font-weight: 600; }
.basket__sum { display: flex; align-items: baseline; gap: 10px; padding-top: 10px;
	border-top: 1px solid var(--sh-line); }
.basket__sum span { flex: 1; font-size: 15px; font-weight: 600; }
.basket__sum b { font-size: 22px; }
.basket__go { display: block; text-align: center; padding: 14px 0; border-radius: var(--sh-radius);
	background: var(--sh-blue); color: #fff; font-size: 15px; font-weight: 600; }
.basket__go:hover { background: var(--sh-blue-dark, #0b5ed7); text-decoration: none; color: #fff; }
.basket__note { font-size: 11px; color: var(--sh-muted); }
/*
 * ⚠ Две подложки в правой колонке корзины были заданы числами (#fdecec и
 * #fff8ec) и в тёмной теме оставались светлыми: серый текст `--sh-muted` на
 * них переставал читаться совсем — розовый и кремовый прямоугольники висели
 * дырой в тёмной странице.
 *
 * «Нельзя оформить» замешано из красного витрины: это предупреждение, и оно
 * обязано розоветь и темнеть вместе с темой. Запасная строка выше — для
 * браузеров без color-mix: у них плашка станет серой, а не пропадёт.
 */
.basket__hold { background: var(--sh-bg);
	background: color-mix(in srgb, var(--sh-warn) 12%, var(--sh-card));
	border-radius: 8px; padding: 12px; font-size: 12px; color: var(--sh-muted); }

/* А «корзина живёт 60 дней» ничего не предупреждает — это справка, и ей
   хватает того же серого фона, что у плашки наличия в карточке товара.
   Отличить её от белого блока «Итого» рядом он всё ещё позволяет. */
.basket__keep { background: var(--sh-bg); }
.basket__keep b { font-size: 13px; }
.basket__keep span { font-size: 12px; color: var(--sh-muted); }

.linkish { border: 0; background: none; color: var(--sh-muted); font: inherit; font-size: 13px; cursor: pointer; }
.linkish:hover { color: var(--sh-warn); }

@media (max-width: 900px) {
	.basket { grid-template-columns: minmax(0, 1fr); }
	.bline { flex-wrap: wrap; }
	.bline__sum { width: auto; margin-left: auto; }
}

/* «Под заказ» — не наличие и не отсутствие: третье состояние, и цвет у него свой.
 *
 * ⚠ Единственное число, оставшееся в файле после перевода витрины на токены, и
 * оставлено оно осознанно. Янтарный не выводится ни из одного `--sh-*`:
 * `--sh-warn` прочитался бы как «проблема», `--sh-ok` — как «есть в наличии»,
 * `--sh-muted` стёр бы третье состояние вовсе. В тёмной теме #b06f00 не
 * меняется и читается на пределе — лечится это отдельным токеном на янтарный,
 * а не подбором соседнего цвета здесь. */
.pcard__have--order { color: #b06f00; }
.tovar__stock b.order { color: #b06f00; }

/* ── оформление заказа ── */
.ofrm { background: var(--sh-card); border: .8px solid var(--sh-line); border-radius: var(--sh-radius);
	padding: 18px; display: flex; flex-direction: column; gap: 12px; }
.ofrm__step { font-size: 15px; }
.ofrm__two { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; }
.ofrm label { display: flex; flex-direction: column; gap: 5px; font-size: 12px; color: var(--sh-muted); }
.ofrm input[type="text"], .ofrm input[type="tel"], .ofrm select {
	padding: 10px 12px; border: 1px solid var(--sh-line); border-radius: 8px;
	font: inherit; font-size: 14px; color: var(--sh-ink); background: var(--sh-card); }
.ofrm__hint { font-size: 12px; color: var(--sh-muted); }
.ofrm__pick { flex-direction: row; align-items: center; gap: 12px; padding: 12px 14px;
	border: 1px solid var(--sh-line); border-radius: var(--sh-radius); cursor: pointer; }
.ofrm__pick:has(input:checked) { border-color: var(--sh-blue); border-width: 1.5px; background: var(--sh-soft); }
.ofrm__pick span { display: flex; flex-direction: column; gap: 2px; }
.ofrm__pick b { font-size: 14px; color: var(--sh-ink); }
.ofrm__pick i { font-style: normal; font-size: 12px; color: var(--sh-muted); }
.ofrm__sub { padding-left: 2px; }
.ofrm__agree { flex-direction: row; align-items: flex-start; gap: 8px; font-size: 12px;
	color: var(--sh-muted); cursor: pointer; }

/* ── заказ принят ── */
/* ⚠ Подложка замешана из зелёного витрины, а не задана числом. Светло-мятный
   #dbf5e9 не темнел с темой, и «Заказ принят» — последнее, что видит
   покупатель, — выходило белым текстом `--sh-ink` по мятному фону, то есть
   нечитаемым. Доля та же, что у плашки наличия в tovar.css: одна витрина —
   один замес. Первая строка — запасная для браузеров без color-mix. */
.done { background: var(--sh-bg);
	background: color-mix(in srgb, var(--sh-ok) 9%, var(--sh-card));
	border: 1px solid var(--sh-ok); border-radius: var(--sh-radius);
	padding: 20px; display: flex; flex-direction: column; gap: 6px; }
.done b { font-size: 24px; }
.done span { font-size: 14px; }

.steps { background: var(--sh-card); border: .8px solid var(--sh-line); border-radius: var(--sh-radius);
	padding: 18px; display: flex; flex-direction: column; gap: 12px; }
.steps > b { font-size: 16px; }
.steps__one { display: flex; align-items: flex-start; gap: 12px; }
.steps__one i { flex: none; width: 26px; height: 26px; border-radius: 999px; display: grid;
	place-items: center; font-style: normal; font-size: 12px; font-weight: 600;
	background: var(--sh-bg); color: var(--sh-muted); border: 1px solid var(--sh-line); }
/* ⚠ Цифра пройденного шага — цветом карточки, а не белым числом. Зелёный в
   тёмной теме сам светлый (#6ec98a), и белая единица на нём переставала
   читаться; `--sh-card` держит нужную сторону в обеих темах: на дневной он и
   есть белый, на ночной — тёмный, каким и должен быть текст по светлому. */
.steps__one.is-on i { background: var(--sh-ok); color: var(--sh-card); border-color: var(--sh-ok); }
.steps__one span { display: flex; flex-direction: column; gap: 2px; }
.steps__one b { font-size: 14px; color: var(--sh-muted); font-weight: 400; }
.steps__one.is-on b { color: var(--sh-ink); font-weight: 600; }
.steps__one em { font-style: normal; font-size: 12px; color: var(--sh-muted); }

/* Логотип арендатора вместо набранного названия. Высота ограничена, ширина
   свободна: у одних он квадратный значок, у других — длинная надпись, и
   подгонять оба под одну рамку значит растянуть один из них. */
.sh__logoimg { display: block; max-height: 40px; max-width: 220px; width: auto; height: auto; }

/* Товара нет ни у нас, ни у поставщика. Не кнопка: покупать нечего, и синяя
   заливка звала бы нажать. Ссылка ведёт в карточку, где есть телефон. */
.pcard__ask2 { display: block; text-align: center; padding: 10px 0; border-radius: 8px;
	border: 1px solid var(--sh-line); color: var(--sh-muted); font-size: 14px; }
.pcard__ask2:hover { border-color: var(--sh-blue); color: var(--sh-blue); text-decoration: none; }

/* ── подвал витрины ── */
/*
 * ⚠ Подвал НЕ прижат к низу окна. Чтобы прижимать, пришлось бы сделать body
 * флекс-колонкой, а на body уже висит шапка с мега-меню, которое выпадает
 * абсолютом. Дешевле, чтобы подвал просто шёл следом за main: на короткой
 * странице под ним останется фон витрины, и это не выглядит поломкой.
 */
.sf { background: var(--sh-card); border-top: 1px solid var(--sh-line); }
.sf__in { max-width: 1440px; margin: 0 auto; padding: 26px 32px; display: grid;
	grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 22px 32px; }
.sf__col { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; font-size: 13px; }
.sf__head { font-size: 14px; color: var(--sh-ink); }
.sf__col a { color: var(--sh-muted); }
.sf__col a:hover { color: var(--sh-blue); text-decoration: none; }
.sf__col span { color: var(--sh-muted); line-height: 1.45; }

/* Номер — единственное в подвале, что нажимают пальцем, поэтому он крупный и
   тёмный, как в шапке. ⚠ Селектор с тегом (a.sf__phone) намеренно: общее
   правило `.shop a` красит ссылки синим и иначе перебивает эту строку. */
.sf__col a.sf__phone { font-size: 17px; font-weight: 700; color: var(--sh-ink); }
.sf__col a.sf__phone:hover { color: var(--sh-blue); }

.sf__bot { border-top: 1px solid var(--sh-line); }
.sf__botin { max-width: 1440px; margin: 0 auto; padding: 13px 32px; display: flex;
	flex-wrap: wrap; align-items: baseline; gap: 4px 20px; font-size: 12px; color: var(--sh-muted); }
.sf__copy { white-space: nowrap; }
/* Оговорка про оферту забирает всю свободную ширину, а когда её не хватает —
   уходит на свою строку целиком, а не рвётся пополам рядом с названием. */
.sf__lex { flex: 1; min-width: 280px; }

@media (max-width: 900px) {
	/* Те же 16 px по краям, что у шапки и .wrap: колонки подвала обязаны
	   стоять по одной вертикали с товарами над ними. */
	.sf__in { padding: 22px 16px; gap: 20px; }
	.sf__botin { padding: 12px 16px; }
}

/* ── плитка: состояние и сравнение ── */
/*
 * ⚠ Правила стоят здесь, рядом с самой .pcard, а не в стилях каталога.
 * Плитка одна и та же на главной, в разделе, в поиске, в избранном и в
 * сравнении. Пока они лежали за приставкой .katalog, переключатель
 * состояния и кнопка сравнения работали только в каталоге, а на главной
 * разъезжались: разметка есть, оформления нет.
 */

/*
 * Переключатель состояния — слитная пара кнопок, как в макете: две отдельные
 * кнопки читались бы как два независимых действия, а это один выбор из двух.
 */
.pcard__states {
	display: flex;
	align-self: flex-start;
	max-width: 100%;
	border: 1px solid var(--sh-line);
	border-radius: 8px;
	overflow: hidden;
}

.pcard__state {
	padding: 5px 12px;
	font-size: 12px;
	color: var(--sh-muted);
	background: var(--sh-card);
	white-space: nowrap;
}

.pcard__state + .pcard__state { border-left: 1px solid var(--sh-line); }

.pcard__state:hover {
	text-decoration: none;
	color: var(--sh-blue);
	background: var(--sh-soft);
}

.pcard__state.is-on {
	background: var(--sh-soft);
	color: var(--sh-blue);
	font-weight: 600;
}

/*
 * ⚠ `margin-top: auto` прижимает кнопки ко дну плитки. Без него у товара без
 * фото или с коротким названием кнопка уезжает вверх, и в ряду из пяти плиток
 * «В корзину» стоит на пяти разных высотах.
 */
.pcard__row {
	display: flex;
	align-items: stretch;
	gap: 8px;
	margin-top: auto;
}

.pcard__row .pcard__buy,
.pcard__row .pcard__ask2 { flex: 1; min-width: 0; }

.pcard__cmp { margin: 0; flex: none; }

.pcard__cmp button {
	display: grid;
	place-items: center;
	width: 40px;
	height: 100%;
	min-height: 40px;
	padding: 0;
	border: 1px solid var(--sh-line);
	border-radius: 8px;
	background: var(--sh-card);
	color: var(--sh-muted);
	cursor: pointer;
}

.pcard__cmp button:hover {
	border-color: var(--sh-blue);
	color: var(--sh-blue);
}

/* Отмеченное видно и без подписи: кнопка выглядит нажатой. */
.pcard__cmp button.is-on {
	border-color: var(--sh-blue);
	background: var(--sh-soft);
	color: var(--sh-blue);
}


/*
 * Кнопки одной высоты в ряду.
 *
 * ⚠ Форма растянута рядом с квадратной кнопкой сравнения, а сама кнопка тянется
 * по форме — иначе «В корзину» и весы стоят разной высоты и ряд выглядит
 * собранным на глаз. Ссылка «Узнать о поступлении» центрируется отдельно: без
 * этого её текст прилипает к верху растянутой строки.
 */
.pcard__row .pcard__buy { display: flex; margin: 0; }
.pcard__row .pcard__buy button { flex: 1; }
.pcard__row .pcard__ask2 { display: grid; place-items: center; padding: 8px 6px; }

/* ── плитка: где лежит товар и что с ним можно ── */

/*
 * Плашки складов поверх фото.
 *
 * ⚠ Это ГДЕ товар, а не сколько его. «Офлайн» — лежит на нашей полке, можно
 * забрать сегодня. «Онлайн» — у поставщика, приедет за два-три дня. У одного
 * товара бывают обе: новый у поставщика, б/у у нас. Раньше вместо них стояла
 * строка «Под заказ — 2–3 дня», которая молчала про то, что часть товара
 * лежит рядом.
 */
/* ⚠ Больше НЕ абсолютная: угол фотографии держит общая колонка
   `.pcard__flags` — иначе плашка скидки легла бы прямо на эти две. Место на
   экране не изменилось: колонка стоит ровно там, где стояли они (left/top 8). */
.pcard__where { display: flex; gap: 6px; }
.pcard__mark { font-size: 11px; font-weight: 600; border-radius: 999px; padding: 2px 9px; }
/* ⚠ Обе плашки замешаны из токенов, а не из своих чисел. Светло-зелёный
   #e8f6ee не темнел с темой, и текст `--sh-ok` (в тёмной он сам светло-зелёный)
   ложился зелёным по зелёному — «Офлайн» пропадал с плитки целиком. Первые
   строки — запасные для браузеров без color-mix. */
.pcard__mark--off { color: var(--sh-ok);
	background: var(--sh-bg);
	background: color-mix(in srgb, var(--sh-ok) 9%, var(--sh-card));
	border: .8px solid var(--sh-line);
	border-color: color-mix(in srgb, var(--sh-ok) 28%, var(--sh-card)); }
.pcard__mark--on { color: var(--sh-blue); background: var(--sh-soft); border: .8px solid var(--sh-soft);
	border-color: color-mix(in srgb, var(--sh-blue) 30%, var(--sh-card)); }

/*
 * Свидетельства: «купили 12 раз» и «осталось 2 шт».
 *
 * ⚠ ЭТО НЕ ПЛАШКИ. Плашками у нас говорят про скидку и про склад — то, что
 * должно бросаться в глаза с ряда плиток. Здесь другое: число, которое человек
 * читает, уже выбрав товар глазами. Сделай мы его таким же ярким, на плитке
 * оказалось бы четыре кричащих ярлыка, и не заметен стал бы ни один.
 *
 * ⚠ Мелкий текст в одну строку и без своих отступов: строка появляется у
 * одного товара и не появляется у соседнего, и всё, что она добавляет к высоте
 * плитки, тут же становится ступенькой в ряду каталога.
 */
.pcard__proof { display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
	font-size: 12px; line-height: 1.4; }
.pcard__bought { color: var(--sh-muted); }
/* ⚠ «Осталось» — единственное здесь, что торопит, и цвет у него тот же, каким
   витрина говорит о нехватке. Свой оранжевый стал бы четвёртым красным
   оттенком магазина и не сошёлся бы с перекрашенной темой арендатора. */
.pcard__left { color: var(--sh-warn); font-weight: 600; }

/* Цена «по запросу» — не число, и весом её выделять незачем. */
.pcard__price--ask { font-size: 14px; font-weight: 500; color: var(--sh-muted); }

/*
 * ⚠ Состояние, которого нет в наличии, не нажимается. Переключиться на «Б.У»,
 * которого нет, значит увидеть пустую цену и решить, что сайт сломался.
 * Гасим, но оставляем на месте: исчезнувшая кнопка не объясняет, почему у
 * соседнего товара их две, а тут одна.
 */
.pcard__state { border: 0; font: inherit; cursor: pointer; }
.pcard__state:disabled { color: var(--sh-line); cursor: not-allowed; background: var(--sh-bg); }
.pcard__state:disabled:hover { color: var(--sh-line); background: var(--sh-bg); }

/* Нет ни того, ни другого — вместо кнопки честная строка, а не мёртвая кнопка. */
.pcard__ask2--dead { color: var(--sh-muted); border-color: var(--sh-line); cursor: default; }
.pcard__ask2--dead:hover { color: var(--sh-muted); border-color: var(--sh-line); }

/* ── мгновенная подсказка ────────────────────────────────────────────── */

/*
 * ⚠ Своя подсказка вместо `title`. Браузер показывает `title` через полторы-две
 * секунды — и человек за это время успевает решить, что кнопка «Б.У» просто
 * сломана: она не нажимается и молчит. Подсказка обязана появляться в тот же
 * миг, когда на неё навели.
 *
 * ⚠ Пустой `data-tip` не показывает ничего: у доступного состояния объяснять
 * нечего, а пустой чёрный квадратик под курсором читался бы как сбой.
 *
 * ⚠ Ряд на главной прокручивается вбок (`overflow-x: auto`), и всё, что выйдет
 * за плитку, будет обрезано. Поэтому подсказка встаёт ПОД элементом, внутри
 * карточки, а не над ним и не сбоку.
 */
[data-tip] { position: relative; }

[data-tip]:hover::after,
[data-tip]:focus-visible::after {
	content: attr(data-tip);
	position: absolute;
	left: 50%;
	top: calc(100% + 6px);
	transform: translateX(-50%);
	z-index: 5;
	width: max-content;
	max-width: 180px;
	padding: 6px 9px;
	border-radius: 6px;
	/* ⚠ Подсказка выворачивается наизнанку вместе с темой: тёмная плашка со
	   светлым текстом на дневной странице и светлая с тёмным — на ночной.
	   Зашитый #1f2a37 в тёмной теме почти совпадал с фоном плитки (#171e26), и
	   объяснение, почему кнопка «Б.У» не нажимается, читалось как пятно. */
	background: var(--sh-ink);
	color: var(--sh-card);
	font-size: 11px;
	font-weight: 400;
	line-height: 1.35;
	text-align: center;
	white-space: normal;
	pointer-events: none;
}

[data-tip=""]:hover::after,
[data-tip=""]:focus-visible::after { content: none; }

/* ⚠ Отключённую кнопку Chrome не считает наведённой, если на ней стоит
   `pointer-events: none` из общих правил, — здесь возвращаем события, иначе
   подсказка у недоступного состояния не покажется никогда. */
.pcard__state:disabled { pointer-events: auto; }

/*
 * ── тёмная тема витрины ─────────────────────────────────────────────────
 *
 * ⚠ Меняем ТОЛЬКО значения токенов, ни одного нового правила. Витрина целиком
 * построена на `--sh-*`, и второй набор селекторов означал бы, что половина
 * страницы однажды останется светлой: правку цвета сделают в одном месте, а
 * забудут в другом.
 *
 * ⚠ Тему ставит атрибут на `<html>`, а не медиа-запрос. Системная тема —
 * догадка про освещение, а нажатие на значок в шапке — прямое указание, и оно
 * должно быть сильнее. Атрибут проставляется до отрисовки, в `<head>`.
 *
 * ⚠ Синий взят светлее дневного (#4c8dff вместо #0d6efd): фирменный оттенок на
 * тёмном фоне теряет контраст, и кнопка «В корзину» читается как выключенная.
 * Это не другой бренд — это тот же цвет, поднятый до читаемого.
 */
:root[data-shop-theme="dark"] {
	--sh-bg: #10151b;
	--sh-card: #171e26;
	--sh-line: #2a333d;
	--sh-ink: #e8edf2;
	--sh-muted: #97a4b0;
	--sh-blue: #4c8dff;
	/* ⚠ Наведение обязано ехать за синим. Обычно `--sh-blue-dark` приходит из
	   настроек арендатора (ShopTheme затемняет его цвет на 14 %), но тёмная
	   тема синий уже подменила — и без этой строки кнопка под курсором прыгала
	   бы с #4c8dff на дневной тёмно-синий. Значение то же затемнение на 14 %,
	   только от ночного оттенка. */
	--sh-blue-dark: #4179db;
	--sh-soft: #1b2b40;
	--sh-ok: #6ec98a;
	--sh-warn: #ff8f8f;

	/* ⚠ Цифра и чип светлеют вместе со всей палитрой, а плашка на фотографии —
	   НЕТ. На ней белый текст, и подними мы её так же, как остальное, белое по
	   светло-розовому стало бы нечитаемым ровно там, где стоит главное число
	   акции. Фотография под плашкой своей яркости не меняет вовсе. */
	--sh-sale: #ff7b83;
	--sh-sale-soft: #3a1b20;
	--sh-sale-deep: #b3283a;

	/* ⚠ Тень липкой шапки гуще дневной. Та же прозрачность на тёмном фоне
	   пропадает, и прокрученная страница выглядит приклеенной к шапке. */
	--sh-lift: 0 6px 18px rgba(0, 0, 0, .55);
}

/*
 * Что не чинится подменой токена — правим поимённо. Таких мест немного, и
 * каждое здесь по своей причине: поле и заглушки на дневной странице стоят
 * светлее фона, а на ночной должны стоять ТЕМНЕЕ карточки, иначе плитка
 * выглядит подсвеченной изнутри; тени рассчитаны на светлую страницу и на
 * тёмной не видны вовсе, пока не сделать их гуще.
 *
 * ⚠ Цвет числом сюда больше не попадает: правила витрины держатся на `--sh-*`,
 * и новое исключение почти наверняка означает, что где-то выше вместо токена
 * снова поставили #.
 */
:root[data-shop-theme="dark"] .sh__find input,
:root[data-shop-theme="dark"] .pcard__pic .pic,
:root[data-shop-theme="dark"] .htile,
:root[data-shop-theme="dark"] .hbrand { background: var(--sh-bg); }

:root[data-shop-theme="dark"] .shcat__in { box-shadow: 0 18px 50px rgba(0, 0, 0, .5); }
:root[data-shop-theme="dark"] .sh__menu { box-shadow: 0 12px 30px rgba(0, 0, 0, .5); }

/* Картинки товаров сняты на белом фоне — на тёмной странице они бьют по
   глазам меньше, если чуть притушить. Не прячем: товар должен быть виден. */
:root[data-shop-theme="dark"] .pcard__pic img,
:root[data-shop-theme="dark"] .hday__pic img { filter: brightness(.92); }

/* ── телефон и Telegram ── */

/*
 * ⚠ Телефон остаётся словами, а не прячется под значок трубки. В магазине, где
 * у трети позиций «цена по запросу», звонок — главный способ купить; значок
 * стоил бы одного лишнего движения там, где счёт идёт на секунды.
 */
/* ⚠ Номер крупнее соседних значков и НЕ синий: синим на витрине помечено
   нажимаемое-второстепенное (ссылки, «Все …»), а телефон — то, ради чего
   звонят. Чёрный делает его заметнее любого цвета в этой строке. */
.sh__phone { color: var(--sh-ink); font-weight: 700; font-size: 15px; white-space: nowrap; margin-right: 4px; letter-spacing: .01em; }
.sh__phone:hover { color: var(--sh-blue); text-decoration: none; }

/* Фирменный цвет Telegram — только при наведении: в покое строка значков
   должна читаться как одно целое, а не пестрить чужими логотипами. */
.sh__ico--tg:hover { color: #229ed9; background: rgba(34, 158, 217, .12); }

@media (max-width: 900px) {
	/* На узком экране номер уступает место значкам: позвонить можно и со
	   страницы контактов, а корзину оттуда не открыть. */
	.sh__phone { display: none; }
}
