/* =========================================================
   VERON — дверні системи · Editorial redesign 2026
   Тепла піщана палітра, велика легка типографіка, фото
   ========================================================= */

/* ---------- 1. Токени ---------- */
:root {
  --paper: #FFFFFF;
  --sand: #F4F5F6;
  --sand-2: #E8EAEC;
  --clay: #D3D7DA;
  --ink: #292F33;
  --ink-2: #444C51;
  --muted: #5C6569;
  /* Було #9BA3A8 — 2,6:1 на білому, нижче норми 4,5:1 для звичайного
     тексту (WCAG AA). Тепер 4,5:1+, той самий відтінок, темніший. */
  --muted-2: #5F686D;
  --line: rgba(41, 47, 51, .14);
  --line-2: rgba(41, 47, 51, .08);

  --tan: #E0364C;
  --tan-2: #B32A3C;
  --tan-soft: #FCE8EB;
  --ok: #2F7D5B;

  --glass: rgba(255, 255, 255, .72);
  --glass-dark: rgba(41, 47, 51, .55);
  --glass-line: rgba(255, 255, 255, .55);

  --font: "Manrope", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --font-display: "Manrope", -apple-system, BlinkMacSystemFont, sans-serif;

  --display: clamp(3.2rem, 1.2rem + 9.6vw, 10.5rem);
  --display-sm: clamp(2.4rem, 1.2rem + 5.4vw, 6rem);
  --h2: clamp(1.9rem, 1.2rem + 2.6vw, 3.4rem);
  --h3: clamp(1.1rem, .95rem + .8vw, 1.45rem);

  --r-sm: 2px;
  --r-md: 3px;
  --r-lg: 4px;
  --r-xl: 4px;
  --r-2xl: 4px;
  --r-full: 999px;

  --shadow-sm: 0 1px 2px rgba(41, 47, 51, .06);
  --shadow-md: 0 12px 30px -20px rgba(41, 47, 51, .35);
  --shadow-lg: 0 30px 70px -36px rgba(41, 47, 51, .45);

  --container: 1280px;
  --gap: clamp(14px, 1.8vw, 26px);
  --section-y: clamp(64px, 8vw, 132px);

  --ease: cubic-bezier(.22, .68, .32, 1);
  --ease-out: cubic-bezier(.16, 1, .3, 1);
}

/* ---------- 2. База ---------- */
*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; overflow-x: clip; -webkit-text-size-adjust: 100%; }
body {
  margin: 0; font-family: var(--font); font-size: 16px; line-height: 1.6;
  color: var(--ink-2); background: var(--paper); overflow-x: clip;
  -webkit-font-smoothing: antialiased;
}
body.is-locked { overflow: hidden; }
/* Блокування скролу модалками трималось лише на body.overflow:hidden —
   але html вище має свій власний overflow-x:clip (проти горизонтального
   overflow сайту), а явно заданий overflow хоч б по одній осі на html
   вимикає стандартне "прокидання" overflow з body на viewport. Тобто
   сторінка (сам html) лишалась прокручуваною повз "заблокований" body —
   і колесом миші, і свайпом. :has() тягне те саме overflow:hidden на html,
   поки всередині body.is-locked, і реально зупиняє скрол сторінки. */
html:has(body.is-locked) { overflow: hidden; }
h1, h2, h3, h4 { margin: 0 0 .5em; color: var(--ink); font-weight: 700; line-height: 1.1; letter-spacing: -.02em; }
p { margin: 0 0 1em; }
a { color: inherit; text-decoration: none; }
img { display: block; max-width: 100%; }
button, input, select, textarea { font: inherit; color: inherit; }
/* Поля вводу браузер заокруглює сам: Chrome дає ~2px, macOS — помітно
   більше, і на полях із самим лише нижнім підкресленням це видно як
   загин лінії вгору на кінцях. Прибираємо скрізь; кнопкам (.btn)
   заокруглення лишається — там воно навмисне і задане класом. */
input, select, textarea { border-radius: 0; }
/* Safari на macOS ігнорує border-radius на полях, доки не знято рідний вигляд
   (те саме, що з <select> нижче). Помітно це саме у фокусі: рамка стає
   кольоровою й видно, що кути круглі. Знімаємо вигляд у всіх текстових полів.
   Чекбокси, радіо й повзунки виключені — для них appearance: none означає
   «не малювати нічого», і поле просто зникло б. */
input:not([type="checkbox"]):not([type="radio"]):not([type="range"]),
textarea {
  -webkit-appearance: none; appearance: none;
}
/* Safari на macOS ігнорує border-radius на <select>, доки не знято рідний
   вигляд — саме тому список лишався заокругленим, хоча решта полів ні.
   appearance: none прибирає і це, і внутрішній відступ ліворуч (~4px),
   через який текст у списку стояв не на одній лінії з іншими полями.
   Стрілку малюємо самі — тепер вона однакова в усіх браузерах. */
select {
  -webkit-appearance: none; appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23292F33' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-size: 15px 15px;
  background-position: right 0 center;
  padding-right: 24px;
}
ul { margin: 0; padding: 0; list-style: none; }
/* Рамка фокуса. border-radius тут НЕ задаємо: outline і так повторює форму
   самого елемента. Раніше тут стояло border-radius: 6px «щоб рамка була
   заокруглена» — і воно гнуло сам елемент: у полів з одним лише нижнім
   підкресленням лінія загиналась угору на кінцях, щойно поле отримувало
   фокус. Кругла кнопка при цьому теж ставала б прямокутником, якби її
   власне правило не було специфічнішим. */
:focus-visible { outline: 2px solid var(--tan); outline-offset: 3px; }

.container { width: min(100% - 2 * clamp(16px, 4vw, 44px), var(--container)); margin-inline: auto; }
.section { padding-block: var(--section-y); }
.section--tight { padding-block: clamp(40px, 5vw, 80px); }
.section--sand { background: var(--sand); }
.section--paper { background: var(--paper); }

/* Заокруглені секції, що перекривають фото */
.rounded-top {
  border-radius: var(--r-2xl) var(--r-2xl) 0 0;
  margin-top: calc(-1 * clamp(30px, 4vw, 64px));
  position: relative; z-index: 2;
}
.rounded-bottom { border-radius: 0 0 var(--r-2xl) var(--r-2xl); }

/* ---------- 3. Типографіка ---------- */
.display {
  font-family: var(--font-display); font-weight: 300; font-size: var(--display);
  line-height: .92; letter-spacing: -.02em; text-transform: uppercase; color: var(--ink);
  margin: 0;
}
.display--sm { font-size: var(--display-sm); }
.display em { font-style: normal; font-weight: 300; color: var(--tan); }

.micro {
  font-size: .68rem; letter-spacing: .22em; text-transform: uppercase;
  color: var(--muted); font-weight: 600;
}
.micro--light { color: rgba(255, 255, 255, .68); }

.eyebrow { display: inline-flex; align-items: center; gap: 10px; margin-bottom: 18px; }
.eyebrow::before { content: ""; width: 26px; height: 1px; background: currentColor; opacity: .45; }

.lead { font-size: clamp(1.02rem, .96rem + .4vw, 1.22rem); color: var(--ink-2); line-height: 1.55; }

/* Editorial-параграф із кольоровими словами та фото-пігулками */
.editorial {
  font-size: clamp(1.15rem, .8rem + 1.5vw, 2.05rem);
  line-height: 1.32; letter-spacing: -.02em; color: var(--ink);
  font-weight: 300; text-transform: uppercase;
}
.editorial b { font-weight: 300; color: var(--muted-2); }
.editorial .pill-img {
  display: inline-block; vertical-align: middle;
  width: clamp(48px, 6vw, 92px); height: clamp(24px, 2.8vw, 42px);
  border-radius: var(--r-lg); overflow: hidden; margin: 0 .18em;
  background: var(--sand-2) center/cover no-repeat;
  box-shadow: var(--shadow-sm);
}
.editorial .pill-img img { width: 100%; height: 100%; object-fit: cover; }
.slashes { color: var(--tan); letter-spacing: -.04em; font-weight: 300; }

.asterisk {
  display: inline-block; color: var(--tan); font-size: 1.6rem; line-height: 1;
  animation: spin 14s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }

/* усі іконки — однаковий бокс і центрування (svg інлайновий, тож сідає на базову лінію) */
[data-icon] { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; line-height: 0; }
[data-icon] svg { display: block; }

/* ---------- 4. Кнопки ---------- */
.btn {
  --btn-h: 60px;
  display: inline-flex; align-items: center; gap: 12px; cursor: pointer;
  min-height: var(--btn-h);
  padding: 13px 13px 13px 24px; border: 0; border-radius: var(--r-md);
  background: var(--ink); color: var(--paper); font-weight: 600;
  text-transform: uppercase; letter-spacing: .08em; font-size: .74rem;
  white-space: nowrap;
  transition: transform .3s var(--ease), background .3s var(--ease), color .3s var(--ease),
              border-color .3s var(--ease), box-shadow .3s var(--ease);
}
.btn i, .btn .arrow {
  width: 34px; height: 34px; border-radius: var(--r-full); flex-shrink: 0;
  background: var(--tan); color: #fff; display: grid; place-items: center;
  transition: transform .35s var(--ease-out), background .3s var(--ease);
}
.btn svg { width: 16px; height: 16px; }
.btn:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); }
.btn:hover .arrow { transform: rotate(45deg); }
.btn:hover { background: var(--ink-2); }

