/* ==========================================================================
   VoltNodes-style theme — green, modern, dark-forward hosting panel skin
   Loaded AFTER style.bundle.css to override the stock Metronic look.
   ========================================================================== */

:root{
	--vn-bg:            #0b0f0d;
	--vn-bg-soft:       #0f1512;
	--vn-surface:       #121a16;
	--vn-surface-2:     #17211c;
	--vn-border:        #223026;
	/* Текст стал чуть ярче и нейтральнее — было слегка тускловато-зеленоватым
	   (#e7f3ec/#8ea89a), из-за чего основной текст и особенно приглушённый
	   (подписи, form-text) читались хуже на тёмном фоне, чем хотелось бы. */
	--vn-text:          #f5faf8;
	--vn-text-muted:    #a7c2b6;
	--vn-primary:       #22c55e;
	--vn-primary-dark:  #16a34a;
	--vn-primary-light: #4ade80;
	--vn-primary-soft:  rgba(34,197,94,.12);
	--vn-danger:        #f43f5e;
	--vn-warning:       #f59e0b;
	--vn-info:          #22d3ee;

	/* Единая шкала скруглений — раньше по файлам было вперемешку
	   8/9/11/12/16/17/18/20/22px без всякой системы. Теперь 4 шага:
	   xs (мелкие чипы/бейджи), sm (кнопки/инпуты), md (карточки/панели),
	   lg (крупные промо-блоки/hero). --vn-radius и --vn-radius-sm оставлены
	   как алиасы md/sm, чтобы не переписывать все существующие var(...). */
	--vn-radius-xs:     8px;
	--vn-radius-sm:     10px;
	--vn-radius-md:     14px;
	--vn-radius-lg:     18px;
	--vn-radius:        var(--vn-radius-md);

	/* Шкала теней — на тёмном фоне чистый чёрный drop-shadow почти не виден,
	   поэтому тени лёгкие и с приподнятым контрастом, плюс отдельный
	   "glow"-акцент primary-цветом для hover/выделенных состояний. */
	--vn-shadow-sm:     0 2px 8px rgba(0,0,0,.28);
	--vn-shadow-md:     0 10px 30px rgba(0,0,0,.35);
	--vn-shadow-lg:     0 20px 48px rgba(0,0,0,.42);
	--vn-shadow:        var(--vn-shadow-md);
	--vn-shadow-glow:   0 0 0 1px rgba(34,197,94,.15), 0 8px 24px rgba(34,197,94,.08);

	--vn-ease:          cubic-bezier(.2,.7,.3,1);
	--vn-focus-ring:     0 0 0 3px var(--vn-primary-soft);
}

/* ---------- Клавиатурная навигация: везде, где убираются нативные outline
   через !important-стили Metronic/Bootstrap, добавляем свой заметный
   focus-visible-контур primary-цветом, чтобы фокус не терялся. ---------- */
a:focus-visible,
button:focus-visible,
.btn:focus-visible,
.form-control:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
[tabindex]:focus-visible{
	outline: 2px solid var(--vn-primary-light) !important;
	outline-offset: 2px;
}

/* html — стоковый Bootstrap-ресет не красит сам <html>, из-за чего при
   резиновой раскладке (например .container с ограничением max-width на
   широких экранах) по краям окна был виден белый холст браузера ДО того,
   как под него подставляется body. body{margin:0} — на случай, если
   какой-то из подключаемых bundle-файлов переопределит стоковый сброс
   margin:0 у body (style.bundle.css уже это делает, но дублируем здесь
   явно, чтобы тёмная тема не зависела от порядка подключения файлов). */
html{
	background: var(--vn-bg) !important;
}
body{
	margin: 0 !important;
	background:
		radial-gradient(1100px 520px at 90% -8%, rgba(34,197,94,.10), transparent 60%),
		radial-gradient(900px 460px at -10% 10%, rgba(34,197,94,.06), transparent 55%),
		var(--vn-bg) !important;
	color: var(--vn-text) !important;
	font-family: 'Poppins', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;
}

