:root {
  color-scheme: dark;
  --bg: #0b0b0d;
  --card: #17171a;
  --border: #2a2a2e;
  --text: #e8e6e3;
  --text-dim: #9a9a9f;
  --accent: #ef4444;
}

* { box-sizing: border-box; }

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: -apple-system, BlinkMacSystemFont, "Apple SD Gothic Neo", "Malgun Gothic", sans-serif;
}

/* v2.9.32 화면 맨 위에서 아래로 당겨 새로고침하지 않는다 — 새로고침은 상단 [새로고침] 단추 하나.
   앱에는 자체 당김 새로고침 코드가 없다(브라우저 기본 동작이었다). 표준 CSS로 루트 스크롤러의 세로 overscroll만 막는다:
   세로 스크롤·관성·가장자리 효과·두 손가락 확대는 그대로, 터치 이벤트를 막는 JavaScript는 쓰지 않는다.
   -y만 쓴다(가로 뒤로/앞으로 스와이프 유지). Chrome은 body, Safari는 html에서 읽어 온 이력이 있어 둘 다 둔다. */
html, body { overscroll-behavior-y: contain; }

.topbar {
  position: sticky;
  top: 0;
  z-index: 60; /* 지구본 위 버튼(z-index 50)보다 위 */
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 16px;
  background: rgba(11, 11, 13, 0.92);
  backdrop-filter: blur(8px);
  border-bottom: 1px solid var(--border);
}

.topbar h1 {
  font-size: 17px;
  margin: 0;
}

.topbar-right {
  display: flex;
  align-items: center;
  gap: 10px;
}
.analysis-btn { width:auto; min-width:42px; padding:7px 9px; font-size:11px; }

.updated {
  font-size: 12px;
  color: var(--text-dim);
}

#refreshBtn {
  background: var(--accent);
  color: #fff;
  border: none;
  border-radius: 8px;
  padding: 7px 12px;
  font-size: 13px;
  cursor: pointer;
}

#refreshBtn:disabled { opacity: 0.6; }

/* 범례는 #map 밖(래퍼 안)에 둔다 — globe.gl이 #map 내용을 통째로 지워버려서
   안에 넣으면 조용히 사라진다(2026-09-05 실제로 겪음). */
.globe-wrap {
  position: sticky;
  top: 53px;
  z-index: 45;
  background: var(--bg);
  scroll-margin-top: 53px; /* 카드 클릭으로 스크롤될 때 상단 바에 안 가리게 */
}

#map {
  height: var(--map-height, clamp(300px, 48vh, 440px));
  width: 100%;
  background: #0b0b0d;
  overflow: hidden;
}

/* 2D 지도의 기본 Leaflet 확대 버튼은 3D 지구본에는 짝이 없어서 숨기고,
   두 모드 어디서나 똑같이 생긴 .map-zoom-controls를 대신 쓴다. */
.leaflet-control-zoom { display: none !important; }

.map-zoom-controls {
  position: absolute;
  top: 10px;
  left: 10px;
  z-index: 50;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  border-radius: 8px;
  border: 1px solid rgba(255, 255, 255, 0.18);
  background: rgba(14, 17, 22, .92);
  backdrop-filter: blur(4px);
}
.map-zoom-controls button {
  width: 34px;
  height: 34px;
  border: none;
  background: none;
  color: #e7ecf2;
  font-size: 18px;
  line-height: 1;
  cursor: pointer;
}
.map-zoom-controls button:first-child { border-bottom: 1px solid rgba(255, 255, 255, 0.18); }
.map-zoom-controls button:active { background: rgba(255, 255, 255, 0.12); }

.map-home-btn {
  position: absolute;
  top: 10px;
  right: 10px;
  z-index: 50;
  padding: 7px 11px;
  border: 1px solid rgba(255, 255, 255, 0.18);
  border-radius: 999px;
  background: rgba(14, 17, 22, .92);
  color: #e7ecf2;
  font: 600 12px/1.2 inherit;
  cursor: pointer;
  backdrop-filter: blur(4px);
}
.map-home-btn:active { background: rgba(255, 255, 255, 0.12); }

