/**
 * @file cards.css — карточки мероприятий (режим просмотра «Карточка», шаблон node--event--card.html.twig) и сетка .ee-cards.
 * Одна и та же карточка в расписании, каталоге направления и блоках. Телефон — одна колонка (карточка в строку: обложка слева), 768 px — две, от 1024 — три, от 1280 — четыре.
 * Цвета и скругления — токены theme.css; кнопки — css/buttons.css.
 */
.ee-cards > .view-content, .ee-cards .view-content { display: grid; grid-template-columns: minmax(0, 1fr); gap: 1rem; }
@media (min-width: 48rem) { .ee-cards > .view-content, .ee-cards .view-content { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1.5rem; } }
@media (min-width: 64rem) { .ee-cards > .view-content, .ee-cards .view-content { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
/* ИСПРАВЛЕНО 2026-09-29 (координатор нашёл фактом Playwright: на ≥80rem жёсткие 4 колонки давали карточку 282px —
   на 18px/6% УЖЕ заявленного оператором минимума --ee-card-min:300px, токен на этой ширине игнорировался
   полностью). Заменено на ту же формулу auto-fill+minmax(--ee-card-min), что уже работает с 40rem — колонка
   никогда не становится уже card-min, число колонок подстраивается (на container=1200px с gap=1.5rem это теперь
   3 колонки по ~384px, не 4 по 282px — при текущих 1200px/300px/24px гэпе 4 колонки по ≥300px арифметически не
   помещаются: 4×300+3×24=1272px > 1200px. Если оператору нужны именно 4 колонки на десктопе — нужно либо поднять
   --ee-container, либо снизить --ee-card-min/gap; выбор — за оператором, отдельным решением. */
@media (min-width: 80rem) { .ee-cards > .view-content, .ee-cards .view-content { grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--ee-card-min)), 1fr)); } }
/* ИСПРАВЛЕНО 2026-09-29, ВЕРСИЯ 3 (в тот же день: версия 1 — gap:0 «впритык»; версия 2 — gap:20px/поле:10px по
   первому прочтению фрагментов оператора, но при проверке на РЕАЛЬНОМ вьюпорте 1280px не влезало — см. полную
   арифметику, включая находку про ненулевой margin у body, в докблоке рядом в engine.css). Гэп между карточками —
   16px, тот же, что у .views-view-grid — сведено к цифре, которая реально помещается на всех трёх проверенных
   ширинах (1280/1440/1920), не только на бумаге. */
@media (min-width: 80rem) { .ee-cards > .view-content, .ee-cards .view-content { gap: 1rem; } }
/* ИСПРАВЛЕНО 2026-09-29: независимая проверка нашла причину жалобы «карточки в один сжатый ряд» на /meropriyatiya —
   модуль Infinite Scroll (views_infinite_scroll, подключён тем же утром к events_listing) оборачивает ВСЕ строки
   представления в свой div.views-infinite-scroll-content-wrapper — доказано curl реального HTML: структура стала
   .view-content > div.views-infinite-scroll-content-wrapper > div (обёртка строки) > article.ee-card, то есть
   обёртка строки ушла на 1 уровень глубже. Правило ниже использует child-комбинатор (>), поэтому вместо обёрток
   строк оно ошибочно попадало на САМУ обёртку infinite-scroll (единственный прямой потомок .view-content) —
   весь список сжимался в одну flex-ячейку. Тот же приём, что уже есть в engine.css:92 (».views-view-grid .views-row
   {display:contents}»), но там работает descendant-селектор (не зависит от глубины вложенности), здесь — child-
   комбинатор, поэтому обёртку убираем из потока (display:contents передаёт её детей в грид-контекст .view-content
   по спецификации CSS Grid), И расширяем сами правила flex/stretch через :is() на тот же новый уровень, чтобы
   карточки по-прежнему растягивались на всю ячейку грида, как без Infinite Scroll. praktiki/mastera (Grid-стиль
   Views, не .ee-cards) — проверила отдельно: там все правила в engine.css descendant-based (.views-view-grid
   .views-row/.views-col), они не зависят от глубины вложенности — Infinite Scroll там ничего не ломает. */
