/* Базовый сброс заголовков. color был захардкожен #01090c (не токен) - на
   большинстве страниц это не видно, т.к. .goods/.contact/.pdp/.prose и т.п.
   переопределяют color сами, но .contact_right h4 (телефон в карточке
   контактов) ничего не переопределяет и рисовался этим хардкодом, а не
   --color-ink - на глаз оттенки почти неотличимы (оба почти-чёрные), поэтому
   расхождение не заметили раньше. */
h1,h2,h3,h4,h5,h6 {
	letter-spacing: 0px;
	padding: 0 0 10px 0;
	font-weight: 600;
	line-height: 140%;
	color: var(--color-ink);
}
h1 {
	font-size: 20px;
}
h2 {
	font-size: 18px;
}
h3 {
	font-size: 16px;
}
h4 {
	font-size: 16px;
	margin-top: 0;
}
h5 {
	font-size: 14px;
}
h6 {
	font-size: 13px;
}
/* .info (было: 16x16 квадрат #fd2015 - не фирменный красный, а другой оттенок)
   удалён: проверено grep -a по всему дереву проекта, класса "info" нет ни в
   одной разметке. Мёртвый код чужого шаблона. */

/* Вступительный текст раздела каталога (Content::PrintContent, goods.php) -
   печатается перед плиткой товаров/подразделов, если у раздела в БД заполнены
   descriptpath/descriptfile. На стенде такого текста нет ни у одной фикстуры
   (потому и не был замечен раньше), но метод и разметка живые - на проде
   могут быть заполненные разделы. Было Verdana 11px #000000 text-align:justify
   margin:0 10% - другой шрифт, размер мельче всего остального текста на
   сайте, хардкод-чёрный вместо токена, justify (рваные пробелы на коротких
   строках) и margin в процентах вместо сетки контента. Приведено к тому же
   языку, что вводный абзац о компании (.prose-lead): та же ширина контента
   1200px/отступы var(--space-5), что у breadcrumbs/.subgoods
   на той же странице, иначе вступительный текст «гулял» бы по горизонтали
   относительно всего остального на странице раздела. */
.topdescript
{
	max-width: 1200px;
	margin: 0 auto var(--space-5);
	padding: 0 var(--space-5);
	font-family: var(--font-body);
	font-size: 16px;
	line-height: 1.6;
	color: var(--color-ink-soft);
	text-decoration: none;
	text-align: left;
}

/* Смена цвета рамки/текста недостаточна для клавиатурного фокуса (DESIGN.md).
   .company_address a, .breadcrumbs a, .contact_right h4 a -
   обычные текстовые ссылки в контенте, а не карточки/кнопки - у них был только
   :hover-стиль цвета, без явного outline. Собраны в одно правило: у всех
   одинаковое требование, один источник, не три копии. */
.company_address a:focus-visible,
.breadcrumbs a:focus-visible,
.contact_right h4 a:focus-visible {
	outline: 2px solid var(--color-ink);
	outline-offset: 2px;
}
/* ---------- Контентные страницы ---------- */

/* Контейнер контента страницы (about / news / prod / policy / разделы каталога) */
.goods {
	/* width:100%, не auto: .goods - прямой ребёнок .page-wrap (flex,
	   align-items:stretch по умолчанию) - при width:auto стретч иногда не
	   срабатывал и .goods схлопывался по контенту (~916px вместо 1200,
	   жалоба 2026-08-09 про /products/). max-width+margin ниже по-прежнему
	   кадрируют и центрируют поверх 100%, так что тут ничего не меняется
	   визуально там, где бага не было. */
	width: 100%;
	max-width: 1200px;
	margin: 0 auto;
	padding: var(--space-6) var(--space-5) var(--space-8);
	float: none;
	display: block;
	font-family: var(--font-body);
	font-size: 16px;
	line-height: 1.7;
	color: var(--color-ink);
}

.goods h1,
.goods h2,
.goods h3,
.search-page h1 {
	font-family: var(--font-heading);
	color: var(--color-ink);
	line-height: 1.25;
	padding: 0;
}

.goods h1,
.search-page h1 {
	/* .search-page h1 добавлен сюда же (2026-08-11, просьба заказчицы
	   "сделай название... также как и везде, как контакты, продукция") -
	   раньше у .search-page не было отдельного правила для h1 вообще,
	   заголовок "Поиск по каталогу" падал на дефолтный браузерный стиль
	   вместо общего фирменного заголовка страниц сайта. */
	font-size: 32px;
	font-weight: 700;
	margin: 0 0 var(--space-5);
}

.goods h2 {
	font-size: 22px;
	font-weight: 600;
	margin: var(--space-7) 0 var(--space-4);
}

.goods h3 {
	font-size: 18px;
	font-weight: 600;
	margin: var(--space-6) 0 var(--space-3);
}

/* Текстовая колонка: 65-75 символов в строке.
   Шире делать нельзя - длинные строки не читаются. Центрируем, иначе на широком
   экране колонка прижимается к левому краю и выглядит съехавшей. */
.prose {
	max-width: 72ch;
	margin-inline: auto;
}

.prose p {
	margin: 0 0 var(--space-4);
}

.prose > p:last-child {
	margin-bottom: 0;
}

.prose a {
	color: var(--color-link);
	text-decoration: underline;
	text-underline-offset: 2px;
	transition: color var(--transition-fast);
}

.prose a:hover,
.prose a:focus-visible {
	color: var(--color-brand-red-dark);
}

.prose strong,
.prose b {
	font-weight: 700;
}

/* Подзаголовок под h1 */
.prose-lead {
	font-size: 18px;
	line-height: 1.6;
	color: var(--color-ink-soft);
	margin: 0 0 var(--space-6);
}

/* Хронология "С 2014 года ..." */
.timeline {
	list-style: none;
	margin: 0 0 var(--space-5);
	padding: 0;
	border-left: 2px solid var(--color-border);
}

.timeline li {
	position: relative;
	margin: 0;
	padding: 0 0 var(--space-4) var(--space-5);
}

.timeline li:last-child {
	padding-bottom: 0;
}

.timeline li::before {
	content: "";
	position: absolute;
	left: -5px;
	top: 9px;
	width: 8px;
	height: 8px;
	border-radius: 50%;
	background: var(--color-brand-red);
}

.timeline-year {
	display: block;
	font-family: var(--font-heading);
	font-weight: 600;
	font-size: 14px;
	letter-spacing: 0.04em;
	color: var(--color-brand-red);
}

/* Списки в тексте */
.policy-list {
	list-style: disc;   /* явно: чужой сброс уже прятал маркеры глобально */
	margin: 0 0 var(--space-4);
	padding-left: var(--space-5);
}

.policy-list li {
	list-style-type: disc;   /* сброс ol,ul,li{list-style:none} в layout.css бьёт прямо по li, наследование от .policy-list его не перекрывает */
	margin-bottom: var(--space-2);
}

.policy-updated {
	margin-top: var(--space-6);
	padding-top: var(--space-4);
	border-top: 1px solid var(--color-border);
	color: var(--color-ink-soft);
	font-size: 14px;
}

/* Новости */
.news-list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: var(--space-4);
}

.news-item {
	padding: var(--space-5);
	background: var(--color-bg-alt);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-md);
}

.news-date {
	display: block;
	font-family: var(--font-heading);
	font-size: 14px;
	font-weight: 600;
	color: var(--color-brand-red);
	margin-bottom: var(--space-2);
}

.news-item p {
	margin: 0;
}

/* Пустое состояние */
.empty-state {
	margin: 0;
	padding: var(--space-6);
	background: var(--color-bg-alt);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-md);
	color: var(--color-ink-soft);
	text-align: center;
}

/* Блок услуги на странице «Продукция и услуги» */
.service-cta {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var(--space-5);
	margin: 0 0 var(--space-7);
	padding: var(--space-6);
	background: var(--color-bg-alt);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-lg);
}

.service-cta-text {
	flex: 1 1 320px;
	min-width: 0;
}

.goods .service-cta-text h2 {
	margin: 0 0 var(--space-2);
	font-size: 22px;
}

.service-cta-text p {
	margin: 0;
	max-width: 62ch;
	font-size: 16px;
	line-height: 1.6;
	color: var(--color-ink-soft);
}

.service-cta-btn {
	flex: 0 0 auto;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 44px;
	padding: var(--space-3) var(--space-5);
	font-family: var(--font-heading);
	font-size: 15px;
	font-weight: 600;
	line-height: 1;
	color: #fff;
	text-decoration: none;
	background: var(--color-brand-red);
	border-radius: var(--radius-sm);
	transition: background-color var(--transition-base);
}

.service-cta-btn:hover {
	background: var(--color-brand-red-dark);
	color: #fff;
}

.service-cta-btn:focus-visible {
	outline: 2px solid var(--color-ink);
	outline-offset: 2px;
}

/* Кнопка + вторичная ссылка одной группой: раньше кнопка была единственным
   действием и лежала прямо в .service-cta (flex со space-between). Теперь
   действий два - основное (калькулятор) и запасное (форма-заявка для тех, у
   кого нет гербер-файлов), поэтому им нужна своя обёртка, иначе space-between
   расшвыривает их по краям блока как два независимых элемента. */
.service-cta-actions {
	flex: 0 0 auto;
	display: flex;
	flex-direction: column;
	/* flex-end, а не flex-start: ссылка шире кнопки, и при выравнивании по
	   левому краю она вылезала правее кнопки в никуда. По правому краю оба
	   элемента заканчиваются там же, где правый край самой плашки. */
	align-items: flex-end;
	gap: var(--space-2);
}

/* Вторичное действие - текстовая ссылка, а не вторая кнопка: две кнопки рядом
   читались бы как равнозначные, а основной путь здесь один (см. DESIGN.md про
   единственный акцент в блоке). */
.service-cta-link {
	font-family: var(--font-body);
	font-size: 14px;
	line-height: 1.4;
	color: var(--color-ink-soft);
	text-decoration: underline;
	text-underline-offset: 2px;
}

.service-cta-link:hover {
	color: var(--color-brand-red);
}

.service-cta-link:focus-visible {
	outline: 2px solid var(--color-ink);
	outline-offset: 2px;
}

/* Заголовок над плиткой разделов */
.goods .section-title {
	margin: 0 0 var(--space-5);
	font-size: 22px;
}

/* Сетка разделов каталога.
   font-family переопределён явно: vendor/zui.min.css содержит правило
   `.icon, [class*=" icon-"], [class^=icon-] { font-family: ZenIcon; }`
   (иконочный шрифт zui) — .icon-grid попадает под [class^=icon-] по имени и
   без этой строки получал бы ZenIcon вместо Nunito Sans. Сейчас это не видно
   (сам .icon-grid текста не несёт, только .icon-карточки со своим шрифтом),
   но при первом же прямом тексте в контейнере шрифт «поехал» бы молча. */
/* minmax(220px, ...), не 200px - .subgoods (второй такой же по смыслу грид
   плиток разделов, classes/podrazdel.php) использует 220px. Разница в 20px
   в минимуме меняет то, сколько треков auto-fill создаёт при том же
   доступном месте - при ОДНОМ реальном элементе (как на /products/ и
   /laser-machines/ сейчас) это давало разное количество треков (5 против 4)
   и, соответственно, разную итоговую ширину плитки - карточка на /products/
   получалась заметно мельче карточки на /laser-machines/, хотя обе должны
   выглядеть одинаково (жалоба 2026-08-09 со скриншотами: "они разные, ты не
   видишь?"). */
.icon-grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
	gap: var(--space-6);
	margin: 0;
	padding: 0;
	font-family: var(--font-body);
}

.icon {
	display: flex;
	flex-direction: column;
	gap: var(--space-3);
	margin: 0;
	padding: var(--space-5);
	width: auto;
	height: auto;
	float: none;
	position: relative;
	font-family: var(--font-body);
	font-size: 15px;
	color: var(--color-ink);
	text-align: center;
	text-decoration: none;
	background: var(--color-bg);
	border: none;
	border-radius: var(--radius-md);
	transition: box-shadow var(--transition-base);
}

/* Раньше на плитке РАЗДЕЛА каталога был бейдж-значок в углу (сперва корзина,
   потом стрелка) - убран совсем 2026-08-08: вся карточка и так кликабельна
   и ведёт внутрь раздела, отдельный значок ничего не добавлял, только
   путался под ногами ("а зачем вообще эта стрелка на карточках?"). */

/* Смены цвета рамки для клавиатуры недостаточно - нужно явное кольцо фокуса. */
.icon:focus-visible,
.icon a:focus-visible,
.prose a:focus-visible {
	outline: 2px solid var(--color-ink);
	outline-offset: 2px;
}

/* Место под картинку резервируется заранее - без скачка вёрстки при загрузке */
.iconpic {
	position: static;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	aspect-ratio: 3 / 2;
	overflow: hidden;
}

/* object-fit: cover, не contain - contain оставлял разное количество
   пустого места вокруг фото в зависимости от его собственных пропорций
   (квадратное фото - узкая картинка в середине 3:2 бокса, широкое -
   заполняет целиком) - плитки внутри одинакового бокса выглядели визуально
   РАЗНОГО размера (жалоба 2026-08-09: "надо чтобы размер этих квадратиков
   был всегда одинаковый независимо от фотографии"). cover + width/height
   100% обрезает фото по краям, но заполняет бокс всегда одинаково. */