.btn--light { background: #fff; color: var(--ink); box-shadow: var(--shadow-sm); }
.btn--light:hover { background: var(--sand); color: var(--ink); }

.btn--tan { background: #D5304A; color: #fff; }   /* трохи темніший за --tan: білий текст 4.5+ */
.btn--tan .arrow { background: rgba(255, 255, 255, .22); }
.btn--tan:hover { background: var(--tan-2); color: #fff; }

/* контурна — на світлому тлі; ховер інвертує, а не заливає білим */
.btn--ghost { background: transparent; color: var(--ink); border: 1px solid var(--line); padding: 12px 22px; }
.btn--ghost:hover { background: var(--ink); border-color: var(--ink); color: #fff; }
.btn--ghost:hover .arrow { background: var(--tan); }

/* контурна — на темному тлі; текст завжди лишається світлим */
.btn--on-dark {
  background: rgba(255, 255, 255, .04); color: #fff;
  border: 1px solid rgba(255, 255, 255, .24);
}
.btn--on-dark:hover {
  background: rgba(255, 255, 255, .14); border-color: rgba(255, 255, 255, .5); color: #fff;
}

.btn--glass { background: var(--glass); color: var(--ink); border: 1px solid var(--glass-line); backdrop-filter: blur(14px); }
.btn--glass:hover { background: #fff; color: var(--ink); }

.btn--plain { padding: 13px 24px; }
.btn--sm { --btn-h: 46px; padding: 9px 9px 9px 18px; font-size: .84rem; }
.btn--sm i, .btn--sm .arrow { width: 28px; height: 28px; }
.btn--sm.btn--plain, .btn--sm.btn--ghost, .btn--sm.btn--on-dark { padding: 9px 18px; }
.btn--block { width: 100%; justify-content: center; }
/* однакова висота в стовпчику, навіть якщо в однієї кнопки є кружечок зі стрілкою */
.btn--block + .btn--block, .ctaband__actions .btn, .picker__result .btn, .mmenu__foot .btn { min-height: var(--btn-h); }

/* герой: та сама типографіка кнопки, але мінімальний радіус */
.hero .btn, .hero__actions .btn {
  border-radius: var(--r-md); text-transform: none; letter-spacing: -.01em; font-size: .92rem;
}

.link-line {
  display: inline-flex; align-items: center; gap: 10px; font-weight: 600; font-size: .9rem;
  color: var(--ink); border-bottom: 1px solid var(--line); padding-bottom: 4px;
  transition: color .25s var(--ease), border-color .25s var(--ease);
}
.link-line svg { width: 15px; height: 15px; transition: transform .3s var(--ease); }
.link-line:hover { color: var(--tan); border-color: var(--tan); }
.link-line:hover svg { transform: translate(3px, -3px); }

/* ---------- 5. Навігація (тонкий бар) ---------- */
.nav-wrap {
  position: fixed; top: 0; left: 0; right: 0; z-index: 80;
  border-bottom: 1px solid transparent;
  transition: background .4s var(--ease), border-color .4s var(--ease), backdrop-filter .4s var(--ease);
}
.nav-wrap.is-solid {
  background: rgba(255, 255, 255, .94);
  backdrop-filter: blur(16px) saturate(150%);
  -webkit-backdrop-filter: blur(16px) saturate(150%);
  border-bottom-color: var(--line-2);
}

/* Скло в межах першого екрана.
 *
 * Хедер над hero прозорий, і поки сторінка стоїть — це правильно: нічого
 * не відрізає фото. Але щойно починається скрол, під ним проїжджає світлий
 * текст hero, і біле меню на світлому тексті просто зникає (найгірше — на
 * абзаці під заголовком). Раніше стан був лише один: прозорий до кінця
 * hero, далі різко білий.
 *
 * Тепер між ними є скло: тонована матова підкладка, яка притлумлює все,
 * що під нею, лишаючи меню білим. Діє тільки в межах hero — далі вмикається
 * is-solid і хедер стає світлим, як і був.
 *
 * saturate(140%) — щоб фото під склом не сірішало; верхній відблиск дає
 * краю товщину, без нього підкладка виглядає як просто темний прямокутник.
 */
.nav-wrap.is-glass {
  background: rgba(18, 20, 22, .38);
  backdrop-filter: blur(20px) saturate(140%);
  -webkit-backdrop-filter: blur(20px) saturate(140%);
  /* Відблиск по нижньому краю замість рівної рамки: рамка читається як межа
     блоку, тонка світла лінія плюс мʼяка тінь — як край скла. */
  border-bottom-color: transparent;
  box-shadow: 0 1px 0 rgba(255, 255, 255, .14), 0 10px 30px rgba(0, 0, 0, .18);
}
/* Без backdrop-filter (старий Firefox, режим економії) 38% чорного не
   сховає нічого — тоді підкладка має бути щільною, інакше меню знову зникне. */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .nav-wrap.is-glass { background: rgba(18, 20, 22, .82); }
}
@media (prefers-reduced-transparency: reduce) {
  .nav-wrap.is-glass { background: rgba(18, 20, 22, .88); backdrop-filter: none; -webkit-backdrop-filter: none; }
}
/* ---------- Верхній службовий рівень хедера ----------
 *
 * Хедер дворівневий: угорі те, що потрібно рідко, але має бути під рукою
 * (телефони, графік, мова, обране, порівняння), унизу — навігація й дія.
 *
 * Це не лише про вигляд. В один рядок усе вже не влізало: нижче 1400px
 * ховалась кнопка «Зв'язатись», нижче 1200 — пошук. Знявши з основного рядка
 * мову й дві іконки, ми звільнили місце, і обидва тепер доживають до значно
 * менших ширин (див. блок стиснення нижче).
 *
 * При скролі верхній рівень згортається: висота в 0 з переходом. Саме
 * висота, а не display: none — інакше не було б анімації, і хедер
 * підстрибував би.
 */
/* ---------- Рівень 1: логотип, пошук, зв'язок ----------
 *
 * Тут те, з чим працюють постійно, тому рівень лишається на місці при
 * прокрутці. Пошук навмисно широкий і по центру: у каталозі з 86 моделей
 * він знаходить швидше за будь-яке меню.
 */
/* Перший рівень мусить лежати НАД другим, і саме як шар, а не як z-index
   окремої підказки.
   Причина тонка. Підказки пошуку мають z-index: 95, і поки поле було
   звичайним блоком, цього вистачало: підказки піднімались у власний шар
   .nav-wrap і накривали ряд категорій. Але backdrop-filter на .nav-search
   створює stacking context, і z-index підказок відтоді рахується всередині
   самого поля — назовні воно лишається z-index: auto. Тоді .nav-cats
   (position: relative, іде далі за списком) малювався поверх, і пункти
   «Накладки», «Портфоліо» проступали крізь підказки, ба більше — перехоплювали
   на себе кліки по них.
   Тож шар задає сам рівень: .nav-main вище, .nav-cats нижче. Випадайку
   категорій це не чіпає — вона висить під своїм рядом, з .nav-main не
   перетинається. */
.nav-main { position: relative; z-index: 2; }
.nav-main__inner {
  width: min(100% - 2 * clamp(16px, 4vw, 44px), var(--container)); margin-inline: auto;
  height: 68px; display: flex; align-items: center; gap: clamp(12px, 2vw, 28px);
  transition: height .35s var(--ease);
}
.nav-wrap.is-scrolled .nav-main__inner { height: 58px; }
.nav-main__tools { margin-left: auto; display: flex; align-items: center; gap: clamp(8px, 1vw, 14px); flex-shrink: 0; }

/* ---------- Рівень 2: категорії й розділи ----------
 *
 * «Всі категорії» відкриває список категорій каталогу — це головний вхід
 * у товар, тому він перший і виділений. Решта розділів поруч звичайним
 * накресленням.
 *
 * При прокрутці рівень згортається висотою. overflow: hidden стоїть саме на
 * __inner, а не на .nav-cats: випадайка лежить у .nav-cats, і якби ховали
 * там, її б обрізало.
 */
.nav-cats { position: relative; z-index: 1; }
.nav-cats__inner {
  width: min(100% - 2 * clamp(16px, 4vw, 44px), var(--container)); margin-inline: auto;
  height: 46px; overflow: hidden;
  display: flex; align-items: center; gap: clamp(12px, 2vw, 26px);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .12);
  transition: height .35s var(--ease), opacity .3s var(--ease), box-shadow .4s var(--ease);
}
.nav-wrap.is-cats-hidden .nav-cats__inner { height: 0; opacity: 0; box-shadow: none; }
.nav-wrap.is-solid .nav-cats__inner { box-shadow: inset 0 1px 0 var(--line-2); }
/* height: 46px тут фіксована (заради згортання при скролі, див. коментар
   вище) і майже впритул до самих посилань — звичайна рамка фокуса (offset
   +3px) виходить за цю висоту й обрізається. Тому всередині рядка рамка
   малюється всередину елемента, а не назовні. */
.nav-cats__inner :focus-visible { outline-offset: -3px; }

.nav-cats__all {
  display: inline-flex; align-items: center; gap: 10px; flex-shrink: 0;
  background: none; border: 0; cursor: pointer; padding: 8px 0;
  font-size: .84rem; font-weight: 600; letter-spacing: -.01em;
  color: #fff; transition: color .25s var(--ease), opacity .25s var(--ease);
}
.nav-cats__all svg { width: 16px; height: 16px; }
/* Кегль такий самий, як у «Всі категорії». Було .8rem: коробки різної
   висоти центруються по своїх центрах, і верх літер розходився на 0.48px —
   на око це читається як «рядок не вирівняний». */
.nav-cats__inner .nav-links > a { font-size: .84rem; }
.nav-cats__all:hover { opacity: .75; }
.nav-wrap.is-solid .nav-cats__all { color: var(--ink); }
/* Телефон і графік — один рядок праворуч у другому рівні.
 *
 * Номер стояв у першому рівні поруч із кнопкою «Звʼязатись із нами»: одна
 * дія, показана двічі за 300 px, у ряду, де вже було вісім елементів.
 * Кнопка лишилась гучним закликом, а номер тут — тихою довідкою поруч із
 * графіком: «куди дзвонити» і «коли відповідають» читаються разом.
 * Крапка-роздільник мальована через ::before, щоб не тримати порожній
 * <span> у розмітці кожної з 93 сторінок. */
.nav-contact { margin-left: auto; display: flex; align-items: center; gap: 12px; min-width: 0; }
.nav-phone {
  font-size: .78rem; font-weight: 500; white-space: nowrap;
  color: rgba(255, 255, 255, .72); transition: color .25s var(--ease);
}
.nav-phone:hover { color: #fff; }
.nav-wrap.is-solid .nav-phone { color: var(--ink-2); }
.nav-wrap.is-solid .nav-phone:hover { color: var(--ink); }
.nav-cats__hours { font-size: .76rem; white-space: nowrap; color: rgba(255, 255, 255, .5); }
.nav-contact .nav-cats__hours::before { content: "·"; margin-right: 12px; opacity: .6; }
.nav-wrap.is-solid .nav-cats__hours { color: var(--muted); }

/* Позначку «відчинено / зачинено» вставляє script.js за київським часом.
 *
 * Зелений тут не --ok (#2F7D5B): він розрахований на білу підкладку, а над
 * героєм лежить темне фото — на ньому цей відтінок читається майже сірим.
 * Тому над фото світліший зелений, а на білому хедері повертається --ok.
 *
 * «Зачинено» навмисно не червоне: червоний на сайті означає дію (кнопки,
 * акценти), і червоний надпис у шапці читався б як помилка або тривога.
 * Закрито — це не аварія, а просто вечір, тож колір приглушений. */
.nav-status {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: .76rem; white-space: nowrap; color: #5BC48D;
  transition: color .25s var(--ease);
}
.nav-status::before {
  content: ""; width: 6px; height: 6px; border-radius: 50%;
  background: currentColor; flex-shrink: 0;
}
.nav-status.is-closed { color: rgba(255, 255, 255, .5); }
.nav-wrap.is-solid .nav-status { color: var(--ok); }
.nav-wrap.is-solid .nav-status.is-closed { color: var(--muted); }
/* Крапки-роздільника перед позначкою навмисно немає: кружечок статусу сам
   відбиває її від графіка, а «· ● Відчинено» — це два роздільники підряд. */
.nav-contact .nav-status { margin-left: 4px; }

/* Випадайка категорій — рідке скло.
 *
 * Ключове обмеження: знімки дверей зняті не на білому — у них справжнє тло,
 * від світло-сірого до майже чорного (перевірено по кутах файлів). Тому
 * вирізати тло режимами накладання не можна: multiply лише бруднив світлі
 * полотна, а темні перетворював на плями. Фото стоїть на власній нейтральній
 * підкладці — без рамки, без внутрішнього відступу, на всю висоту комірки,
 * щоб силует полотна читався одразу.
 */
/* Випадайка йде за станом хедера, а не живе окремим світлим островом.
 *
 * Над героєм шапка темна, а після прокрутки стає білою — панель під нею
 * підлаштовується так само.
 *
 * Підкладка суцільна, без прозорості й без діагонального відблиску: з
 * ними крізь панель просвічував текст сторінки під нею (великий заголовок
 * секції, наприклад «КОМАНДА», читався крізь начебто непрозору плашку) —
 * Денис попросив прибрати. backdrop-filter теж прибраний: він розмивав
 * те, що все одно повністю закрите суцільним кольором, — даремне
 * навантаження без жодного видимого ефекту.
 *
 * Обидва стани зібрані на локальних змінних: правила компонента нижче
 * написані один раз через них, а темний і світлий варіант міняють лише
 * значення. Дублювати селектори під .is-solid для кожного елемента (тексту,
 * ховера, рамки, плитки) означало б, що наступна правка неминуче забуде
 * половину з них. */
.cats-drop {
  /* темний стан — над героєм, за замовчуванням */
  --drop-bg: #181C1F;
  --drop-ink: #fff;
  --drop-muted: rgba(255, 255, 255, .5);
  --drop-hover: rgba(255, 255, 255, .07);
  --drop-hover-line: rgba(255, 255, 255, .13);
  --drop-line: rgba(255, 255, 255, .14);
  --drop-top: rgba(255, 255, 255, .1);
  /* Плитка з дверима лишається світлою в обох станах: знімки полотен зняті
     на білому, і на темній підкладці двері перетворились би на пляму. */
  --drop-pic: rgba(255, 255, 255, .82);

  position: absolute; top: 100%; left: 0; right: 0; z-index: 5;
  background: var(--drop-bg);
  box-shadow: inset 0 1px 0 var(--drop-top), 0 26px 70px rgba(0, 0, 0, .38);
  overflow: hidden;
}
.nav-wrap.is-solid .cats-drop {
  --drop-bg: var(--paper);
  --drop-ink: var(--ink);
  --drop-muted: var(--muted);
  /* Світлий стан має власну підкладку: --drop-hover/--drop-hover-line у
     темному варіанті — це напівпрозорий білий, і скопійований сюди
     буквально він лягав білим по білому (--paper) — ховер був невидимий.
     Тут ті самі токени, що й у .ptype:hover / .adv__card:hover нижче по
     файлу: --sand підкладка й --line рамка. */
  --drop-hover: var(--sand);
  --drop-hover-line: var(--line);
  --drop-line: rgba(0, 0, 0, .12);
  --drop-top: rgba(255, 255, 255, .75);
  --drop-pic: rgba(255, 255, 255, .4);
  box-shadow: inset 0 1px 0 var(--drop-top), 0 26px 70px rgba(0, 0, 0, .28);
}
.cats-drop__inner {
  position: relative; z-index: 1;
  width: min(100% - 2 * clamp(16px, 4vw, 44px), var(--container)); margin-inline: auto;
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 2px;
  padding: 14px 0 18px;
}
.cats-drop a {
  display: flex; align-items: center; gap: 16px;
  padding: 8px 12px; border: 1px solid transparent;
  transition: background .2s var(--ease), border-color .2s var(--ease);
}
/* :hover — лише для пристроїв з реальним наведенням: на дотику він
   «залипає» після тапу (немає events, що його знімають), і остання
   натиснута категорія лишається обведеною рамкою — саме це й виглядало
   «криво» на телефоні. */
@media (hover: hover) {
  .cats-drop a:hover { background: var(--drop-hover); border-color: var(--drop-hover-line); }
  .cats-drop a:hover .cats-drop__arrow { opacity: 1; transform: translateX(0); }
  .cats-drop .cats-drop__soon:hover { opacity: .85; background: none; border-color: transparent; }
}
/* Двері на всю висоту комірки: без рамки й без внутрішнього відступу —
   полотно займає підкладку цілком і читається силуетом, а не маркою. */
.cats-drop__pic {
  /* 50x96 — це 0.52, медіанна пропорція знімків дверей (я їх заміряв:
     0.517). Плитка збігається з фото, тож contain нічого не ріже й
     водночас не лишає полів: полотно займає комірку цілком і видно його
     на весь ріст, як і має бути. */
  flex-shrink: 0; width: 50px; height: 96px; display: flex;
  align-items: center; justify-content: center;
  background: var(--drop-pic); overflow: hidden;
}
.cats-drop__pic img { width: 100%; height: 100%; object-fit: contain; display: block; }
/* Категорія без фото (модель без знімка або без моделей узагалі) — замість
   пустої підкладки чи розмитого градієнта показуємо силует дверей: та сама
   біла плитка, що й під фото, тож рядок не виглядає «зламаним». */
.cats-drop__pic svg { width: 32%; height: 32%; color: rgba(41, 47, 51, .4); flex-shrink: 0; }
.cats-drop__txt { display: flex; align-items: baseline; gap: 10px; min-width: 0; flex-wrap: wrap; }
.cats-drop b { font-weight: 500; color: var(--drop-ink); }
.cats-drop span.cats-drop__txt > span, .cats-drop__txt span { font-size: .76rem; color: var(--drop-muted); white-space: nowrap; }
/* Стрілка з'являється тільки на ховері — легкий натяк на дію, без зайвого
   шуму в спокійному стані рядка. */
.cats-drop__arrow {
  width: 15px; height: 15px; flex-shrink: 0; margin-left: auto;
  color: var(--drop-muted); opacity: 0; transform: translateX(-4px);
  transition: opacity .2s var(--ease), transform .2s var(--ease);
}
/* Категорія без жодної моделі («скоро») — не рядок у сітці, а тонкий
   окремий рядок під нею: інакше самотня плитка лишала б дірку в останньому
   ряду сітки, а рівний хов з активними категоріями обіцяв би товар, якого
   ще нема. */
.cats-drop__soon {
  grid-column: 1 / -1; display: flex; align-items: center; justify-content: space-between;
  padding: 9px 12px; opacity: .6; border: 1px solid transparent;
}
.cats-drop__soon:first-of-type { border-top: 1px solid var(--drop-line); margin-top: 6px; padding-top: 13px; }
.cats-drop__soon-badge {
  font-size: .64rem; letter-spacing: .08em; text-transform: uppercase;
  padding: 3px 9px; border: 1px solid var(--drop-line); border-radius: 20px; color: var(--drop-muted);
}

/* Селектор навмисно з двох класів, а не з одного.
   «Увесь каталог» — це <a>, а вище стоїть `.cats-drop a { border: 1px solid
   transparent }` зі специфічністю (0,1,1) проти (0,1,0) в одного класу.
   Через це розділювач тут не малювався ніколи — прозора рамка посилання
   мовчки його перебивала. Знайшлось на перевірці кольорів. */
.cats-drop .cats-drop__all {
  /* Симетрично, як і в решти рядків (.cats-drop a: 8px, .cats-drop__soon:
     9px) — було 12px 12px 4px: знизу лишалось лише 4px проти 12px згори,
     тож текст тиснувся до нижньої межі, а над ним висіло зайве повітря. */
  grid-column: 1 / -1; margin-top: 8px; padding: 12px 12px;
  border-top: 1px solid var(--drop-line);
}
.cats-drop__all b { font-weight: 600; }
.cats-drop b { font-weight: 500; color: var(--drop-ink); }
.cats-drop span { font-size: .76rem; color: var(--drop-muted); white-space: nowrap; }

.nav-links { display: flex; align-items: center; gap: clamp(14px, 1.5vw, 22px); }
.nav-links > a, .nav-links > button {
  background: none; border: 0; cursor: pointer; padding: 6px 0;
  font-size: .8rem; letter-spacing: -.01em; font-weight: 500;
  color: rgba(255, 255, 255, .84); white-space: nowrap; position: relative;
  transition: color .25s var(--ease);
}
.nav-links > a::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 1px;
  background: currentColor; opacity: .6; transform: scaleX(0); transform-origin: left;
  transition: transform .3s var(--ease);
}
.nav-links > a:hover::after, .nav-links > a.is-active::after { transform: scaleX(1); }
.nav-links > a:hover { color: #fff; }
.nav-wrap.is-solid .nav-links > a, .nav-wrap.is-solid .nav-links > button { color: var(--ink-2); }
.nav-wrap.is-solid .nav-links > a:hover { color: var(--ink); }

.mark {
  display: inline-flex; align-items: center; gap: 12px;
  color: #fff; transition: color .3s var(--ease), opacity .3s var(--ease);
}
.mark:hover { opacity: .75; }
.mark { --logo-mark: var(--tan); }
.mark .mark__logo { width: clamp(104px, 9vw, 132px); height: auto; display: block; }
.nav-wrap.is-solid .mark { color: var(--ink); }
.footer__logo { line-height: 0; }
.footer__logo .mark__logo { width: clamp(150px, 18vw, 230px); height: auto; color: #fff; --logo-mark: var(--tan); }
.mark span { font-size: .74rem; letter-spacing: .3em; text-transform: uppercase; font-weight: 600; }

/* Над героєм поле — мʼяка напівпрозора капсула без жодної лінії.
 *
 * Спершу тут була повна рамка з заливкою: 348×46 px контрастного
 * прямокутника поверх фотографії, найбільша пляма в ряду, важча за
 * логотип. Її замінили на саме підкреслення — маса впала, але зʼявилась
 * гірша вада. Лінія йшла на всі 348 px, тоді як іконка з плейсхолдером
 * займають лише 169 — майже половина креслення висіла під порожнечею.
 * До того ж її контраст (.34) утричі перевищував контраст власного
 * роздільника хедера (.12), який іде паралельно всього за 11 px нижче:
 * дві майже паралельні лінії поруч, з них верхня — сильніша й коротша.
 * Саме це й муляло око.
 *
 * Тепер поле тримається не креслениками, а тоном: підкладка на .13 з
 * розмиттям фону читається як поле на будь-якому кадрі, при цьому не має
 * жодного різкого краю, який міг би конкурувати з роздільником. Скруглення
 * — те саме var(--r-full), що в «обраного», «порівняння» й перемикача
 * мови: у ряду зʼявляється спільна форма замість чужого прямокутника. */
.nav-search {
  position: relative; display: flex; align-items: center; gap: 10px;
  padding: 0 18px; border: 0; border-radius: var(--r-full);
  color: rgba(255, 255, 255, .82);
  background: rgba(255, 255, 255, .13);
  -webkit-backdrop-filter: blur(10px) saturate(1.1);
  backdrop-filter: blur(10px) saturate(1.1);
  /* 320px — стільки, щоб у полі вміщалась назва моделі з артикулом, і не
     більше: ширша капсула знову набирає масу. Висота 44px стоїть між
     38px вільних контролів і 46px кнопки «Звʼязатись»; на скругленій формі
     різниця не читається, а вертикаль ряду лишається спокійною.
     Поле першим віддає місце при нестачі — інакше сусіди в рядку
     виштовхуються за край. */
  flex: 0 1 320px; min-width: 0; max-width: 320px; height: 44px;
  transition: background .3s var(--ease), color .3s var(--ease), box-shadow .3s var(--ease);
}
.nav-search:hover { background: rgba(255, 255, 255, .2); }
.nav-search:focus-within { background: #fff; box-shadow: 0 6px 22px rgba(0, 0, 0, .18); }
.nav-search svg { width: 14px; height: 14px; flex-shrink: 0; }
.nav-search input {
  background: none; border: 0; outline: none; width: 100%;
  /* .84rem — той самий кегль, що й у кнопки поруч (.btn--sm). Було .88rem,
     і поле читалось важчим за кнопку, хоч коробки однакові. */
  font-size: .84rem; color: inherit;
}
.nav-search:focus-within input, .nav-search:focus-within svg { color: var(--ink); }
.nav-search:focus-within input::placeholder { color: var(--muted-2); }
.nav-search input::placeholder { color: currentColor; opacity: .75; }
/* На білому хедері розмивати нічого — під ним суцільний фон, тож капсула
   переходить у звичайну підкладку кольору --sand. Рамки немає й тут:
   інакше на скролі поле раптом обростало б краєм, якого щойно не було. */
.nav-wrap.is-solid .nav-search { background: var(--sand); color: var(--muted); -webkit-backdrop-filter: none; backdrop-filter: none; }
.nav-wrap.is-solid .nav-search:hover { background: var(--sand-2); }
.nav-wrap.is-solid .nav-search:focus-within { background: #fff; box-shadow: 0 0 0 1px var(--ink-2); }
.nav-wrap.is-solid .nav-search input { color: var(--ink); }

/* Перемикач мови стоїть в одному ряду з «обраним» і «порівнянням», тож
   мусить важити стільки ж. Глобус був 14px проти 19px у сусідів і на .78
   прозорості проти .82 — виглядав дрібнішим і тьмянішим, ряд читався
   нерівним. Кегль «UA» теж піднято: 12.5px біля 19-піксельного гліфа
   читались як підпис, а не як рівноправна кнопка. */
.nav-meta {
  display: inline-flex; align-items: center; gap: 7px; cursor: pointer; flex-shrink: 0;
  background: none; border: 0;
  /* Три вільні контроли ряду (мова, обране, порівняння) мусять стояти з
     однаковим оптичним кроком. У кнопок малюнок 19px усередині коробки
     38px, тобто кожна несе ще по 9.5px невидимого поля з боків, а мова
     не несла нічого — просвіти виходили 9 / 27 / 37px замість рівних.
     Висота й бічні поля тут повторюють геометрію .icon-btn, тож проміжок
     задає сам gap ряду, однаково для всіх. */
  height: 38px; padding: 0 10px;
  font-size: .84rem; color: rgba(255, 255, 255, .82); white-space: nowrap;
  transition: color .25s var(--ease), background .25s var(--ease);
  border-radius: var(--r-full);
}
.nav-meta:hover { background: rgba(255, 255, 255, .16); }
.nav-wrap.is-solid .nav-meta:hover { background: var(--sand); }
.nav-meta:hover { color: #fff; }
.nav-meta svg { width: 19px; height: 19px; }
.nav-meta [data-lang-label] { min-width: 2.1em; text-align: center; display: inline-block; }
.nav-wrap.is-solid .nav-meta { color: var(--ink-2); }
.nav-wrap.is-solid .nav-meta:hover { color: var(--ink); }


.burger {
  display: none; width: 40px; height: 40px; border-radius: var(--r-full);
  background: rgba(255, 255, 255, .14); border: 1px solid rgba(255, 255, 255, .28);
  color: #fff; place-items: center; cursor: pointer;
}
.nav-wrap.is-solid .burger { background: var(--sand); border-color: transparent; color: var(--ink); }
.burger svg { width: 18px; height: 18px; }

/* Мобільне меню */
.mmenu {
  position: fixed; inset: 0; z-index: 95; background: var(--paper);
  transform: translateY(-100%); transition: transform .45s var(--ease-out), visibility .45s;
  /* visibility, не лише transform: закрите меню лежало поза екраном, але
     лишалось у tab-order — Tab із фокусу на бургері вів прямо в пункти
     меню, які ще не видно. */
  visibility: hidden;
  display: flex; flex-direction: column; overflow-y: auto; padding: 20px clamp(18px, 5vw, 32px) 40px;
}
.mmenu.is-open { transform: none; visibility: visible; }
.mmenu__head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 30px; }
.mmenu__link {
  display: flex; align-items: baseline; justify-content: space-between; gap: 14px;
  padding: 14px 0; border-bottom: 1px solid var(--line-2);
  font-size: clamp(1.6rem, 1rem + 3vw, 2.6rem); font-weight: 300; letter-spacing: -.04em;
  text-transform: lowercase; color: var(--ink);
}
.mmenu__link span { font-size: .62rem; letter-spacing: .2em; text-transform: uppercase; color: var(--muted); }
.mmenu__foot { margin-top: auto; padding-top: 34px; display: grid; gap: 10px; }

/* ---------- 6. Герой (темний, кінематографічний) ---------- */
.hero {
  position: relative; min-height: 100svh;
  display: flex; flex-direction: column; justify-content: flex-end;
  padding: clamp(96px, 12vw, 150px) 0 clamp(34px, 4vw, 56px);
  overflow: hidden; background: #100E0C; isolation: isolate;
}
.hero__bg { position: absolute; inset: 0; z-index: -2; }
.hero__bg img {
  width: 100%; height: 100%; object-fit: cover;
  animation: heroZoom 18s var(--ease-out) forwards;
}
@keyframes heroZoom { from { transform: scale(1.06); } to { transform: scale(1); } }
/* Затемнення героя. Фото світле в середній смузі — саме там стоять H1 і лід,
   тому середина підіймається, а зліва додано окремий градієнт під текстову колонку. */
.hero::after {
  content: ""; position: absolute; inset: 0; z-index: -1;
  background:
    linear-gradient(180deg, rgba(12, 10, 9, .84) 0%, rgba(12, 10, 9, .5) 22%, rgba(12, 10, 9, .62) 56%, rgba(10, 9, 8, .95) 100%),
    linear-gradient(90deg, rgba(10, 9, 8, .74) 0%, rgba(10, 9, 8, .38) 48%, rgba(10, 9, 8, .06) 80%),
    radial-gradient(120% 80% at 50% 40%, transparent 28%, rgba(10, 9, 8, .58) 100%);
}
.hero__inner { position: relative; }
.hero__inner::before {
  content: ""; position: absolute; z-index: -1;
  left: -6vw; right: -6vw; bottom: -6vh; top: 18%;
  background: linear-gradient(180deg, transparent, rgba(10, 9, 8, .62) 40%, rgba(10, 9, 8, .88));
  pointer-events: none;
}

.hero__title {
  color: #fff; font-weight: 300; letter-spacing: -.035em; line-height: 1.02;
  font-size: clamp(2.4rem, 1.2rem + 4.6vw, 5.6rem); margin: 0;
  animation: fadeUp 1.1s var(--ease-out) .1s backwards;
}
.hero__title em { font-style: normal; font-weight: 300; }

/* Опис і кнопка — один стовпчик, а не два кінці рядка.
 *
 * Кнопка стояла в правій колонці, за 650 px від абзацу, з яким вона в парі.
 * Біла плашка на темному фото — найяскравіший обʼєкт екрана, тож погляд
 * ішов на неї раніше, ніж на H1, а звʼязок «прочитав опис — натиснув» не
 * читався взагалі. Тепер вони стоять одне під одним ліворуч: заголовок
 * лишається першим, кнопка — наступним кроком після тексту. */
.hero__meta {
  display: flex; flex-direction: column; align-items: flex-start;
  gap: clamp(18px, 2vw, 26px);
  margin-top: clamp(26px, 3.4vw, 46px);
  animation: fadeUp 1.1s var(--ease-out) .25s backwards;
}
.hero__desc {
  font-size: .96rem; line-height: 1.62; color: rgba(255, 255, 255, .96);
  max-width: 52ch; margin: 0; text-shadow: 0 1px 12px rgba(10, 9, 8, .55);
}
.hero__actions { display: flex; align-items: center; gap: 10px; }
@keyframes fadeUp { from { opacity: 0; transform: translateY(22px); } to { opacity: 1; transform: none; } }

.hero__stats {
  display: flex; gap: clamp(26px, 4vw, 60px); flex-wrap: wrap;
  margin-top: clamp(26px, 3vw, 44px); padding-top: clamp(18px, 2vw, 26px);
  border-top: 1px solid rgba(255, 255, 255, .14);
  animation: fadeUp 1.1s var(--ease-out) .4s backwards;
}
.hero__stat b {
  display: block; font-size: clamp(1.3rem, 1rem + 1.1vw, 1.9rem);
  font-weight: 300; letter-spacing: -.03em; color: #fff; line-height: 1;
}
.hero__stat span { font-size: .68rem; letter-spacing: .16em; text-transform: uppercase; color: rgba(255, 255, 255, .68); }

/* ---------- 7. «Про нас»: слайдер, що гортається скролом ---------- */
.about__head { display: flex; align-items: flex-start; justify-content: space-between; gap: 20px; }
.about__head > * { min-width: 0; }
/* На вузьких телефонах великий заголовок (2-3 рядки) і текст праворуч
   починають зʼїжджатись/накладатись один на одного при align-items:flex-end
   (він виставляється інлайново на кожному використанні) — тому на мобільному
   просто ставимо блоки один під одним, а не стискаємо в один рядок. */
@media (max-width: 640px) {
  .about__head { flex-direction: column; align-items: flex-start !important; gap: 8px; }
  .about__head > p[style*="text-align:right"] { text-align: left !important; max-width: none !important; }
}
.about__meta { text-align: right; line-height: 1.7; color: var(--muted); }

/* ---------- Етапи виробництва (сторінка «Про нас») ----------
 *
 * Раніше тут було закріплення екрана: секція заввишки в чотири вікна, а
 * всередині sticky-сцена, де крок перемикався від позиції скролу. Прибрано
 * на прохання. Фікс-скрол забирає в людини керування сторінкою: колесо
 * крутиться, а сторінка стоїть, і щоб проминути блок, треба «відмотати»
 * чотири екрани. Тепер це звичайний список — гортається як усе інше,
 * усі чотири етапи видно одразу, кожен зі своїм фото.
 *
 * Фото чергують сторони, щоб чотири однакові рядки не читались таблицею. */
.steps { list-style: none; margin: 0; padding: 0; display: grid; gap: clamp(40px, 6vw, 92px); }
.step {
  display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(24px, 4vw, 60px); align-items: center;
}
.step:nth-child(even) .step__media { order: 2; }
.step__media {
  /* 16:10, а не 4:3. При половинній ширині 4:3 дає кадр під 460px заввишки
     проти ~130px тексту поруч — рядок виходив високим і напівпорожнім. */
  margin: 0; border-radius: var(--r-lg); overflow: hidden;
  background: var(--sand-2); aspect-ratio: 16 / 10;
}
.step__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.step__num { font-size: .68rem; letter-spacing: .12em; color: var(--tan); }
.step__title {
  font-size: clamp(1.5rem, 1rem + 1.6vw, 2.2rem); font-weight: 300;
  letter-spacing: -.02em; margin: 10px 0 12px; color: var(--ink);
}
.step__text p { color: var(--muted); line-height: 1.65; max-width: 46ch; margin: 0; }

@media (max-width: 860px) {
  /* На вузькому — фото над текстом. order знімаємо, інакше в частині рядків
     знімок опинявся б під підписом, а в частині над ним. */
  .step { grid-template-columns: minmax(0, 1fr); gap: 18px; }
  .step:nth-child(even) .step__media { order: 0; }
  .step__media { aspect-ratio: 16 / 10; }
}

/* ---------- Колода етапів (сторінка «Про нас») ----------
 *
 * Липкий стос замість звичайного списку: картка n зупиняється під шапкою на
 * n * --deck-peek нижче за попередню, тож наступна наїжджає на неї зверху й
 * лишає видимим тонкий верхній край. Ефект дає position: sticky і сам скрол
 * сторінки — колесо не перехоплюється, блок можна проминути як будь-який
 * інший. Попередній варіант із фіксацією екрана прибрали саме тому, що він
 * керування забирав.
 *
 * --p ставить JS: наскільки картку вже накрито наступною. Через нього
 * підкладка трохи зменшується, і стос читається як стос, а не як зсув.
 */
.deck {
  list-style: none; margin: 0; padding: 0;
  --deck-top: clamp(78px, 10vh, 104px);
  --deck-peek: 16px;
}
.deck__item { position: sticky; top: calc(var(--deck-top) + var(--i) * var(--deck-peek)); }
.deck__item + .deck__item { margin-top: clamp(26px, 4vw, 54px); }
.deck__card {
  --p: 0;
  display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
  gap: clamp(22px, 3.4vw, 52px); align-items: center;
  padding: clamp(16px, 2vw, 24px);
  background: var(--sand); border: 1px solid var(--line-2);
  border-radius: var(--r-lg);
  /* Власна тінь, не --shadow-lg: у стосі тіні шести карток лягають одна на
     одну, і те, що на поодинокому блоці читалось мʼяко, тут збиралось у
     сірий ореол навколо всієї колоди. Тримаємо коротку й ледь помітну —
     стос уже розділяють край картки та рамка. */
  box-shadow: 0 10px 24px -18px rgba(41, 47, 51, .22);
  transform: scale(calc(1 - var(--p) * .018));
  transform-origin: 50% 0;
}
.deck__media { margin: 0; border-radius: var(--r-md); overflow: hidden; background: var(--sand-2); aspect-ratio: 16 / 10; }
.deck__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.deck__media svg { width: 100%; height: 100%; display: block; }
.deck__media--empty { display: grid; place-items: center; border: 1px dashed var(--line); background: var(--paper); }
.deck__media--empty span { color: var(--muted-2); }
.deck__num { font-size: .68rem; letter-spacing: .12em; color: var(--tan); }
.deck__title {
  font-size: clamp(1.5rem, 1rem + 1.6vw, 2.2rem); font-weight: 300;
  letter-spacing: -.02em; margin: 10px 0 12px; color: var(--ink);
}
.deck__text p { color: var(--muted); line-height: 1.65; max-width: 46ch; margin: 0; }

/* На вузькому картка з фото над текстом вища за екран, а стос із карток,
   які не вміщаються, липне ривками. Тому там — звичайний список. */
@media (max-width: 860px) {
  .deck__item { position: static; }
  .deck__item + .deck__item { margin-top: clamp(28px, 7vw, 44px); }
  .deck__card { grid-template-columns: minmax(0, 1fr); gap: 16px; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
  .deck__item { position: static; }
  .deck__card { transform: none; }
}

.photo { border-radius: var(--r-lg); overflow: hidden; background: var(--sand-2); aspect-ratio: 4 / 3; position: relative; }
.photo img { width: 100%; height: 100%; object-fit: cover; transition: transform .8s var(--ease); }
.photo:hover img { transform: scale(1.04); }

/* ---------- 8. Переваги: фото-сцена з плитками, що розкриваються ---------- */
.trust {
  position: relative; isolation: isolate; overflow: hidden;
  border-radius: var(--r-2xl); color: #fff;
  min-height: min(660px, 86vh); display: flex; align-items: stretch;
  padding-block: clamp(34px, 4.5vw, 64px);
}
.trust__bg {
  position: absolute; top: 0; left: 0; right: 0; height: 100%;
  z-index: -2; background: var(--ink);
}
.trust__bg picture, .trust__bg img { display: block; width: 100%; height: 100%; object-fit: cover; }
.trust::before {
  content: ''; position: absolute; inset: 0; z-index: -1;
  background:
    linear-gradient(100deg, rgba(20,23,26,.86) 0%, rgba(20,23,26,.52) 46%, rgba(20,23,26,.2) 72%, rgba(20,23,26,.12) 100%),
    linear-gradient(180deg, rgba(20,23,26,.55) 0%, rgba(20,23,26,.3) 40%, rgba(20,23,26,.82) 100%);
}
.trust__inner { display: flex; flex-direction: column; justify-content: space-between; gap: clamp(24px, 4vh, 48px); }
.trust__head .eyebrow { color: rgba(255,255,255,.6); }
.trust__head .eyebrow::before { background: rgba(255,255,255,.4); }
.trust__head h2 { color: #fff; margin-top: 10px; }

/* стрічка плиток */
.trust__strip { display: flex; gap: 10px; align-items: flex-end; min-width: 0; height: clamp(336px, 36vh, 390px); }
.trust__tile {
  flex: 1 1 0; min-width: 0; display: flex; flex-direction: column;
  border-radius: var(--r-lg); overflow: hidden;
  background: rgba(255, 255, 255, .12); border: 1px solid rgba(255, 255, 255, .16);
  backdrop-filter: blur(12px); color: #fff;
  transition: flex-grow .6s var(--ease-out), background .45s var(--ease-out),
              border-color .45s var(--ease-out), color .45s var(--ease-out);
}
.trust__tile.is-open {
  flex-grow: 3.4; background: var(--paper); border-color: transparent; color: var(--ink);
  height: 100%;
}
.trust__hit {
  width: 100%; display: flex; flex-direction: column; gap: 14px; align-items: flex-start;
  padding: clamp(16px, 1.6vw, 24px); background: none; border: 0; cursor: pointer;
  text-align: left; font: inherit; color: inherit; min-width: 0;
}
.trust__chevron { display: none; }
.trust__ico {
  width: 38px; height: 38px; border-radius: var(--r-md); display: grid; place-items: center;
  background: rgba(255, 255, 255, .16); color: #fff; flex-shrink: 0;
  transition: background .45s var(--ease-out), color .45s var(--ease-out);
}
.trust__ico svg { width: 19px; height: 19px; }
.trust__tile.is-open .trust__ico { background: var(--tan); color: #fff; }
.trust__title {
  font-size: .92rem; font-weight: 500; line-height: 1.3; letter-spacing: .01em;
  color: inherit; min-width: 0; overflow-wrap: break-word;
}
.trust__tile.is-open .trust__title { font-size: 1.06rem; }
/* згорнуті плитки однакової висоти — верхній край рівний */
.trust__tile:not(.is-open) { align-self: flex-end; height: clamp(158px, 21vh, 214px); }
.trust__tile:not(.is-open) .trust__title { min-height: 3.9em; }

/* тіло розкритої плитки */
.trust__body {
  flex: 1 1 auto; min-height: 0; overflow: hidden;
  padding: 0 clamp(16px, 1.6vw, 24px) clamp(16px, 1.6vw, 24px);
}
.trust__tile:not(.is-open) .trust__body { display: none; }
.trust__tile.is-open .trust__body { animation: trustIn .45s var(--ease-out) .12s both; }
@keyframes trustIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
.trust__body p {
  margin: 0; font-size: .88rem; line-height: 1.6; color: var(--ink-2);
  border-top: 1px solid var(--line-2); padding-top: 14px;
}
.trust__tags { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
.trust__tags span {
  font-size: .66rem; letter-spacing: .1em; text-transform: uppercase;
  color: var(--muted); background: var(--sand); border-radius: var(--r-sm); padding: 6px 10px;
}

@media (hover: hover) {
  .trust__tile:not(.is-open):hover { background: rgba(255, 255, 255, .2); border-color: rgba(255,255,255,.3); }
  .trust__tile:not(.is-open):hover .trust__ico { background: rgba(255, 255, 255, .28); }
}
.trust__hit:focus-visible { outline: 2px solid #fff; outline-offset: -4px; border-radius: var(--r-md); }

/* низ: прогрес і стрілки */
.trust__foot { display: flex; align-items: center; justify-content: space-between; gap: 20px; }
.trust__prog { position: relative; height: 2px; width: min(240px, 40%); background: rgba(255,255,255,.24); border-radius: var(--r-full); overflow: hidden; }
.trust__prog i { position: absolute; inset: 0; display: block; background: #fff; transform-origin: 0 50%; transform: scaleX(0); transition: transform .5s var(--ease-out); }
.trust__nav { display: flex; gap: 8px; }
.trust__arrow {
  width: 42px; height: 42px; border-radius: var(--r-md); display: grid; place-items: center; cursor: pointer;
  background: rgba(255,255,255,.12); border: 1px solid rgba(255,255,255,.2); color: #fff;
  transition: background .3s var(--ease), border-color .3s var(--ease);
}
.trust__arrow:hover { background: rgba(255,255,255,.26); border-color: rgba(255,255,255,.4); }
.trust__arrow svg { width: 18px; height: 18px; }
.trust__arrow[data-trust="-1"] svg { transform: rotate(90deg); }
.trust__arrow[data-trust="1"] svg { transform: rotate(-90deg); }

/* планшет і мобільний — вертикальний акордеон, без фіксованої висоти */
@media (max-width: 900px) {
  .trust { min-height: 0; border-radius: var(--r-lg); }
  /* фото за плитками — статичного розміру, завжди. Секція на мобайлі
     росте/згортається разом з акордеоном (контент нижче зсувається —
     це нормально), але сам .trust__bg від цієї висоти більше не залежить:
     фіксований запас під найвищий можливий стан (усі закриті + найдовше
     тіло одного розкритого тайла), лишок ховає .trust { overflow: hidden }. */
  .trust__bg { height: 1000px; }
  .trust__strip { flex-direction: column; gap: 8px; }
  .trust__strip { align-items: stretch; height: auto; }
  .trust__tile.is-open { height: auto; }
  .trust__body { flex: 0 0 auto; }
  /* align-self: flex-end із десктопної правила (вирівнювання по нижньому
     краю різновисоких плиток у рядку) лишався й тут — у стовпчику це
     вирівнювання по ПРАВОМУ краю (cross-axis у flex-direction:column) і
     стискання по контенту замість stretch: кожен закритий рядок вужчий і
     зсунутий вправо, кожен по-своєму — саме «сходинки» зі скріна. */
  .trust__tile:not(.is-open) { height: auto; align-self: stretch; }
  /* плавне розкриття тіла картки замість миттєвого display:none —
     висота й нижній відступ анімуються разом (initTrust виставляє
     max-height у px через scrollHeight, як і в initFaq) */
  /* фіксована висота тіла замість розрахунку по вмісту кожного тайла —
     раніше max-height рахувався в JS через scrollHeight окремо для
     кожної плитки (150–201px залежно від довжини тексту), тому висота й
     сам блок «ресайзились» щоразу під новий текст. Тепер одне статичне
     число для ВСІХ плиток — запас під найдовший текст ("Виробник, а не
     посередник", 201px натурального вмісту + трохи люфту). */
  /* height, не max-height: max-height лише обмежує зверху — коротший
     текст все одно стискав бокс під себе, і висота «гуляла» від тайла до
     тайла (134–171px замість фіксованих 220). height примусово тримає
     однакове число завжди, короткий текст лишає порожнє місце знизу —
     саме це й просив Ден («строго статична і фіксована певної висоти»). */
  /* усі відкриті тіла — однакова висота (220px), тому при перемиканні
     тайл, що закривається, і тайл, що відкривається, рівно компенсують
     одне одного — сумарна висота стрічки не міняється, і плитки нижче
     взагалі не рухаються (Ден просив саме руху — «нижні плавно вниз
     їдуть»). Розводимо старт: новий тайл росте одразу (без затримки),
     старий чекає .15s і тільки тоді починає стискатись — на цю паузу
     сумарна висота тимчасово більша, нижні плитки видимо їдуть вниз,
     звільняючи місце, а тоді старий тайл підтягується й усе осідає. */
  /* базове (десктопне, поза медіа-запитом) правило
     .trust__tile:not(.is-open) .trust__body { display: none } досі активне
     й на мобайлі — display не анімується transition'ом, тому воно вбивало
     згортання миттєво, ще ДО того, як height встигав хоч трохи змінитись.
     Скидаємо display назад на block — тепер саме height/transition керує
     згортанням, а display більше не заважає. */
  .trust__tile:not(.is-open) .trust__body { display: block; }
  .trust__body {
    height: 0; overflow: hidden; padding-bottom: 0;
    transition: height .3s var(--ease-out) .08s, padding-bottom .3s var(--ease-out) .08s;
  }
  .trust__tile.is-open .trust__body {
    height: 220px; padding-bottom: clamp(16px, 1.6vw, 24px);
    transition-delay: 0s;
  }
  /* десктопна fade+slide (trustIn, з .12s затримкою) на мобайлі зайва —
     тайл і так росте по висоті через max-height transition; окрема
     відкладена поява контенту поверх цього виглядає як «стрибок»
     (коробка вже виросла, а текст ще 120мс невидимий і потім різко
     виринає). Вимикаємо анімацію — контент з'являється разом з рамкою. */
  .trust__tile.is-open .trust__body { animation: none; }
  .trust__tile, .trust__tile.is-open { flex: 0 0 auto; }
  .trust__hit { flex-direction: row; align-items: center; gap: 14px; }
  .trust__title { font-size: .95rem; }
  .trust__tile.is-open .trust__title { font-size: .98rem; }
  .trust__title br { display: none; }
  /* Кнопка вже клікабельна (це <button>), але нічим не підказано, що
     можна натиснути, — саме на це поскаржився Ден. Шеврон праворуч
     робить рядок схожим на звичний мобільний акордеон. */
  .trust__hit { position: relative; }
  .trust__chevron {
    display: inline-flex; width: 16px; height: 16px; flex-shrink: 0; margin-left: auto;
    color: rgba(255, 255, 255, .55); transition: transform .3s var(--ease), color .3s var(--ease);
  }
  .trust__chevron svg { width: 100%; height: 100%; display: block; }
  .trust__tile.is-open .trust__chevron { transform: rotate(180deg); color: var(--tan); }
  .trust__tile:not(.is-open) .trust__title { min-height: 0; }
  .trust__foot { display: none; }
}

/* ---------- 8b. USP-стрічка та CTA-банд ---------- */
.usp-strip { border-bottom: 1px solid var(--line-2); background: var(--paper); }
.usp {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 0; padding-block: clamp(26px, 3vw, 40px);
}
.usp__item {
  padding-inline: clamp(14px, 2vw, 30px); display: flex; flex-direction: column; gap: 8px;
}
.usp__item:first-child { padding-left: 0; }
.usp__item:last-child { padding-right: 0; }
.usp__item + .usp__item { border-left: 1px solid var(--line-2); }
.usp__item b {
  font-size: .84rem; font-weight: 600; color: var(--ink);
  text-transform: uppercase; letter-spacing: .06em;
}
.usp__item span { font-size: .82rem; color: var(--muted); line-height: 1.5; min-height: 3em; }
.usp__item b { min-height: 3.2em; }

/* ---------- Тизер сторінки «Про нас» ----------
 *
 * Фото цеху ліворуч, текст праворуч. Свідомо не список переваг: їх на
 * головній уже два (USP-стрічка вгорі й «переваги власного цеху»), і вони
 * місцями повторюють одне одного. Третій список нічого б не додав, а от
 * знімок виробництва на головній не показаний більше ніде. */
.teaser {
  display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(26px, 4vw, 60px); align-items: center;
}
.teaser__media {
  margin: 0; overflow: hidden; border-radius: var(--r-xl);
  aspect-ratio: 4 / 3; background: var(--sand);
}
.teaser__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.teaser__text .eyebrow { display: inline-block; margin-bottom: 12px; }
/* Заголовок секції розрахований на всю ширину сторінки. У колонці вдвічі
   вужчій він розсипався на чотири рядки й вилазив за край — тут кегль
   рахується від тієї ширини, яка є насправді. */
.teaser__text .display { font-size: clamp(1.8rem, 1rem + 2.4vw, 3rem); }

@media (max-width: 860px) {
  /* На вузькому фото над текстом і нижче — інакше колонка з абзацами
     стискається до кількох слів у рядок. */
  .teaser { grid-template-columns: minmax(0, 1fr); }
  .teaser__media { aspect-ratio: 16 / 10; }
}

.ctaband {
  display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, .75fr);
  gap: clamp(26px, 4vw, 64px); align-items: center;
  background: var(--ink); border-radius: var(--r-lg);
  padding: clamp(30px, 4vw, 62px);
}
.ctaband .display { font-size: clamp(1.9rem, 1.1rem + 3vw, 3.2rem); line-height: 1.04; color: #fff; margin-top: 14px; }
.ctaband__text > .micro { color: rgba(255, 255, 255, .5); }
.ctaband__text p { color: rgba(255, 255, 255, .62); max-width: 52ch; margin-top: 18px; }
.ctaband__actions { display: grid; gap: 10px; align-content: center; }
.ctaband__text p { min-height: 78px; }
.ctaband__trust { display: grid; gap: 8px; margin-top: 10px; }
.ctaband__trust li {
  font-size: .74rem; letter-spacing: .04em; text-transform: uppercase;
  color: rgba(255, 255, 255, .45); padding-left: 18px; position: relative;
}
.ctaband__trust li::before {
  content: ""; position: absolute; left: 0; top: .5em;
  width: 8px; height: 1px; background: var(--tan);
}

/* ---------- 9. Каталог: картки ---------- */
.tabs { display: flex; gap: 8px; flex-wrap: wrap; }
.tab {
  padding: 9px 18px; border-radius: var(--r-md); cursor: pointer;
  background: transparent; border: 1px solid var(--line);
  font-size: .78rem; letter-spacing: .06em; text-transform: uppercase; font-weight: 600; color: var(--muted);
  transition: all .25s var(--ease);
}
.tab:hover { color: var(--ink); border-color: var(--ink); }
.tab.is-active { background: var(--ink); border-color: var(--ink); color: var(--paper); }

.grid-products { display: grid; grid-template-columns: repeat(auto-fill, minmax(258px, 1fr)); gap: var(--gap); }
/* Дві колонки на всьому вузькому діапазоні.
 *
 * auto-fill із minmax(258px) ламався у смузі ~521-560px: медіазапит ≤520px,
 * який вмикає дві колонки, вже не діяв, а на дві по 258 + gap місця ще не
 * вистачало. Виходила одна картка на всю ширину — фото 3/4 давало під 670px
 * висоти на самий лише знімок. Тепер дві колонки тримаються до 700px, і
 * такої картки не буває. */
@media (max-width: 700px) {
  .grid-products { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

.product {
  position: relative; display: flex; flex-direction: column;
  border: 1px solid var(--line-2); border-radius: var(--r-lg);
  padding: 10px 10px 16px; background: var(--paper);
  transition: border-color .3s var(--ease);
}
.product:hover { border-color: var(--line); }
.product__media {
  position: relative; border-radius: var(--r-sm); overflow: hidden;
  background: var(--sand-2); aspect-ratio: 3 / 4;
}
/* contain, а не cover.
 *
 * Фото дверей вертикальні: медіанне співвідношення 0,517 (тобто вдвічі вище
 * за ширину), а картка — 3/4. cover підганяв ширину й зрізав усе, що не
 * влізло по висоті: у середньому 43% висоти полотна, у найгіршому випадку
 * 97%. На картці лишався шматок середини — без верху, низу й, головне,
 * без пропорцій самих дверей, які людина й прийшла оцінити.
 *
 * Тепер полотно видно цілком, а вільне місце з боків — це нормально для
 * каталогу: так само роблять усі, хто продає двері.
 *
 * Відступ у відсотках: щоб полотно не впиралось у край картки й не злипалось
 * із бейджами «хіт» / «новинка» у кутку. */
.product__media img {
  width: 100%; height: 100%; padding: 6% 10%;
  object-fit: contain; transition: transform .8s var(--ease);
}
.product:hover .product__media img { transform: scale(1.045); }
.product__fallback { position: absolute; inset: 0; display: grid; place-items: center; padding: 12% 18%; background: linear-gradient(170deg, var(--sand), var(--clay)); }
.product__fallback svg { height: 100%; width: auto; }
.product__badges { position: absolute; top: 12px; left: 12px; z-index: 2; display: flex; gap: 6px; }
.badge {
  padding: 6px 12px; border-radius: var(--r-sm); font-size: .62rem; font-weight: 700;
  letter-spacing: .14em; text-transform: uppercase;
  background: rgba(255, 255, 255, .94); color: var(--ink);
}
.badge--tan { background: var(--tan); color: #fff; }
.badge--dark { background: rgba(27, 25, 23, .82); color: #fff; }

.product__tools { position: absolute; top: 12px; right: 12px; z-index: 2; display: grid; gap: 8px; }
.product__tool {
  width: 36px; height: 36px; border-radius: var(--r-full); cursor: pointer;
  background: rgba(255, 255, 255, .85); border: 1px solid var(--glass-line);
  backdrop-filter: blur(8px); display: grid; place-items: center; color: var(--ink-2);
  opacity: 0; transform: translateX(6px); transition: all .3s var(--ease);
}
/* :focus-visible поруч із :hover — інакше кнопки «серце»/«порівняти» й
   «швидкий перегляд» опаковані до 0 і клавіатурний фокус потрапляє на
   геть невидимий елемент: ні самої кнопки, ні рамки не видно. */
.product:hover .product__tool, .product__tool:focus-visible, .product__tool.is-active { opacity: 1; transform: none; }
.product__tool.is-active { background: var(--ink); color: #fff; }
.product__tool:hover { background: #fff; color: var(--tan); }
.product__tool svg { width: 16px; height: 16px; }
.product__quick { position: absolute; left: 12px; right: 12px; bottom: 12px; z-index: 2; opacity: 0; transform: translateY(8px); transition: all .35s var(--ease); }
.product:hover .product__quick, .product__quick:focus-within { opacity: 1; transform: none; }
/* На дотику :hover не існує, а :focus-within «залипає» після тапу (нема
   події, що знімає фокус) — кнопка лишається розкритою поверх назви й
   ціни картки. На реальному тач-пристрої це й непотрібно: рядок картки
   веде на сторінку товару так само, тож прибираємо кнопку повністю там,
   де немає справжнього ховеру, замість намагатись «полагодити» залипання. */
@media (hover: none) {
  .product__quick { display: none; }
}
/* (hover: none) покриває більшість тач-пристроїв, але не всі — трапляються
   телефони/браузери, де ця медіа-фіча не спрацьовує (звіт користувача:
   кнопка лишається видимою на реальному мобільному). На вузьких екранах
   ряд картки й так веде на сторінку товару, тож ширина — надійніший і
   однозначний сигнал "це мобілка", ніж hover-детекція. */
@media (max-width: 760px) {
  .product__quick { display: none; }
}
/* Обидва сидять у .product__media (overflow: hidden), і «швидкий
   перегляд» — кнопка на всю ширину плитки, майже впритул до її країв:
   рамка фокуса з дефолтним offset +3px вилазить за межі й обрізається. */
.product__media :focus-visible { outline-offset: -3px; }

.product__body { padding: 11px 6px 0; display: flex; flex-direction: column; gap: 5px; flex: 1; }
.product__series { font-size: .62rem; letter-spacing: .18em; text-transform: uppercase; color: var(--muted-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.product__name { font-size: 1.15rem; font-weight: 400; letter-spacing: .01em; color: var(--ink); text-transform: uppercase; }
.product__specs { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 2px; min-height: 56px; align-content: flex-start; }   /* резерв під 2 рядки чіпів — картки не стрибають при зміні мови */
.product__spec { font-size: .7rem; padding: 4px 10px; border-radius: var(--r-sm); background: var(--sand); color: var(--muted); }
.product__foot { margin-top: auto; padding-top: 10px; display: flex; align-items: flex-end; justify-content: space-between; gap: 10px; border-top: 1px solid var(--line-2); }
.product__price b { font-size: 1.08rem; font-weight: 600; color: var(--ink); letter-spacing: -.02em; }
.product__price s { display: block; font-size: .76rem; color: var(--muted-2); }
.product__price small { display: block; font-size: .72rem; color: var(--muted); }
.product__rating { display: inline-flex; align-items: center; gap: 5px; font-size: .78rem; color: var(--muted); }
.product__rating svg { width: 13px; height: 13px; color: var(--tan); }

/* ---------- 10. Підбір / калькулятор ---------- */
.picker {
  border-radius: var(--r-2xl); background: var(--ink); color: rgba(255, 255, 255, .72);
  padding: clamp(26px, 4vw, 62px); position: relative; overflow: hidden;
}
.picker::before {
  content: ""; position: absolute; right: -10%; top: -30%; width: 55%; height: 130%;
  background: radial-gradient(closest-side, rgba(176, 136, 94, .38), transparent);
}
.picker > * { position: relative; }
.picker .display { color: #fff; }
.picker__grid { display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, .85fr); gap: clamp(26px, 4vw, 58px); align-items: start; margin-top: clamp(24px, 3vw, 44px); }
.steps { display: grid; grid-template-columns: minmax(0, 1fr); gap: 24px; }
.step__label { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; font-size: .66rem; letter-spacing: .2em; text-transform: uppercase; color: rgba(255, 255, 255, .45); font-weight: 600; }
.step__label b { width: 22px; height: 22px; border-radius: var(--r-full); background: rgba(255,255,255,.1); color: #fff; display: grid; place-items: center; font-size: .7rem; }
.opts { display: flex; flex-wrap: wrap; gap: 8px; }
.opt {
  padding: 10px 18px; border-radius: var(--r-md); cursor: pointer;
  background: rgba(255, 255, 255, .06); border: 1px solid rgba(255, 255, 255, .14);
  color: rgba(255, 255, 255, .8); font-size: .86rem; transition: all .25s var(--ease);
}
.opt:hover { background: rgba(255, 255, 255, .13); color: #fff; }
.opt.is-active { background: var(--tan); border-color: var(--tan); color: #fff; }
.picker__result { background: rgba(255, 255, 255, .06); border: 1px solid rgba(255, 255, 255, .12); border-radius: var(--r-xl); padding: 26px; backdrop-filter: blur(8px); }
.picker__result h3 { font-size: .7rem; letter-spacing: .2em; text-transform: uppercase; font-weight: 600; color: rgba(255,255,255,.5); margin-bottom: 14px; }
.picker__sum { font-size: clamp(1.6rem, 1.1rem + 1.9vw, 2.6rem); font-weight: 300; letter-spacing: -.02em; color: #fff; line-height: 1.12;
  /* Діапазон із двох сум довгий; хай переноситься по тире, а не рве число. */
  text-wrap: balance; overflow-wrap: normal; }
.picker__hint { font-size: .78rem; color: rgba(255, 255, 255, .45); margin: 10px 0 20px; }
.picker__list { display: grid; gap: 10px; margin-bottom: 22px; }
.picker__list li { display: flex; justify-content: space-between; gap: 12px; font-size: .84rem; color: rgba(255, 255, 255, .58); padding-bottom: 10px; border-bottom: 1px solid rgba(255, 255, 255, .08); }
.picker__list li span:last-child { color: #fff; }

/* ---------- 11. Процес ---------- */
.process { display: grid; gap: 0; --bleed: clamp(12px, 1.6vw, 22px); }
.process__row {
  position: relative; isolation: isolate;
  display: grid; grid-template-columns: 64px minmax(0, 1.1fr) minmax(0, 1.6fr);
  gap: clamp(14px, 3vw, 40px); align-items: baseline;
  padding: clamp(20px, 2.4vw, 30px) 0; border-top: 1px solid var(--line-2);
}
.process__row:last-child { border-bottom: 1px solid var(--line-2); }

/* м'яка підкладка — анімується opacity, без реflow */
.process__row::before {
  content: ''; position: absolute; z-index: -1;
  inset: 1px calc(var(--bleed) * -1) 0;
  border-radius: var(--r-md); background: var(--sand);
  opacity: 0; transition: opacity .5s var(--ease-out);
}
/* акцентна риска, що виростає зверху вниз */
.process__row::after {
  content: ''; position: absolute; z-index: -1;
  left: calc(var(--bleed) * -1); top: 1px; bottom: 0; width: 2px;
  background: var(--tan); transform: scaleY(0); transform-origin: 50% 0;
  transition: transform .5s var(--ease-out);
}
/* контент їде вправо з легким стагером */
.process__row > * {
  transition: transform .5s var(--ease-out), color .4s var(--ease-out);
}

@media (hover: hover) {
  .process__row:hover::before { opacity: 1; }
  .process__row:hover::after { transform: scaleY(1); }
  .process__row:hover > * { transform: translateX(10px); }
  .process__row:hover > *:nth-child(2) { transition-delay: .04s; }
  .process__row:hover > *:nth-child(3) { transition-delay: .08s; }
}
.process__num { font-size: .72rem; letter-spacing: .16em; color: var(--tan); font-weight: 600; }
.process__row h3 { font-size: clamp(1.05rem, .9rem + .7vw, 1.45rem); font-weight: 400; letter-spacing: .01em; text-transform: uppercase; margin: 0; }
.process__row p { margin: 0; font-size: .9rem; color: var(--muted); }

/* ---------- 13. Команда, відгуки ---------- */
.team { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--gap); }
.member__photo { border-radius: var(--r-xl); overflow: hidden; aspect-ratio: 3 / 4; background: var(--sand-2); }
.member__photo img { width: 100%; height: 100%; object-fit: cover; transition: transform .8s var(--ease); }
.member:hover .member__photo img { transform: scale(1.04); }
.member h3 { margin: 16px 0 2px; font-size: 1.1rem; font-weight: 400; letter-spacing: .02em; text-transform: uppercase; }
.member p { margin: 0; font-size: .82rem; color: var(--muted); }

.reviews { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--gap); }
.review { padding: 26px; border-radius: var(--r-xl); background: var(--paper); border: 1px solid var(--line-2); display: flex; flex-direction: column; gap: 16px; }
.section--sand .review { background: #fff; border-color: transparent; }
.review__stars { display: flex; gap: 3px; color: var(--tan); }
.review__stars svg { width: 14px; height: 14px; }
.review p { margin: 0; font-size: .94rem; color: var(--ink-2); min-height: 6.5em; }
.review__author { margin-top: auto; display: flex; align-items: center; gap: 12px; }
.review__avatar { width: 40px; height: 40px; border-radius: var(--r-full); background: var(--tan-soft); color: var(--tan-2); display: grid; place-items: center; font-weight: 600; font-size: .84rem; }
.review__author b { display: block; font-size: .9rem; color: var(--ink); font-weight: 600; }
.review__author span { font-size: .78rem; color: var(--muted); }

/* ---------- 14. FAQ ---------- */
.faq { display: grid; }
.faq__item { border-top: 1px solid var(--line-2); }
.faq__item:last-child { border-bottom: 1px solid var(--line-2); }
.faq__q {
  width: 100%; background: none; border: 0; cursor: pointer; text-align: left;
  padding: clamp(18px, 2vw, 26px) 0; display: flex; align-items: center; justify-content: space-between; gap: 20px;
  font-size: clamp(1.02rem, .9rem + .6vw, 1.35rem); font-weight: 300; letter-spacing: -.02em; color: var(--ink);
}
.faq__q svg { width: 18px; height: 18px; flex-shrink: 0; color: var(--tan); transition: transform .35s var(--ease); }
.faq__item.is-open .faq__q svg { transform: rotate(135deg); }
.faq__a { max-height: 0; overflow: hidden; transition: max-height .4s var(--ease); }
.faq__a p { padding-bottom: 24px; margin: 0; color: var(--muted); max-width: 76ch; font-size: .95rem; }

/* Відкрите питання на світлому тлі. Без нього список читався як суцільна
   стрічка ліній, і не було видно, до якого саме питання належить відповідь.
   Фон заходить за краї на 20px, щоб текст не тулився до самої межі. */
/* Відступ стоїть завжди, а не лише у відкритого — інакше текст питання
   стрибав би вбік у момент розкриття. */
.faq__item { transition: background .3s var(--ease); padding-inline: clamp(12px, 1.6vw, 20px); }
.faq__item.is-open { background: var(--sand); }
.faq__item.is-open .faq__q { color: var(--ink); }

/* ---------- 15. Контакти / форма ---------- */
.contact h2 { font-size: clamp(1.9rem, 1rem + 3.4vw, 3.4rem); overflow-wrap: break-word; }
.contact { display: grid; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); gap: clamp(26px, 4vw, 64px); align-items: start; }
.contact__rows { display: grid; gap: 2px; margin-top: 26px; }
.contact__row { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; padding: 16px 0; border-bottom: 1px solid var(--line-2); }
.contact__row span { font-size: .68rem; letter-spacing: .18em; text-transform: uppercase; color: var(--muted); }
.contact__row b { font-size: 1.02rem; font-weight: 500; color: var(--ink); text-align: right; }

.form { background: var(--paper); border-radius: var(--r-xl); padding: clamp(22px, 3vw, 38px); border: 1px solid var(--line-2); }
.section--sand .form { background: #fff; border-color: transparent; }
.form__grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
.field { display: flex; flex-direction: column; gap: 8px; }
.field--full { grid-column: 1 / -1; }
.field label { font-size: .66rem; letter-spacing: .18em; text-transform: uppercase; color: var(--muted); font-weight: 600; }
.field input, .field select, .field textarea {
  /* background-color, а не скорочення background: інакше воно скидає
     background-image і власна стрілка у <select> зникає */
  padding: 12px 0; border: 0; border-bottom: 1px solid var(--line); background-color: transparent;
  font-size: 1rem; transition: border-color .25s var(--ease);
}
.field input::placeholder, .field textarea::placeholder { color: var(--muted-2); }
.field input:focus, .field select:focus, .field textarea:focus,
.field input:focus-visible, .field select:focus-visible, .field textarea:focus-visible { outline: none; border-color: var(--tan); }
.field textarea { resize: vertical; min-height: 74px; }
/* textarea тут бракувало: поле «коментар» при помилці лишалось сірим,
   хоча решта форми підсвічувалась */
.field.has-error input, .field.has-error select, .field.has-error textarea { border-color: #C0564A; }
.field__error { display: none; font-size: .76rem; color: #C0564A; }
.field.has-error .field__error { display: block; }
/* Віджет Turnstile малює власний iframe 300x65. Лейбла над ним немає —
   він підписаний сам, і другий підпис лише дублював би текст. */
.field--captcha .captcha__widget { min-height: 65px; }
.field--captcha .captcha__widget iframe { max-width: 100%; }
/* якщо Cloudflare не відповів — на місці віджета пояснення, а не порожнеча */
.field__note { font-size: .82rem; color: var(--muted); line-height: 1.6; margin: 0; }
.field__note a { color: var(--tan); }
.form__foot { display: flex; align-items: center; justify-content: space-between; gap: 18px; flex-wrap: wrap; margin-top: 26px; }
/* на вузьких екранах кнопка відправки лишається природної ширини й
   висить зліва з порожнечею праворуч — розтягуємо на всю ширину. */
@media (max-width: 700px) {
  .form__foot .btn { width: 100%; justify-content: center; }
}
.form__policy { font-size: .76rem; color: var(--muted); max-width: 36ch; }
.form__success { display: none; align-items: center; gap: 10px; margin-top: 18px; padding: 14px 18px; border-radius: var(--r-md); background: rgba(78, 122, 91, .1); color: var(--ok); font-size: .9rem; font-weight: 600; }
.form__success.is-visible { display: flex; }
.form__success svg { width: 18px; height: 18px; }

.messengers { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; margin-top: 24px; }
.messenger { justify-content: center; }
.messenger {
  display: inline-flex; align-items: center; gap: 9px; padding: 11px 18px; border-radius: var(--r-md);
  border: 1px solid var(--line); font-size: .84rem; font-weight: 600; color: var(--ink);
  transition: all .25s var(--ease);
}
/* ховер у фірмових кольорах кожної мережі */
.messenger:hover { background: var(--ink); color: #fff; border-color: var(--ink); }
.messenger--viber:hover  { background: #7360F2; border-color: #7360F2; }
.messenger--fb:hover     { background: #1877F2; border-color: #1877F2; }
.messenger--insta:hover  { background: linear-gradient(45deg, #F58529 0%, #DD2A7B 45%, #8134AF 75%, #515BD4 100%); border-color: #DD2A7B; }
.messenger--tiktok:hover { background: #000; border-color: #000; }

.messenger i { width: 17px; height: 17px; display: grid; place-items: center; flex-shrink: 0; }
.messenger svg { width: 100%; height: 100%; display: block; }

/* на вузьких екранах 4 в один рядок вже не влазять — повертаємось до 2 колонок */
@media (max-width: 700px) {
  .messengers { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* ---------- 16. Футер ---------- */
.footer { background: var(--ink); color: rgba(255, 255, 255, .55); border-radius: var(--r-2xl) var(--r-2xl) 0 0; padding: clamp(44px, 6vw, 90px) 0 28px; margin-top: clamp(30px, 4vw, 60px); }
.footer .display { color: #fff; }
.footer__top { display: flex; align-items: flex-end; justify-content: space-between; gap: 26px; flex-wrap: wrap; padding-bottom: clamp(34px, 4vw, 60px); border-bottom: 1px solid rgba(255,255,255,.1); }
/* лого переносить на свій рядок, а кнопка дзвінка лишається куценькою —
   на телефоні тягнемо її на всю ширину. */
@media (max-width: 700px) {
  .footer__top .btn { width: 100%; justify-content: center; }
}
.footer__grid { display: grid; grid-template-columns: 1.3fr repeat(3, 1fr); gap: clamp(22px, 3vw, 50px); padding-top: clamp(30px, 4vw, 52px); }
.footer h2 { color: #fff; font-size: .66rem; letter-spacing: .2em; text-transform: uppercase; font-weight: 600; margin-bottom: 18px; }
.footer__list { display: grid; gap: 11px; font-size: .9rem; }
.footer a:hover { color: #fff; }
.footer__bottom { margin-top: clamp(30px, 4vw, 54px); padding-top: 22px; border-top: 1px solid rgba(255,255,255,.1); display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap; font-size: .78rem; }

/* ---------- 17. Липкі елементи ---------- */
.mobilebar {
  position: fixed; left: 12px; right: 12px; bottom: 12px; z-index: 70; display: none;
  grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 4px; padding: 8px;
  border-radius: var(--r-lg); background: rgba(255, 255, 255, .95);
  border: 1px solid var(--line-2); backdrop-filter: blur(16px); box-shadow: var(--shadow-md);
}
.mobilebar a, .mobilebar button {
  display: grid; grid-template-rows: 22px auto; justify-items: center; align-items: center;
  gap: 5px; padding: 7px 2px; background: none; border: 0; cursor: pointer;
  font-size: .62rem; line-height: 1.1; letter-spacing: .04em; text-align: center;
  color: var(--muted); font-weight: 600; min-width: 0;
}
.mobilebar [data-icon] { width: 22px; height: 22px; }
.mobilebar svg { width: 20px; height: 20px; display: block; }
.mobilebar .is-primary { color: var(--tan-2); }

.compare-bar {
  position: fixed; left: 50%; bottom: 24px; z-index: 75; transform: translate(-50%, 160%);
  display: flex; align-items: center; gap: 16px; padding: 10px 12px 10px 22px;
  border-radius: var(--r-lg); background: var(--ink); color: #fff; box-shadow: var(--shadow-lg);
  transition: transform .45s var(--ease-out), opacity .3s var(--ease), visibility .3s;
  max-width: calc(100% - 28px); opacity: 0; visibility: hidden;
}
.compare-bar.is-visible { transform: translate(-50%, 0); opacity: 1; visibility: visible; }
.compare-bar span { color: rgba(255, 255, 255, .5); font-size: .82rem; }
.icon-btn {
  width: 38px; height: 38px; border-radius: var(--r-full); display: grid; place-items: center;
  border: 1px solid var(--line); background: transparent; cursor: pointer; color: inherit; position: relative;
  transition: all .25s var(--ease);
}
.icon-btn:hover { border-color: currentColor; }

/* У хедері «обране» і «порівняти» — самі іконки, без кружечка.
 *
 * Спершу рамка бралася з --line (майже чорний), і на темному фото кнопки
 * зникали. Лікували рамкою + заливкою — і перелікували: вийшли дві сірі
 * плями, найважчі в ряду після кнопки заклику, до того ж поруч стоїть
 * «UA» узагалі без коробки, тобто три різні форми в одному ряду.
 *
 * Видимість дає колір самої іконки, а не підкладка під нею. Тому в спокої
 * кружечка немає — коробка 38px лишається тільки зоною кліку. Підкладка
 * проявляється на наведенні й лишається, коли в списку щось є: тоді вона
 * несе сенс («тут не порожньо»), а не просто малює рамку.
 *
 * Стосується лише хедера: на картках і сторінці товару кружечок
 * потрібен — там кнопки стоять на світлому серед іншого вмісту. */
.nav-wrap .icon-btn {
  border-color: transparent; background: none;
  color: rgba(255, 255, 255, .82);
}
.nav-wrap .icon-btn:hover { background: rgba(255, 255, 255, .16); color: #fff; }
.nav-wrap.is-solid .icon-btn { border-color: transparent; background: transparent; color: var(--ink-2); }
.nav-wrap.is-solid .icon-btn:hover { border-color: transparent; background: var(--sand); color: var(--ink); }
.nav-wrap.is-solid .icon-btn.is-active,
.nav-wrap .icon-btn.is-active { border-color: transparent; color: var(--tan); background: rgba(224, 54, 76, .14); }
.icon-btn svg { width: 17px; height: 17px; }
/* Без кружечка іконці можна дати трохи більше — терези з пʼятьма штрихами
   на 17px читались кашею. */
.nav-wrap .icon-btn svg { width: 19px; height: 19px; }
/* Кружечок раніше відсовував лічильник від іконки; без нього значок на
   типовому місці (top/right: -3px) сідав просто на гліф. Тут він менший і
   зсунутий у кут коробки кліку, тобто вище й правіше за саму іконку. */
.nav-wrap .icon-btn__count {
  top: -1px; right: -4px; min-width: 16px; height: 16px; padding: 0 4px; font-size: .6rem;
}
.icon-btn__count {
  position: absolute; top: -3px; right: -3px; min-width: 18px; height: 18px; padding: 0 5px;
  border-radius: var(--r-full); background: var(--tan); color: #fff; font-size: .64rem; font-weight: 700;
  display: grid; place-items: center; transform: scale(0); transition: transform .3s var(--ease-out);
}
.icon-btn__count.is-visible { transform: scale(1); }

/* ---------- 18. Модалка ---------- */
.modal { position: fixed; inset: 0; z-index: 100; display: grid; place-items: center; padding: 18px; opacity: 0; visibility: hidden; transition: opacity .3s var(--ease), visibility .3s; }
.modal.is-open { opacity: 1; visibility: visible; }
.modal__backdrop { position: absolute; inset: 0; background: rgba(20, 18, 16, .5); backdrop-filter: blur(6px); }
.modal__box {
  position: relative; width: min(940px, 100%); max-height: 88vh; overflow: auto;
  background: var(--paper); border-radius: var(--r-xl); padding: clamp(22px, 3vw, 38px); box-shadow: var(--shadow-lg);
  transform: translateY(16px) scale(.985); transition: transform .4s var(--ease-out);
}
.modal.is-open .modal__box { transform: none; }
.modal__close { position: absolute; top: 16px; right: 16px; }
.modal__title { font-size: clamp(1.3rem, 1.05rem + 1vw, 1.8rem); font-weight: 400; letter-spacing: .01em; text-transform: uppercase; margin-bottom: 20px; }

.compare-table { width: 100%; border-collapse: collapse; font-size: .9rem; }
.compare-table th, .compare-table td { padding: 12px 14px; text-align: left; border-bottom: 1px solid var(--line-2); vertical-align: top; }
.compare-table th { font-size: .68rem; letter-spacing: .14em; text-transform: uppercase; color: var(--muted); font-weight: 600; white-space: nowrap; }
.compare-table td b { color: var(--ink); font-weight: 600; }
.compare-table td { white-space: pre-line; }
.compare-table img { width: 100%; max-width: 130px; border-radius: var(--r-md); aspect-ratio: 3/4; object-fit: contain; padding: 5%; background: var(--sand-2); }

.filters__cta p { min-height: 3.4em; }
.filters__cta b { min-height: 2.4em; }

/* ---------- 19. Каталог ---------- */
.crumbs { display: flex; align-items: center; gap: 10px; font-size: .68rem; letter-spacing: .14em; text-transform: uppercase; color: var(--muted); }
.crumbs a:hover { color: var(--tan); }
.crumbs svg { width: 12px; height: 12px; opacity: .5; }

/* Відступ під фіксовану шапку. Раніше тут стояло 92–108px під однорівневий
   хедер у 65px. Хедер став дворівневим — 114px на десктопі (68 + 46) і 102
   на вузькому екрані (60 + 42), — і хлібні крихти опинились майже впритул
   до нього. Тепер відлік від нової висоти плюс ті самі ~40px повітря. */
.page-head { padding-top: clamp(142px, 11vw, 154px); }

/* Про-нас: page-head несе лише хлібні крихти (H1-геро прихований на
   прохання Дена, 2026-09-14) — без свого контенту нижче він більше не
   стуляється з наступною секцією й успадковує її повний --section-y,
   тож між крихтами й "командою" з'явився зайвий відступ. Стягуємо назад
   до звичного відступу "крихти → контент". */
.page-head--crumbs-only { padding-bottom: 0; }
.page-head--crumbs-only + .section { padding-top: clamp(28px, 3vw, 40px); }

/* pro-nas.html: короткий абзац про компанію перед "командою". Обидві
   секції мають свій padding-block (section--tight + звичайний .section),
   тож знизу вони складались і давали ~150-200px порожнечі між текстом
   і заголовком "команда". Стягуємо так само, як і в парі
   .page-head--crumbs-only + .section вище. */
.about-intro { padding-bottom: 0; }
.about-intro + .section { padding-top: clamp(28px, 3vw, 40px); }

.catalog { display: grid; grid-template-columns: 250px minmax(0, 1fr); gap: clamp(22px, 3vw, 48px); align-items: start; }
/* Сайдбар фільтрів: липкий і зі власним скролом — інакше при 6 категоріях
   і 10 серіях нижні пункти лишаються за межами екрана й до них не дістатись. */
.filters {
  position: sticky; top: 100px;
  max-height: calc(100vh - 124px);
  overflow-y: auto; overscroll-behavior: contain;
  padding-right: 10px; margin-right: -10px;   /* скролбар не наїжджає на лічильники */
  scrollbar-width: thin; scrollbar-color: var(--line) transparent;
}
.filters::-webkit-scrollbar { width: 6px; }
.filters::-webkit-scrollbar-track { background: transparent; }
.filters::-webkit-scrollbar-thumb { background: var(--line); border-radius: 3px; }
.filters:hover::-webkit-scrollbar-thumb { background: var(--line-2); }
/* шапка лишається на місці, щоб «Скинути» була під рукою на будь-якій позиції */
.filters__head {
  position: sticky; top: 0; z-index: 2;
  background: var(--paper); padding-block: 2px 10px;
}
.filters__head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
.filters__head h2 { margin: 0; font-size: .68rem; letter-spacing: .2em; text-transform: uppercase; color: var(--muted); font-weight: 600; }
/* 44×44 — мінімальна зручна ціль дотику; текст маленький, тому добираємо
   відступами й відʼємним margin, щоб візуально нічого не зсунулось */
.filters__reset {
  background: none; border: 0; cursor: pointer; font-size: .78rem;
  color: var(--tan); font-weight: 600;
  padding: 11px 8px; margin: -11px -8px;
}
.fgroup { padding: 18px 0; border-top: 1px solid var(--line-2); }
/* під полем пошуку вже є підкреслення — розділювач не дублюємо */
.filters .field + .fgroup { border-top: 0; }
.fgroup__title { font-size: .82rem; font-weight: 700; color: var(--ink); margin-bottom: 12px; }
.check { display: flex; align-items: center; gap: 10px; padding: 6px 0; cursor: pointer; font-size: .88rem; color: var(--ink-2); }
.check input { width: 17px; height: 17px; accent-color: var(--tan); cursor: pointer; }
.check .count { margin-left: auto; font-size: .74rem; color: var(--muted-2); }
.range { display: flex; align-items: center; gap: 10px; }
/* Не [type="number"] — input-guard.js навмисне міняє тип на "text"
   (щоб пропускати «12 850» з пробілом і не пускати e/+/-, коментар
   там-таки), і на той момент, коли поле реально в DOM, атрибут type
   вже інший — селектор по [type="number"] переставав збігатись, і
   поле лишалось з рідною рамкою браузера й невимкненим фокус-кільцем. */
.range input { width: 100%; min-width: 0; padding: 9px 0; border: 0; border-bottom: 1px solid var(--line); background: transparent; font-size: .88rem; }
.range input:focus, .range input:focus-visible { outline: none; border-color: var(--tan); }
input[type="range"] { width: 100%; accent-color: var(--tan); margin-top: 14px; }

.catalog__bar { display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap; margin-bottom: 16px; }
.catalog__count { font-size: .8rem; letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }
.catalog__count b { color: var(--ink); font-weight: 700; }
.sort select { padding: 9px 32px 9px 14px; border-radius: 0; border: 1px solid var(--line); background-color: transparent; background-position: right 11px center; font-size: .84rem; cursor: pointer; }
.active-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 18px; }
.active-chip { display: inline-flex; align-items: center; gap: 8px; padding: 7px 14px; border-radius: var(--r-sm); background: var(--tan-soft); color: var(--tan-2); border: 0; cursor: pointer; font-size: .8rem; font-weight: 600; }
.active-chip svg { width: 12px; height: 12px; }
.filters-toggle { display: none; }
.empty { padding: 60px 20px; text-align: center; color: var(--muted); }
.empty svg { width: 40px; height: 40px; margin: 0 auto 14px; color: var(--muted-2); }
.empty p { max-width: 46ch; margin-inline: auto; }
.empty .btn { margin-top: 10px; }

/* промо-блок "сумніваєтесь між моделями?" під сіткою каталогу — раніше
   inline-стилями: текст+кнопки в 2 колонки (minmax(0,1fr) auto). На
   вузьких екранах колонка auto (кнопки) стискала текстову колонку до
   одного слова в рядку, а самі кнопки лишались куцими й наїжджали одна
   на одну. Стаємо в стовпчик і розтягуємо кнопки на всю ширину. */
.cmp-promo {
  margin-top: 40px; padding: clamp(22px, 3vw, 36px); border-radius: var(--r-xl);
  background: var(--sand); display: grid; grid-template-columns: minmax(0, 1fr) auto;
  gap: 22px; align-items: center;
}
.cmp-promo__actions { display: flex; gap: 10px; flex-wrap: wrap; }
@media (max-width: 700px) {
  .cmp-promo { grid-template-columns: minmax(0, 1fr); }
  .cmp-promo__actions { flex-direction: column; }
  .cmp-promo__actions .btn { width: 100%; justify-content: center; }
}

/* ---------- 19a. Накладки ---------- */
.ptypes { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--gap); }
.ptype { padding: clamp(24px, 2.6vw, 34px); border: 1px solid var(--line-2); border-radius: var(--r-lg); background: var(--paper); transition: border-color .35s var(--ease), background .35s var(--ease); }
.ptype__tag { display: inline-block; font-size: .64rem; letter-spacing: .12em; text-transform: uppercase; font-weight: 600; color: var(--tan); background: var(--tan-soft); border-radius: var(--r-sm); padding: 6px 10px; }
.ptype h2 { margin: 16px 0 10px; font-size: 1.2rem; font-weight: 400; letter-spacing: .01em; color: var(--ink); }
.ptype p { margin: 0; font-size: .9rem; line-height: 1.65; color: var(--muted); min-height: 5em; }
.ptype__list { list-style: none; margin: 18px 0 0; padding: 0; display: grid; gap: 8px; }
.ptype__list li { position: relative; padding-left: 20px; font-size: .82rem; letter-spacing: .02em; text-transform: uppercase; color: var(--ink-2); }
.ptype__list li::before { content: ''; position: absolute; left: 0; top: .58em; width: 10px; height: 1px; background: var(--tan); }
@media (hover: hover) { .ptype:hover { border-color: var(--line); background: var(--sand); } }

/* властивості мдф — сітка карток (panels.html) */
.adv { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--gap); }
.adv__card { padding: clamp(22px, 2.2vw, 30px); border: 1px solid var(--line-2); border-radius: var(--r-lg); background: var(--paper); transition: border-color .35s var(--ease), background .35s var(--ease); }
.adv__ico { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: var(--r-md, 3px); background: var(--tan-soft); color: var(--tan); }
.adv__ico svg { width: 20px; height: 20px; }
.adv__card h3 { margin: 18px 0 10px; font-size: 1.05rem; font-weight: 400; letter-spacing: .01em; line-height: 1.3; color: var(--ink); min-height: 2.6em; }
.adv__card p { margin: 0; font-size: .88rem; line-height: 1.65; color: var(--muted); min-height: 6.6em; }
@media (hover: hover) { .adv__card:hover { border-color: var(--line); background: var(--sand); } }
@media (max-width: 1100px) { .adv { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 700px) {
  .adv { grid-template-columns: minmax(0, 1fr); }
  .adv__card h3, .adv__card p { min-height: 0; }
}

@media (max-width: 1100px) { .ptypes { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

@media (max-width: 900px) {
  .ptypes { grid-template-columns: minmax(0, 1fr); }
  .ptype p { min-height: 0; }
}

/* ---------- 19b. Блог ---------- */
.post-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1px; background: var(--line-2); border-top: 1px solid var(--line-2); border-bottom: 1px solid var(--line-2); }
.post-card { background: var(--paper); min-width: 0; }
.post-card__hit {
  display: flex; flex-direction: column; gap: 12px; height: 100%;
  padding: clamp(22px, 2.4vw, 32px); color: inherit;
  transition: background .4s var(--ease-out);
}
.post-card__media {
  display: block; margin-bottom: 4px; border-radius: var(--r-md); overflow: hidden;
  background: var(--sand-2); aspect-ratio: 16 / 10;
}
.post-card__media img { width: 100%; height: 100%; object-fit: cover; transition: transform .7s var(--ease); }
.post-card__meta { display: flex; align-items: center; gap: 12px; font-size: .68rem; letter-spacing: .12em; text-transform: uppercase; color: var(--muted-2); }
.post-card__cat { color: var(--tan); font-weight: 600; }
.post-card__title { margin: 0; font-size: 1.06rem; font-weight: 500; line-height: 1.3; color: var(--ink); min-height: 2.6em; transition: color .3s var(--ease); }
.post-card__lead { margin: 0; font-size: .86rem; line-height: 1.6; color: var(--muted); min-height: 5.2em; }
.post-card__more { margin-top: auto; display: inline-flex; align-items: center; gap: 8px; font-size: .72rem; letter-spacing: .12em; text-transform: uppercase; font-weight: 600; color: var(--ink); }
.post-card__more svg { width: 15px; height: 15px; color: var(--tan); transition: transform .3s var(--ease); }

@media (hover: hover) {
  .post-card__hit:hover { background: var(--sand); }
  .post-card__hit:hover .post-card__media img { transform: scale(1.045); }
  .post-card__hit:hover .post-card__title { color: var(--tan); }
  .post-card__hit:hover .post-card__more svg { transform: translateX(4px); }
}

/* стаття */
.post__wrap { max-width: 760px; }
.post__head { padding-bottom: clamp(20px, 2.4vw, 30px); border-bottom: 1px solid var(--line-2); }
.post__meta { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; margin-bottom: 14px; font-size: .68rem; letter-spacing: .12em; text-transform: uppercase; color: var(--muted-2); }
.post__head h1 {
  margin: 0 0 14px; font-size: clamp(1.6rem, 1.2rem + 1.8vw, 2.6rem);
  line-height: 1.14; letter-spacing: -.01em; text-transform: none; font-weight: 400;
}
.post__head .lead { margin: 0; }
.post__langnote { margin: clamp(22px, 2.6vw, 34px) 0 -10px; padding: 12px 16px; border-radius: var(--r-md); background: var(--sand); font-size: .82rem; color: var(--muted); }
.post__cover {
  margin: clamp(22px, 2.6vw, 34px) 0 0; border-radius: var(--r-lg); overflow: hidden;
  background: var(--sand-2); aspect-ratio: 16 / 9;
}
.post__cover img { width: 100%; height: 100%; object-fit: cover; display: block; }
.post__body { padding-top: clamp(22px, 2.6vw, 34px); }
.post__body h2 { margin: clamp(28px, 3vw, 40px) 0 12px; font-size: clamp(1.1rem, .95rem + .5vw, 1.35rem); font-weight: 500; letter-spacing: .01em; color: var(--ink); }
.post__body h2:first-child { margin-top: 0; }
.post__body p { margin: 0 0 16px; font-size: 1rem; line-height: 1.75; color: var(--ink-2); }
.post__body ul { margin: 0 0 16px; padding: 0; list-style: none; display: grid; gap: 10px; }
.post__body li { position: relative; padding-left: 22px; font-size: 1rem; line-height: 1.65; color: var(--ink-2); }
.post__body li::before { content: ''; position: absolute; left: 0; top: .62em; width: 10px; height: 1px; background: var(--tan); }

.post__cta {
  display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap;
  margin-top: clamp(30px, 4vw, 48px); padding: clamp(20px, 2.4vw, 28px);
  border-radius: var(--r-lg); background: var(--sand);
}
.post__cta b { display: block; font-size: 1.02rem; font-weight: 500; color: var(--ink); margin-bottom: 4px; }
.post__cta span { font-size: .86rem; color: var(--muted); }

.post-rel { margin-top: clamp(34px, 4vw, 54px); }
.post-rel__grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin-top: 14px; }
.post-rel__item {
  display: flex; flex-direction: column; gap: 8px; padding: 18px; min-width: 0;
  border: 1px solid var(--line-2); border-radius: var(--r-md); color: inherit;
  transition: border-color .3s var(--ease), background .3s var(--ease);
}
.post-rel__cat { font-size: .64rem; letter-spacing: .12em; text-transform: uppercase; color: var(--tan); font-weight: 600; }
.post-rel__title { font-size: .9rem; line-height: 1.35; color: var(--ink); }
@media (hover: hover) { .post-rel__item:hover { border-color: var(--line); background: var(--sand); } }

@media (max-width: 1100px) { .post-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 700px) {
  .post-grid, .post-rel__grid { grid-template-columns: minmax(0, 1fr); }
  .post-card__title, .post-card__lead { min-height: 0; }
  .post__cta { flex-direction: column; align-items: flex-start; }
}

/* ---------- 20. Картка товару ---------- */
/* Галерея ~на 30% вужча за попередню: фото дверей вертикальне (4/5),
   на широкому екрані воно займало майже всю висоту вікна. */
.pdp { display: grid; grid-template-columns: minmax(0, .76fr) minmax(0, 1.24fr); gap: clamp(26px, 4vw, 64px); align-items: start; }
.gallery { max-width: 460px; }
.gallery__main { border-radius: var(--r-xl); overflow: hidden; background: var(--sand-2); aspect-ratio: 4 / 5; position: relative; }
/* те саме, що й на картці: cover зрізав двері по висоті */
.gallery__main img { width: 100%; height: 100%; padding: 5% 8%; object-fit: contain; }
.gallery__thumbs { display: flex; gap: 10px; margin-top: 12px; }
.gallery__thumb { width: 84px; aspect-ratio: 3/4; border-radius: var(--r-md); overflow: hidden; background: var(--sand-2); border: 1.5px solid transparent; cursor: pointer; padding: 0; transition: border-color .25s var(--ease); }
/* Кнопка сама собі overflow: hidden впритул до країв (без padding) —
   рамка фокуса назовні обрізається власним же вирізом мініатюри. */
.gallery__thumb:focus-visible { outline-offset: -3px; }
.gallery__thumb img { width: 100%; height: 100%; padding: 6%; object-fit: contain; }
.gallery__thumb.is-active { border-color: var(--ink); }

.pdp h1 { font-size: clamp(2rem, 1.4rem + 2.4vw, 3.4rem); font-weight: 300; letter-spacing: -.01em; text-transform: uppercase; margin-bottom: 10px; }
.pdp__meta { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; font-size: .8rem; color: var(--muted); margin-bottom: 26px; }
.pdp__price-box { padding: 24px 0; border-block: 1px solid var(--line-2); }
.pdp__price { display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap; }
.pdp__price b { font-size: clamp(1.8rem, 1.3rem + 1.8vw, 2.6rem); font-weight: 400; letter-spacing: -.01em; color: var(--ink); }
.pdp__price s { color: var(--muted-2); }
.pdp__credit { font-size: .84rem; color: var(--muted); margin-top: 8px; }
.pdp__cta { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 22px; }
/* на телефоні обидві кнопки — і основна, і "спочатку замір" — на всю
   ширину та стовпчиком, а не одна широка й одна куца поруч. */
@media (max-width: 700px) {
  .pdp__cta { flex-direction: column; }
  .pdp__cta .btn { width: 100%; justify-content: center; }
}

.config { display: grid; gap: 22px; margin-top: 26px; }
.config__label { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 12px; }
.config__label b { font-size: .68rem; letter-spacing: .18em; text-transform: uppercase; color: var(--muted); font-weight: 600; }
.config__opts { display: flex; flex-wrap: wrap; gap: 8px; }
.config__opt {
  padding: 10px 16px; border-radius: var(--r-md); cursor: pointer; background: transparent;
  border: 1px solid var(--line); font-size: .86rem; color: var(--ink-2);
  display: inline-flex; align-items: center; gap: 8px; transition: all .25s var(--ease);
}
.config__opt:hover { border-color: var(--ink); }
.config__opt.is-active { background: var(--ink); border-color: var(--ink); color: var(--paper); }
.config__opt small { opacity: .65; font-size: .76rem; }
.config__opt i { width: 16px; height: 16px; border-radius: 5px; box-shadow: inset 0 0 0 1px rgba(0,0,0,.12); }

.specs { display: grid; }
/* Список характеристик у «швидкому перегляді» (.qv) скролиться сам —
   градієнт знизу й власна лінія скролу праворуч, той самий підхід, що й
   у .opts/.tabs/.reviews (script.js, initEdgeFade), тільки вертикальний.
   Клас has-more-below вмикає градієнт (script.js, updateQvScroll), лише
   поки справді є що прогорнути нижче. Скоуп на .qv .specs — щоб не
   зачепити .specs на сторінці товару, де скролу немає.

   Смугу скролу малюємо самі (.qv-scrollrail/.qv-scrollthumb), а нативний
   scrollbar ховаємо: scrollbar-width:thin у macOS Chrome — це оверлей,
   який ховається поза самим моментом скролу, і на скріні його просто не
   видно; постійна лінія потрібна власна, не залежна від ОС/браузера. */
.qv .specs {
  padding-right: 16px;
  scrollbar-width: none;
  --fade-b: 0px;
  -webkit-mask-image: linear-gradient(to bottom, #000 0, #000 calc(100% - var(--fade-b)), transparent 100%);
  mask-image: linear-gradient(to bottom, #000 0, #000 calc(100% - var(--fade-b)), transparent 100%);
}
.qv .specs::-webkit-scrollbar { display: none; }
.qv .specs.has-more-below { --fade-b: 28px; }
.qv-scrollrail {
  position: absolute; top: 0; bottom: 0; right: 2px; width: 3px;
  background: var(--line-2); border-radius: 3px; pointer-events: none; visibility: hidden;
}
.qv-scrollthumb { position: absolute; left: 0; width: 100%; min-height: 24px; background: var(--line); border-radius: 3px; }
.specs__row { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 16px; padding: 13px 0; border-bottom: 1px solid var(--line-2); font-size: .92rem; }
.specs__row span { color: var(--muted); }
/* "Комплект фурнітури" (script.js, furnitureSet) кладе кілька підписаних
   пунктів в одне значення через "\n" — рендеримо як реальні рядки, без
   HTML-тегів у даних з адмінки. */
.specs__row b { color: var(--ink); font-weight: 600; white-space: pre-line; }
.kit-label { color: var(--muted); font-weight: 600; }  /* підписи "Замок:"/"Циліндр:"/"Ручка:" у «Комплект фурнітури» — сірим, як звичайні лейбли характеристик */

/* overflow-x:auto робить із рядка табів прокручувану область. Підкреслення активного табу
   (.tab-line::after, bottom:-1px) виступає на піксель униз — через це з'являлась
   смуга прокрутки («слайдер»). Лишаємо гортання пальцем/колесом, але без видимої
   смуги й без вертикального виступу: padding-bottom:1px вміщає підкреслення. */
.tabs-line { display: flex; gap: 26px; border-bottom: 1px solid var(--line-2); margin-bottom: 28px; overflow-x: auto; overflow-y: hidden; padding-bottom: 1px; scrollbar-width: none; touch-action: pan-x; }
.tabs-line::-webkit-scrollbar { display: none; }
.tab-line {
  padding: 14px 0; background: none; border: 0; cursor: pointer; white-space: nowrap; position: relative;
  font-size: .72rem; letter-spacing: .16em; text-transform: uppercase; font-weight: 600; color: var(--muted);
}
.tab-line::after { content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 1.5px; background: var(--tan); transform: scaleX(0); transition: transform .3s var(--ease); }
.tab-line.is-active { color: var(--ink); }
.tab-line.is-active::after { transform: scaleX(1); }
.tab-panel { display: none; }
.tab-panel.is-active { display: block; animation: fadeIn .4s var(--ease-out); }
/* Кейфрейма fadeIn не існувало ніде в проєкті — анімація мовчки не працювала. */
@keyframes fadeIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }

.sticky-buy {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 65; transform: translateY(110%);
  background: rgba(255, 255, 255, .96); backdrop-filter: blur(14px); border-top: 1px solid var(--line-2);
  transition: transform .4s var(--ease-out);
}
.sticky-buy.is-visible { transform: none; }
.sticky-buy__inner { display: flex; align-items: center; justify-content: space-between; gap: 18px; padding-block: 12px; }
.sticky-buy__info { display: flex; align-items: center; gap: 14px; min-width: 0; }
.sticky-buy__info img { width: 42px; height: 52px; object-fit: contain; padding: 3px; border-radius: var(--r-sm); background: var(--sand-2); flex-shrink: 0; }
/* Назва моделі + підпис "у вашій конфігурації" — в один рядок кожен,
   з обрізанням «…», а не переносом слів на десктопі/планшеті, де рядок
   один і місця вистачає. На вузькому телефоні (≤480px) бар перебудовується
   у два рядки нижче — там обрізання майже не потрібне, бо повна ширина. */
.sticky-buy__info > div { min-width: 0; }
.sticky-buy__info b { display: block; font-size: 1rem; font-weight: 500; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sticky-buy__info span { display: block; font-size: .78rem; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sticky-buy__inner > div:last-child { flex-shrink: 0; display: flex; align-items: center; gap: 16px; }
.sticky-buy.is-visible ~ .compare-bar { bottom: 92px; }
/* На вузькому телефоні одного рядка на назву+ціну+кнопку не вистачає:
   ціна+кнопка (flex-shrink:0, бо кнопка не має ламатись) забирали майже
   всю ширину — назва моделі обрізалась до 1-2 символів ("V.." замість
   "VF-103"). Замість боротьби за горизонтальний простір — другий рядок:
   назва+підпис займають всю ширину зверху, ціна+кнопка на всю ширину
   знизу. Обом рядкам тепер вистачає місця, обрізання практично не потрібне. */
@media (max-width: 480px) {
  .sticky-buy__inner { flex-direction: column; align-items: stretch; gap: 8px; padding-block: 10px; }
  .sticky-buy__info { width: 100%; }
  .sticky-buy__inner > div:last-child { width: 100%; justify-content: space-between; flex-shrink: 1; }
  .sticky-buy.is-visible ~ .compare-bar { bottom: 118px; }
}

/* ---------- 21. Анімації появи ---------- */
.reveal { opacity: 0; transform: translateY(26px); transition: opacity .8s var(--ease-out), transform .8s var(--ease-out); }
.reveal.is-visible { opacity: 1; transform: none; }
.reveal[data-delay="1"] { transition-delay: .08s; }
.reveal[data-delay="2"] { transition-delay: .16s; }
.reveal[data-delay="3"] { transition-delay: .24s; }
.reveal[data-delay="4"] { transition-delay: .32s; }
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; scroll-behavior: auto !important; }
  .reveal { opacity: 1; transform: none; }
}

/* ---------- 22. Адаптив ---------- */
@media (max-width: 1100px) {
  .about__text { margin-left: 0; }
  .about__media { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .picker__grid { grid-template-columns: minmax(0, 1fr); }
  .contact { grid-template-columns: minmax(0, 1fr); }
  .pdp { grid-template-columns: minmax(0, 1fr); }
  .footer__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .team { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; }
  .reviews { grid-template-columns: minmax(0, 1fr); }
  .catalog { grid-template-columns: minmax(0, 1fr); }
  .filters {
    position: fixed; inset: 0; z-index: 96; background: var(--paper); overflow-y: auto;
    padding: 20px clamp(16px, 5vw, 28px) 40px; transform: translateX(-100%);
    /* visibility, не лише transform — та сама причина, що й у .mmenu:
       закрита панель фільтрів лишалась у tab-order поза екраном. */
    visibility: hidden;
    transition: transform .4s var(--ease-out), visibility .4s; top: 0;
    max-height: none; margin-right: 0;
  }
  .filters.is-open { transform: none; visibility: visible; }
  .filters-toggle { display: inline-flex; }
  .process__row { grid-template-columns: 40px minmax(0, 1fr); row-gap: 6px; }
  .process__row p { grid-column: 2; }
}

/* Порядок стиснення хедера.
   Пошук ховаємо ОСТАННІМ, а не першим, як раніше: у каталозі з 86 моделей
   він знаходить швидше за меню, і в новій схемі він же — центр першого
   рівня. Першими йдуть графік і телефон (обидва є в контактах і в нижньому
   барі), далі кнопка «Зв'язатись» (продубльована там само). */
@media (max-width: 1240px) {
  .nav-cats__hours { display: none; }
  /* Лишився сам телефон — крапка-роздільник більше нема чого відділяти. */
  .nav-contact .nav-cats__hours::before { content: none; }
}
@media (max-width: 1100px) {
  .nav-contact { display: none; }
}
@media (max-width: 940px) {
  .nav-main__tools .btn { display: none; }
}
/* Поле живе до 620 — далі в рядок не вміщається логотип + капсула + мова
   + дві іконки + бургер. Нижче шукають зі сторінки каталогу, там поле
   своє й на всю ширину. */
@media (max-width: 620px) {
  .nav-search { display: none; }
}
/* Нижче 900 кнопки «Звʼязатись» у рядку вже немає, тож і рівнятись нема
   на що, а Safari на iOS зумить сторінку, коли фокус іде в поле з кеглем
   меншим за 16px. Повертаємо 16px саме там. */
@media (max-width: 900px) {
  .nav-search input { font-size: 16px; }
}

@media (max-width: 1100px) {
  .usp { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 22px 0; }
  .usp__item:nth-child(odd) { padding-left: 0; border-left: 0; }
  .usp__item:nth-child(even) { padding-right: 0; }
  .ctaband { grid-template-columns: minmax(0, 1fr); }
  .hero__desc { max-width: 46ch; }
}

@media (max-width: 860px) {
  /* На вузькому екрані з другого рівня лишається «Всі категорії»: це вхід
     у товар. Решта розділів переїжджає в бургер-меню, де вони й були. */
  .nav-cats__inner .nav-links { display: none; }
  .nav-main__inner { height: 60px; gap: 12px; }
  .nav-wrap.is-scrolled .nav-main__inner { height: 54px; }
  .nav-cats__inner { height: 42px; }
  /* Рядок тут нижчий (60 замість 68), тож і капсула сідає з ним. */
  .nav-search { padding: 0 14px; height: 40px; }
  .burger { display: grid; }
  .nav-main__tools { gap: 8px; }
  .cats-drop__inner { grid-template-columns: minmax(0, 1fr); padding: 10px 0 14px; }
  /* Список категорій в один стовпець тут і так довгий (6-7 рядків +
     «скоро» + «Увесь каталог»): на телефоні він не вміщається на екран,
     і людина гортає всю сторінку, щоб побачити решту, — випадайка
     непомітно «зливається» зі сторінкою. Обмежуємо власною висотою й
     скролом під шапкою, робимо плитку фото компактнішою (була розрахована
     на десктопну сітку 3 колонки, на телефоні займає забагато висоти
     рядка), звужуємо відступи рядка — влазить більше категорій без скролу. */
  .cats-drop { max-height: calc(100dvh - 102px); overflow-y: auto; }
  .cats-drop__pic { width: 42px; height: 64px; }
  .cats-drop a { padding: 7px 12px; gap: 12px; }
  .hero { min-height: 94svh; }
  .hero__stats { gap: 20px 26px; }
  /* .hero__meta стоїть з align-items: flex-start (стовпчиком, притиснуто
     ліворуч), тож .hero__actions як його flex-дитина сама стискається під
     контент і не тягнеться на всю ширину — width:100% на кнопці рахувався
     від цієї вже стиснутої ширини й нічого візуально не міняв. Тягнемо
     сам контейнер на всю ширину, тоді кнопка справді на всю ширину. */
  .hero__actions { align-self: stretch; }
  .hero__actions .btn { width: 100%; justify-content: space-between; }

  /* Мобільне меню відкривається ПІД справжнім хедером (лого, мова, обране,
     порівняння), а не замінює його власним «дверні системи» + хрестик —
     сам бургер перемикається на хрестик (JS), і того досить для закриття.
     Другий рядок (.nav-cats — «Всі категорії») під час відкритого меню
     ховаємо: у ньому нема нічого, чого немає в самому меню, а два рядки
     навігації одночасно виглядають зайво. */
  .mmenu__head { display: none; }
  .mmenu { top: 60px; z-index: 79; }
  body.menu-open .nav-cats { display: none; }
}

@media (max-width: 760px) {
  body { padding-bottom: 76px; }
  /* Кроки підбору (категорія / серія / проєм / додатково) на телефоні
     переносились у 2-3 рядки й самі по собі займали пів екрана. Один
     рядок з горизонтальним скролом — звичний мобільний патерн для списку
     коротких опцій, і видно одразу, що їх можна гортати. */
  .opts {
    flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch;
    scroll-snap-type: x proximity; scrollbar-width: none; padding-bottom: 2px;
    touch-action: pan-x;
  }
  .opts::-webkit-scrollbar { display: none; }
  .opts .opt { flex: 0 0 auto; scroll-snap-align: start; white-space: nowrap; }
  /* Останній пункт обрізаний рівно по краю екрана — без підказки це
     виглядає як поламана верстка, а не «можна погортати». Спершу тут був
     ::after-градієнт кольору підкладки поверх правого краю — і він ЇХАВ
     РАЗОМ зі скролом (контейнер сам overflow-x:auto, а будь-який його
     нащадок — і position:absolute теж — фарбується всередині того самого
     скрольного шару й зсувається з ним). mask-image натомість позиціонується
     як background-image з attachment:scroll за замовчуванням — прив'язаний
     до боксу елемента, а не до його прокрученого вмісту, тож лишається на
     місці при будь-якому scrollLeft. Заразом сам вміст (а не підкладка під
     ним) згасає до прозорості — не треба підганяти колір градієнта під фон,
     який може бути різним (темний .picker і світлий .section--sand). */
  /* Градієнт лише з того боку, де справді є що прогорнути: --fade-l/--fade-r
     міняє на 0/ширину клас has-more-left/has-more-right (script.js,
     initEdgeFade) залежно від el.scrollLeft. За замовчуванням обидва 0 —
     маска суцільна, нічого не згасає (на старті скролу й коли рядок
     цілком влазить сам, без скролу). */
  .opts {
    --fade-l: 0px; --fade-r: 0px;
    -webkit-mask-image: linear-gradient(to right, transparent 0, #000 var(--fade-l), #000 calc(100% - var(--fade-r)), transparent 100%);
    mask-image: linear-gradient(to right, transparent 0, #000 var(--fade-l), #000 calc(100% - var(--fade-r)), transparent 100%);
  }
  .opts.has-more-left { --fade-l: 24px; }
  .opts.has-more-right { --fade-r: 36px; }
  /* Той самий патерн для табів категорій над «популярними» на головній —
     7 табів («Всі» + 6 категорій) так само переносились у 3-4 рядки. */
  .tabs {
    flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch;
    scroll-snap-type: x proximity; scrollbar-width: none; padding-bottom: 2px;
    touch-action: pan-x;
  }
  .tabs::-webkit-scrollbar { display: none; }
  .tabs .tab { flex: 0 0 auto; scroll-snap-align: start; white-space: nowrap; }
  /* Той самий mask-image, з тієї самої причини — див. коментар у .opts вище. */
  .tabs {
    --fade-l: 0px; --fade-r: 0px;
    -webkit-mask-image: linear-gradient(to right, transparent 0, #000 var(--fade-l), #000 calc(100% - var(--fade-r)), transparent 100%);
    mask-image: linear-gradient(to right, transparent 0, #000 var(--fade-l), #000 calc(100% - var(--fade-r)), transparent 100%);
  }
  .tabs.has-more-left { --fade-l: 24px; }
  .tabs.has-more-right { --fade-r: 36px; }
  /* Таби характеристик/комплектації/доставки на сторінці товару —
     той самий патерн. Раніше тут був лише touch-action:pan-x (в базовому
     правилі .tabs-line, не в мобільному блоці) — без -webkit-overflow-
     scrolling:touch рядок скролився ривками, і свайп замість плавного
     горизонтального гортання іноді "зривався" у скрол сторінки вгору/
     вниз. Тепер повний набір властивостей кар'юселі, як у .opts/.tabs. */
  .tabs-line {
    -webkit-overflow-scrolling: touch; scroll-snap-type: x proximity;
    scrollbar-width: none; padding-bottom: 2px;
  }
  .tabs-line::-webkit-scrollbar { display: none; }
  .tab-line { flex: 0 0 auto; scroll-snap-align: start; }
  .tabs-line {
    --fade-l: 0px; --fade-r: 0px;
    -webkit-mask-image: linear-gradient(to right, transparent 0, #000 var(--fade-l), #000 calc(100% - var(--fade-r)), transparent 100%);
    mask-image: linear-gradient(to right, transparent 0, #000 var(--fade-l), #000 calc(100% - var(--fade-r)), transparent 100%);
  }
  .tabs-line.has-more-left { --fade-l: 24px; }
  .tabs-line.has-more-right { --fade-r: 36px; }
  /* Відгуки — той самий принцип: три повноширинні картки одна під одною
     займали пів екрана телефону. Один ряд з горизонтальним скролом і
     snap, картка трохи ширша за 90% екрана — видно край наступної, це й
     сигналізує, що можна погортати, без окремого шеврона чи стрілки. */
  .reviews { grid-template-columns: none; grid-auto-flow: column; grid-auto-columns: 88%; overflow-x: auto; -webkit-overflow-scrolling: touch; scroll-snap-type: x proximity; scrollbar-width: none; padding-bottom: 2px; touch-action: pan-x; }
  .reviews::-webkit-scrollbar { display: none; }
  .review { scroll-snap-align: start; }
  .reviews {
    --fade-l: 0px; --fade-r: 0px;
    -webkit-mask-image: linear-gradient(to right, transparent 0, #000 var(--fade-l), #000 calc(100% - var(--fade-r)), transparent 100%);
    mask-image: linear-gradient(to right, transparent 0, #000 var(--fade-l), #000 calc(100% - var(--fade-r)), transparent 100%);
  }
  .reviews.has-more-left { --fade-l: 24px; }
  .reviews.has-more-right { --fade-r: 36px; }
  .hero { padding-bottom: 92px; }
  .mobilebar { display: grid; }
  .compare-bar { bottom: 88px; }
  .sticky-buy { bottom: 72px; }
  .form__grid { grid-template-columns: minmax(0, 1fr); }
  .footer__grid { grid-template-columns: minmax(0, 1fr); }
  .team { grid-template-columns: minmax(0, 1fr); gap: 20px; }
  .about__labels { gap: 30px; }
  .modal__box { padding: 18px; }
  .compare-table th, .compare-table td { padding: 9px 8px; font-size: .82rem; }
}

@media (max-width: 520px) {
  .usp { grid-template-columns: minmax(0, 1fr); }   /* gap задає правило ≤900 нижче у файлі */
  .usp__item { padding-inline: 0; border-left: 0 !important; }
  .grid-products { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
  .product__name { font-size: 1.05rem; }
  .product__specs { display: none; }
  .about__media { grid-template-columns: minmax(0, 1fr); }
  .hero__title .line--2 { padding-left: 18px; }
}

/* ---------- 24. Стани наведення (QA-фікси) ---------- */
.product__name {
  display: inline-block; padding-block: 2px;
  transition: color .25s var(--ease);
}
.product__name:hover { color: var(--tan); }
/* Клікабельна вся картка, а не лише назва: псевдоелемент розтягуємо на
   всю .product (найближчий position:relative предок — сам .product__name
   свого position не має навмисно, інакше розтягувався б лише в його межах).
   Кнопки/іконки над фото (obране, порівняти, швидкий перегляд) і кнопка
   «Замовити прорахунок» лишаються клікабельними — у них z-index вищий. */
.product__name::after { content: ''; position: absolute; inset: 0; z-index: 1; }
.product:hover .product__media img { transform: scale(1.045); }

.tab:not(.is-active):hover { background: var(--sand); color: var(--ink); }

.contact__row { transition: border-color .25s var(--ease); }
a.contact__row:hover { border-bottom-color: var(--tan); }
a.contact__row:hover b { color: var(--tan); }
.contact__row b { transition: color .25s var(--ease); }

.faq__q { transition: color .25s var(--ease); }
.faq__q:hover { color: var(--tan); }
.faq__q:hover svg { transform: scale(1.15); }
.faq__item.is-open .faq__q:hover svg { transform: rotate(135deg) scale(1.15); }

@media (hover: hover) { .process__row:hover h3 { color: var(--tan); } }

.review { transition: border-color .3s var(--ease); }
.review:hover { border-color: var(--line); }

.member h3 { transition: color .3s var(--ease); }
.member:hover h3 { color: var(--tan); }

.footer__list a, .crumbs a {
  display: inline-block; padding-block: 3px; transition: color .25s var(--ease);
}
/* нижній бар має власну сітку (іконка над підписом) — inline-block її ламав */
.mobilebar a, .mobilebar button { transition: color .25s var(--ease); }
.footer__list a:hover { color: #fff; }
.mobilebar a:hover, .mobilebar button:hover { color: var(--ink); }

.check { transition: color .2s var(--ease); }
.check:hover { color: var(--ink); }
.check:hover .count { color: var(--muted); }

.messenger, .opt, .config__opt, .tab, .active-chip, .product__tool, .icon-btn, .product {
  transition-property: background-color, border-color, color, transform, box-shadow, opacity;
  transition-duration: .25s; transition-timing-function: var(--ease);
}
.active-chip:hover { background: var(--tan); color: #fff; }
.sort select:hover { border-color: var(--ink); }
.gallery__thumb:hover { border-color: var(--muted-2); }
.link-line, .nav-meta, .filters__reset { cursor: pointer; }
.filters__reset:hover { color: var(--tan-2); text-decoration: underline; }

/* мінімальні розміри клікабельних зон */
.nav-links > a { padding-block: 10px; }
.crumbs a { padding-block: 4px; }

/* картка: постійний CTA замість тільки hover-дії */
.product__actions { position: relative; z-index: 2; margin-top: 10px; display: grid; gap: 8px; min-width: 0; }
.product__actions .btn {
  background: var(--sand); color: var(--ink);
  white-space: normal; text-align: center; line-height: 1.25; min-width: 0;
  padding-inline: 12px;
}
.product__actions .btn:hover { background: var(--ink); color: var(--paper); transform: none; box-shadow: none; }

/* форма: підсилення довіри біля кнопки */
.form__reassurance {
  display: flex; align-items: center; gap: 8px; margin-top: 12px;
  font-size: .74rem; letter-spacing: .04em; text-transform: uppercase; color: var(--muted);
}
.form__reassurance::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--ok); }

/* довіра в картці товару */
.pdp__trust { margin-top: 16px; }
.pdp__trust li { color: var(--muted); }
.pdp__trust li::before { background: var(--tan); }

@media (max-width: 520px) {
  .product__actions .btn { font-size: .64rem; letter-spacing: .03em; padding: 10px 8px; }
  .product { padding: 8px 8px 12px; }
}

/* ---------- 25. Підказки пошуку ---------- */
.search-drop {
  position: absolute; top: calc(100% + 8px); left: 0; right: 0; z-index: 95;
  background: #fff; border: 1px solid var(--line); border-radius: 0;
  box-shadow: var(--shadow-md); overflow: hidden; display: none;
  max-height: 360px; overflow-y: auto;
}
.search-drop.is-open { display: block; }
.search-drop__item {
  display: flex; align-items: center; gap: 12px; padding: 10px 14px;
  cursor: pointer; border-bottom: 1px solid var(--line-2); background: #fff;
  transition: background .18s var(--ease);
}
/* Рядок на всю ширину випадайки (overflow-x тут лишається hidden) —
   рамка фокуса ліворуч/праворуч впритул до країв і обрізається. */
.search-drop__item:focus-visible { outline-offset: -2px; }
.search-drop__item:last-child { border-bottom: 0; }
.search-drop__item:hover, .search-drop__item.is-active { background: var(--sand); }
.search-drop__thumb {
  width: 38px; height: 48px; border-radius: 2px; object-fit: contain; background: var(--sand-2);
  background: var(--sand-2); flex-shrink: 0;
}
.search-drop__info { min-width: 0; flex: 1; display: flex; flex-direction: column; gap: 3px; }
.search-drop__name { display: block; font-size: .92rem; color: var(--ink); font-weight: 500; text-transform: uppercase; letter-spacing: .02em; }
.search-drop__name mark { background: var(--tan-soft); color: var(--tan-2); padding: 0 1px; }
.search-drop__meta { display: block; font-size: .72rem; color: var(--muted); letter-spacing: .04em; text-transform: uppercase; }
.search-drop__price { font-size: .88rem; color: var(--ink); font-weight: 500; white-space: nowrap; }
.search-drop__foot {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 10px 14px; background: var(--sand); font-size: .74rem;
  letter-spacing: .06em; text-transform: uppercase; color: var(--muted); cursor: pointer;
}
.search-drop__foot:hover { color: var(--tan); }
.search-drop__empty { padding: 18px 14px; font-size: .88rem; color: var(--muted); }

/* Адаптив: на вузьких екранах кадр обрізається по центру — там фото найсвітліше,
   а тексту більше на одиницю площі. Тому затемнення ще щільніше. */
@media (max-width: 900px) {
  .hero::after {
    background:
      linear-gradient(180deg, rgba(12, 10, 9, .88) 0%, rgba(12, 10, 9, .66) 20%, rgba(12, 10, 9, .76) 52%, rgba(10, 9, 8, .97) 100%),
      radial-gradient(140% 90% at 50% 38%, transparent 12%, rgba(10, 9, 8, .6) 100%);
  }
  .hero__inner::before { top: 8%; background: linear-gradient(180deg, transparent, rgba(10, 9, 8, .72) 34%, rgba(10, 9, 8, .93)); }
}
@media (max-width: 560px) {
  .hero::after {
    background:
      linear-gradient(180deg, rgba(12, 10, 9, .9) 0%, rgba(12, 10, 9, .74) 18%, rgba(12, 10, 9, .82) 50%, rgba(10, 9, 8, .98) 100%),
      radial-gradient(150% 95% at 50% 36%, transparent 6%, rgba(10, 9, 8, .66) 100%);
  }
}

/* ---------- Мобільна компактність ---------- */
@media (max-width: 900px) {
  :root { --section-y: clamp(46px, 7vw, 64px); }

  /* USP після героя: у колонку — з горизонтальними роздільниками замість вертикальних */
  .usp { gap: 0; }
  .usp__item { padding: 16px 0; }
  .usp__item:first-child { padding-top: 0; }
  .usp__item:last-child { padding-bottom: 0; }
  .usp__item + .usp__item { border-left: 0; border-top: 1px solid var(--line-2); }
  /* резерв висоти потрібен лише в багатоколонковій сітці — в колонці він дає порожнечу */
  .usp__item span, .usp__item b, .review p, .filters__cta p, .filters__cta b { min-height: 0; }
  .product__specs { min-height: 0; }
  .adv__card h3, .adv__card p, .ptype p { min-height: 0; }

  /* легкі роздільники між блоками контенту */
  .section + .section { border-top: 1px solid var(--line-2); }
  .section--sand + .section, .section + .section--sand { border-top: 0; }

  /* картки й медіа компактніші */
  .product__media { aspect-ratio: 4 / 5; }
  .process__row { padding-block: 14px; }
}

@media (max-width: 560px) {
  :root { --section-y: 40px; }
  .section--tight { padding-block: 32px; }
}

/* Меню з 8 пунктів на невисоких екранах: підтискаємо кегль і відступи,
   щоб усе разом із кнопками влазило без внутрішнього скролу. */
@media (max-height: 870px) {
  .mmenu__head { margin-bottom: 18px; }
  .mmenu__link { padding: 11px 0; font-size: clamp(1.4rem, .9rem + 2.4vw, 2.1rem); }
  .mmenu__foot { padding-top: 20px; }
}
@media (max-height: 700px) {
  .mmenu__head { margin-bottom: 12px; }
  .mmenu__link { padding: 7px 0; font-size: clamp(1.15rem, .8rem + 1.8vw, 1.6rem); }
  .mmenu__link span { font-size: .58rem; }
  .mmenu__foot { padding-top: 12px; }
  .mmenu__foot .btn { --btn-h: 50px; }
}

/* ---------- Обране ---------- */
.icon-btn.is-active { color: var(--tan); border-color: var(--tan); }
.product__tool.is-active[data-fav] svg { fill: var(--tan); stroke: var(--tan); }

.favs { display: grid; gap: 12px; }
.fav {
  display: grid; grid-template-columns: 78px minmax(0, 1fr) auto; gap: 16px;
  align-items: center; padding: 12px; border: 1px solid var(--line-2); background: var(--paper);
}
.fav__media { display: block; position: relative; aspect-ratio: 3/4; overflow: hidden; background: var(--sand-2); }
/* Те саме, що й .gallery__thumb: посилання само собі overflow: hidden. */
.fav__media:focus-visible { outline-offset: -3px; }
.fav__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.fav__body { min-width: 0; display: grid; gap: 6px; }
.fav__name { font-size: 1.05rem; font-weight: 500; color: var(--ink); }
.fav__name:hover { color: var(--tan); }
.fav__side { display: grid; gap: 8px; justify-items: stretch; text-align: right; min-width: 168px; }
.fav__side b { font-size: 1.05rem; }
@media (max-width: 620px) {
  .fav { grid-template-columns: 64px minmax(0, 1fr); }
  .fav__side { grid-column: 1 / -1; text-align: left; min-width: 0; }
}

/* пастка для ботів: приховуємо надійно, але лишаємо доступною для екранних читачів */
/* Пастка для ботів.
 *
 * Було `position:absolute; left:-9999px` — поле лишалось у дереві
 * доступності й, головне, лишалось видимим для автозаповнення браузера.
 * Менеджер паролів радо вписував туди назву організації, сервер вважав це
 * ботом, і справжня заявка зникала без сліду.
 *
 * display:none прибирає поле і з автозаповнення, і з екранного диктора.
 * Наївний бот, який заповнює всі поля форми, у пастку так само потрапляє —
 * а сервер відтепер ще й зберігає такі заявки з міткою, тож навіть хибне
 * спрацювання нічого не втрачає. */
.hp { display: none; }
.form__success--err { color: var(--tan-2); }

/* [hidden] має вигравати у класів із display — інакше приховане видно */
[hidden] { display: none !important; }

/* ================================================================
   ВИПАДАЙКИ У СТИЛІ САЙТУ (ui-select.js)
   ================================================================
   Системний <select> малює ОС: на macOS це сірий напівпрозорий список
   із синім виділенням і заокругленнями, до якого CSS не має доступу.
   Тут — власний список; сам <select> лишається в DOM джерелом істини
   і просто ховається. Тому без JS сторінка лишається робочою, а не
   зламаною: видно звичайний системний список.

   Заокруглень немає ніде — як і в решті полів сайту. */
.usel { position: relative; display: block; min-width: 0; }

/* Справжній <select> ховаємо так, щоб він лишався у формі й у FormData.
   display:none прибрав би його з відправки, тому саме нульовий розмір.

   Селектор навмисно з атрибутом: контекстні правила на кшталт
   `.cfield select { width: 100% }` мають ту саму вагу (0,1,1) і лежать у
   файлі, який підключається пізніше, — вони перебивали приховування, і
   системний список лишався видимим поверх кнопки. */
.usel > select[data-usel-done] {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  /* Розміри тиснемо з обох боків навмисно: контекстні правила ставлять
     свої min-width / min-height (у панелі — <select class="abtn"> з
     min-height: 38px і вбудованим min-width), і прихований елемент
     лишався видимим прямокутником поверх кнопки. */
  min-width: 0; max-width: 1px; min-height: 0; max-height: 1px;
}

.usel__btn {
  width: 100%; display: flex; align-items: stretch; gap: 10px;
  padding: 0; border: 1px solid var(--line); border-radius: 0;
  background: var(--paper); color: var(--ink); font: inherit; font-size: .88rem;
  text-align: left; cursor: pointer;
  transition: border-color .2s var(--ease);
}
.usel__btn:hover { border-color: var(--ink); }
.usel.is-open .usel__btn { border-color: var(--tan); }
/* Стрілка сидить у власній зоні з відбивкою: інакше поле зі списком
   не відрізнити від звичайного інпута — та сама рамка, той самий фон, а
   маленька сіра галочка збоку не читається як «тут щось відкриється».
   Тепер видно з першого погляду, куди можна натиснути. */
.usel__arrow {
  display: grid; place-items: center; flex-shrink: 0; margin-left: auto;
  align-self: stretch; padding: 0 9px; color: var(--ink-2);
  background: var(--sand); border-left: 1px solid var(--line-2);
  transition: background .2s var(--ease), color .2s var(--ease);
}
.usel__arrow svg { width: 15px; height: 15px; display: block; transition: transform .2s var(--ease); }
.usel__btn:hover .usel__arrow { background: var(--sand-2); color: var(--ink); }
.usel.is-open .usel__arrow { background: var(--tan); color: #fff; border-left-color: var(--tan); }
.usel.is-open .usel__arrow svg { transform: rotate(180deg); }
.usel__val {
  display: flex; align-items: center; min-width: 0; padding: 9px 0 9px 10px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.usel__val.is-empty::before { content: '—'; color: var(--muted-2); }
.usel.is-disabled .usel__btn { opacity: .55; cursor: not-allowed; }
.usel.is-disabled .usel__btn:hover { border-color: var(--line); }

.usel__pop {
  position: absolute; z-index: 60; left: 0; right: 0; top: calc(100% + 4px);
  display: flex; flex-direction: column; min-width: 100%; overflow: hidden;
  background: var(--paper); border: 1px solid var(--line);
  box-shadow: 0 12px 34px rgba(41, 47, 51, .16);
}
.usel__pop.is-up { top: auto; bottom: calc(100% + 4px); }

/* Пошук показуємо лише для довгих списків: у каталозі покриттів 199
   позицій TERMOPAL, і гортати їх — гірше за системний список. */
.usel__search { padding: 8px; border-bottom: 1px solid var(--line-2); }
.usel__search input {
  width: 100%; padding: 7px 9px; border: 1px solid var(--line); border-radius: 0;
  background: var(--sand); font: inherit; font-size: .84rem; color: var(--ink);
}
.usel__search input:focus, .usel__search input:focus-visible { outline: none; border-color: var(--tan); background: var(--paper); }

.usel__list { flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 4px 0; }
.usel__list:focus, .usel__list:focus-visible { outline: none; }
.usel__opt {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 12px; font-size: .88rem; line-height: 1.35; cursor: pointer;
}
.usel__opt span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.usel__opt.is-active { background: var(--sand); }
.usel__opt--empty span { color: var(--muted-2); font-style: italic; }
.usel__opt[data-sel] { font-weight: 600; }
/* Позначка вибраного — риска ліворуч, а не «галочка на синьому»:
   синє виділення тут якраз і є тим системним виглядом, від якого йдемо. */
.usel__opt[data-sel]::before {
  content: ''; width: 2px; align-self: stretch; margin: -2px 0 -2px -6px;
  background: var(--tan); flex-shrink: 0;
}
.usel__empty { padding: 12px; font-size: .84rem; color: var(--muted); }

/* --- у формі заявки поля лише з нижньою лінією --- */
.field .usel__btn {
  border: 0; border-bottom: 1px solid var(--line);
  background: transparent; font-size: 1rem;
}
.field .usel__val { padding: 12px 0; }
.field .usel__btn:hover { border-bottom-color: var(--ink); }
/* Тут поля без рамки, лише з підкресленням, тож зона під стрілку виглядала б
   чужорідною — досить самої стрілки. */
.field .usel__arrow { background: none; border: 0; padding: 0 0 0 8px; }
.field .usel__btn:hover .usel__arrow { background: none; color: var(--ink); }
.field .usel.is-open .usel__arrow { background: none; color: var(--tan); }
.field .usel.is-open .usel__btn { border-bottom-color: var(--tan); }
.field.has-error .usel__btn { border-bottom-color: #C0564A; }

/* --- сортування в каталозі --- */
.sort .usel__btn { font-size: .84rem; background: transparent; }
.sort .usel__val { padding: 9px 0 9px 14px; }
.sort .usel { min-width: 190px; }

/* ---------- Інструменти сторінки товару ---------- */
.pdp__head { display: flex; align-items: flex-start; gap: 18px; }
.pdp__head-main { min-width: 0; flex: 1; }
.pdp__tools { display: flex; gap: 8px; flex-shrink: 0; padding-top: 4px; }
.pdp__tools .icon-btn { border-color: var(--line); }
.pdp__tools .icon-btn:hover { border-color: var(--ink); background: var(--sand); }
.pdp__tools .icon-btn.is-active { border-color: var(--tan); color: var(--tan); background: var(--tan-soft); }

/* Кнопка «Більше моделей» під сіткою на головній */
.more-models { display: flex; justify-content: center; margin-top: clamp(26px, 3vw, 38px); }

/* ---------- Нам довіряють ----------
   Стрічка логотипів, що їде сама. Дублювання для безшовності робить
   script.js, а не розмітка: інакше при кожному новому логотипі довелось би
   вручну правити копію, і вони б розʼїхались. */
/* Розмиття країв — тільки поки стрічка їде.
 *
 * Маска потрібна, щоб логотипи виїжджали й зникали плавно, а не обрізались
 * рамкою. Але коли їхати нема куди й ряд просто стоїть по центру, та сама
 * маска з'їдала крайні знаки: Інтеграл-Буд зліва і Auroom справа виходили
 * напівпрозорими. Клас вішає script.js разом із is-marquee на доріжці.
 * Смуга розмиття звужена з 8% до 5%: на 1440px вісім відсотків — це 115px,
 * логотип встигав зникнути ще до краю. */
.clients__viewport { overflow: hidden; }
.clients__viewport.is-masked {
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 5%, #000 95%, transparent);
  mask-image: linear-gradient(90deg, transparent, #000 5%, #000 95%, transparent);
}
/* Просвіт менший, ніж був (до 72px): з пʼятьма логотипами такі проміжки
   розтягували ряд на всю ширину, і він читався як пʼять окремих значків,
   а не як одна смуга клієнтів. */
.clients__track { display: flex; align-items: center; gap: clamp(26px, 2.8vw, 40px); width: max-content; }
/* Поки логотипів мало і вони вміщаються — рядок стоїть по центру. Один
   логотип, що самотньо їде через порожню смугу, виглядає як недоробка. */
/* Смуга повнорозмірна, щоб логотипи виїжджали з-за краю екрана. Але коли
   ряд стоїть, він мусить триматись тієї самої сітки, що й решта сторінки —
   інакше крайні знаки вилазять за колонку тексту над ними. */
.clients__track:not(.is-marquee) {
  width: min(100% - 2 * clamp(16px, 4vw, 44px), var(--container));
  margin-inline: auto; justify-content: center;
}
.clients__track.is-marquee { animation: clients-run var(--clients-time, 30s) linear infinite; }
.clients__viewport:hover .clients__track.is-marquee { animation-play-state: paused; }
/* Зсув у пікселях, а не у відсотках: крок циклу — це набір логотипів плюс
   просвіт після нього, і 50% ширини доріжки з ним не збігаються. Значення
   рахує script.js. */
@keyframes clients-run { to { transform: translate3d(calc(-1 * var(--clients-shift, 50%)), 0, 0); } }

.clients__item {
  display: flex; flex-direction: column; gap: 4px; flex-shrink: 0;
  padding: 18px 22px; min-height: 92px; justify-content: center;
  border: 1px solid var(--line-2); background: var(--paper);
  color: var(--ink-2); text-decoration: none;
  transition: border-color .25s var(--ease), color .25s var(--ease);
}
.clients__item:hover { border-color: var(--ink); color: var(--ink); }

/* Логотип і текстова підміна живуть в одній картці.
 *
 * Поки файла в assets/clients/ немає (або він не завантажився), показуємо
 * назву текстом — краще, ніж поламана картинка чи діра в стрічці. Клас
 * .has-logo вішає script.js після успішного завантаження; без нього
 * картинка не показується взагалі, тож можна спокійно прописати шлях до
 * файла заздалегідь. */
.clients__item img {
  width: auto;
  /* 42px було замало: над стрічкою стоїть заголовок 96px, і логотипи при
     такій висоті читались підписом до нього, а не змістом блоку. 52px і
     ширша межа (270px замість 200) вирівнюють вагу. Особливо виграли
     двоярусні — Greenville і Resident Development, у яких при 42px напис
     виходив удвічі дрібнішим за сусідів.

     Більше не беремо навмисно: при 56px пʼять знаків перестають уміщатись
     у колонку 1280px, і ряд починає їхати навіть на широкому екрані. Рух
     заради шістдесяти зайвих пікселів виглядає метушнею. */
  display: none; height: 52px; width: auto; max-width: 270px; object-fit: contain;
  /* Знебарвлення тут було й довелось зняти: логотипи часто приходять
     разом із фірмовою плашкою (Інтеграл-Буд — білий напис на червоному),
     і grayscale перетворює її на брудно-сірий прямокутник. Легке
     приглушення прозорістю тримає стрічку тихішою за заголовок і жодного
     бренду не псує. */
  opacity: .92; transition: opacity .3s var(--ease);
}
.clients__item.has-logo img { display: block; }
.clients__item.has-logo .clients__text { display: none; }
.clients__item:hover img { opacity: 1; }

/* Рамка потрібна текстовій підміні, щоб назва не висіла в повітрі. Готовий
   логотип — уже завершений об'єкт, часто з власною плашкою; рамка навколо
   нього дає коробку в коробці. Тому картка з логотипом свою рамку знімає. */
.clients__item.has-logo {
  border-color: transparent; background: none; padding: 0 4px;
}
.clients__text { display: flex; flex-direction: column; gap: 4px; }
.clients__kind { font-size: .62rem; letter-spacing: .2em; text-transform: uppercase; color: var(--muted-2); }
.clients__name { font-size: 1.05rem; font-weight: 300; letter-spacing: -.01em; white-space: nowrap; }

/* На телефоні 52px і 270px — забагато: один логотип займав дві третини
   екрана, і замість смуги клієнтів виходив показ по одному. Менший розмір
   лишає в кадрі два-три знаки, тобто саме те відчуття «їх багато», заради
   якого блок і робився. */
@media (max-width: 700px) {
  .clients__item img { height: 40px; max-width: 190px; }
}

@media (prefers-reduced-motion: reduce) {
  .clients__track.is-marquee { animation: none; }
  .clients__viewport { overflow-x: auto; }
}

/* ---------- Портфоліо ---------- */
.projects { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: clamp(16px, 2vw, 26px); }
.project { background: var(--paper); border: 1px solid var(--line-2); cursor: pointer; transition: border-color .25s var(--ease), transform .25s var(--ease); }
.project:hover { border-color: var(--ink); transform: translateY(-3px); }
.project__media { position: relative; aspect-ratio: 4 / 3; background: var(--sand); display: grid; place-items: center; overflow: hidden; }
.project__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.project__soon { font-size: .78rem; letter-spacing: .14em; text-transform: uppercase; color: var(--muted-2); }
.project__count { position: absolute; right: 12px; bottom: 12px; padding: 5px 10px; background: rgba(41, 47, 51, .78); color: #fff; font-size: .7rem; font-weight: 600; }
.project__body { padding: 16px 18px 20px; }
.project__body h3 { margin: 0; font-size: 1.05rem; font-weight: 500; letter-spacing: -.01em; }
.project__meta { margin: 6px 0 0; font-size: .8rem; color: var(--muted); }
.project__note { margin: 10px 0 0; font-size: .88rem; color: var(--ink-2); line-height: 1.6; }

/* ===== Лайтбокс портфоліо =====
   Раніше фото об'єкта відкривались у звичайній Modal суцільною сіткою —
   без гортання, без номера кадру, без перегляду на весь екран. Ден
   попросив переробити відкриття портфоліо на повноцінний переглядач:
   одне фото на екран, лічильник, стрілки, стрічка мініатюр, розгортання
   на весь екран. Окремий компонент від .modal (z-index нижчий навмисно —
   кнопка «прорахувати» відкриває callbackForm() у звичайній Modal, і та
   має лягати зверху лайтбокса, а не навпаки). */
.lightbox {
  position: fixed; inset: 0; z-index: 90;
  display: grid; grid-template-rows: auto 1fr auto;
  opacity: 0; visibility: hidden;
  transition: opacity .3s var(--ease), visibility .3s;
}
.lightbox.is-open { opacity: 1; visibility: visible; }
.lightbox:fullscreen { background: #0c0d0e; }
.lightbox__backdrop { position: absolute; inset: 0; background: rgba(12, 13, 14, .97); }
.lightbox__top {
  position: relative; z-index: 1; display: flex; align-items: center; justify-content: space-between;
  padding: 16px clamp(16px, 4vw, 32px);
}
.lightbox__count { color: rgba(255, 255, 255, .68); font-size: .8rem; letter-spacing: .06em; }
.lightbox__tools { display: flex; gap: 8px; }
.lightbox__tools .icon-btn { color: #fff; border-color: rgba(255, 255, 255, .3); }
.lightbox__tools .icon-btn:hover { border-color: #fff; }
.lightbox__stage {
  position: relative; z-index: 1; min-height: 0; overflow: hidden;
  display: grid; place-items: center; padding: 0 clamp(52px, 8vw, 100px);
}
.lightbox__stage img { max-width: 100%; max-height: 100%; object-fit: contain; transform: scale(1.15); }
.lightbox__arrow {
  position: absolute; top: 50%; transform: translateY(-50%); z-index: 2;
  width: 44px; height: 44px; padding: 0; display: grid; place-items: center;
  border: 1px solid rgba(255, 255, 255, .3); border-radius: 50%; background: rgba(255, 255, 255, .06);
  color: #fff; cursor: pointer; transition: background .2s var(--ease), border-color .2s var(--ease);
}
.lightbox__arrow:hover { background: rgba(255, 255, 255, .18); border-color: #fff; }
.lightbox__arrow svg { width: 20px; height: 20px; }
.lightbox__arrow--prev { left: clamp(10px, 3vw, 28px); }
.lightbox__arrow--prev svg { transform: rotate(90deg); }
.lightbox__arrow--next { right: clamp(10px, 3vw, 28px); }
.lightbox__arrow--next svg { transform: rotate(-90deg); }
.lightbox__foot { position: relative; z-index: 1; padding: 8px clamp(16px, 4vw, 32px) clamp(16px, 3vw, 24px); }
.lightbox__info { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 12px; }
.lightbox__info b { color: #fff; font-weight: 500; }
.lightbox__info span { display: block; color: rgba(255, 255, 255, .6); font-size: .82rem; margin-top: 2px; }
.lightbox__note { margin: 6px 0 0; max-width: 60ch; color: rgba(255, 255, 255, .8); font-size: .88rem; line-height: 1.5; }
.lightbox__cta { flex: 0 0 auto; }
.lightbox__thumbs { display: flex; gap: 8px; overflow-x: auto; padding-bottom: 2px; scrollbar-width: thin; touch-action: pan-x; }
/* Стрічка сама скролиться (overflow-x), тож додатний outline-offset за
   замовчуванням різав би кільце фокуса на крайніх мініатюрах — той самий
   патерн, що вже виправляли для .gallery__thumb. */
.lightbox__thumbs :focus-visible { outline-offset: -2px; }
.lightbox__thumb {
  flex: 0 0 auto; width: 64px; height: 48px; padding: 0; border: 2px solid transparent;
  background: none; cursor: pointer; opacity: .5; transition: opacity .2s var(--ease), border-color .2s var(--ease);
}
.lightbox__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.lightbox__thumb:hover { opacity: .85; }
.lightbox__thumb.is-active { opacity: 1; border-color: var(--tan); }

@media (max-width: 700px) {
  .lightbox__stage { padding: 0 8px; }
  .lightbox__arrow { width: 36px; height: 36px; }
  .lightbox__arrow--prev { left: 4px; }
  .lightbox__arrow--next { right: 4px; }
  .lightbox__info { flex-direction: column; }
  .lightbox__thumb { width: 52px; height: 40px; }
}

/* ---------- Стати дилером ---------- */
.dealer {
  display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, .85fr);
  gap: clamp(26px, 4vw, 64px); align-items: center;
  border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: clamp(28px, 4vw, 56px); background: var(--paper);
}
.dealer .display { font-size: clamp(1.9rem, 1.1rem + 3vw, 3.2rem); line-height: 1.04; }
.dealer__text p { color: var(--muted); max-width: 52ch; margin-top: 18px; }
.dealer__actions { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 26px; }
.dealer__perks { display: grid; gap: 0; }
.dealer__perks li { padding: 16px 0 16px 22px; border-top: 1px solid var(--line-2); position: relative; }
.dealer__perks li:last-child { border-bottom: 1px solid var(--line-2); }
.dealer__perks li::before { content: ""; position: absolute; left: 0; top: 1.5em; width: 10px; height: 1px; background: var(--tan); }
.dealer__perks b { display: block; font-weight: 500; color: var(--ink); }
.dealer__perks span { display: block; font-size: .88rem; color: var(--muted); margin-top: 3px; }
@media (max-width: 860px) {
  .dealer { grid-template-columns: minmax(0, 1fr); }
  .dealer__actions .btn { width: 100%; justify-content: center; }
}
