/* ==========================================================================
   NEVERLATE 2.0 · демо · app.css
   Оболочка приложения и общие компоненты поверх nl.css. Префикс app-.
   Раскладка задаётся классом на #nl-frame: .is-m (телефон) или .is-d (десктоп),
   а не медиазапросами, поэтому телефонный вид работает и в рамке на ноутбуке.
   Цвета и размеры только из токенов nl.css.
   ========================================================================== */

html, body { margin: 0; height: 100%; background: var(--surface-0); }
body { overflow: hidden; font-family: var(--font-sans); color: var(--ink-900); }
#nl-root { position: fixed; inset: 0; }
.nl [hidden] { display: none !important; }

/* ---------- Сцена, устройство, кадр ---------- */
.app-stage { position: absolute; inset: 0; overflow: hidden; background: var(--surface-0); }
.app-device { position: relative; box-sizing: border-box; width: 100%; height: 100%; }
.app-frame {
  position: relative; width: 100%; height: 100%; overflow: hidden; isolation: isolate;
  background: var(--surface-0);
  --app-gutter: 16px; --app-head-h: 52px; --app-sticky-top: 0px; --app-bottom: 0px;
  --app-edge: var(--app-gutter); --app-max: 1760px; --app-cards: 4; --aside-w: 440px; --aside-gap: 56px;
}
/* ---------- Колонка десктопа ----------
   Всё содержимое стоит в одной колонке: до --app-max (1760) шириной, по центру окна, поля --app-gutter растут с окном
   (100vw / 36 = 2.78vw: 40 при 1440, как на досках D-*, от 24 до 64). --app-edge — расстояние от края окна до края колонки,
   L = --app-edge, R = ширина окна − --app-edge. Считается от окна (vw), а не от родителя, поэтому одинаково работает
   в любой вложенности: поля .app-wrap, полосы во всю ширину (padding: 0 var(--app-edge)), выход в край (margin: 0 calc(-1 * var(--app-edge))).
   В край окна уходят только фоны полос (промо, шапка, мега-меню, рассылка, подвал, тонированные полосы) и фото героев и баннеров линий;
   текст и кнопки на них стоят на краях колонки.
   --aside-w / --aside-gap — правая колонка (покупка, итог корзины, итог оформления, форма входа): minmax(0, 1fr) 440, зазор 56.
   --app-cards — карточек в ряду сетки на всю колонку: 4, с окна 1600 (колонка 1512) — 5, как в замечании владельца «5 колонок от 1600px» */
.app-frame.is-d {
  --app-gutter: clamp(24px, 100vw / 36, 64px); --app-head-h: 64px; --app-sticky-top: 0px;
  --app-edge: max(var(--app-gutter), (100vw - var(--app-max)) / 2);
}
@supports (width: round(1px, 1px)) {
  .app-frame.is-d {
    --app-gutter: round(clamp(24px, 100vw / 36, 64px), 1px);
    --app-edge: max(var(--app-gutter), round(down, (100vw - var(--app-max)) / 2, 1px));
  }
}
@media (min-width: 1600px) { .app-frame.is-d { --app-cards: 5; } }
/* Принудительный десктоп в окне уже 900 (рамка 1180, масштаб): vw здесь — ширина окна, поэтому поля задаём числом */
.app-device.is-scaled .app-frame.is-d { --app-gutter: 32px; --app-edge: 32px; }
.app-frame.is-d.has-head { --app-sticky-top: 64px; }
/* Телефон: шапка 56 px, липкая и не прячется при прокрутке — над контентом постоянно только она */
.app-frame.is-m { --header-h: 56px; --app-head-h: 56px; }
.app-frame.is-m.has-head { --app-sticky-top: var(--header-h); }
.app-frame.is-m.has-tabbar { --app-bottom: var(--tabbar-h); }
.app-stage.is-auto .app-frame.is-m.has-tabbar { --app-bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px)); }

/* Принудительный десктоп в окне уже 900 px: ядро ставит .is-scaled, ширину 1180 и масштаб по ширине окна (без горизонтальной прокрутки).
   От 900 px десктоп занимает окно как есть: шапка ужимается контейнерными запросами */
.app-stage.is-desktop .app-device.is-scaled { transform: scale(var(--app-scale, 1)); transform-origin: 0 0; }

/* Телефон в рамке на ноутбуке */
.app-stage.is-phone { display: flex; align-items: center; justify-content: center; background: var(--surface-200); }
.app-stage.is-phone .app-device {
  flex: none; width: 414px; height: 868px; padding: 12px; border-radius: 58px;
  background: var(--ink-900); box-shadow: 0 0 0 1px var(--ink-700), var(--shadow-md);
  transform: scale(var(--app-scale, 1)); transform-origin: center center;
}
.app-stage.is-phone .app-frame { border-radius: 46px; }
/* Полоса «домой» внизу экрана телефона: таб-бар и шторки не уходят под скругление */
.app-stage.is-phone .app-frame.is-m.has-tabbar { --app-bottom: calc(var(--tabbar-h) + 20px); }
.app-stage.is-phone .app-tabbar { height: calc(var(--tabbar-h) + 20px); padding-bottom: 20px; }
.app-stage.is-phone .app-sheet--bottom .app-sheet__body { padding-bottom: 44px; }
.app-stage.is-phone .app-sheet--bottom .app-sheet__foot { padding-bottom: 36px; }

/* Прокрутка страницы внутри кадра */
.app-scroll {
  position: absolute; inset: 0; display: flex; flex-direction: column;
  overflow-x: hidden; overflow-y: auto; overscroll-behavior: contain; -webkit-overflow-scrolling: touch;
  scrollbar-gutter: stable; /* короткая страница без полосы прокрутки не сдвигает шапку */
}
.app-scroll > * { flex-shrink: 0; }
.app-main { display: block; flex: 1 0 auto; min-width: 0; outline: none; }
/* Низ страницы не прячется под таб-баром и плавающей панелью над ним (--app-float-h ставит ядро по высоте панели) */
.app-endspace { flex: none; height: calc(var(--app-bottom) + var(--app-float-h, 0px)); }
/* Только демо: на десктопе под подвалом 64 px (переключатель «Вид / Сценарии» 40 + 12 снизу + 12), чтобы он не закрывал навсегда
   логотип и «© ООО «Амбишин»». На сайте переключателя нет — и этой полосы тоже */
.app-frame.is-d .app-endspace { height: 64px; }

/* Слой для плавающих элементов страницы (панель покупки, «Итого»), очищается при переходе.
   Стоит прямо над таб-баром: панели внутри позиционируются от его верхней кромки */
.app-float { position: absolute; left: 0; right: 0; bottom: var(--app-bottom); z-index: var(--z-sticky); height: 0; }
.app-float > * { pointer-events: auto; }

/* ---------- Сетка страницы, заголовки, утилиты ---------- */
.app-wrap { width: 100%; padding-left: var(--app-edge); padding-right: var(--app-edge); }
.is-m .app-wrap--flush-m { padding-left: 0; padding-right: 0; }
/* Колонка внутри колонки не даёт второго поля */
.is-d .app-wrap .app-wrap { padding-left: 0; padding-right: 0; }
.app-page { padding-top: var(--space-md); padding-bottom: var(--section); }
.is-d .app-page { padding-top: var(--space-lg); padding-bottom: var(--section-d); }
.app-section { margin-top: var(--section); }
.is-d .app-section { margin-top: var(--section-d); }
.app-h1 { font-size: var(--text-xl); line-height: var(--leading-tight); font-weight: 500; letter-spacing: var(--tracking-snug); }
.is-d .app-h1 { font-size: var(--text-2xl); line-height: 1.15; letter-spacing: var(--tracking-display); }
.app-h2 { font-size: var(--text-lg); line-height: 1.25; font-weight: 500; letter-spacing: var(--tracking-snug); }
.is-d .app-h2 { font-size: var(--text-xl); line-height: var(--leading-tight); }
.app-h3 { font-size: var(--text-md); line-height: 1.3; font-weight: 500; }
.app-lead { font-size: var(--text-md); line-height: var(--leading-base); color: var(--ink-700); max-width: 60ch; }
.app-stack { display: flex; flex-direction: column; gap: var(--stack-related); }
.app-row { display: flex; align-items: center; gap: var(--space-sm); }
.app-link { color: var(--ink-900); text-decoration: underline; text-decoration-color: var(--line-400); text-underline-offset: 4px; }
.app-link:hover { text-decoration-color: currentColor; }
.is-d .app-only-m, .is-m .app-only-d { display: none !important; }
.app-hatch { background: repeating-linear-gradient(-45deg, var(--line-300) 0 4px, var(--surface-100) 4px 8px); }
.app-btnreset { padding: 0; border: 0; background: none; font: inherit; color: inherit; cursor: pointer; }

