/* /core/static/css/style.css */

img.emoji {
	height: 1em;
	width: 1em;
	margin: 0 .05em 0 .1em;
	vertical-align: -0.1em;
	display: inline-block;
}

* {
	-webkit-tap-highlight-color: transparent;
}

input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
	-webkit-box-shadow: 0 0 0 30px #1f2937 inset !important;
	-webkit-text-fill-color: white !important;
	caret-color: white !important;
	transition: background-color 5000s ease-in-out 0s;
	border-radius: 0.75rem;
}

input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
	-webkit-appearance: none;
	margin: 0;
}

input[type=number] {
	-moz-appearance: textfield;
}

html {
	background-color: #f3f4f6;
	-webkit-text-size-adjust: 100%;
}

body {
	min-height: 100vh;
	overflow-x: hidden;
	padding-top: env(safe-area-inset-top, 0px);
	padding-bottom: env(safe-area-inset-bottom, 0px);
	overflow-anchor: auto;
}

html.dark {
	background-color: #111827;
}

html.dark body {
	background-color: #111827;
	color: #f3f4f6;
}

nav {
	position: relative;
	padding-top: max(0px, env(safe-area-inset-top, 0px)) !important;
}

/* --- Анимации --- */
@keyframes float {

	0%,
	100% {
		transform: translateY(0px);
	}

	50% {
		transform: translateY(-20px);
	}
}

.animate-float {
	animation: float 6s ease-in-out infinite;
}

@keyframes blob {

	0%,
	100% {
		transform: translate(0px, 0px) scale(1);
	}

	33% {
		transform: translate(30px, -50px) scale(1.1);
	}

	66% {
		transform: translate(-20px, 20px) scale(0.9);
	}
}

.animate-blob {
	animation: blob 7s infinite;
}

@keyframes fadeInUp {
	0% {
		opacity: 0;
		transform: translateY(20px) scale(0.95);
	}

	100% {
		opacity: 1;
		transform: translateY(0) scale(1);
	}
}

.animate-fade-in-up {
	animation: fadeInUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}

.lazy-block {
	opacity: 1;
	transform: none;
	transition: none;
}

@media (max-width: 1023px) {
	.lazy-block {
		opacity: 0;
		transform: none;
		transition: opacity 0.5s ease-out;
		will-change: opacity;
	}

	.lazy-block.is-visible {
		opacity: 1;
	}
}

@media (prefers-reduced-motion: reduce) {
	.lazy-block {
		transition: none !important;
		opacity: 1 !important;
	}
}

/* --- Вспомогательные классы --- */
.modal-open {
	display: flex !important;
}

.no-scrollbar::-webkit-scrollbar {
	display: none;
}

.no-scrollbar {
	-ms-overflow-style: none;
	scrollbar-width: none;
}

body,
div,
nav,
main,
button {
	transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow;
	transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
	transition-duration: 300ms;
}

/* --- Уведомления --- */
.notif-btn {
	position: relative;
	cursor: pointer;
}

.notif-badge {
	position: absolute;
	top: -2px;
	right: -2px;
	background-color: #ef4444;
	color: white;
	font-size: 0.65rem;
	font-weight: bold;
	height: 16px;
	width: 16px;
	border-radius: 50%;
	display: flex;
	align-items: center;
	justify-content: center;
	pointer-events: none;
	transition: transform 0.2s;
}

.notif-badge.hidden {
	transform: scale(0);
}

.notif-dropdown {
	position: absolute;
	top: 100%;
	right: 0;
	margin-top: 10px;
	width: 320px;
	max-height: 400px;
	overflow-y: auto;
	background: rgba(255, 255, 255, 0.95);
	backdrop-filter: blur(12px);
	border-radius: 1rem;
	box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
	z-index: 60;
	border: 1px solid rgba(229, 231, 235, 0.5);
	opacity: 0;
	transform: translateY(-10px);
	pointer-events: none;
	transition: all 0.2s ease-out;
}

.dark .notif-dropdown {
	background: rgba(17, 24, 39, 0.95);
	border-color: rgba(255, 255, 255, 0.1);
}

.notif-dropdown.show {
	opacity: 1;
	transform: translateY(0);
	pointer-events: auto;
}

.notif-item {
	padding: 12px 16px;
	border-bottom: 1px solid rgba(0, 0, 0, 0.05);
}

.dark .notif-item {
	border-bottom: 1px solid rgba(255, 255, 255, 0.05);
}

.notif-time {
	font-size: 0.7rem;
	color: #9ca3af;
	margin-top: 4px;
}

