@charset "UTF-8";
/* =========================================================================
   doorshotel — components.css
   Карточка-табличка, чипы, блок кода, «Содержание», фильтр-панель, FAQ,
   номера экзекуторов, шаги, врезки.

   Метафора одна и держится во всех блоках: сайт — коридор старого отеля,
   скрипт — латунная табличка на двери с номером. Отсюда .corridor (грид),
   .doorplate (карточка), .room (экзекутор), .desk (стойка выдачи).
   ========================================================================= */

/* ── Грид каталога ──────────────────────────────────────────────────────── */

.corridor {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
    gap: 20px;
    margin-top: 20px;
}

/* Флагман показывается отдельной секцией над каталогом и занимает всю ширину. */
.corridor--single { grid-template-columns: 1fr; }

/* ── Карточка-табличка ──────────────────────────────────────────────────── */

.doorplate {
    display: flex;
    flex-direction: column;
    padding: 16px 18px 18px;
    background: var(--bg-card);
    border: 1px solid var(--brass-soft);
    border-top: 2px solid var(--brass);
    border-radius: var(--radius);
    transition: border-color .15s ease, background-color .15s ease;
}

/* Никакого свечения: «поднимаем» карточку осветлением дерева и латунным
   контуром — этого достаточно, и это не приём соседнего сайта. */
.doorplate:hover {
    background: var(--bg-raise);
    border-color: var(--brass);
}

/* Флагман: латунь по всему периметру, а не только сверху. */
.doorplate--lead {
    border: 1px solid var(--brass);
    border-top: 2px solid var(--brass);
}

/* Не моноширинный: подпись кириллическая («№01 · Рекомендуем»), а у Courier
   Prime кириллического субсета нет — строка распалась бы на две гарнитуры. */
.doorplate__crown {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    align-self: flex-start;
    margin-bottom: 12px;
    padding: 4px 10px;
    font-family: var(--font-display);
    font-size: .74rem;
    letter-spacing: 1.4px;
    text-transform: uppercase;
    color: var(--candle);
    background: var(--brass-soft);
    border-radius: var(--radius);
}

.doorplate__head {
    display: flex;
    align-items: baseline;
    gap: 12px;
    margin-bottom: 8px;
}

/* Номер таблички. Декоративный: это индекс в цикле, а не поле из данных.
   «№» рисует display-шрифт, цифры — моноширинный (у Courier Prime нет
   кириллического субсета, а U+2116 живёт именно там). */
.doorplate__num {
    flex: 0 0 auto;
    font-family: var(--font-mono);
    font-size: 1.05rem;
    line-height: 1.2;
    color: var(--brass);
    letter-spacing: .5px;
}

.doorplate__sign {
    font-family: var(--font-display);
    margin-right: .1em;
}

.doorplate__title {
    margin: 0;
    font-size: 1.16rem;
    line-height: 1.28;
}

.doorplate__shot {
    margin: 0 0 14px;
    border: 1px solid var(--border);
    border-radius: var(--radius);
    overflow: hidden;
}

.doorplate__shot img {
    width: 100%;
    height: auto;
    aspect-ratio: 16 / 9;
    object-fit: cover;
}

.doorplate__chips {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin-bottom: 12px;
}

.doorplate__desc {
    margin: 0 0 12px;
    font-size: .95rem;
    color: var(--text-muted);
}

.doorplate__features {
    margin: 0 0 16px;
    padding: 0;
    list-style: none;
}

.doorplate__features li {
    position: relative;
    margin: 5px 0;
    padding-left: 20px;
    font-size: .92rem;
    color: var(--text-primary);
}

/* Маркер — латунная точка, а не галочка: галочка обещает «проверено», чего
   тема обещать не должна. */
.doorplate__features li::before {
    content: '';
    position: absolute;
    left: 4px;
    top: .62em;
    width: 5px;
    height: 5px;
    background: var(--brass);
    border-radius: 50%;
}

.doorplate__get {
    align-self: flex-start;
    margin-bottom: 14px;
}

.doorplate__exec {
    margin: 12px 0 0;
    font-size: .86rem;
    color: var(--text-faint);
}

.doorplate__date {
    margin: 6px 0 0;
    font-size: .8rem;
    color: var(--text-faint);
}