.iconpic img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

.iconlink {
	position: static;
	width: auto;
	margin: 0;
	font-family: var(--font-heading);
	font-weight: 500;
	line-height: 1.35;
	color: var(--color-ink);
}

.icon:hover .iconlink,
.icon:focus-visible .iconlink {
	color: var(--color-brand-red);
}

/* Карточки, где ссылки лежат внутри (разделы каталога из customclasses.php) */
.icon a {
	color: var(--color-ink);
	text-decoration: none;
}

.icon a:hover,
.icon a:focus-visible {
	color: var(--color-brand-red);
}

.icon img {
	max-width: 100%;
	height: auto;
}

/* Страница результатов поиска (/search/, pages/search.html) - 2026-08-11,
   форма поиска раньше вела на несуществующий search.php (см. TZ.md). Та же
   поверхность/сетка, что у .goods/.icon-grid - переход между поиском и
   разделом каталога не должен ощущаться как другой сайт. */
.search-page {
	max-width: 1200px;
	margin: 0 auto;
	padding: var(--space-6) var(--space-5);
}

.search-page-form {
	display: flex;
	gap: var(--space-3);
	width: 100%;
	margin: 0 0 var(--space-5);
}

.search-page-input {
	flex: 1 1 auto;
	min-width: 0;
	padding: var(--space-3) var(--space-4);
	font: inherit;
	color: var(--color-ink);
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-md);
}

.search-page-submit {
	flex: 0 0 auto;
	padding: var(--space-3) var(--space-5);
	font: inherit;
	font-weight: 600;
	color: var(--color-bg);
	background: var(--color-brand-red);
	border: 0;
	border-radius: var(--radius-md);
	cursor: pointer;
}

.search-page-submit:hover,
.search-page-submit:focus-visible {
	background: var(--color-brand-red-dark);
}

.search-page-count {
	margin: 0 0 var(--space-4);
	color: var(--color-ink-soft);
}

.search-load-more {
	display: block;
	width: fit-content;
	margin: var(--space-6) auto 0;
	padding: var(--space-3) var(--space-6);
	font-family: var(--font-heading);
	font-weight: 600;
	font-size: 14px;
	color: var(--color-ink);
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-md);
	text-decoration: none;
	cursor: pointer;
	transition: border-color var(--transition-base);
}

.search-load-more:hover,
.search-load-more:focus-visible {
	border-color: var(--color-brand-red);
	color: var(--color-brand-red);
}

.search-page-subtitle {
	margin: var(--space-6) 0 var(--space-3);
	font-family: var(--font-heading);
	font-size: 18px;
	font-weight: 600;
	color: var(--color-ink);
}

.search-page-subtitle:first-of-type {
	margin-top: 0;
}

.search-results {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
	gap: var(--space-4);
	margin: 0;
	padding: 0;
}

.search-result {
	display: flex;
	align-items: center;
	gap: var(--space-3);
	padding: var(--space-3);
	color: inherit;
	text-decoration: none;
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-md);
	transition: border-color var(--transition-base);
}

.search-result:hover,
.search-result:focus-visible {
	border-color: var(--color-brand-red);
}

.search-result-thumb {
	flex: 0 0 auto;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 64px;
	aspect-ratio: 1 / 1;
	overflow: hidden;
	background: var(--color-bg-alt);
	border-radius: var(--radius-sm);
}

.search-result-thumb img {
	width: 100%;
	height: 100%;
	object-fit: contain;
}

.search-result-info {
	display: flex;
	flex-direction: column;
	gap: 2px;
	min-width: 0;
}

.search-result-name {
	font-family: var(--font-heading);
	font-weight: 600;
	color: var(--color-ink);
}

.search-result-section {
	font-size: 13px;
	color: var(--color-ink-soft);
}

/* Фильтры по параметрам (pages/search.html) - задача заказчицы 2026-08-11:
   "нужен поисковик с фильтрами по параметрам по каталогу товаров". Сетка
   вместо flex, чтобы сайдбар не "прыгал" по высоте относительно колонки
   результатов - 260px фиксированной ширины, тот же принцип, что уже
   применяется на сайте для похожих раскладок "сайдбар + контент". */
.search-layout {
	display: grid;
	grid-template-columns: 260px 1fr;
	gap: var(--space-6);
	align-items: start;
}

.search-filters {
	display: flex;
	flex-direction: column;
	gap: var(--space-4);
	padding: var(--space-4);
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-md);
	position: sticky;
	top: var(--space-4);
}

.search-filters-title {
	margin: 0;
	font-family: var(--font-heading);
	font-size: 16px;
	font-weight: 600;
	color: var(--color-ink);
}

/* <details>/<summary>, не <fieldset>/<legend> - список значений одного
   параметра может быть длинным (жалоба заказчицы 2026-08-11: "чтобы
   фильтры были раскрывающим списком"). Стрелка-индикатор - тот же приём,
   что уже в admin.css (.adm-nav-danger-summary::before) - повторно решённая
   задача "collapsible-секция", нет смысла придумывать новый вид. */
.search-filter-group {
	margin: 0;
	padding-top: var(--space-3);
	border-top: 1px solid var(--color-border);
}

.search-filter-group summary {
	display: flex;
	align-items: center;
	gap: var(--space-2);
	padding: 0 0 var(--space-2);
	font-size: 13px;
	font-weight: 600;
	color: var(--color-ink);
	cursor: pointer;
	list-style: none;
}

.search-filter-group summary::-webkit-details-marker {
	display: none;
}

.search-filter-group summary::before {
	content: '▸';
	display: inline-block;
	width: 1em;
	color: var(--color-ink-soft);
}

.search-filter-group[open] > summary::before {
	content: '▾';
}

.search-filter-option {
	display: flex;
	align-items: center;
	gap: var(--space-2);
	padding: var(--space-1) 0;
	font-size: 14px;
	color: var(--color-ink);
	cursor: pointer;
}

.search-filter-option input[type="checkbox"] {
	accent-color: var(--color-brand-red);
	width: 16px;
	height: 16px;
	flex: 0 0 auto;
}

.search-filter-option span:first-of-type {
	flex: 1 1 auto;
}

.search-filter-count {
	color: var(--color-ink-soft);
	font-size: 12px;
}

.search-filter-actions {
	display: flex;
	flex-direction: column;
	gap: var(--space-2);
}

.search-filter-apply {
	padding: var(--space-2) var(--space-4);
	font: inherit;
	font-weight: 600;
	color: var(--color-bg);
	background: var(--color-brand-red);
	border: 0;
	border-radius: var(--radius-md);
	cursor: pointer;
}

.search-filter-apply:hover,
.search-filter-apply:focus-visible {
	background: var(--color-brand-red-dark);
}

.search-filter-reset {
	text-align: center;
	font-size: 13px;
	color: var(--color-ink-soft);
	text-decoration: underline;
}

.search-filter-reset:hover,
.search-filter-reset:focus-visible {
	color: var(--color-brand-red);
}

@media (max-width: 900px) {
	.search-layout {
		grid-template-columns: 1fr;
	}

	.search-filters {
		position: static;
	}
}
@media (max-width: 620px){
	.goods {
		padding: var(--space-5) var(--space-4) var(--space-6);
	}

	.goods h1 {
		font-size: 26px;
	}

	.icon-grid {
		grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
		gap: var(--space-4);
	}}@media (prefers-reduced-motion: reduce){
	.icon,
	.icon::after,
	.prose a,
	.service-cta-btn {
		transition: none;
	}}
/* Карточки подразделов каталога (класс Podrazdel).
   Раньше это была раскладка на text-align: justify с font-size:1px у родителя и
   «лекарствами для IE6-7». Теперь та же плитка, что и на /prod/, чтобы переход
   из раздела в подраздел не выглядел переходом на другой сайт.
   В разметке заголовок идёт перед картинкой, поэтому порядок правим через order. */
/* Заголовок страницы подраздела (Podrazdel::PrintPodrazdel, например
   /laser-machines/) - раньше такие страницы не печатали вообще никакого
   заголовка, только плитку разделов (жалоба 2026-08-09: "надо бы большими
   буквами название раздела написать"). Не .pdp-title напрямую - тот
   рассчитан на обёртку .pdp (max-width/паддинги), а тут заголовок - прямой
   сосед .subgoods без такой обёртки, поэтому та же ширина/паддинг, что у
   .subgoods, продублированы здесь явно. */
.podrazdel-title {
	max-width: 1200px;
	margin: 0 auto;
	padding: var(--space-6) var(--space-5) var(--space-5);
	font-family: var(--font-heading);
	/* 22px - тот же размер, что у "Разделы каталога" (.section-title на
	   /products/), по просьбе пользователя 2026-08-09 - не крупный 26px
	   .pdp-title карточки товара. */
	font-size: 22px;
	font-weight: 700;
	color: var(--color-ink);
}

.subgoods {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
	gap: var(--space-6);
	width: auto;
	max-width: 1200px;
	min-height: 0;
	margin: 0 auto;
	padding: 0 var(--space-5) var(--space-7);
	text-align: left;
	line-height: normal;
	font-size: 16px;
}

.subgoods > div {
	display: flex;
	flex-direction: column;
	gap: var(--space-3);
	width: auto;
	height: auto;
	position: relative;
	padding: var(--space-5);
	font-family: var(--font-body);
	font-size: 15px;
	line-height: normal;
	text-align: center;
	vertical-align: top;
	background: var(--color-bg);
	border: none;
	border-radius: var(--radius-md);
	transition: box-shadow var(--transition-base);
}

.bigiconheader {
	order: 2;
	height: auto;
	font-family: var(--font-heading);
	font-size: 15px;
	font-weight: 500;
	line-height: 1.35;
	text-align: center;
}

.bigiconheader a {
	color: var(--color-ink);
	text-decoration: none;
}

.bigiconheader a:hover,
.bigiconheader a:focus-visible {
	color: var(--color-brand-red);
}

.bigiconimage {
	order: 1;
	text-align: center;
}

/* Место под картинку резервируется заранее — без скачка вёрстки при загрузке */
.bigiconimage a {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	aspect-ratio: 3 / 2;
	overflow: hidden;
}

/* object-fit: cover - тот же приём, что у .iconpic img выше (одинаковый
   размер плитки независимо от пропорций исходного фото). */
.bigiconimage img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

.bigiconimage:hover {
	box-shadow: none;   /* тень теперь у всей карточки, а не у картинки */
}

.bigiconheader a:focus-visible,
.bigiconimage a:focus-visible {
	outline: 2px solid var(--color-ink);
	outline-offset: 2px;
}@media (max-width: 620px){
	.subgoods {
		grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
		gap: var(--space-4);
		padding: 0 var(--space-4) var(--space-6);
	}}@media (prefers-reduced-motion: reduce){
	.subgoods > div,
	.subgoods > div::after {
		transition: none;
	}}

/* новая верстка вывода товаров*/
.box {
	display: table-cell;
	text-align: left;
	vertical-align:top;
}

.tradepage {
	margin:0 auto 2%;
	min-width: 275px;
	max-width: 80%;
	border:1px solid #ccc;
	font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: #000000; text-decoration: none;
//float:left;
}
.tradepage_color {
	width: 80%;
	margin: 0 auto;
//min-height: 100%;
	font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: #000000; text-decoration: none;
//float:left;
}

.tradepagename {
	width:100%;
	background:#eee;
	font-family: 'Open Sans', sans-serif;
	font-size: 1.5em;
	font-weight:bold;
	text-align: center;
}

.tradepage_horizontal_block {
	display:table;
	width: 100%;
// height: 100%;
	border:2px solid #888;
	margin-bottom: 3px;
}

.tradepage_photo_block {
	margin: 25px 0 0 0;
}

.tradepagephoto {
	min-width: 270px;
	width: 30%;
	text-align: center;
}

.tradepageledphoto {
	min-width: 270px;
	text-align: center;
	width: 5%;
}

.tradepagedescript {
	min-width: 250px;
}

.descripttext {
	font-size: 14px;
	padding: 10px;
}

.tradepagedescript {
	min-width: 270px;
//width: 30%;
}

.tradepage_price_block {
	min-width: 180px;
	width: 30%;
	border-left:1px solid #888;
	background:#ccc;
}

.tradepagedeprice {
	width:100%;
	background:#f3f3f3;
	text-align:left;
	padding-left:5px;
}
.tradepagedeorder {
	width:100%;
	text-align:left;
	padding-left:5px;
}

.tradepagedescript_color {
	min-width: 270px;
//width: 30%;
}
.tradepage_price_block_color {
	min-width: 180px;
	width:100%;
	text-align:left;
	float: left;
	background:#ccc;
}
.tradepage_price_smallblock_color {
	min-width: 80px;
	width:100%;
	text-align:left;
	float: left;
	margin-bottom: 3px;
	background:#ccc;
}