/* ---------- Промо-полоса: три сообщения, пауза ---------- */
/* Обрезает сообщения сама лента (overflow у .nl-promo снят), чтобы зона касания паузы могла выйти за полосу */
.app-promo { justify-content: space-between; gap: 0; padding: 0 0 0 44px; overflow: visible; }
.app-promo__msgs { position: relative; flex: 1; min-width: 0; height: 32px; overflow: hidden; }
.app-promo__msg {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  overflow: hidden; white-space: nowrap; text-overflow: ellipsis; opacity: 0; transform: translateY(8px);
  transition: opacity var(--duration-base) var(--ease-out), transform var(--duration-base) var(--ease-out);
}
.app-promo__msg.is-on { opacity: 1; transform: none; }
.app-promo__msg.is-gone { opacity: 0; transform: translateY(-8px); }
.app-promo__btn { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 44px; height: 32px; padding: 0; border: 0; background: transparent; color: var(--on-dark); cursor: pointer; }
.app-promo__btn:focus-visible { outline: 2px solid var(--on-dark); outline-offset: -4px; }
/* Полоса 32 px, кнопка паузы 44×32: зона касания заходит на 6 px в пустое верхнее поле шапки (38 px) и стоит над шапкой по слою.
   Ниже нельзя: с 38 px начинаются зоны поля поиска и лупы шапки телефона */
.app-promo__btn { position: relative; z-index: calc(var(--z-sticky) + 1); }
.app-promo__btn::after { content: ''; position: absolute; inset: 0 0 -6px; }
/* Десктоп: фон в край, текст и пауза в колонке. Значок 16 в кнопке 44 правым краем на R (зона касания заходит в поле на 14),
   слева противовес 30, чтобы текст стоял по центру колонки */
.is-d .app-promo { padding: 0 var(--app-edge); }
.is-d .app-promo__msgs { margin-left: 30px; }
.is-d .app-promo__btn { margin-right: -14px; }

/* ---------- Счётчики ---------- */

/* ---------- Шапка десктопа ---------- */
.app-dhead { position: sticky; top: 0; z-index: var(--z-sticky); background: var(--surface-0); border-bottom: 1px solid var(--line-300); }
/* Поля шапки = поля колонки на любой ширине: логотип на L, значок последней иконки на R (зона 44 заходит в поле на 10) */
.app-dhead__bar { display: flex; align-items: center; gap: 48px; height: 64px; padding: 0 var(--app-edge); }
.app-dhead__tools { margin-left: auto; display: flex; align-items: center; gap: 4px; }
.app-dhead__tools > :last-child { margin-right: -10px; }
.app-nav { display: flex; align-items: stretch; gap: 32px; height: 64px; }
.app-nav__item {
  position: relative; display: inline-flex; align-items: center; gap: 4px; height: 64px; padding: 0; border: 0; background: none;
  font-family: var(--font-sans); font-size: var(--text-sm); font-weight: 500; color: var(--ink-900); text-decoration: none; white-space: nowrap; cursor: pointer;
}
.app-nav__item::after { content: ""; position: absolute; left: 0; right: 0; bottom: 20px; height: 2px; background: var(--ink-900); transform: scaleX(0); transform-origin: left center; transition: transform var(--duration-fast) var(--ease-out); }
button.app-nav__item::after { right: 20px; }
.app-nav__item:hover::after, .app-nav__item.is-current::after, .app-nav__item[aria-expanded="true"]::after { transform: scaleX(1); }
.app-nav__item .i { transition: transform var(--duration-base) var(--ease-out); }
.app-nav__item[aria-expanded="true"] .i { transform: rotate(180deg); }

/* Поле поиска: .app-dsearch держит место в шапке (ширина по ступеням ниже), видимое поле — .app-dsearch__box поверх.
   Открыто (.is-open, search.js NL.dsearch): поле за 200 мс расширяется ВЛЕВО до --dsearch-w (≤ 560, не ближе 40 к логотипу),
   правый край стоит на месте, остальная шапка не двигается; пункты меню под полем гаснут (.is-under-search) */
.app-dsearch { position: relative; flex: none; width: 280px; height: 40px; margin-right: 12px; }
.app-dsearch__box { position: absolute; top: 0; right: 0; bottom: 0; z-index: 3; display: flex; align-items: center; width: 100%; transition: width var(--duration-fast) var(--ease-out); }
.app-dsearch__box > .i { position: absolute; left: 14px; color: var(--ink-700); pointer-events: none; }
.app-dsearch input {
  width: 100%; height: 40px; padding: 0 14px 0 42px; border: 1px solid var(--line-400); border-radius: var(--radius-sm);
  background: var(--surface-0); color: var(--ink-900); font-family: inherit; font-size: var(--text-sm); -webkit-appearance: none; appearance: none;
  transition: border-color var(--duration-fast) var(--ease-out);
  text-overflow: ellipsis;
}
/* Подсказку рисует .app-dsearch__ph поверх поля (у системной подсказки текст один): в широком поле «Леггинсы, топы, артикул»,
   в узком — «Поиск», без многоточия, в открытом — всегда длинная. Видна, пока поле пустое.
   Системный крестик type=search держит место даже у пустого поля — вместо него свой .app-dsearch__clear (только в открытом поле с текстом) */
.app-dsearch input::placeholder { color: transparent; }
.app-dsearch__ph { position: absolute; left: 42px; right: 14px; top: 50%; transform: translateY(-50%); overflow: hidden; font-size: var(--text-sm); line-height: 20px; color: var(--ink-500); white-space: nowrap; pointer-events: none; }
.app-dsearch input:not(:placeholder-shown) ~ .app-dsearch__ph { display: none; }
.app-dsearch__ph-s { display: none; }
.app-dsearch input::-webkit-search-cancel-button { -webkit-appearance: none; appearance: none; display: none; }
.app-dsearch input:hover { border-color: var(--ink-500); }
.app-dsearch input:focus { outline: none; border-color: var(--ink-900); box-shadow: 0 0 0 1px var(--ink-900); }

/* Узкий десктоп: шапка ужимается по своей ширине (контейнерные запросы, ширина шапки = ширина окна; в рамке 1180 — 1180).
   Поля не трогаем (они у колонки), ужимаются только промежутки и поле поиска; уже 1040 «Последний шанс» уходит в мега-меню
   (там он есть в «Подборках»). Запас между меню и инструментами на нижней ширине каждой ступени — не меньше 20 px:
   ≥1440 меню 32, поиск 280 · 1321–1439 меню 24, поиск 240 · 1241–1320 поиск 200 «Поиск» · 1161–1240 меню 20, поиск 160 ·
   1041–1160 поиск — значок · 900–1040 без «Последнего шанса», меню 24 */
