/* «Тамур» — скин по МАКЕТ_ЭТАЛОН.html (этап 5, 30.07.2026).
   ────────────────────────────────────────────────────────────────────────
   В эталоне НЕТ классов: 364 инлайновых стиля. Все цвета, кегли, отступы,
   радиусы и тени перенесены сюда ЧИСЛАМИ из файла эталона, не на глаз.
   Разбор с адресами применения — brand/ТОКЕНЫ.md.

   Мобильный вид (430px) — эталон, значения не менять. Десктоп в эталоне
   отсутствует: раскладка от той же сетки, палитра и кегли те же.

   Шрифты свои (/static/fonts), внешних запросов со страницы нет ни одного. */

/* ═══════════════════════════ шрифты ═══════════════════════════
   Оба семейства ПЕРЕМЕННЫЕ (ось wght) — одно начертание = один файл.
   Поддиапазоны как у эталона: браузер скачивает только нужные.
   Латинские куски урезаны по списку знаков, денежные вынесены отдельно —
   вместе это сняло 70 КБ с первого экрана (МАКЕТ/подготовка_статики.py).
   🔴 ₽ (U+20BD) живёт НЕ в латинице, а в диапазоне денежных знаков. */

@font-face {
  font-family: 'Onest';
  font-style: normal;
  font-weight: 500 700;
  font-display: swap;
  src: url("/static/fonts/onest-cyrillic-ext.woff2") format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
  font-family: 'Onest';
  font-style: normal;
  font-weight: 500 700;
  font-display: swap;
  src: url("/static/fonts/onest-cyrillic.woff2") format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: 'Onest';
  font-style: normal;
  font-weight: 500 700;
  font-display: swap;
  src: url("/static/fonts/onest-latin-ext.woff2") format('woff2');
  unicode-range: U+20A0-20C0;   /* денежные знаки, ради ₽ */
}
@font-face {
  font-family: 'Onest';
  font-style: normal;
  font-weight: 500 700;
  font-display: swap;
  src: url("/static/fonts/onest-latin.woff2") format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400 700;
  font-stretch: 100%;
  font-display: swap;
  src: url("/static/fonts/opensans-cyrillic-ext.woff2") format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400 700;
  font-stretch: 100%;
  font-display: swap;
  src: url("/static/fonts/opensans-cyrillic.woff2") format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400 700;
  font-stretch: 100%;
  font-display: swap;
  src: url("/static/fonts/opensans-latin-ext.woff2") format('woff2');
  unicode-range: U+20A0-20C0;   /* денежные знаки, ради ₽ */
}
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400 700;
  font-stretch: 100%;
  font-display: swap;
  src: url("/static/fonts/opensans-latin.woff2") format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* ═══════════════════════════ токены ═══════════════════════════ */