.tradepage_price_color {
	min-width: 190px;
	width:29%;
	background:#f3f3f3;
	text-align:left;
	float: left;
	margin: 2px 0 0 2px;
}
.tradepage_price_colorled {
	min-width: 190px;
	width: 45%;
	background: #f3f3f3;
	text-align: left;
	float: left;
	margin: 2px 0 0 2px;
}
.tradepage_order_color {
	min-width: 190px;
	width: 69%;
	text-align: left;
	padding-left: 5px;
}
.tradepage_order_colorled {
	min-width: 190px;
	width: 54%;
	text-align: left;
	padding-left: 5px;
}
.tradepage_order_color {
	min-width: 190px;
	width:69%;
	text-align:left;
	padding-left:5px;
}
.tradepage h1{
	margin: 0;
	padding: 0 10px 10px 10px;
	font-size: 18px;
	font-weight: 400;
	font-family: 'Open Sans', sans-serif;
}

h5
{
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 1.2em;
	margin: 0;
	font-weight: normal;
	padding: 0;
}
.item
{
	float:left;
	min-width: 150px;
	/*width:250px;
    height: 200px;*/
}
.leditem
{
	float:left;
	width: 100%;
	font-size: 14px;
	font-weight: bold;
}

.leditem a
{
	cursor: pointer;
}
.leditem_wavelength
{
	float:left;
	padding: 20px 8px 0 0;
	width: 90px;
	text-align: center;
}
.leditem_photodiode_wavelength
{
	float:left;
	padding: 8px 8px 0 0;
	width: 160px;
	text-align: center;
}
.leditem_photodiode_current
{
	float:left;
	padding: 8px 8px 0 0;
	width: 160px;
	text-align: center;
}
.leditem_photodiode_risetime
{
	float:left;
	padding: 8px 8px 0 0;
	width: 110px;
	text-align: center;
}
.leditem_brightness
{
	float:left;
	padding: 20px 8px 0 0;
	width: 100px;
}
.leditem_voltage
{
	float:left;
	padding: 20px 8px 0 0;
	width: 60px;
}
.leditem_frequency
{
	float:left;
	padding: 20px 8px 0 0;
	width: 50px;
}
.leditem_pdf
{
	float:left;
	padding: 18px 2px 0 0;
	width: 20px;
}
.ledspectrum_pdf
{
	float:left;
	padding: 18px 2px 0 0;
	width: 20px;
}
.leditem_lens
{
	float:left;
	padding: 20px 8px 0 0;
	width: 90px;
	text-align: center;
}
.item_name
{
	float:left;
	padding-top: 10px;
}
.item_special_parameters
{
	float:left;
	width: 25%;
}
.order_color
{
	text-align: right;
	margin-right:1%;
}
.price
{
	float:left;
	min-width: 280px;
}
.priceright
{
	float:right;
}
.priceright_color
{
	float:right;
}
.stok_color
{
	float:left;
	min-width: 280px;
	margin-right: 8%;
}

/* вывод товаров с различием по цветам*/
.colorbox {
	display:inline-block;
//  width:49%;
}

/* 768px */

@media only screen and (max-width:88em) {
	.colorbox {
		display:block;
		width:99.7%;
	}
}

/* .boxes/.box2/.katalogdescript/.katalogdata_*/.priceitem/.itemname/
   .item_pdf/.nextitem/.headtree/#container/#slider/#carousel/.pdp-shipping/
   .pdp-note/.pdp-nextprev*/.pdp-variants удалены (catalog.php, страница
   отдельного товара, переверстана на .pdp-*: см. классы .pdp-group,
   .pdp-price, .pdp-stock, .pdp-specs, .pdp-datasheet, .pdp-gallery-* ниже в
   файле). Проверено grep -a по всему проекту перед каждым удалением - ни
   одного элемента с этими id/классами в разметке не осталось. */

/*start search*/
/* Collapsed to a 40px icon button at rest, expands on hover/focus-within -
   back to this after a detour through "fixed width always" (that lost the
   interaction entirely) and "shrink to 20px to match cart/account" (that
   lost the button's own padding). This time cart/account get the matching
   40px box instead (see .header-cart-link / .pe-7s-lock in layout.css), so
   all three glyphs line up evenly without shrinking anything.
   #sb-search has margin-left:auto (layout.css), so there is always slack
   space to its left - growing its width eats into that slack and pushes
   the field's own left edge further left, while its right edge (and so the
   gap to .homeheader-r) never moves. That is what keeps the icon cluster's
   spacing constant while the field expands, instead of the field eating
   into the gap. Mobile overrides this back to a full-width always-open bar,
   see layout.css max-width:620px block - there is no hover on touch. */
.sb-search{
	display:flex;
	align-items:center;
}
.sb-search form{
	display:flex;
	align-items:center;
	justify-content:flex-end;
	width:40px;
	height:40px;
	box-sizing:border-box;
	background:transparent;
	border:1px solid transparent;
	border-radius:999px;
	padding:0;
	overflow:hidden;
	transition:width var(--transition-base), background-color var(--transition-base), border-color var(--transition-base), box-shadow var(--transition-base);
}
.sb-search:hover form,
.sb-search form:focus-within{
	width:260px;
	background:var(--color-bg-alt);
	border-color:var(--color-border);
	padding:0 var(--space-1) 0 var(--space-4);
}
.sb-search form:focus-within{
	border-color:var(--color-brand-red);
	box-shadow:0 0 0 3px rgba(207,24,24,0.12);
}
/* visible only to screen readers: the placeholder alone is not a label */
.sb-search-label{
	position:absolute;
	width:1px;
	height:1px;
	margin:-1px;
	padding:0;
	overflow:hidden;
	clip:rect(0 0 0 0);
	white-space:nowrap;
	border:0;
}
.sb-search-input{
	flex:1 1 auto;
	width:0;
	min-width:0;
	height:100%;
	padding:0;
	border:none;
	outline:none;
	background:transparent;
	font-family:var(--font-body);
	font-size:14px;
	color:var(--color-ink);
	opacity:0;
	transition:opacity var(--transition-fast);
}
.sb-search:hover .sb-search-input,
.sb-search form:focus-within .sb-search-input{
	width:auto;
	opacity:1;
}
.sb-search-input::placeholder{color:var(--color-ink-soft);opacity:1;}
.sb-search-submit{
	flex:0 0 auto;
	display:flex;
	align-items:center;
	justify-content:center;
	width:40px;
	height:40px;
	padding:0;
	border:none;
	border-radius:50%;
	/* Plain icon, ink at rest, red only on hover/focus - matches cart/login,
	   no filled circle at any state (flat design: color changes, not chrome). */
	background:none;
	color:var(--color-ink);
	cursor:pointer;
	transition:color var(--transition-fast);
}
.sb-search-submit:hover,
.sb-search-submit:focus-visible{color:var(--color-brand-red);}
.sb-search-submit svg{
	width:20px;
	height:20px;
	fill:none;
	stroke:currentColor;
	stroke-width:1.8;
	stroke-linecap:round;
}

/*-- start-smartphone_nav --*/
.nav { 
    display:none; 
}
 
.nav-item {
    float:left;
    display:inline;
    line-height:10px !important;
    height:31px !important;
    padding:0px !important;
    margin:0px !important;
    zoom:1; 
}
.nav-item a {
    display:block;
}
.nav-item a:hover {
	background:  var(--color-brand-red);
	color: #FFFFFF; 
}
.nav-mobile {
  display: none;
	cursor: pointer;
	position: absolute;
	top: 5px;
	left: 5px;
	background: url(/images/nav_icon.png) 60% 60% no-repeat;
	height:32px;
	width: 32px;  
}
.nav-mobile {
    display:block; 
}
.nav {
	margin-top:44px;
   width:100%;  
}
.nav-list {
    display:none; 
}
.nav-item {
    width:100%;
    float:none; 
}
.nav-item a {
	font-family: var(--font-heading) !important;
	font-weight:600 !important;
	background: var(--color-ink);
	border-bottom: 1px solid rgba(255,255,255,0.12);
	padding: 12px 16px !important;
	text-transform:uppercase !important;
    color:#FFF !important;
    -webkit-transition: color .2s linear,background .2s linear;
	-moz-transition: color .2s linear,background .2s linear;
	-o-transition: color .2s linear,background .2s linear;
	transition: color .2s linear,background .2s linear;
	font-size: 0.8725em; 
}
.nav-inner {
   display: none; 
}
.nav-active, .nav-active-inner .nav-inner {
     display:block;
     position: relative;
     z-index:1;   
}

/* Стили для формы контактов */

.cont_form_box {
	max-width: 560px;
}

.cont_form_style p {
	margin: 0 0 var(--space-5);
	position: relative;
}

.cont_form_style .rcheck {
	display: flex;
	align-items: center;
	gap: var(--space-2);
	margin-bottom: var(--space-2);   /* внутри группы тесно */
}

/* Группа полей целиком отбивается так же, как одиночное поле, - иначе ритм рвётся */
.cont_form_style .field-group {
	margin-bottom: var(--space-5);
}

.cont_form_style p label {
	display: block;
	margin-bottom: var(--space-2);
	font-family: var(--font-heading);
	font-size: 14px;
	font-weight: 600;
	line-height: 1.4;
	color: var(--color-ink);
	cursor: pointer;
}

.cont_form_style .rcheck label {
	display: inline;
	margin: 0;
	font-family: var(--font-body);
	font-size: 15px;
	font-weight: 400;
	color: var(--color-ink);
	vertical-align: baseline;
}

/* Поля ввода: минимум 44px по высоте - иначе неудобно на тач-экранах.
   Селектор по классу .rfield, а не по type: поля бывают text/email/tel, и
   привязка к type="text" однажды уже оставила поле Email без стилей. */
.cont_form_style .rfield:not([type="radio"]):not([type="checkbox"]),
.cont_form_style select,
.cont_form_style textarea {
	display: block;
	box-sizing: border-box;
	width: 100%;
	min-height: 44px;
	padding: var(--space-3);
	font-family: var(--font-body);
	font-size: 16px;   /* меньше 16px - iOS зумит страницу при фокусе */
	line-height: 1.4;
	color: var(--color-ink);
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-sm);
	outline: none;
	transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
}

.cont_form_style textarea {
	min-height: 120px;
	resize: vertical;
}

/* Место под стрелку: без этого длинные варианты наезжали на неё.
   appearance:none + своя SVG-стрелка - без сброса рисовалась родная стрелка
   браузера не по рамке поля (тот же баг и фикс, что у .order_form_style
   select и остальных форм группы, см. выше по файлу). */
.cont_form_style select {
	appearance: none;
	-webkit-appearance: none;
	padding-right: var(--space-7);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4 6l4 4 4-4' fill='none' stroke='%235A5654' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") !important;
	background-repeat: no-repeat !important;
	background-position: right var(--space-3) center !important;
	/* Без background-size SVG без width/height в самом <svg> (только viewBox)
	   рендерился в дефолтном "внутреннем" размере браузера - огромная
	   стрелка на весь select вместо аккуратной 16px (жалоба пользователя
	   2026-08-08: "это шо за гигант"). */
	background-size: 16px 16px !important;
	text-overflow: ellipsis;
}

.cont_form_style input[type="radio"] {
	width: 18px;
	height: 18px;
	margin: 0;
	accent-color: var(--color-brand-red);
	flex: 0 0 auto;
}

.cont_form_style input:not([type="radio"]):focus,
.cont_form_style select:focus,
.cont_form_style textarea:focus {
	border-color: var(--color-brand-red);
	box-shadow: 0 0 0 3px rgba(207, 24, 24, 0.15);
}

.cont_form_style input:focus-visible,
.cont_form_style select:focus-visible,
.cont_form_style textarea:focus-visible,
.cont_form_style .btnsubmit:focus-visible {
	outline: 2px solid var(--color-ink);
	outline-offset: 2px;
}

.cont_form_style input::placeholder,
.cont_form_style textarea::placeholder {
	color: var(--color-ink-soft);
	opacity: 1;
}

/* Незаполненное поле. Класс rf_error навешивает js/formcontactcheck.js. */
.cont_form_style input.rf_error,
.cont_form_style input[type="radio"].rf_error,
.cont_form_style textarea.rf_error,
.cont_form_style select.rf_error {
	border-color: var(--color-error);
	box-shadow: 0 0 0 3px rgba(192, 57, 43, 0.12);
}

/* Сообщение об ошибке. Показывается/прячется через visibility из того же js,
   поэтому display трогать нельзя. Позиционируем ПОД полем, а не поверх него:
   раньше плашка перекрывала сам инпут. */
.cont_form_style .rfield_error {
	display: block;
	position: absolute;
	top: 100%;
	left: 0;
	right: auto;
	margin-top: var(--space-1);
	padding: 2px var(--space-2);
	font-family: var(--font-body);
	font-size: 13px;
	line-height: 1.4;
	color: #fff;
	background-color: var(--color-error);
	border-radius: var(--radius-sm);
	z-index: 1;
	visibility: hidden;
}

.cont_form_style .rcheck .rfield_error {
	top: 100%;
	left: 0;
}

/* Заголовок группы полей (пара радио «Организация / Частное лицо») */
.cont_form_style .field-group-title {
	margin: 0 0 var(--space-3);
	font-family: var(--font-heading);
	font-size: 14px;
	font-weight: 600;
	color: var(--color-ink);
}

/* Пустой контейнер #cont_org не должен занимать место до выбора «Организация» */
.cont_form_style #cont_org:empty {
	display: none;
	margin: 0;
}

