/* «Товар недели» — рекламный баннер в листинге. Задача Б24 58048.
 *
 * Вёрстка по макетам дизайнера от 05.08.2026 (вариант 2a + 3i), папка проекта
 * «Промо-слот для товаров в листинге/дизайн/макеты». Две правки продакта поверх
 * макета: шильдик — жёлтая плашка под текстом (а не жёлтая черта сбоку),
 * слово «Реклама» в подвале не выводим.
 *
 * Это НЕ карточка товара: купить с баннера и отправить в КП нельзя, поэтому
 * ни одного класса карточки здесь не переопределяем — своя вёрстка с нуля.
 *
 * Композиция: шильдик → заголовок → описание → фото на весь остаток высоты →
 * подвал со ссылкой. Строка «Больше не показывать ×» вынесена НАД баннером.
 *
 * Отдельным файлом намеренно: styles.css правят другие задачи, и рядом лежит
 * styles.min.css — при равных датах отдаётся минифицированный, и правка только
 * в styles.css молча пропадает после деплоя.
 */

.pow-banner {
    position: relative;
    grid-column: span 2;
    align-self: stretch;
    display: flex;
    flex-direction: column;
    min-width: 0;
}

/* Закрыли — баннер уходит. Товар при этом никуда не девался: он всё время
   стоял в выдаче на своём обычном месте, ведь баннер его не подменял. */
html.pow-dismissed .pow-banner {
    display: none;
}

/* Уход в два шага: баннер гаснет → на его месте 4 с висит «Скрыто до завтра»
   → место схлопывается. Без этой строки человек не понимает, что случилось
   и вернётся ли баннер. */
.pow-banner {
    transition: opacity .15s ease;
}

.pow-banner--fade {
    opacity: 0;
}

/* Спокойная заливка, а не пунктирная рамка: пунктир на всю высоту ряда
   читается как сломанный блок, а не как «место освободилось». */
.pow-banner__note {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
    min-height: 120px;
    border-radius: 12px;
    background: #f5f5f7;
    font-family: 'Montserrat', sans-serif;
    font-size: 13px;
    color: #7d7d7d;
}

@media (prefers-reduced-motion: reduce) {
    .pow-banner {
        transition: none;
    }
}

/* Менеджеры печатают подборки для клиентов — рекламе там не место. */
@media print {
    .pow-banner {
        display: none;
    }
}

/* Строка скрытия висит НАД баннером, в отступе между шапкой раздела и сеткой
   (24 px, замерено на stage). Внутрь блока её класть нельзя: баннер опустится
   на её высоту, потеряет общую верхнюю линию с карточками и ряд развалится.
   В DOM кнопка идёт ПОСЛЕ ссылки — чтобы табом сначала попадать на баннер,
   а не на «убрать баннер». */
/* Селектор с двумя классами намеренно: у листинга есть своё правило на кнопки
   внутри сетки, и одиночный .pow-banner__close оно перебивало — кнопка была
   сразу чёрной, а наведение не меняло ничего. */
.pow-banner .pow-banner__close {
    position: absolute;
    bottom: 100%;
    right: 0;
    z-index: 2;
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 4px 8px 5px 10px;
    border: none;
    background: transparent;
    font-family: 'Montserrat', sans-serif;
    font-size: 12px;
    font-weight: 500;
    line-height: 1;
    /* !important — вынужденно: в стилях сайта висит глобальное
       `button { color: #000 !important }`, и без этого кнопка чёрная с самого
       начала, а наведение визуально ничего не меняет */
    color: #7d7d7d !important;
    border-radius: 8px;
    cursor: pointer;
    transition: color .15s ease, background-color .15s ease;
}

/* Меняем и цвет, и подложку: одного потемнения текста человек не замечает */
.pow-banner .pow-banner__close:hover {
    background: #f1f1f4;
    color: #000 !important;
}

