/* ============================================================
   Media loader — единый индикатор и поведение загрузки
   визуального контента (Stories, превью персонажа, галерея
   профиля, 18+ галерея, чат, каталог, создание персонажа).
   ------------------------------------------------------------
   • .rc-spinner — маленькое серое кольцо (исходно — лоадер
     Stories). Единственный спиннер контента на сайте.
   • .rc-loader  — слой по центру области, где появится контент.
     Показ/скрытие/ошибку переключает /js/media-loader.js.
   • .rc-media   — <img>, который не показывается до реальной
     загрузки + декодирования, затем плавно проявляется.
   Логика: /js/media-loader.js (window.RcMedia).
   ============================================================ */

:root {
    --rc-spinner-size: 30px;
    --rc-spinner-track: rgba(226, 232, 240, 0.14);
    --rc-spinner-arc: rgba(226, 232, 240, 0.82);
    --rc-spinner-speed: 780ms;
    --rc-media-fade: 220ms;
    /* heroicons outline "photo" — нейтральная иконка «фото недоступно» */
    --rc-media-error-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='m2.25 15.75 5.159-5.159a2.25 2.25 0 0 1 3.182 0l5.159 5.159m-1.5-1.5 1.409-1.409a2.25 2.25 0 0 1 3.182 0l2.909 2.909m-18 3.75h16.5a1.5 1.5 0 0 0 1.5-1.5V6a1.5 1.5 0 0 0-1.5-1.5H3.75A1.5 1.5 0 0 0 2.25 6v12a1.5 1.5 0 0 0 1.5 1.5Zm10.5-11.25h.008v.008h-.008V8.25Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z'/%3E%3C/svg%3E");
}

/* ---- Кольцо ---- */
.rc-spinner {
    display: inline-block;
    flex: none;
    box-sizing: border-box;
    width: var(--rc-spinner-size);
    height: var(--rc-spinner-size);
    border-radius: 9999px;
    border: 2px solid var(--rc-spinner-track);
    border-top-color: var(--rc-spinner-arc);
    animation: rc-spinner-spin var(--rc-spinner-speed) linear infinite;
}

@keyframes rc-spinner-spin {
    to { transform: rotate(360deg); }
}

/* ---- Слой загрузки поверх области контента ---- */
.rc-loader {
    position: absolute;
    inset: 0;
    z-index: 2;
    display: none;
    align-items: center;
    justify-content: center;
    pointer-events: none;
}

.rc-loader.is-visible {
    display: flex;
    animation: rc-loader-enter 180ms ease-out both;
}

/* Ошибка: кольцо больше не крутится, вместо него — приглушённая иконка. */
.rc-loader.is-error {
    display: flex;
}
.rc-loader.is-error .rc-spinner {
    display: none;
}
.rc-loader.is-error::before {
    content: "";
    width: 28px;
    height: 28px;
    background-color: rgba(226, 232, 240, 0.3);
    -webkit-mask: var(--rc-media-error-icon) center / contain no-repeat;
    mask: var(--rc-media-error-icon) center / contain no-repeat;
}

/* В потоке документа (подгрузка списка под последним рядом). */
.rc-loader--inline {
    position: relative;
    inset: auto;
    z-index: auto;
    padding: 24px 0;
}

@keyframes rc-loader-enter {
    from { opacity: 0; transform: scale(0.9); }
    to { opacity: 1; transform: scale(1); }
}

/* ---- Медиа: скрыто до готовности, затем мягкое проявление ----
   Скрытие включается только когда media-loader.js реально работает
   (класс на <html>), поэтому без JS фото никогда не остаются невидимыми.
   Проявление — через animation (а не transition), чтобы не конфликтовать
   с transition: transform у hover-/zoom-эффектов конкретных страниц. */
.rc-media-js .rc-media:not(.is-loaded) {
    opacity: 0;
}
.rc-media.is-loaded {
    animation: rc-media-in var(--rc-media-fade) ease-out;
}
.rc-media.is-instant {
    animation: none;
}

@keyframes rc-media-in {
    from { opacity: 0; }
}

@media (prefers-reduced-motion: reduce) {
    .rc-spinner,
    .rc-loader.is-visible,
    .rc-media.is-loaded {
        animation: none;
    }
}