/* Прижимает код и подписи к низу карточки, чтобы в ряду они выровнялись. */
.doorplate__fill { flex: 1 1 auto; }

/* ── Чипы и статусы ─────────────────────────────────────────────────────── */

.stamp {
    display: inline-block;
    padding: 3px 8px;
    font-family: var(--font-body);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .5px;
    text-transform: uppercase;
    color: var(--candle);
    background: var(--brass-soft);
    border-radius: 2px;
}

.stamp--nokey {
    color: var(--bg-base);
    background: var(--brass);
}

.stamp--ok {
    color: var(--ok);
    background: transparent;
    border: 1px solid var(--ok);
}

.stamp--warn {
    color: var(--warn);
    background: transparent;
    border: 1px solid var(--warn);
}

/* ── Блок кода: лента печатной машинки ──────────────────────────────────── */

.tape {
    margin: 0;
    background: var(--bg-code);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    overflow: hidden;
}

.tape__bar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    padding: 7px 10px;
    background: var(--bg-card);
    border-bottom: 1px solid var(--border);
}

.tape__lang {
    font-family: var(--font-mono);
    font-size: .76rem;
    letter-spacing: 1.4px;
    text-transform: uppercase;
    color: var(--text-faint);
}

.tape__copy {
    padding: 4px 12px;
    font-family: var(--font-body);
    font-size: .8rem;
    font-weight: 600;
    color: var(--brass);
    background: transparent;
    border: 1px solid var(--brass-soft);
    border-radius: var(--radius);
    cursor: pointer;
    transition: color .15s ease, border-color .15s ease;
}

.tape__copy:hover { color: var(--candle); border-color: var(--brass); }

/* Состояние «Скопировано» держится полторы секунды и возвращается обратно. */
.tape__copy.is-done { color: var(--ok); border-color: var(--ok); }

.tape__pre {
    margin: 0;
    padding: 12px;
    max-height: 190px;
    overflow: auto;
    font-family: var(--font-mono);
    font-size: .82rem;
    line-height: 1.55;
    color: var(--text-primary);
    /* Ссылка внутри loadstring() длинная и без пробелов: без break-all она
       вылезает за карточку на узких экранах. */
    white-space: pre-wrap;
    word-break: break-all;
}

/* ── «Содержание» ───────────────────────────────────────────────────────── */

.digest {
    margin: 26px 0;
    background: var(--bg-card);
    border: 1px solid var(--brass-soft);
    border-top: 2px solid var(--brass);
    border-radius: var(--radius);
}

.digest__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 12px 16px;
    cursor: pointer;
    list-style: none;
    user-select: none;
}

/* Штатный треугольник <summary> убираем в обоих движках — вместо него шеврон. */
.digest__head::-webkit-details-marker { display: none; }
.digest__head::marker { content: ''; }

.digest__title {
    font-family: var(--font-display);
    font-size: .84rem;
    letter-spacing: 1.6px;
    text-transform: uppercase;
    color: var(--brass);
}

.digest__chev {
    flex: 0 0 auto;
    width: 8px;
    height: 8px;
    border-right: 2px solid var(--brass);
    border-bottom: 2px solid var(--brass);
    transform: rotate(45deg);
    transition: transform .18s ease;
}

.digest[open] .digest__chev { transform: rotate(-135deg); }

.digest__list {
    margin: 0;
    padding: 0 16px 14px 36px;
    list-style: decimal;
    color: var(--brass);
}

.digest__item { margin: 6px 0; }

.digest__link {
    color: var(--text-primary);
    border-bottom: 1px dotted var(--border);
}

.digest__link:hover {
    color: var(--candle);
    border-bottom-color: var(--candle);
}

/* ── FAQ ────────────────────────────────────────────────────────────────── */

.enquiry {
    margin: 10px 0;
    background: var(--bg-card);
    border: 1px solid var(--border);
    border-radius: var(--radius);
}

.enquiry__head {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 13px 16px;
    font-weight: 600;
    color: var(--text-primary);
    cursor: pointer;
    list-style: none;
}

.enquiry__head::-webkit-details-marker { display: none; }
.enquiry__head::marker { content: ''; }

