/* Раунд = boxed inset. Шапка без своего padding: заголовок на линии контента.
   Матч — две половины, не одна строка, поэтому bleed на карточке, токенами родителя.
   --rail сюда нельзя: он вытянет каждую половину отдельно. */

.duel-round-panel.gc-inset-list {
    gap: var(--space-3);
}

.duel-round-panel.gc-inset-list > .gc-panel-header {
    padding: 0;
}

.duel-round-matches {
    display: flex;
    flex-direction: column;
    gap: var(--space-1);
    min-width: 0;
}

.duel-advance-section {
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
    min-width: 0;
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

.duel-advance-section .gc-list-group-header.duel-round-panel__kicker {
    margin: 0;
    padding-left: 0;
    padding-right: 0;
}

.duel-bye-notice {
    min-width: 0;
    margin: 0;
    padding: 0;
}

.duel-match-card {
    box-sizing: border-box;
    width: calc(100% + (2 * var(--gc-inset-row-padding)));
    max-width: none;
    margin-inline: calc(-1 * var(--gc-inset-row-padding));
    min-width: 0;
    border-radius: var(--radius-12);
    overflow: hidden;
    background: transparent;
}

.duel-match-card__body {
    display: flex;
    align-items: stretch;
    min-height: var(--space-12);
}

.duel-match-card__half {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
}

.duel-match-card__half > .gc-interactive-row,
.duel-match-card__half > button.gc-interactive-row {
    flex: 1;
    width: 100%;
    min-width: 0;
    align-self: stretch;
}

/* Аватар в строке матча не сжимаем — иначе flex отдаёт место тексту и ник уезжает под VS */
.duel-match-card .gc-list-avatar {
    flex-shrink: 0;
}

/* Правая половина: имя у VS, аватар у края */
.duel-match-card__half--right .gc-interactive-row {
    justify-content: flex-end;
    min-width: 0;
}

/* flex-end + flex:1 без basis 0 — контент не сжимался, ellipsis не срабатывал */
.duel-match-card__half--right .gc-list-content {
    align-items: flex-end;
    flex: 1 1 0;
    min-width: 0;
}

/*
 * text-align: right на том же блоке, что и text-overflow: ellipsis, в LTR даёт обрезку
 * с «левого» края строки (виден хвост ника). Короткие имена — fit-content + flex-end у края;
 * длинные — max-width 100% + text-align: left, ellipsis в конце строки.
 */
.duel-match-card__half--right .gc-list-content > .gc-list-title,
.duel-match-card__half--right .gc-list-content > .gc-list-meta {
    align-self: flex-end;
    width: fit-content;
    max-width: 100%;
    min-width: 0;
    text-align: left;
    box-sizing: border-box;
}

.duel-match-card__row--muted {
    opacity: 0.6;
}

/* «Ожидается»: статичная иконка или картинка — public/uploads/assets/icons/duel-waiting.svg */
.duel-match-card__waiting-frame {
    flex-shrink: 0;
}

/* Сильнее .gc-list-media-icon { display: flex } — сетка для центра двух img (dark/light) в круге */
.gc-list-media-icon.duel-match-card__waiting-frame {
    display: grid;
    place-items: center;
}

.gc-list-media-icon.duel-match-card__waiting-frame > .duel-match-card__waiting-img,
.gc-list-media-icon.duel-match-card__waiting-frame > .ph {
    grid-area: 1 / 1;
}

.duel-match-card__waiting-img {
    display: block;
    width: 100%;
    height: 100%;
    max-width: 100%;
    max-height: 100%;
    object-fit: contain;
    object-position: center;
}

/*
 * Duel SVG (uploads): не svg-theme-adaptive.
 *
 * Два файла: в тёмной теме — ассет со светлой заливкой (часто имя *-light.svg), в светлой — с тёмной
 * (duel-versus.svg). Подключение в blade: pair-dark получает светлый файл, pair-light — тёмный.
 *
 * Один файл (чёрный силуэт): светлая как в файле; тёмная — brightness(0) invert(1) + opacity.
 */
.duel-svg-icon {
    transition:
        opacity var(--transition-base),
        filter var(--transition-base);
}

.duel-svg-icon--pair-dark,
.duel-svg-icon--pair-light {
    display: none;
}

[data-theme="dark"] .duel-svg-icon--pair-dark {
    display: block;
    opacity: var(--duel-icon-muted-opacity-dark);
    filter: none;
}

[data-theme="dark"] .duel-svg-icon--pair-light {
    display: none;
}

[data-theme="light"] .duel-svg-icon--pair-dark {
    display: none;
}

[data-theme="light"] .duel-svg-icon--pair-light {
    display: block;
    opacity: 1;
    filter: none;
}

/* Один файл: монохром чёрный на прозрачном — светлая как в файле; тёмная: белый приглушённый */
.duel-svg-icon--mono {
    filter: none;
    opacity: 1;
}

[data-theme="dark"] .duel-svg-icon--mono {
    filter: brightness(0) invert(1);
    opacity: var(--duel-icon-muted-opacity-dark);
}

/* Пустая половина: тот же ряд, что у участника (gc-interactive-row + gc-list-media-icon sm = 32px, как gc-list-avatar sm) */
.duel-match-card__empty {
    flex: 1;
    width: 100%;
    min-width: 0;
    box-sizing: border-box;
}

.duel-match-card__half--right .duel-match-card__empty {
    justify-content: flex-end;
}

.duel-match-card__half--right .duel-match-card__empty .gc-list-meta {
    text-align: right;
}

.duel-match__versus {
    display: flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    align-self: center;
    padding-inline: var(--space-3);
    pointer-events: none;
}

.duel-match__versus-label {
    font-size: var(--font-size-12);
    font-weight: 600;
    line-height: 1;
    letter-spacing: 0.04em;
    color: var(--text-tertiary);
}

/* Компактные списки дуэли (итоги, «Прошли дальше»): sm-аватар + заголовок строки как у вторичных списков */
.duel-list--compact .gc-list-title {
    font-size: var(--font-size-14);
    font-weight: 500;
    line-height: var(--line-height-list-title);
}

/* Строка матча: тот же ритм типографики под 32px-аватар */
.duel-match-card .gc-list-title {
    font-size: var(--font-size-14);
    font-weight: 500;
    line-height: var(--line-height-list-title);
}

.duel-standing-rank {
    font-size: var(--font-size-13);
    color: var(--text-secondary);
}

.duel-standings-list-body {
    min-width: 0;
}

/* «Прошли дальше»: те же event-participant-card + gc-interactive-row + gc-list-avatar, что в списке; облако + чуть мельче (xs-аватар, duel-list--compact) */
.duel-advance-cloud {
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-start;
    align-items: flex-start;
    gap: var(--space-2);
    width: calc(100% + (2 * var(--gc-inset-row-padding)));
    margin-inline: calc(-1 * var(--gc-inset-row-padding));
    min-width: 0;
}

.duel-advance-cloud__item.event-participant-card {
    flex: 0 1 auto;
    align-self: flex-start;
    max-width: min(100%, 18rem);
    min-width: 0;
}

.duel-advance-cloud__item .gc-interactive-row {
    gap: var(--space-2);
    padding-block: var(--space-1);
    padding-inline: var(--gc-inset-row-padding);
}

.duel-advance-cloud__item .gc-list-content > .gc-list-title {
    max-width: 12rem;
}

.duel-standings-mobile {
    display: block;
    margin-top: var(--space-4);
}

@media (min-width: 1280px) {
    .duel-standings-mobile {
        display: none;
    }
}

/* Модалка «Участники дуэли»: тот же ритм, что .gc-modal-content--list + .gc-stack-sm в event-squad-modal — gap xs, без лишних вложенных stack-md */
.duel-participants-modal-shell .duel-participants-modal {
    display: flex;
    flex-direction: column;
    gap: var(--space-1);
    min-width: 0;
    width: 100%;
}

.duel-participants-modal-shell .duel-participants-modal__list {
    display: flex;
    flex-direction: column;
    gap: var(--space-1);
    min-width: 0;
}

.duel-participants-modal-shell .duel-participants-modal__excluded {
    display: flex;
    flex-direction: column;
    gap: var(--space-1);
    min-width: 0;
    padding-top: var(--space-2);
}

.duel-participants-modal .duel-participants-modal__skeleton-avatar {
    width: 40px;
    height: 40px;
    flex-shrink: 0;
}

.duel-participants-modal .duel-participants-modal__skeleton-lines {
    min-width: 0;
}

.duel-participants-modal .duel-participants-modal__skeleton-action {
    width: 5rem;
    height: 28px;
    border-radius: var(--radius-8);
}