::selection{ background: var(--vn-primary); color:#04150a; }

::-webkit-scrollbar{ width:10px; height:10px; }
::-webkit-scrollbar-track{ background: var(--vn-bg-soft); }
::-webkit-scrollbar-thumb{ background: #1f2c25; border-radius: 10px; border:2px solid var(--vn-bg-soft); }
::-webkit-scrollbar-thumb:hover{ background: var(--vn-primary-dark); }

a{ color: var(--vn-primary-light); }
/* ---------- Логотип в шапке/сайдбаре: не должен вылезать за границы
   узкой 260px-колонки. Раньше высота была зафиксирована (h-35px/h-30px),
   а ширина — нет: если загруженный логотип не квадратный (широкий
   wordmark), картинка растягивалась по пропорции и вылезала за правый
   край шапки/сайдбара. ---------- */
.header-logo{ overflow: hidden; max-width: 100%; }
.header-logo img{ max-width: 100% !important; width: auto; height: 32px; object-fit: contain; }
#kt_header_mobile img{ max-width: 60% !important; width: auto; height: auto; object-fit: contain; }

a:hover{ color: var(--vn-primary); }

/* ---------- Header / topbar ---------- */
.header{
	background: rgba(10,15,12,.72) !important;
	backdrop-filter: blur(14px) saturate(140%);
	-webkit-backdrop-filter: blur(14px) saturate(140%);
	border-bottom: 1px solid var(--vn-border) !important;
	box-shadow: none !important;
}
.header-fixed .header{ box-shadow: 0 1px 0 var(--vn-border) !important; }
.header-menu .menu-nav > .menu-item > .menu-link{
	color: var(--vn-text-muted) !important;
	border-radius: var(--vn-radius-sm);
	transition: all .18s ease;
}
.header-menu .menu-nav > .menu-item > .menu-link:hover,
.header-menu .menu-nav > .menu-item.menu-item-active > .menu-link,
.header-menu .menu-nav > .menu-item.menu-item-here > .menu-link{
	color: var(--vn-primary-light) !important;
	background: var(--vn-primary-soft) !important;
}
.header-menu .menu-nav > .menu-item > .menu-link .menu-text{ font-weight: 600; }
.menu-submenu{
	background: var(--vn-surface) !important;
	border: 1px solid var(--vn-border) !important;
	border-radius: var(--vn-radius) !important;
	box-shadow: var(--vn-shadow) !important;
}
.menu-submenu .menu-link:hover{ background: var(--vn-primary-soft) !important; color: var(--vn-primary-light) !important; }

/* Классические выпадающие подменю (пример: "Серверы" -> "Заказать сервер" /
   "Мои сервера" в шапке/сайдбаре личного кабинета, .menu-submenu-classic) —
   отдельно, БЕЗ привязки к брейкпоинту/классу body.vn-sidebar-nav, страховка
   на случай, если на конкретной ширине окна (между мобильным и десктопным
   сайдбар-режимом) сработает стоковый белый flyout Metronic вместо нашей
   вертикальной раскладки сайдбара. Без этой страховки на таких ширинах
   подменю всплывало белым прямоугольником со светлым текстом — то самое
   "серое"/"белое место" поверх тёмной панели.
   */
.menu-submenu.menu-submenu-classic{
	background: var(--vn-surface) !important;
	border: 1px solid var(--vn-border) !important;
	box-shadow: var(--vn-shadow) !important;
	border-radius: var(--vn-radius) !important;
}
.menu-submenu.menu-submenu-classic .menu-link{
	color: var(--vn-text-muted) !important;
}
.menu-submenu.menu-submenu-classic .menu-link:hover,
.menu-submenu.menu-submenu-classic .menu-item-here > .menu-link{
	background: var(--vn-primary-soft) !important;
	color: var(--vn-primary-light) !important;
}
.menu-submenu.menu-submenu-classic .menu-heading,
.menu-submenu.menu-submenu-classic .menu-heading .menu-text{
	color: var(--vn-text) !important;
}

.topbar .btn.btn-light,
a.btn.btn-light,
.btn-icon.btn-light{
	background: var(--vn-surface-2, #17211c) !important;
	color: var(--vn-text, #f5faf8) !important;
	border: 1px solid var(--vn-border, #223026) !important;
}
.btn.btn-light:hover,
a.btn.btn-light:hover,
.btn-icon.btn-light:hover,
.btn.btn-light:focus,
.btn.btn-light.active{
	background: var(--vn-primary-soft, #152018) !important;
	color: var(--vn-primary-light, #4ade80) !important;
	border-color: rgba(34,197,94,.35) !important;
}
.btn.btn-light i,
.btn.btn-light .svg-icon{
	color: inherit !important;
}
.accordion .card,
.accordion .card-header,
.accordion .card-body{
	background: var(--vn-surface, #121a16) !important;
	color: var(--vn-text, #f5faf8) !important;
	border-color: var(--vn-border, #223026) !important;
}
.breadcrumb{
	background: transparent !important;
}
.breadcrumb-item, .breadcrumb-item a{
	color: var(--vn-text-muted, #a7c2b6) !important;
}
.breadcrumb-item.active{
	color: var(--vn-text, #f5faf8) !important;
}
.list-group-item{
	background: var(--vn-surface, #121a16) !important;
	color: var(--vn-text, #f5faf8) !important;
	border-color: var(--vn-border, #223026) !important;
}
.badge-light{
	background: var(--vn-surface-2, #17211c) !important;
	color: var(--vn-text, #f5faf8) !important;
}
.popover{
	background: var(--vn-surface, #121a16) !important;
	border-color: var(--vn-border, #223026) !important;
	color: var(--vn-text, #f5faf8) !important;
}
.popover .popover-header{
	background: var(--vn-surface-2, #17211c) !important;
	color: var(--vn-text, #f5faf8) !important;
	border-color: var(--vn-border, #223026) !important;
}
.popover .arrow::after{
	border-top-color: var(--vn-surface, #121a16) !important;
}

.btn.btn-light-primary{
	background: var(--vn-primary-soft) !important;
	color: var(--vn-primary-light) !important;
	border: 1px solid rgba(34,197,94,.25) !important;
}
.topbar .btn.btn-light-primary:hover{
	background: var(--vn-primary) !important;
	color: #04150a !important;
}

/* ---------- Sidebar / aside (admin) ---------- */
.aside{
	background: linear-gradient(180deg, #0d130f 0%, #0a0f0c 100%) !important;
	border-right: 1px solid var(--vn-border) !important;
}
.aside-menu .menu-nav > .menu-item > .menu-link{
	color: var(--vn-text-muted) !important;
	border-radius: var(--vn-radius-sm);
	margin: 2px 8px;
}
.aside-menu .menu-nav > .menu-item > .menu-link i{ color: inherit !important; }
.aside-menu .menu-nav > .menu-item > .menu-link:hover,
.aside-menu .menu-nav > .menu-item.menu-item-active > .menu-link{
	color: #04150a !important;
	background: linear-gradient(90deg, var(--vn-primary), var(--vn-primary-dark)) !important;
	/* Своя, более приглушённая обводка вместо общей --vn-shadow-glow —
	   на активном пункте сайдбара её тонкое кольцо (0 0 0 1px) читалось
	   слишком ярко на фоне и так насыщенного зелёного градиента. */
	box-shadow: 0 0 0 1px rgba(34,197,94,.06), 0 4px 14px rgba(34,197,94,.05);
}
/* Стоковый Metronic красит .menu-text/.menu-icon/.menu-arrow активного пункта
   в свой зелёный (#0BB783, style.bundle.css) отдельным, более специфичным
   правилом на самих дочерних элементах — оно не перекрывается !important
   выше на .menu-link, потому что это разные элементы (унаследованный цвет
   родителя всегда проигрывает собственному правилу потомка, вне зависимости
   от !important). В итоге текст/иконка пункта оставались зелёными на новом
   ярко-зелёном фоне — то самое "белесое"/нечитаемое пятно вместо текста
   (репортилось на пункте "Уведомления"). Явно фиксируем тот же тёмный цвет,
   что и у самой ссылки. То же самое творилось и просто при наведении
   (:hover, без активного состояния — репортилось на пункте "Пользователи"):
   фон уже становился ярко-зелёным градиентом по правилу выше, а текст/иконка
   оставались светлыми — тот же самый нечитаемый случай, просто на другом
   триггере. Поэтому селекторы ниже покрывают оба состояния. */
.aside-menu .menu-nav > .menu-item > .menu-link:hover .menu-text,
.aside-menu .menu-nav > .menu-item > .menu-link:hover .menu-icon,
.aside-menu .menu-nav > .menu-item > .menu-link:hover .menu-arrow,
.aside-menu .menu-nav > .menu-item.menu-item-active > .menu-link .menu-text,
.aside-menu .menu-nav > .menu-item.menu-item-active > .menu-link .menu-icon,
.aside-menu .menu-nav > .menu-item.menu-item-active > .menu-link .menu-arrow{
	color: #04150a !important;
}
.aside-menu .menu-nav > .menu-item > .menu-link:hover .menu-bullet.menu-bullet-dot > span,
.aside-menu .menu-nav > .menu-item > .menu-link:hover .menu-bullet.menu-bullet-line > span,
.aside-menu .menu-nav > .menu-item.menu-item-active > .menu-link .menu-bullet.menu-bullet-dot > span,
.aside-menu .menu-nav > .menu-item.menu-item-active > .menu-link .menu-bullet.menu-bullet-line > span{
	background-color: #04150a !important;
}
.aside-menu .menu-nav > .menu-item.menu-item-open > .menu-link{
	background: var(--vn-primary-soft) !important;
	color: var(--vn-primary-light) !important;
}
.aside-menu .menu-submenu .menu-link:hover{ color: var(--vn-primary-light) !important; }
.brand{ background: transparent !important; border-bottom: 1px solid var(--vn-border) !important; }

/* Заголовки разделов меню ("Хостинг" / "Клиенты и поддержка" и т.п.) —
   стоковый Metronic красит их дефолтным сиренево-серым (--metronic-base-color),
   который не переопределялся нигде в теме, отсюда "сиреневые буквы". Берём
   акцентный зелёный приглушённого тона + разрядку букв и тонкий разделитель
   сверху (кроме самого первого раздела) — читаемо и в стиле бренда. */
.aside-menu .menu-nav > .menu-section{
	margin-top: 18px;
	padding-top: 14px;
	border-top: 1px solid var(--vn-border);
}
.aside-menu .menu-nav > .menu-section:first-child{
	margin-top: 4px;
	padding-top: 0;
	border-top: none;
}
.aside-menu .menu-nav > .menu-section .menu-text{
	color: var(--vn-primary-light) !important;
	opacity: .75;
	font-weight: 700 !important;
	font-size: .72rem !important;
	letter-spacing: .07em;
}
.aside-menu .menu-nav > .menu-section .menu-icon{ color: var(--vn-primary-light) !important; opacity: .4; }
/* Пункты подменю (второй уровень) — тем же приглушённым текстом, что и
   верхний уровень, вместо стокового светло-серого/белого. */
.aside-menu .menu-nav .menu-submenu .menu-link{
	color: var(--vn-text-muted) !important;
}
.aside-menu .menu-nav .menu-submenu .menu-item.menu-item-active > .menu-link,
.aside-menu .menu-nav .menu-submenu .menu-item .menu-link.active{
	color: var(--vn-primary-light) !important;
}
.aside-menu .menu-nav .menu-submenu .menu-link i{ color: inherit !important; opacity: .8; }
/* #kt_aside_menu несёт классы "aside-menu scroll" на ОДНОМ узле (см.
   admheader.php: <div id="kt_aside_menu" class="aside-menu my-4 scroll">),
   а не как предок/потомок — селектор с пробелом ниже никогда не совпадал
   с этим узлом, поэтому стоковый белый фон Metronic (.scroll{background:#fff})
   пробивался наружу под тёмной шапкой сайдбара админки. Добавлен вариант
   без пробела для случая "оба класса на одном элементе". */
.aside-menu.scroll,
.aside-menu .scroll{ background: transparent !important; }

/* ---------- Cards, surfaces ---------- */
.card, .card-custom{
	background: var(--vn-surface) !important;
	border: 1px solid var(--vn-border) !important;
	border-radius: var(--vn-radius) !important;
	box-shadow: var(--vn-shadow) !important;
}
.card-header{
	background: transparent !important;
	border-bottom: 1px solid var(--vn-border) !important;
}
.card-title, .card-label, h1, h2, h3, h4, h5, h6{ color: var(--vn-text) !important; }
.text-dark, .text-dark-75{ color: var(--vn-text) !important; }
.text-muted{ color: var(--vn-text-muted) !important; }
.separator{ border-color: var(--vn-border) !important; }
.bg-white{ background: var(--vn-surface) !important; }
.bg-light{ background: var(--vn-surface-2) !important; }
.bg-gray-100{ background: var(--vn-surface-2) !important; }

/* ---------- Buttons ---------- */
.btn.btn-primary, .btn.btn-success{
	background: linear-gradient(135deg, var(--vn-primary), var(--vn-primary-dark)) !important;
	border-color: transparent !important;
	color: #04150a !important;
	font-weight: 600;
	box-shadow: 0 6px 18px rgba(34,197,94,.25);
}
.btn.btn-primary:hover, .btn.btn-success:hover{
	filter: brightness(1.08);
	box-shadow: 0 10px 26px rgba(34,197,94,.35);
}
.btn.btn-light-primary{
	background: var(--vn-primary-soft) !important;
	color: var(--vn-primary-light) !important;
	border: 1px solid rgba(34,197,94,.25) !important;
}
.btn.btn-light-primary:hover{
	background: var(--vn-primary) !important;
	color: #04150a !important;
}
/* Остальные "мягкие" (light-*) кнопки Metronic — по умолчанию каждая имеет
   свой пастельный фон (жёлтый/красный/голубой/светло-серый), который на
   тёмной панели выглядел инородным светлым пятном (например плашка баланса
   "Молний" — btn-light-warning — оставалась кремовой). Тонируем все под
   тёмную поверхность темы, оставляя цветным только текст/иконку. */
.btn.btn-light-warning{
	background: rgba(245,158,11,.14) !important;
	color: var(--vn-warning, #f59e0b) !important;
	border: 1px solid rgba(245,158,11,.3) !important;
}
.btn.btn-light-warning:hover{
	background: var(--vn-warning, #f59e0b) !important;
	color: #241800 !important;
}
.btn.btn-light-danger{
	background: rgba(244,63,94,.14) !important;
	color: var(--vn-danger, #f43f5e) !important;
	border: 1px solid rgba(244,63,94,.3) !important;
}
.btn.btn-light-danger:hover{
	background: var(--vn-danger, #f43f5e) !important;
	color: #240610 !important;
}
.btn.btn-light-success{
	background: var(--vn-primary-soft) !important;
	color: var(--vn-primary-light) !important;
	border: 1px solid rgba(34,197,94,.25) !important;
}
.btn.btn-light-success:hover{
	background: var(--vn-primary) !important;
	color: #04150a !important;
}
.btn.btn-light-info{
	background: rgba(34,211,238,.14) !important;
	color: var(--vn-info, #22d3ee) !important;
	border: 1px solid rgba(34,211,238,.3) !important;
}
.btn.btn-light-info:hover{
	background: var(--vn-info, #22d3ee) !important;
	color: #001a1f !important;
}
.btn.btn-light-dark{
	background: var(--vn-surface-2, #17211c) !important;
	color: var(--vn-text, #f5faf8) !important;
	border: 1px solid var(--vn-border, #223026) !important;
}
.btn.btn-light-dark:hover{
	background: var(--vn-border, #223026) !important;
	color: var(--vn-text, #f5faf8) !important;
}
.btn.btn-outline-primary{
	border-color: var(--vn-primary) !important;
	color: var(--vn-primary-light) !important;
}
.btn{ border-radius: var(--vn-radius-sm) !important; }

/* ---------- Labels / badges ---------- */
.label-light-primary, .badge-light-primary{
	background: var(--vn-primary-soft) !important;
	color: var(--vn-primary-light) !important;
}
.label-primary, .badge-primary{
	background: var(--vn-primary) !important;
	color: #04150a !important;
}

/* ---------- Forms ---------- */
.form-control{
	background: var(--vn-surface-2) !important;
	border: 1px solid var(--vn-border) !important;
	color: var(--vn-text) !important;
	border-radius: var(--vn-radius-sm) !important;
}
.form-control:focus{
	background: var(--vn-surface-2) !important;
	border-color: var(--vn-primary) !important;
	color: var(--vn-text) !important;
	box-shadow: 0 0 0 3px var(--vn-primary-soft) !important;
}
.form-control::placeholder{ color: var(--vn-text-muted) !important; opacity:.8; }
.input-group-text{
	background: var(--vn-surface-2) !important;
	border: 1px solid var(--vn-border) !important;
	color: var(--vn-text-muted) !important;
}

/* ---------- Tables ---------- */
.table{ color: var(--vn-text) !important; }
.table thead th{
	color: var(--vn-text-muted) !important;
	border-bottom: 1px solid var(--vn-border) !important;
	font-weight: 600;
	text-transform: uppercase;
	font-size: .78rem;
	letter-spacing: .04em;
}
.table td, .table th{ border-color: var(--vn-border) !important; }
.table-hover tbody tr:hover{ background: var(--vn-primary-soft) !important; }

/* Единые статус-бейджи — используются в списках админки (пользователи,
   серверы, тикеты и т.д.) вместо стандартных светлых Bootstrap .badge-*,
   которые визуально выбивались из тёмной темы. */
.vn-badge{ font-size: .74rem; font-weight: 700; padding: 5px 12px; border-radius: 999px; display: inline-block; }
.vn-badge-success{ background: rgba(34,197,94,.15); color: var(--vn-primary-light, #4ade80); }
.vn-badge-info{ background: rgba(34,211,238,.15); color: #67e8f9; }
.vn-badge-warning{ background: rgba(250,204,21,.15); color: #facc15; }
.vn-badge-danger{ background: rgba(244,63,94,.15); color: #fb7185; }

/* ---------- Общая таблица со статус-бейджами (счета/пользователи и т.п.) ----------
   Изначально писалась только внутри account/invoices.php как локальный
   <style>, из-за чего повторное использование тех же классов на других
   страницах (admin/users/index.php) оставалось бы неоформленным. Вынесено
   сюда, чтобы работало одинаково на любой странице без копирования CSS. */
.vn-inv-table thead th{ color: var(--vn-text-muted, #8ea89a); text-transform: uppercase; font-size: .72rem; font-weight: 700; letter-spacing: .03em; border-bottom: 1px solid var(--vn-border, #223026); padding-top: 16px; padding-bottom: 12px; }
.vn-inv-table tbody td{ border-top: 1px solid var(--vn-border, #223026); padding-top: 16px; padding-bottom: 16px; vertical-align: middle; }
.vn-inv-table tbody tr:hover{ background: rgba(255,255,255,.02); }
.vn-inv-id{ color: #eafff2; font-weight: 700; }
.vn-inv-date{ color: var(--vn-text-muted, #8ea89a); font-size: .88rem; }
.vn-inv-amount{ color: #eafff2; font-weight: 700; }
.vn-inv-system{ color: var(--vn-primary-light, #4ade80); font-weight: 600; }
.vn-inv-badge{ display: inline-flex; align-items: center; gap: 6px; padding: 5px 12px; border-radius: 999px; font-size: .78rem; font-weight: 700; }
.vn-inv-badge-pending{ background: rgba(250,204,21,.14); color: #facc15; }
.vn-inv-badge-paid{ background: rgba(34,197,94,.14); color: var(--vn-primary-light, #4ade80); }
.vn-inv-badge-danger{ background: rgba(244,63,94,.14); color: #fb7185; }
.vn-inv-badge-info{ background: rgba(34,211,238,.14); color: #67e8f9; }
.vn-inv-print-btn{ background: var(--vn-surface-2, #17211c); border: 1px solid var(--vn-border, #223026); color: #eafff2; font-weight: 700; border-radius: 10px; }
.vn-inv-print-btn:hover{ background: var(--vn-surface, #121a16); color: #eafff2; }
.vn-clickable-row{ cursor: pointer; }

/* ---------- Общие поля форм (vn-form-label/vn-form-control) ----------
   Так же, как vn-inv-*, изначально существовали только как локальный
   <style> внутри отдельных страниц (tickets/create.php, account/perevod.php)
   — вынесено сюда, чтобы использовать где угодно (например, в модалках
   admin/users/index.php) без копирования CSS на каждую страницу. */
.vn-form-label{ color: #cfe6da; font-weight: 600; font-size: .85rem; margin-bottom: 6px; display: block; }
.vn-form-control{ background: rgba(255,255,255,.03); border: 1px solid var(--vn-border, #223026); color: #eafff2; border-radius: 10px; }
.vn-form-control:focus{ background: rgba(255,255,255,.05); border-color: var(--vn-primary-light, #4ade80); color: #eafff2; box-shadow: none; }
.vn-form-control:disabled{ opacity: .55; cursor: not-allowed; }
.custom-control-label{ color: var(--vn-text, #e7f3ec); font-size: .9rem; }
.custom-control-input:checked ~ .custom-control-label::before{ background-color: var(--vn-primary, #22c55e); border-color: var(--vn-primary, #22c55e); }
.custom-control-label::before{ background-color: var(--vn-surface-2, #17211c); border-color: var(--vn-border, #223026); }

/* ---------- Тумблеры (.switch, Metronic) — используются в настройках
   реферальной программы, рассылок, Telegram/VK-ботов, поддержки и т.д.
   Без переопределения трек всегда остаётся светло-серым (#EBEDF3 из
   style.bundle.css) независимо от состояния — светлое пятно на тёмном
   фоне почти в десятке форм админки. Один глобальный блок правит все сразу. */
.switch input:empty ~ span:before,
.switch.switch-primary:not(.switch-outline) input:empty ~ span:before,
.switch.switch-icon input:empty ~ span:before{
	background-color: var(--vn-surface-2, #17211c) !important;
	border: 1px solid var(--vn-border, #223026);
}
.switch input:checked ~ span:before,
.switch.switch-primary:not(.switch-outline) input:checked ~ span:before,
.switch.switch-icon input:checked ~ span:before{
	background-color: var(--vn-primary-soft, rgba(34,197,94,.18)) !important;
	border-color: var(--vn-primary, #22c55e);
}
.switch input:empty ~ span:after,
.switch.switch-primary:not(.switch-outline) input:empty ~ span:after,
.switch.switch-icon input:empty ~ span:after{
	background-color: var(--vn-text-muted, #8ea89a) !important;
	opacity: .8;
}
.switch input:checked ~ span:after,
.switch.switch-primary:not(.switch-outline) input:checked ~ span:after,
.switch.switch-icon input:checked ~ span:after{
	background-color: var(--vn-primary, #22c55e) !important;
	color: #04150a !important;
	opacity: 1;
}

/* ---------- Navi / dropdowns ---------- */
.navi .navi-item .navi-link:hover{ background: var(--vn-primary-soft) !important; }
.navi .navi-item .navi-link .navi-text{ color: var(--vn-text) !important; }
.dropdown-menu{
	background: var(--vn-surface) !important;
	border: 1px solid var(--vn-border) !important;
	box-shadow: var(--vn-shadow) !important;
}

/* ---------- Alerts ---------- */
.alert-light-primary{
	background: var(--vn-primary-soft) !important;
	color: var(--vn-primary-light) !important;
	border: 1px solid rgba(34,197,94,.25) !important;
}

/* ---------- Nav tabs ---------- */
.nav-tabs-line .nav-link.active{
	color: var(--vn-primary-light) !important;
}
.nav-tabs-line .nav-link.active:after{ background-color: var(--vn-primary) !important; }
.nav-tabs-line .nav-link:hover{ color: var(--vn-primary-light) !important; }

/* ---------- Footer ---------- */
.footer{
	background: transparent !important;
	border-top: 1px solid var(--vn-border) !important;
	color: var(--vn-text-muted) !important;
}
.footer a{ color: var(--vn-primary-light) !important; }

/* ---------- Login / auth pages ---------- */
.login.login-2 .login-aside{
	background: linear-gradient(160deg, #0a120d 0%, #08110c 60%, #061b10 100%) !important;
}
.login.login-2 .login-form .form-control{
	background: var(--vn-surface-2) !important;
	border-color: var(--vn-border) !important;
	color: var(--vn-text) !important;
}
.login.login-2 .login-signin,
.login.login-2 .login-signup,
.login.login-2 .login-forgot{ color: var(--vn-text) !important; }
.login.login-2 .btn.btn-primary{
	background: linear-gradient(135deg, var(--vn-primary), var(--vn-primary-dark)) !important;
}

/* ---------- Symbols / icons ---------- */
.symbol-label{ background: var(--vn-surface-2) !important; }
.svg-icon.svg-icon-primary svg g [fill]{ fill: var(--vn-primary) !important; }

/* ---------- Scroll-to-top / floating ---------- */
#kt_scrolltop{
	background: var(--vn-primary) !important;
}

/* ---------- Subtle entrance polish ---------- */
.card, .card-custom{ transition: transform .15s ease, box-shadow .15s ease; }
.card.card-custom:hover{ box-shadow: var(--vn-shadow), var(--vn-shadow-glow); }

/* ==== VN: kill Metronic lilac (info #8950fc) + dark modals ==== */
/* Metronic ships $info = #8950FC (lilac) and its tints #EEE5FF / #7337EE / #AB82FD.
   Those clash with the VoltNodes green/dark palette, so the whole "info"
   family is remapped onto the theme's cyan accent. */
.btn.btn-info,
.btn.btn-info:hover,
.btn.btn-info:focus{
	background: linear-gradient(135deg, var(--vn-info), #0e9bb5) !important;
	border-color: transparent !important;
	color: #04150a !important;
}

/* Bootstrap/Metronic красят рамку фокуса (клик/Tab по кнопке) и рамку
   disabled-состояния сиреневым (--primary Metronic = #8950FC, box-shadow
   focus ring — rgba(155,106,252,...)) — на любой кнопке в теме, включая
   "Войти" на странице входа. Гасим оба эффекта глобально, а не только у
   конкретных кнопок, зелёным свечением в тон бренду. */
.btn:focus,
.btn.focus,
.btn:not(:disabled):not(.disabled):active:focus,
.btn:not(:disabled):not(.disabled).active:focus,
.show > .btn.dropdown-toggle:focus{
	box-shadow: 0 0 0 3px var(--vn-primary-soft, rgba(34,197,94,.25)) !important;
}
.btn.btn-primary.disabled, .btn.btn-primary:disabled,
.btn.btn-success.disabled, .btn.btn-success:disabled{
	background: linear-gradient(135deg, var(--vn-primary, #22c55e), var(--vn-primary-dark, #16a34a)) !important;
	border-color: transparent !important;
	color: #04150a !important;
	opacity: .6;
}
.btn.btn-light-info,
.btn.btn-hover-light-info:hover{
	background: rgba(34,211,238,.12) !important;
	color: #67e8f9 !important;
	border: 1px solid rgba(34,211,238,.25) !important;
}
.btn.btn-outline-info{ border-color: var(--vn-info) !important; color: #67e8f9 !important; }
.text-info, .text-hover-info:hover, a.text-info:hover{ color: var(--vn-info) !important; }
.bg-info, .label.label-info, .badge.badge-info, .progress-bar.bg-info{
	background-color: var(--vn-info) !important;
	color: #04150a !important;
}
.bg-light-info,
.label.label-light-info,
.badge.badge-light-info,
.alert.alert-light-info,
.symbol.symbol-light-info .symbol-label{
	background-color: rgba(34,211,238,.12) !important;
	color: #67e8f9 !important;
	border-color: rgba(34,211,238,.25) !important;
}
.border-info{ border-color: var(--vn-info) !important; }
.svg-icon.svg-icon-info svg g [fill]{ fill: var(--vn-info) !important; }
.toast-info{ background-color: #0e7490 !important; }

/* ---------- Modals (were stock Bootstrap white on a dark page) ---------- */
.modal-content{
	background: var(--vn-surface) !important;
	border: 1px solid var(--vn-border) !important;
	border-radius: 18px !important;
	box-shadow: 0 24px 60px rgba(0,0,0,.55) !important;
	color: var(--vn-text) !important;
}
.modal-header{
	background: transparent !important;
	border-bottom: 1px solid var(--vn-border) !important;
	padding: 20px 24px !important;
}
.modal-title{ color: var(--vn-text) !important; font-weight: 700 !important; }
.modal-body{ background: transparent !important; color: var(--vn-text) !important; padding: 22px 24px !important; }
.modal-footer{
	background: transparent !important;
	border-top: 1px solid var(--vn-border) !important;
	padding: 16px 24px !important;
}
.modal-backdrop.show{ opacity: .72 !important; }
.modal-header .close{ color: var(--vn-text-muted) !important; opacity: 1 !important; text-shadow: none !important; }
.modal-header .close:hover{ color: var(--vn-primary-light) !important; }
.modal-content .form-control,
.modal-content select.form-control,
.modal-content textarea.form-control{
	background: var(--vn-surface-2) !important;
	border: 1px solid var(--vn-border) !important;
	color: var(--vn-text) !important;
}
.modal-content select.form-control option{ background: var(--vn-surface) !important; color: var(--vn-text) !important; }

/* ---------------------------------------------------------------------
   Каталог игр/тарифов на гостевой главной (account/login.php).
   Использует те же токены темы (--vn-*), что и остальная панель —
   новых цветов не вводим.
--------------------------------------------------------------------- */
.vn-catalog-section{
	position: relative;
	z-index: 1;
	padding: 56px 0 24px;
	border-top: 1px solid var(--vn-border);
}
.vn-catalog-head{ text-align: center; margin-bottom: 32px; }
.vn-catalog-title{
	color: var(--vn-text);
	font-weight: 800;
	font-size: 1.75rem;
	margin-bottom: 8px;
}
.vn-catalog-subtitle{ color: var(--vn-text-muted); font-size: 1rem; }
.vn-catalog-badge{
	display: inline-block;
	margin-left: 6px;
	padding: 2px 10px;
	border-radius: 999px;
	background: var(--vn-primary-soft);
	color: var(--vn-primary-light);
	font-size: .8rem;
	font-weight: 600;
	white-space: nowrap;
}
.vn-catalog-game{ margin-bottom: 34px; }
.vn-catalog-game-head{
	display: flex;
	align-items: center;
	gap: 12px;
	margin-bottom: 16px;
}
.vn-catalog-game-img{
	width: 40px;
	height: 40px;
	object-fit: cover;
	border-radius: 10px;
	border: 1px solid var(--vn-border);
}
.vn-catalog-game-name{ color: var(--vn-text); font-weight: 700; font-size: 1.25rem; margin: 0; }
.vn-catalog-tariffs{
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
	gap: 16px;
}
.vn-catalog-tariff-card{
	position: relative;
	background: var(--vn-surface);
	border: 1px solid var(--vn-border);
	border-radius: var(--vn-radius);
	padding: 18px;
	box-shadow: var(--vn-shadow);
	transition: transform .15s ease, box-shadow .15s ease, border-color .15s ease;
}
.vn-catalog-tariff-card:hover{
	transform: translateY(-2px);
	border-color: var(--vn-primary-dark);
	box-shadow: var(--vn-shadow-glow);
}
.vn-catalog-tariff-promo{ border-color: var(--vn-primary); }
.vn-catalog-promo-badge{
	position: absolute;
	top: -10px;
	right: 14px;
	background: var(--vn-primary);
	color: #04150a;
	font-size: .72rem;
	font-weight: 800;
	text-transform: uppercase;
	padding: 3px 10px;
	border-radius: 999px;
}
.vn-catalog-tariff-name{ color: var(--vn-text); font-weight: 700; font-size: 1.05rem; margin-bottom: 10px; }
.vn-catalog-tariff-specs{ list-style: none; padding: 0; margin: 0 0 12px; }
.vn-catalog-tariff-specs li{
	color: var(--vn-text-muted);
	font-size: .9rem;
	padding: 3px 0;
}
.vn-catalog-tariff-specs li b{ color: var(--vn-text); }
.vn-catalog-tariff-price{ color: var(--vn-primary-light); font-weight: 800; font-size: 1.15rem; }
.vn-catalog-tariff-note{ color: var(--vn-text-muted); font-size: .78rem; margin-bottom: 12px; }
.vn-catalog-tariff-btn{ margin-top: 4px; }

/* ==========================================================================
   Cart, news, order-page headers, and public stats — redesign pass extending
   the palette/tokens defined above. Kept additive so nothing already shipped
   (login form, catalog cards) is touched or risks regressing.
   ========================================================================== */

/* ---------- shared "order-style" page hero (order.php / ordertariff.php / cart / newsfeed) ---------- */
.vn-order-hero{ margin-bottom: 28px; }
.vn-order-title{
	color: var(--vn-text);
	font-weight: 800;
	font-size: 1.9rem;
	margin-bottom: 8px;
	letter-spacing: -.01em;
}
.vn-order-subtitle{ color: var(--vn-text-muted); font-size: 1rem; margin-bottom: 4px; }
.vn-order-subtitle a{ color: var(--vn-primary-light); font-weight: 600; }
.vn-order-subtitle a:hover{ color: var(--vn-primary); }

/* Кнопка "+ Заказать сервер" / "Заказать первый сервер" (servers/index.php,
   account/bonus.php, account/pay.php) — класс использовался в разметке уже
   давно, но стиля для него нигде не было объявлено, поэтому Bootstrap
   рендерил голый .btn без модификатора цвета: почти невидимый серый текст
   без фона (см. скриншот — кнопка терялась на тёмном фоне карточки).
   Оформляем в той же зелёной палитре, что и .btn.btn-primary выше, чтобы
   не плодить второй визуальный язык кнопок в панели. */
.btn.vn-order-btn{
	background: linear-gradient(135deg, var(--vn-primary), var(--vn-primary-dark));
	border: none;
	color: #04150a;
	font-weight: 700;
	padding: 11px 22px;
	border-radius: 10px;
	box-shadow: 0 6px 18px rgba(34,197,94,.28);
	transition: transform .15s ease, box-shadow .15s ease, filter .15s ease;
	white-space: nowrap;
}
.btn.vn-order-btn:hover{
	color: #04150a;
	filter: brightness(1.08);
	box-shadow: 0 10px 26px rgba(34,197,94,.4);
	transform: translateY(-1px);
}
.btn.vn-order-btn:active{ transform: translateY(0); filter: brightness(.97); }
.btn.vn-order-btn:focus{ color: #04150a; }
.vn-hint{ color: var(--vn-text-muted); font-size: .82rem; }

/* Вложенная суб-карточка внутри .card-custom (servers/domains.php — один
   домен внутри вкладки "Мои домены"). Раньше переиспользовала класс
   .vn-order-card, а он нигде не объявлен (реальный стиль карточек даёт
   .card/.card-custom) — блок рендерился голым, без фона, только с инлайн-
   бордером, из-за чего вкладка выглядела "кривой" на фоне остальной панели.
   Даём лёгкий тональный фон на ступень темнее родительской карточки, чтобы
   домены визуально отделялись друг от друга. */
.vn-order-subcard{
	background: var(--vn-surface-2) !important;
	border: 1px solid var(--vn-border) !important;
	border-radius: var(--vn-radius) !important;
	padding: 16px;
}

/* ---------- cart icon + badge (header / loginheader topbar) ---------- */
.vn-cart-link{
	position: relative;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	color: var(--vn-text-muted);
	font-size: 1.15rem;
	width: 40px;
	height: 40px;
	border-radius: 999px;
	transition: color .15s ease, background .15s ease;
}
.vn-cart-link:hover{ color: var(--vn-primary-light); background: var(--vn-primary-soft); }
.vn-cart-badge{
	position: absolute;
	top: -2px;
	right: -2px;
	min-width: 18px;
	height: 18px;
	padding: 0 4px;
	border-radius: 999px;
	background: var(--vn-primary);
	color: #04150a;
	font-size: .68rem;
	font-weight: 800;
	line-height: 18px;
	text-align: center;
	opacity: 0;
	transform: scale(.6);
	transition: opacity .15s ease, transform .15s ease;
}
.vn-cart-badge.is-visible{ opacity: 1; transform: scale(1); }

/* ==========================================================================
   Современные иконки топбара (тикеты/быстрые действия/профиль). Раньше
   это были громоздкие инлайновые SVG с зашитым чёрным fill="#000000" —
   цвет иконки не менялся вместе с темой кнопки и на зелёном/тёмном фоне
   смотрелся чужеродно. Заменены на Font Awesome <i>, как и иконка корзины
   (fa-shopping-cart) — теперь цвет наследуется от кнопки (currentColor),
   иконки лёгкие и всегда совпадают по стилю с остальной панелью.
   ========================================================================== */
.topbar .btn.btn-icon.btn-circle{
	transition: transform .15s ease, background .15s ease, color .15s ease, box-shadow .15s ease;
}
.topbar .btn.btn-icon.btn-circle i{
	font-size: 1.05rem;
	line-height: 1;
}
.topbar .btn.btn-icon.btn-circle:hover{
	transform: translateY(-1px);
	box-shadow: 0 4px 14px rgba(34,197,94,.18);
}

/* ---------- "В корзину" secondary CTA on catalog tariff cards ---------- */
.vn-catalog-cart-btn{ margin-top: 8px; font-size: .82rem; }

/* ---------- cart page ---------- */
.vn-cart-empty{
	text-align: center;
	padding: 64px 20px;
	color: var(--vn-text-muted);
}
.vn-cart-empty i{ font-size: 2.4rem; color: var(--vn-primary-dark); margin-bottom: 14px; display: block; }
.vn-cart-empty a{ color: var(--vn-primary-light); font-weight: 600; }

.vn-cart-list{ display: flex; flex-direction: column; gap: 12px; }
.vn-cart-row{
	position: relative;
	display: flex;
	align-items: center;
	gap: 16px;
	background: var(--vn-surface);
	border: 1px solid var(--vn-border);
	border-radius: var(--vn-radius);
	padding: 16px 44px 16px 18px;
	box-shadow: var(--vn-shadow-sm);
	transition: border-color .15s var(--vn-ease), box-shadow .15s var(--vn-ease), transform .15s var(--vn-ease);
}
.vn-cart-row:hover{ border-color: var(--vn-primary-dark); box-shadow: var(--vn-shadow-glow), var(--vn-shadow-sm); transform: translateY(-1px); }
.vn-cart-row-main{ flex: 1; min-width: 0; }
.vn-cart-row-name{ color: var(--vn-text); font-weight: 700; font-size: 1rem; margin-bottom: 4px; }
.vn-catalog-promo-badge-inline{
	position: static;
	display: inline-block;
	margin-left: 8px;
	padding: 2px 8px;
	font-size: .62rem;
	vertical-align: middle;
}
.vn-cart-row-specs{ display: flex; flex-wrap: wrap; gap: 12px; color: var(--vn-text-muted); font-size: .84rem; }
.vn-cart-row-qty{ color: var(--vn-primary-light); font-weight: 700; }
.vn-cart-row-price{ color: var(--vn-primary-light); font-weight: 800; font-size: 1.05rem; white-space: nowrap; }
.vn-cart-remove{
	position: absolute;
	top: 10px;
	right: 10px;
	width: 26px;
	height: 26px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	border: none;
	border-radius: 999px;
	background: transparent;
	color: var(--vn-text-muted);
	transition: color .15s ease, background .15s ease;
}
.vn-cart-remove:hover{ color: var(--vn-danger); background: rgba(244,63,94,.12); }

/* Степпер количества прямо в строке корзины (servers/cart.php) — заменил
   статичный "× N" (.vn-cart-row-qty оставлен в разметке других мест, где
   применим — здесь просто больше не используется). */
.vn-cart-qty-stepper{ display: inline-flex; align-items: center; gap: 10px; margin-top: 10px; }
.vn-cart-qty-btn{
	width: 26px; height: 26px;
	display: inline-flex; align-items: center; justify-content: center;
	border: 1px solid var(--vn-border);
	border-radius: 8px;
	background: var(--vn-surface-2);
	color: var(--vn-text);
	font-weight: 700;
	font-size: .95rem;
	line-height: 1;
	transition: border-color .15s ease, color .15s ease;
}
.vn-cart-qty-btn:hover{ border-color: var(--vn-primary-light); color: var(--vn-primary-light); }
.vn-cart-qty-value{ min-width: 20px; text-align: center; color: var(--vn-text); font-weight: 700; }
.vn-cart-clear-link{
	display: inline-flex; align-items: center; gap: 6px;
	margin-top: 12px;
	background: none; border: none;
	color: var(--vn-text-muted);
	font-size: .82rem;
	transition: color .15s ease;
}
.vn-cart-clear-link:hover{ color: var(--vn-danger); }

.vn-cart-summary{
	position: sticky;
	top: 20px;
	background: var(--vn-surface);
	border: 1px solid var(--vn-border);
	border-radius: var(--vn-radius);
	padding: 22px;
	box-shadow: var(--vn-shadow);
}
.vn-cart-summary h3{ color: var(--vn-text); font-weight: 800; font-size: 1.15rem; margin-bottom: 16px; }
.vn-cart-summary-row{
	display: flex;
	justify-content: space-between;
	color: var(--vn-text-muted);
	font-size: .9rem;
	padding: 6px 0;
}
.vn-cart-summary-discount{ color: var(--vn-primary-light); }
.vn-cart-summary-total{
	border-top: 1px solid var(--vn-border);
	margin-top: 6px;
	padding-top: 12px;
	color: var(--vn-text);
	font-weight: 800;
	font-size: 1.15rem;
}
.vn-cart-summary .vn-auth-btn{ margin-top: 16px; }
.vn-cart-summary .vn-hint{ margin-top: 10px; display: block; }

/* ---------- news teaser (public homepage) + full public news pages ---------- */
.vn-news-teaser-section{ padding-top: 24px; }
.vn-news-grid{
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
	gap: 18px;
}
.vn-news-card{
	display: block;
	background: var(--vn-surface);
	border: 1px solid var(--vn-border);
	border-radius: var(--vn-radius);
	padding: 20px;
	text-decoration: none;
	transition: transform .15s ease, box-shadow .15s ease, border-color .15s ease;
}
.vn-news-card:hover{
	transform: translateY(-3px);
	border-color: var(--vn-primary-dark);
	box-shadow: var(--vn-shadow-glow);
	text-decoration: none;
}
.vn-news-card-date{ color: var(--vn-text-muted); font-size: .78rem; margin-bottom: 8px; letter-spacing: .02em; }
.vn-news-card-title{ color: var(--vn-text); font-weight: 700; font-size: 1.05rem; margin-bottom: 8px; }
.vn-news-card-excerpt{ color: var(--vn-text-muted); font-size: .88rem; margin-bottom: 10px; }
.vn-news-card-more{ color: var(--vn-primary-light); font-weight: 600; font-size: .84rem; }
.vn-news-pagination{ margin-top: 24px; text-align: center; }

.vn-news-article{ max-width: 760px; }
.vn-news-article-date{ color: var(--vn-text-muted); font-size: .84rem; margin: 10px 0 6px; }
.vn-news-article-body{ color: var(--vn-text); font-size: 1rem; line-height: 1.7; margin-top: 14px; }
.vn-news-cta{
	margin-top: 32px;
	padding: 20px;
	background: var(--vn-primary-soft);
	border: 1px solid var(--vn-border);
	border-radius: var(--vn-radius);
}
.vn-news-cta p{ color: var(--vn-text-muted); margin-bottom: 12px; }

/* ---------- subtle entrance animation for above-the-fold sections (CSS-only) ---------- */
@keyframes vnFadeUp{
	from{ opacity: 0; transform: translateY(14px); }
	to{ opacity: 1; transform: translateY(0); }
}
.vn-catalog-section, .vn-cart-list, .vn-news-grid{
	animation: vnFadeUp .5s ease both;
}
.vn-catalog-tariff-card, .vn-news-card{
	will-change: transform;
}

/* ---------- responsive ---------- */
@media (max-width: 991.98px){
	.vn-cart-summary{ position: static; margin-top: 20px; }
}
@media (max-width: 575.98px){
	.vn-cart-row{ flex-wrap: wrap; padding: 16px 40px 16px 16px; }
	.vn-cart-row-price{ width: 100%; text-align: left; }
	.vn-news-grid{ grid-template-columns: 1fr; }
	.vn-order-title{ font-size: 1.5rem; }
}

/* ---------- Раздел: витрина — бейдж локаций игры (checkout task, секция 4) ---------- */
.vn-catalog-game-locbadge{ margin-left: 10px; vertical-align: middle; }
.vn-loc-multi{ position: relative; cursor: help; }
.vn-loc-tooltip{
	display: none;
	position: absolute;
	top: 130%;
	left: 0;
	z-index: 20;
	background: var(--vn-card-bg, #1b1f2a);
	border: 1px solid var(--vn-border, rgba(255,255,255,.12));
	border-radius: 10px;
	padding: 8px 12px;
	min-width: 160px;
	box-shadow: 0 8px 24px rgba(0,0,0,.35);
}
.vn-loc-multi:hover .vn-loc-tooltip,
.vn-loc-multi:focus .vn-loc-tooltip{ display: block; }
.vn-loc-tooltip-item{ display: block; white-space: nowrap; color: var(--vn-text); font-size: .82rem; padding: 2px 0; }

/* ---------- Раздел: карточка "Оформление заказа" (checkout task, секция 1) ---------- */
.vn-checkout-card{
	position: relative;
	border-radius: 16px;
	padding: 24px;
}
.vn-checkout-head{
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 12px;
	flex-wrap: wrap;
	padding-bottom: 18px;
	margin-bottom: 20px;
	border-bottom: 1px solid var(--vn-border, rgba(255,255,255,.1));
}
.vn-checkout-eyebrow{
	display: inline-block;
	font-size: .72rem;
	font-weight: 800;
	letter-spacing: .08em;
	color: var(--vn-primary-light);
	background: var(--vn-primary-soft);
	padding: 3px 10px;
	border-radius: 999px;
	margin-bottom: 10px;
}
.vn-checkout-title{ color: var(--vn-text); font-weight: 800; font-size: 1.3rem; margin-bottom: 4px; }
.vn-checkout-resources{ color: var(--vn-text-muted); font-size: .9rem; margin-bottom: 0; }
.vn-checkout-price-badge{
	background: var(--vn-primary-soft);
	color: var(--vn-primary-light);
	font-weight: 800;
	font-size: 1.05rem;
	padding: 8px 16px;
	border-radius: 999px;
	white-space: nowrap;
	flex-shrink: 0;
}
.vn-checkout-section-title{
	color: var(--vn-text);
	font-weight: 800;
	font-size: .82rem;
	text-transform: uppercase;
	letter-spacing: .04em;
	margin: 22px 0 12px;
}
.vn-checkout-section-title:first-of-type{ margin-top: 0; }
.vn-checkout-section-optional{
	color: var(--vn-text-muted);
	font-weight: 500;
	text-transform: none;
	letter-spacing: 0;
	font-size: .78rem;
	margin-left: 6px;
}
.vn-checkout-field{ margin-bottom: 18px; }
.vn-checkout-field label{ color: var(--vn-text); font-weight: 600; font-size: .92rem; margin-bottom: 6px; display: block; }
.vn-checkout-field .vn-hint{ display: block; margin-top: 6px; color: var(--vn-text-muted); font-size: .8rem; }
.vn-checkout-option{
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 13px 16px;
	background: rgba(255,255,255,.02);
	border: 1px solid var(--vn-border, rgba(255,255,255,.1));
	border-radius: 10px;
	margin-bottom: 10px;
	transition: border-color .15s ease, background .15s ease;
	cursor: pointer;
}
.vn-checkout-option:hover{ border-color: var(--vn-primary-dark, rgba(34,197,94,.4)); }
.vn-checkout-option input[type=checkbox]{
	flex-shrink: 0;
	width: 19px;
	height: 19px;
	margin: 0;
	accent-color: var(--vn-primary, #22c55e);
	cursor: pointer;
}
.vn-checkout-option label{ color: var(--vn-text); font-size: .88rem; line-height: 1.4; margin: 0; cursor: pointer; display: flex; flex: 1; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.vn-checkout-option a{ color: var(--vn-primary-light); text-decoration: underline; }
.vn-checkout-option-name{ color: var(--vn-text); }
.vn-checkout-option-price{ color: var(--vn-primary-light); font-weight: 700; font-size: .82rem; white-space: nowrap; }
.vn-checkout-option:has(input:checked){ border-color: var(--vn-primary, #22c55e); background: var(--vn-primary-soft, rgba(34,197,94,.08)); }
.vn-checkout-option.vn-checkout-required label{ justify-content: flex-start; }
.vn-checkout-option.vn-checkout-option-error{ border-color: #f43f5e !important; background: rgba(244,63,94,.08) !important; animation: vnCheckoutShake .4s ease; }
@keyframes vnCheckoutShake{
	0%, 100%{ transform: translateX(0); }
	25%{ transform: translateX(-4px); }
	75%{ transform: translateX(4px); }
}
.vn-checkout-actions{ display: flex; gap: 10px; margin-top: 18px; }
.vn-checkout-actions .btn{ flex: 1; padding-top: 12px; padding-bottom: 12px; font-weight: 700; }
.vn-checkout-cancel-link{ color: var(--vn-text-muted); text-decoration: underline; }
.vn-checkout-cancel-link:hover{ color: var(--vn-text); }
.vn-location-picker{ margin-bottom: 18px; }
.vn-location-picker label.vn-location-title{ color: var(--vn-text); font-weight: 600; font-size: .92rem; margin-bottom: 8px; display: block; }
.vn-location-options{ display: flex; flex-wrap: wrap; gap: 8px; }
.vn-location-opt{
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 7px 14px;
	border-radius: 999px;
	border: 1px solid var(--vn-border, rgba(255,255,255,.14));
	color: var(--vn-text-muted);
	font-size: .85rem;
	cursor: pointer;
	transition: all .15s ease;
}
.vn-location-opt input{ display: none; }
.vn-location-opt.vn-location-opt-active{ border-color: var(--vn-primary); color: var(--vn-primary-light); background: var(--vn-primary-soft); }

/* ---------- Раздел: доп. квоты (порты/бэкапы/базы данных) на форме заказа ---------- */
.vn-quota-selector{ margin-bottom: 18px; padding: 16px; background: rgba(255,255,255,.02); border: 1px solid var(--vn-border, rgba(255,255,255,.1)); border-radius: 10px; }
.vn-quota-selector-row{ display: flex; align-items: center; justify-content: space-between; padding: 9px 0; color: var(--vn-text); font-size: .88rem; }
.vn-quota-selector-row + .vn-quota-selector-row{ border-top: 1px solid var(--vn-border, rgba(255,255,255,.08)); }
.vn-quota-price{ color: var(--vn-text-muted); font-size: .8rem; margin-left: 4px; }
.vn-qty-stepper{ display: flex; align-items: center; gap: 0; border: 1px solid var(--vn-border, rgba(255,255,255,.14)); border-radius: 8px; overflow: hidden; }
.vn-qty-btn{ width: 32px; height: 32px; border: none; background: rgba(255,255,255,.03); color: var(--vn-text); cursor: pointer; font-size: 1.1rem; line-height: 1; transition: background .15s ease, color .15s ease; }
.vn-qty-btn:hover{ background: var(--vn-primary-soft); color: var(--vn-primary-light); }
.vn-qty-stepper input{ width: 38px; text-align: center; background: transparent; border: none; border-left: 1px solid var(--vn-border, rgba(255,255,255,.14)); border-right: 1px solid var(--vn-border, rgba(255,255,255,.14)); color: var(--vn-text); font-weight: 700; height: 32px; }

/* ---------- Раздел: оценка поддержки и чаевые (checkout task, секция 2) ---------- */
.vn-support-rate-block{
	margin-top: 20px;
	padding: 16px 18px;
	border-radius: 12px;
	border: 1px solid var(--vn-border, rgba(255,255,255,.1));
}
.vn-support-rate-status{ color: var(--vn-text); font-size: .9rem; margin-bottom: 4px; }
.vn-support-rate-status b{ color: var(--vn-primary-light); }
.vn-support-rate-hint{ color: var(--vn-text-muted); font-size: .78rem; margin-bottom: 12px; }
.vn-support-rate-btns{ display: flex; gap: 8px; flex-wrap: wrap; }
.vn-support-rate-btn{
	padding: 8px 16px;
	border-radius: 8px;
	border: 1px solid var(--vn-border, rgba(255,255,255,.14));
	background: transparent;
	color: var(--vn-text);
	font-weight: 600;
	font-size: .85rem;
	cursor: pointer;
}
.vn-support-rate-btn.vn-rate-active{ border-color: var(--vn-primary); color: var(--vn-primary-light); background: var(--vn-primary-soft); }
.vn-support-rate-btn:disabled{ opacity: .5; cursor: not-allowed; }

.vn-tip-block{
	margin-top: 16px;
	padding: 16px 18px;
	border-radius: 12px;
	border: 1px solid var(--vn-border, rgba(255,255,255,.1));
}
.vn-tip-title{ color: var(--vn-text); font-weight: 700; font-size: .95rem; margin-bottom: 10px; }
.vn-tip-amounts{ display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
.vn-tip-amount-btn{
	padding: 7px 14px;
	border-radius: 999px;
	border: 1px solid var(--vn-border, rgba(255,255,255,.14));
	background: transparent;
	color: var(--vn-text);
	font-weight: 600;
	font-size: .85rem;
	cursor: pointer;
}
.vn-tip-amount-btn.vn-tip-amount-active{ border-color: var(--vn-primary); color: var(--vn-primary-light); background: var(--vn-primary-soft); }
.vn-tip-custom{ margin-bottom: 12px; }
.vn-tip-source{ display: flex; gap: 8px; margin-bottom: 12px; }
.vn-tip-source-btn{
	flex: 1;
	padding: 8px 10px;
	border-radius: 8px;
	border: 1px solid var(--vn-border, rgba(255,255,255,.14));
	background: transparent;
	color: var(--vn-text);
	font-weight: 600;
	font-size: .82rem;
	cursor: pointer;
}
.vn-tip-source-btn.vn-tip-source-active{ border-color: var(--vn-primary); color: var(--vn-primary-light); background: var(--vn-primary-soft); }

.vn-reopen-block{ margin-top: 16px; }
.vn-reopen-block textarea{ width: 100%; margin-bottom: 8px; }
.vn-reopen-actions{ display: flex; gap: 8px; }

/* ==========================================================================
   Глобальная зачистка сиреневого/фиолетового цвета Metronic по всей панели.
   Стоковая тема Keenthemes использует цвет "info" = #8950FC (фиолетовый/
   индиго) на десятках стандартных элементов (иконки топбара, аватар без
   фото, значки-бейджи, ссылки certain, элементы форм) — почти нигде в наших
   собственных .php/.css он явно не упоминается, он просто наследуется из
   style.bundle.css. Раньше это лечилось точечно (только на странице входа/
   лендинге), но фиолетовый вылезает точно так же в личном кабинете и в
   админке. Правим централизованно здесь (грузится и в header.php, и в
   admheader.php, и на auth/home страницах), а не в десятке разных мест.
   ========================================================================== */
.btn.btn-info,
.btn.btn-outline-info:hover,
.symbol.symbol-info > .symbol-label,
.bg-info{
	background: var(--vn-primary) !important;
	color: #04150a !important;
	border-color: var(--vn-primary) !important;
}
.btn.btn-light-info,
.symbol-light-info .symbol-label,
.symbol.symbol-light-info > .symbol-label{
	background: var(--vn-primary-soft) !important;
	color: var(--vn-primary-light) !important;
}
.btn.btn-light-info:hover{
	background: var(--vn-primary) !important;
	color: #04150a !important;
}
.btn.btn-hover-info:hover,
.btn.btn-hover-light-info:hover{
	background: var(--vn-primary-soft) !important;
	color: var(--vn-primary-light) !important;
}
.btn.btn-outline-info{
	border-color: var(--vn-primary) !important;
	color: var(--vn-primary-light) !important;
}
.text-info{ color: var(--vn-primary-light) !important; }
.border-info{ border-color: var(--vn-primary) !important; }
.badge.badge-info,
.label.label-info{
	background: var(--vn-primary) !important;
	color: #04150a !important;
}
.badge.badge-light-info,
.label.label-light-info{
	background: var(--vn-primary-soft) !important;
	color: var(--vn-primary-light) !important;
}
.pulse.pulse-info .pulse-ring,
.pulse.pulse-primary .pulse-ring,
.pulse-ring{ border-color: var(--vn-primary) !important; }
/* Иконка профиля в топбаре (#kt_quick_user_toggle) — max-специфичность
   ID-селектором поверх .btn-light-primary на случай конфликта каскада. */
#kt_quick_user_toggle.btn-light-primary{
	background: var(--vn-primary-soft, rgba(34,197,94,.12)) !important;
	color: var(--vn-primary-light, #4ade80) !important;
}
a.text-info:hover, a.text-info:focus{ color: var(--vn-primary) !important; }
/* стандартный аватар пользователя без фото — часто фиолетовый градиент */
.symbol.symbol-circle .symbol-label[style*="8950FC"],
.symbol.symbol-circle .symbol-label[style*="8950fc"]{
	background: var(--vn-primary-soft) !important;
	color: var(--vn-primary-light) !important;
}

/* ==========================================================================
   Личный кабинет: боковое (вертикальное) меню вместо горизонтального.
   Область действия — ТОЛЬКО body.vn-sidebar-nav (личный кабинет, задаётся в
   common/header.php), админку это не трогает (она пока на прежней
   горизонтальной вёрстке). Работает только от 992px и шире — на мобильном
   разрешении оставлена штатная мобильная шапка/бургер-меню Metronic как
   есть (это уже рабочий и проверенный код, трогать его лишний риск).
   Раскрывающиеся группы меню полностью переведены на свой accordion
   (data-vn-toggle в разметке + простой jQuery-обработчик в
   common/header.php) — стоковый плагин меню Metronic (KTMenu) их больше не
   видит и не трогает, поэтому подменю всегда разворачивается вниз внутри
   сайдбара, а не всплывает сбоку абсолютным позиционированием.
   ========================================================================== */
@media (min-width: 992px){
	body.vn-sidebar-nav #kt_wrapper{ margin-left: 260px; }
	body.vn-sidebar-nav #kt_header{
		position: fixed;
		left: 0;
		top: 0;
		bottom: 0;
		width: 260px;
		height: 100vh;
		z-index: 100;
		display: flex;
		flex-direction: column;
		overflow-y: auto;
		background: var(--vn-surface, #121a16);
		border-right: 1px solid var(--vn-border, #223026);
		border-bottom: none;
	}
	body.vn-sidebar-nav #kt_header > .container{
		flex-direction: column;
		align-items: stretch;
		max-width: none;
		width: 100%;
		height: auto;
		min-height: 100%;
		padding: 0;
		display: flex;
	}
	body.vn-sidebar-nav #kt_header .header-logo{
		padding: 22px 20px 14px;
		margin-right: 0 !important;
		display: flex !important;
	}
	body.vn-sidebar-nav #kt_header .header-menu-wrapper{
		flex-direction: column;
		align-items: stretch;
		width: 100%;
	}
	body.vn-sidebar-nav #kt_header_menu{ width: 100%; }
	body.vn-sidebar-nav #kt_header .vn-nav{
		flex-direction: column;
		width: 100%;
	}
	body.vn-sidebar-nav #kt_header .vn-nav > .vn-nav-item{
		width: 100%;
		margin: 0;
	}
	body.vn-sidebar-nav #kt_header .vn-nav > .vn-nav-item > .vn-nav-link{
		padding: 12px 20px;
		width: 100%;
	}
	/* Меню сайдбара ("Серверы", "Поддержка", "Партнёр", "Финансы")
	   пересобрано с нуля на классах vn-nav-* — ни один класс тут не
	   пересекается с тем, что ищет плагин меню Metronic (KTMenu: .menu-item,
	   .menu-link, .menu-toggle, .menu-item-submenu, .menu-submenu,
	   .menu-item-hover, .menu-item-open и т.п., см. common/header.php).
	   Плагину физически нечего найти внутри #kt_header_menu — значит,
	   никакого стороннего hover/accordion/dropdown поведения он сюда больше
	   добавить не может, что бы ни происходило в scripts.bundle.js. Свой
	   accordion — простой jQuery-обработчик клика (см. common/header.php),
	   раскрытие вниз по высоте (max-height + opacity, без анимации margin —
	   не толкает соседние пункты рывками). */
	body.vn-sidebar-nav #kt_header .vn-nav-group > .vn-nav-sub{
		position: static !important;
		display: block !important;
		box-shadow: none !important;
		width: 100% !important;
		min-width: 0 !important;
		margin: 6px 0 0 !important;
		padding: 0 !important;
		background: rgba(255,255,255,.03);
		border: 1px solid rgba(74,222,128,.10);
		border-radius: var(--vn-radius-sm, 10px);
		overflow: hidden;
		max-height: 0;
		opacity: 0;
		list-style: none;
		transition: max-height .25s ease, opacity .18s ease, margin .25s ease, border-color .18s ease;
	}
	body.vn-sidebar-nav #kt_header .vn-nav-group.vn-open > .vn-nav-sub{
		max-height: 600px;
		opacity: 1;
		padding: 6px 0 !important;
		border-color: rgba(74,222,128,.22);
	}
	/* Пункты внутри раскрытой группы: без иконок (место экономится под
	   аккуратный текстовый список), активный пункт — зелёная плашка с
	   маркером слева вместо стрелки-хеврона (та у листовых пунктов чисто
	   декоративная — никуда не ведёт дальше, поэтому просто скрываем). */
	body.vn-sidebar-nav #kt_header .vn-nav-sub > .vn-nav-subitem > .vn-nav-sublink{
		display: block;
		padding: 9px 16px 9px 42px;
		font-size: .87rem;
		border-radius: 0;
		background: transparent !important;
		color: var(--vn-text-muted, #a7c2b6) !important;
		text-decoration: none !important;
		transition: background .15s ease, color .15s ease;
	}
	/* background у hover/here-состояний раньше был БЕЗ !important, в отличие
	   от всех остальных активных/hover-состояний в этом файле (см. например
	   .vn-nav-item.vn-active > .vn-nav-link чуть ниже) — из-за чего пункт
	   подменю оставался беззащитен перед любым внешним/более поздним правилом
	   той же специфичности, перебивающим именно background (цвет текста при
	   этом их !important спасал, а фон — нет): пункт оставался с обычным
	   приглушённым серым текстом (color тут не трогали), но с чужим светлым
	   фоном вместо тёмного/зелёного — нечитаемая светлая плашка с серым
	   текстом. Выравниваем !important на background с остальными состояниями. */
	body.vn-sidebar-nav #kt_header .vn-nav-sub > .vn-nav-subitem > .vn-nav-sublink:hover{
		background: rgba(74,222,128,.08) !important;
		color: var(--vn-primary-light, #4ade80) !important;
	}
	body.vn-sidebar-nav #kt_header .vn-nav-sub > .vn-nav-subitem.vn-here > .vn-nav-sublink{
		background: rgba(34,197,94,.14) !important;
		color: var(--vn-primary-light, #4ade80) !important;
		font-weight: 600;
		position: relative;
	}
	body.vn-sidebar-nav #kt_header .vn-nav-sub > .vn-nav-subitem.vn-here > .vn-nav-sublink::before{
		content: "";
		position: absolute;
		left: 20px;
		top: 50%;
		transform: translateY(-50%);
		width: 5px;
		height: 5px;
		border-radius: 50%;
		background: var(--vn-primary-light, #4ade80);
	}
	/* Стрелка на самом раскрывающем пункте (Серверы/Поддержка/...) плавно
	   поворачивается на 90° вниз, когда группа раскрыта — обычный
	   accordion-индикатор вместо "мёртвой" стрелки вбок. */
	body.vn-sidebar-nav #kt_header .vn-nav-group > .vn-nav-link .vn-nav-arrow{
		transition: transform .2s ease;
		font-size: .72rem;
	}
	body.vn-sidebar-nav #kt_header .vn-nav-group.vn-open > .vn-nav-link .vn-nav-arrow{
		transform: rotate(90deg);
	}
	/* верхняя панель (баланс/корзина/уведомления/профиль) переезжает вниз
	   сайдбара отдельным блоком, а не всплывающими справа иконками */
	body.vn-sidebar-nav #kt_header .topbar{
		flex-direction: column;
		align-items: stretch;
		width: 100%;
		padding: 14px 16px 20px;
		margin-top: auto;
		border-top: 1px solid var(--vn-border, #223026);
	}
	body.vn-sidebar-nav #kt_header .topbar-item{
		margin: 0 0 8px !important;
		width: 100%;
	}
	body.vn-sidebar-nav #kt_header .topbar-item:last-child{ margin-bottom: 0 !important; }
	body.vn-sidebar-nav #kt_header .topbar-item > a.btn,
	body.vn-sidebar-nav #kt_header .topbar-item > span.btn{ width: 100%; }

	/* ---------- современный вид пунктов меню: иконка + текст, скруглённый
	   активный пункт с акцентной плашкой, аккуратный hover ---------- */
	body.vn-sidebar-nav #kt_header .header-menu-wrapper{ padding: 10px 12px; }
	body.vn-sidebar-nav #kt_header .vn-nav > .vn-nav-item{ margin-bottom: 2px; }
	body.vn-sidebar-nav #kt_header .vn-nav > .vn-nav-item > .vn-nav-link{
		padding: 11px 14px;
		border-radius: var(--vn-radius-sm, 10px);
		display: flex;
		align-items: center;
		gap: 12px;
		color: var(--vn-text-muted, #8ea89a) !important;
		text-decoration: none !important;
		cursor: pointer;
		transition: background .15s ease, color .15s ease;
	}
	body.vn-sidebar-nav #kt_header .vn-nav > .vn-nav-item > .vn-nav-link .vn-nav-icon{
		flex: 0 0 auto;
		width: 20px;
		text-align: center;
		font-size: 1rem;
		color: inherit;
	}
	body.vn-sidebar-nav #kt_header .vn-nav > .vn-nav-item > .vn-nav-link .vn-nav-text{ flex: 1 1 auto; }
	body.vn-sidebar-nav #kt_header .vn-nav > .vn-nav-item > .vn-nav-link:hover{
		background: var(--vn-surface-2, #17211c) !important;
		color: var(--vn-text, #e7f3ec) !important;
	}
	body.vn-sidebar-nav #kt_header .vn-nav > .vn-nav-item.vn-active > .vn-nav-link{
		background: var(--vn-primary-soft, rgba(34,197,94,.12)) !important;
		color: var(--vn-primary-light, #4ade80) !important;
		font-weight: 600;
	}

	/* ---------- нижний блок сайдбара: баланс/молнии — каждый на своей
	   строке (это широкие "таблетки" с текстом суммы, в общий ряд с
	   кружками-иконками не помещаются), а ВСЕ кружки-иконки (уведомления/
	   корзина/тикеты/быстрые действия/профиль — 5 шт.) собираются в один
	   аккуратный ряд, а не растянуты на всю ширину квадратами друг под
	   другом. Раньше в ряд группировались только последние 3 — после
	   добавления колокольчика уведомлений и корзины перед ними эти два
	   оставались каждый на своей отдельной строке, что и выглядело
	   неаккуратно/криво при большом числе иконок. Достигается чистым CSS
	   (flex-wrap) без правки разметки: .topbar-item по умолчанию 100%
	   ширины (своя строка), последние 5 — flex:1 и переносятся вместе на
	   общую строку. */
	body.vn-sidebar-nav #kt_header .topbar{
		flex-direction: row;
		flex-wrap: wrap;
		gap: 6px;
	}
	/* Арифметика ширины: сайдбар 260px, padding топбара 16px слева/справа
	   (см. правило .topbar{ padding: 14px 16px 20px } выше) — на сам ряд
	   иконок остаётся 260 - 32 = 228px. При кружках 40px и зазоре 8px пять
	   штук занимали 5*40 + 4*8 = 232px — на 4px больше доступного, из-за
	   чего flex-wrap переносил последнюю иконку (профиль) на отдельную
	   строку под остальными четырьмя, а не оставлял всё в один ряд. Кружки
	   уменьшены до 36px, зазор — до 6px: 5*36 + 4*6 = 204px, с запасом
	   умещается в 228px при любом браузерном округлении. */
	body.vn-sidebar-nav #kt_header .topbar-item:nth-last-child(-n+5){
		display: flex;
		justify-content: center;
		width: auto;
		flex: 1 1 0;
		margin: 0 !important;
	}
	body.vn-sidebar-nav #kt_header .topbar-item .btn.btn-icon.btn-circle{
		width: 36px !important;
		height: 36px !important;
		min-width: 36px;
		border-radius: 50% !important;
		margin: 0 auto;
	}
}

/* ==========================================================================
   Тот же тёмный/фирменный вид бокового меню личного кабинета — теперь и на
   мобильном (<992px). Раньше распространялось только на десктоп, мобильная
   версия оставалась на стоковом Metronic: белый фон панели, подменю
   ("Заказать сервер"/"Мои сервера") всплывало абсолютно спозиционированным
   поверх соседних пунктов, а кнопки баланса/профиля — стоковым сиреневым
   --primary вместо зелёного фирменного.
   ========================================================================== */
@media (max-width: 991.98px){
	body.vn-sidebar-nav .header-menu-wrapper{
		background: var(--vn-surface, #121a16) !important;
		border-right: 1px solid var(--vn-border, #223026);
	}
	body.vn-sidebar-nav #kt_header .vn-nav > .vn-nav-item > .vn-nav-link{
		color: var(--vn-text-muted, #8ea89a) !important;
	}
	body.vn-sidebar-nav #kt_header .vn-nav > .vn-nav-item > .vn-nav-link:hover{
		background: var(--vn-surface-2, #17211c) !important;
		color: var(--vn-text, #e7f3ec) !important;
	}
	body.vn-sidebar-nav #kt_header .vn-nav > .vn-nav-item.vn-active > .vn-nav-link{
		background: var(--vn-primary-soft, rgba(34,197,94,.12)) !important;
		color: var(--vn-primary-light, #4ade80) !important;
	}
	/* тот же фикс, что и на десктопе: подменю разворачивается вниз списком
	   внутри сайдбара, а не всплывает поверх соседних пунктов абсолютным
	   позиционированием — именно это выглядело "съехавшим". */
	body.vn-sidebar-nav #kt_header .vn-nav-group > .vn-nav-sub{
		position: static !important;
		box-shadow: none !important;
		width: 100% !important;
		min-width: 0 !important;
		margin: 0 !important;
		padding-left: 14px;
		background: transparent !important;
	}
	body.vn-sidebar-nav #kt_header .vn-nav-sub > .vn-nav-subitem > .vn-nav-sublink{
		color: var(--vn-text-muted, #8ea89a) !important;
		padding: 8px 14px 8px 46px;
	}
	body.vn-sidebar-nav #kt_header .vn-nav-sub > .vn-nav-subitem > .vn-nav-sublink:hover,
	body.vn-sidebar-nav #kt_header .vn-nav-sub > .vn-nav-subitem.vn-here > .vn-nav-sublink{
		color: var(--vn-primary-light, #4ade80) !important;
	}
	body.vn-sidebar-nav #kt_header .topbar{
		background: var(--vn-surface, #121a16) !important;
		border-top: 1px solid var(--vn-border, #223026);
	}
	body.vn-sidebar-nav #kt_header .topbar-item > a.btn,
	body.vn-sidebar-nav #kt_header .topbar-item > span.btn,
	body.vn-sidebar-nav #kt_header .topbar-item > div.btn{
		width: 100%;
	}
	/* стоковые "сиреневые" (--primary Metronic) кнопки — баланс и профиль —
	   в фирменный зелёный, как везде в теме. */
	body.vn-sidebar-nav #kt_header .btn.btn-light-primary{
		background: var(--vn-primary-soft, rgba(34,197,94,.12)) !important;
		color: var(--vn-primary-light, #4ade80) !important;
		border: 1px solid rgba(34,197,94,.25) !important;
	}
}

/* ---------- Боковая панель: виджет "Пользователи онлайн" и кнопка
   "Контакты" (см. common/header.php) — работают и на десктопе, и на
   мобильном, т.к. это один и тот же боковой блок в обоих случаях. ---------- */
/* Структурный фикс: див "онлайн" и ссылка "Контакты" вставлены ПЕРЕД
   <ul class="vn-nav"> внутри #kt_header_menu — без явного
   flex-direction:column на самом контейнере они могут схлопнуться в ряд
   вместо колонки (см. также инлайн-дубль в common/header.php <head>). Без
   media-query — колонка нужна и на десктопе (постоянный сайдбар), и на
   мобильном (выезжающая панель), поведение одинаковое в обоих случаях. */
body.vn-sidebar-nav #kt_header_menu,
body.vn-sidebar-nav #kt_header .header-menu-wrapper,
body.vn-sidebar-nav #kt_header .vn-nav{
	display: flex !important;
	flex-direction: column !important;
}
/* width:100% — только для #kt_header_menu и .vn-nav (растягиваются на всю
   ширину РОДИТЕЛЯ, т.е. .header-menu-wrapper, и это верно что на десктопе,
   что на мобильном). Саму .header-menu-wrapper сюда добавлять нельзя: на
   мобильном (<992px) она же и есть офф-канвас панель — position:fixed
   шириной 275px (style.bundle.css), а width:100% !important без
   медиа-запроса растягивал её на всю ширину ВЬЮПОРТА (100vw) вместо своих
   275px. Из-за этого выезжающее меню при открытии заливало весь экран
   целиком, без видимого контента страницы рядом — ровно баг со
   скриншота. На десктопе (>=992px) её ширина 100% уже отдельно задаётся
   в блоке @media (min-width:992px) выше (там это верно, т.к. это 100% от
   260px-сайдбара, а не от вьюпорта), так что здесь она просто не нужна. */
body.vn-sidebar-nav #kt_header_menu,
body.vn-sidebar-nav #kt_header .vn-nav{
	width: 100% !important;
}
body.vn-sidebar-nav #kt_header .vn-nav > .vn-nav-item{ width: 100% !important; }

.vn-online-widget{
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 10px 14px;
	margin: 12px 12px 6px;
	border-radius: var(--vn-radius-sm, 10px);
	background: var(--vn-surface-2, #17211c);
	border: 1px solid var(--vn-border, #223026);
	width: auto;
	box-sizing: border-box;
}
.vn-online-dot{
	width: 8px;
	height: 8px;
	border-radius: 50%;
	background: var(--vn-primary, #22c55e);
	box-shadow: 0 0 0 3px var(--vn-primary-soft, rgba(34,197,94,.25));
	flex: 0 0 auto;
	animation: vnOnlinePulse 1.8s ease-in-out infinite;
}
@keyframes vnOnlinePulse{
	0%, 100%{ opacity: 1; }
	50%{ opacity: .45; }
}
.vn-online-widget .vn-online-num{ color: var(--vn-text, #e7f3ec); font-weight: 700; font-size: .85rem; }
.vn-online-widget .vn-online-label{ color: var(--vn-text-muted, #8ea89a); font-size: .74rem; }
.vn-contacts-link{
	display: flex;
	align-items: center;
	gap: 12px;
	margin: 0 12px 10px;
	padding: 11px 14px;
	border-radius: var(--vn-radius-sm, 10px);
	border: 1px solid rgba(34,197,94,.25);
	color: var(--vn-primary-light, #4ade80) !important;
	font-weight: 600;
	text-decoration: none !important;
	transition: background .15s ease;
}
.vn-contacts-link .vn-nav-icon{ width: 20px; text-align: center; color: inherit; }
.vn-contacts-link:hover{
	background: var(--vn-primary-soft, rgba(34,197,94,.12));
	color: var(--vn-primary-light, #4ade80) !important;
	text-decoration: none !important;
}

/* ==========================================================================
   Найдена настоящая причина "выцветшего"/нечитаемого текста в личном
   кабинете и админке (например заголовок "С возвращением, Admin!" на
   дашборде). Стоковая Metronic-тема (style.bundle.css) красит .wrapper
   (обёртку #kt_wrapper — это ВЕСЬ контент личного кабинета/админки) в
   БЕЛЫЙ цвет с закруглением 40px — это родной светлый скин темы. Мы
   перекрасили body и .vn-dash-*/.vn-admin-* карточки в тёмный, но саму
   .wrapper — нет, поэтому текст с цветом var(--vn-text) (светлый, рассчитан
   на тёмный фон) оказывался на БЕЛОМ фоне везде, где нет своей отдельной
   тёмной карточки поверх — отсюда нечитаемый "выцветший" вид именно в
   таких местах (герой-заголовок дашборда, отступы между карточками и т.п.).
   ========================================================================== */
.wrapper{
	background-color: var(--vn-bg, #0b0f0d) !important;
	border-radius: 0 !important;
}
/* #kt_wrapper несёт бутстраповский класс .container — тот даёт
   max-width на каждом брейкпоинте и центрирует блок, поэтому на широких
   экранах по бокам (а из-за .wrapper выше — фактически по всей странице,
   т.к. фон вне .wrapper остаётся страничным body) видны пустые поля.
   На тёмном body они не били в глаза, но убираем ограничение и здесь,
   чтобы содержимое кабинета/админки растягивалось на всю ширину. */
#kt_wrapper.container{
	max-width: none !important;
}

/* ==========================================================================
   Выезжающие панели (offcanvas): "Профиль", уведомления, быстрые действия
   (#kt_quick_user, #kt_quick_panel, #kt_quick_actions, #kt_demo_panel).
   Стоковая тема рисует их на БЕЛОМ фоне — а весь текст внутри наследует
   наш светлый var(--vn-text)/var(--vn-text-muted), рассчитанный на тёмный
   фон. Результат — светлый текст на белом, почти невидимый. Ранее это не
   было замечено, т.к. .wrapper покрывал только основной контент, а эти
   панели рендерятся вне .wrapper (в конце body). Красим панели в тон
   общей тёмной теме.
   ========================================================================== */
.offcanvas{
	background: linear-gradient(175deg, var(--vn-surface, #121a16) 0%, var(--vn-bg-soft, #0f1512) 130%) !important;
	color: var(--vn-text, #e7f3ec) !important;
	box-shadow: -18px 0 48px rgba(0,0,0,.5), 0 0 0 1px var(--vn-border, #223026) !important;
}
.offcanvas .offcanvas-header{ border-bottom: 1px solid var(--vn-border, #223026) !important; }
.offcanvas .offcanvas-header h3{ color: var(--vn-text, #e7f3ec) !important; }
.offcanvas .text-dark,
.offcanvas .text-dark-75,
.offcanvas .font-weight-bold{ color: var(--vn-text, #e7f3ec) !important; }
.offcanvas .text-muted{ color: var(--vn-text-muted, #8ea89a) !important; }
.offcanvas .navi .navi-link{ color: var(--vn-text, #e7f3ec) !important; }
.offcanvas .separator{ border-color: var(--vn-border, #223026) !important; }
.offcanvas .card, .offcanvas .card-custom{ background: var(--vn-surface-2, #17211c) !important; }

/* ==========================================================================
   Панель "Профиль" (#kt_quick_user, header.php/admheader.php) — самый
   проработанный визуально блок сайта: свечение аватара, пульс онлайн-статуса,
   роль-бейдж рядом с именем, цветные подложки под иконками пунктов меню
   (переиспользуют существующие svg-icon-danger/primary/warning/info/dark —
   т.е. цвет каждого пункта задаётся в самой разметке, тут только оформление),
   акцентная карточка для привилегированного пункта "Управление" и лёгкая
   stagger-анимация появления пунктов при открытии панели (body.offcanvas-on
   — стандартный класс, который сама Metronic вешает на body при открытии
   offcanvas, см. assets/css/style.bundle.css).
   ========================================================================== */

/* ---------- Аватар: мягкое зелёное свечение + градиентное кольцо ---------- */
.vn-quickuser-avatar{ position: relative; }
.vn-quickuser-avatar .symbol-label{
	border-radius: 14px;
	box-shadow: 0 0 0 3px var(--vn-primary-soft, rgba(34,197,94,.25)), 0 6px 20px rgba(34,197,94,.18);
	background-size: cover;
	background-position: center;
	transition: box-shadow .25s ease;
}
.vn-quickuser-head:hover .vn-quickuser-avatar .symbol-label{
	box-shadow: 0 0 0 3px rgba(34,197,94,.4), 0 8px 28px rgba(34,197,94,.32);
}
.vn-quickuser-avatar::before{
	content: "";
	position: absolute;
	inset: -3px;
	border-radius: var(--vn-radius-lg);
	background: conic-gradient(from 220deg, var(--vn-primary-light, #4ade80), transparent 35%, transparent 65%, var(--vn-primary-dark, #16a34a));
	opacity: .55;
	z-index: -1;
	filter: blur(2px);
}
/* Аватар профиля: если файл картинки не загрузился (битая ссылка, файл
   удалён, путь недоступен веб-серверу и т.п.), onerror на <img> прячет
   картинку и показывает инициалы поверх того же фона вместо пустого
   зелёного прямоугольника без какого-либо содержимого. */
.vn-avatar-wrap{
	position: relative;
	display: flex;
	align-items: center;
	justify-content: center;
	overflow: hidden;
}
.vn-avatar-img{
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}
.vn-avatar-fallback{
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	height: 100%;
	color: var(--vn-primary-light, #4ade80);
	font-weight: 800;
	font-size: 1.1rem;
	letter-spacing: .02em;
}
/* Статус-точка "онлайн" — мягкий дышащий пульс вместо статичного кружка */
.vn-quickuser-avatar .symbol-badge{
	background: var(--vn-primary, #22c55e) !important;
	box-shadow: 0 0 0 2px var(--vn-surface, #121a16);
	animation: vnStatusPulse 2.4s ease-in-out infinite;
}
@keyframes vnStatusPulse{
	0%, 100%{ box-shadow: 0 0 0 2px var(--vn-surface, #121a16), 0 0 0 0 rgba(34,197,94,.55); }
	50%{ box-shadow: 0 0 0 2px var(--vn-surface, #121a16), 0 0 0 5px rgba(34,197,94,0); }
}

/* ---------- Имя, роль-бейдж, email ---------- */
.vn-quickuser-name-row{
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 8px;
}
.vn-quickuser-name{
	font-size: 1.15rem !important;
	letter-spacing: -.01em;
	color: var(--vn-text, #e7f3ec) !important;
}
.vn-quickuser-name:hover{ color: var(--vn-primary-light, #4ade80) !important; }
.vn-quickuser-role-badge{
	display: inline-flex;
	align-items: center;
	font-size: .66rem;
	font-weight: 700;
	line-height: 1;
	text-transform: uppercase;
	letter-spacing: .04em;
	padding: 4px 9px;
	border-radius: 999px;
	background: var(--vn-primary-soft, rgba(34,197,94,.12));
	color: var(--vn-primary-light, #4ade80);
	border: 1px solid rgba(34,197,94,.3);
	white-space: nowrap;
}
.vn-quickuser-role-badge.vn-role-support{
	background: rgba(34,211,238,.12);
	color: #67e8f9;
	border-color: rgba(34,211,238,.3);
}
.vn-quickuser-email{ font-size: .86rem; }

/* ---------- Список пунктов меню ---------- */
.vn-quickuser-navi{
	background: var(--vn-surface-2, #17211c);
	border: 1px solid var(--vn-border, #223026);
	border-radius: var(--vn-radius, 14px);
	padding: 6px !important;
}
.vn-quickuser-navi .navi-item + .navi-item{ margin-top: 2px; }
.vn-quickuser-navi .navi-link{
	position: relative;
	border-radius: 10px;
	padding: 10px 12px !important;
	transition: background .18s ease, transform .18s ease;
}
.vn-quickuser-navi .navi-link::before{
	content: "";
	position: absolute;
	left: 0; top: 8px; bottom: 8px;
	width: 3px;
	border-radius: 0 3px 3px 0;
	background: var(--vn-primary, #22c55e);
	transform: scaleY(0);
	transition: transform .18s ease;
}
.vn-quickuser-navi .navi-link:hover{
	background: var(--vn-surface, #121a16) !important;
	transform: translateX(3px);
}
.vn-quickuser-navi .navi-link:hover::before{ transform: scaleY(1); }
.vn-quickuser-navi .navi-link:active{ transform: translateX(3px) scale(.985); }
.vn-quickuser-navi .symbol-label{
	border-radius: 10px;
	transition: transform .18s ease, background-color .18s ease;
}
.vn-quickuser-navi .navi-link:hover .symbol-label{ transform: scale(1.08) rotate(-2deg); }
.vn-quickuser-navi .navi-text .font-weight-bold{ color: var(--vn-text, #e7f3ec); }
.vn-quickuser-navi .navi-text .text-muted{ font-size: .85rem; }

/* Цветные подложки под иконку каждого пункта — приглушённый фон в тон
   уже проставленному в разметке svg-icon-*, плюс усиление при наведении. */
.vn-mi-danger .symbol-label{ background: rgba(244,63,94,.14) !important; }
.vn-mi-primary .symbol-label{ background: var(--vn-primary-soft, rgba(34,197,94,.14)) !important; }
.vn-mi-warning .symbol-label{ background: rgba(245,158,11,.14) !important; }
.vn-mi-info .symbol-label{ background: rgba(34,211,238,.14) !important; }
.vn-mi-dark .symbol-label{ background: rgba(148,163,184,.14) !important; }
.vn-quickuser-navi .navi-link:hover .vn-mi-danger .symbol-label{ background: rgba(244,63,94,.24) !important; }
.vn-quickuser-navi .navi-link:hover .vn-mi-primary .symbol-label{ background: rgba(34,197,94,.24) !important; }
.vn-quickuser-navi .navi-link:hover .vn-mi-warning .symbol-label{ background: rgba(245,158,11,.24) !important; }
.vn-quickuser-navi .navi-link:hover .vn-mi-info .symbol-label{ background: rgba(34,211,238,.24) !important; }
.vn-quickuser-navi .navi-link:hover .vn-mi-dark .symbol-label{ background: rgba(148,163,184,.24) !important; }

/* ---------- Кнопка "Выйти" — чёткое, но вторичное действие ---------- */
.vn-quickuser-logout{
	display: flex;
	align-items: center;
	justify-content: center;
	font-size: .92rem;
	letter-spacing: .01em;
	background: var(--vn-primary-soft, rgba(34,197,94,.12)) !important;
	border: 1px solid var(--vn-primary-dark, #16a34a) !important;
	color: var(--vn-primary-light, #4ade80) !important;
	border-radius: 10px !important;
	transition: background .18s ease, color .18s ease, box-shadow .18s ease, transform .18s ease;
}
.vn-quickuser-logout i{ font-size: .95em; }
.vn-quickuser-logout:hover{
	background: var(--vn-primary, #22c55e) !important;
	color: #04150a !important;
	box-shadow: 0 8px 22px rgba(34,197,94,.35);
	transform: translateY(-1px);
}
.vn-quickuser-logout:active{ transform: translateY(0); }

/* ---------- "Управление" — визуально выделенный привилегированный пункт ---------- */
.vn-quickuser-admin{
	background: linear-gradient(135deg, rgba(34,197,94,.1), rgba(34,197,94,.02));
	border: 1px solid rgba(34,197,94,.22);
	border-radius: var(--vn-radius, 14px);
	padding: 2px;
}
.vn-quickuser-admin .navi-link{ border-radius: var(--vn-radius-sm); }
.vn-quickuser-admin .navi-link::before{ background: var(--vn-primary-light, #4ade80); }
.vn-quickuser-admin .navi-link:hover{ background: rgba(34,197,94,.12) !important; }
.vn-quickuser-admin .vn-mi-dark .symbol-label{ background: var(--vn-primary-soft, rgba(34,197,94,.16)) !important; }
.vn-quickuser-admin .vn-mi-dark .svg-icon-dark svg path,
.vn-quickuser-admin .vn-mi-dark .svg-icon-dark svg polygon{ fill: var(--vn-primary-light, #4ade80) !important; }
/* <polygon points="0 0 24 0 24 24 0 24"/> в этой иконке — невидимая
   подложка-канва 24×24 (без fill в разметке), не сам значок "человек".
   Правило выше красит и её тоже сплошным зелёным, а фигура человечка не
   покрывает всю область — итог: вместо значка виден закрашенный зелёный
   квадрат ("Управление" в профиле). Возвращаем подложке fill:none. */
.vn-quickuser-admin .vn-mi-dark .svg-icon-dark svg polygon:first-child{ fill: none !important; }
.vn-quickuser-admin .navi-link:hover .vn-mi-dark .symbol-label{ background: rgba(34,197,94,.26) !important; }

/* ---------- Появление пунктов при открытии панели — лёгкий stagger fade+slide ---------- */
@keyframes vnQuickuserItemIn{
	from{ opacity: 0; transform: translateY(6px); }
	to{ opacity: 1; transform: translateY(0); }
}
body.offcanvas-on #kt_quick_user .vn-quickuser-navi > .navi-item,
body.offcanvas-on #kt_quick_user .vn-quickuser-navi > span.navi-item,
body.offcanvas-on #kt_quick_user .vn-quickuser-admin{
	animation: vnQuickuserItemIn .32s ease both;
}
body.offcanvas-on #kt_quick_user .vn-quickuser-navi > *:nth-child(1){ animation-delay: .02s; }
body.offcanvas-on #kt_quick_user .vn-quickuser-navi > *:nth-child(2){ animation-delay: .05s; }
body.offcanvas-on #kt_quick_user .vn-quickuser-navi > *:nth-child(3){ animation-delay: .08s; }
body.offcanvas-on #kt_quick_user .vn-quickuser-navi > *:nth-child(4){ animation-delay: .11s; }
body.offcanvas-on #kt_quick_user .vn-quickuser-navi > *:nth-child(5){ animation-delay: .14s; }
body.offcanvas-on #kt_quick_user .vn-quickuser-admin{ animation-delay: .17s; }
@media (prefers-reduced-motion: reduce){
	.vn-quickuser-avatar .symbol-badge{ animation: none; }
	body.offcanvas-on #kt_quick_user .vn-quickuser-navi > .navi-item,
	body.offcanvas-on #kt_quick_user .vn-quickuser-navi > span.navi-item,
	body.offcanvas-on #kt_quick_user .vn-quickuser-admin{ animation: none; }
}

/* ---------- Мобильные экраны: панель уже адаптирована стоковой темой
   (offcanvas-mobile-on), здесь только подгоняем сам контент профиля ---------- */
@media (max-width: 420px){
	.vn-quickuser-role-badge{ font-size: .6rem; padding: 3px 7px; }
	.vn-quickuser-name{ font-size: 1.05rem !important; }
	.vn-quickuser-navi .navi-link{ padding: 9px 10px !important; }
}

/* ---------- Недостающий text-primary (используется, например, в /account/invoices) ---------- */
.text-primary{ color: var(--vn-primary-light, #4ade80) !important; }

/* ---------- Топбар: кнопки-иконки поверх stock "primary" (были фиолетовыми) ---------- */
.topbar .btn.btn-icon.btn-circle,
.btn.btn-icon.btn-circle.btn-light-primary,
.btn.btn-icon.btn-circle.btn-hover-light-primary:hover{
	background: var(--vn-primary-soft, rgba(34,197,94,.12)) !important;
	color: var(--vn-primary-light, #4ade80) !important;
}

/* ---------- /account/invoices: убираем фирменный синий/фиолетовый Metronic-баннер ---------- */
.card-body .row[style*="bg.jpg"]{
	background-image: linear-gradient(135deg, var(--vn-primary-dark, #16a34a), var(--vn-bg-soft, #0f1512)) !important;
}

/* ==========================================================================
   Всплывающие уведомления (toastr): раньше — стоковые заливные плашки
   (сплошной зелёный/красный/оранжевый/синий фон, прямые углы), выбивались
   из тёмной стеклянной эстетики панели. Переоформлены под общий стиль
   карточек: тёмная полупрозрачная подложка с блюром, скруглённые углы,
   цветной левый акцент + иконка вместо сплошной заливки.
   ========================================================================== */
#toast-container{ pointer-events: none; }
#toast-container > div{
	pointer-events: auto;
	opacity: 1 !important;
	background-color: var(--vn-surface, #121a16) !important;
	background-image: none !important;
	border: 1px solid var(--vn-border, #223026);
	border-left-width: 4px;
	border-radius: var(--vn-radius-sm, 10px) !important;
	box-shadow: 0 12px 32px rgba(0,0,0,.45), 0 0 0 1px rgba(255,255,255,.02);
	padding: 14px 16px 14px 46px !important;
	color: var(--vn-text, #e7f3ec) !important;
	backdrop-filter: blur(6px);
}
#toast-container > div:hover{
	box-shadow: 0 16px 40px rgba(0,0,0,.55), 0 0 0 1px rgba(255,255,255,.03);
}
#toast-container > div:before{
	font-family: "Font Awesome 5 Free";
	font-weight: 900;
	position: absolute;
	left: 16px;
	top: 50%;
	transform: translateY(-50%);
	font-size: 1.1rem;
}
.toast-title{ color: var(--vn-text, #e7f3ec) !important; font-weight: 700; margin-bottom: 2px; }
.toast-message{ color: var(--vn-text-muted, #8ea89a) !important; }
.toast-close-button{ color: var(--vn-text, #e7f3ec) !important; opacity: .6; text-shadow: none !important; }
.toast-close-button:hover{ opacity: 1; }
.toast-progress{ background-color: rgba(255,255,255,.18) !important; height: 3px !important; }

.toast-success{ border-left-color: var(--vn-primary, #22c55e) !important; }
.toast-success:before{ content: "\f00c"; color: var(--vn-primary-light, #4ade80); }
.toast-error{ border-left-color: var(--vn-danger, #f43f5e) !important; }
.toast-error:before{ content: "\f06a"; color: #fb7185; }
.toast-warning{ border-left-color: var(--vn-warning, #f59e0b) !important; }
.toast-warning:before{ content: "\f071"; color: #facc15; }
.toast-info{ background-color: var(--vn-surface, #121a16) !important; border-left-color: var(--vn-info, #22d3ee) !important; }
.toast-info:before{ content: "\f05a"; color: #67e8f9; }


/* ==========================================================================
   Колокольчик уведомлений в шапке — бейдж (переиспользует .vn-cart-badge)
   + выпадающий список последних уведомлений + анимация "тряски" при
   поступлении нового уведомления (см. common/header.php).
   ========================================================================== */
.vn-bell-wrap{ position: static; }
@keyframes vnBellShake{
	0%, 100% { transform: rotate(0); }
	15% { transform: rotate(14deg); }
	30% { transform: rotate(-12deg); }
	45% { transform: rotate(9deg); }
	60% { transform: rotate(-7deg); }
	75% { transform: rotate(4deg); }
}
.vn-bell-shake{ animation: vnBellShake .6s ease-in-out; }
/* ==========================================================================
   Раньше выпадающий список уведомлений (340px) был position:absolute
   ОТНОСИТЕЛЬНО самой иконки-колокольчика — в этой теме топбар (баланс/
   молнии/корзина/колокольчик/тикеты/профиль) на десктопе (≥992px, класс
   body.vn-sidebar-nav) переезжает вниз ЛЕВОГО сайдбара шириной всего
   260px (см. правило ниже) — панель шире самого сайдбара, вылезала за его
   край и могла оказаться частично за пределами экрана. position:fixed
   относительно ВЬЮПОРТА, а не иконки, полностью убирает эту зависимость.
   top/right ниже — только ЗАПАСНОЕ значение на случай, если JS не
   выполнился: реальные top/left каждый раз считаются в common/header.php
   (vnPositionBellDropdown) от фактического getBoundingClientRect() кнопки
   #vn_bell_toggle и зажимаются в границы экрана — раньше top:76px был
   жёстко зашит под старую горизонтальную шапку и не учитывал, что в
   сайдбар-раскладке колокольчик уходит вниз 260px-колонки, из-за чего
   список открывался у самого верха экрана в стороне от иконки и на части
   высот вылезал за нижний край (см. также медиа-запрос ниже для узких
   экранов, где используется свой bottom-sheet и JS-позиционирование
   намеренно пропускается).
   ========================================================================== */
.vn-bell-dropdown{
	position: fixed;
	top: 76px;
	right: 20px;
	width: 340px;
	max-width: calc(100vw - 32px);
	background: var(--vn-surface);
	border: 1px solid var(--vn-border);
	border-radius: 12px;
	box-shadow: var(--vn-shadow, 0 10px 30px rgba(0,0,0,.35));
	opacity: 0;
	visibility: hidden;
	transform: translateY(-6px);
	transition: opacity .15s ease, transform .15s ease, visibility .15s;
	z-index: 1050;
}
.vn-bell-dropdown.is-open{ opacity: 1; visibility: visible; transform: translateY(0); }
@media (max-width: 575.98px){
	.vn-bell-dropdown{ top: auto; bottom: 16px; right: 16px; left: 16px; width: auto; max-width: none; }
}
.vn-bell-dropdown-header{
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 12px 16px;
	border-bottom: 1px solid var(--vn-border);
	color: var(--vn-text);
	font-weight: 700;
	font-size: .9rem;
}
.vn-bell-dropdown-header a{ color: var(--vn-primary-light); font-weight: 600; font-size: .8rem; }
.vn-bell-dropdown-header a:hover{ color: var(--vn-primary); }
.vn-bell-dropdown-list{ max-height: 360px; overflow-y: auto; }
.vn-bell-empty{
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 10px;
	padding: 36px 16px;
	text-align: center;
	color: var(--vn-text-muted);
	font-size: .85rem;
}
.vn-bell-empty i{
	width: 44px;
	height: 44px;
	display: flex;
	align-items: center;
	justify-content: center;
	border-radius: 999px;
	background: var(--vn-primary-soft);
	color: var(--vn-primary-light);
	font-size: 1.1rem;
}
.vn-bell-item{
	padding: 11px 16px;
	border-bottom: 1px solid var(--vn-border);
	cursor: pointer;
	transition: background .12s ease;
}
.vn-bell-item:last-child{ border-bottom: none; }
.vn-bell-item:hover{ background: var(--vn-primary-soft); }
.vn-bell-item-unread{ background: rgba(34,197,94,.06); position: relative; }
.vn-bell-item-unread::before{
	content: "";
	position: absolute;
	left: 6px;
	top: 18px;
	width: 6px;
	height: 6px;
	border-radius: 999px;
	background: var(--vn-primary);
}
.vn-bell-item-unread{ padding-left: 22px; }
.vn-bell-item-title{ color: var(--vn-text); font-weight: 700; font-size: .85rem; margin-bottom: 2px; }
.vn-bell-item-message{ color: var(--vn-text-muted); font-size: .78rem; line-height: 1.4; }

.vn-price-preview{ display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 10px; }
.vn-price-preview-item{
	background: var(--vn-surface-2, #17211c);
	border: 1px solid var(--vn-border, #223026);
	border-radius: 10px;
	padding: 10px 12px;
	text-align: center;
}
.vn-price-preview-label{ display: block; font-size: .72rem; color: var(--vn-text-muted, #a7c2b6); text-transform: uppercase; letter-spacing: .04em; margin-bottom: 4px; }
.vn-price-preview-value{ display: block; font-weight: 800; color: var(--vn-primary-light, #4ade80); font-size: 1rem; }
.vn-price-preview-note{ display: block; font-size: .68rem; color: var(--vn-text-muted, #a7c2b6); margin-top: 2px; }

/* ==========================================================================
   Toastr — фирменные всплывающие уведомления (toastr.options.toastClass =
   "vn-toast", см. common/footer.php / common/loginfooter.php). Раньше был
   стоковый светлый Metronic-вид, вырванный из общей тёмной темы панели.
   Версия 2: иконка в цветном кружке-бейдже вместо голого глифа, стеклянный
   блюр, цветное свечение по типу тоста (совпадает с акцентным цветом),
   более "пружинистый" вход и отдельная анимация выхода, анимированный
   (шиммер) градиентный прогресс-бар вместо плоской полоски.
   ========================================================================== */
/* Явная ширина у #toast-container и у самих тостов (100% от контейнера) —
   флекс-элемент без заданной ширины сжимается по содержимому. max-width на
   контейнере не даёт тосту вылезти за пределы viewport на узких экранах. */
#toast-container{ gap: 12px; display: flex; flex-direction: column; width: 320px; max-width: calc(100vw - 24px); }
#toast-container > .vn-toast{
	position: relative;
	display: flex;
	align-items: flex-start;
	gap: 14px;
	width: 100%;
	flex: none;
	box-sizing: border-box;
	padding: 16px 44px 16px 16px;
	border-radius: 16px;
	background: linear-gradient(160deg, rgba(22,33,27,.92), rgba(15,23,18,.92)) !important;
	border: 1px solid var(--vn-border, #223026);
	box-shadow: 0 16px 40px rgba(0,0,0,.45), 0 2px 10px rgba(0,0,0,.3), 0 0 0 1px rgba(255,255,255,.02) inset;
	backdrop-filter: blur(10px) saturate(140%);
	-webkit-backdrop-filter: blur(10px) saturate(140%);
	opacity: 0;
	transform: translateX(28px) scale(.96);
	animation: vnToastIn .4s cubic-bezier(.2,.9,.25,1.35) forwards;
	transition: box-shadow .2s ease, transform .2s ease;
}
#toast-container > .vn-toast:hover{
	transform: translateY(-2px);
}
@keyframes vnToastIn{
	to{ opacity: 1; transform: translateX(0) scale(1); }
}
/* Иконка-бейдж: цветной кружок вместо голого глифа поверх текста. */
#toast-container > .vn-toast::before{
	font-family: "Font Awesome 5 Free"; font-weight: 900;
	font-size: .92rem; line-height: 1; flex-shrink: 0;
	width: 34px; height: 34px;
	display: flex; align-items: center; justify-content: center;
	border-radius: 10px;
	margin-top: 1px;
}
#toast-container > .vn-toast.toast-success{ box-shadow: 0 16px 40px rgba(34,197,94,.16), 0 2px 10px rgba(0,0,0,.3); }
#toast-container > .vn-toast.toast-success::before{ content: "\f058"; color: #4ade80; background: rgba(34,197,94,.14); }
#toast-container > .vn-toast.toast-error{ box-shadow: 0 16px 40px rgba(244,63,94,.16), 0 2px 10px rgba(0,0,0,.3); }
#toast-container > .vn-toast.toast-error::before{ content: "\f057"; color: #fb7185; background: rgba(244,63,94,.14); }
#toast-container > .vn-toast.toast-warning{ box-shadow: 0 16px 40px rgba(245,158,11,.16), 0 2px 10px rgba(0,0,0,.3); }
#toast-container > .vn-toast.toast-warning::before{ content: "\f06a"; color: #fbbf24; background: rgba(245,158,11,.14); }
#toast-container > .vn-toast.toast-info{ box-shadow: 0 16px 40px rgba(56,189,248,.16), 0 2px 10px rgba(0,0,0,.3); }
#toast-container > .vn-toast.toast-info::before{ content: "\f0f3"; color: #7dd3fc; background: rgba(56,189,248,.14); }
#toast-container > .vn-toast .toast-title{
	color: #eafff2; font-weight: 800; font-size: .93rem; margin-bottom: 2px; letter-spacing: -.01em;
}
#toast-container > .vn-toast .toast-message{
	color: #cfe6da; font-size: .84rem; line-height: 1.5; word-break: break-word;
}
#toast-container > .vn-toast .toast-close-button{
	position: absolute; top: 10px; right: 12px;
	color: var(--vn-text-muted, #8ea89a); opacity: .6; font-weight: 400;
	font-size: 1.1rem; text-shadow: none;
	transition: opacity .15s ease, transform .15s ease;
}
#toast-container > .vn-toast .toast-close-button:hover{ opacity: 1; color: #eafff2; transform: rotate(90deg); }
/* Прогресс-бар: чуть толще, скруглённый, с бегущим бликом поверх градиента
   типа тоста — читается как активный процесс, а не статичная линия. */
#toast-container > .vn-toast .toast-progress{
	height: 4px; border-radius: 0 0 16px 16px; opacity: .9;
	background-image: linear-gradient(90deg, rgba(255,255,255,.35) 0%, rgba(255,255,255,0) 60%);
	background-size: 200% 100%;
	animation: vnToastShimmer 1.4s linear infinite;
}
#toast-container > .vn-toast.toast-success .toast-progress{ background-color: #22c55e; }
#toast-container > .vn-toast.toast-error .toast-progress{ background-color: #f43f5e; }
#toast-container > .vn-toast.toast-warning .toast-progress{ background-color: #f59e0b; }
#toast-container > .vn-toast.toast-info .toast-progress{ background-color: #38bdf8; }
@keyframes vnToastShimmer{
	0%{ background-position: 200% 0; }
	100%{ background-position: -200% 0; }
}

/* Тосты-уведомления (info) теперь кликабельны — ведут на /main/notifications
   и сразу отмечают уведомление прочитанным (см. common/header.php, bell). */
#toast-container > .vn-toast.toast-info{ cursor: pointer; }
#toast-container > .vn-toast.toast-info:hover{ box-shadow: 0 20px 48px rgba(56,189,248,.24), 0 2px 10px rgba(0,0,0,.3); }
/* Полноширинный вариант на мобильных (toast-bottom-full-width) — карточка
   и так растягивается на всю ширину классом toastr, здесь только отступы. */
#toast-container.toast-bottom-full-width > .vn-toast{ margin: 0 0 10px; }

/* ==================== ЧАТ ТИКЕТА (tickets/view.php, getMessagess()) ====================
   Раньше сообщения выводились классами Metronic bg-light-success/bg-light-primary —
   светлые плашки на тёмном фоне панели читались плохо и выбивались из общего
   стиля. Глобально (а не в <style> самой страницы), т.к. разметку строит
   контроллер (echo прямо в tickets/view.php::getMessagess()), а не шаблон. */
.vn-chat-scroll{
	background: var(--vn-bg-soft, #0d1117);
	border-radius: var(--vn-radius, 12px);
	padding: 16px;
}
.vn-chat-row{ display:flex; flex-direction:column; margin-bottom: 18px; }
.vn-chat-row.vn-chat-in{ align-items:flex-start; }
.vn-chat-row.vn-chat-out{ align-items:flex-end; }
.vn-chat-head{ display:flex; align-items:center; gap:10px; margin-bottom:6px; }
.vn-chat-avatar{ width:36px; height:36px; border-radius:50%; object-fit:cover; border:1px solid var(--vn-border); }
.vn-chat-name{ color: var(--vn-text); font-weight:600; font-size:.92rem; }
.vn-chat-time{ color: var(--vn-text-muted); font-size:.78rem; margin-left:6px; }
.vn-chat-bubble{
	max-width: 420px;
	padding: 12px 16px;
	border-radius: var(--vn-radius, 12px);
	font-size: .95rem;
	line-height:1.5;
	word-break: break-word;
	box-shadow: 0 2px 8px rgba(0,0,0,.18);
}
.vn-chat-in .vn-chat-bubble{
	background: var(--vn-surface-2, #161b22);
	border: 1px solid var(--vn-border);
	color: var(--vn-text);
	border-top-left-radius: 4px;
}
.vn-chat-out .vn-chat-bubble{
	background: linear-gradient(135deg, var(--vn-primary, #22c55e), var(--vn-primary-dark, #16a34a));
	color: #06210f;
	border-top-right-radius: 4px;
}
.vn-chat-out .vn-chat-bubble a{ color:#06210f; text-decoration: underline; }
.vn-chat-in .vn-chat-bubble a{ color: var(--vn-primary-light, #4ade80); }
/* Системные сообщения (перевод отдела/линии, автозакрытие) — не диалог, а
   факт "что произошло с запросом", центрируются отдельной строкой-плашкой,
   не путаются с репликами клиента/поддержки (getMessagess() распознаёт их
   по префиксу "Запрос распределён:" в тексте сообщения). */
.vn-chat-system{
	display:flex;
	justify-content:center;
	margin: 14px 0;
}
.vn-chat-system-badge{
	background: rgba(56,189,248,.12);
	color: #67e8f9;
	border: 1px solid rgba(56,189,248,.25);
	padding: 6px 14px;
	border-radius: 999px;
	font-size: .82rem;
	text-align:center;
	max-width: 90%;
}