:root {
  /* Заголовки. Dudka в эталоне объявлена первой, но файла в макете нет —
     весь эталон нарисован Onest. Появится файл — меняется ЭТА строка. */
  --font-head: 'Onest', sans-serif;
  --font-text: 'Open Sans', system-ui, sans-serif;

  --canvas: #EDE7DB;      /* полотно сайта */
  --card: #F7F3EA;        /* карточки и поля поверх полотна */
  --sand: #DFD8C8;        /* подложка вокруг полотна */
  --line: #DCD3C2;        /* границы и разделители */
  --line-cal: #E4DCCB;    /* разделитель внутри карточки календаря */
  --busy: #DED7C7;        /* занятый день, выключенная кнопка */

  --ink: #4D4139;         /* основной текст */
  --ink-2: #5C5045;       /* подписи в полях */
  --ink-3: #6B6055;       /* пояснения */
  --ink-4: #6E6359;       /* приглушённый текст */
  --ink-5: #6F665C;       /* микроподписи заглавными */
  --ink-dark: #38312B;    /* заголовки на светло-зелёном */
  --ink-off: #A79C8D;     /* недоступный день */
  --ink-off-btn: #9F9484; /* текст выключенной кнопки */

  /* 🔴 ДОСТУПНОСТЬ, ПУНКТ 1. СЕМЬ ЦВЕТОВ ПОДНЯТЫ ДО ПОРОГА WCAG 1.4.3 (AA).
     Замер сделан НЕ по файлу стилей, а по живой странице: у каждого текстового
     узла взят его настоящий цвет и настоящий фон (со всеми полупрозрачными
     подложками, что легли между), посчитано отношение по формуле WCAG.
     Норма для обычного текста 4.5, для крупного (24 точки, либо 18.66 жирным) —
     3.0. Числа «было -> стало» в ОТЧЁТ_ДОСТУПНОСТЬ.md, счёт — kontrast.py.

         --ink-4      #7A6E63 -> #6E6359   4.02 -> 4.75  (13 точек на полотне)
         --ink-5      #8B8073 -> #6F665C   3.14 -> 4.57  (12 точек, ЗАГЛАВНЫМИ)
         --green-ink  #3F4A3F -> #2D352D   3.39 -> 4.62  (надзаголовки на зелёном)
         --on-dark-3  #9AA098 -> #A0A69D   4.42 -> 4.75  (мелкое на графите)
         --on-dark-5  #93958E -> #A1A39B   3.90 -> 4.63  (реквизиты в подвале)
         --on-dark-6  #7F857E -> #9BA39A   3.13 -> 4.56  (надзаголовок подвала)
         --on-terra-2 #EAE0D6 -> #EEE4D9   4.38 -> 4.55  (текст на терракоте)

     🔴 ГАММА НЕ МЕНЯЛАСЬ, И ЭТО ПРОВЕРЯЕМО. Каждый цвет умножен по каналам
     на один множитель — тон остался прежним, изменилась только светлота,
     и ровно настолько, чтобы перешагнуть порог. Ни одного нового оттенка
     на сайт не заведено.

     🔴 ЧЕМ ЗА ЭТО ЗАПЛАЧЕНО, СКАЗАНО ПРЯМО. Лестница приглушённых
     («ink-3 светлее ink-4 светлее ink-5») внизу схлопывается: порог 4.5
     на полотне --canvas начинается чуть светлее, чем стоит --ink-3, —
     то есть почти вплотную к нему. Трём ступеням остаётся зазор в 0.4 единицы
     контраста: 4.97 / 4.75 / 4.57. Порядок сохранён, глазами ступени
     почти не различить. Так же схлопнулись --green-ink и --green-ink-2
     (4.62 против 4.48): их разводит не цвет, а кегль — 12 точек ЗАГЛАВНЫМИ
     против 29. Это не оплошность, а цена порога: три оттенка одного
     назначения в него не помещаются.

     🔴 --on-dark-5 НАЙДЕН ЧТЕНИЕМ КОДА, А НЕ НА ЭКРАНЕ. Он красит
     .foot__legal, а внутри неё показывается запись в реестре — блока
     .foot__reestr на живой странице нет вовсе: владелец номер не заполнил.
     Появится номер — появился бы и провал 3.90. Правлено вперёд.

     🔴 --ink-off (#A79C8D, цифра недоступного дня) НЕ ТРОНУТ, и это
     решение. Против карточки #F7F3EA он даёт 2.44 при норме 4.5 — но WCAG
     1.4.3 выводит из-под нормы текст ВЫКЛЮЧЕННОГО управления, а прошедшие
     дни и есть выключенные (aria-disabled="true", у стрелки — disabled).
     Подними мы их до 4.5 — недоступный день стал бы неотличим от
     доступного, то есть починка сломала бы то, ради чего цвет заведён.
     Замер записан в отчёт как есть, вместе с этим доводом. */

  /* 🔴 НАХОДКА ГЛАЗ Г-1. Высота липкой полосы объявлена ОДИН раз и здесь.
     Полоса лежит поверх страницы (position: fixed) и закрывает собой нижние
     точки экрана. Ровно на столько же страница обязана быть длиннее — иначе
     последняя строка любого блока и конец страницы всегда под полосой.
     Замер штаба 10.08: 72 точки, и они были закрыты на ВСЕЙ странице.

     Два места — высота полосы и отступ страницы — обязаны считаться от одного
     числа. Разъедутся они молча: полосу сделают выше, отступ останется
     прежним, и беда вернётся ровно в том же виде. */
  --sticky-knopka: 58px;  /* сама кнопка */
  --sticky-podval: 14px;  /* отступ под ней */
  --sticky-h: calc(var(--sticky-knopka) + var(--sticky-podval)
                   + env(safe-area-inset-bottom));

  /* 🔴 НАХОДКА ТЕЛЕФОНА Т-1. МЕСТО ПОД ПОЛОСУ = ЕЁ ВЫСОТА ПЛЮС ЗАПАС.
     Прежде отступ страницы равнялся высоте полосы ТОЧКА В ТОЧКУ. Значит
     последняя строка страницы упиралась в верхний край полосы вплотную:
     ни зазора, ни воздуха — и на снимке с настоящего телефона это читалось
     как «полоса лежит на тексте». Плюс у самой полосы есть тень
     (0 12px 30px), которая живёт вне её собственной высоты.

     Запас объявлен ОТДЕЛЬНЫМ числом, а не прибавлен к высоте кнопки:
     высота кнопки — это размер нажимаемого, его меняют по одной причине,
     а зазор — по другой. Слей их в одно число, и правка одного молча
     сдвинет второе.

     🔴 ЧЕГО ЭТО НЕ ЛЕЧИТ, И ЭТО ЧЕСТНО ЗАПИСАНО. Отступ в конце страницы
     спасает КОНЕЦ страницы: подвал, галочку согласия, кнопку «Отправить
     заявку» — всё, что человек видит, докрутив донизу. Середину страницы
     он не спасает и спасти не может: полоса лежит поверх (position: fixed)
     и закрывает нижние 72 точки экрана на любой высоте прокрутки. Это
     не изъян отступа, а свойство липкой полосы. Середину лечит только одно —
     прятать полосу там, где она мешает; это делает скрипт, и он в чужом
     файле (см. «просьба соседнему окну» в ОТЧЁТ_ОКНО_АДМИН.md). */
  --sticky-zapas: 12px;

  /* 🔴 ПОЧЕМУ МЕСТО НЕ ОБЪЯВЛЕНО ТРЕТЬИМ ЧИСЛОМ, А СЧИТАЕТСЯ НА МЕСТЕ.
     Отдельное «--sticky-mesto» выглядело бы аккуратнее, но сторож находки
     Г-1 (test_resheniya.test_g1_02) требует буквально: в отступе страницы
     обязано СТОЯТЬ «--sticky-h». И требует правильно — именно так ловится
     отступ, вписанный числом мимо высоты полосы. Через третье имя правило
     формально соблюдалось бы, а сторож перестал бы его видеть. Поэтому
     формула стоит там, где она работает, — и в обоих местах она ОДНА И ТА ЖЕ,
     буква в букву; за этим следит test_a16_01. */

  --green: #4B6448;       /* главный акцент */
  --green-soft: #C2C8BD;
  --green-mid: #959F94;
  --green-ink: #2D352D;
  --green-ink-2: #2F3730;
  --green-dash: #A9AFA4;

  --terra: #875D45;
  --terra-dark: #4E1E14;
  --on-terra: #F7F3EA;
  --on-terra-2: #EEE4D9;

  --graphite: #33383E;
  --on-dark: #E4E0D6;
  --on-dark-h: #EDE7DB;
  --on-dark-2: #BFBCB2;
  --on-dark-3: #A0A69D;
  --on-dark-4: #DDE0D6;
  --on-dark-5: #A1A39B;
  --on-dark-6: #9BA39A;

  --stub: repeating-linear-gradient(135deg, #E4DFD1 0 11px, #DBD5C5 11px 22px);

  --tap: 48px;            /* минимальная высота нажимаемого в админке */
}

/* ═══════════════════════════ основа ═══════════════════════════ */

* { box-sizing: border-box; }

/* 🔴 НАХОДКА ТЕЛЕФОНА Т-1, ВТОРАЯ ПОЛОВИНА. КУДА БРАУЗЕР ДОКРУЧИВАЕТ САМ.
   Страницу крутит не только палец. Её крутит браузер: по ссылке-якорю
   (#dates, #form), при переходе к полю по кнопке «дальше» на клавиатуре,
   при scrollIntoView из скрипта. По умолчанию он доводит цель ровно
   до нижнего края окна — то есть ПОД липкую полосу, и человек видит
   пустое место там, где ждал поле.

   scroll-padding-bottom говорит браузеру: нижние столько-то точек окна
   заняты, целься выше. Число — та же самая формула, что и у отступа страницы,
   буква в букву: два разных числа тут разъехались бы молча. */
html { scroll-padding-bottom: calc(var(--sticky-h) + var(--sticky-zapas)); }

body {
  margin: 0;
  background: var(--sand);
  color: var(--ink);
  font-family: var(--font-text);
  font-size: 16px;
  -webkit-font-smoothing: antialiased;
  text-wrap: pretty;
  -webkit-text-size-adjust: 100%;
}

a { color: var(--green); text-decoration: none; }
a:hover { color: var(--terra); }
input, textarea, button, select { font-family: inherit; color: inherit; }
/* 🔴 ДОСТУПНОСТЬ, ПУНКТ 4. ОБВОДКА ФОКУСА БЫЛА ВИДНА НЕ ВЕЗДЕ.
   Обводка одноцветная, --green #4B6448, и на светлом полотне её видно
   хорошо (5.30). А отступ у неё был 1 точка — то есть ложилась она
   на ТО, ЧТО ПОД элементом, и на тёмных местах пропадала:

       графит  #33383E   1.81   подвал, карточка расчёта, «Правила дома»
       зелёный #959F94   2.38   кнопки зон галереи, «Как добраться»
       зелёная кнопка    1.00   зелёное на зелёном — не видно совсем

   Пересчитано по живой странице: 12 управлений из 79 стояли на фоне,
   где обводка не дотягивала даже до 3.0 (норма WCAG 1.4.11 для
   нетекстовых различий). Человек с клавиатурой на этих местах терял
   себя — а это подвал со ссылками на документы и кнопки зон.

   🔴 ОДНИМ ЦВЕТОМ ЭТО НЕ ЛЕЧИТСЯ, И В ЭТОМ ВСЯ СУТЬ. Цвета, видного
   и на полотне, и на графите, и на терракоте разом, в этой гамме нет.
   Поэтому кольца два: светлое (--card) вплотную к элементу и тёмное
   (--green-ink-2) сразу за ним. Считано по всем девяти фонам сайта —
   на каждом хотя бы одно кольцо берёт норму 3.0 (WCAG 1.4.11):

       полотно          светлое 1.11   тёмное 9.97
       карточка         светлое 1.00   тёмное 11.09
       песок            светлое 1.28   тёмное 8.65
       зелёная секция   светлое 2.47   тёмное 4.48
       графит           светлое 10.68  тёмное 1.04
       терракота        светлое 5.15   тёмное 2.15
       зелёная кнопка   светлое 5.90   тёмное 1.88
       светло-зелёный   светлое 1.54   тёмное 7.19
       занятый день     светлое 1.29   тёмное 8.57

   Друг против друга кольца дают 11.09 в любом месте страницы.

   🔴 ПОЧЕМУ НЕ --green, КОТОРЫМ ОБВОДКА БЫЛА. Он держится на светлом
   (5.30 против полотна) и проваливается на зелёных секциях: 2.38 против
   --green-mid, а светлое кольцо там же даёт 2.47 — то есть на «Галерее»,
   «Что входит» и «Как добраться» нормы не брало НИ ОДНО кольцо. Это пять
   управлений: три кнопки зон и две кнопки связи. --green-ink-2 — тот же
   зелёный, только тёмный, уже в палитре, и на зелёном он даёт 4.48.

   box-shadow, а не второй outline: обводка у элемента может быть одна.
   Тень без размытия — это ровное кольцо шириной ровно в свой разброс,
   рисуется снаружи рамки, ничего не сдвигает и место не занимает. */
input:focus, textarea:focus, select:focus, button:focus-visible, a:focus-visible {
  outline: 2px solid var(--green-ink-2);
  outline-offset: 2px;
  box-shadow: 0 0 0 2px var(--card);
}
::selection { background: var(--green-soft); }
img { max-width: 100%; }

.hidden { display: none !important; }
.nowrap { white-space: nowrap; }
.break { overflow-wrap: anywhere; word-break: break-word; }
.center { text-align: center; }

/* 🔴 НАХОДКА УБОРКА-1. ТРИ ПОЛЯ ВЛАДЕЛЬЦА СРЕЗАЛ КРАЙ ЭКРАНА.

   Приём тот же, что уже применён к строке реквизитов (.poluchatel__stroka,
   находка ТЕЛЕФОН-2 Т2-2): длинное слитное слово браузеру нечем разорвать,
   и строка уезжает вправо за свою коробку. Вбок страница при этом НЕ едет —
   у .site стоит overflow: hidden, — то есть хвост просто пропадает, и гость
   не видит, что чего-то не видит. Это хуже уехавшей страницы: уехавшую
   видно.

   Замерено на стенде словом в 59 знаков без пробелов, дефисов и точек,
   окно 360 (_glazami_uborka.py, снимки в отчёте). «Вылезает» — насколько
   нарисованный текст выходит за правый край СВОЕЙ коробки:

     девиз на обложке   .cover__lead        вылезает 294, за край окна 274
     приписка о доплате .terms__note        вылезает  76, за край окна  56
     Instagram в подвале .foot__links a      коробка ссылки за краем окна 169

   После правила все три укладываются в окно целиком (замер там же):
   294 -> 0, 76 -> 0, 169 -> 0.

   🔴 ПОЧЕМУ РОВНО ТРИ, А НЕ ПЯТЬ. Окно «ТЕЛЕФОН» передало штабу пять мест
   (отчёт «ТЕЛЕФОН», раздел 7.2), и в двух из них — «Уборка» (cleaning_note)
   и «Гости» (guests_note) — беда НЕ ВОСПРОИЗВОДИТСЯ: у .terms b с 16.08
   стоит overflow-wrap: break-word, и то же слово там переносится и целиком
   помещается (замер: тексту 332 и 335 при правом крае коробки 340; глазами
   на снимке видно две и три строки). Чинить там нечего, и трогать нельзя:
   на break-word у свободного текста владельца стоит сторож test_g8_08,
   а anywhere ему запрещён прямо — он делает наименьшую ширину узла равной
   одному знаку, и гибкая раскладка сжимает текст в столбик (находка Г8-2).

   🔴 ПОЧЕМУ ПРАВИЛО НЕ ОБЩЕЕ НА ВЕСЬ САЙТ. Разрешить перенос где угодно
   всему подряд — это ровно та беда Г8-2, которую проект уже ловил: до сумм
   («10 000 ₽» встало столбиком по одному знаку) и до клеток календаря
   правило доехало бы тоже. Поэтому названы места, а не сайт.

   🔴 INSTAGRAM НАЗВАН ПО АДРЕСУ ССЫЛКИ, А НЕ ВСЕМИ ССЫЛКАМИ ПОДВАЛА.
   .foot__links — гибкая строка из двух ссылок, WhatsApp и Instagram.
   Дай перенос обеим — соседний WhatsApp тоже становится сжимаемым до одного
   знака, и при длинном Instagram он ломается пополам: «What / sApp».
   Увидено глазами на стенде, окно 360, и снимок этого стоит в отчёте.
   Длинное значение бывает только у Instagram: WhatsApp — это номер.

   🔴 ПРИПИСКА О ДОПЛАТАХ СТОИТ НЕ ЗДЕСЬ, А В СВОЁМ ПРАВИЛЕ (.terms__note,
   раздел «условия»), И ЭТО НЕ РАЗБРОСАННОСТЬ. Разборщик стилей соседнего
   сторожа (test_glaza_8) читает КАЖДОЕ правило, в селекторе которого есть
   «.terms», и обязан понять, правая это половина строки условий или нет.
   Форму «.terms__note в общем списке через запятую» он не понимает — и,
   по своему уговору, краснеет, а не пропускает молча. Уговор верный: молча
   пропущенное правило и есть то, чем сторож становится слепым. Поймано
   прогоном 24.08.2026 — три красных в test_glaza_8. */
.cover__lead,
.foot__links a[href*="instagram.com"] {
  overflow-wrap: anywhere;
}

/* Ловушка для ботов: убрана с экрана, но остаётся в форме.
   display:none некоторые боты распознают и поле не заполняют — поэтому
   поле честно существует, просто вынесено далеко за край экрана. */
.hp {
  position: absolute;
  left: -10000px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

/* Подпись поля, которую не видно глазами, но слышно голосом.
   Ставится на <label> у полей формы заявки: подсказка в самом поле
   (placeholder) исчезает, как только человек начал печатать, а программа
   для незрячих поле без подписи называет «поле ввода» и ничего больше.

   🔴 ЭТО НЕ .hp, И СМЕШИВАТЬ ИХ НЕЛЬЗЯ. Ловушка прячется от ЧЕЛОВЕКА
   и от программы чтения тоже — её задача остаться незамеченной. Здесь
   ровно наоборот: от глаз скрыто, программе чтения видно. Возьми кто-нибудь
   .hp для подписи — подпись пропала бы вместе с ловушкой, и всё вернулось
   бы к тому, с чего начали, а по коду выглядело бы сделанным.

   Способ — обрезка в точку, а не display:none и не visibility:hidden:
   спрятанное этими двумя браузер не читает вовсе. Отрицательный отступ
   left:-10000px, как у ловушки, здесь тоже не годится: подпись остаётся
   доступной для фокуса и утаскивает экран вбок. */
.vh {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  border: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

/* ═══════════════════════════ витрина ═══════════════════════════ */

/* Полотно. Ширина 430px, радиус 24px и тень 0 26px 64px — это рамка
   ПРОТОТИПА («телефон на подложке»). На телефоне сайт занимает экран
   целиком, рамка включается только на десктопе. */
.site {
  width: 100%;
  background: var(--canvas);
  overflow: hidden;
  /* Находка Г-1, поправленная находкой Т-1: место под липкую полосу.
     Её высота ПЛЮС ЗАПАС, оба числа — из :root.
     На широком экране полосы нет, и отступ снимается там же, где она
     прячется. */
  padding-bottom: calc(var(--sticky-h) + var(--sticky-zapas));
}

/* ─────────── обложка ─────────── */

/* Миниатюра 32×24 строкой прямо здесь: пока едет hero-aerial (169 КБ, ~3 с),
   гость видит пятно нужных оттенков. Подрезка — как у .cover__bg. */
.cover {
  position: relative;
  height: 700px;
  background-color: var(--graphite);
  background-image: url("data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABQODxIPDRQSEBIXFRQYHjIhHhwcHj0sLiQySUBMS0dARkVQWnNiUFVtVkVGZIhlbXd7gYKBTmCNl4x9lnN+gXz/2wBDARUXFx4aHjshITt8U0ZTfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHz/wAARCAAYACADASIAAhEBAxEB/8QAGgAAAQUBAAAAAAAAAAAAAAAAAAECAwQFBv/EACQQAQABAwQBBAMAAAAAAAAAAAECAAMRBBIhMQUiQVGBYnGR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQID/8QAHBEBAQABBQEAAAAAAAAAAAAAAQADERMUIVFh/9oADAMBAAIRAxEAPwDQjqLQ+mMVPxpxqw4OH6KypXhcbUzSxnHO0tZTlyvFLnKDHaMtdjgFfgKjNXJ6tzqCE5Am0jnvlpXYOUj/AGjkfJ27nrfkbkYguQ+QqzHy2rkA7cfruiis0PJ1Snn5W/cxvhHPQ+x9VVu3rt2eZSZB17UUVHRCt//Z");
  background-size: cover;
  background-position: 40% 62%;
}
.cover__bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 40% 62%;
}
.cover__veil {
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg,
    rgba(51, 56, 62, 0.58) 0%, rgba(51, 56, 62, 0.05) 32%,
    rgba(51, 56, 62, 0.6) 68%, rgba(51, 56, 62, 0.92) 100%);
}
.cover__top {
  position: relative;
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 14px;
  padding: 14px 16px;
}
.cover__logo { padding: 14px; }
.cover__acts { display: flex; flex-direction: column; gap: 7px; padding-top: 14px; }
.cover__bottom {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 0 20px 36px;
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.cover__title {
  margin: 0;
  font-family: var(--font-head);
  font-size: 52px;
  font-weight: 600;
  line-height: 1;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--on-dark-h);
}
.cover__eyebrow { display: flex; align-items: center; gap: 10px; }
.cover__eyebrow::before {
  content: "";
  width: 34px;
  height: 2px;
  background: var(--green-mid);
}
.cover__eyebrow span {
  font: 600 12px var(--font-text);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--green-soft);
}
.cover__lead { margin: 0; font-size: 20px; line-height: 1.4; color: #F1EDE3; max-width: 340px; }

/* знак бренда в углу обложки: место логотипа (image-slot 172×98 в макете) */
.cover__mark { width: 72px; height: 72px; display: block; }

/* ─────────── кнопки витрины ─────────── */

.b {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  border: none;
  text-decoration: none;
  cursor: pointer;
  font-family: inherit;
}
/* 🔴 НАХОДКИ ТЕЛЕФОНА Т-4 И Т-5. ПАРА «ПОЗВОНИТЬ» И «WHATSAPP» — ОДИН ВИД.

   Т-4. Кнопка «Позвонить» на обложке была ПРОЗРАЧНОЙ: заливка
   rgba(237,231,219,0.16) и такая же светлая надпись поверх. Значит её
   читаемость зависела от того, что попало в кадр под ней. Замер по формуле
   WCAG (kontrast.py): поверх самого светлого неба видимый фон выходит почти
   белым, и светлая надпись даёт на нём 1.19 при норме 4.5. Поверх тёмного
   пятна та же кнопка даёт 12.44. Одна и та же кнопка — от «отлично»
   до «не видно вовсе», и решает это фотография.

   Посчитанное значение фона сюда НЕ выписано числом нарочно: цвет, которого
   нет в брендбуке, но который стоит в файле стилей, ловит сторож
   test_noch.test_n21 — и ловит правильно. Числа замера живут в отчёте.

   Правило поэтому такое: КНОПКА НА ФОТОГРАФИИ НЕПРОЗРАЧНА, а её цвет
   различим и на белом, и на чёрном (нетекстовая норма 3.0 в обе стороны).
   Из всей палитры этому отвечают ровно два цвета:
       --green #4B6448 — 6.53 на белом, 3.22 на чёрном;
       --terra #875D45 — 5.70 на белом, 3.68 на чёрном.
   Остальные проваливаются с одной из сторон: --graphite даёт на чёрном 1.78,
   --canvas на белом 1.23.

   Т-5. Пара «Позвонить» и «WhatsApp» встречается трижды и была трёх разных
   видов: стеклянная + зелёная · зелёная + бежевая · коричневая + тёмно-синяя.
   Теперь во всех трёх местах одно и то же: «Позвонить» — терракотовая,
   «WhatsApp» — зелёная. Выбор такой, потому что он МЕНЬШЕ ВСЕГО двигает
   сегодняшний сайт: WhatsApp остаётся зелёным там, где он и был (обложка),
   «Позвонить» остаётся терракотовым там, где он и был (под формой).

   🔴 ЗАКРЫТО ПРИ СВЕДЕНИИ 16.08 (просьба окна «админка» № 2). Оформление
   привязано к классу, а классы звались по ВИДУ: .b--route был «Позвонить»,
   пока у дома не заданы координаты, и «Маршрут», как только их зададут, —
   и в тот день пара в разделе «Как добраться» поменялась бы ролями, а
   «Позвонить» на одном сайте стало бы двух цветов. Теперь класс называет
   роль и место: .b--zvonok-* и .b--wa-*, а у «Маршрута» роль своя. Вид
   больше не зависит от того, заполнил ли владелец координаты. */
.b--zvonok-top {           /* «Позвонить» на обложке   */
  height: 40px;
  padding: 0 15px;
  border-radius: 20px;
  background: var(--terra);
  color: var(--on-terra);
  font-size: 13px;
  font-weight: 600;
}
.b--wa-top {          /* «WhatsApp» на обложке */
  height: 40px;
  padding: 0 15px;
  border-radius: 20px;
  background: var(--green);
  color: var(--on-dark-h);
  font-size: 13px;
  font-weight: 600;
}
.b--green {           /* «Проверить даты», «Забронировать эти даты» */
  height: 54px;
  border-radius: 13px;
  background: var(--green);
  color: var(--on-dark-h);
  font-size: 16px;
  font-weight: 700;
}
.b--green-card { color: var(--card); }        /* в карточке быстрого выбора */
/* Пара в разделе «Как добраться». Секция залита --green-mid #959F94, и обе
   заливки пары стоят на ней слабо: терракота даёт 2.08, зелёная 2.38 при
   нетекстовой норме 3.0 — то есть очертания кнопки на этом фоне не читаются.
   Поэтому здесь, и только здесь, у пары есть рамка: --green-ink-2 #2F3730
   против секции — 4.48. На обложке и под формой рамка не нужна, там заливки
   отделяются сами (замеры в ОТЧЁТ_ОКНО_АДМИН.md). */
.b--zvonok-route {           /* «Позвонить» (при заданных координатах — «Маршрут») */
  flex: 1;
  height: 52px;
  border-radius: 13px;
  background: var(--terra);
  border: 1px solid var(--green-ink-2);
  color: var(--on-terra);
  font-size: 15.5px;
  font-weight: 700;
}
/* «Маршрут» — третья роль этой пары, а не «Позвонить» другого цвета. Вид
   тот же, что у соседа по месту: пара обязана читаться как пара. */
.b--marshrut,
.b--wa-route {           /* «WhatsApp» / «Маршрут» на зелёной секции */
  flex: 0 0 46%;
  height: 52px;
  border-radius: 13px;
  background: var(--green);
  border: 1px solid var(--green-ink-2);
  color: var(--on-dark-h);
  font-size: 15.5px;
  font-weight: 700;
}
.b--zvonok-form {           /* «Позвонить» под формой */
  flex: 1;
  height: 54px;
  border-radius: 13px;
  background: var(--terra);
  color: var(--on-terra);
  font-size: 15.5px;
  font-weight: 700;
}
.b--wa-form {            /* «WhatsApp» под формой   */
  flex: 1;
  height: 54px;
  border-radius: 13px;
  background: var(--green);
  color: var(--on-dark-h);
  font-size: 15.5px;
  font-weight: 700;
}
.b--send {            /* «Отправить заявку» */
  height: 56px;
  border-radius: 13px;
  background: var(--green);
  color: var(--on-dark-h);
  font-size: 16.5px;
  font-weight: 700;
}
/* 🔴 ВОЛНА 1, БЛОК 5. ВЫКЛЮЧЕННАЯ КНОПКА — «ПОКА НЕЛЬЗЯ», А НЕ «ЗДЕСЬ ПУСТО».
   Замер: текст #9F9484 на фоне #DED7C7 давал 2.08 при норме 4.5 — надпись
   «Отправить заявку» на выключенной кнопке не читалась, и человек не понимал,
   что кнопка вообще есть. Текст --ink-2 на том же фоне даёт 5.45, рамка
   --ink-4 против полотна — 4.02: у кнопки появилась форма.
   Объяснение, ПОЧЕМУ она выключена, стоит строкой ниже (#f_why) — выключенная
   кнопка без объяснения читается как «здесь ничего нет» (блок 4, пункт 2). */
.b--send:disabled {
  background: var(--busy);
  color: var(--ink-2);
  border: 2px solid var(--ink-4);
  cursor: default;
}

/* ─────────── карточка быстрого выбора ─────────── */

.quick { padding: 0 16px; margin-top: -26px; position: relative; }
.quick__card {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: 16px;
  box-shadow: 0 14px 34px rgba(51, 56, 62, 0.14);
  padding: 14px;
}
.quick__dates {
  display: grid;
  grid-template-columns: 1fr 1px 1fr;
  align-items: stretch;
  gap: 12px;
}
.quick__dates > a { display: flex; flex-direction: column; gap: 4px; color: var(--ink); }
.quick__dates > i { background: var(--line); }
.cap {
  font: 600 12px var(--font-text);
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: var(--ink-5);
}
.quick__val { font-family: var(--font-head); font-size: 21px; font-weight: 500; }
.quick__hr { height: 1px; background: var(--line); margin: 13px 0; }
.quick__guests {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}
.quick__guests > span { font-size: 15px; color: var(--ink-2); }
.quick .b--green { margin-top: 13px; }

/* счётчик гостей */
.step { display: flex; align-items: center; gap: 6px; }
.step button {
  width: 44px;
  height: 44px;
  border-radius: 12px;
  border: 1px solid var(--line);
  background: var(--canvas);
  font-size: 20px;
  line-height: 1;
  cursor: pointer;
}
.step b { min-width: 26px; text-align: center; font-size: 17px; font-weight: 700; }
.step--sm { gap: 4px; }
.step--sm button { width: 42px; height: 42px; border-radius: 10px; font-size: 19px; }
.step--sm b { font-size: 16px; }

/* ─────────── секции ─────────── */

.sec { padding: 40px 20px; }
.sec--green { background: var(--green-mid); }
.sec--dark { background: var(--graphite); color: var(--on-dark); }
.eyebrow {
  display: block;
  font: 600 12px var(--font-text);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--terra);
}
/* 🔴 ДОСТУПНОСТЬ. У «Галереи» ФОН ЗЕЛЁНЫЙ, А НАДЗАГОЛОВОК БЫЛ ТЕРРАКОТОВЫЙ.
   .gal — секция с тем же фоном --green-mid, что и .sec--green, но своего
   класса .sec--green у неё нет: она объявлена отдельно. Правило ниже её
   не доставало, и надзаголовок оставался общим терракотовым #875D45
   поверх зелёного #959F94 — 2.08 при норме 4.5, худшее место всей витрины.
   Слово «ГАЛЕРЕЯ» на зелёном не читалось никак.
   Чинится не перекраской секции, а тем, что правило теперь называет обе. */
