  /* ===== Menubar (общий, настоящий fixed — НЕ часть #stage) =====
     Реальные пиксели, не масштабируется вместе со сценой. Всегда прижато
     к истинному верху экрана, во всю ширину — как на referens-сайте. */
  .menubar{
    position:fixed; left:0; top:0; width:100%; height:var(--header-h);
    z-index:100;
  }
  /* Градиентное ("прогрессивное") размытие — как в последних версиях iOS
     (Liquid Glass): сильный блюр у самого верха экрана, плавно уходящий в 0
     к нижнему краю хедера, БЕЗ шва на границе. Один backdrop-filter с
     фиксированным радиусом так не умеет (CSS не поддерживает переменный по
     пространству blur внутри одного filter) — стандартный приём: несколько
     наложенных слоёв с РАЗНЫМ backdrop-filter:blur(), каждый замаскирован
     mask-image (linear-gradient чёрный→прозрачный) так, чтобы затухать на
     своей глубине. У самого верха (0%) все 5 слоёв непрозрачны разом — их
     blur складывается (backdrop-filter каждого следующего слоя размывает уже
     размытый результат слоёв под ним) → там, где нужно, самый сильный блюр.
     Дальше вниз слои гаснут ОДИН ЗА ДРУГИМ, начиная с самого сильного (blur
     18px гаснет первым, к 38% высоты) и заканчивая самым слабым (blur 1.5px,
     держится дольше всех, гаснет только к 100% = нижнему краю хедера) — так
     эффективный блюр не обрывается скачком, а тает почти незаметными
     ступеньками, сливающимися в глазах в плавный градиент. Проценты — от
     высоты .menubar (var(--header-h)), не экрана. pointer-events:none — эти
     слои чисто визуальные, не должны перехватывать клики по .logo/.menu
     (те лежат ПОСЛЕ в разметке — рисуются поверх стека автоматически, без
     доп. z-index). */
  .menubar-tint,
  .menubar-blur-layer{ position:absolute; inset:0; pointer-events:none; }
  /* Цветная подложка — просто CSS-градиент (у него плавность "бесплатная",
     трюк с несколькими слоями тут не нужен): насыщенный жёлтый у верха,
     полностью прозрачный к низу хедера — тон должен уйти в 0 ровно там же,
     где и блюр, иначе шов всё равно будет заметен по цвету. */
  .menubar-tint{
    background:linear-gradient(to bottom, rgba(255,227,0,0.92) 0%, rgba(255,227,0,0.8) 40%, rgba(255,227,0,0) 100%);
  }
  /* Явные модификаторы (--1…--5), не nth-child — порядок в CSS не обязан
     совпадать с порядком в разметке, меньше шансов сломать при правках. */
  .menubar-blur-layer--1{
    backdrop-filter:blur(18px); -webkit-backdrop-filter:blur(18px);
    -webkit-mask-image:linear-gradient(to bottom, #000 0%, #000 5%, transparent 38%);
    mask-image:linear-gradient(to bottom, #000 0%, #000 5%, transparent 38%);
  }
  .menubar-blur-layer--2{
    backdrop-filter:blur(10px); -webkit-backdrop-filter:blur(10px);
    -webkit-mask-image:linear-gradient(to bottom, #000 0%, #000 5%, transparent 55%);
    mask-image:linear-gradient(to bottom, #000 0%, #000 5%, transparent 55%);
  }
  .menubar-blur-layer--3{
    backdrop-filter:blur(6px); -webkit-backdrop-filter:blur(6px);
    -webkit-mask-image:linear-gradient(to bottom, #000 0%, #000 5%, transparent 70%);
    mask-image:linear-gradient(to bottom, #000 0%, #000 5%, transparent 70%);
  }
  .menubar-blur-layer--4{
    backdrop-filter:blur(3px); -webkit-backdrop-filter:blur(3px);
    -webkit-mask-image:linear-gradient(to bottom, #000 0%, #000 5%, transparent 85%);
    mask-image:linear-gradient(to bottom, #000 0%, #000 5%, transparent 85%);
  }
  .menubar-blur-layer--5{
    backdrop-filter:blur(1.5px); -webkit-backdrop-filter:blur(1.5px);
    -webkit-mask-image:linear-gradient(to bottom, #000 0%, #000 5%, transparent 100%);
    mask-image:linear-gradient(to bottom, #000 0%, #000 5%, transparent 100%);
  }
  /* Лого — 72×59, тот же файл (images/logo-header.svg) и aspect ratio (1.22)
     — просто CSS-масштаб побольше (Figma 2898:4306, 72×59 внутри Menubar). */
  .logo{ position:absolute; left:28px; top:50%; transform:translateY(-50%); width:72px; height:59px; display:block; cursor:pointer; }
  /* Меню центрируется НЕ по экрану, а по свободному месту между лого и кнопкой
     «Демонстрация» — правка 2026-08-05 по замечанию пользователя «справа меню
     прилипает к кнопке, хотя слева есть расстояние».
     Причина асимметрии арифметическая: слева занято 100px (28 отступ + 72
     лого), справа — около 195 (кнопка ~167 + 28), то есть центр свободной зоны
     смещён относительно центра экрана почти на 50px. Пока окно широкое, это
     незаметно, а на 1026px (граница, где gap между пунктами уже сжат в ноль)
     замерено: слева 74px воздуха, справа −20px, то есть «Контакты» уезжали ПОД
     кнопку. Сдвигаем ряд на половину разницы занятых зон — тогда воздух
     распределяется поровну сам, на любой ширине. Величина в переменной, потому
     что зависит от ширины кнопки: поменяется её текст — поменять и здесь. */
  .menubar{ --menu-side-shift: 47px; }
  /* gap — .menubar живёт в РЕАЛЬНЫХ px (не масштабируется вместе со сценой,
     см. комментарий у .menubar выше) — на 1440px+ (ширина, под которую всё
     рассчитано) 24px между пунктами помещаются свободно, но при сужении окна
     вниз к 1024px (граница, ниже которой .menubar вообще скрывается — см.
     @media (max-width:1023px) выше, дальше идёт .menubar-tablet) реальная
     ширина хедера начинает не хватать и пункты меню наезжают на кнопку
     "Демонстрация". Вместо фиксированных 24px — плавно сужающийся gap: 24px
     на 1440px и шире, линейно падает до 0px точно на 1024px (сам "пол", ниже
     которого меню всё равно исчезает), не меньше 0 и не больше 24 за
     пределами этого диапазона (clamp). calc(5.7692vw - 59.0769px) — линейная
     интерполяция между двумя точками (1024px→0, 1440px→24): наклон
     24/(1440-1024)=24/416px, переведённый в vw (100vw = ширина окна) даёт
     коэффициент 5.7692vw, свободный член подобран так, чтобы при 1024px
     формула давала ровно 0. */
  .menu{
    position:absolute; left:calc(50% - var(--menu-side-shift, 0px)); top:50%;
    transform:translate(-50%,-50%);
    display:flex; gap:clamp(0px, calc(5.7692vw - 59.0769px), 24px); margin:0; padding:0; list-style:none;
    font-family:'Source Sans Pro',sans-serif; font-weight:600;
    font-size:16px; letter-spacing:0.5714px; text-transform:uppercase;
    color:var(--ink); white-space:nowrap;
  }
  /* Состояния пунктов меню (Figma 2898:4297, пункты 2898:5399/normal,
     2898:4309/active, 2898:5412/hover): normal — просто текст без рамки;
     hover (:hover, чистый CSS — обычный курсорный ховер, JS не нужен) —
     пунктирная обводка-пилюля; active (.is-active, ставится из
     js/nav-menu.js по текущей группе слайдов) — сплошная обводка-пилюля +
     маленький треугольник-указатель снизу. border зарезервирован как 2px
     transparent у ВСЕХ пунктов (box-sizing:border-box) — иначе смена
     border-width между состояниями (0 → 1px dashed → 2px solid) на 1-2px
     сдвигала бы текст внутри пилюли при наведении/переключении.

     Толщина hover-пунктира — РОВНО 1px (правка пользователя 2026-08-05): в коде
     стояло 2px, как у active, и пунктир читался жирнее, чем в макете.

     ...И ИМЕННО ПОЭТОМУ РАМКА ЖИВЁТ НА ::before, А НЕ НА САМОМ li.
     box-sizing:border-box держит внешний размер только когда он ЗАДАН явно, а у
     этих пилюль ширина определяется контентом — значит border входит в неё
     слагаемым. Пока hover и active были одинаковой толщины, это ничего не
     меняло, а стоило сделать пунктир тоньше на 1px — ширина пункта под курсором
     стала меньше на 2px, и весь ряд дёргался при каждом наведении (поймано
     пользователем сразу же). Псевдоэлемент лежит поверх, в раскладке не
     участвует вовсе, и толщина рамки больше ни на что не влияет.
     padding вырос 16 → 18, чтобы забрать те самые 2px, которые раньше давал
     зарезервированный border. */
  .menu li{
    position:relative; box-sizing:border-box;
    display:flex; align-items:center; justify-content:center;
    height:40px; padding:0 18px; border-radius:100px; cursor:pointer;
  }
  /* Текст пункта лежит внутри настоящей <button> — иначе меню недоступно с
     клавиатуры (правка 2026-08-08, см. комментарий в разметке). Кнопка не
     должна принести с собой НИ ОДНОГО своего стиля, иначе поедет раскладка:
     у неё свои шрифт, отступы, рамка, фон, курсор и выравнивание текста.
     Снимаем всё поимённо, а не через `all:unset` — тот заодно снял бы
     наследование font/color и сбросил бы саму кнопку в inline, что уже
     влияет на флекс-раскладку <li>.
     display:contents НЕ подходит: элемент с ним исчезает из раскладки, но
     вместе с ним из некоторых движков исчезает и его роль кнопки. */
  .menu li > button{
    appearance:none; -webkit-appearance:none;
    margin:0; padding:0; border:0; background:none;
    font:inherit; color:inherit; letter-spacing:inherit; text-transform:inherit;
    line-height:inherit; text-align:inherit; white-space:inherit;
    cursor:pointer;
  }
  .menu li::before{
    content:''; position:absolute; inset:0; border-radius:100px;
    border:2px solid transparent; pointer-events:none;
  }
  .menu li.is-active::before{ border:2px solid var(--ink); }
  /* Пунктирная рамка наведения — ОДНА на всё меню, переезжает между пунктами
     (просьба пользователя: «может, получится сделать, чтобы рамка перетекала от
     одного к другому»). Отдельный элемент, а не :hover у каждого пункта: между
     разными элементами анимировать нечего, CSS-переход возможен только внутри
     одного. Элемент создаёт js/nav-menu.js — в <ul> нельзя класть ничего кроме
     <li>, поэтому в разметке его нет.
     Геометрию задаёт JS (left/width в пикселях относительно .menu), переход —
     здесь. transform не годится: пилюля разной ширины, а scaleX растянул бы
     пунктир и скруглённые углы. */
  .menu__pill{
    position:absolute; top:0; height:40px; box-sizing:border-box;
    border:1px dashed var(--ink); border-radius:100px;
    opacity:0; pointer-events:none;
    transition:left 0.28s cubic-bezier(0.4,0,0.2,1),
               width 0.28s cubic-bezier(0.4,0,0.2,1),
               opacity 0.18s ease;
  }
  .menu__pill.is-on{ opacity:1; }
  /* Пока пилюля «летит» от предыдущего пункта, включать её нельзя мгновенно —
     иначе она проявится уже в движении. Появление всегда без перехода позиции,
     см. moveHoverPill() в js/nav-menu.js. */
  .menu__pill.is-instant{ transition:opacity 0.18s ease; }
  /* Треугольник-указатель — чистый CSS (border-trick), без доп. SVG-ассета.
     Координаты подобраны по Figma (узел 2911:1898/2911:1925, компонент
     активного пункта меню, 2907:1071 и 2907:1380) — точные координаты внутри
     40px-пилюли: top:38.5px, width:20.785px (border-left/right 10.3925px),
     height:10.5px (border-top 10.5px) — верхний край заходит на 1.5px за
     нижний край обводки (40−38.5), визуально примыкая к ней.

     ПОПРАВКА 2026-08-05 (36.5 → 38.5): абсолютный потомок отсчитывается от
     PADDING-бокса родителя, а у li раньше был border 2px — то есть фактически
     треугольник стоял на 38.5 от внешнего края. Когда рамка уехала на ::before
     и border с li исчез, padding-бокс совпал с border-боксом, и треугольник
     поднялся ровно на эти 2px — начал выступать за обводку вверх. */
  .menu li.is-active::after{
    content:''; position:absolute; left:50%; top:38.5px; transform:translateX(-50%);
    width:0; height:0;
    border-left:10.3925px solid transparent; border-right:10.3925px solid transparent;
    border-top:10.5px solid var(--ink);
  }
  /* Кнопка «Демонстрация» — симметрична .logo (тот же отступ 28px от
     противоположного края), открывает панель-форму справа (см.
     .demo-panel/js/nav-menu.js). Тот же пилюльный паттерн, что и .btn-demo/
     .demo-cta по всему проекту, просто с жёлтым текстом на чёрном (Figma
     2898:4314/4315/4316) вместо белого. */
  .menu-demo-btn{
    position:absolute; right:28px; top:50%; transform:translateY(-50%);
    display:flex; align-items:center; justify-content:center;
    height:40px; padding:0 20px; border:none; border-radius:26px;
    background:var(--ink); color:var(--yellow); cursor:pointer;
    font-family:'Source Sans Pro',sans-serif; font-weight:600; font-size:16px;
    letter-spacing:0.7143px; text-transform:uppercase; white-space:nowrap;
  }

  /* ===== Тёмная тема шапки на слайде Cost (Figma 2829:4460, "Menubar" внутри
     Cost, 2907:1380) =====
     ВАЖНО: только слайд Cost (#slide-3, index 2) реально чёрный — Solution
     (#slide-4, index 3, та же группа меню "Вызовы гостиницам") ЖЁЛТЫЙ (см.
     комментарий у #slide-4 в css/slide3-cost.css), поэтому переключатель
     ниже завязан на ИНДЕКС слайда (2), а не на группу меню целиком
     (js/nav-menu.js, poll()). Сравнение figma 2907:1071 (обычный, жёлтый
     фон) и 2907:1380 (Cost) — текст пунктов/обводки/треугольник #1A1A1C →
     #FFFFFF, кнопка "Демонстрация" bg #1A1A1C/текст #FFE300 → bg #FFE300/
     текст #1A1A1C (чтобы остаться контрастной на тёмном фоне вместо
     жёлтого). Лого — тот же приём, что и обычно (images/logo-header.svg), но
     с подменой src на images/logo-header-dark.svg (см. js/nav-menu.js) — там
     же надпись HOTEL перекрашена в белый (внутри SVG, обычным CSS до
     содержимого <img> не достать). Класс .is-dark ставится JS-ом на
     .menubar. */
  .menubar.is-dark .menu{ color:#fff; }
  .menubar.is-dark .menu__pill{ border-color:#fff; }
  .menubar.is-dark .menu li.is-active::before{ border-color:#fff; }
  .menubar.is-dark .menu li.is-active::after{ border-top-color:#fff; }
  .menubar.is-dark .menu-demo-btn{ background:var(--yellow); color:var(--ink); }
  /* Тот же градиент, что у .menubar-tint (см. её комментарий), просто с
     чёрным вместо жёлтого — "размытие идёт в чёрное" (просьба пользователя). */
  .menubar.is-dark .menubar-tint{
    background:linear-gradient(to bottom, rgba(26,26,28,0.92) 0%, rgba(26,26,28,0.8) 40%, rgba(26,26,28,0) 100%);
  }

