/* One card presentation shared by catalogue listings and profile suggestions.
   Collection geometry stays with each page; card geometry lives here. */
:root{--v7-master-card-row-gap:10px;--v7-master-card-action-inset:4px;--v7-master-card-grid-row-gap:8px}
.master-card{position:relative;display:flex;min-width:0;flex-direction:column;overflow:hidden;border:1px solid var(--shell-line);border-radius:22px;background:var(--shell-surface);color:var(--shell-text)}
.master-card__link{position:absolute;z-index:1;inset:0;border-radius:inherit}.master-card__link:focus-visible{outline-offset:-4px}
.master-card__media{position:relative;display:flex;overflow:hidden;aspect-ratio:4/5;align-items:flex-end;padding:14px;background-position:center;background-size:cover}
.master-card__media img{position:absolute;z-index:0;inset:0;width:100%;height:100%;object-fit:cover;object-position:50% 18%}
.master-card__media::after{position:absolute;z-index:1;inset:0;background:linear-gradient(180deg,transparent 42%,rgb(16 10 7 / .78));content:'';pointer-events:none}
.master-card__name{position:relative;z-index:2;font-size:21px;font-weight:500;letter-spacing:.04em}
/* Р6: выезд — отдельная сущность карточки. Badge читается сразу, без
   раскрытия, и стоит на фото, а не в строке места: строку метро он бы
   продублировал. Карточка — общий компонент каталога и анкет, а анкеты (в
   отличие от каталога) не подключают sigma-v7-foundation.css, поэтому токен
   пилюли берётся с локальным fallback: без него badge оставался прямоугольным
   в ленте «Другие мастера». Значение fallback то же, что в foundation (999px),
   поэтому вид badge одинаков на обоих маршрутах. */
.master-card__badge{position:absolute;z-index:2;display:inline-flex;align-items:center;min-height:24px;padding:3px 10px;border:1px solid var(--shell-accent-dim);border-radius:var(--v7-pill,999px);background:rgb(16 10 7 / .62);color:var(--shell-accent-text);font-size:11.5px;line-height:16px;letter-spacing:.02em}
.master-card__badge--outcall{top:14px;left:14px}
.master-card__body{display:flex;min-width:0;flex:1 1 auto;flex-direction:column;gap:var(--v7-master-card-row-gap);padding:16px 18px 18px}
.master-card__positioning{font-size:12.5px;color:var(--shell-text)}
/* 15.09.2026 (ревизия): виды, метро и условия кабинета — не декоративная
   подпись, а параметры выбора, поэтому не мельче 13px. */
.master-card__services{font-size:13px;line-height:19px;color:var(--shell-accent-text)}
/* П5/п.5 приёмки: ограничение аудитории («Принимает: мужчин») живёт в строке
   видов массажа, а не отдельным рядом карточки. Отдельный ряд добавил бы
   восьмой трек в row-subgrid десктопной карточки и сбил бы выравнивание
   CTA/подсказки у соседей по линии (одна схема строк на грид — правило
   styles/v7/massage.css), поэтому факт присоединён к уже существующей строке. */
.master-card__audience{color:var(--shell-muted)}
.master-card__audience::before{content:' · '}
.master-card__location,.master-card__venue{font-size:13px;line-height:19px;color:var(--shell-muted)}
/* Р3: первая строка — цена часа (единица сравнения), вторая — полная цена
   программы. Обе живут в одном элементе тела карточки, поэтому ритм-контракт
   карточки не меняется. Второй частью управляет display:block, а не flex: в
   flex-контейнере текстовый узел «от» стал бы отдельным элементом и уехал бы
   на собственную строку. */
.master-card__price{font-size:16px;color:var(--shell-muted)}
.master-card__price b{color:var(--shell-accent);font-weight:700}
.master-card__price-programs{display:block;font-size:12px;line-height:18px;color:var(--shell-muted)}
.master-card__programs{display:flex;flex-direction:column;gap:8px;padding:10px 0;border-block:1px solid var(--shell-line);list-style:none}
.master-card__programs li{display:grid;gap:2px}.master-card__program-name{font-size:13px;font-weight:600;color:var(--shell-text)}.master-card__program-meta{font-size:12px;color:var(--shell-muted)}
/* Строка-подсказка — единственный ряд карточки, который забирает остаток
   высоты, когда карточка короче соседей по линии (например, у мастера нет
   посчитанной ставки и строка цены занимает одну строку вместо двух).
   Иначе остаток уходил бы в margin-top:auto у CTA и разрывал бы объявленный
   шаг card-row (см. scripts/test-layout-rhythm-contract.js). */