/* Обязательные поля: js блокирует кнопку, пока форма не заполнена, поэтому
   пометки обязательности здесь не украшение, а объяснение, почему кнопка серая. */
.cont_form_style .req {
	color: var(--color-error);
	margin-left: 2px;
}

.cont_form_style .form-hint {
	margin: 0 0 var(--space-5);
	font-size: 14px;
	line-height: 1.5;
	color: var(--color-ink-soft);
}

.cont_form_style .btnsubmit {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 180px;
	min-height: 44px;
	padding: var(--space-3) var(--space-5);
	font-family: var(--font-heading);
	font-size: 15px;
	font-weight: 600;
	line-height: 1;
	color: #fff;
	text-align: center;
	background: var(--color-brand-red);
	border: none;
	border-radius: var(--radius-sm);
	cursor: pointer;
	transition: background-color var(--transition-base);
}

.cont_form_style .btnsubmit:hover {
	background: var(--color-brand-red-dark);
}

.cont_form_style .btnsubmit:active {
	box-shadow: inset 0 2px 2px rgba(0, 0, 0, 0.2);
}

.cont_form_style .btnsubmit.disabled,
.cont_form_style .btnsubmit.disabled:hover {
	/* Серый текст на серой заливке давал контраст ~3.9:1 - ниже нормы AA */
	background: var(--color-bg-alt);
	color: var(--color-ink-soft);
	box-shadow: inset 0 0 0 1px var(--color-border);
	cursor: not-allowed;
}@media (prefers-reduced-motion: reduce){
	.cont_form_style input,
	.cont_form_style select,
	.cont_form_style textarea,
	.cont_form_style .btnsubmit {
		transition: none;
	}}

/* Конец стилей для формы контактов */

/* Стили личного кабинета*/

.accountfield{
	width: 350px;
	min-height: 650px;
	margin: 15px auto;

}

.account{
	font-size: 14px;
	font-weight: bold;

}
.accountcoment{
	font-size: 12px;
	margin-bottom: 15px;
}

/* Форма авторизации.
   Была практически не оформлена: input[type="text"] с height:10px, метки с
   line-height:10px, кнопка с line-height:8px, а поле пароля вообще не попадало
   под селектор по type. Приведено к тем же правилам, что и форма контактов. */

.loginform_style {
	text-align: left;
}

.loginform_style p {
	margin: 0 0 var(--space-5);
	position: relative;
}

.loginform_style p label {
	display: block;
	margin-bottom: var(--space-2);
	font-family: var(--font-heading);
	font-size: 14px;
	font-weight: 600;
	line-height: 1.4;
	color: var(--color-ink);
	cursor: pointer;
}

/* Поля: минимум 44px по высоте, 16px шрифт (меньше — iOS зумит при фокусе) */
.loginform_style .rfield,
.loginform_style input[type="text"],
.loginform_style input[type="password"] {
	display: block;
	box-sizing: border-box;
	width: 100%;
	min-height: 44px;
	margin: 0;
	padding: var(--space-3);
	font-family: var(--font-body);
	font-size: 16px;
	line-height: 1.4;
	color: var(--color-ink);
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-sm);
	outline: none;
	transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
}

.loginform_style input:focus {
	border-color: var(--color-brand-red);
	box-shadow: 0 0 0 3px rgba(207, 24, 24, 0.15);
}

.loginform_style input:focus-visible,
.loginform_style .btnlogin:focus-visible {
	outline: 2px solid var(--color-ink);
	outline-offset: 2px;
}

.loginform_style input::placeholder {
	color: var(--color-ink-soft);
	opacity: 1;
}

.loginform_style .btnlogin {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	min-height: 44px;
	height: auto;
	padding: var(--space-3) var(--space-5);
	font-family: var(--font-heading);
	font-size: 15px;
	font-weight: 600;
	line-height: 1;
	color: #fff;
	text-align: center;
	background: var(--color-brand-red);
	border: none;
	border-radius: var(--radius-sm);
	cursor: pointer;
	transition: background-color var(--transition-base);
}

.loginform_style .btnlogin:hover {
	background: var(--color-brand-red-dark);
}

.loginform_style .btnlogin:active {
	box-shadow: inset 0 2px 2px rgba(0, 0, 0, 0.2);
}

.loginform_style .btnlogin.disabled,
.loginform_style .btnlogin.disabled:hover {
	background: var(--color-bg-alt);
	color: var(--color-ink-soft);
	box-shadow: inset 0 0 0 1px var(--color-border);
	cursor: not-allowed;
}

/* Незаполненное поле: класс rf_error навешивает js */
.loginform_style input.rf_error {
	border-color: var(--color-error);
	box-shadow: 0 0 0 3px rgba(192, 57, 43, 0.12);
}

/* Сообщение об ошибке. Прячется/показывается через visibility из js,
   поэтому display трогать нельзя. Ставим под полем, а не поверх него. */
.loginform_style .rfield_error {
	display: block;
	position: absolute;
	top: 100%;
	left: 0;
	right: auto;
	margin-top: var(--space-1);
	padding: 2px var(--space-2);
	font-family: var(--font-body);
	font-size: 13px;
	line-height: 1.4;
	color: #fff;
	background-color: var(--color-error);
	border-radius: var(--radius-sm);
	z-index: 1;
	visibility: hidden;
}@media (prefers-reduced-motion: reduce){
	.loginform_style input,
	.loginform_style .btnlogin {
		transition: none;
	}}

/* Конец стилей для формы авторизации */

/* Формы личного кабинета: регистрация, изменение профиля, восстановление пароля.
 *
 * Раньше каждая из них описывалась отдельным блоком по ~150 строк, и во всех
 * повторялись одни и те же поломки: input[type="text"] с height:10px, кнопки с
 * line-height:8px, контейнеры с фиксированной высотой (#reg_mail — 750px),
 * прозрачный фон и чёрная рамка 1px у полей. Поля типа password и email под
 * селектор по type вообще не попадали и оставались неоформленными.
 *
 * Теперь один набор правил на все три формы, в тех же токенах, что и форма
 * контактов (.cont_form_style) и авторизации (.loginform_style).
 * Классы, id и структуру разметки не меняем — на них держится JS-валидация.
 */

#reg_mail {
	/* было height: 750px — обрезало форму, когда появлялись сообщения об ошибках */
	height: auto;
}

.reg_form_box {
	width: 100%;
	max-width: 560px;
	margin: 0 auto;
	font-size: 16px;
	font-weight: 400;
}

.reg_form_style p,
.chengeprofile_form_style p,
.forgotpass_form_style p,
.order_form_style p {
	margin: 0 0 var(--space-5);
	position: relative;
}

.reg_form_style .rcheck,
.chengeprofile_form_style .rcheck,
.forgotpass_form_style .rcheck,
.order_form_style .rcheck {
	display: flex;
	align-items: center;
	gap: var(--space-2);
	margin-bottom: var(--space-2);
}

.reg_form_style p label,
.chengeprofile_form_style p label,
.forgotpass_form_style p label,
.order_form_style p label {
	display: block;
	margin-bottom: var(--space-2);
	font-family: var(--font-heading);
	font-size: 14px;
	font-weight: 600;
	line-height: 1.4;
	color: var(--color-ink);
	cursor: pointer;
}

.reg_form_style .rcheck label,
.chengeprofile_form_style .rcheck label,
.forgotpass_form_style .rcheck label,
.order_form_style .rcheck label {
	display: inline;
	margin: 0;
	font-family: var(--font-body);
	font-size: 15px;
	font-weight: 400;
	line-height: 1.5;
}

/* Селектор по классу .rfield, а не по type: поля бывают text/email/tel/password */
.reg_form_style .rfield:not([type="radio"]):not([type="checkbox"]),
.chengeprofile_form_style .rfield:not([type="radio"]):not([type="checkbox"]),
.forgotpass_form_style .rfield:not([type="radio"]):not([type="checkbox"]),
.order_form_style .rfield:not([type="radio"]):not([type="checkbox"]),
.reg_form_style input[type="text"],
.reg_form_style input[type="password"],
.reg_form_style input[type="email"],
.chengeprofile_form_style input[type="text"],
.chengeprofile_form_style input[type="password"],
.forgotpass_form_style input[type="text"],
.order_form_style input[type="text"],
.reg_form_style select,
.chengeprofile_form_style select,
.forgotpass_form_style select,
.order_form_style select,
.reg_form_style textarea,
.chengeprofile_form_style textarea,
.forgotpass_form_style textarea,
.order_form_style textarea {
	display: block;
	box-sizing: border-box;
	width: 100%;
	min-height: 44px;
	margin: 0;
	padding: var(--space-3);
	font-family: var(--font-body);
	font-size: 16px;   /* меньше 16px — iOS зумит страницу при фокусе */
	line-height: 1.4;
	color: var(--color-ink);
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-sm);
	outline: none;
	transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
}

.reg_form_style select,
.chengeprofile_form_style select,
.forgotpass_form_style select,
.order_form_style select {
	/* appearance не был сброшен - рисовалась родная стрелка браузера, а не
	   привязанная к нашей рамке/паддингам: на скрине она висела снаружи
	   рамки поля (жалоба пользователя 2026-08-08: "стрелка вниз плохо
	   расположена"). Тот же баг есть и в .cont_form_style select (форма
	   контактов) - исправлен там же, см. ниже по файлу.
	   !important на background-image/repeat/position - без него застревал
	   на background-image:none несмотря на верный порядок и специфичность
	   правил (соседний select { ... } shorthand-background чуть выше по
	   файлу в той же группе селекторов - похоже на особенность движка
	   именно для <select>, воспроизведено и подтверждено через getComputedStyle,
	   не только визуально). */
	appearance: none;
	-webkit-appearance: none;
	padding-right: var(--space-7);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4 6l4 4 4-4' fill='none' stroke='%235A5654' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") !important;
	background-repeat: no-repeat !important;
	background-position: right var(--space-3) center !important;
	/* Без background-size SVG без width/height в самом <svg> (только viewBox)
	   рендерился в дефолтном "внутреннем" размере браузера - огромная
	   стрелка на весь select вместо аккуратной 16px (жалоба пользователя
	   2026-08-08: "это шо за гигант"). */
	background-size: 16px 16px !important;
	text-overflow: ellipsis;
}

.reg_form_style textarea,
.chengeprofile_form_style textarea,
.forgotpass_form_style textarea,
.order_form_style textarea {
	min-height: 120px;
	resize: vertical;
}

.reg_form_style input[type="radio"],
.chengeprofile_form_style input[type="radio"],
.forgotpass_form_style input[type="radio"],
.order_form_style input[type="radio"] {
	float: none;
	width: 18px;
	height: 18px;
	min-height: 0;
	margin: 0;
	padding: 0;
	accent-color: var(--color-brand-red);
	flex: 0 0 auto;
}

/* Заголовок группы радиокнопок «Организация/ИП» / «Частное лицо» - тот же
   приём, что .cont_form_style .field-group-title на /quote/, без него пара
   радио выглядела как два независимых вопроса, а не один выбор. */
.reg_form_style .field-group-title,
.chengeprofile_form_style .field-group-title,
.forgotpass_form_style .field-group-title,
.order_form_style .field-group-title {
	margin: 0 0 var(--space-3);
	font-family: var(--font-heading);
	font-size: 14px;
	font-weight: 600;
	color: var(--color-ink);
}

/* .rcheck сжимает отступ до --space-2 (8px) - нужно между «Организация» и
   «Частное лицо» внутри пары, но последний rcheck перед обычным полем
   (телефон) с тем же поджатым отступом выглядел слипшимся с ним. */