.enquiry__head::before {
    content: '№';
    flex: 0 0 auto;
    font-family: var(--font-display);
    color: var(--brass);
    line-height: 1.35;
}

.enquiry[open] .enquiry__head { border-bottom: 1px solid var(--border); }

.enquiry__body {
    margin: 0;
    padding: 13px 16px 15px;
    color: var(--text-muted);
}

.enquiry__body p:last-child { margin-bottom: 0; }

/* ── Панель фильтра ─────────────────────────────────────────────────────── */

.filterbar {
    display: flex;
    align-items: center;
    gap: 14px;
    flex-wrap: wrap;
    margin-top: 18px;
}

.filterbar__count {
    display: inline-block;
    min-width: 20px;
    padding: 1px 6px;
    font-family: var(--font-mono);
    font-size: .78rem;
    line-height: 1.5;
    text-align: center;
    color: var(--brass);
    background: var(--bg-base);
    border-radius: 2px;
}

.filterbar__shown {
    font-size: .88rem;
    color: var(--text-faint);
}

/* Выдвижная панель справа. z-index 55 — ниже баннера согласия (60), чтобы
   выбор по cookie нельзя было перекрыть фильтром. */
.drawer {
    position: fixed;
    top: 0;
    right: 0;
    /* --drs-bell — высота баннера согласия, её проставляет cookie-consent.js.
       Баннер лежит выше по z-index и прижат к тому же краю; без этого сдвига
       он накрывает подвал панели с кнопками «Сбросить» и «Показать». */
    bottom: var(--drs-bell, 0px);
    z-index: 55;
    display: flex;
    flex-direction: column;
    width: 320px;
    max-width: 100%;
    background: var(--bg-card);
    border-left: 1px solid var(--brass);
    overflow-y: auto;
}

/* Скрытие панели — это атрибут hidden, а не класс. Общее правило [hidden] в
   main.css перебивает display:flex выше. */

.drawer__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 16px;
    border-bottom: 1px solid var(--border);
}

.drawer__title {
    font-family: var(--font-display);
    font-size: .92rem;
    letter-spacing: 1.6px;
    text-transform: uppercase;
    color: var(--brass);
}

.drawer__close {
    padding: 4px 9px;
    font-size: 1rem;
    line-height: 1;
    color: var(--text-muted);
    background: transparent;
    border: 1px solid var(--brass-soft);
    border-radius: var(--radius);
    cursor: pointer;
}

.drawer__close:hover { color: var(--candle); border-color: var(--brass); }

.drawer__body {
    flex: 1 1 auto;
    padding: 10px 16px 16px;
}

/* Кириллические подписи групп — display-шрифтом, см. примечание у .doorplate__crown. */
.drawer__group {
    margin: 14px 0 8px;
    font-family: var(--font-display);
    font-size: .72rem;
    letter-spacing: 1.4px;
    text-transform: uppercase;
    color: var(--text-faint);
}

.drawer__foot {
    display: flex;
    gap: 10px;
    padding: 14px 16px calc(14px + env(safe-area-inset-bottom));
    border-top: 1px solid var(--border);
}

.drawer__foot .btn-brass,
.drawer__foot .btn-hollow { flex: 1 1 0; }

/* Чекбокс: латунная галочка на тёмном дереве. Нативный input спрятан, но
   остаётся фокусируемым — рамку фокуса рисуем на подписи. */
.check {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 0;
    cursor: pointer;
    border-bottom: 1px solid var(--border);
}

.check:last-child { border-bottom: 0; }

.check__box {
    position: absolute;
    width: 1px;
    height: 1px;
    opacity: 0;
    pointer-events: none;
}

/* Рамка латунью, а не --brass-soft: нативный input скрыт, и эта рамка —
   единственный индикатор невыбранного состояния. На --brass-soft контраст с
   подложкой панели 1.3:1 при минимуме 3:1 для элементов управления. */
.check__mark {
    position: relative;
    flex: 0 0 auto;
    width: 17px;
    height: 17px;
    background: var(--bg-base);
    border: 1px solid var(--brass);
    border-radius: 2px;
    transition: border-color .15s ease, background-color .15s ease;
}

.check__box:checked + .check__mark {
    background: var(--brass);
    border-color: var(--brass);
}

