/* ============================================================================
   base.css — ЗАТВЕРДЕВШАЯ БОЛВАНКА web-модулей (Гейт А, ветка «Формирование web-модулей»)
   ----------------------------------------------------------------------------
   Назначение: КАЖДЫЙ новый проект/модуль начинается С КОПИИ этого файла, а не с нуля.
   Здесь по построению зашиты ВСЕ классы ошибок, накопленные на Steit/Dipaul/RVS
   (см. _methodology/review-logic.md, раздел 2). Если проект собран от base.css —
   соответствующий класс физически не может повториться.

   Как пользоваться:
     1. Скопировать base.css в проект (output/<client>/dist/css/).
     2. Заполнить блок ТОКЕНЫ ПРОЕКТА цветами/шрифтом из Figma (только значения).
     3. Верстать блоки, ОБЯЗАТЕЛЬНО переопределяя adaptive-долги (см. ПАТТЕРНЫ ниже).
     4. Перед показом — Гейт Б: node scripts/verify-module.js (+ class-traps).

   BASELINE выбирается ОДИН раз на проект: 1920 ИЛИ 1440. Здесь — 1920.
   px→rem при baseline 1920: rem = px / 16.
   ============================================================================ */

/* Порядок каскадных слоёв: `base` — самый нижний (резет-этаж). Любое неслоёное
   правило (компоненты, страницы, chrome) выигрывает у него независимо от специфичности. */
@layer base;
main{padding-bottom: 170px}
/* --- FLUID SCALING (класс: «fluid не включён / pixel-перевёрстка») --------- */
html { font-size: clamp(10.67px, calc(100vw / 1920 * 16), 16px); } /* 1440 → clamp(10.67px, calc(100vw/1440*16), 16px) */
@media (max-width: 1000px) { html { font-size: 16px; } } /* ниже 1280 — fixed px по кадрам адаптивов дизайнера */
@media (max-width: 1000px) { body.wm { margin: 0; } }    /* сброс дефолтного body margin (крал 16px ширины на узком); десктоп НЕ трогаем — он верифицирован с ним */
@media (max-width: 1000px) { main{padding-bottom: 100px} }
/* --- УНИВЕРСАЛЬНЫЕ СБРОСЫ + (класс: «шрифт не antialiased») ----------------- */
/* @layer base (реестр #30, утв. 07-10): резеты-носители селектора `.wm <tag>`
   имеют специфичность (0,1,1) и МОЛЧА бьют однокласс-стили компонентов (0,1,0) —
   так серый `.wm a{color:inherit}` перебивал белый `.spec__tab--active{color:#fff}`
   и `.u-header__cta{color:#fff}` (класс «починил случай, не класс», р3 Уролесана).
   Оборачивание в @layer base ставит ВЕСЬ резет-этаж НИЖЕ любого неслоёного правила
   независимо от специфичности → одноклассовые стили компонентов выигрывают всегда.
   Существующие `.wm`-префиксы страниц (0,2,0, неслоёные) продолжают работать. */
@layer base {
  .wm, .wm * , .wm *::before, .wm *::after { box-sizing: border-box; }
  .wm {
    -webkit-font-smoothing: antialiased;     /* обязателен — иначе текст толще Figma */
    -moz-osx-font-smoothing: grayscale;
    text-rendering: optimizeLegibility;
    font-family: var(--wm-font);
    color: var(--wm-ink);
    background: var(--wm-bg);
  }
  .wm h1, .wm h2, .wm h3, .wm p, .wm ul, .wm ol, .wm figure { margin: 0; }
  .wm ul, .wm ol { padding: 0; list-style-position: inside; }
  .wm img { display: block; max-width: 100%; }
  /* <picture> от пайплайна optimize-images.js: display:contents убирает inline-обёртку,
     чтобы img.height:100% по-прежнему мерил фикс-высоту КОНТЕЙНЕРА, а не схлопывался
     (класс «picture схлопнул фото-филл», разбор Ires 06-26). */
  .wm picture { display: contents; }
  .wm button { font-family: inherit; cursor: pointer; }
  .wm a { color: inherit; }
}
/* СЕМАНТИЧЕСКИЙ СКЕЛЕТ ПО УМОЛЧАНИЮ (предотвращение классов S1–S6, Консилиум 06-21, P4):
   • контакты — ВСЕГДА ссылки: телефон <a href="tel:…">, email <a href="mailto:…"> (визуально нейтрально ниже)
   • действия — <button>/<a>, НЕ <div onclick>; ровно один <h1>; иерархия без пропусков (футер-метки <h2>)
   • контентные картинки — <img alt>, не background; лендмарки header/main/footer/nav; schema.org по типу
   • компонент, чьё свойство задаёт base `.wm <tag>` — объявлять в ≥2 класса (иначе .wm a/p/img бьёт его) */
