/* UI Fresh Patch (buttons + links + subtle animations)
   Include after existing ui.css: <link rel="stylesheet" href="assets/ui_patch.css?v=1">
*/

:root{
  --fx-blue: rgba(88,185,255,.95);
  --fx-blue2: rgba(88,185,255,.35);
  --fx-glow: 0 0 0 3px rgba(88,185,255,.14), 0 14px 34px rgba(0,0,0,.45);
  --fx-stroke: rgba(255,255,255,.14);
  --fx-bg: rgba(0,0,0,.22);
}

@keyframes floatIn {
  from{ transform: translateY(6px); opacity:0 }
  to{ transform: translateY(0); opacity:1 }
}
@keyframes pulseGlow {
  0%,100%{ box-shadow: 0 0 0 0 rgba(88,185,255,.0), 0 10px 30px rgba(0,0,0,.35) }
  50%{ box-shadow: 0 0 0 4px rgba(88,185,255,.12), 0 18px 46px rgba(0,0,0,.55) }
}
@keyframes sheen {
  0%{ transform: translateX(-140%) }
  100%{ transform: translateX(220%) }
}
@keyframes clickPop {
  0%{ transform: scale(1) }
  40%{ transform: scale(.98) }
  100%{ transform: scale(1) }
}

/* Buttons (covers .btn, button, submit) */
.btn, button, input[type="submit"]{
  position: relative;
  overflow: hidden;
  border-radius: 14px !important;
  border: 1px solid var(--fx-stroke) !important;
  background: linear-gradient(180deg, rgba(255,255,255,.08), rgba(0,0,0,.20)) !important;
  color: rgba(255,255,255,.90) !important;
  font-weight: 800 !important;
  letter-spacing: .1px;
  transition: transform .14s ease, box-shadow .14s ease, border-color .14s ease, filter .14s ease;
  will-change: transform;
  animation: floatIn .28s ease both;
}
.btn::after, button::after, input[type="submit"]::after{
  content:"";
  position:absolute;
  inset:-2px;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,.18), transparent);
  transform: translateX(-140%);
  pointer-events:none;
}
.btn:hover, button:hover, input[type="submit"]:hover{
  transform: translateY(-1px);
  border-color: rgba(88,185,255,.32) !important;
  box-shadow: var(--fx-glow);
  filter: saturate(1.06);
}
.btn:hover::after, button:hover::after, input[type="submit"]:hover::after{
  animation: sheen .9s ease;
}
.btn:active, button:active, input[type="submit"]:active{
  transform: translateY(0);
}

/* Primary buttons (try to detect existing classes) */
.btn-primary, .btn.primary, button.primary, input[type="submit"].primary{
  border-color: rgba(88,185,255,.35) !important;
  background: linear-gradient(180deg, rgba(88,185,255,.30), rgba(88,185,255,.12)) !important;
}
.btn-primary:hover, .btn.primary:hover, button.primary:hover, input[type="submit"].primary:hover{
  animation: pulseGlow 1.2s ease-in-out infinite;
}

/* Small pill / badge (PHP+MySQL ready) */
.badge, .pill, .status-pill{
  border: 1px solid rgba(88,185,255,.28) !important;
  background: rgba(88,185,255,.10) !important;
  color: rgba(210,245,255,.96) !important;
  border-radius: 999px !important;
  padding: 6px 10px !important;
  font-weight: 800 !important;
  letter-spacing: .1px;
  transition: transform .14s ease, box-shadow .14s ease;
}
.badge:hover, .pill:hover, .status-pill:hover{
  transform: translateY(-1px);
  box-shadow: 0 0 0 3px rgba(88,185,255,.12);
}

/* Top-right nav links (Activity / Incidents)
   We want them to look like buttons by default (not just text links).
*/
.tenantbar a.btn[href*="activity"],
.tenantbar a.btn[href*="incidents"],
a.navlink,
.topnav a{
  position: relative;
  text-decoration: none !important;
  color: rgba(210,245,255,.94) !important;
  font-weight: 850;
  padding: 8px 12px;
  border-radius: 999px;
  background: rgba(255,255,255,.06);
  border: 1px solid rgba(255,255,255,.12);
  box-shadow: 0 8px 26px rgba(0,0,0,.35);
  transition: transform .14s ease, background .14s ease, box-shadow .14s ease, border-color .14s ease;
}

