/* Работы: плитки и реестр (src/Web/Portfolio/list.php) и страница работы (src/Web/Portfolio/View).
   По мотивам bureau.ru: мозаика из крупной и двух мелких плиток, жирные подписи, цвет типа.
   Только на токенах IDS и --site__* (components/tokens.css), без своих цветов. */

/* --- Сетка плиток ------------------------------------------------------------- */
.ids .work-grid {
    display: grid;
    gap: var(--ids__spacer-m) var(--ids__gap-l);
    margin: var(--ids__spacer-m) 0 0;
    padding: 0;
    list-style: none;
}

/* IDS ставит маркер "⋅ " и отступ под него каждому <li> — у плиток их быть не должно. */
.ids .work-grid > li {
    margin: 0;
    padding: 0;
}

.ids .work-grid > li::before {
    content: none;
}

/* Мозаика: шесть колонок, группа из трёх работ — одна крупная (4×2) и две мелкие стопкой (2×1);
   следующая группа зеркальна. grid-auto-flow: dense подтягивает мелкие плитки на свободное место
   слева от крупной. */
.ids .work-grid--mosaic {
    grid-template-columns: repeat(6, minmax(0, 1fr));
    grid-auto-flow: dense;
}

.ids .work-grid--mosaic > .work-card {
    grid-column: span 2;
}

.ids .work-grid--mosaic > .work-card:nth-child(6n + 1) {
    grid-column: 1 / span 4;
    grid-row: span 2;
}

.ids .work-grid--mosaic > .work-card:nth-child(6n + 4) {
    grid-column: 3 / span 4;
    grid-row: span 2;
}

/* Неполная последняя группа: одна крупная без пары — на всю ширину; крупная и одна мелкая —
   мелкая тянется на высоту крупной. Иначе у типа или клиента с 1, 2 или 4 работами в мозаике дыра. */
@media (width >= 768px) {
    .ids .work-grid--mosaic > .work-card:nth-child(3n + 1):last-child {
        grid-column: 1 / -1;
    }

    .ids .work-grid--mosaic > .work-card:nth-child(3n + 2):last-child {
        grid-row: span 2;
    }

    .ids .work-grid--mosaic > .work-card:nth-child(3n + 2):last-child .work-card__cover {
        aspect-ratio: auto;
    }
}

/* Крупные карточки сеткой 2×2 — короткие списки по четыре (последние работы на главной, похожие
   работы). Обложка — та же светлая «бумага», подпись мелким кеглем, как у бюро. */
.ids .work-grid--pairs {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--ids__spacer-l) var(--ids__gap-xl);
}

