/* ============================================================
 * Neerslag.info — opmaak
 *
 * De indeling volgt die van WBV Draw: een vaste zijbalk met tabbladen naast een
 * kaart die de rest van het scherm vult. Eén onderwerp tegelijk in beeld, de
 * kaart altijd zichtbaar — je tekent immers óp die kaart.
 *
 * De kleuren van de grafiek staan bewust apart onderaan, bij de grafiek zelf:
 * dat zijn geen huisstijlkleuren maar meetkleuren, gekozen op leesbaarheid en
 * kleurenblindheid, en die horen niet met de knoppen mee te veranderen.
 * ============================================================ */

:root{
  --bg:#f4f6f8; --panel:#ffffff; --ink:#1c2733; --muted:#6b7b8c;
  --line:#dce3ea; --brand:#2a78d6; --brand-d:#1c5cab; --danger:#c62828;
  --ok:#0ca30c; --waarschuw:#e07000;
  --sidebar-w:340px;
}
*{box-sizing:border-box}
html,body{margin:0;height:100%;font-family:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  color:var(--ink);background:var(--bg);-webkit-text-size-adjust:100%}
#app{display:flex;height:100dvh;width:100%}

/* ---------- Zijbalk ---------- */
#sidebar{width:var(--sidebar-w);flex:0 0 var(--sidebar-w);height:100%;overflow:hidden;
  background:var(--panel);border-right:1px solid var(--line);display:flex;flex-direction:column;
  transition:width .18s ease,flex-basis .18s ease}
#app.side-collapsed #sidebar{width:0;flex-basis:0;border-right:none}
#app.side-collapsed .side-head,#app.side-collapsed .side-tabs,
#app.side-collapsed .side-body,#app.side-collapsed .side-foot{display:none}

.side-head{padding:10px 14px 12px;background:var(--brand);color:#fff;flex:0 0 auto}
.side-brand{display:flex;align-items:baseline;gap:8px}
.side-head h1{margin:0;font-size:19px;letter-spacing:.3px;font-weight:600}
.side-head h1 span{opacity:.7;font-weight:400}
.side-collapse{margin-left:auto;background:rgba(255,255,255,.16);border:none;color:#fff;cursor:pointer;
  width:22px;height:22px;border-radius:5px;font-size:14px;line-height:1;flex:0 0 auto}
.side-collapse:hover{background:rgba(255,255,255,.3)}
.side-head .search-wrap{margin-top:9px}
.side-head #search-input{border:none;background:rgba(255,255,255,.96);padding:7px 9px;font-size:13px}

/* Uitklapknop als de balk dicht is. Boven de Leaflet-bediening (die zit op
   z-index 1000), anders is de knop wel te zien maar vangt het zoomblokje
   eronder de klik — daarom schuiven de zoomknoppen ook omlaag. */
#btn-sidebar-show{position:absolute;top:10px;left:10px;z-index:1200;display:none;
  background:var(--brand);color:#fff;border:none;border-radius:6px;padding:7px 11px;
  font-size:13px;cursor:pointer;box-shadow:0 2px 8px rgba(0,0,0,.25)}
#btn-sidebar-show:hover{background:var(--brand-d)}
#app.side-collapsed #btn-sidebar-show{display:block}
#app.side-collapsed .leaflet-top.leaflet-left{margin-top:38px}