a.contact-link, .contact-link a { color: inherit; text-decoration: none; }
.wm-sr-only { position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }

/* ПРОТОКОЛ АССЕТОВ (класс B/ось D — «не тот ассет / тихий Iconify-фолбэк / огромные синие иконки»,
   разбор Ires #6/#16/#17/#18/#19, дифф-предложение п.3). Правило ГЕНЕРАЦИИ, не косметика:
     • есть вектор/растр/лого в Figma → ЭКСПОРТ 1:1 (export-design-assets.js). Точка.
     • Iconify (mdi:*/weui:*) — ТОЛЬКО когда вектора в Figma НЕТ (чистый текст/системная иконка).
     • ПРОВАЛ экспорта ассета → НЕ тихая подстановка и НЕ блок конвейера, а:
         (1) видимый ПЛЕЙСХОЛДЕР с пометкой — класс .wm-asset-missing на <img>/контейнере;
         (2) запись в output/<client>/warnings.md (figmaId + что ждали + что подставили);
         (3) флаг разработчику. Демо клиенту не падает в STOP — но дыра ВИДНА (не «огромная синяя икона»). */
.wm-asset-missing {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 2rem; min-height: 2rem; padding: 0.25rem 0.5rem;
  background: repeating-linear-gradient(45deg, #ffe8e8, #ffe8e8 6px, #ffd0d0 6px, #ffd0d0 12px);
  border: 1px dashed #c0392b; color: #c0392b; font: 600 0.75rem/1.1 var(--wm-font);
  text-align: center; box-sizing: border-box;
}
.wm-asset-missing::after { content: attr(data-asset) " — нет ассета"; }

/* ============================================================================
   ТОКЕНЫ ПРОЕКТА — ЗАПОЛНИТЬ из Figma (менять только ЗНАЧЕНИЯ, не имена).
   Класс: «хардкод цвета/шрифта/отступа вместо токена» — в стилях только var(--wm-*).
   Класс: «один цвет захардкожен по-разному на страницах» (RVS: тег #eb2a86 vs #ff4141)
          → один токен, объявленный на ВСЕ блоки проекта.
   ============================================================================ */
.wm {
  --wm-brand:   #63c640;   /* Уролесан зелёный (Figma «Green») */
  --wm-accent:  #63c640;   /* акцент = тот же зелёный (кнопки/табы/иконки) */
  --wm-ink:     #5f5f5f;   /* текст (Figma «Black») */
  --wm-bg:      #ffffff;
  --wm-line:    rgba(95, 95, 95, 0.3);
  --wm-muted:   rgba(0, 0, 0, 0.16);
  --wm-muted-2: rgba(0, 0, 0, 0.3);
  --wm-font:      'Inter Tight', system-ui, -apple-system, BlinkMacSystemFont, sans-serif; /* текст */
  --wm-font-head: 'Fira Sans', 'Inter Tight', system-ui, sans-serif;                       /* заголовки */
  /* структурные — обычно не трогаем */
  --wm-radius:  1.25rem;    /* базовый радиус карточек Уролесан (20px) */
  --wm-pad-x:   2.5rem;     /* поля контейнера 40px (герой/секции от x=40) */
  --wm-container: 120rem;   /* 1920px baseline */
}

/* --- КАРКАС --------------------------------------------------------------- */
.wm-container { width: var(--wm-container); max-width: 100%; margin-inline: auto; padding-inline: var(--wm-pad-x); }
.wm-breadcrumb { font-size: 1rem; letter-spacing: -0.03rem; }
.wm-breadcrumb .dim  { color: var(--wm-muted); }
.wm-breadcrumb .dim2 { color: var(--wm-muted-2); }
.wm-h1 { font-weight: 500; font-size: 4.4375rem; line-height: 1; letter-spacing: -0.266rem; }
.wm-h2 { font-weight: 500; font-size: 3rem; line-height: 1; letter-spacing: -0.15rem; }

.wm-pill {
  display: inline-flex; align-items: center; gap: 2.25rem;
  padding: 0.25rem 0.25rem 0.25rem 1.625rem; border: 0; text-decoration: none;
  background: var(--wm-brand); color: #fff; font-size: 0.9375rem; letter-spacing: -0.028rem;
  border-radius: 0.25rem 0.25rem 1.125rem 0.25rem;
}
.wm-pill--accent { background: var(--wm-accent); }
.wm-pill__ico { width: 3.0625rem; height: 3.0625rem; flex: none; }

/* ============================================================================
   ПАТТЕРНЫ-ШАБЛОНЫ adaptive-долгов — РАСКОММЕНТИРОВАТЬ И ЗАПОЛНИТЬ при сборке блока.
   Это зашитые классы ошибок ветки: ставишь свойство на desktop → ОБЯЗАН сбросить на 768/360.
   ============================================================================ */

/* 1) SIDEBAR/SHARE/ФИЛЬТРЫ ПОД КОНТЕНТ на mobile (класс: «sidebar выше контента»)
.wm-layout { display: grid; grid-template-columns: <main> <aside>; gap: ...; }
@media (max-width: 767px) {
  .wm-layout { display: flex; flex-direction: column; }
  .wm-layout__body  { order: 1; }
  .wm-layout__aside { order: 2; }                  // НЕ display:block (даст DOM-порядок)
}
*/

/* 2) СБРОС desktop position:absolute (класс: «залипший absolute на tablet/mobile»)
.wm-abs { position: absolute; left: 58.33%; }       // desktop
@media (max-width: 1279px) {
  .wm-abs { position: static; left: auto; top: auto; width: auto; }   // долг сброса
}
*/

/* 3) ФИКС-PX GRID → 1кол на mobile (класс: «фикс-px колонки на узком экране»)
.wm-cols { display: grid; grid-template-columns: 86px 245px 1fr; }     // desktop/tablet
@media (max-width: 767px) { .wm-cols { display: flex; flex-direction: column; } }
*/

/* 4) РАСШИРЕНИЕ ЗА КОЛОНКУ только на desktop (класс: «calc/отриц.margin не сброшен»)
.wm-bleed { width: calc(100% + 156px); margin-left: -78px; }           // desktop
@media (max-width: 1279px) { .wm-bleed { width: 100%; max-width: 100%; margin-left: 0; } }
*/

/* 5) STICKY БЕЗ overflow:hidden у родителя (класс: «sticky сломан overflow-x:hidden»)
   На page-обёртке для подавления гор.скролла использовать overflow-x: clip; (НЕ hidden). */

/* 6) РЯД КАРТОЧЕК на мобайле — ЭТО СЛАЙДЕР, не стопка (класс RVS «ряд карточек = слайдер»)
   Если в кадре карточки стоят В РЯД с «peek» за правый край + тонкий трек-ползунок —
   это слайдер. Стандарт реализации новых проектов — Swiper (равные слайды, стрелки,
   одинаковое поведение на всех адаптивах). Самописный fallback (scroll-snap + ползунок):
.wm-slider { display: flex; gap: ...; overflow-x: auto; scroll-snap-type: x mandatory;
             -webkit-overflow-scrolling: touch; scrollbar-width: none; }
.wm-slider::-webkit-scrollbar { display: none; }
.wm-slider > * { flex: 0 0 auto; scroll-snap-align: start; }   // слайд = фикс ширина (peek!)
.wm-track { height: 2px; background: var(--wm-muted); }        // трек-ползунок
.wm-track__bar { height: 100%; background: var(--wm-accent); } // ширина = доле видимого, left = доле прокрутки (JS)
   ⚠️ гор.скролл ВНУТРИ слайдера — норма; у body — НЕТ (см. Паттерн 5 / overflow-x:clip). */

/* 7) НЕУГЛОВАЯ ДЕКОР-ФИГУРА — clip-path, не rect (класс RVS «фигура сплющена в прямоугольник»)
   Если корневой узел блока в Figma vector/polygon со скошенным/срезанным углом —
   воспроизводить геометрию, а не упрощать до rectangle:
.wm-skew { clip-path: polygon(0 24px, 100% 0, 100% calc(100% - 24px), 0 100%); }  // px абсолютные, чтобы наклон не плыл с высотой
   контент-padding поднять, чтобы скос не срезал текст. Упрощение до rect — только дефолт-с-вето с вопросом дизайнеру. */

/* 8) FROSTED-ПЛАШКА — прозрачность + блюр ИЗ Figma, не «белая на глаз» (классы B1/B2 design-гейта,
   разбор Ires 06-21: навкарты hero собраны сплошными вместо rgba+backdrop-blur).
   Прозрачность плашки = АЛЬФА fill из ноды (bg-[rgba(255,255,255,0.3)] → .3), блюр = радиус
   эффекта Background blur (backdrop-blur-[40px] → 40px). НИКОГДА не подбирать на глаз —
   verify-design.js дифает alpha (±0.02) и blur (±1px) из манифеста против computed.
   --wm-frost-alpha / --wm-frost-blur выставляются ПО НОДЕ конкретного блока (значения ниже — пример Ires): */
.wm-frost {
  background: rgba(255, 255, 255, var(--wm-frost-alpha, 0.1));
  -webkit-backdrop-filter: blur(var(--wm-frost-blur, 40px));
          backdrop-filter: blur(var(--wm-frost-blur, 40px));
}
.wm-frost--active { --wm-frost-alpha: 0.3; }   /* активная плашка плотнее (Ires: О компании 0.3 vs 0.1) */
/* ⚠️ frosted даёт эффект ТОЛЬКО при контенте/фото под плашкой; на белом фоне blur не виден — это норма, не баг. */

/* 9) ШИРИНА ТЕКСТ-БОКСА — намеренная развесовка, не «растянуть на контейнер» (класс A5 design-гейта,
   разбор Ires 06-21: «текст на всю ширину, а в дизайне в 2 строки»).
   Если текст-нода в Figma имеет ЗАДАННУЮ ширину (а не nowrap/content-size) — снять её и поставить
   max-width в rem; узкий текст в 2 строки = дизайнерский приём, НЕ растягивать на родителя.
   verify-design.js: если typo.boxWidth != null — дифает фактическую ширину текст-ноды (±2px). */
.wm-textbox { max-width: var(--wm-textbox-w); }   /* --wm-textbox-w = ширина текст-ноды Figma в rem (per-блок) */

/* ============================================================================
   БАЗОВЫЙ HOVER/FOCUS-СЛОЙ — состояния ПО УМОЛЧАНИЮ (класс RVS «сдан только статичный вид»).
   Канон review-logic р.2: для ЛЮБОГО интерактива закладывать :hover/:focus-visible сразу.
   Обёрнут в @media(hover:hover) — чтобы не залипало на тач. Значения акцента берутся из токенов.
   Переопределять под кадр конкретного проекта; НЕ удалять — это зашитый долг состояний.
   ============================================================================ */
.wm a, .wm button, .wm [role="button"], .wm .wm-card, .wm .wm-tab, .wm .wm-chip, .wm input {
  transition: color .2s ease, background-color .2s ease, border-color .2s ease, transform .25s ease, box-shadow .2s ease;
}
.wm :focus-visible { outline: 2px solid var(--wm-accent); outline-offset: 2px; }   /* фокус-доступность по умолчанию */
@media (hover: hover) {
  /* .wm a:hover { text-decoration: underline; }  */
  .wm-pill:hover, .wm-pill--accent:hover { filter: brightness(1.08); }         /* кнопка/пилюля */
  .wm-card:hover { box-shadow: 0 0.5rem 2rem rgba(0,0,0,.12); }                /* карточка-ссылка */
  .wm-card:hover .wm-card__img { transform: scale(1.04); }                     /* зум фото — требует overflow:hidden на обёртке фото */
  .wm-card:hover .wm-card__title { color: var(--wm-accent); }                  /* заголовок в фирменный цвет */
  .wm-tab:hover, .wm-chip:hover { color: var(--wm-accent); }                   /* таб/чип */
  .wm input:hover { border-color: var(--wm-brand); }                           /* поле формы */
}
.wm-card { overflow: hidden; }   /* чтобы zoom фото не вылезал за карточку */

/* СТРЕЛКА КАРТОЧКИ/КНОПКИ — настоящий ассет-стрелка, НЕ текстовый глиф «›»/«→»
   (класс RVS «реюз тащит текстовую стрелку»). Через mask из svg-ассета, цвет — токеном: */
.wm-arrow { width: 1.5rem; height: 1.5rem; flex: none;
  background: currentColor;
  -webkit-mask: var(--wm-arrow-svg) center / contain no-repeat;
          mask: var(--wm-arrow-svg) center / contain no-repeat; }   /* --wm-arrow-svg: url(../assets/arrow.svg) из Figma */

/* ============================================================================
   АДАПТИВНЫЙ КАРКАС — заполняется по КАДРАМ дизайнера 768 и 360 (НЕ интерполировать!).
   Класс: «интерполированный адаптив вместо design-context» — значения из кадра Figma.
   ============================================================================ */
@media (max-width: 1000px) and (min-width: 1001px) {
  /* TABLET 768 — фикс px по кадру дизайнера */
}
@media (max-width: 1000px) {
  /* MOBILE 360 — фикс px по кадру; проверить: нет гор.скролла, sidebar под контентом,
     нет фикс-px grid-колонок, absolute-долги сброшены, full-bleed сброшен. */
}