.map-resize-handle {
  height: 22px;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
  background: rgba(14, 17, 22, .98);
  color: #8795a8;
  cursor: ns-resize;
  touch-action: none;
  user-select: none;
}
.map-resize-handle span {
  width: 38px;
  height: 4px;
  border-radius: 999px;
  background: #566273;
}
.map-resize-handle small { font-size: 10px; }
.map-resize-handle:hover span,
.map-resize-handle:focus-visible span { background: #e7b96f; }
.map-resize-handle:focus-visible { outline: 2px solid #9bd6ff; outline-offset: -2px; }
.globe-wrap.is-resizing .map-resize-handle span { background: #e7b96f; }

.globe-controls {
  position: absolute;
  top: 10px;
  right: 10px;
  z-index: 50;
  display: flex;
  gap: 6px;
}

.ghost-btn {
  background: rgba(17, 17, 20, 0.85);
  color: var(--text-dim);
  border: 1px solid var(--border);
  border-radius: 999px;
  padding: 5px 10px;
  font-size: 11px;
  font-family: inherit;
  cursor: pointer;
}

.ghost-btn:hover { color: var(--text); }

.globe-hint {
  margin: 0;
  padding: 6px 16px 8px;
  font-size: 11px;
  color: var(--text-dim);
  text-align: center;
  border-bottom: 1px solid var(--border);
}

.filters {
  position: relative;
  z-index: 9;
  background: rgba(11, 11, 13, 0.94);
  backdrop-filter: blur(8px);
  border-bottom: 1px solid var(--border);
}

/* 2026-09-11: 세그먼트 컨트롤(뉴스/인물/주제 집중) — 하나만 보이게 전환.
   탭이 4개라 좁은 화면에서는 flex-wrap으로 두 줄(2×2)이 된다. 글자를 줄이는 대신 접는 쪽을 택했다. */
.view-segment {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  padding: 8px 12px;
  background: rgba(11, 11, 13, 0.94);
  border-bottom: 1px solid var(--border);
}
.segment-btn {
  flex: 1 1 calc(50% - 3px);
  min-width: 0;
  padding: 8px 6px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: var(--card);
  color: var(--text-dim);
  font: 600 12.5px inherit;
  cursor: pointer;
  text-align: center;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
@media (min-width: 620px) { .segment-btn { flex: 1 1 0; } }

/* 주제 집중 탭 본문 */
.topic-view[hidden] { display: none !important; }
.topic-head { padding: 12px 14px 6px; }
.topic-title { margin: 0 0 2px; font-size: 15px; }
.topic-note { margin: 0 0 10px; font-size: 11px; color: var(--text-dim); line-height: 1.5; }
.topic-narrative { display: grid; gap: 8px; }
.topic-para { margin: 0; font-size: 12px; line-height: 1.65; color: var(--text); }
.topic-para-label {
  display: inline-block; margin-right: 6px; padding: 1px 7px;
  border-radius: 999px; background: #3d2f57; color: #ddd6fe;
  font-size: 10.5px; font-weight: 600; vertical-align: 1px;
}
/* 주제 탭의 "공식 발표" 묶음(2026-09-12). 최신순 목록에서는 통신사 기사에 밀려 내려가는
   1차 문서를 위로 올린다. 링크는 원문으로 바로 나가고, 주장이라는 단서를 위에 붙인다. */
.topic-official { margin: 12px 0 4px; padding: 10px 12px; border-radius: 10px;
  background: #16203a; border: 1px solid #26324f; }
.topic-official-title { margin: 0 0 2px; font-size: 12px; color: #cfe0ff; }
.topic-official-note { margin: 0 0 8px; font-size: 10.5px; line-height: 1.5; color: var(--text-dim); }
.topic-official-list { margin: 0; padding: 0; list-style: none; display: grid; gap: 8px; }
.topic-official-row { display: grid; gap: 2px; }
.topic-official-meta { font-size: 10.5px; color: var(--text-dim); }
.topic-official-link { font-size: 12px; line-height: 1.5; color: #e8eeff; text-decoration: none; overflow-wrap: anywhere; }
.topic-official-link:hover, .topic-official-link:focus-visible { text-decoration: underline; }

/* 주제 탭의 "위치별 사건"(2026-09-19). 숫자만 보여주는 대시보드가 아니라, 눌렀을 때 바로 그
   위치의 기사 목록(지도 핀과 같은 시트)으로 이어진다 — topic-official 블록과 같은 색 언어. */
.topic-locations { margin: 12px 0 4px; padding: 10px 12px; border-radius: 10px;
  background: #16203a; border: 1px solid #26324f; }
.topic-locations-title { margin: 0 0 8px; font-size: 12px; color: #cfe0ff; }
.topic-locations-list { display: flex; flex-wrap: wrap; gap: 6px; }
.topic-location-chip {
  padding: 5px 10px; border-radius: 999px; border: 1px solid #3a4a6b;
  background: #1c2846; color: #cbd8f5; font-size: 11.5px; cursor: pointer;
}
.topic-location-chip:hover, .topic-location-chip:focus-visible { border-color: #75baff; color: #fff; }

.segment-btn.is-active {
  background: #3d2f57;
  border-color: #7c5cc4;
  color: #ede7ff;
}

/* 2026-09-11: 지도 위에 따로 떠 있던 피자지수 버튼과 지도 전용 분야 탭을 없앴다.
   피자지수는 범례의 "부가 표시"로, 분야 선택은 아래 기사 분야 칩으로 옮겼다(화면 재구성). */
.map-collapse-btn {
  display: block;
  margin: 0 auto 4px;
  padding: 3px 10px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: var(--card);
  color: var(--text-dim);
  font: 600 10.5px/1.2 inherit;
  cursor: pointer;
}
.map-collapse-btn:hover { color: var(--text); }

.filters-inner {
  display: flex;
  gap: 6px;
  overflow-x: auto;
  padding: 10px 16px;
  max-width: 640px;
  margin: 0 auto;
  scrollbar-width: none;
}

.filters-inner::-webkit-scrollbar { display: none; }

/* 전문가용 고급 필터(OSINT 업그레이드 PHASE 9) — 기본 접힘, 눌러야만 펼쳐진다.
   [hidden]을 반드시 display:none !important로 강제한다 — 이 프로젝트에서 grid/flex가
   [hidden]의 기본 동작을 이기는 사고를 이미 두 번 겪었다(2026-09-11, legend-rows-secondary
   주석 참고). */
.advanced-filter { max-width: 640px; margin: 0 auto; padding: 0 16px; }
.advanced-filter-toggle {
  display: block; width: 100%; text-align: left; background: none; border: none;
  padding: 2px 0 6px; color: var(--text-dim); font-size: 11px; cursor: pointer;
}
.advanced-filter-toggle:hover { color: var(--text); }
.advanced-filter-row { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 14px; padding-bottom: 8px; }
.advanced-filter-row[hidden] { display: none !important; }
.advanced-filter-check { display: flex; align-items: center; gap: 5px; font-size: 12px; color: var(--text-dim); cursor: pointer; }
.advanced-filter-check input { margin: 0; }
.advanced-filter-reset { background: none; border: 1px solid var(--border); border-radius: 999px; padding: 2px 10px; font-size: 11px; color: var(--text-dim); cursor: pointer; }
.advanced-filter-reset:hover { color: var(--text); }

.chip {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  background: var(--card);
  color: var(--text-dim);
  border: 1px solid var(--border);
  border-radius: 999px;
  padding: 6px 11px;
  font-size: 12px;
  font-family: inherit;
  cursor: pointer;
}

.chip.is-active {
  background: #2a1414;
  border-color: var(--accent);
  color: var(--text);
}

.chip-count {
  font-size: 11px;
  color: var(--text-dim);
  background: rgba(255, 255, 255, 0.07);
  border-radius: 999px;
  padding: 1px 6px;
}
/* 주제 탭 옆의 "새 소식" 숫자 — chip-count와 같은 크기지만, 0건일 땐 아예 숨겨서(hidden)
   늘 붙어 있는 회색 숫자와 구별되게 옅은 빨강만 쓴다(요구사항: 뱃지 남발 금지). */
.seg-new-count { color: #fca5a5; background: rgba(248, 113, 113, 0.14); }

/* 속보·커뮤니티는 분야 탭이 아니라 보조 필터라 시각적으로 한 단계 낮춘다. */
.chip-secondary {
  opacity: 0.72;
  padding: 5px 9px;
  font-size: 11px;
}
.chip-secondary.is-active { opacity: 1; }

/* "인물" 탭은 기사 필터가 아니라 인물 검색 영역으로 이동하는 바로가기다. */
.chip-nav { background: transparent; border-style: dashed; }

.more-wrap {
  display: flex;
  justify-content: center;
  padding: 0 16px 28px;
}

.more-btn {
  width: 100%;
  max-width: 608px;
  background: var(--card);
  color: var(--text);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 12px;
  font-size: 13px;
  font-family: inherit;
  cursor: pointer;
}

.more-btn:hover { border-color: var(--accent); }

.card.is-locatable { cursor: pointer; }
.card.is-locatable:hover { border-color: #3a3a40; }

.person-card-link {
  display: inline-block;
  margin-top: 6px;
  font-size: 10px;
  color: var(--accent);
  text-decoration: none;
}

.legend {
  position: absolute;
  left: 10px;
  bottom: 38px; /* 아래 안내 문구를 가리지 않게 */
  z-index: 50; /* globe.gl의 핀 레이어보다 위에 있어야 국기에 안 가린다 */
  background: rgba(17, 17, 20, 0.82);
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 8px 10px;
  font-size: 11px;
  color: var(--text-dim);
  line-height: 1.6;
  pointer-events: none;
  backdrop-filter: blur(4px);
}

.legend-title {
  color: var(--text);
  font-weight: 600;
  margin-bottom: 4px;
}

.legend-row {
  display: flex;
  align-items: center;
  gap: 6px;
  white-space: nowrap;
}

.legend .dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  display: inline-block;
}

.legend .dot-military { background: #b45309; }
.legend .dot-conflict { background: #e63946; }
.legend .dot-diplomacy { background: #4a90e2; }
.legend .dot-disaster { background: #f97316; }
.legend .dot-raid {
  background: #e63946;
  box-shadow: 0 0 0 2px rgba(230, 57, 70, 0.35);
}

.legend-flag,
.legend-person {
  width: 12px;
  display: inline-block;
  text-align: center;
  font-size: 10px;
}

.legend-line {
  width: 12px;
  height: 2px;
  background: linear-gradient(90deg, transparent, #f59e0b, transparent);
  display: inline-block;
}

.person-pin {
  display: flex;
  align-items: center;
  gap: 4px;
  padding: 2px 7px 2px 5px;
  background: rgba(17, 17, 20, 0.9);
  border: 1px solid #f59e0b;
  border-radius: 999px;
  font-size: 11px;
  color: var(--text);
  white-space: nowrap;
  cursor: pointer;
  transform: translate(-50%, -140%);
  box-shadow: 0 0 10px rgba(245, 158, 11, 0.35);
  pointer-events: auto;
  z-index: 3;
}

.person-pin-flag { font-size: 12px; }
.person-pin-name { font-weight: 600; }
.person-pin-name { max-width: 112px; overflow: hidden; text-overflow: ellipsis; }
.person-pin.confidence-3 { border-color:#22c55e; box-shadow:0 0 10px rgba(34,197,94,.35); }
.person-pin.confidence-2 { border-color:#f4c430; box-shadow:0 0 10px rgba(244,196,48,.35); }
.person-pin.confidence-1 { border-color:#f97316; box-shadow:0 0 10px rgba(249,115,22,.32); }

.combat-pin {
  position:relative; width:34px; height:34px; display:flex; align-items:center; justify-content:center;
  transform:translate(-50%,-50%); border:2px solid #ef4444; border-radius:50%;
  background:rgba(28,12,14,.94); box-shadow:0 0 14px rgba(239,68,68,.52); cursor:pointer; pointer-events:auto;
}
.combat-icon { font-size:17px; line-height:1; }
/* drone 신호는 이모지가 아니라 SVG(ICON_SVG.drone)라서 폰트 크기 대신 명시적 치수가 필요하다 —
   모바일 34px 핀 안에서도 쿼드콥터 팔·프로펠러가 뭉개지지 않는 크기. */
.combat-icon svg { width:19px; height:19px; display:block; }
.combat-seizure,.combat-maritime { border-color:#38bdf8; box-shadow:0 0 14px rgba(56,189,248,.48); }
.combat-urban { border-color:#f97316; }
.combat-border_action,.combat-border_incident { border-color:#74b3cc; background:rgba(12,40,53,.94); box-shadow:0 0 12px rgba(67,147,180,.4); }
.combat-border_incident { border-style:dashed; }
.combat-pin .cluster-count { background:#ef4444; }
/* 한 칸에 여러 종류가 섞였을 때: 대표 종류 모양은 그대로 두고 왼쪽 아래에 작은 점 하나만
   더한다(핀을 키우거나 아이콘을 겹쳐 그리면 34px 안에서 아무것도 안 보인다).
   색이 아니라 "점이 있다/없다" + 이중 테두리로 구분되므로 흑백 화면에서도 읽힌다. */
.combat-mixed-dot {
  position:absolute; left:-1px; bottom:-1px; width:9px; height:9px; border-radius:50%;
  background:#facc15; border:1.5px solid #1c0c0e; pointer-events:none;
}
.combat-pin.is-mixed { border-style:double; border-width:3px; }
/* 국지도발 — 접경·NLL/DMZ 등에서 실제로 일어난 침범·포격 등. 전투(적)·나포/해상(청)·시가전(주황)과
   겹치지 않는 호박색으로 구분하고, 일반 combat-pin보다 한 단계 크게 그려 우선순위를 알린다.
   실제 교전(is-high-priority)이 함께 확인되면 아래 규칙이 순서상 이것을 덮어써 전투 표시가 이긴다. */
.combat-pin.is-provocation {
  width:38px; height:38px; z-index:3; border-width:3px; border-color:#fbbf24;
  background:rgba(46,32,4,.96); box-shadow:0 0 0 2px rgba(251,191,36,.22),0 0 16px rgba(251,191,36,.6);
}
.combat-pin.is-high-priority {
  width:42px; height:42px; z-index:4; border-width:3px; border-color:#fb6a45;
  background:rgba(48,14,10,.96); box-shadow:0 0 0 3px rgba(251,106,69,.2),0 0 20px rgba(239,68,68,.72);
}
.combat-pin.is-high-priority .combat-icon svg { width:24px; height:24px; }
.combat-priority-label {
  position:absolute; top:calc(100% + 4px); left:50%; transform:translateX(-50%);
  padding:2px 6px; border:1px solid #fb6a45; border-radius:999px; background:rgba(28,12,14,.96);
  color:#ffe2d8; font:700 10px/1.15 inherit; white-space:nowrap; pointer-events:none;
}
.combat-priority-label.is-provocation-label { border-color:#fbbf24; background:rgba(46,32,4,.96); color:#fff3c4; }

/* 지도 조작 UI는 지도 위에 띄우지 않는다(범례 제외 — 2026-09-11부터 지도 상단 오버레이로
   되돌림, 아래 참고). 작은 화면에서도 안내 문구·높이 조절 손잡이·버튼이 서로 안 겹친다. */
.map-toolbar {
  position:relative; display:flex; flex-wrap:wrap; align-items:flex-start; justify-content:flex-end;
  gap:7px; padding:7px 10px; background:#0e1116; border-top:1px solid var(--border);
}
.map-toolbar .globe-controls { position:static; inset:auto; margin:0; transform:none; justify-content:flex-end; flex-wrap:wrap; }
.globe-hint { background:#0e1116; white-space:normal; overflow-wrap:anywhere; }
.globe-wrap.is-map-compact .globe-hint { display:none; }
@media(max-width:700px) {
  .map-toolbar .globe-controls { width:100%; justify-content:flex-start; }
  .globe-hint { padding:5px 10px; font-size:10px; line-height:1.35; }
  .map-resize-handle { height:28px; }
  .map-resize-handle small { font-size:10px; }
}

/* v2.9.32 지도 레이어 조작 — [긴급상황][공습경보][여행경보]. 탭을 바꿔도 같은 상태(TAB ≠ EMERGENCY OVERLAY).
   넓은 화면은 도구줄 왼쪽에 바로, 좁은 화면은 [레이어] 단추 하나 → 작은 창(지도 위 버튼과 겹침 0). */
.map-toolbar .map-layer-control { display:flex; align-items:center; margin-right:auto; min-width:0; }
.map-toolbar .map-layer-btn { display:none; }
.map-toolbar .map-overlay-toggles { display:flex; flex-wrap:wrap; gap:6px; }
.map-toolbar .overlay-toggle { min-height:30px; padding:4px 10px; border:1px solid var(--border); border-radius:999px; background:#141920;
  color:#8f9bab; font:600 12px/1.2 inherit; white-space:nowrap; cursor:pointer; }
.map-toolbar .overlay-toggle::before { content:'□ '; color:#6b7686; }
.map-toolbar .overlay-toggle.is-on { color:#eef2f7; background:#1b2430; }
.map-toolbar .overlay-toggle.is-on::before { content:'✓ '; color:#9fe0b0; }
.map-toolbar .overlay-toggle[data-overlay="emergency"].is-on { border-color:#b7791f; }
.map-toolbar .overlay-toggle[data-overlay="airAlert"].is-on { border-color:#e63946; }
.map-toolbar .overlay-toggle[data-overlay="travel"].is-on { border-color:#2dd4bf; }
.map-toolbar .overlay-toggle:focus-visible, .map-toolbar .map-layer-btn:focus-visible { outline:2px solid #9bd6ff; outline-offset:2px; }
@media (max-width:700px) {
  .map-toolbar .map-layer-control { position:relative; margin-right:0; padding:3px; border:1px solid rgba(255,255,255,.14);
    border-radius:999px; background:rgba(14,17,22,.9); backdrop-filter:blur(5px); }
  .map-toolbar .map-layer-btn { display:inline-flex; align-items:center; justify-content:center; gap:4px; min-width:44px; }
  .map-toolbar .map-overlay-toggles { display:none; position:absolute; left:0; bottom:calc(100% + 8px); z-index:60; flex-direction:column;
    align-items:stretch; gap:6px; min-width:172px; padding:8px; border:1px solid rgba(255,255,255,.16); border-radius:14px;
    background:rgba(14,17,22,.97); box-shadow:0 8px 24px rgba(0,0,0,.45); }
  .map-toolbar .map-overlay-toggles.is-open { display:flex; }
  .map-toolbar .overlay-toggle { min-height:44px; text-align:left; font-size:13px; }
}
@media (max-width:420px) { .map-toolbar .map-layer-btn-label { display:none; } }
/* v2.9.32 여행경보 국가 레이어(지도 레이어 [여행경보]) — 국가 면(청록 점선·옅은 채움)·배지·별도 범례.
   여행 권고 ≠ 전쟁·교전 상태. 배지는 사건 핀(600) 아래 pane이라 사건 핀을 가리지 않는다. 범례는 2D 지도 왼쪽 아래(Leaflet 컨트롤). */
.travel-badge-holder { overflow:visible; }
.travel-badge { position:absolute; left:-12px; top:-12px; width:24px; height:24px; padding:0; display:grid; place-items:center;
  border:1.5px solid #2dd4bf; border-radius:50%; background:rgba(8,24,44,.88); color:#e8fffb; font-size:12px; line-height:1; cursor:pointer; }
.travel-badge.is-stale { border-color:#94a3b8; border-style:dashed; opacity:.85; }
.travel-badge:focus-visible { outline:2px solid #9bd6ff; outline-offset:2px; }
.travel-badge::after { content:''; position:absolute; inset:-10px; } /* 누르는 영역 44px */
.travel-legend { display:grid; gap:2px; max-width:min(230px, calc(100vw - 64px)); margin:0 0 8px 8px !important; padding:6px 9px; border:1px solid rgba(45,212,191,.45);
  border-radius:9px; background:rgba(8,14,22,.9); color:#e6ebf2; font-size:11px; line-height:1.35; word-break:keep-all; overflow-wrap:anywhere; }
.travel-legend-title { font-size:11.5px; }
/* v2.9.34 지도 우선 — 여행경보 범례는 작은 칩(접힘)으로 시작하고 눌러야 펼친다. 누르는 영역은 ::after로 44px 확보. */
button.travel-legend-title { position:relative; display:flex; align-items:center; gap:4px; min-height:24px; margin:0; padding:0; border:0; background:none;
  color:inherit; font:inherit; font-size:11.5px; font-weight:700; text-align:left; cursor:pointer; }
button.travel-legend-title::after { content:''; position:absolute; inset:-10px -9px; }
button.travel-legend-title:focus-visible { outline:2px solid #9bd6ff; outline-offset:3px; border-radius:6px; }
.travel-legend-body { display:grid; gap:2px; margin-top:3px; }
.travel-legend-body[hidden] { display:none; }
.travel-legend.is-collapsed { padding:3px 9px; border-radius:999px; background:rgba(8,14,22,.82); }
.travel-legend-row { display:flex; align-items:center; gap:6px; }
.travel-legend-row.is-muted, .travel-legend-note { color:#9fb0c3; font-size:10.5px; }
.travel-swatch { display:inline-block; flex:none; width:14px; height:10px; border:1.5px dashed #2dd4bf; border-radius:2px; background:rgba(20,184,166,.18); }
.travel-swatch.is-stale { border-color:#94a3b8; background:rgba(100,116,139,.14); }
/* 좁은 화면은 지도 아래 56px에 조작 줄(.map-toolbar)이 겹쳐 뜬다 → 범례를 그 위로 올린다. */
@media (max-width:700px) { .travel-legend { margin-bottom:64px !important; max-width:min(220px, calc(100vw - 120px)); } }
@media (max-width:420px) { .travel-legend { font-size:10.5px; padding:5px 8px; } .travel-legend-note { font-size:10px; } }
/* v2.9.32 지도 사건 핀 요약(유형·시각 KST·지역·출처·최신성·관련 보도) */
.sheet-pin-summary { display:grid; grid-template-columns:auto minmax(0, 1fr); gap:4px 10px; margin:0 0 10px; padding:9px 11px;
  border:1px solid var(--border); border-radius:10px; background:#12171e; font-size:12.5px; line-height:1.4; }
.sheet-pin-summary dt { color:#8f9bab; font-weight:600; white-space:nowrap; }
.sheet-pin-summary dd { margin:0; color:#e6ebf2; overflow-wrap:anywhere; min-width:0; }
/* v2.9.32 한반도 [상황] 최근 긴급상황(유형별) — 칩 줄은 가로로만 넘긴다(페이지 넘침 0). */
.korea-events .ke-filters { display:flex; gap:6px; overflow-x:auto; overscroll-behavior-x:contain; scrollbar-width:thin; padding:2px 0 6px; min-width:0; }
.korea-events .ke-filter { flex:0 0 auto; min-height:36px; padding:5px 11px; border:1px solid var(--border); border-radius:999px; background:#141920;
  color:#aab4c2; font:600 12.5px/1.2 inherit; white-space:nowrap; cursor:pointer; }
.korea-events .ke-filter.is-active { color:#fff; border-color:#8b5cf6; background:#2a1f45; }
.korea-events .ke-list { list-style:none; margin:6px 0 0; padding:0; display:grid; gap:8px; }
.korea-events .ke-row { padding:9px 10px; border:1px solid var(--border); border-radius:10px; background:#11161d; min-width:0; }
.korea-events .ke-top { display:flex; flex-wrap:wrap; gap:5px; align-items:center; min-width:0; }
.ke-kind { display:inline-flex; align-items:center; padding:2px 8px; border-radius:999px; background:#1f2a38; color:#d6e4f5; font-size:11.5px; font-weight:700; white-space:nowrap; }
.ke-kind.cat-nuclear_test, .ke-kind.cat-nuclear_activity_public_report { background:#3a2a10; color:#ffd89b; }
.ke-kind.cat-defection, .ke-kind.cat-border_crossing, .ke-kind.cat-northbound_crossing { background:#1d2b2a; color:#b8efe6; }
.korea-events .ke-region { color:#9fb0c3; font-size:12px; overflow-wrap:anywhere; min-width:0; }
.korea-events .ke-denied { color:#fca5a5; font-size:11.5px; font-weight:700; }
.korea-events .ke-title { display:block; width:100%; margin:6px 0 2px; padding:0; border:0; background:none; color:#eef2f7; font:600 14px/1.4 inherit;
  text-align:left; overflow-wrap:anywhere; cursor:pointer; }
.korea-events .ke-meta { margin:0; color:#8f9bab; font-size:12px; line-height:1.45; overflow-wrap:anywhere; }
.korea-events .ke-followups summary, .korea-events .ke-nuclear-history summary { cursor:pointer; color:#aab4c2; font-size:12.5px; }
.korea-events .ke-empty { color:#8f9bab; font-size:13px; padding:6px 2px; }
.korea-events .ke-nuclear-history { margin-top:10px; }
.korea-events .ke-nuclear-list { margin:6px 0 4px; padding-left:20px; display:grid; gap:4px; font-size:12.5px; color:#cfd8e3; }
.korea-events .ke-claim { color:#ffd89b; }
.alert-quick-state.state-claimed { background:#3b2f12; color:#fde68a; border-color:#a16207; }
.alert-quick-kind.ke-kind { margin-left:2px; }

.people-section {
  border-bottom: 1px solid var(--border);
  padding: 12px 0 14px;
}

.people-head {
  display: flex;
  align-items: baseline;
  gap: 8px;
  padding: 0 16px 8px;
  max-width: 640px;
  margin: 0 auto;
}

.people-head h2 {
  font-size: 14px;
  margin: 0;
}

.people-note {
  font-size: 11px;
  color: var(--text-dim);
}

.people-strip {
  display: flex;
  gap: 8px;
  overflow-x: auto;
  padding: 0 16px;
  max-width: 640px;
  margin: 0 auto;
  scrollbar-width: none;
}

.people-strip::-webkit-scrollbar { display: none; }

.person-card {
  flex: 0 0 auto;
  min-width: 132px;
  text-align: left;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 8px 10px;
  color: var(--text);
  font-family: inherit;
  cursor: pointer;
}

.person-card-head {
  font-size: 13px;
  font-weight: 600;
  margin-bottom: 2px;
  overflow-wrap: anywhere;
}

.person-card-where {
  font-size: 12px;
  color: #f59e0b;
  line-height: 1.45;
  overflow-wrap: anywhere;
}

.person-card-meta {
  font-size: 10px;
  color: var(--text-dim);
  margin-top: 3px;
}

.person-card-next {
  font-size: 10px;
  color: var(--text-dim);
  margin-top: 4px;
  padding-top: 4px;
  border-top: 1px solid var(--border);
}

.scene-tooltip {
  background: var(--card) !important;
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 6px 10px !important;
  font-family: inherit !important;
}

.globe-tip {
  color: var(--text);
  font-size: 12px;
  line-height: 1.4;
}

.flag-pin {
  font-size: 20px;
  line-height: 1;
  cursor: pointer;
  filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.8));
  transform: translate(-50%, -100%);
  pointer-events: auto;
  z-index: 1;
}

.feed {
  max-width: 640px;
  margin: 0 auto;
  padding: 16px;
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.status {
  color: var(--text-dim);
  text-align: center;
  padding: 40px 0;
}

.empty-recovery {
  margin: 18px 16px;
  padding: 18px;
  border: 1px solid rgba(251, 191, 36, .38);
  border-radius: 14px;
  background: rgba(120, 53, 15, .16);
  color: #f8fafc;
  line-height: 1.55;
}
.empty-recovery p { margin: 6px 0 14px; color: #cbd5e1; }
.empty-recovery-button {
  min-height: 44px;
  padding: 10px 14px;
  border: 1px solid rgba(251, 191, 36, .6);
  border-radius: 10px;
  background: #f59e0b;
  color: #1c1917;
  font-weight: 800;
  cursor: pointer;
}

.card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 12px;
  overflow: hidden;
}

.cover {
  width: 100%;
  height: 160px;
  object-fit: cover;
  display: block;
}

.card-body {
  padding: 14px;
}

.card-meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  color: var(--text-dim);
  margin-bottom: 6px;
}

.urgency {
  font-weight: 600;
  color: var(--text-dim);
}

.urgency.breaking {
  color: var(--accent);
}

.title {
  font-size: 16px;
  margin: 0 0 6px;
  line-height: 1.4;
  overflow-wrap: anywhere;
}

.summary {
  font-size: 14px;
  color: var(--text-dim);
  line-height: 1.5;
  white-space: pre-line;
  margin: 0 0 10px;
}

.tags {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 10px;
}

.tag {
  font-size: 11px;
  color: var(--text-dim);
  background: #222225;
  border-radius: 999px;
  padding: 3px 8px;
}

.link {
  font-size: 13px;
  color: var(--accent);
  text-decoration: none;
}

/* 출처 배지 (SBH뉴스 / 연합뉴스 등) */
.source-badge {
  font-size: 10px;
  color: var(--text-dim);
  background: rgba(255, 255, 255, 0.06);
  border-radius: 4px;
  padding: 1px 5px;
}

.legend-note {
  margin-top: 5px;
  padding-top: 5px;
  border-top: 1px solid var(--border);
  font-size: 10px;
  color: #6f6f75;
  max-width: 150px;
  white-space: normal;
  line-height: 1.35;
}

/* 인물 카드: 위치를 모를 때 / 최신 소식이 없을 때를 분명히 구분 */
.person-card-where.is-unknown {
  color: var(--text-dim);
}

.person-card-news {
  margin-top: 5px;
  padding-top: 5px;
  border-top: 1px solid var(--border);
  font-size: 10px;
  color: var(--text-dim);
  line-height: 1.35;
  max-width: 190px;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.person-card-news.is-stale {
  color: #6f6f75;
  font-style: italic;
}

.person-card { min-width: 190px; }


/* 공습경보 — SBH 지도의 분쟁 색(#E63946)을 그대로 쓴다 */
.air-raid-bar[hidden] {
  display: none;
}

.air-raid-bar {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 9px 16px;
  font-size: 12px;
  color: var(--text-dim);
  background: #131316;
  border-bottom: 1px solid var(--border);
}

.air-raid-bar.is-active {
  color: #ffd9dc;
  background: rgba(230, 57, 70, 0.14);
  border-bottom-color: rgba(230, 57, 70, 0.4);
}

.air-raid-icon { font-size: 13px; }
.air-raid-bar:not(.is-active) .air-raid-icon { filter: grayscale(1); opacity: 0.5; }
.air-raid-text { flex: 1; line-height: 1.35; }
.air-raid-time { font-size: 10px; color: var(--text-dim); white-space: nowrap; }

/* ── 지도 아래 "긴급 상황" 빠른 영역 ───────────────────────────────────────────
   경보를 지도에서 찾지 않아도 되게 항상 같은 자리에 둔다. 공식 경보와 뉴스 보도 기반은
   **색이 아니라 테두리·배지 문구**로도 구분되게 했다(색만으로 구분하면 흑백/색약에서 같아 보인다). */
.alert-quick {
  margin: 0; padding: 8px 10px; background: #14090b; border-bottom: 1px solid var(--border);
  display: flex; flex-direction: column; gap: 6px;
}
.alert-quick[data-state="none"] { background: #0e1116; }
.alert-quick-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
.alert-quick-title {
  display: inline-flex; align-items: center; gap: 6px; padding: 3px 8px;
  background: rgba(230, 57, 70, 0.14); border: 1px solid rgba(230, 57, 70, 0.55); border-radius: 999px;
  color: #ffd7da; font-size: 12.5px; font-weight: 700; cursor: pointer;
}
.alert-quick-title[aria-pressed="true"] { background: rgba(230, 57, 70, 0.34); color: #fff; }
.alert-quick-siren { display: inline-flex; width: 15px; height: 15px; }
.alert-quick-siren svg { width: 100%; height: 100%; display: block; }
.alert-quick-status { font-size: 11px; color: var(--text-dim); flex: 1; min-width: 0; text-align: right; }
.alert-quick[data-state="degraded"] .alert-quick-status,
.alert-quick[data-state="unknown"] .alert-quick-status { color: #fbbf24; }
.alert-quick-list { display: flex; flex-direction: column; gap: 4px; }
.alert-quick-filters { display:flex; gap:5px; overflow-x:auto; scrollbar-width:none; }
.alert-quick-filters::-webkit-scrollbar { display:none; }
.alert-quick-filters button {
  min-height:32px; padding:5px 10px; border-radius:999px; border:1px solid var(--border);
  background:#11151b; color:var(--text-dim); font:inherit; font-size:12px; white-space:nowrap; cursor:pointer;
}
.alert-quick-filters button.is-active { color:#fff; border-color:#9764d5; background:#33234a; }
.alert-quick-row {
  display: flex; flex-direction: column; gap: 2px; width: 100%; text-align: left;
  padding: 6px 8px; border-radius: 8px; cursor: pointer;
  background: rgba(230, 57, 70, 0.12); border: 1px solid rgba(230, 57, 70, 0.5); color: var(--text);
  text-decoration:none; font:inherit;
}
.alert-quick-related{align-self:flex-start;margin:2px 0 6px 8px;padding:4px 8px;border:1px solid var(--border);border-radius:6px;background:#1b2330;color:var(--text-dim);cursor:pointer;font:inherit;font-size:11px}
.alert-quick-row.type-border-action,.alert-quick-row.type-border-incident{background:rgba(40,86,109,.18);border-color:rgba(100,160,185,.7)}
.alert-quick-subtype.type-border-action,.alert-quick-subtype.type-border-incident{background:#294b60;color:#d8f2ff}
.alert-quick-row.type-safety{background:rgba(22,101,52,.16);border-color:rgba(74,222,128,.6)}
.alert-quick-subtype.type-safety{background:#14532d;color:#dcfce7}
.alert-quick-row.type-border-tension{background:rgba(71,85,105,.18);border-color:rgba(148,163,184,.6)}
.alert-quick-subtype.type-border-tension{background:#334155;color:#e2e8f0}
/* 확인 상태 — 확정/관찰/확인 중은 모양(채움·실선·점선)과 색으로 함께 구분한다(색만으로 구분하지 않는다). */
.alert-quick-state{font-size:10.5px;font-weight:800;padding:1px 6px;border-radius:4px;white-space:nowrap;border:1px solid transparent}
.alert-quick-state.state-confirmed{background:#166534;border-color:#22c55e;color:#f0fdf4}
.alert-quick-state.state-watch{background:transparent;border-color:#f59e0b;color:#fcd34d}
.alert-quick-state.state-review{background:transparent;border:1px dashed #94a3b8;color:#cbd5e1}
.alert-quick-row.status-confirmed{box-shadow:inset 3px 0 0 #22c55e}
.alert-quick-row.status-watch{box-shadow:inset 3px 0 0 #f59e0b}
.alert-quick-row.status-review{box-shadow:inset 3px 0 0 #94a3b8}
.alert-quick-empty{margin:4px 2px;font-size:12px;color:var(--text-dim)}
/* 뉴스 보도 기반은 공식과 같은 신뢰도로 보이면 안 된다 — 점선 테두리 + 낮은 채도. */
.alert-quick-row.is-news { background: rgba(120, 72, 46, 0.16); border: 1px dashed rgba(242, 185, 138, 0.7); }
.alert-quick-row.is-social { background: rgba(78, 62, 120, 0.18); border: 1px dotted rgba(183, 162, 255, 0.78); }
.alert-quick-row.is-device { border-style: double; border-width: 2px; }
.alert-quick-row-main { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.alert-quick-region { font-size: 13px; font-weight: 700; }
/* 전투·공격 행의 지역 칩 — 헤드라인 속에 지역이 묻히지 않도록 먼저 보여준다. */
.alert-quick-place {
  font-size: 11.5px; font-weight: 700; padding: 1px 7px; border-radius: 999px;
  background: rgba(230, 57, 70, 0.16); border: 1px solid rgba(230, 57, 70, 0.5); color: #ffd7d2;
  white-space: nowrap;
}
.alert-quick-row.type-attack .alert-quick-place { background: rgba(119, 84, 28, 0.18); border-color: rgba(224, 174, 82, 0.55); color: #ffe9c2; }
/* 국지도발 — 전투(적갈)·공격(황갈)과 겹치지 않는 호박색 계열로 접경 사건임을 구분한다. */
.alert-quick-row.type-provocation .alert-quick-place { background: rgba(251, 191, 36, 0.18); border-color: rgba(251, 191, 36, 0.6); color: #fff3c4; }
.alert-quick-subtype { font-size:10.5px; font-weight:800; padding:2px 6px; border-radius:999px; white-space:nowrap; }
.alert-quick-subtype.type-raid { background:#e63946; color:#fff; }
.alert-quick-subtype.type-combat { background:#8f342a; color:#ffe1d5; }
.alert-quick-subtype.type-attack { background:#77541c; color:#fff0bd; }
.alert-quick-subtype.type-provocation { background:#78350f; color:#fde68a; }
.alert-quick-row.type-combat { background:rgba(143,52,42,.15); border-color:rgba(224,104,82,.64); }
.alert-quick-row.type-attack { background:rgba(119,84,28,.15); border-color:rgba(224,174,82,.64); }
.alert-quick-row.type-provocation { background:rgba(217,119,6,.15); border-color:rgba(251,191,36,.64); }
.alert-quick-badge {
  font-size: 10.5px; font-weight: 700; padding: 1px 6px; border-radius: 999px;
  background: #e63946; color: #fff;
}
.alert-quick-row.is-news .alert-quick-badge { background: #78482e; color: #ffe9d6; }
.alert-quick-row.is-social .alert-quick-badge { background: #59458b; color: #f0eaff; }
.alert-quick-meta { font-size: 11px; color: var(--text-dim); }
.alert-quick-more {
  align-self: flex-start; background: none; border: none; color: var(--text-dim);
  font-size: 11.5px; text-decoration: underline; cursor: pointer; padding: 2px 0;
}
.topic-alert-quick {
  display: flex; flex-direction: column; gap: 7px; margin: 10px 0;
  padding: 10px; border: 1px solid rgba(230, 57, 70, .38); border-radius: 10px;
  background: rgba(82, 22, 29, .16);
}
.topic-alert-quick-title { display: flex; align-items: center; gap: 6px; margin: 0; font-size: 13px; }
.topic-alert-quick-status { margin: 0; color: var(--text-dim); font-size: 11px; line-height: 1.45; }
.topic-alert-quick-status.is-degraded,
.topic-alert-quick-status.is-unknown { color: #fbbf24; }
.topic-map-link { margin: 8px 0 10px; padding-top: 8px; border-top: 1px solid var(--border); }
/* v2.9.5 현재 지역 상황: 지역명 → 사건 종류 → 시각·근거. 공습경보 빠른 영역과 같은 시각 언어. */
.region-situation {
  display: flex; flex-direction: column; gap: 8px; margin: 8px 0 12px;
  padding: 10px; border: 1px solid rgba(96, 165, 250, .4); border-radius: 10px; background: rgba(15, 32, 64, .35);
}
.region-situation-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; }
.region-situation-title { margin: 0; font-size: 14px; }
.region-situation-status { color: var(--text-dim); font-size: 11.5px; line-height: 1.45; }
.region-situation-status.is-degraded { color: #fbbf24; }
.border-summary { display:flex; flex-wrap:wrap; gap:5px; }
.border-summary-chip { border:1px solid rgba(148,163,184,.5); border-radius:999px; padding:3px 8px; font-size:11px; color:#e2e8f0; }
.border-summary-chip.type-provocation { border-color:#fbbf24; color:#fde68a; }
.border-summary-chip.type-border-action { border-color:#5eead4; color:#99f6e4; }
.border-summary-chip.type-border-incident, .border-summary-chip.type-unknown { border-color:#93c5fd; color:#bfdbfe; }
.region-situation-list { display: grid; gap: 6px; }
.region-situation-scope { margin: 0; font-size: 11px; line-height: 1.45; color: var(--text-dim); }
.region-situation-row {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 2px 8px; align-items: center; width: 100%;
  min-height: 48px; padding: 8px 10px; border: 1px solid var(--border); border-left-width: 4px; border-radius: 8px;
  background: #121821; color: inherit; font: inherit; text-align: left; cursor: pointer;
}
.region-situation-main { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 6px; min-width: 0; }
.region-situation-place { font-size: 16px; font-weight: 800; color: #f8fafc; overflow-wrap: anywhere; }
.region-situation-sub { font-size: 11px; color: var(--text-dim); overflow-wrap: anywhere; }
.region-situation-kind {
  grid-column: 2; grid-row: 1; justify-self: end; padding: 2px 8px; border-radius: 999px;
  font-size: 11.5px; font-weight: 750; white-space: nowrap; max-width: 46vw; overflow: hidden; text-overflow: ellipsis;
}
.region-situation-meta { grid-column: 1 / -1; font-size: 11.5px; color: #aab5c4; }
.region-situation-row.type-raid { border-left-color: #e63946; }
.region-situation-row.type-raid .region-situation-kind { background: #e63946; color: #fff; }
.region-situation-row.type-combat { border-left-color: #fb6a45; }
.region-situation-row.type-combat .region-situation-kind { background: #8f342a; color: #ffe1d5; }
.region-situation-row.type-attack { border-left-color: #f87171; }
.region-situation-row.type-attack .region-situation-kind { border: 1px solid rgba(248,113,113,.7); color: #fecaca; }
.region-situation-row.type-provocation { border-left-color: #fbbf24; }
.region-situation-row.type-provocation .region-situation-kind { background: #78350f; color: #fde68a; }
.region-situation-row.type-safety { border-left-color: #facc15; border-left-style: dashed; }
.region-situation-row.type-safety .region-situation-kind { border: 1px solid rgba(250,204,21,.6); color: #fde68a; }
.region-situation-row.type-border-action { border-left-color:#5eead4; }
.region-situation-row.type-border-incident, .region-situation-row.type-unknown { border-left-color:#93c5fd; }
.topic-map-link h3 { margin: 0 0 6px; font-size: 12px; color: var(--text-dim); }
.topic-map-link button {
  width: 100%; padding: 9px 11px; border: 1px solid var(--border); border-radius: 8px;
  background: var(--card); color: var(--text); font: inherit; font-size: 12px; cursor: pointer;
}

/* ── 현장 한줄 / 정치·외교 한줄 ────────────────────────────────────────────────
   화면 맨 위는 "지금 무슨 일이 있었는가"다. 수집·검증 서술은 <details>로 접어 둔다. */
.field-brief { display: flex; flex-direction: column; gap: 8px; margin: 0 0 10px; }
.field-brief-title { margin: 0; font-size: 14px; }
.field-brief-row { display: flex; flex-direction: column; gap: 2px; padding-left: 8px; border-left: 3px solid var(--border); }
.field-brief-row.is-field { border-left-color: #e63946; }
.field-brief-row.is-politics { border-left-color: #4a90e2; }
.field-brief-row.is-military { border-left: 3px dashed #b45309; }
.field-brief-label { font-size: 11px; font-weight: 700; color: var(--text-dim); letter-spacing: .02em; }
.field-brief-text { margin: 0; font-size: 13.5px; line-height: 1.5; }
.field-brief-note { margin: 0; font-size: 11px; color: var(--text-dim); }
.field-brief-events-title { margin: 2px 0 0; font-size: 11px; color: var(--text-dim); }
.field-brief-events { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 3px; }
.field-brief-event { display: flex; align-items: baseline; gap: 6px; }
.field-brief-event::before { content: "•"; color: var(--text-dim); }
.field-brief-event.is-alert::before { content: "🚨"; font-size: 11px; }
.field-brief-event-badge {
  font-size: 10px; font-weight: 700; padding: 0 5px; border-radius: 999px;
  background: rgba(230, 57, 70, 0.2); color: #ffd7da; white-space: nowrap;
}
.field-brief-event-btn {
  background: none; border: none; padding: 0; text-align: left; color: var(--text);
  font-size: 12.5px; line-height: 1.45; cursor: pointer; text-decoration: underline dotted;
}
.brief-data-state, .topic-narrative[open], .topic-narrative {
  margin: 8px 0 0; padding: 6px 8px; border: 1px solid var(--border); border-radius: 8px; background: #0e1116;
}
.brief-data-state > summary, .topic-narrative > summary {
  cursor: pointer; font-size: 11.5px; color: var(--text-dim); list-style: none;
}
.brief-data-state > summary::-webkit-details-marker, .topic-narrative > summary::-webkit-details-marker { display: none; }

.raid-pin {
  position: relative;
  display: flex;
  align-items: center;
  gap: 4px;
  padding: 2px 8px 2px 6px;
  background: rgba(230, 57, 70, 0.92);
  border: 1px solid #ff8a92;
  border-radius: 999px;
  font-size: 11px;
  font-weight: 600;
  color: #fff;
  white-space: nowrap;
  cursor: pointer;
  transform: translate(-50%, -140%);
  box-shadow: 0 0 12px rgba(230, 57, 70, 0.6);
  pointer-events: auto;
  z-index: 4;
}

.raid-pin-icon { font-size: 11px; display: flex; align-items: center; }
.raid-pin-icon svg { width: 14px; height: 14px; display: block; } /* 느낌표 디자인이 더 도드라지게 살짝 키움 */

/* 공습경보 전용 pulse 링 — "실시간 경보"라는 느낌을 일반 뉴스 핀과 구분되게 준다.
   ⚠️ 매 프레임 JS로 그리지 말 것 — CSS keyframes(transform/opacity)만 쓴다(성능 요구사항).
   prefers-reduced-motion이면 애니메이션을 끄되, 고리 자체는 옅게 남겨 "경보 활성" 상태를
   움직임 없이도 알아볼 수 있게 한다. */
.raid-pin::before {
  content: "";
  position: absolute;
  inset: -11px;
  border-radius: 999px;
  border: 1.5px solid rgba(230, 57, 70, 0.65);
  pointer-events: none;
  animation: raid-pulse 1.8s ease-out infinite;
}
@keyframes raid-pulse {
  0% { transform: scale(0.72); opacity: 0.95; }
  100% { transform: scale(1.85); opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .raid-pin::before { animation: none; opacity: 0.55; }
}

/* 뉴스 보도 기반 경보(news-reported-alert)만 모인 핀 — 공식 실시간 경보와 **생김새부터**
   달라야 한다(요구사항: 지금 발령 중인 것처럼 보이면 안 된다). 테두리를 점선으로 바꾸고
   채도를 낮추고, 실시간을 뜻하는 pulse 링은 아예 끈다. */
.raid-pin.is-news {
  background: rgba(120, 72, 46, 0.92);
  border: 1px dashed #f2b98a;
  box-shadow: 0 0 8px rgba(180, 100, 40, 0.45);
}
.raid-pin.is-news::before { display: none; }
.raid-pin.is-social {
  background: rgba(78, 62, 120, 0.94);
  border: 1px dotted #b7a2ff;
  box-shadow: 0 0 8px rgba(122, 90, 200, 0.4);
}
.raid-pin.is-social::before { display: none; }
/* 공식 + 뉴스가 한 칸에 섞였을 때는 대표(공식) 모양을 유지하되 섞였다는 것만 알린다. */
.raid-pin.is-mixed { border-style: double; border-width: 2px; }

/* 지역 표시를 조금 더 크게 (사용자 요청) */
.flag-pin { font-size: 24px; }
.person-pin { font-size: 12px; padding: 3px 9px 3px 6px; }
.person-pin-flag { font-size: 14px; }


/* ── SBH식 클러스터 마커 (원형 아이콘 + 개수 배지) ── */
.cluster-pin {
  position: relative;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  transform: translate(-50%, -50%);
  cursor: pointer;
  pointer-events: auto;
  background: rgba(14, 14, 17, 0.92);
  transition: transform 0.15s ease;
}

.cluster-pin:hover { transform: translate(-50%, -50%) scale(1.12); }

.cluster-icon { width: 18px; height: 18px; display: block; }
.cluster-icon svg { width: 100%; height: 100%; }

.cluster-conflict {
  border: 2px solid #e63946;
  color: #ff8d95;
  box-shadow: 0 0 14px rgba(230, 57, 70, 0.55);
}

.cluster-diplomacy {
  border: 2px solid #4a90e2;
  color: #a8ceff;
  box-shadow: 0 0 14px rgba(74, 144, 226, 0.5);
}

.cluster-world { display: none; } /* 세계 기사는 좌표가 없어 지도에 안 뜬다 */

.cluster-count {
  position: absolute;
  top: -6px;
  right: -8px;
  min-width: 19px;
  height: 19px;
  padding: 0 5px;
  border-radius: 999px;
  background: #3b82f6;
  color: #fff;
  font-size: 11px;
  font-weight: 700;
  line-height: 19px;
  text-align: center;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
}

.cluster-conflict .cluster-count { background: #e63946; }

/* ── 범례: 작고, 체크박스로 필터 ── */
.legend {
  padding: 6px 8px;
  font-size: 10px;
  line-height: 1.35;
  pointer-events: auto;
}

.legend .legend-row {
  display: flex;
  align-items: center;
  gap: 5px;
  padding: 1px 0;
  cursor: pointer;
  user-select: none;
}

.legend input[type="checkbox"] {
  width: 12px;
  height: 12px;
  margin: 0;
  accent-color: #e63946;
  cursor: pointer;
}

.lg-icon {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  display: inline-block;
  font-size: 9px;
  line-height: 11px;
  text-align: center;
}

.lg-military { background: #b45309; }
.lg-conflict { background: #e63946; }
.lg-diplomacy { background: #4a90e2; }
.lg-raid { background: #e63946; box-shadow: 0 0 0 2px rgba(230, 57, 70, 0.35); }
.lg-person { background: none; }


.conf-chip {
  display: inline-block;
  margin-top: 4px;
  padding: 1px 6px;
  border-radius: 999px;
  font-size: 9px;
  font-weight: 600;
}

.conf-높음 { background: rgba(34, 197, 94, 0.18); color: #86efac; }
.conf-보통 { background: rgba(244, 196, 48, 0.18); color: #fbd85d; }
.conf-낮음 { background: rgba(249, 115, 22, 0.18); color: #fdba74; }
/* 기사 상세의 신뢰도 요약 한 줄(전문가용 OSINT 업그레이드) — 색은 위 .conf-높음 등을 그대로
   재사용하고, 여기서는 크기/모양만 이 위치(문단)에 맞게 조정한다. */
.confidence-level { display: inline-block; margin: 6px 0 2px; padding: 3px 9px; border-radius: 8px; font-size: 12px; font-weight: 600; }
.conf-없음 { background: rgba(148, 163, 184, 0.16); color: #94a3b8; }

.person-card-sns {
  margin-top: 4px;
  font-size: 10px;
  color: #7dd3fc;
}


/* 범례 크기 (2026-09-07 사용자 요청으로 한 단계 더 컴팩트하게).
   ⚠️ 이보다 더 줄이지 말 것 — 예전에 체크박스가 너무 작아 안 눌린다는 신고가 있었다.
   체크박스는 12px이지만 라벨(.legend-row) 전체가 클릭 영역이라 실제로 누를 곳은 넓다. */
.legend { padding: 6px 8px; font-size: 10.5px; }
.legend .legend-row { gap: 5px; padding: 1px 0; min-height: 16px; }
.legend input[type="checkbox"] { width: 12px; height: 12px; }
.lg-icon { width: 11px; height: 11px; font-size: 9px; line-height: 11px; }

.person-card-role {
  font-size: 11px;
  color: #cbd5e1;
  margin-bottom: 3px;
}
.person-card-role.is-unknown { color: #6f6f75; font-style: italic; }

.ship-pin {
  font-size: 15px;
  transform: translate(-50%, -50%);
  pointer-events: auto;
  filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.9));
}

/* 근거 상세 시트 */
.sheet {
  position: fixed;
  inset: 0;
  z-index: 200;
  background: rgba(0, 0, 0, 0.6);
  display: flex;
  align-items: flex-end;
  justify-content: center;
}

/* ⚠️ 되돌리지 말 것: .sheet가 display:flex를 가지고 있어서, hidden 속성만으로는
   브라우저 기본 [hidden]{display:none}이 안 이긴다(클래스 규칙이 항상 이김).
   이거 하나가 없어서 이 오버레이가 항상 화면 전체를 덮어 모든 터치를 가로챘었다
   (2026-09-06 실제 사고 — "새로고침도, 체크박스도 아무것도 안 눌린다"는 신고).
   같은 사고가 orbital-watch-web에서도 있었음: 클래스 display가 hidden을 이기는 패턴. */
.sheet[hidden] {
  display: none;
}

.sheet-inner {
  position: relative;
  width: 100%;
  max-width: 640px;
  max-height: 78vh;
  overflow-y: auto;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 14px 14px 0 0;
  padding: 16px 16px 26px;
}

.sheet-inner h3 { margin: 0 0 12px; font-size: 15px; }

.sheet-close {
  position: absolute;
  top: 10px;
  right: 12px;
  background: none;
  border: none;
  color: var(--text-dim);
  font-size: 15px;
  cursor: pointer;
}

.sheet-row { display: flex; gap: 10px; padding: 5px 0; border-bottom: 1px solid var(--border); }
.sheet-label { flex: 0 0 74px; font-size: 11px; color: var(--text-dim); }
.sheet-value { flex: 1; font-size: 12px; line-height: 1.45; }
.sheet-value a { color: var(--accent); text-decoration: none; }

.sheet-sns-head { margin: 14px 0 6px; font-size: 12px; font-weight: 600; color: #7dd3fc; }
.sheet-sns {
  display: block;
  padding: 8px 10px;
  margin-bottom: 6px;
  background: #101014;
  border: 1px solid var(--border);
  border-radius: 8px;
  text-decoration: none;
}
.sheet-sns-time { display: block; font-size: 10px; color: var(--text-dim); margin-bottom: 3px; }
.sheet-sns-text { display: block; font-size: 12px; color: var(--text); line-height: 1.45; }
.sheet-sns-none { font-size: 12px; color: var(--text-dim); }

/* ══════════════════════════════════════════════════════════════════
   2026-09-06 추가: 인앱 뷰어 · 드래그 바텀시트 · 전망 · 정보보안 카테고리 ·
   항공기/주목구역 레이어 · 브리핑
   ══════════════════════════════════════════════════════════════════ */

:root {
  --security: #8b5cf6;
  --hot: #a855f7;
}

/* 지구본 위에서 손가락 제스처가 페이지 스크롤과 싸우지 않게 한다.
   (이게 없으면 모바일에서 돌리다가 페이지가 같이 튄다) */
#map,
#map canvas,
#flatmap,
#flatmap .leaflet-container {
  touch-action: none;
  overscroll-behavior: contain;
}

/* 범례가 8줄로 늘어나 세로로 길어졌다 → 2열 + 접기 버튼 */
.legend { display: block; max-width: 240px; }
.legend-rows {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  column-gap: 12px;
  row-gap: 0;
}
.legend.is-collapsed .legend-rows { display: none; }
.legend-toggle {
  display: block;
  width: 100%;
  text-align: left;
  background: none;
  border: none;
  color: var(--text-dim);
  font-size: 11px;
  padding: 0 0 4px;
  cursor: pointer;
}
.legend-toggle:hover { color: var(--text); }

/* 2026-09-11: 평소 잘 안 건드리는 항목(선박·항공기·공습경보·주목구역·여행경보·피자지수)은
   한 번 더 눌러야 나오게 접어 둔다 — 범례를 펼쳐도 늘 보이는 줄은 6개(군사~인물)뿐. */
.legend-more-toggle {
  grid-column: 1 / -1;
  display: block;
  width: 100%;
  text-align: left;
  background: none;
  border: none;
  border-top: 1px dashed var(--border);
  margin-top: 3px;
  padding: 4px 0 2px;
  color: var(--text-dim);
  font-size: 10.5px;
  cursor: pointer;
}
.legend-more-toggle:hover { color: var(--text); }
/* grid-column:1/-1 — 안 그러면 이 안쪽 2단이 바깥 범례 그리드의 칸 하나에만 끼어 들어가
   글자가 화면 밖으로 밀려난다(2026-09-11 실측으로 발견한 그리드 중첩 버그). */
.legend-rows-secondary {
  grid-column: 1 / -1;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  column-gap: 10px; row-gap: 0; margin-top: 2px;
}
/* ⚠️ 이 프로젝트에서 이미 두 번 겪은 사고: display:grid가 [hidden]의 기본 display:none을
   이겨서, JS가 hidden=true를 줘도 계속 보인다("부가 표시"를 안 눌렀는데도 항상 펼쳐져
   보이던 실제 버그 — 2026-09-11). 여닫는 요소마다 이 규칙을 반드시 같이 둘 것. */
.legend-rows-secondary[hidden] { display: none !important; }
/* 사건 종류(미사일·드론·포격…)별 체크박스. 종류가 12개라 2열로 두고 기본은 접어 둔다.
   ⚠️ 바로 위 규칙과 같은 이유로 [hidden] 규칙을 반드시 함께 둔다(display:grid가 [hidden]을
   이겨서 늘 펼쳐져 보이던 사고가 이 프로젝트에서 이미 두 번 있었다). */
.legend-rows-signals {
  grid-column: 1 / -1;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  column-gap: 10px; row-gap: 0; margin-top: 2px;
}
.legend-rows-signals[hidden] { display: none !important; }
.legend-rows-signals .legend-row { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
/* 범례 아이콘은 색 동그라미가 기본이지만, 신호 아이콘은 **모양**으로 구분하는 것이라
   배경을 없애고 선 그림 그대로 보여 준다(색맹·흑백 화면에서도 구별되게). */
.legend-rows-signals .lg-icon { background: none; border-radius: 0; color: #ffb4b4; }
.legend-rows-signals .lg-icon svg { width: 100%; height: 100%; display: block; }
.legend-rows-secondary .legend-row { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.legend-action {
  grid-column: 1 / -1;
  display: flex; align-items: center; gap: 5px;
  background: none; border: none; text-align: left;
  color: var(--text-dim); font: inherit; font-size: inherit;
  padding: 1px 0; min-height: 16px; cursor: pointer;
}
.legend-action:hover { color: var(--text); }
.lg-security { background: var(--security); }
.lg-aircraft { background: none; }
.lg-hotspot { background: none; color: var(--hot); }

/* 카테고리 점(필터 칩에서 씀) */
.dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
.dot-military { background: #b45309; }
.dot-conflict { background: #e63946; }
.dot-diplomacy { background: #4a90e2; }
.dot-disaster { background: #f97316; }
.dot-security { background: var(--security); }
.dot-world { background: #64748b; }

/* 정보보안 마커: 자물쇠 아이콘 + 보라 (요구사항 5) */
.cluster-security {
  background: rgba(139, 92, 246, 0.16);
  border-color: var(--security);
  color: #c4b5fd;
}
.cluster-security .cluster-count { background: var(--security); }
.cluster-diplomacy .cluster-count { background: #4a90e2; }

/* 항공기 핀 */
.aircraft-pin {
  font-size: 13px;
  line-height: 1;
  color: #93c5fd;
  text-shadow: 0 0 4px rgba(0, 0, 0, 0.9);
  cursor: default;
  transform: translate(-50%, -50%);
}
.aircraft-pin.is-mil { color: #fca5a5; font-size: 15px; }
.aircraft-pin.is-milguess { color: #fcd34d; }
.aircraft-icon { display: inline-block; }

/* 주목 구역(항적+기사 분석 결과) */
.hotspot-pin {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 3px 8px;
  border-radius: 999px;
  background: rgba(168, 85, 247, 0.16);
  border: 1px solid rgba(168, 85, 247, 0.65);
  color: #e9d5ff;
  font-size: 11px;
  white-space: nowrap;
  cursor: pointer;
  transform: translate(-50%, -50%);
}
.hotspot-pin.level-high { border-color: #f0abfc; background: rgba(217, 70, 239, 0.24); }
.hotspot-dot {
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--hot);
  box-shadow: 0 0 0 3px rgba(168, 85, 247, 0.3);
}

/* 이동체 요약 줄 */
.vehicle-bar[hidden] { display: none !important; }
.vehicle-bar {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 0 12px 8px;
  padding: 7px 11px;
  border: 1px solid var(--border);
  border-radius: 9px;
  background: rgba(23, 23, 26, 0.8);
  font-size: 11px;
  color: var(--text-dim);
}
.vehicle-text { flex: 1; line-height: 1.4; }
.vehicle-src { white-space: nowrap; font-size: 10px; opacity: 0.75; }

/* 브리핑(수집 데이터 자동 요약) */
.briefing[hidden] { display: none !important; }
.briefing {
  margin: 0 12px 12px;
  padding: 12px 14px;
  border: 1px solid #2f2a3d;
  border-radius: 12px;
  background: linear-gradient(180deg, rgba(45, 33, 66, 0.55), rgba(23, 23, 26, 0.8));
}
.briefing-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.briefing-head h2 { margin: 0; font-size: 14px; }
.briefing-engine { font-size: 10px; color: #c4b5fd; }
.briefing-lines { margin: 8px 0 0; padding-left: 16px; font-size: 12px; line-height: 1.6; color: var(--text); }
.briefing-focus { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 9px; }
.focus-chip {
  background: rgba(255, 255, 255, 0.06);
  border: 1px solid var(--border);
  color: var(--text);
  border-radius: 999px;
  padding: 3px 9px;
  font-size: 11px;
  cursor: pointer;
}
.focus-chip:hover { border-color: var(--security); }

/* 카드 */
.card { cursor: pointer; }
.card:hover { border-color: #3a3a40; }
.cat-chip {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 2px 7px;
  border-radius: 999px;
  font-size: 10px;
  border: 1px solid var(--border);
  color: var(--text-dim);
}
.cat-chip-icon { width: 12px; height: 12px; display: inline-block; }
.cat-chip-icon svg { width: 100%; height: 100%; }
.cat-chip.cat-military { color: #fbbf6a; border-color: rgba(180, 83, 9, 0.55); }
.cat-chip.cat-conflict { color: #fca5a5; border-color: rgba(230, 57, 70, 0.5); }
.cat-chip.cat-diplomacy { color: #93c5fd; border-color: rgba(74, 144, 226, 0.5); }
.cat-chip.cat-disaster { color: #fdba74; border-color: rgba(249, 115, 22, 0.55); }
.cat-chip.cat-security { color: #c4b5fd; border-color: rgba(139, 92, 246, 0.55); }
.card.is-high-priority { border-width:2px; }
.card.is-high-priority .title { font-weight:750; }
.card.is-high-priority.is-combat { border-color:rgba(251,106,69,.78); box-shadow:inset 4px 0 0 #fb6a45; }
.card.is-high-priority.is-air-raid { border-color:rgba(230,57,70,.82); box-shadow:inset 4px 0 0 #e63946; }
.card.is-high-priority.is-provocation { border-color:rgba(251,191,36,.78); box-shadow:inset 4px 0 0 #fbbf24; }
.priority-badge,.combat-provenance {
  display:inline-flex; align-items:center; min-height:22px; padding:2px 7px; border-radius:999px;
  font-size:10px; font-weight:750; white-space:nowrap;
}
.priority-badge.is-combat { border:1px solid rgba(251,106,69,.75); background:rgba(154,52,30,.24); color:#ffd8cc; }
.priority-badge.is-air-raid { border:1px solid rgba(230,57,70,.75); background:rgba(230,57,70,.2); color:#ffd7da; }
.priority-badge.is-provocation { border:1px solid rgba(251,191,36,.75); background:rgba(120,83,15,.24); color:#fde68a; }
.combat-provenance { border:1px solid rgba(148,163,184,.45); color:#d7dee8; }
/* 실제 공격(실선·붉은 계열) vs 군사 동향·위협·과거(점선·중립) — 색만이 아니라 선·글자로도 구분한다. */
.semantic-badge {
  display:inline-flex; align-items:center; min-height:22px; padding:2px 7px; border-radius:999px;
  font-size:10px; font-weight:700; white-space:nowrap; max-width:100%; overflow:hidden; text-overflow:ellipsis;
}
.semantic-badge.is-attack { border:1px solid rgba(248,113,113,.7); background:rgba(127,29,29,.22); color:#fecaca; }
.semantic-badge.is-military { border:1px dashed rgba(217,119,6,.7); color:#fcd9a8; }
.semantic-badge.is-safety { border:1px solid rgba(250,204,21,.6); background:rgba(113,63,18,.2); color:#fde68a; }
.semantic-badge.is-context { border:1px dashed rgba(148,163,184,.6); color:#cbd5e1; }
.official-badge { font-size: 10px; color: #86efac; }
/* "새 소식" 점 — 큰 빨간 배지 대신 작은 점 하나로만(요구사항: 과하지 않게). 카테고리 dot과
   같은 크기지만 색을 분명히 다르게 둬서 헷갈리지 않게 한다. */
.new-dot { width: 7px; height: 7px; border-radius: 50%; background: #f87171; display: inline-block; flex: none; }
.unverified-chip { font-size: 10px; color: #fdba74; border: 1px solid rgba(249, 115, 22, 0.4); border-radius: 999px; padding: 1px 6px; }

.card-actions { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
.card-read, .card-ext, .card-locate {
  border-radius: 7px;
  padding: 5px 10px;
  font-size: 11px;
  cursor: pointer;
  border: 1px solid var(--border);
  background: rgba(255, 255, 255, 0.05);
  color: var(--text);
}
.card-read { background: var(--accent); border-color: var(--accent); color: #fff; }
.card-ext:hover, .card-locate:hover { border-color: #4a90e2; }

/* ── 모달(인앱 뷰어 · 인물 프로필) ─────────────────────────────
   ⚠️ [hidden] 전용 규칙이 반드시 있어야 한다. display:flex가 있는 오버레이는
   hidden을 줘도 계속 화면을 덮어 모든 터치를 가로챈다(2026-09-06 실제 사고). */
.modal[hidden] { display: none !important; }
.modal {
  position: fixed;
  inset: 0;
  z-index: 200;
  display: flex;
  align-items: flex-end;
  justify-content: center;
}
.modal-backdrop { position: absolute; inset: 0; background: rgba(0, 0, 0, 0.62); }
.modal-panel {
  position: relative;
  display: flex;
  flex-direction: column;
  width: min(720px, 100%);
  height: min(94vh, 100%);
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: 16px 16px 0 0;
  overflow: hidden;
}
body.is-modal-open { overflow: hidden; }

/* 인물 트래킹은 지도를 함께 보도록 화면 아래의 비모달 패널로 연다. 일반 기사(#articleModal)보다
   핵심 정보(위치·시간·신뢰도·근거 버튼)가 접힘 없이 바로 보여야 해서, 초기 높이를 화면의
   45~60% 범위로 더 높게 잡는다(요구사항: "처음부터 너무 좁지 않다"). 지도를 완전히 덮지
   않도록 위쪽 min()의 dvh/px 상한은 그대로 두고, 아래쪽 max()의 바닥값만 45dvh로 올렸다 —
   지도를 사용자가 직접 크게 늘린 극단적인 경우에만 지도 아래쪽 일부와 겹칠 수 있다(기존
   170px 바닥에서도 이미 있던 동일한 트레이드오프, 완전히 가리지는 않는다). */
#personModal { pointer-events:none; }
#personModal .modal-backdrop { display:none; }
#personModal .modal-panel {
  pointer-events:auto;
  height:min(60dvh, 660px, max(48dvh, calc(100dvh - 61px - var(--map-height-current, 440px))));
  box-shadow:0 -12px 36px rgba(0,0,0,.5);
}
#personModal .modal-scroll { padding-bottom:18px; }
#personModal .modal-foot { display:none; }
body.is-person-panel-open { overflow:hidden; }

/* 2026-09-11: 기사도 같은 방식으로 연다 — 위치가 있는 기사를 열면 지도가 이미 그 위치로
   옮겨져 있으므로(js/viewer.js의 focusHandler), 전체를 덮지 않고 지도를 보면서 읽게 한다.
   기사는 인물 카드보다 내용이 많아 최대 높이를 더 크게 잡았다. */
#articleModal { pointer-events:none; }
#articleModal .modal-backdrop { display:none; }
#articleModal .modal-panel {
  pointer-events:auto;
  height:min(64dvh, 680px, max(220px, calc(100dvh - 61px - var(--map-height-current, 440px))));
  box-shadow:0 -12px 36px rgba(0,0,0,.5);
}

.modal-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  padding: 10px 12px;
  border-bottom: 1px solid var(--border);
  background: rgba(11, 11, 13, 0.96);
}
.modal-head-meta { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; min-width: 0; }
.modal-head-actions { display: flex; align-items: center; gap: 6px; flex: 0 0 auto; }
.modal-source { font-size: 11px; color: var(--text-dim); }
.person-chip { font-size: 13px; font-weight: 600; }

.ext-btn {
  background: rgba(74, 144, 226, 0.16);
  border: 1px solid rgba(74, 144, 226, 0.55);
  color: #bfdbfe;
  border-radius: 8px;
  padding: 6px 10px;
  font-size: 11px;
  cursor: pointer;
  white-space: nowrap;
}
.ext-btn:hover { background: rgba(74, 144, 226, 0.28); }
.ext-btn:disabled { opacity: 0.4; cursor: default; }
.ext-btn-wide { width: 100%; padding: 11px; font-size: 13px; }

.modal-close {
  background: none;
  border: none;
  color: var(--text-dim);
  font-size: 17px;
  cursor: pointer;
  padding: 2px 6px;
}

.modal-scroll {
  flex: 1;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  padding: 14px 16px 120px; /* 아래 근거 시트에 안 가리게 */
}
.modal-title { margin: 0 0 8px; font-size: 19px; line-height: 1.35; overflow-wrap: anywhere; word-break: break-word; }
.modal-submeta { display: flex; flex-wrap: wrap; gap: 10px; font-size: 11px; color: var(--text-dim); margin-bottom: 12px; }
.modal-language[hidden] { display: none !important; }
.modal-language {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px 10px;
  margin: -2px 0 13px;
  min-width: 0;
}
.language-segment {
  display: inline-grid;
  grid-template-columns: repeat(2, minmax(58px, 1fr));
  padding: 2px;
  border: 1px solid rgba(139, 92, 246, 0.48);
  border-radius: 10px;
  background: rgba(139, 92, 246, 0.08);
}
.language-segment button {
  min-height: 34px;
  padding: 6px 12px;
  border: 0;
  border-radius: 7px;
  background: transparent;
  color: #aaa4b8;
  font: 600 12px/1 inherit;
  cursor: pointer;
}
.language-segment button[aria-pressed="true"] {
  background: rgba(139, 92, 246, 0.34);
  color: #f0eaff;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.24);
}
.language-segment button:disabled { opacity: 0.5; cursor: default; }
.translation-status {
  flex: 1 1 150px;
  min-width: 0;
  color: var(--text-dim);
  font-size: 10.5px;
  line-height: 1.45;
  overflow-wrap: anywhere;
}
.translation-status:empty { display: none; }
.translation-status.is-machine { color: #c4b5fd; }
.translation-status.is-saved { color: #a7d8c7; }
.translation-status.is-error { color: #c7b9a5; }
.modal-cover img { width: 100%; border-radius: 10px; margin-bottom: 12px; }
.modal-para { font-size: 14px; line-height: 1.75; margin: 0 0 13px; color: #ddd9d4; }
.modal-note {
  font-size: 12px;
  color: var(--text-dim);
  background: rgba(255, 255, 255, 0.04);
  border-left: 2px solid var(--border);
  padding: 8px 10px;
  border-radius: 0 6px 6px 0;
}
.modal-loading { font-size: 12px; color: var(--text-dim); }
.modal-tags { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 10px; }
.modal-license-row { margin: 9px 0 0; color: var(--text-dim); font-size: 11px; line-height: 1.55; }
.modal-license { color: #c4b5fd; text-decoration: underline; text-underline-offset: 2px; }
.modal-foot { padding: 10px 12px calc(10px + env(safe-area-inset-bottom)); border-top: 1px solid var(--border); background: rgba(11, 11, 13, 0.96); }

/* ── 전망 ───────────────────────────────────────────────────── */
.outlook {
  margin-top: 22px;
  padding: 14px;
  border: 1px solid #2f2a3d;
  border-radius: 12px;
  background: rgba(45, 33, 66, 0.28);
}
.outlook-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
.outlook-title { margin: 0; font-size: 15px; }
.outlook-engine { font-size: 10px; padding: 2px 7px; border-radius: 999px; border: 1px solid var(--border); color: var(--text-dim); }
.outlook-engine.engine-claude { color: #c4b5fd; border-color: rgba(139, 92, 246, 0.6); }
.outlook-headline { font-size: 13px; color: #e9d5ff; margin: 9px 0 12px; }
.scenario-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.scenario { background: rgba(255, 255, 255, 0.04); border-radius: 9px; padding: 10px 11px; }
.scenario.is-empty { color: var(--text-dim); font-size: 12px; }
.scenario-top { display: flex; gap: 8px; align-items: flex-start; }
.scenario-text { font-size: 13px; line-height: 1.5; }
.likelihood { flex: 0 0 auto; font-size: 10px; padding: 2px 7px; border-radius: 999px; white-space: nowrap; }
.likelihood-high { background: rgba(239, 68, 68, 0.18); color: #fca5a5; }
.likelihood-mid { background: rgba(244, 196, 48, 0.16); color: #fbd85d; }
.likelihood-low { background: rgba(148, 163, 184, 0.16); color: #cbd5e1; }
.scenario-basis { margin: 7px 0 0; padding-left: 15px; font-size: 11px; color: var(--text-dim); line-height: 1.55; }
.outlook-watch { margin-top: 13px; }
.outlook-watch h4 { margin: 0 0 5px; font-size: 12px; color: #93c5fd; }
.outlook-watch ul { margin: 0; padding-left: 16px; font-size: 12px; color: var(--text-dim); line-height: 1.6; }
.outlook-caveat { font-size: 11px; color: #6f6f75; margin: 10px 0 0; line-height: 1.5; }
.outlook-caveat.is-warn { color: #fdba74; }
.ai-btn {
  margin-top: 12px;
  width: 100%;
  padding: 9px;
  border-radius: 8px;
  border: 1px solid rgba(139, 92, 246, 0.6);
  background: rgba(139, 92, 246, 0.14);
  color: #ddd6fe;
  font-size: 12px;
  cursor: pointer;
}
.ai-btn:disabled { opacity: 0.6; cursor: default; }

/* ── 드래그 바텀 시트 ────────────────────────────────────────
   ⚠️ [hidden] 규칙 먼저. 없으면 닫아도 화면을 덮는다. */
.dsheet[hidden] { display: none !important; }
.dsheet-overlay { position: fixed; inset: 0; z-index: 260; }
.dsheet-docked { position: absolute; inset: 0; pointer-events: none; z-index: 10; }
.dsheet-backdrop { position: absolute; inset: 0; background: rgba(0, 0, 0, 0.5); }
.dsheet-panel {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 20vh;
  display: flex;
  flex-direction: column;
  background: #131316;
  border-top: 1px solid var(--border);
  border-radius: 14px 14px 0 0;
  box-shadow: 0 -8px 24px rgba(0, 0, 0, 0.45);
  pointer-events: auto;
  overflow: hidden;
}
.dsheet-panel.is-animating { transition: height 0.22s cubic-bezier(0.22, 0.61, 0.36, 1); }
.dsheet-grip {
  position: relative;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 12px 12px 9px;
  cursor: grab;
  touch-action: none;          /* 끄는 동안 페이지가 같이 스크롤되지 않게 */
  user-select: none;           /* 끄는 동안 글자가 선택되지 않게(실제로 겪은 문제) */
  -webkit-user-select: none;
  border-bottom: 1px solid var(--border);
  background: rgba(255, 255, 255, 0.03);
}
.dsheet.is-dragging .dsheet-grip { cursor: grabbing; }
.dsheet-bar {
  position: absolute;
  top: 5px;
  left: 50%;
  transform: translateX(-50%);
  width: 38px;
  height: 4px;
  border-radius: 999px;
  background: #3f3f46;
}
.dsheet-title { font-size: 12px; font-weight: 600; flex: 1; }
.dsheet-hint { font-size: 10px; color: var(--text-dim); }
.dsheet.is-expanded .dsheet-hint { visibility: hidden; }
/* 아이콘은 작아 보여도 눌리는 면적은 최소 40px은 돼야 한다(글자만 15px이면 실제 터치
   영역이 그보다도 좁아 정밀 터치가 필요했다 — 모바일 터치 UX 점검에서 발견). */
.dsheet-close {
  background: none; border: none; color: var(--text-dim); font-size: 15px; cursor: pointer;
  min-width: 40px; min-height: 40px; display: flex; align-items: center; justify-content: center;
  margin: -8px -6px -8px 0;
}
/* 아이폰 하단 홈 인디케이터가 마지막 목록 줄을 가리지 않게 safe-area만큼 더 띄운다. */
.dsheet-body { flex: 1; overflow-y: auto; padding: 10px 13px calc(18px + env(safe-area-inset-bottom)); }

/* 근거 목록 */
.evidence-lead { font-size: 11px; color: var(--text-dim); margin: 0 0 10px; line-height: 1.5; }
.evidence-empty { font-size: 12px; color: var(--text-dim); }
.evidence-row { display: flex; gap: 9px; padding: 7px 0; border-bottom: 1px solid var(--border); }
.evidence-label { flex: 0 0 92px; font-size: 10px; color: #93c5fd; line-height: 1.45; }
.evidence-detail { flex: 1; font-size: 12px; line-height: 1.5; display: flex; flex-direction: column; gap: 3px; }
.evidence-link { color: var(--text); text-decoration: none; border-bottom: 1px dotted #4a90e2; }
.evidence-time { font-size: 10px; color: var(--text-dim); }

/* 시트 안 목록(핀 클릭 결과) */
.sheet-list { display: flex; flex-direction: column; gap: 2px; }
.pizza-detail { gap:10px; padding:4px 2px; }
.pizza-detail-value { font-size:22px; color:#ffe0a4; letter-spacing:-.3px; }
.sheet-list-row {
  display: flex;
  flex-direction: column;
  gap: 4px;
  text-align: left;
  background: none;
  border: none;
  border-bottom: 1px solid var(--border);
  color: var(--text);
  padding: 9px 2px;
  cursor: pointer;
}
.sheet-list-row:hover { background: rgba(255, 255, 255, 0.04); }
.sheet-list-top { display: flex; align-items: center; gap: 7px; font-size: 10px; color: var(--text-dim); }
.sheet-list-title { font-size: 13px; line-height: 1.45; }
.hotspot-why h4 { margin: 0 0 5px; font-size: 12px; color: #e9d5ff; }
.hotspot-why ul { margin: 0 0 8px; padding-left: 16px; font-size: 12px; line-height: 1.6; }
.hotspot-nums { font-size: 11px; color: var(--text-dim); margin: 0 0 6px; line-height: 1.5; }
.hotspot-calls { font-size: 11px; color: #fcd34d; margin: 0 0 8px; }

/* ── 인물 프로필 ─────────────────────────────────────────────── */
.person-where { margin-bottom: 14px; }
.person-where-main { font-size: 16px; font-weight: 600; }
.person-where-sub { font-size: 11px; color: var(--text-dim); margin-top: 3px; }
.person-where-reasons { font-size: 11px; color: #93c5fd; margin-top: 4px; line-height: 1.5; }
.person-where-next { font-size: 12px; color: #fbd85d; margin-top: 6px; }

.timeline-box, .related-box { margin-top: 22px; }
.timeline-box h3, .related-box h3 { font-size: 14px; margin: 0 0 9px; }
.timeline-box .hint, .related-box .hint { font-size: 10px; color: var(--text-dim); font-weight: 400; margin-left: 6px; }
.timeline { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
.timeline-row { display: flex; gap: 10px; padding: 9px 0; border-bottom: 1px solid var(--border); }
.timeline-row.is-clickable { cursor: pointer; }
.timeline-row.is-clickable:hover { background: rgba(255, 255, 255, 0.03); }
.timeline-icon { flex: 0 0 18px; text-align: center; font-size: 12px; }
.timeline-body { flex: 1; min-width: 0; }
.timeline-head { display: flex; flex-wrap: wrap; gap: 7px; font-size: 10px; color: var(--text-dim); margin-bottom: 3px; }
.timeline-kind { color: #93c5fd; }
.timeline-loc { color: #fbd85d; }
.timeline-planned { color: #fdba74; }
.timeline-title { font-size: 13px; line-height: 1.5; }
.timeline-empty { font-size: 12px; color: var(--text-dim); }
.related-list { display: flex; flex-direction: column; }
.related-row {
  display: flex;
  gap: 9px;
  align-items: baseline;
  text-align: left;
  background: none;
  border: none;
  border-bottom: 1px solid var(--border);
  color: var(--text);
  padding: 9px 2px;
  cursor: pointer;
}
.related-row:hover { background: rgba(255, 255, 255, 0.04); }
.related-time { flex: 0 0 56px; font-size: 10px; color: var(--text-dim); }
.related-title { font-size: 13px; line-height: 1.45; }
.related-empty { font-size: 12px; color: var(--text-dim); }

@media (max-width: 420px) {
  .legend { max-width: 168px; font-size: 10px; }
  .modal-title { font-size: 17px; }
  .evidence-label { flex-basis: 74px; }
}


/* ══════════════════════════════════════════════════════════════════
   2026-09-07 — 이름 변경 / 브리핑 아코디언 / 컴팩트 범례 / 2D·3D 전환
   ══════════════════════════════════════════════════════════════════ */

/* ⚠️ hidden 속성이 CSS의 display에 지는 사고를 두 번 겪었다. 여닫는 요소에는 반드시
   [hidden] 전용 규칙을 같이 둘 것 — 없으면 감춰도 화면을 덮어 터치를 가로챈다. */
#map[hidden],
.flatmap[hidden] { display: none !important; }

/* ── 범례 더 컴팩트하게 ── */
.legend { max-width: 208px; border-radius: 7px; bottom: 34px; }
.legend-rows { column-gap: 8px; }
.legend-toggle { font-size: 10px; padding: 0 0 3px; }

/* ── 2D 평면 지도(Leaflet) ── */
.flatmap {
  height: var(--map-height, clamp(300px, 48vh, 440px));
  width: 100%;
  background: #08182c;
  z-index: 1; /* 범례(z-index:50)보다 아래 */
}
.flatmap .leaflet-container { background: #08182c; font-family: inherit; }
/* 핀은 pins.js가 만든 요소를 그대로 넣는다 → Leaflet 기본 마커 배경을 지운다. */
.flatmap .leaflet-marker-icon.flat-pin {
  background: none;
  border: none;
  width: 0 !important;
  height: 0 !important;
}
.flatmap .leaflet-control-zoom a {
  background: rgba(17, 17, 20, 0.85);
  color: #e7e7ea;
  border-color: rgba(255, 255, 255, 0.14);
}
.flatmap .leaflet-control-zoom a:hover { background: rgba(40, 40, 48, 0.95); }
/* 손가락 제스처가 페이지 스크롤과 싸우지 않게(3D의 #map canvas와 같은 이유) */
.flatmap .leaflet-container { touch-action: none; }

/* ── 일일 브리핑 아코디언 ── */
.briefing { padding: 0; overflow: hidden; }
/* 2026-09-11: 토글 버튼을 절반 폭·왼쪽 정렬로 줄이고, 남은 절반에 PIR 빠른 진입 버튼(요청). */
.briefing-head-row { display: flex; align-items: stretch; gap: 6px; padding-right: 10px; }
.briefing-toggle {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 50%;
  flex: 0 0 auto;
  background: none;
  border: none;
  color: var(--text);
  font-family: inherit;
  font-size: 14px;
  font-weight: 600;
  text-align: left;
  padding: 11px 14px;
  cursor: pointer;
}
.briefing-caret { font-size: 11px; color: #c4b5fd; width: 10px; }
.briefing-title { flex: 1; }
.briefing-toggle .briefing-engine { font-weight: 400; }
.briefing-pir-btn {
  flex: 1;
  align-self: center;
  margin: 0;
  padding: 7px 10px;
  border: 1px solid #62517c;
  border-radius: 8px;
  background: #2b213b;
  color: #e9ddff;
  font: 600 11px inherit;
  cursor: pointer;
}
.briefing-pir-btn:hover { background: #362a4b; }
.briefing-pir-short { display: none; }
/* 2026-09-11: 판단 카드가 5개까지 쌓이면 화면 몇 장 분량으로 길어져 요청대로 높이를 제한했다.
   다 보고 싶으면 이 안에서만 스크롤하면 되고, 바깥 페이지 스크롤은 곧바로 기사 목록으로 간다. */
.briefing-body { padding: 0 14px 12px 32px; max-height: 62vh; overflow-y: auto; -webkit-overflow-scrolling: touch; }
.briefing.is-collapsed .briefing-body { display: none; }
.briefing-lines { margin: 0; }

.briefing-assessment { margin-top:12px; padding-top:11px; border-top:1px solid #393047; }
.briefing-assessment h3 { margin:0 0 8px; font-size:12px; color:#ddd6fe; }
.briefing-judgment { width:100%; display:flex; align-items:center; gap:7px; padding:7px 0; border:0; border-bottom:1px solid rgba(255,255,255,.06); background:none; color:var(--text); text-align:left; font:12px/1.45 inherit; cursor:pointer; }
.briefing-gap { margin:9px 0; color:#d9b985; font-size:11px; line-height:1.55; }
.briefing-tools { width:100%; padding:8px; border:1px solid #62517c; border-radius:8px; background:#2b213b; color:#e9ddff; font:600 12px inherit; cursor:pointer; }

.watch-alert-bar[hidden] { display:none!important; }
.watch-alert-bar { max-width:640px; margin:0 auto 10px; padding:0 12px; }
.watch-alert-button { width:100%; padding:10px 12px; border:1px solid #806430; border-radius:10px; background:#2c2518; color:#ffe1a0; font:600 12px/1.4 inherit; cursor:pointer; }

.event-state,.confidence-tag,.corroboration-chip,.event-timing { display:inline-flex; align-items:center; border:1px solid #45505f; border-radius:999px; padding:2px 6px; font-size:9px; white-space:nowrap; }
.state-신규 { color:#ffb4ae; border-color:#8b423d; background:#3a1c1a; }
.state-진행 { color:#ffe09a; border-color:#756033; background:#302817; }
.state-기록 { color:#a9b5c4; }
/* 신뢰도는 숫자 하나가 아니라 복수 라벨(공식 관측/공식 발표/교차 확인/초기 신호/상충 정보 있음)로 표시한다. */
.confidence-tag.tag-official_observation { color:#91e1c3; border-color:#356f5d; }
.confidence-tag.tag-official_statement { color:#bdd7f2; border-color:#42647d; }
.confidence-tag.tag-cross_verified { color:#c4b5fd; border-color:#62517c; }
.confidence-tag.tag-initial_signal { color:#d9b985; border-color:#725f3c; }
.confidence-tag.tag-conflicting { color:#ffc28f; border-color:#8b5a3d; background:#382218; }
.corroboration-chip { color:#c4b5fd; border-color:#62517c; }
.event-timing { color:#a9b5c4; }

/* 기사 상세의 신뢰도 라벨은 눌러서 근거를 펼치는 details/summary로 만든다. */
.confidence-tags { display:flex; flex-wrap:wrap; gap:6px; margin:6px 0; }
.confidence-tag-detail { border:1px solid #45505f; border-radius:8px; padding:3px 8px; font-size:11px; }
.confidence-tag-detail.tag-official_observation { border-color:#356f5d; color:#91e1c3; }
.confidence-tag-detail.tag-official_statement { border-color:#42647d; color:#bdd7f2; }
.confidence-tag-detail.tag-cross_verified { border-color:#62517c; color:#c4b5fd; }
.confidence-tag-detail.tag-initial_signal { border-color:#725f3c; color:#d9b985; }
.confidence-tag-detail.tag-conflicting { border-color:#8b5a3d; color:#ffc28f; background:#382218; }
.confidence-tag-detail summary { cursor:pointer; font-weight:600; list-style:none; }
.confidence-tag-detail summary::-webkit-details-marker { display:none; }
.confidence-tag-detail summary::before { content:"▸ "; }
.confidence-tag-detail[open] summary::before { content:"▾ "; }
.confidence-tag-desc { margin:4px 0 0; font-size:11px; color:var(--text-dim); line-height:1.5; }
.card-intel { display:flex; flex-wrap:wrap; gap:5px; margin-top:8px; }
.ioc-chip,.attack-chip { display:inline-flex; padding:3px 7px; border:1px solid #5a4778; border-radius:6px; background:#261c35; color:#d8c9f3; font-size:10px; }

.modal-intel { margin:0 0 14px; padding:12px; border:1px solid #344253; border-radius:10px; background:#121c27; }
.modal-intel:empty { display:none; }
.modal-intel h3 { margin:0 0 8px; font-size:13px; }
.intel-facts { display:flex; flex-wrap:wrap; align-items:center; gap:6px; color:#b5c2d2; font-size:11px; }
.intel-reason,.intel-caveat { margin:8px 0 0; font-size:11px; line-height:1.55; color:#9dacbf; }
.intel-caveat { color:#d1af78; }
.intel-contradiction { margin:8px 0 0; padding:7px 8px; border-left:2px solid #e59558; background:#2d2017; color:#ffc08c; font-size:11px; line-height:1.55; }
.intel-related { display:flex; flex-direction:column; gap:4px; margin-top:10px; }
.intel-related strong { font-size:11px; color:#cbd5e1; }
.intel-related button { padding:7px 8px; border:0; border-left:2px solid #55789a; background:#172331; color:#bcd2e7; text-align:left; font:11px/1.45 inherit; cursor:pointer; }

/* 사건 이력(Timeline, PHASE 6) — .intel-related와 같은 색 토큰을 재사용하고, 시간순 목록이라는
   점만 세로선 + 시간/출처유형 줄로 표현한다. */
.event-timeline { display:flex; flex-direction:column; gap:4px; margin-top:10px; }
.event-timeline > strong { font-size:11px; color:#cbd5e1; }
.event-timeline-list { list-style:none; margin:4px 0 0; padding:0 0 0 10px; border-left:2px solid #2d3d4f; display:flex; flex-direction:column; gap:8px; }
.event-timeline-row { display:flex; flex-direction:column; gap:2px; }
.event-timeline-head { display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
.event-timeline-time { font-size:10.5px; color:#9dacbf; font-variant-numeric:tabular-nums; }
.event-timeline-type { font-size:9.5px; font-weight:600; padding:1px 6px; border-radius:999px; background:rgba(34,197,94,0.18); color:#86efac; }
.event-timeline-type.type-statement { background:rgba(244,196,48,0.18); color:#fbd85d; }
.event-timeline-title { padding:6px 8px; border:0; border-left:2px solid #55789a; background:#172331; color:#bcd2e7; text-align:left; font:11px/1.45 inherit; cursor:pointer; }
.event-timeline-title:disabled { cursor:default; opacity:0.6; }

/* 상충 주장 비교 — 어느 쪽이 맞는지 색으로도 편들지 않는다(양쪽 같은 톤). */
.claim-compare { margin-top:12px; padding:10px; border:1px solid #6d4e33; border-radius:8px; background:#231a12; }
.claim-compare > strong { font-size:11px; color:#ffcb95; }
.claim-note { margin:5px 0 9px; font-size:10px; line-height:1.5; color:#c3a781; }
.claim-axis + .claim-axis { margin-top:10px; padding-top:10px; border-top:1px dashed #4d3b28; }
.claim-axis-name { display:inline-block; margin-bottom:6px; padding:2px 7px; border:1px solid #6d5a41; border-radius:999px; color:#e9d3b2; font-size:9px; }
.claim-sides { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:7px; }
@media (max-width:520px) { .claim-sides { grid-template-columns:1fr; } }
.claim-side { display:flex; flex-direction:column; gap:4px; min-width:0; }
.claim-side-label { color:#d9c3a4; font:600 10px/1.4 inherit; }
.claim-item { display:flex; flex-direction:column; gap:2px; padding:7px 8px; border:0; border-left:2px solid #7c6242; border-radius:0 6px 6px 0; background:#1b1510; color:#d8c6ae; text-align:left; font:11px/1.4 inherit; cursor:pointer; }
.claim-item:disabled { cursor:default; opacity:.75; }
.claim-item-source { color:#b99b74; font-size:9px; }
.claim-item-title { overflow-wrap:anywhere; }
.claim-item-time { color:#9c876a; font-size:9px; }

/* 출처 계열 — 같은 원문을 그대로 실은 곳은 한 칩으로 묶여 보인다. */
.intel-families { margin-top:10px; }
.intel-families strong { font-size:11px; color:#cbd5e1; }
.family-chips { display:flex; flex-wrap:wrap; gap:5px; margin-top:5px; }
.family-chip { padding:2px 7px; border:1px solid #45505f; border-radius:999px; color:#adbccd; font-size:9px; }
.family-chip.is-official { border-color:#3f6f58; color:#9fdcc0; }

/* 변경 이력 */
.revision-chip { display:inline-flex; padding:2px 6px; border:1px solid #4b6079; border-radius:999px; color:#a8c8ea; background:#16202c; font-size:9px; }
.revision-history { margin-top:12px; padding:10px; border:1px solid #3a4d63; border-radius:8px; background:#121b25; }
.revision-history > strong { font-size:11px; color:#bcd6f0; }
.revision-note { margin:5px 0 9px; font-size:10px; line-height:1.5; color:#8ea4bb; }
.revision-list { margin:0; padding-left:16px; display:flex; flex-direction:column; gap:9px; }
.revision-list li { font-size:11px; line-height:1.5; color:#c3d2e2; }
.revision-head { display:flex; flex-wrap:wrap; align-items:center; gap:6px; margin-bottom:3px; }
.revision-field { padding:1px 6px; border:1px solid #4b6079; border-radius:999px; color:#a8c8ea; font-size:9px; }
.revision-at { color:#8095ab; font-size:9px; }
.revision-from { color:#94a6b9; text-decoration:line-through; overflow-wrap:anywhere; }
.revision-to { color:#dbe7f4; overflow-wrap:anywhere; }

/* 기사 검색 */
.sr-only { position:absolute; width:1px; height:1px; margin:-1px; padding:0; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0; }
.news-search { position:relative; display:flex; padding:10px 16px 0; }
.news-search input { width:100%; padding:10px 34px 10px 12px; border:1px solid var(--border); border-radius:10px; background:#12141a; color:var(--text); font:13px/1.4 inherit; }
.news-search input::placeholder { color:#6b7787; }
.news-search input:focus-visible { outline:2px solid #6ea8dc; outline-offset:-1px; }
.news-search button { position:absolute; top:50%; right:24px; transform:translateY(-25%); width:24px; height:24px; border:0; border-radius:50%; background:#2a3140; color:#c3ceda; font-size:11px; line-height:1; cursor:pointer; }
.news-search-status { margin:6px 16px 0; font-size:11px; line-height:1.5; color:#8fa1b5; }
/* ⚠️ display를 가진 클래스는 브라우저 기본 [hidden]{display:none}을 이긴다 —
   이 저장소에서 여러 번 겪은 사고라 감출 요소마다 [hidden] 규칙을 같이 둔다. */
.news-search-status[hidden] { display:none !important; }
.news-search button[hidden] { display:none !important; }

/* 공개 출처 직접 추가 */
.custom-source-form { display:flex; gap:7px; margin:9px 0 0; }
.custom-source-form .ops-input { flex:1; min-width:0; }
.custom-source-list { display:flex; flex-direction:column; gap:6px; margin-top:8px; }
.custom-source-row { display:flex; align-items:center; gap:10px; padding:8px 10px; border:1px solid #35404f; border-radius:8px; background:#141c26; }
.custom-source-text { display:flex; flex-direction:column; gap:2px; min-width:0; flex:1; }
.custom-source-text strong { font-size:12px; color:#dbe7f4; }
.custom-source-text small { font-size:10px; color:#8296ab; overflow-wrap:anywhere; }
.custom-source-remove { flex:0 0 auto; padding:6px 10px; border:1px solid #6b4a4a; border-radius:8px; background:#2a1a1a; color:#e2a9a4; font:600 11px inherit; cursor:pointer; }
.custom-source-preset-label { display:block; width:100%; margin-bottom:2px; color:#8fa1b5; font-size:10px; }
.custom-source-result { margin:9px 0 0; padding:9px 10px; border-radius:8px; border:1px solid #3c4959; background:#131b24; color:#b9c8d9; font-size:11px; line-height:1.55; white-space:pre-line; }
.custom-source-result[hidden] { display:none !important; }
.custom-source-result.is-good { border-color:#3f6f58; background:#16281f; color:#b6e6cd; }
.custom-source-result.is-bad { border-color:#7d4a44; background:#2a1a18; color:#f0b8b1; }
.custom-source-result .ops-primary { margin-top:8px; }

/* 새로 들어온 기사 알림 */
.new-arrivals-bar { display:block; width:calc(100% - 32px); margin:10px 16px 0; padding:10px 12px; border:1px solid #3f6f58; border-radius:10px; background:#16281f; color:#9fdcc0; font:600 12px/1.4 inherit; text-align:center; cursor:pointer; }
.new-arrivals-bar[hidden] { display:none !important; }
.new-arrivals-bar.is-breaking { border-color:#8b423d; background:#2c1a18; color:#ffb4ae; }

/* 분석 작업공간 */
.operations-modal .modal-panel { width:min(860px,100%); }
.tlp-badge { padding:3px 7px; border:1px solid #398067; border-radius:999px; color:#93e2c4; font-size:9px; }
.ops-tabs { display:flex; gap:3px; overflow-x:auto; padding:8px 10px; border-bottom:1px solid var(--border); background:#101014; scrollbar-width:none; }
.ops-tabs::-webkit-scrollbar{display:none}.ops-tab{flex:1 0 auto;padding:9px 10px;border:1px solid transparent;border-radius:8px;background:none;color:#99a4b2;font:600 12px inherit;cursor:pointer}.ops-tab.is-on{background:#263447;border-color:#40546c;color:#fff}
.ops-body { padding:14px 16px 70px; }
.ops-section { margin:0 0 18px; padding:14px; border:1px solid #303a47; border-radius:12px; background:#141b24; }
.ops-section h3 { margin:0 0 7px; font-size:14px; }.ops-hint,.ops-empty{margin:0 0 10px;color:#92a1b4;font-size:11px;line-height:1.55}.ops-empty{padding:9px 0}
.world-summary-three{counter-reset:world-summary;list-style:none;margin:10px 0 0;padding:0;display:grid;gap:7px}.world-summary-line{counter-increment:world-summary}.world-summary-line button{position:relative;width:100%;display:grid;grid-template-columns:auto minmax(0,1fr);gap:3px 9px;padding:11px 11px 11px 42px;border:1px solid #40536a;border-radius:10px;background:#192634;color:var(--text);text-align:left;font:inherit;cursor:pointer}.world-summary-line button::before{content:counter(world-summary);position:absolute;left:12px;top:50%;width:20px;height:20px;display:grid;place-items:center;transform:translateY(-50%);border-radius:50%;background:#75baff;color:#0c1722;font-size:11px;font-weight:800}.world-summary-label{align-self:start;padding:2px 6px;border:1px solid #60748b;border-radius:999px;color:#b9d9ef;font-size:9px;white-space:nowrap}.world-summary-line strong{min-width:0;font-size:12px;line-height:1.5;overflow-wrap:anywhere}.world-summary-line small{grid-column:2;color:#94a5b8;font-size:10px;line-height:1.45}.world-summary-line button:disabled{cursor:default;opacity:.66}.world-summary-line button:disabled::before{background:#64748b;color:#edf2f7}
.sns-analysis-metrics{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:7px;margin:10px 0}.sns-analysis-report{padding:10px 12px;border-left:3px solid #7dd3fc;background:#142635}.sns-analysis-report p{margin:0 0 6px;color:#dce9f3;font-size:12px;line-height:1.6}.sns-analysis-report p:last-child{margin-bottom:0}.sns-analysis-recent{display:grid;gap:6px;margin-top:12px}.sns-analysis-recent>strong{font-size:11px;color:#a9cbe1}.sns-analysis-row{display:grid;grid-template-columns:1fr auto;gap:3px 8px;width:100%;padding:9px;border:1px solid #344b5d;border-radius:8px;background:#15222d;color:var(--text);text-align:left;cursor:pointer}.sns-analysis-row span{font-size:11px;font-weight:700}.sns-analysis-row small{font-size:9px;color:#94a5b8}.sns-analysis-row p{grid-column:1/-1;margin:2px 0 0;font-size:11px;line-height:1.45;color:#c1ced9;overflow-wrap:anywhere}
.ops-summary-grid { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:8px; margin-bottom:14px; }
.ops-metric { padding:12px; border:1px solid #344253; border-radius:10px; background:#172331; }.ops-metric span{display:block;color:#93a3b7;font-size:10px}.ops-metric strong{display:block;margin-top:4px;font-size:20px}
.judgment-row,.watch-hit,.cyber-row { width:100%; display:grid; grid-template-columns:auto 1fr; gap:5px 8px; align-items:center; padding:11px 0; border:0; border-bottom:1px solid #293645; background:none; color:var(--text); text-align:left; cursor:pointer; }
.judgment-row strong,.watch-hit strong,.cyber-row strong{font-size:12px;line-height:1.5}.judgment-row small,.watch-hit small,.cyber-row small{grid-column:2;color:#93a2b5;font-size:10px;line-height:1.5}.cyber-row{grid-template-columns:1fr}.cyber-row small{grid-column:1}
.change-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:7px}.change-row{display:flex;justify-content:space-between;gap:8px;padding:9px;background:#192431;border-radius:8px;font-size:11px}.delta.up{color:#ffaaa4}.delta.down{color:#8fd8be}.delta.flat{color:#aab6c4}
.ops-list{margin:7px 0 0;padding-left:18px;color:#c4cdd8;font-size:12px;line-height:1.65}.cap-alert{display:grid;grid-template-columns:1fr auto;gap:5px 10px;padding:10px 0;border-bottom:1px solid #2b3745}.cap-alert strong,.cap-alert small{grid-column:1}.cap-alert strong{font-size:12px}.cap-alert small,.cap-codes{font-size:10px;color:#93a2b5}.cap-codes{grid-column:1/-1;color:#e4b86e}.ops-link{grid-column:2;grid-row:2/4;border:1px solid #486783;border-radius:7px;background:#1a2a38;color:#add3ec;cursor:pointer}
.ops-region-chips{display:flex;flex-wrap:wrap;gap:6px}.ops-region-chip,.relation-row{padding:7px 9px;border:1px solid #3c4959;border-radius:999px;background:#19232e;color:#b8c4d2;font:11px inherit;cursor:pointer}.ops-region-chip.is-on{border-color:#d3a954;background:#3a2e19;color:#ffe1a3}
.ops-primary{padding:9px 12px;border:1px solid #526d8b;border-radius:8px;background:#21354a;color:#d8edff;font:600 12px inherit;cursor:pointer}.ops-primary:disabled{opacity:.6}.ops-inline-form{display:flex;gap:7px;margin:9px 0}.ops-input,.ops-textarea{width:100%;padding:10px;border:1px solid #415064;border-radius:8px;background:#101820;color:#edf2f7;font:13px inherit}.ops-textarea{resize:vertical}.pir-row{padding:9px 0;border-top:1px solid #293544;font-size:12px}.pir-row-head{display:grid;grid-template-columns:auto 1fr auto;gap:8px;align-items:start}.pir-row .is-done{text-decoration:line-through;color:#7f8c9c}.ops-delete{border:0;background:none;color:#c98e89;cursor:pointer}
.pir-matches{margin:6px 0 0 26px;font-size:11px}.pir-matches summary{cursor:pointer;color:#8fa0b4;list-style:none}.pir-matches summary::-webkit-details-marker{display:none}.pir-match-list{display:flex;flex-direction:column;gap:5px;margin-top:6px}.pir-match-row{display:flex;gap:7px;align-items:baseline;background:none;border:0;text-align:left;color:#c7d2e0;padding:2px 0;cursor:pointer;font:inherit}.pir-match-row:hover{color:#fff}.pir-match-time{color:#8fa0b4;font-size:10px;white-space:nowrap}.pir-match-title{flex:1;min-width:0}.pir-empty-hint{margin:5px 0 0 26px;color:#6b7789;font-size:10.5px}.person-activity-row{display:grid;grid-template-columns:1fr auto;gap:4px 10px;padding:9px 0;border-bottom:1px solid #293544;font-size:11px}.person-activity-row small{grid-column:1/-1;color:#8f9fb2}.relation-row{margin:3px}.export-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:7px}.audit-row{display:grid;grid-template-columns:110px 1fr;gap:8px;padding:6px 0;border-bottom:1px solid #293544;color:#9baabd;font-size:10px}
.ops-time-list{display:flex;flex-direction:column;gap:5px}.ops-time-option{display:flex;justify-content:space-between;padding:12px;border:1px solid #374352;border-radius:9px;background:#18212c;color:#d8e0e9;cursor:pointer}.ops-time-option.is-on{border-color:#d2a552;background:#372b18;color:#ffe0a0}
.ops-file{width:100%;padding:9px;margin:5px 0 8px;border:1px dashed #48586d;border-radius:8px;color:#aebdd0;background:#111923}.stix-row{padding:6px 0;border-top:1px solid #283544;color:#aebed0;font-size:10px;overflow-wrap:anywhere}

.settings-diagnostics summary { padding:10px 0; color:#dbe6f2; font-size:14px; font-weight:700; cursor:pointer; }
.settings-situation { margin:8px 0 0; padding:12px; border-radius:10px; }
.settings-situation h2 { font-size:17px; }.settings-situation .situation-eyebrow{display:none}.settings-situation .signal-card{padding:12px}.settings-situation .signal-value{font-size:22px}
#analysisBtn { width:auto; min-width:44px; padding:0 9px; white-space:nowrap; }

/* ── 번역 버튼(브라우저 내장 번역기가 있을 때만 뜬다) ── */
.tr-btn {
  background: rgba(139, 92, 246, 0.16);
  color: #ddd6fe;
  border: 1px solid rgba(139, 92, 246, 0.5);
  border-radius: 999px;
  padding: 5px 10px;
  font-family: inherit;
  font-size: 11px;
  cursor: pointer;
  white-space: nowrap;
}
.tr-btn:hover { background: rgba(139, 92, 246, 0.26); }
.tr-btn:disabled { opacity: 0.6; cursor: default; }
.tr-btn[hidden] { display: none !important; }

/* ── 테러·침투 경보는 공습경보와 색을 다르게(같은 빨강이면 구분이 안 된다) ── */
.raid-pin.is-terror {
  background: rgba(217, 119, 6, 0.92);
  border-color: #fcd34d;
}

/* 이상 궤적으로 판정된 이동체(요구사항 5) — 평범한 핀과 확실히 구분되게 */
.aircraft-pin.is-anomaly,
.ship-pin.is-anomaly {
  cursor: pointer;
  filter: drop-shadow(0 0 6px rgba(250, 204, 21, 0.95));
  animation: anomaly-blink 1.6s ease-in-out infinite;
}
@keyframes anomaly-blink { 0%, 100% { opacity: 1; } 50% { opacity: 0.45; } }
.vehicle-bar.has-anomaly { cursor: pointer; border-color: rgba(250, 204, 21, 0.5); }

/* ══════════════════════════════════════════════════════════════════
   2026-09-07 (2차) — 범례 확대 / 마커 묶기 / 설정 / 새 지표 핀
   ══════════════════════════════════════════════════════════════════ */

/* ── 범례: 다시 크게 (사용자 신고: "터치가 안 된다") ──
   ⚠️ 같은 날 오전에 "더 작게" 요청으로 줄였다가, 실제 폰에서 눌리지 않는다는 신고를 받고
   되돌린 것이다. 다시 줄이지 말 것 — 손가락으로 누르는 화면에서 12px 체크박스는 너무 작다. */
.legend { padding: 10px 12px; font-size: 13px; max-width: 260px; bottom: 40px; }
.legend .legend-row { gap: 9px; padding: 6px 0; min-height: 30px; }
.legend input[type="checkbox"] { width: 20px; height: 20px; }
.lg-icon { width: 18px; height: 18px; font-size: 13px; line-height: 18px; }
.legend-toggle { font-size: 13px; padding: 4px 0 7px; min-height: 26px; }
.legend-rows { column-gap: 14px; }
@media (max-width: 420px) {
  .legend { max-width: 250px; font-size: 12.5px; }
}

/* ── 묶인 핀의 개수 배지(항공기·선박·여행경보·재난에도 붙는다) ── */
.aircraft-pin, .ship-pin, .travel-pin, .disaster-pin { position: relative; }
.aircraft-pin .cluster-count,
.ship-pin .cluster-count,
.travel-pin .cluster-count,
.disaster-pin .cluster-count {
  position: absolute;
  top: -6px;
  right: -10px;
  min-width: 15px;
  padding: 0 3px;
  border-radius: 999px;
  background: #111114;
  border: 1px solid rgba(255, 255, 255, 0.35);
  color: #fff;
  font-size: 9px;
  line-height: 15px;
  text-align: center;
}

/* ── 여행경보 / 재난·열점 핀 ── */
.travel-pin, .disaster-pin {
  width: 26px;
  height: 26px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 14px;
  cursor: pointer;
  transform: translate(-50%, -50%);
  pointer-events: auto;
  background: rgba(17, 17, 20, 0.9);
}
.travel-pin { border: 2px solid #38bdf8; }
.travel-pin.level-3 { border-color: #fbbf24; }
.travel-pin.level-4 { border-color: #ef4444; box-shadow: 0 0 10px rgba(239, 68, 68, 0.6); }
.disaster-pin { border: 2px solid #fb923c; }
.disaster-pin.level-high { border-color: #ef4444; box-shadow: 0 0 10px rgba(239, 68, 68, 0.5); }
.disaster-pin.level-low { border-color: #64748b; }
.lg-travel, .lg-disaster { background: none; }

/* ── 목록 시트 보조 줄 ── */
.sheet-list-sub {
  display: block;
  margin-top: 3px;
  font-size: 11px;
  color: var(--text-dim);
  line-height: 1.45;
}

/* ── 번역 표시 ── */
.tr-tag {
  display: inline-block;
  margin-top: 4px;
  background: none;
  border: none;
  padding: 2px 0;
  color: #a5b4fc;
  font-family: inherit;
  font-size: 11px;
  cursor: pointer;
  text-decoration: underline;
}

/* ── 설정 화면 ── */
.icon-btn {
  background: rgba(255, 255, 255, 0.08);
  border: 1px solid var(--border);
  color: var(--text);
  border-radius: 10px;
  width: 34px;
  height: 30px;
  font-size: 15px;
  cursor: pointer;
}
.icon-btn:hover { background: rgba(255, 255, 255, 0.16); }

.settings-modal .set-title { font-size: 15px; font-weight: 700; color: var(--text); }
.set-body { padding: 4px 16px 20px; }
.set-group { padding: 14px 0; border-bottom: 1px solid var(--border); }
.set-group:last-child { border-bottom: none; }
.set-group h3 { margin: 0 0 6px; font-size: 14px; color: var(--text); }
.set-hint { margin: 0 0 8px; font-size: 12px; color: var(--text-dim); line-height: 1.5; }
.set-row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 9px 0;
  cursor: pointer;
  user-select: none;
  min-height: 34px;
}
.set-row input[type="checkbox"] { width: 20px; height: 20px; accent-color: #e63946; }
.set-label { font-size: 14px; color: var(--text); }
.set-chips { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 8px; }
.set-chip {
  background: rgba(255, 255, 255, 0.06);
  border: 1px solid var(--border);
  color: var(--text-dim);
  border-radius: 999px;
  padding: 7px 12px;
  font-family: inherit;
  font-size: 12.5px;
  cursor: pointer;
}
.set-chip.is-on { background: rgba(230, 57, 70, 0.22); border-color: #e63946; color: #fff; }
.set-btn {
  margin-top: 10px;
  width: 100%;
  background: rgba(255, 255, 255, 0.06);
  border: 1px solid var(--border);
  color: var(--text);
  border-radius: 10px;
  padding: 11px;
  font-family: inherit;
  font-size: 13px;
  cursor: pointer;
}
.set-btn:disabled { opacity: 0.6; }

/* 공공 지표 요약 띠(여행경보·재난·통행량) */
.indicator-bar[hidden] { display: none !important; }
.indicator-bar {
  display: flex;
  flex-wrap: wrap;
  gap: 7px;
  padding: 9px 12px;
  border-bottom: 1px solid var(--border);
}
.ind-chip {
  background: rgba(255, 255, 255, 0.06);
  border: 1px solid var(--border);
  color: var(--text);
  border-radius: 999px;
  padding: 7px 12px;
  font-family: inherit;
  font-size: 12.5px;
  cursor: pointer;
}
.ind-chip:hover { background: rgba(255, 255, 255, 0.12); }

/* 번역된 글: 원문은 요소의 title 속성에 남아 있다(길게 누르면 뜬다) */
.is-translated { border-left: 2px solid rgba(165, 180, 252, 0.5); padding-left: 6px; }
/* 외국어인데 이 기기·브라우저에서 번역을 못 한 글 — 가짜 번역을 만들지 않고, 그렇다고
   조용히 숨기지도 않는다. is-translated와는 다른(점선) 테두리로 "이건 원문 그대로"임을
   은은하게 표시한다(제목 속성에 이유가 길게 누르면 뜬다). */
.is-foreign-untranslated { border-left: 2px dashed rgba(148, 163, 184, 0.45); padding-left: 6px; }

/* ══════════════════════════════════════════════════════════════════
   2026-09-07 (3차) — 축소(zoom-out) 시 이름표 접기 + 2D 안티메리디안 수정
   ══════════════════════════════════════════════════════════════════ */

/* 많이 축소하면 인물·경보·주목구역 핀은 아이콘+숫자 배지만 남기고 이름표를 접는다
   (js/pins.js의 isCompact 참고 — 이름표를 그대로 두면 글자끼리 겹쳐 못 읽었다). */
.person-pin.is-compact,
.raid-pin.is-compact,
.hotspot-pin.is-compact {
  padding: 0;
  width: 26px;
  height: 26px;
  justify-content: center;
  border-radius: 50%;
  gap: 0;
}
.person-pin.is-compact .person-pin-name,
.raid-pin.is-compact .raid-pin-name,
.hotspot-pin.is-compact .hotspot-name,
.hotspot-pin.is-compact .hotspot-dot {
  display: none;
}
.person-pin.is-compact .person-pin-flag { font-size: 15px; }
.raid-pin.is-compact .raid-pin-icon { font-size: 14px; }
.hotspot-pin.is-compact { border-width: 2px; }
.hotspot-pin.is-compact::after {
  content: "◎";
  font-size: 13px;
  line-height: 1;
}

.person-pin .cluster-count,
.raid-pin .cluster-count {
  position: absolute;
  top: -6px;
  right: -8px;
  min-width: 16px;
  height: 16px;
  padding: 0 3px;
  border-radius: 999px;
  background: #111114;
  border: 1px solid rgba(255, 255, 255, 0.4);
  color: #fff;
  font-size: 9.5px;
  font-weight: 700;
  line-height: 16px;
  text-align: center;
}

/* 공개정보 현황판은 설정의 접힌 진단 영역에서만 쓴다. */
.situation { margin:8px auto 24px; max-width:1240px; padding:24px; border:1px solid #2e3743; border-radius:20px; background:linear-gradient(130deg,#141e29,#11151d 60%); scroll-margin-top:80px; }
.situation-head { display:flex; align-items:center; justify-content:space-between; gap:16px; }
.situation-eyebrow { font-size:10px; color:#7ed6c1; letter-spacing:2px; font-weight:700; }
.situation h2 { margin:7px 0 0; font-size:24px; letter-spacing:-.8px; }
.source-health { color:#a8b8ca; background:#1d2937; padding:8px 12px; border-radius:20px; font-size:12px; white-space:nowrap; }
.situation-intro { color:#aab5c5; font-size:13px; line-height:1.8; margin:12px 0 20px; }
.signal-grid { display:grid; grid-template-columns:1fr; gap:12px; }
.signal-card { padding:20px; border-radius:14px; border:1px solid #344150; background:#18222f; min-width:0; }
.signal-card h3 { margin:0 0 16px; font-size:13px; color:#c3cedb; font-weight:500; }
.signal-value { display:block; font-size:28px; letter-spacing:-.6px; font-variant-numeric:tabular-nums; color:#f4f7fb; }
.signal-detail { color:#b0bece; font-size:12px; line-height:1.7; margin:10px 0; }
.signal-footnote { color:#92a2b8; font-size:11px; line-height:1.8; margin:12px 0 0; overflow-wrap:anywhere; }
.signal-attention { border-color:#73523b; background:linear-gradient(130deg,#34291f,#1b2430); }
.situation-link { display:inline-block; color:#93c9ed; font-size:12px; line-height:1.8; text-underline-offset:3px; padding:5px 0; }
.situation-controls { display:flex; gap:6px; border-bottom:1px solid #303c4a; margin:22px 0 18px; padding-bottom:10px; flex-wrap:wrap; }
.situation-tab,.situation-more { color:#aebcd0; background:transparent; border:1px solid transparent; padding:11px 16px; border-radius:8px; cursor:pointer; font-size:13px; }
.situation-tab.is-selected { background:#2b3d50; color:#eef8ff; border-color:#455c74; }
.situation-region { display:flex; align-items:center; gap:10px; color:#b5c1d0; font-size:12px; margin-bottom:14px; }
.situation-region select { color:#ecf1f7; background:#192634; border:1px solid #435367; border-radius:8px; padding:10px; max-width:240px; }
.situation-alert { border:1px solid #2c3a4b; border-left:3px solid #d4a75c; padding:16px 18px; margin-top:10px; border-radius:10px; background:#121c28; }
.situation-alert.priority-3 { border-left-color:#f18478; }
.alert-category { color:#c9aa77; font-size:11px; }
.situation-alert h3 { font-size:15px; line-height:1.6; margin:7px 0; overflow-wrap:anywhere; }
.situation-alert p { font-size:12px; color:#b0bed0; line-height:1.7; margin:6px 0; }
.alert-meta { display:flex; flex-wrap:wrap; justify-content:space-between; gap:8px; align-items:center; color:#8fa2b9; font-size:11px; }
.situation-empty { color:#acbbcd; font-size:13px; padding:18px 6px; line-height:1.7; }
.situation-more { margin-top:12px; width:100%; border-color:#3d4c60; }
.facility-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px; }
.facility-card { padding:18px; border:1px solid #344150; border-radius:12px; background:#16212d; }
.facility-card h3 { font-size:14px; margin:0 0 14px; }
.facility-card strong { color:#f2d4a0; font-size:20px; }
.source-row { display:grid; grid-template-columns:1fr auto; gap:6px 16px; padding:14px 0; border-bottom:1px solid #2b394b; align-items:center; }
.source-row small { grid-column:1/-1; color:#8e9fb4; line-height:1.7; overflow-wrap:anywhere; }
.source-good { color:#8ce1c2; font-size:12px; }.source-missing { color:#d9b985; font-size:12px; }
.people-section { scroll-margin-top:80px; }
.people-head { flex-wrap:wrap; gap:8px; }
.people-search-tools { display:flex; gap:10px; align-items:center; padding:12px 16px 0; flex-wrap:wrap; }
.people-search-tools label { color:#cbd5e1; font-size:13px; }
.people-search-tools input { flex:1; min-width:160px; max-width:460px; padding:12px 14px; border:1px solid #465364; background:#17212d; color:#f0f4f9; font:inherit; font-size:16px; border-radius:10px; }
.people-search-tools select { min-width:110px; max-width:100%; padding:12px 14px; border:1px solid #465364; background:#17212d; color:#f0f4f9; font:inherit; font-size:16px; border-radius:10px; }
.people-search-tools button,.person-favorite { padding:12px; border:1px solid #465364; background:#17212d; color:#cbd5e1; border-radius:8px; cursor:pointer; }
.people-search-tools button[aria-pressed=true],.person-favorite[aria-pressed=true] { border-color:#bc9259; color:#ffdb9c; background:#332b21; }
.people-search-status { padding:0 16px; color:#9baabe; font-size:12px; line-height:1.8; }
.people-tracking-head { display:flex; align-items:baseline; flex-wrap:wrap; gap:8px; max-width:640px; margin:14px auto 9px; padding:12px 16px 0; border-top:1px solid #29313b; }
.people-tracking-head h2 { margin:0; font-size:14px; }
.person-result { display:flex; flex-direction:column; flex:0 0 230px; gap:8px; }
.person-result .person-card { flex:1; width:100%; min-width:0; text-align:left; }
.person-result .person-favorite { font-size:12px; }
.person-activity-status { display:inline-flex; width:max-content; max-width:100%; margin:4px 0 7px; padding:4px 8px;
  border:1px solid #587394; border-radius:999px; background:#23354a; color:#d9eaff; font-size:11px; font-weight:700;
  overflow-wrap:anywhere; }
.person-activity-status.phase-upcoming,.person-activity-status.phase-ongoing { border-color:#a87943; background:#392d20; color:#ffe0a4; }
.person-activity-status.phase-cancelled,.person-activity-status.phase-stale { border-color:#665d68; background:#29262c; color:#c4bbc7; }
.person-card-activity,.person-card-schedule { margin-top:5px; color:#dbe5f1; font-size:12px; line-height:1.55;
  display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2; overflow:hidden; overflow-wrap:anywhere; }
.person-card-schedule { color:#f5d597; padding-top:6px; border-top:1px solid var(--border); }
.person-card-corroboration { margin-top:6px; color:#9cc9e8; font-size:11px; line-height:1.45; overflow-wrap:anywhere; }
.person-card-venue,.person-card-related,.person-card-event,.person-card-country { margin-top:6px; color:#bfe7ff; font-size:12px; line-height:1.45; overflow-wrap:anywhere; }
.person-card-country { color:#c9d5e3; }.person-card-country.is-historical { color:var(--text-dim); }
.person-card-role-context { margin-top:6px; color:#d3e6c7; font-size:12px; line-height:1.45; overflow-wrap:anywhere; }
.person-card-event { color:#d7c8ef; display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2; overflow:hidden; }
.person-card-venue.is-historical { color:var(--text-dim); }
.person-public-venue { display:flex; flex-wrap:wrap; gap:5px 10px; align-items:center; margin:8px 0; padding:9px;
  border:1px solid #34566f; border-radius:8px; background:rgba(52,86,111,.16); font-size:12px; }
.person-public-venue.is-historical { border-color:var(--border); color:var(--text-dim); background:#101319; }
.person-venue-map { min-height:36px; margin-left:auto; padding:6px 10px; border:1px solid #4a90e2; border-radius:7px;
  background:#17283b; color:#dceeff; cursor:pointer; }
.person-related-people,.person-related-event,.person-activity-country,.person-activity-role { font-size:12px; color:#d7c8ef; line-height:1.5; overflow-wrap:anywhere; }
.person-activity-country { margin:6px 0; color:#bfe7ff; }.person-activity-country.is-historical { color:var(--text-dim); }
.person-activity-dates { margin:0 0 5px; color:#b9c9db; font-size:11px; line-height:1.5; }
.person-activity-summary,.person-schedule-box,.person-source-box,.person-public-outlook { margin-top:16px; padding:14px;
  border:1px solid #38485b; border-radius:11px; background:#141e29; overflow-wrap:anywhere; }
.person-activity-summary h3,.person-schedule-box h3,.person-source-box h3,.person-public-outlook h3 { margin:0 0 9px; font-size:14px; }
.person-activity-title,.person-outlook-text { margin:7px 0; font-size:14px; line-height:1.65; }
.person-activity-meta,.person-source-summary { margin:5px 0; color:#a7b6c8; font-size:11px; line-height:1.55; }
.person-activity-empty { margin:0; color:#8d9bad; font-size:12px; line-height:1.65; }
.person-schedule-row { display:grid; grid-template-columns:auto minmax(0,1fr); gap:6px 9px; align-items:start; }
.person-schedule-row strong { min-width:0; font-size:13px; line-height:1.55; overflow-wrap:anywhere; }
.person-schedule-row small { grid-column:1/-1; color:#98a8bc; font-size:11px; line-height:1.55; }
.activity-certainty,.outlook-confidence { display:inline-flex; width:max-content; padding:3px 7px; border-radius:999px;
  font-size:10px; font-weight:700; white-space:nowrap; }
.certainty-confirmed { background:#22543d; color:#a7f3d0; }
.certainty-reported,.certainty-active { background:#253c58; color:#bfdbfe; }
.certainty-superseded { background:#3b3030; color:#fecaca; }
.person-outlook-head { display:flex; flex-wrap:wrap; gap:7px; }
.outlook-confidence { border:1px solid #6e5e8b; color:#decfff; }
.person-source-list,.person-outlook-evidence { margin:8px 0 0; padding-left:18px; color:#b8c5d4; font-size:12px; line-height:1.65; }
.person-state-timeline { display:grid; gap:8px; margin:12px 0 0; padding:12px 0 0; border-top:1px solid #334356; list-style:none; }
.person-state-timeline-row { display:grid; grid-template-columns:auto auto minmax(0,1fr); gap:4px 8px; align-items:center; }
.person-state-timeline-row time,.person-state-source { color:#9aabbe; font-size:11px; }
.person-state-title { grid-column:1/-1; color:#d6e0eb; font-size:12px; line-height:1.55; overflow-wrap:anywhere; }
/* 건강 관련 공개 보도·주장 — 공개 활동 요약과 다른 근거 층. 건강 상태를 표시하는 요소는 없다. */
.person-report-box { margin-top:16px; padding:14px; border:1px dashed #6b5b86; border-radius:11px; background:#17162a; overflow-wrap:anywhere; }
.person-report-box h3 { margin:0 0 9px; font-size:14px; }
.person-report-notice,.person-report-coverage,.person-report-caveat { margin:5px 0; color:#a9a3c2; font-size:11px; line-height:1.55; }
.person-report-gap,.person-report-last { margin:5px 0; color:#d6d0ea; font-size:12px; line-height:1.55; }
.person-report-empty { margin:6px 0; color:#8d9bad; font-size:12px; }
.person-report-list { display:grid; gap:9px; margin:10px 0 0; padding:0; list-style:none; }
.person-report-card { padding:10px; border:1px solid #3d3a55; border-radius:9px; background:#1d1b31; }
.person-report-card.report-certainty-circumstantial { border-style:dotted; }
.person-report-head { display:flex; flex-wrap:wrap; gap:6px; }
.person-report-type,.person-report-certainty { padding:2px 7px; border-radius:999px; font-size:10.5px; font-weight:700; white-space:nowrap; }
.person-report-type { background:#34305a; color:#e4dcff; }
.person-report-certainty { border:1px solid #7c7aa0; color:#d9d6ee; }
.report-certainty-confirmed .person-report-certainty { background:#22543d; border-color:#34d399; color:#d1fae5; }
.report-certainty-circumstantial .person-report-certainty { border-style:dashed; color:#b8b3cf; }
.person-report-title { margin:7px 0 4px; font-size:13px; line-height:1.55; }
.person-report-meta { margin:3px 0; color:#a7b6c8; font-size:11px; line-height:1.55; }
.person-report-link { display:inline-flex; align-items:center; min-height:36px; color:#c4b5fd; font-size:12px; }
.activity-certainty.state-ongoing { background:#50371d; color:#ffe0a4; }
.activity-certainty.state-completed { background:#214738; color:#b9f6d7; }
.activity-certainty.state-cancelled { background:#4a292d; color:#fecaca; }
.timeline-activity-state { color:#f5d597; }.timeline-provenance { color:#9cc9e8; }
.region-actor { padding:2px 6px; border:1px solid #52647a; border-radius:999px; color:#cfe1f5; background:#1b2938;
  font-size:10px; white-space:normal; overflow-wrap:anywhere; }
.situation button:focus-visible,.people-section button:focus-visible,.situation a:focus-visible { outline:2px solid #9bd6ff; outline-offset:3px; }
.settings-source-row { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:4px 10px; padding:10px 0; border-top:1px solid #292d34; align-items:center; }
.settings-source-row a { color:#acd5ef; font-size:13px; text-decoration:none; overflow-wrap:anywhere; }
.settings-source-row small { grid-column:1/-1; color:#8795a8; font-size:11px; line-height:1.55; overflow-wrap:anywhere; }
.media-coverage-scope { margin:12px 0 2px; color:#aebdd0; font-size:12px; }
.media-coverage-row > span:first-child { color:#dbe6f2; font-size:13px; overflow-wrap:anywhere; }
@media(max-width:700px) {
  .situation { margin:6px 10px 20px; padding:16px; border-radius:14px; }
  .situation-head { align-items:flex-start; gap:8px; }.situation h2 { font-size:21px; }
  .source-health { font-size:10px; padding:7px 9px; }
  .signal-grid { grid-template-columns:1fr 1fr; gap:8px; }
  .signal-card { padding:15px; }.signal-card:first-child { grid-column:1/-1; }
  .signal-card:first-child .signal-value { font-size:32px; }
  .signal-card h3 { margin-bottom:10px; }.signal-value { font-size:21px; }
  .situation-tab { padding:10px 9px; font-size:12px; }.facility-grid { grid-template-columns:1fr; }
  .situation-alert { padding:14px; }
  #personModal .modal-panel { height:min(60dvh, 660px, max(48dvh, calc(100dvh - 61px - var(--map-height-current, 405px)))); }
  .person-result { flex:0 0 min(82vw, 300px); min-width:0; }
  .person-card-head { font-size:15px; }.person-card-role { font-size:13px; }
  .person-card { padding:13px; min-width:0; }
  .person-card-activity,.person-card-schedule { font-size:13px; }
  .person-schedule-row { grid-template-columns:1fr; }.person-schedule-row small { grid-column:1; }
  .updated { display:none; }
  .ops-summary-grid { grid-template-columns:repeat(3,minmax(0,1fr)); }.ops-metric{padding:9px}.ops-metric strong{font-size:16px}
  .judgment-row,.watch-hit{grid-template-columns:auto minmax(0,1fr)}
}
@media(prefers-reduced-motion:reduce) { html { scroll-behavior:auto; } }
:root { --brief-accent: #75baff; }
.briefing-health { padding: 10px 12px; border-left: 3px solid var(--brief-accent); background: #75baff12; font-size: 12px; line-height: 1.7; }
.brief-interest { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 12px 0; }
.brief-interest label { flex-basis: 100%; font-weight: 600; font-size: 12px; }
.brief-interest input { min-width: 0; flex: 1; padding: 10px; border: 1px solid #8798ae66; border-radius: 8px; background: transparent; color: inherit; }
.brief-interest button { padding: 10px; border: 1px solid #8798ae66; border-radius: 8px; background: #75baff20; color: inherit; cursor: pointer; }
/* 2026-09-11: 전체 높이를 줄여 달라는 요청 — 제목(.briefing-judgment)은 이미 적당히 크다고
   해서 그대로 두고, 나머지(이유·의미·다음 확인·시각·근거)만 더 촘촘하게 줄였다. */
.brief-story { padding: 9px 0; border-bottom: 1px solid #8798ae33; overflow-wrap: anywhere; }
.brief-story .briefing-judgment { font-size: 14px; font-weight: 650; line-height: 1.5; text-align: left; }
.brief-story-reason { color: var(--brief-accent); font-size: 10.5px; margin: 0 0 4px; }
.brief-story-why, .brief-story-watch { font-size: 11px; line-height: 1.5; margin: 4px 0; }
.brief-story-watch { opacity: .8; }
.brief-story-time { font-size: 10px; opacity: .7; line-height: 1.4; }
.person-location-proof { margin-top: 14px; padding: 12px; border: 1px solid #75baff55; border-radius: 10px; line-height: 1.7; }
.person-location-proof h3 { margin: 0 0 8px; font-size: 13px; }
.person-location-proof p, .location-proof-caveat { font-size: 12px; line-height: 1.7; }
.location-proof-quote { margin: 0; font-size: 14px; overflow-wrap: anywhere; }
.location-proof-match { text-decoration-color: #ffd36d; text-decoration-thickness: 3px; text-underline-offset: 4px; background: #ffd36d12; }
.location-proof-source { color: #75baff; font-size: 13px; }
.brief-story-evidence { display: flex; flex-wrap: wrap; gap: 8px; font-size: 11px; }
.brief-story-evidence a { color: var(--brief-accent); }

/* 2026-09-11: 일일 브리핑의 본체 — 말로 된 상황 요약. 기사 카드(작게 줄인 쪽)와 달리 이건
   실제로 읽는 글이라 본문 크기를 지키고, 왼쪽에 분야 딱지를 붙여 훑어보기 쉽게 한다. */
.brief-narrative { margin: 12px 0 4px; padding: 12px 13px; border: 1px solid #4a5a74; border-radius: 10px; background: #121a24; }
.brief-narrative h3 { margin: 0 0 9px; font-size: 13px; color: #cfe2ff; }
.brief-narrative-row { display: grid; grid-template-columns: 58px minmax(0, 1fr); gap: 9px; margin: 0 0 9px; align-items: start; }
.brief-narrative-row:last-child { margin-bottom: 0; }
.brief-narrative-label { font-size: 10.5px; font-weight: 700; color: #8fb8f0; padding-top: 2px; white-space: nowrap; }
.brief-narrative-text { font-size: 12.5px; line-height: 1.72; color: var(--text); overflow-wrap: anywhere; }

/* 2026-09-11: 범례를 지도 아래(툴바)에서 지도 상단(확대 버튼 바로 밑)으로 옮겼다(사용자 요청).
   .legend는 이 파일 여러 곳(반응형 구간마다)에서 bottom 값을 따로 줬는데, 그걸 전부 찾아
   고치는 대신 이 파일 맨 끝에 한 번만 top으로 바꿔 media 쿼리와 무관하게 항상 이기게 한다
   (같은 우선순위면 나중에 나온 규칙이 이긴다 — 새 값을 찾기 쉽게 여기 모아 둔다). */
.legend { position: absolute; top: 88px; bottom: auto; left: 10px; }
.cluster-details { margin: 12px 0; padding: 12px; border: 1px solid #43516a; border-radius: 10px; overflow-wrap: anywhere; }
.cluster-details summary { cursor: pointer; font-weight: 600; }
.cluster-details p { margin: 10px 0; }
.cluster-details label { display: block; margin-top: 12px; }
.cluster-details select, .cluster-details button { display: block; box-sizing: border-box; width: 100%; max-width: 100%; margin-top: 8px; padding: 10px; background: #172238; color: #edf2fa; border: 1px solid #52627d; border-radius: 6px; font: inherit; text-align: left; white-space: normal; overflow-wrap: anywhere; }
.cluster-details button:disabled { opacity: .5; }
.cluster-details :focus-visible { outline: 2px solid #82bbff; outline-offset: 2px; }
.cluster-status:empty { display: none; }

/* v2.6.1 mobile compact polish: keep every existing control and handler, but move map controls
   into the map and turn the large navigation grid into a single, self-contained tab rail. */
@media (max-width: 700px) {
  .map-toolbar {
    position: absolute;
    z-index: 52;
    top: calc(var(--map-height, clamp(300px, 48vh, 440px)) - 50px);
    right: 8px;
    max-width: calc(100% - 16px);
    padding: 0;
    border: 0;
    background: transparent;
  }
  .map-toolbar .globe-controls {
    width: auto;
    flex-wrap: nowrap;
    justify-content: flex-end;
    gap: 4px;
    padding: 3px;
    border: 1px solid rgba(255, 255, 255, .14);
    border-radius: 999px;
    background: rgba(14, 17, 22, .9);
    backdrop-filter: blur(5px);
  }
  .map-toolbar .ghost-btn {
    min-height: 40px;
    padding: 7px 9px;
    border-color: transparent;
    background: transparent;
    white-space: nowrap;
  }
  .globe-hint { display: none; }

  .map-resize-handle { height: 42px; gap: 0; }
  .map-resize-handle span { width: min(72vw, 280px); height: 2px; opacity: .6; }
  .map-resize-handle small { display: none; }
  .map-collapse-btn {
    position: absolute;
    z-index: 53;
    top: var(--map-height, clamp(300px, 48vh, 440px));
    left: 50%;
    transform: translateX(-50%);
    min-height: 42px;
    margin: 0;
    padding: 0 14px;
    background: rgba(17, 17, 20, .96);
  }

  .briefing {
    margin: 5px 10px 6px;
    border-radius: 10px;
  }
  .briefing-head-row { min-height: 48px; gap: 4px; padding: 3px 5px; }
  .briefing-toggle {
    flex: 1 1 auto;
    width: auto;
    min-width: 0;
    gap: 5px;
    padding: 6px 7px;
    font-size: 13px;
  }
  .briefing-title { flex: 0 0 auto; white-space: nowrap; }
  .briefing-toggle .briefing-engine { line-height: 1.25; }
  .briefing-pir-btn {
    flex: 0 0 auto;
    min-height: 40px;
    padding: 6px 9px;
    white-space: nowrap;
  }
  .briefing-pir-full { display: none; }
  .briefing-pir-short { display: inline; }

  .view-segment {
    flex-wrap: nowrap;
    gap: 6px;
    max-width: 100%;
    padding: 6px 10px;
    overflow-x: auto;
    overflow-y: hidden;
    overscroll-behavior-inline: contain;
    scrollbar-width: none;
    -webkit-overflow-scrolling: touch;
  }
  .view-segment::-webkit-scrollbar { display: none; }
  .segment-btn {
    flex: 0 0 auto;
    min-width: max-content;
    min-height: 44px;
    padding: 8px 12px;
    border-radius: 999px;
    overflow: visible;
    text-overflow: clip;
  }

  /* The map keeps only a compact launcher. The readable controls live in an existing DragSheet,
     so opening every filter never becomes a permanent map-sized overlay again. */
  .legend {
    top: auto;
    bottom: 50px;
    left: max(10px, env(safe-area-inset-left));
    width: auto;
    max-width: none;
    padding: 0;
    border: 0;
    background: transparent;
    backdrop-filter: none;
  }
  .globe-wrap.is-map-compact .legend { left: max(58px, calc(env(safe-area-inset-left) + 58px)); }
  .legend-toggle {
    width: auto;
    min-height: 44px;
    padding: 9px 12px;
    border: 1px solid rgba(255, 255, 255, .18);
    border-radius: 999px;
    background: rgba(14, 17, 22, .94);
    color: #eef2f7;
    font-size: 16px;
    font-weight: 650;
    line-height: 1;
    backdrop-filter: blur(5px);
  }
  .legend-count {
    display: inline-flex;
    min-width: 22px;
    height: 22px;
    margin-left: 5px;
    align-items: center;
    justify-content: center;
    border-radius: 999px;
    background: #7c5cc4;
    color: #fff;
    font-size: 12px;
  }
  body.is-legend-sheet-open .map-toolbar,
  body.is-legend-sheet-open .map-collapse-btn,
  body.is-legend-sheet-open .map-zoom-controls,
  body.is-legend-sheet-open .map-home-btn,
  body.is-legend-sheet-open #legend { visibility: hidden; pointer-events: none; }
  body.is-legend-sheet-open { overflow: hidden; }

  .legend-filter-sheet .dsheet-title { font-size: 17px; }
  .legend-filter-sheet .dsheet-body { padding: 0 14px calc(12px + env(safe-area-inset-bottom)); }
  .legend-filter-body { display: flex; min-height: 100%; flex-direction: column; }
  .legend-filter-help { margin: 13px 2px 10px; color: #b2bdca; font-size: 14px; line-height: 1.45; }
  .legend-filter-heading { margin: 0 2px 8px; color: #f1f3f7; font-size: 16px; }
  .legend-quick-filters { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
  .legend-quick-filter {
    min-height: 44px;
    padding: 8px 13px;
    border: 1px solid #465364;
    border-radius: 999px;
    background: #1a2029;
    color: #d5dbe4;
    font: 600 16px/1.2 inherit;
    cursor: pointer;
  }
  .legend-quick-filter.is-active { border-color: #8b6bd1; background: #3d2f57; color: #fff; }
  .legend-filter-section { border-top: 1px solid #303743; }
  .legend-filter-section > summary {
    min-height: 50px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    color: #f1f3f7;
    font-size: 17px;
    font-weight: 700;
    cursor: pointer;
    list-style: none;
  }
  .legend-filter-section > summary::-webkit-details-marker { display: none; }
  .legend-filter-section > summary::after { content: '펼치기 ＋'; color: #aab5c4; font-size: 13px; font-weight: 500; }
  .legend-filter-section[open] > summary::after { content: '접기 −'; }
  .legend-filter-list { display: grid; grid-template-columns: 1fr; padding-bottom: 8px; }
  .legend-filter-list .legend-row,
  .legend-filter-list .legend-action {
    min-height: 48px;
    gap: 12px;
    padding: 4px 2px;
    color: #e2e7ee;
    font-size: 16px;
    line-height: 1.35;
    white-space: normal;
    overflow: visible;
  }
  .legend-filter-list input[type='checkbox'] {
    flex: 0 0 auto;
    width: 24px;
    height: 24px;
    margin: 0;
    accent-color: #e14d52;
  }
  .legend-filter-list .lg-icon { flex: 0 0 auto; width: 24px; height: 24px; font-size: 18px; line-height: 24px; }
  .legend-filter-list .lg-icon svg { width: 100%; height: 100%; }
  .legend-filter-actions {
    position: sticky;
    bottom: 0;
    display: grid;
    grid-template-columns: 1fr 1fr .75fr;
    gap: 7px;
    margin-top: auto;
    padding: 10px 0;
    background: #131316;
    border-top: 1px solid #303743;
  }
  .legend-filter-actions button {
    min-height: 46px;
    padding: 7px;
    border: 1px solid #465364;
    border-radius: 9px;
    background: #1a2029;
    color: #e2e7ee;
    font: 650 15px/1.2 inherit;
    cursor: pointer;
  }
  .legend-filter-actions .is-primary { border-color: #7c5cc4; background: #3d2f57; color: #fff; }
}

/* ── v2.9.2 UI/UX hardening ─────────────────────────────────────────────────────────
   docs/UI_UX_AUDIT_V2_9_2.md의 ID별 최소 수정. 기존 규칙을 고치지 않고 여기서만 덮어써서
   되돌리기 쉽게 둔다. */

/* UI-02: 브리핑 본문은 sticky 지도 아래 좁은 영역에서 안쪽 스크롤 함정이 된다. 페이지 스크롤 하나만 쓴다. */
.briefing-body { max-height: none; overflow: visible; }
.brief-more { margin: 8px 0 0; border: 1px solid var(--border); border-radius: 8px; background: #0e1116; }
.brief-more > summary {
  display: flex; align-items: center; min-height: 44px; padding: 0 10px; list-style: none; cursor: pointer;
  color: #cdd6e3; font-size: 12.5px; font-weight: 650;
}
.brief-more > summary::-webkit-details-marker { display: none; }
.brief-more > summary::after { content: '펼치기 ＋'; margin-left: auto; padding-left: 8px; color: var(--text-dim); font-size: 11.5px; font-weight: 500; }
.brief-more[open] > summary::after { content: '접기 −'; }
.brief-more > :not(summary) { margin-left: 10px; margin-right: 10px; }
.brief-more[open] { padding-bottom: 8px; }
.brief-data-state > summary { display: flex; align-items: center; min-height: 44px; }

/* UI-04: 인물 카드는 내용 높이만 쓰고 위에서부터 읽힌다(가장 긴 카드에 맞춰 늘어나며 가운데 정렬되던 빈 공간 제거). */
.people-strip { align-items: flex-start; }
.person-card-country > span + span::before { content: ' · '; color: var(--text-dim); }
.person-card-activity-country.is-historical { color: var(--text-dim); }
.person-card .person-activity-status { margin-top: 6px; }

/* UI-06·07: 장애는 정상 0건과 다른 색·문구로 보인다. 상태 줄은 한 줄 크기로 줄인다. */
.air-raid-bar.is-degraded { color: #fcd34d; background: rgba(251, 191, 36, 0.08); border-bottom-color: rgba(251, 191, 36, 0.35); }
#serverStatus.status { margin: 0; padding: 6px 16px 2px; max-width: 640px; margin-inline: auto; text-align: left; font-size: 12px; line-height: 1.45; }
#serverStatus.status.is-degraded { color: #fbbf24; }

/* UI-11: 비어 있는 일정 상자는 제목 + 한 줄만 차지한다. */
.person-schedule-box.is-empty { margin-top: 8px; padding: 9px 14px; }
.person-schedule-box.is-empty h3 { margin: 0 0 2px; font-size: 13px; }

/* F6: "보도"와 "정황 기반 전망"이 같은 파란 칠로 보이지 않게 — 전망은 점선 외곽선(색 외 구분). */
.certainty-active { background: transparent; border: 1px dashed #9c8fd0; color: #ddd3ff; }

/* UI-03: 빠른 필터 동작 설명. */
.legend-quick-help { margin: -2px 2px 10px; color: #aab5c4; font-size: 13px; line-height: 1.45; }

/* UI-12: 터치 대상 44px. 목록 안의 작은 버튼은 모양은 두고 보이지 않는 터치 영역만 넓힌다. */
.card-read, .card-ext, .card-locate, .field-brief-event-btn { position: relative; }
.card-read::after, .card-ext::after, .card-locate::after { content: ''; position: absolute; inset: -10px -3px; }
.field-brief-event-btn::after { content: ''; position: absolute; inset: -13px -4px; }
.alert-quick-more { min-height: 44px; padding: 0 2px; }
.advanced-filter-toggle { min-height: 44px; padding: 0; }

/* UI-01·12: 긴급 상황은 제목과 필터를 한 줄에 두어 44px 버튼을 쓰면서도 높이를 늘리지 않는다. */
.alert-quick { display: grid; grid-template-columns: auto minmax(0, 1fr); column-gap: 8px; row-gap: 6px; align-items: center; }
.alert-quick-head { display: contents; }
.alert-quick-title { grid-column: 1; grid-row: 1; min-height: 44px; padding: 3px 12px; }
.alert-quick-filters { grid-column: 2; grid-row: 1; justify-content: flex-start; }
.alert-quick-filters button { min-height: 44px; }
.alert-quick-status { grid-column: 1 / -1; grid-row: 2; text-align: left; }
.alert-quick-list { grid-column: 1 / -1; grid-row: 3; }

@media (max-width: 700px) {
  /* index.html은 viewport-fit=cover라 standalone PWA에서 노치·상태바 아래로 헤더가 들어갈 수 있다. */
  .topbar {
    padding-top: max(8px, env(safe-area-inset-top));
    padding-bottom: 8px;
    padding-left: max(16px, env(safe-area-inset-left));
    padding-right: max(16px, env(safe-area-inset-right));
  }
  /* 헤더가 safe-area만큼 커지면 sticky 지도도 그만큼 내려야 zoom 버튼이 헤더에 가리지 않는다(inset 0이면 기존 53px). */
  .globe-wrap { top: calc(max(8px, env(safe-area-inset-top)) + 45px); scroll-margin-top: calc(max(8px, env(safe-area-inset-top)) + 45px); }
  .topbar .icon-btn, #refreshBtn { min-height: 44px; }
  #settingsBtn { width: 44px; }
  .map-zoom-controls button { width: 44px; height: 44px; }
  .map-home-btn { min-height: 44px; }
  .map-toolbar { top: calc(var(--map-height, clamp(300px, 48vh, 440px)) - 56px); }
  .map-toolbar .ghost-btn { min-height: 44px; }
  .chip { min-height: 44px; }
  .map-resize-handle { height: 44px; }
  .map-collapse-btn { min-height: 44px; }
  .briefing-toggle, .briefing-pir-btn { min-height: 44px; }
  #newsSearch { min-height: 44px; }
}
/* 선택 상태를 색만으로 구분하지 않는다. */
.legend-quick-filter.is-active::before, .alert-quick-filters button.is-active::before { content: '✓ '; }
/* F5: 긴 타임라인 접기. hidden이 flex/grid 규칙에 지지 않게 강제한다. */
.timeline > li[hidden] { display: none !important; }
.timeline-more { width: 100%; min-height: 44px; margin-top: 8px; border: 1px solid var(--border); border-radius: 8px; background: #141a22; color: #cdd6e3; font: inherit; font-size: 13px; cursor: pointer; }
.is-topic-view #airRaidBar, .is-topic-view #alertQuick { display: none !important; }

/* v2.9.2b: 서로 다른 지역의 전투·공격이 한 칸으로 뭉치면(count>1, 지역 2곳 이상) 대표 지역을
   핀 위에 상시 노출한다. 높은 줌에서는 clusterBy()가 자연히 갈라지므로 사라진다. */
.combat-region-label {
  position: absolute; bottom: calc(100% + 4px); left: 50%; transform: translateX(-50%);
  max-width: 150px; padding: 2px 6px; border: 1px solid #ef4444; border-radius: 999px;
  background: rgba(28, 12, 14, .94); color: #ffd7d2; font: 700 10px/1.15 inherit;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; pointer-events: none; z-index: 3;
}

/* ── v2.9.9 주변국 관련 동향(한반도 탭) — 한반도 안 사건 목록과 모양·위치를 분리한다 ── */
.region-neighbor-context {
  display: flex; flex-direction: column; gap: 6px; margin-top: 4px; padding-top: 8px;
  border-top: 1px dashed rgba(148, 163, 184, .45);
}
.region-neighbor-title { margin: 0; font-size: 13px; color: #cbd5e1; }
.region-neighbor-note { margin: 0; font-size: 11px; line-height: 1.45; color: var(--text-dim); }
.region-neighbor-group { display: grid; gap: 4px; }
.region-neighbor-country { font-size: 12px; font-weight: 750; color: #93c5fd; }
.region-neighbor-row {
  display: grid; gap: 2px; width: 100%; padding: 6px 10px; border: 1px solid var(--border); border-left: 3px dotted #64748b;
  border-radius: 8px; background: #10151d; color: inherit; font: inherit; text-align: left; cursor: pointer;
}
.region-neighbor-row-title { font-size: 13px; line-height: 1.4; overflow-wrap: anywhere; }
.region-neighbor-row-meta { font-size: 11px; color: #9aa6b6; }
.region-research-evidence { display: grid; gap: 6px; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--border); }
.region-research-row { display: grid; gap: 4px; padding: 8px; border: 1px solid var(--border); border-radius: 6px; overflow-wrap: anywhere; }
.region-research-country { font-size: 12px; font-weight: 700; color: #b6bac8; }
.region-research-link { font-size: 11px; color: #93c5fd; width: fit-content; }

/* ── v2.9.9 ADM1(도·성·현) 경계 라벨·팝업 ── */
.admin-label span {
  display: none; position: absolute; transform: translate(-50%, -50%); white-space: nowrap;
  font-size: 10.5px; font-weight: 650; color: rgba(226, 232, 240, .85);
  text-shadow: 0 0 3px #08182c, 0 0 3px #08182c;
}
.admin-labels-all .admin-label span { display: block; }
.admin-label.has-events span { display: block; color: #ffe29a; font-size: 11.5px; font-weight: 800; }
.admin-popup strong { font-size: 13px; }
.admin-popup-sub { font-size: 11px; color: #64748b; }
.admin-popup-body, .admin-popup-top { font-size: 12px; margin-top: 2px; }

/* ── v2.9.9 인물 카드 확신도·최신성 줄(상태 배지와 독립) ── */
.person-card-corroboration.is-stale { color:#fbbf24; }
.person-source-certainty { margin:2px 0 6px; font-size:12px; color:#b9c7d8; }

/* ── v2.9.17 현재 탭 최신 사건 상태 카드 ── 긴급상황 판정이 아니다. 사건 신선도와 수집 상태를 따로 보인다. */
.tab-status[hidden] { display: none !important; }
.tab-status { margin: 0 12px 10px; padding: 9px 12px; border: 1px solid #2c3a4a; border-radius: 10px;
  background: #121a24; display: grid; grid-template-columns: minmax(0, 1fr); gap: 4px; overflow-wrap: anywhere; }
.tab-status-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.tab-status-heading { font-size: 12px; font-weight: 700; color: #b9cde3; }
.tab-status-fresh { font-size: 10.5px; font-weight: 800; padding: 2px 7px; border-radius: 999px; white-space: nowrap; border: 1px solid transparent; }
.tab-status-fresh.fresh-fresh { background: #14532d; color: #dcfce7; border-color: #22c55e; }
.tab-status-fresh.fresh-aging { background: transparent; color: #fcd34d; border-color: #b7791f; }
.tab-status-fresh.fresh-stale { background: transparent; color: #cbd5e1; border: 1px dashed #94a3b8; }
.tab-status-fresh.fresh-no_recent_event { background: transparent; color: #9aa7b6; border: 1px dotted #64748b; }
.tab-status-main { display: grid; gap: 2px; min-height: 36px; padding: 0; border: none; background: none;
  color: var(--text); font: inherit; text-align: left; text-decoration: none; }
a.tab-status-main, button.tab-status-main { cursor: pointer; }
.tab-status-title { font-size: 13.5px; line-height: 1.45; }
.tab-status-detail { font-size: 11.5px; color: #a7b6c8; }
.tab-status-event, .tab-status-collector { margin: 0; font-size: 11px; line-height: 1.5; color: #a7b6c8; }
/* v2.9.18: 대표 사건보다 새 관련 보도(후속보도·분석 포함) — 한 줄, 넘치면 말줄임. */
.tab-status-related-report { min-width: 0; margin: 0; font-size: 11px; line-height: 1.5; color: #8fa1b5; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tab-status-related-label { color: #b9cde3; font-weight: 700; }
.tab-status-collector::before { content: '⟳ '; }
.tab-status-collector.collector-ok { color: #86efac; }
.tab-status-collector.collector-partial { color: #fcd34d; }
.tab-status-collector.collector-delayed, .tab-status-collector.collector-unknown { color: #fca5a5; }
.tab-status-collector.collector-offline, .tab-status-collector.collector-loading { color: #cbd5e1; }
.tab-status-related { justify-self: start; min-height: 32px; padding: 3px 9px; border: 1px solid var(--border);
  border-radius: 6px; background: #1b2330; color: var(--text-dim); font: inherit; font-size: 11px; cursor: pointer; }

/* 한반도(❗)와 접경지역(🧭) 탭은 서로 다른 glyph를 쓴다. 느낌표는 단색 원형 배지로 한 번 더 구분한다. */
.seg-icon { display: inline-block; }
.seg-icon-alert { display: inline-flex; align-items: center; justify-content: center; width: 1.25em; height: 1.25em;
  border-radius: 50%; background: #7f1d1d; font-size: 0.8em; line-height: 1; }

/* ── v2.9.17 건강 관련 보도 탭 ── 공개 보도·주장 모니터링. 병원·응급 느낌의 표현을 쓰지 않는다. */
.health-view[hidden] { display: none !important; }
.health-view { padding: 10px 12px 18px; display: grid; gap: 12px; overflow-wrap: anywhere; }
.health-head h2 { margin: 0 0 4px; font-size: 16px; }
.health-head-note, .health-caveat, .health-coverage, .health-empty { margin: 4px 0; font-size: 11.5px; line-height: 1.55; color: #a9a3c2; }
.health-coverage { color: #fcd34d; }
.health-person { padding: 12px; border: 1px solid #3a3656; border-radius: 11px; background: #17162a; display: grid; gap: 8px; }
.health-person h3 { margin: 0; font-size: 14px; }
.health-summary { display: grid; gap: 6px; }
.health-state { display: grid; gap: 2px; padding: 9px 10px; border: 1px solid #4b4577; border-radius: 9px; background: #1f1d38; }
.health-state-value { font-size: 14px; }
.health-state small { color: #b8b3cf; font-size: 11px; line-height: 1.5; }
.health-summary-row { display: flex; justify-content: space-between; gap: 10px; font-size: 12px; padding: 2px 0; border-bottom: 1px solid #2a2842; }
.health-summary-label { color: #a9a3c2; font-size: 11.5px; }
.health-summary-value { text-align: right; }
.health-filters { display: flex; gap: 6px; overflow-x: auto; scrollbar-width: none; padding-bottom: 2px; }
.health-filters::-webkit-scrollbar { display: none; }
.health-filters button { flex: 0 0 auto; min-height: 40px; padding: 5px 12px; border: 1px solid #3d3a55; border-radius: 999px;
  background: #1d1b31; color: #d9d6ee; font: inherit; font-size: 12px; white-space: nowrap; cursor: pointer; }
.health-filters button.is-active { background: #34305a; border-color: #8b7fd1; color: #fff; }
.health-timeline { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.health-timeline-row { padding: 9px 10px; border: 1px solid #3d3a55; border-radius: 9px; background: #1d1b31; }
.health-timeline-row.certainty-circumstantial { border-style: dotted; }
.health-timeline-meta { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; font-size: 11px; color: #b8b3cf; }
.health-type { padding: 1px 7px; border-radius: 999px; background: #34305a; color: #e4dcff; font-weight: 700; }
.health-certainty { padding: 1px 7px; border-radius: 999px; border: 1px solid #7c7aa0; }
.health-timeline-row.certainty-confirmed .health-certainty { background: #22543d; border-color: #34d399; color: #d1fae5; }
.health-timeline-title { margin: 6px 0 3px; font-size: 13px; line-height: 1.5; }
.health-timeline-facts, .health-timeline-notice { margin: 2px 0; font-size: 11px; line-height: 1.5; color: #a7b6c8; }
.health-timeline-notice { color: #b8b3cf; }
.health-source-link { display: inline-flex; align-items: center; min-height: 36px; color: #c4b5fd; font-size: 12px; }

/* ── v2.9.19 인물 트래킹 → 건강상태 분석(공개자료 기반 변화 분석, 의학적 진단 아님) ── */
.person-health-btn { min-height:44px; padding:10px 12px; border:1px solid #6b5b86; border-radius:8px; background:#1f1d38;
  color:#e4dcff; font:inherit; font-size:12.5px; font-weight:700; cursor:pointer; }
.person-health-modal { z-index:210; }
.person-health-modal .health-view { padding:12px 14px 22px; }
.health-head-subtitle { margin:2px 0 6px; font-size:13px; font-weight:700; color:#c4b5fd; }
.health-disclaimer { margin:0; padding:9px 10px; border:1px solid #6b5b86; border-radius:9px; background:#1d1b31;
  color:#ddd6fe; font-size:12px; line-height:1.6; }
.health-section { display:grid; gap:7px; padding:12px; border:1px solid #3a3656; border-radius:11px; background:#17162a; min-width:0; }
.health-section h3 { margin:0; font-size:14px; }
.health-media-strip { display:flex; gap:9px; margin:0; padding:0 0 4px; list-style:none; overflow-x:auto;
  overscroll-behavior-inline:contain; scrollbar-width:thin; min-width:0; }
.health-media-item { flex:0 0 150px; display:grid; gap:3px; align-content:start; padding:7px; border:1px solid #3d3a55;
  border-radius:9px; background:#1d1b31; font-size:11px; line-height:1.45; overflow-wrap:anywhere; }
.health-media-thumb { width:100%; height:96px; object-fit:cover; border-radius:6px; background:#0f0e1c; }
.health-media-type { justify-self:start; padding:1px 7px; border-radius:999px; background:#34305a; color:#e4dcff; font-weight:700; }
.health-media-date { color:#d6d0ea; font-weight:700; }
.health-media-event { color:#e8e6e3; }
.health-media-source, .health-media-compare { color:#a9a3c2; }
.health-media-link { min-height:32px; display:inline-flex; align-items:center; color:#c4b5fd; font-size:12px; }
.health-bars { display:grid; gap:4px; }
.health-bars-label { margin:4px 0 2px; font-size:11.5px; color:#b8b3cf; }
.health-bar-row { display:grid; grid-template-columns:62px minmax(0,1fr) 34px; gap:6px; align-items:center; font-size:11px; color:#d6d0ea; }
.health-bar { display:block; height:8px; min-width:2px; border-radius:4px; background:#8b7fd1; }
.health-bar-count { text-align:right; }
/* v2.9.20 건강상태 분석: 요약 줄·자동 측정 미제공 표시·과거 색인 배지 */
.health-summary-lines { margin:0; padding-left:18px; display:grid; gap:3px; font-size:12px; line-height:1.55; color:#e8e6e3; }
.health-not-measured { margin:0; padding:8px 10px; border:1px dashed #6b6688; border-radius:8px; color:#c9c3e0; font-size:12px; line-height:1.55; }
.health-origin { padding:1px 7px; border-radius:999px; border:1px dotted #8b86a8; color:#c9c3e0; }

/* v2.9.20 건강상태 분석 — 기록 개정 상태(점수 아님) */
.health-revision { padding: 1px 7px; border-radius: 999px; border: 1px dashed #6f6c8f; color: #cfcae6; }
.health-revision.revision-revised, .health-revision.revision-superseded { border-style: solid; border-color: #a58b4a; color: #f0dca8; }
.health-revision.revision-comparison-invalid { border-color: #7b5c5c; color: #f1c6c6; }

/* v2.9.20 전선·작전 상황판 */
.conflict-board-view[hidden] { display: none !important; }
.conflict-board-view { padding: 0 16px 24px; }
.conflict-board { display: grid; gap: 12px; max-width: 980px; margin: 0 auto; min-width: 0; }
.cb-head h2 { margin: 6px 0 2px; font-size: 18px; }
.cb-head-note, .cb-meta, .cb-caveat, .cb-safety { margin: 0; font-size: 12px; color: var(--text-dim); line-height: 1.5; overflow-wrap: anywhere; }
.cb-safety { color: #f1c6a8; }
.cb-regions { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
.cb-region-card { display: grid; gap: 3px; text-align: left; padding: 10px; min-height: 44px; border: 1px solid var(--border); border-radius: 11px;
  background: var(--card); color: var(--text); font: inherit; cursor: pointer; min-width: 0; }
.cb-region-card.is-active { border-color: #ef4444; box-shadow: inset 0 0 0 1px #ef4444; }
.cb-region-name { font-weight: 800; font-size: 14px; }
.cb-region-status, .cb-region-updated { font-size: 11px; color: var(--text-dim); overflow-wrap: anywhere; }
.cb-region-status.intensity-heavy_fighting, .cb-region-status.intensity-active_fighting { color: #fca5a5; }
.cb-region-status.intensity-strikes_reported { color: #fdba74; }
.cb-section { display: grid; gap: 8px; padding: 12px; border: 1px solid var(--border); border-radius: 11px; background: var(--card); min-width: 0; }
.cb-section-title { margin: 0; font-size: 15px; }
.cb-header-lines { display: grid; gap: 4px; margin: 0; }
.cb-header-line { display: grid; grid-template-columns: 92px minmax(0, 1fr); gap: 8px; font-size: 13px; }
.cb-header-line dt { color: var(--text-dim); }
.cb-header-line dd { margin: 0; overflow-wrap: anywhere; }
.cb-picker { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; font-size: 13px; }
.cb-snapshot-select { min-height: 40px; max-width: 100%; background: #111114; color: var(--text); border: 1px solid var(--border); border-radius: 8px; padding: 6px 8px; font: inherit; }
.cb-map { margin: 0; display: grid; gap: 6px; }
.cb-map svg { width: 100%; max-width: 620px; height: auto; background: #0f1218; border-radius: 9px; }
.cb-source-list li { font-size: 13px; overflow-wrap: anywhere; }
.cb-pt-ua { fill: #60a5fa; opacity: .75; }
.cb-pt-ru { fill: #f87171; opacity: .75; }
.cb-pt-contested { fill: #c084fc; stroke: #fff; stroke-width: .4; }
.cb-pt-unclear { fill: #9ca3af; opacity: .6; }
.cb-map-legend { display: flex; flex-wrap: wrap; gap: 10px; font-size: 12px; }
.cb-legend-ua { color: #93c5fd; } .cb-legend-ru { color: #fca5a5; } .cb-legend-con { color: #d8b4fe; }
.cb-map-button { justify-self: start; min-height: 40px; padding: 8px 12px; border: 1px solid var(--border); border-radius: 8px; background: #111114; color: var(--text); font: inherit; cursor: pointer; }
.cb-change-list, .cb-zone-list, .cb-unit-list, .cb-casualty-list, .cb-source-list, .cb-evidence-list { margin: 0; padding: 0; list-style: none; display: grid; gap: 6px; min-width: 0; }
.cb-change { font-size: 13px; padding: 6px 8px; border-left: 3px solid #555; background: #111114; border-radius: 6px; overflow-wrap: anywhere; }
.cb-change.change-up, .cb-change.change-new { border-left-color: #ef4444; }
.cb-change.change-down { border-left-color: #22c55e; }
.cb-change.change-control { border-left-color: #c084fc; }
.cb-zone, .cb-unit, .cb-casualty { display: grid; gap: 4px; padding: 9px 10px; border: 1px solid var(--border); border-radius: 9px; background: #111114; min-width: 0; }
.cb-zone.intensity-heavy_fighting { border-color: #b91c1c; }
.cb-zone.intensity-active_fighting { border-color: #dc2626; }
.cb-zone.intensity-strikes_reported { border-color: #c2410c; }
.cb-zone-head { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.cb-intensity, .cb-front-status, .cb-unit-fresh { padding: 1px 8px; border-radius: 999px; font-size: 11px; font-weight: 700; background: #26262c; }
.cb-front-status.front-contested_zone { background: #3b2a55; color: #e9d5ff; }
.cb-front-status.front-reported_front { background: #2b3445; color: #cfe0ff; }
.cb-unit.unit-old .cb-unit-fresh { background: #4a3a17; color: #fde68a; }
.cb-unit.unit-unconfirmed .cb-unit-fresh { background: #3f1d1d; color: #fecaca; }
.cb-unit-fresh { justify-self: start; }
.cb-casualty-group h4 { margin: 4px 0; font-size: 13px; }
.cb-casualty-main { font-weight: 700; font-size: 13px; }
.cb-evidence summary { cursor: pointer; font-size: 12px; color: #93c5fd; min-height: 32px; display: flex; align-items: center; }
.cb-evidence-list li { display: grid; gap: 2px; font-size: 12px; overflow-wrap: anywhere; }
.cb-evidence-title { color: var(--text); }
.cb-evidence-meta { color: var(--text-dim); font-size: 11px; }
.cb-link { color: #93c5fd; font-size: 12px; overflow-wrap: anywhere; }
.cb-empty { color: var(--text-dim); font-size: 12px; }
@media (max-width: 700px) {
  .conflict-board-view { padding: 0 12px 20px; }
  .cb-regions { grid-template-columns: minmax(0, 1fr); }
  .cb-header-line { grid-template-columns: 82px minmax(0, 1fr); font-size: 12px; }
}

/* v2.9.21 QUICK ACTION BAR — 한 줄 유지(줄바꿈 금지 > 가로 스크롤 > 2줄). [오늘 3줄] [인물 트래킹] [나머지] */
.topbar { gap: 8px; }
.topbar h1 { flex: 0 1 auto; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.quick-actions { flex: 0 1 auto; min-width: 0; flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; gap: 6px; }
.quick-actions::-webkit-scrollbar { display: none; }
.quick-actions > * { flex: 0 0 auto; white-space: nowrap; }
.person-quick-btn { width: auto; min-width: 40px; padding: 6px 9px; font-size: 12px; display: inline-flex; align-items: center; gap: 2px; }
/* v2.9.31 [인물 분석]은 모든 폭에서 글자를 줄이지 않는다(잘림 0). 좁은 화면은 제목·여백을 줄여 자리를 만든다. */
.person-quick-btn .qa-label { white-space: nowrap; }
@media (max-width: 700px) {
  .topbar h1 { font-size: 15px; }
  .quick-actions { gap: 4px; }
  .analysis-btn { padding: 6px 7px; }
  .person-quick-btn { padding: 6px 7px; min-height: 44px; }
  #settingsBtn { width: 40px; }
  #refreshBtn { padding: 6px 9px; font-size: 12px; }
}
@media (max-width: 400px) {
  .topbar { padding-left: 10px; padding-right: 8px; gap: 6px; }
  .topbar h1 { font-size: 14px; }
  .quick-actions { gap: 3px; }
  .analysis-btn { padding: 6px 6px; font-size: 12px; }
  .person-quick-btn { padding: 6px 6px; gap: 1px; }
  .person-quick-btn .qa-icon { font-size: 11px; }
  #settingsBtn { width: 36px; }
  #refreshBtn { padding: 6px 7px; }
}
/* v2.9.33 상단 — 동작 버튼은 오른쪽에 한 줄로 정돈([오늘 3줄][인물 분석][🚀 발사 정보][⚙][↻]).
   새로고침은 작은 회전 화살표 아이콘(누르는 영역 44px 유지 · aria-label "새로고침"). 좁은 화면에서는 제목을 화면에서만 숨겨
   (스크린리더에는 남김) 버튼 글자가 잘리지 않게 한다 — 360/390/412/1440 잘림·겹침 0. */
.quick-actions { margin-left: auto; }
#refreshBtn.refresh-icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 44px; min-width: 44px; height: 44px; min-height: 44px;
  padding: 0; border-radius: 50%; border: 1px solid var(--border); background: rgba(255, 255, 255, 0.06); color: #ff8a80; font-size: 0; line-height: 1; }
#refreshBtn.refresh-icon-btn .refresh-icon { width: 22px; height: 22px; display: block; transform-origin: 50% 50%; }
#refreshBtn.refresh-icon-btn:hover { background: rgba(255, 255, 255, 0.14); }
#refreshBtn.refresh-icon-btn:focus-visible { outline: 2px solid #9bd6ff; outline-offset: 2px; }
#refreshBtn.refresh-icon-btn.is-loading .refresh-icon { animation: refresh-spin 0.9s linear infinite; }
#refreshBtn.refresh-icon-btn:disabled { opacity: 0.75; cursor: progress; }
@keyframes refresh-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { #refreshBtn.refresh-icon-btn.is-loading .refresh-icon { animation: none; } }
.launch-quick-btn { width: auto; min-width: 40px; display: inline-flex; align-items: center; gap: 2px; }
@media (max-width: 480px) {
  .topbar h1 { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
  .topbar { justify-content: flex-end; }
  .quick-actions { overflow-x: visible; }
}
@media (max-width: 700px) { .launch-quick-btn { padding: 6px 7px; min-height: 44px; font-size: 12px; } }
@media (max-width: 400px) { .launch-quick-btn { padding: 6px 6px; gap: 1px; } .launch-quick-btn .qa-icon { font-size: 11px; } }
/* v2.9.34 상단 한 줄 compact — 왼쪽 [개발자의 보고] · 오른쪽 [오늘 3줄][인물 분석][발사 정보][⚙][↻].
   누르는 영역은 그대로 44px 높이(버튼 자체), 보이는 모양만 30px 알약(::before)으로 줄여 지도 공간을 넓힌다(헤더 높이 72px → 48px). */
.topbar { padding: 2px 10px; min-height: 48px; gap: 6px; justify-content: flex-start; }
.topbar .hdr-btn { position: relative; isolation: isolate; display: inline-flex; align-items: center; justify-content: center; gap: 3px;
  width: auto; height: 44px; min-height: 44px; min-width: 36px; margin: 0; padding: 0 9px; border: 0; border-radius: 0; background: none; box-shadow: none;
  color: #e8edf2; font: inherit; font-size: 12px; font-weight: 600; line-height: 1; letter-spacing: -0.01em; white-space: nowrap; cursor: pointer; }
.topbar .hdr-btn::before { content: ''; position: absolute; inset: 7px 1px; z-index: -1; border-radius: 15px; border: 1px solid rgba(255, 255, 255, 0.14);
  background: rgba(255, 255, 255, 0.07); transition: background 0.15s, border-color 0.15s; }
.topbar .hdr-btn:hover::before { background: rgba(255, 255, 255, 0.15); }
/* 키보드 초점은 버튼(누르는 영역 44px) 자체에 보이는 외곽선으로 — 기본 focus ring을 지우지 않는다. */
.topbar .hdr-btn:focus-visible { outline: 2px solid #9bd6ff; outline-offset: -2px; border-radius: 12px; }
.topbar .hdr-btn .qa-icon { font-size: 11px; }
.topbar .hdr-btn.hdr-icon { width: 44px; min-width: 44px; padding: 0; font-size: 15px; }
/* 아이콘 버튼: 누르는 영역 44×44 그대로, 보이는 원만 작게(30px). */
.topbar .hdr-btn.hdr-icon::before { inset: 7px; border-radius: 50%; }
.topbar #refreshBtn.refresh-icon-btn { width: 44px; min-width: 44px; height: 44px; min-height: 44px; padding: 0; border: 0; border-radius: 0; background: none; color: #ff8a80; }
.topbar #refreshBtn.refresh-icon-btn .refresh-icon { width: 18px; height: 18px; }
.topbar #refreshBtn.refresh-icon-btn:hover { background: none; }
.topbar .dev-report-btn { color: #d6f1ff; }
.topbar .dev-report-btn::before { border-color: rgba(125, 211, 252, 0.5); background: rgba(12, 44, 64, 0.85); }
.topbar .quick-actions { margin-left: auto; gap: 2px; }
@media (max-width: 480px) {
  .topbar { padding: 2px 4px; gap: 2px; }
  .topbar .hdr-btn { padding: 0 7px; font-size: 11.5px; }
  .topbar .person-quick-btn .qa-icon, .topbar .launch-quick-btn .qa-icon { display: none; }
  .topbar .quick-actions { gap: 0; }
}
@media (max-width: 389px) {
  /* 아이콘 두 개(⚙·↻)를 44×44로 지키는 대신 글자 버튼 여백·글자를 조금 줄인다(한 줄 유지). */
  .topbar .hdr-btn { padding: 0 5px; font-size: 11px; }
}
@media (max-width: 349px) {
  /* 아주 좁은 화면(350px 미만)만 아이콘 누르는 영역 38px · 글자 버튼 여백 3px(예전 34px보다 넓게). */
  .topbar { padding-left: 2px; padding-right: 2px; }
  .topbar .hdr-btn { padding: 0 3px; font-size: 10.5px; }
  .topbar .hdr-btn.hdr-icon, .topbar #refreshBtn.refresh-icon-btn { width: 38px; min-width: 38px; }
  .topbar .hdr-btn.hdr-icon::before { inset: 7px 4px; }
}
@media (max-width: 339px) { .topbar .hdr-btn.hdr-icon, .topbar #refreshBtn.refresh-icon-btn { width: 36px; min-width: 36px; } }
/* v2.9.34 주요 인물 빠른 선택 — [인물 분석] 첫 줄. 한 줄 가로 스크롤(이 줄 안에서만), 페이지 가로 넘침 0. */
.people-quick { margin: 8px 12px 4px; padding: 8px 10px 6px; border-radius: 12px; border: 1px solid rgba(125, 211, 252, 0.28); background: rgba(10, 22, 32, 0.92); }
.people-quick[hidden] { display: none; }
.people-quick-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.people-quick-head h2 { margin: 0; font-size: 14px; color: #e6f3fb; }
.people-quick-search { min-height: 44px; padding: 0 10px; border: 0; background: none; color: #9bd6ff; font: inherit; font-size: 12.5px; cursor: pointer; white-space: nowrap; }
.people-quick-row { display: flex; gap: 6px; overflow-x: auto; overscroll-behavior-x: contain; scrollbar-width: thin; padding: 2px 0 4px; }
.people-quick-chip { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 4px; min-height: 44px; padding: 0 11px; border-radius: 999px;
  border: 1px solid rgba(255, 255, 255, 0.16); background: rgba(255, 255, 255, 0.07); color: #f1f5f9; font: inherit; font-size: 13px; cursor: pointer; white-space: nowrap; }
.people-quick-chip:hover { background: rgba(255, 255, 255, 0.15); }
.people-quick-chip:focus-visible { outline: 2px solid #9bd6ff; outline-offset: 2px; }
.people-quick-flag { font-size: 15px; line-height: 1; }
/* v2.9.34 [개발자의 보고] 큰 창 — 어두운 분석실 분위기 배경(그림) 위에 읽기 쉬운 판. 배경 ≠ 본문 가림. */
body.dr-open { overflow: hidden; }
.dr-root { position: fixed; inset: 0; z-index: 196; display: flex; align-items: center; justify-content: center; }
.dr-root[hidden] { display: none; }
.dr-backdrop { position: absolute; inset: 0; background: rgba(2, 4, 8, 0.66); backdrop-filter: blur(7px) saturate(0.8); -webkit-backdrop-filter: blur(7px) saturate(0.8); }
.dr-panel { --dr-hero: clamp(132px, 22vh, 200px); position: relative; width: min(1120px, calc(100vw - 40px)); height: min(88vh, 980px); border-radius: 16px; overflow: hidden;
  border: 1px solid rgba(110, 160, 200, 0.3); box-shadow: 0 30px 80px rgba(0, 0, 0, 0.6); background: #03060a; }
@media (max-width: 700px) { .dr-panel { width: 100vw; height: 100dvh; border-radius: 0; border: 0; } }
.dr-mood { position: absolute; inset: 0 0 auto 0; height: var(--dr-hero); z-index: 0; overflow: hidden; pointer-events: none; }
.dr-mood svg { width: 100%; height: 100%; display: block; filter: blur(0.6px); }
/* 왼쪽(제목 자리)은 어둡게, 오른쪽은 장면이 보이게 · 아래쪽은 본문 배경색으로 녹인다 — 글자 대비 우선. */
.dr-mood::after { content: ''; position: absolute; inset: 0;
  background: linear-gradient(90deg, rgba(3, 6, 10, 0.9) 0%, rgba(3, 6, 10, 0.6) 30%, rgba(3, 6, 10, 0) 58%), linear-gradient(180deg, rgba(3, 6, 10, 0) 50%, #03060a 100%); }
.dr-content { position: relative; z-index: 1; height: 100%; display: flex; flex-direction: column; min-width: 0; }
.dr-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; min-height: calc(var(--dr-hero) - 12px); box-sizing: border-box; padding: 16px 16px 8px; }
.dr-titles { min-width: 0; }
.dr-title { margin: 0; font-size: 21px; letter-spacing: 0.02em; color: #eef7fc; text-shadow: 0 1px 8px rgba(0, 0, 0, 0.7); }
.dr-title:focus { outline: none; }
.dr-sub { margin: 4px 0 0; font-size: 12.5px; color: #c3d6e3; text-shadow: 0 1px 6px rgba(0, 0, 0, 0.85); }
.dr-close { flex: 0 0 auto; width: 44px; height: 44px; border-radius: 50%; border: 1.5px solid rgba(238, 247, 252, 0.7); background: rgba(8, 14, 22, 0.9);
  color: #fff; font-size: 20px; line-height: 1; cursor: pointer; }
.dr-close:hover { background: rgba(40, 62, 84, 0.95); }
.dr-close:focus-visible { outline: 2px solid #9bd6ff; outline-offset: 2px; }
.dr-tabs { display: flex; gap: 6px; padding: 4px 16px 10px; overflow-x: auto; scrollbar-width: none; flex: 0 0 auto; }
.dr-tabs::-webkit-scrollbar { display: none; }
.dr-tab { flex: 0 0 auto; min-height: 44px; padding: 0 14px; border-radius: 999px; border: 1px solid rgba(140, 180, 210, 0.38); background: rgba(8, 14, 22, 0.86);
  color: #d3e3ee; font: inherit; font-size: 13.5px; cursor: pointer; }
.dr-tab.is-active { background: #0f3b55; border-color: #5fb6e0; color: #fff; font-weight: 700; }
.dr-tab:focus-visible { outline: 2px solid #9bd6ff; outline-offset: 2px; }
.dr-body { flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 0 16px 28px; -webkit-overflow-scrolling: touch; }
.dr-body:focus { outline: none; }
.dr-section { display: grid; gap: 12px; min-width: 0; }
.dr-summary { margin: 0; padding: 10px 12px; border-radius: 10px; background: rgba(9, 16, 24, 0.93); border: 1px solid rgba(95, 182, 224, 0.38); color: #eef7fc;
  font-size: 14px; line-height: 1.55; overflow-wrap: anywhere; }
.dr-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 300px), 1fr)); gap: 10px; }
.dr-card { display: grid; gap: 6px; padding: 12px; border-radius: 12px; background: rgba(8, 13, 20, 0.93); border: 1px solid rgba(120, 160, 190, 0.24); color: #dde8f0; min-width: 0; }
.dr-card.rank-5, .dr-card.rank-4 { border-color: rgba(248, 113, 113, 0.6); }
.dr-card.rank-3 { border-color: rgba(251, 191, 36, 0.55); }
.dr-card-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
.dr-card-title { margin: 0; font-size: 16px; color: #fff; }
.dr-chip { font-size: 12px; padding: 3px 8px; border-radius: 999px; background: rgba(30, 50, 70, 0.95); border: 1px solid rgba(140, 180, 210, 0.38); color: #e2eef6; overflow-wrap: anywhere; }
.dr-conf, .dr-line, .dr-meta, .dr-note, .dr-foot, .dr-empty { margin: 0; font-size: 12.5px; line-height: 1.55; color: #bccdd9; overflow-wrap: anywhere; }
.dr-line.is-alert { color: #fecaca; }
.dr-people { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.dr-people-label { font-size: 12px; color: #9db5c6; }
.dr-actions { display: flex; flex-wrap: wrap; gap: 6px; }
.dr-btn { min-height: 44px; max-width: 100%; padding: 0 12px; border-radius: 999px; border: 1px solid rgba(140, 180, 210, 0.38); background: rgba(14, 24, 36, 0.95);
  color: #e6f1f8; font: inherit; font-size: 13px; text-align: left; cursor: pointer; overflow-wrap: anywhere; }
.dr-btn:hover { background: rgba(30, 52, 72, 0.98); }
.dr-btn:focus-visible { outline: 2px solid #9bd6ff; outline-offset: 2px; }
.dr-btn.dr-row-btn { border: 0; background: none; padding: 0; border-radius: 4px; color: #cfe8ff; text-decoration: underline; text-underline-offset: 3px; font-size: 13.5px; }
.dr-h3 { margin: 6px 0 0; font-size: 14px; color: #eef7fc; }
.dr-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
.dr-row { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; padding: 8px 10px; border-radius: 10px; background: rgba(8, 13, 20, 0.93);
  border: 1px solid rgba(120, 160, 190, 0.2); min-width: 0; }
.dr-row.is-problem { border-color: rgba(251, 191, 36, 0.55); }
.dr-row-title { color: #eef5fa; font-size: 13.5px; overflow-wrap: anywhere; min-width: 0; }
.dr-row-meta { font-size: 12px; color: #a6bac8; overflow-wrap: anywhere; min-width: 0; }
.dr-badge { font-size: 11.5px; padding: 2px 8px; border-radius: 999px; background: rgba(40, 60, 82, 0.98); color: #e2eef6; white-space: nowrap; }
.dr-row.type-raid .dr-badge, .dr-row.type-combat .dr-badge { background: rgba(127, 29, 29, 0.98); }
.dr-row.type-provocation .dr-badge { background: rgba(120, 80, 10, 0.98); }
.dr-rules { margin: 0; padding-left: 18px; color: #cbd9e3; font-size: 13px; line-height: 1.6; }
.dr-forecast { padding: 10px; border-radius: 12px; background: rgba(8, 13, 20, 0.95); border: 1px solid rgba(120, 160, 190, 0.24); min-width: 0; overflow-wrap: anywhere; }
.dr-sub-section { display: grid; gap: 6px; }
@media (prefers-reduced-motion: reduce) { .dr-mood svg { transform: none; } }
/* v2.9.34 사건 → 지도: 고른 사건의 공개 위치 강조(펄스 원 6초, 누름 통과) · 줄 아래 [📰 뉴스 보기](보이는 글은 작게, 누르는 영역 44px). */
.flat-highlight { pointer-events: none; }
.flat-highlight-ring { position: absolute; left: -22px; top: -22px; width: 44px; height: 44px; border-radius: 50%; border: 3px solid #fde047;
  box-shadow: 0 0 0 4px rgba(253, 224, 71, 0.25), 0 0 18px rgba(253, 224, 71, 0.7); animation: flat-hl-pulse 1.2s ease-out 5; }
.flat-highlight-dot { position: absolute; left: -5px; top: -5px; width: 10px; height: 10px; border-radius: 50%; background: #fde047; box-shadow: 0 0 6px #000; }
@keyframes flat-hl-pulse { 0% { transform: scale(0.6); opacity: 1; } 100% { transform: scale(1.6); opacity: 0.25; } }
@media (prefers-reduced-motion: reduce) { .flat-highlight-ring { animation: none; } }
.alert-quick-news { align-self: flex-start; display: inline-flex; align-items: center; min-height: 44px; margin: -8px 0 0 8px; padding: 0 8px; border: 0; background: none;
  color: #9bd6ff; font: inherit; font-size: 12px; text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }
.alert-quick-news:focus-visible { outline: 2px solid #9bd6ff; outline-offset: 1px; }
.event-news-actions { display: flex; flex-wrap: wrap; gap: 6px; }
.event-news-btn { display: inline-flex; align-items: center; min-height: 44px; padding: 0 14px; border-radius: 999px; border: 1px solid var(--border);
  background: rgba(255, 255, 255, 0.07); color: var(--text); font: inherit; font-size: 13px; text-decoration: none; cursor: pointer; }
.event-news-btn:hover { background: rgba(255, 255, 255, 0.15); }
/* v2.9.34 정보 이용 안내(첫 실행 · 설정에서 다시 보기) — 다른 창보다 위(250), 바텀 시트(260) 아래. */
.usage-notice-modal { z-index: 250; align-items: center; }
.usage-notice-panel { max-width: 560px; width: calc(100vw - 24px); max-height: min(86vh, 720px); border-radius: 14px; }
.usage-notice-title { margin: 0; font-size: 18px; color: var(--text); }
.usage-notice-list { margin: 4px 0 10px; padding-left: 20px; display: grid; gap: 8px; font-size: 14.5px; line-height: 1.6; color: var(--text); }
.usage-notice-version { margin: 0; font-size: 12px; color: var(--text-dim); }
.usage-notice-ack { width: 100%; min-height: 48px; border-radius: 10px; border: 1px solid #5fb6e0; background: #0f3b55; color: #fff; font: inherit; font-size: 15px; font-weight: 700; cursor: pointer; }
.usage-notice-ack:focus-visible { outline: 2px solid #9bd6ff; outline-offset: 2px; }
/* v2.9.33 지도 발사 표식(🚀 미사일·로켓 발사 · 🛰 위성·우주발사) — 사건 표식 중 맨 위(launchPane 645).
   공개 발사지역 대표점이며 정확한 발사 좌표가 아니다(툴팁·지도 상세에 정밀도 문구). 축소 상태에선 아이콘+배지만. */
.launch-pin { position: relative; display: inline-flex; align-items: center; gap: 3px; min-width: 32px; height: 32px; padding: 0 6px 0 4px;
  border-radius: 16px; border: 2px solid #f97316; background: rgba(30, 14, 6, 0.95); color: #ffedd5; cursor: pointer; pointer-events: auto;
  transform: translate(-16px, -50%); box-shadow: 0 0 0 2px rgba(249, 115, 22, 0.22), 0 0 14px rgba(249, 115, 22, 0.55); white-space: nowrap; }
.launch-pin.launch-space { border-color: #38bdf8; background: rgba(6, 20, 32, 0.95); color: #e0f2fe; box-shadow: 0 0 0 2px rgba(56, 189, 248, 0.2), 0 0 14px rgba(56, 189, 248, 0.5); }
.launch-pin.is-planned { border-style: dashed; }
.launch-pin.is-compact { padding: 0; width: 32px; justify-content: center; }
.launch-pin-icon { font-size: 17px; line-height: 1; }
.launch-pin-label { font: 700 11px/1.1 inherit; }
.launch-pin .cluster-count { position: absolute; top: -7px; right: -9px; min-width: 15px; padding: 0 3px; border-radius: 999px; background: #111114;
  border: 1px solid rgba(255, 255, 255, 0.35); color: #fff; font-size: 9px; line-height: 15px; text-align: center; }
.launch-pin .combat-mixed-dot { position: absolute; left: -3px; top: -3px; }
.lg-launch { background: none; }
/* v2.9.33 기사 상세의 발사 줄(발사 관련 기사만) · 지도 발사 상세의 동작 버튼 — 버튼 44px · 360px에서 줄바꿈(가로 넘침 0). */
.modal-launch { margin: 10px 0 4px; }
.article-launch { display: grid; gap: 6px; padding: 10px 12px; border: 1px solid rgba(249, 115, 22, 0.55); border-radius: 10px; background: rgba(249, 115, 22, 0.07); }
.article-launch.status-none, .article-launch.status-candidates { border-color: rgba(148, 163, 184, 0.5); background: rgba(148, 163, 184, 0.06); }
.article-launch-head { margin: 0; font-size: 13.5px; line-height: 1.45; overflow-wrap: anywhere; }
.article-launch-sub, .article-launch-basis, .article-launch-note { margin: 0; font-size: 12px; line-height: 1.45; color: var(--text-dim); overflow-wrap: anywhere; }
.article-launch-candidates, .launch-others, .launch-marker-detail { display: grid; gap: 6px; }
.launch-actions { display: flex; flex-wrap: wrap; gap: 6px; }
.launch-act-btn { min-height: 44px; max-width: 100%; padding: 8px 12px; border-radius: 999px; border: 1px solid var(--border); background: rgba(255, 255, 255, 0.06);
  color: var(--text); font: inherit; font-size: 13px; text-align: left; cursor: pointer; overflow-wrap: anywhere; }
.launch-act-btn:hover:not(:disabled) { background: rgba(255, 255, 255, 0.14); }
.launch-act-btn:focus-visible { outline: 2px solid #9bd6ff; outline-offset: 2px; }
.launch-act-btn:disabled { opacity: 0.5; cursor: not-allowed; }
.launch-lifecycle, .launch-others-head { margin: 0; font-size: 12px; color: var(--text-dim); }
/* 국지도발 사건 칩(기존 subtype 재사용): 실제 미사일 발사 🚀 · 실제 포격·방사포 💥 */
.combat-event-chip { position: absolute; top: -9px; left: -9px; width: 20px; height: 20px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
  font-size: 12px; line-height: 1; background: #111114; border: 1px solid rgba(255, 255, 255, 0.45); pointer-events: none; }
/* v2.9.31 지도 → 영역 선택 → (뉴스 기사: 종합 브리핑·긴급 상황 / 그 밖: 고른 영역 본문) */
body:not(.is-news-view) #briefing, body:not(.is-news-view) #alertQuick { display: none !important; }

/* v2.9.21 해외 전선 작전 — 지도(출처 통제/점령 면 + 경계 + 권역 상태 + 사건) */
:root { --cm-ua:#3b82f6; --cm-ua-soft:#93c5fd; --cm-ru:#ea580c; --cm-sea:#0c1622; --cm-land:#1f2630; --cm-land-line:#3a4554; --cm-front:#b91c1c; }
.cm-root { position: relative; }
.cm-frame { position: relative; width: 100%; max-width: 100%; border-radius: 10px; overflow: hidden; border: 1px solid var(--border); background: var(--cm-sea); touch-action: none; }
.cm-svg { display: block; width: 100%; height: 100%; cursor: grab; user-select: none; }
.cm-sea { fill: var(--cm-sea); }
.cm-land { fill: var(--cm-land); stroke: var(--cm-land-line); stroke-width: 0.6; vector-effect: non-scaling-stroke; }
.cm-area { stroke: none; }
.cm-area-ua, .cm-fill-ua { fill: var(--cm-ua); fill-opacity: .42; }
.cm-fill-ua-light { fill: var(--cm-ua-soft); fill-opacity: .35; }
.cm-area-ua-recaptured { fill: url(#cmRecaptured); }
.cm-fill-ru { fill: var(--cm-ru); fill-opacity: .55; }
.cm-area-ru { fill: url(#cmOccupied); }
.cm-area-ua-claimed { fill: url(#cmClaimed); }
.cm-hatch-line { stroke: #dbeafe; stroke-width: 2.2; stroke-opacity: .85; }
.cm-dot { fill: #fff7ed; fill-opacity: .9; }
.cm-front-line { fill: none; stroke: var(--cm-front); stroke-width: 2; stroke-dasharray: 5 3; vector-effect: non-scaling-stroke; }
.cm-contested-mark { fill: #c084fc; stroke: #fff; stroke-width: .6; vector-effect: non-scaling-stroke; }
.cm-zone { fill-opacity: .28; stroke-width: 2; vector-effect: non-scaling-stroke; }
.cm-zone.intensity-heavy_fighting { stroke: #fca5a5; fill-opacity: .4; }
.cm-zone.intensity-active_fighting { stroke: #fdba74; }
.cm-event { cursor: pointer; outline: none; }
.cm-event-bg { fill: #111827; stroke: #e5e7eb; stroke-width: 1.2; vector-effect: non-scaling-stroke; }
.cm-event.domain-combat .cm-event-bg, .cm-event.domain-air_missile .cm-event-bg { stroke: #f87171; }
.cm-event.domain-diplomacy .cm-event-bg, .cm-event.domain-negotiation .cm-event-bg, .cm-event.domain-cooperation .cm-event-bg { stroke: #60a5fa; }
.cm-event.is-selected .cm-event-bg, .cm-event:focus .cm-event-bg { stroke: #fde047; stroke-width: 2.5; }
.cm-event-count { fill: #fde047; font-weight: 800; }
.cm-unit-badge { fill: #e5e7eb; paint-order: stroke; stroke: #111; stroke-width: 2px; }
.cm-controls { position: absolute; right: 6px; top: 6px; display: grid; gap: 4px; z-index: 3; }
.cm-control { width: 40px; height: 40px; border-radius: 8px; border: 1px solid var(--border); background: rgba(17, 17, 20, .88); color: var(--text); font-size: 18px; cursor: pointer; }
.cm-edges { position: absolute; inset: 0; pointer-events: none; z-index: 2; }
.cm-edge-lines { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; }
.cm-leader { stroke: #fde047; stroke-width: 2; stroke-linecap: round; }
.cm-edge { position: absolute; pointer-events: auto; display: grid; gap: 1px; max-width: min(42%, 170px); min-height: 44px; padding: 4px 7px; border-radius: 8px;
  border: 1px solid #fde047; background: rgba(17, 17, 20, .92); color: var(--text); font: inherit; font-size: 11px; text-align: left; cursor: pointer; }
.cm-edge-west { left: 14px; transform: translateY(-50%); }
.cm-edge-east { right: 14px; transform: translateY(-50%); }
.cm-edge-north { top: 14px; transform: translateX(-50%); }
.cm-edge-south { bottom: 14px; transform: translateX(-50%); }
.cm-edge-more { right: 6px; bottom: 6px; border-style: dashed; min-width: 44px; }
.cm-edge-cat { font-weight: 800; color: #fde047; }
.cm-edge-title { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; overflow-wrap: anywhere; }
.cm-edge-time { color: var(--text-dim); font-size: 10px; }
.cm-legend { display: grid; gap: 5px; font-size: 12px; }
.cm-legend-row { display: flex; align-items: center; gap: 7px; min-width: 0; overflow-wrap: anywhere; }
.cm-swatch { width: 26px; height: 16px; flex: 0 0 auto; border: 1px solid var(--border); border-radius: 3px; }
.cm-legend-line { width: 26px; flex: 0 0 auto; border-top: 2px dashed var(--cm-front); }
.cm-legend-diamond { color: #c084fc; width: 26px; text-align: center; }
.cm-legend-circle { width: 14px; height: 14px; flex: 0 0 auto; border-radius: 50%; background: rgba(220, 38, 38, .4); border: 2px solid #fca5a5; margin: 0 6px; }
.cm-legend-note { margin: 0; color: var(--text-dim); }
.cb-layers { display: flex; gap: 5px; overflow-x: auto; scrollbar-width: none; padding-bottom: 2px; }
.cb-layers::-webkit-scrollbar { display: none; }
.cb-layer { flex: 0 0 auto; min-height: 36px; padding: 5px 10px; border-radius: 999px; border: 1px solid var(--border); background: #111114; color: var(--text-dim); font: inherit; font-size: 12px; cursor: pointer; }
.cb-layer.is-on { color: var(--text); border-color: #60a5fa; background: #172033; }
.cb-region-summary { font-size: 11px; color: var(--text-dim); overflow-wrap: anywhere; }
.cb-authority { margin: 0; font-size: 12px; padding: 6px 8px; border-radius: 7px; background: #1f2937; }
.cb-authority.authority-server { background: #13261c; color: #bbf7d0; }
.cb-authority.authority-reconstructed { background: #2a2414; color: #fde68a; }
.cb-event-detail { display: grid; gap: 8px; }
.cb-event-card { display: grid; gap: 4px; padding: 9px 10px; border: 1px solid #fde047; border-radius: 9px; background: #111114; min-width: 0; }
.cb-event-domain { font-size: 12px; font-weight: 700; color: #fde047; }
.cb-event-summary { margin: 0; font-size: 12px; color: var(--text-dim); overflow-wrap: anywhere; }
.cb-event-close { justify-self: start; min-height: 40px; padding: 6px 12px; border-radius: 8px; border: 1px solid var(--border); background: #111114; color: var(--text); font: inherit; cursor: pointer; }
.cb-evidence-why { color: var(--text-dim); font-size: 11px; }
.cb-timeline { margin: 0; padding: 0; list-style: none; display: grid; gap: 6px; }
.cb-timeline-row { display: grid; grid-template-columns: auto auto minmax(0, 1fr); gap: 4px 8px; align-items: baseline; padding: 7px 8px; border-left: 3px solid #60a5fa; background: #111114; border-radius: 6px; font-size: 12px; }
.cb-timeline-row.is-military { border-left-color: #f87171; }
.cb-timeline-row > .tr-toggle, .cb-timeline-row > .cb-evidence { grid-column: 1 / -1; }
.cb-timeline-title { overflow-wrap: anywhere; }
.cb-timeline-domain { font-weight: 700; white-space: nowrap; }
.cb-equipment, .cb-casualties { display: grid; gap: 8px; }
.cb-equipment h4, .cb-casualties h4 { margin: 4px 0 0; font-size: 13px; }
.cb-loss-source { display: grid; gap: 5px; padding: 9px 10px; border: 1px solid var(--border); border-radius: 9px; background: #111114; min-width: 0; }
.cb-loss-source h5, .cb-casualty-group h5 { margin: 0; font-size: 12px; }
.cb-loss-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 4px; }
.cb-loss-cell { padding: 5px; border-radius: 6px; background: #1f1f24; font-size: 12px; text-align: center; overflow-wrap: anywhere; }
.cb-loss-types { margin: 0; padding-left: 16px; font-size: 12px; columns: 2; }
.tr-toggle { display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.tr-button { min-height: 32px; padding: 3px 9px; border-radius: 7px; border: 1px solid #60a5fa; background: transparent; color: #93c5fd; font: inherit; font-size: 11px; cursor: pointer; }
.tr-status { font-size: 11px; color: var(--text-dim); }
@media (max-width: 700px) {
  .cb-loss-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .cb-loss-types { columns: 1; }
  .cm-edge { max-width: 40%; font-size: 10.5px; padding: 3px 6px; }
  .cm-edge-title { -webkit-line-clamp: 1; }
  .tr-button { min-height: 40px; }
}

/* v2.9.22 PRIMARY MAP — 해외 전선 작전 레이어를 상단 메인 지도(Leaflet)에 얹는다. 하단 지도 없음. */
.cm-contested-icon { color: #c084fc; font-size: 12px; line-height: 12px; text-align: center; text-shadow: 0 0 2px #000, 0 0 2px #000; }
.cm-event-icon { position: relative; display: flex !important; align-items: center; justify-content: center; border-radius: 50%;
  background: #111827; border: 1.5px solid #e5e7eb; font-size: 13px; box-shadow: 0 1px 3px rgba(0, 0, 0, .5); cursor: pointer; }
.cm-event-icon.domain-combat, .cm-event-icon.domain-air_missile { border-color: #f87171; }
.cm-event-icon.domain-diplomacy, .cm-event-icon.domain-negotiation, .cm-event-icon.domain-cooperation,
.cm-event-icon.domain-sanction, .cm-event-icon.domain-aid_support, .cm-event-icon.domain-deescalation { border-color: #60a5fa; }
.cm-event-icon.is-selected { border-color: #fde047; border-width: 2.5px; }
.cm-event-icon b { position: absolute; top: -7px; right: -7px; font-size: 10px; color: #fde047; text-shadow: 0 0 2px #000; }
.cm-unit-icon { color: #e5e7eb; font-size: 11px; font-weight: 700; text-shadow: 0 0 2px #000, 0 0 3px #000; white-space: nowrap; }
.cm-edges-primary { position: absolute; z-index: 45; pointer-events: none; }
.globe-wrap.has-conflict-overlay .leaflet-interactive.cm-area { cursor: help; }
@media (max-width: 700px) { .cb-regions { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 701px) { .cb-regions { grid-template-columns: repeat(5, minmax(0, 1fr)); } }
.cm-edge[hidden] { display: none !important; }
.cm-edges-primary .cm-edge-more { right: auto; bottom: auto; top: 6px; left: 50%; transform: translateX(-50%); min-height: 40px; }
/* 원문에 특정 위치가 없는 사건 — 실제 위치 핀이 아니라 지역 대표 위치 배지(점선 테두리) */
.cm-region-badge { overflow: visible; }
.cm-region-badge-inner { position: absolute; left: 0; top: 0; transform: translate(-50%, -50%); display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; padding: 3px 8px; min-height: 30px; border-radius: 999px; border: 1.5px dashed #cbd5e1; background: rgba(15, 23, 42, .78); color: #e2e8f0; font-size: 11px; cursor: pointer; }
.cm-region-badge-icons { font-size: 12px; }
.cm-region-badge-text { font-weight: 700; }

/* v2.9.23 인물 기본 프로필(신장·체중 — 출처·시점 표시) */
.person-profile-box { margin-top:12px; padding:12px 14px; border:1px solid #38485b; border-radius:11px; background:#141e29; overflow-wrap:anywhere; }
.person-profile-box h3 { margin:0 0 8px; font-size:14px; }
.person-profile-row { display:grid; grid-template-columns:44px minmax(0,1fr); gap:8px; padding:6px 0; border-top:1px solid #243243; }
.person-profile-row:first-of-type { border-top:0; }
.person-profile-label { color:#a7b6c8; font-size:12px; padding-top:2px; }
.person-profile-values { display:grid; gap:6px; min-width:0; }
.person-profile-conflict { color:#f0c36d; font-size:11px; }
.person-profile-value { font-size:14px; font-weight:600; }
.person-profile-note { color:#a7b6c8; font-size:11px; line-height:1.5; }
.person-profile-sources { display:flex; flex-wrap:wrap; gap:4px 10px; }
.person-profile-source { color:#8cc4ff; font-size:11px; text-decoration:none; }
.person-profile-source:hover { text-decoration:underline; }
.person-profile-caveat { margin:8px 0 0; color:#8d9bad; font-size:11px; line-height:1.55; }

/* v2.9.23 통제·점령 면 최신성(날짜 우선) · 면 자료 이후 통제 변경 보고(점만) */
.cm-freshness-chip { position:absolute; z-index:44; max-width:calc(100% - 120px); padding:3px 8px; border-radius:6px; background:rgba(13,19,27,.86);
  border:1px solid #4a5a6e; color:#dbe4ee; font-size:11px; line-height:1.4; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; pointer-events:none; }
.cm-freshness-chip.freshness-stale_source { border-color:#c9973b; color:#ffd58a; }
.cm-freshness-chip .cm-freshness-short { display:none; }
.cm-freshness-chip.is-narrow { max-width:calc(100% - 168px); padding:3px 6px; font-size:10px; }
.cm-freshness-chip.is-narrow .cm-freshness-long { display:none; }
.cm-freshness-chip.is-narrow .cm-freshness-short { display:inline; }
.cm-freshness-chip.freshness-aging_source { border-color:#8f7b45; }
.cm-change-icon { color:#f4f4f4; font-size:12px; line-height:14px; text-align:center; text-shadow:0 0 2px #000, 0 0 3px #000; }
.cm-change-icon.to-ua { color:#ffe08a; }
.cm-change-icon.to-ru { color:#ff9f8a; }
.cb-freshness { margin-top:10px; padding:10px 12px; border:1px solid #38485b; border-radius:9px; background:#111a24; }
.cb-freshness.freshness-stale_source { border-color:#8a6a2c; }
.cb-freshness h4 { margin:0 0 6px; font-size:13px; }
.cb-freshness-lines, .cb-control-changes { margin:0; padding-left:18px; font-size:12px; line-height:1.6; overflow-wrap:anywhere; }

/* v2.9.23 공습경보 바깥 레일 — 카드는 지도 밖, 지도 안은 표시점·얇은 선·번호표만 */
.alert-rail { margin:8px 12px 4px; padding:10px 12px; border:1px solid #6b2a31; border-radius:10px; background:#170f13; color:#f2e6e8; overflow-wrap:anywhere; }
.alert-rail[hidden] { display:none !important; }
.alert-rail-head { display:flex; flex-wrap:wrap; align-items:baseline; justify-content:space-between; gap:4px 10px; }
.alert-rail-title { margin:0; font-size:14px; }
.alert-rail-updated { color:#c7aab0; font-size:11px; }
.alert-rail-caveat { margin:6px 0 8px; color:#c9b5ba; font-size:11px; line-height:1.5; }
.alert-rail-failed { margin:0 0 8px; color:#f0c36d; font-size:11px; }
.alert-rail-list { list-style:none; margin:0; padding:0; display:grid; gap:8px; }
.alert-card { padding:8px 10px; border:1px solid #4d2a31; border-left:3px solid #e63946; border-radius:8px; background:#1d1317; }
.alert-card.status-reported { border-left-style:dashed; border-left-color:#d98a3a; }
.alert-card.status-ended { border-left-color:#6b7684; opacity:.85; }
.alert-card.is-highlight { outline:1px solid #ff8a95; }
.alert-card-head { display:flex; align-items:center; gap:6px; font-size:13px; font-weight:600; }
.alert-card-no { display:inline-grid; place-items:center; width:18px; height:18px; border-radius:50%; background:#e63946; color:#fff; font-size:11px; }
.alert-card-badge { margin-left:auto; padding:1px 6px; border-radius:999px; background:#3a1f25; color:#ffb3bb; font-size:10px; font-weight:500; }
.alert-card-region { display:flex; gap:6px; width:100%; margin:6px 0 2px; padding:0; border:0; background:none; color:inherit; font:inherit; font-size:13px; text-align:left; cursor:pointer; }
.alert-card-label, .alert-card-meta dt { color:#b59aa1; font-size:11px; min-width:52px; }
.alert-card-value { font-weight:600; }
.alert-card-members { margin:0 0 4px; color:#c9b5ba; font-size:11px; }
.alert-card-meta { margin:0; display:grid; gap:1px; }
.alert-card-meta-row { display:flex; gap:6px; font-size:12px; }
.alert-card-meta dd { margin:0; }
.alert-card-news { margin-top:6px; padding-top:6px; border-top:1px solid #3a2228; display:grid; gap:4px; }
.alert-card-news h4 { margin:0; font-size:11px; color:#b59aa1; font-weight:500; }
.alert-card-empty { margin:0; color:#9c8a8f; font-size:11px; }
.alert-rail-news-row { display:grid; gap:1px; width:100%; padding:4px 6px; border:1px solid #33242a; border-radius:6px; background:#130d10; color:inherit; text-align:left; font:inherit; cursor:pointer; }
.alert-rail-news-title { font-size:12px; line-height:1.4; }
.alert-rail-news-meta { color:#a8949a; font-size:10px; }
.alert-rail-more { justify-self:start; margin-top:2px; padding:3px 8px; border:1px solid #4d2a31; border-radius:999px; background:none; color:#ffb3bb; font-size:11px; cursor:pointer; }
.alert-rail-ended { margin-top:8px; font-size:12px; color:#c9b5ba; }
.alert-rail-ended summary { cursor:pointer; }
.alert-rail-ended .alert-rail-list { margin-top:6px; }
/* 좁은 화면 공습경보 목록: 한 줄 머리 + 가로로 넘기는 카드 */
.alert-rail.is-compact { margin:6px 10px 2px; padding:7px 9px; }
/* v2.9.31 [긴급 상황] → [공습경보] 안 목록(지도 아래 레일 아님). */
.alert-rail.is-embedded { margin:6px 0 2px; max-width:100%; min-width:0; box-sizing:border-box; }
.alert-rail.is-embedded.is-compact { margin:6px 0 2px; }
.alert-rail.is-compact .alert-rail-title { font-size:13px; }
.alert-rail.is-compact .alert-rail-caveat { margin:3px 0 5px; }
.alert-rail.is-compact .alert-rail-caveat summary { cursor:pointer; font-size:10.5px; color:#c9b5ba; }
.alert-rail.is-compact .alert-rail-caveat p { margin:4px 0 0; }
.alert-rail.is-compact > .alert-rail-list { display:flex; gap:7px; overflow-x:auto; overscroll-behavior-x:contain; scroll-snap-type:x mandatory; padding-bottom:2px; }
.alert-rail.is-compact > .alert-rail-list > .alert-card { flex:0 0 min(80%, 290px); scroll-snap-align:start; padding:6px 8px; min-width:0; }
.alert-rail.is-compact .alert-card-region { margin:3px 0 1px; font-size:12.5px; }
.alert-card-line { margin:0; color:#d8c3c8; font-size:11px; line-height:1.45; }
.alert-rail.is-compact .alert-card-news { margin-top:4px; padding-top:4px; }
.alert-rail.is-compact .alert-card-news summary { cursor:pointer; color:#ffb3bb; font-size:11px; }
.alert-rail.is-compact .alert-card-news[open] { display:grid; gap:4px; }
.alert-rail.is-compact .alert-card-head .alert-card-region { margin:0; flex:1 1 auto; min-width:0; }
.alert-rail.is-compact .alert-card-head .alert-card-label { display:none; }
.alert-rail.is-compact .alert-card-head .alert-card-value { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.alert-card-badge { white-space:nowrap; flex:0 0 auto; }

/* v2.9.24 OSINT 패널 · 항행경보 · UCDP 지도층 */
.osint-panel { display:grid; gap:10px; }
.osint-block { padding:10px 12px; border:1px solid #2f3d4e; border-radius:9px; background:#111a24; overflow-wrap:anywhere; min-width:0; }
.osint-block h4 { margin:0 0 6px; font-size:13px; }
.osint-note { margin:0 0 6px; color:#a7b6c8; font-size:11px; line-height:1.55; }
.osint-meta { margin:4px 0; color:#b9c6d4; font-size:12px; line-height:1.55; }
.osint-empty { margin:4px 0; color:#8d9bad; font-size:12px; }
.osint-list, .osint-events { margin:4px 0; padding-left:18px; font-size:12px; line-height:1.6; }
.osint-event { margin:0 0 6px; }
.osint-event-head { font-weight:600; }
.osint-event-place, .osint-event-fatal { color:#cfd9e4; }
.osint-event-meta { color:#93a3b5; font-size:11px; }
.osint-event.lc-revised .osint-event-head::after { content:' · 개정됨'; color:#f0c36d; font-weight:400; }
.osint-layers { margin:0; display:grid; gap:4px; }
.osint-layer { display:grid; grid-template-columns:minmax(0, 150px) minmax(0, 1fr); gap:8px; font-size:12px; }
.osint-layer dt { color:#a7b6c8; }
.osint-layer dd { margin:0; }
@media (max-width:520px) { .osint-layer { grid-template-columns:minmax(0, 1fr); gap:0; } }
.osint-table { width:100%; border-collapse:collapse; font-size:12px; margin:4px 0; display:block; overflow-x:auto; }
.osint-table caption { text-align:left; color:#a7b6c8; font-size:11px; padding-bottom:4px; }
.osint-table th, .osint-table td { padding:3px 6px; border-bottom:1px solid #243243; text-align:left; white-space:nowrap; }
.osint-link { color:#8cc4ff; font-size:12px; text-decoration:none; }
.maritime-rail { list-style:none; margin:4px 0; padding:0; display:grid; gap:6px; }
.maritime-card { padding:7px 9px; border:1px solid #2c4a5e; border-left:3px solid #4aa3d8; border-radius:7px; background:#0f1c26; }
.maritime-card.type-security { border-left-color:#e06666; }
.maritime-card.type-military_exercise { border-left-color:#e0a43a; }
.maritime-head { font-size:12px; font-weight:600; }
.maritime-meta { color:#a7b6c8; font-size:11px; }
.maritime-text { margin:4px 0 0; font-size:11px; color:#c8d4df; white-space:pre-line; }
.cm-maritime-icon { font-size:13px; line-height:16px; text-align:center; text-shadow:0 0 3px #000; }
.cm-maritime-area { stroke:#4aa3d8; fill:#4aa3d8; }
.cm-maritime-area.type-security { stroke:#e06666; fill:#e06666; }
.cm-maritime-area.type-military_exercise { stroke:#e0a43a; fill:#e0a43a; }
.cm-ucdp-admin span { display:grid; place-items:center; width:22px; height:22px; border-radius:50%; border:1.5px dashed #b89cff; background:rgba(30,20,50,.75); color:#e8dcff; font-size:10px; }

/* v2.9.24 시작 화면(OSINT 인용문) — 입력을 막지 않고, 준비되면 바로 사라진다 */
.boot-splash { position:fixed; inset:0; z-index:10000; display:grid; place-content:center; gap:14px; padding:24px 20px; background:#0b0b0d; color:#f1ece6;
  text-align:center; pointer-events:none; transition:opacity .3s ease; }
.boot-splash.is-done { opacity:0; }
.boot-splash.is-resume { background:rgba(11,11,13,.92); }
.boot-quote { margin:0; max-width:min(560px, 100%); }
.boot-quote blockquote { margin:0; font-size:clamp(19px, 5.4vw, 30px); line-height:1.45; font-weight:600; letter-spacing:-0.01em; word-break:keep-all; overflow-wrap:anywhere; }
.boot-quote figcaption { margin-top:10px; font-size:clamp(12px, 3.4vw, 15px); color:#c7b9ad; word-break:keep-all; }
.boot-status { margin:0; font-size:12px; color:#8f8a84; }
@media (prefers-reduced-motion: reduce) { .boot-splash { transition:none; } }

/* v2.9.24 전망·위험 탭 */
.forecast-view { padding:12px; }
.forecast-root { display:grid; gap:12px; max-width:1100px; margin:0 auto; min-width:0; }
.fc-head h2 { margin:0 0 4px; font-size:18px; }
.fc-disclaimer { margin:0; color:#b9c6d4; font-size:12px; line-height:1.6; }
.fc-tabs { display:flex; flex-wrap:wrap; gap:6px; }
.fc-tab { padding:7px 11px; border:1px solid #34465a; border-radius:999px; background:#121b25; color:#dbe4ee; font-size:13px; cursor:pointer; }
.fc-tab.is-active { background:#2b3f57; border-color:#5d86b5; color:#fff; }
.fc-panel { display:grid; gap:10px; min-width:0; }
.fc-definition { margin:0; padding:9px 11px; border-radius:8px; background:#141e29; border:1px solid #2c3a4b; font-size:12px; line-height:1.65; color:#d5dee8; }
.fc-meta { margin:0; color:#9fb0c2; font-size:11px; line-height:1.55; overflow-wrap:anywhere; }
.fc-cards { display:grid; gap:10px; grid-template-columns:repeat(auto-fit, minmax(min(100%, 320px), 1fr)); }
.fc-card { position:relative; padding:11px 12px; border:1px solid #31445a; border-radius:10px; background:#111a24; min-width:0; overflow-wrap:anywhere; }
.fc-card h4 { margin:0 0 6px; font-size:14px; }
.fc-conf { display:inline-block; padding:1px 8px; border-radius:999px; font-size:11px; background:#253244; color:#cfdcea; }
.fc-conf.conf-low, .fc-conf.conf-insufficient { background:#3d2f1d; color:#f0c36d; }
.fc-conf.conf-high { background:#1d3a2b; color:#9be3b4; }
.fc-big { display:flex; flex-wrap:wrap; align-items:baseline; gap:6px 12px; margin:8px 0 4px; }
.fc-big .fc-p { font-size:22px; font-weight:700; }
.fc-range { color:#b9c6d4; font-size:12px; }
.fc-designation { margin:6px 0 0; font-size:13px; font-weight:600; color:#f6d38a; }
.fc-scenarios { width:100%; border-collapse:collapse; margin:8px 0; font-size:12px; table-layout:fixed; }
.fc-scenarios th { text-align:left; font-weight:500; padding:3px 4px 3px 0; width:42%; overflow-wrap:anywhere; }
.fc-scenarios td { padding:3px 4px; vertical-align:middle; }
.fc-scenarios .fc-p { font-weight:700; width:44px; }
.fc-bar-box { display:block; height:6px; border-radius:3px; background:#1f2b38; overflow:hidden; }
.fc-bar { display:block; height:100%; background:#6f9fd8; }
.fc-scenarios .fc-range, .fc-scenarios .fc-base { color:#9fb0c2; font-size:10.5px; }
@media (max-width:520px) { .fc-scenarios .fc-base { display:none; } .fc-scenarios th { width:48%; } }
.fc-evidence h5, .fc-delta h5 { margin:8px 0 4px; font-size:12px; color:#c6d3e0; }
.fc-evidence-list { margin:0; padding-left:16px; display:grid; gap:4px; font-size:12px; }
.fc-evidence-list li.is-context { color:#9fb0c2; }
.fc-ev-label { font-weight:600; }
.fc-ev-meta { display:block; color:#9fb0c2; font-size:11px; }
.fc-ev-example { display:block; color:#8cc4ff; font-size:11px; text-decoration:none; }
.fc-empty, .fc-withheld { margin:4px 0; color:#9fb0c2; font-size:12px; }
.fc-excluded { margin:6px 0 0; color:#f0c36d; font-size:11px; }
.fc-delta-summary { margin:0; font-size:12px; }
.fc-delta-row { margin:2px 0; font-size:11px; color:#b9c6d4; }
.fc-history, .fc-registry, .fc-method, .fc-quote-source { padding:8px 11px; border:1px solid #2c3a4b; border-radius:9px; background:#0f1720; font-size:12px; min-width:0; overflow-wrap:anywhere; }
.fc-history ul { margin:6px 0 0; padding-left:16px; }
.fc-calibration { padding:9px 11px; border:1px solid #2c3a4b; border-radius:9px; background:#0f1720; font-size:12px; }
.fc-calibration h4 { margin:0 0 4px; font-size:13px; }
.fc-registry-table td { white-space:normal; min-width:90px; }
.fc-person-link { margin-top:6px; padding:5px 10px; border:1px solid #3b5470; border-radius:999px; background:#13202d; color:#cfe3f7; font-size:12px; cursor:pointer; }

/* ── v2.9.25 지도 터치 → 관련 공개정보(js/map-detail.js) ─────────────────────────────
   모바일: 지도 아래에서 올라오는 바텀 시트(지도 위 큰 팝업 금지, 지도 가림 최소). 데스크톱(≥1024): 오른쪽 옆 패널. */
.map-detail { position:fixed; z-index:190; display:flex; flex-direction:column; background:#0f1822; color:#e6edf5; border:1px solid #2f4155;
  box-shadow:0 -10px 30px rgba(0,0,0,.45); overflow:hidden; box-sizing:border-box; overflow-wrap:anywhere; }
.map-detail[hidden] { display:none !important; }
.map-detail.is-sheet { left:0; right:0; bottom:0; max-height:max(34dvh, min(48dvh, calc(100dvh - 61px - var(--map-height-current, 405px)))); border-radius:14px 14px 0 0; }
.map-detail.is-side { right:12px; top:66px; width:380px; max-height:calc(100dvh - 82px); border-radius:12px; box-shadow:0 10px 30px rgba(0,0,0,.45); }
.map-detail-head { display:flex; align-items:flex-start; gap:8px; padding:10px 12px 8px; border-bottom:1px solid #243243; }
.map-detail-titles { display:grid; gap:2px; min-width:0; flex:1; }
.map-detail-kind { color:#8fb3d9; font-size:11px; font-weight:600; }
.map-detail-title { margin:0; font-size:15px; line-height:1.35; }
.map-detail-sub { color:#a7b6c8; font-size:12px; }
.map-detail-close { flex:none; width:32px; height:32px; border:1px solid #33465b; border-radius:8px; background:#16212d; color:#dbe6f2; font-size:14px; cursor:pointer; }
.map-detail-body { overflow:auto; padding:6px 12px 14px; display:grid; gap:10px; overscroll-behavior:contain; }
.map-detail-section h4 { margin:2px 0 4px; font-size:13px; color:#cfe0f2; }
.map-detail-semantic { margin:0 0 4px; padding:6px 8px; border-left:3px solid #c99a3a; background:#1b1a14; color:#f1dfb3; font-size:12px; line-height:1.5; }
.map-detail-facts { margin:4px 0 0; display:grid; gap:2px; font-size:12px; }
.map-detail-facts > div { display:grid; grid-template-columns:76px minmax(0,1fr); gap:6px; }
.map-detail-facts dt { color:#8d9bad; }
.map-detail-facts dd { margin:0; }
.map-detail-note { margin:0 0 4px; color:#9fb0c3; font-size:11px; line-height:1.45; }
.map-detail-empty { margin:0; color:#8d9bad; font-size:12px; }
.map-detail-list { list-style:none; margin:0; padding:0; display:grid; gap:4px; }
.map-detail-row { display:grid; gap:1px; width:100%; padding:6px 8px; border:1px solid #243243; border-radius:8px; background:#121d28; color:inherit; text-align:left; font:inherit; }
button.map-detail-row { cursor:pointer; }
.map-detail-row-title { font-size:13px; line-height:1.4; }
.map-detail-row-meta { color:#93a4b8; font-size:11px; }
.map-detail-source-list { margin:0; padding-left:16px; color:#a7b6c8; font-size:11px; line-height:1.5; }
.map-detail-text p { margin:4px 0 0; font-size:11px; color:#b8c6d6; white-space:pre-wrap; }
.map-detail-link { color:#8cc4ff; font-size:12px; }
.map-detail-all { justify-self:start; padding:6px 12px; border:1px solid #3b5470; border-radius:999px; background:#13202d; color:#cfe3f7; font-size:12px; cursor:pointer; }
.map-detail .cb-event-detail { margin:6px 0 0; }
/* 공습경보 표시점·번호표는 눌러서 지도 상세를 연다(선 자체는 지도 조작을 막지 않게 계속 통과). */
/* 공습경보 레일: 경보 카드가 없을 때의 상태 한 줄(예전 빨간 요약 띠 대신) */
.alert-rail.is-status-only { padding:6px 10px; border-color:#3a3036; background:#141014; }
.alert-rail.is-status-only[data-state="degraded"] { border-color:#7a5a1d; color:#fcd34d; }
.alert-rail-status { margin:0; font-size:12px; line-height:1.5; }
.alert-rail-status strong { margin-right:4px; }
.alert-quick-rail-link { display:block; width:100%; margin-top:4px; padding:6px 8px; border:1px dashed #6b2a31; border-radius:8px; background:none; color:#ffb3bb; font-size:12px; text-align:left; cursor:pointer; }
/* 인물 분석 상세: 이름·역할·국가 → 기본 프로필(신장·공개 보도 몸무게) 카드가 맨 위 */
.person-identity { margin:2px 0 0; color:#a7b6c8; font-size:13px; }
.person-profile-box { border-color:#4a6684; background:#132233; }
.person-profile-grid { display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:8px; }
.person-profile-grid .person-profile-row { grid-template-columns:1fr; align-content:start; gap:4px; padding:8px 10px; border:1px solid #2b4058; border-radius:9px; background:#0f1b28; }
.person-profile-label { font-weight:600; color:#cfe0f2; display:flex; flex-wrap:wrap; gap:2px 6px; align-items:baseline; }
.person-profile-label-hint { color:#8d9bad; font-size:10px; font-weight:400; }
.person-profile-grid .person-profile-value { font-size:17px; }
.person-key-info { margin-top:12px; }
.person-key-info-title { margin:0 0 6px; font-size:14px; }
@media (max-width:359px) { .person-profile-grid { grid-template-columns:1fr; } }

/* ── v2.9.26 북한 공개 미사일 발사 분석(한반도) — 목록은 지도 밖, 지도에는 공개 지명 일대 대표점만 ── */
.nk-missile-notice { margin:0 0 4px; padding:6px 8px; border-left:3px solid #c99a3a; background:#1b1a14; color:#f1dfb3; font-size:12px; line-height:1.5; }
.nk-missile-newer { margin:4px 0; color:#f0c36d; font-size:12px; }
.nk-missile-filters { display:flex; flex-wrap:wrap; gap:6px; margin:6px 0; }
.nk-missile-filter { padding:4px 10px; border:1px solid #33465b; border-radius:999px; background:#121d28; color:#cfe0f2; font-size:12px; cursor:pointer; }
.nk-missile-filter.is-active { border-color:#8fb3d9; background:#1d3044; }
.nk-missile-list { list-style:none; margin:0; padding:0; display:grid; gap:6px; }
.nk-missile-row { display:grid; gap:2px; width:100%; padding:8px 10px; border:1px solid #243243; border-radius:9px; background:#111b26; color:inherit; text-align:left; font:inherit; cursor:pointer; overflow-wrap:anywhere; }
.nk-missile-row.is-selected { border-color:#c99a3a; }
.nk-missile-row-head { font-size:13px; font-weight:600; }
.nk-missile-row-facts { font-size:12px; color:#cfe0f2; }
.nk-missile-row-source { font-size:11px; color:#93a4b8; }
.nk-missile-detail { display:grid; gap:8px; margin-top:6px; overflow-wrap:anywhere; }
.nk-missile-trajectory { margin:0; padding:5px 8px; border:1px dashed #6b7c92; border-radius:7px; color:#dbe6f2; font-size:12px; }
.nk-missile-note { margin:0; color:#f0c36d; font-size:12px; }
.nk-missile-source { padding:7px 9px; border:1px solid #2b4058; border-radius:9px; background:#0f1b28; }
.nk-missile-source.is-media { border-style:dashed; }
.nk-missile-source h5 { margin:0 0 4px; font-size:12px; color:#cfe0f2; }
.nk-missile-wording { margin:4px 0 0; color:#9fb0c3; font-size:11px; line-height:1.45; }
.cm-missile-icon span { display:grid; place-items:center; width:22px; height:22px; border:1px dashed #f0c36d; border-radius:50%; background:rgba(15,24,34,.85); font-size:12px; }
path.cm-missile-area { stroke:#f0c36d; fill:#f0c36d; }
/* ── v2.9.26 인물 분석: 공개 몸무게 기록(보도 시점 값·범위, 보간·건강 판정 없음) ── */
.person-weight-history { margin-top:10px; padding:10px 12px; border:1px solid #2b4058; border-radius:11px; background:#101b27; overflow-wrap:anywhere; }
.person-weight-history h3 { margin:0 0 6px; font-size:14px; }
.person-weight-empty { margin:0; color:#a7b6c8; font-size:12px; }
.person-weight-chart { display:block; width:100%; max-width:520px; height:auto; }
.person-weight-chart .pw-grid { stroke:#243243; stroke-width:1; }
.person-weight-chart .pw-axis { fill:#8d9bad; font-size:9px; }
.person-weight-chart .pw-point { fill:#8cc4ff; }
.person-weight-chart .pw-approx { fill:none; stroke:#8cc4ff; stroke-width:1.6; }
.person-weight-chart .pw-range { stroke:#f0c36d; stroke-width:2.2; }
.person-weight-chart .pw-mark { cursor:pointer; }
.person-weight-legend, .person-weight-note { margin:4px 0 0; color:#9fb0c3; font-size:11px; line-height:1.45; }
.person-weight-list { list-style:none; margin:8px 0 0; padding:0; display:grid; gap:6px; }
.pw-row { padding:6px 8px; border:1px solid #243243; border-radius:8px; background:#0f1822; }
.pw-row.is-active { border-color:#8cc4ff; }
.pw-row.is-excluded { border-style:dashed; opacity:.9; }
.pw-row-head { font-size:14px; font-weight:600; }
.pw-row-meta, .pw-row-wording { color:#a7b6c8; font-size:11px; line-height:1.45; }
.pw-row-excluded { color:#f0c36d; font-size:11px; }
.pw-row-sources { display:flex; flex-wrap:wrap; gap:4px 10px; margin-top:2px; }
/* v2.9.27~28 인물 프로필 요약("한눈 요약") — 인물 분석·건강상태 분석 맨 위 compact 표(모든 인물 같은 컴포넌트) */
.person-profile-slot { min-width:0; }
.person-profile-summary { margin-top:8px; padding:8px 10px; }
.person-health-modal .person-profile-summary { margin-top:0; }
.pps-head { display:flex; flex-wrap:wrap; align-items:baseline; gap:0 8px; margin:0 0 4px; }
.pps-head h3 { margin:0; font-size:14px; }
.pps-role { color:#8d9bad; font-size:10.5px; }
.pps-table { margin:0; display:grid; gap:0; }
.person-profile-row.pps-row { grid-template-columns:64px minmax(0,1fr); gap:8px; padding:3px 0; border-top:1px solid #243243; align-items:start; }
.person-profile-row.pps-row:first-child { border-top:0; }
.pps-row .person-profile-label { margin:0; font-size:11px; font-weight:700; color:#cfe0f2; display:grid; gap:1px; padding-top:1px; word-break:keep-all; overflow-wrap:anywhere; }
.pps-row .person-profile-label-hint { color:#8d9bad; font-size:9.5px; font-weight:400; }
.pps-cell { margin:0; min-width:0; display:grid; gap:1px; }
.pps-foot { display:flex; flex-wrap:wrap; align-items:baseline; gap:0 8px; min-width:0; }
.pps-foot > .person-profile-note { flex:0 1 auto; min-width:0; }
.pps-foot > .pps-sources[open] { flex-basis:100%; }
.pps-row:is([data-metric="preferences"], [data-metric="mental-state"], [data-metric="medical"], [data-metric="recent-activity"]) .pps-values .person-profile-value { display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:1; overflow:hidden; }
@media (min-width:720px) { .pps-row:is([data-metric="preferences"], [data-metric="mental-state"], [data-metric="medical"], [data-metric="recent-activity"]) .pps-values .person-profile-value { -webkit-line-clamp:2; } }
.pps-values { list-style:none; margin:0; padding:0; display:grid; gap:1px; }
.pps-values li { min-width:0; line-height:1.25; }
.pps-cell .person-profile-value { font-size:13px; font-weight:700; word-break:keep-all; overflow-wrap:anywhere; }
.pps-row[data-metric="height"] .person-profile-value, .pps-row[data-metric="weight"] .person-profile-value { font-size:14px; }
.pps-row[data-status="NO_PUBLIC_INFO"] .person-profile-value, .pps-row[data-status="NO_DATA"] .person-profile-value { font-size:12px; color:#c3cfdc; font-weight:600; }
.pps-tag { margin-left:6px; color:#9fb3c8; font-size:10px; white-space:normal; }
.pps-values li.kind-estimate .pps-tag, .pps-values li.kind-unsourced .pps-tag { color:#f0c36d; }
.pps-values li.kind-official .pps-tag { color:#86efac; }
.pps-cell .person-profile-note { color:#a7b6c8; font-size:10.5px; line-height:1.3; word-break:keep-all; overflow-wrap:anywhere; }
.pps-action { margin-left:6px; padding:0 7px; vertical-align:1px; border:1px solid #3b5b7d; border-radius:999px; background:#16283a; color:#9dd0ff; font:inherit; font-size:10.5px; cursor:pointer; }
.pps-action:hover, .pps-action:focus-visible { background:#1d3550; }
.pps-sources { font-size:10.5px; min-width:0; }
.pps-sources > summary { color:#8cc4ff; cursor:pointer; list-style:none; width:max-content; max-width:100%; }
.pps-sources > summary::-webkit-details-marker { display:none; }
.pps-sources > summary::after { content:" ▾"; }
.pps-sources[open] > summary::after { content:" ▴"; }
.pps-sources .person-profile-item { margin-top:5px; display:grid; gap:2px; }
.pps-sources .person-profile-value { font-size:12px; }
.person-profile-summary .person-profile-caveat { margin-top:6px; font-size:10.5px; }
.person-weight-history:focus { outline:2px solid #3b82f6; outline-offset:2px; }
@media (min-width:720px) { .person-profile-row.pps-row { grid-template-columns:120px minmax(0,1fr); } }
/* v2.9.28 공개정보 기반 궤적 시뮬레이션(미사일·누리호) — 캔버스 지구 배경 모달, 메인 지도와 별개(PRIMARY MAP = 1) */
.launch-sim-modal { z-index:230; }
.launch-sim-modal .modal-panel { width:min(760px, 100%); height:min(94dvh, 100%); background:#050b14; }
.ls-kicker { font-size:12px; font-weight:800; color:#9fd4ff; letter-spacing:.02em; }
.ls-scroll { padding:12px 14px 28px; display:block; overflow-wrap:anywhere; }
.ls-scroll > * + * { margin-top:10px; }
.ls-title { margin:0; font-size:16px; line-height:1.35; }
.ls-notice { margin:0; padding:6px 8px; border-left:3px solid #c99a3a; background:#16140e; color:#f1dfb3; font-size:12px; line-height:1.5; }
.ls-stage { position:relative; width:100%; min-width:0; border:1px solid #1f3550; border-radius:12px; overflow:hidden; background:#02050b; }
.ls-canvas { display:block; width:100%; height:260px; }
.ls-hud { padding:5px 10px; border-top:1px solid #1f3550; background:#07111e; color:#d8ecff; font-size:11.5px; line-height:1.45; font-variant-numeric:tabular-nums; }
/* v2.9.34 진행 막대(동영상 막대처럼 — 무대 바로 아래): [재생] · 막대(role=slider, 손잡이·막대 끌기·누르기) · 시뮬레이션 시간 글.
   막대는 touch-action:pan-y(세로로 밀면 모달 스크롤), 손잡이는 none — 가로로 끌면 페이지가 움직이지 않는다. 휴대폰 누르는 높이 44px. */
.ls-controls { display:grid; grid-template-columns:auto minmax(0, 1fr) auto; align-items:center; gap:8px; min-width:0; }
.ls-play { flex:0 0 auto; min-height:36px; padding:5px 12px; text-align:center; border:1px solid #3b5b7d; border-radius:999px; background:#16283a; color:#cfe8ff; font:inherit; font-size:12px; white-space:nowrap; cursor:pointer; touch-action:manipulation; }
.ls-play:disabled { opacity:.45; cursor:default; }
.ls-scrub { --p:0; position:relative; min-width:0; height:40px; border-radius:10px; cursor:pointer; touch-action:pan-y; user-select:none; -webkit-user-select:none; -webkit-tap-highlight-color:transparent; outline:none; }
.ls-scrub[aria-disabled="true"] { opacity:.45; cursor:default; }
.ls-scrub:focus-visible { box-shadow:0 0 0 2px #9fd4ff inset; }
.ls-scrub-rail { position:absolute; left:11px; right:11px; top:50%; height:6px; margin-top:-3px; border-radius:3px; background:#22364d; pointer-events:none; }
.ls-scrub-fill { position:absolute; left:0; top:0; bottom:0; width:calc(var(--p) * 100%); border-radius:inherit; background:linear-gradient(90deg, #c8642f, #ff9b5c); }
.ls-scrub-ticks { position:absolute; inset:0; }
.ls-scrub-tick { position:absolute; top:-2px; bottom:-2px; width:2px; margin-left:-1px; border-radius:1px; background:rgba(214,232,255,.55); }
.ls-scrub-thumb { position:absolute; top:50%; left:calc(11px + var(--p) * (100% - 22px)); box-sizing:border-box; width:20px; height:20px; margin:-10px 0 0 -10px; border:2px solid #ff7a3d; border-radius:50%; background:#fff4d6; box-shadow:0 0 0 3px rgba(255,155,92,.22), 0 1px 4px rgba(0,0,0,.6); touch-action:none; transition:transform .12s; }
.ls-scrub.is-dragging .ls-scrub-thumb { transform:scale(1.2); box-shadow:0 0 0 6px rgba(255,155,92,.28), 0 1px 4px rgba(0,0,0,.6); }
.ls-time { min-width:0; color:#cfe4ff; font-size:12px; white-space:nowrap; font-variant-numeric:tabular-nums; }
.ls-time-now { display:inline-block; font-weight:700; }
.ls-time-total { color:#8fa5bd; }
/* 휴대폰: 막대는 무대 바로 아래 한 줄 전체 폭(손가락으로 고르기 쉽게), 그 아래 [재생] · 시간 글 */
@media (max-width:600px) {
  .ls-controls { grid-template-columns:auto minmax(0, 1fr); grid-template-areas:"scrub scrub" "play time"; row-gap:4px; }
  .ls-scrub { grid-area:scrub; height:44px; }
  .ls-play { grid-area:play; min-height:44px; padding:5px 10px; }
  .ls-time { grid-area:time; }
  .ls-scrub-thumb { width:24px; height:24px; margin:-12px 0 0 -12px; left:calc(12px + var(--p) * (100% - 24px)); }
  .ls-scrub-rail { left:12px; right:12px; }
}
.ls-insufficient { margin:0; padding:6px 8px; border:1px dashed #f0c36d; border-radius:8px; color:#f0c36d; font-size:12px; }
.ls-insufficient[hidden] { display:none; }
.ls-profile-box h4 { margin:0 0 4px; font-size:12.5px; color:#cfe0f2; }
.ls-profile { display:block; width:100%; max-width:560px; height:auto; background:#0a1420; border:1px solid #1f3550; border-radius:9px; }
.ls-axis { fill:#8fa5bd; font-size:9px; }
.ls-axis-line { stroke:#3a5068; stroke-width:1; }
.ls-profile-line { fill:none; stroke:#ff9b5c; stroke-width:1.6; stroke-dasharray:4 3; }
.ls-profile-line.is-straight { stroke:#a99bff; stroke-dasharray:none; }
.ls-profile-point { fill:#d9ccff; }
.ls-profile-event { stroke:#6b7c92; stroke-width:1; stroke-dasharray:2 3; }
.ls-profile-marker { fill:#fff4d6; stroke:#ff7a3d; stroke-width:1.5; }
.ls-note { margin:4px 0 0; color:#93a4b8; font-size:11px; line-height:1.45; }
.ls-facts { margin:0; }
.ls-sources { margin:0; padding-left:18px; display:grid; gap:3px; font-size:12px; }
.ls-caveat { margin:0; color:#8d9bad; font-size:11px; line-height:1.55; }
body.is-launch-sim-open { overflow:hidden; }
.nk-missile-sim-btn { justify-self:start; padding:6px 12px; border:1px solid #5b7fa6; border-radius:999px; background:#13263a; color:#d6ecff; font:inherit; font-size:12px; font-weight:600; cursor:pointer; }
.nk-missile-sim-btn:hover, .nk-missile-sim-btn:focus-visible { background:#1b3550; }
.space-launch-list { list-style:none; margin:0; padding:0; display:grid; gap:6px; }
.space-launch-row { display:grid; gap:2px; width:100%; padding:8px 10px; border:1px solid #2a3f5c; border-radius:9px; background:#0f1a2b; color:inherit; text-align:left; font:inherit; cursor:pointer; overflow-wrap:anywhere; }
.space-launch-row:hover, .space-launch-row:focus-visible { border-color:#7fa9d8; }
.space-launch-row-head { font-size:13px; font-weight:600; }
.space-launch-row-facts { font-size:12px; color:#cfe0f2; }
.space-launch-row-source { font-size:11px; color:#93a4b8; }
@media (min-width:900px) { .launch-sim-modal { align-items:center; } .launch-sim-modal .modal-panel { border-radius:16px; height:min(90dvh, 900px); } }
/* v2.9.29 궤도기동 느낌의 3D 시뮬레이션(globe.gl) · 단계 · 이동 · 한반도 발사 빠른 보기 · 발사 기록 줄 */
.ls-stage { position:relative; }
.ls-view { position:relative; width:100%; min-width:0; overflow:hidden; background:#02050b; }
.ls3d-host { width:100%; height:100%; }
.ls3d-host canvas { display:block; }
.ls-legend { position:absolute; left:8px; top:8px; max-width:calc(100% - 16px); padding:2px 8px; border-radius:999px; background:rgba(4,10,20,.72); color:#cfe4ff; font-size:10.5px; pointer-events:none; }
.ls-legend:empty { display:none; }
.ls3d-label { transform:translate(-50%, -140%); padding:2px 7px; border-radius:7px; background:rgba(4,10,20,.78); border:1px solid rgba(160,200,255,.35); color:#e8f1ff; font:600 11px/1.35 system-ui, sans-serif; white-space:nowrap; pointer-events:none; transition:opacity .2s; }
.ls3d-label.is-start { color:#ffd58a; border-color:rgba(255,204,120,.55); }
.ls3d-label.is-apex { color:#ffd9b0; }
.ls3d-label.is-end { color:#bfe3ff; border-color:rgba(140,210,255,.55); }
.ls3d-label.is-drop { color:#a99484; border-color:rgba(255,170,120,.25); }
.ls3d-label.is-drop.is-lit { color:#ffcfb0; border-color:rgba(255,170,120,.85); }
.ls3d-vehicle { width:11px; height:11px; margin:-5.5px 0 0 -5.5px; border-radius:50%; background:#fff4d6; box-shadow:0 0 6px 3px rgba(255,140,70,.85), 0 0 18px 8px rgba(255,120,60,.35); pointer-events:none; }
.ls3d-vehicle.is-rocket { background:#f3eeff; box-shadow:0 0 6px 3px rgba(170,140,255,.9), 0 0 18px 8px rgba(150,120,255,.35); }
.ls3d-sat { width:6px; height:6px; margin:-3px 0 0 -3px; border-radius:50%; background:#d9ccff; box-shadow:0 0 6px 2px rgba(166,139,255,.8); pointer-events:none; }
.ls3d-sat.is-cube { width:4px; height:4px; margin:-2px 0 0 -2px; background:#bfe3ff; box-shadow:0 0 4px 1px rgba(140,210,255,.8); }
.ls-camera { display:flex; gap:4px; flex:0 0 auto; }
.ls-camera[hidden] { display:none; }
.ls-camera button { padding:4px 9px; border:1px solid #33465b; border-radius:999px; background:#0f1b28; color:#cfe0f2; font:inherit; font-size:11.5px; cursor:pointer; }
.ls-camera button.is-active { border-color:#9fd4ff; background:#16304a; color:#e8f4ff; }
.ls-camera button:disabled { opacity:.45; cursor:default; }
.ls-steps { list-style:none; margin:0; padding:0; display:grid; grid-template-columns:repeat(auto-fit, minmax(110px, 1fr)); gap:4px; }
.ls-step { display:grid; gap:1px; padding:5px 8px; border:1px solid #1f3550; border-radius:8px; background:#0a1420; color:#8fa5bd; font-size:11px; line-height:1.35; min-width:0; overflow-wrap:anywhere; }
.ls-step strong { color:#cfe0f2; font-size:12px; }
.ls-step.is-done { border-color:#3b5b7d; color:#a7b6c8; }
.ls-step.is-current { border-color:#ff9b5c; background:#1b1410; color:#ffd9b0; }
.ls-step.is-current strong { color:#fff1e0; }
.ls-nav { display:flex; flex-wrap:wrap; gap:6px; }
.ls-nav button { padding:5px 11px; border:1px solid #3b5b7d; border-radius:999px; background:#13263a; color:#d6ecff; font:inherit; font-size:12px; cursor:pointer; }
.ls-nav button:disabled { opacity:.4; cursor:default; }
.ls-nav button.is-current { border-color:#a99bff; background:#221c40; }
.cb-region-extra { font-size:11px; color:#ffcf99; overflow-wrap:anywhere; }
.launch-quick { border-color:#5b4a2e; background:linear-gradient(180deg, #17130c, var(--card)); }
.launch-quick-row { display:grid; gap:3px; padding:8px 10px; border:1px solid #33465b; border-radius:9px; background:#0f1a2b; min-width:0; }
.launch-quick-row.is-space { border-color:#3f3866; }
.launch-quick-head { font-size:13px; font-weight:700; overflow-wrap:anywhere; }
.launch-quick-facts { font-size:12px; color:#cfe0f2; overflow-wrap:anywhere; }
.launch-quick-actions { display:flex; flex-wrap:wrap; gap:6px; margin-top:3px; }
.launch-quick-list, .launch-quick-nuri { padding:6px 12px; border:1px solid #3b5b7d; border-radius:999px; background:#13263a; color:#d6ecff; font:inherit; font-size:12px; font-weight:600; cursor:pointer; }
.launch-quick-nuri { border-color:#6a5bb5; background:#1d1838; }
.nk-missile-item { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:6px; align-items:stretch; }
.nk-missile-badge { margin-left:6px; padding:0 6px; border-radius:999px; font-size:10px; font-weight:700; vertical-align:1px; }
.nk-missile-badge.is-official { background:#16352a; color:#86efac; border:1px solid #2f6a4e; }
.nk-missile-badge.is-media { background:#33270f; color:#f0c36d; border:1px solid #6a5226; }
.nk-missile-sim-btn.is-compact { align-self:stretch; padding:6px 10px; border-radius:9px; font-size:12px; white-space:nowrap; }
.nk-missile-sim-btn.is-insufficient { border-color:#4a5568; background:#141b24; color:#9fb0c3; font-weight:500; }
@media (max-width:380px) { .nk-missile-item { grid-template-columns:1fr; } .nk-missile-sim-btn.is-compact { justify-self:start; } }
.ls3d-label.is-maneuver { color:#e3d9ff; border-color:rgba(176,156,255,.6); }
@media (max-width:520px) { .ls3d-label { font-size:10px; padding:1px 5px; } .ls3d-label.is-drop { font-size:9.5px; } }
/* v2.9.29 몸무게 그래프 기호: ◇ 공개 추정값 · △ 하한 · ▽ 상한, 보도 시점 문구 */
.person-weight-chart .pw-estimate { fill:none; stroke:#c4b5fd; stroke-width:1.6; }
.person-weight-chart .pw-bound { fill:none; stroke:#7dd3fc; stroke-width:1.6; stroke-linejoin:round; }
.person-weight-sub { margin:2px 0 6px; color:#f0c36d; font-size:11.5px; font-weight:600; }
.ls3d-host.is-globe-view .ls3d-label.is-peak { visibility:hidden; }
/* v2.9.30 한반도 하위 탭 · 미사일 분석 · 발사 궤적 · 변화 감지 · 출처 */
.kr-tabs, .sp-tabs { display:flex; flex-wrap:wrap; gap:6px; padding:6px; border:1px solid var(--border); border-radius:11px; background:#101a24; min-width:0; }
.kr-tab, .sp-tab { display:inline-flex; align-items:center; gap:5px; flex:1 1 auto; justify-content:center; min-width:0; padding:7px 10px; border:1px solid #2c3d50; border-radius:9px; background:#132131; color:#cfe0f2; font:inherit; font-size:13px; font-weight:600; cursor:pointer; white-space:nowrap; }
.kr-tab.is-active, .sp-tab.is-active { border-color:#ffb36b; background:#2a1d12; color:#fff1e0; }
.kr-tab-count, .sp-tab-count { padding:0 6px; border-radius:999px; background:#22374d; color:#d6ecff; font-size:11px; font-weight:700; }
.kr-tab.is-active .kr-tab-count, .sp-tab.is-active .sp-tab-count { background:#5a3a1c; color:#ffe2c2; }
@media (max-width:400px) { .kr-tab, .sp-tab { padding:6px 7px; font-size:12px; flex-basis:calc(33% - 6px); } }
.ma-fresh { display:flex; flex-wrap:wrap; gap:4px 10px; align-items:center; padding:6px 9px; border:1px solid #2b3c4f; border-radius:9px; background:#0f1822; font-size:12px; color:#cfe0f2; min-width:0; }
.ma-fresh-item { overflow-wrap:anywhere; }
.ma-fresh-item.is-ok { color:#86efac; } .ma-fresh-item.is-partial, .ma-fresh-item.is-stale { color:#fbbf24; } .ma-fresh-item.is-fail { color:#fca5a5; } .ma-fresh-item.is-blocked { color:#9fb0c3; }
.ma-fresh-note { flex-basis:100%; margin:0; color:#93a4b8; font-size:11px; }
.ma-summary { display:grid; grid-template-columns:repeat(auto-fit, minmax(140px, 1fr)); gap:6px; margin:0; }
.ma-sum { display:grid; gap:1px; padding:7px 9px; border:1px solid #243243; border-radius:9px; background:#111b26; min-width:0; }
.ma-sum dt { color:#93a4b8; font-size:11px; } .ma-sum dd { margin:0; font-size:13px; font-weight:600; overflow-wrap:anywhere; }
.ma-block { display:grid; gap:6px; min-width:0; }
.ma-block > h4 { margin:4px 0 0; font-size:14px; }
.ma-recent { padding:9px 10px; border:1px solid #5b4a2e; border-radius:10px; background:linear-gradient(180deg, #17130c, #111b26); }
.ma-recent-head { margin:0; font-weight:700; font-size:13.5px; overflow-wrap:anywhere; }
.ma-recent-facts, .ma-recent-meta { margin:0; font-size:12px; color:#cfe0f2; overflow-wrap:anywhere; }
.ma-recent-meta { color:#93a4b8; }
.ma-recent-pending { margin:6px 0 0; padding:5px 8px; border:1px dashed #8a6a2a; border-radius:8px; color:#ffd58a; font-size:12px; overflow-wrap:anywhere; }
.tj-card > .ma-badge { justify-self:start; max-width:100%; overflow-wrap:anywhere; white-space:normal; }
.ma-types { display:flex; flex-wrap:wrap; gap:4px; min-width:0; }
.ma-badge { display:inline-block; max-width:100%; padding:1px 7px; border:1px solid #33465b; border-radius:999px; background:#13202e; color:#d6e6f5; font-size:11px; font-weight:600; line-height:1.5; overflow-wrap:anywhere; white-space:normal; }
.ma-badge.st-official { border-color:#2f6a4e; background:#16352a; color:#86efac; }
.ma-badge.st-quoted { border-color:#3b6aa0; background:#14273c; color:#9fd0ff; }
.ma-badge.st-multi { border-color:#5b5ba0; background:#1d1d3a; color:#c7c7ff; }
.ma-badge.st-estimate { border-color:#6a5226; background:#33270f; color:#f0c36d; border-style:dashed; }
.ma-badge.st-unknown { border-color:#4a5568; background:#141b24; color:#9fb0c3; }
.ma-badge.conflict { border-color:#8a3b3b; background:#2d1515; color:#fca5a5; }
.ma-badge.q { border-color:#3a4a5c; } .ma-badge.q-A { color:#86efac; } .ma-badge.q-B { color:#9fd0ff; } .ma-badge.q-C { color:#f0c36d; } .ma-badge.q-D { color:#fca5a5; }
.ma-badge.is-pending { border-color:#8a6a2a; background:#2c2210; color:#ffd58a; }
.ma-badge.is-new { border-color:#c2410c; background:#3b1c0c; color:#ffb38a; }
.ma-badge.is-local { border-color:#4a5568; background:#1a2230; color:#cbd5e1; border-style:dashed; }
.ma-badge.is-stale { border-color:#b45309; background:#3a240c; color:#fcd34d; }
.nk-missile-row-head .ma-badge { margin-left:5px; vertical-align:1px; }
.ma-chips { display:flex; flex-wrap:wrap; gap:5px; min-width:0; }
.ma-chip { padding:4px 9px; border:1px solid #33465b; border-radius:999px; background:#121d28; color:#cfe0f2; font:inherit; font-size:12px; cursor:pointer; white-space:nowrap; }
.ma-chip.is-active { border-color:#ffb36b; background:#2a1d12; color:#fff1e0; }
.ma-controls { display:grid; grid-template-columns:repeat(auto-fit, minmax(130px, 1fr)); gap:6px; min-width:0; }
.ma-select, .ma-search { display:grid; gap:2px; font-size:11px; color:#93a4b8; min-width:0; }
.ma-select select, .ma-search input { width:100%; min-width:0; box-sizing:border-box; padding:5px 7px; border:1px solid #33465b; border-radius:8px; background:#0f1822; color:#e5eef7; font:inherit; font-size:12.5px; }
.ma-search { grid-column:1 / -1; }
.ma-list .nk-missile-row { gap:4px; }
.ma-row.is-pending .nk-missile-row { border-style:dashed; }
.ma-compare-wrap { max-width:100%; overflow-x:auto; }
.ma-compare { width:100%; border-collapse:collapse; font-size:12px; }
.ma-compare th, .ma-compare td { padding:5px 6px; border-bottom:1px solid #243243; text-align:left; vertical-align:top; overflow-wrap:anywhere; }
.ma-compare th { color:#93a4b8; font-weight:600; font-size:11px; }
.ma-compare .col-official { color:#86efac; } .ma-compare .col-detail { color:#9fd0ff; } .ma-compare .col-family { color:#f0c36d; }
@media (max-width:620px) {
  .ma-compare thead { display:none; }
  .ma-compare, .ma-compare tbody, .ma-compare tr, .ma-compare td { display:block; width:100%; box-sizing:border-box; }
  .ma-compare tr { margin-bottom:6px; border:1px solid #243243; border-radius:9px; padding:4px 6px; }
  .ma-compare td { border:0; padding:2px 0; display:grid; grid-template-columns:5.5em minmax(0, 1fr); gap:6px; }
  .ma-compare td::before { content:attr(data-label); color:#93a4b8; font-size:11px; }
}
.ma-note { margin:0; color:#93a4b8; font-size:11px; line-height:1.5; }
.ma-source-list { list-style:none; margin:0; padding:0; display:grid; gap:4px; }
.ma-source { display:flex; flex-wrap:wrap; gap:6px; align-items:baseline; font-size:12px; min-width:0; overflow-wrap:anywhere; }
.ma-source-kind { padding:0 6px; border-radius:999px; background:#1a2836; color:#cfe0f2; font-size:10.5px; font-weight:700; }
.ma-source.is-official .ma-source-kind { background:#16352a; color:#86efac; }
.ma-link { color:#9fd0ff; overflow-wrap:anywhere; }
.tj-grid { list-style:none; margin:0; padding:0; display:grid; grid-template-columns:repeat(auto-fill, minmax(230px, 1fr)); gap:7px; }
.tj-card { display:grid; gap:3px; align-content:start; padding:9px 10px; border:1px solid #2c3d50; border-radius:10px; background:#111b26; min-width:0; overflow-wrap:anywhere; }
.tj-card.sim-sim_ready { border-color:#4b5f2e; }
.tj-card.is-nuri { border-color:#3f3866; background:linear-gradient(180deg, #17142a, #111b26); }
.tj-head { font-size:13px; }
.tj-facts, .tj-mode { font-size:12px; color:#cfe0f2; }
.tj-mode { color:#c4b5fd; }
.tj-status { font-size:11.5px; color:#93a4b8; }
.tj-status.st-sim_ready { color:#86efac; }
.tj-open { justify-self:start; margin-top:3px; padding:6px 12px; border:1px solid #3b5b7d; border-radius:999px; background:#13263a; color:#d6ecff; font:inherit; font-size:12px; font-weight:600; cursor:pointer; }
.tj-open.is-insufficient { border-color:#4a5568; background:#141b24; color:#9fb0c3; font-weight:500; }
.tj-open.is-nuri { border-color:#6a5bb5; background:#1d1838; }
.tj-latest h4, .tj-nuri h4, .trajectory-tab > h4 { margin:4px 0 0; font-size:14px; }
.cf-list { list-style:none; margin:0; padding:0; display:grid; gap:6px; }
.cf-row { display:grid; gap:3px; padding:8px 10px; border:1px solid #2c3d50; border-left-width:3px; border-radius:9px; background:#111b26; min-width:0; overflow-wrap:anywhere; }
.cf-row.pri-high { border-left-color:#f97316; } .cf-row.pri-medium { border-left-color:#60a5fa; } .cf-row.pri-low { border-left-color:#64748b; }
.cf-row.is-candidate { border-style:dashed; border-left-style:solid; }
.cf-head { display:flex; flex-wrap:wrap; gap:4px 7px; align-items:baseline; min-width:0; }
.cf-type { font-size:13px; } .cf-subject { font-size:12px; color:#cfe0f2; }
.ma-badge.pri-high { border-color:#c2410c; color:#ffb38a; } .ma-badge.pri-medium { border-color:#3b6aa0; color:#9fd0ff; } .ma-badge.pri-low { color:#9fb0c3; }
.cf-diff { display:flex; flex-wrap:wrap; gap:4px 6px; align-items:baseline; font-size:12.5px; min-width:0; }
.cf-before { color:#93a4b8; text-decoration:line-through; text-decoration-color:#475569; } .cf-arrow { color:#64748b; } .cf-after { color:#e5eef7; font-weight:600; }
.cf-meta { display:flex; flex-wrap:wrap; gap:4px 10px; font-size:11.5px; color:#93a4b8; min-width:0; }
.cf-reason { margin:0; font-size:11.5px; color:#a7b6c8; }
.src-status-list { list-style:none; margin:0; padding:0; display:grid; gap:6px; }
.src-status { display:grid; gap:2px; padding:8px 10px; border:1px solid #2c3d50; border-radius:9px; background:#111b26; font-size:12px; min-width:0; overflow-wrap:anywhere; }
.src-status.is-ok { border-left:3px solid #22c55e; } .src-status.is-partial, .src-status.is-stale { border-left:3px solid #f59e0b; } .src-status.is-fail { border-left:3px solid #ef4444; } .src-status.is-blocked, .src-status.is-unknown { border-left:3px solid #64748b; }
.src-state { color:#cfe0f2; } .src-fresh, .src-cadence, .src-note { color:#93a4b8; font-size:11.5px; }
.ls3d-label.is-overlap-hidden { visibility:hidden; }

/* ── v2.9.31 [한반도] 한눈 요약 · [우주·위성] · 번역 용어 풀이 · 데이터 최신성 ───────────────── */
.korea-nav { margin: 4px 0 10px; }
.korea-summary { margin: 0 0 12px; }
.korea-summary-list { margin: 0; display: grid; gap: 6px; }
.korea-summary-row { display: grid; grid-template-columns: 96px minmax(0, 1fr); gap: 8px; align-items: start; padding: 6px 0; border-top: 1px solid var(--border); min-width: 0; }
.korea-summary-row:first-child { border-top: 0; }
.korea-summary-row dt { color: var(--text-dim); font-size: 12px; font-weight: 600; }
.korea-summary-row dd { margin: 0; display: grid; gap: 4px; min-width: 0; font-size: 12.5px; line-height: 1.45; overflow-wrap: anywhere; }
.korea-summary-actions { display: flex; flex-wrap: wrap; gap: 6px; }
.korea-summary-go { min-height: 32px; padding: 4px 10px; border: 1px solid #2c3d50; border-radius: 8px; background: #132131; color: #cfe0f2; font: inherit; font-size: 12px; cursor: pointer; }
.korea-summary-actions .nk-missile-sim-btn { min-height: 32px; }
.korea-summary-note { margin-top: 6px; }
@media (max-width: 400px) { .korea-summary-row { grid-template-columns: minmax(0, 1fr); gap: 2px; } }
.korea-panel { min-width: 0; }

.space-view { padding: 0 16px 24px; max-width: 1100px; margin: 0 auto; box-sizing: border-box; }
.space-root { display: grid; gap: 10px; min-width: 0; }
.sp-head h2 { margin: 12px 0 2px; font-size: 18px; }
.sp-status { margin: 4px 0 0; color: var(--text-dim); font-size: 12px; overflow-wrap: anywhere; }
.sp-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.sp-row { display: grid; gap: 3px; padding: 8px 10px; border: 1px solid var(--border); border-radius: 9px; background: var(--card); min-width: 0; overflow-wrap: anywhere; }
.sp-row-head { display: flex; flex-wrap: wrap; gap: 5px; }
.sp-kind, .sp-prov, .sp-flag { padding: 1px 7px; border-radius: 999px; font-size: 11px; background: #1b2a3a; color: #cfe0f2; }
.sp-prov.prov-official { background: #173826; color: #b8f0cc; }
.sp-prov.prov-agency_quoted { background: #2a2a12; color: #f3e6a6; }
.sp-flag { background: #3a2412; color: #ffd2a6; }
.sp-title { color: var(--text); font-size: 13.5px; font-weight: 600; line-height: 1.4; text-decoration: none; }
.sp-meta { margin: 0; color: var(--text-dim); font-size: 11.5px; }
.sp-note { margin: 0; color: #f0c36d; font-size: 11px; }
.sp-nuri-list { display: grid; gap: 8px; }
.sp-nuri { padding: 10px; border: 1px solid #2c3d50; border-radius: 10px; background: #101a24; display: grid; gap: 4px; }
.sp-nuri h4 { margin: 0; font-size: 14px; }
.sp-actions { display: flex; flex-wrap: wrap; gap: 6px; }
.sp-nuri-sim, .sp-go-missile { min-height: 36px; padding: 5px 10px; border: 1px solid #ffb36b; border-radius: 8px; background: #2a1d12; color: #fff1e0; font: inherit; font-size: 12.5px; cursor: pointer; }
.sp-subtitle { margin: 12px 0 6px; font-size: 13px; color: var(--text-dim); }
@media (max-width: 700px) { .space-view { padding: 0 12px 20px; } }

.tr-hints { flex-basis: 100%; font-size: 11px; color: #c9d7e6; line-height: 1.45; }
.cf-quality { color: var(--text-dim); font-size: 11px; }

.freshness-list { list-style: none; margin: 6px 0 0; padding: 0; display: grid; gap: 6px; }
.freshness-row { display: grid; gap: 2px; padding: 6px 8px; border: 1px solid var(--border); border-radius: 8px; font-size: 12px; overflow-wrap: anywhere; }
.freshness-row.state-stale, .freshness-row.state-source_failed { border-color: #7a5a1d; }
.freshness-row.state-pending_user_action, .freshness-row.state-rejected_terms { border-color: #4b3a5a; }
.freshness-state { font-weight: 600; }
.freshness-meta, .freshness-note { color: var(--text-dim); font-size: 11px; }
.border-urgent { margin: 10px 0; padding: 10px 12px; border: 1px solid var(--border); border-radius: 10px; background: var(--card); display: grid; gap: 6px; min-width: 0; }
.border-urgent-list { display: grid; gap: 6px; }
.korea-tab-status { margin: 0 0 10px; }
#topicFeed[hidden] { display: none !important; }
/* v2.9.32 미사일 고도 HUD — 3D·2D 무대 오른쪽 위 고정(포인터 통과·추적 시점은 아크를 이 띠 아래에 둔다).
   공개 최고고도(발표값) ≠ 시뮬레이션 고도(근사값) · 화면 높이 배율(×N) ≠ 실제 고도. 범례는 HUD와 겹치지 않게 폭을 줄인다. */
.ls-alt-hud { position:absolute; top:8px; right:8px; z-index:2; display:grid; gap:1px; box-sizing:border-box; width:min(46%, 196px); padding:4px 8px 5px; border:1px solid rgba(160,200,255,.3); border-radius:9px; background:rgba(4,10,20,.8); color:#e8f1ff; font-size:10.5px; line-height:1.3; font-variant-numeric:tabular-nums; word-break:keep-all; overflow-wrap:anywhere; pointer-events:none; }
.ls-alt-hud[hidden] { display:none; }
.ls-alt-head, .ls-alt-row { display:flex; flex-wrap:wrap; justify-content:space-between; align-items:baseline; gap:0 8px; min-width:0; }
.ls-alt-head > b { font-weight:700; }
.ls-alt-head > span, .ls-alt-row > span { color:#9fb4cc; white-space:nowrap; }
.ls-alt-row > b { margin-left:auto; font-weight:700; text-align:right; }
.ls-alt-row.is-sim > b { color:#ffd9b0; }
.ls-alt-row.is-peak > b { color:#cfe4ff; }
.ls-alt-note { display:flex; flex-wrap:wrap; gap:0 6px; color:#9fb4cc; font-size:10px; }
.ls-alt-note > span { white-space:nowrap; }
.ls-alt-note > span:empty { display:none; }
.ls-stage.has-alt-hud .ls-legend { max-width:max(calc(54% - 24px), calc(100% - 220px)); border-radius:9px; word-break:keep-all; }
/* 휴대폰에서도 HUD 글은 10px 아래로 줄이지 않는다(배율 줄의 "과장"·"실제 비율"이 읽히게). */
@media (max-width:520px) { .ls-alt-hud { font-size:10px; padding:3px 6px 4px; } .ls-alt-note { font-size:10px; } }
/* v2.9.33 발사 시뮬레이션 — 궤적 먼저·주석은 다음: 라벨 층(궤적 옆 빈 곳 + 지시선), 화면 조작([+][−][초기화][전체 보기][추적 보기]),
   정보 블록(간단/상세), 누리호 고도 HUD(공개 위성분리 고도 ≠ 개념 경로 고도), [근거 보기], [공식 해상통제구역] 층. 무대 밖 페이지 스크롤은 막지 않는다. */
.ls-view { touch-action:none; }
.ls-callouts { position:absolute; inset:0; z-index:1; pointer-events:none; overflow:hidden; }
.ls-leaders { position:absolute; inset:0; width:100%; height:100%; overflow:visible; }
.ls-leader { fill:none; stroke:rgba(205,222,245,.5); stroke-width:1; stroke-dasharray:3 2; }
.ls-leader.is-drop { stroke:rgba(255,196,160,.5); }
.ls-leader.is-control { stroke:rgba(120,245,228,.55); }
.ls-anchor { fill:rgba(4,10,20,.55); stroke:rgba(230,240,255,.85); stroke-width:1.2; }
.ls-callout { position:absolute; left:0; top:0; transform:none; max-width:min(240px, 70%); white-space:normal; word-break:keep-all; overflow-wrap:anywhere; line-height:1.3; }
.ls3d-label.is-control { color:#bff7ee; border-color:rgba(120,245,228,.6); }
.ls3d-label.is-azimuth { color:#ffe2a3; border-color:rgba(255,214,120,.45); }
@media (max-width:600px) { .ls-callout { max-width:150px; } }
.ls-nuri-hud { position:absolute; top:8px; right:8px; z-index:2; display:grid; gap:1px; box-sizing:border-box; width:min(46%, 196px); padding:4px 8px 5px; border:1px solid rgba(190,170,255,.38); border-radius:9px; background:rgba(4,10,20,.8); color:#e8f1ff; font-size:10.5px; line-height:1.3; font-variant-numeric:tabular-nums; word-break:keep-all; overflow-wrap:anywhere; pointer-events:none; }
.ls-nuri-hud[hidden], .ls-nuri-hud [hidden] { display:none; }
.ls-nuri-hud .ls-alt-note > span { white-space:normal; }
@media (max-width:600px) { .ls-nuri-hud [data-k="src"] { display:none; } } /* 휴대폰은 HUD를 작게(궤적 먼저) — 출처는 정보 블록 '공개 고도' 줄 */
@media (max-width:520px) { .ls-nuri-hud { font-size:10px; padding:3px 6px 4px; } }
.ls-navbar { display:flex; flex-wrap:wrap; align-items:center; gap:6px; min-width:0; }
.ls-navbar button { min-width:40px; min-height:36px; padding:4px 10px; border:1px solid #33465b; border-radius:10px; background:#0f1b28; color:#cfe0f2; font:inherit; font-size:12.5px; font-weight:600; cursor:pointer; touch-action:manipulation; }
.ls-navbar .ls-zoom[data-zoom="in"], .ls-navbar .ls-zoom[data-zoom="out"] { width:40px; padding:0; font-size:19px; line-height:1; }
.ls-navbar .ls-camera { display:flex; gap:6px; margin-left:auto; }
.ls-navbar button.is-active { border-color:#9fd4ff; background:#16304a; color:#e8f4ff; }
.ls-navbar button:disabled { opacity:.45; cursor:default; }
.ls-layers { display:flex; flex-wrap:wrap; align-items:center; gap:6px 10px; padding:6px 8px; border:1px solid #1d4a47; border-radius:10px; background:#08181a; min-width:0; }
.ls-layers[hidden] { display:none; }
.ls-layer-btn { min-height:36px; padding:4px 12px; border:1px solid #2f6a63; border-radius:999px; background:#0e2224; color:#bff7ee; font:inherit; font-size:12.5px; font-weight:600; cursor:pointer; }
.ls-layer-btn::before { content:'☐ '; }
.ls-layer-btn.is-active { border-color:#78f5e4; background:#123a38; color:#e6fffb; }
.ls-layer-btn.is-active::before { content:'☑ '; }
.ls-layer-note { flex:1 1 220px; min-width:0; margin:0; color:#a9d8d2; font-size:11px; line-height:1.45; }
.ls-info { padding:8px 10px; border:1px solid #1f3550; border-radius:10px; background:#08111c; min-width:0; }
.ls-info-head { display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:6px; }
.ls-info-name { font-size:13px; color:#e8f1ff; overflow-wrap:anywhere; }
.ls-info-modes { display:flex; gap:4px; }
.ls-info-modes button { min-height:32px; padding:3px 10px; border:1px solid #33465b; border-radius:999px; background:#0f1b28; color:#cfe0f2; font:inherit; font-size:11.5px; cursor:pointer; }
.ls-info-modes button[aria-pressed="true"] { border-color:#9fd4ff; background:#16304a; color:#e8f4ff; }
.ls-info-rows { margin:6px 0 0; display:grid; gap:3px; }
.ls-info-row { display:grid; grid-template-columns:7.5em minmax(0, 1fr); gap:6px; font-size:12px; line-height:1.45; }
.ls-info-row dt { color:#8fa5bd; }
.ls-info-row dd { margin:0; min-width:0; color:#dbe8f6; overflow-wrap:anywhere; }
.ls-info.is-simple .ls-info-row[data-level="detail"] { display:none; }
.ls-evidence { margin-top:8px; }
.ls-evidence[hidden] { display:none; }
.ls-evidence > summary { display:flex; align-items:center; min-height:32px; color:#9fd4ff; font-size:12.5px; font-weight:700; cursor:pointer; }
.ls-evidence-list { margin:6px 0 0; padding-left:18px; display:grid; gap:8px; font-size:12px; }
.ls-ev-head { color:#e8f1ff; }
.ls-ev-value { color:#ffd9b0; }
.ls-ev-sources { margin:3px 0 0; padding-left:14px; display:grid; gap:4px; }
.ls-ev-quote { display:block; margin-top:2px; color:#c7d6e6; font-size:11.5px; }
.ls-ev-note, .ls-ev-covers, .ls-ev-checked { color:#93a4b8; font-size:11px; }
.ls-ev-checked { display:block; }
.ls-ev-points { margin:4px 0 0; padding-left:22px; columns:2 150px; color:#bff7ee; font-size:11.5px; font-variant-numeric:tabular-nums; }
@media (max-width:600px) {
  .ls-navbar button, .ls-layer-btn, .ls-info-modes button { min-height:44px; }
  .ls-navbar button { min-width:44px; }
  .ls-navbar .ls-zoom[data-zoom="in"], .ls-navbar .ls-zoom[data-zoom="out"] { width:44px; }
  .ls-navbar .ls-camera { margin-left:0; }
  .ls-info-row { grid-template-columns:6em minmax(0, 1fr); }
}
/* v2.9.33 발사 정보 허브 */
/* [🚀 발사 정보](js/launch-hub-view.js) — [대한민국][북한][해외] 탭 · 목록 카드 → 상세(요약·발사체·제원·분석·신호·관련 기사·출처).
   겹 순서: 기사 창(.modal 200) 위 · 궤적 시뮬레이션(.launch-sim-modal 230) 아래 = 215. 휴대폰은 아래에서 올라오는 시트, 900px 이상은 가운데 창.
   가로 넘침 0 · 글자 잘림 0(줄바꿈) · 탭·버튼 누르는 영역 44px. 모든 선택자는 .lh- 로 시작한다. */
.lh-root { position:fixed; inset:0; z-index:215; display:flex; align-items:flex-end; justify-content:center; }
.lh-root[hidden] { display:none !important; }
.lh-open { overflow:hidden; }
.lh-backdrop { position:absolute; inset:0; background:rgba(0, 0, 0, .62); touch-action:none; }
.lh-panel { position:relative; display:flex; flex-direction:column; box-sizing:border-box; width:min(760px, 100%); max-width:100%; height:min(92dvh, 100%); min-height:0;
  background:#0d141c; color:#e6edf5; border:1px solid #2a3a4c; border-bottom:0; border-radius:16px 16px 0 0; box-shadow:0 -12px 36px rgba(0, 0, 0, .5);
  overflow:hidden; overflow-wrap:anywhere; }
.lh-head { display:flex; align-items:center; justify-content:space-between; gap:10px; padding:8px 8px 6px 14px; border-bottom:1px solid #223041; }
.lh-title { margin:0; font-size:17px; line-height:1.3; }
.lh-btn { box-sizing:border-box; min-height:44px; padding:8px 12px; border:1px solid #3b5470; border-radius:10px; background:#13202d; color:#d6e7f8; font:inherit;
  font-size:13px; line-height:1.3; text-align:center; cursor:pointer; overflow-wrap:anywhere; }
.lh-btn:hover:not(:disabled) { background:#1a2c3e; }
.lh-btn:focus-visible { outline:2px solid #9bd6ff; outline-offset:2px; }
.lh-btn:disabled { opacity:.5; cursor:not-allowed; }
.lh-close { flex:none; width:44px; height:44px; padding:0; border-color:#33465b; background:#16212d; font-size:17px; }
.lh-tabs { display:grid; grid-template-columns:repeat(3, minmax(0, 1fr)); gap:6px; padding:8px 12px 6px; }
.lh-tab { display:flex; flex-wrap:wrap; align-items:center; justify-content:center; gap:4px 6px; min-width:0; min-height:44px; padding:6px; border-color:#2c3a49;
  background:#111a24; color:#c7d4e2; font-size:14px; font-weight:700; }
.lh-tab.is-active { border-color:#f97316; background:#2a1709; color:#fff; box-shadow:inset 0 -3px 0 #f97316; }
.lh-tab-label { white-space:nowrap; }
.lh-tab-count { min-width:22px; padding:1px 6px; border-radius:999px; background:#253243; color:#e2ecf6; font-size:12px; line-height:1.5; }
.lh-tab.is-active .lh-tab-count { background:#7c2d12; }
.lh-semantics { margin:0 12px 6px; padding:5px 8px; border-left:3px solid #c99a3a; background:#16140e; color:#f1dfb3; font-size:11.5px; line-height:1.5; }
.lh-body { flex:1 1 auto; min-height:0; overflow-x:hidden; overflow-y:auto; overscroll-behavior:contain; -webkit-overflow-scrolling:touch;
  padding:4px 12px calc(18px + env(safe-area-inset-bottom)); }
.lh-list-wrap[hidden], .lh-detail[hidden] { display:none !important; }
.lh-region-note { margin:2px 0 8px; color:#9fb0c3; font-size:12px; line-height:1.5; }
.lh-empty { margin:8px 0; padding:10px; border:1px dashed #33465b; border-radius:10px; color:#a7b6c8; font-size:13px; line-height:1.5; }
.lh-list { list-style:none; margin:0; padding:0; display:grid; gap:10px; }
.lh-card { display:grid; gap:4px; min-width:0; padding:10px 12px; border:1px solid #263445; border-left-width:3px; border-radius:12px; background:#111a24; }
.lh-card[data-region="KR"] { border-left-color:#38bdf8; }
.lh-card[data-region="NK"] { border-left-color:#f97316; }
.lh-card[data-region="OVERSEAS"] { border-left-color:#a78bfa; }
.lh-vehicle-line { display:flex; flex-wrap:wrap; align-items:center; gap:4px 8px; min-width:0; margin:0; }
.lh-vehicle { color:#fff; font-size:15px; line-height:1.35; }
.lh-chip { display:inline-block; max-width:100%; padding:1px 8px; border:1px solid #3a4b5e; border-radius:999px; background:#18222e; color:#d6e2ee; font-size:11.5px;
  font-weight:600; line-height:1.55; vertical-align:middle; white-space:normal; }
.lh-ns.is-official { border-color:#2f855a; background:#0f2a1c; color:#bbf7d0; }
.lh-ns.is-quoted { border-color:#2b6cb0; background:#0f2236; color:#bfdbfe; }
.lh-ns.is-multi { border-color:#b7791f; background:#2a1e09; color:#fde68a; }
.lh-ns.is-estimate { border-color:#c05621; background:#2a1409; color:#fed7aa; }
.lh-ns.is-unknown { border-color:#4a5568; background:#1a202c; color:#cbd5e0; }
.lh-stale { border-color:#b45309; background:#2b1a06; color:#fcd34d; }
.lh-life, .lh-sig-state { border-color:#4b5f7a; background:#16202c; color:#cfe0f2; }
.lh-card-title, .lh-headline, .lh-when, .lh-site, .lh-status, .lh-facts, .lh-meta, .lh-sim-note { margin:0; color:#c9d6e3; font-size:12.5px; line-height:1.5; }
.lh-card-title { color:#e6edf5; font-weight:600; }
.lh-headline { color:#aebdcd; }
.lh-when { color:#e8f1ff; font-variant-numeric:tabular-nums; }
.lh-meta, .lh-sim-note { color:#93a4b8; font-size:11.5px; }
.lh-actions, .lh-detail-actions { display:flex; flex-wrap:wrap; gap:6px; margin-top:4px; }
.lh-actions .lh-btn, .lh-detail-actions .lh-btn { flex:1 1 auto; min-width:0; }
.lh-open-detail { border-color:#f97316; background:#2a1709; color:#ffedd5; font-weight:700; }
.lh-sim, .lh-act-sim:not(:disabled) { border-color:#38bdf8; background:#0b2233; color:#e0f2fe; }
.lh-seismic { margin:0 0 10px; padding:8px 10px; border:1px solid #4b3a5a; border-radius:10px; background:#141019; }
.lh-block-title { margin:0 0 2px; color:#e9d5ff; font-size:13px; }
.lh-signal-list { list-style:none; display:grid; gap:6px; margin:6px 0 0; padding:0; }
.lh-signal { padding:6px 8px; border:1px solid #2f3e50; border-radius:8px; background:#101822; }
.lh-signal-head, .lh-signal-meta, .lh-signal-note { margin:0; font-size:12px; line-height:1.5; }
.lh-signal-meta { color:#a7b6c8; }
.lh-signal-note { color:#f1dfb3; }
.lh-detail { display:grid; gap:10px; min-width:0; padding-top:2px; }
.lh-detail-top { display:flex; flex-wrap:wrap; align-items:center; gap:6px 10px; }
.lh-back { flex:none; }
.lh-detail-region { color:#9fb0c3; font-size:12px; }
.lh-detail-title { margin:0; font-size:17px; line-height:1.35; }
.lh-detail-title:focus, .lh-section-title:focus { outline:none; }
.lh-act-note { margin:0; color:#93a4b8; font-size:11.5px; line-height:1.5; }
.lh-section { min-width:0; padding:10px 12px; border:1px solid #223041; border-radius:12px; background:#0f1822; scroll-margin-top:6px; }
.lh-section-title { margin:0 0 6px; color:#cfe0f2; font-size:14px; }
.lh-dl { display:grid; gap:4px; margin:0; font-size:12.5px; line-height:1.5; }
.lh-dl-row { display:grid; grid-template-columns:minmax(84px, min(32%, 168px)) minmax(0, 1fr); gap:8px; min-width:0; }
.lh-dl dt { color:#8d9bad; }
.lh-dl dd { min-width:0; margin:0; color:#e1e9f2; }
.lh-src-refs { display:inline-flex; flex-wrap:wrap; gap:4px; vertical-align:middle; }
.lh-src-ref { min-height:28px; padding:2px 8px; border-color:#3b5470; border-radius:999px; background:#132131; color:#9fd4ff; font-size:11px; }
.lh-nosrc { color:#7f8ea1; font-size:11px; }
.lh-sub { margin-top:8px; padding-top:8px; border-top:1px dashed #263445; }
.lh-sub-title { margin:0 0 4px; color:#cfe0f2; font-size:12.5px; }
.lh-stages, .lh-notes, .lh-supports, .lh-per-source { display:grid; gap:3px; margin:0; padding-left:18px; color:#c9d6e3; font-size:12px; line-height:1.5; }
.lh-per-source { list-style:none; gap:6px; padding-left:0; }
.lh-per-row { padding:6px 8px; border:1px solid #223041; border-radius:8px; background:#111a24; }
.lh-per-head, .lh-per-line { margin:0; font-size:12px; line-height:1.5; }
.lh-per-line { color:#aebdcd; }
.lh-control-row { margin:0; font-size:12.5px; line-height:1.5; }
.lh-rule { margin:4px 0 0; padding:4px 8px; border-left:3px solid #c99a3a; background:#16140e; color:#f1dfb3; font-size:12px; font-weight:700; }
.lh-note { margin:6px 0 0; color:#9fb0c3; font-size:11.5px; line-height:1.5; }
.lh-life-box { margin:6px 0; padding:6px 8px; border:1px solid #2f3e50; border-radius:8px; background:#101822; }
.lh-life-head { margin:0; color:#e6edf5; font-size:12.5px; font-weight:700; }
.lh-related, .lh-sources { list-style:none; display:grid; gap:6px; margin:0; padding:0; }
.lh-rel { display:grid; gap:2px; }
.lh-rel-open { width:100%; font-size:13px; text-align:left; }
.lh-rel-meta { margin:0; color:#93a4b8; font-size:11.5px; }
.lh-source { display:grid; gap:2px; padding:6px 8px; border:1px solid #223041; border-left-width:3px; border-radius:8px; background:#111a24; }
.lh-source:focus { outline:2px solid #9bd6ff; outline-offset:1px; }
.lh-source.kind-official { border-left-color:#2f855a; }
.lh-source.kind-agency { border-left-color:#2b6cb0; }
.lh-source.kind-media { border-left-color:#4a5568; }
.lh-source-head, .lh-source-title, .lh-source-meta { margin:0; font-size:12px; line-height:1.5; }
.lh-source-title { color:#dbe6f2; }
.lh-source-meta, .lh-supports { color:#93a4b8; }
.lh-src-kind { font-size:11px; }
.lh-link { color:#8cc4ff; text-decoration:underline; text-underline-offset:2px; }
@media (min-width:900px) {
  .lh-root { align-items:center; }
  .lh-panel { height:min(88dvh, 900px); border-bottom:1px solid #2a3a4c; border-radius:14px; box-shadow:0 18px 50px rgba(0, 0, 0, .55); }
}
@media (max-width:400px) {
  .lh-tabs { gap:5px; padding:6px 10px 4px; }
  .lh-tab { padding:4px; font-size:13.5px; }
  .lh-body { padding-left:10px; padding-right:10px; }
  .lh-dl-row { grid-template-columns:minmax(72px, 34%) minmax(0, 1fr); }
}

/* v2.9.34 요약 단일 출처 — 오늘 3줄·종합 브리핑·전체 분석이 같은 사건 목록(js/summary-source.js)을 같은 제목으로 보인다. */
.summary-scope { margin: 0; font-size: 10.5px; color: var(--text-dim); line-height: 1.4; }
.summary-events { counter-reset: summary-event; list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.summary-event { counter-increment: summary-event; position: relative; display: flex; flex-direction: column; gap: 3px; min-width: 0; padding: 0 0 7px 26px; border-bottom: 1px solid var(--border); }
.summary-event::before { content: counter(summary-event); position: absolute; left: 0; top: 1px; width: 18px; height: 18px; display: grid; place-items: center; border-radius: 50%; background: #2c3b4d; color: #d9e6f2; font-size: 10px; font-weight: 800; }
.summary-event-tags { display: flex; flex-wrap: wrap; gap: 4px; min-width: 0; }
.summary-tag { padding: 1px 6px; border: 1px solid #4b5d72; border-radius: 999px; color: #b9cadb; font-size: 9.5px; line-height: 1.5; white-space: nowrap; }
.summary-tag.is-today { border-color: #75baff; background: rgba(117, 186, 255, .14); color: #cfe7ff; font-weight: 700; }
.summary-tag.status-confirmed { border-color: #3f8f6b; color: #a9e3c7; }
.summary-tag.status-reported { border-color: #8a6d3b; color: #f0d7a6; }
.summary-event-headline { width: 100%; min-width: 0; margin: 0; padding: 0; border: 0; background: none; color: var(--text); text-align: left; font-family: inherit; font-size: 13px; font-weight: 600; line-height: 1.45; cursor: pointer; overflow-wrap: anywhere; }
.summary-event-headline:hover { text-decoration: underline; }
.summary-event-meta, .summary-analysis-why, .summary-analysis-change { margin: 0; font-size: 10.5px; line-height: 1.45; color: var(--text-dim); overflow-wrap: anywhere; }
.summary-event-sources { display: flex; flex-wrap: wrap; gap: 3px 8px; margin: 0; font-size: 10.5px; line-height: 1.45; min-width: 0; }
.summary-event-sources-label { color: var(--text-dim); }
.summary-event-sources a { color: #9fc9ec; overflow-wrap: anywhere; }
.summary-empty { margin: 0; font-size: 12.5px; line-height: 1.5; }
.summary-empty p { margin: 0; }
.summary-empty-note { display: block; margin-top: 2px; font-size: 10.5px; color: var(--text-dim); }
.summary-analysis { display: flex; flex-direction: column; gap: 0; }
.summary-analysis-event { display: flex; flex-direction: column; gap: 4px; min-width: 0; padding: 10px 0; border-bottom: 1px solid #293645; }
.summary-analysis-event .summary-event-headline.judgment-row { display: block; padding: 0; border: 0; font-size: 12.5px; }
.summary-analysis-actions { display: flex; flex-wrap: wrap; gap: 6px; }
.summary-analysis-map { padding: 5px 9px; border: 1px solid #486783; border-radius: 7px; background: #1a2a38; color: #add3ec; font-family: inherit; font-size: 11px; cursor: pointer; }
.summary-analysis-articles { font-size: 11px; }
.summary-analysis-articles > summary { cursor: pointer; color: #8fa0b4; }
.summary-analysis-article { display: block; width: 100%; padding: 4px 0; border: 0; background: none; color: #c7d2e0; text-align: left; font-family: inherit; font-size: 11px; line-height: 1.45; cursor: pointer; overflow-wrap: anywhere; }
.brief-story-event { margin: 0 0 2px; font-size: 10px; color: #8fb4d6; }

/* v2.9.34 우주·위성 강화 */
/* [우주·위성] → [우주 기상·천체](js/space-view.js) — 분류 칩 · 확인 단계(공식 발표/공식 인용 보도/언론 보도/사전 공개 논문(미검증)) ·
   보도 속 수치 · 접히는 [쉽게 설명] · 용어 모음. 탭·칩·설명 열기 누르는 영역 44px · 가로 넘침 0. 모든 선택자는 .sp- 로 시작한다. */
.sp-tab { min-height:44px; white-space:normal; line-height:1.2; text-align:center; }
.sp-nuri-sim, .sp-go-missile { min-height:44px; }
.sp-cat.cat-space_weather, .sp-cat.cat-solar_activity { background:#3a2a0e; color:#ffe1a1; }
.sp-cat.cat-near_earth_object { background:#2a1f3a; color:#e3d2ff; }
.sp-cat.cat-astronomy_discovery, .sp-cat.cat-planetary_science { background:#14284a; color:#cfe2ff; }
.sp-cat.cat-earth_observation { background:#0f2f2a; color:#bff7ee; }
.sp-cat.cat-military_space { background:#3a1717; color:#ffc9c9; }
.sp-conf.conf-official { background:#173826; color:#b8f0cc; }
.sp-conf.conf-official_quoted { background:#2a2a12; color:#f3e6a6; }
.sp-conf.conf-media { background:#1b2a3a; color:#cfe0f2; }
.sp-conf.conf-preprint { background:#3a1f2e; color:#ffc6e0; box-shadow:inset 0 0 0 1px #b86a92; }
.sp-finding { padding:1px 7px; border:1px solid #3d4d60; border-radius:999px; background:#1a2430; color:#dbe6f2; font-size:11px; }
.sp-finding.finding-official_result { border-color:#2f855a; color:#bbf7d0; }
.sp-finding.finding-quoted_result { border-color:#2b6cb0; color:#bfdbfe; }
.sp-finding.finding-observation, .sp-finding.finding-preprint, .sp-finding.finding-media_claim { border-color:#b7791f; color:#fde68a; }
.sp-facts { margin:0; color:#e8f1ff; font-size:12px; line-height:1.45; font-variant-numeric:tabular-nums; overflow-wrap:anywhere; }
.sp-explain { min-width:0; margin:2px 0 0; border-top:1px dashed var(--border); }
.sp-explain-sum { display:flex; align-items:center; gap:6px; min-height:44px; color:#9fd4ff; font-size:12.5px; font-weight:700; cursor:pointer; }
.sp-explain-sum:focus-visible { outline:2px solid #9bd6ff; outline-offset:2px; }
.sp-explain-term { margin:6px 0 0; color:#ffd9b0; font-size:12px; font-weight:700; }
.sp-explain-p { margin:2px 0; color:#c9d6e3; font-size:12px; line-height:1.55; overflow-wrap:anywhere; }
.sp-explain[open] { padding-bottom:6px; }
.sp-sci-lead, .sp-sci-source, .sp-cat-explain { margin:0 0 8px; font-size:12px; line-height:1.5; overflow-wrap:anywhere; }
.sp-sci-lead { color:#c9d6e3; }
.sp-sci-source { padding:6px 8px; border-left:3px solid #c99a3a; background:#16140e; color:#f1dfb3; }
.sp-cat-explain { color:#a9c3dc; }
.sp-chips { display:flex; flex-wrap:wrap; gap:6px; min-width:0; margin:0 0 10px; }
.sp-chip { display:inline-flex; align-items:center; gap:6px; min-width:0; max-width:100%; min-height:44px; padding:6px 12px; border:1px solid #2c3d50; border-radius:999px;
  background:#132131; color:#cfe0f2; font:inherit; font-size:12.5px; font-weight:600; line-height:1.25; text-align:left; cursor:pointer; overflow-wrap:anywhere; touch-action:manipulation; }
.sp-chip.is-active { border-color:#ffb36b; background:#2a1d12; color:#fff1e0; }
.sp-chip.is-empty:not(.is-active) { opacity:.62; }
.sp-chip:focus-visible { outline:2px solid #9bd6ff; outline-offset:2px; }
.sp-chip-count { padding:0 6px; border-radius:999px; background:#22374d; color:#d6ecff; font-size:11px; font-weight:700; }
.sp-chip.is-active .sp-chip-count { background:#5a3a1c; color:#ffe2c2; }
.sp-glossary { display:grid; gap:6px; margin-top:14px; min-width:0; }
.sp-explain.sp-gloss { margin:0; padding:0 10px; border:1px solid var(--border); border-radius:9px; background:var(--card); }
@media (max-width:600px) {
  /* 휴대폰: 분류 칩은 한 줄 가로 넘기기(칩 영역 안에서만 — 페이지 가로 넘침 0) */
  .sp-chips { flex-wrap:nowrap; overflow-x:auto; overscroll-behavior-x:contain; scrollbar-width:thin; padding-bottom:4px; -webkit-overflow-scrolling:touch; }
  .sp-chip { flex:none; max-width:none; white-space:nowrap; }
}
/* 오늘 3줄 줄 안의 [번역] 토글은 사건 줄 버튼이 아니다 — 번호 원·카드 모양을 물려받지 않게 한다(예전부터 "1 번역"처럼 보이던 문제). */
.world-summary-line .tr-toggle { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; margin: 4px 0 0 42px; min-width: 0; }
.world-summary-line .tr-button { width: auto; display: inline-flex; align-items: center; margin: 0; padding: 3px 10px; border-radius: 999px; font-size: 11px; }
.world-summary-line .tr-button::before { content: none; }

/* v2.9.35 Brief Atlas 이전 — 예전 주소(sbh-conflict-news.pages.dev)에서만 보이는 새 주소 안내 띠(js/site-origin.js). 한 줄·작게, 닫으면 기기에 기억. */
.legacy-host-notice { display: flex; align-items: center; gap: 8px; padding: 3px 6px 3px 12px; background: #0f2a3a; border-bottom: 1px solid #1f4d66; color: #dbeefa; font-size: 12.5px; line-height: 1.35; }
.legacy-host-text { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; }
.legacy-host-link { flex: none; display: inline-flex; align-items: center; min-height: 32px; padding: 0 12px; border-radius: 999px; background: #145f86; color: #fff; font-weight: 700; text-decoration: none; white-space: nowrap; }
.legacy-host-link:focus-visible, .legacy-host-close:focus-visible { outline: 2px solid #9bd6ff; outline-offset: 2px; }
.legacy-host-close { position: relative; flex: none; width: 36px; height: 36px; border: 0; border-radius: 50%; background: none; color: #dbeefa; font-size: 15px; cursor: pointer; }
.legacy-host-close::after { content: ''; position: absolute; inset: -4px; } /* 누르는 영역 44px */
@media (max-width: 380px) { .legacy-host-notice { font-size: 12px; gap: 6px; } .legacy-host-link { padding: 0 10px; } }