.pow-banner .pow-banner__close:focus-visible {
    outline: 3px solid #474a55;
    outline-offset: 2px;
}

/* Карточка баннера вынута из потока намеренно. Высоту ряда сетки задают
   товарные карточки (542–562 px, зависит от числа цветов и складов). Если
   баннер участвует в расчёте, квадратное фото требует себе высоту, равную
   своей ширине (≈460 px), и растягивает весь ряд — соседние карточки
   раздувались с 542 до 660. Вне потока баннер высоту ряда не двигает, а сам
   растягивается на неё через align-self: stretch у обёртки. */
.pow-banner__card {
    position: absolute;
    inset: 0;
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    /* именно minmax(0, 1fr), а не 1fr: у квадратного фото собственный минимум
       равен его ширине, и на обычном 1fr ряд сетки раздувается под него —
       баннер вытягивал соседние карточки с 550 до 674 px */
    grid-template-rows: auto auto auto minmax(0, 1fr) auto;
    grid-template-areas:
        'head'
        'title'
        'descr'
        'photo'
        'more';
    flex: 1;
    min-height: 0;
    box-sizing: border-box;
    border: 1.5px solid #d7d7d7;
    border-radius: 12px;
    background: #fff;
    overflow: hidden;
    color: inherit;
    text-decoration: none;
    transition: border-color .15s ease, box-shadow .15s ease;
}

/* Наведение: рамка жёлтая, мягкая тень. Ничего не двигается — в отличие от
   карточек рядом, которые при ховере растут и наезжают на соседей. */
a.pow-banner__card:hover {
    border-color: #ffe500;
    box-shadow: 0 6px 20px rgba(0, 0, 0, .08);
}

a.pow-banner__card:focus-visible {
    outline: 3px solid #474a55;
    outline-offset: 2px;
}

/* Верхний отступ 16, а не 26: запас сверху был нужен, пока крестик стоял
   внутри блока. Крестик вынесен наверх — отступ отдан фотографии. */
.pow-banner__head {
    grid-area: head;
    padding: 16px 18px 0;
}

/* Три класса в селекторе намеренно: у сайта есть общее правило на текст внутри
   контентных блоков (`… .main-content p, … span` и т.п.), и оно перебивало
   размер шрифта плашки — она рисовалась 16 px вместо заданных. */
.pow-banner .pow-banner__head .pow-banner__badge {
    display: inline-block;
    padding: 4px 9px;
    border-radius: 5px;
    background: #ffe500;
    color: #000;
    font-family: 'Montserrat', sans-serif;
    font-size: 10px;
    font-weight: 700;
    line-height: 1.2;
    letter-spacing: .08em;
    text-transform: uppercase;
    white-space: nowrap;
}

.pow-banner__title {
    grid-area: title;
    margin: 6px 18px 0;
    font-family: 'Montserrat', sans-serif;
    font-size: 19px;
    font-weight: 700;
    line-height: 1.12;
    letter-spacing: -.01em;
    text-transform: uppercase;
    color: #000;
    overflow-wrap: anywhere;
}

/* Ограничение по строкам обязано жить на ВЛОЖЕННОМ элементе. На самой ячейке
   сетки оно не работает: браузер превращает `display: -webkit-box` у грид- и
   флекс-элемента в обычный блок, и текст выводится целиком. Проверено —
   до этой правки лимит строк не действовал нигде. */