.ee-cards .view-content > .views-infinite-scroll-content-wrapper { display: contents; }
.ee-cards .view-content > .views-row { display: contents; }
/* ДОПРАВЛЕНО 2026-09-29 (сразу за фиксом выше): первая версия использовала :is() — не сработала, доказано
   диагностикой через реальный getComputedStyle() (Chrome headless --dump-dom с инъекцией диагностического
   <script>, т.к. Playwright недоступен в этом контейнере — sandbox отказал под root, а mcp pult не даёт eval).
   Обёртка вычислялась в display:flex, НЕ contents — потому что специфичность :is(A, B) берётся МАКСИМАЛЬНОЙ
   среди веток независимо от того, какая ветка реально совпала в DOM, поэтому «:is(.view-content, .view-content
   > .wrapper) > div» (0,3,1) оказалось специфичнее правила contents (0,3,0) и выигрывало ИМЕННО на самой
   обёртке (она тоже — прямой div-потомок .view-content, совпадает и с первой веткой :is() тоже). Заменено на
   явный :not(), однозначно и без этой ловушки специфичности. */
.ee-cards .view-content > div:not(.views-infinite-scroll-content-wrapper),
.ee-cards .view-content > .views-infinite-scroll-content-wrapper > div { display: flex; min-width: 0; }   /* обёртка строки (безымянный div): карточки в одном ряду одной высоты */
.ee-cards .view-content > div:not(.views-infinite-scroll-content-wrapper) > .ee-card,
.ee-cards .view-content > .views-infinite-scroll-content-wrapper > div > .ee-card { flex: 1 1 auto; width: 100%; }

.ee-card { position: relative; display: flex; flex-direction: row; min-width: 0; background: var(--ee-card-bg); border: 1px solid var(--ee-card-border); border-radius: var(--ee-radius-card); box-shadow: var(--ee-card-shadow); overflow: hidden; transition: box-shadow .2s; }
.ee-card:hover { box-shadow: var(--shadow-lg); }
.ee-card[hidden] { display: none; }
.ee-card__cover { position: relative; display: block; flex: 0 0 7.5rem; min-height: 9rem; background: var(--muted); overflow: hidden; }
.ee-card__cover img { position: absolute; inset: 0; display: block; width: 100%; height: 100%; object-fit: cover; object-position: center top; }
.ee-card__body { display: flex; flex: 1; flex-direction: column; gap: .4rem; min-width: 0; padding: var(--ee-card-pad); }
.ee-card__badges { display: flex; flex-wrap: wrap; gap: .35rem; row-gap: .3rem; padding-right: 2.5rem; min-width: 0; }
.ee-card__title { margin: 0; font-size: 1.0625rem; font-weight: 700; line-height: 1.3; }
.ee-card__title a { color: var(--foreground); text-decoration: none; overflow-wrap: anywhere; }
.ee-card__title a:hover { color: var(--ee-btn-accent, var(--primary)); text-decoration: underline; }
.ee-card__when { margin: 0; font-weight: 700; color: var(--ee-btn-accent, var(--primary)); }
.ee-card__hosts { margin: 0; font-size: .875rem; line-height: 1.4; color: var(--muted-foreground); }
.ee-card__dates, .ee-card__meta { margin: 0; font-size: .9375rem; line-height: 1.4; color: var(--muted-foreground); }
.ee-card__meta { display: flex; flex-wrap: wrap; gap: .1rem .75rem; }
.ee-card__price { font-weight: 700; color: var(--foreground); }
.ee-card__next { font-size: .9375rem; }
.ee-card__next-label { display: block; margin-bottom: .15rem; font-weight: 600; }
.ee-card__next ul, .ee-card__all ul { margin: 0; padding: 0; list-style: none; }
.ee-card__next li, .ee-card__all li { margin: 0; padding: .1rem 0; color: var(--muted-foreground); }
.ee-card__all { font-size: .9375rem; }
.ee-card__all > summary { cursor: pointer; list-style: none; }
.ee-card__all > summary::-webkit-details-marker { display: none; }
.ee-card__all[open] > summary { margin-bottom: .35rem; }
.ee-card__actions { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: auto; padding-top: .6rem; }
.ee-card .ee-fav--card { top: .4rem; right: .4rem; }
@media (min-width: 48rem) {
  .ee-card { flex-direction: column; }
  .ee-card__cover { flex: none; min-height: 0; aspect-ratio: 4 / 3; }
  .ee-card__badges { padding-right: 0; }
}
/* QA-находка 6 (28.09): на 390px пилюли «направление»/«статус» визуально накладывались друг на друга.
   ДОКАЗАННАЯ причина (не гипотеза — снято через Playwright getBoundingClientRect на живом стенде, скриншот
   крупным планом сравнён с числами): при flex-wrap:nowrap+сжатии текста через ellipsis суммарная ширина обеих
   пилюль на карточке в РЯД (мобильная раскладка — обложка слева, текст справа, ширина текстовой колонки резко
   уже, чем весь экран) физически меньше, чем нужно даже для одной пилюли «Регистрация открыта» целиком — сжатие
   text-overflow не спасает, когда для ВТОРОЙ (несжимаемой) пилюли просто нет места в принципе. Решение — не
   бороться со сжатием в один ряд, а вернуть flex-wrap:wrap (пилюли встают в 2 строки, каждая читается целиком
   без переноса слов) + небольшой row-gap, чтобы строки не липли друг к другу. Проверено Playwright на 390px
   (2 строки, честный зазор ~5px, без наложения) и на 1440px (тоже 2 строки — на такой ширине КОЛОНКИ карточки в
   сетке 4×, а не всего экрана, места тоже впритык на 2 пилюли в 1 строку; не баг, тот же безопасный компромисс). */