@media (width < 768px) {
    .ids .work-grid--mosaic {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    .ids .work-grid--mosaic > .work-card:nth-child(n) {
        grid-column: span 1;
        grid-row: auto;
    }

    .ids .work-grid--mosaic > .work-card:nth-child(3n + 1) {
        grid-column: 1 / -1;
    }

    .ids .work-grid--mosaic > .work-card:nth-child(3n + 1) .work-card__cover {
        aspect-ratio: 16 / 10;
        min-height: 0;
    }

    .ids .work-card__poster {
        font-size: 0.95em;
    }
}

@media (width < 600px) {
    .ids .work-grid--pairs {
        grid-template-columns: 1fr;
    }
}

/* «Избранное» на главной — как курсы на bureau.ru: крупная картинка и подпись в узкой колонке
   сбоку, строки чередуются. Картинки — подготовленные промо, поэтому заполняют кадр (cover). */
.ids .feature-list {
    display: grid;
    gap: var(--ids__spacer-xl);
    margin: var(--ids__spacer-xl) 0 0;
    padding: 0;
    list-style: none;
}

.ids .feature {
    position: relative;
    display: grid;
    grid-template-columns: minmax(0, 5fr) minmax(0, 2fr);
    gap: var(--ids__gap-xl);
    align-items: start;
    margin: 0;
    padding: 0;
}

.ids .feature::before {
    content: none;
}

/* Чётные строки — зеркально: подпись слева, картинка справа. */
.ids .feature:nth-child(even) {
    grid-template-columns: minmax(0, 2fr) minmax(0, 5fr);
}

.ids .feature:nth-child(even) .feature__cover {
    order: 2;
}

.feature__cover {
    aspect-ratio: 16 / 9;
    overflow: hidden;
    border-radius: var(--ids__radius-m);
    background: var(--site__surface-paper);
}

.ids .feature__cover img {
    width: 100%;
    height: 100%;
    max-width: none;
    margin: 0;
    object-fit: cover;
    object-position: top center;
}

.ids .feature__title {
    margin: 0 0 0.4em;
    font-size: 1.15em;
    font-weight: 700;
    line-height: 1.25;
    letter-spacing: 0;
}

/* Вся строка кликабельна по ссылке в названии (растянутая ссылка). */
.ids .feature .feature__title a {
    text-decoration-color: var(--site__hairline-strong);
}

.feature__title a::after {
    content: "";
    position: absolute;
    inset: 0;
}

.ids .feature__lead {
    margin: 0;
    font-family: var(--site__font-serif);
    font-size: 1.05em;
    line-height: 1.45;
}

/* На больших экранах подпись вдвое уже (решение владельца, 2026-10-30): картинка почти во всю ширину. */
@media (width >= 1200px) {
    .ids .feature {
        grid-template-columns: minmax(0, 6fr) minmax(0, 1fr);
    }

    .ids .feature:nth-child(even) {
        grid-template-columns: minmax(0, 1fr) minmax(0, 6fr);
    }
}

@media (width < 768px) {
    .ids .feature,
    .ids .feature:nth-child(even) {
        grid-template-columns: 1fr;
        gap: var(--ids__gap-m);
    }

    .ids .feature:nth-child(even) .feature__cover {
        order: 0;
    }
}

/* --- Плитка ------------------------------------------------------------------- */
.ids .work-card {
    position: relative;
    display: flex;
    flex-direction: column;
}

/* Обложка лежит на светлой «бумаге»: в архиве это в основном логотипы и
   скриншоты на белом — так они выглядят оттиском, а не белым квадратом на тёмном фоне.
   Вписывается целиком (contain): логотип не теряет края. У крупной плитки обложка тянется
   на всю высоту двух рядов. */
.work-card__cover {
    position: relative;
    flex: 1 0 auto;
    display: grid;
    place-items: center;
    min-height: 0;
    aspect-ratio: 16 / 10;
    overflow: hidden;
    border-radius: var(--ids__radius-m);
    background: var(--site__surface-paper);
}

.ids .work-grid--mosaic > .work-card:nth-child(3n + 1) .work-card__cover {
    aspect-ratio: auto;
    min-height: 16rem;
}

/* .ids — чтобы перебить правило IDS для картинок (height: auto). Абсолютно, а не height: 100%:
   процентная высота в grid-контейнере с aspect-ratio не берётся от высоты подложки. */
.ids .work-card__cover img {
    position: absolute;
    inset: 8%;
    width: 84%;
    height: 84%;
    max-width: none;
    margin: 0;
    object-fit: contain;
    mix-blend-mode: multiply;
    transition: transform 200ms ease-out;
}

/* Работа без обложки — афиша: название крупно белым на цвете её типа. */
.work-card__cover--poster {
    place-items: end start;
    background: var(--zone, var(--site__zone-default));
}

/* На странице, целиком залитой цветом типа, афиша того же цвета пропала бы — там она на «бумаге»,
   а цвет зоны уходит в текст. */
.is-zone-fill .work-card__cover--poster {
    background: var(--site__surface-paper);
}

.is-zone-fill .work-card__poster {
    color: var(--zone);
}

/* Плитка личного проекта: афиша на цвете главного тега, текст — цветом заголовка тега (TagPalette). */
.work-card[data-zone="tag"] .work-card__cover--poster {
    background: var(--tag-bg);
}

.work-card[data-zone="tag"] .work-card__poster {
    color: var(--tag-title);
}

.work-card__poster {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 4;
    max-width: 100%;
    max-height: 100%;
    overflow: hidden;
    overflow-wrap: break-word;
    hyphens: auto;
    padding: var(--ids__spacer-s);
    color: var(--site__on-media);
    font-size: 1.15em;
    font-weight: 800;
    letter-spacing: var(--site__heading-tracking);
    line-height: 1.05;
}

.ids .work-grid--mosaic > .work-card:nth-child(3n + 1) .work-card__poster {
    font-size: clamp(1.6em, 4vw, 2.6em);
}

/* Подпись как у бюро — мелким кеглем одной фразой: название-ссылка, за ним обычным текстом суть
   работы («Пептид.ру — интернет-магазин пептидов»). Заголовок и абзац — строчные внутри одного
   блока; длинное описание обрезается на четвёртой строке. */
.ids .work-card__caption {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 4;
    overflow: hidden;
    margin-top: var(--ids__gap-m);
    font-size: 0.85em;
    line-height: 1.35;
}

.ids .work-card__title {
    display: inline;
    margin: 0;
    font-size: 1em;
    font-weight: 700;
    line-height: inherit;
    letter-spacing: 0;
}

.ids .work-card__text {
    display: inline;
    margin: 0;
    color: var(--ids__text);
    line-height: inherit;
}

.work-card__text::before {
    content: "— ";
}

/* .work-card дважды в цепочке — перебить общее правило ссылок в тексте (site.css, `.ids main a`). */
.ids .work-card .work-card__title a {
    color: var(--ids__text);
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-decoration-color: var(--site__hairline-strong);
    text-underline-offset: 0.2em;
}

/* Вся плитка кликабельна по ссылке в названии (растянутая ссылка), без вложенных <a>. */
.work-card__title a::after {
    content: "";
    position: absolute;
    inset: 0;
    border-radius: var(--ids__radius-m);
}

.ids .work-card:hover .work-card__title a {
    color: var(--site__accent);
}

.work-card:hover .work-card__cover img {
    transform: scale(1.03);
}

.work-card:focus-within .work-card__title a::after {
    outline: 2px solid var(--site__accent);
    outline-offset: 4px;
}

.work-card__title a:focus-visible {
    outline: none;
}

@media (prefers-reduced-motion: reduce) {
    .work-card__cover img {
        transition: none;
    }

    .work-card:hover .work-card__cover img {
        transform: none;
    }
}

/* --- Реестр тизеров -------------------------------------------------------------
   Работы без своей страницы — строками «год — название» между волосяными линиями,
   колонками на широком экране. Без приглушения прозрачностью: текст обязан читаться. */
.work-archive {
    margin-top: var(--ids__spacer-xl);
}

.ids .work-archive__title {
    margin-bottom: 0.2em;
    font-size: 1.5em;
}

.ids .work-ledger {
    columns: 2 22rem;
    column-gap: var(--ids__gap-xl);
    margin: var(--ids__spacer-s) 0 0;
    padding: 0;
    list-style: none;
}

.ids .work-ledger__row {
    display: grid;
    grid-template-columns: 3.2em minmax(0, 1fr);
    gap: var(--ids__gap-m);
    margin: 0;
    padding: 0.3em 0;
    break-inside: avoid;
}

.ids .work-ledger__row::before {
    content: none;
}

.work-ledger__year {
    color: var(--ids__text-caption);
    font-variant-numeric: tabular-nums;
}

/* --- Страница работы (src/Web/Portfolio/View/template.php) ----------------------
   Шапка кейса — на цвете типа во всю ширину окна, как раздел у бюро; дальше обложка
   и текст на обычном фоне: длинное читают на нейтральном. */
.ids .work__hero {
    --ids__text: var(--site__on-media);
    --ids__text-caption: rgb(255 255 255 / 92%);
    --site__accent: var(--site__on-media);
    --site__heading: var(--site__on-media);
    --site__hairline: rgb(255 255 255 / 30%);
    --site__hairline-strong: rgb(255 255 255 / 60%);

    margin-top: calc(-1 * var(--ids__spacer-l));
    padding: var(--ids__spacer-m) 0 var(--ids__spacer-l);
    color: var(--ids__text);
    /* Фон во всю ширину окна, а не колонки: заливка border-image, вынесенная за края блока
       (сверху на 1px — под шапку той же зоны, чтобы на стыке не было шва). */
    border-image: conic-gradient(var(--zone, var(--site__zone-default)) 0 0) fill 0 // 1px 100vmax 0;
}

.ids .work__hero h1 {
    max-width: 16ch;
    margin: var(--ids__spacer-s) 0 0.3em;
    font-size: clamp(2.4rem, 7vw, 3.8em);
}

.ids .work__lead {
    max-width: 32em;
    margin: 0;
    font-size: 1.25em;
    font-weight: 600;
    line-height: 1.4;
}

/* Метаданные — строкой пар «подпись: значение», переносятся на узком экране. */
.ids .work-meta {
    display: flex;
    flex-wrap: wrap;
    gap: var(--ids__gap-m) var(--ids__spacer-l);
    margin: var(--ids__spacer-m) 0 0;
}

.ids .work-meta dt {
    margin: 0;
    color: var(--ids__text-caption);
    font-size: 0.85em;
    font-weight: 400;
}

.ids .work-meta dd {
    display: flex;
    flex-wrap: wrap;
    gap: 0 var(--ids__gap-s);
    margin: 0;
    color: var(--ids__text);
    font-weight: 600;
}

.ids .work__cover {
    position: relative;
    aspect-ratio: 16 / 9;
    margin: var(--ids__spacer-l) 0 0;
    overflow: hidden;
    border-radius: var(--ids__radius-m);
    background: var(--site__surface-paper);
}

.ids .work__cover img {
    position: absolute;
    inset: 6%;
    width: 88%;
    height: 88%;
    max-width: none;
    object-fit: contain;
    mix-blend-mode: multiply;
}

/* Задача — крупной антиквой с подписью сбоку: главная мысль кейса. */
.ids .work__task {
    display: grid;
    grid-template-columns: minmax(0, 10rem) minmax(0, 36em);
    gap: var(--ids__gap-l);
    margin: var(--ids__spacer-l) 0 0;
}

.ids .work__task h2 {
    margin: 0.3em 0 0;
    font-size: 1em;
}

.ids .work__task p {
    margin: 0;
    font-family: var(--site__font-serif);
    font-size: 1.4em;
    line-height: 1.4;
}

/* Решения — колонками под толстой линией, как рубрики у бюро. Не нумерованы: это не шаги. */
.ids .work__highlights ul {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 14rem), 1fr));
    gap: var(--ids__gap-l) var(--ids__gap-xl);
    margin: 0;
    padding: 0;
    list-style: none;
}