.pow-banner__title > span,
.pow-banner__descr > span {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.pow-banner__title > span {
    -webkit-line-clamp: 2;
}

.pow-banner__descr > span {
    -webkit-line-clamp: 3;
}

/* Без описания — не «штатный макет с дырой», а своя композиция: заголовок
   крупнее, освободившуюся высоту забирает фото. */
.pow-banner--no-descr .pow-banner__title {
    font-size: 21px;
}

.pow-banner__descr {
    grid-area: descr;
    margin: 8px 18px 0;
    font-family: 'Montserrat', sans-serif;
    font-size: 13px;
    line-height: 1.5;
    color: #474a55;
    overflow-wrap: anywhere;
}

.pow-banner__photo {
    grid-area: photo;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 10px 18px;
    min-height: 0;
}

/* Подложка белая — решение продакта от 13.08.2026. Была серая #f1f1f4: в каталоге
   все фото на белом, и у каждого десятого мягкая тень доходит до края кадра, на
   сером такой снимок читался чётче. Продакт посмотрел вживую и выбрал белую —
   товар на ней выглядит чище, а рамку кадру даёт сам баннер. */
.pow-banner__photo-tile {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
    max-width: 100%;
    /* без этих нулей квадрат требует себе высоту, равную своей ширине, и тянет
       за собой весь ряд сетки: у флекс-элемента минимум по умолчанию не 0 */
    min-height: 0;
    min-width: 0;
    aspect-ratio: 1;
    border-radius: 10px;
    background: #fff;
    overflow: hidden;
}

/* Селектор по плитке, а не по контейнеру: контейнеров два — `__photo` у вида
   «одно фото» и `__photos` у вида «два фото». Пока правило висело на первом,
   во втором виде картинка выводилась в натуральные 900×900, вылезала за плитку
   и обрезалась ею — выглядело как сильно увеличенный кадр. */
.pow-banner__photo-tile img {
    display: block;
    max-width: 100%;
    max-height: 100%;
    object-fit: contain;
}

.pow-banner__more {
    grid-area: more;
    display: flex;
    align-items: center;
    justify-content: flex-end;
    padding: 10px 18px 14px;
    border-top: 1.5px solid #e3e4e8;
    font-family: 'Montserrat', sans-serif;
    font-size: 12px;
    font-weight: 700;
    color: #000;
}

/* ══════════════════════════════════════════════════════════════════════════
   ВИД «ДВА ФОТО» (макет 1b от 13.08.2026)
   ══════════════════════════════════════════════════════════════════════════
   Второй вид баннера, продакт выбирает его в админке. Композиция другая:
   жёлтая колонка с текстом слева, два квадратных кадра справа — делят высоту
   пополам. Размер блока тот же: два места сетки в высоту ряда карточек.

   Всё ниже висит на модификаторе .pow-banner--two, поэтому вид «одно фото»
   правилами не задет вовсе — их можно править независимо. */

.pow-banner--two .pow-banner__card {
    /* из потока — по той же причине, что и у вида «одно фото»: высоту ряда
       задают товарные карточки, баннер под неё растягивается */
    grid-template-columns: 238px minmax(0, 1fr);
    grid-template-rows: minmax(0, 1fr);
    grid-template-areas: 'side photos';
    /* у 1b рамки нет — только тень, поэтому границу снимаем явно */
    border: none;
    box-shadow: 0 2px 10px rgba(0, 0, 0, .08);
    transition: box-shadow .15s ease;
}

/* Наведение усиливает тень, и только. Ничего не двигается и не масштабируется:
   баннер шире карточек, любой сдвиг заметен как дёрганье ряда. */
.pow-banner--two a.pow-banner__card:hover {
    border-color: transparent;
    box-shadow: 0 10px 30px rgba(0, 0, 0, .12);
}

/* Жёлтое поле. Ссылка «Смотреть товар» прижата к низу через margin-top: auto —
   так три точки (шильдик сверху, заголовок, ссылка снизу) держат колонку даже
   у однословного заголовка, и она не читается ошибкой. */
.pow-banner__side {
    grid-area: side;
    display: flex;
    flex-direction: column;
    min-width: 0;
    min-height: 0;
    padding: 20px 18px;
    background: #ffe500;
    overflow: hidden;
}

/* Внутри жёлтой колонки отступы задаёт она сама — снимаем поля,
   которые эти же классы получают в виде «одно фото». */
.pow-banner--two .pow-banner__head {
    padding: 0;
}

/* Четыре класса намеренно: у вида «одно фото» плашка описана селектором из
   трёх классов, и при равном весе спор решался бы порядком строк в файле —
   то есть сломался бы от любой перестановки. */
.pow-banner.pow-banner--two .pow-banner__head .pow-banner__badge {
    padding: 5px 10px;
    border-radius: 6px;
    /* чёрная плашка с белым текстом: жёлтая на жёлтом невидима */
    background: #000;
    color: #fff;
    font-size: 11px;
    letter-spacing: .1em;
}

.pow-banner--two .pow-banner__title {
    margin: 14px 0 0;
    font-size: 20px;
    /* переносы по слогам: колонка узкая, длинные слова иначе рвут вёрстку.
       Требует lang="ru" на элементе — он проставлен в разметке. */
    hyphens: auto;
    -webkit-hyphens: auto;
    color: #000;
}

.pow-banner--two .pow-banner__title > span {
    -webkit-line-clamp: 4;
}

/* Без описания заголовок крупнее — жёлтое поле не должно пустовать. */
.pow-banner--two.pow-banner--no-descr .pow-banner__title {
    font-size: 23px;
}

.pow-banner--two.pow-banner--no-descr .pow-banner__title > span {
    -webkit-line-clamp: 5;
}

.pow-banner--two .pow-banner__descr {
    margin: 10px 0 0;
    /* на жёлтом текст всегда чёрный: графитовый #474a55 на #ffe500 даёт
       заметно меньший контраст и читается хуже */
    color: #000;
}

/* Не влезло — обрезаем описание, а не заголовок: заголовок несёт смысл.
   12 строк, а не 6 из спецификации: замер показал, что при клэмпе 6 в жёлтой
   колонке оставалось 269 px пустоты — половина высоты. 12 помещается даже в
   худшем случае, когда заголовок занял все 4 строки. */
.pow-banner--two .pow-banner__descr > span {
    -webkit-line-clamp: 12;
}

.pow-banner--two .pow-banner__more {
    /* прижимаем к низу колонки, отсюда же берётся воздух над ссылкой */
    margin-top: auto;
    padding: 14px 0 0;
    border-top: none;
    justify-content: flex-start;
}

/* Два кадра делят высоту пополам. Строки именно minmax(0, 1fr): на голом 1fr
   картинка со своим внутренним минимумом растянула бы блок. */
.pow-banner__photos {
    grid-area: photos;
    display: grid;
    grid-template-rows: minmax(0, 1fr) minmax(0, 1fr);
    gap: 10px;
    min-width: 0;
    min-height: 0;
    padding: 14px;
    background: #fff;
}

/* Кадры занимают всю выделенную им половину, без aspect-ratio: высота уже
   задана строкой сетки, а квадрат поверх неё снова начал бы тянуть ряд. */
.pow-banner--two .pow-banner__photo-tile {
    width: 100%;
    height: 100%;
    aspect-ratio: auto;
}

/* Планшет: жёлтая колонка чуть шире — на 2 из 3 колонок сетки текст иначе
   встаёт слишком узко. */
@media (min-width: 768px) and (max-width: 1023px) {
    .pow-banner--two .pow-banner__card {
        grid-template-columns: 244px minmax(0, 1fr);
    }
}

/* Мобильный — отдельная раскладка, а не уменьшенный десктоп: текст слева,
   фото 160 справа, описание не показываем (места нет). Баннер стоит в ряду
   один, поэтому строку скрытия можно вернуть в поток — высоту ряда она
   здесь ничему не ломает. */
@media (max-width: 767px) {
    .pow-banner {
        grid-column: 1 / -1;
    }

    /* два класса, как и в основном правиле: иначе оно перебьёт этот блок
       по весу селектора, и на телефоне строка останется висеть над баннером */
    .pow-banner .pow-banner__close {
        position: static;
        order: -1;
        margin: 0 0 6px auto;
        font-size: 11px;
    }

    .pow-banner__card {
        /* на мобильном баннер стоит в ряду один, высоту задаёт он сам —
           значит карточку возвращаем в поток */
        position: static;
        /* 174 = фото 160 + правый отступ 14: колонка держит и то и другое,
           иначе отступ съедает фото и оно выходит 146 вместо 160 */
        grid-template-columns: minmax(0, 1fr) 174px;
        grid-template-rows: auto auto minmax(0, 1fr) auto;
        grid-template-areas:
            'head  head'
            'title photo'
            'descr photo'
            'more  photo';
        column-gap: 12px;
    }

    .pow-banner__head {
        padding: 14px 14px 0;
    }

    .pow-banner .pow-banner__head .pow-banner__badge {
        font-size: 9px;
        padding: 3px 7px;
    }

    .pow-banner__title,
    .pow-banner--no-descr .pow-banner__title {
        margin: 4px 0 0 14px;
        font-size: 16px;
        line-height: 1.15;
    }

    /* Описание на телефоне сначала прятали по макету, но под заголовком остаётся
       заметная пустота, и человек читает это как «текст пропал». Возвращаем
       мельче и в две строки. */
    .pow-banner__descr {
        margin: 6px 0 0 14px;
        font-size: 12px;
        line-height: 1.45;
    }

    .pow-banner__descr > span {
        -webkit-line-clamp: 2;
    }

    .pow-banner--no-descr .pow-banner__title > span {
        -webkit-line-clamp: 3;
    }

    .pow-banner__photo {
        align-self: center;
        padding: 4px 14px 10px 0;
    }

    .pow-banner__photo-tile {
        width: 160px;
        height: auto;
    }

    .pow-banner__more {
        align-self: end;
        justify-content: flex-start;
        padding: 0 0 12px 14px;
        border-top: none;
    }

    /* ── вид «два фото» на телефоне ────────────────────────────────────────
       Раскладка сохраняется (жёлтая колонка слева, кадры справа), меняются
       только размеры. Селекторы из двух классов обязательны: правила выше в
       этом же медиа-блоке описаны одним классом и по весу проиграют базовым
       правилам вида «два фото» — без явных переопределений телефон получил
       бы жёлтую колонку в 238 px и карточку вне потока. */
    .pow-banner--two .pow-banner__card {
        position: static;
        grid-template-columns: minmax(0, 1fr) auto;
        grid-template-rows: minmax(0, 1fr);
        grid-template-areas: 'side photos';
        column-gap: 0;
    }

    .pow-banner--two .pow-banner__side {
        padding: 14px;
    }

    .pow-banner.pow-banner--two .pow-banner__head .pow-banner__badge {
        padding: 4px 8px;
        font-size: 9px;
    }

    .pow-banner--two .pow-banner__title,
    .pow-banner--two.pow-banner--no-descr .pow-banner__title {
        margin: 10px 0 0;
        font-size: 16px;
        line-height: 1.15;
    }

    .pow-banner--two .pow-banner__title > span {
        -webkit-line-clamp: 3;
    }

    /* Описание влезает целиком: 12/1.45 до четырёх строк. */
    .pow-banner--two .pow-banner__descr {
        margin: 8px 0 0;
        font-size: 12px;
        line-height: 1.45;
    }

    .pow-banner--two .pow-banner__descr > span {
        -webkit-line-clamp: 4;
    }

    .pow-banner--two .pow-banner__more {
        align-self: auto;
        margin-top: auto;
        padding: 12px 0 0;
    }

    .pow-banner--two .pow-banner__photos {
        grid-template-rows: auto auto;
        padding: 14px 14px 14px 0;
    }

    /* 118 — размер из макета. Здесь квадрат безопасен: карточка на телефоне
       вернулась в поток и высоту ряда сетки уже не задаёт. */
    .pow-banner--two .pow-banner__photo-tile {
        width: 118px;
        height: auto;
        aspect-ratio: 1;
    }
}