.sec--green .eyebrow, .gal .eyebrow { color: var(--green-ink); }
.sec--dark .eyebrow { color: var(--on-dark-3); }
.sec h2 {
  margin: 8px 0 20px;
  font-family: var(--font-head);
  font-size: 29px;
  font-weight: 600;
  line-height: 1.15;
  color: var(--ink);
}
.sec--green h2 { color: var(--green-ink-2); }
.sec--dark h2 { color: var(--on-dark-h); }
.sec__lead { margin: 0 0 18px; font-size: 14px; line-height: 1.5; color: var(--ink-3); }

/* ─────────── свободные даты ─────────── */

#dates {
  padding: 42px 20px 40px;
  display: flex;
  flex-direction: column;
  gap: 18px;
  scroll-margin-top: 12px;
}
#dates .dates__head { display: flex; flex-direction: column; gap: 8px; }
#dates h2 { margin: 0; letter-spacing: -0.01em; }

.cal {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: 18px;
  padding: 16px 14px;
}
.cal__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 12px;
}
/* 🔴 ВОЛНА 1, БЛОК 5. СТРЕЛКИ ЛИСТАНИЯ СДЕЛАНЫ ЯВНЫМИ.
   Практический итог замера, а не теория: рамка стрелки (#DCD3C2) отличалась
   от полотна в 1.21 раза, фон у кнопки был тот же, что у страницы, — то есть
   кнопки на экране просто не было видно. Человек не догадывался, что месяцы
   вообще листаются, и уходил, решив, что позже дом не сдаётся.
   Рамка --ink-4 даёт 4.02 против полотна при норме 3.0, знак крупнее и жирнее,
   подложка карточная — кнопка читается как кнопка. */
.cal__nav {
  width: 46px;
  height: 46px;
  border-radius: 12px;
  border: 2px solid var(--ink-4);
  background: var(--card);
  color: var(--ink);
  font-size: 24px;
  font-weight: 700;
  line-height: 1;
  cursor: pointer;
}
.cal__nav:disabled { color: var(--ink-off); border-color: var(--line); cursor: default; }
.cal__month {
  font-family: var(--font-head);
  font-size: 20px;
  font-weight: 600;
  color: var(--ink);
  text-transform: capitalize;   /* сервер отдаёт «август 2026» */
}
.cal__wd, .cal__grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 3px; }
.cal__wd { margin-bottom: 6px; }
.cal__wd span {
  text-align: center;
  font: 600 12px var(--font-text);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-5);
}
.cal__wd .we { color: var(--terra); }

/* ─────────── ввод дат словами ───────────
   Новый блок под календарём. Своих цветов и шрифтов не заводит: берёт
   те же переменные, что и остальная карточка, — иначе вид сайта поехал бы,
   а трогать его запрещено. Целей нажатия это тоже касается: высота поля
   44 px, ориентир для основного элемента. */
.dvvod { margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--line); }
.dvvod__polya { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.dvvod__pole { display: flex; flex-direction: column; gap: 5px; }
.dvvod__pole label {
  font: 600 12px var(--font-text);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-5);
}
.dvvod__pole input {
  height: 44px;
  padding: 0 12px;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--canvas);
  color: var(--ink);
  font-family: inherit;
  font-size: 15px;
  width: 100%;
}
.dvvod__help { margin: 8px 0 0; font-size: 12px; line-height: 1.45; color: var(--ink-5); }
.dvvod__err {
  margin: 8px 0 0;
  font-size: 12.5px;
  line-height: 1.45;
  color: var(--terra-dark);
  font-weight: 600;
}

.cal__day {
  /* точка занятости ставится по углу клетки — ей нужен этот отсчёт */
  position: relative;
  height: 46px;
  border: none;
  border-radius: 10px;
  background: var(--canvas);
  color: var(--ink);
  font-size: 15px;
  font-weight: 400;
  font-family: inherit;
  cursor: pointer;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 0;
  line-height: 1.05;
}
.cal__day.void { background: transparent; color: transparent; cursor: default; }
/* Занят и прошедший — состояния эталона. Наши «закрыто владельцем» и
   «бронируют прямо сейчас» в эталоне не нарисованы, см. отчёт.

   Отступление от эталона, сделано осознанно: там занятый день (#DED7C7)
   отличался от свободного (#EDE7DB) в 1.16 раза по контрасту — на глаз почти
   никак. Гость видел, что дата не нажимается, и читал это как поломку сайта.

   🔴 ВОЛНА 1, БЛОК 5. ПРЕЖНЕЙ ПРАВКИ НЕ ХВАТИЛО, И ЭТО ЗАМЕРЕНО.
   Фон #A79C8D дал против свободного дня 2.19 при норме 3.0, а цифра #EDE7DB
   внутри него — те же 2.19 при норме 4.5. То есть номера занятых дней
   не читались вовсе. Дом сдаётся семьям, платят люди 40–60 лет; для них это
   не «мелкий контраст», а «сайт не работает».
   Считано скриптом kontrast.py по формуле WCAG прямо из этого файла:
   фон --ink-3 против полотна 4.97, цифра --card на нём 5.53.

   🔴 НЕЦВЕТОВАЯ МЕТКА ОСТАЁТСЯ, НО ДРУГАЯ — ТОЧКА В УГЛУ (решение владельца
   14.08.2026). Здесь цифра была перечёркнута линией. Владелец решил, что
   черты не нужно и хватит выделения. Хватило бы — если бы все видели цвет:
   дальтонизм, дешёвый экран и солнце в окно — три разные причины, по которым
   цвет не доезжает, и тогда занятый день ничем не отличается от свободного.
   Поэтому черта снята, а второй признак заведён заново, тише прежнего.

   Почему точка, а не что-то ещё:
   — штриховка занята буферной ночью (см. ниже), две штриховки рядом гость
     не различил бы;
   — подпись словом в клетку 46 точек высотой не влезает читаемым кеглем:
     это уже проверено ценой, её пришлось свести к одному знаку;
   — точка стоит в углу и не задевает ни цифру, ни знак цены под ней,
     то есть не спорит с тем, что владельцу не понравилось в черте.

   Метка нарисована цветом текста клетки (currentColor): пока видна цифра —
   видна и она, и разъехаться им нечем. */
.cal__day.busy, .cal__day.blocked {
  background: var(--ink-3);
  color: var(--card);
  cursor: not-allowed;
}
/* Сама метка. Место — правый верхний угол: там пусто при любом наполнении
   клетки, а цифра и знак цены стоят по центру. */
.cal__day.busy::after, .cal__day.blocked::after {
  content: "";
  position: absolute;
  top: 5px;
  right: 5px;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: currentColor;
}
.cal__day.busy small, .cal__day.blocked small { color: var(--card); }
/* 🔴 Буферная ночь — день на уборку между гостями (задание штаба №14, блок 1).
   Вид у неё СВОЙ, и это главное в правиле: не тёмный, как у занятого дня
   (иначе гость читает «занято» про ночь, свободную на площадке), и не чистый,
   как у свободного (иначе он жмёт и не понимает, почему не выбирается).
   Косая штриховка: сама полосатость и есть главный признак, она видна там,
   где разницу в яркости глаз уже не берёт. Тот же приём занят под заглушку
   фотографии (--stub), шаг взят мельче, чтобы клетки не путались.

   🔴 ЦВЕТА ВЫБРАНЫ СЧЁТОМ, А НЕ НА ГЛАЗ, и первая пара была отвергнута.
   Со светлыми --card и --busy полосы отличались друг от друга в 1,27 раза,
   а средняя яркость клетки (0,78) почти совпадала со свободным днём (0,80):
   буфер выглядел бы свободным — ровно та беда, из-за которой в задании №7
   перекрашивали календарь админки. Взята пара --card / --ink-off: полосы
   между собой 2,41, клетка против свободного дня 1,29 и против занятого 1,83.
   То есть буфер сидит МЕЖДУ ними и отличим от обоих. */
.cal__day.bufer {
  background: repeating-linear-gradient(135deg,
              var(--card) 0 5px, var(--ink-off) 5px 10px);
  color: var(--ink-dark);
  cursor: not-allowed;
}
/* «Заявка держит даты 3 часа» — состояния из макета нет, оформлено терракотой:
   день ещё можно выбрать, но гость видит, что на него уже смотрят. */
/* 🔴 ВОЛНА 1, БЛОК 5. Замер прежней заливки rgba(135,93,69,0.18): поверх
   полотна она давала контраст 1.25 при норме 3.0 — то есть день, на который
   уже смотрит другой гость, ничем не отличался от свободного.
   (Получавшийся код цвета здесь не пишем: сторож брендбука читает файл
   целиком, вместе с комментариями, и потребовал бы завести его в набор.)
   Заливка сплошная терракотовая: 4.63 против полотна, цифра --card на ней 5.15.
   Зачёркивания здесь нет намеренно: день ВСЁ ЕЩЁ можно выбрать, и метка
   «занято» была бы неправдой. Отличие от занятого дня — и цвет, и её
   отсутствие. */
.cal__day.pending { background: var(--terra); color: var(--card); cursor: pointer; }
.cal__day.pending small { color: var(--card); }
.cal__day.past { background: transparent; color: var(--ink-off); cursor: not-allowed; }
.cal__day.off { cursor: not-allowed; }
/* Замер прежней середины выбранного (#C2C8BD): 1.39 против полотна при норме
   3.0 — человек не видел, какие именно ночи он выбрал. Стало 5.3, цифра 5.9. */
.cal__day.in-range {
  background: var(--green);
  color: var(--card);
  font-weight: 600;
  border-radius: 4px;
}
.cal__day.in-range small { color: var(--card); }
/* Концы диапазона темнее середины: капсула читается формой и ступенькой
   по светлоте, а не одним лишь цветом. */
.cal__day.sel-from, .cal__day.sel-to {
  background: var(--green-ink-2);
  color: var(--on-dark-h);
  font-weight: 700;
}
.cal__day.sel-from { border-radius: 10px 4px 4px 10px; }
.cal__day.sel-to { border-radius: 4px 10px 10px 4px; }
.cal__day.is-today { color: var(--terra-dark); font-weight: 700; }
.cal__day.is-today.sel-from, .cal__day.is-today.sel-to { color: var(--on-dark-h); }
/* цена дня показывается ТОЛЬКО когда отличается от базовой: в эталоне
   цен в клетках нет, а молча спрятать «дорогой» день — обман */
.cal__day small { font-size: 12px; font-weight: 600; letter-spacing: -0.02em; color: var(--terra-dark); }
.cal__day.sel-from small, .cal__day.sel-to small { color: var(--on-dark-h); }

/* объяснение на краю календаря: почему стрелка дальше не идёт */
.cal__end {
  margin: 12px 0 0;
  font-size: 12.5px;
  line-height: 1.5;
  color: var(--ink-3);
}
.cal__end a { color: var(--terra-dark); font-weight: 600; }

.cal__legend {
  display: flex;
  flex-wrap: wrap;
  gap: 14px;
  margin-top: 14px;
  padding-top: 13px;
  border-top: 1px solid var(--line-cal);
}
.cal__legend span {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  color: var(--ink-4);
}
.cal__legend i { width: 10px; height: 10px; border-radius: 3px; }
.cal__legend .l-free { background: var(--canvas); border: 1px solid var(--line); }
/* образец в легенде обязан совпадать с самим днём, иначе легенда врёт.
   🔴 В образце стоит светлая точка в углу — та же нецветовая метка, что
   и в самом дне. Прежде здесь была светлая черта поперёк, под зачёркнутую
   цифру; черту сняли решением владельца, и образец пошёл за клеткой.
   Покажи мы в легенде ровный квадрат, она врала бы ровно про то, ради чего
   метка и заводилась. Радиус точки взят в пятую часть образца: на квадратике
   10 на 10 точка мельче просто не видна. */
.cal__legend .l-busy {
  background: radial-gradient(circle 2px at 7.5px 2.5px,
              var(--card) 0 2px, transparent 2px), var(--ink-3);
}
.cal__legend .l-pick { background: var(--green); }
.cal__legend .l-hold { background: var(--terra); }
/* образец буферной ночи: та же штриховка, шаг мельче — иначе на квадратике
   10×10 пикселей от неё видна одна полоса и образец врёт */
