/**
 * EK · Техника — стили карточки товара в ленте.
 *
 * Использует токены из :root в ek-home.css. Ни одного нового цвета:
 * палитра, радиусы и типографика те же, что в остальном интерфейсе.
 * Sage-зелёный — только индикатор наличия, как требует DESIGN.md.
 *
 * Подключается после ek-home.css и ek-catalog.css.
 */

/* ═══════════════════════════════════════════════════════════
   Оболочка
   ═══════════════════════════════════════════════════════════ */

.ek-page .ek-pcard {
    position: relative;
    display: flex;
    flex-direction: column;
    background: #fff;
    border: 0.5px solid var(--ek-border);
    border-radius: var(--ek-radius-lg);
    padding: 20px;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);
    transition: transform .25s cubic-bezier(.22, 1, .36, 1),
                box-shadow .25s cubic-bezier(.22, 1, .36, 1),
                border-color .2s ease;
}

/* z-index (правка 2026-09-02): подсказка на иконке — ::after с z-index:20,
   но он заперт внутри карточки тремя контекстами наложения (.ek-pcard-actions
   z-index:3, filter:drop-shadow на кнопке, transform у этого же :hover).
   Наружу он не выходит, а соседние карточки лежат на одном уровне, поэтому
   следующая по DOM закрашивала пузырь предыдущей. Поднимаем карточку целиком:
   тогда и подсказка, и тень уходят поверх соседей.
   :focus-within — тот же подъём при обходе с клавиатуры. */
.ek-page .ek-pcard:hover,
.ek-page .ek-pcard:focus-within {
    z-index: 5;
}

.ek-page .ek-pcard:hover {
    transform: translateY(-2px);
    box-shadow: 0 12px 32px rgba(0, 0, 0, 0.10);
    border-color: #D2D2D7;
}

/* Карточка с выбором конфигурации выше — выравниваем низ по кнопке. */
.ek-page .ek-pcard-body {
    display: flex;
    flex-direction: column;
    flex: 1;
}

/* ═══════════════════════════════════════════════════════════
   Иконки действий
   Было 32×32 с отступом 4px — почти гарантированный промах пальцем.
   ═══════════════════════════════════════════════════════════ */

/* ───── Бейдж («Новинка» / «Хит» / «−N%») ─────────────────────────
   Переехал сюда из ek-home.css (правка 2026-09-02). Раньше геометрия
   верхнего угла карточки была разбита по двум файлам: иконки правил
   этот файл (top:12px), бейдж — ek-home.css (top:16px), и они стояли
   на разной высоте. Теперь оба отступа объявлены рядом и совпадают.

   Отсчёт идёт от .ek-pcard (position:relative, :15) — бейдж лежит
   в разметке ПЕРЕД .ek-pcard-media и не входит в неё. */
.ek-page .ek-pcard-badge {
    position: absolute;
    top: 12px;
    left: 12px;
    height: 22px;
    padding: 0 10px;
    border-radius: var(--ek-radius-pill);
    font-size: 11px;
    font-weight: 500;
    letter-spacing: 0.01em;
    display: inline-flex;
    align-items: center;
    z-index: 2;
}
.ek-page .ek-pcard-badge.ek-hit  { background: var(--ek-text); color: #fff; }
.ek-page .ek-pcard-badge.ek-new  { border: 0.5px solid var(--ek-text); color: var(--ek-text); background: rgba(255, 255, 255, 0.8); }
.ek-page .ek-pcard-badge.ek-sale { background: var(--ek-bg-secondary); color: var(--ek-text); }

.ek-page .ek-pcard-actions {
    position: absolute;
    top: 12px;
    right: 12px;
    display: flex;
    gap: 6px;
    z-index: 3;
}

.ek-page .ek-pcard-iconbtn {
    width: 44px;
    height: 44px;
    padding: 0;
    border: 0;
    border-radius: 50%;
    background: transparent;
    color: var(--ek-text-muted);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.18));
    transition: color .15s, background .15s, transform .15s;
}

.ek-page .ek-pcard-iconbtn:hover {
    color: var(--ek-text);
}

.ek-page .ek-pcard-iconbtn.is-active {
    color: var(--ek-text);
}

.ek-page .ek-pcard-iconbtn:focus-visible {
    outline: 2px solid var(--ek-text);
    outline-offset: 2px;
}

.ek-page .ek-pcard-iconbtn:disabled {
    opacity: .5;
    cursor: default;
}

/* ═══════════════════════════════════════════════════════════
   Фото и бенефит-чипы
   ═══════════════════════════════════════════════════════════ */

.ek-page .ek-pcard-shot {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    aspect-ratio: 1 / 1;
    margin-bottom: 14px;
    border-radius: var(--ek-radius-md);
    overflow: hidden;
    text-decoration: none;
}

.ek-page .ek-pcard-thumb {
    max-width: 100%;
    max-height: 100%;
    width: auto;
    height: auto;
    object-fit: contain;
    transition: opacity .12s linear, transform .25s ease;
}

.ek-page .ek-pcard:hover .ek-pcard-thumb {
    transform: scale(1.02);
}

.ek-page .ek-pcard-benefits {
    position: absolute;
    left: 8px;
    right: 8px;
    bottom: 8px;
    display: flex;
    gap: 5px;
    z-index: 2;
}

