/* =========================================================================
   MoonRise — Палитра
   ========================================================================= */
:root {
    /* Фоны — приглушённые тёмно-серо-синие, без чёрной глубины */
    --bg-page:           #14181f;   /* было #020305 — слишком чёрное */
    --bg-surface:        #1a1f27;   /* main-content */
    --bg-sidebar:        #1e242d;
    --bg-card:           #232a35;   /* карточки/инпуты */
    --bg-card-hover:     #2b3340;
    --bg-inner:          #1c222b;

    /* Границы — мягче, без резкого контраста */
    --border:            #353c47;
    --border-hover:      #4a5564;

    /* Текст — никакого чисто-белого, всё на off-white */
    --text-primary:      #c8cdd4;   /* основной — приглушённый светлый */
    --text-bright:       #e6e9ee;   /* "яркий" — почти белый, но мягче */
    --text-secondary:    #9eb1ca;   /* акцент — синевато, но менее насыщенно */
    --text-muted:        #7d8590;   /* приглушённый */

    /* Кнопки primary */
    --btn-primary-bg:    #364152;
    --btn-primary-hover: #475263;
    --btn-primary-text:  #c8cdd4;

    /* Кнопки secondary */
    --btn-secondary-bg:    #2a313c;
    --btn-secondary-hover: #3a4252;

    /* Ссылки в контенте — читаемый мягкий синий (фон тёмный) */
    --link:       #7ea8e0;
    --link-hover: #a9c6f0;

    /* Статусы — чуть приглушённые, чтобы не "били" по глазам */
    --color-success:     #6dd6a4;   /* был #4ade80 — слишком яркий */
    --color-danger:      #e88b8b;   /* был #f87171 */
    --color-warning:     #d9a955;

    /* Скроллбары */
    --scroll-track:      var(--bg-inner);
    --scroll-thumb:      #353c47;
    --scroll-thumb-hover:#4a5564;
    --scroll-thumb-active:#5a6678;
}

/* =========================================================================
   Ссылки - одно правило на весь сайт. Стиль взят со страниц /page_* и вынесен
   сюда, чтобы не расходился по файлам.

   Специфичность минимальная (один тег), поэтому любое существующее правило
   с классом её перебивает: кнопки-ссылки, пункты меню и карточки сохраняют
   свой вид. Цвет получают только те ссылки, у которых своего цвета не было -
   раньше они оставались браузерным #0000EE.
   ========================================================================= */
a {
    color: var(--link);
    text-decoration: underline;
    text-underline-offset: 2px;
    transition: color 0.2s ease;
}
a:hover {
    color: var(--link-hover);
    text-decoration: none;
}

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

/* Стили для скроллбаров */
::-webkit-scrollbar {
    width: 8px;
    height: 8px;
}

::-webkit-scrollbar-track {
    background: var(--scroll-track);
    border-radius: 4px;
}

::-webkit-scrollbar-thumb {
    background: var(--scroll-thumb);
    border-radius: 4px;
    border: 1px solid var(--border);
}

::-webkit-scrollbar-thumb:hover {
    background: var(--scroll-thumb-hover);
}

::-webkit-scrollbar-thumb:active {
    background: var(--scroll-thumb-active);
}

::-webkit-scrollbar-corner {
    background: var(--scroll-track);
}

/* Для Firefox */
* {
    scrollbar-width: thin;
    scrollbar-color: var(--scroll-thumb) var(--scroll-track);
}

body {
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, Arial, sans-serif;
    overflow: hidden;
    background-color: var(--bg-page);
    color: var(--text-primary);
}

.app-container {
    display: flex;
    width: 100vw;
    height: 100vh;
}

.sidebar {
    width: 350px;
    background-color: var(--bg-sidebar);
    border-right: 1px solid var(--border);
    padding: 20px;
    overflow-y: auto;
    box-shadow: 2px 0 5px rgba(0,0,0,0.5);
    z-index: 100;
}

.sidebar h2 {
    margin-bottom: 15px;
    color: var(--text-secondary);
    border-bottom: 1px solid var(--border);
    padding-bottom: 10px;
    font-size: 18px;
    font-weight: 400;
    letter-spacing: 1px;
}

.nav-controls {
    display: flex;
    flex-direction: column;
    gap: 8px;
    margin-bottom: 25px;
}