.reg_form_style p:has(#firm1),
.chengeprofile_form_style p:has(#firm1),
.forgotpass_form_style p:has(#firm1),
.order_form_style p:has(#firm1) {
	margin-bottom: var(--space-5);
}

.reg_form_style input:not([type="radio"]):focus,
.chengeprofile_form_style input:not([type="radio"]):focus,
.forgotpass_form_style input:not([type="radio"]):focus,
.order_form_style input:not([type="radio"]):focus,
.reg_form_style select:focus,
.chengeprofile_form_style select:focus,
.forgotpass_form_style select:focus,
.order_form_style select:focus,
.reg_form_style textarea:focus,
.chengeprofile_form_style textarea:focus,
.forgotpass_form_style textarea:focus,
.order_form_style textarea:focus {
	border-color: var(--color-brand-red);
	box-shadow: 0 0 0 3px rgba(207, 24, 24, 0.15);
}

.reg_form_style input:focus-visible,
.chengeprofile_form_style input:focus-visible,
.forgotpass_form_style input:focus-visible,
.order_form_style input:focus-visible,
.reg_form_style button:focus-visible,
.chengeprofile_form_style button:focus-visible,
.forgotpass_form_style button:focus-visible,
.order_form_style button:focus-visible {
	outline: 2px solid var(--color-ink);
	outline-offset: 2px;
}

.reg_form_style input::placeholder,
.chengeprofile_form_style input::placeholder,
.forgotpass_form_style input::placeholder,
.order_form_style input::placeholder {
	color: var(--color-ink-soft);
	opacity: 1;
}

/* Кнопки отправки */
.reg_form_style .btnreg,
.chengeprofile_form_style .btnchengeprofile,
.forgotpass_form_style .btnforgotpass,
.reg_form_style .btnsubmit,
.chengeprofile_form_style .btnsubmit,
.forgotpass_form_style .btnsubmit,
.order_form_style .btnsubmit {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 200px;
	min-height: 44px;
	height: auto;
	padding: var(--space-3) var(--space-5);
	font-family: var(--font-heading);
	font-size: 15px;
	font-weight: 600;
	line-height: 1;
	color: #fff;
	text-align: center;
	background: var(--color-brand-red);
	border: none;
	border-radius: var(--radius-sm);
	cursor: pointer;
	transition: background-color var(--transition-base);
}

.reg_form_style .btnreg:hover,
.chengeprofile_form_style .btnchengeprofile:hover,
.forgotpass_form_style .btnforgotpass:hover,
.reg_form_style .btnsubmit:hover,
.chengeprofile_form_style .btnsubmit:hover,
.forgotpass_form_style .btnsubmit:hover,
.order_form_style .btnsubmit:hover {
	background: var(--color-brand-red-dark);
}

.reg_form_style .btnreg.disabled,
.reg_form_style .btnreg.disabled:hover,
.chengeprofile_form_style .btnchengeprofile.disabled,
.chengeprofile_form_style .btnchengeprofile.disabled:hover,
.forgotpass_form_style .btnforgotpass.disabled,
.forgotpass_form_style .btnforgotpass.disabled:hover,
.reg_form_style .btnsubmit.disabled,
.reg_form_style .btnsubmit.disabled:hover,
.chengeprofile_form_style .btnsubmit.disabled,
.chengeprofile_form_style .btnsubmit.disabled:hover,
.forgotpass_form_style .btnsubmit.disabled,
.forgotpass_form_style .btnsubmit.disabled:hover,
.order_form_style .btnsubmit.disabled,
.order_form_style .btnsubmit.disabled:hover {
	/* серый текст на серой заливке давал контраст ниже нормы AA */
	background: var(--color-bg-alt);
	color: var(--color-ink-soft);
	box-shadow: inset 0 0 0 1px var(--color-border);
	cursor: not-allowed;
}

/* Незаполненное поле: класс rf_error навешивает JS */
.reg_form_style .rf_error,
.chengeprofile_form_style .rf_error,
.forgotpass_form_style .rf_error,
.order_form_style .rf_error {
	border-color: var(--color-error);
	box-shadow: 0 0 0 3px rgba(192, 57, 43, 0.12);
}

/* Сообщение об ошибке. Показывается/прячется через visibility из JS, поэтому
   display трогать нельзя. Ставим ПОД полем, а не поверх него. */
.reg_form_style .rfield_error,
.chengeprofile_form_style .rfield_error,
.forgotpass_form_style .rfield_error,
.order_form_style .rfield_error {
	display: block;
	position: absolute;
	top: 100%;
	left: 0;
	right: auto;
	margin-top: var(--space-1);
	padding: 2px var(--space-2);
	font-family: var(--font-body);
	font-size: 13px;
	line-height: 1.4;
	color: #fff;
	background-color: var(--color-error);
	border-radius: var(--radius-sm);
	z-index: 1;
	visibility: hidden;
}

.reg_form_style .rcheck .rfield_error,
.chengeprofile_form_style .rcheck .rfield_error,
.forgotpass_form_style .rcheck .rfield_error,
.order_form_style .rcheck .rfield_error {
	top: 100%;
	left: 0;
}@media (prefers-reduced-motion: reduce){
	.reg_form_style input,
	.reg_form_style select,
	.reg_form_style textarea,
	.reg_form_style .btnreg,
	.chengeprofile_form_style input,
	.chengeprofile_form_style .btnchengeprofile,
	.forgotpass_form_style input,
	.forgotpass_form_style .btnforgotpass,
	.order_form_style input,
	.order_form_style select,
	.order_form_style textarea,
	.order_form_style .btnsubmit {
		transition: none;
	}}

/* Конец стилей для формы восстановления пароля*/

/* Стили информационных сообщений при регистрации и восстановлении пароля*/
.reginform {
	text-align: center;
	font-size: 18px;
	line-height: 25px;
}
/* Конец стилей для информационных сообщений при регистрации и восстановлении пароля*/

/* Карточка страницы-ошибки (404 и т.п.) - та же разметка/классы, что в
   404.html, дублируется здесь: 404.html - самостоятельный документ со своими
   встроенными стилями специально (должен открываться, даже если остальной
   CSS-конвейер сайта сломан), поэтому не подключает style.css. Здесь -
   переиспользование того же e404-* набора классами внутри обычных страниц
   сайта (напр. shop/admin/accessdenied.tpl - "Доступ запрещён", код 403,
   запрос пользователя 2026-08-08: "у нас есть окно ошибки, нужно
   использовать его только поменять код ошибки и текст"). Держать оба места
   в синхроне вручную при правке дизайна ошибки. */
.e404-card {
	width: 100%;
	max-width: 560px;
	margin: 0 auto;
	padding: var(--space-7) var(--space-6);
	text-align: center;
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-lg);
	box-shadow: 0 4px 24px rgba(23, 20, 18, 0.06);
	box-sizing: border-box;
}

.e404-logo {
	width: 56px;
	height: 56px;
	margin: 0 auto var(--space-5);
	display: block;
}

.e404-code {
	margin: 0;
	font-family: var(--font-heading);
	font-size: 72px;
	font-weight: 700;
	line-height: 1;
	letter-spacing: -0.02em;
	color: var(--color-brand-red);
}

.e404-title {
	margin: var(--space-4) 0 var(--space-3);
	font-family: var(--font-heading);
	font-size: 24px;
	font-weight: 600;
	line-height: 1.3;
	color: var(--color-ink);
}

.e404-text {
	margin: 0 0 var(--space-6);
	font-size: 16px;
	line-height: 1.6;
	color: var(--color-ink-soft);
}

.e404-actions {
	display: flex;
	flex-wrap: wrap;
	gap: var(--space-3);
	justify-content: center;
}

.e404-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 44px;
	padding: var(--space-3) var(--space-5);
	font-family: var(--font-heading);
	font-size: 15px;
	font-weight: 500;
	text-decoration: none;
	border: 1px solid var(--color-brand-red);
	border-radius: var(--radius-sm);
	transition: background-color var(--transition-base), color var(--transition-base);
}

.e404-btn--primary {
	color: #FFFFFF;
	background: var(--color-brand-red);
}

.e404-btn--primary:hover,
.e404-btn--primary:focus-visible {
	background: var(--color-brand-red-dark);
	border-color: var(--color-brand-red-dark);
}

.e404-btn--ghost {
	color: var(--color-brand-red);
	background: transparent;
}

.e404-btn--ghost:hover,
.e404-btn--ghost:focus-visible {
	color: #FFFFFF;
	background: var(--color-brand-red);
}

.e404-btn:focus-visible {
	outline: 2px solid var(--color-ink);
	outline-offset: 2px;
}

.e404-page {
	min-height: 100vh;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: var(--space-5);
	background: var(--color-bg-alt);
	box-sizing: border-box;
}

@media (max-width: 480px) {
	.e404-card { padding: var(--space-6) var(--space-4); }
	.e404-code { font-size: 56px; }
	.e404-title { font-size: 20px; }
	.e404-actions { flex-direction: column; }
	.e404-btn { width: 100%; }
}

@media (prefers-reduced-motion: reduce) {
	.e404-btn { transition: none; }
}

/* start contact page*/
.contact {
	max-width: 1200px;
	margin: 0 auto;
	padding: var(--space-6) var(--space-5) var(--space-8);
	font-family: var(--font-body);
	font-size: 16px;
	line-height: 1.6;
	color: var(--color-ink);
}

.contact h1 {
	font-family: var(--font-heading);
	font-size: 32px;
	font-weight: 700;
	line-height: 1.25;
	margin: 0 0 var(--space-6);
	padding: 0;
	color: var(--color-ink);
}

.contact-grid {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr);
	gap: var(--space-6);
	align-items: start;
}

.contact_left,
.contact_right {
	float: none;
	width: auto;
	min-width: 0;
	margin: 0;
	display: grid;
	gap: var(--space-5);
}

.contact-card {
	padding: var(--space-5);
	background: var(--color-bg-alt);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-md);
}

.contact_left h3,
.contact_right h3 {
	margin: 0 0 var(--space-4);
	padding: 0;
	font-family: var(--font-heading);
	font-size: 18px;
	font-weight: 600;
	line-height: 1.3;
	/* text-transform: capitalize сломан для кириллицы - убран */
	color: var(--color-ink);
	text-shadow: none;
}

.contact_right h4 {
	margin: 0 0 var(--space-5);
	padding: 0;
	font-family: var(--font-heading);
	font-size: 26px;
	font-weight: 700;
	text-shadow: none;
}

.contact_right h4 a {
	color: var(--color-brand-red);
	text-decoration: none;
}

.contact_right h4 a:hover,
.contact_right h4 a:focus-visible {
	color: var(--color-brand-red-dark);
	text-decoration: underline;
}

/* Карта: соотношение сторон вместо фиксированной высоты - не ломается на узких экранах */
.map {
	margin: 0;
	border-radius: var(--radius-sm);
	overflow: hidden;
}

.map iframe {
	display: block;
	width: 100%;
	/* Виджет Яндекса не растягивается под aspect-ratio и оставлял пустое поле,
	   поэтому задаём высоту явно. */
	height: clamp(280px, 34vw, 400px);
	border: 0;
}

.company_address p {
	margin: 0 0 var(--space-2);
	font-size: 15px;
	line-height: 1.6;
	color: var(--color-ink);
	text-shadow: none;
}

.company_address p:last-child {
	margin-bottom: 0;
}

.company_address a {
	color: var(--color-brand-red);
}

.company_address a:hover,
.company_address a:focus-visible {
	color: var(--color-brand-red-dark);
}

.contact-form {
	position: relative;
}@media (max-width: 900px){
	.contact-grid {
		grid-template-columns: minmax(0, 1fr);
	}}@media (max-width: 620px){
	.contact {
		padding: var(--space-5) var(--space-4) var(--space-6);
	}

	.contact h1 {
		font-size: 26px;
	}

	.contact_right h4 {
		font-size: 22px;
	}}

/* start details */
.details h2{
	font-size: 1.4em;
	color: #34495E;
	font-weight: 400;
}
.details img{
	margin: 2% 0;
	padding: 5px;
	box-shadow: 0px 0px 5px #DDDDDD;
	-webkit-box-shadow: 0px 0px 5px #DDDDDD;
	-moz-box-shadow: 0px 0px 5px #DDDDDD;
	-o-box-shadow: 0px 0px 5px #DDDDDD;
}@media only screen and (max-width: 800px){

.menu {
		display: none;
	}
.nav {
	    display: inline-block; 
	}}
  /* Стили для формы оформления заказа - страница ни разу не попадала в
     редизайн (см. TZ.md), хардкод пикселей/цветов/Verdana-Roboto заменён на
     токены. .additionalgoods/.additionalgoodsitem/.order_aditional_item -
     не тронуты: рендерятся только в ветке кода для "хрупких" LED-профилей
     сайта-донора (BeeLED), у каталога BeeVolt таких typegoods нет, ветка
     недостижима - см. classes/goods.php про тот же класс мёртвого кода. */

.order-section {
	/* 1200px - та же ширина контейнера, что у .goods (страницы каталога,
	   "Продукция и услуги"). Раньше было 1160px (страница ещё была
	   переверстана в две колонки - список товаров + форма рядом), из-за
	   чего заголовки "Корзина"/"Оформление заказа" сидели на 20px правее,
	   чем "Продукция и услуги" на тех же х/y координатах (два разных
	   max-width, центрированных в одном viewport, дают разный отступ слева)
	   - жалоба заказчицы 2026-08-09: "заголовки не расположены как
	   продукция и услуги". Список товаров с 2026-08-09 переехал на /cart/
	   в одну колонку (см. shop/cartpage.php), особая ширина больше не
	   нужна - только унификация с остальным сайтом. */
	max-width: 1200px;
	margin: 0 auto;
	padding: var(--space-6) var(--space-5) var(--space-8);
	font-family: var(--font-body);
	box-sizing: border-box;
}

.checkout-page-title {
	/* Тот же заголовок, что и у "Продукция и услуги" (.goods h1,
	   pages/products.html) - жалоба заказчицы 2026-08-09: "название корзина,
	   оформление заказа должны быть идентичны названию продукция и услуги".
	   Значения продублированы 1:1 (32px/700/margin-bottom var(--space-5)) -
	   .checkout-page-title живёт вне .goods (страницы корзины/оформления не
	   используют этот класс-обёртку), общий селектор не подходит. */
	max-width: none;
	margin: 0 0 var(--space-5);
	padding: 0;
	font-family: var(--font-heading);
	font-size: 32px;
	font-weight: 700;
	line-height: 1.25;
	color: var(--color-ink);
	/* Не по центру - обычный левый заголовок страницы, как в реальных
	   чекаутах, а не маркетинговый hero-текст (раньше здесь центром висел
	   телефонный баннер крупнее самой формы - убран по просьбе пользователя
	   "телефон вообще не нужен в корзине, это странно"). */
	text-align: left;
}