.app-dhead { container-type: inline-size; }
.app-nav, .app-dhead__tools { min-width: 0; }
@container (max-width: 1439px) {
  .app-dhead__bar { gap: 40px; }
  .app-nav { gap: 24px; }
  .app-dsearch { width: 240px; }
}
@container (max-width: 1320px) {
  .app-dhead__bar { gap: 32px; }
  .app-help { margin-right: 12px; }
  .app-dsearch { width: 200px; margin-right: 8px; }
  .app-dsearch__ph-l { display: none; }
  .app-dsearch__ph-s { display: inline; }
}
@container (max-width: 1240px) {
  .app-dhead__bar { gap: 24px; }
  .app-nav { gap: 20px; }
  .app-dsearch { width: 160px; }
}
@container (max-width: 1160px) {
  .app-dsearch { width: 44px; margin-right: 0; }
  .app-dsearch__box > .i { left: 12px; color: var(--ink-900); }
  .app-dsearch input { padding: 0; border-color: transparent; color: transparent; cursor: pointer; }
  .app-dsearch__ph { display: none; }
  .app-dsearch input:hover { border-color: var(--line-400); }
}
@container (max-width: 1040px) {
  .app-nav { gap: 24px; }
  .app-help { margin-right: 8px; }
  .app-nav__item[data-token="cat-sale"] { display: none; }
}
/* Страница выдачи: поле в шапке того же размера и на том же месте, что на остальных страницах (значок 44 на 1041–1160, ширины ступеней
   выше), правый край не двигается и «Помощь» остаётся на месте. Запрос показывает открытое поле (search.js dsSetQuery) и заголовок страницы */
/* Открытое поле (после ступеней: перекрывает значок 1041–1160 и короткую подсказку) */
.app-dsearch.is-open .app-dsearch__box { width: var(--dsearch-w, 100%); }
.app-dsearch.is-open input { padding: 0 14px 0 42px; border-color: var(--ink-900); box-shadow: 0 0 0 1px var(--ink-900); color: var(--ink-900); cursor: text; }
.app-dsearch.is-open.has-q input { padding-right: 44px; }
.app-dsearch.is-open .app-dsearch__box > .i { left: 14px; color: var(--ink-700); }
.app-dsearch.is-open .app-dsearch__ph { display: block; }
.app-dsearch.is-open .app-dsearch__ph-l { display: inline; }
.app-dsearch.is-open .app-dsearch__ph-s { display: none; }
.app-dsearch__clear { position: absolute; top: 4px; right: 4px; display: none; align-items: center; justify-content: center; width: 32px; height: 32px; padding: 0; border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--ink-700); cursor: pointer; }
.app-dsearch.is-open.has-q .app-dsearch__clear { display: inline-flex; }
.app-dsearch__clear:hover { color: var(--ink-900); background: var(--surface-100); }
.app-dsearch__clear:focus-visible { outline-offset: 0; }
.app-nav__item, .app-help { transition: opacity var(--duration-fast) var(--ease-out), visibility 0s linear 0s; }
.app-nav__item.is-under-search, .app-help.is-under-search { opacity: 0; visibility: hidden; transition: opacity 120ms var(--ease-out), visibility 0s linear 120ms; }
@media (prefers-reduced-motion: reduce) { .app-dsearch__box, .app-nav__item, .app-help { transition: none; } }

/* «Помощь» с выпадающей панелью */
.app-help { position: relative; display: flex; align-items: center; margin-right: 20px; }
.app-help__btn { position: relative; display: inline-flex; align-items: center; gap: 4px; height: 44px; padding: 0; border: 0; background: none; font-family: var(--font-sans); font-size: var(--text-sm); font-weight: 500; line-height: 1; color: var(--ink-900); cursor: pointer; }
.app-help__btn::after { content: ""; position: absolute; left: 0; right: 20px; bottom: 10px; height: 2px; background: var(--ink-900); transform: scaleX(0); transform-origin: left center; transition: transform var(--duration-fast) var(--ease-out); }
.app-help__btn:hover::after, .app-help__btn[aria-expanded="true"]::after { transform: scaleX(1); }
.app-help__btn .i { transition: transform var(--duration-base) var(--ease-out); }
.app-help__btn[aria-expanded="true"] .i { transform: rotate(180deg); }
.app-helpdd { position: absolute; top: 54px; left: -16px; z-index: 2; width: 280px; padding: 8px 0; border-radius: var(--radius-sm); background: var(--surface-0); box-shadow: var(--shadow-md); animation: app-dd-in var(--duration-fast) var(--ease-out) both; }
.app-helpdd ul { margin: 0; padding: 0; list-style: none; }
.app-helpdd__link { display: flex; align-items: center; gap: 10px; min-height: 40px; padding: 0 16px; font-size: var(--text-sm); line-height: 1.3; color: var(--ink-900); text-decoration: none; }
.app-helpdd__link:hover { background: var(--surface-100); }
.app-helpdd__link > .i { color: var(--ink-700); }
.app-helpdd__sep { height: 1px; margin: 8px 16px; background: var(--line-300); }
.app-helpdd__contact { display: flex; flex-direction: column; gap: 2px; padding: 4px 16px; }
.app-helpdd__tel { align-self: flex-start; font-size: var(--text-md); line-height: 1.3; font-weight: 500; color: var(--ink-900); text-decoration: none; font-variant-numeric: tabular-nums; }
@keyframes app-dd-in { from { opacity: 0; transform: translateY(-8px); } to { opacity: 1; transform: none; } }