.nav-btn {
    padding: 12px 15px;
    background-color: var(--bg-card);
    border: 1px solid var(--border);
    border-radius: 6px;
    color: var(--text-primary);
    cursor: pointer;
    font-size: 14px;
    transition: all 0.2s ease;
    text-align: left;
    text-decoration: none;
    display: block;
}

.nav-btn:hover {
    background-color: var(--bg-card-hover);
    border-color: var(--border-hover);
}

.nav-btn.active {
    background-color: var(--btn-primary-bg);
    border-color: var(--btn-primary-hover);
    color: var(--text-bright);
}

/* Универсальные кнопки — глобальные, доступны на любой странице. */
.btn-primary,
.btn-secondary {
    padding: 8px 16px;
    border: 1px solid var(--border);
    border-radius: 6px;
    cursor: pointer;
    font-size: 14px;
    transition: background-color 0.2s ease;
    font-family: inherit;
}

.btn-primary {
    background-color: var(--btn-primary-bg);
    color: var(--text-bright);
    border-color: var(--btn-primary-hover);
}

.btn-primary:hover:not(:disabled) {
    background-color: var(--btn-primary-hover);
}

.btn-primary:disabled {
    opacity: 0.5;
    cursor: not-allowed;
}

.btn-secondary {
    background-color: var(--btn-secondary-bg);
    color: var(--text-secondary);
}

.btn-secondary:hover {
    background-color: var(--btn-secondary-hover);
    color: var(--text-bright);
}

.btn-secondary:disabled {
    opacity: 0.5;
    cursor: not-allowed;
}

.nav-header {
    margin: 12px 4px 4px;
    padding-top: 14px;
    border-top: 1px solid var(--border);
    color: var(--text-muted);
    font-size: 11px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.8px;
}

.nav-controls > .nav-header:first-child {
    margin-top: 0;
    padding-top: 0;
    border-top: none;
}

.quick-links {
    display: flex;
    flex-direction: column;
    gap: 8px;
    margin-bottom: 25px;
}

.quick-link {
    padding: 10px 12px;
    background-color: var(--bg-card);
    border: 1px solid var(--border);
    border-radius: 6px;
    color: var(--text-primary);
    text-decoration: none;
    font-size: 14px;
    transition: all 0.2s ease;
    text-align: left;
}

.quick-link:hover {
    background-color: var(--bg-card-hover);
    border-color: var(--border-hover);
    transform: translateX(5px);
}

.auth-section {
    margin-bottom: 25px;
    padding: 15px;
    background: var(--bg-card);
    border-radius: 8px;
    border: 1px solid var(--border);
}

.user-info {
    display: flex;
    align-items: center;
    margin-bottom: 10px;
}

.user-avatar {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    margin-right: 10px;
    border: 2px solid var(--border-hover);
    display: block;
}
.user-avatar-link {
    display: inline-block;
    line-height: 0;
    transition: transform 0.12s;
}
.user-avatar-link:hover .user-avatar {
    border-color: var(--text-secondary);
}

/* Анимированная аватарка приходит в <picture>; обёртка строчная и схлопнула бы
   отступ справа, поэтому размер держит она, а не картинка. */
.user-avatar-link > picture:first-child,
.user-info > picture {
    display: block;
    width: 40px;
    height: 40px;
}

/* Рамка из Points Shop поверх аватарки. 122% - пропорция Steam (224px на
   184px), и считается она от коробки ссылки, поэтому коробка обязана быть
   ровно по аватарке. Отступ до имени переезжает с картинки на ссылку: пока
   он оставался на .user-avatar, ссылка была шириной 50px вместо 40, и рамка
   уезжала вправо на 5px, заодно вырастая до 61px. */
.user-avatar-link.has-frame {
    position: relative;
    display: block;
    box-sizing: content-box;
    width: 40px;
    height: 40px;
    /* Прежние 10px отступа плюс вылет рамки (по 4-5px с каждой стороны),
       иначе она вплотную подходит к имени. */
    margin-right: 15px;
    flex: none;
}
.user-avatar-link.has-frame .user-avatar {
    margin-right: 0;
    /* Рамка нарисована вокруг квадратной аватарки - под ней скругление
       уменьшаем, иначе её проём ложится ровно по краю круга. */
    border-radius: 6px;
}
.user-avatar-link.has-frame > picture:last-child {
    position: absolute;
    left: 50%;
    top: 50%;
    width: 122%;
    height: 122%;
    transform: translate(-50%, -50%);
    pointer-events: none;
    user-select: none;
}
.user-avatar-link.has-frame > picture:last-child > .user-avatar-frame {
    display: block;
    width: 100%;
    height: 100%;
}