/* Страница "Заказ оформлен" (shop/check.php) - раньше это был голый AJAX-
   фрагмент без шапки/подвала, вставлявшийся ВНУТРЬ старой страницы
   оформления (жалоба 2026-08-09: "почему вся страница заказа не
   очищается"). Теперь обычная страница, .order-section/.checkout-page-title
   те же, что у /checkout/ - здесь только текст подтверждения и кнопка. */
/* По центру (гор.) - и заголовок, и текст, и кнопка: страница-квитанция,
   а не форма с левым выравниванием как /checkout/ (жалоба 2026-08-09:
   "этот текст надо отцентровать"). .checkout-page-title не трогаем
   глобально - там же он должен оставаться левым (см. комментарий у самого
   класса), центрируем только в рамках этой страницы через
   .order-section--confirmation. */
.order-section--confirmation {
	text-align: center;
}

.order-section--confirmation .checkout-page-title {
	text-align: center;
}

.order-confirmation {
	max-width: 65ch;
	margin: 0 auto;
}

.order-confirmation p {
	margin: 0 0 var(--space-4);
	font-size: 16px;
	line-height: 1.6;
	color: var(--color-ink-soft);
}

.order-confirmation a:not(.service-cta-btn) {
	color: var(--color-brand-red);
}

.order-confirmation a:not(.service-cta-btn):hover {
	color: var(--color-brand-red-dark);
}

.order-confirmation .service-cta-btn {
	margin-top: var(--space-3);
}

/* /checkout/ (shop/confirm.php) теперь только форма получателя - список
   товаров переехал на отдельный шаг /cart/ перед этой страницей (см.
   shop/cartpage.php, решение заказчицы 2026-08-09 по образцу irnby). Форма -
   левая колонка того же грида .checkout (cart.css), что и на /cart/ - карточка
   "Итого к оплате" (.checkout-summary-card, тот же класс, что на /cart/) -
   правая, прилипающая. Раньше форма была самостоятельно центрированной узкой
   колонкой (max-width:640px, margin:auto) поверх .order-section - на широких
   экранах повисала одиноко посреди страницы (жалоба заказчицы 2026-08-09:
   "теперь эту страницу надо доработать", после аналогичного фикса на /cart/).
   min-width:0 - тот же сброс, что у .checkout-main/.checkout-aside раньше -
   без него grid-элемент не сжимается меньше intrinsic-ширины содержимого. */
.checkout-main {
	min-width: 0;
}

.checkout-edit-cart-link {
	display: block;
	color: var(--color-brand-red);
	font-size: 14px;
	font-weight: 600;
	text-align: center;
}

.checkout-edit-cart-link:hover,
.checkout-edit-cart-link:focus-visible {
	color: var(--color-brand-red-dark);
}

.checkout-promo {
	margin-top: var(--space-5);
	padding-top: var(--space-4);
	border-top: 1px solid var(--color-border);
}

.checkout-promo-title {
	margin: 0 0 var(--space-3);
	font-family: var(--font-heading);
	font-size: 14px;
	font-weight: 600;
	color: var(--color-ink-soft);
}

.promocode,
.discountcard {
	display: flex;
	gap: var(--space-2);
	/* Раньше max-width:400px + margin auto центрировали форму в старой
	   800px-колонке. Теперь это .checkout-aside - на всю его ширину, без
	   центрирования, как и карточка "Список покупок" над этим блоком. */
	max-width: none;
	margin: 0 0 var(--space-3);
	padding: 0;
	border: none;
}

.promocode:last-child,
.discountcard:last-child {
	margin-bottom: 0;
}

.promocode input[type="text"],
.discountcard input[type="text"] {
	flex: 1 1 auto;
	/* min-width:0 обязателен - у элемента есть HTML-атрибут size="30" (сама
	   разметка в shop/confirm.php), который задаёт intrinsic-ширину поля.
	   Без сброса flex-item по умолчанию не сжимается уже этой ширины
	   (min-width:auto), и кнопка "Применить" вылезает за экран на узких
	   viewport (жалоба пользователя 2026-08-08: "не нравится... страница
	   корзины", обнаружено на 390px - кнопка обрезана на ~28px). */
	min-width: 0;
	min-height: 44px;
	margin: 0;
	padding: var(--space-2) var(--space-3);
	font-family: var(--font-body);
	font-size: 15px;
	color: var(--color-ink);
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-sm);
	box-sizing: border-box;
}

.promocode input[type="text"]:focus,
.discountcard input[type="text"]:focus {
	outline: none;
	border-color: var(--color-brand-red);
}

.promocode input[type="button"],
.discountcard input[type="button"] {
	flex: 0 0 auto;
	min-height: 44px;
	padding: 0 var(--space-4);
	font-family: var(--font-heading);
	font-size: 14px;
	font-weight: 600;
	color: var(--color-ink);
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-sm);
	cursor: pointer;
	transition: border-color var(--transition-fast), color var(--transition-fast);
}

.promocode input[type="button"]:hover,
.discountcard input[type="button"]:hover {
	border-color: var(--color-brand-red);
	color: var(--color-brand-red);
}

.order_form_box {
	/* Раньше max-width:480px + margin auto центрировали форму в старой
	   800px-колонке. Теперь это .checkout-main - на всю его ширину.
	   margin-top был var(--space-6) - раньше над формой в потоке ещё
	   стояла .checkout-total-line, отступ был нужен под неё. С переездом
	   суммы в свою карточку справа (.checkout-summary-card) .order_form_box
	   стал первым элементом .checkout-main, и этот отступ просто сдвигал
	   карточку покупателя на 32px ниже, чем сумма справа - две карточки
	   в одной строке грида не совпадали по верхнему краю (жалоба заказчицы
	   2026-08-09: "пока не оч ровно"). */
	width: 100%;
	max-width: none;
	margin: 0;
	font-size: 16px;
	font-weight: 400;
	box-sizing: border-box;
}

.block_order_form {
	display: flex;
	flex-direction: column;
	gap: var(--space-5);
	width: 100%;
	margin: 0;
}

.top_order_form,
.bottom_order_form {
	width: auto;
	margin: 0;
	float: none;
	font-size: inherit;
	font-weight: normal;
}

/* .top_order_form (карточка покупателя) и .bottom_order_form (поля способа
   доставки/комментария) - соседние блоки без своего родительского flex/gap
   (тот gap, что есть у .block_order_form, - между ЕГО прямыми детьми, а это
   двое вложены в общий .order_form_box) - без отступа шли впритык, label
   "Способ получения и доставки:" упирался прямо в нижнюю границу карточки
   (жалоба заказчицы 2026-08-09: "вот здесь отступов не хватает"). */
.bottom_order_form {
	margin-top: var(--space-6);
}

/* Карточка данных покупателя - раньше голые строки текста прямо на фоне
   страницы, без своей поверхности, в отличие от всего остального на
   странице оформления (карточки товаров справа, форма ниже со своими
   полями) - жалоба 2026-08-09: "эта форма по вёрстке очень плохая". Тот же
   приём поверхности, что у .service-cta/.variant-list-delivery. */
.top_order_form {
	padding: var(--space-5);
	background: var(--color-bg-alt);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-lg);
}

.customerinfo {
	margin: 0 0 var(--space-2);
	font-size: 15px;
	font-weight: 400;
	line-height: 1.6;
	color: var(--color-ink);
}

.customerinfo:last-child {
	margin-bottom: 0;
}

/* Выпадающий список подсказок города (Goods::PrintCartDeliveryEstimate,
   #deliverycitySuggest, assets/js/my.js) - .deliverycity-wrap даёт
   position:relative, список позиционируется под полем через absolute.
   z-index выше .checkout-delivery-estimate ниже (иначе список открывался
   бы под карточкой цены, если она уже показана от предыдущего ввода). */
/* #deliverycityRow теперь <div>, не <p> (см. Goods::PrintCartDeliveryEstimate) -
   <div> не получает отступ браузера по умолчанию, как <p>, а остальные
   .rline на этой форме - именно <p> и по-прежнему держатся на нём. margin
   здесь просто повторяет обычный браузерный отступ у <p> (1em сверху и
   снизу), чтобы строка с городом не выбивалась из общего ритма формы. */
/* #deliveryaddressRow - то же самое, тот же <div>-без-margin-по-умолчанию,
   что и #deliverycityRow выше (жалоба заказчицы 2026-08-11 "опять проблема
   с отступом" - то же самое замечание, что уже было для города, теперь и
   для нового поля адреса). */
#deliverycityRow,
#deliveryaddressRow {
	margin: 1em 0;
}

/* Иконка-подсказка рядом с подписью поля (Goods::PrintCartDeliveryEstimate) -
   всплывающий текст по наведению/фокусу (клавиатурная доступность через
   tabindex="0" на самой иконке - подсказку можно открыть и без мыши). */
.field-hint {
	position: relative;
	display: inline-flex;
	vertical-align: middle;
	margin-left: 6px;
	color: var(--color-ink-soft);
	cursor: help;
}

.field-hint:hover,
.field-hint:focus-visible {
	color: var(--color-brand-red);
	outline: none;
}

.field-hint svg {
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
}

.field-hint-tooltip {
	display: none;
	position: absolute;
	z-index: 20;
	top: 100%;
	left: 0;
	margin-top: 8px;
	width: 280px;
	padding: var(--space-3);
	font-size: 13px;
	font-weight: 400;
	line-height: 1.5;
	color: var(--color-ink);
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-md);
	box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
}

.field-hint:hover .field-hint-tooltip,
.field-hint:focus-visible .field-hint-tooltip {
	display: block;
}

/* display:block, не inline (по умолчанию у <span>-обёртки, которой она
   была раньше) - position:relative на строчном элементе не даёт
   предсказуемого контейнера для position:absolute у дочернего списка
   подсказок: тот рендерился в самом низу страницы вместо места сразу под
   полем (жалоба заказчицы 2026-08-11: "дроп даун должен появляться под
   самим полем", "видишь как в irnby"). Причина была глубже, чем просто
   inline/block - <ul> вообще не может лежать внутри <span> по HTML5
   (phrasing content), браузер молча переносил его в другое место дерева -
   заодно и обёртку сменили со <span> на <div> (см. комментарий в PHP). */
.deliverycity-wrap {
	position: relative;
	display: block;
}

.deliverycity-suggest {
	position: absolute;
	top: 100%;
	left: 0;
	right: 0;
	z-index: 10;
	margin: 4px 0 0;
	padding: 4px;
	list-style: none;
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-md);
	box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
	max-height: 260px;
	overflow-y: auto;
}

.deliverycity-suggest-item {
	padding: var(--space-2) var(--space-3);
	border-radius: var(--radius-sm);
	cursor: pointer;
	color: var(--color-ink);
}

.deliverycity-suggest-item:hover,
.deliverycity-suggest-item:focus-visible {
	background: var(--color-bg-alt);
	color: var(--color-brand-red);
}

/* Оценка стоимости доставки (Goods::PrintCartDeliveryEstimate,
   shop/confirm.php/confirmform.php) - карточка появляется после ввода
   города и выбора способа доставки (assets/js/my.js,
   UpdateDeliveryEstimate). Та же поверхность, что у .top_order_form -
   единый визуальный язык формы, а не чужой iframe-виджет перевозчика
   (см. комментарий у PrintCartDeliveryEstimate - решение заказчицы
   2026-08-09 отказаться от СДЭК/Dellin iframe на этой странице). */
/* margin-bottom - без него следующая строка формы (.rline, обычный <p>)
   держалась только на браузерном margin по умолчанию у <p> (эта карточка -
   <div>, своего нижнего отступа не было вообще) - на глаз читалось как
   слипшиеся блоки (жалоба заказчицы 2026-08-10: "нет отступа от
   рассчитанной стоимости доставки и полем комментарий"). */
.checkout-delivery-estimate {
	margin-top: var(--space-4);
	margin-bottom: var(--space-5);
	padding: var(--space-4);
	background: var(--color-bg-alt);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-md);
}

.checkout-delivery-estimate-title {
	margin: 0 0 var(--space-2);
	font-family: var(--font-heading);
	font-size: 14px;
	font-weight: 600;
	color: var(--color-ink);
}

.checkout-delivery-estimate-price {
	margin: 0 0 var(--space-2);
	font-size: 15px;
	color: var(--color-ink-soft);
}

.checkout-delivery-estimate-price strong {
	font-family: var(--font-heading);
	font-size: 20px;
	font-weight: 700;
	color: var(--color-brand-red);
}

.checkout-delivery-estimate-note {
	margin: 0;
	font-size: 12px;
	line-height: 1.5;
	color: var(--color-ink-soft);
}

.order_form_note {
	width: 100%;
	min-width: 0;
	max-width: none;
	margin: var(--space-6) 0 0;
	padding: var(--space-4) 0 0;
	border-top: 1px solid var(--color-border);
	font-size: 13px;
	font-weight: 400;
	line-height: 1.6;
	color: var(--color-ink-soft);
	text-align: left;
	box-sizing: border-box;
}

.order_form_note a {
	color: var(--color-brand-red);
}

.order_form_note a:hover,
.order_form_note a:focus-visible {
	color: var(--color-brand-red-dark);
}