.check__box:checked + .check__mark::after {
    content: '';
    position: absolute;
    left: 5px;
    top: 1px;
    width: 5px;
    height: 10px;
    border-right: 2px solid var(--bg-base);
    border-bottom: 2px solid var(--bg-base);
    transform: rotate(45deg);
}

.check__box:focus-visible + .check__mark {
    outline: 2px solid var(--candle);
    outline-offset: 2px;
}

.check__label {
    font-size: .94rem;
    color: var(--text-primary);
}

.check--nokey { margin-top: 4px; }
.check--nokey .check__label { color: var(--candle); }

/* ── Номера экзекуторов ─────────────────────────────────────────────────── */

.room {
    padding: 20px;
    margin-top: 20px;
    background: var(--bg-card);
    border: 1px solid var(--brass-soft);
    border-top: 2px solid var(--brass);
    border-radius: var(--radius);
}

.room__head {
    display: flex;
    align-items: center;
    gap: 14px;
    flex-wrap: wrap;
}

/* Монограмма вместо логотипа: логотипов в payload нет по контракту. */
.room__mono {
    flex: 0 0 auto;
    display: grid;
    place-items: center;
    width: 46px;
    height: 46px;
    font-family: var(--font-display);
    font-size: 1.5rem;
    color: var(--bg-base);
    background: var(--brass);
    border-radius: var(--radius);
}

.room__name { margin: 0; font-size: 1.24rem; }

.room__meta {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin: 10px 0 0;
    padding: 0;
    list-style: none;
}

.room__meta li { margin: 0; }

.room__desc { margin: 14px 0 0; color: var(--text-muted); }

.room__cols {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 22px;
    margin-top: 16px;
}

.room__h {
    margin: 0 0 8px;
    font-family: var(--font-display);
    font-size: .82rem;
    letter-spacing: 1.4px;
    text-transform: uppercase;
    color: var(--brass);
}

.room__list { margin: 0; padding-left: 1.2em; }
.room__list li { font-size: .93rem; }

/* ── Пронумерованные шаги ───────────────────────────────────────────────── */

.rungs {
    margin: 18px 0 0;
    padding: 0;
    list-style: none;
    counter-reset: stair;
}

.rungs__step {
    position: relative;
    margin: 0 0 14px;
    padding: 14px 18px 14px 62px;
    background: var(--bg-card);
    border: 1px solid var(--border);
    border-left: 2px solid var(--brass);
    border-radius: var(--radius);
    counter-increment: stair;
}

.rungs__step::before {
    content: counter(stair, decimal-leading-zero);
    position: absolute;
    left: 18px;
    top: 14px;
    font-family: var(--font-mono);
    font-size: 1.15rem;
    line-height: 1.3;
    color: var(--brass);
}

.rungs__step h3 { margin: 0 0 6px; font-size: 1.06rem; }
.rungs__step p:last-child { margin-bottom: 0; }

/* ── Врезка ─────────────────────────────────────────────────────────────── */

.placard {
    margin: 22px 0;
    padding: 16px 18px;
    background: var(--bg-card);
    border: 1px solid var(--brass-soft);
    border-left: 2px solid var(--brass);
    border-radius: var(--radius);
    color: var(--text-muted);
}

.placard p:last-child { margin-bottom: 0; }

.placard__h {
    margin: 0 0 8px;
    font-family: var(--font-display);
    font-size: .95rem;
    letter-spacing: .6px;
    color: var(--candle);
}

/* ── Обложка под hero ───────────────────────────────────────────────────── */

/* Секция с фоном: сам фон во всю ширину, картинка внутри .hall. */
.showcase {
    padding: 28px 0 4px;
    background: var(--bg-card);
    border-bottom: 1px solid var(--border);
}

.showcase__frame {
    margin: 0;
    border: 1px solid var(--brass-soft);
    border-top: 2px solid var(--brass);
    border-radius: var(--radius);
    overflow: hidden;
    background: var(--bg-base);
}

/* height:auto в паре с width/height в разметке: пропорции держит браузер,
   а указанные размеры резервируют место и убирают скачок при загрузке. */
.showcase__img {
    width: 100%;
    height: auto;
    display: block;
}