.cal__legend .l-bufer {
  background: repeating-linear-gradient(135deg,
              var(--card) 0 3px, var(--ink-off) 3px 6px);
  border: 1px solid var(--line);
}
/* Образец знака цены — не квадрат, а сам знак: он и стоит в клетке.
   Ширина задана auto, иначе общее правило 10×10 обрезало бы ₽ пополам. */
.cal__legend .l-cena {
  width: auto;
  height: auto;
  font-size: 12px;
  font-weight: 700;
  color: var(--terra-dark);
}

/* тёмная карточка расчёта */
.calc {
  background: var(--graphite);
  border-radius: 18px;
  padding: 20px 18px;
  color: var(--on-dark);
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.calc__main {
  font-family: var(--font-head);
  font-size: 27px;
  font-weight: 600;
  line-height: 1.2;
  color: var(--on-dark-h);
}
.calc__rows {
  display: flex;
  flex-direction: column;
  gap: 9px;
  font-size: 14px;
  line-height: 1.45;
  color: var(--on-dark-2);
}
.calc__rows > div { display: flex; justify-content: space-between; gap: 12px; }
.calc__rows b { color: var(--on-dark-h); white-space: nowrap; font-weight: 400; }
.calc__note { font-size: 12.5px; line-height: 1.45; color: var(--on-dark-3); }
/* Блок 3 «поля доверия»: пример полной цены под строкой «от 15 000 ₽».
   Цвет и кегль — те же, что у соседней .calc__note: это пояснение к цене,
   а не сама цена, и выделять его крупнее числа выше нельзя. */
.calc__primer { margin-top: 8px; font-size: 12.5px; line-height: 1.45; color: var(--on-dark-3); }
/* Блок 1 «поля доверия»: кому уходит задаток. Одно правило на обе страницы —
   витрину и «Заявка принята», — потому что и текст там один и тот же.
   Каждая строка со своей строки: имя получателя, слипшееся с номером счёта
   в одну ленту, читается хуже, чем не написанное вовсе. */
/* 🔴 НАХОДКА ВЛАДЕЛЬЦА О-10, 24.08.2026. ЭТОТ БЛОК БЫЛ САМЫМ МЕЛКИМ НА ЭКРАНЕ,
   А ПЕРЕПИСЫВАЮТ С НЕГО НОМЕР СЧЁТА.

   Своего кегля у блока не было вовсе — он доставался ему от класса-соседа,
   и на двух страницах соседи оказались разные:

     витрина            <div class="calc__note poluchatel">   12.5   ← замер
     «Заявка принята»   <div class="note poluchatel">         14.5   ← замер

   То есть один и тот же блок, собранный из одних и тех же настроек, на двух
   страницах набран РАЗНЫМ кеглем, и на витрине — самым мелким из всего, что
   есть в тёмной карточке расчёта (соседние строки .calc__rows — 14).
   А это единственное место на сайте, откуда гость переписывает номер счёта
   руками, когда кнопка «Скопировать» не сработала.

   Окно «Телефон» честно написало, что не знает, читаются ли 12.5 точки
   на дешёвом телефоне, и просило посмотреть человека. Человек посмотрел
   (владелец проекта, вечер 24.08.2026): увеличить.

   🔴 ЧИСЛО ВЗЯТО НЕ С ПОТОЛКА, А У БЛИЗНЕЦА. 14.5 — это ровно тот кегль,
   которым тот же самый блок набран на «Заявке принятой». Придумай мы третье
   число — страницы разошлись бы снова, только уже в другую сторону.
   Правило одно на обе страницы, как и всё остальное в этом блоке.

   🔴 ПОЧЕМУ ПРАВИЛО СТОИТ ИМЕННО ЗДЕСЬ, А НЕ ВЫШЕ. Вес у «.poluchatel»
   и у «.calc__note» одинаковый (один класс), и спор решает порядок строк.
   Стой оно выше объявления .calc__note — на витрине не изменилось бы
   ничего, а тест на кегль всё равно зеленел бы: он читает правило, а не
   экран. Поэтому оно ниже, и переносить его выше нельзя.

   Разметку не трогаем ни на одной из двух страниц: обе чужие, и на том,
   что они дословно одинаковы, стоит сторож test_doveriya.test_d1_06. */
.poluchatel { font-size: 14.5px; }
.poluchatel strong { display: block; margin-bottom: 4px; }
/* 🔴 НАХОДКА ТЕЛЕФОН-2, Т2-2. СЧЁТ ОБРЫВАЛСЯ НА КРАЮ ЭКРАНА.
   Поле, из которого сюда приходит значение, подписано владельцу «Реквизиты
   ИЛИ ССЫЛКА НА ОПЛАТУ», а подсказка под ним говорит «номер счёта, ссылка
   банка — что угодно». Ссылка на оплату — это одно слово без пробелов
   длиной в шесть-семь десятков знаков, и разорвать его переносом браузеру
   нечем: строка уезжает вправо за свою коробку.
   Замерено на стенде ссылкой в 63 знака, окно 360:
     · витрина — строка вылезает из тёмной карточки расчёта на 120 точек,
       а хвост срезает край .site (у него overflow: hidden). Гость видит
       начало ссылки и не видит конца — и не знает, что чего-то не видит;
     · «Заявка принята» — там обрезать нечем, и вбок уезжает вся страница:
       360 → 499 точек (139 вбок), 390 → 109, 430 → 69.
   Правило одно на обе страницы, как и всё в этом блоке: беда у них общая
   и приходит из одной настройки. overflow-wrap: anywhere рвёт слово ТОЛЬКО
   когда оно не помещается, — короткие реквизиты выглядят ровно как раньше. */
/* 🔴 НАХОДКА ТЕЛЕФОН-2, Т2-3. КНОПКА СТОЯЛА ПОСРЕДИ СТРОКИ, И БЫЛО НЕ ПОНЯТЬ,
   ЧЬЯ ОНА. Кнопка лежит в потоке текста, сразу за значением. Пока значение
   в одну строку помещалось — вопросов не было; на телефоне не помещается
   ни одно из трёх. Значение переносится, и кнопка садится в хвост ПОСЛЕДНЕЙ
   строки — то есть вплотную над следующей подписью. Увидено на стенде,
   окно 360: «Получатель: Магомедов Тамерлан / Русланович [Скопировать]»,
   а строкой ниже «Статус: самозанятый [Скопировать]». Две кнопки в соседних
   строках, и ни одна не стоит там, где начинается её значение.
   Столбик отвечает на вопрос «чья кнопка» самим расположением: значение,
   под ним его кнопка. align-items: flex-start — чтобы кнопка была шириной
   по надписи, а не во всю строку: кнопка во всю ширину читается как главное
   действие страницы, а главное здесь — не «скопировать», а «позвонить». */
.poluchatel__stroka {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 6px;
  overflow-wrap: anywhere;
}
/* 🔴 НАХОДКА ТЕЛЕФОН-2, Т2-1. НА ВИТРИНЕ ЭТА КНОПКА НЕ БЫЛА ОДЕТА ВОВСЕ.
   Разметка строки реквизитов на витрине и на «Заявке принятой» дословно
   одна — это уговор, на нём стоит сторож test_doveriya.test_d1_06. А вид
   выходил разный, и вот почему: ВСЕ правила вида кнопок в проекте привязаны
   к .wrap (см. «Кнопки админки» ниже), а .wrap есть только на «Заявке
   принятой». Витрина обёрнута в .site, и кнопка оставалась голой браузерной.
   Замерено на стенде, окно 360 (одинаково на 390, 430 и 768):
     «Заявка принята»  134.1 × 48    кегль 14.5
     витрина           100.6 × 23.6  кегль 13.33
   23.6 точки — вдвое меньше пальцевой цели. Кнопку завели РАДИ ТЕЛЕФОНА,
   чтобы гость не переписывал номер счёта руками, и ровно на телефоне в неё
   было труднее всего попасть.
   🔴 ПРАВИЛО ПРИВЯЗАНО К .calc, А НЕ НАПИСАНО ГОЛЫМ КЛАССОМ. Голое
   .poluchatel__kopiya достало бы и до «Заявки принятой», где эту кнопку
   уже одевают .wrap button и .wrap .btn-ghost, — и однажды разошлось бы
   с ними. Здесь сказано ровно то, что есть: так кнопка выглядит, когда
   стоит в тёмной карточке расчёта.
   Одежда взята у .calc__retry — единственной другой кнопки в этой же
   карточке: своей третьей манеры для тёмного блока заводить незачем.
   Кегль назван числом, а не оставлен наследоваться: вокруг .calc__note
   с его 12.5, и надпись на кнопке вышла бы мельче, чем на соседней
   странице у той же кнопки. */
.calc .poluchatel__kopiya {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: var(--tap);
  /* Отступы и кегль — как у этой же кнопки на «Заявке принятой»
     (.wrap button ниже): у одной кнопки на двух страницах не должно быть
     двух разных размеров, а разошлись бы они на первом же взгляде. */
  padding: 12px 18px;
  font: inherit;
  font-size: 14.5px;
  font-weight: 600;
  line-height: 1.2;
  border-radius: 12px;
  cursor: pointer;
  background: transparent;
  border: 1px solid var(--on-dark);
  color: var(--on-dark);
}
.calc__hint {
  font-size: 13.5px;
  padding: 11px 13px;
  border-radius: 11px;
  background: rgba(149, 159, 148, 0.2);
  border: 1px solid rgba(194, 200, 189, 0.42);
  color: var(--on-dark-4);
}

/* «Посчитать ещё раз» (волна 1, блок 2). Стоит в тёмном блоке расчёта, поэтому
   цвета берутся из светлой части набора: до правки любой сбой связи гасил
   кнопку заявки насмерть, и попробовать снова было нечем. */
/* Подпись про минимум ночей под сеткой календаря (волна 1, блок 8).
   Число приходило на страницу и не читалось скриптом ни разу — гость узнавал
   о минимуме только от сервера, после отказа. */
.cal__min {
  margin: 10px 0 0;
  font-size: 14px;
  line-height: 1.45;
  color: var(--ink);
  font-weight: 600;
}

/* Строка на месте кнопки «Забронировать эти даты», когда даты заняты
   (волна 1, блок 4). Стоит ровно там, где была кнопка: пустое место на её
   месте читается как «здесь ничего нет», а не как «эти даты нельзя». */
.calc__zanyato {
  margin: 10px 0 0;
  padding: 12px 14px;
  border-radius: 12px;
  font-size: 14.5px;
  font-weight: 600;
  line-height: 1.45;
  text-align: center;
  background: rgba(149, 159, 148, 0.2);
  border: 1px solid rgba(194, 200, 189, 0.42);
  color: var(--on-dark);
}

.calc__retry {
  display: block;
  width: 100%;
  margin-top: 10px;
  min-height: var(--tap);
  padding: 12px 18px;
  font: inherit;
  font-weight: 600;
  border-radius: 12px;
  cursor: pointer;
  background: transparent;
  border: 1px solid var(--on-dark);
  color: var(--on-dark);
}

/* ─────────── галерея ─────────── */

.gal { padding: 38px 0 40px; background: var(--green-mid); }
.gal__head { padding: 0 20px; display: flex; flex-direction: column; gap: 8px; }
.gal__head h2 {
  margin: 0 0 4px;
  font-family: var(--font-head);
  font-size: 29px;
  font-weight: 600;
  line-height: 1.15;
  color: var(--green-ink-2);
}
.gal__zones {
  display: flex;
  gap: 8px;
  overflow-x: auto;
  padding: 14px 20px 4px;
  scrollbar-width: none;
}
.gal__zones::-webkit-scrollbar { display: none; }
.zone {
  flex: 0 0 auto;
  height: 40px;
  padding: 0 16px;
  border-radius: 20px;
  border: 1px solid rgba(77, 65, 57, 0.2);
  background: var(--canvas);
  color: var(--ink);
  font-size: 13.5px;
  font-weight: 600;
  font-family: inherit;
  cursor: pointer;
}
.zone.on {
  background: var(--graphite);
  color: var(--on-dark-h);
  border-color: var(--graphite);
}
.gal__shots {
  padding: 14px 20px 0;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
}
/* Атрибут hidden браузер выключает правилом display:none, но правило класса
   выше по силе — без этой строки на экран вываливались все восемь зон разом. */
.gal__shots[hidden] { display: none; }
.shot { display: flex; flex-direction: column; gap: 8px; align-items: flex-start; }
.shot--big { grid-column: span 2; }
.shot__frame {
  width: 100%;
  aspect-ratio: 1 / 1;
  border-radius: 14px;
  background: var(--stub);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 10px;
  overflow: hidden;
}
.shot--big .shot__frame { aspect-ratio: 4 / 3; }
.shot__frame--photo { padding: 0; }
/* <picture> — обычный элемент, и во флексе он не растягивается сам:
   без этой строки картинка занимала только свою долю кадра, а снизу
   оставалась пустая подложка. */
.shot__frame picture { width: 100%; height: 100%; display: block; }
.shot__frame img { width: 100%; height: 100%; object-fit: cover; display: block; }
.shot__stub {
  font: 600 12px var(--font-text);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: #6E655A;
  text-align: center;
  line-height: 1.5;
}
.shot__cap {
  padding: 4px 9px;
  border-radius: 8px;
  background: var(--canvas);
  font-size: 12px;
  color: var(--ink);
}
.gal__note { padding: 16px 20px 0; }
.tag {
  display: inline-block;
  padding: 5px 10px;
  border-radius: 8px;
  background: rgba(237, 231, 219, 0.5);
  font: 600 12px var(--font-text);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ink);
}

/* ─────────── почему Тамур ─────────── */

.why { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 10px; }
.why > div {
  background: var(--green-soft);
  border-radius: 14px;
  padding: 16px 15px 18px;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.why > div::before { content: ""; width: 22px; height: 2px; background: var(--green); }
.why b {
  font-family: var(--font-head);
  font-size: 18px;
  font-weight: 600;
  line-height: 1.25;
  color: var(--ink-dark);
}
.why span { font-size: 13px; line-height: 1.5; color: var(--ink); }

/* ─────────── что входит ─────────── */

.incl { padding: 0 20px 40px; background: var(--green-mid); }
.incl__head {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  padding: 30px 0 26px;
}
.incl__head .eyebrow {
  font-size: 12px;
  color: var(--green-ink);
}
.incl__head h2 {
  margin: 0;
  font-family: var(--font-head);
  font-size: 29px;
  font-weight: 600;
  line-height: 1.15;
  color: var(--green-ink-2);
  text-align: center;
}
.ladoshka { width: 84px; height: 84px; }
.incl__list { background: var(--canvas); border-radius: 18px; padding: 4px 16px 8px; }
.incl__list > div {
  display: flex;
  gap: 14px;
  padding: 15px 0;
  border-bottom: 1px solid var(--line);
}
.incl__list > div:last-child { border-bottom: none; }
.incl__list b {
  flex: 0 0 96px;
  font-family: var(--font-head);
  font-size: 17px;
  font-weight: 600;
  color: var(--ink);
}
.incl__list span { font-size: 14px; line-height: 1.5; color: var(--ink-3); }

.garden {
  margin-top: 12px;
  background: var(--terra);
  border-radius: 18px;
  padding: 20px 18px;
  display: flex;
  gap: 14px;
  align-items: flex-start;
}
.garden > div { display: flex; flex-direction: column; gap: 9px; }
.garden b {
  font-family: var(--font-head);
  font-size: 20px;
  font-weight: 600;
  line-height: 1.3;
  color: var(--on-terra);
}
.garden span { font-size: 14px; line-height: 1.55; color: var(--on-terra-2); }
.garden .ladoshka { width: 62px; height: 62px; flex: 0 0 62px; }

/* ─────────── удобства ─────────── */

.amen { display: flex; flex-direction: column; gap: 22px; }
.amen__group { display: flex; flex-direction: column; gap: 11px; }
.amen__group > b {
  font: 700 12px var(--font-text);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--green);
}
.amen__list {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px 12px;
  margin: 0;
  padding: 0;
  list-style: none;
}
.amen__list li {
  display: flex;
  align-items: baseline;
  gap: 8px;
  font-size: 14px;
  color: var(--ink);
}
.amen__list li::before {
  content: "";
  flex: 0 0 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--green);
  transform: translateY(-3px);
}