.ek-page .ek-benefit {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 3px;
    padding: 6px 4px;
    background: rgba(255, 255, 255, 0.94);
    -webkit-backdrop-filter: blur(8px);
    backdrop-filter: blur(8px);
    border: 0.5px solid rgba(0, 0, 0, 0.06);
    border-radius: var(--ek-radius-sm);
    font-size: 10px;
    line-height: 1.2;
    color: var(--ek-text);
    text-align: center;
    text-decoration: none;
    cursor: pointer;
    transition: background .15s, border-color .15s;
}

.ek-page .ek-benefit:hover {
    background: #fff;
    border-color: rgba(0, 0, 0, 0.14);
}

.ek-page .ek-benefit:focus-visible {
    outline: 2px solid var(--ek-text);
    outline-offset: 1px;
}

.ek-page .ek-benefit svg {
    width: 14px;
    height: 14px;
    flex: none;
}

.ek-page .ek-benefit-t {
    display: block;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;
}

.ek-page .ek-benefit-t b {
    display: block;
    font-weight: 600;
}

/* ═══════════════════════════════════════════════════════════
   Заголовок
   ═══════════════════════════════════════════════════════════ */

/* Обрезка в две строки (правка 2026-09-02). Здесь стояло display:block,
   и оно молча отключало -webkit-line-clamp из ek-home.css: clamp работает
   только вместе с display:-webkit-box. Из-за этого длинные названия
   («Очиститель-увлажнитель Dyson PH05 Purifier Humidify (White/Gold)»)
   занимали три строки, и соседние ряды карточек различались по высоте
   на 100+px. min-height держит место ровно под две строки, чтобы карточки
   с коротким названием не оказались ниже. */
.ek-page .ek-pcard-name {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    overflow: hidden;
    min-height: 2.7em; /* 2 строки × line-height 1.35 */
    font-size: 15px;
    font-weight: 600;
    line-height: 1.35;
    letter-spacing: -0.01em;
    color: var(--ek-text);
    text-decoration: none;
    margin-bottom: 4px;
    text-wrap: pretty;
}

.ek-page .ek-pcard-name:hover {
    opacity: .7;
}

.ek-page .ek-pcard-name:focus-visible {
    outline: 2px solid var(--ek-text);
    outline-offset: 2px;
    border-radius: 4px;
}

.ek-page .ek-pcard-config {
    font-size: 12.5px;
    color: var(--ek-text-muted);
    margin-bottom: 12px;
}

/* ═══════════════════════════════════════════════════════════
   Выбор конфигурации
   ═══════════════════════════════════════════════════════════ */

.ek-page .ek-pcard-opts {
    padding-top: 12px;
    border-top: 0.5px solid var(--ek-border);
    margin-bottom: 14px;
}

.ek-page .ek-opt + .ek-opt {
    margin-top: 10px;
}

.ek-page .ek-opt-head {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 8px;
    font-size: 11px;
    color: var(--ek-text-muted);
    margin-bottom: 6px;
}