.master-card__profile-hint{display:flex;flex:1 1 auto;min-height:44px;align-items:center;font-size:13px;color:var(--shell-accent-text)}
.master-card__cta{position:relative;z-index:2;margin-top:auto;padding-top:var(--v7-master-card-action-inset)}.master-card__cta .btn{min-height:50px;padding-inline:12px;text-align:center}
@media(width < 1024px){.master-card__cta .btn{width:100%}.master-card__positioning,.master-card__services,.master-card__location{display:-webkit-box;overflow:hidden;line-height:1.4;-webkit-box-orient:vertical;-webkit-line-clamp:2}}
.master-grid>.master-card{min-width:0;align-self:stretch}
.master-grid--compact .master-card__positioning,.master-grid--compact .master-card__services,.master-grid--compact .master-card__programs,.master-grid--compact .master-card__location,.master-grid--compact .master-card__venue,.master-grid--compact .master-card__profile-hint,.master-grid--compact .master-card__cta{display:none}
.master-grid--compact .master-card__body{min-height:0;padding:12px 14px 14px}.master-grid--compact .master-card__price{margin:0}
.master-grid--swipe-mobile{display:flex;gap:18px;overflow-x:auto;scroll-snap-type:x mandatory;scrollbar-width:none}.master-grid--swipe-mobile::-webkit-scrollbar{display:none}
.master-grid--swipe-mobile>.master-card{flex:0 0 min(75vw,260px);scroll-snap-align:start}
@media(width >= 768px){.master-grid--swipe-mobile{flex-wrap:wrap;justify-content:center;overflow:visible;scroll-snap-type:none}.master-grid--swipe-mobile>.master-card{flex:0 0 min(342px,calc((100% - 20px)/2))}}
@media(width >= 1024px){.master-grid--swipe-mobile>.master-card{flex:0 0 min(342px,calc((100% - 48px)/3))}}
@media(width >= 1440px){.master-grid--swipe-mobile>.master-card{flex:0 0 min(342px,calc((100% - 72px)/4))}}
/* Desktop catalogue presentation lives with the card, not the route's
   collection grid. The mobile card and profile's compact rail stay unchanged. */
@media(width >= 1024px){
  .sigma-master-grid>.master-card{--master-card-inset:20px;--v7-master-card-action-inset:0px;display:grid;grid-template-columns:minmax(0,1fr) max-content;grid-template-rows:subgrid;grid-row:span 7;gap:var(--v7-master-card-grid-row-gap) 12px;border-color:var(--v7-line);border-radius:var(--v7-radius);background:var(--v7-surface);padding-bottom:16px;margin-bottom:24px;transition:border-color .2s ease}
  .sigma-master-grid>.master-card:hover,.sigma-master-grid>.master-card:focus-within{border-color:var(--v7-gold)}
  .sigma-master-grid .master-card__media{grid-column:1/-1;aspect-ratio:1;padding:var(--master-card-inset);background-position:center 18%}
  .sigma-master-grid .master-card__media::after{background:linear-gradient(180deg,transparent 65%,rgba(10,10,10,.78))}
  .sigma-master-grid .master-card__name{font-size:24px;line-height:32px;letter-spacing:normal}
  .sigma-master-grid .master-card__badge--outcall{top:var(--master-card-inset);left:var(--master-card-inset)}
  .sigma-master-grid .master-card__body{display:contents}
  .sigma-master-grid .master-card__body>*{grid-column:1/-1;margin-inline:var(--master-card-inset);min-width:0}
  .sigma-master-grid .master-card__positioning{padding-top:8px;font-size:14px;line-height:22px}
  .sigma-master-grid .master-card__services,.sigma-master-grid .master-card__location,.sigma-master-grid .master-card__venue{font-size:13px;line-height:20px;color:var(--v7-muted)}
  .sigma-master-grid .master-card__services{color:var(--v7-gold)}
  .sigma-master-grid .master-card__price{font-size:17px;line-height:28px;color:var(--v7-muted)}
  .sigma-master-grid .master-card__price b{color:var(--v7-gold);white-space:nowrap}
  .sigma-master-grid .master-card__body>.master-card__profile-hint{grid-column:1;grid-row:-2/-1;margin-inline-end:0;font-size:14px;line-height:22px;color:var(--v7-gold);min-height:48px}
  .sigma-master-grid .master-card__body>.master-card__cta{grid-column:2;grid-row:-2/-1;margin-top:0;margin-inline-start:0;padding-top:var(--v7-master-card-action-inset);align-self:center}
  .sigma-master-grid .master-card__programs{padding:12px 0;margin-block:0;border-color:var(--v7-line)}
  .sigma-master-grid .master-card__programs li{display:flex;justify-content:space-between;align-items:center;gap:12px;font-size:12px;line-height:18px}
  .sigma-master-grid .master-card__program-name{min-width:0;font-size:12px;font-weight:normal}
  .sigma-master-grid .master-card__program-meta{color:var(--v7-muted);flex:none}
  .sigma-master-grid .price-nowrap{white-space:nowrap}
}
.master-card[hidden]{display:none}
@media(width >= 1024px) and (width < 1280px){
  .sigma-master-grid>.master-card{--master-card-inset:16px}
  .sigma-master-grid .master-card__cta .btn{padding-inline:8px}
  .sigma-master-grid .master-card__programs li{flex-direction:column;align-items:flex-start;gap:4px}
}