.ids .work__highlights li {
    margin: 0;
    padding: 0;
    font-weight: 600;
}

.ids .work__highlights li::before {
    content: none;
}

.ids .work__highlights,
.ids .work__body,
.ids .work__result,
.ids .work__company {
    margin-top: var(--ids__spacer-xl);
}

.ids .work__highlights h2,
.ids .work__result h2,
.ids .work__company h2,
.ids .related-works h2 {
    font-size: 1.9em;
}

/* Скриншоты в тексте работы — на всю ширину колонки, со скруглением, как обложка. */
.ids .work__body img {
    border-radius: var(--ids__radius-m);
}

.ids .work__body figure {
    margin: var(--ids__spacer-l) 0;
}

.related-works {
    margin-top: var(--ids__spacer-xl);
}

@media (width < 768px) {
    .ids .work__task {
        grid-template-columns: 1fr;
        gap: var(--ids__gap-s);
    }
}

/* --- Блок «Проекты» на главной (src/Web/HomePage/template.php) -------------------
   Три текстовые карточки в духе bureau.ru без подложки: цвет главного тега (TagPalette, `--tag-ink` —
   вариант для белого фона) — в рубрике и названии, лид — цветом текста. Одна карточка крупнее (две колонки из четырёх),
   у карточки может быть превью слева или справа. Настройка — /admin/home-projects. */