.showcase__cap {
    padding: 10px 14px 12px;
    font-size: .85rem;
    line-height: 1.5;
    color: var(--text-faint);
    background: var(--bg-card);
    border-top: 1px solid var(--border);
}

/* ── Словарь терминов ───────────────────────────────────────────────────── */

.terms {
    margin: 18px 0 0;
    padding: 0;
}

.terms__t {
    margin: 16px 0 0;
    font-family: var(--font-display);
    font-size: 1.02rem;
    color: var(--candle);
}

.terms__t:first-child { margin-top: 0; }

.terms__d {
    margin: 5px 0 0;
    padding: 0 0 0 16px;
    max-width: 78ch;
    color: var(--text-muted);
    border-left: 2px solid var(--brass-soft);
}

/* ── Финальный блок ─────────────────────────────────────────────────────── */

.summons {
    padding: 26px 24px 28px;
    background: var(--bg-card);
    border: 1px solid var(--brass);
    border-radius: var(--radius);
}

.summons__h { margin-top: 0; }

.summons__p { max-width: 76ch; color: var(--text-muted); }

/* ── Таблица (сравнение платформ и т. п.) ───────────────────────────────── */

.ledger-wrap { overflow-x: auto; margin: 18px 0; }

.ledger {
    width: 100%;
    min-width: 460px;
    font-size: .93rem;
    border: 1px solid var(--border);
    border-radius: var(--radius);
}

.ledger th,
.ledger td {
    padding: 10px 14px;
    text-align: left;
    border-bottom: 1px solid var(--border);
}

.ledger th {
    font-family: var(--font-display);
    font-size: .82rem;
    letter-spacing: 1.2px;
    text-transform: uppercase;
    color: var(--brass);
    background: var(--bg-card);
}

.ledger tr:last-child td { border-bottom: 0; }

/* ── Адаптив ────────────────────────────────────────────────────────────── */

@media (max-width: 780px) {
    .corridor { grid-template-columns: 1fr; }
    .room__cols { grid-template-columns: 1fr; gap: 14px; }
    .drawer { width: 100%; border-left: 0; }
}

/* =========================================================================
   Панель согласия на cookie (.nightbell)

   Прижата к нижнему краю окна: position:fixed + bottom:0.

   Осторожно с этим заголовком: однажды у него потерялась открывающая
   последовательность комментария. Текст стал частью селектора, парсер
   отбросил его вместе со следующим правилом — .nightbell лишался
   position:fixed, оставался в потоке и вылезал под подвалом. Правило ниже
   молча перестаёт существовать, ошибок в консоли при этом нет.

   z-index 60 — выше фильтр-панели (55). Выбор по cookie не должно быть
   возможно перекрыть ничем.
   ========================================================================= */

.nightbell {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 60;
    padding: 14px 0 calc(14px + env(safe-area-inset-bottom));
    background: var(--bg-card);
    border-top: 1px solid var(--brass);
}

/* Панель приходит с атрибутом hidden и открывается только из JS, если выбор
   ещё не сохранён. Скрывает её общее правило [hidden] в main.css. */

.nightbell__inner {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 14px;
}

.nightbell__text {
    flex: 1 1 380px;
    max-width: 72ch;
    margin: 0;
    font-size: .88rem;
    line-height: 1.55;
    color: var(--text-muted);
}

.nightbell__text a { color: var(--candle); }

.nightbell__acts {
    display: flex;
    flex: 0 0 auto;
    gap: 10px;
}

.nightbell__acts .btn-brass,
.nightbell__acts .btn-hollow {
    padding: 8px 18px;
    font-size: .9rem;
}

/* Класс висит на <body> ровно столько, сколько видна панель. */
body.has-nightbell { padding-bottom: 170px; }

@media (min-width: 768px) {
    body.has-nightbell { padding-bottom: 100px; }
}

@media (max-width: 560px) {
    .nightbell { padding: 12px 0 calc(12px + env(safe-area-inset-bottom)); }
    .nightbell__text { flex-basis: 100%; font-size: .84rem; }
    .nightbell__acts { width: 100%; }
    .nightbell__acts .btn-brass,
    .nightbell__acts .btn-hollow { flex: 1 1 0; }
}