.beds {
  background: var(--green-soft);
  border-radius: 16px;
  padding: 18px 16px;
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.beds__head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
}
.beds__head b {
  font-family: var(--font-head);
  font-size: 19px;
  font-weight: 600;
  color: var(--ink-dark);
}
.beds__head span {
  font: 700 12px var(--font-text);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--terra-dark);
}
.beds__list { display: flex; flex-direction: column; gap: 8px; margin: 0; padding: 0; list-style: none; }
.beds__list li {
  display: flex;
  justify-content: space-between;
  gap: 10px;
  font-size: 14px;
  color: var(--ink);
  padding-bottom: 8px;
  border-bottom: 1px solid rgba(77, 65, 57, 0.16);
}
.beds__list li:last-child { padding-bottom: 0; border-bottom: none; }
.beds__list b { color: var(--ink-2); font-weight: 400; }

/* ─────────── фотополоса ─────────── */

.strip { position: relative; height: 230px; overflow: hidden; }
.strip img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center 42%;
}
.strip__cap {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 14px 20px;
  /* 🔴 ДОСТУПНОСТЬ. ПОДПИСЬ ЛЕЖАЛА НА НЕБЕ И НЕ ЧИТАЛАСЬ ВОВСЕ.
     Затемнение шло от нуля вверху до 0.7 внизу, а строка стоит в верхней
     половине подписи — там, где затемнения ещё почти нет. Замерено
     на самой фотографии: цвета кадра прочитаны из <img> через canvas,
     сложены с затемнением по высоте строки, худшая точка — светлое небо:
     контраст 1.36 при норме 4.5 (было 1.50 / 1.63 / 1.95 ниже по строке).
     Число зависит от кадра: поставит владелец кадр светлее — станет хуже.

     Поэтому затемнение набирает силу ДО строки, а не под ней: 0.82
     достигнуто к 28% высоты подписи, а текст занимает 32–68%. 0.82
     графита поверх ЧИСТО БЕЛОГО даёт 5.14 — то есть порог держится
     на любой фотографии, какую бы владелец ни поставил, а не только
     на нынешней. Верхние 28% остаются мягким переходом, как и были. */
  background: linear-gradient(180deg, rgba(51, 56, 62, 0) 0%, rgba(51, 56, 62, 0.82) 28%);
  font: 600 12px var(--font-text);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--on-dark-h);
}

/* ─────────── цены и условия ─────────── */

.price { display: flex; align-items: baseline; gap: 9px; margin: 12px 0 4px; }
.price b {
  font-family: var(--font-head);
  font-size: 44px;
  font-weight: 700;
  line-height: 1;
  color: var(--terra-dark);
}
.price span { font-size: 16px; color: var(--ink-3); }
.price__sub { font-size: 15px; color: var(--ink-3); margin: 0 0 22px; }
.times { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.times > div {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: 13px;
  padding: 14px;
  display: flex;
  flex-direction: column;
  gap: 5px;
}
.times b { font-family: var(--font-head); font-size: 19px; font-weight: 600; color: var(--ink); }
.terms { margin-top: 10px; display: flex; flex-direction: column; }
.terms > div {
  display: flex;
  justify-content: space-between;
  gap: 14px;
  padding: 14px 0;
  border-bottom: 1px solid var(--line);
}
/* 🔴 НАХОДКА ТЕЛЕФОНА Т-2. ЗАПРЕТ ПЕРЕНОСА СТОЯЛ НА ЧУЖОМ ТЕКСТЕ.

   У правой половины строки условий стояло white-space: nowrap. Поставлено
   оно было ради СУММ: «15 000 ₽» посреди строки рвать нельзя. Но в ту же
   правую половину приходит и свободный текст владельца — настройка
   `guests_note`, «дети считаются наравне со взрослым». Перенести его
   браузеру запретили, ужать тоже (запрет переноса делает наименьшую ширину
   узла равной всей строке), и он уехал за правый край экрана. Заодно левая
   половина, которой не осталось места, рассыпала «всего в доме до 8 человек»
   в столбик по одному-два слова.

   🔴 СУММЫ ПРИ ЭТОМ НЕ РВУТСЯ, И ЭТО НЕ СЛУЧАЙНОСТЬ. booking.money() режет
   разряды НЕРАЗРЫВНЫМ пробелом (U+00A0) ровно для этого — проверено:
   «15 000 ₽» — это 0x31 0x35 0xA0 0x30 0x30 0x30 0xA0 0x20BD. Запрет
   переноса в стилях был вторым, лишним поясом на том же месте, и именно он
   ломал соседний случай. Не возвращать: место чужого текста здесь такое же
   законное, как место суммы.

   min-width: 0 у обеих половин — то, без чего гибкая раскладка не даёт
   узлу стать уже своего содержимого. */

/* 🔴 НАХОДКА Г8-2 (глаза-8, боевой сайт, 17.08.2026). ОДНО ПРАВИЛО НА ДВА
   РАЗНЫХ СЛУЧАЯ — И ЕГО ПЕРЕСТАВЛЯЛИ С КОНЦА НА КОНЕЦ.

   В строке «Залог» справа вместо «10 000 ₽» стояло 1 / 0 / 0 / 0 / 0 / ₽,
   по одному знаку в строку. Владелец снял это с телефона, в приватной
   вкладке, то есть на свежем коде.

   Разбор выше (находка Т-2) утверждает, что суммы не пострадают, потому
   что разряды в них разделены НЕРАЗРЫВНЫМ пробелом. 🔴 Утверждение неверно.
   Неразрывный пробел запрещает перенос В ПРОБЕЛЕ. `overflow-wrap: anywhere`
   разрешает рвать В ЛЮБОМ МЕСТЕ, включая середину числа, — он для того
   и заведён, чтобы не дать узлу вылезти за край любой ценой.

   🔴 И это не всё, что делает `anywhere`. В отличие от `break-word`, он
   учитывается при расчёте НАИМЕНЬШЕЙ СОБСТВЕННОЙ ширины узла: она
   становится равной одному знаку. Для гибкой раскладки это значит
   «этот узел можно сжимать до упора» — и она сжимает, когда слева тесно.
   У строки «Залог» слева длинное пояснение про удержания, оно съедает
   ширину, правой половине не остаётся места, и она разваливается в столбик.

   🔴 ПОЧЕМУ ПОЧИНКА НЕ В ТОМ, ЧТОБЫ ВЕРНУТЬ КАК БЫЛО. В правую половину
   строки условий приходят ДВА РАЗНЫХ СЛУЧАЯ, и у них противоположные
   требования:

     · СУММА — «10 000 ₽», «250 ₽ за сутки». Рвать нельзя вовсе, и сжимать
       нельзя: она обязана занимать столько, сколько нужно;
     · СВОБОДНЫЙ ТЕКСТ ВЛАДЕЛЬЦА — guests_note, cleaning_note, «дети
       считаются наравне со взрослыми». Переносится обычным образом
       по словам и обязан ужиматься.

   Одно правило на оба случая ломало то один, то другой:

       до 16.08   запрет переноса обоим     свободный текст уехал за край
       16.08      перенос где угодно обоим  СУММЫ ВСТАЛИ СТОЛБИКОМ

   Поэтому ниже случаи РАЗВЕДЕНЫ: `.terms b` — свободный текст,
   `.terms b.summa` — сумма. Сторожа на оба конца сразу — test_glaza_8,
   блок 2. Вернуть одно правило на оба случая нельзя ни в ту, ни в другую
   сторону: на каждую сторону покраснеет свой сторож. */

.terms span {
  font-size: 14.5px;
  color: var(--ink);
  min-width: 0;
  /* Левая половина обязана УЖИМАТЬСЯ И ПЕРЕНОСИТЬСЯ, а не выталкивать
     соседа: пояснение про удержания длинное, и место ему уступает
     именно она. break-word, а не anywhere: рвать слово разрешается
     только когда оно целиком не влезает в строку. */
  overflow-wrap: break-word;
}
.terms span small { display: block; font-size: 13px; color: var(--ink-4); }

/* СЛУЧАЙ ПЕРВЫЙ: свободный текст владельца. Переносится по словам. */
/* 🔴 НАХОДКА О-4 (24.08.2026, владелец с телефона). СТРОКА ПРО ДЕТЕЙ
   ВЫБИВАЛАСЬ ВЛЕВО — И ПРИЧИНА НЕ В НЕЙ, А В ЭТОМ ПРАВИЛЕ.

   Замерено в рамке 390 (стенд _melochi_glaza.py), правый край правой
   половины каждой строки условий:

       Задаток при бронировании   10 000 ₽              355
       Залог                      10 000 ₽              355
       Уборка                     входит в стоимость    355
       Гости                      дети считаются…       337 и 256  ← рвано
       Отмена за 5 суток          возврат задатка       355

   У соседей правая половина — короткая, в одну строку: её коробка обжимает
   текст, и он сам собой встаёт вровень по правому краю (`space-between`
   у строки). Свободный текст владельца в одну строку не влезает, переносится
   и, будучи выключенным влево, обоих строк до правого края не дотягивает.
   Глазами это читается ровно так, как записал владелец: строка стоит левее
   соседних и в один ряд с ними не идёт.

   Поэтому выключка вправо стоит здесь, у свободного текста, а не у строки
   целиком: суммам она без надобности (их коробка и так по ширине текста),
   а левой половине прямо вредна — подпись обязана начинаться слева.
   Правило одной строкой и на своём селекторе; развод двух случаев,
   объяснённый выше, не тронут. */
.terms b {
  font-size: 14.5px;
  font-weight: 700;
  color: var(--terra-dark);
  min-width: 0;
  overflow-wrap: break-word;
  text-align: right;
}

/* СЛУЧАЙ ВТОРОЙ: сумма. Не рвётся и не сжимается — ни при какой тесноте.
   flex-shrink: 0 здесь важнее запрета переноса: без него гибкая раскладка
   отберёт у суммы ширину, и запрет переноса обернётся выездом за край. */
.terms b.summa {
  white-space: nowrap;
  flex-shrink: 0;
  min-width: auto;
  overflow-wrap: normal;
}
.terms b.good { color: var(--green); }
/* 🔴 ДОСТУПНОСТЬ. ТЕРРАКОТА НА СВОЕЙ ЖЕ ПОДЛОЖКЕ ДАВАЛА 4.20 ПРИ НОРМЕ 4.5.
   Причина не в цвете, а в соседстве: имя `warn` занято ещё и плашкой
   состояний (.note/.ok/.err/.warn ниже по файлу), и <b class="warn">
   молча забирает у неё фон rgba(135,93,69,0.08). Терракота садится
   на подкрашенную ею же подложку, и разница уходит под порог.
   Берём --terra-dark: он уже назначен суммам задатка, а строка эта —
   ровно про задаток («задаток остаётся»). Новых оттенков не заводим. */
.terms b.warn { color: var(--terra-dark); }
.terms b.plain { color: var(--ink); }
/* overflow-wrap — находка УБОРКА-1, разбор целиком стоит наверху, рядом
   с .cover__lead. Сюда приходит `extra_charges`, приписка владельца про
   доплаты: длинное слитное слово в ней уезжало за правый край, а край
   его срезал (замер стенда, окно 360: вылезало 76 точек). Правило стоит
   отдельным своим селектором, а не в общем списке через запятую, — этого
   требует разборщик стилей у test_glaza_8. */
.terms__note {
  margin-top: 14px;
  font-size: 13px;
  line-height: 1.5;
  color: var(--ink-4);
  overflow-wrap: anywhere;
}

/* ─────────── правила дома ─────────── */

.sec--dark h2 { margin: 8px 0 12px; }
.rules__lead { margin: 0 0 22px; font-size: 15px; line-height: 1.55; color: var(--on-dark-2); }
.rules__who {
  background: rgba(149, 159, 148, 0.22);
  border: 1px solid rgba(194, 200, 189, 0.4);
  border-radius: 16px;
  padding: 18px 16px;
  margin-bottom: 22px;
  display: flex;
  flex-direction: column;
  gap: 9px;
}
.rules__who b {
  font-family: var(--font-head);
  font-size: 20px;
  font-weight: 600;
  line-height: 1.3;
  color: var(--on-dark-h);
}
.rules__who span { font-size: 14.5px; line-height: 1.55; color: var(--on-dark-4); }
.rules__list { display: flex; flex-direction: column; margin: 0; padding: 0; list-style: none; counter-reset: rule; }
.rules__list li {
  display: flex;
  gap: 13px;
  padding: 16px 0;
  border-top: 1px solid rgba(237, 231, 219, 0.16);
  font-size: 15px;
  line-height: 1.5;
  color: var(--on-dark);
}
.rules__list li:last-child { border-bottom: 1px solid rgba(237, 231, 219, 0.16); }
.rules__list li::before {
  counter-increment: rule;
  content: counter(rule, decimal-leading-zero);
  flex: 0 0 22px;
  font: 700 12px var(--font-text);
  color: var(--green-soft);
  padding-top: 3px;
}
.rules__list b { font-weight: 700; }
.rules__tail { margin: 20px 0 0; font-size: 14.5px; line-height: 1.55; color: var(--on-dark-2); }
/* Блок 2 «поля доверия»: запись в реестре под правилами дома. Цвет текста
   и цвет ссылки взяты у соседей по этой же тёмной секции (.rules__tail
   и счётчик правил), чтобы не заводить новую пару цветов на тёмном фоне:
   каждая такая пара — это ещё одно место, где может не хватить различимости. */
.rules__reestr { margin: 14px 0 0; font-size: 13px; line-height: 1.55; color: var(--on-dark-2); }
.rules__reestr a { color: var(--green-soft); }

/* ─────────── отзывы ─────────── */

.revs { display: flex; gap: 10px; overflow-x: auto; padding-bottom: 6px; scrollbar-width: none; }
.revs::-webkit-scrollbar { display: none; }
.rev {
  flex: 0 0 236px;
  border: 1px dashed var(--green-dash);
  border-radius: 14px;
  padding: 16px;
  display: flex;
  flex-direction: column;
  gap: 11px;
  background: var(--card);
}
.rev__kind {
  font: 600 12px var(--font-text);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ink-4);
}
/* 🔴 НАХОДКА ГЛАЗ Г7-3. Здесь жило правило `.rev i` — серые полоски на месте
   ненаписанного текста отзыва. Убрано вместе с самими рамками: отзывов нет,
   значит нет и раздела (см. index.html). Полоска-скелет уместна там, где
   содержимое СЕЙЧАС ГРУЗИТСЯ и через миг придёт; у нас оно не грузится —
   его просто нет, и рисовать его тень значило обещать несуществующее.
   Правило ниже — под НАСТОЯЩИЙ текст отзыва, когда первый появится. */
.rev__tekst { margin: 0; font-size: 14.5px; line-height: 1.55; color: var(--ink-2); }
.rev__sign { margin-top: 4px; font-size: 13px; color: var(--ink-5); }