/* Fix: tenant bar links sometimes not clickable because of overlays/sticky elements */
.tenantbar{
  position: relative;
  z-index: 200; /* higher than sticky .topbar (ui.css uses z-index:20) */
}
.tenantbar *{
  pointer-events: auto;
}
.tenantbar a.btn[href*="activity"]:hover,
.tenantbar a.btn[href*="incidents"]:hover,
a.navlink:hover,
.topnav a:hover{
  background: rgba(255,255,255,.09);
  border-color: rgba(88,185,255,.35);
  box-shadow: 0 0 0 3px rgba(88,185,255,.12), 0 10px 30px rgba(0,0,0,.35);
  transform: translateY(-1px);
}

.tenantbar a.btn[href*="activity"]::after,
.tenantbar a.btn[href*="incidents"]::after,
a.navlink::after,
.topnav a::after{
  content:"";
  position:absolute;
  left:12px; right:12px; bottom:6px;
  height:2px;
  background: linear-gradient(90deg, rgba(88,185,255,.0), rgba(88,185,255,.85), rgba(88,185,255,.0));
  opacity:0;
  transition: opacity .14s ease;
}
.tenantbar a.btn[href*="activity"]:hover::after,
.tenantbar a.btn[href*="incidents"]:hover::after,
a.navlink:hover::after,
.topnav a:hover::after{
  opacity:1;
}

/* Tenant select looks more modern */
select{
  border-radius: 14px !important;
  border: 1px solid rgba(255,255,255,.14) !important;
  background: rgba(0,0,0,.22) !important;
  color: rgba(255,255,255,.92) !important;
  padding: 10px 12px !important;
  transition: border-color .14s ease, box-shadow .14s ease;
}
select:focus{
  border-color: rgba(88,185,255,.40) !important;
  box-shadow: 0 0 0 3px rgba(88,185,255,.12) !important;
  outline: none !important;
}

/* ===============================
   GLOBAL MARQUEE – FULL WIDTH
   RIGHT ➜ LEFT (INFINITE)
   - Start dari LUAR kanan layar (100vw)
   - Keluar total ke kiri (-100%)
   - Loop terus (infinite)
   - Jelas dibaca
   =============================== */

:root{
  --rp-marquee-speed: 6s;   /* kecil = makin cepat */
  --rp-marquee-gap: 240px;  /* besar = makin tidak terlihat dobel */
}

.announceBar{
  margin: 10px 0 14px;
  padding: 10px 14px;
  display: flex;
  align-items: center;
  gap: 12px;
  border: 1px solid rgba(255,255,255,.12);
  background: rgba(255,255,255,.04);
  border-radius: 999px;
  overflow: hidden;
  position: relative;
}

.announceDot{
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: #22c55e;
  box-shadow: 0 0 0 4px rgba(34,197,94,.25);
  flex-shrink: 0;
}

.announceMarquee{
  position: relative;
  overflow: hidden;
  flex: 1;
  white-space: nowrap;
}