.additionalgoods {
	border: none;
	width: 50%;
	min-width: 280px;
	margin: 0 auto;
	margin-bottom: 40px;
}
.additionalgoodsitem {
	font-family:Verdana, Arial, Helvetica, sans-serif;
	font-size: 11px;
	border: none;
	width: 84%;
	min-width: 280px;
	float: left;
}
.order_aditional_item {
	height: 60px;
	min-width: 150px;
	padding: 40px 0px 25px 0px;
}
/* Конец стилей для служебного поиска */

@media (max-width: 1100px){

	.box {                   /*вывод товаров*/
		display: block;
		width: 100%;
	}

	.video-gallery {
		display:table;
		width:100%;
	}
	.videobox {
		display:block;
		width:100%;
	}
	.video { display:table-footer-group; }

	ul.navbar-nav li a{
		font-size: 12px;
	}
	.blog-item h3{
		font-size: 15px;
	}
	.blog-item p{
		font-size: 12px;
	}
	.blog-item a:last-child{
		font-size: 14px;
	}
	.contact-form .col-md-6 {
		display: block;
		margin-bottom: 10px;
		overflow: hidden;
	}
	.carousel-caption {
		right: 15%;
		left: 15%;
		padding-bottom: 30px;
	}
}


/* Хлебные крошки (MainTree::PrintMainTree) — .tree было классом обёртки,
   но контент рендерился как голый <h1>: unstyled, крупный, плюс на странице
   товара получалось два <h1> (этот и .pdp-title). Теперь <nav>, список
   ссылок без семантики заголовка, разделители скрыты от скринридеров. */
.breadcrumbs {
	display: flex;
	flex-wrap: nowrap;
	overflow: hidden;
	align-items: center;
	gap: var(--space-1);
	margin: 0 0 var(--space-2);
	padding: var(--space-4) var(--space-5) var(--space-2);
	max-width: 1200px;
	margin-left: auto;
	margin-right: auto;
	font-size: 15px;
	color: var(--color-ink-soft);
}

/* .is-expanded - после клика по .breadcrumbs-toggle (assets/js/my.js): все
   уровни показаны, перенос строк разрешён. Без JS (или до его отработки)
   ни .is-collapsed, ни .is-expanded не проставляются - .breadcrumbs-middle
   виден всегда через display:inline по умолчанию, ничего не ломается. */
.breadcrumbs.is-expanded {
	flex-wrap: wrap;
	overflow: visible;
}

.breadcrumbs a {
	color: inherit;
}

.breadcrumbs a:hover,
.breadcrumbs a:focus-visible {
	color: var(--color-brand-red);
}

.breadcrumbs-sep {
	display: flex;
	flex: 0 0 auto;
}

/* Разделитель + ссылка после него не переносятся порознь: в развёрнутом
   (is-expanded) состоянии перенос строк разрешён (.breadcrumbs {flex-wrap:
   wrap}), и без этого браузер мог оставить стрелку одну в конце строки, а
   название раздела - на следующей. */
.breadcrumbs-crumb {
	display: inline-flex;
	align-items: center;
	gap: var(--space-1);
	flex: 0 0 auto;
}

/* :not(:first-child) - первый крумб внутри .breadcrumbs-middle уже отделён
   от "Главная" через gap самого .breadcrumbs (flex-соседи); свой margin-left
   ему не нужен - иначе оба отступа складываются, и между "Главная" и первым
   разделителем оказывается вдвое больше места, чем между остальными
   уровнями (жалоба заказчицы 2026-08-10: "тут пробел лишний появился"). */
.breadcrumbs-middle .breadcrumbs-crumb:not(:first-child) {
	margin-left: var(--space-1);
}

.breadcrumbs-sep svg {
	fill: none;
	stroke: var(--color-ink-soft);
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
}

.breadcrumbs-middle {
	display: inline-flex;
	align-items: center;
	flex-shrink: 0;
	overflow: hidden;
	white-space: nowrap;
	vertical-align: middle;
}

/* Разворачиваем перенос строк только в is-expanded - до этого middle должен
   оставаться в одну строку, иначе браузер молча переносит текст ВНУТРИ
   блока (сжимая его как flex-item) вместо честного overflow, который меряет
   JS (scrollWidth > clientWidth) - тогда схлопывание никогда не сработает. */
.breadcrumbs.is-expanded .breadcrumbs-middle {
	white-space: normal;
	overflow: visible;
}

/* Кнопка "..." - схлопывает .breadcrumbs-middle, когда строка не помещается
   (assets/js/my.js меряет scrollWidth > clientWidth). Спрятана по умолчанию
   (атрибут hidden в разметке) - показывается только когда реально нужна. */
.breadcrumbs-toggle {
	flex: 0 0 auto;
	font: inherit;
	color: inherit;
	background: none;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-sm);
	padding: 0 var(--space-1);
	cursor: pointer;
	line-height: 1.6;
}

.breadcrumbs-toggle:hover,
.breadcrumbs-toggle:focus-visible {
	color: var(--color-brand-red);
	border-color: var(--color-brand-red);
}

.breadcrumbs.is-collapsed .breadcrumbs-middle {
	display: none;
}

.breadcrumbs.is-collapsed .breadcrumbs-toggle {
	display: inline-block;
}

/* ================== Карточка товара (Goods::PrintSingle/PrintDifPic,
   PrintOrderFieldNew) ==================
   catalog.php использует те же классы для отдельной страницы товара. */

.pdp {
	max-width: 1200px;
	margin: 0 auto;
	padding: var(--space-6) var(--space-5) var(--space-8);
}

.pdp-title {
	margin: 0 0 var(--space-5);
	font-family: var(--font-heading);
	font-size: 26px;
	font-weight: 700;
	color: var(--color-ink);
}

/* PrintSingle и PrintDifPic используют одну и ту же обёртку — .pdp-group
   ниже — специально, чтобы карточка одного товара и варианты нескольких
   товаров выглядели одинаково, а не как два похожих, но разных компонента. */

.pdp-media {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	aspect-ratio: 1 / 1;
	overflow: hidden;
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-md);
}

.pdp-media img {
	max-width: 100%;
	max-height: 100%;
	width: auto;
	height: auto;
	object-fit: contain;
	display: block;
}

.pdp-info h1,
.pdp-info h2 {
	margin: 0 0 var(--space-3);
	font-family: var(--font-heading);
	font-size: 20px;
	font-weight: 600;
	color: var(--color-ink);
	padding: 0;
}

.pdp-info-descript {
	font-size: 15px;
	line-height: 1.6;
	color: var(--color-ink-soft);
}

.pdp-datasheet {
	display: inline-flex;
	align-items: center;
	gap: var(--space-2);
	margin-top: var(--space-4);
	font-size: 14px;
	color: var(--color-ink-soft);
}

.pdp-datasheet img {
	display: block;
}

/* Блок цены/остатков/заказа — та же визуальная семья, что и .service-cta */
/* Колонка карточек цены/заказа справа от фото+описания — одна на товар
   (PrintSingle) или несколько подряд, если у раздела больше одного варианта
   (PrintDifPic). flex: 0 0 — фиксированная ширина, не сжимается и не
   растягивается вместе с фото. */
.pdp-orders-col {
	display: flex;
	flex-direction: column;
	gap: var(--space-4);
	flex: 0 0 360px;
	min-width: 0;
}

/* .pdp-details wraps PrintSpecs/PrintDelivery output; .pdp-orders-col already
   adds gap above it, so drop the child's own top margin to avoid a double gap. */
.pdp-details > :first-child {
	margin-top: 0;
}

.pdp-order {
	padding: 0;
	background: none;
	border: none;
	border-radius: 0;
}

/* Название варианта в карточке цены (PrintDifPic) убрано — оно дублировало
   .pdp-info h2 слева у фото (см. TZ.md). Различать варианты в группе должны
   параметры ниже (namparamN/valparamN), а не повтор имени. */
/* Особые параметры варианта (PrintDifPic) — короткий список над ценой,
   печатается только если у товара есть заполненные namparamN. */
.pdp-order-params {
	margin: 0 0 var(--space-3);
	font-size: 13px;
	line-height: 1.6;
	color: var(--color-ink-soft);
}

/* Фото + описание для группы вариантов (PrintDifPic) — та же раскладка, что у
   .pdp-item, но без третьей колонки: у группы не один блок заказа, а от
   одного до нескольких — они идут ниже отдельными карточками .pdp-order. */
/* .pdp-group держит вместе фото+описание и все .pdp-order одного товара —
   flex-wrap, а не grid: число вариантов (карточек цены) заранее не известно,
   их может быть 1, может 3. Фото+описание берёт большую часть строки, каждая
   карточка варианта — фиксированную колонку; когда не влезают в одну строку,
   уходят на следующую, а не сжимают фото. */
.pdp-group {
	display: flex;
	flex-wrap: wrap;
	gap: var(--space-6);
	align-items: start;
	padding: var(--space-6) 0;
	border-bottom: 1px solid var(--color-border);
}

.pdp-group:last-child {
	border-bottom: none;
}

.pdp-item-group {
	display: grid;
	grid-template-columns: minmax(320px, 480px) 1fr;
	gap: var(--space-6);
	align-items: start;
	flex: 1 1 480px;
	min-width: 0;
}

/* Подпись и цена в строку (горизонтально). Было justify-content:space-between
   без переноса — длинная подпись "Оптовая (от 100т.р.):" сжималась и рвалась
   посреди слова. white-space:nowrap на подписи + flex-wrap на строке: подпись
   никогда не ломается сама, а если места не хватает — переносится вся цена
   целиком на следующую строку, а не буква посреди слова. */
.pdp-price-row {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	justify-content: space-between;
	column-gap: var(--space-3);
	row-gap: 2px;
	font-size: 14px;
	color: var(--color-ink-soft);
}

.pdp-price-row .pdp-price-label {
	white-space: nowrap;
}

.pdp-price-row + .pdp-price-row {
	margin-top: var(--space-2);
}

.pdp-price-row strong {
	font-family: var(--font-heading);
	font-size: 18px;
	font-weight: 700;
	color: var(--color-ink);
	white-space: nowrap;
}

.pdp-price-row.pdp-price-main strong {
	color: var(--color-brand-red);
}

.pdp-stock {
	margin: var(--space-4) 0 0;
	padding-top: var(--space-4);
	border-top: 1px solid var(--color-border);
	font-size: 14px;
}

.pdp-stock-row {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--space-3);
	color: var(--color-ink-soft);
}

.pdp-stock-row + .pdp-stock-row {
	margin-top: var(--space-2);
}

.pdp-stock-row strong {
	color: var(--color-ink);
}

.pdp-stock-row.pdp-stock-ok strong {
	color: var(--color-success);
}

.pdp-buyform {
	display: flex;
	gap: var(--space-3);
	margin-top: var(--space-4);
}

.pdp-qty {
	width: 72px;
	min-height: 44px;
	padding: 0 var(--space-3);
	font-size: 16px;
	font-family: var(--font-body);
	color: var(--color-ink);
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-sm);
	text-align: center;
}

.pdp-qty:focus-visible {
	outline: none;
	border-color: var(--color-brand-red);
	box-shadow: 0 0 0 3px rgba(207, 24, 24, 0.15);
}

.pdp-buy-btn {
	flex: 1 1 auto;
	min-height: 44px;
	padding: 0 var(--space-4);
	font-family: var(--font-heading);
	font-size: 15px;
	font-weight: 600;
	color: #fff;
	background: var(--color-brand-red);
	border: none;
	border-radius: var(--radius-sm);
	cursor: pointer;
	transition: background-color var(--transition-base);
}

.pdp-buy-btn:hover {
	background: var(--color-brand-red-dark);
}

.pdp-buy-btn:focus-visible {
	outline: 2px solid var(--color-ink);
	outline-offset: 2px;
}

/* ================== Компактный список вариантов (Goods::PrintDifPic)
   ================== Раздел с полусотней вариантов одного товара (сопла,
   держатели и т.п.) — раньше каждый вариант был полной PDP-карточкой
   (слайдер на несколько кадров + описание + свой калькулятор доставки),
   жалоба заказчицы 2026-08-09: "огромный избыточный список с одинаковыми
   изображениями". Теперь — плотная строка: миниатюра, характеристики,
   цена/наличие/кнопка. .pdp-price/.pdp-stock/.pdp-buyform внутри
   .variant-order — тот же PrintOrderFieldNew, что и раньше, стили не
   трогали. */
.variant-list {
	display: flex;
	flex-direction: column;
}

/* align-items: stretch, не flex-start - миниатюра растягивается по высоте
   до самого высокого соседа в строке (обычно .variant-info с несколькими
   характеристиками) и доходит по нижнему краю до кнопки "Добавить", а не
   остаётся мелким квадратом сверху (жалоба 2026-08-09: "должна по высоте
   заканчиваться кнопкой добавить"). */
.variant-row {
	display: flex;
	align-items: stretch;
	gap: var(--space-5);
	padding: var(--space-5) 0;
	border-bottom: 1px solid var(--color-border);
}

.variant-row:last-child {
	border-bottom: none;
}

/* Место под миниатюру резервируется заранее - без скачка вёрстки при
   загрузке (тот же приём, что у .iconpic). */
/* 128px, не 88px - на фоне всей строки (имя + характеристики + блок цены)
   88px читался слишком мелко (жалоба 2026-08-09: "фотографии слишком
   маленькие по сравнению со всей строкой"). */
