/* Пульсирующая точка статуса */
.pulse-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--ok);
  box-shadow: 0 0 0 0 rgba(56,232,160,.7); animation: pulse 2.2s infinite; }
@keyframes pulse {
  0%   { box-shadow: 0 0 0 0 rgba(56,232,160,.55); }
  70%  { box-shadow: 0 0 0 10px rgba(56,232,160,0); }
  100% { box-shadow: 0 0 0 0 rgba(56,232,160,0); }
}
/* Цвета точки статуса по состоянию подключения слоя данных */
.pulse-dot.ok   { background: var(--ok); }
.pulse-dot.warn { background: var(--warn);
  box-shadow: 0 0 0 0 rgba(255,207,92,.7); animation: pulse-warn 1.6s infinite; }
.pulse-dot.err  { background: var(--err); animation: none; }
.pill-text { white-space: nowrap; }
@keyframes pulse-warn {
  0%   { box-shadow: 0 0 0 0 rgba(255,207,92,.55); }
  70%  { box-shadow: 0 0 0 10px rgba(255,207,92,0); }
  100% { box-shadow: 0 0 0 0 rgba(255,207,92,0); }
}

/* Фоновый космос (canvas): звёзды, туманности, кометы */
.space-canvas { position: fixed; inset: 0; z-index: -1; width: 100vw; height: 100vh;
  pointer-events: none; display: block; }

/* Статичное звёздное поле фона — резерв и доп.слой под canvas */
.bg-stars { position: fixed; inset: 0; z-index: -2; pointer-events: none;
  background-image:
    radial-gradient(1px 1px at 20% 30%, rgba(255,255,255,.8), transparent),
    radial-gradient(1px 1px at 70% 60%, rgba(255,255,255,.6), transparent),
    radial-gradient(1.5px 1.5px at 40% 80%, rgba(180,200,255,.7), transparent),
    radial-gradient(1px 1px at 85% 20%, rgba(255,255,255,.5), transparent);
  background-size: 400px 400px; opacity: .6; animation: drift 60s linear infinite; }
@keyframes drift { from { background-position: 0 0; } to { background-position: 400px 400px; } }

/* Пульс live-индикатора графиков */
@keyframes pulse-teal {
  0%   { box-shadow: 0 0 0 0 rgba(56,232,208,.6); }
  70%  { box-shadow: 0 0 0 8px rgba(56,232,208,0); }
  100% { box-shadow: 0 0 0 0 rgba(56,232,208,0); }
}

/* Появление карточек и панелей */
.card, .metric, .panel, .activity-feed li { animation: rise .6s ease both; }
@keyframes rise { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } }

/* Новый элемент ленты активности «въезжает» сверху */
.activity-feed li { transition: transform .4s ease, opacity .4s ease; }
.activity-feed li.enter { opacity: 0; transform: translateY(-10px); }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation: none !important;
    transition: none !important;
    scroll-behavior: auto !important;
  }
}
