/* static/css/globe-patch3.css — Part 07 sensor panel + cards.
 *
 * Inherits pv theme tokens (--pv-bg, --pv-fg, --pv-accent-*, etc.) from
 * theme.css / pv04.css. Adds only sensor-specific selectors.
 *
 * Namespace: .pv-sensor-*
 * State classes: .is-active | .is-loading | .is-ok | .is-offline
 *                .is-stale | .is-error | .is-disabled | pv-multi-active (on body)
 */

:root {
  --pv-sensor-panel-w: 300px;
  --pv-sensor-card-gap: 8px;
  --pv-sensor-radius: 4px;
  --pv-sensor-chip-h: 18px;

  --pv-sensor-bg:            rgba(7, 10, 14, 0.92);
  --pv-sensor-border:        rgba(80, 110, 130, 0.35);
  --pv-sensor-card-bg:       rgba(15, 22, 28, 0.85);
  --pv-sensor-card-border:   rgba(60, 90, 110, 0.28);
  --pv-sensor-card-hover:    rgba(20, 32, 40, 0.95);

  --pv-sensor-ok:       #2bd17c;
  --pv-sensor-offline:  #e6b142;  /* yellow-solid — dormant */
  --pv-sensor-stale:    #e09040;  /* warm yellow — pulsing */
  --pv-sensor-error:    #ff4d4d;
  --pv-sensor-disabled: #555;
}

/* --- Toggle button in the picker bar ----------------------------------- */