.user-details {
    flex: 1;
}

.user-name {
    font-weight: bold;
    color: var(--text-bright);
    font-size: 14px;
}

.user-steamid {
    font-size: 12px;
    color: var(--text-muted);
}

.user-role {
    font-size: 11px;
    padding: 2px 6px;
    border-radius: 10px;
    display: inline-block;
    margin-top: 2px;
}

.user-role.admin {
    background-color: var(--color-success);
    color: var(--bg-page);
}

.user-role.user {
    background-color: var(--btn-secondary-bg);
    color: var(--text-secondary);
}

.control-btn {
    width: 100%;
    padding: 10px;
    margin-bottom: 8px;
    background-color: var(--btn-primary-bg);
    border: 1px solid var(--border);
    border-radius: 5px;
    color: var(--text-secondary);
    cursor: pointer;
    font-size: 14px;
    font-weight: 500;
    transition: all 0.2s ease;
}

.control-btn:hover {
    background-color: var(--btn-primary-hover);
    color: var(--text-bright);
}

.control-btn.secondary {
    background-color: var(--btn-secondary-bg);
}

.control-btn.secondary:hover {
    background-color: var(--btn-secondary-hover);
}


.server-stats,
.stats-section {
    padding: 15px;
    background: var(--bg-card);
    border-radius: 8px;
    border: 1px solid var(--border);
    margin-top: 20px;
}

.server-stats h3,
.stats-section h3 {
    margin-bottom: 15px;
    color: var(--text-secondary);
    font-size: 16px;
    border-bottom: 1px solid var(--border);
    padding-bottom: 8px;
    font-weight: 400;
    letter-spacing: 1px;
}

.stat-value.warning {
    color: var(--color-danger);
}

.stat-item {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 8px;
    padding: 5px 0;
}

.stat-label {
    color: var(--text-muted);
    font-size: 14px;
}

.stat-value {
    color: var(--text-bright);
    font-weight: bold;
    font-size: 14px;
}

.main-content {
    flex: 1;
    display: flex;
    flex-direction: column;
    background-color: var(--bg-surface);
    overflow-y: auto;
}

.pending-notices {
    padding: 10px 20px 0;
}
.pending-notice {
    background: rgba(109, 214, 164, 0.10);
    border: 1px solid rgba(109, 214, 164, 0.35);
    border-radius: 6px;
    padding: 10px 14px;
    margin-bottom: 8px;
    display: flex;
    align-items: center;
    gap: 10px;
    color: var(--text-bright);
    font-size: 14px;
}
.pending-notice-body { flex: 1; }
.pending-notice--warn {
    background: rgba(255, 183, 77, 0.10);
    border-color: rgba(255, 183, 77, 0.45);
    flex-wrap: wrap;
}
.pending-notice--warn .control-btn { width: auto; margin: 0; text-decoration: none; white-space: nowrap; }
/* Своего цвета ссылкам тут не нужно - его задаёт общее правило выше. */
.pending-notice-ok    { color: var(--color-success); font-size: 12px; margin-left: 6px; }
.pending-notice-warn  { color: var(--color-warning); font-size: 12px; margin-left: 6px; }
.pending-notice-close {
    background: transparent;
    border: none;
    color: var(--text-muted);
    font-size: 20px;
    line-height: 1;
    cursor: pointer;
    padding: 0 4px;
}
.pending-notice-close:hover { color: var(--text-bright); }

.content-header {
    padding: 18px 40px;
    background: linear-gradient(135deg, var(--bg-sidebar) 0%, var(--bg-surface) 100%);
    border-bottom: 1px solid var(--border);
    text-align: center;
}

.content-header h1 {
    color: var(--text-secondary);
    font-size: 36px;
    margin-bottom: 10px;
    font-weight: 600;
    /* letter-spacing: 2px; */
}

.subtitle {
    color: var(--text-muted);
    font-size: 18px;
}

.servers-container {
    padding: 30px 40px;
    flex: 1;
}