/* Мега-меню «Каталог»: фон в край, колонки от L, плитка на R */
.app-mega { position: absolute; left: 0; right: 0; top: 100%; z-index: 2; background: var(--surface-0); border-top: 1px solid var(--line-300); box-shadow: var(--shadow-md); animation: app-dd-in var(--duration-fast) var(--ease-out) both; }
.app-mega__in { display: grid; grid-template-columns: 200px 400px 200px minmax(0, 1fr); gap: 48px; padding: 40px var(--app-edge); }
.app-mega__col { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
.app-mega__cats { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 32px; }
.app-mm { display: flex; align-items: center; gap: 8px; font-size: var(--text-sm); line-height: 32px; color: var(--ink-900); text-decoration: none; white-space: nowrap; }
.app-mm:hover { text-decoration: underline; text-decoration-color: var(--line-400); text-underline-offset: 5px; }
.app-mm__n { font-size: var(--text-xs); color: var(--ink-500); font-variant-numeric: tabular-nums; }
.app-mm--all { text-decoration: underline; text-decoration-color: var(--line-400); text-underline-offset: 5px; }
.app-mmgroup { display: block; margin-top: 14px; font-size: var(--text-xs); line-height: 24px; font-weight: 500; color: var(--ink-500); }
.app-mmgroup:first-child { margin-top: 0; }
.app-mega__tile { justify-self: end; width: 260px; aspect-ratio: 3 / 4; }
.app-mega__tile .nl-tile__caption { text-shadow: 0 1px 12px rgba(34, 30, 28, 0.28); }
.app-mega__tile .t-eyebrow { color: rgba(255, 255, 255, 0.9); }
.app-mega-scrim { position: absolute; left: 0; right: 0; top: 100%; z-index: 1; height: 100vh; background: var(--scrim); animation: nl-fade-in var(--duration-fast) var(--ease-out) both; }
/* Уже 1280 три колонки ссылок и плитка 260 не встают в колонку (плитка наезжала на «По свойствам», на 900 — за край окна):
   плитку убираем, колонки по содержимому (194 / 412 / 163), до 1040 зазор 32 — помещается от окна 900 */
@container (max-width: 1279px) {
  .app-mega__in { grid-template-columns: repeat(3, auto); justify-content: start; }
  .app-mega__tile { display: none; }
}
@container (max-width: 1040px) { .app-mega__in { column-gap: 32px; } }

/* Упрощённая шапка оформления */
.app-dhead__min { display: flex; align-items: center; gap: 24px; margin-left: auto; font-size: var(--text-sm); color: var(--ink-700); }
.app-dhead__min a { color: var(--ink-900); }
/* Справа телефон: поля те же, что у основной шапки, поэтому он кончается ровно на R */

/* ---------- Шапка телефона ----------
   Лупа сверху, всё остальное в таб-баре. Липкая, 56 px, при прокрутке не прячется (владелец 13.10.2026).
   Лупа ВСЕГДА свёрнута (владелец 14.10.2026: «Лупа на телефоне свёрнута всегда должна быть»): поля поиска в шапке нет,
   анимации сворачивания и разворота нет. Корень вкладки (.app-mhead--logo): [логотип … лупа 44].
   Внутренняя страница (.app-mhead--back): [Назад 44] [название, скрыто] [лупа 44]; название 16/500 проявляется (.is-titled, 200 мс),
   только когда H1 содержимого ушёл под шапку (core.js mheadWatch). Оформление: [Назад] «Оформление заказа».
   Поля 4: стрелка «Назад» и лупа рисуются на 16 от краёв экрана, логотип — с 16 (поле 4 + 12) */
/* Нижняя линия — тенью внутрь, а не border: так содержимое центрируется во всех 56 px (зоны 44 на 6, значки на 16)
   и края значков ложатся на целые пиксели при DPR 1 и 3 (с border центр был в 55 px, всё на .5) */
.app-mhead { position: sticky; top: 0; z-index: var(--z-sticky); flex: none; gap: 4px; padding: 0 var(--space-md) 0 4px; border-bottom: 0; box-shadow: inset 0 -1px 0 var(--line-300); }
.app-mhead--min { padding-right: var(--space-md); }
.app-mhead--back, .app-mhead--logo { padding: 0 4px; }
.app-mhead__back, .app-mhead__search { flex: none; }
.app-mhead__search { margin-left: auto; }
.app-mhead__logo { display: inline-flex; align-items: center; flex: none; height: 44px; padding: 0 8px 0 12px; }
.app-mhead__title { flex: 1; min-width: 0; padding: 0 4px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: var(--text-md); line-height: 1.25; font-weight: 500; letter-spacing: var(--tracking-snug); }
.app-mhead--back .app-mhead__title {
  opacity: 0; transform: translateY(4px);
  transition: opacity var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
}
.app-mhead--back.is-titled .app-mhead__title { opacity: 1; transform: none; }
/* Шапка только что создана (новый экран, «Назад» с прокруткой) — название по прокрутке ставится сразу */
.app-mhead.is-instant, .app-mhead.is-instant * { transition: none !important; }

/* ---------- Таб-бар ---------- */
.app-tabbar { position: absolute; left: 0; right: 0; bottom: 0; z-index: var(--z-sticky); }
.app-stage.is-auto .app-tabbar { height: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px)); padding-bottom: env(safe-area-inset-bottom, 0px); }
.app-tabbar a { -webkit-tap-highlight-color: transparent; }
.app-tabbar a:focus-visible { outline-offset: -4px; }
/* Счётчик привязан к правому верхнему углу значка и растёт вправо: двузначное число не закрывает ручку сумки */
.app-tabbar .nl-count { right: auto; left: calc(50% + 4px); }

/* ---------- Подвал ---------- */
.app-dfoot { flex: none; margin-top: 0; border-top: 1px solid var(--line-300); background: var(--surface-0); }
/* Фон и верхняя линия в край, содержимое от L до R. Правило DS «ничего не тянется» (владелец 13.10, третья волна):
   колонки ссылок по содержимому (160–240), зазор 48–64 (48 на 1280, 64 с 1728), группой слева; «Контакты» прижаты к R;
   нижняя строка — логотип и © на L, способы оплаты на R */
.app-dfoot__in { padding: 48px var(--app-edge) 32px; }
.app-dfoot__grid { display: flex; align-items: flex-start; gap: 40px clamp(48px, 3.7vw, 64px); }
.app-dfoot__col { display: flex; flex-direction: column; align-items: flex-start; gap: 12px; flex: 0 1 auto; min-width: 160px; max-width: 240px; }
.app-dfoot__col:last-child { flex: none; margin-left: auto; } /* «Контакты» не сжимаются: телефон в одну строку и на 900 */
.app-dfoot .app-ftel { white-space: nowrap; }
.app-dfoot__col .t-eyebrow { margin-bottom: 4px; }
.app-flink { font-size: var(--text-sm); line-height: 1.4; color: var(--ink-700); text-decoration: none; }
.app-flink:hover { color: var(--ink-900); text-decoration: underline; text-decoration-color: var(--line-400); text-underline-offset: 4px; }
.app-ftel { font-size: var(--text-lg); line-height: 24px; font-weight: 500; letter-spacing: var(--tracking-snug); color: var(--ink-900); text-decoration: none; font-variant-numeric: tabular-nums; }
.app-social { display: flex; flex-wrap: wrap; gap: 20px; }
.app-social a, .app-social button { padding: 0; border: 0; background: none; font-family: inherit; font-size: var(--text-sm); font-weight: 500; color: var(--ink-900); text-decoration: underline; text-decoration-color: var(--line-400); text-underline-offset: 4px; cursor: pointer; }
.app-dfoot__bottom { display: flex; align-items: center; gap: 24px; margin-top: 40px; padding-top: 24px; border-top: 1px solid var(--line-300); }
.app-pay { display: flex; flex-wrap: wrap; gap: 8px; margin: 0; padding: 0; list-style: none; }
.app-dfoot__bottom .app-pay { margin-left: auto; }

.app-mfoot { flex: none; display: flex; flex-direction: column; margin-top: 0; padding: 24px 16px 32px; border-top: 1px solid var(--line-300); background: var(--surface-0); }
.app-mfoot > .nl-acc:first-child { border-top: 0; }
.app-mfoot__links { margin: 0; padding: 0 0 8px; list-style: none; }
.app-mfoot__links a { display: flex; align-items: center; min-height: 44px; font-size: var(--text-sm); color: var(--ink-700); text-decoration: none; }
.app-mfoot__contacts { display: flex; flex-direction: column; align-items: flex-start; padding-top: 28px; }
.app-mfoot__contacts .app-ftel { display: inline-flex; align-items: center; min-height: 44px; margin-top: 4px; }

/* ---------- Карточка товара: дополнения к nl-card ---------- */
.app-card__img { position: relative; display: block; height: 100%; }
/* Фото листается наведением (десктоп): кадры лежат стопкой, виден один, смена без перехода; полоски внизу — какой кадр из скольких */
.app-card .app-card__img img { transition: none; }
.app-card .nl-card__media img.app-card__frame { position: absolute; inset: 0; opacity: 0; }
.app-card .nl-card__media img.app-card__frame.is-on { opacity: 1; }
.app-card.is-soldout .nl-card__media img.app-card__frame.is-on { opacity: 0.5; }
.app-card .app-card__img.is-scrub > img:first-child { opacity: 0; }
/* Полосы как в DS холста (nl.css, .nl-card__segs, 13.10): тёмные полосы 16 × 2 на белой плашке-пилюле 92 % (как чип «1 / 5»
   в галерее) — видны и на светлом студийном, и на тёмном фото. Плашка слева внизу, по центру высоты «+» 36:
   8 + (36 − 14) / 2 = 19. Текущая полоса — --ink-900, остальные — тёмные 24 %. Пока открыта панель размеров, полос нет */
