/*
 * Cards and grids (docs/02 §7.3–7.4). Image-first, no boxes or shadows:
 * the frame and generous space carry the card. The whole card is one link
 * (stretched link), with the focus ring drawn around the whole card.
 */

.ru-grid {
    display: grid;
    gap: clamp(2.5rem, 1.8rem + 2.5vw, 4.5rem) var(--ru-gutter);
    margin: 0;
    padding: 0;
    list-style: none;
}

.ru-grid--groups {
    grid-template-columns: repeat(auto-fill, minmax(min(100%, 19rem), 1fr));
}

.ru-grid--artworks {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    column-gap: clamp(1rem, 0.5rem + 2vw, 2.5rem);
}

.ru-grid--journal {
    grid-template-columns: repeat(auto-fill, minmax(min(100%, 21rem), 1fr));
}

@media (min-width: 768px) {
    .ru-grid--artworks {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

@media (min-width: 1400px) {
    .ru-grid--artworks {
        grid-template-columns: repeat(4, minmax(0, 1fr));
    }
}

/* Small phones: one column of categories, two narrow columns of works. */
@media (max-width: 379.98px) {
    .ru-grid--artworks {
        grid-template-columns: minmax(0, 1fr);
    }
}

/* Editorial stagger: from md, every second category card steps down, so a
   row reads as a hang rather than a table. */
@media (min-width: 768px) {
    .ru-grid--groups {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    .ru-grid--groups > li:nth-child(2n) {
        margin-top: var(--ru-space-10);
    }
}

@media (min-width: 1200px) {
    .ru-grid--groups {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }

    .ru-grid--groups > li:nth-child(2n) {
        margin-top: 0;
    }

    .ru-grid--groups > li:nth-child(3n + 2) {
        margin-top: var(--ru-space-10);
    }
}

/* Card */

.ru-card {
    position: relative;
    display: flex;
    flex-direction: column;
    height: 100%;
}

.ru-card__media {
    position: relative;
}

/* Image hover: a slow, slight lift of the work inside its frame. */
@media (hover: hover) {
    .ru-card:hover .ru-media__image {
        transform: scale(1.035);
    }
}

.ru-card__body {
    display: flex;
    flex-direction: column;
    padding-top: var(--ru-space-4);
}

.ru-card__title {
    margin: 0;
    font-family: var(--ru-font-display);
    font-size: var(--ru-fs-400);
    font-weight: 400;
    line-height: 1.15;
}

.ru-card__link {
    color: var(--ru-color-text);
    text-decoration: none;
    background-image: linear-gradient(var(--ru-color-accent), var(--ru-color-accent));
    background-position: 0 100%;
    background-repeat: no-repeat;
    background-size: 0 1px;
    transition: background-size 400ms var(--ru-ease);
}

.ru-card:hover .ru-card__link {
    color: var(--ru-color-text);
    background-size: 100% 1px;
}

/* The focus ring outlines the whole card that the stretched link covers. */
.ru-card__link:focus-visible {
    outline: none;
}

.ru-card:has(.ru-card__link:focus-visible) {
    outline: 2px solid var(--ru-color-focus);
    outline-offset: 6px;
}

.ru-card__text {
    margin: var(--ru-space-3) 0 0;
    max-width: 42ch;
    color: var(--ru-color-text-secondary);
    font-size: var(--ru-fs-100);
    line-height: 1.6;
}

.ru-card__meta {
    margin: var(--ru-space-2) 0 0;
    color: var(--ru-color-muted);
    font-size: var(--ru-fs-100);
    line-height: 1.5;
}

.ru-card__status {
    display: flex;
    flex-wrap: wrap;
    gap: var(--ru-space-1) var(--ru-space-4);
    align-items: center;
    margin: var(--ru-space-3) 0 0;
    font-size: var(--ru-fs-100);
}

/* Artwork card: titles in italic, the editorial convention for works. */
.ru-card--artwork .ru-card__title {
    font-size: clamp(1.25rem, 1.15rem + 0.45vw, 1.5rem);
    font-style: italic;
}

/* Category card: index, name, introduction and a quiet cue. */
.ru-card--group .ru-card__body {
    padding-top: var(--ru-space-5);
}

.ru-card__index {
    margin-bottom: var(--ru-space-2);
    font-size: var(--ru-fs-50);
    font-weight: 600;
    letter-spacing: 0.08em;
    color: var(--ru-color-muted);
}

.ru-card--group .ru-card__title {
    font-size: var(--ru-fs-500);
    font-weight: 300;
    line-height: 1.05;
}

.ru-card__cue {
    display: inline-flex;
    align-items: center;
    gap: var(--ru-space-2);
    margin-top: var(--ru-space-4);
    font-size: var(--ru-fs-50);
    font-weight: 600;
    letter-spacing: var(--ru-tracking-label);
    text-transform: uppercase;
    color: var(--ru-color-text);
}

.ru-card__cue::after {
    content: "→";
    font-size: var(--ru-fs-200);
    letter-spacing: 0;
    transition: transform var(--ru-duration-ui) var(--ru-ease);
}

.ru-card:hover .ru-card__cue::after {
    transform: translateX(0.3rem);
}

/* Journal card */

.ru-card--journal .ru-card__title {
    font-size: var(--ru-fs-400);
}

/* Sequenced grid (a collection's curated order): the position in the
   series, from the list's own numbering, above each work. */
.ru-grid--sequenced > li::before {
    content: counter(list-item, decimal-leading-zero);
    display: block;
    margin-bottom: var(--ru-space-3);
    padding-bottom: var(--ru-space-2);
    border-bottom: 1px solid var(--ru-color-border);
    font-size: var(--ru-fs-50);
    font-weight: 600;
    letter-spacing: 0.08em;
    color: var(--ru-color-muted);
}

/* Availability badge: the text label is always present; the dot is a
   secondary cue, never the only one (docs/02 §7.5). */
.ru-badge {
    display: inline-flex;
    align-items: center;
    gap: var(--ru-space-2);
    font-size: var(--ru-fs-50);
    font-weight: 600;
    letter-spacing: var(--ru-tracking-label);
    text-transform: uppercase;
    color: var(--ru-color-text);
}

.ru-badge::before {
    content: "";
    flex: none;
    width: 0.5rem;
    height: 0.5rem;
    border-radius: 50%;
    background: var(--ru-ochre);
}

.ru-badge--reserved::before {
    background: var(--ru-terracotta);
}

.ru-badge--sold::before {
    background: var(--ru-color-text);
}

.ru-badge--private::before {
    background: transparent;
    box-shadow: inset 0 0 0 1px var(--ru-color-text);
}

.ru-price {
    font-variant-numeric: tabular-nums lining-nums;
    color: var(--ru-color-text);
}

.ru-price--on-request {
    color: var(--ru-color-muted);
}

/* Reveal stagger across a row (animations.js); no effect without it. */
.ru-reveal-ready .ru-grid > li[data-reveal]:nth-child(3n + 2) {
    transition-delay: 90ms;
}

.ru-reveal-ready .ru-grid > li[data-reveal]:nth-child(3n + 3) {
    transition-delay: 180ms;
}