/* ---------- Сетка карточек серверов на главной ---------- */
.servers-grid {
    display: grid;
    /* Две колонки на широком экране; на узком auto-fit сам сворачивает в одну. */
    /* grid-template-columns: repeat(auto-fit, minmax(440px, 1fr)); */
    gap: 30px;
    max-width: 1000px;
    margin: 0 auto;
}

.server-card {
    display: flex;
    align-items: center;
    gap: 20px;
    padding: 12px 22px;
    background: var(--bg-card);
    border: 1px solid var(--border);
    border-radius: 10px;
    box-shadow: 0 2px 10px rgba(0,0,0,0.25);
    transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
}

.server-card:hover {
    border-color: var(--border-hover);
    box-shadow: 0 6px 22px rgba(0,0,0,0.45);
    transform: translateY(-2px);
}

.server-card.is-offline {
    opacity: 0.85;
}

.server-card-icon {
    flex-shrink: 0;
    width: 64px;
    height: 64px;
    border-radius: 10px;
    /* background: linear-gradient(135deg, var(--btn-primary-bg), var(--bg-card-hover));
    border: 1px solid var(--border); */
    display: flex;
    align-items: center;
    justify-content: center;
    overflow: hidden;
}
.server-card-icon img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

.server-card-body {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.server-card-head {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
}

.server-card-name {
    flex: 1;
    min-width: 0;
    color: var(--text-bright);
    font-size: 17px;
    font-weight: 600;
    line-height: 1.3;
    margin: 0;
    max-width: 760px;
}

.server-card-status {
    flex-shrink: 0;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    /* padding: 4px 10px; */
    border-radius: 12px;
    /* background: var(--bg-inner); */
    color: var(--text-secondary);
    font-size: 12px;
    font-weight: 500;
    white-space: nowrap;
}

.server-card-status .status-dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--text-muted);
}

.server-card.is-online .server-card-status  .status-dot { background: var(--color-success); }
.server-card.is-offline .server-card-status .status-dot { background: var(--color-danger); }

.server-card-desc {
    color: var(--text-primary);
    font-size: 15px;
    line-height: 1.5;
    margin: 0;
}

.server-card-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-top: 4px;
}

.server-btn {
    padding: 8px 14px;
    background-color: var(--btn-secondary-bg);
    color: var(--text-secondary);
    border: 1px solid var(--border);
    border-radius: 6px;
    cursor: pointer;
    font-size: 13px;
    font-weight: 500;
    text-decoration: none;
    transition: background-color 0.2s ease, color 0.2s ease;
    display: inline-flex;
    align-items: center;
    gap: 6px;
}

.server-btn:hover {
    background-color: var(--btn-secondary-hover);
    color: var(--text-bright);
}

.server-btn.primary {
    background-color: var(--btn-primary-bg);
    color: var(--text-bright);
    border-color: var(--btn-primary-hover);
    width: 230px;
}

.server-btn.primary:hover {
    background-color: var(--btn-primary-hover);
}

.server-btn:disabled {
    opacity: 0.5;
    cursor: not-allowed;
    pointer-events: none;
}

/* Кнопка-«адрес сервера»: моноширинный шрифт, чтобы порт читался ровно. */
.server-btn--join {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 14px;
    letter-spacing: 0.3px;
}
/* Кратковременный фидбек после клика. */
.server-btn.is-copied {
    background-color: var(--color-success);
    color: var(--bg-page);
    border-color: var(--color-success);
}
.server-btn.is-copy-failed {
    background-color: var(--color-danger);
    color: var(--text-bright);
    border-color: var(--color-danger);
}

/* Модалка со списком игроков (conan/A2S). Разметку создаёт main.js,
   стили изолированы под #players-modal, чтобы не пересекаться с #localAuthModal. */