.app-card .app-card__segs {
  left: var(--space-xs); right: auto; bottom: 19px; gap: 4px; padding: 6px var(--space-xs); border-radius: var(--radius-pill);
  background: rgba(254, 252, 251, 0.92); opacity: 0; pointer-events: none; transition: opacity var(--duration-fast) var(--ease-out);
}
.app-card .app-card__segs span { flex: none; width: 16px; height: 2px; border-radius: 1px; background: rgba(34, 30, 28, 0.24); }
.app-card .app-card__segs span.is-active { background: var(--ink-900); }
.is-m .app-card__segs { display: none; }
@media (hover: hover) {
  .is-d .app-card:hover .app-card__segs { opacity: 1; }
  .is-d .app-card:has(.app-quick.is-open) .app-card__segs { opacity: 0; }
}
.app-card__name { text-decoration: none; }
/* Карточка (владелец 13.10.2026, третья волна): без надзаголовка; название всегда занимает 2 строки, строка свойств — 1 строку
   (одна серая строка, многоточие), даже если данных нет, — поэтому цены в ряду стоят на одной линии */
.app-card .nl-card__name { min-height: calc(2em * 1.35); }
/* Строка свойств по частям («Утягивают» + «· Высокая посадка»): части в ряд с переносом, высота — одна строка. Вторая часть, которая
   не помещается рядом с первой, уходит во вторую (скрытую) строку целиком — словарное слово не режется («Утягивают» вместо
   «Утягивают · Высокая посад…» в сетке 390). Первая не помещается одна: если влезает вторая — видна вторая (.is-alt, NL.propsSync),
   иначе первая с многоточием (лента 320 шириной 103: «Средняя поддержка») */
.app-card__props { display: flex; flex-wrap: wrap; min-width: 0; height: calc(1em * 1.35); overflow: hidden; white-space: nowrap; }
.app-card__pp { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.app-card__pp + .app-card__pp { flex: none; }
.app-card__props.is-alt .app-card__pp:first-child, .app-card__props.is-alt .app-card__sep { display: none; }
.app-card__props.is-alt .app-card__pp + .app-card__pp { flex: 0 1 auto; }
/* Узкая лента телефона (на 375 и уже слово пользы/посадки/поддержки целиком не помещается: «Средняя поддержка» шире 120–127):
   слово словаря не режем. NL.propsSync ставит ленте (и ряду мини-карточек поиска) .is-props2, если у какой-то карточки первая часть не влезает в одну строку:
   тогда у КАЖДОЙ карточки ленты строка свойств занимает две строки (цены на одной линии), видна одна часть — первая, по словам
   («Средняя / поддержка»); вторая часть не влезает и уходит целиком (правило владельца 13.10.2026) */
.is-props2 .app-card__props { height: calc(2em * 1.35); white-space: normal; align-content: flex-start; }
.is-props2 .app-card__props .app-card__pp { flex: 0 1 auto; overflow: visible; text-overflow: clip; }
.is-props2 .app-card__props .app-card__pp + .app-card__pp, .is-props2 .app-card__props .app-card__sep { display: none; }
.is-props2 .app-card__props.is-alt .app-card__pp:first-child { display: block; }
/* Лента телефона уже 375 (карточка меньше 150, название 100–120 px): «Моделирующий» не влезает — переносим по слогам (lang=ru);
   если словаря нет — по букве, но не обрезаем посреди слова. На 375 и шире слова переносятся целиком, как раньше */
.is-m .app-rail__item { container-type: inline-size; }
.is-m .app-rail .nl-card__name { overflow-wrap: anywhere; }
@container (max-width: 149px) { .app-rail .nl-card__name { -webkit-hyphens: auto; hyphens: auto; } }
.app-card .nl-card__name:focus-visible { outline: none; }
.app-card:has(.nl-card__name:focus-visible) { outline: 2px solid var(--ink-900); outline-offset: 4px; }
.app-card .nl-card__fav:focus-visible, .app-card .nl-card__quick:focus-visible { outline: none; box-shadow: 0 0 0 2px var(--surface-0), 0 0 0 4px var(--ink-900); }
.app-card .nl-card__quick { transition: opacity var(--duration-fast) var(--ease-out), transform var(--duration-press) var(--ease-out); }
.app-card__dots { display: flex; align-items: center; gap: 6px; margin-top: 4px; }
.app-dot { display: inline-block; flex: none; width: 12px; height: 12px; border-radius: 50%; box-shadow: inset 0 0 0 1px rgba(34, 30, 28, 0.16); vertical-align: middle; }
[data-wish] .i { transition: fill var(--duration-fast) var(--ease-out); }
[data-wish][aria-pressed="true"] .i { fill: currentColor; }

/* Быстрый выбор размера на фото (десктоп): открывается только по «+» (наведение листает фото). Плитки 40 в высоту,
   всегда 4 колонки не уже 44: до 8 размеров — не больше двух рядов в любой карточке от 240 (4·44 + 3·8 + отступы 40).
   Карточка уже 240 (окно около 1024) — «+» открывает боковой выбор размера, см. quickOpen в core.js.
   Панель стоит над «+» (8 + 36 + 8 = 52), «+» остаётся на месте и становится «×»: повторный щелчок по нему закрывает панель,
   а не попадает в плитку размера под ним */
.app-quick {
  position: absolute; left: 8px; right: 8px; bottom: 52px; z-index: 2; display: flex; flex-direction: column; justify-content: center; gap: 8px;
  min-height: 96px; padding: 12px; border-radius: var(--radius-sm); background: var(--surface-0); box-shadow: var(--shadow-sm);
  opacity: 0; visibility: hidden; transform: translateY(8px); pointer-events: none;
  transition: opacity var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out), visibility 0s linear var(--duration-fast);
}
.is-m .app-quick { display: none; }
.app-quick.is-open { opacity: 1; visibility: visible; transform: none; pointer-events: auto; transition-delay: 0s; }
.app-quick:focus { outline: none; }
.app-card .nl-card__quick .i { transition: transform var(--duration-fast) var(--ease-out); }
.app-card .nl-card__quick[aria-expanded="true"] .i { transform: rotate(45deg); }
/* Пока панель открыта, кадр не листается — полоски кадров тоже прячем, иначе они выглядывают из-под панели */
.app-card:has(.app-quick.is-open) .app-card__segs { opacity: 0; }
.app-quick__head { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 24px; }
.app-quick__t { font-size: var(--text-xs); font-weight: 500; line-height: 1.3; color: var(--ink-700); }
.app-quick__x { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; margin: -6px -6px -6px 0; padding: 0; border: 0; border-radius: 50%; background: transparent; color: var(--ink-700); cursor: pointer; }
.app-quick__x:hover { background: var(--surface-200); }
.app-quick__x:focus-visible { outline: 2px solid var(--ink-900); outline-offset: -2px; }
.app-quick__sizes { display: grid; grid-template-columns: repeat(4, minmax(44px, 1fr)); gap: 8px; }
.app-quick__sizes .nl-size { width: 100%; min-width: 44px; height: 40px; padding: 0; }
.app-quick__status:empty { display: none; }
.app-quick.is-busy .app-quick__head, .app-quick.is-busy .app-quick__sizes { display: none; }

/* ---------- Сетка и рельс ---------- */
.app-grid { row-gap: 32px; }
/* Десктоп по доскам D-Catalog / D-Search / D-Home: колонки 24, ряды 40 (в край только на телефоне).
   Сетка на всю колонку: 4 карточки, с окна 1600 — 5 (--app-cards); сетке в узкой части страницы число колонок задаёт экран */