.ee-card .ee-badge--dir { display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ee-card .ee-badge--status { flex-shrink: 0; }

/* расписание: заголовки разделов, фильтры, пустые разделы */
.ee-sched__title { margin: 2rem 0 1rem; font-size: var(--ee-h2, 1.75rem); }
.ee-sched-filters { display: flex; flex-wrap: wrap; gap: .75rem 1.25rem; align-items: flex-end; margin-bottom: 1rem; }
.ee-sched-filters { min-height: 4.9rem; }   /* место под фильтры резервируется до работы скрипта: список не прыгает (CLS) */
@media (max-width: 40rem) { .ee-sched-filters { min-height: 10.6rem; } }
.ee-sched-filters.is-empty { min-height: 0; }
.ee-filter { display: flex; flex: 1 1 14rem; max-width: 22rem; flex-direction: column; gap: .25rem; min-width: min(100%, 14rem); }
.ee-filter__label { font-size: .875rem; font-weight: 700; }
.ee-filter__select { min-height: 2.75rem; }
.ee-sched-status { margin: 0; color: var(--muted-foreground); font-size: .9375rem; }
.ee-sched-empty { margin: 0 0 1rem; padding: 1rem; border: 1px dashed var(--border); border-radius: var(--ee-radius-card); color: var(--muted-foreground); }

/* Кнопки карточки («Подробнее», «Записаться»): защита от наложения на любой ширине и при увеличенном шрифте (29.09).
   Кнопки делят ряд поровну (flex-basis 7.5rem, могут расти и сжиматься до 0), при нехватке места вторая уходит под первую на всю ширину; текст переносится. */
.ee-card__actions { flex-wrap: wrap; gap: .5rem; }
.ee-card__actions > .ee-btn { flex: 1 1 7.5rem; min-width: 0; max-width: 100%; justify-content: center; text-align: center; overflow-wrap: anywhere; white-space: normal; }
/* иерархия: «Записаться» крупнее и жирнее вторичной «Подробнее»; оба остаются в одном ряду или друг под другом */
.ee-card__actions > .ee-btn--primary { flex-grow: 1.4; font-weight: 700; }
.ee-card__actions > .ee-btn--sm { flex-grow: 1; font-weight: 600; }

/* вся карточка мероприятия — ссылка на страницу (растянутая ссылка заголовка); кнопки, значок «В избранное» и «Показать все даты» лежат выше и работают отдельно */
.ee-card__title a::after { content: ""; position: absolute; inset: 0; z-index: 1; }
.ee-card__actions, .ee-card__all, .ee-fav--card { position: relative; z-index: 2; }
.ee-fav--card { position: absolute; z-index: 3; }
.ee-card:hover { border-color: color-mix(in srgb, var(--ee-btn-accent, var(--primary)) 45%, var(--ee-card-border)); }
.ee-card__title a:focus-visible::after { outline: 3px solid var(--ee-focus); outline-offset: -3px; border-radius: inherit; }
/* пара «действие + спросить»: обе кнопки равной ширины */
.ee-card__actions > .ee-btn--primary, .ee-card__actions > .ee-btn--secondary { flex: 1 1 7.5rem; }