/* ─────────── как добраться ─────────── */

.route h2 { margin: 8px 0 16px; }

/* 🔴 НАХОДКА ГЛАЗ Г7-2. Здесь жило правило `.map` — прямоугольник 4:3
   в серую полоску (var(--stub)) с подписью «КАРТА» посреди. Карты за ним
   не стояло никакой: это была заглушка макета, вынесенная людям. Убрано
   вместе с самим узлом (см. index.html); на его место встал блок «Сколько
   ехать», и тот показывается, только когда владелец заполнил хоть одну
   настройку. Пусто — в этой колонке нет НИЧЕГО, и решётка раздела просто
   отдаёт всё место кнопкам связи.

   Полоска `--stub` при этом остаётся в токенах: ею подписаны зоны галереи,
   где заглушка законна — там кадр правда придёт, и рамка держит его место. */
.puti {
  background: rgba(247, 243, 234, 0.55);
  border: 1px solid rgba(220, 211, 194, 0.7);
  border-radius: 16px;
  padding: 16px;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.puti__cap {
  font: 600 12px var(--font-text);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--green-ink);
  margin-bottom: 8px;
}
/* Половины строки ужимаются и переносятся: справа стоит свободный текст
   владельца («15 минут на машине, 9 км»), а он бывает какой угодно длины.
   Ровно на этом обжёгся блок условий — находка Т-2, там текст владельца
   уехал за правый край. Второй раз ту же яму не копаем. */
.puti__stroka {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  padding: 9px 0;
  border-bottom: 1px solid rgba(220, 211, 194, 0.55);
}
.puti__stroka:last-child { border-bottom: 0; }
.puti__stroka span { font-size: 14.5px; color: var(--ink-dark); min-width: 0; }
.puti__stroka b {
  font-size: 14.5px;
  font-weight: 700;
  color: var(--green-ink-2);
  min-width: 0;
  text-align: right;
  overflow-wrap: anywhere;
}
.route__btns { display: flex; gap: 9px; margin-top: 14px; }
.route__note { margin-top: 12px; }

/* ─────────── форма заявки ─────────── */

#form { padding: 40px 20px 44px; scroll-margin-top: 12px; }
#form h2 { margin: 8px 0 6px; }
#form .sec__lead { font-size: 14.5px; margin-bottom: 20px; }
.form__col { display: flex; flex-direction: column; gap: 12px; }
.form__dates { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
/* 🔴 ВОЛНА 1, БЛОК 6. ПОКАЗ ДАТ ОФОРМЛЕН КАК ПОКАЗ, А НЕ КАК ПОЛЕ ВВОДА.
   Здесь стояли ровно те же три свойства, что у полей ввода строкой ниже:
   background: var(--card), border: 1px solid var(--line), border-radius: 12px.
   Гость видел четыре одинаковых прямоугольника, два верхних не нажимались —
   и решал, что форма сломана.
   Теперь ни фона поля, ни рамки поля, ни радиуса поля: дату отмечает полоса
   слева, как подпись, а не как строку для ввода. Разойтись этим двум видам
   заново не даст тест: он сверяет фактические свойства, а не селекторы. */
.form__dates > div {
  background: transparent;
  border: none;
  border-left: 3px solid var(--green);
  border-radius: 0;
  padding: 2px 0 2px 11px;
  display: flex;
  flex-direction: column;
  gap: 3px;
}
.form__dates b { font-size: 17px; font-weight: 700; }

/* «Изменить даты» — живая ссылка в календарь. Рядом с показом дат обязана
   быть хоть одна работающая дорога: иначе человек, увидев не те даты, ищет,
   куда нажать, не находит и уходит. */
.form__change {
  align-self: flex-start;
  min-height: var(--tap);
  display: inline-flex;
  align-items: center;
  font-weight: 600;
  color: var(--green);
  text-decoration: underline;
}
/* 🔴 ВОЛНА 4, БЛОК 4-1. ВИДИМАЯ ПОДПИСЬ НАД ПОЛЕМ.
   Раньше подписи полей формы стояли с классом .vh — размером 1×1 точка,
   для программ чтения с экрана. Зрячий человек видел только подсказку
   внутри поля, а она исчезает при первом набранном знаке.

   Размер 14 точек — не меньше двенадцати (блок 4-2): подпись читают те же
   люди 40–60 лет, что и всё остальное. Цвет --ink-2 — тот же, которым
   набраны подписи в полях по всему сайту.

   Отрицательный нижний отступ не прихоть: .form__col — колонка с зазором
   12 точек между всеми детьми подряд, и подпись отстояла бы от своего поля
   ровно так же, как от чужого. Минус 6 прижимает её к своему: 12 − 6 = 6
   до своего поля против 12 до соседнего. */
.form__label {
  font-size: 14px;
  font-weight: 600;
  color: var(--ink-2);
  margin-bottom: -6px;
}

/* Подсказка, стоящая сразу ПОД своим полем, — та же беда с другого конца
   и тот же приём. Сегодня такая одна: «Оставьте почту — пришлём подтверждение
   заявки». .form__col — колонка с зазором 12 точек между всеми детьми подряд,
   и подсказка отстояла бы от своего поля ровно так же, как от чужого «Гостей»
   снизу: 25 точек вверх и 25 вниз, и по виду не понять, к какому полю она
   относится. Минус 6 прижимает её к своему: 6 вверх против 12 вниз.

   🔴 СТОЯЛО ЭТО В РАЗМЕТКЕ, style="margin-top:-6px", и переехало сюда
   24.08.2026 (просьба окна «ГОСТЬ ПОСЛЕ КНОПКИ»: файл стилей ему править
   не поручено, и оно честно записало долг вместо того, чтобы лезть в чужое).

   🔴 ПОЧЕМУ ВЫБРАНА СОСЕДНЯЯ ПАРА «ПОЛЕ + ПОДСКАЗКА», А НЕ ПРОСТО
   .form__why. Тем же классом набраны ещё две подсказки формы: «Даты
   не выбраны» под парой дат и «Чтобы отправить…» под кнопкой. Им прижиматься
   не к чему, и общий отрицательный отступ сдвинул бы обе. Отбор по соседству
   с полем ввода описывает ровно то, ради чего отступ и нужен, — и остаётся
   верным, если завтра такая подсказка появится под другим полем. */
.form__col input + .form__why { margin-top: -6px; }

.form__col input[type="text"],
.form__col input[type="tel"] {
  height: 54px;
  padding: 0 14px;
  border-radius: 12px;
  border: 1px solid var(--line);
  background: var(--card);
  font-size: 16px;
  width: 100%;
}
.form__col textarea {
  padding: 13px 14px;
  border-radius: 12px;
  border: 1px solid var(--line);
  background: var(--card);
  font-size: 16px;
  line-height: 1.45;
  resize: vertical;
  width: 100%;
}
.form__guests {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  height: 54px;
  padding: 0 8px 0 14px;
  border-radius: 12px;
  border: 1px solid var(--line);
  background: var(--card);
}
.form__guests > span { font-size: 16px; color: var(--ink-2); }
.form__consent {
  display: flex;
  gap: 11px;
  align-items: flex-start;
  padding: 4px 2px;
  cursor: pointer;
}
.form__consent input {
  width: 22px;
  height: 22px;
  flex: 0 0 22px;
  margin: 1px 0 0;
  accent-color: var(--green);
}
.form__consent span { font-size: 13.5px; line-height: 1.45; color: var(--ink-3); }
/* Единственное место, где подчёркивание вернули: галочкой гость соглашается
   на обработку своих данных, и ссылки на документы обязаны быть заметны.
   Зелёный на кремовом в 13.5px читается как обычный текст. */
.form__consent a { text-decoration: underline; text-underline-offset: 2px; }
.form__why { margin: 0; font-size: 13px; line-height: 1.45; color: var(--ink-4); }
.form__pair { display: flex; gap: 9px; }

/* ─────────── подвал ─────────── */

.foot {
  padding: 34px 20px 108px;
  background: var(--graphite);
  color: var(--on-dark-2);
  display: flex;
  flex-direction: column;
  gap: 22px;
}
.foot__top { display: flex; align-items: center; justify-content: space-between; gap: 14px; }
.foot__brand { display: flex; flex-direction: column; gap: 7px; }
.foot__brand b {
  font-family: var(--font-head);
  font-size: 22px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--on-dark-h);
}
.foot__brand span {
  font: 600 12px var(--font-text);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--green-soft);
}
.foot .ladoshka { width: 66px; height: 66px; flex: 0 0 66px; }
.foot__about { font-size: 14px; line-height: 1.5; }
.foot__contacts { display: flex; flex-direction: column; gap: 9px; }
.foot__phone {
  font-family: var(--font-head);
  font-size: 25px;
  font-weight: 600;
  color: var(--on-dark-h);
}
.foot__links { display: flex; gap: 16px; font-size: 14px; }
.foot__links a, .foot__legal a { color: var(--green-soft); }
.foot__hr { height: 1px; background: rgba(237, 231, 219, 0.16); }
.foot__legal {
  display: flex;
  flex-direction: column;
  gap: 7px;
  font-size: 12.5px;
  line-height: 1.5;
  color: var(--on-dark-5);
}
.foot__legal .eyebrow { font-size: 12px; letter-spacing: 0.12em; color: var(--on-dark-6); }
.foot__legal > div { display: flex; gap: 16px; margin-top: 6px; }
/* Блок 2 «поля доверия»: та же запись в реестре, второе место показа.
   Цвет наследуется от .foot__legal, ссылка — от .foot__legal a. */
.foot__reestr { margin: 6px 0 0; }

/* ─────────── липкая нижняя кнопка ─────────── */

.sticky {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 60;
  display: flex;
  justify-content: center;
  padding: 0 16px calc(var(--sticky-podval) + env(safe-area-inset-bottom));
  pointer-events: none;
}

/* 🔴 НАХОДКА ГЛАЗ Г-1, вторая половина. Полоса, закрывающая собственную
   форму, бесполезна вдвойне. На первом экране телефона прямо под ней лежит
   карточка выбора дат: гость видел подписи «Заезд» и «Выезд», а самих полей
   не видел — их закрывала кнопка, зовущая эти поля заполнить.

   Пока карточка выбора дат на экране, полоса не нужна: дорога к действию
   и так перед глазами. Полоса — про «вернуть кнопку, когда она уехала
   вверх», и появляется она именно тогда.

   Класс снимает скрипт. Начальное состояние — ВИДНА, а не спрятана: сломайся
   скрипт, гость останется с сегодняшним поведением, а не без кнопки вовсе. */
.sticky--skryta { display: none; }

.sticky a {
  pointer-events: auto;
  width: 430px;
  max-width: 100%;
  height: var(--sticky-knopka);
  border-radius: 15px;
  background: var(--green);
  color: var(--on-dark-h);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  font-size: 16px;
  font-weight: 700;
  box-shadow: 0 12px 30px rgba(51, 56, 62, 0.36);
}
.sticky i { opacity: 0.6; font-style: normal; }
.sticky b { font-weight: 600; }

/* ─────────── живые состояния, которых в эталоне нет ─────────── */

.alert {
  border-radius: 13px;
  padding: 14px 16px;
  font-size: 14.5px;
  line-height: 1.5;
  background: rgba(135, 93, 69, 0.12);
  border: 1px solid rgba(135, 93, 69, 0.4);
  color: var(--terra-dark);
}
.alert strong { display: block; font-weight: 700; margin-bottom: 3px; }
.alert--dark {
  background: rgba(135, 93, 69, 0.26);
  border-color: rgba(234, 224, 214, 0.4);
  color: #F3E4DC;
}
/* Пустое состояние витрины. Имя НЕ .empty: так называется пустая клетка
   в календаре админки (td.empty), и пунктирная рамка уезжала туда. */
.blank {
  border-radius: 13px;
  padding: 16px;
  background: var(--card);
  border: 1px dashed var(--green-dash);
  font-size: 14px;
  line-height: 1.5;
  color: var(--ink-3);
}

/* ═══════════════════════════ простые страницы ═══════════════════════════
   «Спасибо», «Политика», «Оферта», страница ошибки: тот же скин, без обложки.
   Живут внутри .wrap — палитра и кегли те же, что у витрины. */

.hero {
  border-radius: 18px;
  background: var(--card);
  border: 1px solid var(--line);
  padding: 24px 18px;
  margin: 18px 0;
  text-align: center;
}
.hero h1 {
  margin: 0 0 6px;
  font-family: var(--font-head);
  font-size: 29px;
  font-weight: 600;
  line-height: 1.15;
  color: var(--ink);
}
.hero .tagline { margin: 0; font-size: 16px; line-height: 1.5; color: var(--ink-3); }

ul.plain { padding-left: 20px; margin: 8px 0; }
ul.plain li { margin: 5px 0; line-height: 1.5; }

.page {
  max-width: 720px;
  margin: 0 auto;
  background: var(--canvas);
  min-height: 100vh;
  padding: 32px 20px 48px;
}
.page h1 {
  margin: 0 0 12px;
  font-family: var(--font-head);
  font-size: 29px;
  font-weight: 600;
  line-height: 1.15;
  color: var(--ink);
}
.page h2 {
  margin: 26px 0 10px;
  font-family: var(--font-head);
  font-size: 20px;
  font-weight: 600;
  color: var(--ink);
}
.page h3 { margin: 18px 0 8px; font-family: var(--font-head); font-size: 17px; font-weight: 600; }
.page p, .page li { font-size: 15px; line-height: 1.55; }
.page .muted { color: var(--ink-3); }

/* ═══════════════════════════ админка ═══════════════════════════
   Та же палитра, но рабочая: кремовый фон, тёмная шапка, один акцент,
   крупные элементы под палец. Порядок экранов не менялся. */

.wrap {
  max-width: 900px;
  margin: 0 auto;
  background: var(--canvas);
  min-height: 100vh;
  padding: 0 14px 90px;
}

.wrap h1 { font-family: var(--font-head); font-size: 25px; line-height: 1.25; margin: 18px 0 10px; }
.wrap h2 { font-family: var(--font-head); font-size: 20px; font-weight: 600; margin: 26px 0 10px; }
.wrap h3 { font-family: var(--font-head); font-size: 17px; font-weight: 600; margin: 18px 0 8px; }
.wrap p { margin: 10px 0; }

.muted { color: var(--ink-3); font-size: 15px; }
.small { font-size: 14px; }

.topbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin: 0 -14px 12px;
  padding: 12px 16px;
  background: var(--graphite);
  color: var(--on-dark-h);
}
.topbar .who {
  font-family: var(--font-head);
  font-weight: 600;
  font-size: 19px;
  letter-spacing: 0.04em;
  color: var(--on-dark-h);
}
/* Сила селектора здесь не украшение: общее правило .wrap .btn-ghost идёт ниже
   по файлу и при равном весе перекрасило бы «Выйти» в кремовый на тёмной шапке. */
.wrap .topbar .btn-ghost {
  background: rgba(237, 231, 219, 0.16);
  border-color: rgba(237, 231, 219, 0.34);
  color: var(--on-dark-h);
}