.is-d .app-grid { grid-template-columns: repeat(var(--app-cards), minmax(0, 1fr)); column-gap: 24px; row-gap: 40px; }
.is-d .app-grid.app-grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.app-rail__head { margin-bottom: var(--space-md); }
.is-d .app-rail__head { margin-bottom: var(--space-lg); }
.app-rail__tools { display: flex; align-items: center; gap: 16px; flex: none; }
.app-rail__arrows { display: none; gap: 4px; }
.is-d .app-rail__arrows { display: flex; }
.app-rail__arrow { border: 1px solid var(--line-400); }
.app-rail__arrow:disabled { opacity: 0.4; cursor: default; }
/* Все карточки ленты уже видны — листать нечего, стрелки не нужны (core.js railArrows) */
.is-d .app-rail.is-static .app-rail__arrows { display: none; }
.app-rail__track {
  display: grid; grid-auto-flow: column; grid-auto-columns: 44%; gap: var(--grid-gap-x);
  padding: 0 var(--app-gutter);
  overflow-x: auto; overscroll-behavior-x: contain; scroll-snap-type: x mandatory; scroll-padding: 0 var(--app-gutter); scrollbar-width: none;
}
.app-rail__track::-webkit-scrollbar { display: none; }
/* Десктоп: лента от L до R (заголовок на L, «Все …» и стрелки на R), четыре карточки на ширину колонки.
   Лента внутри колонки (корзина, кабинет) идёт во всю ширину своей колонки. Если её колонка уже 880
   (карточка была бы уже 200 — корзина рядом с итогом на окне до ~1500), карточек три; уже 600 (корзина на окне до ~1100) — две,
   иначе карточка 100–140 px и плашка листания, «+», бейдж и строка баллов наезжают друг на друга */
.is-d .app-rail__track { margin: 0 var(--app-edge); padding: 0; scroll-padding: 0; gap: 24px; grid-auto-columns: calc((100% - 3 * 24px) / 4); scroll-behavior: smooth; }
.is-d .app-wrap .app-rail__track { margin-left: 0; margin-right: 0; }
.is-d .app-rail { container-type: inline-size; }
@container (max-width: 879px) { .is-d .app-rail__track { grid-auto-columns: calc((100% - 2 * 24px) / 3); } }
@container (max-width: 599px) { .is-d .app-rail__track { grid-auto-columns: calc((100% - 24px) / 2); } }
.app-rail__item { min-width: 0; scroll-snap-align: start; }

