/* mapview.css — dark "Sonar" theme over light OSM raster tiles + ranked catalog markers.
   Shared by the homepage map and /map.html. Pairs with self-hosted Leaflet. */
.radar-wrap { width: 100%; max-width: 1440px; margin: 0 auto; padding: 14px 16px 28px; }
#lmap { width: 100%; height: 70vh; min-height: 460px; border-radius: 16px; background: #04140f;
  box-shadow: 0 0 0 2px rgba(0,255,140,.15), 0 24px 60px rgba(0,0,0,.4); }
/* Turn the light OSM basemap into a Sonar-green night map without a third-party dark-tile
   dependency. Filtering every individual raster tile produced intermittent black gaps when the
   homepage map used fractional zoom. Filtering the complete pane is visually identical, preserves
   labels, and gives Chromium one stable composited surface during pan/zoom. */
.leaflet-container .leaflet-tile-pane {
  filter: invert(1) hue-rotate(168deg) brightness(.82) contrast(.95) saturate(.6);
}
.leaflet-container .leaflet-tile-pane img.leaflet-tile { filter:none; mix-blend-mode:normal; }
.leaflet-container { background: #04140f; font: inherit; }
.leaflet-control-attribution { background: rgba(4,20,15,.75); color: #7fae97; }
.leaflet-control-attribution a { color: #9fe3c0; }
.leaflet-bar a { background: #0a2a20; color: #daffed; border-bottom-color: #0e3327; }
.leaflet-bar a:hover { background: #124b39; }

/* Live sonar sweep. It sits above tiles and below SVG deal markers/controls, never intercepts input. */
.sonar-map-sweep{position:absolute;z-index:350;inset:-38%;pointer-events:none;border-radius:50%;opacity:.16;
  background:
    repeating-radial-gradient(circle at 50% 50%,transparent 0 12%,rgba(70,255,159,.16) 12.2%,transparent 12.7% 24%),
    conic-gradient(from 0deg at 50% 50%,transparent 0 318deg,rgba(45,255,145,.02) 327deg,rgba(74,255,161,.35) 354deg,transparent 360deg);
  mix-blend-mode:screen;transform-origin:50% 50%;animation:sonarSweep 10s linear infinite}
@keyframes sonarSweep{to{transform:rotate(360deg)}}

/* Opportunity color is independent from location precision. SVG class = profit tier; the outline
   remains solid/dotted/dashed for source-area/approximate/capital-fallback provenance. */
.leaflet-overlay-pane path.sonar-opportunity-marker{transition:fill .18s ease,filter .18s ease,opacity .18s ease}
.leaflet-overlay-pane path.sonar-tier-gold{fill:#ffd54a!important;filter:drop-shadow(0 0 3px #fff3a5) drop-shadow(0 0 9px #ffbf00);
  animation:sonarGoldGlow 2.2s ease-in-out infinite}
.leaflet-overlay-pane path.sonar-tier-green{fill:#35d07f!important;filter:drop-shadow(0 0 6px rgba(18,184,102,.95))}
.leaflet-overlay-pane path.sonar-tier-red{fill:#ef6a6a!important;filter:drop-shadow(0 0 5px rgba(214,69,69,.85))}
.leaflet-overlay-pane path.sonar-geo-source{stroke-width:2.4px}
.leaflet-overlay-pane path.sonar-geo-approximate{stroke-dasharray:1 3}
.leaflet-overlay-pane path.sonar-geo-fallback{stroke-dasharray:4 3}
@keyframes sonarGoldGlow{0%,100%{filter:drop-shadow(0 0 3px #fff3a5) drop-shadow(0 0 7px #ffbf00)}
  50%{filter:drop-shadow(0 0 5px #fff8cb) drop-shadow(0 0 14px #ffbf00)}}

.map-opportunity-toolbar{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin:7px 0 10px;padding:8px 10px;
  border:1px solid rgba(27,160,95,.24);border-radius:12px;background:linear-gradient(120deg,rgba(4,20,15,.96),rgba(8,45,32,.94));
  color:#e8fff4;box-shadow:0 8px 24px rgba(4,20,15,.18)}
.map-opportunity-label{font-size:.78rem;font-weight:800;letter-spacing:.035em;white-space:nowrap}
.map-tier-buttons{display:inline-flex;align-items:center;gap:4px;padding:3px;border:1px solid rgba(220,255,237,.15);border-radius:999px;
  background:rgba(0,0,0,.18)}
.map-tier{display:inline-flex;align-items:center;gap:5px;min-height:34px;padding:5px 10px;border:1px solid transparent;border-radius:999px;
  background:transparent;color:#d8f7e7;font:700 .76rem/1 "Inter",system-ui,sans-serif;cursor:pointer;white-space:nowrap}
.map-tier::before{content:"";width:9px;height:9px;border-radius:50%;background:#d5e7dd;box-shadow:0 0 5px rgba(255,255,255,.5)}
.map-tier.gold::before{background:#ffd54a;box-shadow:0 0 9px #ffbf00}.map-tier.green::before{background:#35d07f;box-shadow:0 0 7px #12b866}
.map-tier.red::before{background:#ef6a6a;box-shadow:0 0 6px #d64545}.map-tier:hover{background:rgba(255,255,255,.08)}
.map-tier.on{border-color:rgba(255,255,255,.48);background:rgba(255,255,255,.14);color:#fff;box-shadow:inset 0 0 10px rgba(255,255,255,.06)}
.map-tier:focus-visible{outline:3px solid #7dd3fc;outline-offset:2px}
.map-valuation-context{margin-inline-start:auto;max-width:100%;padding:5px 9px;border-radius:8px;background:rgba(29,111,75,.32);
  color:#c8f9df;font-size:.72rem;font-weight:650;line-height:1.35}
.radar-legend .lg-outline::before{content:"◌";color:#64748b}

/* glowing score markers */
.mk { width: 30px; height: 30px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
  font: 700 12px/1 "Inter", system-ui, sans-serif; color: #04140f; cursor: pointer; transition: transform .12s; }
.mk:hover { transform: scale(1.28); }
.mk-gold { background: #ffd54a; box-shadow: 0 0 12px 2px #ffbf00, 0 0 0 2px rgba(255,213,74,.4); animation: mkpulse 2.4s ease-out infinite; }
.mk-green { background: #35d07f; box-shadow: 0 0 9px 1px #12b866; }
.mk-teal { background: #38bdf0; box-shadow: 0 0 8px 1px #1f9fd6; }
.mk-red { background: #ef6a6a; box-shadow: 0 0 7px 1px #d64545; }  /* inherit dark .mk text (#04140f): AA 6.2:1; white was 3.0:1 */
@keyframes mkpulse { 0% { box-shadow: 0 0 12px 2px #ffbf00, 0 0 0 0 rgba(255,191,0,.5) } 100% { box-shadow: 0 0 12px 2px #ffbf00, 0 0 0 15px rgba(255,191,0,0) } }
.mk-pop b { font-size: 14px } .mk-score { color: #0b7a35; font-weight: 600 } .mk-city { color: #64748b; font-size: 12px }
.mk-deal-pop p,.mk-cluster-pop p{margin:5px 0;line-height:1.35}
.mk-pop-market{color:#475569;font-size:12px}.mk-pop-price{display:block;margin-top:5px;font-size:16px;color:#0f172a}
.mk-pop-facts{color:#334155;font-size:12px}.mk-geo{padding:6px 8px;border-radius:7px;font-size:11px}
.mk-opportunity{display:grid;grid-template-columns:auto 1fr;gap:2px 8px;margin:7px 0;padding:7px 8px;border-radius:9px;border:1px solid}
.mk-opportunity strong{font-size:12px}.mk-opportunity span{font-size:12px;font-weight:800;text-align:end}
.mk-opportunity small{grid-column:1/-1;font-size:10.5px;line-height:1.35}
.mk-opportunity.gold{background:#fffbeb;border-color:#fbbf24;color:#78350f}.mk-opportunity.green{background:#ecfdf5;border-color:#34d399;color:#065f46}
.mk-opportunity.red{background:#fef2f2;border-color:#fca5a5;color:#991b1b}
.mk-margin-disclaimer,.mk-sample-note{margin:5px 0!important;color:#64748b;font-size:10.5px!important;line-height:1.35}
.mk-cluster-mix{font-weight:800;color:#334155;font-size:11.5px}
.mk-geo.precise{background:#fffbeb;border:1px solid #fde68a;color:#854d0e}
.mk-geo.approximate{background:#eff6ff;border:1px solid #bae6fd;color:#075985}
.mk-geo.capital-fallback{background:#f0fdf4;border:1px dashed #22c55e;color:#166534}
.mk-cluster-item{display:block;width:100%;margin-top:5px;padding:6px 7px;text-align:start;border:1px solid #dbe5df;
  border-radius:7px;background:#fff;color:#0f172a;font:600 11.5px/1.3 "Inter",system-ui,sans-serif;cursor:pointer}
.mk-cluster-item:hover,.mk-cluster-item:focus-visible{border-color:#059669;background:#ecfdf5}
@media (prefers-reduced-motion: reduce) {
  .mk-gold,.sonar-map-sweep,.leaflet-overlay-pane path.sonar-tier-gold { animation: none }
  .sonar-map-sweep{display:none}
}

/* photo pins (featured deals): tier-framed thumbnail, partial zoom on hover (visual triage) */
.mkp{width:46px;height:46px;border-radius:12px;overflow:hidden;position:relative;cursor:pointer;
  border:2.5px solid #94a3b8;background:#04140f;transition:transform .16s ease;box-shadow:0 3px 10px rgba(0,0,0,.45)}
.mkp img{width:100%;height:100%;object-fit:cover;display:block}
.mkp .mkp-s{position:absolute;bottom:2px;right:2px;font:700 10px/1 "Inter",sans-serif;color:#04140f;
  background:rgba(255,255,255,.92);padding:2px 4px;border-radius:5px}
.mkp.mk-gold{border-color:#ffd54a;box-shadow:0 0 14px 3px rgba(255,191,0,.8);animation:mkpulse 2.4s ease-out infinite}
.mkp.mk-gold .mkp-s{background:#ffd54a}
.mkp.mk-green{border-color:#35d07f;box-shadow:0 0 10px 2px rgba(18,184,102,.7)}
.mkp.mk-teal{border-color:#38bdf0;box-shadow:0 0 8px 2px rgba(31,159,214,.6)}
.mkp.mk-red{border-color:#ef6a6a;box-shadow:0 0 7px 1px rgba(214,69,69,.55)}
.mkp:hover{transform:scale(1.8)}
.mk-wrap:hover{z-index:9999 !important}
@media (prefers-reduced-motion: reduce){.mkp{transition:none}.mkp.mk-gold{animation:none}}

/* popup profit line */
.mk-prof.pos{color:#0f7b3f;font-weight:700}
.mk-prof.neg{color:#b91c1c;font-weight:700}

.map-explore-hint{margin:.8rem 0 0;color:var(--body,#475569);font-size:.92rem;font-weight:600}
.map-popup-show{margin-top:8px;border:1px solid #059669;background:#ecfdf5;color:#047857;border-radius:7px;
  padding:6px 9px;font:600 12px/1.2 "Inter",system-ui,sans-serif;cursor:pointer}
.map-popup-show:hover,.map-popup-show:focus-visible{background:#059669;color:#fff}
.map-deals{margin:1.1rem 0 1.4rem;padding:18px;border:1px solid var(--border,#e2e8f0);border-radius:16px;background:#fff;
  box-shadow:0 14px 35px rgba(15,23,42,.08)}
.map-deals[hidden]{display:none}
.map-deals-head{display:flex;align-items:flex-end;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-bottom:8px}
.map-deals-head h2{margin:3px 0 0;font-size:1.3rem;color:var(--ink,#0f172a)}
.map-deals-kicker{text-transform:uppercase;letter-spacing:.08em;color:#047857;font-size:.7rem;font-weight:800}
.map-deals-status{min-height:1.3em;margin:4px 0 13px;color:var(--muted,#64748b);font-size:.88rem}
.map-deals-status[data-state="ok"]{color:#047857}.map-deals-status[data-state="error"]{color:#b91c1c}
.map-deals-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
.map-deal{display:flex;flex-direction:column;gap:8px;min-width:0;padding:14px;border:1px solid var(--border,#e2e8f0);
  border-radius:13px;background:var(--surface,#fff)}
.map-deal-top{display:flex;align-items:center;justify-content:space-between;gap:8px}
.map-deal-score{display:inline-flex;background:#dcfce7;color:#166534;border:1px solid #bbf7d0;border-radius:999px;
  padding:3px 8px;font-size:.72rem;font-weight:800}
.map-deal-market{color:var(--muted,#64748b);font-size:.75rem;font-weight:600}
.map-deal h3{margin:0;color:var(--ink,#0f172a);font-size:1rem;line-height:1.35;overflow-wrap:anywhere}
.map-deal-facts{margin:0;color:var(--muted,#64748b);font-size:.8rem;line-height:1.4;min-height:1.1em}
.map-deal-value{display:flex;align-items:baseline;justify-content:space-between;gap:8px;flex-wrap:wrap;margin-top:auto}
.map-deal-value strong{font-size:1.12rem;color:var(--ink,#0f172a)}
.map-deal-value span{font-size:.74rem;color:#047857;font-weight:700}
.map-deal-open{display:block;margin-top:3px;text-align:center;text-decoration:none}
@media(max-width:900px){.map-deals-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:600px){
  #lmap{height:58vh;min-height:390px;border-radius:12px}
  .radar-wrap{padding-inline:10px}
  .map-deals{padding:13px}.map-deals-grid{grid-template-columns:1fr}
  .map-deals-head{align-items:flex-start}.map-deals-head .btn{width:100%;text-align:center}
  .map-opportunity-toolbar{position:relative;gap:7px;padding:7px;margin-bottom:8px}
  .map-opportunity-label{width:100%}.map-tier-buttons{max-width:100%;overflow-x:auto;scrollbar-width:none}
  .map-tier-buttons::-webkit-scrollbar{display:none}.map-tier{min-height:36px;padding-inline:9px}
  .map-valuation-context{width:100%;margin-inline-start:0}
}