.project-cards {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: var(--ids__spacer-m) var(--ids__spacer-l);
    margin-top: var(--ids__spacer-xl);
}

.ids .project-card {
    position: relative;
    display: flex;
    gap: var(--ids__gap-l);
}

.project-card--large {
    grid-column: span 2;
}

/* Превью в разметке первым, то есть слева; «справа» — переставляется в конец. */
.project-card--preview-right .project-card__preview {
    order: 1;
}

.project-card__preview {
    flex: 0 0 42%;
    align-self: flex-start;
    aspect-ratio: 4 / 3;
    overflow: hidden;
    border-radius: var(--ids__radius-m);
    background: var(--site__surface-paper);
}

.ids .project-card__preview img {
    width: 100%;
    height: 100%;
    max-width: none;
    margin: 0;
    object-fit: cover;
    object-position: top center;
}

.project-card__body {
    flex: 1 1 auto;
    min-width: 0;
}

.ids .project-card__title {
    margin: 0 0 0.3em;
    color: var(--tag-ink);
    font-size: 0.95em;
    font-weight: 700;
    letter-spacing: 0;
    line-height: 1.3;
}

.project-card--large .project-card__title {
    font-size: 1.05em;
}

/* Название — ссылка на всю карточку (растянутая ссылка). */
.ids .project-card .project-card__title a {
    color: inherit;
    text-decoration: none;
}

.project-card__title a::after {
    content: "";
    position: absolute;
    inset: 0;
    border-radius: var(--ids__radius-m);
}

.project-card:hover .project-card__title a {
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 0.15em;
}

.project-card:focus-within .project-card__title a::after {
    outline: 2px solid var(--site__accent);
    outline-offset: 3px;
}

.project-card__title a:focus-visible {
    outline: none;
}

.ids .project-card__lead {
    margin: 0;
    font-family: var(--site__font-serif);
    font-size: 0.9em;
    line-height: 1.4;
}

@media (width < 1024px) {
    .project-cards {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    .project-card--large {
        grid-column: 1 / -1;
    }
}

@media (width < 640px) {
    .project-cards {
        grid-template-columns: 1fr;
    }

    .ids .project-card {
        flex-direction: column;
    }

    .project-card--preview-right .project-card__preview {
        order: 0;
    }

    /* В колонке flex-basis 42% считался бы от высоты карточки и раздувал её пустотой. */
    .project-card__preview {
        flex: none;
        width: 100%;
        aspect-ratio: 16 / 9;
    }
}