@keyframes bell-shake {

	0%,
	100% {
		transform: rotate(0);
	}

	15% {
		transform: rotate(5deg);
	}

	30% {
		transform: rotate(-5deg);
	}

	45% {
		transform: rotate(4deg);
	}

	60% {
		transform: rotate(-4deg);
	}
}

.notif-bell-shake {
	animation: bell-shake 0.5s cubic-bezier(.36, .07, .19, .97) both;
}

/* --- Гирлянда --- */
.lights-garland {
	position: absolute;
	z-index: 40;
	bottom: -15px;
	left: 0;
	width: 100%;
	padding: 0;
	margin: 0;
	pointer-events: none;
	display: flex;
	justify-content: space-around;
	overflow: visible;
}

.lights-garland li {
	list-style: none;
	width: 8px;
	height: 12px;
	border-radius: 50% 50% 50% 50% / 70% 70% 30% 30%;
	background: #4b5563;
	position: relative;
	transition: background 1s ease;
	top: 5px;
}

.lights-garland li::after {
	content: '';
	position: absolute;
	top: -10px;
	left: 4px;
	width: 60px;
	height: 15px;
	border-bottom: 2px solid rgba(107, 114, 128, 0.4);
	border-radius: 50%;
	z-index: -1;
}

.lights-garland li::before {
	content: '';
	position: absolute;
	top: -3px;
	left: 1.5px;
	width: 5px;
	height: 4px;
	background: #374151;
	border-radius: 1px;
}

.garland-on li:nth-child(4n+1) {
	animation: glow-red 3s ease-in-out infinite;
}

.garland-on li:nth-child(4n+2) {
	animation: glow-blue 3.5s ease-in-out infinite;
	animation-delay: 0.5s;
}

.garland-on li:nth-child(4n+3) {
	animation: glow-yellow 4s ease-in-out infinite;
	animation-delay: 1s;
}

.garland-on li:nth-child(4n+4) {
	animation: glow-green 3s ease-in-out infinite;
	animation-delay: 1.5s;
}

@keyframes glow-red {

	0%,
	100% {
		background: #ff2d55;
		box-shadow: 0 0 10px #ff2d55;
	}

	50% {
		background: #7c1a2d;
		box-shadow: none;
	}
}

@keyframes glow-blue {

	0%,
	100% {
		background: #007aff;
		box-shadow: 0 0 10px #007aff;
	}

	50% {
		background: #0a3a6b;
		box-shadow: none;
	}
}

@keyframes glow-yellow {

	0%,
	100% {
		background: #ffcc00;
		box-shadow: 0 0 10px #ffcc00;
	}

	50% {
		background: #7a6200;
		box-shadow: none;
	}
}

@keyframes glow-green {

	0%,
	100% {
		background: #34c759;
		box-shadow: 0 0 10px #34c759;
	}

	50% {
		background: #1a5e2b;
		box-shadow: none;
	}
}

/* --- Снег --- */
#snow-container {
	position: fixed;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	pointer-events: none;
	z-index: 1;
	overflow: hidden;
}

.snowflake {
	position: absolute;
	top: -10px;
	color: white;
	user-select: none;
	opacity: 0.8;
	animation: fall linear infinite;
}

@keyframes fall {
	0% {
		transform: translateY(-10vh) rotate(0deg);
	}

	100% {
		transform: translateY(110vh) rotate(360deg);
	}
}

.holiday-btn-active svg {
	color: #60a5fa !important;
	filter: drop-shadow(0 0 5px rgba(96, 165, 250, 0.5));
}

/* --- Модальные окна --- */
#systemModal>div,
#addNodeModal>div,
#keyboardModal>div,
#sessionsModal>div,
#genericHintModal>div,
#nodeModal>div,
#filterModal>div,
#nodeDetailModal>div {
	transition: opacity 0.2s ease-out, transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}

.pt-16 {
	padding-top: 4rem;
}

.items-start {
	align-items: flex-start;
}

button.force-expanded .btn-text {
	max-width: 200px !important;
	opacity: 1 !important;
	margin-left: 0.5rem !important;
}

@supports (-webkit-touch-callout: none) {
	body {
		padding-top: env(safe-area-inset-top, 0px);
	}

	nav {
		padding-top: env(safe-area-inset-top, 0px) !important;
	}

	body,
	main {
		padding-bottom: env(safe-area-inset-bottom, 20px) !important;
	}

	.fixed.inset-0 {
		padding-top: env(safe-area-inset-top, 0px);
		padding-bottom: env(safe-area-inset-bottom, 0px);
	}

	body:has(nav) {
		padding-top: 0;
	}
}