#players-modal.players-modal {
    position: fixed;
    inset: 0;
    z-index: 1100;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 24px;
    background-color: rgba(0, 0, 0, 0.85);
    animation: players-modal-in 0.18s ease;
}
@keyframes players-modal-in {
    from { opacity: 0; }
    to   { opacity: 1; }
}
#players-modal .players-modal-content {
    position: relative;
    width: 100%;
    max-width: 420px;
    max-height: 85vh;
    display: flex;
    flex-direction: column;
    background-color: var(--bg-sidebar);
    border: 1px solid var(--border);
    border-radius: 8px;
    padding: 22px 24px 24px;
    box-shadow: 0 4px 30px rgba(0, 0, 0, 0.7);
}
#players-modal .players-modal-close {
    position: absolute;
    top: 12px;
    right: 16px;
    background: none;
    border: none;
    color: var(--text-muted);
    font-size: 26px;
    line-height: 1;
    cursor: pointer;
    transition: color 0.2s;
}
#players-modal .players-modal-close:hover { color: var(--text-bright); }
#players-modal .players-modal-head {
    flex: 0 0 auto;
    border-bottom: 1px solid var(--border);
    padding-bottom: 12px;
    margin-bottom: 14px;
    padding-right: 28px;
}
#players-modal .players-modal-title {
    margin: 0;
    font-size: 20px;
    font-weight: 400;
    letter-spacing: 0.5px;
    color: var(--text-secondary);
}
#players-modal .players-modal-server {
    margin: 4px 0 0;
    font-size: 13px;
    color: var(--text-muted);
}
#players-modal .players-modal-list {
    list-style: none;
    margin: 0;
    padding: 0;
    flex: 1 1 auto;
    min-height: 0;          /* критично: без этого flex-элемент не даёт списку скроллиться */
    display: flex;
    flex-direction: column;
    gap: 4px;
    overflow-y: auto;
}
#players-modal .players-modal-list li {
    font-size: 14px;
    color: var(--text-primary);
    background: var(--bg-card);
    border: 1px solid var(--border);
    border-radius: 6px;
    padding: 7px 12px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
body.modal-open { overflow: hidden; }

@media (max-width: 600px) {
    .server-card { flex-direction: column; }
    .server-card-icon { width: 56px; height: 56px; font-size: 28px; }

    /* Порядок на mobile: статус → название → описание → магазин/голосование */
    .server-card-head {
        flex-direction: column;
        align-items: flex-start;
        gap: 6px;
    }
    .server-btn--map  { display: none; }
}

.info-cards {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: 20px;
    padding: 20px 40px;
    max-width: 1200px;
    margin: 0 auto;
}

.info-card {
    background: var(--bg-card);
    border: 1px solid var(--border);
    border-radius: 8px;
    padding: 25px;
    transition: all 0.2s ease;
}

.info-card:hover {
    border-color: var(--border-hover);
    transform: translateY(-5px);
    box-shadow: 0 8px 25px rgba(0,0,0,0.5);
}

.info-card h3 {
    color: var(--text-secondary);
    margin-bottom: 15px;
    font-size: 18px;
    border-bottom: 1px solid var(--border);
    padding-bottom: 10px;
    font-weight: 400;
    letter-spacing: 0.5px;
}

.info-card p {
    color: var(--text-primary);
    margin-bottom: 8px;
    line-height: 1.4;
}

.loading {
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 60px 20px;
    font-size: 18px;
    color: var(--text-muted);
}

.error-message {
    text-align: center;
    padding: 60px 20px;
    color: var(--color-danger);
}

.error-message p {
    margin-bottom: 20px;
    font-size: 16px;
}

.btn-primary {
    padding: 12px 24px;
    background-color: var(--btn-primary-bg);
    border: 1px solid var(--border);
    border-radius: 6px;
    color: var(--text-secondary);
    cursor: pointer;
    font-size: 14px;
    font-weight: 500;
    transition: all 0.2s ease;
}

.btn-primary:hover {
    background-color: var(--btn-primary-hover);
    color: var(--text-bright);
}

