/* EVERHEAT_WP_PATCH */
/* ══════════════════════════════════════════════════════════════════════════
   ШРИФТ ЛОКАЛЬНО

   Було: Google Fonts CDN - зовнішній хост на кожній сторінці, який блокує
   перший рендер тексту. Стало: три файли в assets/fonts/.

   Три, а не чотири: font-weight:600 вжито в CSS 38 разів, але накреслення
   600 в Ubuntu НЕ ІСНУЄ - браузер малює його тим самим файлом, що й 700
   (виміряно: 190.96px проти 190.96px). Начертання 300 не вживається жодного
   разу. Кирилиця не потрібна: сайт англійською, а кириличні імена авторів
   відгуків домальовує системний фолбек.

   font-display:swap - текст видно одразу системним шрифтом, підміна після
   завантаження. Без цього перший екран порожній до кінця завантаження.
   ══════════════════════════════════════════════════════════════════════════ */
@font-face{
  font-family:'Ubuntu'; font-style:normal; font-weight:400; font-display:swap;
  src:url('../fonts/ubuntu-400.woff2') format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face{
  font-family:'Ubuntu'; font-style:normal; font-weight:500; font-display:swap;
  src:url('../fonts/ubuntu-500.woff2') format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face{
  font-family:'Ubuntu'; font-style:normal; font-weight:700; font-display:swap;
  src:url('../fonts/ubuntu-700.woff2') format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}

/* =========================================================
     DESIGN TOKENS - синій домінуючий (бренд/довіра), помаранчевий лише для CTA.
  ========================================================== */
  :root{
    --color-blue: #1E77D6;
    --color-blue-dark: #14528F;
    --color-blue-light: #E8F2FC;

    --color-orange: #F5821F;
    /* Зірки рейтингу: помаранчевий бренду на білому дає 2.59:1, світлий - 1.12:1.
       Глибший бурштин тримає 4.9:1 на білому і 4.6:1 на сірій секції. */
    --color-star: #B35709;
    --color-orange-dark: #D3660B;
    --color-orange-light: #FEF0E2;

    --color-bg: #FFFFFF;
    --color-surface: #F7F8FA;
    --color-border: #E4E7EC;
    --color-border-interactive: #7C8794;
    --color-text: #2B2E33;
    --color-text-secondary: #5B6068;
    --color-text-muted: #9AA0A8;

    --color-success: #2E9E5B;
    --color-success-bg: #F2FBF6;
    --color-success-text: #1F7A44;
    --color-error: #E14B4B;
    --color-error-bg: #FEF3F3;
    --color-error-text: #C93A3A;

    /* Warning (розд. 4 Частини C). Раніше службові плашки позичали CTA-помаранчевий,
       а бриф лишає помаранчевий ТІЛЬКИ для CTA - тепер у них власний токен. */
    --color-warning: #F0B429;
    --color-warning-bg: #FEF8E7;

    --color-urgent: #C1391F;
    --color-urgent-bg: #FBEAE6;
    --color-urgent-text: #FFFFFF;

    --color-cta-text: #2B2E33;
    --color-focus-ring: #14528F;
    --color-focus-ring-on-blue: #FFFFFF;

    /* Висота хедера - змінна: від неї відштовхується позиція мобільного меню,
       і на вузьких екранах вона менша. */
    /* Шари інтерфейсу зібрані в одному місці: розкидані по файлу числа
       (59, 60, 65, 70, 200, 9999) з часом починають конфліктувати. */
    --z-nav-panel: 59;
    --z-header: 60;
    --z-back-to-top: 65;
    --z-sticky-form: 70;
    --z-skip-link: 61;
    --z-modal: 200;
    --z-devbar: 9999;

    --header-h: 78px;

    --radius-button: 10px;
    --radius-card: 16px;

    --shadow-card: 0 2px 12px rgba(43, 46, 51, 0.08);
    --shadow-card-hover: 0 4px 20px rgba(43, 46, 51, 0.12);
    --overlay-photo: linear-gradient(180deg, rgba(20,82,143,0.55) 0%, rgba(20,82,143,0.75) 100%);

    --font-body: "Ubuntu", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
    --container-w: 1180px;
    /* МІРА ТЕКСТУ - одна ширина колонки для читання на весь сайт.
       У пікселях, а НЕ в ch: ch відносний до font-size блоку, тому одна й та сама
       декларація 68ch давала 552px на юридичних сторінках, 595px у SEO-блоці і
       614px у /about/ - три різні ширини тексту з одного правила.
       620px дає 65-76 символів у рядку на всіх трьох кеглях сайту (стеля
       WCAG 1.4.8 - 80). Блоки, які самі є .container, беруть
       calc(var(--measure) + 48px): у них border-box і padding 0 24px. */
    --measure: 620px;
  }

  *,*::before,*::after{ box-sizing: border-box; }
  html{ scroll-behavior: smooth; }
  body{
    margin:0;
    font-family: var(--font-body);
    color: var(--color-text);
    background: var(--color-bg);
    font-size: 16px;
    line-height: 1.55;
    -webkit-font-smoothing: antialiased;
  }
  img{ max-width:100%; display:block; }
  a{ color: var(--color-blue); text-decoration: none; }
  a:hover{ color: var(--color-blue-dark); }
  :focus-visible{ outline: 2px solid var(--color-focus-ring); outline-offset: 2px; }
  /* Було мертве правило: клас .on-blue не застосовувався в розмітці жодного разу,

  тож
     усі посилання в синіх блоках отримували темно-синю рамку на синьому (1.77:1).
     Тепер селектор перелічує реальні сині контейнери. */
  .section--blue :focus-visible,

  .calc-panel :focus-visible,

  .site-footer :focus-visible,

  .emergency-box :focus-visible,

  .on-blue :focus-visible{ outline-color: var(--color-focus-ring-on-blue); }

  h1,h2,h3{ font-weight:700; color: var(--color-text); margin:0 0 .5em; line-height:1.2; }
  h1{ font-size: clamp(2rem, 4vw, 2.85rem); }
  h2{ font-size: clamp(1.5rem, 3vw, 2.1rem); }
  h3{ font-size: 1.15rem; }
  p{ margin: 0 0 1em; color: var(--color-text); }
  .container{ max-width: var(--container-w); margin: 0 auto; padding: 0 24px; }
  /* ⚠️ 48px, А НЕ 72px, І ЦЕ ПРО ПРОМІЖОК, А НЕ ПРО САМЕ ЧИСЛО.
     Секції стикаються впритул, тож між двома сусідніми виходить подвійний
     відступ. Було 72 + 72 = 144px порожнечі між блоками на десктопі -
     власник це й помітив. Стало 48 + 48 = 96px, число обрав власник.
     Якщо колись правити - правити треба з тим, що видиме значення це
     подвоєне. */
  .section{ padding: 48px 0; }
  .section--surface{ background: var(--color-surface); }
  .section--blue{ background: var(--color-blue-dark); color:#fff; }
  .section--blue h2, .section--blue p{ color:#fff; }
  /* --color-blue на сірій секції дає 4.24:1 - нижче 4.5 для 15px. Темніший блакитний 7.0:1. */
  .eyebrow{ color: var(--color-blue-dark); font-weight:600; font-size:.95rem; margin-bottom:.4em; }

  .btn{
    display:inline-flex; align-items:center; justify-content:center; gap:8px;
    padding: 14px 26px; border-radius: var(--radius-button);
    font-weight:600; font-size:1rem; border:1px solid transparent; cursor:pointer;
    transition: background-color .15s ease, color .15s ease, border-color .15s ease;
  }
  .btn-primary{ background: var(--color-orange); color: var(--color-cta-text); }
  .btn-primary:hover{ background: var(--color-orange-dark); color: var(--color-cta-text); }
  .btn-secondary{ background:#fff; color: var(--color-blue); border-color: var(--color-blue); }
  .btn-secondary:hover{ background: var(--color-blue-light); color: var(--color-blue-dark); }

  /* ---------- Header ---------- */
  /* Обхід блоків (WCAG 2.4.1): у шапці 15+ керувальних елементів, і без цього
     посилання клавіатурний користувач проходив їх на кожній сторінці заново. */
  .skip-link{
    position:absolute; left:10px; top:-64px; z-index: var(--z-skip-link);
    background: var(--color-blue-dark); color:#fff; padding:12px 20px;
    border-radius:0 0 8px 8px; font-weight:700; transition: top .15s ease;
  }
  .skip-link:focus{ top:0; color:#fff; }

  .site-header{
    position: sticky; top:0; z-index: var(--z-header);
    background:#fff; border-bottom:1px solid var(--color-border);
  }
  .site-header .container{
    display:flex; align-items:center; justify-content:space-between;
    height: var(--header-h); gap: 24px;
    /* Ширший за загальні 1180px: логотип + меню + телефон + дві кнопки разом
       займають ~1290px і в 1180 не вміщались - вище 1400px рядок вилазив за
       контейнер. Хедер - повноширинна смуга, ширший внутрішній ліміт тут доречний. */
    max-width: 1360px;
  }
  .logo{
    display:flex; align-items:center; gap:10px;
    font-weight:700; font-size:1.25rem; color: var(--color-blue-dark);
    white-space: nowrap;
  }
  .logo-mark{
    width:38px; height:38px; border-radius:9px; background: var(--color-blue);
    color:#fff; display:flex; align-items:center; justify-content:center; font-weight:700;
    flex:none;
  }
  .primary-nav{ display:flex; align-items:center; gap: 28px; }
  .primary-nav ul{ list-style:none; display:flex; gap:24px; margin:0; padding:0; }
  .primary-nav a{ color: var(--color-text); font-weight:500; font-size:.97rem; }
  .primary-nav a:hover{ color: var(--color-blue); }
  /* Було мертве правило: CSS чекав .is-current, а роутер ставив .is-active. */
  /* Синій на blue-light дає 3.97:1 - той самий випадок, що спека фіксує для hover
     вторинної кнопки. Blue-dark дає 7.04:1 і на білому, і на blue-light. */
  .primary-nav a.is-active{ color: var(--color-blue-dark); font-weight:700; }
  .primary-nav > ul > li > a.is-active{ box-shadow: inset 0 -2px 0 var(--color-orange); }
  /* Стрілка - окрема кнопка поруч із назвою, тому пункт має бути flex і не переноситись:
     інакше на середніх ширинах каретка з'їжджала під «Services»/«Products» другим рядком. */
  .has-dropdown{ position:relative; display:flex; align-items:center; gap:2px; }
  /* Пункти з підменю мають display:flex (через кнопку-стрілку), а звичайні -
     list-item, тому їхній текст лягав на 2px нижче: у flex він центрується,
     у list-item сидить на базовій лінії. Вирівнюємо всі пункти однаково. */
  /* Тільки для горизонтального меню. У мобільній колонці align-items:center
     стискає кожен пункт до ширини тексту й центрує його - саме через це
     мобільне меню виглядало кривим. Нижче, у медіа-запиті, повертаємо stretch. */
  .primary-nav > ul{ align-items:center; }
  .primary-nav > ul > li{ white-space:nowrap; display:flex; align-items:center; }
  .dropdown{
    position:absolute; top: 100%; left:0; background:#fff; border:1px solid var(--color-border);
    border-radius: var(--radius-card); box-shadow: var(--shadow-card); padding:10px;
    min-width: 230px; display:none; margin-top:10px;
  }
  /* Місток через 10px відступу: без нього курсор на шляху до випадайки виходив
     за межі :hover і меню закривалось на півдорозі. */
  .has-dropdown::after{ content:''; position:absolute; top:100%; left:0; right:0; height:12px; }
  .has-dropdown:hover .dropdown,
  .has-dropdown:focus-within .dropdown,
  .has-dropdown.open .dropdown{ display:block; }

  /* Кнопка-стрілка: випадайка має відкриватись і кліком/тапом, а не лише наведенням - інакше на сенсорному екрані 10 підсторінок недосяжні з меню взагалі. */
  .submenu-toggle{
    background:none; border:none; cursor:pointer; padding:6px; margin-left:2px;
    color: var(--color-text-secondary); line-height:0;
  }
  .submenu-toggle svg{ transition: transform .18s; }
  .has-dropdown.open > .submenu-toggle svg{ transform: rotate(180deg); }
  .dropdown a{ display:block; padding:9px 12px; border-radius:8px; font-size:.92rem; }
  .dropdown a:hover{ background: var(--color-blue-light); }
  .header-cta{ display:flex; align-items:center; gap:16px; }
  .header-phone{ display:flex; align-items:center; gap:8px; font-weight:600; color: var(--color-text); white-space:nowrap; }
  .header-phone svg{ flex:none; }
  .nav-toggle{ display:none; background:none; border:none; cursor:pointer; padding:6px; }
  /* Кнопка калькулятора в хедері: компактніша за основний CTA, щоб три елементи
     (телефон + 2 кнопки) вміщались поруч. Порядок згортання на вузьких екранах:
     спочатку ховається текст телефону, потім сама кнопка калькулятора - телефон і головний CTA лишаються видимими завжди (вимога розд. 1 Частини II). */
  /* Мін. тап-зона 44×44 (бриф розд. 1) - раніше було 41px заввишки. */
  .btn-calc{ white-space:nowrap; padding:11px 14px; font-size:.86rem; min-height:44px;
             display:inline-flex; align-items:center; }
  /* Головний CTA хедера не ламається на два рядки лише там, де для цього є місце.
     Нижче 1240px повертаємо звичайну поведінку - інакше рядок хедера переповнюється. */
  /* Короткий підпис за замовчуванням прихований. Це правило мусить стояти ВИЩЕ
     за медіа-запити, що його вмикають - специфічність однакова, тож інакше
     виграє те, що нижче у файлі, і кнопка лишається порожньою. */
  .cta-short{ display:none; }

  /* Кнопка хедера не переноситься НІКОЛИ. Раніше nowrap діяв лише від 1241px, і в
     діапазоні 961–1240 «Book Free Assessment» ламався на два рядки, розпирав хедер
     по висоті й притискався до самого краю екрана. */
  .header-cta .btn{ white-space:nowrap; }

  /* Короткий підпис вмикається там, де довгий уже не вміщається поруч із розгорнутим
     меню: логотип 232 + меню 453 + відступи 96 = 781px фіксовано, і нижче ~1120px
     на CTA лишається замало місця. */
  /* Пороги перераховані після того, як у меню зʼявились "Pricing" і "About" з
     підменю: смуга меню виросла з 453px до 567px, тобто кожен крок згортання
     мусить починатись приблизно на 130px раніше. Виміряно, не на око. */
  @media (max-width: 1250px){
    .cta-long{ display:none; }
    .cta-short{ display:inline; }
    .primary-nav ul{ gap:18px; }
    .site-header .container{ gap:16px; }
    .header-cta{ gap:12px; }
  }
  /* Найвужча смуга, де меню ще розгорнуте (961–1000px): бракувало ще ~13px,
     тому тут підтискається сам логотип. Нижче 961 меню вже згортається в бургер. */
  @media (max-width: 1140px){
    .logo{ font-size:1.08rem; gap:8px; }
    .logo-mark{ width:32px; height:32px; }
    .primary-nav ul{ gap:15px; }
  }
  /* Найвужча смуга, де меню ще розгорнуте: 961-1010px. Виміряно на 961px:
     логотип 199 + меню 522 + CTA 207 + відступи 80 = 1008 при доступних 961,
     тобто бракує 47px. Знімаємо їх із трьох місць одразу, а не з одного. */
  @media (max-width: 1010px){
    .primary-nav ul{ gap:10px; }
    .primary-nav a{ font-size:.93rem; }
    .site-header .container{ gap:10px; padding-left:16px; padding-right:16px; }
    .logo{ font-size:1rem; }
  }

  /* Порядок згортання перевірено вимірюванням, а не на око:
     ≥1241px - видно все; 1241–961px - меню ще розгорнуте і забирає ширину, тому кнопка
     калькулятора ховається; 960–821px - меню згорнулось у бургер, місце звільнилось,
     кнопка повертається; ≤820px - ховається знову, лишаються телефон і головний CTA. */
  /* Номер телефону текстом ховається раніше, ніж було: три елементи + повне меню
     не вміщаються навіть у 1400px (виміряно). Сама іконка-дзвінок лишається клікабельною
     на всіх ширинах, тож вимога "телефон видно без скролу" виконана. */
  .header-phone .phone-short{ display:none; font-weight:600; }
  @media (max-width: 1480px){
    .header-phone .phone-text{ display:none; }
    .header-phone .phone-short{ display:inline; }
  }
  @media (max-width: 1370px){ .btn-calc{ display:none; } }
  @media (max-width: 960px){ .btn-calc{ display:inline-flex; } }
  @media (max-width: 820px){ .btn-calc{ display:none; } }
  /* У горизонтальному меню цей дубль не потрібен - там працює .btn-calc у хедері. */
  .nav-calc{ display:none; }

  /* ═══ Вузькі екрани ═══
     Хедер не міг стиснутись нижче ~573px (логотип 232 + CTA 269 + відступи),
     тому на телефоні 375px уся сторінка рендерилась завширшки 549px і з'їжджала
     горизонтально. Тепер скорочуються всі три складові по черзі. */
  @media (max-width: 640px){
    :root{ --header-h: 64px; }
    .site-header .container{ gap: 12px; }
    .container{ padding-left:16px; padding-right:16px; }
    .logo{ font-size:1rem; gap:8px; }
    .logo-mark{ width:32px; height:32px; border-radius:8px; }
    .header-cta{ gap:10px; }
    .header-cta .btn{ padding:10px 12px; font-size:.86rem; }
    .cta-long{ display:none; }
    .cta-short{ display:inline; }
  }
  /* Середній крок скорочення логотипа. Він БУВ передбачений розміткою
     (<span class="logo-full">&nbsp;Solutions</span>), але правила для нього так і
     не написали, тому логотип стрибав із повних 187px одразу в саму літеру.
     Наслідок: у смузі 421-439px хедер вимагав 438px і давав 13px горизонтального
     скролу. Перевірки ловили лише 375 і 1280, тобто рівно повз цю смугу. */
  @media (max-width: 520px){
    .logo-full{
      position:absolute; width:1px; height:1px; padding:0; margin:-1px;
      overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0;
    }
  }
  @media (max-width: 420px){
    /* Лишається значок бренду - назва не вміщається поруч із телефоном і CTA,
       а бриф вимагає, щоб саме телефон і CTA були видні без скролу. */
    .logo-name{
      position:absolute; width:1px; height:1px; padding:0; margin:-1px;
      overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0;
    }
  }

  /* ═══ Мобільна ергономіка ═══ */
  @media (max-width: 640px){
    /* iOS Safari робить примусовий зум при фокусі на полі з розміром < 16px - сторінка стрибає, і повернути масштаб можна лише вручну. Було 12.8–15.4px. */
    input:not([type="checkbox"]):not([type="radio"]), select, textarea{ font-size:16px !important; }

    /* Тап-зони 44×44 (бриф розд. 1): бургер був 36×36, CTA хедера 43px заввишки */
    .nav-toggle{ min-width:44px; min-height:44px; align-items:center; justify-content:center; }
    .header-cta .btn{ min-height:44px; padding:11px 12px; }

  }

  /* ═══ Мобільне меню ═══
     Було: JS просто знімав display:none з горизонтального flex-списку, і 6 пунктів
     втискались у рядок хедера, розпираючи сторінку. Тепер це повноекранна панель
     під хедером, вертикальна, з великими рядками (бриф: «велике мобільне меню
     без дрібного тексту») і підменю, що розкриваються тапом. */
  /* ⚠️ ПОРЯДОК МАЄ ЗНАЧЕННЯ. Рядок із хрестиком і телефонний рядок існують
     лише в бургер-режимі. Це правило мусить стояти ДО медіазапиту: у нього та
     сама специфічність (0,1,0), що й у .nav-head усередині @media, а при
     однаковій специфічності виграє те, що нижче. Поставлене після, воно
     перемагало, і хрестик мав нульовий розмір - саме це я й отримав при
     першій спробі (виміряно: closeRect 0×0). */
  /* ⚠️ Селектор із > ul > li, а не просто .nav-call: правило
     `.primary-nav > ul > li{ display:flex }` має специфічність (0,1,2) і
     перебивало (0,1,0). Виміряно: на 1280px телефон друкувався в хедері
     ДРУГИЙ раз, поруч із тим, що вже є. */
  .nav-head,
  .primary-nav > ul > li.nav-call{ display:none; }

  @media (max-width: 960px){
    .nav-calc{ display:flex; align-items:center; justify-content:center;
               margin: 4px 16px 10px; min-height:52px; font-size:1rem; }
  }
  @media (max-width: 960px){
    /* ⚠️ ПАНЕЛЬ НА ВЕСЬ ЕКРАН, top:0, І ВИЩЕ ХЕДЕРА. ВИМІРЯНО 15.09.
       Було top:var(--header-h) і z-index 59, тобто панель лишала зверху
       смугу 64px під хедер. Але блокування прокрутки ставить overflow:hidden
       на <html>, а це ВИМИКАЄ position:sticky у .site-header: на прокрученій
       сторінці хедер повертався на статичне місце (виміряно: top -1200px при
       scrollY 1200), у тій смузі проступав контент сторінки, а кнопка-бургер
       зникала з екрана разом із хедером. Закрити меню ставало нічим.

       Панель тепер накриває хедер цілком і має власний рядок із хрестиком.
       z-index 80: вище хедера (60), кнопки «вгору» (65) і липкої форми (70),
       нижче модалок (200). */
    .primary-nav{
      display:none; position:fixed; top:0; left:0; right:0; bottom:auto;
      max-height: 100vh; max-height: 100dvh;
      background:#fff; z-index:80; overflow-y:auto; padding:0 0 12px;
      box-shadow: 0 18px 40px rgba(16,26,38,.18);
    }
    .primary-nav.open{ display:block; }

    /* ⚠️ ЗАТЕМНЕННЯ ПІД ПАНЕЛЛЮ - НЕ ПРИКРАСА.
       Панель тепер заввишки рівно зі вмістом, а не на весь екран: раніше під
       останнім пунктом лишалось 346px порожнього білого (виміряно на 375×812),
       і панель читалась як обірвана сторінка. Тепер видно, що це накладка, а
       тап по затемненню закриває меню: обробник кліку поза .primary-nav уже є.
       Псевдоелемент, а не окремий <div>: розмітку чіпати не треба. */
    body.nav-open::after{
      content:''; position:fixed; inset:0; z-index:79;
      background: rgba(16,26,38,.45);
    }
    /* ⚠️ ЦЕЙ РЯДОК ОБОВʼЯЗКОВИЙ, І ОСЬ ЧОМУ.
       .primary-nav лежить усередині .site-header, а той має z-index 60,
       тобто СТВОРЮЄ власний контекст накладання. Через це z-index:80 панелі
       рахується всередині того контексту, а не в кореневому: назовні вся
       шапка разом із панеллю лишається на позначці 60. Затемнення на 79
       опинялось ПОВЕРХ панелі, і вона теж сіріла - видно було одразу:
       помаранчева кнопка «Calculate Cost» ставала брудно-коричневою.
       Піднімаємо весь контекст шапки над затемненням на час, поки меню
       відкрите. Модалки (200) і далі вище. */
    body.nav-open .site-header{ z-index: 90; }

    /* Рядок панелі: підпис ліворуч, хрестик праворуч. Висота така сама, як у
       хедера, щоб хрестик опинився рівно там, де щойно був бургер. */
    .nav-head{
      display:flex; align-items:center; justify-content:space-between;
      height: var(--header-h); padding:0 12px 0 20px;
      border-bottom:1px solid var(--color-border);
      position:sticky; top:0; background:#fff; z-index:1;
    }
    .nav-head-label{
      font-size:.78rem; font-weight:700; letter-spacing:.08em;
      text-transform:uppercase; color: var(--color-text-secondary);
    }
    .nav-close{
      width:44px; height:44px; display:flex; align-items:center; justify-content:center;
      background:none; border:0; padding:0; cursor:pointer; color: var(--color-text);
      border-radius:10px;
    }
    .nav-close:hover{ background: var(--color-surface); }

    /* Телефон у кінці меню: заповнює порожнечу під списком і дає дію, якої
       в бургер-режимі немає (іконка телефону в хедері лишається без підпису). */
    .primary-nav > ul > li.nav-call{ display:block; }
    /* ⚠️ Селектор із > ul > li, а не просто .nav-call: правило
       `.primary-nav > ul > li > a{ font-weight:600 }` нижче має специфічність
       (0,1,3) і перебивало (0,1,1) - телефон малювався такою самою
       вагою, як решта пунктів. З Ubuntu це було непомітно (файла 600 не було,
       600 і 700 малювались однаково), а варіативний Plex Sans розрізняє їх.
       Виміряно на 375px: computed font-weight був 600 замість 700. */
    .primary-nav > ul > li.nav-call > a{
      display:flex; align-items:center; gap:10px; min-height:56px; padding:0 20px;
      font-size:1.06rem; font-weight:700; color: var(--color-blue-dark);
    }
    .nav-call svg{ flex:none; }
    /* Меню - панель z-index 59, а всі закріплені внизу віджети мають 65-70,
       тобто лежали ПОВЕРХ нього і з'їдали останні пункти списку: на сторінках
       калькулятора смуга ціни (75px) накривала «Contact», а на решті сторінок
       це робила кнопка «вгору». Поки меню відкрите, воно єдине на екрані. */
    body.nav-open .calc-panel,
    body.nav-open .sticky-form,
    body.nav-open .back-to-top{ display:none !important; }
    /* ⚠️ Банер згоди має z-index 200 (--z-modal), тобто лежав ПОВЕРХ панелі
       і з'їдав нижні пункти меню. Ховаємо його на час, поки меню відкрите:
       згода не скасовується, банер повертається одразу після закриття. */
    body.nav-open .consent-bar{ display:none !important; }
    /* Запас знизу: останній пункт не має впиратись у край екрана. */
    .primary-nav{ padding-bottom: calc(28px + env(safe-area-inset-bottom)); }
    .primary-nav ul{ flex-direction:column; gap:0; width:100%; align-items:stretch; }
    .primary-nav > ul > li{ border-bottom:1px solid var(--color-border); }
    .primary-nav > ul > li > a{
      display:flex; align-items:center; min-height:56px; padding:0 20px;
      font-size:1.06rem; font-weight:600;
      /* flex:1 обов'язковий: без нього посилання займає лише ширину тексту,
         і підсвітка активного пункту обривається посеред рядка. */
      flex:1;
    }
    .primary-nav > ul > li > a.is-active{ box-shadow:none; background: var(--color-blue-light); }
    .has-dropdown{ display:flex; flex-wrap:wrap; align-items:center; position:static; }
    .has-dropdown > a{ flex:1; }
    .has-dropdown::after{ content:none; }
    .submenu-toggle{ width:56px; height:56px; display:flex; align-items:center; justify-content:center; }
    /* На тачі наведення не має відкривати нічого - тільки явний тап по стрілці */
    .has-dropdown:hover .dropdown, .has-dropdown:focus-within .dropdown{ display:none; }
    .has-dropdown.open .dropdown{ display:block; }
    .dropdown{
      position:static; width:100%; margin:0; padding:0 0 8px;
      border:none; box-shadow:none; border-radius:0; background: var(--color-surface);
    }
    .dropdown a{ padding:14px 20px 14px 34px; font-size:1rem; min-height:48px; display:flex; align-items:center; }
    .header-phone span.phone-text{ display:none; }
    .nav-toggle{ display:flex; }
  }

  /* ---------- Breadcrumbs (services) ---------- */
  .breadcrumbs{ padding: 18px 0 0; font-size:.85rem; color: var(--color-text-secondary); }
  /* Хлібні крихти теж клікабельні: 15px заввишки замало для пальця. */
  .breadcrumbs a{ display:inline-flex; align-items:center; min-height:44px; }
  .breadcrumbs a{ color: var(--color-text-secondary); }
  .breadcrumbs span[aria-current]{ color: var(--color-text); font-weight:500; }

  /* ---------- Hero (Home) ---------- */
  .hero{ padding: 64px 0 56px; }
  .hero .container{ display:grid; grid-template-columns: 1.05fr .95fr; gap: 56px; align-items:center; }
  .hero-badges{ display:flex; flex-wrap:wrap; gap: 10px 22px; margin: 22px 0 30px; }
  .hero-badge{ display:flex; align-items:center; gap:7px; font-size:.92rem; color: var(--color-text-secondary); font-weight:500; }
  .hero-badge b{ color: var(--color-text); }
  /* Продажний заголовок героя - візуально на місці колишнього h1, але не h1 семантично */
  .hero-title{ font-size: clamp(2rem, 4vw, 2.85rem); font-weight:700; color: var(--color-text);
               margin:0 0 .5em; line-height:1.2; }
  .hero-sub{ font-size:1.08rem; color: var(--color-text-secondary); max-width: 46ch; }
  .hero-actions{ display:flex; gap:14px; flex-wrap:wrap; margin-top: 6px; }

  /* Заглушка замість реального фото об'єкта/техніків - TODO замінити на фото */
  .photo-slot{
    position:relative; border-radius: var(--radius-card); overflow:hidden;
    /* Розд. 10.4 забороняє градієнти на фонах секцій - рівна заливка Blue Light. */
    background: var(--color-blue-light);
    border: 1.5px dashed var(--color-border-interactive);
    display:flex; align-items:center; justify-content:center; text-align:center;
    color: var(--color-blue-dark); min-height: 280px; padding: 24px;
  }
  .photo-slot .ps-inner{ max-width: 240px; }
  .photo-slot svg{ margin: 0 auto 12px; display:block; }
  .photo-slot .ps-label{ font-size:.85rem; font-weight:600; color: var(--color-blue-dark); }
  /* Graphite-300 спека дозволяє лише для placeholder/disabled, а це читабельний
     підпис: на blue-light він давав 2.33:1. */
  .photo-slot .ps-note{ font-size:.78rem; color: var(--color-text-secondary); margin-top:4px; }
  .hero .photo-slot{ min-height: 380px; }

  @media (max-width: 900px){
    .hero .container{ grid-template-columns: 1fr; }
    /* Було order:-1 - на телефоні сторінка відкривалась порожнім пунктирним
       прямокутником, а заголовок ішов аж під ним. Текст має бути першим:
       спершу обіцянка й CTA, потім ілюстрація. Якщо клієнт захоче фото першим
       після появи реальних знімків - повернути order:-1 одним рядком. */
    .hero .photo-slot{ min-height: 200px; }
  }

  /* ---------- Services hero (Services, текстовий) ---------- */
  /* Клас висить на тому ж елементі, що й .container (class="services-hero container").
     Шорткат padding:44px 0 8px обнуляв бічні відступи контейнера, і на 375px
     заголовок та підзаголовок упирались у краї екрана. Тільки вертикальні. */
  .services-hero{ padding-top: 44px; padding-bottom: 8px; text-align:center; }
  .services-hero .eyebrow{ justify-content:center; }
  .services-hero h2{ max-width: 760px; margin:0 auto .35em; }
  .services-hero .hero-sub{ max-width: 620px; margin: 0 auto 26px; font-size:1.08rem; color: var(--color-text-secondary); }
  .services-hero .hero-actions{ display:flex; gap:14px; justify-content:center; flex-wrap:wrap; }

  /* ---------- Services cards ---------- */
  .card-grid{ display:grid; grid-template-columns: repeat(3, 1fr); gap: 24px; margin-top: 40px; }
  .card-grid.card-grid--5 > :nth-child(4),
  .card-grid.card-grid--5 > :nth-child(5){ grid-column: span 1; }
  /* Картки читались як плаский список: без межі, що реагує, і без явного напрямку руху.
     Тепер верхній акцент і підйом на hover - але без градієнтів і кольорових тіней (розд. 10.4). */
  .service-card{
    position:relative; overflow:hidden;
    background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-card);
    padding: 26px; box-shadow: var(--shadow-card);
    display:flex; flex-direction:column;
    transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease;
  }
  .service-icon{
    width:46px; height:46px; border-radius:10px; background: var(--color-blue-light);
    display:flex; align-items:center; justify-content:center; margin-bottom:16px;
  }
  .service-card::before{ content:''; position:absolute; top:0; left:0; right:0; height:3px;
                         background: var(--color-blue); opacity:0; transition: opacity .18s; }
  .service-card:hover{ transform: translateY(-3px); box-shadow: var(--shadow-card-hover);
                       border-color: var(--color-blue-light); }
  .service-card:hover::before{ opacity:1; }
  .service-card .card-link{ margin-top:auto; padding-top:10px; font-weight:600;
                            display:inline-flex; align-items:center; min-height:44px; }
  .service-card h3{ margin-bottom:8px; }
  .service-card p{ color: var(--color-text-secondary); font-size:.95rem; margin-bottom:16px; flex:1; }
  .service-card .card-link{ font-weight:600; font-size:.92rem; display:inline-flex; align-items:center; gap:6px; }
  @media (max-width: 900px){ .card-grid{ grid-template-columns: 1fr 1fr; } }
  @media (max-width: 620px){ .card-grid{ grid-template-columns: 1fr; } }

  .section-head{ max-width: 640px; margin: 0 auto 8px; text-align:center; }
  .section-head + .card-grid, .section-head + .process-list, .section-head + .reviews-grid,
  .section-head + .price-table-wrap, .section-head + .faq-list{ margin-top: 44px; }
  .section-cta{ text-align:center; margin-top: 44px; }
  /* .section-cta задає text-align:center, але .hero-actions - це flex, і на його
     дочірні елементи text-align не впливає взагалі. Тому пара кнопок у такому
     блоці стояла ліворуч. Центруємо саме по осі flex. */
  .section-cta.hero-actions{ display:flex; justify-content:center; flex-wrap:wrap; gap:14px; }

  /* ---------- Why different ---------- */
  .why-grid{ display:grid; grid-template-columns: repeat(3, 1fr); gap: 28px; margin-top: 40px; }
  .why-item{ padding: 0 4px; }
  .why-item .why-num{
    display:inline-flex; align-items:center; justify-content:center;
    width:34px; height:34px; border-radius:50%; background: var(--color-blue);
    color:#fff; font-weight:700; font-size:.95rem; margin-bottom:16px;
  }
  /* Заголовок другої групи ("Equipment We Install", "Services For This Equipment")
     стояв ліворуч, тоді як усі інші .section-head центровані. Джерело - у
     .related-sub просто не було text-align. */
  /* text-align:center стояв на всьому блоці й протікав у КАРТКИ: текст усередині
     них ставав центрованим, тоді як у сусідній сітці лишався ліворуч. Тому
     центруємо тільки заголовок, а не контейнер. */
  .related-sub{ margin-top:26px; padding-top:22px; border-top:1px solid var(--color-border); }
  .related-sub > .eyebrow{ justify-content:center; text-align:center; }

  /* ---------- Слайдери (Swiper): спільні правила ----------
     Усі слайдери сайту керуються однаково: крапки під слайдами і пара круглих
     стрілок під ними. Різниця лише в тому, ДЕ слайдер існує (див. JS). */
  .reviews-swiper, .ms-swiper{ padding-bottom: 42px; }
  .reviews-swiper .swiper-slide, .ms-track > .swiper-slide{ height:auto; display:flex; }
  .reviews-swiper .swiper-slide > .review-card, .ms-track > .swiper-slide > *{ width:100%; }
  /* Коли сітка стає треком слайдера, її власні grid-властивості мусять бути
     повністю знешкоджені. Інакше:
       · justify-content:center (потрібний для центрування карток у сітці)
         центрує ВЕСЬ ряд слайдів усередині вузького контейнера, і перші слайди
         їдуть у мінус - на 375px вони починались з -809px;
       · gap додається ПОВЕРХ spaceBetween Swiper'а, тож відстані між картками
         у різних слайдерах виходили різні.
     Це і був той самий "кожен слайдер працює по-своєму". */
  .ms-swiper .ms-track{
    display:flex; justify-content:flex-start; align-items:stretch;
    gap:0; grid-template-columns:none; margin:0;
  }

  /* Крапка 8-10px - менше за мінімальні 24px (WCAG 2.5.8). Саму крапку не
     збільшуємо, але даємо їй прозору зону 24x24 і розводимо центри рівно на 24px,
     щоб сусідні зони не накладались. */
  .swiper{ --swiper-pagination-bullet-size: 10px; --swiper-pagination-bullet-horizontal-gap: 7px; }
  .swiper-pagination-bullet{ position:relative; background: var(--color-text-secondary); opacity:.4; }
  .swiper-pagination-bullet-active{ background: var(--color-orange); opacity:1; }
  .section--blue .swiper-pagination-bullet{ background:#fff; }
  .section--blue .swiper-pagination-bullet-active{ background: var(--color-orange); }
  .swiper-pagination-bullet::after{ content:''; position:absolute; left:50%; top:50%;
    width:24px; height:24px; transform:translate(-50%,-50%); }

  .slider-nav{ display:flex; justify-content:center; align-items:center; gap:12px; margin-top:4px; }

  /* Пагінація перенесена в цей ряд із середини слайдера (див. sliders.js).
     Swiper за замовчуванням ставить їй position:absolute і bottom - у новому
     місці це поклало б крапки поверх стрілок. Повертаємо в потік.

     ⚠️ СЕЛЕКТОР НАВМИСНО З ДВОМА КЛАСАМИ, І ЦЕ НЕ ПРИКРАСА.
     swiper.min.css підключається ПІСЛЯ main.css (див. inc/enqueue.php:
     стиль слайдера вантажиться у своїй гілці, нижче за основний). Його
     правило .swiper-pagination-bullets.swiper-pagination-horizontal має
     специфічність 0,2,0 - рівно таку саму, як .slider-nav .swiper-pagination.
     При нічиї виграє той, хто нижче, тобто Swiper: width:100% лишався в силі,
     блок розтягувався на всю ширину ряду, і крапки з'їжджали вліво, до
     стрілки «назад». Виглядало як зламане вирівнювання, хоча правило було
     на місці. Додатковий клас піднімає нас до 0,3,0 і знімає нічию. */
  .slider-nav .swiper-pagination.swiper-pagination-bullets{
    position:static; width:auto; transform:none; margin:0;
    display:flex; align-items:center;
  }
  /* Слайд один - гортати нічого. Swiper вішає -lock, але display:flex вище
     перебив би його: тому та сама специфічність і нижче за нього. */
  .slider-nav .swiper-pagination.swiper-pagination-lock{ display:none; }
  /* display:flex перебиває дефолтне display:none атрибута hidden - повертаємо. */
  .slider-nav[hidden]{ display:none; }
  .slider-nav button{
    width:44px; height:44px; border-radius:50%; cursor:pointer;
    background:#fff; border:1px solid var(--color-border); color: var(--color-blue-dark);
    display:flex; align-items:center; justify-content:center; font: inherit;
  }
  .slider-nav button:hover{ background: var(--color-blue-light); }
  .slider-nav button[disabled]{ opacity:.4; cursor:default; }
  .slider-nav button::before{ content:''; width:9px; height:9px; border-top:2px solid currentColor;
                              border-right:2px solid currentColor; }
  .slider-nav .sw-prev::before{ transform: rotate(-135deg); margin-left:3px; }
  .slider-nav .sw-next::before{ transform: rotate(45deg); margin-right:3px; }
  .section--blue .slider-nav button{ background: rgba(255,255,255,.12); border-color: rgba(255,255,255,.35); color:#fff; }
  .section--blue .slider-nav button:hover{ background: rgba(255,255,255,.22); }

  /* ---------- Компактні посилання між сторінками ----------
     Раніше тут стояли картки з фото-заглушкою 16:9. Для навігаційного посилання
     це порожній синій прямокутник на пів екрана, під яким ніколи не буде фото:
     "All prices" не фотографують. Тепер це рядок з іконкою, назвою призначення
     і підписом - той самий патерн, що працює в картках профілів на /about/. */
  .link-grid{ display:grid; grid-template-columns: repeat(auto-fit, minmax(250px,1fr));
              gap:12px; margin-top:36px; }
  .link-card{ display:flex; align-items:center; gap:13px; padding:14px 16px; min-height:68px;
              background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-card);
              box-shadow: var(--shadow-card); color: var(--color-text);
              transition: border-color .15s ease, box-shadow .15s ease; }
  .link-card:hover{ border-color: var(--color-blue); box-shadow: var(--shadow-card-hover); color: var(--color-text); }
  .lc-ico{ flex:none; width:38px; height:38px; border-radius:10px; background: var(--color-blue-light);
           display:flex; align-items:center; justify-content:center; color: var(--color-blue-dark); }
  .lc-text{ display:flex; flex-direction:column; gap:2px; min-width:0; }
  .lc-text b{ font-size:.95rem; }
  .lc-text span{ font-size:.8rem; color: var(--color-text-secondary); }
  .link-card .pc-arrow{ flex:none; margin-left:auto; color: var(--color-blue-dark); }

  /* ---------- Кейси портфоліо ----------
     Було: заголовок і одне речення. Стало: система, ситуація, що зробили,
     результат і дослівна цитата. Підписи полів залишені текстом, а не іконками:
     саме їх читає ШІ, коли його питають, що компанія робить і як. */
  .case-card .gallery-body{ display:flex; flex-direction:column; }
  .case-system{ font-size:.74rem; text-transform:uppercase; letter-spacing:.1em; font-weight:700;
                color: var(--color-blue-dark); margin-bottom:6px; }
  .case-facts{ margin:12px 0 0; }
  .case-facts dt{ font-size:.72rem; text-transform:uppercase; letter-spacing:.08em; font-weight:700;
                  color: var(--color-text-secondary); margin-top:10px; }
  .case-facts dt:first-child{ margin-top:0; }
  .case-facts dd{ margin:3px 0 0; font-size:.88rem; line-height:1.55; color: var(--color-text); }
  .case-quote{ margin:16px 0 0; padding:12px 14px; border-left:3px solid var(--color-blue-light);
               background: var(--color-surface); border-radius:0 8px 8px 0; }
  .case-quote p{ margin:0; font-size:.85rem; line-height:1.6; color: var(--color-text-secondary); font-style:italic; }
  .case-card .gallery-src{ margin-top:14px; }

  /* ---------- «Читати далі»: однакова висота блоків ----------
     Довжина відгуків від 61 до 956 символів, тому картки в сітці розʼїжджались
     на 268px по висоті. Текст обрізається по рядках, кнопку додає JS і лише там,
     де текст СПРАВДІ не вміщається: інакше в короткій картці зʼявиться "Read more",
     який нічого не розкриває. */
  .clamped{ display:-webkit-box; -webkit-box-orient:vertical; overflow:hidden; }
  .clamped[data-clamp="4"]{ -webkit-line-clamp:4; }
  .clamped[data-clamp="5"]{ -webkit-line-clamp:5; }
  .clamped[data-clamp="6"]{ -webkit-line-clamp:6; }
  .clamped.is-open{ display:block; -webkit-line-clamp:none; overflow:visible; }
  .read-more{ background:none; border:none; padding:6px 0 0; margin:0; font:inherit;
              font-size:.85rem; font-weight:700; color: var(--color-blue-dark);
              cursor:pointer; display:inline-flex; align-items:center; gap:6px; min-height:32px; }
  .read-more:hover{ text-decoration:underline; }
  .read-more::after{ content:''; width:7px; height:7px; border-right:2px solid currentColor;
                     border-bottom:2px solid currentColor; transform: rotate(45deg); margin-top:-3px; }
  .read-more[aria-expanded="true"]::after{ transform: rotate(-135deg); margin-top:2px; }

  /* ---------- Зона обслуговування (/locations/) ---------- */
  .loc-list{ list-style:none; padding:0; margin:34px 0 0; display:grid;
             grid-template-columns: repeat(auto-fit, minmax(190px,1fr)); gap:10px; }
  .loc-list li{ background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-button);
                padding:12px 16px; font-size:.92rem; min-height:44px; display:flex; align-items:center; }
  .loc-list--county li{ background: var(--color-blue-dark); color:#fff; font-weight:700; border-color: var(--color-blue-dark); }

  /* ---------- Сторінка людини: /about/team/ ---------- */
  /* 1fr віддавав тексту 926px, а .hero-sub має max-width:46ch - абзац стояв
     стрічкою в 448px, і праворуч зяяла порожнеча на пів екрана. Обмежуємо саму
     колонку: рядок лишається читабельним, блок перестає бути перекошеним. */
  /* Клас висить на тому ж елементі, що й .container. Шорткат з бічними 20px
     перебивав відступи контейнера (24px на десктопі, 16px на мобільному), і герой
     стояв не в одну лінію з рештою секцій сторінки. Тільки вертикальні. */
  .person-hero{ display:grid; grid-template-columns: 180px minmax(0, 620px); gap:40px;
                align-items:start; padding-top: 34px; padding-bottom: 44px; }
  .person-photo{ aspect-ratio:1; border-radius: var(--radius-card); background: var(--color-blue-light);
                 border:1.5px dashed var(--color-border-interactive); color: var(--color-blue-dark);
                 display:flex; flex-direction:column; align-items:center; justify-content:center; gap:8px;
                 font-size:.8rem; font-weight:600; }
  .person-role{ font-size:1.02rem; font-weight:600; color: var(--color-blue-dark); margin:2px 0 12px; }
  /* margin-bottom було 0, а .hero-actions має margin-top:6px - між чипами і
     кнопками лишалось 6px проти 17px над чипами. Виглядало злиплим. */
  .person-tags{ list-style:none; padding:0; margin:18px 0 24px; display:flex; flex-wrap:wrap; gap:8px; }
  .person-tags li{ display:flex; }
  /* Чипи були просто текстом. Це категорії робіт із відгуків, тобто найточніший
     місток від людини до сторінки послуги чи товару - і для читача, і для
     внутрішньої перелінковки. Висота 30px, вище мінімальних 24px для дотику. */
  .person-tags a{ display:inline-flex; align-items:center; background: var(--color-blue-light);
                  color: var(--color-blue-dark); border-radius:999px; padding:7px 14px;
                  font-size:.82rem; font-weight:600; text-decoration:none;
                  border:1px solid transparent; transition: background .15s, border-color .15s; }
  .person-tags a:hover{ background:#fff; border-color: var(--color-border-interactive); }
  .person-quotes{ display:grid; grid-template-columns: repeat(auto-fit, minmax(300px,1fr)); gap:18px; margin-top:40px; }
  .person-quote{ background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-card);
                 padding:22px; box-shadow: var(--shadow-card); color: var(--color-text); }
  .person-quote p{ font-size:.92rem; color: var(--color-text-secondary); margin:10px 0 14px; line-height:1.65; }
  .person-quote .author{ font-weight:600; font-size:.9rem; }
  .person-quote .meta{ font-size:.78rem; color: var(--color-text-secondary); }
  @media (max-width: 700px){
    .person-hero{ grid-template-columns: 1fr; gap:22px; }
    .person-photo{ max-width:160px; }
  }

  /* ---------- Ліцензія та сертифікати (/licensing/) ---------- */
  .cred-grid{ display:grid; grid-template-columns: repeat(auto-fit, minmax(280px,1fr)); gap:18px; margin-top:40px; }
  .cred-card{ background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-card);
              padding:24px; box-shadow: var(--shadow-card); }
  .cred-card--primary{ background: var(--color-blue-dark); color:#fff; border-color: var(--color-blue-dark); }
  .cred-label{ font-size:.78rem; text-transform:uppercase; letter-spacing:.1em; font-weight:700;
               color: var(--color-blue-dark); margin-bottom:8px; }
  .cred-card--primary .cred-label{ color: rgba(255,255,255,.82); }
  .cred-value{ font-size:1.5rem; font-weight:700; letter-spacing:.02em; margin-bottom:10px; color: var(--color-text); }
  .cred-value--sm{ font-size:1.08rem; line-height:1.35; }
  .cred-card--primary .cred-value{ color:#fff; }
  .cred-card p{ font-size:.9rem; color: var(--color-text-secondary); margin:0 0 16px; line-height:1.6; }
  .cred-card--primary p{ color: rgba(255,255,255,.85); }
  .cred-card--primary .btn-secondary{ background:transparent; color:#fff; border-color: rgba(255,255,255,.45); }
  .cred-card--primary .btn-secondary:hover{ background: rgba(255,255,255,.12); color:#fff; }

  .cred-docs{ display:grid; grid-template-columns: repeat(auto-fit, minmax(200px,1fr)); gap:14px; margin-top:26px; }
  .cred-doc-slot{ aspect-ratio: 4 / 3; border:1.5px dashed var(--color-border-interactive);
                  border-radius: var(--radius-card); background: var(--color-blue-light);
                  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:8px;
                  color: var(--color-blue-dark); font-size:.82rem; font-weight:600; text-align:center; padding:14px; }
  /* margin auto по горизонталі обов'язковий: нижче цей абзац дістає max-width,
     а без auto центрований текст опиняється в коробці, притиснутій ліворуч. */
  .cred-note{ margin:18px auto 0; text-align:center; font-size:.85rem; color: var(--color-text-secondary); }

  /* ---------- Картки зовнішніх профілів (About) ---------- */
  .profile-grid{ display:grid; grid-template-columns: repeat(auto-fit, minmax(260px,1fr)); gap:14px; margin-top:36px; }
  .profile-card{ display:flex; align-items:center; gap:14px; padding:16px 18px; min-height:72px;
                 background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-card);
                 box-shadow: var(--shadow-card); color: var(--color-text);
                 transition: border-color .15s ease, box-shadow .15s ease; }
  .profile-card:hover{ border-color: var(--color-blue); box-shadow: var(--shadow-card-hover); color: var(--color-text); }
  .pc-ico{ flex:none; width:40px; height:40px; border-radius:10px; background: var(--color-blue-light);
           display:flex; align-items:center; justify-content:center; color: var(--color-blue-dark); font-size:1.15rem; }
  .pc-text{ display:flex; flex-direction:column; gap:2px; min-width:0; }
  .pc-text b{ font-size:.98rem; }
  .pc-text span{ font-size:.82rem; color: var(--color-text-secondary); }
  .pc-arrow{ flex:none; margin-left:auto; color: var(--color-blue-dark); }

  /* ---------- Розбивка робіт за тегами Google (Portfolio) ---------- */
  .tagstat{ max-width:760px; margin:40px auto 0; list-style:none; padding:0;
            display:flex; flex-direction:column; gap:8px; }
  .tagstat li{ display:grid; grid-template-columns: minmax(150px,1fr) 40px minmax(0,2fr);
               align-items:center; gap:16px; }
  .tagstat .ts-name{ font-weight:600; font-size:.95rem; color: var(--color-text); }
  .tagstat a.ts-name{ color: var(--color-blue-dark); display:inline-block; padding:5px 0; }
  .tagstat a.ts-name:hover{ text-decoration:underline; }
  .tagstat .ts-bar{ height:10px; border-radius:6px; background: var(--color-blue-light); }
  .tagstat .ts-bar > span{ display:block; height:100%; border-radius:6px; background: var(--color-blue); }
  .tagstat .ts-num{ text-align:right; font-weight:700; color: var(--color-blue-dark);
                    font-variant-numeric: tabular-nums; }
  /* Теми з профілю Google. Свідомо НЕ смужки: розбивка вище вже смужки, а два
     однакові на вигляд блоки підряд читаються як повтор. */
  .topic-sub .eyebrow{ text-align:center; }
  .topic-intro{ max-width:760px; margin:0 auto 18px; text-align:center;
                font-size:.9rem; color: var(--color-text-secondary); }
  .topic-cloud{ list-style:none; padding:0; margin:0 auto; max-width:760px;
                display:flex; flex-wrap:wrap; gap:10px; justify-content:center; }
  .topic-pill{ display:inline-flex; align-items:center; gap:8px;
               background: var(--color-blue-light); color: var(--color-blue-dark);
               border-radius:999px; padding:8px 8px 8px 16px; font-size:.9rem; font-weight:600; }
  .topic-pill .tp-num{ background:#fff; border-radius:999px; min-width:26px; height:26px;
                       display:inline-flex; align-items:center; justify-content:center;
                       font-size:.8rem; font-variant-numeric: tabular-nums; }

  .tagstat-note{ max-width:760px; margin:20px auto 0; text-align:center;
                 font-size:.85rem; color: var(--color-text-secondary); }
  @media (max-width:560px){
    /* Смужка йде окремим рядком: на 375px три колонки лишали їй ~60px і вона
       переставала щось показувати. */
    .tagstat li{ grid-template-columns: 1fr 40px; gap:4px 16px; }
    .tagstat .ts-name{ grid-column:1; grid-row:1; }
    .tagstat .ts-num{ grid-column:2; grid-row:1; text-align:right; }
    .tagstat .ts-bar{ grid-column:1 / -1; grid-row:2; margin-bottom:8px; }
  }

  /* ---------- Архів відгуків (Portfolio) ---------- */
  .reviews-archive{ max-width:900px; margin:0 auto; }
  .reviews-archive > summary{ cursor:pointer; list-style:none; text-align:center;
     background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-button);
     padding:14px 20px; font-weight:700; color: var(--color-blue-dark); min-height:44px; }
  .reviews-archive > summary::-webkit-details-marker{ display:none; }
  .reviews-archive > summary:hover{ background: var(--color-blue-light); }
  .ra-list{ list-style:none; margin:20px 0 0; padding:0; display:flex; flex-direction:column; gap:14px; }
  /* color задано явно: картка біла, але всередині .section--blue успадкований колір
     тексту - білий, і ім'я автора ставало білим по білому. */
  .ra-item{ background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-card);
            padding:18px 20px; color: var(--color-text); }
  .ra-head{ display:flex; flex-wrap:wrap; gap:8px; align-items:baseline; margin-bottom:6px; }
  .ra-meta{ color: var(--color-text-secondary); font-size:.84rem; }
  .ra-item p{ margin:0; color: var(--color-text-secondary); font-size:.94rem; line-height:1.65; }
  /* Архів живе всередині синьої секції відгуків на головній. Картки й розкривачка
     самі білі, тож перефарбовувати треба лише підпис під ними. */
  /* Кнопка "Read all 83 written reviews" тулилась ліворуч: у .reviews-all не було
     нічого, крім верхнього відступу. */
  .reviews-all{ margin-top:34px; text-align:center; }
  .section--blue .reviews-all .team-note{ color: rgba(255,255,255,.85); }
  .section--blue .reviews-all .team-note a{ color:#fff; text-decoration:underline; }

  /* ---------- Блок обладнання на Home ---------- */
  .equip-grid{ display:grid; grid-template-columns: repeat(auto-fit, minmax(190px,1fr)); gap:14px; }
  /* Було: рядок із крихітним прев'ю 46px. Назви різної довжини ("Ductless
     Mini-Splits" у два рядки, "Repair & Maintenance" без ціни) збивали вирівнювання,
     і ціни стояли на різній висоті. Тепер вертикальна картка: смуга під фото
     однакова в усіх, ціна притиснута до низу через margin-top:auto - вирівнювання
     не залежить від довжини назви. */
  .equip-card{ display:flex; flex-direction:column; gap:0;
               background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-card);
               padding:0; overflow:hidden;
               transition: border-color .18s ease, box-shadow .18s ease, transform .18s ease; }
  .equip-card:hover{ border-color: var(--color-blue-light); box-shadow: var(--shadow-card-hover);
                     transform: translateY(-2px); }
  .equip-card b{ font-size:1rem; color: var(--color-text); }
  .equip-price{ font-size:.88rem; color: var(--color-text-secondary); }
  .equip-price span{ color: var(--color-blue-dark); font-weight:700; font-size:1.12rem; }

  /* ---------- Прев'ю фото в картках ----------
     Картки ведуть на сторінки, де в героєві стоїть фото-плейсхолдер, а самі
     показували лише іконку - зв'язок між карткою і сторінкою не читався, і не
     було видно, куди піде реальне фото. Тепер іконка стала гліфом усередині
     того самого плейсхолдера, тільки компактного. Підпис називає конкретний
     кадр, а не абстрактне "фото". */
  .card-shot{
    aspect-ratio: 16 / 10; margin: -26px -26px 18px; border-radius: var(--radius-card) var(--radius-card) 0 0;
    background: var(--color-blue-light); border-bottom: 1.5px dashed var(--color-border-interactive);
    display:flex; align-items:center; justify-content:center; text-align:center; padding:16px;
  }
  .card-shot .cs-inner{ display:flex; flex-direction:column; align-items:center; gap:8px; color: var(--color-blue-dark); }
  .card-shot .cs-label{ font-size:.78rem; font-weight:600; color: var(--color-blue-dark); }
  .card-shot svg{ opacity:.85; }

  .equip-shot{
    aspect-ratio: 16 / 9; flex:none;
    background: var(--color-blue-light); border-bottom:1.5px dashed var(--color-border-interactive);
    display:flex; flex-direction:column; align-items:center; justify-content:center; gap:6px;
    color: var(--color-blue-dark); text-align:center; padding:10px;
  }
  .equip-shot .es-label{ font-size:.72rem; font-weight:600; }
  .equip-body{ display:flex; flex-direction:column; gap:6px; padding:14px 16px 16px; flex:1; }
  .equip-price{ margin-top:auto; }

  /* Суміжні сторінки: те саме прев'ю, тільки компактне - блок лишається
     навігаційним хвостом, а не другою вітриною. */
  .rc-shot{
    aspect-ratio: 16 / 9; flex:none;
    background: var(--color-blue-light); border-bottom:1.5px dashed var(--color-border-interactive);
    display:flex; flex-direction:column; align-items:center; justify-content:center; gap:6px;
    color: var(--color-blue-dark); text-align:center; padding:10px;
  }
  .rc-shot .rcs-label{ font-size:.72rem; font-weight:600; }
  /* Картка називала сторінку, але не казала, ЩО там роблять. Для людини це зайвий
     клік навмання, для ШІ - контекст, якого нема. Додаємо рядок під назвою. */
  /* text-align задаємо явно, щоб центрування будь-якого предка не протікало
     всередину картки: усі картки на сайті мусять виглядати однаково. */
  .rc-name{ display:flex; flex-direction:column; align-items:flex-start; gap:2px;
            min-height:48px; padding:12px 16px; text-align:left; }
  .rc-what{ font-weight:500; font-size:.8rem; line-height:1.4; color: var(--color-text-secondary); }

  /* Дві однакові за тлом секції підряд зливались в одну суцільну смугу, і межі
     між блоками не було видно. Розділювач малюємо ТІЛЬКИ там, де тло не
     змінюється: де чергування є, зайва лінія не потрібна. */
  .section:not(.section--surface):not(.section--blue) + .section:not(.section--surface):not(.section--blue),
  .section--surface + .section--surface{
    border-top: 1px solid var(--color-border);
  }

  /* ---------- Команда (розд. 4.14: «команда» - окремий блок у порядку сторінки) ---------- */
  .team-grid{ display:grid; grid-template-columns: repeat(auto-fit, minmax(220px,1fr)); gap:20px; }
  /* Одна картка в auto-fit розтягувалась на всю ширину контейнера (1132px на
     десктопі) навколо 64px аватара. Так буває на сторінках Eric і Yaroslav:
     у відгуках вони згадані в парі тільки з Владом. Обмежуємо саме цей випадок,
     решту сіток не чіпаємо. Браузер без :has() покаже те, що було. */
  .team-grid:has(> .team-card:only-child){
    grid-template-columns: minmax(220px, 360px); justify-content:center;
  }
  .team-card{ background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-card);
              padding:24px; text-align:center; }
  .team-avatar{ width:64px; height:64px; border-radius:50%; margin:0 auto 14px;
                background: var(--color-blue-light); color: var(--color-blue-dark);
                display:flex; align-items:center; justify-content:center;
                font-weight:700; font-size:1.4rem; }
  .team-card--owner .team-avatar{ background: var(--color-blue); color:#fff; }
  .team-card h3{ margin:0 0 2px; font-size:1.05rem; }
  /* Ті самі стилі для не-заголовкового варіанта: у блоках перелінковки картка
     людини - це посилання, а не розділ сторінки, тож семантично там <p>.
     Вигляд не змінюється. */
  .team-card .team-name{ margin:0 0 2px; font-size:1.05rem; font-weight:700;
                         line-height:1.3; color: var(--color-text); }
  .team-card .team-name a{ display:inline-block; padding:3px 6px; margin:-3px -6px;
                           border-radius:8px; }
  /* Заголовок конверсійного блоку - не розділ документа, а рядок пропозиції. */
  .calc-cta .cta-title{ color:#fff; margin:0 0 6px; font-size:1.25rem;
                        font-weight:700; line-height:1.3; }
  /* Назва в картці вибору гілки: це підпис кнопки. */
  .branch-card .branch-title{ display:block; font-size:1.02rem; font-weight:700;
                              line-height:1.3; margin:0 0 4px; color: var(--color-text); }
  /* Імʼя-посилання мало 19px висоти - менше за мінімальні 24px для цілі дотику
     (WCAG 2.5.8). Картка велика, тож добираємо висоту паддингом самого посилання,
     а не розміром шрифту: вигляд не змінюється, площа дотику стає 25px. */
  .team-card h3 a{ display:inline-block; padding:3px 6px; margin:-3px -6px; border-radius:8px; }
  .team-role{ display:block; margin-bottom:10px; font-size:.82rem; letter-spacing:.08em;
              text-transform:uppercase; color: var(--color-blue-dark); font-weight:700; }
  .team-card p{ margin:0; font-size:.92rem; color: var(--color-text-secondary); }
  /* Посилання в примітках лежать на off-white тлі, де --color-blue дає 4.24:1. */
  .team-note a{ color: var(--color-blue-dark); }
  /* Кнопка виходу на повний склад команди: сітка вже має свій нижній відступ,
     тому .section-cta зі своїми 44px тут завеликий. */
  .team-cta{ margin-top:18px; }
  .team-note{ max-width:760px; margin:26px auto 0; text-align:center;
              font-size:.92rem; color: var(--color-text-secondary); }

  /* Заголовок для структури документа, невидимий візуально (де видимий був би
     дослівним повтором H1). Не cloaking: текст той самий, що й сенс секції. */
  .success-box{ text-align:center; }
  .success-icon{ width:64px; height:64px; border-radius:50%; margin:0 auto 16px;
                 background: var(--color-success-bg); color: var(--color-success-text);
                 display:flex; align-items:center; justify-content:center; }
  .success-box .btn-secondary{ display:inline-flex; }

  .req{ color: var(--color-error-text); }
  /* Було правило .opt для підпису «(optional)» біля міток полів. Його замінив
     .lbl-opt (див. нижче), але саме правило лишилось у файлі і продовжувало
     діяти на чіпи-опції калькулятора: текст ставав другорядним сірим замість
     основного, а font-weight падав до 400. Два конфліктні .opt на один елемент.
     Правило видалено, у розмітці воно більше нікому не належить. */
  .field-error{ display:block; margin-top:6px; color: var(--color-error-text); font-size:.85rem; }
  .field input[aria-invalid="true"]{ border-color: var(--color-error); }

  .sr-only{ position:absolute; width:1px; height:1px; padding:0; margin:-1px;
            overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0; }

  .license-note{ display:block; margin-top:6px; font-weight:400; font-size:.84rem;
                 color: var(--color-text-secondary); }
  .license-strip{
    margin-top: 48px; display:flex; align-items:center; justify-content:center; gap:10px;
    padding: 16px 20px; background: var(--color-blue-light); border-radius: var(--radius-card);
    font-size:.92rem; color: var(--color-blue-dark); font-weight:600; text-align:center; flex-wrap:wrap;
  }
  @media (max-width: 900px){ .why-grid{ grid-template-columns: 1fr; } }

  /* ---------- Process ---------- */
  .process-list{ margin-top: 44px; display:flex; flex-direction:column; }
  /* ДОВЖИНА РЯДКА. Виміряно на 1280px: абзаци кроків процесу йшли по 1054px
     завширшки, тобто 120-124 символи в рядку; відповіді FAQ - 107-112; текст
     SEO-блоку - 97-110. Комфортна норма - 45-80 символів (WCAG 1.4.8 ставить
     стелю 80 для AAA): довший рядок змушує око шукати початок наступного.
     Обмежуємо саме МІРУ тексту, а не контейнери: сітки, таблиці й картки
     лишаються на повну ширину.

     ⚠️ ВИПРАВЛЕНО 14.09.2026. Обмеження стояло на КОЖНОМУ АБЗАЦІ, а не на
     колонці. Заголовки, списки й таблиці поруч лишались на повну ширину блоку,
     тому права межа тексту стрибала всередині однієї секції:
       .seo-copy     h2 - 772px, абзац - 595px (порожнеча 177px справа)
       .prose        h2 - 780px, абзац - 614px (166px)
       юридичні      h2 - 780px, абзац - 552px (228px)
       .process-item заголовок - 1054px, абзац - 614px (440px)
     Візуально блок читався як зсунутий ліворуч. Плюс .cred-note мав
     text-align:center при margin:18px 0 0, тобто центрований текст усередині
     коробки, притиснутої до лівого краю.
     Тепер міра стоїть на БОКСІ і береться з токена --measure. */
  .process-item > div{ max-width: var(--measure); }
  /* .cred-note - підпис під таблицею, кегль .85rem. На повній мірі 620px це
     81 символ, тобто на один більше за стелю WCAG 1.4.8. Тому подвійне
     обмеження: не ширше за колонку і не довше за 72 символи. */
  .cred-note{ max-width: min(var(--measure), 72ch); }
  /* Відповідь FAQ має власний padding 0 22px, а бокс border-box. */
  .faq-item .faq-answer{ max-width: calc(var(--measure) + 44px); }

  .process-item{ display:grid; grid-template-columns: 56px 1fr; gap: 22px; padding: 22px 0; border-top: 1px solid var(--color-border); }
  .process-item:first-child{ border-top:none; }
  .process-num{
    width:44px; height:44px; border-radius:50%; border:2px solid var(--color-blue-dark);
    color: var(--color-blue-dark); display:flex; align-items:center; justify-content:center;
    font-weight:700;
  }
  .process-item h3{ margin-bottom:4px; }
  .process-item p{ color: var(--color-text-secondary); margin-bottom:0; }

  /* ---------- Price list (Services) ---------- */
  .price-table-wrap{ overflow-x:auto; border:1px solid var(--color-border); border-radius: var(--radius-card); box-shadow: var(--shadow-card); }
  table.price-table{ width:100%; border-collapse:collapse; min-width: 560px; background:#fff; }
  table.price-table th, table.price-table td{ padding: 14px 20px; text-align:left; font-size:.95rem; border-bottom:1px solid var(--color-border); }
  table.price-table th{ background: var(--color-blue-light); color: var(--color-blue-dark); font-weight:700; font-size:.85rem; text-transform:uppercase; letter-spacing:.03em; }
  table.price-table tbody tr:last-child td{ border-bottom:none; }
  table.price-table tbody tr:hover{ background: var(--color-surface); }
  table.price-table td.price-cell{ font-weight:700; color: var(--color-blue-dark); white-space:nowrap; }
  /* Посилання, яке само по собі заповнює комірку або абзац, не підпадає під
     виняток «inline у реченні» (WCAG 2.5.8): 17px висоти замало. Паддинг
     компенсується відʼємним margin, тож сітка й висота рядків не їдуть. */
  table.price-table td a,
  .contact-channels .channel p > a:only-child{
    display:inline-block; padding:4px 6px; margin:-4px -6px; border-radius:6px;
  }
  .price-note{ text-align:center; margin-top:18px; font-size:.9rem; color: var(--color-text-secondary); }
  .addons-toggle-wrap{ margin-top: 30px; }
  /* На off-white тлі --color-blue дає 4.24:1 - трохи нижче порога. */
  .addons-summary{ cursor:pointer; font-weight:600; color: var(--color-blue-dark); font-size:.95rem; list-style:none;
                   min-height:24px; display:flex; align-items:center; gap:5px; }
  .addons-summary::-webkit-details-marker{ display:none; }
  .addons-summary::before{ content:'+'; }
  details[open] .addons-summary::before{ content:'–'; }
  .addons-list{ list-style:none; margin: 18px 0 0; padding:0; display:grid; grid-template-columns: 1fr 1fr; gap: 10px 30px; }
  .addons-list li{ display:flex; justify-content:space-between; gap:16px; padding: 10px 0; border-bottom:1px dashed var(--color-border); font-size:.92rem; color: var(--color-text-secondary); }
  .addons-list li b{ color: var(--color-text); font-weight:700; white-space:nowrap; }
  @media (max-width:700px){ .addons-list{ grid-template-columns: 1fr; } }

  /* ---------- Reviews ---------- */
  /* Було: flex + space-between + align-items:flex-end. Три наслідки, усі видимі:
     (1) .section-head несе margin:0 auto + text-align:center, тож заголовок
         центрувався всередині свого 640px боксу, а сам бокс стояв ліворуч -
         H2 опинявся на 147px лівіше центру контейнера, на відміну від решти секцій;
     (2) flex-end вирівнює краї БОКСІВ, а .section-head має margin-bottom:8px,
         тож рядок рейтингу сідав на 8px нижче заголовка і прилипав до карток;
     (3) власного відступу знизу блок не мав узагалі.
     Стало: центрована колонка, як усі інші .section-head на сайті. */
  .reviews-top{ display:flex; flex-direction:column; align-items:center; gap:12px; margin-bottom:30px; }
  .reviews-top .section-head{ margin-bottom:0; }
  .reviews-top .eyebrow{ color: var(--color-orange-light); }
  /* «5.0 ·» було голим текстовим вузлом між двома flex-елементами: анонімний
     елемент діставав gap з обох боків, тож навколо оцінки зяяли широкі проміжки,
     а роздільник висів у повітрі. Тепер кожна частина - окремий елемент. */
  .rating-line{ display:flex; align-items:center; gap:8px; color:#fff; font-weight:600; font-size:.95rem; }
  .rating-line .stars{ font-size:1rem; }
  /* .7, а не .5: на .5 крапка давала 3.26:1 на синьому тлі. */
  .rating-line .rl-dot{ opacity:.7; font-weight:400; }
  .rating-line a{ color:#fff; text-decoration:underline; text-underline-offset:3px;
                  display:inline-block; padding:3px 4px; margin:-3px -4px; border-radius:6px; }
  .rating-line a:hover{ text-decoration-thickness:2px; }

  /* ══════════════ СТОРІНКА ВІДГУКІВ ══════════════ */
  .rating-line--light{ justify-content:center; color: var(--color-text); }
  .rating-line--light .stars{ color: var(--color-star); }
  .rating-line--light a{ color: var(--color-blue-dark); }
  .rv-filters{ display:flex; flex-direction:column; gap:16px; margin-bottom:30px;
               padding:22px; background: var(--color-blue-light); border-radius: var(--radius-card); }
  .rv-row{ display:flex; align-items:flex-start; gap:14px; flex-wrap:wrap; }
  .rv-row--end{ justify-content:space-between; align-items:center; }
  .rv-label{ flex:none; min-width:130px; padding-top:7px; font-size:.8rem; font-weight:700;
             letter-spacing:.06em; text-transform:uppercase; color: var(--color-blue-dark); }
  .rv-chips{ display:flex; flex-wrap:wrap; gap:8px; }
  .rv-chip{ display:inline-flex; align-items:center; gap:7px; background:#fff;
            border:1px solid var(--color-border); border-radius:999px; padding:7px 14px;
            font: inherit; font-size:.85rem; font-weight:600; color: var(--color-text);
            cursor:pointer; transition: background .15s, border-color .15s, color .15s; }
  .rv-chip:hover{ border-color: var(--color-border-interactive); }
  .rv-chip[aria-pressed="true"]{ background: var(--color-blue-dark); border-color: var(--color-blue-dark); color:#fff; }
  .rv-count{ font-size:.78rem; opacity:.72; font-variant-numeric: tabular-nums; }
  .rv-chip[disabled]{ opacity:.4; cursor:not-allowed; }
  .rv-status{ margin:0; font-size:.9rem; color: var(--color-text-secondary); }
  /* ⚠️ ВИПРАВЛЕНО 14.09.2026. Було minmax(320px,1fr). На екрані 320px контейнер
     віддає 288px (16px падінгу з боків), а колонка вимагала 320px - картка
     вилазила на 336px і всі 7 сторінок відгуків отримували горизонтальний скрол
     саме на пороговій ширині WCAG 1.4.10. min(320px,100%) знімає вимогу, коли
     місця менше за картку; на всіх ширинах від 336px поведінка не змінюється. */
  .rv-grid{ display:grid; grid-template-columns: repeat(auto-fill, minmax(min(320px,100%),1fr)); gap:18px; }
  .rv-card{ background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-card);
            padding:22px; box-shadow: var(--shadow-card); display:flex; flex-direction:column; }
  .rv-card p{ font-size:.92rem; color: var(--color-text-secondary); margin:10px 0 14px; line-height:1.65; }
  .rv-foot{ margin-top:auto; }
  .rv-foot b{ display:block; font-size:.9rem; }
  .rv-meta{ font-size:.78rem; color: var(--color-text-secondary); }
  .rv-empty{ text-align:center; padding:40px 0; color: var(--color-text-secondary); }
  .link-btn--dark{ color: var(--color-blue-dark); }

  /* ══════════════ ПОКРОКОВИЙ РЕЖИМ КАЛЬКУЛЯТОРА ══════════════
     Крок ховаємо СВОЇМ класом, а не атрибутом hidden: hidden на .calc-q вже
     використовує applyVisibility() движка, і два господарі одного атрибута
     неминуче почали б перетирати один одного. */
  .wiz-step-off{ display:none !important; }
  .wiz-bar{ display:flex; align-items:center; gap:14px; margin-bottom:18px; }
  /* Підпис до кроку вибору гілки: без нього три картки виглядали як банер, а не
     як питання. Формат той самий, що в <label> решти питань. */
  .wiz-qlabel{ margin:0 0 12px; font-weight:600; font-size:1.02rem; color: var(--color-text); }

  /* Підсумок конфігурації у вікні заявки. */
  .cm-price{ display:flex; align-items:baseline; justify-content:space-between; gap:12px;
             padding-bottom:10px; border-bottom:1px solid var(--color-border); }
  .cm-price span{ font-size:.78rem; font-weight:700; letter-spacing:.06em;
                  text-transform:uppercase; color: var(--color-text-secondary); }
  .cm-price b{ font-size:1.3rem; color: var(--color-blue-dark); }
  /* На 375px заголовок ціни розкладався на три рядки: підпис "YOUR ESTIMATE"
     і сума ділили ряд навпіл через space-between, і обом бракувало ширини.
     Стовпчиком підпис займає один рядок, сума - один. */
  @media (max-width: 520px){
    .cm-price{ display:block; }
    .cm-price span{ display:block; margin-bottom:2px; }
    .cm-price b{ display:block; font-size:1.45rem; line-height:1.2; }
  }

  /* Згорнутий перелік відповідей усередині модалки. */
  .cm-answers{ margin:12px 0 0; }
  .cm-answers > summary{ cursor:pointer; list-style:none; display:flex; align-items:center;
                         gap:6px; min-height:24px; font-size:.85rem; font-weight:600;
                         color: var(--color-blue-dark); }
  .cm-answers > summary::-webkit-details-marker{ display:none; }
  .cm-answers > summary::before{ content:'+'; font-weight:700; }
  .cm-answers[open] > summary::before{ content:'–'; }
  /* Колонка значень стискалась до 82px при 187px у підписів, і довгі відповіді
     на кшталт "Replacement of an existing system" розсипались на вісім рядків
     вузькою стрічкою по правому краю. Тепер обидві колонки з мінімумом, а на
     вузькому екрані підпис і значення стоять один під одним, ліворуч. */
  .cm-config{ display:grid; grid-template-columns: minmax(0,1.1fr) minmax(0,1fr);
              gap:6px 14px; margin:10px 0 0; font-size:.85rem; }
  .cm-config dt{ color: var(--color-text-secondary); }
  .cm-config dd{ margin:0; font-weight:600; text-align:right; }
  @media (max-width: 520px){
    .cm-config{ grid-template-columns: 1fr; gap:0; }
    .cm-config dt{ margin-top:9px; font-size:.79rem; }
    .cm-config dt:first-child{ margin-top:0; }
    .cm-config dd{ text-align:left; }
  }
  .cm-why{ margin:12px 0 0; font-size:.82rem; color: var(--color-text-secondary); }
  .cm-perks{ list-style:none; margin:14px 0 0; padding:0; display:flex;
             flex-direction:column; gap:7px; }
  .cm-perks li{ position:relative; padding-left:22px; font-size:.85rem;
                color: var(--color-text-secondary); line-height:1.45; }
  .cm-perks li::before{ content:"✓"; position:absolute; left:0; top:0;
                        color: var(--color-blue); font-weight:700; }
  .wiz-track{ flex:1; height:6px; border-radius:999px; background: var(--color-blue-light); overflow:hidden; }
  .wiz-fill{ height:100%; width:0; background: var(--color-orange); transition: width .25s ease; }
  .wiz-count{ flex:none; font-size:.82rem; font-weight:700; color: var(--color-blue-dark);
              font-variant-numeric: tabular-nums; }
  .wiz-nav{ display:flex; gap:12px; flex-wrap:wrap; margin-top:22px; }
  .wiz-nav .btn{ min-width:150px; }
  .wiz-alt{ margin:14px 0 0; font-size:.92rem; color: var(--color-text-secondary); }
  /* Посилання в .cred-note бере світло-синій колір і дає 4.24:1 на сірому тлі -
     трохи нижче за 4.5. Беремо темний синій, той самий, що в решті приміток. */
  .cred-note a{ color: var(--color-blue-dark); }
  .wiz-done{ background: var(--color-blue-light); border-radius: var(--radius-card);
             padding:22px; margin-top:22px; }
  .wiz-done h3{ margin:0 0 6px; font-size:1.1rem; }
  .wiz-done p{ margin:0 0 16px; font-size:.93rem; color: var(--color-text-secondary); }
  /* У покроковому режимі панель результату не має тягнутись збоку на весь екран:
     відповідь показуємо після останнього кроку, а не паралельно з питанням. */
  /* Дві колонки ЛИШЕ там, де панель справді стоїть збоку. Нижче 1001px вона
     перетворюється на фіксовану смугу внизу (BAR_MAX у движку), і резервувати
     під неї 360px не можна: на 375px питанню лишалось близько 15px і текст
     розсипався по одному слову в рядок. */
  @media (min-width: 1001px){
    .is-wizard .calc-layout{ grid-template-columns: minmax(0,1fr) 360px; }
  }
  .is-wizard .calc-toolbar{ justify-content:flex-end; }
  /* Область питання має сталу висоту, інакше Back/Next переїжджають після
     кожного кроку. 300px - трохи більше за найвище питання (289px виміряно). */
  .is-wizard.is-question-step [data-form]:not([hidden]){ min-height:300px; }
  @media (max-width: 640px){
    .is-wizard.is-question-step [data-form]:not([hidden]){ min-height:330px; }
  }

  /* Картки вибору в покроковому режимі. Поле <select> лишається в DOM (з ним
     працює движок), але візуально і для клавіатури його заміняє ця група. */
  /* Селектор мусить бути специфічнішим за правила самої форми (.calc-q select),
     інакше вони лишають полю width:100% і воно розпирає сторінку на 97px, хоч і
     невидиме. Техніка приховування - та сама, що у .sr-only. */
  .calc-q select.wiz-hidden-field{
    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:0;
  }
  .wiz-opts{ display:grid; grid-template-columns: repeat(auto-fit, minmax(180px,1fr));
             gap:10px; margin-top:10px; }
  .wiz-opt{ font: inherit; font-weight:600; text-align:left; cursor:pointer;
            background:#fff; border:1.5px solid var(--color-border);
            border-radius: var(--radius-card); padding:14px 16px; min-height:56px;
            color: var(--color-text); display:flex; align-items:center; gap:10px;
            transition: border-color .15s, background .15s, box-shadow .15s; }
  .wiz-opt::before{ content:""; flex:none; width:18px; height:18px; border-radius:50%;
                    border:2px solid var(--color-border-interactive); }
  .wiz-opt:hover{ border-color: var(--color-blue); }
  .wiz-opt[aria-checked="true"]{ border-color: var(--color-blue); background: var(--color-blue-light);
                                 color: var(--color-blue-dark); }
  .wiz-opt[aria-checked="true"]::before{ border-color: var(--color-blue);
                                         box-shadow: inset 0 0 0 4px var(--color-blue); }
  @media (max-width: 640px){
    .wiz-opts{ grid-template-columns: 1fr; gap:8px; }
    .wiz-opt{ min-height:52px; padding:12px 14px; }
  }

  /* На телефоні кнопка "Next question" опинялась за 1600px від верху екрана:
     над нею стояли герой, три великі картки вибору гілки і саме питання. Для
     покрокового сценарію це вбивчо - людина не бачить, куди натискати далі.
     Тому в покроковому режимі керування липне до низу екрана, а картки вибору
     гілки стають компактними. */
  @media (max-width: 900px){
    /* Було position:sticky. Sticky прилипає ТІЛЬКИ тоді, коли елемент інакше
       поїхав би за екран: на високому питанні кнопки прилипали знизу, на
       короткому лишались у потоці вище. Виміряно на 375px: розкид позиції
       Back/Next між кроками - 143px. Для покрокового сценарію це найгірше,
       бо палець щоразу шукає кнопку заново.
       Тепер fixed: позиція та сама на кожному кроці незалежно від висоти
       питання, а місце під смугу зарезервоване паддингом нижче. */
    .is-wizard .wiz-nav{
      position: fixed; left:0; right:0; z-index:5;
      margin:0; padding:12px 16px 14px;
      background: var(--color-bg); box-shadow: 0 -10px 18px -12px rgba(16,24,40,.35);
    }
    /* Поки розкритий розклад ціни, навігація майстра ховається: дві смуги
       одна на одній - це не вибір, а плутанина. */
    html.calc-panel-open .is-wizard .wiz-nav{ display:none; }
    .is-wizard .wiz-nav .btn{ flex:1; min-width:0; }
    .is-wizard .branch-grid{ gap:8px; }
    .is-wizard .branch-card{ padding:12px 14px; }
    .is-wizard .branch-card p{ display:none; }
    .is-wizard .branch-card h3{ font-size:.98rem; margin:0; }
    .is-wizard .branch-ico{ transform:scale(.8); }
    /* Згорнута смуга результату стоїть знизу: без запасу вона накриває керування. */
      /* Панель на телефоні - фіксована смуга знизу, тож липкій навігації майстра
       потрібен запас, інакше вони накладаються. */
    /* Згорнута смуга результату - 75px. Навігація стоїть рівно над нею. */
    /* ⚠️ + висота банера згоди. Він фіксований, z-index 200 і займає весь
       низ екрана; без цього зсуву «Back / Next» опинялись ПІД ним і не
       натискались узагалі - виміряно на 390x844. Змінну ставить app.js,
       0px - коли банера немає. */
    .is-wizard .wiz-nav{ bottom: calc(75px + env(safe-area-inset-bottom) + var(--consent-h, 0px)); }
    /* Запас під дві фіксовані смуги, щоб кінець контенту не ховався під ними. */
    .is-wizard .calc-layout{ padding-bottom: 168px; }
    .is-wizard .wiz-done{ margin-bottom:16px; }
  }
  @media (max-width: 640px){
    .rv-filters{ padding:16px; }
    .rv-label{ min-width:0; padding-top:0; }
    .rv-row{ flex-direction:column; gap:8px; }
    .rv-row--end{ flex-direction:row; }
  }
  .stars{ color: var(--color-star); letter-spacing:2px; font-size:1.1rem; }
  /* На синьому тлі CTA-помаранчевий дає 3.07:1 - для 18px це замало. */
  .section--blue .stars, .calc-panel .stars{ color: var(--color-orange-light); }
  /* ...але картка відгуку всередині синьої секції сама БІЛА, і світлий помаранчевий
     давав на ній 1.12:1 - зірки були фактично невидимі, а іншого показника оцінки
     в картці немає. Повертаємо їм колір для світлого тла. */
  .section--blue .review-card .stars, .calc-panel .review-card .stars{ color: var(--color-star); }
  .reviews-grid{ display:grid; grid-template-columns: repeat(4, 1fr); gap: 20px; margin-top: 36px; }
  .review-card{
    background:#fff; border-radius: var(--radius-card); padding:22px; color: var(--color-text);
    box-shadow: var(--shadow-card);
  }
  .review-card .stars{ font-size:.9rem; margin-bottom:10px; display:block; }
  .review-card p{ font-size:.92rem; color: var(--color-text-secondary); margin-bottom: 14px; }
  .review-card .author{ font-weight:600; font-size:.9rem; color: var(--color-text); }
  .review-card .meta{ font-size:.78rem; color: var(--color-text-secondary); }
  @media (max-width: 1000px){ .reviews-grid{ grid-template-columns: 1fr 1fr; } }
  @media (max-width: 620px){ .reviews-grid{ grid-template-columns: 1fr; } }

  /* ---------- Contact form ---------- */
  .contact-wrap{ display:grid; grid-template-columns: .9fr 1.1fr; gap: 54px; align-items:start; }
  .trust-list{ list-style:none; margin: 22px 0 0; padding:0; display:flex; flex-direction:column; gap:14px; }
  .trust-list li{ display:flex; gap:10px; align-items:flex-start; font-size:.95rem; color: var(--color-text-secondary); }
  .trust-list svg{ flex:none; margin-top:2px; }
  .form-card{
    background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-card);
    padding: 30px; box-shadow: var(--shadow-card);
  }
  .form-row{ display:grid; grid-template-columns: 1fr 1fr; gap: 16px; }
  .field{ margin-bottom:16px; }
  .field label{ display:block; font-size:.88rem; font-weight:600; margin-bottom:6px; color: var(--color-text); }
  .field input, .field select{
    width:100%; padding: 12px 14px; border-radius: 8px; border: 1.5px solid var(--color-border-interactive);
    font-family: inherit; font-size: .96rem; color: var(--color-text); background:#fff;
  }
  /* outline:none тут прибирав системну рамку для БУДЬ-ЯКОГО фокуса, а заміна
     (box-shadow кольором blue-light) дає на білому близько 1.2:1 - тобто для
     клавіатурної навігації індикатор фокуса фактично зникав. М'яке підсвічування
     лишаємо для миші, а для клавіатури повертаємо справжній контрастний outline. */
  .field input:focus, .field select:focus{ border-color: var(--color-blue); outline:none; box-shadow: 0 0 0 3px var(--color-blue-light); }
  .field input:focus-visible, .field select:focus-visible, .field textarea:focus-visible{
    outline: 2px solid var(--color-focus-ring); outline-offset: 2px;
  }
  /* Згода більше не чекбокс, а підпис під кнопкою: сама дія "надіслати" і є
     погодженням. Текст мусить стояти ПОРУЧ із кнопкою, інакше він не вважається
     розкриттям при дії. Розмір дрібний, але контраст повний. */
  .consent-note{ margin:10px 0 0; font-size:.72rem; line-height:1.55;
                 color: var(--color-text-secondary); }
  .consent-note a{ color: var(--color-blue-dark); }
  .form-card .consent-note, .cm-consent{ text-align:left; }
  .form-card .btn-primary{ width:100%; }
  @media (max-width: 900px){ .contact-wrap{ grid-template-columns: 1fr; } .form-row{ grid-template-columns: 1fr; } }

  /* ---------- About teaser ---------- */
  /* 760px тут і 820px у .seo-copy нижче давали дві різні ширини на двох сусідніх
     секціях головної. Обидві тепер беруть одну міру; +48px - бо ці блоки самі є
     .container з padding 0 24px. */
  .about-teaser{ max-width: calc(var(--measure) + 48px); margin: 0 auto; text-align:center; }
  .about-teaser p{ color: var(--color-text-secondary); font-size:1.05rem; }

  /* ---------- SEO text block ---------- */
  .seo-copy{ max-width: calc(var(--measure) + 48px); margin: 0 auto; color: var(--color-text-secondary); font-size:.97rem; }
  /* ---------- Instant Estimate калькулятор (Частина III) ---------- */
  .calc-demo-note{ background:var(--color-warning-bg); border:1px dashed var(--color-warning); border-radius:10px;
                   padding:14px 18px; color: var(--color-text-secondary); font-size:.9rem; margin-bottom:24px; }
  .calc-demo-note b{ color: var(--color-text); }

  .branch-grid{ display:grid; grid-template-columns: repeat(auto-fit, minmax(240px,1fr)); gap:18px; }
  .branch-card{ background:#fff; border:2px solid var(--color-border); border-radius: var(--radius-card);
                padding:24px; text-align:left; cursor:pointer; font: inherit; transition: border-color .15s, box-shadow .15s; }
  .branch-card:hover{ border-color: var(--color-blue-light); }
  .branch-card[aria-pressed="true"]{ border-color: var(--color-orange); box-shadow: 0 6px 20px rgba(0,0,0,.07); }
  .branch-card h3{ margin:10px 0 6px; font-size:1.08rem; }
  .branch-card p{ margin:0; color: var(--color-text-secondary); font-size:.92rem; }
  .branch-ico{ color: var(--color-blue); }

  .calc-layout{ display:grid; grid-template-columns: minmax(0,1fr) 360px; gap:30px; align-items:start; margin-top:34px; }
  @media (max-width: 1000px){ .calc-layout{ grid-template-columns: 1fr; } }
  .calc-q{ background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-card);
           padding:20px 22px; margin-bottom:16px; }
  /* :not(.opt) обов'язковий. Це правило (специфічність 0,1,1) перебивало
     .opt (0,1,0) там, де чіп-опція лежить ПРЯМО в .calc-q, а не в .opt-row
     (питання «220V hookup» і «Concrete pad or bracket»). Наслідок: у чіпа
     зникав display:inline-flex, тобто разом з ним align-items:center і gap.
     Чекбокс і текст ставали інлайновими по базовій лінії, а сам чіп
     розтягувався на всю ширину - виглядав інакше, ніж решта опцій сайту. */
  .calc-q > label:not(.opt), .calc-q .q-label{ display:block; font-weight:700; color: var(--color-text); margin-bottom:10px; font-size:.98rem; }
  /* Одиночний чіп у питанні лишається в потоці окремим рядком. */
  .calc-q > label.opt{ margin-bottom:0; }
  .calc-q .q-hint{ display:block; font-weight:400; color: var(--color-text-secondary); font-size:.85rem; margin-top:4px; }
  .calc-q select, .calc-q input[type="number"]{ width:100%; padding:11px 12px; border:1px solid var(--color-border);
           border-radius:8px; font: inherit; background:#fff; color: var(--color-text); }
  .calc-q[hidden]{ display:none; }

  .opt-row{ display:flex; flex-wrap:wrap; gap:10px; }
  /* ЄДИНИЙ ЧЕКБОКС НА ВЕСЬ САЙТ.
     Було: системний квадратик браузера з accent-color. Він малюється засобами ОС,
     тому на macOS, Windows і Android має різну форму, різну товщину галочки і
     власний радіус - тобто «однаково скрізь» не виходило за визначенням, і до
     скруглень та рамок нашої палітри він не мав відношення.
     Тепер appearance:none і власна коробка: рамка кольору інтерактивної межі,
     радіус 6px як у полів форми, у стані checked - синя заливка бренду з білою
     галочкою SVG. Галочка вбудована як data:URI, а не ::after: псевдоелементи на
     <input> офіційно не підтримуються, і в частині рушіїв не малюються.
     Сам чіп реагує на стан: рамка синіє, фон стає світло-блакитним. */
  .opt{ display:inline-flex; align-items:center; gap:10px; border:1.5px solid var(--color-border);
        border-radius:10px; padding:10px 14px; min-height:44px; cursor:pointer;
        font-size:.93rem; background:#fff; transition: border-color .14s, background-color .14s; }
  .opt:hover{ border-color: var(--color-border-interactive); background: var(--color-surface); }
  .opt input[type="checkbox"], .opt input[type="radio"]{
        appearance:none; -webkit-appearance:none; margin:0;
        width:22px; height:22px; flex:0 0 22px;
        border:2px solid var(--color-border-interactive); border-radius:6px;
        background:#fff; cursor:pointer;
        transition: background-color .14s, border-color .14s; }
  .opt input[type="radio"]{ border-radius:50%; }
  .opt input[type="checkbox"]:hover, .opt input[type="radio"]:hover{ border-color: var(--color-blue); }
  .opt input[type="checkbox"]:checked{
        background: var(--color-blue)
          url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E")
          center / 14px 14px no-repeat;
        border-color: var(--color-blue); }
  .opt input[type="radio"]:checked{
        background: #fff; border-color: var(--color-blue); box-shadow: inset 0 0 0 5px var(--color-blue); }
  .opt input:disabled{ opacity:.45; cursor:not-allowed; }
  /* Підпис "(optional)" біля мітки поля. Окремий клас, бо .opt зайнятий
     чипами-опціями калькулятора, і на його сторінці стилі накладались. */
  .lbl-opt{ font-weight:400; font-size:.85em; color: var(--color-text-secondary); }
  /* --color-blue на сірій секції дає 4.24:1. Для посилань у підзаголовках
     використовуємо темніший відтінок. */
  .section-sub a{ color: var(--color-blue-dark); text-decoration:underline; }
  /* Обраний чіп мусить читатись здалеку, а не лише за галочкою: світло-блакитний
     фон бренду замість сірого. Контраст тексту на ньому 12.3:1. */
  .opt:has(input:checked){ border-color: var(--color-blue); background: var(--color-blue-light); }
  .opt:has(input:checked):hover{ background: var(--color-blue-light); }

  .calc-panel{ position: sticky; top: 100px; background: var(--color-blue-dark); color:#fff;
               border-radius: var(--radius-card); padding: 26px 24px; }
  .calc-panel h3{ color:#fff; margin:0 0 4px; font-size:1.05rem; }
  .calc-panel .panel-sub{ color: rgba(255,255,255,.82); font-size:.84rem; margin:0 0 18px; }
  .calc-lines{ list-style:none; padding:0; margin:0 0 18px; }
  .calc-lines li{ display:flex; justify-content:space-between; gap:14px; padding:7px 0;
                  border-bottom:1px solid rgba(255,255,255,.12); font-size:.9rem; color: rgba(255,255,255,.82); }
  .calc-lines li b{ color:#fff; white-space:nowrap; }
  .calc-total{ border-top:2px solid rgba(255,255,255,.25); padding-top:16px; }
  .calc-total .ct-label{ color: rgba(255,255,255,.82); font-size:.8rem; text-transform:uppercase; letter-spacing:.1em; }
  .calc-total .ct-value{ font-size:1.85rem; font-weight:700; color:#fff; margin:4px 0 2px; }
  .calc-total .ct-note{ color: rgba(255,255,255,.82); font-size:.8rem; }

  /* Знижка окремим рядком під головною сумою. Навмисно НЕ такого ж розміру,
     як ct-value: головне число тут - недисконтована оцінка, і візуально
     більша «зі знижкою» сума читалась би як основна ціна. */
  /* ⚠️ [hidden] САМ ПО СОБІ НЕ ХОВАЄ, якщо елементу задано display.
     Атрибут hidden - це лише `display:none` у стилях браузера за
     замовчуванням, і будь-яке власне правило display його перебиває. Тут
     обидва елементи мають display:flex, тож без явного правила рядок
     знижки світився б порожнім на стартовій ціні та в демо-гілках. */
  .ct-discount[hidden], .calc-trust li[hidden]{ display:none !important; }

  .ct-discount{ display:flex; align-items:baseline; justify-content:space-between;
                gap:10px; flex-wrap:wrap; margin:6px 0 8px; padding:8px 10px;
                border-radius:8px; background: rgba(255,255,255,.12); }
  .ct-discount .ctd-label{ font-size:.8rem; color: rgba(255,255,255,.9); }
  .ct-discount .ctd-value{ font-size:1.05rem; font-weight:700; color:#fff; white-space:nowrap; }

  /* Хрестик потрібен лише у режимі вікна (десктоп). На телефоні панель
     згортається тапом по заголовку, і друга кнопка з'їдала б ширину смуги. */
  .cp-close{ display:none; }
  .calc-panel .btn{ width:100%; margin-top:18px; text-align:center; }
  .cp-actions{ display:block; }
  .calc-trust{ list-style:none; margin:18px 0 0; padding:0; display:flex; flex-direction:column; gap:9px; }
  .calc-trust li{ display:flex; align-items:flex-start; gap:9px; font-size:.85rem; line-height:1.45;
                  color:#fff; }
  .calc-trust svg{ flex:none; margin-top:2px; color: var(--color-orange-light); }
  .calc-panel .calc-call{ margin-top:10px; background:transparent; color:#fff;
                          border-color: rgba(255,255,255,.45); font-size:.9rem; }
  .calc-panel .calc-call:hover{ background: rgba(255,255,255,.12); color:#fff; }
  /* Той самий список, але на світлій секції: .calc-trust li фарбує текст у білий
     під синю панель, тому перекриття мусить стояти НИЖЧЕ, інакше не спрацює. */
  .cred-trust{ max-width:820px; margin:26px auto 0; }
  /* Було: п'ять галочок у стовпчик, вирівняних ліворуч усередині центрованої
     секції. Текст ішов стрічкою через пів екрана, і блок читався як службовий
     список, а не як частина пропозиції. Тепер це сітка карток: однакова висота,
     рівні колонки, іконка в кружку. */
  .covers-grid{ display:grid; grid-template-columns: repeat(auto-fit, minmax(250px,1fr));
                gap:14px; margin-top:34px; text-align:left; }
  .covers-card{ display:flex; gap:13px; align-items:flex-start; padding:18px 18px 20px;
                background:#fff; border:1px solid var(--color-border);
                border-radius: var(--radius-card); box-shadow: var(--shadow-card); }
  .covers-ico{ flex:none; width:36px; height:36px; border-radius:50%; display:flex;
               align-items:center; justify-content:center; background: var(--color-blue-light);
               color: var(--color-blue-dark); }
  .covers-card b{ display:block; font-size:.95rem; margin-bottom:3px; }
  .covers-card span{ font-size:.86rem; line-height:1.5; color: var(--color-text-secondary); }

  /* Слоти під реальні фото. Поки src порожній, працює сьогоднішня SVG-заглушка;
     щойно зʼявляється знімок, слот отримує .has-photo і перетворюється на рамку
     з обрізанням по центру - висота картки не змінюється, сітка не стрибає. */
  .rc-shot.has-photo, .card-shot.has-photo, .cs-inner.has-photo, .person-photo.has-photo{
    padding:0; border:0; background:none; overflow:hidden;
  }
  .rc-shot.has-photo img, .card-shot.has-photo img, .cs-inner.has-photo img,
  .person-photo.has-photo img{
    display:block; width:100%; height:100%; object-fit:cover; border-radius:inherit;
  }
  .cred-trust li{ color: var(--color-text); }
  .cred-trust svg{ color: var(--color-blue-dark); }

  /* ---------- Шапка панелі результату ---------- */
  .cp-head{ display:block; width:100%; background:none; border:none; padding:0; margin:0 0 4px;
            font:inherit; color:inherit; text-align:left; cursor:default; }
  .cp-bar{ display:block; }
  .cp-head:disabled{ color:inherit; opacity:1; cursor:default; }
  .cp-cta{ display:none; }
  .cp-head-text{ display:block; }
  .cp-title{ display:block; color:#fff; font-size:1.05rem; font-weight:700; }
  .cp-mini{ display:none; }
  .cp-caret{ display:none; }

  /* ---------- Скидання відповідей ---------- */
  .calc-toolbar{ display:flex; justify-content:flex-end; margin-bottom:6px; }
  .calc-reset{ display:inline-flex; align-items:center; gap:7px; min-height:44px; padding:8px 14px;
               background:none; border:1px solid var(--color-border); border-radius: var(--radius-button);
               color: var(--color-text-secondary); font:inherit; font-size:.88rem; font-weight:600; cursor:pointer; }
  .calc-reset:hover{ border-color: var(--color-blue); color: var(--color-blue-dark);
                     background: var(--color-blue-light); }
  .calc-reset[disabled]{ opacity:.45; cursor:default; }
  .calc-reset[disabled]:hover{ border-color: var(--color-border); color: var(--color-text-secondary); background:none; }

  /* Панель результату в одну колонку опинялась під усіма питаннями, і ціни не було
     видно, поки відповідаєш. Була спроба зробити її sticky на 46vh - на 667px це
     307px, тобто майже половина екрана назавжди, і вона накривала по три питання.
     Тепер це смуга: згорнута показує заголовок і суму (~64px), розгортається тапом.
     Патерн той самий, що й у sticky-форми на решті сайту. */
  @media (max-width: 1000px){
    .calc-panel{ position: fixed; left:0; right:0; bottom: var(--consent-h, 0px); top:auto; z-index: var(--z-sticky-form);
                 border-radius: var(--radius-card) var(--radius-card) 0 0; padding:0;
                 box-shadow: 0 -6px 24px rgba(16,26,38,.22); }
    .cp-bar{ display:flex; align-items:stretch; gap:10px; padding:10px 14px 10px 20px; }
    .cp-head{ display:flex; align-items:center; justify-content:space-between; gap:12px;
              padding:0; min-height:52px; cursor:pointer; margin:0; flex:1; min-width:0; }
    .cp-cta{ display:inline-flex; align-items:center; justify-content:center; flex:none;
             min-height:52px; padding:0 16px; border:none; border-radius: var(--radius-button);
             background: var(--color-orange); color: var(--color-text); font:inherit;
             font-size:.92rem; font-weight:700; cursor:pointer; white-space:nowrap; }
    .cp-cta:hover{ filter:brightness(.95); }
    .calc-panel.is-open .cp-cta{ display:none; }
    .cp-head-text{ display:flex; flex-direction:column; gap:2px; min-width:0; }
    .cp-title{ font-size:.82rem; font-weight:600; color: rgba(255,255,255,.8);
               text-transform:uppercase; letter-spacing:.08em; }
    .cp-mini{ display:block; font-size:1.3rem; font-weight:700; color:#fff; white-space:nowrap; }
    .cp-caret{ display:block; flex:none; color:#fff; transition: transform .18s; }
    .calc-panel.is-open .cp-caret{ transform: rotate(180deg); }
    /* 62vh на 667px = 414px, а вміст тіла 495px - різниця з'їдала кнопки.
       Тепер тіло коротше, а кнопки живуть у .cp-actions поза прокруткою. */
    .cp-body{ display:none; padding:0 20px 14px; max-height:44vh; overflow-y:auto;
              overscroll-behavior:contain; }
    .cp-actions{ display:none; padding:12px 20px;
                 padding-bottom: calc(12px + env(safe-area-inset-bottom));
                 border-top:1px solid rgba(255,255,255,.18); background: var(--color-blue-dark);
                 border-radius:0 0 var(--radius-card) var(--radius-card); }
    .calc-panel.is-open .cp-actions{ display:block; }
    /* Перша кнопка підвалу вже відділена рамкою - верхній відступ зайвий. */
    .cp-actions .btn:first-child{ margin-top:0; }
    .calc-panel.is-open .cp-bar{ padding-bottom:4px; }
    .calc-panel.is-open .cp-body{ display:block; }
    /* У розгорнутому вигляді сума стоїть і в шапці, і в підсумку - дублювання.
       Лишаємо ту, що з підписом і приміткою. */
    .calc-panel.is-open .cp-mini{ display:none; }
    .calc-panel.is-open .cp-head{ min-height:48px; }
    .calc-panel .panel-sub{ margin-top:4px; }

    /* Кнопка «вгору» сідала просто на смугу, а останні блоки сторінки ховались
       під нею. Клас на <body> ставить роутер - тільки на сторінці калькулятора. */
    body.calc-bar-on .back-to-top{ bottom: 82px; }
    body.calc-bar-on .page:not([hidden]){ padding-bottom: 72px; }
  }

  .calc-empty{ color: rgba(255,255,255,.6); font-size:.92rem; }

  .emergency-box{ background: var(--color-danger, #c0392b); border-radius:10px; padding:14px 16px; margin-bottom:16px; }
  .emergency-box p{ margin:0 0 8px; color:#fff; font-size:.88rem; }
  .emergency-box a{ color:#fff; font-weight:700; text-decoration:underline; }

  .calc-modal{ position:fixed; inset:0; z-index: var(--z-modal); background:rgba(16,26,38,.6);
               display:flex; align-items:center; justify-content:center; padding:20px; }
  .calc-modal[hidden]{ display:none; }
  .calc-modal-box{ background:#fff; border-radius:14px; max-width:460px; width:100%; padding:28px;
                   max-height:90vh; overflow:auto; }
  .calc-modal-box h3{ margin:0 0 6px; }
  .calc-modal-box .cm-sub{ color: var(--color-text-secondary); font-size:.92rem; margin:0 0 18px; }
  /* ── Модалка на телефоні ──
     Було: padding 28px на ширині 335px з'їдав 56px, заголовок ламався на два рядки,
     підзаголовок на три, а рядок згоди займав 236px, тобто 35% висоти вікна.
     Разом вміст мав 927px при видимих 600 і вимагав скролу з першого екрана. */
  @media (max-width: 560px){
    .calc-modal{ padding:12px; align-items:flex-end; }
    .calc-modal-box{ padding:20px 18px 18px; max-height:92vh; border-radius:16px 16px 12px 12px; }
    .calc-modal-box h3{ font-size:1.12rem; line-height:1.25; padding-right:34px; }
    .calc-modal-box .cm-sub{ font-size:.86rem; line-height:1.45; margin-bottom:14px; }
    .calc-modal-box .field{ margin-bottom:12px; }
    .cm-summary{ padding:11px 13px; margin-bottom:14px; }
    .calc-modal-box    .calc-modal-box  }

  .cm-summary{ background: var(--color-surface); border-radius:10px; padding:14px 16px; margin-bottom:18px;
               font-size:.88rem; color: var(--color-text-secondary); }
  .cm-summary b{ color: var(--color-text); }
  .cm-close{ float:right; background:none; border:none; font-size:1.4rem; line-height:1; cursor:pointer;
             color: var(--color-text-secondary); }

  /* ---------- About / Portfolio / Contacts / юридичні сторінки ---------- */
  /* .prose - звичайний div усередині .container, свого падінгу не має,
     тому бере міру напряму, без +48px. */
  .prose{ max-width: var(--measure); margin: 0 auto; color: var(--color-text-secondary); font-size:1rem; line-height:1.75; }
  .prose h2{ font-size:1.35rem; color: var(--color-text); margin: 1.9em 0 .5em; }
  .prose h2:first-child{ margin-top:0; }
  .prose ul{ padding-left:1.2em; }
  .prose li{ margin-bottom:.5em; }
  .prose blockquote{ margin: 1.4em 0; padding: 16px 20px; border-left:4px solid var(--color-orange);
                     background: var(--color-surface); border-radius: 0 10px 10px 0; color: var(--color-text); }

  /* Суцільний текст не має заповзати під sticky-форму (вона fixed у правому
     НИЖНЬОМУ куті, ~320x180).
     ⚠️ ВИПРАВЛЕНО 14.09.2026. Було padding-right:360px на всю секцію. Тобто
     заради віджета, який займає нижній кут, уся колонка тексту зсувалась ліворуч
     на 168px по всій висоті сторінки - і сторінка виглядала перекошеною.
     Тепер колонка має міру (--measure) і чесно стоїть по центру, а від віджета
     її відводить нижній відступ - рівно там, де вони справді перетинаються. */
  /* ⚠️ :last-child ДОДАНО 21.09.2026 - БЕЗ НЬОГО ПРАВИЛО СПРАЦЬОВУВАЛО
     ТАМ, ДЕ НІЧОГО НЕ ЗАХИЩАЛО.
     Відступ існує, щоб суцільний текст не заповзав під sticky-форму в
     правому нижньому куті. Це має сенс лише тоді, коли prose ЗАВЕРШУЄ
     сторінку. Виміряно:
       /privacy-policy/  prose останній у <main>, після нього нічого  -> потрібен
       /terms/           те саме                                      -> потрібен
       /about/           після prose ще СІМ секцій                    -> марний
     На /about/ форма все одно накриє ті сім секцій, тобто 170px не
     рятували нікого, зате при новій базі 48px давали проміжок 218px
     проти 96px у решті сторінки - помітна діра одразу під першим блоком.
     ⚠️ Коментар вище каже «~320x180». Виміряно 21.09: форма 300×523.
     Якщо колись перевіряти достатність 170px - міряти наново. */
  @media (min-width: 1000px){ .section--prose:last-child{ padding-bottom: 170px; } }
  .legal-meta{ color: var(--color-text-secondary); font-size:.9rem; margin-bottom: 2em; }
  /* Блок акції. Помаранчевий бренду лишається за кнопками, тому плашка - на
     білому з помаранчевою межею: помітно, але не конкурує з головним CTA. */
  /* Рядок акції у спільній формі заявки: той самий текст, що в героєві головної
     і в блоці на /contacts/. Стоїть під списком довіри, перед самою формою. */
  .form-offer{ display:flex; align-items:flex-start; gap:10px; flex-wrap:wrap;
               margin:18px 0 0; padding:14px 16px; font-size:.92rem; line-height:1.55;
               color: var(--color-text); background: var(--color-orange-light);
               border-radius:12px; }
  .form-offer .offer-badge{ flex:none; background:#fff; }

  /* Рядок акції в героєві головної: та сама пропозиція, що блоком на /contacts/,
     але компактно - під кнопками, без фону, щоб не сперечатись із головним CTA. */
  .hero-offer{ display:flex; align-items:center; gap:10px; flex-wrap:wrap;
               margin:18px 0 0; font-size:.95rem; color: var(--color-text); }
  .hero-offer .offer-badge{ flex:none; }

  .offer-box{ max-width:720px; margin:0 auto; text-align:center;
              border:1.5px solid var(--color-orange); border-radius: var(--radius-card);
              background:#fff; padding:26px 24px; }
  /* --color-star (#B35709) на світло-помаранчевому дає 4.38:1 при тексті 11.8px,
     тобто нижче порогу 4.5. Беремо темніший відтінок тієї ж гами: 5.6:1. */
  .offer-badge{ display:inline-block; background: var(--color-orange-light);
                color:#8A4205; font-weight:700; font-size:.74rem;
                letter-spacing:.1em; text-transform:uppercase;
                padding:5px 12px; border-radius:999px; }
  /* Секція під короткий блок. Стандартні 72px зверху і знизу розраховані на
     повноцінну секцію з заголовком і сіткою: на смузі з одним блоком вони давали
     291px висоти при 147px контенту, тобто половина висоти - порожнеча навколо
     нічого. Виміряно на 1280px. */
  /* Секція-заглушка під ненаписаний копірайт. Це маркер для команди, а не блок
     контенту: давати йому відступи повноцінної секції означає малювати порожню
     смугу 174px заради 70px рамки. Коли копірайт приїде, клас іде разом із
     заглушкою, і секція повертається до звичайних .section. */
  .section--stub{ padding-top:22px; padding-bottom:22px; }

  /* ⚠️ Зменшено разом із базою, інакше варіант втрачає сенс: при базі
     48px старі 44px давали б 88px проти 96px, тобто «щільна» секція
     майже не відрізнялась би від звичайної. Пропорція збережена та сама,
     що була: 44/72 ≈ 0.61, отже 48 × 0.61 ≈ 30. */
  .section--tight{ padding-top:30px; padding-bottom:30px; }
  @media (max-width: 640px){ .section--tight{ padding-top:20px; padding-bottom:20px; } }

  .offer-title{ margin:12px 0 4px; font-size:1.35rem; font-weight:700; line-height:1.25;
                color: var(--color-text); }
  .offer-list{ list-style:none; margin:16px auto 0; padding:0; width:max-content; max-width:100%;
               display:grid; gap:9px; text-align:left; }
  .offer-list li{ display:grid; grid-template-columns:auto 1fr; align-items:start; gap:10px;
                  font-size:.93rem; line-height:1.5; color: var(--color-text); }
  .offer-list svg{ flex:none; margin-top:.3em; color: var(--color-orange-dark); }
  .offer-note{ margin:16px auto 0; max-width:56ch; font-size:.85rem; line-height:1.6;
               color: var(--color-text-secondary); }
  .offer-text{ margin:0 auto; max-width:52ch; color: var(--color-text-secondary);
               font-size:.98rem; line-height:1.6; }
  /* .offer-actions більше не використовується: кнопки з блоку акції прибрані,
     щоб не дублювати ті самі дві кнопки з героя сторінки контактів. */
  .offer-text:last-child{ margin-bottom:0; }

  .gallery-grid{ display:grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 22px; }
  .gallery-card{ background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-card); overflow:hidden; }
  .gallery-shot{ aspect-ratio: 4/3; background: var(--color-surface); border-bottom:1px solid var(--color-border);
                 display:flex; align-items:center; justify-content:center; color: var(--color-text-secondary); }
  .gallery-body{ padding: 18px 20px 22px; }
  .gallery-body h3{ font-size:1.02rem; margin:0 0 8px; }
  .gallery-body p{ margin:0 0 8px; color: var(--color-text-secondary); font-size:.94rem; }
  .gallery-src{ color: var(--color-text-secondary); font-size:.84rem; }

  .contact-channels{ display:grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap:20px; margin-bottom: 34px; }
  .channel{ background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-card); padding: 22px; }
  .channel h3{ font-size:1rem; margin:0 0 8px; }
  .channel p, .channel a{ font-size:.95rem; color: var(--color-text-secondary); }
  .channel a{ color: var(--color-blue); }
  .map-slot{ border:1px dashed var(--color-border); border-radius: var(--radius-card); background: var(--color-surface);
             padding: 44px 24px; text-align:center; color: var(--color-text-secondary); }
  .map-slot .ms-coords{ font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size:.86rem; display:block; margin-top:8px; }

  /* ---------- Товарні сторінки (Products) ---------- */
  /* Було var(--color-orange): 2.59:1 на білому. Спека лишає помаранчевий
     виключно для CTA-кнопок, не для тексту. */
  .product-kicker{ color: var(--color-blue); font-weight:700; font-size:1.02rem; margin:0 0 6px; }
  /* Ціна «від» губилась між підзаголовком і бейджами - тепер це власна плашка,
     а не просто більший текст у загальному потоці. */
  .product-facts{ margin: 20px 0 10px; display:inline-flex; align-items:baseline; gap:14px;
                  background: var(--color-blue-light); border-radius: var(--radius-card);
                  padding: 14px 18px; flex-wrap:wrap; }
  .product-price{ display:flex; align-items:baseline; gap:10px; flex-wrap:wrap; }
  .product-price .pf-label{ color: var(--color-text-secondary); font-size:.85rem; text-transform:uppercase; letter-spacing:.08em; }
  .product-price b{ font-size:2.05rem; color: var(--color-blue-dark); line-height:1; }
  .product-price .pf-note{ color: var(--color-text-secondary); font-size:.9rem; }
  .product-warranty{ color: var(--color-text-secondary); font-size:.9rem; margin:0 0 6px; }
  .pc-price{ color: var(--color-text-secondary); font-size:.92rem; margin: 6px 0 10px; }
  .pc-price b{ color: var(--color-blue-dark); font-size:1.05rem; }

  /* ---------- Міні-секція переходу на калькулятор (Частина III, розд. 5) ---------- */
  /* Контент відцентровано свідомо: sticky-форма (position:fixed, правий край) перекриває
     праву третину екрана, тому CTA не можна ставити край-у-край праворуч - за тим самим
     принципом, що й наявні .section-cta на цих сторінках. */
  .calc-cta{ background: var(--color-blue-dark); border-radius: var(--radius-card);
             padding: 34px 30px; text-align:center; }
  .calc-cta h3{ color:#fff; margin:0 0 6px; font-size:1.25rem; }
  /* ТІЛЬКИ абзаци без класу. Раніше було .calc-cta p - правило накидало
     max-width:52ch + margin:0 auto на класові елементи теж, і варто було комусь
     задати власний margin, як auto зникав: вузька коробка ставала врівень з лівим
     краєм панелі, а текст центрувався всередині неї. Саме так з'їхав .cta-title.
     Регресію ловить _audit/layout-audit.js. */
  .calc-cta > p:not([class]){ color:rgba(255,255,255,.72); margin:0 auto 20px;
                              font-size:.95rem; max-width:52ch; }
  /* Було: заголовок, один рядок тексту і кнопка. Ні ціни, ні причини натискати,
     ні другого виходу - посилання на сторінку цін із товарів і послуг не було
     взагалі. Тепер блок несе стартову ціну саме цієї системи, три конкретні
     обіцянки і ДВА шляхи: порахувати самому або подивитись повний розбір ціни. */
  /* Було в один рядок: дрібний капс упереміш із великим числом на спільній
     базовій лінії. Формально правильно, візуально - крива стрічка різних кеглів.
     Тепер підпис окремим рядком над числом, число - головне, усе по центру. */
  .calc-cta__price{ display:block; margin:0 0 14px; color: var(--color-orange-light);
                    font-weight:700; letter-spacing:.08em; text-transform:uppercase;
                    font-size:.72rem; line-height:1.5; }
  .calc-cta__price b{ display:block; margin-top:2px; font-size:2.1rem; line-height:1.15;
                      letter-spacing:-.01em; text-transform:none; color:#fff; }
  .calc-cta__price i{ display:block; font-style:normal; font-weight:600; font-size:.72rem;
                      letter-spacing:.08em; color: rgba(255,255,255,.72); }
  /* Було: flex-wrap з justify-content:center. Сума трьох пунктів 736-928px при
     max-width:760px, тому список рвався на дві нерівні лінійки НА ВСІХ ширинах:
     два пункти зверху, третій висів по центру знизу. На телефоні гірше - текст
     переносився на два рядки, галочка центрувалась по вертикалі відносно обох
     рядків і зависала посеред тексту, а ліві краї пунктів не збігались (38/61/38).
     Тепер сітка: три рівні колонки на широкому, одна колонка на вузькому,
     галочка завжди на рівні ПЕРШОГО рядка, текст вирівняний ліворуч. */
  /* Три колонки не тримали рядок: найширший пункт з 20 панелей - 324px тексту
     плюс 23px на галочку з проміжком = 347px. Три такі колонки з проміжками
     вимагають 1085px, а панель на екрані 1280 дає 1072. Тобто тришпальтна
     розкладка ЗАВЖДИ переносила рядок і лишала слово-сироту ("name", "seconds",
     "confirms it") другим рядком. Один стовпчик: кожен пункт в один рядок на
     будь-якому десктопі, галочки шикуються в рівну вертикаль, блок центрується
     як ціле через width:max-content + margin auto. Розкладка однакова на всіх
     ширинах - нічого не перебудовується на брейкпойнті. */
  .calc-cta__list{ list-style:none; padding:0; margin:0 auto 22px;
                   display:grid; gap:10px; justify-items:start;
                   width:max-content; max-width:100%; text-align:left; }
  .calc-cta__list li{ display:grid; grid-template-columns:auto 1fr; align-items:start;
                      gap:9px; color:rgba(255,255,255,.92); font-size:.92rem;
                      line-height:1.45; text-wrap:balance; }
  .calc-cta__list svg{ flex:none; color: var(--color-orange-light); margin-top:.32em; }
  .calc-cta__actions{ display:flex; gap:14px; justify-content:center; flex-wrap:wrap; }
  .calc-cta__actions .btn-secondary{ background:transparent; color:#fff;
                                     border-color: rgba(255,255,255,.5); }
  .calc-cta__actions .btn-secondary:hover{ background: rgba(255,255,255,.14); }
  @media (max-width: 640px){ .calc-cta{ padding:26px 22px; } }

  /* ⚠️ ПРАВИЛО H1 - НЕ МІНЯТИ БЕЗ РІШЕННЯ КЛІЄНТА.
     На 7 сторінках, для яких є затверджений копірайт (Home, Services і 5 підсторінок
     послуг - файли .docx від 24.04.2025), H1 - це РІВНО той рядок, який задав
     копірайтер у ТЗ (xlsx «Optimizing Tags» / «Technical Task for Copywriting»),
     і стоїть він на початку SEO-текстового блоку, а не в героєві. Заголовок героя
     там - чорновий продажний слоган, і він H2.
     13.09.2026 це правило вже одного разу порушили: герой підняли в H1, а
     затверджений H1 опустили в H2. Повернуто. На решті 32 сторінок копірайту
     немає, тому H1 там законно живе в героєві. */
  /* SEO-H1 сторінки живе на початку SEO-текстового блоку (ТЗ на копірайт), а не в героєві */
  .seo-copy h1{ font-size:1.55rem; color: var(--color-text); margin: 0 0 .9em; }
  .seo-copy h2{ font-size:1.3rem; color: var(--color-text); margin-top: 1.6em; }
  /* Блок мав color: --color-text-secondary, але глобальне правило p{} перебивало
     його для абзаців. Тому в одному й тому самому тексті абзаци були темні
     (#2B2E33), а пункти списку - сірі (#5B6068), з дефолтними браузерними
     крапками і без відступів між ними. Тепер текст один за кольором, а маркер
     свій, у фірмовому синьому - як решта списків на сайті. */
  .seo-copy{ color: var(--color-text); }
  .seo-copy li{ color: var(--color-text); }
  /* --color-blue на сірій секції (--color-surface) дає 4.24:1 - нижче 4.5.
     Та сама причина, що й у .section-sub a нижче: беремо темніший відтінок,
     він тримає 7.4:1 і на білому, і на сірому. */
  .seo-copy a{ color: var(--color-blue-dark); }
  .seo-copy ul, .seo-copy ol{ margin: 0 0 1em; padding-left: 0; list-style: none; }
  .seo-copy li{ position: relative; padding-left: 22px; margin-bottom: .55em; }
  .seo-copy ul > li::before{
    content: ""; position: absolute; left: 4px; top: .62em;
    width: 6px; height: 6px; border-radius: 50%; background: var(--color-blue);
  }
  .seo-copy ol{ counter-reset: seo-ol; }
  .seo-copy ol > li{ counter-increment: seo-ol; }
  .seo-copy ol > li::before{
    content: counter(seo-ol) "."; position: absolute; left: 0; top: 0;
    font-weight: 700; color: var(--color-blue-dark);
  }
  .seo-copy li b, .seo-copy li strong{ color: var(--color-text); }

  /* ---------- FAQ (акордеон, Services) ---------- */
  /* Картка FAQ теж читальна колонка: при 820px питання займало 776px, а відповідь
     під ним - 620px, тобто всередині однієї картки два різні праві краї.
     Ширина картки = міра + власний padding 22px з боків. */
  .faq-list{ max-width: calc(var(--measure) + 44px); margin: 44px auto 0; display:flex; flex-direction:column; gap: 12px; }
  .faq-item{ background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-card); overflow:hidden; }
  .faq-item summary{ cursor:pointer; list-style:none; padding: 18px 22px; font-weight:600; font-size:1rem; display:flex; justify-content:space-between; align-items:center; gap:16px; }
  .faq-item summary::-webkit-details-marker{ display:none; }
  .faq-item summary::after{ content:'+'; font-size:1.4rem; font-weight:400; color: var(--color-blue); flex:none; }
  .faq-item[open] summary::after{ content:'–'; }
  /* Відступ відповіді мусить збігатися з відступом питання (22px), інакше текст
     ліпиться до краю картки. Клас відповіді ОДИН: був ще <div class="faq-body">,
     який не мав жодного стилю, і 56 із 73 відповідей рендерились без відступів.
     Зведено до .faq-answer - нової розмітки для відповідей не заводити. */
  .faq-item .faq-answer{ padding: 0 22px 20px; color: var(--color-text-secondary); font-size:.95rem; margin:0; line-height:1.7; }

  /* ---------- Sticky consultation form ---------- */
  .sticky-form{
    position: fixed; right: 20px; bottom: calc(20px + var(--consent-h, 0px)); z-index: var(--z-sticky-form);
    width: 300px; background:#fff; border-radius: var(--radius-card);
    box-shadow: var(--shadow-card-hover); border:1px solid var(--color-border);
    padding: 18px 20px 20px;
  }
  .sticky-form .sticky-title{ display:block; margin:0 0 4px; font-size:1rem; font-weight:700; color: var(--color-text); }
  .sticky-form .sub{ font-size:.8rem; color: var(--color-text-secondary); margin-bottom:12px; }
  .sticky-form .field{ margin-bottom:10px; }
  .sticky-form .field input{ padding: 10px 12px; font-size:.9rem; }
  .sticky-form .footnote{ font-size:.72rem; color: var(--color-text-secondary); text-align:center; margin-top:8px; }
  /* Мін. тап-зона 44×44 (бриф розд. 1) - хрестик був 14×22. */
  .sticky-close{
    position:absolute; top:6px; right:8px; background:none; border:none; cursor:pointer;
    color: var(--color-text-secondary); font-size:1.1rem; line-height:1;
    min-width:44px; min-height:44px; display:flex; align-items:center; justify-content:center;
  }
  .sticky-form.hidden{ display:none; }
  /* Форма більше не висить над контентом з першої секунди: вона перекривала герой
     і картки, поки користувач ще навіть не почав читати. З'являється після скролу. */
  .sticky-form{ opacity:0; visibility:hidden; transform: translateY(12px);
                transition: opacity .2s, transform .2s, visibility .2s; }
  .sticky-form.visible{ opacity:1; visibility:visible; transform:none; }

  /* ⚠️ ЗГОРНУТА ПЛАШКА НА ВСІХ ШИРИНАХ, А НЕ ЛИШЕ НА ТЕЛЕФОНІ.
     Розгорнута панель 300×400 у правому нижньому куті накривала праві
     240 px колонки тексту. Зміряно: контент заходить під форму на КОЖНІЙ
     ширині вікна нижче 1952 px, тобто практично на всіх моніторах. На
     /products/furnaces/ під нею зникали три ціни апгрейдів.
     Механізм згортання вже existував для телефона, тому тут не новий
     віджет, а зняття обмеження: ті самі правила діють скрізь, а
     @media (min-width:701px), який примусово розгортав форму назад,
     прибраний.
     Згорнута плашка це 300×52 у самому кутку замість 300×400. */
  .sticky-form{ padding: 0; }
  .sticky-form .sticky-head{
    display:flex; align-items:center; justify-content:space-between; gap:12px;
    padding:14px 16px; min-height:52px; cursor:pointer; width:100%;
    background:none; border:none; font:inherit; text-align:left; color:inherit;
  }
  .sticky-form .sticky-title{ margin:0; }
  .sticky-form .sticky-body{ display:none; padding:0 16px 16px; }
  .sticky-form.expanded .sticky-body{ display:block; }
  .sticky-form .sticky-caret{ transition: transform .18s; flex:none; }
  .sticky-form.expanded .sticky-caret{ transform: rotate(180deg); }
  /* Хрестик лишається: інакше плашку неможливо прибрати зовсім, а вона
     тримається над контентом на кожній сторінці. Каретку відсуваємо
     вліво padding-right, щоб дві тап-зони не накладались. */
  .sticky-close{ top:0; right:0; height:52px; min-height:52px; width:46px; min-width:46px; }
  .sticky-form .sticky-head{ padding-right: 46px; }

  @media (max-width: 700px){
    /* На телефоні плашка на всю ширину, решта поведінки спільна. */
    .sticky-form{ left:14px; right:14px; width:auto; bottom: calc(14px + var(--consent-h, 0px)); }
  }

  /* ---------- Footer ---------- */
  /* ---------- Банер згоди ---------- */
  .consent-bar{ position:fixed; left:0; right:0; bottom:0; z-index: var(--z-modal);
                background:#fff; border-top:1px solid var(--color-border);
                box-shadow: 0 -8px 28px rgba(16,26,38,.16); }
  .consent-bar[hidden]{ display:none; }
  .cb-inner{ max-width:1180px; margin:0 auto; padding:16px 20px;
             display:flex; align-items:center; gap:22px; }
  .cb-text{ margin:0; font-size:.84rem; line-height:1.6; color: var(--color-text-secondary); }
  .cb-text b{ color: var(--color-text); }
  .cb-actions{ display:flex; gap:10px; flex:none; }
  .cb-actions .btn{ min-height:44px; white-space:nowrap; }
  @media (max-width: 760px){
    .cb-inner{ flex-direction:column; align-items:stretch; gap:14px; padding:14px 16px; }
    .cb-text{ font-size:.78rem; max-height:38vh; overflow-y:auto; }
    .cb-actions{ display:grid; grid-template-columns:1fr 1fr; }
  }
  /* Підпис під заздалегідь проставленою галочкою: людина мусить бачити, ЧОМУ
     вона стоїть, і що її можна зняти. */
  /* padding:0 давав кнопці 20px висоти. Це самостійна кнопка у футері, а не
     посилання всередині речення, тож виняток WCAG 2.5.8 на неї не поширюється:
     добираємо до 26px вертикальним паддингом. */
  .link-btn{ background:none; border:none; padding:3px 0; font:inherit; cursor:pointer;
             display:inline-block; min-height:26px;
             color: rgba(255,255,255,.85); text-decoration:underline; }
  .link-btn:hover{ color:#fff; }
  .consent-remembered{ display:block; margin-top:6px; font-size:.74rem;
                       color: var(--color-text-secondary); }
  .consent-remembered button{ background:none; border:none; padding:0; font:inherit;
                              color: var(--color-blue-dark); text-decoration:underline; cursor:pointer; }

  .site-footer{ background: var(--color-blue-dark); color:#fff; padding: 56px 0 26px; }

  /* ⚠️ БАНЕР ЗГОДИ РОБИВ НИЖНІ 211px ЕКРАНА МЕРТВОЮ ЗОНОЮ. ВИМІРЯНО.
     Скарга власника: «натискаєш на посилання з самого низу, наприклад на
     Thumbtack, і воно не відкривається; коли зажимаєш, щоб відкрити в
     іншому вікні, тоді відкривається».

     Причина не в посиланні. Банер згоди це position:fixed; bottom:0 із
     z-index 200 і висотою 211px на 375px. Він накриває нижню смугу екрана,
     і будь-яке посилання підвалу, яке в мить тапу опинилось у цій смузі,
     отримує не тап, а банер. Перевірено elementFromPoint по тому самому
     посиланню на різній прокрутці:

        посилання на y=774  ->  влучає в BUTTON.btn btn-primary (банер)
        посилання на y=684  ->  влучає в P.cb-text  (банер)
        посилання на y=584  ->  влучає в саме посилання ✓

     Довге натискання «спрацьовувало» тому, що контекстне меню відкривалось
     тоді, коли палець був трохи вище смуги.

     ⚠️ ЧОМУ ЦЬОГО НЕ БУЛО ВИДНО РАНІШЕ. Змінна --consent-h у темі вже є, і
     її враховують .wiz-nav, .calc-panel, .sticky-form, .back-to-top - усе це
     ФІКСОВАНІ елементи. А звичайному вмісту сторінки клиренсу ніхто не дав:
     документ просто закінчувався під банером. Тому й ламався лише підвал. */
  .has-consent-bar .site-footer{ padding-bottom: calc(26px + var(--consent-h, 0px)); }
  /* Колонок було чотири, а з появою "Prices & Tools" їх стало пʼять - пʼята
     падала в другий ряд сама, і пів підвала стояло порожнім. */
  .footer-grid{ display:grid; grid-template-columns: 1.4fr repeat(4, 1fr); gap:32px; }
    /* ⚠️ БУЛО h4. Тег змінено на h2, бо h2 -> h4 у підвалі пропускав рівень
     на всіх 38 сторінках (WCAG 1.3.1). Дві властивості нижче повертають
     рівно те, що тегові h4 давав браузер, - інакше зміна семантики
     потягла б за собою зсув макета:
       margin-top  1.33em = 19.58px (дефолт h4)
       line-height 1.55   = 22.82px (h4 успадковував від body; базове
                                     правило h1,h2,h3 дає 1.2)
     Виміряно до і після: висота підвалу 936px в обох випадках. */
  .footer-col h2{ color:#fff; font-size:.92rem; letter-spacing:.02em;
                margin: 1.33em 0 16px; line-height: 1.55; }
  .footer-col ul{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:10px; }
  .footer-col a{ color: rgba(255,255,255,.85); font-size:.92rem; }
  .footer-col a:hover{ color:#fff; }
  .footer-brand{ display:flex; align-items:center; gap:10px; font-weight:700; font-size:1.15rem; margin-bottom:14px; color:#fff; }
  .footer-brand .logo-mark{ background:#fff; color: var(--color-blue-dark); }
  .footer-col p{ color: rgba(255,255,255,.78); font-size:.9rem; }
  .footer-social{ display:flex; gap:12px; margin-top: 16px; }
  .footer-social a{
    width:36px; height:36px; border-radius:8px; background: rgba(255,255,255,.12);
    display:flex; align-items:center; justify-content:center;
  }
  .footer-profiles{ margin:16px 0 14px; display:flex; flex-wrap:wrap; align-items:center; gap:10px 16px; }
  .footer-profiles .fp-label{ color: rgba(255,255,255,.75); font-size:.82rem; width:100%; }
  .footer-profiles a{ color:#fff; font-size:.9rem; font-weight:600;
                      display:inline-flex; align-items:center; gap:7px; min-height:32px; }
  .footer-profiles a .brand-ico{ width:1.05rem; height:1.05rem; flex:none; }
  /* SVG-іконки Thumbtack і HomeAdvisor стоять на місці шрифтових: та сама
     ширина колонки, щоб підписи вишикувались в одну лінію з рештою. */
  .footer-profiles a .fp-ico{ flex:none; width:1.1em; height:1.1em; }
  /* Тап-зони: посилання у футері були 17-32px заввишки. Бриф вимагає мінімум 44px
     для клікабельних елементів, і на телефоні це відчутно - списки у футері
     найчастіше тиснуть саме там. */
  .footer-profiles a{ min-height:44px; }
  /* 44px на кожному пункті розганяли колонку так, що сім посилань займали пів
     екрана. 44px потрібні пальцю, а не мишці: лишаємо їх на телефоні, на десктопі
     беремо 30px - це вище за мінімальні 24px (WCAG 2.5.8) і вдвічі щільніше. */
  .footer-col ul{ gap:4px; }
  .footer-col ul a{ display:inline-flex; align-items:center; min-height:30px; }
  .footer-bottom a{ display:inline-flex; align-items:center; min-height:44px; }
  /* Браузер малює <address> курсивом - знімаємо, вигляд має лишитись той самий. */
  address{ font-style:normal; }
  .site-footer address{ color: rgba(255,255,255,.78); font-size:.9rem; margin-bottom:1em; }
  .footer-area{ border-top:1px solid rgba(255,255,255,.16); margin-top:36px; padding-top:22px; }
  .footer-area h2{ color:#fff; font-size:.92rem; letter-spacing:.02em; margin-bottom:10px; line-height:1.55; }
  .footer-area p{ color: rgba(255,255,255,.78); font-size:.88rem; line-height:1.75; margin:0; }
  .footer-area b{ color:#fff; font-weight:700; }
  /* Service Area: було 21 місто суцільним абзацом без жодного посилання.
     Тепер три колонки за округами, кожне місто клікабельне. */
  .fa-head{ display:flex; align-items:baseline; justify-content:space-between; gap:16px;
            flex-wrap:wrap; margin-bottom:16px; }
  .fa-head h2{ margin:0; }
  .fa-all{ color: var(--color-orange-light); font-size:.88rem; font-weight:600;
           text-decoration:underline; text-underline-offset:3px;
           display:inline-flex; align-items:center; min-height:26px; }
  .fa-all:hover{ color:#fff; }
  .fa-grid{ display:grid; grid-template-columns: repeat(auto-fit, minmax(230px,1fr)); gap:18px 28px; }
  .fa-county h3{ margin:0 0 6px; line-height:1.55; font-size:.82rem; font-weight:700; letter-spacing:.06em;
                 text-transform:uppercase; color:#fff; display:flex; align-items:center; gap:8px; }
  .fa-count{ font-size:.72rem; font-weight:600; letter-spacing:0; padding:1px 7px;
             border-radius:999px; background: rgba(255,255,255,.16); }
  /* Міста списком через кому давали посилання заввишки 17px. Формально виняток
     WCAG 2.5.8 ("посилання всередині тексту") сюди можна натягнути, але це
     перелік для тицяння пальцем, а не речення. Тому чипи з реальною зоною 28px. */
  .fa-cities{ list-style:none; margin:0; padding:0; display:flex; flex-wrap:wrap; gap:6px; }
  /* ══════════════════════════════════════════════════════════════════
     ПІДВАЛ-АКОРДЕОН НА ТЕЛЕФОНІ

     ⚠️ ПРИЧИНА - ВИМІРЯНА, А НЕ «ВИГЛЯДАЄ ДОВГО».
     На 375×812 підвал займав 3 008px, тобто 3,7 екрана телефона. На
     коротких сторінках це 43% усієї сторінки (/terms/), на /licensing/ -
     31%. У HTML це 28% ваги сторінки і 69 посилань зі 134.

     ⚠️ ЗГОРТАЄМО, А НЕ ВИДАЛЯЄМО. Вміст <details> лишається в HTML і
     індексується нарівні зі звичайним - Google це прямо підтвердив для
     mobile-first. Тобто власник отримує короткий підвал, а пошуковик і
     ШІ-помічники бачать рівно те саме, що бачили.

     ⚠️ open СТОЇТЬ У РОЗМІТЦІ. Без JS підвал розгорнутий, як і був: якщо
     скрипт не завантажиться, людина нічого не втратить. Закриває його на
     телефоні app.js, і лише при зміні точки зламу, а не на кожен resize -
     інакше розгорнуте людиною закривалось би від повороту екрана.
     ══════════════════════════════════════════════════════════════════ */

  /* Десктоп: <details> не має виглядати чи поводитись як розкривачка. */
  .site-footer summary{ list-style:none; cursor:default; }
  .site-footer summary::-webkit-details-marker{ display:none; }
  .site-footer summary::marker{ content:none; }
  .footer-col > summary{ pointer-events:none; }
  .fa-details > summary{ display:none; }

  /* ⚠️ ЧІП ТЕПЕР НА <li>, А НЕ НА <a>. 19.09.2026 міста перестали бути
     посиланнями: 21 посилання з ключовим якорем на ОДНУ адресу /locations/,
     повторене на кожній сторінці. Вигляд чіпа лишається - він і був про
     читабельність переліку, а не про клікабельність. Прибрано min-height 28px
     і hover: у тексту, який нікуди не веде, не має бути ні зони натискання,
     ні реакції на наведення - інакше людина тицятиме і нічого не станеться. */
  .fa-cities li{ display:inline-flex; align-items:center; padding:4px 10px;
                 border-radius:999px; background: rgba(255,255,255,.1);
                 color: rgba(255,255,255,.9); font-size:.84rem; }
  /* .footer-area p{ margin:0 } має вищу специфічність (0,1,1) за .fa-note (0,1,0),
     тому верхній відступ мовчки обнулявся, і роздільна лінія лягала впритул на
     останній чіп міста (виміряно: зазор 0px під «Kenmore»). Піднімаємо селектор. */
  .footer-area .fa-note{ margin:24px 0 0; padding-top:16px;
                         border-top:1px solid rgba(255,255,255,.14); }
  .fa-note a{ color:#fff; text-decoration:underline; text-underline-offset:3px; }

  /* Кейс описував роботу, але не називав ні виконавця, ні послугу: імена звучали
     лише всередині цитати, звичайним текстом, а посилання не було жодного. */
  .case-meta{ margin:14px 0 10px; padding-top:12px; border-top:1px solid var(--color-border);
              display:flex; flex-direction:column; gap:6px; }
  .cm-row{ display:flex; gap:10px; align-items:baseline; font-size:.84rem; }
  .cm-label{ flex:none; min-width:76px; font-weight:700; letter-spacing:.04em;
             text-transform:uppercase; font-size:.7rem; color: var(--color-text-secondary); }
  .cm-val{ color: var(--color-text); }
  /* Посилання в рядку кейса заповнюють свій span цілком, тож виняток "inline у
     реченні" на них не поширюється: добираємо висоту до 24px паддингом. */
  .cm-val a{ color: var(--color-blue-dark); text-decoration:underline; text-underline-offset:2px;
             display:inline-block; padding:4px 2px; margin:-4px 0; }
  .cm-row{ align-items:center; }
  .logo{ min-height:44px; }
  .header-phone{ min-height:44px; }
  .footer-profiles a:hover{ color: var(--color-orange-light); text-decoration:underline;
                            text-underline-offset:3px; }

  /* Телефон у футері: іконка з підписом, а не сама по собі (бриф розд. 1). */
  .footer-social a{ display:inline-flex; align-items:center; gap:8px; width:auto; min-height:44px;
                    padding:10px 14px; border-radius:var(--radius-button); font-size:.9rem; font-weight:600; }

  .footer-bottom{
    margin-top: 44px; padding-top: 22px; border-top: 1px solid rgba(255,255,255,.18);
    display:flex; justify-content:space-between; flex-wrap:wrap; gap:10px;
    font-size:.82rem; color: rgba(255,255,255,.7);
  }
  .footer-bottom a{ color: rgba(255,255,255,.7); }
  @media (max-width: 900px){
    .footer-grid{ grid-template-columns: 1fr 1fr; gap:26px; }
    /* Телефон: заголовок колонки стає рядком-розкривачкою на всю ширину. */
    .footer-grid{ grid-template-columns: 1fr; gap:0; }
    .footer-col{ border-bottom:1px solid rgba(255,255,255,.14); }
    .footer-col:first-child{ border-bottom:0; padding-bottom:8px; }
    .footer-col > summary{
      pointer-events:auto; cursor:pointer;
      display:flex; align-items:center; justify-content:space-between;
      min-height:52px; gap:12px;
    }
    .footer-col > summary h2{ margin:0; }
    /* Стрілка малюється CSS: свого SVG в розмітці підвалу немає, а тягти
       його в 4 місця заради 8 пікселів не варто. */
    .footer-col > summary::after{
      content:''; width:9px; height:9px; flex:none; margin-right:2px;
      border-right:2px solid rgba(255,255,255,.75);
      border-bottom:2px solid rgba(255,255,255,.75);
      transform: rotate(45deg) translate(-2px,-2px);
      transition: transform .18s ease;
    }
    .footer-col[open] > summary::after{ transform: rotate(-135deg) translate(-2px,-2px); }
    .footer-col > ul{ padding-bottom:14px; }

    .fa-details > summary{
      display:flex; align-items:center; justify-content:space-between;
      min-height:52px; cursor:pointer; gap:12px;
      color: rgba(255,255,255,.85); font-size:.9rem;
    }
    .fa-details > summary::after{
      content:''; width:9px; height:9px; flex:none; margin-right:2px;
      border-right:2px solid rgba(255,255,255,.75);
      border-bottom:2px solid rgba(255,255,255,.75);
      transform: rotate(45deg) translate(-2px,-2px);
      transition: transform .18s ease;
    }
    .fa-details[open] > summary::after{ transform: rotate(-135deg) translate(-2px,-2px); }

    .footer-col ul{ gap:8px; }
    .footer-col ul a{ min-height:44px; }
  }
  @media (max-width: 560px){ .footer-grid{ grid-template-columns: 1fr; } }
  /* Плашка прототипу. margin-left:auto штовхав URL вправо,

  і на 320px найдовша
     адреса (/services/maintenance/) вилазила за контейнер на 2px{ display:flex; align-items:center; gap:16px; flex-wrap:wrap; }

  /* Було repeat(4, 1fr): три картки лишали порожньою четверту колонку і тулились
     ліворуч, а ряд виглядав обірваним. Тепер колонка має стелю, а сам ряд
     центрується - будь-яка кількість карток стоїть рівно посередині. */
  .related-grid{ display:grid; grid-template-columns: repeat(auto-fit, minmax(200px, 260px));
                 justify-content:center; gap:16px; margin-top:40px; }
  /* Прев'ю 40x40 було фальшивою обіцянкою: на такому розмірі фото обладнання
     не читається взагалі - пічку від зовнішнього блоку не відрізнити. Решта
     плейсхолдерів на сайті мають коротшу сторону 120-380px, цей випадав утричі.
     Тепер це картка того самого сімейства: смуга 16:9 зверху, назва під нею. */
  .related-card{ background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-card);
                 padding:0; overflow:hidden; font-weight:600; font-size:.95rem;
                 box-shadow: var(--shadow-card); display:flex; flex-direction:column;
                 transition: box-shadow .15s ease, transform .15s ease, border-color .15s ease; }
  .related-card:hover{ box-shadow: var(--shadow-card-hover); transform: translateY(-2px); color: var(--color-blue-dark); }
  @media (max-width: 900px){ .related-grid{ grid-template-columns: 1fr 1fr; } }
  @media (max-width: 560px){ .related-grid{ grid-template-columns: 1fr; } }

  /* ---------- Back to top ---------- */
  .back-to-top{
    position: fixed; left: 20px; bottom: 20px; z-index: var(--z-back-to-top);
    width:44px; height:44px; border-radius:50%; background: var(--color-blue);
    color:#fff; border:none; display:flex; align-items:center; justify-content:center;
    cursor:pointer; box-shadow: var(--shadow-card); opacity:0; pointer-events:none;
    transition: opacity .2s ease;
  }
  .back-to-top.visible{ opacity:1; pointer-events:auto; }

  @media (prefers-reduced-motion: reduce){
    html{ scroll-behavior:auto; }
    .service-card, .back-to-top, .related-card, .skip-link{ transition:none; }
    /* Swiper ставить transition-duration інлайном, інакше перебити не виходить. */
    .swiper-wrapper{ transition-duration: 0ms !important; }
  }
  /* ══════════════════════════════════════════════════════════════════════════
   ДОДАНО ПРИ ПЕРЕНЕСЕННІ У WORDPRESS
   ══════════════════════════════════════════════════════════════════════════ */

/* Honeypot. Ховаємо ЗСУВОМ, а не display:none і не hidden: частина ботів
   пропускає приховані поля, і пастка перестає працювати. Для клавіатури поле
   недосяжне через tabindex="-1", для дикторки - через aria-hidden. */
.hp-field{
  position:absolute; left:-9999px; top:auto; width:1px; height:1px;
  overflow:hidden;
}

/* Помилка відправки. Заявка не пішла - мовчати не можна: людина має знати,
   що її не почули, і мати другий шлях (телефон). */
.form-error{
  margin:0 0 14px; padding:12px 14px; border-radius:10px;
  background:var(--color-warning-bg); border:1px solid var(--color-warning);
  color:var(--color-text); font-size:.9rem; line-height:1.55;
}
.form-error a{ color:var(--color-blue-dark); font-weight:700; }

/* Реальні фото, які підставляє ACF замість мальованих заглушок. */
.eh-photo{ display:block; width:100%; height:100%; object-fit:cover; }
.photo-slot:has(.eh-photo), .person-photo:has(.eh-photo){ padding:0; border:0; background:none; }

/* Картинка-логотип, коли її задано в upcheg-schema (інакше лишається
   намальована CSS-літера .logo-mark).

   ⚠️ Висоту ЗАДАЄМО, ширину лишаємо auto. Логотипи бувають і квадратні, і
   витягнуті; зафіксувавши обидва розміри, ми б розтягнули чужу картинку.
   Висота збігається з .logo-mark (38px, на вузьких - 32px), щоб шапка не
   змінювала висоту залежно від того, задано логотип чи ні.

   ⚠️ max-width потрібен окремо: .logo має white-space:nowrap, і надто
   широкий логотип виштовхнув би навігацію за межі контейнера. */
.logo-img{ display:block; height:38px; width:auto; max-width:220px; object-fit:contain; }
.footer-logo-img{ display:block; height:38px; width:auto; max-width:220px; object-fit:contain; }

@media (max-width: 900px){
  .logo-img{ height:32px; max-width:170px; }
}

/* ══════════════════════════ ДРУК ══════════════════════════
   На сайті 23 цінові таблиці, і підрядник, який лишає клієнту роздруківку
   прайсу, - цілком реальний сценарій. У прототипі @media print не було
   зовсім: друкувались і шапка, і sticky-форма, і модалки.

   Друкуємо контент. Прибираємо все, що на папері не діє: навігацію, плаваючі
   віджети, кнопки. Адреси зовнішніх посилань розкриваємо - на папері клікнути
   не можна, а знати, куди воно вело, корисно. */
/* ─────────── ПАНЕЛЬ РЕЗУЛЬТАТУ ЯК ВІКНО (від 1001px) ───────────
   До 1000px панель це шторка знизу - її стилі лишились у медіа-запиті вище.
   Тут та сама панель і той самий клас .is-open виводять її вперед вікном:
   на десктопі кнопка «See my price» раніше не давала жодної видимої події,
   бо панель і без того висіла збоку.

   ⚠️ Це ТА САМА панель, а не копія. Другий блок із тим самим переліком
   позицій розійшовся б з оригіналом на першій же правці тексту. */
@media (min-width: 1001px){

  /* Підкладка. Окремим псевдоелементом на body, бо ::before самої панелі
     лишився б усередині її стекового контексту і не накрив би сторінку. */
  html.calc-panel-open body::before{
    content:""; position:fixed; inset:0; z-index: 199;
    background: rgba(12, 28, 46, .55);
  }

  .calc-panel.is-open{
    position: fixed; top:50%; left:50%; transform: translate(-50%, -50%);
    width: min(560px, 92vw); max-height: 88vh; overflow-y: auto;
    z-index: var(--z-modal);
    box-shadow: 0 24px 64px rgba(0,0,0,.4);
  }

  /* Заголовок стає рядком: назва ліворуч, хрестик праворуч. */
  .calc-panel.is-open .cp-bar{ display:flex; align-items:center; gap:12px; }
  .calc-panel.is-open .cp-head{ flex:1 1 auto; text-align:left; cursor:pointer; }
  .calc-panel.is-open .cp-caret{ display:none; }
  .calc-panel.is-open .cp-cta{ display:none; }

  .calc-panel.is-open .cp-close{
    display:block; flex:none; width:36px; height:36px; line-height:1;
    font-size:1.5rem; border:0; border-radius:8px; cursor:pointer;
    background: rgba(255,255,255,.14); color:#fff;
  }
  .calc-panel.is-open .cp-close:hover{ background: rgba(255,255,255,.26); }
}

@media print{
  .site-header, .sticky-form, .back-to-top, .calc-modal,
  .nav-toggle, .header-cta, .consent-banner,
  .swiper-button-next, .swiper-button-prev, .swiper-pagination,
  .section-cta, .hero-actions, .skip-link{ display:none !important; }

  body{ background:#fff; color:#000; font-size:11pt; }
  .section{ padding:16pt 0; }
  .container{ max-width:none; padding:0; }

  /* Слайдер на папері - це один екран із трьох карток; показуємо всі. */
  .swiper, .swiper-wrapper{ display:block !important; transform:none !important; }
  .swiper-slide{ display:block !important; width:auto !important; page-break-inside:avoid; }

  /* Розгорнуті відповіді: згорнутий акордеон на папері - порожнє місце. */
  details{ display:block; }
  details > summary{ list-style:none; font-weight:700; }
  details > summary::after{ content:none; }
  details:not([open]) > *:not(summary){ display:block; }

  table, .price-table-wrap{ page-break-inside:avoid; overflow:visible !important; }
  h1, h2, h3{ page-break-after:avoid; }
  img{ page-break-inside:avoid; max-width:100% !important; }

  a[href^="http"]::after{ content:" (" attr(href) ")"; font-size:9pt; color:#444; }
  a[href^="/"]::after, a[href^="#"]::after, a[href^="tel:"]::after, a[href^="mailto:"]::after{ content:none; }
}