@media (max-width: 640px) {
	.notif-dropdown {
		position: fixed !important;
		top: 4.5rem !important;
		left: 0 !important;
		right: 0 !important;
		margin: 0 auto !important;
		width: calc(100vw - 2rem) !important;
		max-width: 380px !important;
		transform: translateY(-10px);
	}

	.notif-dropdown.show {
		transform: translateY(0) !important;
	}
}

/* Инерция (импульсная прокрутка) для всех прокручиваемых блоков */
.custom-scrollbar,
.overflow-y-auto,
.overflow-x-auto {
	-webkit-overflow-scrolling: touch;
}

/* 2. Стилизация Webkit (Chrome, Safari, Edge) */
/* Применяем ТОЛЬКО к элементам с классом .custom-scrollbar */

.custom-scrollbar::-webkit-scrollbar {
	width: 6px;
	/* Тонкий вертикальный скролл */
	height: 6px;
	/* Тонкий горизонтальный скролл */
}

.custom-scrollbar::-webkit-scrollbar-track {
	background: transparent;
}

.custom-scrollbar::-webkit-scrollbar-thumb {
	background-color: rgba(156, 163, 175, 0.5);
	/* gray-400 полупрозрачный */
	border-radius: 9999px;
	border: 2px solid transparent;
	/* Отступ внутри */
	background-clip: content-box;
	transition: background-color 0.2s;
}

.custom-scrollbar::-webkit-scrollbar-thumb:hover {
	background-color: rgba(107, 114, 128, 0.8);
	/* gray-500 при наведении */
}

.custom-scrollbar::-webkit-scrollbar-corner {
	background: transparent;
}

/* Адаптация под темную тему */
.dark .custom-scrollbar::-webkit-scrollbar-thumb {
	background-color: rgba(75, 85, 99, 0.5);
	/* gray-600 */
}

.dark .custom-scrollbar::-webkit-scrollbar-thumb:hover {
	background-color: rgba(156, 163, 175, 0.8);
	/* gray-400 */
}

.custom-scrollbar {
	scrollbar-width: thin;
	scrollbar-color: rgba(156, 163, 175, 0.5) transparent;
}

.dark .custom-scrollbar {
	scrollbar-color: rgba(75, 85, 99, 0.5) transparent;
}

@media (max-width: 390px) {
	nav>div {
		padding-left: 0.5rem !important;
		/* 8px */
		padding-right: 0.5rem !important;
		/* 8px */
		gap: 0.25rem !important;
		/* Уменьшаем разрыв между левой и правой частью */
	}

	nav span.text-lg {
		font-size: 0.95rem !important;
		/* Чуть меньше стандарта */
		max-width: 120px;
		/* Ограничиваем ширину, чтобы не толкал кнопки */
		overflow: hidden;
		text-overflow: ellipsis;
	}

	nav button.w-8.h-8,
	nav form button.w-8.h-8 {
		width: 1.75rem !important;
		/* 28px */
		height: 1.75rem !important;
		/* 28px */
		border-radius: 0.375rem !important;
		/* Чуть меньше скругление */
	}

	nav button svg,
	nav form button svg {
		width: 1rem !important;
		/* 16px */
		height: 1rem !important;
		/* 16px */
	}

	nav .gap-1 {
		gap: 0.125rem !important;
		/* 2px */
	}

	nav .gap-4 {
		gap: 0.25rem !important;
	}

	nav .max-w-\[140px\] {
		padding-left: 0.25rem !important;
		padding-right: 0.25rem !important;
	}

	nav .max-w-\[140px\] span {
		font-size: 0.65rem !important;
		max-width: 60px;
	}
}

/* Role Badge Styles */
.role-badge-owner {
	border-color: rgba(239, 68, 68, 0.3);
	background-color: #fee2e2;
	color: #dc2626;
}

html.dark .role-badge-owner {
	border-color: rgba(239, 68, 68, 0.3);
	background-color: rgba(127, 29, 29, 0.4);
	color: #f87171;
}

.role-badge-admin {
	border-color: rgba(34, 197, 94, 0.3);
	background-color: #dcfce7;
	color: #16a34a;
}

html.dark .role-badge-admin {
	border-color: rgba(34, 197, 94, 0.3);
	background-color: rgba(20, 83, 45, 0.4);
	color: #4ade80;
}

.role-badge-user {
	border-color: rgba(245, 158, 11, 0.3);
	background-color: #fef3c7;
	color: #d97706;
}

html.dark .role-badge-user {
	border-color: rgba(245, 158, 11, 0.3);
	background-color: rgba(120, 53, 15, 0.4);
	color: #fbbf24;
}

main {
	z-index: auto !important;
}