/* ---------- Размеры: плитка с подписью запаса ---------- */
.app-size { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.app-size .nl-size { width: 100%; min-width: 0; }
.app-size__note { display: block; height: 16px; font-size: var(--text-xs); line-height: 16px; color: var(--ink-700); text-align: center; white-space: nowrap; }
.nl-size[aria-disabled="true"] { cursor: default; }
.app-sizes--sm .nl-size { height: 44px; }

/* ---------- Шторка, ящик, окно ---------- */
.app-layer { position: absolute; inset: 0; z-index: var(--z-sheet); pointer-events: none; }
.app-ov { position: absolute; inset: 0; pointer-events: auto; }
.app-ov > .nl-scrim { animation: nl-fade-in var(--duration-fast) var(--ease-out) both; cursor: pointer; }
.app-ov.is-out > .nl-scrim { animation: app-fade-out var(--duration-fast) var(--ease-in) both; }
.app-sheet { max-width: 100%; }
.app-sheet__head { flex: none; display: flex; align-items: center; justify-content: space-between; gap: var(--space-xs); min-height: 56px; padding: 0 4px 0 16px; }
.app-sheet__title { display: flex; align-items: center; gap: 8px; min-width: 0; }
.app-sheet__title > .i { color: var(--success); }
.app-sheet__body { flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 0 16px 24px; }
.app-sheet__foot { flex: none; padding: 12px 16px 16px; border-top: 1px solid var(--line-300); background: var(--surface-0); }
.app-sheet__body.is-swap { animation: nl-fade-in var(--duration-fast) var(--ease-out) both; }

.app-sheet--bottom { position: absolute; left: 0; right: 0; bottom: 0; max-height: calc(100% - 40px); animation: nl-sheet-in var(--duration-slow) var(--ease-sheet) both; }
.app-sheet--bottom.is-in { animation: none; }
.app-sheet--bottom.is-drag { transition: none; }
.app-sheet--bottom.is-snap { transition: transform var(--duration-base) var(--ease-sheet); }
.app-ov.is-out > .app-sheet--bottom { animation: nl-sheet-out var(--duration-fast) var(--ease-in) both; }
.app-sheet--bottom .app-sheet__head { touch-action: none; cursor: grab; }
.app-stage.is-auto .app-sheet--bottom .app-sheet__body { padding-bottom: calc(24px + env(safe-area-inset-bottom, 0px)); }

.app-sheet--right { position: absolute; top: 0; right: 0; bottom: 0; width: 440px; animation: app-drawer-r-in var(--duration-slow) var(--ease-sheet) both; }
.app-ov.is-out > .app-sheet--right { animation: app-drawer-r-out var(--duration-fast) var(--ease-in) both; }
.app-sheet--right .app-sheet__head { min-height: 64px; padding: 0 8px 0 24px; border-bottom: 1px solid var(--line-300); }
.app-sheet--right .app-sheet__body { padding: 20px 24px 24px; }
.app-sheet--right .app-sheet__foot { padding: 16px 24px 24px; }
/* Ящик слева (side: 'left'): все фильтры каталога и поиска выезжают со стороны кнопок фильтров */
.app-sheet--left { position: absolute; top: 0; left: 0; bottom: 0; width: 440px; animation: app-drawer-l-in var(--duration-slow) var(--ease-sheet) both; }
.app-ov.is-out > .app-sheet--left { animation: app-drawer-l-out var(--duration-fast) var(--ease-in) both; }
.app-sheet--left .app-sheet__head { min-height: 64px; padding: 0 8px 0 24px; border-bottom: 1px solid var(--line-300); }
.app-sheet--left .app-sheet__body { padding: 20px 24px 24px; }
.app-sheet--left .app-sheet__foot { padding: 16px 24px 24px; }

.app-ov--center { display: flex; align-items: center; justify-content: center; padding: 40px; }
.is-m .app-ov--center { padding: 16px; }
.app-sheet--center { position: relative; width: 640px; max-height: 100%; animation: nl-fade-up var(--duration-base) var(--ease-out) both; }
.app-ov.is-out > .app-sheet--center { animation: app-fade-out var(--duration-fast) var(--ease-in) both; }
.app-sheet--center .app-sheet__head { min-height: 64px; padding: 0 8px 0 24px; }
.app-sheet--center .app-sheet__body { padding: 0 24px 24px; }

@keyframes app-fade-out { from { opacity: 1; } to { opacity: 0; } }
@keyframes app-drawer-r-in { from { transform: translateX(100%); } to { transform: none; } }
@keyframes app-drawer-r-out { from { transform: none; } to { transform: translateX(100%); } }
@keyframes app-drawer-l-in { from { transform: translateX(-100%); } to { transform: none; } }
@keyframes app-drawer-l-out { from { transform: none; } to { transform: translateX(-100%); } }

/* ---------- Тосты ---------- */
/* Над таб-баром и над плавающей панелью (её высоту ядро кладёт в --app-float-h) */
.app-toasts { position: absolute; left: 16px; right: 16px; bottom: calc(var(--app-bottom) + var(--app-float-h, 0px) + 12px); z-index: var(--z-toast); display: flex; justify-content: center; pointer-events: none; }
.is-d .app-toasts { left: 0; right: 0; bottom: 24px; }
.app-toast { width: 100%; max-width: 440px; pointer-events: auto; }
.app-toast.is-out { animation: app-fade-out var(--duration-fast) var(--ease-in) both; }

/* ---------- Мини-корзина ---------- */
/* Заголовок «Добавлено в корзину» 20/500 в одну строку: полному нужно 253 + поля 20 + зазор 8 + крестик 44 = 325 px шторки,
   уже 330 (телефон 320) остаётся «Добавлено» с галочкой — иначе он переносился на две строки и прижимался к захвату и к фото */
.app-mc-sheet { container-type: inline-size; }
@container (max-width: 329px) { .app-mc__tw { display: none; } }
.app-mc { display: flex; flex-direction: column; gap: 16px; }
.app-mc__items { display: flex; flex-direction: column; gap: 16px; margin: 0; padding: 0; list-style: none; }
.app-mc__item { display: grid; grid-template-columns: 72px minmax(0, 1fr); gap: 16px; }
.app-mc__img { display: block; width: 72px; height: 96px; object-fit: cover; background: var(--surface-200); }
.app-mc__info { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.app-mc__info .nl-card__name { text-decoration: none; }
.app-mc__row { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; padding-top: 16px; border-top: 1px solid var(--line-300); font-size: var(--text-sm); line-height: 1.4; color: var(--ink-700); }
.app-mc__total { font-size: var(--text-md); font-weight: 600; color: var(--ink-900); font-variant-numeric: tabular-nums; }
.app-mc__actions { display: flex; flex-direction: column; gap: 8px; }
.app-mc__actions .nl-btn--text { align-self: center; }
.app-mc__more { display: flex; flex-direction: column; gap: 12px; padding-top: 16px; border-top: 1px solid var(--line-300); }
.app-mc__rail { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
.app-mc__rail .nl-card { gap: 8px; }
.app-mc__rail .nl-card__body { padding: 0; }
.app-mc__rail .nl-card__name { font-size: var(--text-xs); text-decoration: none; min-height: calc(2em * 1.35); }
.app-sheet:focus { outline: none; }
.app-mc__ok { background: var(--ink-900); color: var(--on-dark); cursor: default; }
.app-mc__pick { display: flex; flex-direction: column; gap: 8px; padding: 12px; border-radius: var(--radius-sm); background: var(--surface-100); animation: nl-fade-in var(--duration-fast) var(--ease-out) both; }
.app-mc__pickhead { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: var(--text-xs); font-weight: 500; color: var(--ink-700); }
.app-mc__pickhead .nl-iconbtn { width: 32px; height: 32px; margin: -6px -6px -6px 0; }

/* ---------- Выбор размера в шторке ---------- */
.app-pick { display: flex; flex-direction: column; gap: 16px; }
.app-pick__prod { display: flex; align-items: center; gap: 12px; }
.app-pick__prod img { flex: none; width: 48px; aspect-ratio: 3 / 4; object-fit: cover; background: var(--surface-200); }
.app-pick__prod > div { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.app-pick__status { min-height: 24px; }
.app-busy { display: flex; align-items: center; gap: 10px; font-size: var(--text-sm); line-height: 1.4; color: var(--ink-700); }
.app-done { display: flex; align-items: center; gap: 8px; font-size: var(--text-sm); font-weight: 500; color: var(--ink-900); }
.app-done > .i { color: var(--success); }
.app-sizetable-note { margin-top: 12px; }
/* Таблица размеров в шторке, ящике и окне: в узкой обёртке — плотнее, чтобы последняя колонка («Грудь») не уходила за край без
   признаков прокрутки (5 колонок, диапазоны «164–170»). Обёртка до 420 (ящик 440 на десктопе: «Размер», «Фильтры», комплект) — 13 px,
   поля 8; до 370 (шторка телефона 375–390) — 12 px, поля 6; до 340 (телефон 360) — поля 5; до 300 (телефон 320) — 11 px, поля 4.
   Окно таблицы на товаре (640) и широкие шторки — как в DS */
.app-sheet .nl-table-wrap { container-type: inline-size; }
@container (max-width: 420px) { .nl-table { font-size: 13px; } .nl-table th, .nl-table td { padding: 0 8px; } }
@container (max-width: 370px) { .nl-table, .nl-table thead th { font-size: 12px; } .nl-table th, .nl-table td { padding: 0 6px; } }
@container (max-width: 340px) { .nl-table th, .nl-table td { padding: 0 5px; } }
@container (max-width: 300px) { .nl-table, .nl-table thead th { font-size: 11px; } .nl-table th, .nl-table td { padding: 0 4px; } }

/* ---------- Пустые состояния и заглушки ---------- */
.app-empty { display: flex; flex-direction: column; align-items: center; gap: 12px; padding: 48px 16px; text-align: center; }
.app-empty > .i { width: 32px; height: 32px; color: var(--ink-500); }
.app-empty__text { max-width: 36ch; font-size: var(--text-sm); line-height: var(--leading-base); color: var(--ink-700); }
.app-placeholder { display: flex; flex-direction: column; gap: 12px; padding: 24px; border: 1px dashed var(--line-400); border-radius: var(--radius-sm); background: var(--surface-100); }

/* ---------- Планшет в раскладке телефона (окно 600–899, вид «Авто»): ничего не тянется ----------
   Раскладка телефона остаётся, но содержимое — колонка 720 по центру, как большой телефон: страница (main), шапка, подвал и таб-бар
   стоят по её краям; шторки снизу — до 440 по центру; пилюля покупки и панели «Итого» — до 440 по центру; кнопки на всю ширину
   внутри страницы — до 400 (на всю ширину только в узких контейнерах: шторки, пилюля). Было: пилюля 742, «Оформить заказ» 716,
   кнопки 770–802, абзацы до 802, поле помощи 802, шторки 834 (окно 834). Рамка телефона на ноутбуке (390) сюда не попадает —
   правило только для вида «Авто» на окне 600+ (в нём ширина кадра = ширина окна) */
@media (min-width: 600px) {
  .app-stage.is-auto .app-frame.is-m .app-main { align-self: center; width: 100%; max-width: 720px; }
  .app-stage.is-auto .app-frame.is-m .app-mhead { --tab-x: max(0px, (100% - 720px) / 2); padding-left: calc(4px + var(--tab-x)); padding-right: calc(var(--space-md) + var(--tab-x)); }
  .app-stage.is-auto .app-frame.is-m .app-mhead--back,
  .app-stage.is-auto .app-frame.is-m .app-mhead--logo { padding-right: calc(4px + var(--tab-x)); }
  .app-stage.is-auto .app-frame.is-m .app-mfoot { padding-left: max(16px, calc((100% - 720px) / 2 + 16px)); padding-right: max(16px, calc((100% - 720px) / 2 + 16px)); }
  .app-stage.is-auto .app-frame.is-m .app-tabbar { padding-left: max(0px, (100% - 720px) / 2); padding-right: max(0px, (100% - 720px) / 2); }
  .app-stage.is-auto .app-frame.is-m .app-promo { padding-left: max(44px, calc((100% - 720px) / 2 + 44px)); padding-right: max(0px, (100% - 720px) / 2); }
  .app-stage.is-auto .app-frame.is-m .app-main .nl-btn { max-width: 400px; }
  .app-stage.is-auto .app-frame.is-m .nl-buybar { left: max(16px, calc(50% - 220px)); right: max(16px, calc(50% - 220px)); }
  .app-stage.is-auto .app-frame.is-m .nl-sticky { padding-left: max(16px, calc(50% - 220px)); padding-right: max(16px, calc(50% - 220px)); }
  /* Шторки снизу — до 440 по центру: кнопки на всю ширину допустимы только в контейнерах ≤ 440 (владелец), в шторке они такие и есть */
  .app-stage.is-auto .app-frame.is-m .app-sheet--bottom { left: max(0px, calc(50% - 220px)); right: max(0px, calc(50% - 220px)); }
  .app-stage.is-auto .app-frame.is-m .app-toasts { left: max(16px, calc(50% - 280px)); right: max(16px, calc(50% - 280px)); }
}

/* ---------- Переключатель вида для демонстраций (вне кадра сайта) ---------- */
.app-switch { position: fixed; left: 12px; bottom: 12px; z-index: 1000; font-family: var(--font-sans); font-size: var(--text-xs); line-height: 1.2; color: var(--on-dark); -webkit-font-smoothing: antialiased; }
.app-switch.is-over-tabbar { bottom: calc(var(--tabbar-h) + 10px + env(safe-area-inset-bottom, 0px)); left: 8px; }
.app-switch *, .app-switch *::before, .app-switch *::after { box-sizing: border-box; }
.app-switch button, .app-switch a { font-family: inherit; }
.app-switch :focus-visible { outline: 2px solid var(--accent-soft); outline-offset: 2px; }
.app-switch__pill { display: flex; align-items: center; gap: 6px; height: 40px; padding: 4px 4px 4px 14px; border-radius: var(--radius-pill); background: var(--ink-900); box-shadow: var(--shadow-md); }
.app-switch__label { font-weight: 500; color: rgba(255, 255, 255, 0.72); }
.app-switch__seg { display: inline-flex; padding: 2px; border-radius: var(--radius-pill); background: rgba(255, 255, 255, 0.12); }
.app-switch__seg button { height: 28px; padding: 0 12px; border: 0; border-radius: var(--radius-pill); background: transparent; color: var(--on-dark); font-size: var(--text-xs); font-weight: 500; cursor: pointer; white-space: nowrap; }
.app-switch__seg button[aria-checked="true"] { background: var(--surface-0); color: var(--ink-900); }
.app-switch__btn { display: inline-flex; align-items: center; gap: 4px; height: 32px; padding: 0 10px 0 12px; border: 0; border-radius: var(--radius-pill); background: transparent; color: var(--on-dark); font-size: var(--text-xs); font-weight: 500; cursor: pointer; white-space: nowrap; }
.app-switch__btn:hover { background: rgba(255, 255, 255, 0.12); }
.app-switch__btn .i { width: 16px; height: 16px; transition: transform var(--duration-base) var(--ease-out); }
.app-switch__btn[aria-expanded="true"] .i { transform: rotate(180deg); }
.app-switch__toggle { display: none; height: 40px; padding: 0 16px; border: 0; border-radius: var(--radius-pill); background: var(--ink-900); color: var(--on-dark); font-size: var(--text-xs); font-weight: 500; box-shadow: var(--shadow-md); cursor: pointer; }
.app-switch.is-compact .app-switch__toggle { display: inline-flex; align-items: center; gap: 6px; }
.app-switch.is-compact .app-switch__pill { display: none; }
.app-switch__menu { position: absolute; left: 0; bottom: calc(100% + 8px); width: 264px; max-height: calc(100vh - 80px); overflow-y: auto; padding: 8px; border-radius: 12px; background: var(--ink-900); box-shadow: var(--shadow-md); animation: app-dd-in var(--duration-fast) var(--ease-out) both; }
.app-switch__menu[hidden] { display: none; }
.app-switch.is-edge { left: auto; right: 0; top: 24%; bottom: auto; }
.app-switch.is-edge .app-switch__toggle { writing-mode: vertical-rl; transform: rotate(180deg); width: 22px; height: auto; padding: 10px 0; justify-content: center; border-radius: 0 10px 10px 0; font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; opacity: 0.85; }
.app-switch.is-edge .app-switch__toggle .i { display: none; }
/* Язычок «Демо» не мешает магазину: полупрозрачный, пока его не трогают, и прячется под шторками (размеры, комплект, фильтры) */
.app-switch.is-edge .app-switch__toggle:not(:hover):not(:focus-visible):not([aria-expanded="true"]) { opacity: 0.55; }
body:has(#nl-frame.has-sheet) .app-switch.is-edge { visibility: hidden; }
/* Ящик слева (все фильтры на десктопе) — переключатель уходит вправо, чтобы не закрывать «Сбросить всё» */
body:has(.app-sheet--left) .app-switch:not(.is-edge) { left: auto; right: 12px; }
body:has(.app-sheet--left) .app-switch:not(.is-edge) .app-switch__menu { left: auto; right: 0; }
.app-switch.is-edge .app-switch__menu { left: auto; right: 8px; bottom: auto; top: calc(100% + 8px); max-height: calc(76vh - 100px); }
.app-switch__view { display: none; padding: 8px 8px 12px; }
.app-switch.is-compact .app-switch__view { display: block; }
.app-switch__h { display: block; padding: 8px 8px 4px; font-size: var(--text-2xs); font-weight: 500; letter-spacing: var(--tracking-caps); text-transform: uppercase; color: rgba(255, 255, 255, 0.56); }
.app-switch__item { display: flex; align-items: center; width: 100%; min-height: 36px; padding: 0 8px; border: 0; border-radius: 6px; background: transparent; color: var(--on-dark); font-size: var(--text-sm); text-align: left; text-decoration: none; cursor: pointer; }
.app-switch__item:hover { background: rgba(255, 255, 255, 0.1); }
.app-switch__item small { margin-left: 6px; font-size: var(--text-xs); color: rgba(255, 255, 255, 0.56); }
.app-switch__sep { height: 1px; margin: 6px 8px; background: rgba(255, 255, 255, 0.16); }

/* ---------- Мелкие общие элементы ---------- */
.app-btndone { display: inline-flex; align-items: center; gap: 8px; }
.app-helpdd button.app-helpdd__link { width: 100%; text-align: left; }
.app-backlink { gap: 6px; margin: 0 0 8px -4px; }
.app-pick__table { gap: 6px; margin-left: -4px; }
.app-sizetable-lead { margin-bottom: 12px; }
.app-mfoot .app-social { padding-top: 4px; }
.app-mfoot .app-social button { display: inline-flex; align-items: center; min-height: 44px; }
.app-mfoot__mail { display: inline-flex; align-items: center; min-height: 44px; }
.app-mfoot__pay { display: flex; flex-direction: column; gap: 8px; padding-top: 20px; }
.app-mfoot__copy { padding-top: 24px; }

/* Строки сервиса: ссылки в «Помощь», без всплывающих подсказок */
.app-svcs { margin: 0; padding: 0; list-style: none; }
.app-svc { display: flex; align-items: center; gap: 12px; min-height: 44px; padding: 2px 0; border-radius: var(--radius-sm); color: var(--ink-900); font-size: 13px; line-height: 1.4; text-decoration: none; }
.app-svc > .i { flex: none; color: var(--ink-700); }
.app-svc__chev { margin-left: auto; color: var(--ink-500); transition: color var(--duration-fast) var(--ease-out); }
.app-svc:hover { background: var(--surface-100); }
.app-svc:hover .app-svc__chev { color: var(--ink-900); }
.app-svc:focus-visible { outline: none; background: var(--surface-tint); }
.app-helpline { display: flex; align-items: flex-start; gap: 12px; font-size: 13px; line-height: 1.5; color: var(--ink-700); }
.app-helpline > .i { flex: none; color: var(--ink-700); margin-top: -1px; }
.app-helpline .app-link, .app-helpline a { color: var(--ink-900); font-size: inherit; }

/* ---------- Ошибка экрана ---------- */
.app-error { margin: 24px var(--app-edge); }

@media (prefers-reduced-motion: reduce) {
  .app-switch *, .app-switch__menu { animation-duration: 1ms !important; transition-duration: 1ms !important; }
  .app-promo__msg { transition: none; }
  /* Шапка телефона: название появляется сразу, без анимации */
  .app-mhead, .app-mhead__title { transition: none !important; }
  .app-mhead--back .app-mhead__title { transform: none; }
}

/* Тост на тёмной полосе (рассылка, подвал): у фона тот же --ink-900, поэтому тонкий светлый контур, иначе края не видны */
.app-toasts .nl-toast { box-shadow: var(--shadow-md), 0 0 0 1px rgba(255, 255, 255, 0.24); }

/* Правило «текст до 720 px»: ведущие абзацы, подписи и серые пометки не растягиваются на широком экране */
.app-lead, .content-lead, .cart-paycap, .content-muted, .content-keyline, .kits-lead { max-width: min(720px, 100%); }
.is-d .content-page .t-caption, .is-d .content-szmain .t-caption { max-width: 720px; }

/* Узкий телефон (320): две кнопки героя не помещаются в ряд, переносим вторую */
@media (max-width: 359px) {
  .is-m .home-hero .home-hero__ctas { flex-wrap: wrap; }
}