/* Анимации */
@keyframes fadeIn {
    from {
        opacity: 0;
        transform: translateY(20px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

.server-item {
    animation: fadeIn 0.5s ease;
}

/* Адаптивность */
@media (max-width: 992px) {
    /* На мобильной отдаём прокрутку всему документу,
       чтобы низ контента не обрезался адресной строкой браузера. */
    body {
        overflow: visible;
    }

    .app-container {
        flex-direction: column;
        height: auto;
        min-height: 100vh;
    }

    .main-content {
        overflow-y: visible;
    }

    .sidebar {
        width: 100%;
        height: auto;
        max-height: 50vh;
    }

    .content-header h1 {
        font-size: 28px;
    }

    .subtitle {
        font-size: 16px;
    }

    .servers-container {
        padding: 20px;
    }

    .info-cards {
        grid-template-columns: 1fr;
        padding: 20px;
    }
}

@media (max-width: 768px) {
    .server-header {
        flex-direction: column;
        align-items: flex-start;
        gap: 10px;
    }

    .server-info {
        width: 100%;
    }

    .server-actions {
        width: 100%;
        flex-direction: column;
    }

    .server-specs {
        grid-template-columns: 1fr;
    }

    .players-grid {
        grid-template-columns: 1fr;
    }

    .content-header {
        padding: 20px;
    }

    .content-header h1 {
        font-size: 24px;
    }
}

@media (max-width: 480px) {
    .sidebar {
        padding: 15px;
    }

    .server-icon {
        width: 40px;
        height: 40px;
        font-size: 16px;
    }

    .server-name {
        font-size: 16px;
    }

    .info-card {
        padding: 20px;
    }
}

.icon-key:before { content: "🔑"; }

/* =========================================================================
   Editor & Gallery — обёртка одной колонки (без правой панели)
   ========================================================================= */
.editor-wrapper,
.gallery-wrapper {
    display: flex;
    flex-direction: column;
    height: 100%;
    overflow-y: auto;
}

.editor-wrapper .editor-area,
.gallery-wrapper .gallery-area {
    flex: 1;
    display: flex;
    flex-direction: column;
    min-width: 0;
}


/* =========================================================================
   Компактный список серверов в sidebar (показывается на не-главных страницах)
   ========================================================================= */
.server-stats-compact {
    padding: 15px;
    background: var(--bg-card);
    border-radius: 8px;
    border: 1px solid var(--border);
}

.server-stats-compact h3 {
    margin-bottom: 12px;
    color: var(--text-secondary);
    font-size: 16px;
    border-bottom: 1px solid var(--border);
    padding-bottom: 8px;
    font-weight: 400;
    letter-spacing: 1px;
}

.servers-compact-list {
    display: flex;
    flex-direction: column;
    gap: 6px;
}

.servers-compact-loading {
    color: var(--text-muted);
    font-size: 12px;
    padding: 8px 0;
    text-align: center;
}

.server-compact {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 10px;
    background: var(--bg-inner);
    border: 1px solid var(--border);
    border-radius: 6px;
    font-size: 13px;
    transition: border-color 0.2s ease;
}

.server-compact:hover {
    border-color: var(--border-hover);
}

.server-compact-status {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    flex-shrink: 0;
}

.server-compact.is-online  .server-compact-status { background: var(--color-success); }
.server-compact.is-offline .server-compact-status { background: var(--color-danger); }

.server-compact-icon {
    flex-shrink: 0;
    display: flex;
    align-items: center;
}
.server-compact-icon img {
    width: 20px;
    height: 20px;
    border-radius: 4px;
    object-fit: cover;
    display: block;
}

.server-compact-name {
    flex: 1;
    color: var(--text-primary);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.server-compact-count {
    flex-shrink: 0;
    color: var(--text-secondary);
    font-weight: 600;
    font-size: 12px;
    background: var(--bg-card);
    padding: 2px 8px;
    border-radius: 10px;
}

/* =========================================================================
   Тултипы.

   Здесь была CSS-only реализация через [data-tooltip]::before/::after. Её
   заменил общий движок: assets/js/tooltip.js + assets/css/tooltip.css.
   Причина в двух вещах, которые из CSS не решаются:
     - псевдоэлемент обрезается любым родителем с overflow, а подсказки висят
       в таблицах, карточках и боковой панели;
     - у экрана есть края: подсказка должна переворачиваться и поджиматься,
       а про положение окна CSS ничего не знает.
   Имена атрибутов сохранены — data-tooltip и data-tooltip-pos, — поэтому вся
   прежняя разметка работает как была, к ней лишь добавились стороны
   left и right.

   position: relative оставлен намеренно: правило годами висело на всех
   элементах с подсказкой, и что-то могло начать позиционироваться внутри них.
   Снимать его заодно с тултипами — менять вёрстку там, где не просили.
   ========================================================================= */
[data-tooltip] {
    position: relative;
}

/* =========================================================================
   Тосты - глобальные, сверху по центру. Контейнер #toast-root создаёт
   window.toast (main.js): новый тост встаёт сверху стопки, старые съезжают
   вниз, больше четырёх разом не держим. Полоска внизу показывает, сколько
   тосту осталось; наведение мыши её останавливает. Типы: success, error,
   info и notify (оповещение о событии, notify.js: заголовок + текст, клик
   ведёт к событию).
   ========================================================================= */
#toast-root {
    position: fixed;
    top: 16px;
    left: 50%;
    transform: translateX(-50%);
    z-index: 12000;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 8px;
    width: min(440px, calc(100vw - 32px));
    pointer-events: none;
}

.toast {
    --accent: var(--text-secondary);
    pointer-events: auto;
    position: relative;
    overflow: hidden;
    display: flex;
    align-items: flex-start;
    gap: 11px;
    width: 100%;
    padding: 11px 14px 13px;
    background: var(--bg-card);
    color: var(--text-bright);
    border: 1px solid var(--border-hover);
    border-radius: 12px;
    box-shadow: 0 14px 34px rgba(0, 0, 0, 0.5), 0 2px 6px rgba(0, 0, 0, 0.3);
    font-size: 14px;
    line-height: 1.4;
    cursor: pointer;
    animation: toast-in 0.24s cubic-bezier(.2, .8, .3, 1.15);
}
.toast.is-leaving { animation: toast-out 0.2s ease forwards; }

.toast-success { --accent: var(--color-success); }
.toast-error   { --accent: var(--color-danger); }
.toast-warning { --accent: var(--color-warning); }
.toast-info    { --accent: var(--text-secondary); }
.toast-notify  { --accent: var(--color-warning); }

.toast-icon {
    flex: 0 0 22px;
    height: 22px;
    margin-top: -1px;
    display: grid;
    place-items: center;
    border-radius: 50%;
    background: var(--accent);
    color: var(--bg-page);
    font-size: 12px;
    font-weight: 700;
}

.toast-body { flex: 1; min-width: 0; overflow-wrap: anywhere; }
.toast-title { font-weight: 600; color: var(--text-bright); }
.toast-title + .toast-msg { margin-top: 2px; color: var(--text-primary); font-size: 13px; }
.toast-title:empty { display: none; }

/* Кликабельный тост: стрелка справа, рамка подсвечивается акцентом. */
.toast-link::after {
    content: '›';
    align-self: center;
    font-size: 20px;
    line-height: 1;
    color: var(--text-muted);
    transition: transform .15s ease, color .15s ease;
}
.toast-link:hover { border-color: var(--accent); }
.toast-link:hover::after { color: var(--accent); transform: translateX(2px); }

/* Сколько осталось жить. По animationend этой полоски тост уходит (main.js). */
.toast-bar {
    position: absolute;
    left: 0;
    bottom: 0;
    width: 100%;
    height: 2px;
    background: var(--accent);
    opacity: .75;
    transform-origin: left;
    animation: toast-life var(--toast-life, 2500ms) linear forwards;
}
.toast:hover .toast-bar { animation-play-state: paused; }

@keyframes toast-in {
    from { opacity: 0; transform: translateY(-14px) scale(.98); }
    to   { opacity: 1; transform: none; }
}
@keyframes toast-out {
    from { opacity: 1; transform: none; }
    to   { opacity: 0; transform: translateY(-10px) scale(.98); }
}
@keyframes toast-life {
    from { transform: scaleX(1); }
    to   { transform: scaleX(0); }
}

@media (prefers-reduced-motion: reduce) {
    .toast            { animation-name: toast-fade-in; }
    .toast.is-leaving { animation-name: toast-fade-out; }
    @keyframes toast-fade-in  { from { opacity: 0; } to { opacity: 1; } }
    @keyframes toast-fade-out { from { opacity: 1; } to { opacity: 0; } }
}

@media (max-width: 600px) {
    #toast-root {
        top: 10px;
        width: calc(100vw - 24px);
    }
}


/* =========================================================================
   Off-canvas боковое меню сайта на нешироких десктопах (993–1280px).
   Ниже 993px работает прежняя «стопкой» раскладка, выше 1280 — обычный сайдбар.
   Бургер и подложка по умолчанию скрыты — включаются только в этом диапазоне.
   ========================================================================= */
.sidebar-toggle { display: none; }
.sidebar-backdrop { display: none; }

@media (min-width: 993px) and (max-width: 1280px) {
    /* Сайдбар — выезжает слева поверх контента. */
    .sidebar {
        position: fixed;
        top: 0;
        left: 0;
        height: 100vh;
        transform: translateX(-100%);
        transition: transform 0.25s ease;
        z-index: 300;
    }
    body.nav-open .sidebar { transform: translateX(0); }

    /* Контент — на всю ширину; слева узкий отступ под кнопку-бургер. */
    .main-content { padding-left: 52px; }

    .sidebar-toggle {
        display: flex;
        position: fixed;
        top: 10px;
        left: 8px;
        z-index: 260;
        width: 40px;
        height: 40px;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        gap: 4px;
        background: var(--bg-sidebar);
        border: 1px solid var(--border);
        border-radius: 8px;
        cursor: pointer;
        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.45);
    }
    .sidebar-toggle span {
        display: block;
        width: 18px;
        height: 2px;
        background: var(--text-secondary);
        border-radius: 2px;
    }
    .sidebar-toggle:hover span { background: var(--text-bright); }

    .sidebar-backdrop {
        display: block;
        position: fixed;
        inset: 0;
        background: rgba(0, 0, 0, 0.5);
        opacity: 0;
        pointer-events: none;
        transition: opacity 0.25s ease;
        z-index: 250;
    }
    body.nav-open .sidebar-backdrop { opacity: 1; pointer-events: auto; }
}

/* ---------- Кнопка «наверх» ---------- */
/* Появляется после 300px прокрутки любого контейнера (см. main.js).
   z-index ниже модалок (10000), но выше липких панелей вроде пагинации
   галереи; сама пагинация высотой ~64px, поэтому кнопка приподнята над ней. */
.scroll-top-btn {
    position: fixed;
    right: 22px;
    bottom: 84px;
    z-index: 900;
    width: 64px;
    height: 64px;
    display: flex;
    align-items: center;
    justify-content: center;
    background-color: var(--btn-primary-bg);
    color: var(--text-bright);
    border: 1px solid var(--border-hover);
    border-radius: 50%;
    font-size: 20px;
    line-height: 1;
    cursor: pointer;
    box-shadow: 0 4px 14px rgba(0, 0, 0, 0.4);
    opacity: 0;
    visibility: hidden;
    transform: translateY(8px);
    transition: opacity 0.2s ease, transform 0.2s ease, background-color 0.2s ease, visibility 0.2s;
}

.scroll-top-btn.is-visible {
    opacity: 0.92;
    visibility: visible;
    transform: translateY(0);
}

/* Режим «к последним сообщениям»: кнопка живёт внутри ленты переписки, а не в
   углу экрана, поэтому делаем её компактнее. Позицию задаёт JS по краям
   контейнера (см. initScrollTop в main.js). */
.scroll-top-btn.is-down {
    width: 44px;
    height: 44px;
    font-size: 18px;
}

.scroll-top-btn:hover {
    opacity: 1;
    background-color: var(--btn-primary-hover);
}

@media (max-width: 768px) {
    .scroll-top-btn {
        right: 14px;
        bottom: 92px;
        width: 38px;
        height: 38px;
        font-size: 18px;
    }
}

/* ===== Предупреждение «уведомления выключены» (push.js) =====
   Одна плашка на все разделы: тикеты, розыгрыши. Мягкий вариант - когда
   весть всё равно придёт (на другое устройство или в Telegram). */
.push-warn {
    background: var(--bg-card);
    border: 1px solid var(--border);
    border-left: 3px solid var(--color-warning);
    border-radius: 4px;
    padding: 8px 12px;
    font-size: 13px;
    line-height: 1.45;
    color: var(--text-primary);
}
.push-warn[hidden] { display: none; }
.push-warn-soft { border-left-color: var(--text-muted); color: var(--text-muted); }
.push-warn-btn {
    margin-left: 6px;
    padding: 3px 10px;
    font: inherit;
    font-size: 12px;
    color: var(--btn-primary-text);
    background: var(--btn-primary-bg);
    border: 1px solid var(--border);
    border-radius: 4px;
    cursor: pointer;
    white-space: nowrap;
}
.push-warn-btn:hover { background: var(--btn-primary-hover); }
.push-warn-btn:disabled { opacity: .6; cursor: default; }