/* Высота миниатюры тянется до кнопки "Добавить" через align-items:stretch
   на .variant-row (унаследовано по умолчанию, отдельно не задаём). Раньше
   ширину под квадрат подгонял JS (SquareVariantThumbs, assets/js/my.js)
   уже ПОСЛЕ отрисовки страницы, читая непредсказуемую высоту строки - из-за
   разного числа характеристик у товаров каждая строка получала СВОЙ размер
   квадрата, да ещё с видимым рывком в момент подгонки (жалобы 2026-08-10:
   "видишь разная высота", затем на фиксированный 160×160: "это слишком
   маленький размер, должно быть до кнопки добавить как на других").
   Раз .variant-info теперь всегда минимум 244px (см. выше) - высота строки
   стабильна и предсказуема сама по себе, JS для этого не нужен: ширина
   миниатюры просто фиксированный 160px, высота обычным CSS stretch
   повторяет (одинаковую у всех) высоту строки. */
.variant-thumb {
	flex: 0 0 auto;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 244px; /* = высоте строки (min-height у .variant-info) - квадрат, не прямоугольник */
	overflow: hidden;
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-md);
}

/* object-fit: contain, не cover (пересмотрено 2026-08-10 - раньше здесь был
   cover по жалобе 2026-08-09 "если не вписывается, то просто обрезать", но
   после починки генератора image-big-slider-jpg.php выяснилось, что cover
   обрезает и значимую часть фото, не только пустые поля - заказчица явно
   попросила обратное: "размер... остаётся, ... если обрезаются какие-то его
   части, то можно уменьшить изображение чтобы оно всё вписалось, ... если
   не хватает изображения то добавить поля"). Бокс .variant-thumb не
   меняется (те же 160px), фон - чистый белый --color-bg (не --color-bg-alt:
   жалоба 2026-08-10 "видишь тут серые поля, а такого не должно быть" - тот
   же фикс применён и к .pdp-media/.pdp-gallery-main/.pdp-gallery-nav, везде,
   где в рамке показывается фото товара). Фото целиком вписывается внутрь
   без обрезки, пустые поля закрывает белый фон бокса. */
.variant-thumb img {
	width: 100%;
	height: 100%;
	object-fit: contain;
}

/* min-height 244px - высота самого длинного реального содержимого
   (4 характеристики + 2 строки цены + склад/путь, см. /focusing-
   collimation-lens/) - без него разное число характеристик у разных
   товаров давало разную высоту строки, а значит и разный размер квадрата
   миниатюры (.variant-thumb, align-self:stretch ниже) - жалобы
   2026-08-10 "видишь разная высота" и следом "это слишком маленький
   размер, должно быть до кнопки добавить как на других". Короткие строки
   теперь просто дотягиваются до этой высоты, длинные (если где-то
   появится 5+ характеристик) - растут дальше как обычно. */
.variant-info {
	flex: 1 1 auto;
	min-width: 0;
	min-height: 244px;
}

.variant-name {
	margin: 0 0 var(--space-2);
	font-family: var(--font-heading);
	font-size: 16px;
	font-weight: 600;
	color: var(--color-ink);
}

/* Вертикально, не в строку - длинные значения (например список совместимых
   моделей головок) в горизонтальном flex-wrap растягивались на всю ширину
   ряда одной строкой, вылезая за пределы читаемого (жалоба 2026-08-09:
   "лучше чтобы параметры были вертикально перечислены"). Столбцом длинное
   значение просто переносится само внутри своей строки. */
.variant-specs {
	display: flex;
	flex-direction: column;
	gap: var(--space-1);
	margin: 0;
	font-size: 13px;
	line-height: 1.5;
	color: var(--color-ink-soft);
}

.variant-spec {
	max-width: 100%;
}

.variant-spec b {
	font-weight: 600;
	color: var(--color-ink);
}

.variant-order {
	flex: 0 0 260px;
	min-width: 0;
}

.variant-order .pdp-stock {
	margin-top: var(--space-3);
	padding-top: var(--space-3);
}

.variant-order .pdp-buyform {
	margin-top: var(--space-3);
}

/* PrintSpecs (Goods::PrintSingle) печатает свой .pdp-specs - вертикальный
   блок с рамками, рассчитанный на одиночную PDP-страницу. Внутри
   .variant-info (компактная строка списка) - тот же приём, что и
   .variant-specs: инлайн, без бордеров, без верхнего отступа/линии. */
/* Столбцом (тот же .pdp-specs display:flex; flex-direction:column - дефолт
   не переопределён) - как и .variant-specs выше, длинные значения не
   растягивались бы в одну строку на всю ширину. */
.variant-info .pdp-specs {
	gap: var(--space-1);
	margin: var(--space-2) 0 0;
	padding-top: 0;
	border-top: none;
	font-size: 13px;
	color: var(--color-ink-soft);
}

.variant-info .pdp-specs-row {
	justify-content: flex-start;
	gap: var(--space-1);
	padding: 0;
	border-bottom: none;
}

.variant-info .pdp-datasheet {
	margin-top: var(--space-2);
	font-size: 13px;
}

/* Один блок способов доставки на весь список вариантов, а не калькулятор
   под каждой строкой (см. комментарий в PrintDifPic) - та же поверхность,
   что .service-cta/.empty-state. */
.variant-list-delivery {
	margin-bottom: var(--space-6);
	padding: var(--space-5);
	background: var(--color-bg-alt);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-lg);
}

.variant-list-delivery-title {
	margin: 0 0 var(--space-2);
	font-family: var(--font-heading);
	font-weight: 600;
	font-size: 15px;
	color: var(--color-ink);
}

.variant-list-delivery-text {
	margin: 0;
	font-size: 14px;
	line-height: 1.6;
	color: var(--color-ink-soft);
}

.variant-list-delivery-text a {
	color: var(--color-brand-red);
}

.variant-list-delivery-text a:hover {
	color: var(--color-brand-red-dark);
}

.variant-list-delivery-text a:focus-visible {
	outline: 2px solid var(--color-ink);
	outline-offset: 2px;
}

@media (max-width: 720px) {
	.variant-row {
		flex-wrap: wrap;
	}

	.variant-thumb {
		flex: 0 0 auto;
		width: 110px;
	}

	.variant-order {
		flex: 1 1 100%;
	}
}

/* ================== Отдельная страница товара (catalog.php, /catalog/*.html)
   ================== Тот же .pdp-group, что у карточки в разделе. Отличие —
   фото не квадратное превью, а полноразмерная галерея (миниатюры снизу,
   зум по клику через magnific-popup). id="container"/"slider"/"carousel" и
   class="flexslider" — требования плагина jQuery Flexslider (js/vendor/
   jquery.flexslider.js, css/vendor/flexslider.css), имена менять нельзя. */

.pdp-media--gallery {
	display: block;
	width: auto;
	flex: 1 1 420px;
	aspect-ratio: auto;
	overflow: visible;
	background: none;
	border: none;
	border-radius: 0;
}

/* Характеристики товара (габариты, вес и т.п. — namparamN/valparamN) */
.pdp-specs {
	display: flex;
	flex-direction: column;
	gap: 0;
	margin: var(--space-4) 0 0;
	padding-top: var(--space-4);
	border-top: 1px solid var(--color-border);
	font-size: 14px;
}

.pdp-specs-row {
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	gap: var(--space-3);
	padding: var(--space-2) 0;
	border-bottom: 1px solid var(--color-border);
}

.pdp-specs-row:last-child {
	border-bottom: none;
	padding-bottom: 0;
}

.pdp-specs-label {
	color: var(--color-ink-soft);
}

.pdp-specs-row strong {
	color: var(--color-ink);
	text-align: right;
}

/* Якорное меню группы товаров на одной странице (Group::PrintGroup) */
.groupmenu {
	display: flex;
	flex-wrap: wrap;
	gap: var(--space-2);
	margin: 0 0 var(--space-6);
}

.groupmenu-link {
	padding: var(--space-2) var(--space-3);
	font-family: var(--font-heading);
	font-size: 13px;
	font-weight: 600;
	color: var(--color-ink);
	background: var(--color-bg-alt);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-sm);
	text-decoration: none;
}

.groupmenu-link:hover,
.groupmenu-link:focus-visible {
	border-color: var(--color-brand-red);
	color: var(--color-brand-red);
}

/* Смена цвета рамки недостаточна для клавиатурного фокуса - везде на сайте
   у интерактивных элементов есть явный outline:2px (.icon, .prose a,
   .service-cta-btn и т.д.), здесь его не было - пропуск при копировании
   правила. Нет фикстуры, чтобы проверить вживую (Group::PrintGroup,
   includefile='group' - см. TZ.md "Что осталось сделать"), но статья
   применения токенов та же, что и везде. */
.groupmenu-link:focus-visible {
	outline: 2px solid var(--color-ink);
	outline-offset: 2px;
}

@media (max-width: 620px) {
	.pdp-item-group {
		grid-template-columns: 1fr;
	}
	.pdp-order {
		max-width: none;
	}
	/* .pdp-orders-col держит фикс. 360px (flex: 0 0 360px, см. выше) - это
	   специально: колонка цены не должна сжиматься вместе с фото на десктопе.
	   Но на узких экранах (proверено 375px) 360px шире самого вьюпорта -
	   .pdp-group переносил её на новую строку (flex-wrap), но ширина 360px
	   оставалась и раздвигала body: document.body.scrollWidth был 376 при
	   window.innerWidth 375 - горизонтальный скролл на реальном телефоне.
	   document.documentElement.scrollWidth эту разницу не ловит (у html и
	   body разный scrollWidth в этом кейсе), поэтому раньше её не заметили -
	   проверять надо оба. */
	.pdp-orders-col {
		flex: 1 1 100%;
	}
}

@media (max-width: 620px) {
	.pdp {
		padding: var(--space-5) var(--space-4) var(--space-6);
	}
	.pdp-title {
		font-size: 22px;
	}
	.podrazdel-title {
		padding: var(--space-5) var(--space-4) var(--space-4);
		font-size: 22px;
	}
}

@media (prefers-reduced-motion: reduce) {
	.pdp-buy-btn {
		transition: none;
	}
}


/* ================== Галерея фото карточки товара (Goods::PrintGallery)
   ================== Раньше жила только на отдельной странице /catalog/*.html
   (один #slider/#carousel на страницу), теперь и в карточках раздела — там
   их может быть несколько, поэтому id у слайдеров разные, а стилизуем по
   общим классам .pdp-gallery-main/.pdp-gallery-nav. */
.pdp-gallery {
	display: flex;
	flex-direction: column;
	gap: var(--space-3);
}

.pdp-gallery-main {
	overflow: hidden;
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-md);
}

.pdp-gallery-main .slides img,
.pdp-gallery-main .slides iframe {
	display: block;
	width: 100%;
	aspect-ratio: 1 / 1;
	object-fit: contain;
	background: var(--color-bg);
	border: 0;
}

.pdp-gallery-nav .slides {
	display: flex;
	gap: var(--space-2);
}

.pdp-gallery-nav .slides li {
	flex: 0 0 64px;
	width: 64px;
}

.pdp-gallery-nav .slides img {
	display: block;
	width: 100%;
	aspect-ratio: 1 / 1;
	object-fit: contain;
	background: var(--color-bg);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-sm);
	cursor: pointer;
}

/* ================== Доставка (Goods::PrintDelivery) ==================
   Раньше СДЭК и Деловые линии выводились двумя сторонними iframe подряд без
   общего оформления — отсюда жалоба "вёрстка плохая где сдэк". Теперь
   перевозчик выбирается вкладкой, виджет один раз в рамке .pdp-delivery.
   Сам iframe грузится лениво (js/my.js, IntersectionObserver): на разделе
   из десятка товаров столько же карточек, все калькуляторы сразу не нужны. */
.pdp-delivery {
	margin-top: var(--space-4);
	padding-top: var(--space-4);
	border-top: 1px solid var(--color-border);
}

.pdp-delivery-title {
	margin: 0 0 var(--space-3);
	font-family: var(--font-heading);
	font-size: 14px;
	font-weight: 600;
	color: var(--color-ink);
}

.pdp-delivery-tabs {
	display: flex;
	gap: var(--space-2);
	margin-bottom: var(--space-3);
}

.pdp-delivery-tab {
	min-height: 36px;
	padding: 0 var(--space-3);
	font-family: var(--font-heading);
	font-size: 13px;
	font-weight: 600;
	color: var(--color-ink-soft);
	background: var(--color-bg-alt);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-sm);
	cursor: pointer;
	transition: border-color var(--transition-fast), color var(--transition-fast);
}

.pdp-delivery-tab.is-active {
	color: var(--color-brand-red);
	border-color: var(--color-brand-red);
	background: var(--color-bg);
}

.pdp-delivery-tab:focus-visible {
	outline: 2px solid var(--color-ink);
	outline-offset: 2px;
}

.pdp-delivery-panel[hidden] {
	display: none;
}

.pdp-delivery-panel iframe {
	display: block;
	width: 100%;
	max-width: 332px;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-sm);
}

@media (prefers-reduced-motion: reduce) {
	.pdp-delivery-tab {
		transition: none;
	}
}

@media (prefers-reduced-motion: reduce) {
	.sb-search form,
	.sb-search-input {
		transition: none;
	}
}
