/* --- 05-components.css --- */
/* Tech Spec — component layer.

   Six people styled nine areas of this site in parallel from the same token
   brief. Tokens answer "which colour"; they do not answer "what is a service
   label" or "what is a panel", so every area rebuilt those from the prose
   description and they drifted: the checkout ended up in a monospace stack
   while every other page used Manrope, the error state got three different
   reds, and the same 10px label appeared with five different trackings.

   This file is the canon. It loads first (parts/ is enqueued in name order),
   declares the component-level tokens, and page files consume them instead of
   literals. tools/lint-tokens.mjs fails the build when a page file writes a
   literal radius, tracking or font stack, so this does not depend on anyone
   remembering.

   Values are taken from the reference implementations rather than invented:
   the plate from 20-product.css, the heading from 10-home.css, the chrome
   from 30-shell-fixes.css. */

body.iq-variant-techspec {
  /* --- Service label -----------------------------------------------------
     The small tracked caption that carries article numbers, timings and sheet
     references. One definition; page files use the four tokens together. */
  --iq-label-font: var(--iq-font);
  --iq-label-size: 10px;
  --iq-label-weight: 600;
  --iq-label-leading: 1.3;
  --iq-label-tracking: .16em;

  /* A second, wider tracking for standalone rules and breadcrumb-like rows,
     where the label has room and reads better spread out. */
  --iq-label-tracking-wide: .18em;

  /* Figures, currency suffixes and index numbers set at reading size. They are
     neither captions nor headings: the caption tracking detaches a ₽ from its
     number, and the heading's negative tracking crowds tabular digits. */
  --iq-numeric-tracking: .02em;

  /* --- Headings ---------------------------------------------------------- */
  --iq-heading-font: var(--iq-display);
  --iq-heading-weight: 700;
  --iq-heading-tracking: -.02em;
  --iq-heading-leading: .98;

  /* --- Plate -------------------------------------------------------------
     The bordered sheet used for cards, panels and side rails. */
  --iq-panel-bg: var(--iq-bg-surface);
  --iq-panel-border: 1px solid var(--iq-hair-strong);
  --iq-panel-radius: var(--iq-radius-panel);
  --iq-panel-pad: 20px;
  --iq-panel-pad-tight: 14px;

  /* What sits behind a cover, a player or a thumbnail before the media loads.
     The same literal had been written independently in four files. */
  --iq-media-bg: #0e1013;

  /* Seam between adjacent cells. Draw it as a cell border, not as a plate
     showing through a 1px gap — a track the content does not fill paints that
     plate as a grey block, which has been the cause of four defects here. */
  --iq-seam: 1px solid var(--iq-hair);

  /* --- Fields and controls -----------------------------------------------
     44px is the minimum touch target; fields sit slightly above it. */
  --iq-field-h: 46px;
  --iq-control-h: 44px;
  --iq-field-bg: var(--iq-input-bg);
  --iq-field-border: 1px solid var(--iq-hair-strong);
  --iq-field-radius: var(--iq-radius-input);
  --iq-field-pad: 0 14px;

  /* --- Button ------------------------------------------------------------
     Кнопка — самый заметный контрол, и до сих пор её в слое не было: чекаут,
     корзина и главная брали пилюлю базовой темы (радиус 20px, бордюр 2px,
     Open Sans). Один набор токенов, две роли: заливка — основное действие,
     контур — всё остальное. */
  /* Отступ, а не высота: кнопка не задаёт себе `display`, поэтому центрируется
     полями, а не флексом. Почему — в 06-controls.css. 15px сверху и снизу при
     кегле 12/1.2 дают 44px цели. */
  --iq-btn-pad: 15px 22px;
  --iq-btn-radius: var(--iq-field-radius);
  --iq-btn-border-width: 1px;

  /* --- Semantic state ----------------------------------------------------
     One red. --iq-color-danger already existed in the theme primitives; the
     other two values in circulation were invented locally. */
  --iq-danger: var(--iq-color-danger, #ff5a67);
  --iq-danger-bg: color-mix(in srgb, var(--iq-danger) 12%, transparent);
  --iq-success: #6ee0a8;

  /* --- Rhythm ------------------------------------------------------------
     A 4px scale. Page files pick from it rather than inventing a gap. */
  --iq-gap-1: 4px;
  --iq-gap-2: 8px;
  --iq-gap-3: 12px;
  --iq-gap-4: 18px;
  --iq-gap-5: 26px;
  --iq-gap-6: 40px;

  /* --- Motion ------------------------------------------------------------
     Exit is shorter than enter so interfaces feel responsive. */
  --iq-dur-in: 220ms;
  --iq-dur-out: 150ms;
  --iq-ease: cubic-bezier(.22, .61, .36, 1);
}

/* Focus is a single treatment everywhere. Never removed, always the accent. */
body.iq-variant-techspec :focus-visible {
  outline: 2px solid var(--iq-action-primary);
  outline-offset: 2px;
}

@media (prefers-reduced-motion: reduce) {
  body.iq-variant-techspec {
    --iq-dur-in: 0ms;
    --iq-dur-out: 0ms;
  }
}

/* --- 06-controls.css --- */
/* Tech Spec — кнопки, общие для всего сайта.

   Базовая тема даёт `.btn` радиусом 20px, бордюром 2px и Open Sans — пилюлю,
   которая не имеет отношения к чертёжной системе. Ни один файл её не
   переопределял, поэтому одна и та же кнопка «Оформить заказ» выглядела
   пилюлей и в корзине, и в чекауте, и на главной, пока всё вокруг было
   набрано по слою компонентов. Здесь она приводится к системе один раз.

   Ролей две, и они читаются из класса разметки, а не из места на странице:
   `.btn--contrast` — основное действие (заливка), всё остальное — контур.
   На экране должно быть ровно одно основное действие; если их окажется два,
   это дефект разметки, а не стилей. */

/* `display` здесь не задаётся намеренно. Общее правило на `.btn` весит больше
   одноклассовых правил темы, и `display: inline-flex` перебивал пять живых
   `display: none`: «Регистрация» в мобильной шапке, кнопка выхода, слово
   «промокод» на узких экранах и кнопка промо-попапа до согласия на cookie —
   всё это молча появлялось на экране. Высота набирается полями, а не флексом. */
body.iq-variant-techspec .btn {
  padding: var(--iq-btn-pad);
  border: var(--iq-btn-border-width) solid var(--iq-hair-strong);
  border-radius: var(--iq-btn-radius);
  background: transparent;
  color: var(--iq-fg-primary);
  font: var(--iq-label-weight) 12px/1.2 var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  text-align: center;
  transition: border-color var(--iq-dur-in) var(--iq-ease),
              color var(--iq-dur-in) var(--iq-ease),
              background-color var(--iq-dur-in) var(--iq-ease);
}

body.iq-variant-techspec .btn:hover,
body.iq-variant-techspec .btn:focus-visible {
  border-color: var(--iq-action-primary);
  color: var(--iq-action-primary);
}

/* Основное действие. При наведении меняется местами с фоном, а не тускнеет:
   заливка остаётся отличимой от контурных соседей в любом состоянии. */
body.iq-variant-techspec .btn--contrast {
  border-color: var(--iq-action-primary);
  background: var(--iq-action-primary);
  color: var(--iq-button-primary-fg);
}
body.iq-variant-techspec .btn--contrast:hover,
body.iq-variant-techspec .btn--contrast:focus-visible {
  background: transparent;
  color: var(--iq-action-primary);
}

/* Цветные варианты базовой темы (сиреневый, синий, белый) в чертеже роли не
   несут — это остатки прежней палитры. Приводим к контуру, чтобы «синяя» и
   «сиреневая» кнопки рядом не читались как два разных по важности действия. */
body.iq-variant-techspec .btn--light-violet,
body.iq-variant-techspec .btn--blue,
body.iq-variant-techspec .btn--white,
body.iq-variant-techspec .btn--cashback {
  border-color: var(--iq-hair-strong);
  background: transparent;
  color: var(--iq-fg-primary);
}

body.iq-variant-techspec .btn[disabled],
body.iq-variant-techspec .btn:disabled {
  opacity: .45;
  cursor: not-allowed;
}
body.iq-variant-techspec .btn[disabled]:hover,
body.iq-variant-techspec .btn:disabled:hover {
  border-color: var(--iq-hair-strong);
  color: var(--iq-fg-primary);
}

/* Кнопка со значком. Значок в базовой теме позиционируется абсолютно у правого
   края, а место под него держит `padding-right: 45px` — который затирался
   шорткодом `padding` выше, и значок ложился на последние буквы подписи.
   Заодно он был прибит к `top: 8px`, что мимо середины сорокачетырёхпиксельной
   кнопки. Место возвращаем, значок центрируем по вертикали. */
body.iq-variant-techspec .btn--svg-icon {
  padding-right: 46px;
}
body.iq-variant-techspec .btn--svg-icon > svg {
  top: 50%;
  right: 16px;
  transform: translateY(-50%);
}

/* --- 10-home.css --- */
/* ==========================================================================
   10-home.css — главная страница в теме «Tech Spec»
   --------------------------------------------------------------------------
   Область: только главная (`body.home`, шаблон page-main.php) и только вариант
   techspec. КАЖДЫЙ селектор начинается с `body.iq-variant-techspec` — editorial
   остаётся боевым видом сайта, любая протечка ломает прод. Дополнительный
   `.home` в связке отсекает служебные страницы (корзина, чекаут, ЛК, вход):
   они никогда не несут класс home.

   Переменные варианта (--iq-hair, --iq-card-bg-hover и т.д.) уже объявлены в
   iq-visual.css на `body.iq-variant-techspec`. Здесь новых токенов на :root не
   объявляется намеренно: var() внутри кастомного свойства резолвится на том
   элементе, где свойство объявлено, а темы переопределяют токены на body —
   производный токен с :root замёрз бы на базовой (фиолетовой) палитре.

   Идея страницы: обложка технической документации. Крупный Unbounded,
   служебные моно-подписи 10px/.16em, хайрлайны и прямые углы вместо теней и
   скруглений, данные и номера как часть композиции.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. ЛИСТ
   Координатная сетка и изолинии живут на самом body: фон не создаёт нового
   контекста наложения и не может перекрыть шапку или будущий WebGL-канвас.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.home {
  background-color: var(--iq-bg-canvas);
  background-image:
    repeating-radial-gradient(circle at 22% 12%, transparent 0 13px, rgba(184, 192, 204, .05) 13px 14px),
    repeating-radial-gradient(circle at 80% 46%, transparent 0 17px, rgba(184, 192, 204, .04) 17px 18px),
    repeating-linear-gradient(90deg, rgba(232, 236, 240, .028) 0 1px, transparent 1px 96px),
    repeating-linear-gradient(0deg, rgba(232, 236, 240, .028) 0 1px, transparent 1px 96px);
  background-attachment: fixed;
}

/* Периметр листа с угловыми маркерами. Псевдоэлемент main, а не отдельный
   узел: разметку трогать нельзя. z-index держим ниже шапки (у неё 1000). */
body.iq-variant-techspec.home .home-main {
  position: relative;
}
body.iq-variant-techspec.home .home-main::before {
  content: '';
  position: fixed;
  z-index: 2;
  inset: 10px;
  pointer-events: none;
  border: 1px solid var(--iq-hair);
}

/* Секции листа: между блоками — шов, а не воздух. */
body.iq-variant-techspec.home .home-news,
body.iq-variant-techspec.home .trust,
body.iq-variant-techspec.home .why-us,
body.iq-variant-techspec.home .faq,
body.iq-variant-techspec.home .simple-text {
  border-top: 1px solid var(--iq-hair);
  background: var(--iq-bg-canvas);
}

/* --------------------------------------------------------------------------
   2. ГЛАВНЫЙ БАННЕР (.main-banner--iq)
   Титульный лист спецификации: графит, прямые углы, крупный Unbounded.
   Слой WebGL-канваса делает другой разработчик — здесь ничего абсолютно
   позиционированного поверх всего баннера не добавляется, кроме угловых
   реперов на самой секции.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.home .main-banner--iq {
  max-width: 1440px;
  margin: 0 auto 0;
  border-radius: 0;
  border-bottom: 1px solid var(--iq-hair);
  background:
    linear-gradient(180deg, rgba(19, 21, 25, .92) 0%, rgba(11, 12, 14, .92) 100%);
}
/* Затемняющая шторка исходной темы гасила бы канвас — оставляем ровный лист. */
body.iq-variant-techspec.home .main-banner--iq::before {
  background: linear-gradient(90deg, rgba(11, 12, 14, .82) 0%, rgba(11, 12, 14, .42) 58%, rgba(11, 12, 14, .12) 100%);
}
/* Угловые реперы титульного листа. */
body.iq-variant-techspec.home .main-banner--iq::after {
  content: '';
  position: absolute;
  z-index: 4;
  inset: 18px;
  pointer-events: none;
  opacity: .55;
  background:
    linear-gradient(var(--iq-action-signal), var(--iq-action-signal)) 0 0 / 22px 1px no-repeat,
    linear-gradient(var(--iq-action-signal), var(--iq-action-signal)) 0 0 / 1px 22px no-repeat,
    linear-gradient(var(--iq-action-signal), var(--iq-action-signal)) 100% 0 / 22px 1px no-repeat,
    linear-gradient(var(--iq-action-signal), var(--iq-action-signal)) 100% 0 / 1px 22px no-repeat,
    linear-gradient(var(--iq-action-signal), var(--iq-action-signal)) 0 100% / 22px 1px no-repeat,
    linear-gradient(var(--iq-action-signal), var(--iq-action-signal)) 0 100% / 1px 22px no-repeat,
    linear-gradient(var(--iq-action-signal), var(--iq-action-signal)) 100% 100% / 22px 1px no-repeat,
    linear-gradient(var(--iq-action-signal), var(--iq-action-signal)) 100% 100% / 1px 22px no-repeat;
}

/* Служебная строка над заголовком: подпись + пунктир-выноска. */
body.iq-variant-techspec.home .main-banner__eyebrow {
  display: flex;
  align-items: center;
  gap: 14px;
  margin-bottom: 22px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--iq-hair);
  color: var(--iq-fg-muted);
  font: 600 10px/1 var(--iq-font);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.home .main-banner__eyebrow::before {
  content: '';
  flex: 0 0 auto;
  width: 6px;
  height: 6px;
  background: var(--iq-action-primary);
  box-shadow: 0 0 0 3px rgba(110, 231, 255, .14);
}
body.iq-variant-techspec.home .main-banner__eyebrow::after {
  content: '';
  flex: 1 1 auto;
  min-width: 12px;
  height: 1px;
  opacity: .45;
  background-image: linear-gradient(90deg, var(--iq-fg-muted) 0 3px, transparent 3px 7px);
  background-size: 7px 1px;
}

body.iq-variant-techspec.home .main-banner--iq .main-banner__title {
  color: var(--iq-fg-primary);
  font: 700 clamp(38px, 5.6vw, 78px)/.95 var(--iq-display);
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}
/* Вторая строка — контур, как индекс листа в референсе. */
body.iq-variant-techspec.home .main-banner--iq .main-banner__title b {
  margin-top: 6px;
  color: transparent;
  -webkit-text-stroke: 1px var(--iq-action-signal);
  opacity: .78;
  font-size: .62em;
  letter-spacing: 0;
}

body.iq-variant-techspec.home .main-banner__description {
  max-width: 46ch;
  color: var(--iq-fg-muted);
  font: 400 14px/1.55 var(--iq-font);
}

/* Переключатель темпа — вкладки прибора: 1px швы, прямые углы. */
body.iq-variant-techspec.home .main-banner__tempo-switch {
  gap: 1px;
  /* The strip is drawn as a plate showing through 1px gaps, so any width the
     tabs do not fill is painted as a grey block. Shrink it to the tabs. */
  width: fit-content;
  max-width: 100%;
  margin-top: 26px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-border-subtle);
  overflow: hidden;
}
body.iq-variant-techspec.home .main-banner__tempo-button {
  border: 0;
  border-radius: 0;
  padding: 0 18px;
  background: var(--iq-bg-surface);
  color: var(--iq-fg-muted);
  font: 600 11px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.home .main-banner__tempo-button:hover,
body.iq-variant-techspec.home .main-banner__tempo-button:focus-visible {
  transform: none;
  border: 0;
  background: var(--iq-card-bg-hover);
  color: var(--iq-fg-primary);
}
body.iq-variant-techspec.home .main-banner__tempo-button.is-active {
  border: 0;
  background: var(--iq-action-primary);
  color: var(--iq-bg-canvas);
}

/* CTA: залитый блок и хайрлайн-дублёр. Ни скруглений, ни подпрыгиваний. */
body.iq-variant-techspec.home .main-banner__cta,
body.iq-variant-techspec.home .main-banner__secondary {
  border-radius: var(--iq-radius-media);
  font: 700 12px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  transition: background-color .2s ease, color .2s ease, border-color .2s ease;
}
body.iq-variant-techspec.home .main-banner__cta {
  background: var(--iq-action-primary);
  color: var(--iq-bg-canvas);
}
body.iq-variant-techspec.home .main-banner__secondary {
  border: 1px solid var(--iq-hair-strong);
  color: var(--iq-fg-primary);
}
body.iq-variant-techspec.home .main-banner__cta:hover,
body.iq-variant-techspec.home .main-banner__cta:focus-visible {
  transform: none;
  background: var(--iq-fg-primary);
  color: var(--iq-bg-canvas);
}
body.iq-variant-techspec.home .main-banner__secondary:hover,
body.iq-variant-techspec.home .main-banner__secondary:focus-visible {
  transform: none;
  border-color: var(--iq-action-primary);
  color: var(--iq-action-primary);
}

body.iq-variant-techspec.home .main-banner__delivery-note {
  margin-top: 16px;
  padding-top: 12px;
  border-top: 1px solid var(--iq-hair);
  color: var(--iq-fg-muted);
  font: 600 10px/1.4 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

/* Приборная панель темпа — плита, а не стеклянная карточка. */
body.iq-variant-techspec.home .main-banner__tempo-desk {
  border: 1px solid var(--iq-hair);
  border-radius: var(--iq-radius-panel);
  background: rgba(19, 21, 25, .58);
  box-shadow: none;
  backdrop-filter: none;
}
body.iq-variant-techspec.home .main-banner__tempo-track { stroke: rgba(232, 236, 240, .16); }
body.iq-variant-techspec.home .main-banner__tempo-wave { stroke: var(--iq-action-primary); }
body.iq-variant-techspec.home .main-banner__tempo-core {
  fill: rgba(110, 231, 255, .07);
  stroke: var(--iq-action-signal);
}

/* --------------------------------------------------------------------------
   3. РЕЙЛ НАПРАВЛЕНИЙ (.iq-feature-rail)
   В iq-visual.css он оформлен только под editorial — в techspec приходит
   голым списком ссылок. Здесь он собран заново: четыре ячейки, швы 1px.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.home .iq-feature-rail {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 1px;
  max-width: 1440px;
  margin: 0 auto;
  border-top: 1px solid var(--iq-border-subtle);
  border-bottom: 1px solid var(--iq-border-subtle);
  background: var(--iq-border-subtle);
}
body.iq-variant-techspec.home .iq-feature-rail__item {
  position: relative;
  display: grid;
  align-content: space-between;
  gap: 26px;
  min-height: 190px;
  padding: 16px 18px 18px;
  overflow: hidden;
  background: var(--iq-card-bg);
  color: var(--iq-fg-primary);
  text-decoration: none;
  transition: background-color .2s ease;
}
body.iq-variant-techspec.home .iq-feature-rail__item:hover,
body.iq-variant-techspec.home .iq-feature-rail__item:focus-visible {
  background: var(--iq-card-bg-hover);
}
/* Угловые реперы ячейки — те же, что у плиты каталога. */
body.iq-variant-techspec.home .iq-feature-rail__item::before,
body.iq-variant-techspec.home .iq-feature-rail__item::after {
  content: '';
  position: absolute;
  width: 9px;
  height: 9px;
  pointer-events: none;
  border: 1px solid var(--iq-fg-muted);
  opacity: .45;
  transition: border-color .2s ease, opacity .2s ease;
}
body.iq-variant-techspec.home .iq-feature-rail__item::before {
  top: 5px; left: 5px;
  border-right: 0;
  border-bottom: 0;
}
body.iq-variant-techspec.home .iq-feature-rail__item::after {
  right: 5px; bottom: 5px;
  border-left: 0;
  border-top: 0;
}
body.iq-variant-techspec.home .iq-feature-rail__item:hover::before,
body.iq-variant-techspec.home .iq-feature-rail__item:hover::after,
body.iq-variant-techspec.home .iq-feature-rail__item:focus-visible::before,
body.iq-variant-techspec.home .iq-feature-rail__item:focus-visible::after {
  border-color: var(--iq-action-primary);
  opacity: 1;
}
body.iq-variant-techspec.home .iq-feature-rail__index {
  position: relative;
  z-index: 2;
  color: var(--iq-action-signal);
  font: 700 13px/1 var(--iq-display);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-numeric-tracking);
}
body.iq-variant-techspec.home .iq-feature-rail__copy {
  position: relative;
  z-index: 2;
  display: grid;
  gap: 7px;
  align-self: end;
  padding-top: 12px;
  border-top: 1px solid var(--iq-hair);
}
body.iq-variant-techspec.home .iq-feature-rail__copy b {
  font: 700 17px/1.05 var(--iq-display);
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.home .iq-feature-rail__copy small {
  color: var(--iq-fg-muted);
  font: 600 10px/1.35 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.home .iq-feature-rail__arrow {
  position: absolute;
  z-index: 2;
  top: 14px;
  right: 16px;
  color: var(--iq-fg-muted);
  font-size: 15px;
  transition: color .2s ease;
}
body.iq-variant-techspec.home .iq-feature-rail__item:hover .iq-feature-rail__arrow {
  color: var(--iq-action-primary);
}
/* Декоративный слой — чертёжная штриховка, не цветные пятна. */
body.iq-variant-techspec.home .iq-feature-rail__visual {
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  opacity: .3;
}
body.iq-variant-techspec.home .iq-feature-rail__visual--orbit {
  background: repeating-radial-gradient(circle at 74% 34%, transparent 0 15px, rgba(110, 231, 255, .35) 15px 16px);
}
body.iq-variant-techspec.home .iq-feature-rail__visual--grid {
  background: repeating-linear-gradient(90deg, transparent 0 11px, rgba(232, 236, 240, .3) 11px 12px),
              repeating-linear-gradient(0deg, transparent 0 11px, rgba(232, 236, 240, .18) 11px 12px);
}
body.iq-variant-techspec.home .iq-feature-rail__visual--signal {
  background: repeating-linear-gradient(115deg, transparent 0 7px, rgba(184, 192, 204, .34) 7px 8px);
}
body.iq-variant-techspec.home .iq-feature-rail__visual--rings {
  background: repeating-radial-gradient(circle at 24% 78%, transparent 0 21px, rgba(184, 192, 204, .3) 21px 22px);
}

/* --------------------------------------------------------------------------
   4. КАТАЛОГ НА ГЛАВНОЙ
   Разметка отличается от архива: обложка — тег <img> от WooCommerce, а не
   CSS-фон, и на карточках НЕТ data-iq-* (их проставляет шаблон архива).
   Поэтому унаследованные из iq-visual.css надписи, собранные через attr(),
   здесь печатали бы «01 · REL · MIN» и пустую строку темпа — они гасятся.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.home .main-catalog {
  padding-top: 8px;
}
body.iq-variant-techspec.home .main-catalog__inner {
  gap: 42px;
  width: 100%;
  max-width: 1440px;
  padding: 46px var(--iq-space-5, 24px) 70px;
}
body.iq-variant-techspec.home .main-catalog__sidebar-wrapper {
  width: 216px;
  margin-right: 0;
}

/* Боковое меню — оглавление спецификации. */
body.iq-variant-techspec.home .sidebar {
  padding: 14px 16px 18px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
}
body.iq-variant-techspec.home .sidebar__link,
body.iq-variant-techspec.home .sidebar__menu > li > a {
  color: var(--iq-fg-primary);
  font: 600 11px/1.25 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.home .sidebar__link {
  border-bottom-color: var(--iq-hair);
}
body.iq-variant-techspec.home .sidebar__menu > li > ul > li a {
  border-radius: var(--iq-radius-media);
  color: var(--iq-fg-muted);
  font-size: 11px;
}
body.iq-variant-techspec.home .sidebar__menu > li > ul > li a::before {
  border-radius: 0;
  background: var(--iq-fg-muted);
}
body.iq-variant-techspec.home .sidebar__menu > li:hover > a,
body.iq-variant-techspec.home .sidebar__menu .current-menu-item a {
  color: var(--iq-action-primary);
}
body.iq-variant-techspec.home .sidebar__menu > li > ul > li a:hover,
body.iq-variant-techspec.home .sidebar__menu > li > ul > li a:focus,
body.iq-variant-techspec.home .sidebar__menu > li > ul > li.current-menu-item a {
  border-radius: var(--iq-radius-media);
  background: var(--iq-card-bg-hover);
  background-image: none;
  box-shadow: none;
  color: var(--iq-action-primary);
}

/* Заголовок секции каталога: подпись листа + крупный Unbounded. */
body.iq-variant-techspec.home .main-catalog__title {
  grid-column: 1 / -1;
  margin-bottom: 0;
  padding-bottom: 22px;
  background: var(--iq-bg-canvas);
  color: var(--iq-fg-primary);
  font: 700 clamp(26px, 3.4vw, 42px)/1 var(--iq-display);
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.home .main-catalog__title::before {
  content: 'Fig. 01 — Product plates';
  display: block;
  margin-bottom: 14px;
  padding-bottom: 11px;
  border-bottom: 1px solid var(--iq-hair);
  color: var(--iq-fg-muted);
  font: 600 10px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

/* Сетка плит: швы в 1px вместо отступов. */
body.iq-variant-techspec.home .main-catalog__list {
  counter-reset: iq-plate;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(232px, 1fr));
  gap: 1px;
  width: 100%;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-border-subtle);
  overflow: hidden;
}
body.iq-variant-techspec.home .main-catalog__list > .main-catalog__title,
body.iq-variant-techspec.home .main-catalog__list > .pagin {
  background: var(--iq-bg-canvas);
}
body.iq-variant-techspec.home .main-catalog__list > .main-catalog__title {
  padding: 20px 20px 22px;
}
body.iq-variant-techspec.home .main-catalog__list > .pagin {
  grid-column: 1 / -1;
  padding: 18px 20px;
}

/* --- плита --- */
body.iq-variant-techspec.home .catalog-item {
  width: auto;
  margin: 0;
  padding: 12px 14px 14px;
}
/* Индексная строка. Без data-iq-* остаётся только порядковый номер листа. */
body.iq-variant-techspec.home .catalog-item::before {
  content: counter(iq-plate, decimal-leading-zero) '  ·  IQ MUSIC';
}
/* Крупная цифра темпа на главной не из чего собраться: на этих карточках нет
   data-iq-bpm. Блок гасится целиком, иначе остаётся пустая строка с отступом. */
body.iq-variant-techspec.home .catalog-item::after {
  content: '';
  display: none;
}

/* Обложка: здесь это <img>, а не фон — плите нужен квадрат и своя рамка. */
body.iq-variant-techspec.home .catalog-item__image {
  order: 2;
  width: 100%;
  height: auto;
  aspect-ratio: 1 / 1;
  margin: 0;
  border: 1px solid var(--iq-hair);
  border-radius: var(--iq-radius-media);
  background-color: var(--iq-bg-canvas);
  box-shadow: none;
}
body.iq-variant-techspec.home .catalog-item:hover .catalog-item__image {
  box-shadow: none;
}
body.iq-variant-techspec.home .catalog-item__image img {
  width: 100%;
  height: 100%;
  border-radius: 0;
  box-shadow: none;
  filter: saturate(.9) contrast(1.03);
  transition: transform .35s ease, filter .35s ease;
}
body.iq-variant-techspec.home .catalog-item:hover .catalog-item__image img,
body.iq-variant-techspec.home .catalog-item:focus-within .catalog-item__image img {
  transform: scale(1.03);
  filter: saturate(1) contrast(1.06);
}

/* Метки new/top/sale — штампы направления. */
body.iq-variant-techspec .catalog-item__label-wrap {
  top: 8px;
  right: 8px;
}
body.iq-variant-techspec .catalog-item__label {
  margin-right: 0;
  padding: 3px 7px;
  border: 1px solid rgba(232, 236, 240, .28);
  border-radius: 0;
  background: rgba(11, 12, 14, .72);
  color: var(--iq-action-signal);
  font: 700 9px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
}
body.iq-variant-techspec .catalog-item__label--new {
  background: rgba(11, 12, 14, .72);
  color: var(--iq-action-primary);
  border-color: rgba(110, 231, 255, .4);
}
/* Слой действий — нижняя планка на обложке, как кнопка покупки в эталоне.
   Цена живёт только внутри него, поэтому планка обязана быть читаемой. */
body.iq-variant-techspec.home .catalog-item__actions {
  top: auto;
  bottom: 0;
  left: 0;
  right: 0;
  width: auto;
  height: auto;
  flex-direction: row;
  align-items: center;
  gap: 10px;
  padding: 9px 10px;
  border-radius: 0;
  border-top: 1px solid var(--iq-hair-strong);
  background: rgba(11, 12, 14, .9);
  transform: translateY(10px);
  opacity: 0;
  transition: opacity .2s ease, transform .2s ease;
}
body.iq-variant-techspec.home .catalog-item:hover .catalog-item__actions,
body.iq-variant-techspec.home .catalog-item:focus-within .catalog-item__actions {
  visibility: visible;
  transform: translateY(0);
  opacity: 1;
}
body.iq-variant-techspec.home .catalog-item__play {
  margin: 0;
  border-radius: var(--iq-radius-media);
}
body.iq-variant-techspec.home .catalog-item__play svg {
  fill: var(--iq-action-signal);
}
body.iq-variant-techspec.home .catalog-item__real-price,
body.iq-variant-techspec.home .catalog-item__old-price {
  width: auto;
  text-align: left;
  font-family: var(--iq-display);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-heading-tracking);
}
body.iq-variant-techspec.home .catalog-item__real-price {
  color: var(--iq-fg-primary);
  font-size: 15px;
}
body.iq-variant-techspec.home .catalog-item__old-price {
  color: var(--iq-fg-muted);
  font-size: 12px;
  text-decoration: line-through;
}
body.iq-variant-techspec.home .catalog-item__buttons-wrap {
  width: auto;
  margin: 0 0 0 auto;
  padding: 0;
  border-top: 0;
  gap: 6px;
}
body.iq-variant-techspec.home .catalog-item__like,
body.iq-variant-techspec.home .catalog-item__cart {
  border-radius: var(--iq-radius-media);
}
body.iq-variant-techspec.home .catalog-item__cart {
  padding: 3px 6px;
  background: var(--iq-action-primary);
}
body.iq-variant-techspec.home .catalog-item__cart svg {
  fill: var(--iq-bg-canvas);
}

/* Название и автор. Порядок: обложка → название → автор. */
body.iq-variant-techspec.home .catalog-item__name {
  order: 3;
  margin-top: 12px;
  padding-top: 10px;
  border-top: 1px solid var(--iq-hair);
  color: var(--iq-fg-primary);
  font: 600 14px/1.32 var(--iq-font);
  letter-spacing: var(--iq-heading-tracking);
}
/* Подпись автора: на главной здесь нет ни темпа, ни шкалы — служебные
   надписи и линейка, унаследованные от каталога, снимаются. */
body.iq-variant-techspec.home .catalog-item__description {
  order: 4;
  margin-top: 6px;
  color: var(--iq-fg-muted);
  font: 600 10px/1.4 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.home .catalog-item__description::before,
body.iq-variant-techspec.home .catalog-item__description::after {
  content: none;
  display: none;
}

/* Пагинация. */
body.iq-variant-techspec.home .pagin a,
body.iq-variant-techspec.home .pagin span {
  border-radius: var(--iq-radius-media);
  font-variant-numeric: tabular-nums;
}

/* --------------------------------------------------------------------------
   5. НОВОСТИ, УСЛОВИЯ, ПРЕИМУЩЕСТВА, FAQ, SEO-текст
   Один приём на все: служебная подпись над заголовком, хайрлайн-плиты,
   прямые углы, ноль теней.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.home .home-news__title,
body.iq-variant-techspec.home .trust__title,
body.iq-variant-techspec.home .why-us__title,
body.iq-variant-techspec.home .faq__title,
body.iq-variant-techspec.home .simple-text__title {
  color: var(--iq-fg-primary);
  font-family: var(--iq-display);
  font-weight: 700;
  font-size: clamp(24px, 2.9vw, 36px);
  line-height: 1.02;
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
  text-align: left;
}
body.iq-variant-techspec.home .home-news__title::before,
body.iq-variant-techspec.home .trust__title::before,
body.iq-variant-techspec.home .why-us__title::before,
body.iq-variant-techspec.home .faq__title::before,
body.iq-variant-techspec.home .simple-text__title::before {
  display: block;
  margin-bottom: 14px;
  padding-bottom: 11px;
  border-bottom: 1px solid var(--iq-hair);
  color: var(--iq-fg-muted);
  font: 600 10px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.home .home-news__title::before { content: 'Sec. 04 — Журнал'; }
body.iq-variant-techspec.home .trust__title::before { content: 'Sec. 05 — Условия'; }
body.iq-variant-techspec.home .why-us__title::before { content: 'Sec. 06 — Обоснование'; }
body.iq-variant-techspec.home .faq__title::before { content: 'Sec. 07 — Вопросы'; }
body.iq-variant-techspec.home .simple-text__title::before { content: 'Sec. 08 — Описание'; }
body.iq-variant-techspec.home .home-news__title b { color: var(--iq-action-primary); }

body.iq-variant-techspec.home .home-news__inner,
body.iq-variant-techspec.home .why-us__inner {
  align-items: stretch;
}
body.iq-variant-techspec.home .home-news__list {
  gap: 1px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-border-subtle);
  overflow: hidden;
}
body.iq-variant-techspec.home .news-preview {
  /* Шов в 1px съедает половину пикселя у каждой из двух колонок. */
  width: calc(50% - .5px);
  margin-bottom: 0;
  border: 0;
  border-radius: 0;
  background: var(--iq-card-bg);
  box-shadow: none;
  transition: background-color .2s ease;
}
body.iq-variant-techspec.home .news-preview:hover,
body.iq-variant-techspec.home .news-preview:focus {
  background: var(--iq-card-bg-hover);
  box-shadow: none;
}
body.iq-variant-techspec.home .news-preview__image {
  border-radius: 0;
  filter: saturate(.85) contrast(1.05);
}
body.iq-variant-techspec.home .news-preview__wrap {
  background: none;
}
body.iq-variant-techspec.home .news-preview__title {
  font: 700 16px/1.25 var(--iq-display);
  letter-spacing: var(--iq-heading-tracking);
}
body.iq-variant-techspec.home .news-preview__title::after {
  background: var(--iq-action-primary);
  height: 1px;
}
body.iq-variant-techspec.home .news-preview__text {
  color: var(--iq-fg-muted);
  font-size: 13px;
}
body.iq-variant-techspec.home .home-news .btn--contrast {
  align-self: flex-start;
  margin-top: 26px;
  border: 0;
  border-radius: var(--iq-radius-media);
  background: var(--iq-action-primary);
  color: var(--iq-bg-canvas);
  font: 700 11px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.home .home-news .btn--contrast:hover,
body.iq-variant-techspec.home .home-news .btn--contrast:focus-visible {
  background: var(--iq-fg-primary);
  color: var(--iq-bg-canvas);
}

body.iq-variant-techspec.home .trust__text,
body.iq-variant-techspec.home .why-us__item,
body.iq-variant-techspec.home .faq__item {
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
  color: var(--iq-fg-muted);
}
body.iq-variant-techspec.home .trust__text {
  font: 400 14px/1.6 var(--iq-font);
}
body.iq-variant-techspec.home .why-us__inner {
  text-align: left;
}
body.iq-variant-techspec.home .why-us__list {
  gap: 1px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-border-subtle);
  overflow: hidden;
}
body.iq-variant-techspec.home .why-us__item {
  counter-increment: iq-why;
  position: relative;
  max-width: none;
  border: 0;
  border-radius: 0;
  padding: 22px 24px 22px 58px;
  color: var(--iq-fg-primary);
  font: 400 14px/1.5 var(--iq-font);
}
/* Номер пункта вместо буллета — как позиция в спецификации. */
body.iq-variant-techspec.home .why-us__item::before {
  content: counter(iq-why, decimal-leading-zero);
  position: absolute;
  top: 22px;
  left: 22px;
  width: auto;
  height: auto;
  border-radius: 0;
  background: none;
  color: var(--iq-action-signal);
  font: 700 12px/1 var(--iq-display);
  font-variant-numeric: tabular-nums;
}
body.iq-variant-techspec.home .why-us__list {
  counter-reset: iq-why;
}

body.iq-variant-techspec.home .faq__list {
  gap: 1px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-border-subtle);
  overflow: hidden;
}
body.iq-variant-techspec.home .faq__item {
  margin-bottom: 0;
  border: 0;
  border-radius: 0;
  background: var(--iq-bg-surface);
}
body.iq-variant-techspec.home .faq__question {
  color: var(--iq-fg-primary);
  font: 600 14px/1.4 var(--iq-font);
}
body.iq-variant-techspec.home .faq__question::after {
  color: var(--iq-action-primary);
}
body.iq-variant-techspec.home .faq__answer {
  border-top: 1px solid var(--iq-hair);
  color: var(--iq-fg-muted);
  font: 400 14px/1.6 var(--iq-font);
}

body.iq-variant-techspec.home .simple-text__inner {
  align-items: stretch;
}
body.iq-variant-techspec.home .simple-text p {
  max-width: 78ch;
  color: var(--iq-fg-muted);
  font: 400 14px/1.65 var(--iq-font);
}
body.iq-variant-techspec.home .simple-text a,
body.iq-variant-techspec.home .trust__text a,
body.iq-variant-techspec.home .faq__answer a {
  color: var(--iq-action-primary);
}

/* --------------------------------------------------------------------------
   6. АДАПТИВ (контрольные ширины 1440 / 1100 / 760 / 390)
   -------------------------------------------------------------------------- */
@media (max-width: 1440px) {
  body.iq-variant-techspec.home .main-catalog__inner { padding-inline: 20px; }
  body.iq-variant-techspec.home .iq-feature-rail__item { min-height: 172px; }
}

@media (max-width: 1100px) {
  body.iq-variant-techspec.home .iq-feature-rail {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  body.iq-variant-techspec.home .main-catalog__inner {
    flex-direction: column;
    gap: 26px;
  }
  body.iq-variant-techspec.home .main-catalog__sidebar-wrapper { width: 100%; }
  body.iq-variant-techspec.home .main-catalog__list {
    grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
  }
  body.iq-variant-techspec.home .main-banner__tempo-desk {
    border-radius: var(--iq-radius-panel);
  }
}

@media (max-width: 760px) {
  body.iq-variant-techspec.home .home-main::before { inset: 6px; }
  body.iq-variant-techspec.home .main-banner--iq::after { inset: 12px; }
  body.iq-variant-techspec.home .main-banner__eyebrow { gap: 10px; }
  body.iq-variant-techspec.home .iq-feature-rail__item { min-height: 152px; gap: 18px; }
  body.iq-variant-techspec.home .main-catalog__list {
    grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
  }
  /* Наведения на тач-устройствах нет — планка с ценой всегда открыта. */
  body.iq-variant-techspec.home .catalog-item__actions {
    visibility: visible;
    transform: none;
    opacity: 1;
  }
  body.iq-variant-techspec.home .news-preview {
    width: 100%;
    flex-direction: column;
  }
  body.iq-variant-techspec.home .news-preview__image {
    width: 100%;
    min-height: 180px;
  }
  body.iq-variant-techspec.home .why-us__list {
    grid-template-columns: minmax(0, 1fr);
  }
}

@media (max-width: 430px) {
  body.iq-variant-techspec.home .iq-feature-rail {
    grid-template-columns: minmax(0, 1fr);
  }
  body.iq-variant-techspec.home .main-catalog__list {
    grid-template-columns: minmax(0, 1fr);
  }
  body.iq-variant-techspec.home .main-catalog__list > .main-catalog__title {
    padding: 16px 14px 18px;
  }
  body.iq-variant-techspec.home .catalog-item { padding: 10px 12px 12px; }
  body.iq-variant-techspec.home .main-banner__tempo-switch { width: 100%; }
  body.iq-variant-techspec.home .main-banner__tempo-button { flex: 1 1 auto; padding: 0 10px; }
}

/* Планка с ценой не должна прятаться там, где нет курсора. */
@media (hover: none) {
  body.iq-variant-techspec.home .catalog-item__actions {
    visibility: visible;
    transform: none;
    opacity: 1;
  }
}

@media (prefers-reduced-motion: reduce) {
  body.iq-variant-techspec.home .catalog-item__image img,
  body.iq-variant-techspec.home .catalog-item__actions,
  body.iq-variant-techspec.home .iq-feature-rail__item,
  body.iq-variant-techspec.home .main-banner__cta,
  body.iq-variant-techspec.home .main-banner__secondary {
    transition: none;
  }
  body.iq-variant-techspec.home .catalog-item:hover .catalog-item__image img {
    transform: none;
  }
  body.iq-variant-techspec.home .catalog-item__actions {
    visibility: visible;
    transform: none;
    opacity: 1;
  }
}

/* Кнопка «Послушать» в геро.
   ---------------------------------------------------------------------------
   Разметка уходит в обе версии — прячем по умолчанию и включаем только в
   techspec: editorial это рабочий вид сайта, он не должен поехать из-за
   строящейся версии. Форма третья по счёту в ряду и намеренно самая тихая:
   контур без заливки, чтобы не спорить с основным действием. */
.main-banner__preview {
  display: none;
}

body.iq-variant-techspec.home .main-banner__preview {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  min-height: var(--iq-control-h);
  padding: 0 18px;
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-radius-media);
  background: transparent;
  color: var(--iq-fg-primary);
  font: 700 12px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  cursor: pointer;
  transition: border-color .2s ease, color .2s ease;
}

body.iq-variant-techspec.home .main-banner__preview:hover,
body.iq-variant-techspec.home .main-banner__preview:focus-visible {
  border-color: var(--iq-action-primary);
  color: var(--iq-action-primary);
}

/* Значок отвечает за состояние: пока трек играет, треугольник меняется на паузу
   средствами плеера, а сама кнопка подсвечивается. */
body.iq-variant-techspec.home .main-banner__preview-icon {
  font-size: 10px;
  line-height: 1;
}

body.iq-variant-techspec.home .main-banner__preview.is-playing {
  border-color: var(--iq-action-primary);
  color: var(--iq-action-primary);
}

/* --- 20-product.css --- */
/* ==========================================================================
   20-product.css — страница товара в теме «Tech Spec»
   --------------------------------------------------------------------------
   Лист технической документации: рамка с угловыми реперами, служебные подписи
   моно 10px/.16em, крупный Unbounded в заголовке, данные товара поданы как
   измерения (сетка ячеек с 1px швами), прямые углы.

   ВАЖНО: каждое правило начинается с body.iq-variant-techspec. Тема editorial —
   боевой вид сайта, любая протечка ломает прод. Переменные на :root не
   объявляются: var() в объявлении кастомного свойства резолвится относительно
   элемента объявления, а темы переопределяют токены на body — производный токен
   на :root замёрзнет на базовой палитре.

   Файл грузится functions.php из assets/css/parts/ ПОСЛЕ iq-visual.css,
   поэтому веса `body.iq-variant-techspec.single-product .x` хватает, чтобы
   перебить базовые `body.single-product .x`.
   ========================================================================== */

/* --- 1. Лист: рамка чертежа вокруг карточки товара ------------------------ */
body.iq-variant-techspec.single-product .product { background: transparent; }

body.iq-variant-techspec.single-product .product__inner {
  max-width: 1320px;
  margin-inline: auto;
}

body.iq-variant-techspec.single-product .product__info-wrap {
  position: relative;
  align-items: flex-start;
  gap: clamp(20px, 3vw, 54px);
  margin-bottom: 0;
  padding: 30px 30px 34px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
  box-shadow: none;
}

/* Угловые реперы листа. Псевдоэлемент вынут из потока (position: absolute),
   иначе он стал бы flex-элементом контейнера и сдвинул колонки. */
body.iq-variant-techspec.single-product .product__info-wrap::before {
  content: '';
  position: absolute;
  inset: 8px;
  pointer-events: none;
  border: 0;
  background:
    linear-gradient(var(--iq-action-signal), var(--iq-action-signal)) 0 0 / 16px 1px no-repeat,
    linear-gradient(var(--iq-action-signal), var(--iq-action-signal)) 0 0 / 1px 16px no-repeat,
    linear-gradient(var(--iq-action-signal), var(--iq-action-signal)) 100% 100% / 16px 1px no-repeat,
    linear-gradient(var(--iq-action-signal), var(--iq-action-signal)) 100% 100% / 1px 16px no-repeat;
  opacity: .5;
}

/* Подпись листа, врезанная в верхнюю кромку рамки. */
body.iq-variant-techspec.single-product .product__info-wrap::after {
  content: 'Product spec sheet · rev 02';
  position: absolute;
  top: -7px;
  left: 22px;
  padding: 0 8px;
  background: var(--iq-bg-canvas);
  color: var(--iq-fg-muted);
  font: 600 10px/1.3 var(--iq-font);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  pointer-events: none;
}

/* --- 2. Хлебные крошки: служебная строка листа ----------------------------
   Базовая типографика крошек для techspec уже задана в iq-visual.css,
   здесь только выравнивание по ширине листа товара. */
body.iq-variant-techspec.single-product .breadcrumbs {
  max-width: 1320px;
  margin-inline: auto;
  padding: 18px 0 10px;
}
body.iq-variant-techspec.single-product .breadcrumb__list {
  align-items: center;
  gap: 0;
}

/* --- 3. Изображение товара: главное фото, чертёж только по краю ----------- */
body.iq-variant-techspec.single-product .product__info-wrap > .product__img {
  position: sticky;
  top: 20px;
  flex-shrink: 0;
  width: clamp(220px, 30vw, 360px);
  max-width: none;
  margin: 0;
  padding: 0;
  overflow: visible;
  border: 1px solid var(--iq-hair);
  border-radius: var(--iq-radius-media);
  background: var(--iq-bg-canvas);
}
body.iq-variant-techspec.single-product .product__img img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 0;
  filter: saturate(.94) contrast(1.03);
}

/* Реперные метки по углам снимка — тонкие, картинку не перекрывают. */
body.iq-variant-techspec.single-product .product__info-wrap > .product__img::before {
  content: '';
  position: absolute;
  inset: 6px;
  pointer-events: none;
  background:
    linear-gradient(var(--iq-action-signal), var(--iq-action-signal)) 0 0 / 10px 1px no-repeat,
    linear-gradient(var(--iq-action-signal), var(--iq-action-signal)) 0 0 / 1px 10px no-repeat,
    linear-gradient(var(--iq-action-signal), var(--iq-action-signal)) 100% 100% / 10px 1px no-repeat,
    linear-gradient(var(--iq-action-signal), var(--iq-action-signal)) 100% 100% / 1px 10px no-repeat;
  opacity: .55;
}
body.iq-variant-techspec.single-product .product__info-wrap > .product__img::after {
  content: 'Fig. 01 — изображение товара';
  position: absolute;
  left: 0;
  bottom: -20px;
  color: var(--iq-fg-muted);
  font: 600 10px/1.3 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  white-space: nowrap;
}

/* --- 4. Колонка данных ----------------------------------------------------- */
body.iq-variant-techspec.single-product .product__info {
  min-width: 0;
  padding: 0;
}

/* Кикер листа: служебная подпись над заголовком, слева — точка-репер 6px
   (как .head__strip .dot в стайлфрейме, нарисована фоном, не бордюром).
   Псевдоэлемент оставлен в потоке — .product__info это flex-колонка,
   и ::before встаёт первой строкой на всю ширину. */
body.iq-variant-techspec.single-product .product__info::before {
  content: 'Спецификация товара';
  display: block;
  margin: 0 0 16px;
  padding: 0 0 10px 16px;
  background: linear-gradient(var(--iq-action-primary), var(--iq-action-primary)) 0 4px / 6px 6px no-repeat;
  border-bottom: 1px solid var(--iq-hair);
  color: var(--iq-fg-muted);
  font: 600 10px/1.6 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

body.iq-variant-techspec.single-product .product__purchase-count {
  margin: 0 0 10px;
  color: var(--iq-action-signal);
  font: 600 10px/1.3 var(--iq-font);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

body.iq-variant-techspec.single-product .product__title {
  margin: 0;
  color: var(--iq-fg-primary);
  font-family: var(--iq-display);
  font-weight: 700;
  font-size: clamp(24px, 3.2vw, 42px);
  line-height: 1.04;
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}

/* --- 5. Цена ------------------------------------------------------------- */
body.iq-variant-techspec.single-product .product__actions {
  flex-wrap: wrap;
  align-items: center;
  margin: 26px 0 0;
}
body.iq-variant-techspec.single-product .product__actions-row {
  flex-wrap: wrap;
  margin-top: 0;
}
body.iq-variant-techspec.single-product .product__price {
  margin-right: 24px;
  color: var(--iq-fg-primary);
  font-family: var(--iq-display);
  font-weight: 700;
  font-size: clamp(28px, 3.6vw, 42px);
  line-height: 1;
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-heading-tracking);
  text-transform: none;
}
/* Базовая тема дописывает « Р» кириллицей — на чертеже нужен знак рубля. */
body.iq-variant-techspec.single-product .product__price::after {
  content: ' ₽';
  /* .46em при кегле 42px давало 19px — знак валюты выглядел сноской рядом с
     числом, а не его частью. Тише числа, но одного с ним порядка. */
  font-size: .6em;
  font-weight: 600;
  letter-spacing: var(--iq-numeric-tracking);
  color: var(--iq-fg-muted);
}
body.iq-variant-techspec.single-product .product__price--old {
  margin-right: 14px;
  color: var(--iq-fg-muted);
  font-size: 16px;
  text-decoration: line-through;
}
body.iq-variant-techspec.single-product .product__price--old::after { font-size: .7em; }

/* Обратный отсчёт распродажи — приборная плашка, а не рекламный баннер. */
body.iq-variant-techspec.single-product .countdown__inner {
  border-radius: var(--iq-radius-panel);
  border: 1px solid var(--iq-border-subtle);
  background: var(--iq-bg-canvas);
}
body.iq-variant-techspec.single-product .countdown__discount {
  color: var(--iq-action-primary);
  font-family: var(--iq-display);
  font-weight: 700;
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.single-product .countdown__description,
body.iq-variant-techspec.single-product .countdown__time-item {
  color: var(--iq-fg-muted);
  font: 600 10px/1.4 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.single-product .countdown__time-bg {
  border-radius: var(--iq-radius-media);
  background: var(--iq-bg-surface);
  color: var(--iq-fg-primary);
  font-variant-numeric: tabular-nums;
}

/* --- 6. Характеристики: список условий превращён в блок измерений ---------
   Базовая тема прячет его на десктопе (display: none) и рисует галочками на
   мобильном. На чертеже это главный носитель данных, поэтому он виден всегда. */
body.iq-variant-techspec.single-product .product__purchase-conditions {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  /* Seams are cell borders rather than a plate showing through a 1px gap:
     the row rarely divides evenly, and the leftover track painted the plate
     colour as a grey block next to the last measurement. */
  gap: 0;
  width: 100%;
  margin: 24px 0 0;
  padding: 0;
  list-style: none;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
  overflow: hidden;
  counter-reset: iq-spec;
}
body.iq-variant-techspec.single-product .product__purchase-conditions::before {
  content: 'Параметры поставки';
  grid-column: 1 / -1;
  padding: 11px 14px;
  background: var(--iq-bg-canvas);
  color: var(--iq-fg-muted);
  font: 600 10px/1.3 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.single-product .product__purchase-conditions li {
  counter-increment: iq-spec;
  margin: 0;
  padding: 13px 14px 14px;
  border-right: 1px solid var(--iq-border-subtle);
  background: var(--iq-bg-surface);
  color: var(--iq-fg-primary);
  font: 500 13px/1.45 var(--iq-font);
}
/* У цифрового товара измерений три, а дорожек на широком экране четыре, и
   правая граница последнего пункта висела чертой посреди пустого места —
   ячейка читалась как незаполненная. Границы между пунктами хватает. */
body.iq-variant-techspec.single-product .product__purchase-conditions li:last-child {
  border-right: 0;
}
/* Галочка базовой темы заменена на порядковый номер измерения. */
body.iq-variant-techspec.single-product .product__purchase-conditions li::before {
  content: counter(iq-spec, decimal-leading-zero);
  position: static;
  display: block;
  margin-bottom: 6px;
  color: var(--iq-action-signal);
  font: 600 10px/1 var(--iq-font);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-label-tracking);
}

/* --- 7. Покупка ----------------------------------------------------------- */
body.iq-variant-techspec.single-product .counter {
  width: 100%;
  margin: 22px 0 0;
}
body.iq-variant-techspec.single-product .product__form {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
}
body.iq-variant-techspec.single-product .product__form .quantity .qty {
  min-height: 46px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-input);
  background: var(--iq-input-bg);
  color: var(--iq-fg-primary);
  font-family: var(--iq-font);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  text-align: center;
}
body.iq-variant-techspec.single-product .product__size-label {
  color: var(--iq-fg-muted);
  font: 600 10px/1.3 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.single-product .product__size-select {
  min-height: 46px;
  padding: 0 12px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-input);
  background: var(--iq-input-bg);
  color: var(--iq-fg-primary);
  font-family: var(--iq-font);
  font-weight: 600;
}

/* Оформление кнопок целиком в 06-controls.css. Здесь раньше лежал его дубликат,
   написанный до появления компонента: он задавал заливку, кегль и высоту 46px,
   но не центрировал текст по вертикали и не оставлял места под значок, который
   базовая тема кладёт абсолютно у правого края. Отсюда наезд значка на подпись
   и обрезанное «Добавить в» вместо «Добавить в избранное».

   Роли читаются из разметки: у корзины btn--contrast, у избранного и
   «вернуться к покупкам» — контур. Здесь остаётся только то, чего компонент
   знать не может: цвет значка и перебивание стилей плагина избранного. */
/* iq-visual.css ставит этим кнопкам пилюлю (`border-radius: 999px`) и ширину
   214px правилом, общему для обоих вариантов и более весомому, чем компонент.
   Editorial на пилюлях и построен, поэтому правило не трогаем — возвращаем
   форму токеном только здесь. Ширину отпускаем: подпись бывает разной длины. */
body.iq-variant-techspec.single-product .product__actions > .btn,
body.iq-variant-techspec.single-product .product__form .simplefavorite-button,
body.iq-variant-techspec.single-product .product__form .btn--light-violet {
  border-radius: var(--iq-btn-radius);
  min-width: 0;
}

body.iq-variant-techspec.single-product .product__add-to-cart svg { fill: var(--iq-button-primary-fg); }
body.iq-variant-techspec.single-product .product__actions .simplefavorite-button {
  border-color: var(--iq-hair-strong) !important;
  color: var(--iq-fg-primary) !important;
}
body.iq-variant-techspec.single-product .product__actions .simplefavorite-button:hover,
body.iq-variant-techspec.single-product .product__actions .simplefavorite-button:focus-visible {
  border-color: var(--iq-action-primary) !important;
  color: var(--iq-action-primary) !important;
}
body.iq-variant-techspec.single-product .product__actions .simplefavorite-button svg { fill: currentColor; }

/* --- 8. Аудио-сэмплы: строки протокола, а не карточки --------------------- */
body.iq-variant-techspec.single-product .product__list:not(:empty) {
  margin: 34px 0 0;
  padding: 0;
}
body.iq-variant-techspec.single-product .player-controls {
  margin: 0 0 14px;
  padding: 10px 12px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-canvas);
}
body.iq-variant-techspec.single-product .player-controls .player__btn,
body.iq-variant-techspec.single-product .player__btn {
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-media);
  background: transparent;
  color: var(--iq-fg-primary);
}
body.iq-variant-techspec.single-product .player-controls .player__btn:hover,
body.iq-variant-techspec.single-product .player__btn:hover,
body.iq-variant-techspec.single-product .player__btn:focus-visible {
  border-color: var(--iq-action-primary);
  color: var(--iq-action-primary);
}

body.iq-variant-techspec.single-product .player {
  border: 0;
  border-bottom: 1px solid var(--iq-hair);
  border-radius: 0;
  background: transparent;
  color: var(--iq-fg-primary);
  transition: background .18s ease;
}
body.iq-variant-techspec.single-product .player:hover { background: var(--iq-card-bg-hover); }
body.iq-variant-techspec.single-product .player__cover img {
  border-radius: var(--iq-radius-media);
  border: 1px solid var(--iq-hair);
}
body.iq-variant-techspec.single-product .player__singer {
  color: var(--iq-fg-muted);
  font: 600 10px/1.4 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.single-product .player__song {
  color: var(--iq-fg-primary);
  font: 600 14px/1.35 var(--iq-font);
  letter-spacing: var(--iq-heading-tracking);
}
body.iq-variant-techspec.single-product .player__progress {
  border-radius: 0;
  background: var(--iq-hair-strong);
}
body.iq-variant-techspec.single-product .player__progress::-webkit-progress-bar {
  border-radius: 0;
  background: var(--iq-hair-strong);
}
body.iq-variant-techspec.single-product .player__progress::-webkit-progress-value {
  border-radius: 0;
  background: var(--iq-action-primary);
}
body.iq-variant-techspec.single-product .player__progress::-moz-progress-bar {
  border-radius: 0;
  background: var(--iq-action-primary);
}
body.iq-variant-techspec.single-product .player__progress-separator { background: var(--iq-action-primary); }
body.iq-variant-techspec.single-product .player__current,
body.iq-variant-techspec.single-product .player__total {
  color: var(--iq-fg-muted);
  font-family: var(--iq-font);
  font-size: 11px;
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-label-tracking);
}

/* Видео-сэмпл (товары с превью-роликом) */
body.iq-variant-techspec.single-product .product__video-preview {
  border: 1px solid var(--iq-hair);
  border-radius: var(--iq-radius-media);
}

/* --- 9. Описание: текстовый блок спецификации ----------------------------- */
body.iq-variant-techspec.single-product .product__description {
  margin: 30px 0 0;
  padding: 0;
}
body.iq-variant-techspec.single-product .product__description::before {
  content: 'Описание';
  display: block;
  margin: 0 0 14px;
  padding: 0 0 9px;
  border-bottom: 1px solid var(--iq-hair);
  color: var(--iq-fg-muted);
  font: 600 10px/1.3 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.single-product .product__description-content,
body.iq-variant-techspec.single-product .product__description-content p,
body.iq-variant-techspec.single-product .product__description-content div,
body.iq-variant-techspec.single-product .product__description-content span,
body.iq-variant-techspec.single-product .product__description-content li {
  color: var(--iq-fg-muted) !important;
  font-family: var(--iq-font);
  font-size: 14px;
  line-height: 1.62;
}
body.iq-variant-techspec.single-product .product__description-content strong,
body.iq-variant-techspec.single-product .product__description-content b {
  color: var(--iq-fg-primary) !important;
  font-weight: 700;
}
body.iq-variant-techspec.single-product .product__description-content a {
  color: var(--iq-action-primary) !important;
  text-decoration: none;
  border-bottom: 1px solid rgba(110, 231, 255, .35);
}
body.iq-variant-techspec.single-product .product__description-content a:hover,
body.iq-variant-techspec.single-product .product__description-content a:focus-visible {
  border-bottom-color: var(--iq-action-primary);
}
body.iq-variant-techspec.single-product .product__description-content hr {
  height: 1px;
  margin: 18px 0;
  border: 0;
  background: var(--iq-hair);
}
body.iq-variant-techspec.single-product .product__description-content ul { padding-left: 18px; }
body.iq-variant-techspec.single-product .product__description-content li { margin: 0 0 6px; }

/* --- 10. Отзывы: отдельный лист приложения -------------------------------- */
body.iq-variant-techspec.single-product .product__reviews {
  max-width: 1320px;
  margin: 30px auto 0;
}
body.iq-variant-techspec.single-product .product__reviews-inner {
  padding: 26px 28px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
  box-shadow: none;
}
body.iq-variant-techspec.single-product .product__reviews .woocommerce-Reviews-title,
body.iq-variant-techspec.single-product .product__reviews #reply-title {
  color: var(--iq-fg-primary);
  font-family: var(--iq-display);
  font-weight: 700;
  font-size: clamp(18px, 2vw, 26px);
  line-height: 1.1;
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.single-product .product__reviews .woocommerce-noreviews {
  color: var(--iq-fg-muted);
  font: 500 13px/1.5 var(--iq-font);
}
body.iq-variant-techspec.single-product .product__reviews .woocommerce-verification-required {
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-media);
  background: transparent;
  color: var(--iq-action-signal);
  font: 600 10px/1.5 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.single-product .product__reviews .comment_container {
  border: 1px solid var(--iq-hair);
  border-radius: var(--iq-radius-media);
  background: var(--iq-bg-canvas);
}
body.iq-variant-techspec.single-product .product__reviews .comment-form-comment textarea,
body.iq-variant-techspec.single-product .product__reviews .comment-form input:not([type='submit']) {
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-input);
  background: var(--iq-input-bg);
  color: var(--iq-fg-primary);
  font-family: var(--iq-font);
}
body.iq-variant-techspec.single-product .product__reviews .comment-form input[type='submit'] {
  border: 0;
  border-radius: var(--iq-radius-media);
  background: var(--iq-action-primary);
  color: var(--iq-button-primary-fg);
  font-family: var(--iq-font);
  font-weight: 700;
  font-size: 12px;
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

/* --- 11. SEO-блок под товаром: служебная полоса листа --------------------- */
body.iq-variant-techspec.single-product .simple-text {
  min-height: 0;
  padding: 0;
  background: var(--iq-bg-canvas);
}
body.iq-variant-techspec.single-product .simple-text__inner {
  max-width: 1320px;
  margin: 26px auto 0;
  padding: 22px 24px 24px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
  color: var(--iq-fg-muted);
  font-family: var(--iq-font);
  font-size: 13px;
  line-height: 1.6;
}
body.iq-variant-techspec.single-product .simple-text__title {
  margin: 0 0 12px;
  color: var(--iq-fg-primary);
  font-family: var(--iq-display);
  font-weight: 700;
  font-size: clamp(16px, 1.8vw, 22px);
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.single-product .simple-text a { color: var(--iq-action-primary); }

/* --- 12. Похожие товары ---------------------------------------------------
   Шаблон single-product.php этой темы блок не выводит. Правила оставлены на
   случай, если WooCommerce вернёт стандартную секцию: плиты те же, что в
   каталоге, — 1px швы и прямые углы. */
body.iq-variant-techspec.single-product .related.products,
body.iq-variant-techspec.single-product .upsells.products {
  max-width: 1320px;
  margin: 30px auto 0;
}
body.iq-variant-techspec.single-product .related.products > h2,
body.iq-variant-techspec.single-product .upsells.products > h2 {
  margin: 0 0 14px;
  padding: 0 0 10px;
  border-bottom: 1px solid var(--iq-hair);
  color: var(--iq-fg-muted);
  font: 600 10px/1.3 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.single-product .related.products .catalog-item,
body.iq-variant-techspec.single-product .upsells.products .catalog-item {
  border-radius: 0;
  box-shadow: none;
}

/* --- 13. Адаптив ---------------------------------------------------------- */
@media (max-width: 1024px) {
  body.iq-variant-techspec.single-product .product__info-wrap { padding: 24px 22px 28px; }
  body.iq-variant-techspec.single-product .product__info-wrap > .product__img { width: clamp(180px, 28vw, 280px); }
}

@media (max-width: 767px) {
  body.iq-variant-techspec.single-product .product__info-wrap {
    padding: 20px 16px 24px;
  }
  body.iq-variant-techspec.single-product .product__info-wrap::after {
    left: 14px;
    font-size: 9px;
    letter-spacing: var(--iq-label-tracking);
  }
  /* Снимок в колонке скрыт базовой темой, дублёр живёт в описании. */
  body.iq-variant-techspec.single-product .product__img--mobile {
    display: block;
    margin: 0 0 16px;
    border: 1px solid var(--iq-hair);
    border-radius: var(--iq-radius-media);
  }
  body.iq-variant-techspec.single-product .product__price--mobile { display: block; margin: 0 0 14px; }
  body.iq-variant-techspec.single-product .product__purchase-conditions {
    grid-template-columns: 1fr;
  }
  body.iq-variant-techspec.single-product .product__form { gap: 8px; }
  body.iq-variant-techspec.single-product .product__add-to-cart,
  body.iq-variant-techspec.single-product .product__actions > .btn:not(.product__add-to-cart) {
    flex: 1 1 100%;
    justify-content: center;
  }
  body.iq-variant-techspec.single-product .product__reviews-inner { padding: 20px 16px; }
  body.iq-variant-techspec.single-product .simple-text__inner { padding: 18px 16px 20px; }
}

@media (max-width: 480px) {
  body.iq-variant-techspec.single-product .product__title { font-size: 22px; line-height: 1.1; }
  body.iq-variant-techspec.single-product .product__price { font-size: 26px; }
}

/* --- 14. Reduced motion --------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  body.iq-variant-techspec.single-product .product__add-to-cart,
  body.iq-variant-techspec.single-product .player { transition: none; }
  body.iq-variant-techspec.single-product .product__info-wrap > .product__img { position: static; }
}

/* --- 25-catalog.css --- */
/* Tech Spec — каталог на узких экранах.

   Каталог был доведён на 1440 и там держится, а на 390 разъезжался: карточка
   складывалась поверх обложки, быстрые направления накладывались друг на друга,
   между блоками стояли серые полосы. Каждый из трёх дефектов — оттого, что
   editorial получил мобильные правила отдельным блоком, а techspec нет. */

/* Пагинация — полноширинный ряд. Общее правило спана целит в `.pagin`, а
   WooCommerce отдаёт `ul.page-numbers`, поэтому она занимала одну колонку из
   трёх, а две пустые дорожки плита красила серым. Тот же дефект плиты, пятый
   раз: незаполненный ряд всегда виден. */
body.iq-variant-techspec.post-type-archive-product .main-catalog__list > ul.page-numbers,
body.iq-variant-techspec.tax-product_cat .main-catalog__list > ul.page-numbers {
  grid-column: 1 / -1;
  /* Внешний отступ в клетке сетки фона не несёт, поэтому его 34px тоже
     красились плитой — узкой серой полосой над номерами страниц. Отступ
     переезжает в поля: они внутри элемента и закрашены им. */
  margin: 0;
  padding-top: 50px;
}

@media (max-width: 760px) {
  /* Шов между карточками рисуется плитой, просвечивающей сквозь зазор 1px.
     На одной колонке эта плита не рисует ничего, зато красит серым любой ряд,
     который контент не заполнил, — заголовок с внешним отступом, полосу
     фильтров, пагинацию. Тот же дефект, что четырежды до этого; на мобильном
     он лечится в корне — шов становится бордюром карточки. */
  body.iq-variant-techspec.post-type-archive-product .main-catalog__list,
  body.iq-variant-techspec.tax-product_cat .main-catalog__list {
    gap: 0;
    border: 0;
    background: transparent;
    overflow: visible;
  }
  body.iq-variant-techspec.post-type-archive-product .main-catalog__list > .catalog-item,
  body.iq-variant-techspec.tax-product_cat .main-catalog__list > .catalog-item {
    border-top: var(--iq-seam);
  }
  /* Заголовок листа больше не обязан нести собственный фон: под ним нет плиты. */
  body.iq-variant-techspec.post-type-archive-product .main-catalog__list > .main-catalog__title,
  body.iq-variant-techspec.tax-product_cat .main-catalog__list > .main-catalog__title {
    background: none;
    border-bottom: var(--iq-seam);
    padding-bottom: 18px;
  }

  /* Быстрые направления. Базовая тема кладёт подпись, название и стрелку в один
     флексовый ряд — на 390 подпись наезжает на название, а название уезжает за
     край карточки. Editorial чинит это сеткой; techspec повторяет её структуру
     своими токенами. */
  body.iq-variant-techspec .main-catalog__quick-group {
    display: grid;
    gap: var(--iq-gap-2);
  }
  body.iq-variant-techspec .main-catalog__quick-group-label {
    display: block;
    font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
    letter-spacing: var(--iq-label-tracking);
    text-transform: uppercase;
    color: var(--iq-fg-muted);
  }
  body.iq-variant-techspec .main-catalog__quick-category {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    grid-template-rows: auto auto;
    align-content: center;
    column-gap: var(--iq-gap-3);
    padding: var(--iq-panel-pad-tight);
  }
  body.iq-variant-techspec .main-catalog__quick-category-kicker {
    grid-column: 1;
    min-width: 0;
    color: var(--iq-fg-muted);
    font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
    letter-spacing: var(--iq-label-tracking);
    text-transform: uppercase;
  }
  body.iq-variant-techspec .main-catalog__quick-category-title {
    grid-column: 1;
    min-width: 0;
  }
  body.iq-variant-techspec .main-catalog__quick-category-arrow {
    grid-column: 2;
    grid-row: 1 / span 2;
    align-self: center;
  }
}

@media (max-width: 520px) {
  /* «КАТАЛОГ ТОВАРОВ» в Unbounded 700 шире 332px даже на нижней ступени clamp —
     слово рвалось посреди себя. Заголовок листа должен читаться целиком.

     Карточка при этом остаётся вертикальной. Editorial на узком экране кладёт
     её горизонтально, обложка слева; у techspec карточка построена иначе —
     номер, обложка с ценой поверх, отбивка, подписи, — и переверстать её в две
     колонки значит сломать замысел ради чужого. */
  body.iq-variant-techspec.post-type-archive-product .main-catalog__list > .main-catalog__title,
  body.iq-variant-techspec.tax-product_cat .main-catalog__list > .main-catalog__title {
    font-size: clamp(20px, 5.6vw, 26px);
  }
}

/* --------------------------------------------------------------------------
   Вводный текст категории (04.08.2026)
   Ставится между заголовком и сеткой товаров. Ширина ограничена по мере
   чтения, а не по ширине сетки: строка в 120 символов на широком экране
   не читается, сколько бы места ни было.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec .main-catalog__intro {
  max-width: 70ch;
  margin: 14px 0 26px;
  color: var(--iq-fg-muted);
  font-size: 15px;
  line-height: 1.6;
}

body.iq-variant-techspec .main-catalog__intro p { margin: 0 0 10px; }
body.iq-variant-techspec .main-catalog__intro p:last-child { margin-bottom: 0; }

body.iq-variant-techspec .main-catalog__intro ul {
  margin: 10px 0;
  padding-left: 18px;
  list-style: disc;
}

body.iq-variant-techspec .main-catalog__intro strong { color: var(--iq-fg-primary); }

/* --- 26-gauges.css --- */
/* Приборы карточки каталога: шкала темпа и дуга длительности.
   =========================================================================
   До этого файла темп и длительность были числами. Линейка темпа под ними
   уже рисовалась (iq-visual.css, .catalog-item__description::after), но без
   подписей: метка стояла где-то на голой полоске и ничего не сообщала.
   Длительность вообще пряталась в служебной строке «04 · REL 67081 · 61 MIN».

   Здесь появляются две вещи, обе — разметкой из woocommerce/archive-product.php:
   1. подписи 88 / 120 / 148 с крупными засечками, чтобы метка читалась как
      значение на шкале;
   2. дуга длительности — кольцо, закрашенное на долю от 90 минут.

   Только techspec. В editorial карточка другая, и блок там не рисуется. */

/* Разметка приборов уходит в обе версии страницы, а стили — только в techspec.
   В editorial блок без стилей печатался строкой «88120148 61 мин» под именем
   автора. Класс собственный, не темы, поэтому display здесь безопасен: он ничего
   чужого не перебивает. */
.catalog-item__gauges { display: none; }

/* Служебная строка больше не печатает длительность: она ушла в дугу, а строка
   дублировала её мелким шрифтом. Правило повторяет исходное из iq-visual.css
   без хвоста ' · NN MIN' и перебивает его как более поздний файл. */
body.iq-variant-techspec .catalog-item::before {
  content: counter(iq-plate, decimal-leading-zero) '  ·  REL ' attr(data-iq-release);
}

/* Карточки без темпа (абонементы, сборники «different bpm») печатали на месте
   числа длинное тире. В display-начертании 700 на 38 px оно выглядело белым
   бруском — читалось как дефект вёрстки, а не как «значения нет». Приглушённое
   тире осталось серым бруском, поэтому знака нет вовсе: про отсутствие темпа
   уже сказано подписью «Темп не задан» прямо под ним. */
body.iq-variant-techspec .catalog-item[data-iq-bpm='0']::after {
  content: '';
  margin: 0;
}

/* order 4 — тот же, что у .catalog-item__description. Внутри одного порядка
   flex сохраняет порядок разметки, поэтому блок встаёт сразу за линейкой. */
body.iq-variant-techspec .catalog-item__gauges {
  order: 4;
  display: block;
  margin-top: 2px;
}

/* --- шкала темпа ---------------------------------------------------------
   Подписи расставлены абсолютно, а не через space-between: 120 лежит на
   (120 − 88) / (148 − 88) = 53.333 % шкалы, а не в её середине, и flex
   поставил бы подпись мимо собственной засечки. */
body.iq-variant-techspec .catalog-item__scale {
  position: relative;
  display: block;
  height: 18px;
  color: var(--iq-fg-muted);
  font: 600 9px/1 var(--iq-font);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-label-tracking);
}

/* Крупные засечки на границах и на отметке 120 — верхние 5 px строки, вплотную
   к мелким делениям линейки, которая заканчивается ровно над этим блоком. */
body.iq-variant-techspec .catalog-item__scale::before {
  content: '';
  position: absolute;
  top: 0;
  right: 0;
  left: 0;
  height: 5px;
  background:
    linear-gradient(var(--iq-fg-muted), var(--iq-fg-muted)) 0 0 / 1px 5px no-repeat,
    linear-gradient(var(--iq-fg-muted), var(--iq-fg-muted)) 53.333% 0 / 1px 5px no-repeat,
    linear-gradient(var(--iq-fg-muted), var(--iq-fg-muted)) 100% 0 / 1px 5px no-repeat;
}

body.iq-variant-techspec .catalog-item__scale i {
  position: absolute;
  top: 9px;
  font-style: normal;
}
body.iq-variant-techspec .catalog-item__scale i:nth-child(1) { left: 0; }
body.iq-variant-techspec .catalog-item__scale i:nth-child(2) {
  left: 53.333%;
  transform: translateX(-50%);
}
body.iq-variant-techspec .catalog-item__scale i:nth-child(3) { right: 0; }

/* --- дуга длительности ---------------------------------------------------
   Кольцо, а не полоска: рядом уже есть линейка темпа, и вторая горизонталь
   читалась бы как её продолжение. --iq-dial задаётся в разметке долей от 90
   минут; отсчёт от −90deg, чтобы дуга начиналась сверху. */
body.iq-variant-techspec .catalog-item__dial {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 11px;
  color: var(--iq-fg-muted);
  font: 600 10px/1 var(--iq-font);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec .catalog-item__dial b {
  display: block;
  flex: 0 0 20px;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: conic-gradient(
    from -90deg,
    var(--iq-action-primary) calc(var(--iq-dial, 0) * 360deg),
    var(--iq-hair-strong) 0
  );
  /* Кольцо, а не диск: серединка вырезается маской, чтобы дуга читалась как
     прибор, а не как заливка. */
  -webkit-mask: radial-gradient(closest-side, transparent 68%, currentColor 69%);
  mask: radial-gradient(closest-side, transparent 68%, currentColor 69%);
}
body.iq-variant-techspec .catalog-item__dial em { font-style: normal; }

/* На узких экранах карточка выравнивает содержимое по центру, и блок получает
   ширину по своему тексту («ИЮЛЬ 2026»). Линейка темпа — фон этого же блока,
   поэтому она сжималась примерно до 220 px, а подписи 120 и 148 сходились
   вплотную. Приборам нужна вся ширина карточки. */
@media (max-width: 760px) {
  body.iq-variant-techspec .catalog-item__description,
  body.iq-variant-techspec .catalog-item__gauges {
    align-self: stretch;
  }

  /* Подписи блока стояли по центру только потому, что он был шириной по
     тексту. Растянув его, центрирование нужно вернуть явно — иначе «BPM ·
     ТЕМП» уезжает влево, а всё вокруг остаётся по центру. */
  body.iq-variant-techspec .catalog-item__description {
    text-align: center;
  }

  body.iq-variant-techspec .catalog-item__dial {
    justify-content: center;
  }
}

/* --- 27-player.css --- */
/* Плеер превью каталога — версия techspec.
   =========================================================================
   Кнопка ▶ на карточке была живой только на странице IQ Music: сам плеер
   выводился под условием `$is_iq_music`, а обработчик в
   assets/js/iq-catalog-experience.js выходит первой же строкой, если плеера на
   странице нет. В общем каталоге десять карточек показывали кнопку, которая
   ничего не делала. Условие вывода теперь — наличие превью
   (woocommerce/archive-product.php), и плеер приезжает на любой архив.

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

   `display` не задаётся ни в одном правиле: базовая тема прячет плеер через
   `[hidden]`, и общее правило на класс перебило бы её. */

body.iq-variant-techspec .iq-sticky-player {
  right: var(--iq-gap-4);
  bottom: var(--iq-gap-4);
  gap: var(--iq-gap-3);
  padding: var(--iq-panel-pad-tight);
  border: var(--iq-panel-border);
  border-radius: var(--iq-panel-radius);
  background: var(--iq-panel-bg);
  box-shadow: none;
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
}

/* Метка «LIVE PREVIEW» приходит пилюлей из iq-visual.css. */
body.iq-variant-techspec .iq-motion-player {
  border-color: var(--iq-hair-strong);
  box-shadow: none;
}
body.iq-variant-techspec .iq-motion-player::before {
  border: 1px solid var(--iq-hair-strong);
  border-radius: 0;
  letter-spacing: var(--iq-label-tracking);
}

/* Столбики уровня — засечки прибора, а не капсулы. */
body.iq-variant-techspec .iq-sticky-player__pulse {
  border: var(--iq-panel-border);
  border-radius: 0;
  background: transparent;
}
body.iq-variant-techspec .iq-sticky-player__pulse i {
  border-radius: 0;
  background: var(--iq-action-primary);
}

body.iq-variant-techspec .iq-sticky-player__eyebrow {
  color: var(--iq-fg-muted);
  font: var(--iq-label-weight) 9px/1 var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec .iq-sticky-player__track strong {
  color: var(--iq-fg-primary);
  font: 600 12px/1.25 var(--iq-font);
}

/* Все кнопки — одна геометрия и цель в 44px: круглая лаймовая пуговица рядом
   с квадратными контролами каталога читалась как элемент другого сайта. */
body.iq-variant-techspec .iq-sticky-player__toggle,
body.iq-variant-techspec .iq-sticky-player__nav,
body.iq-variant-techspec .iq-sticky-player__close {
  width: var(--iq-control-h);
  height: var(--iq-control-h);
  border-radius: var(--iq-btn-radius);
}
/* Prev/next — тот же контур, что у close, но без крестика: второстепенное
   действие, не должно спорить взглядом с play/pause. Дизейблится, когда в
   плейлисте меньше двух треков (один трек на направление на главной). */
body.iq-variant-techspec .iq-sticky-player__nav {
  border: var(--iq-btn-border-width) solid var(--iq-hair-strong);
  color: var(--iq-fg-muted);
  font-size: 16px;
}
body.iq-variant-techspec .iq-sticky-player__nav:hover:not(:disabled) {
  border-color: var(--iq-action-primary);
  color: var(--iq-fg-primary);
}
body.iq-variant-techspec .iq-sticky-player__nav:disabled {
  opacity: .32;
  cursor: default;
}
body.iq-variant-techspec .iq-sticky-player__toggle {
  background: var(--iq-action-primary);
  color: var(--iq-button-primary-fg);
  font-size: 13px;
}
body.iq-variant-techspec .iq-sticky-player__close {
  border: var(--iq-btn-border-width) solid var(--iq-hair-strong);
  color: var(--iq-fg-muted);
  font-size: 18px;
}
body.iq-variant-techspec .iq-sticky-player__close:hover {
  border-color: var(--iq-action-primary);
  color: var(--iq-fg-primary);
}

/* Кнопка промокода живёт в том же нижнем правом углу (right/bottom 18px) и
   пряталась под плеером. Пока плеер открыт, она поднимается над ним.
   Обе версии страницы, а не только techspec: перекрытие есть и в editorial. */
body:has(.iq-sticky-player:not([hidden])) .open-promo-popup-btn {
  bottom: 112px;
}

/* --- 28-hero-object.css --- */
/* Место для объёмного объекта в геро главной.
   =========================================================================
   Сцена встаёт поверх нарисованной орбиты — в тот же контейнер
   `.main-banner__tempo-orbit`, у которого уже есть `position: relative` и
   `aspect-ratio`, то есть готовая рамка нужной формы.

   Класс `is-iq-hero-object` вешает на контейнер сама сцена, и только после того, как
   она поднялась. Поэтому SVG-орбита и хромовая волна гаснут не «на всякий
   случай», а ровно тогда, когда есть чем их заменить: без WebGL, на узком
   экране, при экономии трафика или при `prefers-reduced-motion` бандл сцены
   даже не загружается, и в шапке остаётся ровно то, что было. */

/* Квадрат по ширине контейнера, по центру, а не `inset: 0`. Контейнер орбиты
   выше самого баннера (797px против 670px) и вылезает за него сверху и снизу:
   растянутая по нему сцена обрезалась бы краем секции. Квадрат 622×622 в
   центре укладывается в видимую часть целиком. */
body.iq-variant-techspec .main-banner__tempo-orbit .iq-hero-object-canvas {
  position: absolute;
  top: 50%;
  left: 50%;
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 1 / 1;
  transform: translate(-50%, -50%);
  /* Курсор ведёт ленту, но не должен перехватывать клики по шапке. */
  pointer-events: none;
}

/* Контейнер слушает курсор сам — событие приходит на него, а не на canvas. */
body.iq-variant-techspec .main-banner__tempo-orbit.is-iq-hero-object {
  pointer-events: auto;
}

/* Рисованная орбита уходит мягко: сцена появляется не мгновенно, и резкая
   подмена читалась бы как ошибка загрузки. */
body.iq-variant-techspec .main-banner__tempo-orbit svg,
body.iq-variant-techspec .main-banner__chrome-wave {
  transition: opacity var(--iq-dur-in) var(--iq-ease);
}
body.iq-variant-techspec .main-banner__tempo-orbit.is-iq-hero-object svg,
body.iq-variant-techspec .main-banner__tempo-orbit.is-iq-hero-object .main-banner__chrome-wave {
  opacity: 0;
}

/* Объект — украшение. Если человек попросил меньше движения, а сцена уже стоит
   на странице, она снимается скриптом; это правило страхует тот кадр, пока
   скрипт до неё не дошёл. */
@media (prefers-reduced-motion: reduce) {
  body.iq-variant-techspec .main-banner__tempo-orbit .iq-hero-object-canvas { display: none; }
  body.iq-variant-techspec .main-banner__tempo-orbit.is-iq-hero-object svg,
  body.iq-variant-techspec .main-banner__tempo-orbit.is-iq-hero-object .main-banner__chrome-wave {
    opacity: 1;
  }
}

/* --- 29-seals.css --- */
/* Печати статуса и обмерная рамка карточки.

   Печати нарисованы 500×500 и держатся на тонком штрихе и мелких делениях.
   В метке каталога такой значок живёт 14–16 пикселей, где деления исчезают
   физически, — поэтому печать здесь работает ИКОНКОЙ рядом со словом, а не
   вместо него. Слово остаётся: его читает скринридер и индексирует поиск,
   и именно на нём держится смысл метки. Крупно, во весь рисунок, печати
   выводятся ниже — в личном кабинете, где под них есть 72 пикселя.

   Рамка сканирования вешается на `::before` обложки: `::after` там уже занят
   подсветкой в iq-visual.css. */

body.iq-variant-techspec .catalog-item__label {
  display: inline-flex;
  align-items: center;
  gap: 4px;
}

body.iq-variant-techspec .catalog-item__label::before {
  content: "";
  width: 18px;
  height: 18px;
  flex: none;
  background: center / contain no-repeat;
  opacity: .9;
}

body.iq-variant-techspec .catalog-item__label--new::before {
  background-image: url(https://iqfitness.ru/wp-content/themes/flagstudio/assets/css/parts/../../img/seals/seal-new.svg);
}

body.iq-variant-techspec .catalog-item__label--verified::before {
  background-image: url(https://iqfitness.ru/wp-content/themes/flagstudio/assets/css/parts/../../img/seals/seal-verified.svg);
}

body.iq-variant-techspec .catalog-item__label--sale::before {
  background-image: url(https://iqfitness.ru/wp-content/themes/flagstudio/assets/css/parts/../../img/seals/seal-limited.svg);
}

/* Обмерная рамка поверх обложки товара. Появляется по наведению и фокусу —
   постоянная рамка спорила бы с самой фотографией. Кликам не мешает. */
body.iq-variant-techspec .catalog-item__image {
  position: relative;
}

body.iq-variant-techspec .catalog-item__image::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 2;
  pointer-events: none;
  background: center / 100% 100% no-repeat url(https://iqfitness.ru/wp-content/themes/flagstudio/assets/css/parts/../../img/covers/product-scan-overlay.svg);
  opacity: 0;
  transition: opacity .18s ease-out;
}

@media (hover: hover) {
  body.iq-variant-techspec .catalog-item:hover .catalog-item__image::before {
    opacity: .7;
  }
}

body.iq-variant-techspec .catalog-item:focus-within .catalog-item__image::before {
  opacity: .7;
}

@media (prefers-reduced-motion: reduce) {
  body.iq-variant-techspec .catalog-item__image::before {
    transition: none;
  }
}

/* Крупные печати — там, где на них есть место: подтверждение оплаты,
   доступ к файлу, активация подписки. */
body.iq-variant-techspec .iq-seal {
  display: block;
  width: 72px;
  height: 72px;
  background: center / contain no-repeat;
}

body.iq-variant-techspec .iq-seal--payment { background-image: url(https://iqfitness.ru/wp-content/themes/flagstudio/assets/css/parts/../../img/seals/seal-payment.svg); }
body.iq-variant-techspec .iq-seal--file    { background-image: url(https://iqfitness.ru/wp-content/themes/flagstudio/assets/css/parts/../../img/seals/seal-file.svg); }
body.iq-variant-techspec .iq-seal--access  { background-image: url(https://iqfitness.ru/wp-content/themes/flagstudio/assets/css/parts/../../img/seals/seal-access.svg); }

/* Пустые состояния: файлы комплекта 600×600, у прежних было 400×400,
   поэтому размер задаём стилем, а не полагаемся на атрибуты. */
body.iq-variant-techspec .iq-empty-icon,
body.iq-variant-techspec .personal__orders-empty-icon {
  max-width: 220px;
  height: auto;
}

/* --- 30-shell-fixes.css --- */
/* ==========================================================================
   TECH SPEC — shell fixes. Cleanup pass for old-theme remnants left visible
   in the graphite/chertyozh variant. Every rule is scoped to
   body.iq-variant-techspec so the editorial default is untouched.
   Loaded after iq-visual.css (assets/css/parts/*.css is enqueued last), so
   equal-specificity rules here win without needing !important, except where
   noted below.
   ========================================================================== */

/* --- 1. Sidebar "IQ Music" row: old palette pink (#e5c4ff) + colourful note
   icon leak into the catalog filter sidebar and the mobile catalog menu.
   iq-visual.css only recolours this item inside the header dropdown
   (.main-nav__column-submenu), not here — so the base plugin/theme pink
   background and sprite icon still show through in techspec. Neutralise the
   row background and desaturate the icon instead of fighting the sprite. --- */
body.iq-variant-techspec .main-catalog__sidebar-wrapper .sidebar__menu > li.menu-music,
body.iq-variant-techspec .mobile-menu__catalog li.menu-music {
  background: transparent;
}
body.iq-variant-techspec .main-catalog__sidebar-wrapper .sidebar__menu > li.menu-music::before,
body.iq-variant-techspec .mobile-menu__catalog li.menu-music::before,
body.iq-variant-techspec .main-catalog__sidebar-wrapper .sidebar__menu > li.menu-music > a::before,
body.iq-variant-techspec .mobile-menu__catalog li.menu-music > a::before {
  filter: grayscale(1) brightness(1.6) opacity(.8);
}

/* --- 2. Purple radial glow behind the catalog content. iq-visual.css paints
   this on every theme's <main> (body.post-type-archive-product main /
   body.tax-product_cat main, unscoped to a variant) — on the graphite sheet
   it reads as a stray colour cast that has no place in the drafting look.
   Flatten back to the plain canvas token for techspec only. --- */
body.iq-variant-techspec.post-type-archive-product main,
body.iq-variant-techspec.tax-product_cat main {
  background: var(--iq-bg-canvas);
}

/* --- 3. Mobile catalog filters (.main-catalog__sidebar-wrapper /
   .js-catalog-filters, toggled by .js-catalog-filters-toggle): checked at
   760px and 390px against the generic (non-editorial, non-techspec) rules in
   iq-visual.css lines ~713-729 and style.min.css — those already key every
   dimension off var(--iq-radius-media)/var(--iq-card-border), which techspec
   redefines in its own token block, so the collapse/expand layout inherits
   correctly with no editorial-only breakpoint required. No fix needed here;
   left as a documented false alarm rather than a silent no-op. --- */

/* --- 4. Promo popup modal (.popup__window--promo and its form): iq-visual.css
   only themes this for body.iq-variant-editorial — techspec has zero
   coverage, so opening the popup on the techspec variant falls back to the
   plugin/base rounded, off-palette card. Bring it into the drafting system
   with square corners and the techspec tokens. --- */
body.iq-variant-techspec .popup {
  background: rgba(3, 4, 5, .84);
  backdrop-filter: blur(10px);
}
body.iq-variant-techspec .popup__window--promo {
  width: min(760px, calc(100% - 32px));
  height: auto;
  max-height: calc(100% - 40px);
  padding: 54px 64px 64px;
  overflow-y: auto;
  border: 1px solid var(--iq-hair-strong);
  border-radius: 0;
  /* style.min.css sets the indigo gradient with !important, so nothing short
     of !important removes it. Same reason as the search field below. */
  background: var(--iq-bg-surface) !important;
  box-shadow: 0 30px 90px rgba(0, 0, 0, .55);
}
body.iq-variant-techspec .popup__window--promo::before {
  content: 'IQ FITNESS / SPEC SHEET';
  display: block;
  margin-bottom: 34px;
  color: var(--iq-action-primary);
  font: 700 10px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
}
body.iq-variant-techspec .popup__close { color: var(--iq-fg-primary); }
body.iq-variant-techspec .popup__close svg { fill: currentColor; }
body.iq-variant-techspec .popup__title,
body.iq-variant-techspec .popup__subtitle,
body.iq-variant-techspec .popup-form__input-title { color: var(--iq-fg-primary); }
body.iq-variant-techspec .popup__title {
  font: 700 clamp(30px, 4vw, 52px)/.98 var(--iq-display);
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec .popup__subtitle {
  max-width: 560px;
  margin: 18px auto 0;
  font: 400 15px/1.35 var(--iq-font);
}
body.iq-variant-techspec .popup-form__input-title {
  margin-top: 54px;
  font: 600 11px/1.2 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  text-align: left;
}
body.iq-variant-techspec .popup-form__input {
  height: 52px;
  padding: 0 16px;
  border: 1px solid var(--iq-hair-strong);
  border-radius: 0;
  background: var(--iq-input-bg);
  color: var(--iq-fg-primary);
  font: 400 16px/1 var(--iq-font);
}
body.iq-variant-techspec .popup-form__input:focus {
  border-color: var(--iq-action-primary);
  outline: 1px solid var(--iq-action-primary);
  outline-offset: 2px;
}
body.iq-variant-techspec .popup-form__submit {
  width: 100%;
  height: 54px;
  margin-top: 28px;
  border: 1px solid var(--iq-action-primary);
  border-radius: 0;
  background: var(--iq-action-primary);
  color: var(--iq-bg-canvas);
  font: 700 12px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec .popup-form__submit:hover,
body.iq-variant-techspec .popup-form__submit:focus-visible {
  background: var(--iq-bg-canvas);
  color: var(--iq-action-primary);
  outline: 2px solid var(--iq-action-primary);
  outline-offset: 2px;
}
body.iq-variant-techspec .popup .checkbox,
body.iq-variant-techspec .popup .checkbox__text { color: var(--iq-fg-muted); }

@media (max-width: 601px) {
  body.iq-variant-techspec .popup__window--promo { padding: 42px 20px 28px; }
  body.iq-variant-techspec .popup__title { font-size: 28px; }
  body.iq-variant-techspec .popup__subtitle { font-size: 14px; }
  body.iq-variant-techspec .popup-form__input-title { margin-top: 34px; }
}

/* --- 5/6. Header search field (Ajax Search Lite, .help-block__search-wrap):
   iq-visual.css only gives this an underline and readable text colour for
   body.iq-variant-editorial, inside the same min-width:992px block that
   promotes .help-block into a persistent desktop bar. Without a techspec
   equivalent the input has no visible affordance (fully transparent probox,
   default black-on-transparent text) and no focus state. The plugin's own
   inline styles (.probox svg fill, .asl_m/.probox background) ship with
   !important, so matching overrides need it too — documented, not decorative. */
@media (min-width: 992px) {
  body.iq-variant-techspec .help-block__search-wrap .probox {
    height: 30px !important;
    border-bottom: 1px solid var(--iq-hair-strong) !important;
  }
  body.iq-variant-techspec .help-block__search-wrap .proinput input {
    height: 30px !important;
    color: var(--iq-fg-primary) !important;
    font-size: 12px !important;
  }
  body.iq-variant-techspec .help-block__search-wrap .proinput input::placeholder {
    color: var(--iq-fg-muted) !important;
  }
}
body.iq-variant-techspec .help-block__search-wrap:focus-within .probox {
  border-bottom-color: var(--iq-action-primary) !important;
  box-shadow: 0 1px 0 var(--iq-action-primary);
}
body.iq-variant-techspec .help-block__search-wrap .promagnifier .innericon svg,
body.iq-variant-techspec .help-block__search-wrap .prosettings .innericon svg {
  fill: var(--iq-fg-muted);
}
body.iq-variant-techspec .help-block__search-wrap:focus-within .promagnifier .innericon svg {
  fill: var(--iq-action-primary);
}

/* --- 6. Results dropdown (.asl_r) intentionally left untouched: it keeps the
   plugin's default white card with dark blue links, same as editorial. That
   panel floats over the page rather than sitting on the graphite canvas, so
   parity with editorial (which also does not restyle it) keeps its own
   internal contrast correct instead of putting light techspec text on a
   white background. Catalog-item, sidebar and pagination hover/focus states
   already have their own techspec-scoped rules in iq-visual.css; no gap
   found there beyond what is fixed above. */

/* --- 7. Нижняя строка подвала переносится.

   Ряд стоял без переноса, а techspec набирает правовые ссылки капителью с
   разрядкой — они шире, чем в editorial, и вылезали за правый край на 241px:
   главная, каталог, новости, 404 (поймано `npm run fingerprint`).

   Лечится переносом, а не подрезкой на body: `overflow-x: clip` спрятал бы
   ссылки вместо того, чтобы их показать, и заодно ослепил бы саму пробу. */
body.iq-variant-techspec .footer__bottom {
  flex-wrap: wrap;
  gap: var(--iq-gap-3) var(--iq-gap-5);
}

/* --- 8. Cookie-баннер.

   editorial получил компактную карточку в углу, techspec — нет, поэтому на
   каждой странице внизу лежала чёрная полоса во всю ширину из базовой темы,
   перекрывавшая контент. Та же карточка, набранная чертёжными токенами. */
body.iq-variant-techspec .personal-warning {
  left: 18px;
  right: auto;
  bottom: 18px;
  width: min(520px, calc(100vw - 36px));
  padding: var(--iq-panel-pad-tight);
  border: var(--iq-panel-border);
  border-radius: var(--iq-panel-radius);
  background: color-mix(in srgb, var(--iq-bg-surface) 94%, transparent);
  box-shadow: 0 18px 44px rgba(0, 0, 0, .45);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
}
body.iq-variant-techspec .personal-warning__inner {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--iq-gap-4);
  width: 100%;
  padding: 0;
}
body.iq-variant-techspec .personal-warning__text {
  min-width: 0;
  padding: 0;
  color: var(--iq-fg-muted);
  font: 400 12px/1.45 var(--iq-font);
}
body.iq-variant-techspec .personal-warning__link {
  border-bottom-color: var(--iq-hair-strong);
  color: var(--iq-fg-primary);
}
body.iq-variant-techspec .personal-warning__link:hover,
body.iq-variant-techspec .personal-warning__link:focus-visible {
  border-bottom-color: var(--iq-action-primary);
  color: var(--iq-action-primary);
}
/* Согласие — не основное действие страницы, поэтому контур, а не заливка. */
body.iq-variant-techspec .personal-warning__btn {
  min-width: 72px;
  min-height: var(--iq-control-h);
  margin: 0;
  padding: 0 18px;
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-field-radius);
  background: transparent;
  color: var(--iq-fg-primary);
  font: var(--iq-label-weight) var(--iq-label-size)/1 var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec .personal-warning__btn:hover,
body.iq-variant-techspec .personal-warning__btn:focus-visible {
  border-color: var(--iq-action-primary);
  color: var(--iq-action-primary);
}

@media (max-width: 601px) {
  body.iq-variant-techspec .personal-warning {
    left: 12px;
    right: 12px;
    bottom: 12px;
    width: auto;
  }
}

/* --- 9. Земля страницы.

   `body` в базовой теме белый; тёмным сайт делают фоны секций. Там, где секции
   не хватает — зазор между концом контента и подвалом, — просвечивает белая
   полоса во всю ширину. То же самое воспроизводится в editorial, то есть это
   боевой дефект, а не последствие варианта; здесь он закрыт только для
   techspec, чтобы не менять боевой вид без отдельного решения. */
body.iq-variant-techspec {
  background-color: var(--iq-bg-canvas);
}

/* --- 10. Текущий раздел в шапке.

   Правила под `.current-menu-item` в теме были, но красить им было нечего:
   WordPress ставит этот класс только пунктам, привязанным к записи, а верхнее
   меню собрано из произвольных ссылок. Пометка теперь идёт атрибутом
   `aria-current="page"` (см. iq_mark_current_menu_link в functions.php), и она
   работает и для глаза, и для скринридера.

   Отличие — цветом и подчерком сразу: одного цвета мало, если человек не
   различает акцент. */
body.iq-variant-techspec .main-nav > li > a[aria-current='page'],
body.iq-variant-techspec .main-nav > li > a[aria-current='page']:hover {
  color: var(--iq-action-primary);
}
body.iq-variant-techspec .main-nav > li > a[aria-current='page']::after {
  transform: scaleX(1);
  transform-origin: left;
  background: var(--iq-action-primary);
}

/* --- 31-nav-consistency.css --- */
/* ==========================================================================
   NAV CONSISTENCY — каталожное меню в сайдбаре и в подвале.

   Три дефекта, найденные на живом сайте 03.08.2026:

   1. Значок есть только у «IQ Music». Разметка резервирует место под иконку
      у ВСЕХ пунктов (a::before со спрайтом, padding-left: 30px), но ширина
      псевдоэлемента задана лишь для .menu-music — у остальных 0px. Отсюда
      «у IQ Music значок есть, у IQ Library нет» при одинаковом отступе.
      Спрайт старой темы цветной и в чертёжный вид не ложится, поэтому
      иконки заданы масками: цвет берётся из currentColor и меняется вместе
      с текстом при наведении, перекрыть подсветкой её нельзя.

   2. Линия под пунктом сайдбара — это border-bottom на самой ссылке, а
      ссылка inline-block, то есть шириной по тексту. Линии получались
      разной длины (85–132 px) и обрывались посреди колонки.

   3. Подвальный каталог свёрстан жёсткой сеткой из двух колонок по 110 px.
      Разделы с 9 и 11 подпунктами и разделы без подпунктов сыпались в неё
      подряд, заголовок раздела ничем не отличался от своих же пунктов —
      получалась сплошная стена слов с провалом пустоты справа.

   Пункты меню адресуются по ID (меню «Каталог», theme_location=catalog):
   64238 HOT IRON · 57883 Новинки · 67 IQ Music · 54308 Оборудование ·
   49945 Одежда · 49954 IQ Library. Меню редактируется в админке — при
   пересоздании пункта ID сменится и иконка пропадёт, текст при этом
   остаётся читаемым.
   ========================================================================== */

/* --- 1. Линия под пунктом — во всю ширину колонки, а не по ширине слова --- */
.main-catalog__sidebar-wrapper .sidebar__menu > li > a {
  display: block;
}

/* --- 2. Иконки разделов -------------------------------------------------- */
.main-catalog__sidebar-wrapper .sidebar__menu > li > a::before,
.footer-nav__column-submenu > li > a::before {
  width: 14px;
  height: 14px;
  background-color: currentColor;
  background-image: none;
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-position: center;
          mask-position: center;
  -webkit-mask-size: contain;
          mask-size: contain;
  opacity: .65;
  transition: opacity .2s ease;
}

.main-catalog__sidebar-wrapper .sidebar__menu > li > a:hover::before,
.footer-nav__column-submenu > li > a:hover::before {
  opacity: 1;
}

/* HOT IRON — штанга */
.sidebar__menu > li.menu-item-64238 > a::before,
.footer-nav__column-submenu > li.menu-item-64238 > a::before {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M3 9v6M7 6v12M17 6v12M21 9v6M7 12h10'/%3E%3C/svg%3E");
          mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M3 9v6M7 6v12M17 6v12M21 9v6M7 12h10'/%3E%3C/svg%3E");
}

/* Новинки — вспышка */
.sidebar__menu > li.menu-item-57883 > a::before,
.footer-nav__column-submenu > li.menu-item-57883 > a::before {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M12 3v18M3 12h18M5.6 5.6l12.8 12.8M18.4 5.6 5.6 18.4'/%3E%3C/svg%3E");
          mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M12 3v18M3 12h18M5.6 5.6l12.8 12.8M18.4 5.6 5.6 18.4'/%3E%3C/svg%3E");
}

/* IQ Music — нота */
.sidebar__menu > li.menu-item-67 > a::before,
.footer-nav__column-submenu > li.menu-item-67 > a::before {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M9 18V4l11-2v14'/%3E%3Ccircle cx='6' cy='18' r='3'/%3E%3Ccircle cx='17' cy='16' r='3'/%3E%3C/svg%3E");
          mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M9 18V4l11-2v14'/%3E%3Ccircle cx='6' cy='18' r='3'/%3E%3Ccircle cx='17' cy='16' r='3'/%3E%3C/svg%3E");
}

/* Оборудование — гиря */
.sidebar__menu > li.menu-item-54308 > a::before,
.footer-nav__column-submenu > li.menu-item-54308 > a::before {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linejoin='round'%3E%3Cpath d='M9 7a3 3 0 0 1 6 0'/%3E%3Cpath d='M7 8h10l2 13H5z'/%3E%3C/svg%3E");
          mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linejoin='round'%3E%3Cpath d='M9 7a3 3 0 0 1 6 0'/%3E%3Cpath d='M7 8h10l2 13H5z'/%3E%3C/svg%3E");
}

/* Одежда — футболка */
.sidebar__menu > li.menu-item-49945 > a::before,
.footer-nav__column-submenu > li.menu-item-49945 > a::before {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linejoin='round'%3E%3Cpath d='m8 3-5 3 2.5 4L8 8.5V21h8V8.5L18.5 10 21 6l-5-3-2 2h-4z'/%3E%3C/svg%3E");
          mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linejoin='round'%3E%3Cpath d='m8 3-5 3 2.5 4L8 8.5V21h8V8.5L18.5 10 21 6l-5-3-2 2h-4z'/%3E%3C/svg%3E");
}

/* IQ Library — разворот книги */
.sidebar__menu > li.menu-item-49954 > a::before,
.footer-nav__column-submenu > li.menu-item-49954 > a::before {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linejoin='round'%3E%3Cpath d='M12 6.5C10.5 5 8.2 4.2 3 4.5v14c5.2-.3 7.5.5 9 2 1.5-1.5 3.8-2.3 9-2v-14c-5.2-.3-7.5.5-9 2z'/%3E%3Cpath d='M12 6.5V20.5'/%3E%3C/svg%3E");
          mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linejoin='round'%3E%3Cpath d='M12 6.5C10.5 5 8.2 4.2 3 4.5v14c5.2-.3 7.5.5 9 2 1.5-1.5 3.8-2.3 9-2v-14c-5.2-.3-7.5.5-9 2z'/%3E%3Cpath d='M12 6.5V20.5'/%3E%3C/svg%3E");
}

/* Старая розовая заливка строки IQ Music из style.min.css: под иконку-маску
   она больше не нужна и в тёмной теме читается как случайное пятно. */
.sidebar__menu > li.menu-music,
.footer-nav__column-submenu > li.menu-music {
  background: transparent;
}

/* --- 3. Подвальный каталог: разделы как отдельные группы -----------------
   Колонка каталога в сетке подвала была уже своих же названий: две колонки
   по 110 px при словах «Миофасциальные роллы и мячики» и «Функциональный
   тренинг». Текст вылезал за колонку и налезал на вертикальный разделитель —
   отсюда «линия делит слова пополам». Отдаём каталогу долю ширины по факту
   содержимого, за счёт промо-блока IQ Music, которому столько не нужно. */
/* Только для широкого экрана. Файл грузится ПОСЛЕ iq-visual.css, поэтому
   безусловное правило перебило бы её мобильные медиазапросы (там подвал
   схлопывается в одну колонку на 760 px) — и на телефоне четыре колонки
   уезжали бы за экран горизонтальным скроллом. Проверено на 390 px. */
@media (min-width: 1101px) {
  body.iq-variant-editorial .footer__content,
  body.iq-variant-techspec .footer__content {
    grid-template-columns:
      minmax(180px, .8fr)
      minmax(190px, .95fr)
      minmax(330px, 1.7fr)
      minmax(150px, .7fr);
  }
}

/* Потоковые колонки, а не сетка: разделы разной высоты (11 подпунктов против
   нуля) в сетке выравниваются по строкам и оставляют провал пустоты в полколонки.
   Многоколоночный поток укладывает их подряд и сам выравнивает высоту. */
body.iq-variant-editorial .footer-nav__column-submenu,
body.iq-variant-techspec .footer-nav__column-submenu {
  display: block;
  columns: 2;
  column-gap: 24px;
}

/* На телефоне две колонки по ~160 px рвут длинные названия разделов. */
@media (max-width: 560px) {
  body.iq-variant-editorial .footer-nav__column-submenu,
  body.iq-variant-techspec .footer-nav__column-submenu {
    columns: 1;
  }
}

.footer-nav__column-submenu > li {
  break-inside: avoid;
  display: block;
  margin-bottom: 26px;
}

.footer-nav__column-submenu > li:last-child {
  margin-bottom: 0;
}

/* Заголовок раздела: светлее и с воздухом под ним, чтобы отделиться от
   собственных подпунктов. Иконке нужно место — отступ такой же, как в
   сайдбаре. */
.footer-nav__column-submenu > li > a {
  position: relative;
  display: block;
  padding-left: 22px;
  color: #e8ecf0;
  letter-spacing: .08em;
}

.footer-nav__column-submenu > li > a::before {
  content: "";
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(-50%);
}

.footer-nav__column-submenu > li > ul {
  margin-top: 10px;
  padding-left: 22px;
  display: grid;
  gap: 7px;
}

.footer-nav__column-submenu > li > ul a {
  color: #7d8794;
  font-weight: 400;
  letter-spacing: .04em;
  transition: color .2s ease;
}

.footer-nav__column-submenu > li > ul a:hover {
  color: #e8ecf0;
}

/* Разделы без подпунктов не должны занимать целую ячейку сетки наравне с
   разделом из одиннадцати ссылок — сажаем их в общий ряд. */
@media (min-width: 1024px) {
  .footer-nav__column-submenu {
    grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
  }
}

/* --- 32-news-cards.css --- */
/* ==========================================================================
   NEWS CARDS — обложки в ленте новостей.

   Карточка в ленте выстроена колонкой (обложка сверху, текст под ней), а
   ширина обложки осталась от старой горизонтальной карточки: width: 50%,
   height: 300px (style.min.css). В колонке это давало картинку в половину
   ширины карточки с жёсткой обрезкой по краям — «внутри картинки обрезаны».
   Отдаём обложке всю ширину карточки и фиксируем пропорцию вместо высоты,
   чтобы кадрирование было предсказуемым на любой ширине колонки.
   ========================================================================== */

body.post-type-archive-news .news-preview__image,
body.single-news .news-preview__image {
  width: 100%;
  height: auto;
  min-height: 0;
  aspect-ratio: 16 / 10;
  border-radius: 0;
  /* Плашка под обложку: у части новостей миниатюры нет, и пустой блок
     читался как дыра в вёрстке, а не как карточка без картинки. */
  background-color: var(--iq-bg-surface-raised);
}

@media (max-width: 760px) {
  body.post-type-archive-news .news-preview__image,
  body.single-news .news-preview__image {
    aspect-ratio: 3 / 2;
  }
}

/* --- 33-product-description.css --- */
/* ==========================================================================
   PRODUCT DESCRIPTION — воздух между абзацами.

   Описание товара выводится через wpautop, но у <p> внутри карточки нулевые
   отступы, и три абзаца читались как один сплошной текст в семь строк.
   ========================================================================== */

.product__description-content p {
  margin: 0 0 1em;
  max-width: 68ch; /* длинная строка на широком экране теряет место возврата глаза */
}

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

.product__description-content ul,
.product__description-content ol {
  margin: 0 0 1em;
  padding-left: 1.2em;
}

.product__description-content li {
  margin-bottom: .35em;
}

/* --- 34-footer-band.css --- */
/* ==========================================================================
   FOOTER BAND — блок «IQ Music» полосой во всю ширину подвала.

   Баннер (assets/img/brand/iq-music-band.png, 1600×500) нарисован так, что
   эмблема стоит справа, а левая половина оставлена пустой под живой текст.
   В колонке шириной 246 px он бы не работал вовсе, поэтому блок вынесен в
   отдельный первый ряд сетки подвала, а остальные три колонки встают под ним.

   Эмблема — единственное цветное пятно в подвале, поэтому всё остальное
   оформление блока намеренно сдержанное: без рамок и подложек.
   ========================================================================== */

@media (min-width: 1101px) {
  body.iq-variant-editorial .footer__content,
  body.iq-variant-techspec .footer__content {
    /* Три колонки для второго ряда: бренд, каталог, личные разделы. */
    grid-template-columns:
      minmax(200px, .9fr)
      minmax(340px, 1.85fr)
      minmax(160px, .75fr);
  }

  body.iq-variant-editorial .footer__library,
  body.iq-variant-techspec .footer__library {
    grid-column: 1 / -1;
    grid-row: 1;
    position: relative;
    min-height: 260px;
    padding: 38px 42px;
    display: flex;
    flex-direction: column;
    justify-content: center;
    /* Две строки подряд намеренно: браузер, который не понимает image-set,
       отбрасывает второе объявление и остаётся на PNG. 474 КБ → 25 КБ (AVIF).
       Баннер грузится на каждой странице, поэтому экономия здесь идёт не
       одной главной, а всему сайту. 04.08.2026 */
    background-image: url("https://iqfitness.ru/wp-content/themes/flagstudio/assets/css/parts/../../img/brand/iq-music-band.png");
    background-image: image-set(
      url("https://iqfitness.ru/wp-content/themes/flagstudio/assets/css/parts/../../img/brand/iq-music-band.avif") type("image/avif"),
      url("https://iqfitness.ru/wp-content/themes/flagstudio/assets/css/parts/../../img/brand/iq-music-band.webp") type("image/webp"),
      url("https://iqfitness.ru/wp-content/themes/flagstudio/assets/css/parts/../../img/brand/iq-music-band.png") type("image/png")
    );
    background-repeat: no-repeat;
    background-position: right center;
    background-size: auto 100%;
    background-color: #000;
    border: 1px solid var(--iq-hair-strong, rgba(232, 236, 240, .12));
  }

  /* Текст держим в левой половине — там, где картинка пустая. */
  body.iq-variant-editorial .footer__library > *,
  body.iq-variant-techspec .footer__library > * {
    position: relative;
    max-width: 46%;
  }
}

/* На узком экране эмблема уходит фоном за текст: полоса 3.2:1 при ширине
   360 px даёт высоту 112 px, в которую сам блок не помещается. */
@media (max-width: 1100px) {
  body.iq-variant-editorial .footer__library,
  body.iq-variant-techspec .footer__library {
    position: relative;
    padding: 26px 24px;
    background-image: url("https://iqfitness.ru/wp-content/themes/flagstudio/assets/css/parts/../../img/brand/iq-music-band.png");
    background-image: image-set(
      url("https://iqfitness.ru/wp-content/themes/flagstudio/assets/css/parts/../../img/brand/iq-music-band.avif") type("image/avif"),
      url("https://iqfitness.ru/wp-content/themes/flagstudio/assets/css/parts/../../img/brand/iq-music-band.webp") type("image/webp"),
      url("https://iqfitness.ru/wp-content/themes/flagstudio/assets/css/parts/../../img/brand/iq-music-band.png") type("image/png")
    );
    background-repeat: no-repeat;
    /* Мельче высоты блока: при 100% эмблема доезжает до середины и заголовок
       ложится прямо на хромированные рёбра. При 220% она вовсе обрезалась до
       неузнаваемого фрагмента и читалась как случайная текстура. */
    background-position: right -8px center;
    background-size: auto 72%;
    background-color: #000;
    border: 1px solid var(--iq-hair-strong, rgba(232, 236, 240, .12));
  }

  body.iq-variant-editorial .footer__library::after,
  body.iq-variant-techspec .footer__library::after {
    /* Затемнение, чтобы текст читался поверх эмблемы. */
    content: "";
    position: absolute;
    inset: 0;
    background: linear-gradient(90deg, #000 46%, rgba(0, 0, 0, .45) 82%, rgba(0, 0, 0, 0) 100%);
  }

  body.iq-variant-editorial .footer__library > *,
  body.iq-variant-techspec .footer__library > * {
    position: relative;
    z-index: 1;
  }
}

/* --- 40-motion.css --- */
/* Motion layer support styles — techspec variant only.

   Everything here is scoped to body.iq-variant-techspec so the editorial
   variant, which is the production look of the site, is untouched. The JS that
   drives these lives in src/motion/ and is bundled into assets/dist/iq-motion.js.

   Nothing in this file animates on its own: it only creates the surfaces and
   the resting states that the motion layer manipulates. If the bundle fails to
   load, every selector below degrades to the plain layout. */

/* ---------------------------------------------------------------- hero field */

/* .iq-motion-surface (iq-visual.css) gives the whole page main another
   isolation:isolate with no z-index of its own — it wraps .main-banner, so
   the section's own z-index:13 below is trapped a level too deep and the
   fixed "Горячая линия" pill (z-index:12) still wins at the body level.
   Lift this outer context too, same value, so both actually clear it. */
body.iq-variant-techspec .iq-motion-surface {
  z-index: 13;
}

/* The banner becomes the positioning context for the WebGL canvas. The class
   is added by JS only after a WebGL2 context was actually acquired, so on
   machines without it nothing about the banner changes. */
body.iq-variant-techspec .main-banner.iq-hero-has-canvas {
  position: relative;
  isolation: isolate;
  /* isolation:isolate traps every z-index inside this stacking context —
     needs to exceed the fixed "Горячая линия" pill's z-index:12 (see
     iq-visual.css), otherwise that pill sits on top of the whole hero
     regardless of z-index set on children like .main-banner__preview. */
  z-index: 13;
  background-color: var(--iq-bg-canvas);
}

body.iq-variant-techspec .main-banner .iq-hero-canvas {
  position: absolute;
  inset: 0;
  z-index: 0;
  display: block;
  width: 100%;
  height: 100%;
  border-radius: inherit;
  pointer-events: none;
  /* The field is a backdrop, not a subject: it must never fight the headline. */
  opacity: .82;
}

/* Everything the banner already drew stays on top of the field. */
body.iq-variant-techspec .main-banner.iq-hero-has-canvas > *:not(.iq-hero-canvas) {
  position: relative;
  z-index: 1;
}

/* --------------------------------------------------------- tempo ruler draw */

/* The ruler is data (plotted by plotTempoPositions, which runs even under
   reduced motion). This only masks it while the card is arriving; the default
   of 1 means "fully drawn", so a card the motion layer never touched looks
   exactly as it did before. */
body.iq-variant-techspec .catalog-item[data-iq-bpm-plotted] .catalog-item__description::after {
  clip-path: inset(0 calc((1 - var(--iq-bpm-draw, 1)) * 100%) 0 0);
}

/* ------------------------------------------------------------ typed heading */

body.iq-variant-techspec .main-catalog__title.iq-typed .iq-type-char {
  display: inline-block;
  white-space: pre;
  will-change: transform, opacity;
}

/* -------------------------------------------------------- magnetic buy button */

body.iq-variant-techspec .catalog-item__buy,
body.iq-variant-techspec .catalog-item__cart {
  will-change: transform;
}

body.iq-variant-techspec .catalog-item__buy.is-magnetic,
body.iq-variant-techspec .catalog-item__cart.is-magnetic {
  /* A hint that the pull is intentional rather than a rendering glitch. */
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--iq-action-primary) 55%, transparent);
}

/* ------------------------------------------------------------ reduced motion */

@media (prefers-reduced-motion: reduce) {
  body.iq-variant-techspec .main-catalog__title.iq-typed .iq-type-char {
    will-change: auto;
  }
  body.iq-variant-techspec .catalog-item[data-iq-bpm-plotted] .catalog-item__description::after {
    clip-path: none;
  }
  body.iq-variant-techspec .catalog-item__buy,
  body.iq-variant-techspec .catalog-item__cart {
    will-change: auto;
    transform: none !important;
  }
}

/* ==========================================================================
   Pass 2 — shell and purchase micro-interactions.

   Same contract as everything above: every selector starts with
   body.iq-variant-techspec, every animated property is transform or opacity,
   and every surface degrades to the plain layout if the bundle never runs.

   The one rule that cannot live here is @view-transition: it has no selector,
   so it cannot be scoped to a body class. It is injected from JS instead
   (src/motion/view-transitions.js) and only into documents that already pass
   the techspec / utility-page / reduced-motion guards, so an editorial
   document never receives it.
   ========================================================================== */

/* ------------------------------------------------------- 1. sticky header */

/* The class is added by JS only after the header was measured and a spacer of
   the SAME height was put in its place, so taking the header out of the flow
   costs no layout shift. */
body.iq-variant-techspec.iq-header-sticky .header {
  position: fixed;
  top: 0;
  right: 0;
  left: 0;
  z-index: 80;
  /* The paint moves to the band below, which is what scales. */
  background: transparent;
  border-bottom-color: transparent;
}

/* Админ-панель WordPress висит fixed с z-index 99999 и перекрывает
   прилипшую шапку: обычный отступ html{margin-top:32px} двигает только
   поток, а fixed-шапка садится на самый верх окна — вместе с полем поиска. */
body.admin-bar.iq-variant-techspec.iq-header-sticky .header {
  top: 32px;
}

@media screen and (max-width: 782px) {
  body.admin-bar.iq-variant-techspec.iq-header-sticky .header {
    top: 46px;
  }
}

body.iq-variant-techspec .iq-header-band {
  display: none;
}

body.iq-variant-techspec.iq-header-sticky .iq-header-band {
  display: block;
  position: absolute;
  inset: 0;
  z-index: 0;
  transform-origin: top center;
  background: var(--iq-bg-canvas);
  border-bottom: 1px solid var(--iq-hair-strong);
  pointer-events: none;
  will-change: transform;
}

/* Everything the header already drew stays above the band. */
body.iq-variant-techspec.iq-header-sticky .header > *:not(.iq-header-band) {
  position: relative;
  z-index: 1;
}

body.iq-variant-techspec.iq-header-sticky .header__inner {
  will-change: transform;
}

body.iq-variant-techspec.iq-header-sticky .header__logo {
  transform-origin: left center;
  will-change: transform;
}

/* Reserves the height the header used to occupy. Set once in px by JS and
   never animated — this is the element that keeps the page from jumping. */
body.iq-variant-techspec .iq-header-spacer {
  display: none;
}

body.iq-variant-techspec.iq-header-sticky .iq-header-spacer {
  display: block;
  flex: none;
  pointer-events: none;
}

/* -------------------------------------------------- 2. reading progress rail */

body.iq-variant-techspec .iq-read-progress {
  position: fixed;
  top: 0;
  right: 0;
  left: 0;
  z-index: 120;
  height: 2px;
  opacity: 0;
  transition: opacity 180ms ease-out;
  pointer-events: none;
}

body.iq-variant-techspec .iq-read-progress.is-active {
  opacity: 1;
}

body.iq-variant-techspec .iq-read-progress__fill {
  display: block;
  width: 100%;
  height: 100%;
  transform: scaleX(0);
  transform-origin: left center;
  background: var(--iq-action-primary);
  will-change: transform;
}

/* ----------------------------------------------------- 3. sticky buy dock */

body.iq-variant-techspec .iq-buy-dock {
  display: none;
}

@media (max-width: 900px) {
  body.iq-variant-techspec .iq-buy-dock {
    display: flex;
    align-items: center;
    gap: 12px;
    position: fixed;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 110;
    padding: 10px 16px;
    /* The bar sits on the home-indicator edge, so the safe area is padding,
       not margin: the background must still reach the physical edge. */
    padding-bottom: calc(10px + env(safe-area-inset-bottom, 0px));
    background: var(--iq-bg-surface);
    border-top: 1px solid var(--iq-hair-strong);
    transform: translate3d(0, 100%, 0);
    opacity: 0;
    /* Leaving is faster than arriving: the dock gets out of the way the moment
       the real button is back on screen. */
    transition: transform 160ms cubic-bezier(.4, 0, 1, 1), opacity 120ms linear;
    will-change: transform;
  }

  body.iq-variant-techspec .iq-buy-dock.is-visible {
    transform: translate3d(0, 0, 0);
    opacity: 1;
    transition: transform 260ms cubic-bezier(.22, 1, .36, 1), opacity 200ms ease-out;
  }

  body.iq-variant-techspec .iq-buy-dock__price {
    flex: 0 0 auto;
    font-weight: 700;
    white-space: nowrap;
  }

  body.iq-variant-techspec .iq-buy-dock__button {
    flex: 1 1 auto;
    min-height: 48px;
    border: 0;
    color: var(--iq-bg-canvas);
    background: var(--iq-action-primary);
    font-family: var(--iq-label-font);
    font-size: inherit;
    line-height: inherit;
    font-weight: 700;
    text-transform: uppercase;
  }

  /* Constant reserve, added once when the dock exists, so the dock can never
     cover the last line of the page. It does not change while the dock
     animates — nothing shifts. */
  body.iq-variant-techspec.iq-has-buy-dock .product {
    padding-bottom: calc(72px + env(safe-area-inset-bottom, 0px));
  }
}

/* ------------------------------------------------------ 4. cart badge pulse */

@keyframes iq-cart-pulse {
  0% { transform: scale(1); }
  45% { transform: scale(1.32); }
  100% { transform: scale(1); }
}

body.iq-variant-techspec .header__count.iq-cart-pulse {
  animation: iq-cart-pulse 260ms cubic-bezier(.22, 1, .36, 1);
  transform-origin: center;
  will-change: transform;
}

/* --------------------------------------------------------- 5. skeletons */

@keyframes iq-skeleton-sheen {
  from { transform: translateX(-100%); }
  to { transform: translateX(100%); }
}

body.iq-variant-techspec .iq-skeleton {
  position: absolute;
  inset: 0;
  z-index: 2;
  overflow: hidden;
  background: var(--iq-bg-surface);
  pointer-events: none;
}

body.iq-variant-techspec .iq-skeleton::after {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(
    90deg,
    transparent,
    color-mix(in srgb, var(--iq-ink) 10%, transparent),
    transparent
  );
  transform: translateX(-100%);
  animation: iq-skeleton-sheen 1.1s ease-in-out infinite;
}

/* The catalog plate is already a positioned frame in the theme; the product
   image link is not, so it is made one only while a skeleton is inside it. */
body.iq-variant-techspec .product__img.is-iq-loading,
body.iq-variant-techspec .catalog-item__image.is-iq-loading {
  position: relative;
  overflow: hidden;
}

/* A submitted purchase button: the label stays (so nothing jumps) and the
   surface takes on the same waiting texture as a skeleton. */
body.iq-variant-techspec .is-iq-pending {
  position: relative;
  overflow: hidden;
  pointer-events: none;
}

body.iq-variant-techspec .is-iq-pending::after {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(
    90deg,
    transparent,
    color-mix(in srgb, var(--iq-ink) 22%, transparent),
    transparent
  );
  transform: translateX(-100%);
  animation: iq-skeleton-sheen 1.1s ease-in-out infinite;
  pointer-events: none;
}

/* ---------------------------------------------------- 6. cover parallax */

body.iq-variant-techspec .catalog-item__image[data-iq-parallax] {
  position: relative;
  overflow: hidden;
}

body.iq-variant-techspec .iq-cover-layer {
  position: absolute;
  /* Taller than the frame so the layer has room to travel without ever
     uncovering an edge. Matches OVERSHOOT in cover-parallax.js. */
  top: -7%;
  right: 0;
  bottom: -7%;
  left: 0;
  z-index: 0;
  background-position: center;
  background-size: cover;
  background-repeat: no-repeat;
  pointer-events: none;
  will-change: transform;
}

/* Anything the theme draws on the plate stays above the moving layer. */
body.iq-variant-techspec .catalog-item__image[data-iq-parallax] > *:not(.iq-cover-layer) {
  position: relative;
  z-index: 1;
}

/* ------------------------------------------ reduced motion — pass 2 additions */

@media (prefers-reduced-motion: reduce) {
  /* The header stays where the page put it: no fixed positioning, no band. */
  body.iq-variant-techspec.iq-header-sticky .header {
    position: static;
    background: var(--iq-bg-canvas);
    border-bottom-color: var(--iq-hair-strong);
  }
  body.iq-variant-techspec .iq-header-band,
  body.iq-variant-techspec .iq-header-spacer,
  body.iq-variant-techspec .iq-read-progress {
    display: none !important;
  }
  body.iq-variant-techspec .iq-buy-dock {
    transition: none;
  }
  body.iq-variant-techspec .header__count.iq-cart-pulse {
    animation: none;
  }
  /* The skeleton stays — it is status. Only the sheen goes. */
  body.iq-variant-techspec .iq-skeleton::after,
  body.iq-variant-techspec .is-iq-pending::after {
    animation: none;
    opacity: .35;
    transform: none;
  }
  body.iq-variant-techspec .iq-cover-layer {
    top: 0;
    bottom: 0;
    transform: none !important;
    will-change: auto;
  }
}

/* --- 45-cart.css --- */
/* Tech Spec — корзина.

   До этого файла у корзины не было ни одного правила в techspec: она собиралась
   из общих правил `body.page-template-page-cart` в iq-visual.css, написанных под
   прежнюю палитру, и из базовой темы. Отсюда и ощущение «страницы разные».

   Корзина и чекаут — одна и та же таблица товаров в двух шагах, поэтому набор
   здесь тот же, что в 50-checkout.css: подпись — компонент подписи, цифры —
   числовая разрядка, плита — токены плиты. */

/* --- Плита и заголовок ---------------------------------------------------- */
body.iq-variant-techspec .cart__inner {
  background: var(--iq-panel-bg);
  border: var(--iq-panel-border);
  border-radius: var(--iq-panel-radius);
}

body.iq-variant-techspec .cart__title {
  font-family: var(--iq-heading-font);
  font-weight: var(--iq-heading-weight);
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}

/* --- Таблица товаров ------------------------------------------------------ */
body.iq-variant-techspec .cart__table-header {
  font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  color: var(--iq-fg-muted);
  text-transform: uppercase;
}

/* Шов рисуется бордюром ячейки, а не плитой, просвечивающей сквозь зазор:
   незаполненная колонка иначе красится серым блоком. */
body.iq-variant-techspec .cart__row + .cart__row td {
  border-top: var(--iq-seam);
}

body.iq-variant-techspec .cart__name-link {
  color: var(--iq-fg-primary);
  font-family: var(--iq-font);
  /* Названия у музыки длинные и содержат цену («…1 МЕСЯЦ 299 ₽»), из-за чего на
     последнюю строку падал одинокий знак валюты. */
  text-wrap: pretty;
}
body.iq-variant-techspec .cart__name-link:hover,
body.iq-variant-techspec .cart__name-link:focus-visible {
  color: var(--iq-action-primary);
}

/* Цена. Базовая тема добавляет « Р» псевдоэлементом и красит его сиреневым
   #5a2785 — на графитовом листе знак валюты пропадал. Он остаётся тише числа,
   но читаемым, и держится к нему вплотную: разрядка подписи его отрывала. */
body.iq-variant-techspec .cart__price b {
  color: var(--iq-fg-primary);
  font-family: var(--iq-font);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-numeric-tracking);
}
body.iq-variant-techspec .cart__price b::after {
  color: var(--iq-fg-muted);
  font-family: var(--iq-font);
  letter-spacing: var(--iq-numeric-tracking);
}
body.iq-variant-techspec .cart__old-price {
  color: var(--iq-fg-muted);
  text-decoration: line-through;
}

/* Количество. У цифрового товара его менять нельзя, поэтому в одной строке
   стоит поле, а в соседней — просто число; раньше они выглядели как два разных
   элемента (обведённое поле против голой синей цифры). Теперь у обоих одна
   геометрия, а разница читается как «поле можно править, число — нет». */
body.iq-variant-techspec .cart__quantity .qty,
body.iq-variant-techspec .cart__quantity .input-text {
  width: 72px;
  height: var(--iq-field-h);
  padding: var(--iq-field-pad);
  border: var(--iq-field-border);
  border-radius: var(--iq-field-radius);
  background: var(--iq-field-bg);
  color: var(--iq-fg-primary);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-numeric-tracking);
  text-align: center;
}
body.iq-variant-techspec .cart__quantity .counter__total {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 72px;
  height: var(--iq-field-h);
  border: 1px solid transparent;
  color: var(--iq-fg-muted);
  font-family: var(--iq-font);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-numeric-tracking);
}

/* Удаление. Базовая тема рисует крестик двумя полосками цвета #252525 — почти
   чёрным по графиту, то есть невидимым. Плюс цель 40px при минимуме 44px. */
body.iq-variant-techspec .cart__delete-btn {
  width: var(--iq-control-h);
  height: var(--iq-control-h);
  border-radius: var(--iq-field-radius);
}
body.iq-variant-techspec .cart__delete-btn::before,
body.iq-variant-techspec .cart__delete-btn::after {
  top: 50%;
  left: 22%;
  width: 56%;
  height: 1px;
  border-radius: 0;
  background: var(--iq-fg-muted);
  transition: background-color var(--iq-dur-in) var(--iq-ease);
}
body.iq-variant-techspec .cart__delete-btn:hover::before,
body.iq-variant-techspec .cart__delete-btn:hover::after,
body.iq-variant-techspec .cart__delete-btn:focus-visible::before,
body.iq-variant-techspec .cart__delete-btn:focus-visible::after {
  background: var(--iq-danger);
}

/* --- Итог, промокод, действия --------------------------------------------- */
body.iq-variant-techspec .cart__result-wrap {
  font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  color: var(--iq-fg-muted);
  text-transform: uppercase;
}
body.iq-variant-techspec .cart__result {
  color: var(--iq-fg-primary);
  font-family: var(--iq-heading-font);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-numeric-tracking);
}
/* Свой знак валюты у итога — отдельным правилом, цвет #272e85 из базовой темы
   на графите не читается. */
body.iq-variant-techspec .cart__result::after {
  color: var(--iq-fg-muted);
  font-family: var(--iq-heading-font);
  letter-spacing: var(--iq-numeric-tracking);
}

body.iq-variant-techspec .cart__promo {
  height: var(--iq-field-h);
  padding: var(--iq-field-pad);
  border: var(--iq-field-border);
  border-radius: var(--iq-field-radius);
  background: var(--iq-field-bg);
  color: var(--iq-fg-primary);
}
body.iq-variant-techspec .cart__promo::placeholder {
  color: var(--iq-fg-muted);
}

/* На экране одно основное действие — «Оформить заказ». Промокод размечен тем же
   `btn--contrast`, из-за чего рядом стояли две одинаково громкие заливки и
   выбор между ними приходилось делать глазами. Промокод уходит в контур. */
body.iq-variant-techspec .cart__promo-btn {
  border-color: var(--iq-hair-strong);
  background: transparent;
  color: var(--iq-fg-primary);
  gap: 4px;
}
body.iq-variant-techspec .cart__promo-btn:hover,
body.iq-variant-techspec .cart__promo-btn:focus-visible {
  border-color: var(--iq-action-primary);
  color: var(--iq-action-primary);
}
/* В разметке слово «промокод» лежит в отдельном span без пробела вокруг —
   получалось «ПРИМЕНИТЬПРОМОКОД». Разделяет флексовый зазор кнопки, а не
   вставленный в CSS пробел, который выделяется вместе с текстом. */
body.iq-variant-techspec .cart__promo-btn > span {
  display: inline-block;
}

body.iq-variant-techspec .cart__info-cashback,
body.iq-variant-techspec .cart-info__cashback-description {
  color: var(--iq-fg-muted);
  font-size: 13px;
}
/* Приписка про бонус относится к кнопке, под которой стоит, поэтому равняется
   по её краю, а не по правому краю плиты рваной строкой. */
body.iq-variant-techspec .cart__info-cashback {
  margin-top: var(--iq-gap-3);
  text-align: center;
}
/* Сумма бонуса внутри приписки — та же числовая набранность, что у цен, и
   акцентный цвет вместо сиреневого из прежней палитры. */
body.iq-variant-techspec .cart__info-cashback b,
body.iq-variant-techspec .cart__info-cashback b::after {
  color: var(--iq-action-primary);
  font-family: var(--iq-font);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-numeric-tracking);
}

/* --- Пустая корзина -------------------------------------------------------- */
body.iq-variant-techspec .cart__empty p {
  color: var(--iq-fg-muted);
}
body.iq-variant-techspec .cart__empty-action {
  justify-self: start;
}

/* --- 50-checkout.css --- */
/* ==========================================================================
   50-checkout.css — checkout usability work for the Tech Spec variant.

   Every rule is scoped to body.iq-variant-techspec, including the ones inside
   @media wrappers.  Editorial is the live site look and must not move by a
   pixel.  No custom properties are declared on :root here: the theme tokens
   are redefined on body, so a derived token declared on :root would resolve
   against the base palette and freeze there.  Everything below reads the
   tokens at use time instead.
   ========================================================================== */

/* --- Layout: form on the left, order summary sticky on the right ---------- */
body.iq-variant-techspec .checkout__inner {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 340px;
  grid-auto-flow: row dense;
  gap: 24px 32px;
  align-items: start;
}

body.iq-variant-techspec .checkout__title,
body.iq-variant-techspec .checkout__notice,
body.iq-variant-techspec .checkout_wait,
body.iq-variant-techspec .iq-checkout-done,
body.iq-variant-techspec .iq-checkout-steps {
  grid-column: 1 / -1;
}

body.iq-variant-techspec .checkout__form {
  grid-column: 1;
  margin: 0;
}

body.iq-variant-techspec .iq-checkout-summary {
  grid-column: 2;
  position: sticky;
  top: 24px;
  background: var(--iq-bg-surface);
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-radius-panel);
  padding: 16px;
  max-height: calc(100vh - 48px);
  overflow-y: auto;
}

body.iq-variant-techspec .iq-checkout-summary:empty {
  display: none;
}

body.iq-variant-techspec .iq-checkout-summary .cart__table--checkout {
  width: 100%;
  margin: 0;
  /* Auto layout let the four headings claim their intrinsic widths and pushed
     СТОИМОСТЬ past the edge of a 340px rail. Fixed widths give the slack to
     the product name, which is the only column that can absorb it. */
  table-layout: fixed;
}
body.iq-variant-techspec .iq-checkout-summary .cart__table--checkout th:first-child,
body.iq-variant-techspec .iq-checkout-summary .cart__table--checkout td:first-child { width: 44%; }
body.iq-variant-techspec .iq-checkout-summary .cart__table--checkout th:nth-child(2),
body.iq-variant-techspec .iq-checkout-summary .cart__table--checkout td:nth-child(2) { width: 20%; }
body.iq-variant-techspec .iq-checkout-summary .cart__table--checkout th:nth-child(3),
body.iq-variant-techspec .iq-checkout-summary .cart__table--checkout td:nth-child(3) { width: 16%; }

/* Число и знак валюты — одна единица; перенос между ними («299 ⏎ ₽») читается
   как обрыв суммы. Переносится только название товара. */
body.iq-variant-techspec .iq-checkout-summary .cart__row td:not(:first-child) {
  white-space: nowrap;
}

body.iq-variant-techspec .iq-checkout-summary .cart__table-header {
  font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  color: var(--iq-fg-muted);
  font-weight: 400;
  /* The base rule leaves no horizontal padding, so in this narrow column the
     four headings ran together into ТОВАРЦЕНАКОЛИЧЕСТВОСТОИМОСТЬ. */
  padding: 0 6px 8px;
  border-bottom: 1px solid var(--iq-hair);
  /* Не `anywhere`: он рвал «Количество» на «КОЛ ИЧЕ СТВО». Заголовок, который не
     влезает, надо сократить в разметке, а не крошить по буквам. */
  overflow-wrap: normal;
}
/* Numeric columns read as a column only when they line up on the right. */
body.iq-variant-techspec .iq-checkout-summary .cart__table-header:not(:first-child),
body.iq-variant-techspec .iq-checkout-summary .cart__row td:not(:first-child) {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

body.iq-variant-techspec .iq-checkout-summary .cart__row td {
  padding: 10px 8px;
  border-bottom: 1px solid var(--iq-hair);
  vertical-align: top;
}

body.iq-variant-techspec .iq-checkout-summary .cart__bottom--checkout {
  margin: 12px 0 0;
  padding-top: 12px;
  border-top: 1px solid var(--iq-hair-strong);
}

body.iq-variant-techspec .iq-checkout-summary .cart__result {
  color: var(--iq-action-primary);
}

/* The only h1 on the site left without the heading tracking — the cross-page
   comparison had it at `normal` while every other page sat on the token. */
body.iq-variant-techspec .checkout__title {
  font-family: var(--iq-heading-font);
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}

/* --- Step indicator: cart -> details -> payment --------------------------- */
body.iq-variant-techspec .iq-checkout-steps {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  list-style: none;
  margin: 0 0 8px;
  padding: 0;
  counter-reset: none;
}

body.iq-variant-techspec .iq-checkout-steps__item {
  display: flex;
  align-items: center;
  gap: 8px;
  flex: 1 1 160px;
  min-height: 44px;
  padding: 8px 12px;
  border: 1px solid var(--iq-hair);
  border-radius: var(--iq-radius-panel);
  color: var(--iq-fg-muted);
  background: transparent;
}

body.iq-variant-techspec .iq-checkout-steps__item.is-done {
  color: var(--iq-fg-primary);
  border-color: var(--iq-hair-strong);
}

body.iq-variant-techspec .iq-checkout-steps__item.is-current {
  color: var(--iq-fg-primary);
  border-color: var(--iq-action-primary);
  background: var(--iq-bg-surface);
}

body.iq-variant-techspec .iq-checkout-steps__link {
  display: flex;
  align-items: center;
  gap: 8px;
  color: inherit;
  text-decoration: none;
  width: 100%;
  min-height: 28px;
}

body.iq-variant-techspec .iq-checkout-steps__link:hover,
body.iq-variant-techspec .iq-checkout-steps__link:focus-visible {
  color: var(--iq-action-primary);
}

body.iq-variant-techspec .iq-checkout-steps__num {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  flex: 0 0 24px;
  border: 1px solid currentColor;
  border-radius: var(--iq-radius-media);
  font-family: var(--iq-label-font);
  font-size: 11px;
}

body.iq-variant-techspec .iq-checkout-steps__item.is-current .iq-checkout-steps__num {
  background: var(--iq-action-primary);
  color: var(--iq-button-primary-fg);
  border-color: var(--iq-action-primary);
}

body.iq-variant-techspec .iq-checkout-steps__label {
  font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

/* --- Fields: visible label, 44px target, error under the field ------------ */
body.iq-variant-techspec .iq-field {
  display: block;
  margin: 0 0 18px;
}

body.iq-variant-techspec .iq-field__label {
  display: block;
  margin: 0 0 6px;
  font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  color: var(--iq-fg-muted);
}

body.iq-variant-techspec .iq-field__req {
  color: var(--iq-action-primary);
}

body.iq-variant-techspec .iq-field__input {
  display: block;
  width: 100%;
  min-height: 44px;
  padding: 10px 12px;
  background: var(--iq-input-bg);
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-radius-input);
  color: var(--iq-fg-primary);
}

body.iq-variant-techspec .iq-field__input::placeholder {
  color: var(--iq-fg-muted);
}

body.iq-variant-techspec .iq-field__input:focus-visible,
body.iq-variant-techspec .iq-delivery__radio:focus-visible + .iq-delivery__body,
body.iq-variant-techspec .checkout__form a:focus-visible,
body.iq-variant-techspec .iq-checkout-steps__link:focus-visible {
  outline: 2px solid var(--iq-action-primary);
  outline-offset: 2px;
}

body.iq-variant-techspec .iq-field__input[disabled] {
  color: var(--iq-fg-muted);
  border-style: dashed;
}

body.iq-variant-techspec .iq-field__hint {
  margin: 6px 0 0;
  font-size: 12px;
  line-height: 1.4;
  color: var(--iq-fg-muted);
}

body.iq-variant-techspec .iq-field__error {
  margin: 6px 0 0;
  font-size: 13px;
  line-height: 1.4;
  color: var(--iq-danger);
}

body.iq-variant-techspec .iq-field__error:empty {
  display: none;
}

body.iq-variant-techspec .iq-field__input[aria-invalid='true'] {
  border-color: var(--iq-danger);
}

/* --- Delivery: three-column tiles instead of a <select> ------------------- */
body.iq-variant-techspec .iq-delivery {
  border: 0;
  margin: 0 0 18px;
  padding: 0;
}

body.iq-variant-techspec .iq-delivery__legend {
  padding: 0;
  margin: 0 0 8px;
  font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  color: var(--iq-fg-muted);
}

body.iq-variant-techspec .iq-delivery__tiles {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 10px;
}

body.iq-variant-techspec .iq-delivery__tile {
  position: relative;
  display: block;
  cursor: pointer;
}

body.iq-variant-techspec .iq-delivery__radio {
  position: absolute;
  width: 1px;
  height: 1px;
  opacity: 0;
  margin: 0;
}

body.iq-variant-techspec .iq-delivery__body {
  display: flex;
  flex-direction: column;
  gap: 4px;
  min-height: 44px;
  height: 100%;
  padding: 14px;
  background: var(--iq-bg-surface);
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-radius-panel);
  transition: border-color .18s ease, background-color .18s ease;
}

body.iq-variant-techspec .iq-delivery__tile:hover .iq-delivery__body {
  border-color: var(--iq-action-primary);
}

body.iq-variant-techspec .iq-delivery__radio:checked + .iq-delivery__body {
  border-color: var(--iq-action-primary);
  background: var(--iq-card-bg-hover);
  box-shadow: inset 3px 0 0 0 var(--iq-action-primary);
}

body.iq-variant-techspec .iq-delivery__name {
  font-weight: 600;
  color: var(--iq-fg-primary);
}

body.iq-variant-techspec .iq-delivery__price {
  font-family: var(--iq-label-font);
  font-size: 15px;
  color: var(--iq-action-primary);
}

body.iq-variant-techspec .iq-delivery__desc {
  font-size: 12px;
  line-height: 1.4;
  color: var(--iq-fg-muted);
}

body.iq-variant-techspec .iq-delivery__term {
  font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  color: var(--iq-fg-muted);
  margin-top: auto;
}

/* --- Digital-only cart: say why there is no delivery block ---------------- */
body.iq-variant-techspec .iq-checkout-digital {
  margin: 0 0 18px;
  padding: 12px 14px;
  border-left: 2px solid var(--iq-action-primary);
  background: var(--iq-bg-surface);
  color: var(--iq-fg-muted);
  font-size: 13px;
  line-height: 1.5;
}

/* --- Draft notice raised by iq-checkout-ux.js ----------------------------- */
body.iq-variant-techspec .iq-checkout-draft {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
  margin: 0 0 18px;
  padding: 10px 12px;
  border: 1px dashed var(--iq-hair-strong);
  border-radius: var(--iq-radius-panel);
  color: var(--iq-fg-muted);
  font-size: 13px;
}

body.iq-variant-techspec .iq-checkout-draft__clear {
  min-height: 44px;
  padding: 0 14px;
  background: transparent;
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-radius-input);
  color: var(--iq-fg-primary);
  cursor: pointer;
  font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

body.iq-variant-techspec .iq-checkout-draft__clear:hover,
body.iq-variant-techspec .iq-checkout-draft__clear:focus-visible {
  border-color: var(--iq-action-primary);
  color: var(--iq-action-primary);
}

body.iq-variant-techspec .iq-checkout-draft__clear:focus-visible {
  outline: 2px solid var(--iq-action-primary);
  outline-offset: 2px;
}

/* --- Paid screen: what to do next ---------------------------------------- */
body.iq-variant-techspec .iq-checkout-done {
  margin: 0 0 8px;
  padding: 20px;
  background: var(--iq-bg-surface);
  border: 1px solid var(--iq-action-primary);
  border-radius: var(--iq-radius-panel);
}

body.iq-variant-techspec .iq-checkout-done__stamp {
  display: block;
  width: 72px;
  height: 72px;
  margin: 0 0 12px;
}

body.iq-variant-techspec .iq-checkout-done__eyebrow {
  margin: 0 0 6px;
  font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  color: var(--iq-action-primary);
}

body.iq-variant-techspec .iq-checkout-done__title {
  margin: 0 0 16px;
  color: var(--iq-fg-primary);
}

body.iq-variant-techspec .iq-checkout-done__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 12px;
}

body.iq-variant-techspec .iq-checkout-done__list li {
  display: grid;
  grid-template-columns: 32px minmax(0, 1fr);
  gap: 10px;
  padding-top: 12px;
  border-top: 1px solid var(--iq-hair);
  color: var(--iq-fg-muted);
  line-height: 1.5;
}

body.iq-variant-techspec .iq-checkout-done__list b {
  color: var(--iq-fg-primary);
}

body.iq-variant-techspec .iq-checkout-done__step {
  font-family: var(--iq-label-font);
  font-size: 11px;
  color: var(--iq-action-primary);
}

body.iq-variant-techspec .iq-checkout-done a {
  color: var(--iq-action-primary);
}

/* --- Paid screen: activate the subscription in the Telegram bot ---------- */
body.iq-variant-techspec .iq-checkout-activate {
  margin: 18px 0 0;
  padding-top: 16px;
  border-top: 1px solid var(--iq-action-primary);
}

body.iq-variant-techspec .iq-checkout-activate__kicker {
  margin: 0 0 10px;
  font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  color: var(--iq-action-primary);
}

body.iq-variant-techspec .iq-checkout-activate__btn {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto auto;
  align-items: center;
  gap: 12px;
  padding: 12px 14px;
  margin: 0 0 8px;
  border: 1px solid var(--iq-hair);
  border-radius: var(--iq-radius-panel);
  color: var(--iq-fg-primary);
  text-decoration: none;
  transition: border-color 0.15s ease, background-color 0.15s ease;
}

body.iq-variant-techspec .iq-checkout-activate__btn:hover,
body.iq-variant-techspec .iq-checkout-activate__btn:focus-visible {
  border-color: var(--iq-action-primary);
  background: var(--iq-bg-raised, transparent);
}

body.iq-variant-techspec .iq-checkout-activate__name {
  font-weight: 600;
}

body.iq-variant-techspec .iq-checkout-activate__term {
  font-family: var(--iq-label-font);
  font-size: 12px;
  font-variant-numeric: tabular-nums;
  color: var(--iq-fg-muted);
}

body.iq-variant-techspec .iq-checkout-activate__cta {
  font-family: var(--iq-label-font);
  font-size: 12px;
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  color: var(--iq-action-primary);
}

body.iq-variant-techspec .iq-checkout-activate__note {
  margin: 10px 0 0;
  font-size: 13px;
  line-height: 1.5;
  color: var(--iq-fg-muted);
}

/* --- Narrow screens: stack, summary first, no sticky --------------------- */
@media (max-width: 980px) {
  body.iq-variant-techspec .checkout__inner {
    grid-template-columns: minmax(0, 1fr);
  }

  body.iq-variant-techspec .iq-checkout-summary,
  body.iq-variant-techspec .checkout__form {
    grid-column: 1;
  }

  body.iq-variant-techspec .iq-checkout-summary {
    position: static;
    max-height: none;
  }
}

@media (max-width: 560px) {
  body.iq-variant-techspec .iq-checkout-activate__btn {
    grid-template-columns: minmax(0, 1fr) auto;
  }

  body.iq-variant-techspec .iq-checkout-activate__cta {
    grid-column: 1 / -1;
  }
}

@media (prefers-reduced-motion: reduce) {
  body.iq-variant-techspec .iq-delivery__body,
  body.iq-variant-techspec .iq-checkout-steps__item,
  body.iq-variant-techspec .iq-checkout-activate__btn {
    transition: none;
  }
}

/* --- 60-type.css --- */
/* ==========================================================================
   60-type.css — Tech Spec: колофон, контурные вторые строки, кегль-ритм.
   Каждое правило начинается с body.iq-variant-techspec — тема editorial
   не должна увидеть ни одного из этих селекторов.
   Токены (--iq-bg-canvas, --iq-fg-muted, --iq-action-signal, --iq-hair,
   var(--iq-font)/var(--iq-display) и т.д.) уже объявлены на body.iq-variant-techspec
   в iq-visual.css (строка ~4329) — здесь только используются через var(),
   ничего не переопределяется на :root.
   Файл собран автозагрузчиком functions.php из assets/css/parts/ по алфавиту
   ПОСЛЕ iq-visual.css, поэтому при равной специфичности здесь побеждают.
   ========================================================================== */

/* ==========================================================================
   1. КОЛОФОН СО ШТРИХКОДОМ — служебная полоса в подвале.
   Декоративный элемент: НЕ настоящий EAN (штрихи рисуются CSS-градиентом,
   не картинкой/шрифтом), рядом — номер сборки/ревизии, не товарный артикул.
   Исключены чекаут/корзина/авторизация/личный кабинет — там футер несёт
   служебную функцию (итог заказа), колофон туда не добавляем.
   ========================================================================== */
body.iq-variant-techspec:not(.page-template-page-cart):not(.page-template-page-checkout):not(.page-template-page-auth):not(.page-template-page-reg):not(.page-template-page-personal):not(.page-template-page-lk-edit) .footer__bottom::after {
  content: "BUILD 2026.07.31 \00B7  REV 0B0C0E \00B7  SHEET IQ\2013 03";
  display: block;
  flex: 1 0 100%;
  order: 99;
  margin-top: 14px;
  padding: 12px 0 0 148px;
  min-height: 34px;
  border-top: 1px solid var(--iq-hair);
  background-color: transparent;
  /* Штрихкод: три несовпадающих периода штриховки — рисунок сознательно
     не читается как регулярный код, чтобы не выдавать себя за сканируемый. */
  background-image:
    repeating-linear-gradient(90deg, var(--iq-fg-primary) 0 2px, transparent 2px 5px),
    repeating-linear-gradient(90deg, var(--iq-fg-primary) 0 1px, transparent 1px 9px),
    repeating-linear-gradient(90deg, var(--iq-fg-primary) 0 3px, transparent 3px 17px);
  background-repeat: no-repeat;
  background-position: 0 14px;
  background-size: 120px 20px;
  opacity: .9;
  color: var(--iq-fg-muted);
  font: var(--iq-label-weight) var(--iq-label-size)/1.5 var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  font-variant-numeric: tabular-nums;
}

/* ==========================================================================
   2. КОНТУРНЫЙ ШРИФТ ДЛЯ ВТОРЫХ СТРОК / ВЫДЕЛЕННЫХ ФРАГМЕНТОВ ЗАГОЛОВКА.
   Приём с главной (main-banner__title b, см. 10-home.css) распространён на
   единственный другой заголовок в теме с тем же паттерном разметки —
   выделенный <b>-фрагмент внутри h1: архив новостей «Новости <b>IQfitness</b>».
   (Просмотрены все шаблоны темы: <br><b>…</b> и одиночные <b> внутри h1/h2
   встречаются только в main-banner__title — уже сделан — и в этом news__title.
   footer__library h2 переносит строку без обёртки-элемента вокруг второй
   строки, поэтому её контуром выделить нельзя без правки HTML.)
   Кегль news__title всегда clamp(38px,5vw,76px), на мобильном — фиксированные
   42px (iq-visual.css:2265,2344) — то есть контур ВСЕГДА на кегле ≥32px,
   явная защита ниже не требуется, но добавлена как страховка по правилу.
   Контраст обводки: var(--iq-action-signal) #b8c0cc на #0b0c0e = 10.67:1
   без прозрачности; при opacity:.8 (как задано ниже) эффективный контраст
   обводки ≈7.3:1 — выше требуемых 3:1 для крупного текста (AAA).
   ========================================================================== */
body.iq-variant-techspec.post-type-archive-news .news__title b {
  color: transparent;
  -webkit-text-stroke: 1px var(--iq-action-signal);
  opacity: .8;
}

/* Страховка: если где-то кегль этого заголовка окажется мельче 32px
   (напр. будущая правка контента), обводка становится нечитаемой —
   принудительно возвращаем заливку акцентным цветом вместо контура. */
@media (max-width: 340px) {
  body.iq-variant-techspec.post-type-archive-news .news__title b {
    color: var(--iq-action-primary);
    -webkit-text-stroke: 0;
    opacity: 1;
  }
}

/* ==========================================================================
   3. СМЕНА КЕГЛЯ ВНУТРИ ОДНОГО ЗАГОЛОВКА — ритм вместо ровности.
   Применено точечно к двум заголовкам-«Новостям» (архив + блок на главной),
   единственным местам темы, где заголовок раздела уже размечен как
   «нейтральное слово + выделенный <b>-фрагмент» в одной строке — без этого
   HTML-крюка честно развести кегль CSS-only нельзя. Остальные заголовки
   разделов (main-catalog__title, trust/why-us/faq__title и т.д.) кегль
   не меняют — как и требуется, не «ко всем подряд».
   ========================================================================== */
body.iq-variant-techspec.post-type-archive-news .news__title b {
  font-size: 1.16em;
  letter-spacing: var(--iq-heading-tracking);
}

body.iq-variant-techspec.home .home-news__title b {
  font-size: 1.22em;
  letter-spacing: var(--iq-heading-tracking);
}

/* ==========================================================================
   4. АДАПТИВ — проверено на брейкпоинтах 1440 / 1100 / 760 / 390.
   ========================================================================== */
@media (max-width: 1100px) {
  body.iq-variant-techspec:not(.page-template-page-cart):not(.page-template-page-checkout):not(.page-template-page-auth):not(.page-template-page-reg):not(.page-template-page-personal):not(.page-template-page-lk-edit) .footer__bottom::after {
    padding-left: 128px;
    background-size: 104px 18px;
  }
}

@media (max-width: 760px) {
  body.iq-variant-techspec:not(.page-template-page-cart):not(.page-template-page-checkout):not(.page-template-page-auth):not(.page-template-page-reg):not(.page-template-page-personal):not(.page-template-page-lk-edit) .footer__bottom::after {
    padding: 34px 0 0;
    background-position: 0 0;
    background-size: 96px 16px;
  }
}

@media (max-width: 390px) {
  body.iq-variant-techspec:not(.page-template-page-cart):not(.page-template-page-checkout):not(.page-template-page-auth):not(.page-template-page-reg):not(.page-template-page-personal):not(.page-template-page-lk-edit) .footer__bottom::after {
    font-size: 9px;
    letter-spacing: var(--iq-label-tracking);
    background-size: 84px 14px;
  }
}

/* --- 70-account.css --- */
/* ==========================================================================
   70-account.css — личный кабинет в теме «Tech Spec»
   --------------------------------------------------------------------------
   Область: только авторизованная зона и только вариант techspec.
     · body.iq-variant-techspec.page-template-page-personal  — page-personal.php
     · body.iq-variant-techspec.page-template-page-lk-edit   — page-lk-edit.php
     · body.iq-variant-techspec.page .main-catalog__*        — page-favorites.php
       (у этого шаблона нет Template Name, поэтому WP не выдаёт ему
        page-template-*; связка «страница + разметка каталога» встречается
        только на избранном — архивы каталога класс .page не несут)

   КАЖДЫЙ селектор начинается с body.iq-variant-techspec: editorial остаётся
   боевым видом сайта, любая протечка ломает прод. Новых переменных на :root
   не объявляется намеренно — var() внутри кастомного свойства резолвится на
   элементе, где свойство объявлено, а темы переопределяют токены на body;
   производный токен с :root замёрз бы на базовой палитре.

   Идея: кабинет — не витрина, а рабочий лист. Список заказов читается как
   реестр (швы-хайрлайны бордерами ячеек, моноширинные номера и даты),
   позиции внутри заказа — как строки спецификации. Швы рисуются бордерами
   строк, а не «плитой, просвечивающей через щель»: реестр почти всегда
   недозаполнен, и подложка красила бы пустую дорожку серым блоком.

   Контрасты (WCAG 2.x): #e8ecf0 на #0b0c0e — 16.5:1, #e8ecf0 на #131519 —
   15.7:1, #7d8794 на #131519 — 5.12:1 (только служебные подписи),
   #6ee7ff на #0b0c0e — 13.6:1. Ничего тусклее #7d8794 текстом не набрано.

   Адаптив проверен по контрольным точкам 1440 / 1100 / 760 / 390.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. ЛИСТ
   Координатная сетка живёт на самом body: не создаёт нового контекста
   наложения и не может перекрыть шапку или модалку видеоплеера.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.page-template-page-personal,
body.iq-variant-techspec.page-template-page-lk-edit {
  background-color: var(--iq-bg-canvas);
  background-image:
    repeating-linear-gradient(90deg, rgba(232, 236, 240, .025) 0 1px, transparent 1px 96px),
    repeating-linear-gradient(0deg, rgba(232, 236, 240, .025) 0 1px, transparent 1px 96px);
  background-attachment: fixed;
}

body.iq-variant-techspec.page-template-page-personal .personal,
body.iq-variant-techspec.page-template-page-lk-edit .personal {
  background: transparent;
}

body.iq-variant-techspec.page-template-page-personal .personal__inner,
body.iq-variant-techspec.page-template-page-lk-edit .personal__inner {
  position: relative;
  max-width: 1280px;
  padding-top: 8px;
}

/* Служебная шапка листа — подпись чертежа над содержимым. */
body.iq-variant-techspec.page-template-page-personal .personal__inner::before,
body.iq-variant-techspec.page-template-page-lk-edit .personal__inner::before {
  content: 'IQ Fitness · account sheet · rev 02';
  display: block;
  margin-bottom: 18px;
  padding-bottom: 10px;
  border-bottom: 1px solid var(--iq-hair);
  color: var(--iq-fg-muted);
  font: 600 10px/1.4 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

body.iq-variant-techspec.page-template-page-personal .breadcrumbs,
body.iq-variant-techspec.page-template-page-lk-edit .breadcrumbs {
  background: transparent;
}

/* --------------------------------------------------------------------------
   2. ШАПКА КАБИНЕТА
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.page-template-page-personal .personal__hero {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: 20px;
  margin-bottom: 0;
  padding: 22px 0 22px;
  border: 0;
  border-bottom: 1px solid var(--iq-hair-strong);
  border-radius: 0;
  background: transparent;
}

body.iq-variant-techspec.page-template-page-personal .personal__eyebrow {
  display: block;
  margin-bottom: 12px;
  color: var(--iq-fg-muted);
  font: 600 10px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  font-variant-numeric: tabular-nums;
}

body.iq-variant-techspec.page-template-page-personal .personal__title,
body.iq-variant-techspec.page-template-page-lk-edit .personal__title {
  margin: 0;
  color: var(--iq-fg-primary);
  font-family: var(--iq-display);
  font-weight: 700;
  font-size: clamp(28px, 4.4vw, 54px);
  line-height: 1;
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}

body.iq-variant-techspec.page-template-page-lk-edit .personal__title {
  padding-bottom: 20px;
  border-bottom: 1px solid var(--iq-hair-strong);
}

body.iq-variant-techspec.page-template-page-personal .personal__intro {
  max-width: 48ch;
  margin: 14px 0 0;
  color: var(--iq-fg-muted);
  font-family: var(--iq-font);
  font-size: 14px;
  line-height: 1.55;
}

/* Статус аккаунта: точка + текст. Смысл несёт подпись, не цвет. */
body.iq-variant-techspec.page-template-page-personal .personal__hero-status {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  padding: 9px 14px;
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
  color: var(--iq-fg-primary);
  font: 600 10px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

body.iq-variant-techspec.page-template-page-personal .personal__hero-status-dot {
  width: 6px;
  height: 6px;
  border-radius: 0;
  background: var(--iq-action-primary);
  box-shadow: 0 0 0 3px rgba(110, 231, 255, .14);
}

/* --------------------------------------------------------------------------
   3. ПАНЕЛЬ ДАННЫХ ПОЛЬЗОВАТЕЛЯ
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.page-template-page-personal .personal__info,
body.iq-variant-techspec.page-template-page-lk-edit .personal__info {
  margin-top: 26px;
  padding: 22px 24px 24px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
  box-shadow: none;
}

body.iq-variant-techspec.page-template-page-personal .personal__info-row {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  margin-bottom: 20px;
  padding-bottom: 18px;
  border-bottom: 1px solid var(--iq-hair);
}

body.iq-variant-techspec.page-template-page-personal .personal__fields {
  display: grid;
  grid-template-columns: minmax(170px, 250px) minmax(0, 1fr) minmax(220px, 320px);
  align-items: start;
  gap: 0 28px;
}

body.iq-variant-techspec.page-template-page-personal .personal__fields-column,
body.iq-variant-techspec.page-template-page-lk-edit .personal__fields-column {
  display: flex;
  flex-direction: column;
  gap: 0;
}

/* Подписи полей — служебная моно-строка. Каждая строка отбита хайрлайном:
   лист читается как таблица параметров. */
body.iq-variant-techspec.page-template-page-personal .personal__field-name,
body.iq-variant-techspec.page-template-page-personal .personal__names-header,
body.iq-variant-techspec.page-template-page-lk-edit .personal__field-name {
  display: flex;
  align-items: center;
  min-height: 46px;
  margin: 0;
  color: var(--iq-fg-muted);
  font: 600 10px/1.4 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  font-variant-numeric: tabular-nums;
}

body.iq-variant-techspec.page-template-page-personal .personal__field-value {
  display: flex;
  align-items: center;
  min-height: 46px;
  /* Подписи и значения лежат двумя независимыми колонками, а не строками, и
     совпадают только пока у них общий ритм. У подписей поле обнулено, у
     значений от базовой темы оставалось 20px — к третьей строке значение
     уезжало от своей подписи на 40px. */
  margin: 0;
  border-bottom: 1px solid var(--iq-hair);
  color: var(--iq-fg-primary);
  font-family: var(--iq-font);
  font-size: 15px;
  line-height: 1.4;
  word-break: break-word;
}

body.iq-variant-techspec.page-template-page-personal .personal__fields-column:first-child .personal__field-name {
  border-bottom: 1px solid var(--iq-hair);
}

body.iq-variant-techspec.page-template-page-personal .personal__field-value img {
  max-width: 40px;
  height: auto;
  border: 1px solid var(--iq-hair);
  border-radius: var(--iq-radius-media);
}

/* --------------------------------------------------------------------------
   4. КЭШБЭК — отдельный «прибор» на листе
   Только модификатор --personal: корзину и чекаут не трогаем.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.page-template-page-personal .personal__cashback {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px;
  padding: 18px 18px 16px;
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface-raised);
}

body.iq-variant-techspec.page-template-page-personal .cart__bottom-cashback--personal {
  padding: 0;
  border: 0;
  background: transparent;
}

body.iq-variant-techspec.page-template-page-personal .cart__bottom-cashback--personal p {
  margin: 0;
  color: var(--iq-fg-muted);
  font: 600 10px/1.4 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

body.iq-variant-techspec.page-template-page-personal .personal__cashback-value {
  display: block;
  margin-top: 8px;
  color: var(--iq-action-primary);
  font-family: var(--iq-display);
  font-weight: 700;
  font-size: clamp(26px, 3vw, 34px);
  line-height: 1;
  letter-spacing: var(--iq-heading-tracking);
  font-variant-numeric: tabular-nums;
}

body.iq-variant-techspec.page-template-page-personal .personal__cashback-value small {
  margin-left: .2em;
  color: var(--iq-fg-muted);
  font-family: var(--iq-font);
  font-size: .42em;
  font-weight: 600;
  letter-spacing: var(--iq-numeric-tracking);
}

body.iq-variant-techspec.page-template-page-personal .personal__cashback-note {
  display: block;
  margin-top: 8px;
  color: var(--iq-fg-muted);
  font-family: var(--iq-font);
  font-size: 12px;
  line-height: 1.45;
  letter-spacing: 0;
  text-transform: none;
}

body.iq-variant-techspec.page-template-page-personal .personal__cashback-image {
  flex: 0 0 auto;
  margin: 0;
}

body.iq-variant-techspec.page-template-page-personal .personal__cashback-image img {
  width: 64px;
  height: 64px;
  opacity: .55;
  filter: grayscale(1) brightness(1.35);
}

body.iq-variant-techspec.page-template-page-personal .cart__bottom-help {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  border: 1px solid var(--iq-hair-strong);
  border-radius: 0;
  background: transparent;
  color: var(--iq-fg-muted);
  font-size: 11px;
}

/* --------------------------------------------------------------------------
   5. РЕЕСТР ЗАКАЗОВ
   Швы — бордеры самих строк. Подложка через 1px-щель здесь сознательно не
   применяется: реестр переменной длины, недозаполненная дорожка красилась бы
   сплошным серым блоком.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.page-template-page-personal .personal__orders-wrap {
  margin-top: 34px;
  padding: 0;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
}

body.iq-variant-techspec.page-template-page-personal .personal__orders-heading {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: 14px;
  margin: 0;
  padding: 20px 20px 16px;
  border-bottom: 1px solid var(--iq-hair-strong);
}

body.iq-variant-techspec.page-template-page-personal .personal__orders-title {
  margin: 0;
  color: var(--iq-fg-primary);
  font-family: var(--iq-display);
  font-weight: 700;
  font-size: clamp(20px, 2.4vw, 28px);
  line-height: 1.05;
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}

body.iq-variant-techspec.page-template-page-personal .personal__orders-count {
  padding: 7px 12px;
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-canvas);
  color: var(--iq-fg-primary);
  font: 600 10px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  font-variant-numeric: tabular-nums;
}

/* Одна геометрия колонок для шапки таблицы и для строк заказа. Четвёртая
   дорожка фиксированной ширины, иначе в шапке (там всего три ячейки) она
   схлопнулась бы и подписи разъехались бы со значениями. */
body.iq-variant-techspec.page-template-page-personal .personal__headers-row,
body.iq-variant-techspec.page-template-page-personal .personal__order-summary {
  display: grid;
  grid-template-columns: minmax(110px, 1fr) minmax(90px, .65fr) minmax(120px, .8fr) minmax(120px, .8fr) 156px;
  align-items: center;
  gap: 14px;
  margin: 0;
  padding: 13px 20px;
  /* Базовая тема красит строку заказа белым, а цвет текста приходит из тёмной:
     светло-серые цифры на белом давали контраст 1,19:1 при норме 4,5 — номер
     заказа, сумму и дату было физически не прочитать. Фон должен давать
     .personal__order — он же меняет его при наведении и в раскрытом виде.
     04.08.2026 */
  background: transparent;
}

body.iq-variant-techspec.page-template-page-personal .personal__headers-row {
  padding-top: 12px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--iq-hair-strong);
  background: var(--iq-bg-canvas);
}

body.iq-variant-techspec.page-template-page-personal .personal__order {
  margin: 0;
  border: 0;
  border-bottom: 1px solid var(--iq-hair);
  border-radius: 0;
  background: transparent;
  transition: background .18s ease;
}

body.iq-variant-techspec.page-template-page-personal .personal__order:last-of-type {
  border-bottom: 0;
}

body.iq-variant-techspec.page-template-page-personal .personal__order:hover,
body.iq-variant-techspec.page-template-page-personal .personal__order:focus-within {
  background: var(--iq-bg-surface-raised);
}

body.iq-variant-techspec.page-template-page-personal .personal__order--open {
  background: var(--iq-bg-surface-raised);
}

/* Номер и дата — моноширинные табличные цифры: колонка читается сверху вниз. */
body.iq-variant-techspec.page-template-page-personal .personal__order-summary .personal__text {
  color: var(--iq-fg-primary);
  font-family: var(--iq-font);
  font-size: 14px;
  font-weight: 600;
  letter-spacing: var(--iq-numeric-tracking);
  font-variant-numeric: tabular-nums;
  font-feature-settings: 'tnum' 1;
}

body.iq-variant-techspec.page-template-page-personal .personal__order-summary .personal__col-1 .personal__text::before {
  content: '№ ';
  color: var(--iq-fg-muted);
  font-weight: 600;
}

body.iq-variant-techspec.page-template-page-personal .personal__text--price {
  color: var(--iq-fg-primary);
  font-family: var(--iq-display);
  font-weight: 600;
  letter-spacing: var(--iq-heading-tracking);
  font-variant-numeric: tabular-nums;
}

/* Кнопка раскрытия: знак меняется вместе с состоянием, не только цвет. */
body.iq-variant-techspec.page-template-page-personal .personal__spoiler-btn,
body.iq-variant-techspec.page-template-page-personal .personal__pay-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  width: 100%;
  min-height: 44px;
  padding: 10px 14px;
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-canvas);
  color: var(--iq-fg-primary);
  font: 600 11px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  cursor: pointer;
  transition: background .18s ease, border-color .18s ease, color .18s ease;
}

/* Старый значок базовой темы — две абсолютные палочки «плюса», собранные из
   ::before и ::after. Мы заменили знак на текстовый символ в ::after, а
   ::before остался: белая палочка 12×3, повёрнутая на 90° и поставленная в
   left:50% — то есть ровно посередине кнопки, поверх слова «ПОДРОБНЕЕ».
   Отсюда вертикальная черта, перечёркивающая букву «О». Гасим её. */
body.iq-variant-techspec.page-template-page-personal .personal__spoiler-btn::before,
body.iq-variant-techspec.page-template-page-personal .personal__pay-btn::before {
  content: none;
}

/* ::after мы взяли под знак состояния, но геометрия у него осталась от старой
   палочки: absolute, 12×3, сдвиг влево за границу кнопки при overflow:hidden —
   то есть символ подставлялся, но не показывался, и кнопка выглядела одинаково
   в открытом и закрытом виде. Возвращаем его в поток. */
body.iq-variant-techspec.page-template-page-personal .personal__spoiler-btn::after {
  content: '+';
  position: static;
  width: auto;
  height: auto;
  margin: 0;
  transform: none;
  background: none;
  border-radius: 0;
  font-size: 14px;
  line-height: 1;
}

body.iq-variant-techspec.page-template-page-personal .personal__spoiler-btn.active::after {
  content: '\2212'; /* минус */
}

body.iq-variant-techspec.page-template-page-personal .personal__spoiler-btn:hover,
body.iq-variant-techspec.page-template-page-personal .personal__spoiler-btn:focus-visible {
  border-color: var(--iq-action-primary);
  background: var(--iq-bg-surface-raised);
  color: var(--iq-action-primary);
}

/* --------------------------------------------------------------------------
   6. ПОЗИЦИИ ЗАКАЗА — строки спецификации
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.page-template-page-personal .personal__order-details {
  margin: 0;
  padding: 0 20px 16px;
  border-top: 1px solid var(--iq-hair);
  background: var(--iq-bg-canvas);
}

body.iq-variant-techspec.page-template-page-personal .personal__order-details-row {
  display: grid;
  grid-template-columns: minmax(220px, 1.7fr) minmax(90px, .5fr) minmax(210px, 1.2fr);
  align-items: start;
  gap: 16px;
  margin: 0;
  padding: 16px 0;
  border-bottom: 1px solid var(--iq-hair);
}

body.iq-variant-techspec.page-template-page-personal .personal__order-details-row:last-child {
  border-bottom: 0;
}

body.iq-variant-techspec.page-template-page-personal .personal__order-name {
  display: flex;
  align-items: flex-start;
  gap: 14px;
}

body.iq-variant-techspec.page-template-page-personal .personal__order-cover {
  flex: 0 0 auto;
  display: block;
  border: 1px solid var(--iq-hair);
  border-radius: var(--iq-radius-media);
  overflow: hidden;
  background: var(--iq-media-bg);
}

body.iq-variant-techspec.page-template-page-personal .personal__order-cover img {
  display: block;
  width: 64px;
  height: 64px;
  object-fit: cover;
  filter: saturate(.9) contrast(1.03);
}

body.iq-variant-techspec.page-template-page-personal .personal__order-copy {
  min-width: 0;
}

/* Правило снимает подчёркивание и цвет со ссылки-названия товара. Ссылку
   «Оставить отзыв» оно задевало по ошибке: селектор с типом элемента весит
   больше, чем правило самой ссылки ниже, поэтому она наследовала чёрный
   и на чёрном фоне давала контраст 1.07:1 — то есть была невидима.
   04.08.2026 */
body.iq-variant-techspec.page-template-page-personal .personal__order-copy a:not(.personal__review-link) {
  color: inherit;
  text-decoration: none;
}

body.iq-variant-techspec.page-template-page-personal .personal__order-details .personal__text {
  color: var(--iq-fg-primary);
  font-family: var(--iq-font);
  font-size: 14px;
  font-weight: 600;
  line-height: 1.35;
}

body.iq-variant-techspec.page-template-page-personal .personal__order-copy > a:hover .personal__text,
body.iq-variant-techspec.page-template-page-personal .personal__order-copy > a:focus-visible .personal__text {
  color: var(--iq-action-primary);
}

body.iq-variant-techspec.page-template-page-personal .personal__review-link {
  display: inline-block;
  margin-top: 8px;
  color: var(--iq-action-primary);
  font-family: var(--iq-font);
  font-size: 12px;
  line-height: 1.4;
  text-decoration: none;
  border-bottom: 1px dashed rgba(110, 231, 255, .5);
}

body.iq-variant-techspec.page-template-page-personal .personal__review-link:hover,
body.iq-variant-techspec.page-template-page-personal .personal__review-link:focus-visible {
  border-bottom-color: var(--iq-action-primary);
}

/* --- Ссылки выдачи: файл и видео. Тип носителя подписан текстом, а не
   только цветом иконки. --- */
body.iq-variant-techspec.page-template-page-personal .personal__download-wrap {
  display: flex;
  flex-direction: column;
  gap: 8px;
  min-width: 0;
}

body.iq-variant-techspec.page-template-page-personal .personal__download-link,
body.iq-variant-techspec.page-template-page-personal .personal__video-link {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  min-height: 44px;
  padding: 9px 12px;
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
  color: var(--iq-fg-primary);
  font-family: var(--iq-font);
  font-size: 13px;
  line-height: 1.35;
  text-align: left;
  text-decoration: none;
  cursor: pointer;
  transition: border-color .18s ease, background .18s ease;
}

body.iq-variant-techspec.page-template-page-personal .personal__download-link::before {
  content: 'FILE';
  flex: 0 0 auto;
  padding: 3px 6px;
  border: 1px solid var(--iq-hair-strong);
  color: var(--iq-fg-muted);
  font: 600 9px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
}

body.iq-variant-techspec.page-template-page-personal .personal__video-link::before {
  content: 'VIDEO';
  flex: 0 0 auto;
  padding: 3px 6px;
  border: 1px solid rgba(110, 231, 255, .45);
  color: var(--iq-action-primary);
  font: 600 9px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
}

body.iq-variant-techspec.page-template-page-personal .personal__download-link:hover,
body.iq-variant-techspec.page-template-page-personal .personal__download-link:focus-visible,
body.iq-variant-techspec.page-template-page-personal .personal__video-link:hover,
body.iq-variant-techspec.page-template-page-personal .personal__video-link:focus-visible {
  border-color: var(--iq-action-primary);
  background: var(--iq-bg-surface-raised);
}

body.iq-variant-techspec.page-template-page-personal .personal__download-link svg,
body.iq-variant-techspec.page-template-page-personal .personal__video-link svg {
  flex: 0 0 auto;
  fill: currentColor;
  opacity: .8;
}

/* Истёкший доступ. Выглядит как строка файла, но приглушённой и пунктиром —
   покупатель должен узнать в ней свою покупку и сразу увидеть, что кнопки
   здесь нет не по ошибке. Не интерактивна: нажимать нечего. 04.08.2026 */
body.iq-variant-techspec.page-template-page-personal .personal__download-expired {
  display: flex;
  flex-direction: column;
  width: 100%;
  padding: 9px 12px;
  border: 1px dashed var(--iq-hair-strong);
  border-radius: var(--iq-radius-panel);
  color: var(--iq-fg-muted);
  font-family: var(--iq-font);
  font-size: 13px;
  line-height: 1.35;
}

/* Срок действия ссылки — служебная строка. Восклицательного знака здесь
   больше нет: он ставился, когда строка сообщала про остаток скачиваний и
   читалась как предупреждение. Лимит скачиваний снят у всех товаров, строка
   осталась чисто справочной («активна до …»), и «!» перед ней выглядит как
   ошибка там, где ничего не случилось. */
body.iq-variant-techspec.page-template-page-personal .active_for_link {
  display: block;
  margin-top: 4px;
  color: var(--iq-fg-muted);
  font: 600 10px/1.4 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  font-variant-numeric: tabular-nums;
}

body.iq-variant-techspec.page-template-page-personal .active_for_link::before {
  content: none;
}

/* --------------------------------------------------------------------------
   7. ПУСТОЕ СОСТОЯНИЕ
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.page-template-page-personal .personal__orders-empty {
  padding: 40px 24px 44px;
  border: 1px dashed var(--iq-hair-strong);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
  text-align: left;
}

body.iq-variant-techspec.page-template-page-personal .personal__orders-empty-title {
  margin: 0 0 10px;
  color: var(--iq-fg-primary);
  font-family: var(--iq-display);
  font-weight: 700;
  font-size: clamp(20px, 2.4vw, 28px);
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}

body.iq-variant-techspec.page-template-page-personal .personal__orders-empty p {
  max-width: 52ch;
  margin: 0 0 22px;
  color: var(--iq-fg-muted);
  font-family: var(--iq-font);
  font-size: 14px;
  line-height: 1.55;
}

/* --------------------------------------------------------------------------
   8. КНОПКИ КАБИНЕТА И ФОКУС
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.page-template-page-personal .personal__edit-btn,
body.iq-variant-techspec.page-template-page-personal .personal__logout,
body.iq-variant-techspec.page-template-page-personal .personal__orders-empty-action,
body.iq-variant-techspec.page-template-page-lk-edit .personal__info > .btn[name='save'] {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  padding: 12px 20px;
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-canvas);
  color: var(--iq-fg-primary);
  font: 600 11px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  text-decoration: none;
  cursor: pointer;
  transition: background .18s ease, color .18s ease, border-color .18s ease;
}

body.iq-variant-techspec.page-template-page-personal .personal__edit-btn,
body.iq-variant-techspec.page-template-page-personal .personal__orders-empty-action,
body.iq-variant-techspec.page-template-page-lk-edit .personal__info > .btn[name='save'] {
  border-color: var(--iq-action-primary);
  background: var(--iq-action-primary);
  color: var(--iq-button-primary-fg);
}

body.iq-variant-techspec.page-template-page-personal .personal__edit-btn:hover,
body.iq-variant-techspec.page-template-page-personal .personal__orders-empty-action:hover,
body.iq-variant-techspec.page-template-page-lk-edit .personal__info > .btn[name='save']:hover {
  background: var(--iq-fg-primary);
  border-color: var(--iq-fg-primary);
  color: var(--iq-bg-canvas);
}

body.iq-variant-techspec.page-template-page-personal .personal__logout:hover,
body.iq-variant-techspec.page-template-page-personal .personal__logout:focus-visible {
  border-color: var(--iq-action-primary);
  color: var(--iq-action-primary);
}

body.iq-variant-techspec.page-template-page-lk-edit .personal__info > .btn[name='save'] {
  margin-top: 24px;
  min-width: 200px;
}

/* Единый видимый фокус-ринг на всей авторизованной зоне. */
body.iq-variant-techspec.page-template-page-personal a:focus-visible,
body.iq-variant-techspec.page-template-page-personal button:focus-visible,
body.iq-variant-techspec.page-template-page-personal input:focus-visible,
body.iq-variant-techspec.page-template-page-lk-edit a:focus-visible,
body.iq-variant-techspec.page-template-page-lk-edit button:focus-visible,
body.iq-variant-techspec.page-template-page-lk-edit input:focus-visible {
  outline: 2px solid var(--iq-action-primary);
  outline-offset: 2px;
}

/* --------------------------------------------------------------------------
   9. ФОРМА РЕДАКТИРОВАНИЯ ПРОФИЛЯ
   Подписи полей лежат отдельной колонкой в разметке, поэтому пара
   «подпись — поле» держится только выравниванием строк. Колонки не
   схлопываются даже на 390px: иначе связь подписи и поля теряется.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.page-template-page-lk-edit .personal__fields {
  display: grid;
  grid-template-columns: minmax(120px, 220px) minmax(0, 1fr);
  align-items: start;
  gap: 0 20px;
}

/* Ритм строк.
   Подписи и поля — две независимые колонки, а не строки; совпадают они только
   пока шаг одинаковый. Он был разным: подпись 64px, поле 84px за счёт отступа
   снизу. К концу формы подпись врала — поле пароля стояло напротив «VK».
   Поэтому высота и отбивка задаются обеим колонкам одним и тем же числом. */
body.iq-variant-techspec.page-template-page-lk-edit .personal__field-name--padding {
  min-height: 64px;
  margin: 0 0 20px;
  align-items: center;
}

body.iq-variant-techspec.page-template-page-lk-edit .personal__field-value {
  display: block;
  min-height: 64px;
  margin: 0 0 20px;
  padding-bottom: 0;
}

body.iq-variant-techspec.page-template-page-lk-edit .personal__field-input,
body.iq-variant-techspec.page-template-page-lk-edit .input {
  width: 100%;
  min-height: 48px;
  padding: 12px 14px;
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-radius-input);
  background: var(--iq-input-bg);
  color: var(--iq-fg-primary);
  font-family: var(--iq-font);
  font-size: 15px;
  line-height: 1.3;
  box-shadow: none;
  transition: border-color .18s ease, background .18s ease;
}

body.iq-variant-techspec.page-template-page-lk-edit .personal__field-input::placeholder {
  color: var(--iq-fg-muted);
  opacity: 1;
}

body.iq-variant-techspec.page-template-page-lk-edit .personal__field-input:hover {
  border-color: rgba(232, 236, 240, .3);
}

body.iq-variant-techspec.page-template-page-lk-edit .personal__field-input:focus {
  border-color: var(--iq-action-primary);
  background: var(--iq-bg-surface-raised);
}

body.iq-variant-techspec.page-template-page-lk-edit .personal__error {
  display: block;
  margin-bottom: 16px;
  padding: 12px 14px;
  border: 1px solid rgba(232, 236, 240, .28);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface-raised);
  color: var(--iq-fg-primary);
  font-family: var(--iq-font);
  font-size: 13px;
  line-height: 1.45;
}

body.iq-variant-techspec.page-template-page-lk-edit .personal__error::before {
  content: 'Ошибка · ';
  color: var(--iq-fg-muted);
  font-weight: 600;
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  font-size: 10px;
}

/* --------------------------------------------------------------------------
   10. ИЗБРАННОЕ (page-favorites.php)
   У шаблона нет Template Name, поэтому опора — связка «.page + разметка
   каталога»: архивы каталога класс .page не несут, а cart/checkout не
   используют .main-catalog.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.page .main-catalog__inner {
  background: transparent;
}

body.iq-variant-techspec.page .main-catalog__title {
  color: var(--iq-fg-primary);
  font-family: var(--iq-display);
  font-weight: 700;
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}

body.iq-variant-techspec.page .main-catalog__subtitle {
  color: var(--iq-fg-primary);
  font-family: var(--iq-display);
  font-weight: 700;
  font-size: clamp(20px, 2.4vw, 28px);
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}

body.iq-variant-techspec.page .main-catalog__text {
  color: var(--iq-fg-muted);
  font-family: var(--iq-font);
  font-size: 14px;
  line-height: 1.55;
}

body.iq-variant-techspec.page .main-catalog__link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  margin-top: 18px;
  padding: 12px 22px;
  border: 1px solid var(--iq-action-primary);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-action-primary);
  color: var(--iq-button-primary-fg);
  font: 600 11px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  text-decoration: none;
}

body.iq-variant-techspec.page .main-catalog__link:hover,
body.iq-variant-techspec.page .main-catalog__link:focus-visible {
  border-color: var(--iq-fg-primary);
  background: var(--iq-fg-primary);
  color: var(--iq-bg-canvas);
}

/* Плиты избранного: тот же чертёж, что и в каталоге, но подложка-плита под
   сетку не подставляется — количество карточек в избранном произвольное,
   недозаполненный ряд закрасился бы серым. Швы — бордеры самих карточек. */
body.iq-variant-techspec.page .main-catalog__list > .catalog-item {
  border: 1px solid var(--iq-hair);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-card-bg);
}

body.iq-variant-techspec.page .main-catalog__list > .catalog-item:hover,
body.iq-variant-techspec.page .main-catalog__list > .catalog-item:focus-within {
  border-color: var(--iq-hair-strong);
  background: var(--iq-card-bg-hover);
}

body.iq-variant-techspec.page .main-catalog__list > .catalog-item a:focus-visible,
body.iq-variant-techspec.page .main-catalog__list > .catalog-item button:focus-visible {
  outline: 2px solid var(--iq-action-primary);
  outline-offset: 2px;
}

/* --------------------------------------------------------------------------
   11. АДАПТИВ  (1440 / 1100 / 760 / 390)
   -------------------------------------------------------------------------- */
@media (max-width: 1100px) {
  body.iq-variant-techspec.page-template-page-personal .personal__fields {
    grid-template-columns: minmax(150px, 220px) minmax(0, 1fr);
  }
  /* Кэшбэк уходит на всю ширину под таблицу параметров. */
  body.iq-variant-techspec.page-template-page-personal .personal__cashback {
    grid-column: 1 / -1;
    margin-top: 20px;
  }
  body.iq-variant-techspec.page-template-page-personal .personal__headers-row,
  body.iq-variant-techspec.page-template-page-personal .personal__order-summary {
    grid-template-columns: minmax(96px, 1fr) minmax(80px, .6fr) minmax(100px, .75fr) minmax(104px, .75fr) 132px;
    gap: 10px;
  }
  body.iq-variant-techspec.page-template-page-personal .personal__order-details-row {
    grid-template-columns: minmax(180px, 1.5fr) minmax(80px, .45fr) minmax(190px, 1.1fr);
  }
}

@media (max-width: 760px) {
  body.iq-variant-techspec.page-template-page-personal .personal__hero {
    align-items: flex-start;
  }

  /* Реестр перестраивается в две колонки вместо горизонтального скролла;
     overflow-x на обёртке оставлен страховкой на случай длинных номеров. */
  body.iq-variant-techspec.page-template-page-personal .personal__orders-wrap {
    overflow-x: auto;
  }
  body.iq-variant-techspec.page-template-page-personal .personal__headers-row {
    display: none;
  }
  body.iq-variant-techspec.page-template-page-personal .personal__order-summary {
    grid-template-columns: minmax(0, 1fr) minmax(0, auto);
    align-items: start;
    row-gap: 10px;
    padding: 16px;
  }
  body.iq-variant-techspec.page-template-page-personal .personal__order-summary .personal__col-4 {
    grid-column: 1 / -1;
  }
  /* Без шапки таблицы значения подписываются сами. */
  body.iq-variant-techspec.page-template-page-personal .personal__order-summary .personal__col-2::before,
  body.iq-variant-techspec.page-template-page-personal .personal__order-summary .personal__col-3::before {
    display: block;
    margin-bottom: 3px;
    color: var(--iq-fg-muted);
    font: 600 9px/1 var(--iq-font);
    letter-spacing: var(--iq-label-tracking);
    text-transform: uppercase;
  }
  body.iq-variant-techspec.page-template-page-personal .personal__order-summary .personal__col-2::before {
    content: 'Сумма';
  }
  body.iq-variant-techspec.page-template-page-personal .personal__order-summary .personal__col-3::before {
    content: 'Дата';
  }
  body.iq-variant-techspec.page-template-page-personal .personal__order-summary .personal__col-2,
  body.iq-variant-techspec.page-template-page-personal .personal__order-summary .personal__col-3 {
    text-align: right;
  }

  body.iq-variant-techspec.page-template-page-personal .personal__order-details {
    padding: 0 16px 12px;
  }
  body.iq-variant-techspec.page-template-page-personal .personal__order-details-row {
    grid-template-columns: minmax(0, 1fr);
    gap: 12px;
  }

  /* Колонка с названием товара не занимала колонку сетки: на 390 px ей
     доставалось 86 px, и название вроде «101% CLUBSOUND Amsterdam 2022»
     ломалось на семь строк высотой 151 px. Растягивание через justify-self
     здесь не работает — сетка не тянет этот элемент, помогает только явная
     ширина. С ней заголовок укладывается в 57 px. 04.08.2026 */
  body.iq-variant-techspec.page-template-page-personal .personal__col-1,
  body.iq-variant-techspec.page-template-page-personal .personal__order-name,
  body.iq-variant-techspec.page-template-page-personal .personal__order-copy {
    width: 100%;
    min-width: 0;
  }

  body.iq-variant-techspec.page-template-page-personal .personal__fields {
    grid-template-columns: minmax(130px, 190px) minmax(0, 1fr);
    gap: 0 16px;
  }
}

@media (max-width: 430px) {
  body.iq-variant-techspec.page-template-page-personal .personal__inner,
  body.iq-variant-techspec.page-template-page-lk-edit .personal__inner {
    padding-top: 4px;
  }
  body.iq-variant-techspec.page-template-page-personal .personal__info,
  body.iq-variant-techspec.page-template-page-lk-edit .personal__info {
    padding: 18px 14px 20px;
  }
  body.iq-variant-techspec.page-template-page-personal .personal__orders-heading {
    padding: 16px 14px 14px;
  }
  body.iq-variant-techspec.page-template-page-personal .personal__order-summary {
    padding: 14px;
  }
  body.iq-variant-techspec.page-template-page-personal .personal__order-details {
    padding: 0 14px 12px;
  }
  body.iq-variant-techspec.page-template-page-personal .personal__order-cover img {
    width: 52px;
    height: 52px;
  }
  body.iq-variant-techspec.page-template-page-personal .personal__info-row {
    flex-direction: column;
    align-items: stretch;
  }
  body.iq-variant-techspec.page-template-page-personal .personal__cashback {
    flex-direction: column;
  }
  body.iq-variant-techspec.page-template-page-personal .personal__cashback-image {
    display: none;
  }
  /* Подписи полей остаются рядом со значениями — пара не должна разрываться. */
  body.iq-variant-techspec.page-template-page-personal .personal__fields,
  body.iq-variant-techspec.page-template-page-lk-edit .personal__fields {
    grid-template-columns: minmax(96px, 118px) minmax(0, 1fr);
    gap: 0 12px;
  }
  /* Колонка значений занимала 115 px из отведённых сеткой 230, из-за чего почта
     рвалась посреди слова: «am0955w@gm / ail.com», а телефон — по дефису.
     Причина — жёсткая ширина у колонки в базовой теме (сначала 230px, потом
     50% в её же медиазапросе). Пока ширина задана явно, justify-self: stretch
     не действует, поэтому обнуляем именно её. 04.08.2026 */
  body.iq-variant-techspec.page-template-page-personal .personal__fields-column,
  body.iq-variant-techspec.page-template-page-lk-edit .personal__fields-column {
    width: auto;
    min-width: 0;
    justify-self: stretch;
  }
  body.iq-variant-techspec.page-template-page-personal .personal__field-name,
  body.iq-variant-techspec.page-template-page-lk-edit .personal__field-name {
    letter-spacing: var(--iq-label-tracking);
  }
}

/* --------------------------------------------------------------------------
   12. REDUCED MOTION
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  body.iq-variant-techspec.page-template-page-personal .personal__order,
  body.iq-variant-techspec.page-template-page-personal .personal__spoiler-btn,
  body.iq-variant-techspec.page-template-page-personal .personal__download-link,
  body.iq-variant-techspec.page-template-page-personal .personal__video-link,
  body.iq-variant-techspec.page-template-page-lk-edit .personal__field-input {
    transition-duration: .001ms;
  }
}

/* --- Статус заказа --------------------------------------------------------
   Реестр показывал номер, сумму и дату, но не состояние заказа, — понять,
   оплачен он или ждёт оплаты, было неоткуда.

   Статус набирается служебной подписью и несёт квадратную метку. Метка —
   вспомогательная: смысл несёт слово, потому что по цвету одному различить
   состояния может не каждый. */
body.iq-variant-techspec.page-template-page-personal .personal__status {
  display: inline-flex;
  align-items: center;
  gap: var(--iq-gap-2);
  color: var(--iq-fg-muted);
  font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.page-template-page-personal .personal__status::before {
  content: "";
  width: 7px;
  height: 7px;
  flex: 0 0 7px;
  background: currentColor;
}
body.iq-variant-techspec.page-template-page-personal .personal__status--done {
  color: var(--iq-success);
}
body.iq-variant-techspec.page-template-page-personal .personal__status--stopped {
  color: var(--iq-danger);
}

@media (max-width: 760px) {
  /* Без шапки таблицы значение подписывается само — как соседние ячейки. */
  body.iq-variant-techspec.page-template-page-personal .personal__order-summary .personal__col-status {
    grid-column: 1 / -1;
  }
}

/* Ячейки реестра несут процентную ширину из базовой темы (`.personal__col-4`
   доходит до 10%). Внутри сетки явная ширина перебивает дорожку, и колонка с
   кнопкой «Подробнее» схлопывалась до 31px, обрезая надпись. Ширину задаёт
   сетка — ячейки её не переопределяют. */
body.iq-variant-techspec.page-template-page-personal .personal__headers-row > *,
body.iq-variant-techspec.page-template-page-personal .personal__order-summary > * {
  width: auto;
  min-width: 0;
}

/* Кнопка оплаты висящего заказа.
   ---------------------------------------------------------------------------
   Ячейка действий рассчитана на одну кнопку, и вторая наезжала на «Подробнее»
   в обеих версиях. Правило единственное во всём слое, которое не привязано к
   варианту: кнопка уходит в разметку обеих версий, значит и разъезжаться им
   надо в обеих. Отбор через :has() держит правку узкой — строки без кнопки
   оплаты (а это все остальные) остаются ровно такими, какими были. */
.page-template-page-personal .personal__col-4:has(.personal__pay-btn) {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  justify-content: flex-end;
  align-items: center;
}

/* Оплатить — главное действие у висящего заказа, поэтому цвет акцента, как у
   «Редактировать» выше. «Подробнее» рядом остаётся вторичной: две одинаково
   яркие кнопки в строке заставляют выбирать там, где выбора нет. */
body.iq-variant-techspec.page-template-page-personal .personal__pay-btn {
  border-color: var(--iq-action-primary);
  background: var(--iq-action-primary);
  color: var(--iq-button-primary-fg);
}

body.iq-variant-techspec.page-template-page-personal .personal__pay-btn:hover,
body.iq-variant-techspec.page-template-page-personal .personal__pay-btn:focus-visible {
  background: var(--iq-fg-primary);
  border-color: var(--iq-fg-primary);
  color: var(--iq-bg-canvas);
}

/* --- 71-referral.css --- */
/* ==========================================================================
   71-referral.css — блок реферальной программы в личном кабинете
   --------------------------------------------------------------------------
   Область: только body.iq-variant-techspec.page-template-page-personal.
   Как и в 70-account.css, каждый селектор начинается с варианта темы:
   editorial остаётся боевым видом сайта, любая протечка ломает прод.

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

   Все цвета и радиусы взяты существующими токенами темы (--iq-fg-primary,
   --iq-fg-muted, --iq-action-primary, --iq-hair-strong и т. д.). Своих
   значений файл не вводит и на :root ничего не объявляет — по той же
   причине, что описана в шапке 70-account.css: темы переопределяют токены
   на body, и производный токен с :root замёрз бы на базовой палитре.

   Поле ссылки намеренно readonly, а не disabled: disabled нельзя выделить
   и скопировать вручную, а копирование через кнопку доступно не везде
   (Clipboard API требует защищённого контекста и разрешения).

   Адаптив: 1440 / 1100 / 760 / 390. На узком ссылка и кнопка встают в столбец.
   04.08.2026
   ========================================================================== */

body.iq-variant-techspec.page-template-page-personal .iq-ref {
  margin: 32px 0 0;
  padding: var(--iq-panel-pad);
  background: var(--iq-bg-surface);
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-panel-radius);
}

body.iq-variant-techspec.page-template-page-personal .iq-ref__eyebrow {
  display: block;
  font: var(--iq-label-weight) var(--iq-label-size) / var(--iq-label-leading) var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking-wide);
  text-transform: uppercase;
  color: var(--iq-action-primary);
}

body.iq-variant-techspec.page-template-page-personal .iq-ref__title {
  margin: 8px 0 0;
  font-family: var(--iq-heading-font);
  font-weight: var(--iq-heading-weight);
  letter-spacing: var(--iq-heading-tracking);
  line-height: var(--iq-heading-leading);
  font-size: clamp(22px, 2.4vw, 30px);
  color: var(--iq-fg-primary);
}

body.iq-variant-techspec.page-template-page-personal .iq-ref__lead {
  margin: 10px 0 0;
  max-width: 60ch;
  color: var(--iq-fg-muted);
}

/* --------------------------------------------------------------------------
   Строка со ссылкой.
   min-width: 0 на поле обязателен: без него flex-ребёнок отказывается
   сжиматься под длинный адрес и выдавливает кнопку за край панели.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.page-template-page-personal .iq-ref__linkrow {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
  margin: 18px 0 0;
}

body.iq-variant-techspec.page-template-page-personal .iq-ref__linklabel {
  flex: 0 0 100%;
  font: var(--iq-label-weight) var(--iq-label-size) / var(--iq-label-leading) var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  color: var(--iq-fg-muted);
}

body.iq-variant-techspec.page-template-page-personal .iq-ref__link {
  flex: 1 1 260px;
  min-width: 0;
  height: var(--iq-field-h);
  padding: 0 12px;
  font-family: var(--iq-font);
  font-size: 14px;
  letter-spacing: var(--iq-numeric-tracking);
  color: var(--iq-fg-primary);
  background: var(--iq-bg-canvas);
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-radius-input, 8px);
}

body.iq-variant-techspec.page-template-page-personal .iq-ref__copy {
  flex: 0 0 auto;
  height: var(--iq-control-h);
  padding: 0 18px;
  font: var(--iq-label-weight) 12px / 1 var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  color: var(--iq-bg-canvas);
  background: var(--iq-action-primary);
  border: 0;
  border-radius: var(--iq-radius-input, 8px);
  cursor: pointer;
}

body.iq-variant-techspec.page-template-page-personal .iq-ref__copy:hover,
body.iq-variant-techspec.page-template-page-personal .iq-ref__copy:focus-visible {
  filter: brightness(1.12);
}

/* Состояние «скопировано» ставится скриптом на 2 секунды. */
body.iq-variant-techspec.page-template-page-personal .iq-ref__copy.is-copied {
  background: var(--iq-success, #4ade80);
}

/* --------------------------------------------------------------------------
   Счётчики. auto-fit, а не три колонки жёстко: на узком экране ячейки
   перестраиваются сами, и подпись в две строки не ломает соседей.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.page-template-page-personal .iq-ref__stats {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: 1px;
  margin: 20px 0 0;
  background: var(--iq-hair-strong);
  border: 1px solid var(--iq-hair-strong);
}

body.iq-variant-techspec.page-template-page-personal .iq-ref__stat {
  padding: 14px 16px;
  background: var(--iq-bg-surface);
}

body.iq-variant-techspec.page-template-page-personal .iq-ref__stat dt {
  font: var(--iq-label-weight) var(--iq-label-size) / 1.3 var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  color: var(--iq-fg-muted);
}

body.iq-variant-techspec.page-template-page-personal .iq-ref__stat dd {
  margin: 6px 0 0;
  font-family: var(--iq-font);
  font-size: 26px;
  line-height: 1;
  color: var(--iq-fg-primary);
}

body.iq-variant-techspec.page-template-page-personal .iq-ref__empty,
body.iq-variant-techspec.page-template-page-personal .iq-ref__legal {
  margin: 14px 0 0;
  font-size: 13px;
  color: var(--iq-fg-muted);
}

body.iq-variant-techspec.page-template-page-personal .iq-ref__legal a {
  color: var(--iq-action-primary);
  text-decoration: underline;
  text-underline-offset: 3px;
}

@media (max-width: 480px) {
  body.iq-variant-techspec.page-template-page-personal .iq-ref__link,
  body.iq-variant-techspec.page-template-page-personal .iq-ref__copy {
    flex: 1 1 100%;
  }
}

/* --- 80-auth.css --- */
/* ==========================================================================
   80-auth.css — Tech Spec: вход / регистрация / восстановление пароля
   Затрагиваемые шаблоны: page-auth.php, page-reg.php, page-forget-pass.php
   Общий контейнер разметки во всех трёх — <section class="login">.

   Каждое правило начинается с body.iq-variant-techspec — тема editorial
   не должна получить ни одной протёкшей строки. Переменные не объявляются
   на :root (только внутри самого правила techspec), чтобы не заморозить
   производные токены на базовой палитре.

   КОНТРАСТЫ (WCAG 2.x, relative luminance; фон плиты #131519):
     #e8ecf0 на #131519 — 15.7:1   основной текст, подписи полей       AAA
     #b8c0cc на #131519 — 10.2:1   ссылки, значения                    AAA
     #7d8794 на #131519 —  5.12:1  служебные подписи, hint             AA
     #0b0c0e на #6ee7ff — 13.6:1   текст на кнопке-акценте             AAA
     #ff5a67 на #131519 —  6.01:1  текст ошибки (единый var(--iq-danger))  AA
   Всё, что тусклее #7d8794, в тексте не используется. Текст ошибки теперь
   берёт единый var(--iq-danger) из 05-components.css (#ff5a67) — локальная
   переопределённая переменная --iq-danger: #ffb4a8 отсюда удалена.
   ========================================================================== */

/* --------------------------------------------------------------------------
   0. Каркас страницы и плита формы
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.page-template-page-auth .login,
body.iq-variant-techspec.page-template-page-reg .login,
body.iq-variant-techspec .page-template-page-forget-pass .login,
body.iq-variant-techspec.page-template-page-forget-pass .login {
  background: var(--iq-bg-canvas);
  padding: 48px 0 96px;
}

body.iq-variant-techspec .breadcrumbs { background: transparent; border-bottom: 1px solid var(--iq-hair, rgba(232,236,240,.10)); }
body.iq-variant-techspec .breadcrumbs * { color: var(--iq-fg-muted); font-size: 12px; letter-spacing: var(--iq-numeric-tracking); }

body.iq-variant-techspec .login__inner {
  position: relative;
  width: min(100% - 32px, 460px);
  margin: 0 auto;
  padding: 34px 30px 30px;
  background: var(--iq-bg-surface);
  border: 1px solid var(--iq-hair, rgba(232,236,240,.10));
  border-radius: var(--iq-panel-radius);
  box-shadow: none;
}
/* угловые реперы плиты — приём из 20-product.css/styleframe, чисто декоративно */
body.iq-variant-techspec .login__inner::before,
body.iq-variant-techspec .login__inner::after {
  content: "";
  position: absolute;
  width: 10px;
  height: 10px;
  border: 1px solid var(--iq-action-signal, #b8c0cc);
  opacity: .55;
  pointer-events: none;
}
body.iq-variant-techspec .login__inner::before { top: 8px; left: 8px; border-right: 0; border-bottom: 0; }
body.iq-variant-techspec .login__inner::after { bottom: 8px; right: 8px; border-left: 0; border-top: 0; }

/* служебная подпись над формой — «Sheet · AUTH-01» */
body.iq-variant-techspec .login__title {
  position: relative;
  margin: 0 0 22px;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--iq-hair, rgba(232,236,240,.10));
  color: var(--iq-fg-primary);
  font-family: var(--iq-display), system-ui, sans-serif;
  font-size: clamp(22px, 3vw, 30px);
  font-weight: 700;
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
  text-align: left;
}
body.iq-variant-techspec .login__title::before {
  content: "AUTH SHEET · REV 01";
  display: block;
  margin-bottom: 10px;
  font-family: var(--iq-font), sans-serif;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  color: var(--iq-fg-muted);
}
body.iq-variant-techspec.page-template-page-reg .login__title::before { content: "AUTH SHEET · REGISTRATION"; }
body.iq-variant-techspec.page-template-page-forget-pass .login__title::before,
body.iq-variant-techspec .page-template-page-forget-pass .login__title::before { content: "AUTH SHEET · RECOVERY"; }

body.iq-variant-techspec .login__intro {
  margin: -8px 0 22px;
  color: var(--iq-fg-muted);
  font-size: 13px;
  line-height: 1.55;
}

/* --------------------------------------------------------------------------
   1. Соцвход
   -------------------------------------------------------------------------- */
body.iq-variant-techspec .login__socials { margin: 0 0 22px; }
body.iq-variant-techspec .login__socials-hint {
  margin: 0 0 10px;
  color: var(--iq-fg-muted);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

/* Пояснение над формой: что произойдёт после нажатия. Набирается как обычный
   текст, а не как служебная подпись, — его читают, а не сканируют. */
.login__hint { display: none; }
body.iq-variant-techspec .login__hint {
  display: block;
  max-width: 46ch;
  margin: 0 0 22px;
  color: var(--iq-fg-muted);
  font-family: var(--iq-font);
  font-size: 13px;
  line-height: 1.55;
}

/* --------------------------------------------------------------------------
   2. Поля формы: видимая подпись, прямоугольник, min-height 44px
   -------------------------------------------------------------------------- */
body.iq-variant-techspec .login__form {
  display: flex;
  flex-direction: column;
}

body.iq-variant-techspec .login__field-label {
  display: block;
  margin: 16px 0 6px;
  color: var(--iq-fg-primary);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec .login__form > .login__field-label:first-child { margin-top: 0; }
/* Знак обязательности показывается в обеих версиях — редкий случай, когда так
   и надо. Звёздочка переехала из подсказки в подпись, и если спрятать её в
   боевом виде, там просто не останется указания на обязательность поля. */
body.iq-variant-techspec .login__required { color: var(--iq-action-primary); }

body.iq-variant-techspec .login__form .input {
  min-height: 44px;
  padding: 10px 14px;
  border: 1px solid var(--iq-hair-strong, rgba(232,236,240,.18));
  border-radius: var(--iq-field-radius);
  background: var(--iq-bg-canvas);
  color: var(--iq-fg-primary);
  font-family: var(--iq-font), sans-serif;
  font-size: 15px;
  line-height: 1.3;
  box-shadow: none;
  transition: border-color .15s ease;
}
body.iq-variant-techspec .login__form .input::placeholder { color: var(--iq-fg-muted); opacity: .8; }
body.iq-variant-techspec .login__form .input:hover { border-color: var(--iq-action-signal, #b8c0cc); }
body.iq-variant-techspec .login__form .input:focus {
  border-color: var(--iq-action-primary, #6ee7ff);
  outline: 2px solid var(--iq-action-primary, #6ee7ff);
  outline-offset: 1px;
}
/* браузерный автозаполнитель не должен перекрашивать поле под светлую тему */
body.iq-variant-techspec .login__form .input:-webkit-autofill {
  -webkit-text-fill-color: var(--iq-fg-primary);
  -webkit-box-shadow: 0 0 0 1000px var(--iq-bg-canvas) inset;
  caret-color: var(--iq-fg-primary);
}

/* сообщение об ошибке рядом с полем — с описанием, что исправить */
body.iq-variant-techspec .login__error {
  display: block;
  margin: 6px 0 0;
  padding-left: 12px;
  border-left: 2px solid var(--iq-danger);
  color: var(--iq-danger);
  font-size: 12px;
  line-height: 1.45;
}

/* если под ошибкой сразу идёт подпись следующего поля — не удваивать отступ */
body.iq-variant-techspec .login__error + .login__field-label { margin-top: 14px; }

/* --- Показать/скрыть пароль ------------------------------------------------
   Кнопки в теме не было; её ставит iq-password-toggle.js, оборачивая поле.
   Кнопка занимает правый край поля, а полю добавляется отступ, чтобы текст
   пароля под неё не заезжал. Глаз рисуется бордюрами, а не шрифтовой иконкой:
   спрайта под это в теме нет, а эмодзи в интерфейсе не место. */
body.iq-variant-techspec .iq-password {
  position: relative;
  display: block;
}
body.iq-variant-techspec .iq-password > .input {
  width: 100%;
  padding-right: 52px;
}
body.iq-variant-techspec .iq-password__toggle {
  position: absolute;
  top: 50%;
  right: 4px;
  transform: translateY(-50%);
  width: var(--iq-control-h);
  height: var(--iq-control-h);
  padding: 0;
  border: 0;
  background: none;
  color: var(--iq-fg-muted);
  cursor: pointer;
}
body.iq-variant-techspec .iq-password__toggle:hover,
body.iq-variant-techspec .iq-password__toggle:focus-visible {
  color: var(--iq-action-primary);
}
body.iq-variant-techspec .iq-password__toggle svg {
  display: block;
  margin: auto;
}
/* Значок перечёркнут, пока пароль скрыт, и открывается, когда его показали:
   состояние читается по форме, а не только по цвету. */
body.iq-variant-techspec .iq-password__toggle[aria-pressed="true"] {
  color: var(--iq-action-primary);
}
body.iq-variant-techspec .iq-password__toggle[aria-pressed="true"] .iq-password__strike {
  display: none;
}


/* --------------------------------------------------------------------------
   3. Чекбокс «запомнить меня» / согласие на обработку ПДн
   -------------------------------------------------------------------------- */
body.iq-variant-techspec .login__checkbox {
  position: relative;
  display: flex;
  align-items: flex-start;
  gap: 10px;
  margin: 18px 0 0;
  padding-left: 0;
  min-height: 44px;
  color: var(--iq-fg-primary);
  font-size: 13px;
  line-height: 1.45;
  cursor: pointer;
}
body.iq-variant-techspec .login__checkbox::before {
  content: "";
  /* The base theme positions this box absolutely at the left edge, which takes
     it out of the flex flow and drops it on top of the label text. */
  position: static;
  flex: 0 0 auto;
  width: 18px;
  height: 18px;
  margin-top: 12px;
  border: 1px solid var(--iq-hair-strong, rgba(232,236,240,.18));
  border-radius: var(--iq-field-radius);
  background: var(--iq-bg-canvas);
  transition: border-color .15s ease, background .15s ease;
}
body.iq-variant-techspec .checkbox:checked + .login__checkbox::before {
  border-color: var(--iq-action-primary, #6ee7ff);
  background: var(--iq-action-primary, #6ee7ff);
  background-image:
    linear-gradient(45deg, transparent 42%, var(--iq-bg-canvas) 42% 58%, transparent 58%),
    linear-gradient(-45deg, transparent 55%, var(--iq-bg-canvas) 55% 68%, transparent 68%);
}
body.iq-variant-techspec .checkbox:focus-visible + .login__checkbox::before {
  outline: 2px solid var(--iq-action-primary, #6ee7ff);
  outline-offset: 2px;
}
body.iq-variant-techspec .login__checkbox .checkbox__link {
  color: var(--iq-fg-primary);
  text-decoration: underline;
  text-underline-offset: 2px;
}
body.iq-variant-techspec .login__checkbox .checkbox__link:hover,
body.iq-variant-techspec .login__checkbox .checkbox__link:focus-visible { color: var(--iq-action-primary, #6ee7ff); }

/* --------------------------------------------------------------------------
   4. Кнопка отправки формы и ряд под ней
   -------------------------------------------------------------------------- */
body.iq-variant-techspec .login__btn-row {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 16px;
  margin: 24px 0 0;
}

body.iq-variant-techspec .login__form .btn {
  min-height: 44px;
  padding: 10px 22px;
  border: 0;
  border-radius: var(--iq-field-radius);
  background: var(--iq-action-primary, #6ee7ff);
  color: var(--iq-bg-canvas);
  font-family: var(--iq-font), sans-serif;
  font-weight: 700;
  font-size: 12px;
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  box-shadow: none;
  transition: opacity .15s ease;
}
body.iq-variant-techspec .login__form .btn::after { display: none; content: none; } /* снимаем декоративный ::after базовой кнопки */
body.iq-variant-techspec .login__form .btn:hover { opacity: .86; }
body.iq-variant-techspec .login__form .btn:focus-visible {
  outline: 2px solid var(--iq-fg-primary);
  outline-offset: 2px;
}
body.iq-variant-techspec .login__form .btn:disabled {
  background: var(--iq-hair-strong, rgba(232,236,240,.18));
  color: var(--iq-fg-muted);
  cursor: not-allowed;
}
body.iq-variant-techspec .login__form .btn--full { width: 100%; }

/* --------------------------------------------------------------------------
   5. Ссылки: «Забыли пароль?», «Зарегистрироваться» — читаются как ссылки
   -------------------------------------------------------------------------- */
body.iq-variant-techspec .login__link {
  color: var(--iq-action-signal, #b8c0cc);
  font-size: 13px;
  font-weight: 600;
  text-decoration: underline;
  text-underline-offset: 3px;
}
body.iq-variant-techspec .login__link:hover,
body.iq-variant-techspec .login__link:focus-visible { color: var(--iq-action-primary, #6ee7ff); }
body.iq-variant-techspec .login__link:focus-visible {
  outline: 2px solid var(--iq-action-primary, #6ee7ff);
  outline-offset: 2px;
}

body.iq-variant-techspec .login__follow {
  margin: 24px 0 0;
  padding-top: 18px;
  border-top: 1px solid var(--iq-hair, rgba(232,236,240,.10));
  color: var(--iq-fg-muted);
  font-size: 13px;
  line-height: 1.5;
}
body.iq-variant-techspec .login__follow .login__link { margin-left: 4px; }

/* --------------------------------------------------------------------------
   6. Восстановление пароля: инлайновые стили в PHP красят текст напрямую
   (color: red / green) — здесь только формат блока-обёртки под моно-стиль,
   цвет остаётся тем, что задаёт сам PHP-шаблон (не в области этого файла).
   -------------------------------------------------------------------------- */
body.iq-variant-techspec .login__form > div[style*="color"] {
  margin: 12px 0 0;
  padding: 10px 14px !important;
  border: 1px solid var(--iq-hair, rgba(232,236,240,.10));
  border-radius: var(--iq-field-radius);
  background: var(--iq-bg-canvas);
  font-size: 13px;
  line-height: 1.5;
  text-align: left !important;
}

/* --------------------------------------------------------------------------
   7. Адаптив — 1440 / 1100 / 760 / 390, без горизонтального скролла
   -------------------------------------------------------------------------- */
@media (max-width: 760px) {
  body.iq-variant-techspec .login { padding: 32px 0 64px; }
  body.iq-variant-techspec .login__inner { padding: 28px 22px 24px; }
  body.iq-variant-techspec .login__btn-row { gap: 12px; }
}

@media (max-width: 430px) {
  body.iq-variant-techspec .login__inner { width: 100%; padding: 24px 16px 20px; border-left: 0; border-right: 0; border-radius: 0; }
  body.iq-variant-techspec .login__btn-row { flex-direction: column; align-items: stretch; }
  body.iq-variant-techspec .login__form .btn { width: 100%; }
  body.iq-variant-techspec .login__link { display: inline-block; }
}

/* --------------------------------------------------------------------------
   8. prefers-reduced-motion
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  body.iq-variant-techspec .login__form .input,
  body.iq-variant-techspec .login__form .btn,
  body.iq-variant-techspec .login__checkbox::before {
    transition-duration: .001ms !important;
  }
}

/* --- 90-content.css --- */
/* ==========================================================================
   90-content.css — служебные и контентные страницы в теме «Tech Spec»
   --------------------------------------------------------------------------
   Покрывает пять групп страниц с нулевым покрытием темой: ошибки (404,
   page-error), «спасибо за заказ» (page-thanks), поиск (page-search,
   search.php), новости (archive-news, single-news), обратная связь и видео
   (page-feedback, page-video, page-product-video).

   КАЖДОЕ правило начинается с body.iq-variant-techspec — editorial остаётся
   боевым видом сайта, протечка без префикса его ломает. Новых кастомных
   свойств на :root не заводится: var() внутри объявления custom property
   резолвится относительно элемента объявления, а темы переопределяют токены
   на body — производный токен на :root замёрз бы на базовой палитре.

   Не редактируются: чекаут/корзина/ЛК/авторизация и их CSS-партиалы —
   90-content.css их не касается вообще.
   ========================================================================== */

/* --------------------------------------------------------------------------
   0. ОБЩИЕ СЛУЖЕБНЫЕ КЛАССЫ (переиспользуются во всех пяти группах)
   Приём взят из dev/styleframes/02-tech-spec.html и 10-home.css: подпись
   листа перед заголовком секции, пунктир-выноска, моно-цифры.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec .iq-content-kicker {
  display: block;
  margin: 0 0 14px;
  padding: 0 0 11px;
  border-bottom: 1px solid var(--iq-hair);
  color: var(--iq-fg-muted);
  font: 600 10px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

/* --------------------------------------------------------------------------
   1. ОШИБКИ — 404.php
   Номер ошибки как индекс листа (Unbounded, крупно), служебная подпись,
   осмысленный выход: каталог + поиск, не тупик.

   `page-error.php` — отдельный файл-заглушка «Access error», а не 404: он
   строит свой <body> без классов темы, поэтому CSS до него не дотягивается.
   404 при этом зовёт `get_header()` и темой красится нормально.

   Правка PHP темы разрешена и делается (см. `404.php`, `functions.php`) —
   запрет из прежней формулировки задачи касался чужого кода на itsclub.fit.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec.error404 main,
body.iq-variant-techspec.error404 {
  background: var(--iq-bg-canvas);
}
body.iq-variant-techspec.error404 .not-found {
  position: relative;
  min-height: 62vh;
  padding: 64px var(--iq-space-5, 24px) 80px;
  border-top: 1px solid var(--iq-hair);
  background:
    repeating-linear-gradient(90deg, rgba(232, 236, 240, .028) 0 1px, transparent 1px 96px),
    repeating-linear-gradient(0deg, rgba(232, 236, 240, .028) 0 1px, transparent 1px 96px),
    var(--iq-bg-canvas);
}
body.iq-variant-techspec.error404 .not-found__inner {
  position: relative;
  max-width: 640px;
  margin: 0 auto;
  padding: 40px clamp(20px, 4vw, 48px) 44px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
  text-align: left;
}
body.iq-variant-techspec.error404 .not-found__inner::before {
  content: 'Sheet error · lookup failed';
  display: block;
  margin-bottom: 22px;
  padding-bottom: 11px;
  border-bottom: 1px solid var(--iq-hair);
  color: var(--iq-fg-muted);
  font: 600 10px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec.error404 .not-found__number {
  margin: 0;
  color: transparent;
  -webkit-text-stroke: 1.5px var(--iq-action-signal);
  font-family: var(--iq-display);
  font-weight: 700;
  font-size: clamp(64px, 14vw, 160px);
  line-height: .86;
  letter-spacing: var(--iq-heading-tracking);
}
body.iq-variant-techspec.error404 .not-found__text {
  max-width: 46ch;
  margin: 18px 0 0;
  color: var(--iq-fg-muted);
  font: 400 14px/1.6 var(--iq-font);
}
body.iq-variant-techspec.error404 .not-found__text br { content: ''; }
/* Осмысленный выход: исходная разметка даёт только одну ссылку на главную —
   рядом достраиваются каталог и поиск. Сделано generated content, потому что
   так короче, а не потому что шаблон нельзя трогать. */
body.iq-variant-techspec.error404 .not-found__inner {
  display: flex;
  flex-direction: column;
  gap: 0;
}
/* Только раскладка. Оформление кнопки живёт в 06-controls.css: здешняя копия
   задавала заливку и кегль, но не высоту, и текст садился на верх 46-пиксельной
   коробки от `.btn--medium`. Роль «основное действие» теперь читается из класса
   разметки (`btn--contrast`), а не из того, на какой странице кнопка стоит. */
body.iq-variant-techspec.error404 .not-found .btn {
  order: 3;
  align-self: flex-start;
  margin-top: 26px;
}
body.iq-variant-techspec.error404 .not-found__number { order: 1; }
body.iq-variant-techspec.error404 .not-found__text { order: 2; }
/* Дополнительные выходы — реестр ссылок, а не текст в один ряд.
   Список приходит из разметки (404.php): раньше он жил в `content` вместе с
   адресом «→ /catalog», и на странице, куда человек попал по неверной ссылке,
   единственная подсказка была некликабельной. */
.not-found__exits { display: none; }
body.iq-variant-techspec.error404 .not-found__exits {
  display: flex;
  flex-direction: column;
  gap: 6px;
  order: 4;
  width: 100%;
  margin: 18px 0 0;
  padding: 16px 0 0;
  border-top: 1px solid var(--iq-hair);
  list-style: none;
}
body.iq-variant-techspec.error404 .not-found__exits a {
  display: inline-block;
  color: var(--iq-fg-muted);
  font: 600 11px/1.9 var(--iq-font);
  letter-spacing: var(--iq-numeric-tracking);
  text-decoration: none;
}
body.iq-variant-techspec.error404 .not-found__exits a::before {
  content: '→ ';
  color: var(--iq-action-primary);
}
body.iq-variant-techspec.error404 .not-found__exits a:hover,
body.iq-variant-techspec.error404 .not-found__exits a:focus-visible {
  color: var(--iq-fg-primary);
}

@media (max-width: 760px) {
  body.iq-variant-techspec.error404 .not-found { padding: 44px 16px 56px; }
  body.iq-variant-techspec.error404 .not-found__inner { padding: 28px 18px 30px; }
}
@media (max-width: 390px) {
  body.iq-variant-techspec.error404 .not-found__number { font-size: 56px; }
}

/* --------------------------------------------------------------------------
   2. СПАСИБО ЗА ЗАКАЗ — page-thanks.php
   Человек только что заплатил: главное — понятно показать, что дальше.
   Цветной SVG-градиент шаблона гасится, вместо него — чертёжная галочка
   в акцентном цвете и приборная сводка "что дальше".
   -------------------------------------------------------------------------- */
body.iq-variant-techspec .thanks {
  min-height: 56vh;
  padding: 60px var(--iq-space-5, 24px) 80px;
  background: var(--iq-bg-canvas);
}
body.iq-variant-techspec .thanks__inner {
  position: relative;
  max-width: 560px;
  margin: 0 auto;
  padding: 40px clamp(20px, 4vw, 44px) 40px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
  text-align: left;
  /* Контейнер базовой темы — флекс-колонка с центрированием, поэтому шапка,
     иконка и кнопка оставались по центру рядом с левым текстом. Одного
     text-align тут мало: центрует align-items, а не выравнивание строк. */
  align-items: flex-start;
}
/* Шапка блока приходит из разметки — см. page-thanks.php. Раньше она жила в
   `content` и говорила «заказ подтверждён» на всех трёх страницах, включая ту,
   где оплата не прошла. */
.thanks__eyebrow { display: none; }
body.iq-variant-techspec .thanks__eyebrow {
  display: block;
  margin: 0 0 24px;
  padding-bottom: 11px;
  border-bottom: 1px solid var(--iq-hair);
  color: var(--iq-fg-muted);
  font: 600 10px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
/* Цветной градиентный SVG гасится: на чертеже иконка — контурная галочка.
   Высоту приходится задавать явно: спрятанный SVG оставлял за собой пустую
   строку в 115px, и под иконкой зиял провал в пол-экрана. */
body.iq-variant-techspec .thanks__icon {
  position: relative;
  width: 52px;
  height: 52px;
  margin: 0 0 22px;
  line-height: 0;
}
body.iq-variant-techspec .thanks__icon svg { display: none; }
body.iq-variant-techspec .thanks__icon::before {
  content: '';
  position: absolute;
  inset: 0;
  border: 1.5px solid var(--iq-action-primary);
  border-radius: 50%;
}
/* Галочка ставится от центра круга. В прежнем варианте её сдвигали отрицательным
   полем, а сам круг был перечёркнут диагональной заливкой — вместе это читалось
   как крестик, то есть как ошибка на странице благодарности. */
body.iq-variant-techspec .thanks__icon::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 18px;
  height: 9px;
  border-left: 2px solid var(--iq-action-primary);
  border-bottom: 2px solid var(--iq-action-primary);
  transform: translate(-50%, -70%) rotate(-45deg);
}
/* Страница неудавшейся оплаты не должна показывать галочку «готово». */
body.iq-variant-techspec .thanks:has(.thanks__steps--fail) .thanks__icon::after {
  width: 20px;
  height: 20px;
  border-left: 0;
  border-bottom: 0;
  background:
    linear-gradient(to bottom, transparent 44%, var(--iq-danger) 44% 56%, transparent 56%);
  transform: translate(-50%, -50%) rotate(45deg);
}
body.iq-variant-techspec .thanks:has(.thanks__steps--fail) .thanks__icon::before {
  border-color: var(--iq-danger);
}
body.iq-variant-techspec .thanks__text {
  /* Панель выровнена по левому краю, а заголовок оставался по центру от базовой
     темы: два выравнивания в одной карточке читаются как вёрстка «на скорую». */
  text-align: left;
  /* Базовая тема отбивает заголовок на 70px сверху — под широкую цветную
     иконку в 115px. Иконка теперь 52px, и отбивка превращалась в провал. */
  margin: 0;
  color: var(--iq-fg-primary);
  font-family: var(--iq-display);
  font-weight: 700;
  font-size: clamp(22px, 3vw, 30px);
  line-height: 1.15;
  letter-spacing: var(--iq-heading-tracking);
  text-transform: none;
}
body.iq-variant-techspec .thanks__text span {
  display: block;
  margin: 12px 0 0;
  color: var(--iq-fg-muted);
  font-family: var(--iq-font);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.55;
  letter-spacing: normal;
}
body.iq-variant-techspec .thanks__text span p { margin: 0; }
/* Базовая тема подвешивает под абзацем короткую черту, выставленную по центру
   отрицательным полем. В левой панели она висела не на месте, а разделители
   здесь и без неё есть — волосяные линии над сводкой и под шапкой. */
body.iq-variant-techspec .thanks__text span::after { display: none; }
/* Приборная сводка «что дальше».
   Раньше это была одна строка в `content` с переносами `\A`. Перенос там не
   работал: `\A02` браузер читает как один шестнадцатеричный escape, а не как
   перенос и цифры — на странице вместо трёх пунктов шла сплошная строка с
   посторонним значком. Теперь это настоящий список, а нумерация — счётчик. */
.thanks__steps { display: none; }
body.iq-variant-techspec .thanks__steps {
  display: block;
  margin: 26px 0 0;
  padding: 18px 0 0;
  border-top: 1px solid var(--iq-hair);
  list-style: none;
  counter-reset: iq-step;
  color: var(--iq-fg-muted);
  font: 600 11px/1.7 var(--iq-font);
  letter-spacing: var(--iq-numeric-tracking);
  text-align: left;
}
body.iq-variant-techspec .thanks__steps li {
  display: grid;
  grid-template-columns: 26px 1fr;
  gap: 8px;
  padding: 5px 0;
  counter-increment: iq-step;
}
body.iq-variant-techspec .thanks__steps li::before {
  content: counter(iq-step, decimal-leading-zero);
  color: var(--iq-action-primary);
  font-variant-numeric: tabular-nums;
}
body.iq-variant-techspec .thanks__steps--fail li::before { color: var(--iq-danger); }
body.iq-variant-techspec .thanks .btn {
  display: inline-flex;
  align-items: center;
  min-height: 46px;
  margin-top: 28px;
  padding: 0 22px;
  border: 0;
  border-radius: var(--iq-radius-media);
  background: var(--iq-action-primary);
  color: var(--iq-bg-canvas);
  font: 700 12px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  text-decoration: none;
  transition: background-color .18s ease;
}
body.iq-variant-techspec .thanks .btn:hover,
body.iq-variant-techspec .thanks .btn:focus-visible {
  background: var(--iq-fg-primary);
  outline: 2px solid var(--iq-action-primary);
  outline-offset: 2px;
}

@media (max-width: 760px) {
  body.iq-variant-techspec .thanks { padding: 40px 16px 56px; }
  body.iq-variant-techspec .thanks__inner { padding: 28px 18px 30px; }
}

/* --------------------------------------------------------------------------
   3. ПОИСК — page-search.php, search.php
   Реестр позиций: список с хайрлайнами вместо карточек с тенями, обязательное
   пустое состояние. НЕ проверено в браузере с реальным page-search.php
   (не найден назначенным на живую страницу) — стилизовано по разметке PHP;
   search.php (реальный движок поиска WP) проверен через curl и на пустой
   запрос, и на непустой.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec .search {
  min-height: 56vh;
  padding-bottom: 70px;
  background: var(--iq-bg-canvas);
}
body.iq-variant-techspec .search__inner {
  max-width: 900px;
  margin: 0 auto;
  padding: 0 var(--iq-space-5, 24px);
}
body.iq-variant-techspec .search__count {
  padding: 20px 0 16px;
  border-bottom: 1px solid var(--iq-hair);
  color: var(--iq-fg-muted);
  font: 600 10px/1.6 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec .search__count span {
  color: var(--iq-fg-primary);
  font-family: var(--iq-display);
  letter-spacing: 0;
  text-transform: none;
}
body.iq-variant-techspec .search__count span:first-of-type {
  color: var(--iq-action-signal);
}

/* Реестр позиций: хайрлайн между строками, без теней/скруглений-карточек. */
body.iq-variant-techspec .search__list {
  display: flex;
  flex-direction: column;
  margin-top: 4px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
  overflow: hidden;
}
body.iq-variant-techspec .search__result {
  counter-increment: iq-search;
  position: relative;
  padding: 18px 20px 20px 56px;
  border-bottom: 1px solid var(--iq-hair);
}
body.iq-variant-techspec .search__list { counter-reset: iq-search; }
body.iq-variant-techspec .search__result:last-child { border-bottom: 0; }
body.iq-variant-techspec .search__result::before {
  content: counter(iq-search, decimal-leading-zero);
  position: absolute;
  top: 19px;
  left: 20px;
  color: var(--iq-action-signal);
  font: 700 12px/1 var(--iq-display);
  font-variant-numeric: tabular-nums;
}
body.iq-variant-techspec .search__result-title {
  margin: 0 0 8px;
  color: var(--iq-fg-primary);
  font: 700 16px/1.3 var(--iq-display);
  letter-spacing: var(--iq-heading-tracking);
  text-transform: none;
}
body.iq-variant-techspec .search__result-title span { color: var(--iq-action-signal); }
body.iq-variant-techspec .search__text {
  margin: 0;
  color: var(--iq-fg-muted);
  font: 400 13px/1.6 var(--iq-font);
}
body.iq-variant-techspec .search__keyword {
  color: var(--iq-fg-primary);
  background: rgba(110, 231, 255, .14);
  font-weight: 700;
}
body.iq-variant-techspec .search__link {
  display: inline-block;
  margin-top: 6px;
  color: var(--iq-action-primary);
  font: 600 11px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  text-decoration: none;
  border-bottom: 1px solid rgba(110, 231, 255, .35);
}
body.iq-variant-techspec .search__link:hover,
body.iq-variant-techspec .search__link:focus-visible { border-bottom-color: var(--iq-action-primary); }

/* Плита-каталог, унаследованная от search.php (catalog-item внутри search__list),
   выравнивается в тот же реестр с хайрлайнами вместо grid-плит. */
body.iq-variant-techspec .search__list .catalog-item {
  width: auto;
  margin: 0;
  padding: 16px 20px;
  border: 0;
  border-bottom: 1px solid var(--iq-hair);
  border-radius: 0;
  background: transparent;
  box-shadow: none;
  display: flex;
  /* Направление и выравнивание задаются явно: глобальное правило карточки
     каталога ставит её в колонку по центру, и без этих двух строк реестр
     разворачивался в одну узкую колонку с обложками по 64px посреди
     восьмисотпиксельной строки. */
  flex-direction: row;
  align-items: center;
  justify-content: flex-start;
  text-align: left;
  gap: 16px;
}
/* Порядок в строке: обложка, название, темп, номер, метка. Карточка каталога
   вертикальная, и её порядок (название последним, под отбивкой) в строке
   читался как «сначала служебное, потом главное». Отбивка над названием там же
   лишняя: она разделяла ярусы карточки, а в строке висит одинокой чертой. */
body.iq-variant-techspec .search__list .catalog-item > a.catalog-item__name {
  order: 2;
  flex: 1 1 auto;
  min-width: 0;
  padding-top: 0;
  border-top: 0;
}
body.iq-variant-techspec .search__list .catalog-item__description { order: 3; }
body.iq-variant-techspec .search__list .catalog-item::before { order: 4; }
body.iq-variant-techspec .search__list .catalog-item__label-wrap { order: 5; }
body.iq-variant-techspec .search__list .catalog-item:last-child { border-bottom: 0; }
body.iq-variant-techspec .search__list .catalog-item:hover { transform: none; box-shadow: none; }
body.iq-variant-techspec .search__list .catalog-item__image {
  flex: 0 0 auto;
  width: 64px;
  height: 64px;
  border: 1px solid var(--iq-hair);
  border-radius: var(--iq-radius-media);
  background-color: var(--iq-media-bg);
  background-size: cover;
  background-position: center;
}
body.iq-variant-techspec .search__list .catalog-item__name {
  color: var(--iq-fg-primary);
  font: 600 14px/1.3 var(--iq-font);
}
body.iq-variant-techspec .search__list .catalog-item__description {
  display: block;
  margin-top: 4px;
  color: var(--iq-fg-muted);
  font: 600 10px/1.4 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec .search__list .catalog-item__label-wrap { position: static; margin-left: auto; }

/* Пустое состояние: пустой .search__list ничем не отличался от пустой
   страницы — здесь явная подсказка что делать дальше. */
body.iq-variant-techspec .search__list:empty {
  position: relative;
  padding: 44px 24px 40px;
  text-align: left;
}
body.iq-variant-techspec .search__list:empty::before {
  content: 'Ничего не найдено';
  display: block;
  margin-bottom: 10px;
  color: var(--iq-fg-primary);
  font: 700 20px/1.2 var(--iq-display);
  letter-spacing: var(--iq-heading-tracking);
}
/* Подсказка приходит из разметки (search.php) и показывается только когда
   выдача действительно пуста — иначе она висела бы под найденными товарами. */
.search__empty { display: none; }
body.iq-variant-techspec .search__empty {
  display: block;
  max-width: 52ch;
  margin: 0;
  color: var(--iq-fg-muted);
  font: 400 13px/1.65 var(--iq-font);
}
body.iq-variant-techspec .search__empty a {
  color: var(--iq-action-primary);
  text-decoration: none;
  border-bottom: 1px solid currentColor;
}

body.iq-variant-techspec .pagination {
  display: flex;
  gap: 1px;
  margin-top: 24px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-border-subtle);
  overflow: hidden;
  width: fit-content;
}
/* paginate_links() gives the SAME class "page-numbers" to the wrapping <ul>
   and to each <li>/<a>/<span> inside it. ".pagination .page-numbers" is a
   plain descendant selector, so it was matching the <ul> too — collapsing it
   into a 38px grid cell that its own <li> children then stacked inside,
   instead of laying out as a row. Scoping to :not(ul) keeps the square-button
   styling on the items only; the wrapper gets its own flex reset below. */
body.iq-variant-techspec .pagination > ul.page-numbers {
  display: flex;
  gap: 1px;
  width: auto;
  margin: 0;
  padding: 0;
  list-style: none;
}
body.iq-variant-techspec .pagination__link,
body.iq-variant-techspec .pagination .page-numbers:not(ul) {
  display: grid;
  place-items: center;
  min-width: 38px;
  min-height: 38px;
  background: var(--iq-bg-surface);
  color: var(--iq-fg-muted);
  font: 600 12px/1 var(--iq-font);
  font-variant-numeric: tabular-nums;
  text-decoration: none;
}
body.iq-variant-techspec .pagination__link:hover,
body.iq-variant-techspec .pagination__link:focus-visible,
body.iq-variant-techspec .pagination .page-numbers:not(ul):hover,
body.iq-variant-techspec .pagination .page-numbers:not(ul):focus-visible {
  background: var(--iq-card-bg-hover);
  color: var(--iq-fg-primary);
}
body.iq-variant-techspec .pagination__link.active,
body.iq-variant-techspec .pagination .page-numbers.current {
  background: var(--iq-action-primary);
  color: var(--iq-bg-canvas);
}

@media (max-width: 760px) {
  body.iq-variant-techspec .search__result { padding: 16px 16px 18px 48px; }
  body.iq-variant-techspec .search__result::before { left: 16px; }
  /* На телефоне три текстовые колонки в строке ужимаются до нечитаемых
     столбиков. Строка становится сеткой: обложка слева, название и темп
     друг под другом. Номер позиции и метка убираются — на узком экране это
     служебное, а место нужно названию. */
  body.iq-variant-techspec .search__list .catalog-item {
    display: grid;
    grid-template-columns: 52px minmax(0, 1fr);
    align-items: center;
    gap: 4px 12px;
    padding: 14px 16px;
  }
  body.iq-variant-techspec .search__list .catalog-item__image {
    width: 52px;
    height: 52px;
    grid-column: 1;
    grid-row: 1 / span 2;
  }
  body.iq-variant-techspec .search__list .catalog-item > a.catalog-item__name { grid-column: 2; grid-row: 1; }
  body.iq-variant-techspec .search__list .catalog-item__description { grid-column: 2; grid-row: 2; }
  body.iq-variant-techspec .search__list .catalog-item::before,
  body.iq-variant-techspec .search__list .catalog-item__label-wrap { display: none; }
}
@media (max-width: 390px) {
  body.iq-variant-techspec .search__inner { padding: 0 14px; }
  body.iq-variant-techspec .search__list .catalog-item__label-wrap { display: none; }
}

/* --------------------------------------------------------------------------
   4. НОВОСТИ — archive-news.php, single-news.php
   Лента и статья: колонка 65–75 знаков, служебная моно-строка с датой,
   хайрлайны вместо карточек с тенями.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec .news {
  min-height: 56vh;
  padding-bottom: 76px;
  background: var(--iq-bg-canvas);
}
body.iq-variant-techspec .news__inner {
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 var(--iq-space-5, 24px);
}
body.iq-variant-techspec .news__title {
  margin: 8px 0 0;
  padding-bottom: 22px;
  border-bottom: 1px solid var(--iq-hair);
  color: var(--iq-fg-primary);
  font: 700 clamp(28px, 3.6vw, 44px)/1 var(--iq-display);
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec .news__title b { color: var(--iq-action-primary); font-weight: 700; }
body.iq-variant-techspec .news__title::before {
  content: 'Sheet 04 — Журнал';
  display: block;
  margin-bottom: 14px;
  color: var(--iq-fg-muted);
  font: 600 10px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

/* Лента: швы 1px, плита просвечивает через щель — но неполный ряд не
   красится сплошным серым: последняя карточка растягивается на всю строку. */
body.iq-variant-techspec .news__list {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
  gap: 1px;
  margin-top: 32px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-border-subtle);
  overflow: hidden;
}
body.iq-variant-techspec .news-preview {
  display: flex;
  flex-direction: column;
  padding: 0;
  background: var(--iq-card-bg);
  text-decoration: none;
  transition: background-color .2s ease;
}
body.iq-variant-techspec .news-preview:hover,
body.iq-variant-techspec .news-preview:focus-visible {
  background: var(--iq-card-bg-hover);
}
body.iq-variant-techspec .news-preview__image {
  aspect-ratio: 16 / 10;
  margin: 0;
  border: 0;
  border-bottom: 1px solid var(--iq-hair);
  border-radius: 0;
  background-size: cover;
  background-position: center;
  filter: saturate(.88) contrast(1.04);
}
body.iq-variant-techspec .news-preview__wrap {
  display: flex;
  flex-direction: column;
  padding: 16px 18px 20px;
}
body.iq-variant-techspec .news-preview__date {
  order: -1;
  margin-bottom: 10px;
  color: var(--iq-fg-muted);
  font: 600 10px/1 var(--iq-font);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec .news-preview__title {
  margin: 0;
  color: var(--iq-fg-primary);
  font: 700 16px/1.28 var(--iq-display);
  letter-spacing: var(--iq-heading-tracking);
  text-transform: none;
}
body.iq-variant-techspec .news-preview__text {
  margin: 10px 0 0;
  color: var(--iq-fg-muted);
  font: 400 13px/1.55 var(--iq-font);
}

body.iq-variant-techspec .news .pagination { margin: 34px auto 0; }

/* Cross-promo под лентой: тот же рейл направлений, что на главной
   (.iq-feature-rail), но со своим классом — тот компонент жёстко
   заскоуплен на body.home, сюда его CSS не дотягивается. */
body.iq-variant-techspec .news-crosslinks {
  max-width: 1200px;
  margin: 56px auto 0;
  padding: 0 var(--iq-space-5, 24px) 76px;
}
body.iq-variant-techspec .news-crosslinks__kicker {
  margin: 0 0 14px;
  color: var(--iq-fg-muted);
  font: 600 10px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec .news-crosslinks__grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 1px;
  margin-bottom: 1px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-border-subtle);
  overflow: hidden;
}
body.iq-variant-techspec .news-crosslinks__item {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 20px 18px;
  background: var(--iq-card-bg);
  text-decoration: none;
  transition: background-color .2s ease;
}
body.iq-variant-techspec .news-crosslinks__item:hover,
body.iq-variant-techspec .news-crosslinks__item:focus-visible {
  background: var(--iq-card-bg-hover);
}
body.iq-variant-techspec .news-crosslinks__index {
  color: var(--iq-action-primary);
  font: 600 11px/1 var(--iq-font);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-label-tracking);
}
body.iq-variant-techspec .news-crosslinks__copy {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
body.iq-variant-techspec .news-crosslinks__copy b {
  color: var(--iq-fg-primary);
  font: 700 15px/1.2 var(--iq-display);
  letter-spacing: var(--iq-heading-tracking);
}
body.iq-variant-techspec .news-crosslinks__copy small {
  color: var(--iq-fg-muted);
  font: 400 12px/1.4 var(--iq-font);
}
body.iq-variant-techspec .news-crosslinks__arrow {
  margin-top: auto;
  align-self: flex-end;
  color: var(--iq-fg-muted);
  font-size: 16px;
  transition: color .2s ease, transform .2s ease;
}
body.iq-variant-techspec .news-crosslinks__item:hover .news-crosslinks__arrow {
  color: var(--iq-action-primary);
  transform: translate(2px, -2px);
}
body.iq-variant-techspec .news-crosslinks__tg {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 16px 18px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface-raised);
  text-decoration: none;
  transition: border-color .2s ease;
}
body.iq-variant-techspec .news-crosslinks__tg:hover,
body.iq-variant-techspec .news-crosslinks__tg:focus-visible {
  border-color: var(--iq-action-primary);
}
body.iq-variant-techspec .news-crosslinks__tg-label {
  color: var(--iq-fg-primary);
  font: 600 14px/1 var(--iq-font);
}
body.iq-variant-techspec .news-crosslinks__tg-handle {
  margin-left: auto;
  margin-right: 10px;
  color: var(--iq-fg-muted);
  font: 400 13px/1 var(--iq-font);
  font-variant-numeric: tabular-nums;
}
body.iq-variant-techspec .news-crosslinks__tg .news-crosslinks__arrow {
  margin-top: 0;
}

/* --- статья --- */
body.iq-variant-techspec .single-news {
  min-height: 56vh;
  padding-bottom: 76px;
  background: var(--iq-bg-canvas);
}
body.iq-variant-techspec .single-news__inner {
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 var(--iq-space-5, 24px);
  display: flex;
  flex-wrap: wrap;
  gap: 40px;
}
body.iq-variant-techspec .single-news__content {
  /* Читаемая колонка: 65–75 знаков в строке. */
  max-width: 68ch;
  width: 100%;
  flex: 1 1 420px;
}
body.iq-variant-techspec .single-news__title--mobile { display: none; }
body.iq-variant-techspec .single-news__title {
  margin: 8px 0 0;
  padding-bottom: 16px;
  border-bottom: 1px solid var(--iq-hair);
  color: var(--iq-fg-primary);
  font: 700 clamp(24px, 3.2vw, 38px)/1.06 var(--iq-display);
  letter-spacing: var(--iq-heading-tracking);
  text-transform: none;
}
body.iq-variant-techspec .single-news__date {
  display: block;
  order: -1;
  margin: 0 0 12px;
  color: var(--iq-fg-muted);
  font: 600 10px/1 var(--iq-font);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec .single-news__photo {
  display: block;
  order: 2;
  margin: 20px 0 0;
  border: 1px solid var(--iq-hair);
  border-radius: var(--iq-radius-media);
  overflow: hidden;
}
/* Рамка облегает картинку, а не наоборот.
   Базовая тема держит на изображении `max-width: 420px`, и оно не заполняло
   свою же рамку — справа оставалась мёртвая зона. Растянуть его на всю колонку
   тоже неверно: обложки здесь квадратные, и на 664px такая картинка выдавливает
   текст за пределы экрана. Поэтому размер задаётся картинке, а рамка садится
   по ней. */
/* Рамка висит на самой картинке, а не на ссылке-обёртке: обёртка — флекс-элемент
   колонки и растягивается на всю её ширину, из-за чего рамка была шире
   изображения и справа от него оставалась мёртвая зона. */
body.iq-variant-techspec .single-news__photo {
  border: 0;
  border-radius: 0;
  overflow: visible;
}
body.iq-variant-techspec .single-news__photo img {
  display: block;
  width: auto;
  /* Обложки здесь квадратные: на всю колонку такая картинка выдавливает текст
     за пределы экрана. */
  max-width: min(100%, 480px);
  height: auto;
  border: 1px solid var(--iq-hair);
  border-radius: var(--iq-radius-media);
}
/* Когда фотографий нет, карусели нет тоже — колонка текста остаётся одна и без
   этого прижималась к левому краю, оставляя полкадра пустоты.
   Центрует именно автоматическое поле: `justify-content` на флекс-элементе,
   зажатом `max-width`, в этой раскладке не срабатывает — проверено замером. */
body.iq-variant-techspec .single-news__inner:not(:has(.single-news__carousel)) .single-news__content {
  margin-inline: auto;
}
body.iq-variant-techspec .single-news__content { display: flex; flex-direction: column; }
body.iq-variant-techspec .single-news__text {
  order: 3;
  margin-top: 22px;
  color: var(--iq-fg-muted);
  font: 400 15px/1.68 var(--iq-font);
}
body.iq-variant-techspec .single-news__text p { margin: 0 0 16px; }
body.iq-variant-techspec .single-news__text a { color: var(--iq-action-primary); }
body.iq-variant-techspec .single-news__text strong,
body.iq-variant-techspec .single-news__text b { color: var(--iq-fg-primary); }
body.iq-variant-techspec .single-news__text img {
  max-width: 100%;
  height: auto;
  border-radius: var(--iq-radius-media);
  border: 1px solid var(--iq-hair);
}

/* Карусель фото — реестр кадров, а не слайдер со скруглёнными тенями. */
body.iq-variant-techspec .single-news__carousel {
  flex: 1 1 280px;
  max-width: 380px;
  align-self: flex-start;
  position: sticky;
  top: 20px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
  padding: 14px;
}
body.iq-variant-techspec .single-news__carousel .carousel__slide {
  display: block;
  border: 1px solid var(--iq-hair);
  border-radius: var(--iq-radius-media);
  overflow: hidden;
}
body.iq-variant-techspec .single-news__carousel .carousel__slide img { display: block; width: 100%; height: auto; }
body.iq-variant-techspec .single-news__carousel .swiper-button-prev,
body.iq-variant-techspec .single-news__carousel .swiper-button-next {
  width: 34px;
  height: 34px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: 50%;
  background: var(--iq-bg-canvas);
}

@media (max-width: 1100px) {
  body.iq-variant-techspec .single-news__carousel { position: static; max-width: none; }
}
@media (max-width: 760px) {
  body.iq-variant-techspec .news__list { grid-template-columns: 1fr; }
  body.iq-variant-techspec .single-news__inner { flex-direction: column; gap: 24px; }
  body.iq-variant-techspec .news-crosslinks__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  body.iq-variant-techspec .news-crosslinks__tg { flex-wrap: wrap; }
}

/* --------------------------------------------------------------------------
   5. ОБРАТНАЯ СВЯЗЬ И ВИДЕО — page-feedback.php, page-video.php,
   page-product-video.php

   page-video.php стримит бинарный MP4 напрямую через fpassthru() — это не
   HTML-страница, оформлять нечего, CSS на неё повлиять не может.

   page-feedback.php: не найдено ни одной реальной WP-страницы с этим
   шаблоном в текущей локальной БД (ни /feedback/, ни в списке
   /wp-json/wp/v2/pages) — не проверено в браузере, стилизовано по разметке
   PHP-шаблона.

   page-product-video.php: слаг, ожидаемо использующий этот шаблон
   (video-vorkshopyi-po-povyisheniyu-kvalifikatsii), в живой БД назначен на
   page-template-default, а не на page-template-page-product-video-php — то
   есть шаблон тоже нигде не подключён live. Стилизовано по PHP-разметке;
   классы .product__* переиспользуют паттерны 20-product.css общим
   селектором без .single-product в цепочке, чтобы сработать независимо от
   того, какой body-класс реально ставит WooCommerce на такой странице.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec .feedback {
  min-height: 56vh;
  padding-bottom: 40px;
  background: var(--iq-bg-canvas);
}
body.iq-variant-techspec .feedback__inner {
  max-width: 640px;
  margin: 0 auto;
  padding: 0 var(--iq-space-5, 24px);
}
body.iq-variant-techspec .feedback__title {
  margin: 8px 0 28px;
  padding-bottom: 16px;
  border-bottom: 1px solid var(--iq-hair);
  color: var(--iq-fg-primary);
  font: 700 clamp(24px, 3.2vw, 36px)/1.06 var(--iq-display);
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec .feedback__title::before {
  content: 'Sec. 07 — Обратная связь';
  display: block;
  margin-bottom: 14px;
  color: var(--iq-fg-muted);
  font: 600 10px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec .feedback__form {
  display: flex;
  flex-direction: column;
  gap: 14px;
  padding: 24px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
}
/* Видимые подписи полей: плейсхолдер шаблона дублируется настоящим label,
   визуально спрятанным, но доступным для скринридеров и как якорь под
   текст ошибки валидации. */
body.iq-variant-techspec .feedback__form .input {
  position: relative;
  min-height: 46px;
  padding: 0 14px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-input);
  background: var(--iq-input-bg);
  color: var(--iq-fg-primary);
  font-family: var(--iq-font);
  font-size: 14px;
}
body.iq-variant-techspec .feedback__form .input::placeholder { color: var(--iq-fg-muted); }
body.iq-variant-techspec .feedback__form .input:focus-visible {
  outline: 2px solid var(--iq-action-primary);
  outline-offset: 2px;
  border-color: var(--iq-action-primary);
}
body.iq-variant-techspec .feedback__form textarea.input {
  min-height: 120px;
  padding: 12px 14px;
  resize: vertical;
}
/* Служебная моно-подпись перед каждым полем — заменяет отсутствующий
   <label for> в разметке шаблона, но не меняет DOM (генерируется CSS). */
body.iq-variant-techspec .feedback__form .input--third {
  margin-top: 20px;
}
body.iq-variant-techspec .feedback__form .callibri_field_fio { position: relative; margin-top: 0; }
body.iq-variant-techspec .feedback__form .callibri_field_fio::before,
body.iq-variant-techspec .feedback__form .callibri_field_phone::before,
body.iq-variant-techspec .feedback__form .callibri_field_email::before,
body.iq-variant-techspec .feedback__form .callibri_field_text::before {
  display: block;
  margin: 0 0 6px;
  color: var(--iq-fg-muted);
  font: 600 10px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}
body.iq-variant-techspec .feedback__form .callibri_field_fio::before { content: 'ФИО · обязательно'; }
body.iq-variant-techspec .feedback__form .callibri_field_phone::before { content: 'Телефон'; }
body.iq-variant-techspec .feedback__form .callibri_field_email::before { content: 'E-mail · обязательно'; }
body.iq-variant-techspec .feedback__form .callibri_field_text::before { content: 'Сообщение'; }
/* Место под текст ошибки рядом с полем: пустой резерв высоты, чтобы форма
   не прыгала, когда JS-валидатор добавит текст в этот же узел. */
body.iq-variant-techspec .feedback__form .input:invalid:not(:placeholder-shown) {
  border-color: var(--iq-danger);
}
body.iq-variant-techspec .feedback__form .input-error,
body.iq-variant-techspec .feedback__form .field-error {
  display: block;
  min-height: 14px;
  margin-top: 4px;
  color: var(--iq-danger);
  font: 600 11px/1.3 var(--iq-font);
}
body.iq-variant-techspec .feedback__form .fake-checkbox {
  position: relative;
  display: flex;
  align-items: flex-start;
  gap: 10px;
  margin-top: 6px;
  color: var(--iq-fg-muted);
  font: 400 12px/1.5 var(--iq-font);
}
body.iq-variant-techspec .feedback__form .fake-checkbox::before {
  content: '';
  flex: 0 0 auto;
  width: 18px;
  height: 18px;
  margin-top: 1px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-field-radius);
  background: var(--iq-input-bg);
}
body.iq-variant-techspec .feedback__form .checkbox:checked + .fake-checkbox::before {
  border-color: var(--iq-action-primary);
  background: var(--iq-action-primary);
}
body.iq-variant-techspec .feedback__form .checkbox:focus-visible + .fake-checkbox::before {
  outline: 2px solid var(--iq-action-primary);
  outline-offset: 2px;
}
body.iq-variant-techspec .feedback__form .checkbox__link { color: var(--iq-action-primary); }
body.iq-variant-techspec .feedback__btn-wrap { margin-top: 8px; }
body.iq-variant-techspec .feedback #feedback-submit {
  min-height: 46px;
  padding: 0 24px;
  border: 0;
  border-radius: var(--iq-radius-media);
  background: var(--iq-action-primary);
  color: var(--iq-bg-canvas);
  font: 700 12px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
  transition: background-color .18s ease, opacity .18s ease;
}
body.iq-variant-techspec .feedback #feedback-submit:disabled { opacity: .5; }
body.iq-variant-techspec .feedback #feedback-submit:hover:not(:disabled),
body.iq-variant-techspec .feedback #feedback-submit:focus-visible {
  background: var(--iq-fg-primary);
  outline: 2px solid var(--iq-action-primary);
  outline-offset: 2px;
}

/* SEO-блок под формой — та же служебная полоса, что и на товаре. */
body.iq-variant-techspec .feedback ~ .simple-text .simple-text__inner,
body.iq-variant-techspec .feedback + .simple-text .simple-text__inner {
  max-width: 640px;
  margin: 30px auto 0;
  padding: 22px 24px 24px;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
  color: var(--iq-fg-muted);
  font: 400 13px/1.6 var(--iq-font);
}
body.iq-variant-techspec .feedback ~ .simple-text .simple-text__title,
body.iq-variant-techspec .feedback + .simple-text .simple-text__title {
  margin: 0 0 12px;
  color: var(--iq-fg-primary);
  font-family: var(--iq-display);
  font-weight: 700;
  font-size: clamp(16px, 1.8vw, 22px);
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
}

/* --- видео-товар (page-product-video.php) --------------------------------
   Обёртка плеера с фиксированным aspect-ratio, video/iframe не вылезают за
   контейнер, узкие экраны без горизонтального скролла. */
body.iq-variant-techspec .product__video-wrap {
  min-width: 0;
}
body.iq-variant-techspec .product__video-preview {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  max-width: 100%;
  border: 1px solid var(--iq-hair);
  border-radius: var(--iq-radius-media);
  background-size: cover;
  background-position: center;
  overflow: hidden;
}
body.iq-variant-techspec .product__video-btn {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
  background: rgba(11, 12, 14, .38);
}
body.iq-variant-techspec .product__video-btn::before {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 56px;
  height: 56px;
  transform: translate(-50%, -50%);
  border: 1.5px solid var(--iq-action-signal);
  border-radius: 50%;
  background: rgba(11, 12, 14, .72);
}
body.iq-variant-techspec .product__video-btn::after {
  content: '';
  position: absolute;
  top: 50%;
  left: calc(50% + 3px);
  width: 0;
  height: 0;
  transform: translate(-50%, -50%);
  border-style: solid;
  border-width: 8px 0 8px 13px;
  border-color: transparent transparent transparent var(--iq-action-signal);
}
body.iq-variant-techspec .product__video-btn:hover::before,
body.iq-variant-techspec .product__video-btn:focus-visible::before {
  border-color: var(--iq-action-primary);
}
body.iq-variant-techspec .product__video-btn:hover::after,
body.iq-variant-techspec .product__video-btn:focus-visible::after {
  border-left-color: var(--iq-action-primary);
}
body.iq-variant-techspec .product__video-btn:focus-visible {
  outline: 2px solid var(--iq-action-primary);
  outline-offset: 2px;
}

body.iq-variant-techspec .video-player__wrap {
  max-width: min(920px, calc(100vw - 32px));
  width: 100%;
  margin: 0 auto;
  border: 1px solid var(--iq-border-subtle);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
  overflow: hidden;
}
body.iq-variant-techspec .video-player__video {
  display: block;
  width: 100%;
  max-width: 100%;
  height: auto;
  aspect-ratio: 16 / 9;
  background: var(--iq-media-bg);
}
body.iq-variant-techspec .video-player__overlay {
  background: rgba(11, 12, 14, .86);
}
body.iq-variant-techspec .video-player__close-btn {
  border: 1px solid var(--iq-border-subtle);
  border-radius: 50%;
  background: var(--iq-bg-canvas);
}
body.iq-variant-techspec .video-player__close-btn svg { fill: var(--iq-fg-primary); }
body.iq-variant-techspec .video-player__close-btn:hover,
body.iq-variant-techspec .video-player__close-btn:focus-visible {
  border-color: var(--iq-action-primary);
}
body.iq-variant-techspec .video-player__controls {
  border-top: 1px solid var(--iq-hair);
  background: var(--iq-bg-surface);
}
body.iq-variant-techspec .video-player__play-btn {
  border: 1px solid var(--iq-border-subtle);
  border-radius: 50%;
  background: transparent;
  color: var(--iq-fg-primary);
}
body.iq-variant-techspec .video-player__play-btn:hover,
body.iq-variant-techspec .video-player__play-btn:focus-visible {
  border-color: var(--iq-action-primary);
  outline: 2px solid var(--iq-action-primary);
  outline-offset: 2px;
}
body.iq-variant-techspec .video-player__progress {
  border-radius: 0;
  background: var(--iq-hair-strong);
}
body.iq-variant-techspec .video-player__current-progress {
  background: var(--iq-action-primary);
}
body.iq-variant-techspec .video-player__current,
body.iq-variant-techspec .video-player__total {
  color: var(--iq-fg-muted);
  font: 500 11px/1 var(--iq-font);
  font-variant-numeric: tabular-nums;
}

@media (max-width: 760px) {
  body.iq-variant-techspec .feedback__form { padding: 18px; }
  body.iq-variant-techspec .feedback__inner { padding: 0 16px; }
}

/* --------------------------------------------------------------------------
   6. АДАПТИВ (сквозная проверка на 1440 / 1100 / 760 / 390 для всех пяти
   групп — брейкпоинты и приём взяты из 10-home.css)
   -------------------------------------------------------------------------- */
@media (max-width: 1440px) {
  body.iq-variant-techspec .search__inner,
  body.iq-variant-techspec .news__inner,
  body.iq-variant-techspec .single-news__inner,
  body.iq-variant-techspec .feedback__inner {
    padding-inline: 20px;
  }
}

@media (max-width: 1100px) {
  body.iq-variant-techspec .news__list {
    grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  }
}

@media (max-width: 760px) {
  body.iq-variant-techspec .thanks__steps,
  body.iq-variant-techspec .not-found__inner::after {
    font-size: 10.5px;
  }
}

@media (prefers-reduced-motion: reduce) {
  body.iq-variant-techspec .news-preview,
  body.iq-variant-techspec .search__list .catalog-item,
  body.iq-variant-techspec .thanks .btn,
  body.iq-variant-techspec .not-found .btn,
  body.iq-variant-techspec .feedback #feedback-submit,
  body.iq-variant-techspec .product__video-btn::before,
  body.iq-variant-techspec .product__video-btn::after {
    transition: none;
  }
}

/* --------------------------------------------------------------------------
   4.1 БЛОК «СМОТРЕТЬ В КАТАЛОГЕ» в конце новости

   Новости набирали вес и никуда его не отдавали: наружу из статьи вели
   единичные ссылки, а читателю после текста некуда было пойти. Блок ставится
   в конец записи (см. миграцию перелинковки 04.08.2026) и намеренно оформлен
   как отбивка, а не как часть текста, — чтобы отличался от ссылок по смыслу
   внутри абзацев и не читался как продолжение статьи.
   -------------------------------------------------------------------------- */
body.iq-variant-techspec .news-related {
  margin: 40px 0 0;
  padding: 22px 24px;
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-radius-panel);
  background: var(--iq-bg-surface);
}

body.iq-variant-techspec .news-related h2 {
  margin: 0 0 14px;
  color: var(--iq-fg-muted);
  font: 700 11px/1 var(--iq-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

body.iq-variant-techspec .news-related ul {
  margin: 0;
  padding: 0;
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}

body.iq-variant-techspec .news-related li { margin: 0; }

body.iq-variant-techspec .news-related a {
  display: inline-block;
  padding: 9px 14px;
  border: 1px solid var(--iq-hair-strong);
  border-radius: var(--iq-radius-input);
  color: var(--iq-fg-primary);
  font: 600 13px/1.2 var(--iq-font);
  text-decoration: none;
  transition: border-color .18s ease, color .18s ease, background .18s ease;
}

body.iq-variant-techspec .news-related a:hover,
body.iq-variant-techspec .news-related a:focus-visible {
  border-color: var(--iq-action-primary);
  background: var(--iq-bg-surface-raised);
  color: var(--iq-action-primary);
}

/* --- 95-legal.css --- */
/* Tech Spec — правовые документы.

   Это единственные страницы сайта, которые действительно читают подряд, поэтому
   набор здесь другой: длина строки в районе 70 знаков, интерлиньяж крупнее, и
   ничего, что отвлекает. Чертёжный язык остаётся в служебных элементах —
   подписях, оглавлении, номерах разделов, — а сам текст просто читается. */

/* --- Базовый слой: всё, кроме Tech Spec ----------------------------------
   Обычно правило простое — разметка идёт в обе версии, стили только в
   techspec. Здесь оно не работает, и вот почему: page-legal.php появился
   вместе с редизайном, на боевом сервере такого шаблона нет вовсе (проверено
   01.08.2026: ни файла, ни классов legal__ в выдаче). То есть «боевого вида»
   у этих страниц ещё не существует — портить нечего, а выкатить нечем.

   А выкатить пришлось бы именно так: вариант по умолчанию — editorial, и без
   этого блока любой посетитель без метки получил бы юридические документы
   голым текстом во всю ширину экрана. Оферту на пятнадцать разделов.

   Поэтому здесь ровно необходимый минимум читаемости: ширина колонки, ритм
   заголовков, рамка вокруг оглавления. Ни шрифтов, ни цветов, ни разрядки —
   всё наследуется от базовой темы, чертёжный язык остаётся в techspec.
   Селектор :not() гарантирует, что techspec этот блок не видит вообще. */
body:not(.iq-variant-techspec) .legal__inner {
  width: min(1200px, 100% - 32px);
  margin-inline: auto;
  padding-bottom: 64px;
}

body:not(.iq-variant-techspec) .legal__head {
  padding-top: 32px;
}

body:not(.iq-variant-techspec) .legal__kicker {
  margin: 0 0 10px;
  font-size: 12px;
  text-transform: uppercase;
  opacity: 0.7;
}

body:not(.iq-variant-techspec) .legal__title {
  margin: 0;
  font-size: clamp(26px, 4vw, 44px);
  line-height: 1.1;
}

body:not(.iq-variant-techspec) .legal__revision {
  margin: 14px 0 0;
  font-size: 13px;
  opacity: 0.7;
}

/* Оглавление держится той же колонки, что и текст: растянутая на всю ширину
   рамка над узким текстом читается как две разные страницы. */
body:not(.iq-variant-techspec) .legal__toc {
  max-width: 70ch;
  margin: 32px 0;
  padding: 20px 24px;
  border: 1px solid rgba(128, 128, 128, 0.35);
}

body:not(.iq-variant-techspec) .legal__toc-label {
  margin: 0 0 12px;
  font-size: 12px;
  text-transform: uppercase;
  opacity: 0.7;
}

/* Базовая тема гасит маркеры списков, поэтому отступ под них висел пустым.
   Убираем и его — список в рамке читается сам по себе. */
body:not(.iq-variant-techspec) .legal__toc-list {
  margin: 0;
  padding-left: 0;
  list-style: none;
}

body:not(.iq-variant-techspec) .legal__toc-list li {
  margin-bottom: 6px;
}

/* Единственное место на сайте, где текст читают подряд, — держим строку в
   районе 70 знаков, иначе глаз теряет начало следующей. */
body:not(.iq-variant-techspec) .legal__body {
  max-width: 70ch;
  font-size: 16px;
  line-height: 1.65;
}

body:not(.iq-variant-techspec) .legal__body h2 {
  margin: 40px 0 16px;
  font-size: clamp(19px, 2.2vw, 24px);
  line-height: 1.2;
  /* Якорь из оглавления не должен уезжать под липкую шапку. */
  scroll-margin-top: 100px;
}

body:not(.iq-variant-techspec) .legal__body h3 {
  margin: 24px 0 10px;
  font-size: 16px;
}

body:not(.iq-variant-techspec) .legal__body p {
  margin: 0 0 16px;
}

body:not(.iq-variant-techspec) .legal__body ul,
body:not(.iq-variant-techspec) .legal__body ol {
  margin: 0 0 16px;
  padding-left: 1.4em;
}

body:not(.iq-variant-techspec) .legal__body li {
  margin-bottom: 6px;
}

/* Таблица в оферте узкая по смыслу, но на телефоне всё равно шире экрана —
   прокручивается внутри себя, а не тянет страницу вбок. */
body:not(.iq-variant-techspec) .legal__body table {
  display: block;
  width: 100%;
  overflow-x: auto;
  border-collapse: collapse;
}

body:not(.iq-variant-techspec) .legal__body th,
body:not(.iq-variant-techspec) .legal__body td {
  padding: 8px 12px;
  border: 1px solid rgba(128, 128, 128, 0.35);
  text-align: left;
  vertical-align: top;
}

/* --- Tech Spec ------------------------------------------------------------ */
body.iq-variant-techspec .legal__inner {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--iq-gap-6);
  width: min(1200px, 100% - 32px);
  margin-inline: auto;
  padding-bottom: 80px;
}

/* Хлебные крошки на остальных страницах стоят вплотную к своему блоку, здесь же
   сразу под ними идёт крупный заголовок — без отбивки они читались как его
   первая строка. */
body.iq-variant-techspec .legal__head {
  padding-top: var(--iq-gap-6);
}

/* У этих страниц собственная разметка крошек: ссылка, текстовый «>» и название,
   без списка. На остальных страницах разделитель отбивает CSS, здесь его не
   было ничем — строка слипалась в «ГЛАВНАЯ›ПУБЛИЧНАЯ ОФЕРТА». */
body.iq-variant-techspec .legal .breadcrumbs span {
  margin-left: 8px;
}

body.iq-variant-techspec .legal__kicker {
  margin: 0 0 var(--iq-gap-3);
  color: var(--iq-fg-muted);
  font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

body.iq-variant-techspec .legal__title {
  margin: 0;
  color: var(--iq-fg-primary);
  font-family: var(--iq-heading-font);
  font-weight: var(--iq-heading-weight);
  font-size: clamp(28px, 4vw, 52px);
  line-height: var(--iq-heading-leading);
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
  text-wrap: balance;
}

body.iq-variant-techspec .legal__revision {
  margin: var(--iq-gap-4) 0 0;
  padding-top: var(--iq-gap-4);
  border-top: var(--iq-seam);
  color: var(--iq-fg-muted);
  font-family: var(--iq-font);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-numeric-tracking);
  font-size: 13px;
}

/* --- Оглавление ----------------------------------------------------------- */
body.iq-variant-techspec .legal__toc {
  padding: var(--iq-panel-pad);
  border: var(--iq-panel-border);
  border-radius: var(--iq-panel-radius);
  background: var(--iq-panel-bg);
}

body.iq-variant-techspec .legal__toc-label {
  margin: 0 0 var(--iq-gap-4);
  color: var(--iq-fg-muted);
  font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

/* Нумерация берётся из счётчика, а не из маркеров списка: номер раздела —
   служебная подпись и набирается как подпись, а не как текст пункта. */
body.iq-variant-techspec .legal__toc-list {
  counter-reset: iq-legal-section;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: var(--iq-gap-3) var(--iq-gap-5);
  margin: 0;
  padding: 0;
  list-style: none;
}

body.iq-variant-techspec .legal__toc-list li {
  counter-increment: iq-legal-section;
  display: grid;
  grid-template-columns: 2.4em minmax(0, 1fr);
  align-items: baseline;
}

body.iq-variant-techspec .legal__toc-list li::before {
  content: counter(iq-legal-section, decimal-leading-zero);
  color: var(--iq-fg-muted);
  font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--iq-numeric-tracking);
}

body.iq-variant-techspec .legal__toc-list a {
  color: var(--iq-fg-primary);
  font-family: var(--iq-font);
  font-size: 14px;
  line-height: 1.4;
}

body.iq-variant-techspec .legal__toc-list a:hover,
body.iq-variant-techspec .legal__toc-list a:focus-visible {
  color: var(--iq-action-primary);
}

/* --- Тело документа -------------------------------------------------------
   Единственное место на сайте, где текст длинный. Ширина колонки держится в
   районе 70 знаков — дальше глаз теряет начало следующей строки. */
body.iq-variant-techspec .legal__body {
  max-width: 70ch;
  color: var(--iq-fg-primary);
  font-family: var(--iq-font);
  font-size: 16px;
  line-height: 1.65;
}

body.iq-variant-techspec .legal__body h2 {
  margin: var(--iq-gap-6) 0 var(--iq-gap-4);
  padding-top: var(--iq-gap-4);
  border-top: var(--iq-seam);
  font-family: var(--iq-heading-font);
  font-weight: var(--iq-heading-weight);
  font-size: clamp(19px, 2.2vw, 24px);
  line-height: 1.15;
  letter-spacing: var(--iq-heading-tracking);
  text-transform: uppercase;
  /* Якорь не должен уезжать под липкую шапку при переходе из оглавления. */
  scroll-margin-top: 120px;
}

body.iq-variant-techspec .legal__body h2:first-child {
  margin-top: 0;
  padding-top: 0;
  border-top: 0;
}

body.iq-variant-techspec .legal__body h3 {
  margin: var(--iq-gap-5) 0 var(--iq-gap-3);
  font-family: var(--iq-font);
  font-weight: 700;
  font-size: 16px;
  line-height: 1.35;
}

body.iq-variant-techspec .legal__body p {
  margin: 0 0 var(--iq-gap-4);
}

body.iq-variant-techspec .legal__body ul,
body.iq-variant-techspec .legal__body ol {
  margin: 0 0 var(--iq-gap-4);
  padding-left: 1.4em;
}

body.iq-variant-techspec .legal__body li {
  margin-bottom: var(--iq-gap-2);
}

body.iq-variant-techspec .legal__body strong {
  color: var(--iq-fg-primary);
  font-weight: 700;
}

body.iq-variant-techspec .legal__body a {
  color: var(--iq-action-primary);
  text-decoration: underline;
  text-underline-offset: 3px;
}

body.iq-variant-techspec .legal__body hr {
  margin: var(--iq-gap-6) 0;
  border: 0;
  border-top: var(--iq-seam);
}

/* Таблицы в правилах доставки узкие по смыслу, но на телефоне всё равно шире
   экрана — прокручиваются внутри себя, а не тянут страницу вбок. */
body.iq-variant-techspec .legal__body table {
  display: block;
  width: 100%;
  overflow-x: auto;
  border-collapse: collapse;
  font-variant-numeric: tabular-nums;
}

body.iq-variant-techspec .legal__body th,
body.iq-variant-techspec .legal__body td {
  padding: var(--iq-gap-2) var(--iq-gap-3);
  border: var(--iq-seam);
  text-align: left;
  vertical-align: top;
}

body.iq-variant-techspec .legal__body th {
  color: var(--iq-fg-muted);
  font: var(--iq-label-weight) var(--iq-label-size)/var(--iq-label-leading) var(--iq-label-font);
  letter-spacing: var(--iq-label-tracking);
  text-transform: uppercase;
}

@media (min-width: 1100px) {
  /* На широком экране оглавление уходит вбок и остаётся на виду: в документе на
     двадцать разделов это единственный способ не терять место. */
  body.iq-variant-techspec .legal__inner {
    grid-template-columns: minmax(0, 1fr) 300px;
    align-items: start;
    column-gap: var(--iq-gap-6);
  }
  body.iq-variant-techspec .legal__head {
    grid-column: 1 / -1;
  }
  body.iq-variant-techspec .legal__toc {
    position: sticky;
    top: 120px;
    grid-column: 2;
    grid-row: 2;
    max-height: calc(100vh - 160px);
    overflow-y: auto;
  }
  body.iq-variant-techspec .legal__toc-list {
    grid-template-columns: minmax(0, 1fr);
  }
  body.iq-variant-techspec .legal__body {
    grid-column: 1;
    grid-row: 2;
  }
}

/* --- 96-urgency-popup.css --- */
/* Urgency coupon popup — per-visitor single-use coupon, techspec look.
   Scoped narrowly to the elements this feature introduces; the .popup shell
   itself (position/overlay/open-close transition) is untouched and lives in
   assets/sass/blocks/popup/*.scss -> style.min.css. Loaded last so it can
   safely override style.min.css's plain .popup__title/.popup__subtitle. */

.iq-urgency-popup .popup__window {
  background-color: var(--iq-bg-canvas, #0b0c0e);
  border: 1px solid var(--iq-hair, rgba(232, 236, 240, .18));
  border-radius: var(--iq-radius-panel, 3px);
  color: var(--iq-fg-primary, #e8ecf0);
}

.iq-urgency-popup .popup__title {
  color: var(--iq-fg-primary, #e8ecf0);
  font-family: var(--iq-display), var(--iq-font);
}

.iq-urgency-popup .popup__subtitle {
  color: var(--iq-fg-muted, #7d8794);
  font-family: var(--iq-font);
  font-size: 18px;
}

.iq-urgency-popup__timer {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  margin: 32px auto 0;
  padding: 16px 24px;
  max-width: 320px;
  border: 1px solid var(--iq-hair, rgba(232, 236, 240, .18));
  border-radius: var(--iq-radius-panel, 3px);
  background: var(--iq-bg-surface, #131519);
}

.iq-urgency-popup__timer-label {
  font-family: var(--iq-font);
  font-size: 12px;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--iq-fg-muted, #7d8794);
  text-align: center;
}

.iq-urgency-popup__timer-value {
  font-family: 'IQ Manrope', monospace;
  font-variant-numeric: tabular-nums;
  font-size: 40px;
  font-weight: 700;
  color: var(--iq-action-primary, #6ee7ff);
  letter-spacing: .04em;
}

.iq-urgency-popup__apply-btn {
  position: relative;
  display: block;
  width: 100%;
  max-width: 320px;
  margin: 24px auto 0;
  padding: 18px 24px;
  border: 1px solid var(--iq-action-primary, #6ee7ff);
  border-radius: var(--iq-radius-panel, 3px);
  background: var(--iq-action-primary, #6ee7ff);
  color: var(--iq-button-primary-fg, #0b0c0e);
  font-family: var(--iq-font);
  font-size: 18px;
  font-weight: 700;
  letter-spacing: .02em;
  text-transform: uppercase;
  cursor: pointer;
  transition: opacity .15s ease, transform .15s ease;
}

/* Loading state: the request mints a coupon + signs a cookie + checks a rate
   limit server-side, real enough latency that the button needs to say so.
   Text stays in place (dimmed) rather than swapped out, so the button's
   height/width never jumps. */
.iq-urgency-popup__apply-btn.is-loading {
  cursor: default;
  color: transparent;
}
.iq-loading-calibrate {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 28px;
  height: 28px;
  margin: -14px 0 0 -14px;
  /* Sheet is a 4x2 grid of 200px cells (800x400 native) — scaled down to this
     element's 28px cell size, the whole sheet paints at 112x56 (28*4, 28*2),
     so each step below is exactly one cell width/height at that scale. */
  background: url('https://iqfitness.ru/wp-content/themes/flagstudio/assets/css/parts/../../img/loader/iq-loading-calibrate-sheet.png') 0 0 / 112px 56px no-repeat;
  animation: iq-calibrate 800ms steps(1) infinite;
}
@keyframes iq-calibrate {
  0%    { background-position:    0px    0px; }
  12.5% { background-position: -28px    0px; }
  25%   { background-position: -56px    0px; }
  37.5% { background-position: -84px    0px; }
  50%   { background-position:    0px -28px; }
  62.5% { background-position: -28px -28px; }
  75%   { background-position: -56px -28px; }
  87.5% { background-position: -84px -28px; }
}
@media (prefers-reduced-motion: reduce) {
  .iq-loading-calibrate { animation: none; background-position: -84px -28px; }
}

.iq-urgency-popup__apply-btn:hover,
.iq-urgency-popup__apply-btn:focus-visible {
  opacity: .88;
}

.iq-urgency-popup__apply-btn:active {
  transform: translateY(1px);
}

.iq-urgency-popup__apply-btn:disabled {
  cursor: default;
  opacity: .5;
}

.iq-urgency-popup .popup-form__error {
  margin: 16px auto 0;
  max-width: 320px;
  text-align: center;
  color: var(--iq-status-danger, #ff5a67);
  font-family: var(--iq-font);
  font-size: 14px;
}

.iq-urgency-popup__code-wrap {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  margin: 24px auto 0;
  padding: 20px;
  max-width: 320px;
  border: 1px dashed var(--iq-action-primary, #6ee7ff);
  border-radius: var(--iq-radius-panel, 3px);
}

.iq-urgency-popup__code-wrap[hidden] {
  display: none;
}

.iq-urgency-popup__code-label {
  font-family: var(--iq-font);
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: .08em;
  color: var(--iq-fg-muted, #7d8794);
}

.iq-urgency-popup__code {
  font-family: monospace;
  font-size: 28px;
  font-weight: 700;
  letter-spacing: .06em;
  color: var(--iq-fg-primary, #e8ecf0);
}

.iq-urgency-popup__code-hint {
  font-family: var(--iq-font);
  font-size: 13px;
  color: var(--iq-fg-muted, #7d8794);
  text-align: center;
}

@media (max-width: 767px) {
  .iq-urgency-popup__timer-value { font-size: 32px; }
  .iq-urgency-popup__apply-btn { font-size: 16px; padding: 16px; }
}

/* --- 97-contrast.css --- */
/* Контраст: места, где текст или значок сливались с подложкой.
 *
 * Значения измерены на живом проде 04.08.2026 через getComputedStyle, а не
 * взяты из макета. Файл идёт последним по имени, значит грузится после всех
 * остальных частей — переопределять что-то ещё для этого не нужно.
 */

/* Значок корзины на кнопке быстрой покупки.
 *
 * В style.min.css стоит «.catalog-item__cart svg, .catalog-item__like svg
 * { fill:#fff }» — одно правило на две разные кнопки. У «избранного» подложка
 * тёмная, там белый значок даёт 19:1 и всё в порядке. У корзины подложка
 * светло-голубая (#6EE7FF), и тот же белый значок даёт 1,44:1 при норме 3:1.
 *
 * Поэтому меняем только корзину и только на currentColor: цвет текста кнопки
 * уже подобран под её фон (#0B0C0E, 13,55:1), и при смене темы значок поедет
 * вместе с ним, а не останется белым на новом фоне.
 */
body .catalog-item__cart svg {
  fill: currentColor;
}

/* Цена в плавающей панели покупки на телефоне.
 *
 * Панель собирается скриптом (src/motion/buy-dock.js) и кладётся в конец body,
 * поэтому под правила товарной карточки не попадала: цена оставалась чёрной
 * (#000) на почти чёрной панели (#131519) — 1,15:1, то есть не видна вовсе.
 * Берём тот же светлый цвет, что и остальной текст интерфейса.
 */
.iq-buy-dock__price {
  color: var(--iq-fg-primary, #f2eefb);
}

/* Строка про согласие у кнопки оплаты (A1). Отдельным правилом, потому что
 * абзац лежит в блоке кнопок, где своей типографики нет — без этого он берёт
 * базовый кегль и спорит с самой кнопкой за внимание.
 */
.checkout__consent-note {
  margin: 12px 0 0;
  max-width: 46ch;
  color: var(--iq-fg-muted, #b6aec9);
  font: 400 12px/1.45 var(--iq-font, inherit);
}

/* Строка про возврат в карточке товара (A6). Рядом с основной кнопкой, но
 * заметно тише её: это справка, а не второе действие.
 */
.product__return-note {
  margin: 10px 0 0;
  max-width: 42ch;
  color: var(--iq-fg-muted, #b6aec9);
  font: 400 12px/1.45 var(--iq-font, inherit);
}
.product__return-note a {
  color: inherit;
  text-decoration: underline;
}

/* --- 98-touch-targets.css --- */
/* Зоны нажатия и читаемость на телефоне.
 *
 * Размеры сняты на живом проде при ширине 375 px. Норма — 44×44 (Apple HIG)
 * и 48×48 (Material); берём 44 как нижнюю границу, ниже неё палец промахивается.
 */

/* Поиск в открытом мобильном меню.
 *
 * Поле рисует плагин ajax-search-lite, его собственные стили приезжают после
 * темы и задают чёрный текст на прозрачном фоне. В мобильном меню подложка
 * тёмная (#131519), поэтому набранный запрос давал 1,15:1 — человек не видел,
 * что печатает. Высота была 28 px при норме 44.
 *
 * Целимся в поле внутри меню, а не в плагин целиком: на других страницах
 * поиск стоит на светлой подложке, там чёрный текст правильный.
 */
/* !important здесь не от лени: ajax-search-lite задаёт цвет и кегль своими
 * правилами с !important, и обычной специфичностью их не перебить — селектор
 * с id сработал только по min-height, которого у плагина нет. Правило
 * ограничено мобильным меню, поэтому на остальной поиск не влияет. */
#mobile-menu-nav .asl_w input.orig,
#mobile-menu-nav .probox input.orig {
  min-height: 44px;
  font-size: 16px !important; /* меньше 16 px — iOS сам зумит страницу при фокусе */
}

/* Цвет текста отдельным правилом и с длинной цепочкой классов.
 *
 * Плагин красит поле правилом вида «#ajaxsearchlite1 .probox .proinput
 * input.orig { color: … !important }» — id и три класса. Короткий селектор
 * выше проигрывает ему по специфичности: высота и кегль вставали, а цвет нет.
 * Здесь классов четыре, поэтому правило перевешивает.
 */
#mobile-menu-nav .asl_w .probox .proinput input.orig {
  color: var(--iq-fg-primary, #e8ecf0) !important;
}

#mobile-menu-nav .asl_w .probox .proinput input.orig::placeholder {
  color: var(--iq-fg-muted, #b6aec9) !important;
  opacity: 1; /* Firefox иначе гасит подсказку до 54 % и она пропадает */
}

/* Фильтры подбора по жанру и темпу.
 *
 * Высота 36 px. Ширину не трогаем — она задана содержимым, а по горизонтали
 * промахнуться труднее: соседний фильтр отделён отступом.
 *
 * Селектор с body — не украшение: в iq-visual.css уже стоит
 * «body .iq-filter-chip { min-height: 40px }», и правило без body ему
 * проигрывает по специфичности, даже находясь в файле, который грузится позже.
 */
body .iq-filter-chip {
  min-height: 44px;
}