/* fade edges biar elegan */
.announceMarquee{
  -webkit-mask-image: linear-gradient(to right, transparent 0, #000 28px, #000 calc(100% - 28px), transparent 100%);
  mask-image: linear-gradient(to right, transparent 0, #000 28px, #000 calc(100% - 28px), transparent 100%);
}

.announceTrack{
  display: inline-flex;
  gap: var(--rp-marquee-gap);
  will-change: transform;
  animation: marquee-full var(--rp-marquee-speed) linear infinite;
}

.announceItem{
  font-size: 13px;
  font-weight: 700;
  letter-spacing: .3px;
  color: rgba(234,242,255,.92);
  text-shadow: 0 1px 2px rgba(0,0,0,.65);
}

/* kunci: start dari ujung kanan viewport */
@keyframes marquee-full{
  from{ transform: translateX(100vw); }
  to  { transform: translateX(-100%); }
}

.announceBar:hover .announceTrack{
  animation-play-state: paused; /* hover biar mudah dibaca */
}

@media (prefers-reduced-motion: reduce){
  .announceTrack{ animation: none; transform: none; }
  .announceMarquee{ -webkit-mask-image: none; mask-image: none; }
}


/* Glass utility helpers */
.glass{
  background: var(--glass-bg);
  border: 1px solid var(--glass-brd);
  backdrop-filter: blur(var(--glass-blur));
  -webkit-backdrop-filter: blur(var(--glass-blur));
  box-shadow: var(--shadow);
}
.glass:hover{ box-shadow: var(--shadow2); }

/* ============================
   WOW Status Pill (Blocked/Safe)
   ============================ */
@keyframes stBlockedPulse {
  0%,100%{ box-shadow: 0 0 0 0 rgba(255,59,59,.0), 0 10px 26px rgba(0,0,0,.32) }
  50%{ box-shadow: 0 0 0 4px rgba(255,59,59,.18), 0 16px 40px rgba(0,0,0,.52) }
}
@keyframes stSafeBreath {
  0%,100%{ transform: translateY(0) scale(1); }
  50%{ transform: translateY(-1px) scale(1.03); }
}
@keyframes stFlashOnce {
  0%{ opacity: .0; transform: scale(.86); filter: saturate(1.2); }
  100%{ opacity: 1; transform: scale(1); filter: saturate(1); }
}

/* make pill more premium */
.status-pill{
  padding: 6px 12px !important;
  gap: 7px !important;
  border: 1px solid rgba(255,255,255,.16) !important;
  background: rgba(255,255,255,.06) !important;
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  box-shadow: 0 10px 28px rgba(0,0,0,.38);
}

/* Blocked */
.status-pill.st-block{
  color: rgba(255,245,245,.98) !important;
  border-color: rgba(255,85,85,.35) !important;
  background: linear-gradient(135deg, rgba(255,59,59,.40), rgba(179,18,23,.22)) !important;
  animation: stBlockedPulse 1.6s ease-in-out infinite;
}

/* Safe */
.status-pill.st-safe{
  color: rgba(235,255,244,.98) !important;
  border-color: rgba(34,197,94,.32) !important;
  background: linear-gradient(135deg, rgba(30,207,122,.34), rgba(15,157,88,.18)) !important;
  animation: stSafeBreath 2.8s ease-in-out infinite;
}

/* Unknown */
.status-pill.st-unknown{
  border-color: rgba(148,163,184,.26) !important;
  background: rgba(148,163,184,.12) !important;
  color: rgba(240,248,255,.88) !important;
}

/* Flash */
.status-pill.st-flash{
  animation: stFlashOnce .9s ease both;
}



/* =========================
   Status Pill (Domain)
========================= */
.status-pill{
  display:inline-flex;
  align-items:center;
  gap:6px;
  padding:6px 12px;
  border-radius:999px;
  font-weight:800;
  font-size:.72rem;
  letter-spacing:.25px;
  line-height:1;
  position:relative;
  overflow:hidden;
  transform: translateZ(0);
}

.status-pill::before{
  content:"";
  position:absolute;
  inset:-40% -60%;
  background: radial-gradient(circle at 20% 20%, rgba(255,255,255,.22), transparent 55%),
              radial-gradient(circle at 80% 40%, rgba(255,255,255,.12), transparent 60%);
  opacity:.65;
  transform: rotate(12deg);
  pointer-events:none;
}

.status-pill.st-ok{
  color: rgba(235,255,245,.98);
  background: linear-gradient(135deg, rgba(34,197,94,.92), rgba(16,185,129,.75));
  border: 1px solid rgba(34,197,94,.35) !important;
  box-shadow: 0 0 14px rgba(34,197,94,.22);
  animation: stBreath 3.2s ease-in-out infinite;
}
@keyframes stBreath{
  0%{ transform: scale(1); filter:saturate(1); }
  50%{ transform: scale(1.04); filter:saturate(1.2); }
  100%{ transform: scale(1); filter:saturate(1); }
}

.status-pill.st-bad{
  color:#fff;
  background: linear-gradient(135deg, rgba(239,68,68,.95), rgba(190,18,60,.82));
  border: 1px solid rgba(239,68,68,.38) !important;
  box-shadow: 0 0 18px rgba(239,68,68,.32);
  animation: stPulse 1.55s ease-in-out infinite;
}
@keyframes stPulse{
  0%{ box-shadow:0 0 10px rgba(239,68,68,.22); transform: scale(1); }
  50%{ box-shadow:0 0 22px rgba(239,68,68,.48); transform: scale(1.03); }
  100%{ box-shadow:0 0 10px rgba(239,68,68,.22); transform: scale(1); }
}

.status-pill.st-unknown{
  color: rgba(226,232,240,.95);
  background: linear-gradient(135deg, rgba(148,163,184,.28), rgba(30,41,59,.45));
  border: 1px solid rgba(148,163,184,.28) !important;
}

/* flash effect when status changes */
.status-pill.st-flash{
  animation: stFlash .8s ease both;
}
@keyframes stFlash{
  from{ opacity:0; transform: scale(.88); filter: blur(1px); }
  to{ opacity:1; transform: scale(1); filter: blur(0); }
}

/* =========================
   Live Redirect Banner
========================= */
.redirect-banner{
  margin-top:12px;
  padding:10px 12px;
  border-radius:14px;
  border:1px solid rgba(56,189,248,.22);
  background: radial-gradient(800px 200px at 20% 20%, rgba(56,189,248,.18), transparent 55%),
              rgba(2,6,23,.40);
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:10px;
  overflow:hidden;
  position:relative;
}
.redirect-banner .rb-left{
  display:flex;
  align-items:center;
  gap:10px;
  flex-wrap:wrap;
}
.redirect-banner .rb-tag{
  display:inline-flex;
  align-items:center;
  gap:6px;
  padding:6px 10px;
  border-radius:999px;
  font-weight:800;
  font-size:.72rem;
  border:1px solid rgba(56,189,248,.25);
  background: rgba(56,189,248,.10);
  color: rgba(210,245,255,.95);
}
.redirect-banner .rb-flow{
  display:inline-flex;
  align-items:center;
  gap:10px;
  font-weight:900;
  letter-spacing:.2px;
}
.redirect-banner .rb-node{
  padding:6px 10px;
  border-radius:12px;
  border:1px solid rgba(148,163,184,.18);
  background: rgba(15,23,42,.35);
  color: rgba(226,232,240,.96);
  max-width: 240px;
  white-space: nowrap;
  overflow:hidden;
  text-overflow: ellipsis;
}
.redirect-banner .rb-arrow{
  width: 44px;
  height: 2px;
  background: rgba(56,189,248,.55);
  position: relative;
  border-radius: 99px;
}
.redirect-banner .rb-arrow::after{
  content:"";
  position:absolute;
  right:-2px;
  top:50%;
  transform: translateY(-50%) rotate(45deg);
  width:10px;
  height:10px;
  border-right:2px solid rgba(56,189,248,.75);
  border-top:2px solid rgba(56,189,248,.75);
}
.redirect-banner::before{
  content:"";
  position:absolute;
  inset:0;
  background: linear-gradient(90deg, transparent, rgba(56,189,248,.18), transparent);
  transform: translateX(-100%);
  animation: rbSweep 1.6s ease-in-out infinite;
  opacity:.65;
  pointer-events:none;
}
@keyframes rbSweep{
  0%{ transform: translateX(-100%); }
  100%{ transform: translateX(100%); }
}
.redirect-banner.rb-pop{
  animation: rbPop .7s ease both;
}
@keyframes rbPop{
  from{ opacity:0; transform: translateY(10px) scale(.98); }
  to{ opacity:1; transform: translateY(0) scale(1); }
}

/* =========================
   Incident Timeline (Animated)
========================= */
.inc-timeline{
  display:flex;
  flex-direction:column;
  gap:14px;
  margin-top:14px;
}
.inc-item{
  display:grid;
  grid-template-columns: 18px 1fr;
  gap:12px;
}
.inc-dotwrap{
  position:relative;
}
.inc-dotwrap::after{
  content:"";
  position:absolute;
  left:8px;
  top:18px;
  bottom:-18px;
  width:2px;
  background: linear-gradient(180deg, rgba(148,163,184,.25), transparent);
}
.inc-dot{
  width:14px;
  height:14px;
  border-radius:50%;
  margin-top:4px;
  border:2px solid rgba(148,163,184,.25);
  background: rgba(15,23,42,.8);
  box-shadow: 0 0 0 rgba(0,0,0,0);
}
.inc-card{
  border-radius:16px;
  border:1px solid rgba(148,163,184,.18);
  background: rgba(15,23,42,.35);
  padding:12px 14px;
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  transition: transform .2s ease, border-color .2s ease, box-shadow .2s ease;
}
.inc-card:hover{
  transform: translateY(-2px);
  border-color: rgba(56,189,248,.28);
  box-shadow: 0 12px 40px rgba(0,0,0,.35);
}
.inc-top{
  display:flex;
  justify-content:space-between;
  gap:10px;
  flex-wrap:wrap;
  align-items:center;
}
.inc-ev{
  font-weight:900;
  letter-spacing:.2px;
}
.inc-meta{
  color: rgba(148,163,184,.9);
  font-size:.78rem;
}
.inc-detail{
  margin-top:10px;
  color: rgba(226,232,240,.92);
  font-size:.85rem;
  line-height:1.35;
  white-space: pre-wrap;
  word-break: break-word;
}
.inc-badge{
  display:inline-flex;
  align-items:center;
  gap:6px;
  padding:6px 10px;
  border-radius:999px;
  font-size:.72rem;
  font-weight:800;
  border:1px solid rgba(148,163,184,.20);
  background: rgba(2,6,23,.45);
}
.inc-sev-ok .inc-dot{ border-color: rgba(34,197,94,.55); box-shadow:0 0 14px rgba(34,197,94,.22); }
.inc-sev-ok .inc-badge{ border-color: rgba(34,197,94,.35); background: rgba(34,197,94,.10); color: rgba(235,255,245,.95); }

.inc-sev-warn .inc-dot{ border-color: rgba(245,158,11,.55); box-shadow:0 0 16px rgba(245,158,11,.22); }
.inc-sev-warn .inc-badge{ border-color: rgba(245,158,11,.35); background: rgba(245,158,11,.10); color: rgba(255,243,219,.95); }

.inc-sev-bad .inc-dot{ border-color: rgba(239,68,68,.60); box-shadow:0 0 18px rgba(239,68,68,.26); }
.inc-sev-bad .inc-badge{ border-color: rgba(239,68,68,.40); background: rgba(239,68,68,.12); color: rgba(255,235,235,.96); }

.inc-enter{
  animation: incEnter .55s ease both;
}
@keyframes incEnter{
  from{ opacity:0; transform: translateY(8px); filter: blur(1px); }
  to{ opacity:1; transform: translateY(0); filter: blur(0); }
}


/* ============================
   Incident Center • Clear Admin UI (Nebula)
   ============================ */
.inc-page{ padding-top:18px; padding-bottom:46px; }
.inc-hero{ display:flex; justify-content:space-between; gap:18px; padding:18px; margin-bottom:14px; }
.inc-hero-title{ font-size:1.4rem; font-weight:900; letter-spacing:.2px; }
.inc-hero-sub{ margin-top:6px; font-size:.92rem; opacity:.9; }
.inc-hero-right{ display:flex; gap:10px; align-items:stretch; flex-wrap:wrap; }
.inc-stat{ min-width:92px; padding:10px 12px; border-radius:14px; border:1px solid rgba(255,255,255,.10); background: rgba(255,255,255,.04); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); text-align:center; }
.inc-stat .k{ font-size:11px; opacity:.75; font-weight:800; letter-spacing:.7px; }
.inc-stat .v{ font-size:20px; font-weight:900; margin-top:2px; }
.inc-stat.critical{ border-color: rgba(239,68,68,.35); box-shadow: 0 0 18px rgba(239,68,68,.18); }
.inc-stat.warn{ border-color: rgba(245,158,11,.30); box-shadow: 0 0 18px rgba(245,158,11,.12); }
.inc-stat.info{ border-color: rgba(59,130,246,.28); box-shadow: 0 0 18px rgba(59,130,246,.10); }

.inc-toolbar{ padding:14px 14px 12px; margin-bottom:14px; }
.inc-toolbar-row{ display:flex; gap:12px; align-items:end; flex-wrap:wrap; }
.inc-field{ display:flex; flex-direction:column; gap:6px; min-width:240px; }
.inc-field > span{ font-size:12px; opacity:.75; font-weight:700; letter-spacing:.3px; }
.inc-grow{ flex:1; min-width:260px; }
.inc-toolbar-actions{ display:flex; gap:8px; align-items:center; flex-wrap:wrap; }

.inc-filter-row{ display:flex; gap:8px; align-items:center; flex-wrap:wrap; margin-top:10px; }
.chip{ border:1px solid rgba(255,255,255,.12); background: rgba(255,255,255,.04); padding:8px 12px; border-radius:999px; font-weight:800; font-size:12px; cursor:pointer; transition: transform .12s ease, background .12s ease, border-color .12s ease; color: rgba(255,255,255,.88); }
.chip:hover{ transform: translateY(-1px); }
.chip.active{ background: rgba(255,255,255,.10); border-color: rgba(255,255,255,.22); }
.chip-critical{ border-color: rgba(239,68,68,.35); }
.chip-warn{ border-color: rgba(245,158,11,.30); }
.chip-info{ border-color: rgba(59,130,246,.28); }

.inc-card{ display:grid; grid-template-columns: 260px 1fr 210px; gap:14px; align-items:start; }
@media (max-width: 920px){
  .inc-card{ grid-template-columns: 1fr; }
}
.inc-card-left .inc-ev{ font-size:14px; font-weight:900; letter-spacing:.2px; margin-top:8px; }
.inc-sub{ margin-top:6px; font-size:12.5px; opacity:.9; line-height:1.35; }
.inc-sub b{ font-weight:900; }
.inc-badge{ display:inline-flex; gap:8px; align-items:center; padding:7px 12px; border-radius:999px; font-size:12px; font-weight:900; border:1px solid rgba(255,255,255,.12); background: rgba(255,255,255,.04); }
.inc-badge.critical{ border-color: rgba(239,68,68,.45); box-shadow: 0 0 16px rgba(239,68,68,.18); }
.inc-badge.warn{ border-color: rgba(245,158,11,.40); box-shadow: 0 0 16px rgba(245,158,11,.12); }
.inc-badge.info{ border-color: rgba(59,130,246,.38); box-shadow: 0 0 16px rgba(59,130,246,.10); }

.inc-details{ margin-top:2px; }
.inc-details > summary{ cursor:pointer; font-weight:800; font-size:12.5px; opacity:.9; list-style:none; }
.inc-details > summary::-webkit-details-marker{ display:none; }
.inc-details > summary:before{ content:'▸'; display:inline-block; margin-right:8px; opacity:.75; transform: translateY(-1px); }
.inc-details[open] > summary:before{ content:'▾'; }
.inc-json{ margin-top:10px; padding:12px 12px; border-radius:14px; border:1px solid rgba(255,255,255,.10); background: rgba(0,0,0,.30); font-size:12px; line-height:1.45; overflow:auto; max-height: 320px; }
.inc-card-right .inc-meta{ font-size:12px; display:flex; flex-direction:column; gap:6px; opacity:.95; }