.ek-page .ek-opt-head b {
    font-size: 11.5px;
    font-weight: 500;
    color: var(--ek-text);
    text-align: right;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* ── Свотчи цвета ── */

.ek-page .ek-pcard .ek-opt-swatches {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}

.ek-page .ek-pcard .ek-opt-sw {
    position: relative;
    width: 26px;
    height: 26px;
    padding: 0;
    border: 0;
    border-radius: 50%;
    background: var(--ek-sw, #C7C7CC);
    cursor: pointer;
    transition: transform .15s cubic-bezier(.22, 1, .36, 1);
}

/* Область касания 44×44 без раздувания видимого кружка. */
.ek-page .ek-pcard .ek-opt-sw::before {
    content: "";
    position: absolute;
    top: 50%;
    left: 50%;
    width: 44px;
    height: 44px;
    transform: translate(-50%, -50%);
}

.ek-page .ek-pcard .ek-opt-sw.has-outline {
    box-shadow: inset 0 0 0 0.5px rgba(0, 0, 0, 0.18);
}

.ek-page .ek-pcard .ek-opt-sw:hover {
    transform: scale(1.1);
}

.ek-page .ek-pcard .ek-opt-sw:focus-visible {
    outline: 2px solid var(--ek-text);
    outline-offset: 3px;
}

.ek-page .ek-pcard .ek-opt-sw[aria-pressed="true"]::after {
    content: "";
    position: absolute;
    inset: -4px;
    border: 1.5px solid var(--ek-text);
    border-radius: 50%;
    pointer-events: none;
}

/* Недоступное сочетание видно сразу, а не после клика в пустоту. */
.ek-page .ek-pcard .ek-opt-sw[aria-disabled="true"] {
    opacity: .32;
}

.ek-page .ek-pcard .ek-opt-sw[aria-disabled="true"]::after {
    content: "";
    position: absolute;
    inset: 0;
    border-radius: 50%;
    background: linear-gradient(to bottom right,
        transparent 46%, rgba(0, 0, 0, .45) 46%,
        rgba(0, 0, 0, .45) 54%, transparent 54%);
    pointer-events: none;
}

/* ── Пилюли памяти и SIM ── */

.ek-page .ek-pcard .ek-opt-pills {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}

.ek-page .ek-pcard .ek-opt-pill {
    min-height: 32px;
    padding: 0 12px;
    border: 0.5px solid var(--ek-border);
    border-radius: var(--ek-radius-pill);
    background: #fff;
    color: var(--ek-text);
    font-family: inherit;
    font-size: 12.5px;
    line-height: 1;
    display: inline-flex;
    align-items: center;
    cursor: pointer;
    transition: border-color .15s, background .15s, color .15s;
}

.ek-page .ek-pcard .ek-opt-pill:hover {
    border-color: #B8B8BD;
}

.ek-page .ek-pcard .ek-opt-pill:focus-visible {
    outline: 2px solid var(--ek-text);
    outline-offset: 2px;
}

.ek-page .ek-pcard .ek-opt-pill[aria-pressed="true"] {
    background: var(--ek-text);
    border-color: var(--ek-text);
    color: #fff;
}

.ek-page .ek-pcard .ek-opt-pill[aria-disabled="true"] {
    opacity: .35;
    text-decoration: line-through;
}

/* ═══════════════════════════════════════════════════════════
   Цена, рассрочка, наличие, бонус
   ═══════════════════════════════════════════════════════════ */

.ek-page .ek-pcard-price-row {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 8px;
    margin-bottom: 3px;
}

.ek-page .ek-pcard-price {
    font-size: 20px;
    font-weight: 600;
    letter-spacing: -0.02em;
    font-variant-numeric: tabular-nums;
}

.ek-page .ek-pcard-price.is-empty {
    font-size: 15px;
    font-weight: 500;
    color: var(--ek-text-muted);
}

.ek-page .ek-pcard-old {
    font-size: 13.5px;
    color: var(--ek-text-muted);
    text-decoration: line-through;
}

.ek-page .ek-pcard-old[hidden] {
    display: none;
}

.ek-page .ek-pcard-install {
    font-size: 12.5px;
    color: var(--ek-text-muted);
    margin-bottom: 10px;
}

/* Наличие: цвет ВСЕГДА продублирован текстом (дальтонизм). */
.ek-page .ek-pcard-stock {
    display: flex;
    align-items: center;
    gap: 7px;
    font-size: 12.5px;
    color: var(--ek-text);
    margin-bottom: 10px;
}

.ek-page .ek-pcard-dot {
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: #4F8B5C;
    flex: none;
}

.ek-page .ek-pcard-stock.is-out {
    color: var(--ek-text-muted);
}

.ek-page .ek-pcard-stock.is-out .ek-pcard-dot {
    background: #C7C7CC;
}

.ek-page .ek-pcard-bonus {
    display: flex;
    align-items: center;
    gap: 7px;
    padding: 7px 10px;
    border: 0.5px solid var(--ek-border);
    border-radius: var(--ek-radius-sm);
    font-size: 12px;
    color: var(--ek-text-muted);
    margin-bottom: 14px;
    margin-top: auto;
}

.ek-page .ek-pcard-bonus svg {
    width: 13px;
    height: 13px;
    flex: none;
}

.ek-page .ek-pcard-bonus b {
    color: var(--ek-text);
    font-weight: 600;
    white-space: nowrap;
}

/* ═══════════════════════════════════════════════════════════
   Кнопка покупки
   ═══════════════════════════════════════════════════════════ */

.ek-page .ek-pcard .ek-pcard-buy {
    height: 44px;
    width: 100%;
    border-radius: var(--ek-radius-pill);
    font-size: 14px;
    font-weight: 500;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    text-decoration: none;
}

.ek-page .ek-pcard .ek-pcard-buy:focus-visible {
    outline: 2px solid var(--ek-text);
    outline-offset: 2px;
}

/* ═══════════════════════════════════════════════════════════
   Уведомления
   Раньше все отказы AJAX уходили только в console.warn.
   ═══════════════════════════════════════════════════════════ */

.ek-toast {
    position: fixed;
    left: 50%;
    bottom: 24px;
    transform: translate(-50%, 12px);
    max-width: min(90vw, 420px);
    padding: 12px 20px;
    background: var(--ek-bg-dark, #0A0A0A);
    color: #fff;
    border-radius: var(--ek-radius-pill, 980px);
    font-size: 14px;
    line-height: 1.4;
    text-align: center;
    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.24);
    opacity: 0;
    pointer-events: none;
    z-index: 9999;
    transition: opacity .2s ease, transform .25s cubic-bezier(.22, 1, .36, 1);
}

.ek-toast.is-visible {
    opacity: 1;
    transform: translate(-50%, 0);
}

.ek-toast.is-error {
    background: #8B3A3A;
}

/* Скрыто визуально, доступно скринридеру. */
.ek-sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

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

@media (max-width: 640px) {
    .ek-page .ek-pcard {
        padding: 14px;
    }

    .ek-page .ek-pcard-actions {
        top: 8px;
        right: 8px;
        gap: 2px;
    }

    /* Бейдж едет вместе с иконками, иначе на мобиле углы снова разъедутся. */
    .ek-page .ek-pcard-badge {
        top: 8px;
        left: 8px;
    }

    .ek-page .ek-pcard-iconbtn {
        width: 40px;
        height: 40px;
    }

    /* На двух колонках три чипа не помещаются — оставляем рассрочку и бонус. */
    .ek-page .ek-benefit-t b {
        display: none;
    }

    .ek-page .ek-pcard-name {
        font-size: 14px;
    }

    .ek-page .ek-pcard-price {
        font-size: 18px;
    }

    .ek-page .ek-pcard-opts {
        margin-bottom: 12px;
    }

    .ek-page .ek-pcard .ek-opt-pill {
        min-height: 30px;
        padding: 0 10px;
        font-size: 12px;
    }
}

@media (max-width: 420px) {
    .ek-page .ek-pcard-benefits {
        display: none;
    }
}

/* ═══════════════════════════════════════════════════════════
   Требование DESIGN.md: у каждой анимации есть альтернатива.
   ═══════════════════════════════════════════════════════════ */

@media (prefers-reduced-motion: reduce) {
    .ek-page .ek-pcard,
    .ek-page .ek-pcard-thumb,
    .ek-page .ek-pcard-iconbtn,
    .ek-page .ek-pcard .ek-opt-sw,
    .ek-page .ek-pcard .ek-opt-pill,
    .ek-page .ek-benefit,
    .ek-toast {
        transition: none;
    }

    .ek-page .ek-pcard:hover {
        transform: none;
    }

    .ek-page .ek-pcard:hover .ek-pcard-thumb {
        transform: none;
    }

    .ek-page .ek-pcard .ek-opt-sw:hover {
        transform: none;
    }
}

/* ═══════════════════════════════════════════════════════════
   ФИЛЬТРЫ КАТАЛОГА
   
   Эти стили изначально были отложены в блок C3. Ошибка: разметка
   кнопки «Фильтры» приезжает вместе с archive-product.php в блоке B,
   и между блоками оставалось окно, где на мобильном висела кнопка
   без стилей и без реакции. Перенесено сюда, в блок B.
   ═══════════════════════════════════════════════════════════ */

.ek-page .ek-filters-toggle {
    display: none;
    align-items: center;
    gap: 8px;
    width: 100%;
    min-height: 44px;
    padding: 0 16px;
    border: 0.5px solid var(--ek-border);
    border-radius: var(--ek-radius-pill);
    background: #fff;
    color: var(--ek-text);
    font-family: inherit;
    font-size: 14px;
    cursor: pointer;
    transition: border-color .15s;
}

.ek-page .ek-filters-toggle:hover { border-color: #B8B8BD; }

.ek-page .ek-filters-toggle:focus-visible {
    outline: 2px solid var(--ek-text);
    outline-offset: 2px;
}

.ek-page .ek-filters-count {
    margin-left: auto;
    min-width: 20px;
    height: 20px;
    padding: 0 6px;
    border-radius: var(--ek-radius-pill);
    background: var(--ek-text);
    color: #fff;
    font-size: 11px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}

/* ── Чипы подкатегорий над сеткой ── */

.ek-page .ek-subcats {
    display: flex;
    gap: 8px;
    overflow-x: auto;
    padding-bottom: 4px;
    margin-bottom: 20px;
    scrollbar-width: none;
}

.ek-page .ek-subcats::-webkit-scrollbar { display: none; }

.ek-page .ek-subcat {
    flex: none;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    min-height: 38px;
    padding: 0 14px;
    border: 0.5px solid var(--ek-border);
    border-radius: var(--ek-radius-pill);
    background: #fff;
    color: var(--ek-text);
    font-size: 13.5px;
    text-decoration: none;
    white-space: nowrap;
    transition: border-color .15s, background .15s, color .15s;
}

.ek-page .ek-subcat:hover { border-color: #B8B8BD; }

.ek-page .ek-subcat:focus-visible {
    outline: 2px solid var(--ek-text);
    outline-offset: 2px;
}

.ek-page .ek-subcat.is-active {
    background: var(--ek-text);
    border-color: var(--ek-text);
    color: #fff;
}

.ek-page .ek-subcat-n {
    font-size: 11.5px;
    color: var(--ek-text-muted);
    font-variant-numeric: tabular-nums;
}

.ek-page .ek-subcat.is-active .ek-subcat-n { color: rgba(255,255,255,.65); }

/* ── Чипы активных фильтров ── */

.ek-page .ek-active-filters {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    align-items: center;
    margin-bottom: 20px;
}

.ek-page .ek-active-chip {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    min-height: 32px;
    padding: 0 12px;
    border: 0.5px solid var(--ek-border);
    border-radius: var(--ek-radius-pill);
    background: var(--ek-bg-secondary);
    color: var(--ek-text);
    font-size: 12.5px;
    text-decoration: none;
    transition: border-color .15s;
}

.ek-page .ek-active-chip:hover { border-color: #B8B8BD; }

.ek-page .ek-active-chip:focus-visible {
    outline: 2px solid var(--ek-text);
    outline-offset: 2px;
}

.ek-page .ek-active-chip-x {
    font-size: 15px;
    line-height: 1;
    color: var(--ek-text-muted);
}

.ek-page .ek-active-reset {
    font-size: 12.5px;
    color: var(--ek-text-muted);
    text-decoration: underline;
    text-underline-offset: 3px;
}

.ek-page .ek-active-reset:hover { color: var(--ek-text); }

/* ── Фильтр цены ── */

.ek-page .ek-price-inputs {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-bottom: 12px;
}

.ek-page .ek-price-field { flex: 1; min-width: 0; }

.ek-page .ek-price-field input {
    width: 100%;
    height: 38px;
    padding: 0 10px;
    border: 0.5px solid var(--ek-border);
    border-radius: var(--ek-radius-sm);
    background: #fff;
    font-family: inherit;
    font-size: 13px;
    color: var(--ek-text);
}

.ek-page .ek-price-field input:focus-visible {
    outline: 2px solid var(--ek-text);
    outline-offset: -1px;
}

.ek-page .ek-price-dash { color: var(--ek-text-muted); flex: none; }

/* Честная строка под ползунком: фильтр по цене отсекает товары
   без цены при любом диапазоне, и об этом надо сказать словами. */
.ek-page .ek-price-note {
    margin: 10px 0 0;
    font-size: 12px;
    line-height: 1.35;
    color: var(--ek-text-muted);
}

.ek-page .ek-price-range { position: relative; height: 20px; }

.ek-page .ek-price-range::before {
    /* Рельс. Без него оба input'а с background:none рисовали два кружка в пустоте. */
    content: "";
    position: absolute;
    left: 0; right: 0;
    top: 50%;
    height: 3px;
    margin-top: -1.5px;
    border-radius: 2px;
    background: var(--ek-border);
}

.ek-page .ek-range {
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 20px;
    margin: 0;
    background: none;
    pointer-events: none;
    -webkit-appearance: none;
    appearance: none;
}

.ek-page .ek-range::-webkit-slider-runnable-track {
    height: 20px;
    background: transparent;
    border: 0;
}

.ek-page .ek-range::-moz-range-track {
    height: 20px;
    background: transparent;
    border: 0;
}

.ek-page .ek-range::-webkit-slider-thumb {
    -webkit-appearance: none;
    margin-top: 1px;
    width: 18px;
    height: 18px;
    border-radius: 50%;
    background: var(--ek-text);
    border: 2px solid #fff;
    box-shadow: 0 1px 4px rgba(0,0,0,.25);
    pointer-events: auto;
    cursor: pointer;
}

.ek-page .ek-range::-moz-range-thumb {
    width: 18px;
    height: 18px;
    border-radius: 50%;
    background: var(--ek-text);
    border: 2px solid #fff;
    pointer-events: auto;
    cursor: pointer;
}

.ek-page .ek-range:focus-visible::-webkit-slider-thumb {
    outline: 2px solid var(--ek-text);
    outline-offset: 2px;
}

/* ── Свотч с подписью в сайдбаре ── */

.ek-page .ek-check-swatch {
    position: relative;
    width: 18px;
    height: 18px;
    border-radius: 50%;
    background: var(--ek-swatch-color, #C7C7CC);
    box-shadow: inset 0 0 0 0.5px rgba(0,0,0,.14);
    flex: none;
    transition: box-shadow .15s ease;
}

/* Выбранный цвет. Без этого правила клик по цвету не давал НИКАКОЙ обратной
   связи: .ek-check-box из ek-catalog.css в цветовой строке не выводится,
   а своего :checked-состояния у свотча не было. */
.ek-page .ek-check-color input:checked ~ .ek-check-swatch {
    box-shadow: inset 0 0 0 0.5px rgba(0,0,0,.14), 0 0 0 2px var(--ek-bg), 0 0 0 3.5px var(--ek-text);
}

.ek-page .ek-check-color input:checked ~ .ek-check-label { font-weight: 500; }

.ek-page .ek-check-color input:focus-visible ~ .ek-check-swatch {
    outline: 2px solid var(--ek-text);
    outline-offset: 3px;
}

@media (prefers-reduced-motion: reduce) {
    .ek-page .ek-check-swatch { transition: none; }
}

/* ── Состояние загрузки при AJAX-фильтрации ── */

.ek-page .ek-catalog-main.is-loading {
    opacity: .5;
    pointer-events: none;
    transition: opacity .15s ease;
}

/* ── Пустой экран ── */

.ek-page .ek-empty {
    padding: 64px 24px;
    text-align: center;
}

.ek-page .ek-empty-title {
    font-size: 18px;
    font-weight: 600;
    letter-spacing: -0.01em;
    margin: 0 0 6px;
}

.ek-page .ek-empty-sub {
    font-size: 14px;
    color: var(--ek-text-muted);
    margin: 0 0 20px;
}

/* ═══════════════════════════════════════════════════════════
   Адаптив фильтров
   ═══════════════════════════════════════════════════════════ */

@media (max-width: 1024px) {
    .ek-page .ek-filters-toggle { display: flex; }

    /* ───── Полноэкранный лист фильтров (аудит 2026-09, пункт 5.4) ─────
       Было: обычный блок в потоке — раскрывался НАД сеткой, и результат
       применения уезжал за экран (замер: сетка на y=1319 при окне 844).
       Стало: лист под шапкой, как мобильное меню. Прецедент тот же
       (--ek-header-actual-h), и он уже починен в шаге 0a: переменная
       клампится к нулю, поэтому отрицательного top не будет. */
    .ek-page .ek-filters-panel { display: none; }

    .ek-page .ek-filters-panel.is-open {
        display: flex;
        flex-direction: column;
        position: fixed;
        /* 🔴 top:0, а НЕ под шапкой. Лист модальный, у него своя шапка с
           крестиком, поэтому зависеть от --ek-header-actual-h незачем.
           А зависеть было бы вредно: sticky у шапки на ≤640px не работает
           (.ek-page{overflow-x:hidden}, вынесено в отдельную задачу 0b),
           переменная остаётся с момента загрузки, и при открытии панели с
           прокрученной страницы сверху оставалась полоса чужого контента.
           z-index выше шапки (1001) — лист перекрывает её целиком. */
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        /* Ширину задаёт пара left:0/right:0. width:100vw убран (аудит фронта,
           P2): 100vw включает полосу прокрутки и на вьюпортах с видимым
           скроллбаром давал горизонтальный вылет на пиксели ширины полосы. */
        background: #fff;
        z-index: 1002;
        margin: 0;
        padding: 0;
        border: 0;
        border-radius: 0;
    }

    /* Шапка листа: заголовок, сброс, крестик. */
    .ek-page .ek-fp-head {
        display: flex;
        align-items: center;
        gap: 12px;
        /* +env(safe-area-inset-top): лист от top:0, в ландшафте на телефонах
           с вырезом шапка иначе уходила под него (аудит фронта, P2). */
        padding: calc(12px + env(safe-area-inset-top)) 16px 12px;
        border-bottom: 0.5px solid var(--ek-border);
        flex-shrink: 0;
    }
    .ek-page .ek-fp-title { font-size: 17px; font-weight: 600; flex: 1; }
    .ek-page .ek-fp-reset { font-size: 14px; color: var(--ek-text-muted); text-decoration: none; }
    .ek-page .ek-fp-close {
        display: inline-flex; align-items: center; justify-content: center;
        width: 44px; height: 44px; margin: -12px -12px -12px 0;
        padding: 0; border: 0; background: transparent;
        color: var(--ek-text); cursor: pointer;
    }

    /* Прокручивается ТОЛЬКО тело листа. */
    .ek-page .ek-fp-body {
        flex: 1;
        overflow-y: auto;
        -webkit-overflow-scrolling: touch;
        padding: 16px;
    }

    .ek-page .ek-fp-foot {
        flex-shrink: 0;
        /* +env(safe-area-inset-bottom): кнопка «Показать N» иначе сидела под
           home-индикатором (аудит фронта, P2). */
        padding: 12px 16px calc(12px + env(safe-area-inset-bottom));
        border-top: 0.5px solid var(--ek-border);
        background: #fff;
    }

    /* 🔴 Снимаем десктопный скроллер с сайдбара: на мобильном он зажимал
       панель в 716px собственной прокрутки внутри страницы (замер:
       clientHeight 716 при scrollHeight 2054). Лист прокручивает своё тело. */
    .ek-page .ek-catalog-layout > .ek-catalog-sidebar {
        position: static;
        max-height: none;
        overflow: visible;
    }
}

@media (prefers-reduced-motion: reduce) {
    .ek-page .ek-filters-toggle,
    .ek-page .ek-subcat,
    .ek-page .ek-active-chip,
    .ek-page .ek-catalog-main.is-loading { transition: none; }
}

/* Шапка и подвал листа фильтров — только на мобильном. На десктопе сайдбар
   остаётся ровно таким, каким был, поэтому прячем их именно там: правило
   вне медиазапроса стояло бы в файле ПОСЛЕ мобильного блока и перебивало
   бы его при равной специфичности. */
@media (min-width: 1025px) {
    .ek-page .ek-fp-head,
    .ek-page .ek-fp-foot { display: none; }
}

/* ───── Обёртка фото и чипов (аудит 2026-09, пункт 6.4) ─────
   Чипы вынесены ИЗ ссылки на товар (вложенные <a> недопустимы), но
   визуально остаются поверх фото. Позиционируются относительно этой
   обёртки; .ek-pcard-shot сохраняет свой position:relative для бейджа. */
.ek-page .ek-pcard-media {
    position: relative;
}
/* Отступ переехал на обёртку: он был у .ek-pcard-shot и после выноса
   чипов оставлял бы их за пределами отступа. */
.ek-page .ek-pcard-media > .ek-pcard-shot { margin-bottom: 0; }
.ek-page .ek-pcard-media { margin-bottom: 14px; }

/* Чипы — теперь ссылки, а не span[role=link]. */
.ek-page a.ek-benefit { text-decoration: none; }

/* ============================================================
   Плиточная лента разделов каталога. Сейчас её получают ветка
   смартфонов (бренды/модели) и раздел Dyson (подкатегории —
   пока в виде заглушек, без фото). Класс .is-catalog-tiles вешает
   archive-product.php; у остальных категорий продолжают работать
   правила .ek-subcat выше по файлу.
   ============================================================ */

.ek-page .ek-subcats.is-catalog-tiles {
    display: block;          /* перебиваем flex базовой ленты */
    overflow: visible;       /* прокрутку берёт на себя дорожка */
    margin-bottom: 24px;
    padding-bottom: 0;
}

.ek-page .ek-subcats.is-catalog-tiles .ek-subcats-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 8px 16px;
    margin-bottom: 10px;
}
.ek-page .ek-subcats-label {
    color: var(--ek-text-muted);
    font-size: 12px;
    font-weight: 500;
    letter-spacing: 0.04em;
    text-transform: uppercase;
}
.ek-page .ek-subcats-actions { display: inline-flex; gap: 14px; flex-wrap: wrap; }
.ek-page .ek-subcats-action {
    font-size: 13px;
    color: var(--ek-text-muted);
    text-decoration: none;
    white-space: nowrap;
}
.ek-page .ek-subcats-action:hover { color: var(--ek-text); text-decoration: underline; }

/* ───── Дорожка ───── */
.ek-page .ek-tax-tile-track {
    display: flex;
    gap: 8px;
    overflow-x: auto;
    /* Отступ, а не 0: у плиток есть тень и кольцо фокуса, при нулевом
       padding их срезал бы край контейнера прокрутки. */
    padding: 2px 2px 8px;
    scrollbar-width: none;
    scroll-snap-type: x proximity;
    scroll-padding-inline: 2px;
    scroll-behavior: smooth;
}
.ek-page .ek-tax-tile-track::-webkit-scrollbar { display: none; }

@media (prefers-reduced-motion: reduce) {
    .ek-page .ek-tax-tile-track { scroll-behavior: auto; }
}

/* ───── Плитка ─────
   Селектор с .ek-subcats.is-catalog-tiles — чтобы перебить
   базовые правила .ek-subcat (pill, nowrap, min-height 38). */
.ek-page .ek-subcats.is-catalog-tiles .ek-tax-tile {
    /* 190×96 вместо 148×74: композиции брендов — три аппарата в портретном
       кадре 1183×1330, и в медиаблоке 40px они превращались в неразличимое
       пятно. При 64px читаются цвет и силуэт, а лента подрастает всего
       на ~20px и остаётся лентой, а не галереей (решение владельца). */
    flex: 0 0 196px;
    min-height: 100px;
    display: grid;
    grid-template-columns: 68px minmax(0, 1fr);
    align-items: center;
    gap: 12px;
    padding: 10px 14px 10px 10px;
    /* Волосяная линия вместо серой рамки: на белом она читается как край
       карточки, а не как обводка элемента управления. */
    border: 1px solid rgba(0, 0, 0, .07);
    border-radius: 16px;
    background: #fff;
    color: var(--ek-text);
    white-space: normal;
    text-decoration: none;
    scroll-snap-align: start;
    transition: border-color .18s ease, box-shadow .18s ease, transform .18s ease;
}
/* Подъём тенью вместо потемнения границы: граница дёргает контур,
   тень оставляет форму на месте и читается спокойнее. */
.ek-page .ek-subcats.is-catalog-tiles .ek-tax-tile:hover {
    border-color: rgba(0, 0, 0, .12);
    box-shadow: 0 6px 20px rgba(0, 0, 0, .07);
    transform: translateY(-1px);
}
.ek-page .ek-subcats.is-catalog-tiles .ek-tax-tile:focus-visible {
    outline: 2px solid var(--ek-text);
    outline-offset: 2px;
}

/* Выбранная плитка: тёмная заливка + галочка. Цвет не должен быть
   единственным признаком активности. */
.ek-page .ek-subcats.is-catalog-tiles .ek-tax-tile.is-active {
    background: var(--ek-text);
    border-color: var(--ek-text);
    color: #fff;
}
.ek-page .ek-subcats.is-catalog-tiles .ek-tax-tile.is-active .ek-tax-tile-name { color: #fff; }
.ek-page .ek-subcats.is-catalog-tiles .ek-tax-tile.is-active .ek-tax-tile-count { color: rgba(255,255,255,.7); }
.ek-page .ek-subcats.is-catalog-tiles .ek-tax-tile.is-active .ek-tax-tile-placeholder {
    background: rgba(255, 255, 255, .12);
    color: rgba(255, 255, 255, .5);
}
.ek-page .ek-subcats.is-catalog-tiles .ek-tax-tile.is-active {
    box-shadow: 0 8px 24px rgba(0, 0, 0, .18);
}
.ek-page .ek-subcats.is-catalog-tiles .ek-tax-tile.is-active .ek-tax-tile-name::after {
    content: ' ✓';
    font-weight: 600;
}

/* ───── Медиа и заглушка ───── */
.ek-page .ek-tax-tile-media {
    display: grid;
    width: 68px;
    height: 80px;
    place-items: center;
    /* 🔴 Серой подложки здесь больше нет. Присланные композиции — PNG
       с прозрачным фоном, и серый прямоугольник под ними читался как
       отдельная плашка вокруг товара: вместо снимка получался мутный
       блок. На белом фоне карточки прозрачный PNG выглядит вырезанным
       по контуру, как и задумано автором изображений. */
    color: var(--ek-border);
}
.ek-page .ek-tax-tile-img {
    max-width: 100%;
    max-height: 100%;
    object-fit: contain;
}
/* Заглушка одинакова для брендов и моделей — контур телефона, без эмодзи
   и без букв: буква в кружке читается как логотип, которого нет. */
/* Подложка осталась ТОЛЬКО у заглушки. У фотографий её нет — они лежат
   на белом. А тонкий контур без подложки висел бы в пустоте и читался
   как недогруженная картинка, а не как «фото пока нет». */
.ek-page .ek-tax-tile-placeholder {
    display: grid;
    place-items: center;
    width: 100%;
    height: 100%;
    border-radius: 12px;
    background: var(--ek-bg-secondary);
    color: #C7C7CC;
}
.ek-page .ek-tax-tile-placeholder svg { width: 24px; height: 35px; }

.ek-page .ek-tax-tile-content {
    min-width: 0;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    justify-content: center;
    gap: 4px;
}
.ek-page .ek-tax-tile-name {
    display: -webkit-box;
    overflow: hidden;
    color: var(--ek-text);
    font-size: 14px;
    font-weight: 500;
    line-height: 1.25;
    letter-spacing: -0.01em;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    /* Две строки держим ВСЕГДА. Иначе у «iPhone 18 Pro Max» имя
       переносится, счётчик уезжает на 8px вниз, и ряд идёт волной:
       у соседей «16 товаров» стоит выше, чем у него. */
    min-height: calc(2 * 1.25em);
}
.ek-page .ek-tax-tile-count {
    color: var(--ek-text-muted);
    font-size: 11.5px;
    line-height: 1.2;
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
}

/* ───── Стрелки прокрутки ─────
   Показывает их ek-tax-tiles.js и только при переполнении; без JS
   дорожка остаётся прокручиваемой пальцем и трекпадом. */
/* Растушёвка у краёв: под кнопкой плитка растворяется, а не обрывается
   ровной вертикалью. Классы is-start / is-end ставит ek-tax-tiles.js. */
.ek-page .ek-tax-tile-rail::before,
.ek-page .ek-tax-tile-rail::after {
    content: '';
    position: absolute;
    top: 0;
    bottom: 8px;
    width: 64px;
    z-index: 1;
    pointer-events: none;
    opacity: 0;
    transition: opacity .2s ease;
}
.ek-page .ek-tax-tile-rail::before {
    left: 0;
    background: linear-gradient( 90deg, var(--ek-bg) 25%, rgba(255,255,255,0) );
}
.ek-page .ek-tax-tile-rail::after {
    right: 0;
    background: linear-gradient( 270deg, var(--ek-bg) 25%, rgba(255,255,255,0) );
}
.ek-page .ek-tax-tile-rail.has-overflow:not(.is-start)::before { opacity: 1; }
.ek-page .ek-tax-tile-rail.has-overflow:not(.is-end)::after { opacity: 1; }

.ek-page .ek-tax-tile-nav {
    display: none;
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    z-index: 2;
    width: 34px;
    height: 34px;
    align-items: center;
    justify-content: center;
    padding: 0;
    border: 1px solid rgba(0, 0, 0, .07);
    border-radius: 980px;
    background: #fff;
    color: var(--ek-text);
    cursor: pointer;
    box-shadow: 0 4px 14px rgba(0, 0, 0, .12);
    transition: box-shadow .18s ease, opacity .18s ease;
}
.ek-page .ek-tax-tile-nav:hover { box-shadow: 0 6px 18px rgba(0, 0, 0, .16); }
.ek-page .ek-tax-tile-rail.has-overflow .ek-tax-tile-nav { display: flex; }
/* Недоступную стрелку убираем совсем, а не гасим до 35%: полупрозрачный
   кружок всё равно висел призраком поверх первой или последней плитки
   и читался как недогруженный элемент. Нечего листать — нечего и показывать. */
.ek-page .ek-tax-tile-nav[disabled] {
    opacity: 0;
    pointer-events: none;
}
.ek-page .ek-tax-tile-nav:focus-visible { outline: 2px solid var(--ek-text); outline-offset: 2px; }
.ek-page .ek-tax-tile-prev { left: -6px; }
.ek-page .ek-tax-tile-next { right: -6px; }

/* Обёртка нужна только чтобы позиционировать стрелки относительно дорожки. */
.ek-page .ek-tax-tile-rail { position: relative; }

@media (max-width: 1024px) {
    .ek-page .ek-subcats.is-catalog-tiles .ek-tax-tile { flex-basis: 184px; min-height: 96px; }
}
@media (max-width: 640px) {
    .ek-page .ek-subcats.is-catalog-tiles { margin-bottom: 18px; }
    .ek-page .ek-subcats.is-catalog-tiles .ek-tax-tile {
        flex-basis: 170px;
        min-height: 90px;
        grid-template-columns: 58px minmax(0, 1fr);
        gap: 10px;
        padding: 9px 12px 9px 9px;
    }
    /* На телефоне медиа меньше, но не настолько, чтобы снова стать пятном. */
    .ek-page .ek-tax-tile-media { width: 58px; height: 68px; }
    .ek-page .ek-tax-tile-name { font-size: 13.5px; }
    /* На тач-экране листают пальцем — стрелки только мешали бы. */
    .ek-page .ek-tax-tile-nav { display: none !important; }
}