/* 🔴 НАХОДКА ТЕЛЕФОНА Т-7. ЛЕНТА ВКЛАДОК ОБРЫВАЛАСЬ НА «ПЛО…».

   Что было: лента прокручивалась вбок (overflow-x: auto), а полоса прокрутки
   пряталась своим же правилом. На 390 точках в неё влезали четыре вкладки
   с половиной, и «Настройки» не было видно вовсе — вместе с ценой, задатком,
   буфером, временем заезда и всеми полями доверия. Признака прокрутки
   на экране не было ни одного: ни полосы, ни обрыва, ни стрелки.

   🔴 ПРИЗНАК НАЗВАН ПРЕЖДЕ, ЧЕМ ЧИНИТЬ — как велит грабля 01.08.
   Тогда ленту чинили ПО ШИРИНЕ ЭКРАНА, и это было неверно: узкое окно
   на компьютере — это по-прежнему мышь. Правильным признаком оказалось
   «чем человек управляет» (см. правило внизу файла).

   Здесь признак ТРЕТИЙ, и он не про экран и не про указатель:
   ПОМЕЩАЕТСЯ ЛИ СПИСОК ЦЕЛИКОМ. Вкладок пять, они и есть вся карта
   программы; вкладка, которой не видно, для владельца не существует.
   Ни ширина, ни тип указателя на этот вопрос не отвечают.

   Ответить на него правилом стилей нельзя: помещается или нет, считает
   браузер. Поэтому вопрос СНЯТ — прокрутки нет вовсе, лента переносится
   строками. Не помещается в строку — уходит на вторую, и видно по-прежнему
   всё. Это работает на любой ширине и при любом указателе, и не зависит
   от того, сколько вкладок будет завтра.

   Не возвращать overflow-x: auto — за этим следит test_a16_25. */
nav.tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  padding: 4px 0 10px;
  margin-bottom: 6px;
}
nav.tabs a {
  flex: 0 0 auto;
  padding: 0 16px;
  height: 40px;
  display: flex;
  align-items: center;
  border: 1px solid rgba(77, 65, 57, 0.2);
  border-radius: 20px;
  text-decoration: none;
  color: var(--ink);
  background: var(--card);
  font-size: 13.5px;
  font-weight: 600;
  white-space: nowrap;
}
nav.tabs a.active { background: var(--graphite); color: var(--on-dark-h); border-color: var(--graphite); }
.badge {
  display: inline-block;
  min-width: 22px;
  padding: 1px 7px;
  margin-left: 6px;
  border-radius: 999px;
  background: var(--terra-dark);
  color: var(--on-dark-h);
  font-size: 13px;
  text-align: center;
}

