* { margin: 0; padding: 0; box-sizing: border-box; }
/* Декоративные transform:scale() у карточек (.in-focus — тач-аналог hover,
   см. core/interactions.js:attachCardMechanics) у крайней карточки в ряду
   могут вылезти на пару-десяток px за границу вьюпорта — это не должно
   рождать горизонтальный скролл страницы (mobile-instructions/02 п.2:
   "не должно быть скролла вбок нигде"). Сам scale не трогаем, просто не
   даём его краю создавать скроллбар.
   `clip`, не `hidden` — по спеке overflow-x:hidden без явного overflow-y
   заставляет overflow-y тоже стать вычисленным как auto, из-за чего body
   становится собственным scroll-контейнером и в мобильном рендеринге ломает
   position:sticky у потомков (найдено на .preview-wrap в constructor.html —
   вместо докрутки до top элемент просто скроллился вместе со страницей).
   overflow-x:clip даёт тот же эффект (не даёт горизонтального скролла), но
   не участвует в этой парной подмене оси. */
html { overflow-x: clip; }
body { background: var(--paper); color: var(--ink); font-family: 'Manrope', sans-serif; line-height: 1.5; -webkit-font-smoothing: antialiased; overflow-x: clip; }
h1, h2, h3 { font-family: 'Unbounded', sans-serif; letter-spacing: -0.01em; }
a { color: inherit; text-decoration: none; }
button { font-family: inherit; cursor: pointer; }
.wrap { max-width: 1180px; margin: 0 auto; padding: 0 32px; }

/* Притяжение к секциям сделано программно (initSoftSectionSnap в
   core/interactions.js), а не через CSS scroll-snap — он либо слишком
   жёсткий (mandatory), либо непредсказуемо тонкий и разный по браузерам
   (proximity). position:relative оставлен на случай абсолютно
   позиционированных детей внутри секций. */
.snap-section { position: relative; }
/* Один общий элемент на всю страницу, зафиксированный ровно на границе
   sticky-хедера (72px = .header-row height), а не внутри каждой секции —
   иначе вспышка плавает от паддингов конкретного блока и не совпадает
   с реальной линией под хедером. */
.section-seam { position: fixed; top: 72px; left: 0; right: 0; height: 1.4px; background: transparent; pointer-events: none; z-index: 51; overflow: hidden; }
/* Полноширинная линия "заливается" слева направо через scaleX (не короткий
   сегмент, едущий по дорожке) — transform-origin:left держит левый край
   на месте, пока правый край растёт от 0 до 100% ширины. После заливки —
   быстрый fade-out. */
.section-seam::after {
  content: '';
  position: absolute;
  top: 0; left: 0;
  width: 100%; height: 100%;
  background: var(--orange);
  box-shadow: 0 0 16px rgba(255,91,30,.5);
  transform: scaleX(0);
  transform-origin: left;
  opacity: 0;
}
.section-seam.flash::after { animation: seamFill 0.8232s ease; }
@keyframes seamFill {
  0% { transform: scaleX(0); opacity: 1; }
  65% { transform: scaleX(1); opacity: 1; }
  100% { transform: scaleX(1); opacity: 0; }
}

/* Скидка на товар (core/format.js:priceHTML) — зачёркнутая старая цена рядом
   с новой, используется на карточках/детальных страницах по всей витрине. */
.price-old { color: var(--muted); font-weight: 400; margin-right: 2px; }
.price-new { color: var(--orange-dark); }