#systemModal,
#addNodeModal,
#keyboardModal,
#sessionsModal,
#genericHintModal,
#nodeModal {
	z-index: 9999 !important;
}

/* Node card reboot button */
.node-reboot-btn {
	background-color: #fee2e2;
}

html.dark .node-reboot-btn {
	background-color: rgba(239, 68, 68, 0.15);
	border: 1px solid rgba(239, 68, 68, 0.3);
}

html.dark .node-reboot-btn:hover {
	background-color: rgba(239, 68, 68, 0.25);
}

/* Services spoiler blur effect */
.services-blur-overlay {
	position: absolute;
	bottom: 40px;
	left: 0;
	right: 0;
	height: 50px;
	background: linear-gradient(to bottom, transparent, rgba(249, 250, 251, 0.95));
	pointer-events: none;
	border-radius: 0 0 0.75rem 0.75rem;
}

html.dark .services-blur-overlay {
	background: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.4));
}

.services-toggle-btn.expanded svg {
	transform: rotate(180deg);
}

#modalServicesContainer[data-show-all="true"]+#modalServicesToggle .services-blur-overlay {
	display: none;
}

/* Monitor link button */
.monitor-link-btn {
	background-color: #faf5ff;
	border: 1px solid #e9d5ff;
	color: #9333ea;
}

.monitor-link-btn:hover {
	background-color: #f3e8ff;
}

html.dark .monitor-link-btn {
	background-color: rgba(147, 51, 234, 0.15);
	border-color: rgba(147, 51, 234, 0.3);
	color: #c084fc;
}

html.dark .monitor-link-btn:hover {
	background-color: rgba(147, 51, 234, 0.25);
}

/* Missing Tailwind dark mode classes for nodes monitor */
.dark\:bg-red-500\/20:is(.dark *) {
	background-color: rgba(239, 68, 68, .2);
}

.dark\:hover\:bg-red-500\/20:hover:is(.dark *) {
	background-color: rgba(239, 68, 68, .2);
}

.dark\:hover\:bg-green-500\/20:hover:is(.dark *) {
	background-color: rgba(34, 197, 94, .2);
}

.dark\:hover\:bg-yellow-500\/20:hover:is(.dark *) {
	background-color: rgba(234, 179, 8, .2);
}

.dark\:hover\:bg-blue-500\/30:hover:is(.dark *) {
	background-color: rgba(59, 130, 246, .3);
}

/* Ping badge classes */
.bg-yellow-100 {
	background-color: rgb(254, 249, 195);
}

.text-yellow-700 {
	color: rgb(161, 98, 7);
}

.dark\:bg-yellow-900\/30:is(.dark *) {
	background-color: rgba(113, 63, 18, .3);
}

/* Responsive adjustments for Network Activity section on narrow screens */
@media (max-width: 484px) {
	/* Делаем контейнер на всю ширину и применяем стиль единой панели */
	#networkBadgesContainer {
		width: 100% !important;
		justify-content: space-between !important;
		margin-top: 0.75rem !important;
		background-color: #f9fafb !important;
		padding: 0.25rem !important;
		border-radius: 0.75rem !important;
		border: 1px solid #e5e7eb !important;
		gap: 0 !important;
	}

	html.dark #networkBadgesContainer {
		background-color: rgba(0, 0, 0, 0.2) !important;
		border-color: rgba(255, 255, 255, 0.05) !important;
	}

	/* Убираем рамки и фон у самих кнопок, чтобы они слились в одну панель */
	#networkBadgesContainer .network-badge {
		flex: 1 1 0% !important;
		justify-content: center !important;
		background-color: transparent !important;
		border: none !important;
		box-shadow: none !important;
		padding-top: 0.375rem !important;
		padding-bottom: 0.375rem !important;
	}

	/* Показываем разделитель и жестко задаем ему размеры и цвет */
	#networkBadgesDivider {
		display: block !important;
		width: 1px !important;
		min-width: 1px !important;
		height: 1.25rem !important; /* Аккуратная высота линии */
		background-color: #d1d5db !important; /* Серый цвет для светлой темы */
		margin: 0 4px !important;
		flex-shrink: 0 !important;
	}

	html.dark #networkBadgesDivider {
		background-color: #4b5563 !important; /* Темно-серый цвет для темной темы */
	}

	/* Уменьшаем размер шрифтов в бейджах для компактности */
	#agentPingBadge span:first-child {
		font-size: 0.55rem !important;
	}А
	#agentPing, #agentIp {
		font-size: 0.625rem !important;
	}
	#agentIpBadge svg {
		width: 0.875rem !important;
		height: 0.875rem !important;
	}
}