.pv-sensor-multi-toggle {
  appearance: none;
  background: transparent;
  color: var(--pv-fg, #d8e4ea);
  border: 1px solid var(--pv-sensor-border);
  border-radius: var(--pv-sensor-radius);
  padding: 4px 10px;
  font-family: "JetBrains Mono", "IBM Plex Mono", ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: 0.08em;
  text-transform: lowercase;
  cursor: pointer;
  transition: background 120ms ease, border-color 120ms ease, color 120ms ease;
}
.pv-sensor-multi-toggle:hover {
  background: rgba(80, 180, 220, 0.08);
  border-color: rgba(100, 200, 220, 0.5);
}
.pv-sensor-multi-toggle.is-active {
  background: rgba(43, 209, 124, 0.14);
  border-color: var(--pv-sensor-ok);
  color: var(--pv-sensor-ok);
}

/* --- Panel ------------------------------------------------------------- */

.pv-sensor-panel {
  position: fixed;
  top: 68px;
  right: 12px;
  width: var(--pv-sensor-panel-w);
  max-height: calc(100vh - 100px);
  background: var(--pv-sensor-bg);
  border: 1px solid var(--pv-sensor-border);
  border-radius: var(--pv-sensor-radius);
  color: var(--pv-fg, #d8e4ea);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  z-index: 850;
  display: none;
  flex-direction: column;
  font-family: "JetBrains Mono", "IBM Plex Mono", ui-monospace, monospace;
  font-size: 11px;
  box-shadow: 0 6px 24px rgba(0, 0, 0, 0.5);
}
.pv-sensor-panel.is-active {
  display: flex;
}
.pv-sensor-panel.is-loading {
  /* subtle pulse on the whole panel while fetching */
  animation: pv-sensor-loading 1.2s ease-in-out infinite;
}
@keyframes pv-sensor-loading {
  0%, 100% { border-color: var(--pv-sensor-border); }
  50%      { border-color: rgba(120, 180, 200, 0.6); }
}

.pv-sensor-panel__head {
  padding: 8px 12px;
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  border-bottom: 1px solid var(--pv-sensor-border);
  background: rgba(0, 0, 0, 0.35);
}
.pv-sensor-panel__title {
  text-transform: uppercase;
  letter-spacing: 0.15em;
  font-size: 10px;
  color: rgba(180, 200, 210, 0.7);
}
.pv-sensor-panel__count {
  color: var(--pv-sensor-ok);
  font-variant-numeric: tabular-nums;
}

.pv-sensor-panel__list {
  padding: 10px;
  display: flex;
  flex-direction: column;
  gap: var(--pv-sensor-card-gap);
  overflow-y: auto;
  flex: 1 1 auto;
}

.pv-sensor-panel__foot {
  padding: 6px 12px;
  border-top: 1px solid var(--pv-sensor-border);
  background: rgba(0, 0, 0, 0.35);
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 10px;
  color: rgba(160, 180, 195, 0.6);
}
.pv-sensor-panel__foot [data-field="slug"] {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  flex: 1 1 auto;
  margin-right: 8px;
}
.pv-sensor-panel__refresh {
  appearance: none;
  background: transparent;
  color: rgba(180, 200, 210, 0.7);
  border: 1px solid var(--pv-sensor-border);
  border-radius: 3px;
  padding: 2px 8px;
  font-size: 12px;
  line-height: 1;
  cursor: pointer;
}
.pv-sensor-panel__refresh:hover {
  color: var(--pv-sensor-ok);
  border-color: var(--pv-sensor-ok);
}

/* --- Card -------------------------------------------------------------- */

.pv-sensor-card {
  background: var(--pv-sensor-card-bg);
  border: 1px solid var(--pv-sensor-card-border);
  border-left-width: 3px;
  border-radius: var(--pv-sensor-radius);
  padding: 8px 10px 6px;
  transition: border-color 160ms ease, background 160ms ease;
  position: relative;
  overflow: hidden;
}
.pv-sensor-card:hover {
  background: var(--pv-sensor-card-hover);
}

.pv-sensor-card__head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 4px;
}
.pv-sensor-card__id {
  font-weight: 600;
  letter-spacing: 0.12em;
  font-size: 12px;
  color: rgba(220, 235, 240, 0.95);
}
.pv-sensor-card__status-chip {
  font-size: 9px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  padding: 2px 6px;
  border-radius: 2px;
  height: var(--pv-sensor-chip-h);
  line-height: calc(var(--pv-sensor-chip-h) - 4px);
  background: rgba(85, 85, 85, 0.3);
  color: var(--pv-sensor-disabled);
}
.pv-sensor-card__city {
  font-size: 11px;
  color: rgba(200, 220, 228, 0.85);
  font-family: ui-sans-serif, system-ui, -apple-system, sans-serif;
}
.pv-sensor-card__name {
  font-size: 10px;
  color: rgba(150, 170, 180, 0.55);
  margin-bottom: 6px;
}
.pv-sensor-card__stats {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 4px 10px;
  margin: 0 0 4px;
}
.pv-sensor-card__stats > div {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}
.pv-sensor-card__stats dt {
  font-size: 9px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: rgba(140, 160, 170, 0.5);
  margin: 0;
}
.pv-sensor-card__stats dd {
  margin: 0;
  font-size: 11px;
  font-variant-numeric: tabular-nums;
  color: rgba(220, 235, 240, 0.9);
}
.pv-sensor-card__reason {
  font-size: 10px;
  color: rgba(180, 180, 170, 0.5);
  margin-top: 4px;
  font-style: italic;
  min-height: 0;
}
.pv-sensor-card__reason:empty {
  display: none;
}

/* --- Card state variants ---------------------------------------------- */

.pv-sensor-card.is-ok {
  border-left-color: var(--pv-sensor-ok);
}
.pv-sensor-card.is-ok .pv-sensor-card__status-chip {
  background: rgba(43, 209, 124, 0.18);
  color: var(--pv-sensor-ok);
}

.pv-sensor-card.is-offline {
  border-left-color: var(--pv-sensor-offline);
}
.pv-sensor-card.is-offline .pv-sensor-card__status-chip {
  background: rgba(230, 177, 66, 0.14);
  color: var(--pv-sensor-offline);
}

.pv-sensor-card.is-stale {
  border-left-color: var(--pv-sensor-stale);
  animation: pv-sensor-stale-pulse 1.6s ease-in-out infinite;
}
.pv-sensor-card.is-stale .pv-sensor-card__status-chip {
  background: rgba(224, 144, 64, 0.18);
  color: var(--pv-sensor-stale);
}
@keyframes pv-sensor-stale-pulse {
  0%, 100% { border-left-color: var(--pv-sensor-stale); }
  50%      { border-left-color: rgba(224, 144, 64, 0.3); }
}

.pv-sensor-card.is-error {
  border-left-color: var(--pv-sensor-error);
}
.pv-sensor-card.is-error .pv-sensor-card__status-chip {
  background: rgba(255, 77, 77, 0.15);
  color: var(--pv-sensor-error);
}

.pv-sensor-card.is-disabled {
  opacity: 0.55;
}
.pv-sensor-card.is-disabled .pv-sensor-card__status-chip {
  background: rgba(85, 85, 85, 0.15);
  color: var(--pv-sensor-disabled);
}

.pv-sensor-card.is-loading::after {
  content: "";
  position: absolute;
  top: 0; left: -100%;
  width: 30%; height: 2px;
  background: linear-gradient(90deg, transparent, rgba(120, 200, 230, 0.5), transparent);
  animation: pv-sensor-card-shimmer 1.2s linear infinite;
}
@keyframes pv-sensor-card-shimmer {
  0%   { left: -30%; }
  100% { left: 100%; }
}

/* --- Globe page layout tweaks when multi is active -------------------- */

.pv-multi-active .pv-map-legend,
.pv-multi-active .pv-globe-legend {
  /* Nudge legend left of the sensor panel so they don't overlap */
  right: calc(var(--pv-sensor-panel-w) + 24px) !important;
}

/* __SCAN_TIMER__ */
.pv-map-scanning{
  position:absolute; inset:0; z-index:1200;
  display:flex; align-items:center; justify-content:center;
  background:rgba(5,8,14,0.55); backdrop-filter:blur(2px);
  pointer-events:none;
}
.pv-map-scanning[hidden]{ display:none; }
.pv-map-scanning__panel{
  display:flex; flex-direction:column; align-items:center; gap:.55rem;
  padding:1.4rem 2.2rem;
  background:rgba(12,17,26,0.92);
  border:1px solid rgba(120,160,220,0.25);
  border-radius:14px;
  box-shadow:0 8px 40px rgba(0,0,0,0.5);
  font-family:inherit; color:#cfe0f5;
}
.pv-map-scanning__spinner{
  width:34px; height:34px; border-radius:50%;
  border:3px solid rgba(120,160,220,0.25);
  border-top-color:#5b9cff;
  animation:pv-scan-spin 0.9s linear infinite;
}
@keyframes pv-scan-spin{ to{ transform:rotate(360deg); } }
.pv-map-scanning__label{ font-size:.95rem; letter-spacing:.02em; opacity:.9; }
.pv-map-scanning__count{ font-size:2.1rem; font-weight:600; color:#fff; line-height:1; }
.pv-map-scanning__count span{ font-variant-numeric:tabular-nums; }
.pv-map-scanning__hint{ font-size:.72rem; opacity:.55; letter-spacing:.04em; }