/* плашки */
.note, .ok, .err, .warn {
  border-radius: 13px;
  padding: 14px 16px;
  margin: 12px 0;
  border: 1px solid var(--line);
  background: var(--card);
  font-size: 14.5px;
  line-height: 1.5;
}
.ok   { background: rgba(75, 100, 72, 0.12);  border-color: rgba(75, 100, 72, 0.4);  color: #2E4A2C; }
.err  { background: rgba(135, 93, 69, 0.12);  border-color: rgba(135, 93, 69, 0.45); color: var(--terra-dark); }
.warn { background: rgba(135, 93, 69, 0.08);  border-color: rgba(135, 93, 69, 0.3);  color: #6B3E28; }
.err strong, .warn strong, .ok strong { display: block; margin-bottom: 3px; font-weight: 700; }
.err.compact { padding: 12px 14px; font-size: 14.5px; font-weight: 600; }
.err.compact a { color: inherit; text-decoration: none; display: block; }

.box {
  border: 1px solid var(--line);
  border-radius: 16px;
  padding: 16px;
  margin: 14px 0;
  background: var(--card);
}
.box.soft { background: var(--canvas); }

/* Кнопки админки.
   🔴 Все правила ниже обязаны быть привязаны к .wrap. Пока правило было
   написано как просто `button`, оно доставало и до витрины: кнопкам «−/+»
   и стрелкам календаря доставался кремовый цвет текста на кремовом фоне —
   символы пропадали с экрана насовсем. Общих element-правил здесь не место. */
.wrap button, .wrap .btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  min-height: var(--tap);
  padding: 12px 18px;
  font: inherit;
  font-weight: 600;
  border-radius: 13px;
  border: 1px solid var(--graphite);
  background: var(--graphite);
  color: var(--on-dark-h);
  text-decoration: none;
  cursor: pointer;
}
.wrap button:disabled, .wrap .btn:disabled { background: var(--busy); border-color: var(--busy); color: var(--ink-off-btn); cursor: not-allowed; }
.wrap .btn-main { background: var(--green); border-color: var(--green); color: var(--on-dark-h); font-size: 17px; }
.wrap .btn-ghost { background: var(--card); color: var(--ink); border-color: var(--line); font-weight: 600; }
/* 🔴 ОПАСНАЯ КНОПКА ЗАЛИТА ЦВЕТОМ, И ЭТО НЕ УКРАШЕНИЕ (задание №9, блок 6).
   Замер глаз на экране смены ключа: «Да, сменить ключ» и «Нет, вернуться
   назад» имели ОДИН фон rgb(247,243,234), один кегль и одну жирность —
   отличался только цвет букв. Необратимое действие выглядело ровно так же,
   как безобидное, да ещё стояло первым и во всю ширину.
   Заливка обязана отличаться от обычной кнопки: цвет букв — единственное
   отличие, которое не переживает ни слабый экран, ни солнце, ни дальтонизм. */
.wrap .btn-danger {
  background: var(--terra-dark);
  color: var(--on-dark-h);
  border-color: var(--terra-dark);
  font-weight: 700;
}
.btn-wide { width: 100%; }
.btn-row { display: flex; flex-wrap: wrap; gap: 10px; margin: 12px 0; }
.btn-row > form { margin: 0; }

/* формы админки — тоже только внутри .wrap, чтобы не задеть форму витрины */
.wrap label { display: block; margin: 14px 0 0; font-weight: 600; font-size: 15px; }
.wrap label .hint { display: block; font-weight: 400; color: var(--ink-4); font-size: 13.5px; margin-top: 2px; }
/* 🔴 НАХОДКА ВЛАДЕЛЬЦА О-3, 24.08.2026. ПОЛЕ, КОТОРОЕ НЕ УМЕЕТ УЖИМАТЬСЯ,
   ВЫЛЕЗАЕТ ЗА КРАЙ КАРТОЧКИ — И ГРОМЧЕ ВСЕГО ЭТО У ПОЛЕЙ ДАТ.

   Владелец снял это на настоящем телефоне на вкладке «Цены»: поля
   «С какого дня» и «По какой день» вылезали за границу белой карточки.

   🔴 ЧЕСТНО: В БРАУЗЕРЕ, КОТОРЫЙ БЫЛ У ЭТОГО ОКНА, БЕДА НЕ ПОВТОРИЛАСЬ.
   Замер на стенде (Chrome, настоящая раскладка в рамке заданной ширины,
   все шесть вкладок админки на 360, 390 и 430):

     /admin/prices  @360  поле дат: ширина 283.2, наименьшая своя 115.1
     /admin/prices  @390  поле дат: ширина 313.6, наименьшая своя 115.1
     /admin/prices  @430  поле дат: ширина 353.6, наименьшая своя 115.1
     за край родителя на всех шести вкладках и всех трёх ширинах — ничего

   Значит движок у владельца другой (телефон), и своими глазами эту беду
   это окно НЕ ВИДЕЛО. Поэтому чиним не «то, что видно», а сам зазор,
   через который такая беда только и может пройти.

   🔴 ЧЕМ ИМЕННО. У поля ввода есть СВОЯ наименьшая ширина, и берётся она
   не из содержимого: браузер даёт полю ввода собственный размер (у поля
   даты в него входит нарисованная им же дата и значок календаря). В гибкой
   и в сеточной раскладке узел по умолчанию НЕ МОЖЕТ стать уже своей
   наименьшей ширины (min-width: auto) — и когда места меньше, он не
   ужимается, а вылезает. Ровно этот зазор окно «Телефон» закрывало
   в блоке условий витрины (находка Т-2, min-width: 0 у обеих половин),
   и приём здесь взят тот же, а не выдуман свой.

   max-width: 100% — вторая половина того же: «width: 100%» задаёт ЖЕЛАЕМУЮ
   ширину, и движок вправе оставить поле шире, если считает, что уже нельзя.
   Верхний предел говорит прямо: шире своей коробки — никогда.

   🔴 ЧЕГО ЗДЕСЬ НЕТ И БЫТЬ НЕ ДОЛЖНО — ОБРЕЗКИ. overflow: hidden убрал бы
   признак беды (за край ничего не торчит) и оставил бы саму беду: часть
   поля пропала бы с экрана, и владелец не увидел бы, что чего-то не видит.
   Тот же довод, что у строки реквизитов (находка Т2-2, второй конец пары,
   сторож test_telefon.test_t_07). За этим следит и наш сторож —
   test_adminka_ponyatnost, блок О-3. */
.wrap input, .wrap textarea, .wrap select {
  width: 100%;
  min-width: 0;
  max-width: 100%;
  min-height: 54px;
  padding: 12px 14px;
  margin-top: 6px;
  font: inherit;
  font-size: 16px;
  color: var(--ink);
  border: 1px solid var(--line);
  border-radius: 12px;
  background: var(--card);
}
.wrap textarea { min-height: 84px; resize: vertical; }
.wrap input[type="checkbox"] {
  width: 22px; height: 22px; min-height: 22px; margin: 0 10px 0 0; accent-color: var(--green);
}
.check { display: flex; align-items: flex-start; font-weight: 400; margin-top: 18px; }
.check span { flex: 1; font-size: 15px; }
/* На телефоне два поля в ряд не помещаются: поле даты уезжало за экран и вся
   страница ехала вбок. Две колонки включаются только с 620px. */
.grid2 { display: grid; grid-template-columns: 1fr; gap: 0 12px; }

/* 🔴 НАХОДКА ГЛАЗ Г5-4. ПАРА ПОЛЕЙ СТОИТ НА ОДНОЙ ЛИНИИ.
   «С какого дня» и «По какой день» — одна пара, а поля ввода стояли
   на разной высоте: под правым заголовком есть пояснение, под левым нет,
   и правое поле уезжало вниз ровно на высоту этой строки. Пара, у которой
   половинки не сходятся, читается как недогруженная страница, а поля дат
   ещё и сравнивают глазами — их для того и поставили рядом.

   Пояснение остаётся: оно объясняет, что день включительный, и убрать его
   значило бы вылечить вид ценой смысла.

   Лечение — подпись становится колонкой, и свободное место уходит МЕЖДУ
   заголовком и полем: заголовки остаются на одной линии сверху, поля —
   на одной линии снизу. Высоту задаёт та половинка, что выше; у неё
   свободного места нет, и с ней ничего не происходит.

   Правило общее для всех пар админки — на этих экранах беда одна и та же:
   «Цены», «Календарь» (закрыть даты) и «Новая бронь». */
/* min-width: 0 — вторая половина находки О-3, и она про САМУ ПАРУ.
   Половинка пары — узел сетки, и ей по умолчанию тоже нельзя стать уже
   своего содержимого. Разреши ужиматься полю, но не половинке — и за край
   поедет уже половинка вместе с полем внутри. Разрешать надо обоим. */
.grid2 > label {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  min-width: 0;
}

/* ═══════ О-2. РАЗДЕЛЫ ЭКРАНА НАСТРОЕК ═══════
   Экран настроек был одной длинной простынёй без единой перегородки.
   Разделы отбиты рамкой и подписью, но НЕ закрыты: закрытая шторка прячет
   в том числе и беду, а на этом экране первым стоит список недописанных
   документов. Довод целиком — в templates/admin_settings.html, у оглавления.

   🔴 min-width: 0 У РАМКИ — НЕ УКРАШЕНИЕ, А ТА ЖЕ НАХОДКА О-3.
   У fieldset есть СВОЯ наименьшая ширина, и по умолчанию он не даёт себе
   стать уже её — это его давняя особенность, а не наша ошибка. Обведи мы
   поля рамкой и промолчи об этом, и на узком экране за край поехала бы уже
   рамка вместе со всем, что внутри: чинили бы поля дат, а завели бы ту же
   беду на десяти разделах сразу. */
.wrap fieldset.group {
  min-width: 0;
  margin: 18px 0;
  padding: 0 14px 14px;
  border: 1px solid var(--line);
  border-radius: 14px;
  background: var(--canvas);
  /* Оглавление ведёт сюда ссылкой-якорем. Без этого зазора подпись раздела
     упирается в самый край окна и читается как обрезанная. */
  scroll-margin-top: 12px;
}
.wrap fieldset.group > legend {
  padding: 0 8px;
  font-family: var(--font-head);
  font-size: 16px;
  font-weight: 600;
  color: var(--ink);
}
/* Первое поле раздела не должно прижиматься к подписи вплотную: у .wrap label
   отступ сверху 14, и внутри рамки его хватает. Здесь снимаем только лишний
   отступ у самого первого узла, чтобы рамка не выглядела пустой сверху. */
.wrap fieldset.group > :first-child { margin-top: 6px; }

/* Оглавление разделов. Обычные ссылки-якоря, без единой строчки скрипта:
   владельцу, зашедшему поменять номер телефона, один тычок вместо
   пролистывания всего экрана.
   Высота ссылки — --tap (наименьшая пальцевая цель в админке), а не 40,
   как у ленты вкладок: это главная навигация ЭТОГО экрана, и промахиваться
   по ней владелец будет с телефона. */
.ogl {
  margin: 14px 0 18px;
  padding: 14px 16px;
  border: 1px solid var(--line);
  border-radius: 16px;
  background: var(--card);
}
.ogl__zagolovok { margin: 0 0 10px; font-size: 15px; font-weight: 600; }
.ogl ul {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.ogl a {
  display: flex;
  align-items: center;
  min-height: var(--tap);
  padding: 0 14px;
  border: 1px solid var(--line);
  border-radius: 20px;
  background: var(--canvas);
  color: var(--ink);
  text-decoration: none;
  font-size: 13.5px;
  font-weight: 600;
}

/* ═══════ О-7. ЛИПКАЯ ПОЛОСА «СОХРАНИТЬ» ═══════
   Владелец дважды за десять минут потерял введённое, не нажав «Сохранить»:
   кнопка была одна на все поля и лежала в самом низу простыни.
   Решение принято владельцем проекта: липкая строка внизу экрана, такая же,
   как полоса «Забронировать» на витрине. Разбор целиком — в шаблоне
   templates/admin_settings.html, у самой полосы.

   🔴 ЧИСЛА ВЗЯТЫ ГОТОВЫМИ, СВОИХ НЕ ЗАВЕДЕНО. Высота кнопки —
   var(--sticky-knopka), отступ под ней — var(--sticky-podval), те же самые,
   что у полосы витрины (объявлены в :root, там же расписано, почему они
   считаются именно так). Кнопка у владельца и у гостя обязана быть одного
   размера: это одна и та же полоса, только на разных экранах.

   🔴 ТРЕТЬЕГО ЧИСЛА — МЕСТА ПОД ПОЛОСУ — ЗДЕСЬ НЕТ, И ЭТО НЕ ЗАБЫТО.
   У витрины полоса лежит ПОВЕРХ страницы (position: fixed), поэтому под неё
   отдельно отводится место (--sticky-h плюс --sticky-zapas), и два этих
   числа приходится держать в согласии — за чем и следят test_a16_04
   и test_resheniya.test_g1_02. Здесь полоса стоит В ПОТОКЕ (position: sticky)
   и место под себя занимает сама. Разъезжаться нечему: числа одно.

   position: sticky требует, чтобы у полосы был непрозрачный фон и своя
   верхняя граница: под ней проезжают поля, и без фона они читались бы
   сквозь кнопку. Отрицательные поля по бокам и снизу растягивают полосу
   на всю ширину карточки: останься зазоры по 16 точек, в них было бы видно,
   как под полосой едет содержимое. */
.polosa-sohranit {
  position: sticky;
  bottom: 0;
  z-index: 5;
  margin: 16px -16px -16px;
  padding: 10px 16px calc(var(--sticky-podval) + env(safe-area-inset-bottom));
  background: var(--card);
  border-top: 1px solid var(--line);
  /* Нижние углы — как у карточки (.box, 16px), минус её рамка в 1 точку. */
  border-radius: 0 0 15px 15px;
  box-shadow: 0 -10px 24px rgba(51, 56, 62, 0.10);
}
/* 🔴 ТА САМАЯ СТРОКА, КОТОРОЙ НЕ БЫЛО. Находка О-7 говорит дословно:
   «Ничто не говорит человеку, что набранное ещё не записано». Вот она
   и говорит — и говорит всегда, а не только когда что-то изменили:
   слова верны в любом случае и ложной тревогой стать не могут. */
.polosa-sohranit__slovo {
  margin: 0 0 8px;
  font-size: 13px;
  line-height: 1.35;
  color: var(--ink-4);
}
.polosa-sohranit button { height: var(--sticky-knopka); }


/* четыре цифры */
.stats { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; margin: 14px 0; }
.stats div {
  border: 1px solid var(--line);
  border-radius: 14px;
  padding: 12px 14px;
  background: var(--card);
}
.stats b { display: block; font-family: var(--font-head); font-size: 24px; font-weight: 600; line-height: 1.2; }
.stats span { font-size: 13.5px; color: var(--ink-4); }

/* ═══════ О-12. ДВЕ ДЕНЕЖНЫЕ ПЛИТКИ ═══════
   Владелец видел обе цифры и не понимал, о чём они. Разбор — в шаблоне
   templates/admin_calendar.html и в admin.py (DENGI_PODPISI_VLADELCA).

   Во всю ширину — потому что цифр под числом теперь две строки: имя
   владельца и точное имя правила. В квадрат 168 точек (две колонки на экране
   390) они складываются в шесть строк мелким кеглем; во всю ширину ложатся
   в две. И потому же, зачем их вообще поставили рядом: обе про деньги,
   и смотреть на них надо одним взглядом, а не выхватывать из ряда
   одинаковых квадратиков вместе с «заезжают сегодня».

   Своей вёрстки при этом не заводится: плитка та же самая, .stats div,
   с теми же рамкой, отступами и фоном. Меняется одно — сколько колонок
   она занимает. */
.stats .stats__dengi { grid-column: 1 / -1; }

/* Точное имя правила: мельче и тусклее подписи владельца — читать его
   каждый день не нужно, а вот тому, кто однажды спросит «почему они
   не сходятся», оно и отвечает.
   🔴 Кегль 12 — не «как можно мельче», а нижняя граница, до которой
   в проекте уже опускались осознанно (.foot__legal .eyebrow). Ниже
   не опускать: находка О-10 этого же дня — про то, чем кончается мелкий
   кегль на дешёвом телефоне. */
.stats .stats__dengi small {
  display: block;
  margin-top: 3px;
  font-size: 12px;
  line-height: 1.35;
  color: var(--ink-5);
}

/* календарь админки */
.cal-nav { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin: 14px 0 6px; }
.cal-nav .month { font-family: var(--font-head); font-size: 20px; font-weight: 600; text-transform: capitalize; }
.cal-nav a {
  min-height: 44px; min-width: 52px; display: flex; align-items: center; justify-content: center;
  border: 1px solid var(--line); border-radius: 12px; text-decoration: none;
  color: var(--ink); background: var(--card);
}

table.cal { width: 100%; border-collapse: separate; border-spacing: 3px; table-layout: fixed; }
table.cal th { font-size: 10px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--ink-5); padding: 6px 0; }
table.cal td { padding: 0; vertical-align: top; height: 62px; border-radius: 10px; background: var(--canvas); }
table.cal td.empty { background: transparent; }
table.cal a.day, table.cal .day {
  display: block; height: 100%; min-height: 62px; padding: 5px 4px 4px;
  text-decoration: none; color: inherit;
}
.day .dnum { font-size: 15px; font-weight: 600; }
/* 🔴 НАХОДКА ТЕЛЕФОНА Т-9. ИМЯ РЕЗАЛОСЬ НА ПЕРВЫХ ЧЕТЫРЁХ БУКВАХ.

   Клетка на телефоне — ровно ~49px, и здесь стояла связка «не переносить +
   обрезать многоточием». На широком экране она давала «Магомед» целиком,
   а на настоящем телефоне — «манс…», «vfy», «ПРО…». Многоточие при этом
   само съедает место: под буквы оставалось ещё меньше.

   Имя в клетку приходит УЖЕ КОРОТКИМ: booking.short_name берёт первое слово
   и только его — «Магомед Алиев» превращается в «Магомед» ещё в коде,
   и по той же самой причине. Значит резать второй раз, уже стилями, незачем:
   достаточно разрешить перенос, и первое слово ложится в одну-две строки.

   Клетка от этого не расплывётся: высота td (62px) для таблицы —
   НАИМЕНЬШАЯ, строка растёт под содержимое. Предел на три строки оставлен
   на случай слова, которого не бывает: «ремонткухниисанузла» в причине
   закрытия. Три строки по 10px как раз укладываются в сегодняшнюю высоту
   клетки рядом с числом дня.

   Не возвращать white-space: nowrap — за этим следит заслон
   test_admin_16.test_a16_09. */
.day .dname {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  line-clamp: 3;
  overflow: hidden;
  overflow-wrap: anywhere;
  font-size: 10px;
  letter-spacing: -.2px;
  line-height: 1.15;
  margin-top: 2px;
}
.day .dprice { display: block; font-size: 10px; color: var(--ink-4); margin-top: 1px; }

/* 🔴 «table.cal» в начале каждой строки — не украшение, а вся суть правки.
   Выше стоит «table.cal td { background: var(--canvas) }», и он весит больше
   (класс + два тега против класса и одного тега). Порядок строк тут ни при чём:
   вес перебивает порядок. Поэтому все четыре клетки — «свободно», «занято»,
   «закрыто», «заявка» — красились одним цветом rgb(237,231,219), при том что
   легенда рядом обещала четыре разных.

   Оба правила пришли ПЕРВЫМ коммитом: цветной календарь не работал ни дня.
   Владелец смотрит на этот экран каждый день и занятость видит только по
   именам в клетках.

   Добавляя сюда новое состояние клетки, пишите его так же — с «table.cal».
   Проверка test_shtab_7.test_b4_* держит это правило. */
table.cal td.free    { background: var(--canvas); }
table.cal td.pending { background: rgba(135, 93, 69, 0.18); }
table.cal td.busy    { background: var(--green-soft); }
table.cal td.blocked { background: var(--busy); }
/* Буфер — не «закрыто вами»: владелец этих ночей не закрывал, их закрыл сайт.
   Та же косая штриховка, что у гостя на витрине: один смысл — один вид. */
table.cal td.bufer   { background: repeating-linear-gradient(135deg,
                       var(--card) 0 5px, var(--ink-off) 5px 10px); }
td.past .dnum, td.past .dprice { color: var(--ink-off); }
td.is-today { box-shadow: inset 0 0 0 2px var(--terra-dark); }
td.picked { box-shadow: inset 0 0 0 2px var(--graphite); }

.legend { list-style: none; padding: 0; margin: 12px 0; display: flex; flex-wrap: wrap; gap: 14px; font-size: 12px; color: var(--ink-4); }
.legend li { display: flex; align-items: center; gap: 6px; }
.legend .sw { width: 10px; height: 10px; border-radius: 3px; border: 1px solid transparent; }
.sw.free { background: var(--canvas); border-color: var(--line); }
.sw.pending { background: rgba(135, 93, 69, 0.18); }
.sw.busy { background: var(--green-soft); }
.sw.blocked { background: var(--busy); }
.sw.bufer { background: repeating-linear-gradient(135deg,
            var(--card) 0 3px, var(--ink-off) 3px 6px); border-color: var(--line); }

/* таблицы */
.tblwrap { overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 12px 0; }
table.grid { width: 100%; border-collapse: collapse; font-size: 14.5px; }
table.grid th, table.grid td { border: 1px solid var(--line); padding: 10px 12px; text-align: left; vertical-align: top; }
table.grid th { background: var(--canvas); font-size: 13.5px; color: var(--ink-4); }

/* список броней */
.card {
  display: block;
  border: 1px solid var(--line);
  border-left-width: 6px;
  border-radius: 14px;
  padding: 14px 16px;
  margin: 10px 0;
  text-decoration: none;
  color: inherit;
  background: var(--card);
}
/* display:block обязателен: без него соседние строки карточки склеиваются
   в один абзац и телефон прилипает к сумме задатка. */
.card .line1 { display: block; font-weight: 700; font-size: 16px; }
.card .line2 { display: block; color: var(--ink-4); font-size: 14px; margin-top: 2px; }
.card.s-new { border-left-color: var(--terra); background: rgba(135, 93, 69, 0.1); }
.card.s-confirmed { border-left-color: var(--green); }
.card.s-prepaid { border-left-color: var(--green); background: rgba(75, 100, 72, 0.12); }
.card.s-checked_in { border-left-color: var(--graphite); background: rgba(51, 56, 62, 0.08); }
.card.s-checked_out { border-left-color: var(--ink-5); }
.card.s-cancelled, .card.s-expired { border-left-color: var(--line); background: var(--canvas); color: var(--ink-4); }

/* Вопрос владельцу о неприменённом обвале занятости (волна 1, блок 1).
   Намеренно выглядит как ВОПРОС, а не как ещё одна строка счётчиков: пока
   на него не ответили, занятость стоит на месте и брони не сняты. Раньше
   второй пустой круг снимал их молча, и заметить это было нечем. */
.card .obval-vopros {
  display: block;
  margin: 12px 0 4px;
  padding: 14px 16px;
  border: 2px solid var(--terra);
  border-radius: 12px;
  /* Свой цвет здесь не заводится намеренно: сторож test_n21 справедливо
     покраснел на новом оттенке — цвета, которого нет в брендбуке, дизайнер
     не увидит никогда. Карточка вопроса и так отделена от карточки площадки
     светлотой (--card светлее подложки s-new) и рамкой в две точки.
     Заодно урок: сторож читает файл целиком, вместе с комментариями, —
     код цвета нельзя даже упоминать в пояснении. */
  background: var(--card);
  color: var(--terra-dark);
}
.card .obval-vopros strong { font-weight: 700; }
.card .obval-vopros p { margin: 8px 0; font-size: 15px; line-height: 1.5; }
.card .obval-vopros form { margin-top: 12px; }

.pill {
  display: inline-block; padding: 3px 11px; border-radius: 999px; font-size: 12.5px;
  background: var(--canvas); border: 1px solid var(--line);
}

.kv { margin: 0; }
.kv div { display: flex; gap: 10px; padding: 10px 0; border-bottom: 1px solid var(--line); }
.kv dt { flex: 0 0 44%; color: var(--ink-4); font-size: 14.5px; }
.kv dd { flex: 1; margin: 0; font-weight: 600; }

.total { font-family: var(--font-head); font-size: 22px; font-weight: 700; }

/* ═══════════════════════════ планшет ═══════════════════════════
   В эталоне десктопа нет. Ниже только раскладка: палитра, кегли,
   радиусы и отступы секций — те же, что на 430px. */

@media (min-width: 620px) {
  .grid2 { grid-template-columns: 1fr 1fr; }
  .stats { grid-template-columns: repeat(4, 1fr); }
}

@media (min-width: 768px) {
  .site {
    max-width: 1180px;
    margin: 26px auto 46px;
    border-radius: 24px;
    box-shadow: 0 26px 64px rgba(51, 56, 62, 0.22);
  }
  .sec, .gal__head, .gal__zones, .gal__shots, .gal__note, #dates, #form { padding-left: 40px; padding-right: 40px; }
  .quick { padding: 0 40px; }
  .incl { padding-left: 40px; padding-right: 40px; }
  .foot { padding: 40px 40px 108px; }
  .cover { height: 520px; }
  .cover__title { font-size: 64px; }
  .cover__lead { font-size: 22px; max-width: 460px; }
  .gal__shots { grid-template-columns: repeat(3, 1fr); }
  .shot--big { grid-column: span 3; }
  .why { grid-template-columns: 1fr 1fr; }
  .amen__list { grid-template-columns: repeat(3, 1fr); }
  .strip { height: 320px; }
  .revs { flex-wrap: wrap; overflow: visible; }
  .rev { flex: 1 1 236px; }
  .route__grid { display: grid; grid-template-columns: 1.4fr 1fr; gap: 20px; align-items: start; }
  .form__col { max-width: 640px; }
  .wrap { padding-left: 20px; padding-right: 20px; }
  .topbar { margin-left: -20px; margin-right: -20px; }
}

@media (min-width: 1024px) {
  /* Липкая кнопка на десктопе не нужна: форма и телефон и так на виду. */
  .sticky { display: none; }
  /* Полосы нет — и места под неё не нужно: пустая полоса в конце страницы
     выглядит недогруженной вёрсткой (находка Г-1). Прицел прокрутки
     снимается там же и по той же причине: целиться выше нижнего края
     незачем, когда внизу ничего не лежит. */
  .site { padding-bottom: 0; }
  html { scroll-padding-bottom: 0; }
  .foot { padding-bottom: 40px; }
}

@media (min-width: 1280px) {
  .cover { height: 620px; }
  #dates { display: grid; grid-template-columns: 1.15fr 1fr; gap: 20px; align-items: start; }
  #dates .dates__head { grid-column: 1 / -1; }
  .why { grid-template-columns: repeat(4, 1fr); }
  .incl__grid { display: grid; grid-template-columns: 1.5fr 1fr; gap: 12px; align-items: start; }
  .garden { margin-top: 0; }
  .price-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 32px; align-items: start; }
}

/* ═══════════════ горизонтальные ленты у посетителя с мышью ═══════════════

   Признак здесь НЕ ширина экрана, и это принципиально. Ширина обманывает:
   узкое окно на компьютере — это по-прежнему мышь, а широкий планшет —
   палец. Ленты ломались именно в узком окне на компьютере, куда правило
   по min-width не доставало.

   Спрашиваем не «сколько пикселей», а «чем человек управляет»:
     hover: hover    — указатель умеет наводиться, не касаясь (мышь, трекпад);
     pointer: fine   — указатель точный, попадает в мелкие цели.
   Вместе это и есть мышь. У такого посетителя горизонтальную ленту листать
   нечем: полоса прокрутки скрыта своими же правилами, а колесо мыши крутит
   страницу, а не ряд. Поэтому ряд переносим строками и прокрутку выключаем.

   На телефоне и планшете (pointer: coarse, hover: none) правило НЕ включается:
   там лента листается пальцем и остаётся ровно как в эталоне 430px.

   🔴 nav.tabs ОТСЮДА УБРАНА (находка Т-7, 16.08.2026). Лента вкладок
   админки больше не прокручивается вообще — ни при каком указателе, —
   и правило здесь стало вторым местом, где сказано то же самое. Два места
   про одно правило расходятся на первой правке: поправили бы здесь, а лента
   осталась бы прокручиваемой на телефоне. Правило вкладок — одно, и оно
   там же, где сама лента. */
@media (hover: hover) and (pointer: fine) {
  .gal__zones, .revs { flex-wrap: wrap; overflow: visible; }
}