.side-tabs{display:flex;flex:0 0 auto;background:#f7f9fb;border-bottom:1px solid var(--line)}
.side-tabs .tab{position:relative;flex:1 1 0;min-width:0;border:none;background:none;cursor:pointer;
  padding:7px 2px 6px;display:flex;flex-direction:column;align-items:center;gap:2px;
  color:var(--muted);border-bottom:2px solid transparent}
.side-tabs .tab .ic{font-size:16px;line-height:1}
.side-tabs .tab .tl{font-size:10px}
.side-tabs .tab:hover{background:#eef3f8;color:var(--ink)}
.side-tabs .tab.active{color:var(--brand);border-bottom-color:var(--brand);background:#fff;font-weight:600}
.tab-badge{position:absolute;top:3px;right:calc(50% - 18px);min-width:15px;height:15px;padding:0 3px;
  border-radius:8px;background:var(--danger);color:#fff;font-size:9px;line-height:15px;text-align:center;font-weight:700}

.side-body{flex:1 1 auto;overflow-y:auto;min-height:0}
.tabpane{display:none}
.tabpane.active{display:block}
.side-foot{flex:0 0 auto;border-top:1px solid var(--line);padding:6px 14px;background:#f7f9fb;
  font-size:11px;color:var(--muted);min-height:26px;line-height:14px}

.panel{padding:12px 16px;border-bottom:1px solid var(--line)}
.panel:last-child{border-bottom:none}
.panel h2{margin:0 0 8px;font-size:13px;text-transform:uppercase;letter-spacing:.4px;color:var(--muted);
  display:flex;align-items:center;justify-content:space-between;gap:6px}

/* ---------- Formulier ---------- */
.fld{display:block;font-size:12px;color:var(--muted);margin-bottom:8px}
.fld input,.fld select,.fld textarea{display:block;width:100%;margin-top:3px;padding:7px 8px;
  border:1px solid var(--line);border-radius:6px;font-size:14px;color:var(--ink);font-family:inherit;background:#fff}
.fld textarea{resize:vertical}
.fld-row{display:flex;gap:8px;align-items:flex-end}
.fld-row .fld{flex:1 1 0;min-width:0}
.fullw{width:100%;padding:7px 8px;border:1px solid var(--line);border-radius:6px;font-size:14px;background:#fff;font-family:inherit;color:var(--ink)}
input[type=color]{width:100%;height:32px;padding:0 2px;border:1px solid var(--line);border-radius:5px;background:#fff;cursor:pointer}
.uitlees{display:block;margin-top:3px;padding:7px 8px;font-size:14px;color:var(--ink);
  font-variant-numeric:tabular-nums}
.chk{display:flex;align-items:flex-start;gap:6px;font-size:13px;margin:6px 0;cursor:pointer;line-height:1.35}
.chk input{margin-top:2px;flex:0 0 auto}

.btn-row{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:6px}
.btn{flex:1 1 auto;padding:7px 10px;border:1px solid var(--line);background:#fff;border-radius:6px;
  font-size:13px;cursor:pointer;color:var(--ink);white-space:nowrap;font-family:inherit}
.btn:hover{background:#eef3f8}
.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}
.btn.primary:hover{background:var(--brand-d)}
.btn.danger{color:var(--danger);border-color:#e6b3b3;flex:0 0 auto}
.btn.danger:hover{background:#fbeaea}
.btn[disabled]{opacity:.5;cursor:not-allowed}
/* Een knop die op een kaartklik staat te wachten hoort dat te laten zien —
   anders klik je op de kaart zonder te weten wat er gaat gebeuren. */
.btn.aan{background:var(--waarschuw);border-color:var(--waarschuw);color:#fff;
  animation:knop-klop 1.6s ease-in-out infinite}
.btn.aan:hover{background:#b85800}
@keyframes knop-klop{0%,100%{box-shadow:0 0 0 0 rgba(224,112,0,.45)}50%{box-shadow:0 0 0 5px rgba(224,112,0,0)}}
.mini{border:none;background:#eef3f8;border-radius:5px;min-width:22px;height:22px;cursor:pointer;
  font-size:14px;line-height:1;color:var(--brand);padding:0 4px}
.mini:hover{background:#dce8f5}
.hint{font-size:11px;color:var(--muted);margin:4px 0 0;line-height:1.45}
.leeg{font-size:12px;color:var(--muted);margin:6px 0;line-height:1.45;font-style:italic}

details.tip{margin-top:8px}
details.tip>summary{font-size:11px;color:var(--brand);cursor:pointer;list-style:none;
  display:inline-flex;align-items:center;gap:4px;user-select:none}
details.tip>summary::-webkit-details-marker{display:none}
details.tip>summary::before{content:'ⓘ'}
details.tip>summary:hover{text-decoration:underline}
details.tip p{font-size:11px;color:var(--muted);margin:5px 0 0;line-height:1.5}

/* ---------- Zoeken ---------- */
.search-wrap{position:relative}
#search-input{width:100%;padding:8px;border:1px solid var(--line);border-radius:6px;font-size:14px}
.search-results{list-style:none;margin:2px 0 0;padding:0;position:absolute;left:0;right:0;z-index:1300;
  background:#fff;border:1px solid var(--line);border-radius:6px;max-height:260px;overflow-y:auto;
  box-shadow:0 6px 20px rgba(0,0,0,.18)}
.search-results:empty{display:none}
.search-results li{padding:7px 10px;font-size:13px;cursor:pointer;border-bottom:1px solid #f0f3f6;color:var(--ink)}
.search-results li:last-child{border-bottom:none}
.search-results li:hover,.search-results li.sel{background:#eef3f8}
.search-results li .typ{font-size:11px;color:var(--muted);margin-left:6px}

/* ---------- Lijsten (gebieden, regels, meldingen, ontvangers) ---------- */
.lijst{list-style:none;margin:0;padding:0}
.lijst li{display:flex;align-items:center;gap:9px;padding:9px 4px;border-bottom:1px solid var(--line)}
.lijst li:last-child{border-bottom:none}
.lijst.compact li{padding:6px 4px}
.lijst .vlag{width:10px;height:10px;border-radius:3px;flex:0 0 10px}
.lijst .midden{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:1px;cursor:pointer}
.lijst .nm{display:block;font-size:13.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lijst .sub{display:block;font-size:11px;color:var(--muted);line-height:1.35}
.lijst li.gekozen{background:#eef4fb;border-radius:6px}
.lijst li.gekozen .nm{color:var(--brand-d)}
.lijst .acties{display:flex;gap:3px;flex:0 0 auto}

/* Aan/uit-schakelaar van een regel: de stand moet je van een meter afstand
   kunnen zien, want dat is het enige wat bepaalt of je bericht krijgt. */
.schakel{position:relative;width:34px;height:19px;flex:0 0 34px;border:none;border-radius:10px;
  background:#c7d0d9;cursor:pointer;transition:background .15s;padding:0}
.schakel::after{content:'';position:absolute;top:2px;left:2px;width:15px;height:15px;border-radius:50%;
  background:#fff;transition:transform .15s;box-shadow:0 1px 3px rgba(0,0,0,.3)}
.schakel[aria-checked=true]{background:var(--ok)}
.schakel[aria-checked=true]::after{transform:translateX(15px)}

.merk{display:inline-block;font-size:10px;padding:1px 6px;border-radius:9px;background:#eef3f8;
  color:var(--muted);font-weight:600;letter-spacing:.02em;white-space:nowrap;align-self:flex-start;flex:0 0 auto}
.merk.aan{background:#e6f5e6;color:#0a7a0a}
.merk.uit{background:#f0f2f4;color:var(--muted)}
.merk.raak{background:#fdeeee;color:var(--danger)}

/* ---------- Meldingen ---------- */
.meld{display:block;padding:10px 4px;border-bottom:1px solid var(--line);cursor:pointer}
.meld:last-child{border-bottom:none}
.meld .kop{display:flex;align-items:baseline;gap:8px}
.meld .waarde{font-size:15px;font-weight:700;color:var(--brand-d);font-variant-numeric:tabular-nums;flex:0 0 auto}
.meld .waar{font-size:12.5px;font-weight:600;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.meld .klok{font-size:11px;color:var(--muted);flex:0 0 auto}
.meld .tekst{font-size:12px;color:#3d4b59;margin-top:3px;line-height:1.45}
.meld .voet{font-size:10.5px;color:var(--muted);margin-top:4px;display:flex;gap:8px;flex-wrap:wrap}
.meld.ongelezen{background:#f5f9fe;border-left:3px solid var(--brand);padding-left:8px;border-radius:0 6px 6px 0}

/* ---------- Kaart ---------- */
#map-wrap{flex:1;position:relative;min-width:0}
#map{position:absolute;inset:0}
.leaflet-container{background:#dfe6ec;font:inherit}
.leaflet-popup-content{font-size:13px;margin:10px 12px}
/* Naamplaatje midden in een gebied. Geen ballon: alleen de tekst, met een
   witte gloed eromheen zodat hij op een luchtfoto óók leesbaar is. */
.leaflet-tooltip.gebied-naam{background:none;border:none;box-shadow:none;padding:0;
  font-size:12px;font-weight:700;color:#0b2233;white-space:nowrap;
  text-shadow:0 0 3px #fff,0 0 3px #fff,0 0 3px #fff,0 0 3px #fff}
.leaflet-tooltip.gebied-naam:before{display:none}

.radar-regel{display:flex;align-items:center;gap:8px;margin-top:4px;font-size:12px;color:var(--muted)}
.radar-regel #radar-label{font-variant-numeric:tabular-nums}

/* ---------- Modal ---------- */
.modal-bg{position:fixed;inset:0;background:rgba(15,25,35,.45);z-index:2000;display:flex;
  align-items:center;justify-content:center;padding:20px}
.modal{background:#fff;border-radius:10px;max-width:640px;width:100%;max-height:88vh;
  display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(0,0,0,.3)}
.modal h3{margin:0;padding:14px 18px;border-bottom:1px solid var(--line);font-size:16px;flex:0 0 auto}
.modal .body{padding:16px 18px;overflow-y:auto;flex:1 1 auto}
.modal .foot{padding:12px 18px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;
  gap:8px;background:#fff;flex:0 0 auto;flex-wrap:wrap}
.modal .foot .links{margin-right:auto}
.modal input[type=text],.modal input[type=number],.modal input[type=time],.modal select,.modal textarea{
  padding:6px 8px;border:1px solid var(--line);border-radius:6px;font-size:13px;width:100%;
  font-family:inherit;color:var(--ink);background:#fff}
.rooster2{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.rooster3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px}
.veld{display:block;font-size:12px;color:var(--muted);margin-bottom:10px}
.veld>span{display:block;margin-bottom:3px}
.blok{border:1px solid var(--line);border-radius:8px;padding:12px 14px;margin-bottom:12px}
.blok>h4{margin:0 0 4px;font-size:12px;text-transform:uppercase;letter-spacing:.4px;color:var(--muted)}
.blok>.hint{margin-bottom:10px}
.dagen{display:flex;gap:4px}
.dagen label{flex:1 1 0;text-align:center;font-size:11px;border:1px solid var(--line);border-radius:6px;
  padding:5px 0;cursor:pointer;user-select:none;background:#fff}
.dagen input{display:none}
.dagen label.aan{background:var(--brand);border-color:var(--brand);color:#fff;font-weight:600}

/* ---------- Toast ---------- */
#toast{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);z-index:3000;
  display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none}
.toast-msg{background:#243342;color:#fff;padding:10px 16px;border-radius:8px;font-size:13px;
  box-shadow:0 6px 20px rgba(0,0,0,.25);animation:tin .2s ease;max-width:min(90vw,520px)}
.toast-msg.err{background:var(--danger)}
.toast-msg.ok{background:#1b7a1b}
@keyframes tin{from{opacity:0;transform:translateY(8px)}to{opacity:1}}

/* ============================================================
 * Grafiek — neerslag per uur
 *
 * Eén meetreeks (millimeter), twee toestanden: de uren die voor de gekozen
 * regel meetellen, en de uren die erbuiten vallen. Dat verschil is de hele
 * reden dat de grafiek er staat — je wilt kunnen zien dat die 4 mm van
 * vanavond níet meetelt in je venster van 07 tot 19.
 *
 * De kleuren zijn nagerekend op kleurenblindheid en op contrast met het witte
 * vlak (ΔE 13,4 protanoop; beide ≥ 3:1). Ze staan bewust los van de
 * huisstijlblauwen hierboven: die mogen veranderen, deze zijn een meetschaal.
 * Kleur is bovendien nooit het enige verschil — de meetellende uren staan ook
 * onder een gemerkte band, en de tabelweergave noemt het per uur.
 * ============================================================ */
.viz{--telt:#2a78d6;--buiten:#82909f;--band:rgba(42,120,214,.10);
  --raster:#e8edf2;--as:#96a3b0;--inkt:#1c2733;--inkt-2:#6b7b8c;
  position:relative;margin-top:6px}
.viz svg{display:block;width:100%;height:auto;overflow:visible}
.viz .staaf-telt{fill:var(--telt)}
.viz .staaf-buiten{fill:var(--buiten)}
.viz .band{fill:var(--band)}
.viz .raster{stroke:var(--raster);stroke-width:1}
.viz .as{stroke:var(--as);stroke-width:1}
.viz .drempel{stroke:#243342;stroke-width:1.5;stroke-dasharray:4 3}
.viz text{font-size:9.5px;fill:var(--inkt-2);font-family:inherit}
.viz text.merkje{font-size:9px;fill:var(--inkt);font-weight:600}
.viz .trefvlak{fill:transparent;cursor:pointer}
.viz .trefvlak:hover~.staaf-telt,.viz .trefvlak:hover{opacity:1}
.viz .aanwijs{fill:rgba(28,39,51,.06)}

.viz-legenda{display:flex;gap:12px;flex-wrap:wrap;font-size:11px;color:var(--muted);margin-top:6px}
.viz-legenda span{display:inline-flex;align-items:center;gap:5px}
.viz-legenda i{width:10px;height:10px;border-radius:2px;display:inline-block}

/* Zwevend tekstballonnetje bij de staaf waar je op wijst. */
.viz-ballon{position:absolute;z-index:5;pointer-events:none;background:#243342;color:#fff;
  border-radius:6px;padding:6px 9px;font-size:11.5px;line-height:1.45;white-space:nowrap;
  box-shadow:0 4px 14px rgba(0,0,0,.28);transform:translate(-50%,-100%);opacity:0;transition:opacity .1s}
.viz-ballon.aan{opacity:1}
.viz-ballon b{font-size:13px;font-variant-numeric:tabular-nums}
.viz-ballon .kl{color:#b9c7d4}

/* Het kopgetal boven de grafiek: hoeveel millimeter telt deze regel nu, en
   waar ligt de drempel. Dat is het antwoord; de grafiek is de onderbouwing. */
.kopgetal{display:flex;align-items:baseline;gap:8px;margin:2px 0 2px}
.kopgetal .groot{font-size:26px;font-weight:700;line-height:1.1;font-variant-numeric:tabular-nums}
.kopgetal .eenheid{font-size:13px;color:var(--muted)}
.kopgetal .tov{font-size:11.5px;color:var(--muted);margin-left:auto;text-align:right}
.kopgetal.raak .groot{color:var(--danger)}

.tabelknop{font-size:11px;color:var(--brand);background:none;border:none;cursor:pointer;padding:4px 0}
.tabelknop:hover{text-decoration:underline}
table.viz-tabel{width:100%;border-collapse:collapse;font-size:11.5px;margin-top:6px}
table.viz-tabel th,table.viz-tabel td{text-align:right;padding:3px 5px;border-bottom:1px solid var(--line);
  font-variant-numeric:tabular-nums}
table.viz-tabel th:first-child,table.viz-tabel td:first-child{text-align:left}
table.viz-tabel th{color:var(--muted);font-weight:600}
table.viz-tabel tr.buiten td{color:var(--muted)}

/* ---------- Smal scherm ----------
   Onder de 720 px staat de zijbalk niet naast maar ónder de kaart; een balk van
   340 px naast een kaart van 40 px helpt niemand. */
@media (max-width:720px){
  #app{flex-direction:column-reverse}
  #sidebar{width:100%;flex:1 1 auto;border-right:none;border-top:1px solid var(--line);max-height:58dvh}
  #map-wrap{flex:0 0 42dvh}
  #app.side-collapsed #sidebar{max-height:0;flex-basis:0}
  #app.side-collapsed #map-wrap{flex:1 1 auto}
  :root{--sidebar-w:100%}
}
