/* ===== 01_perusta.css ===== */
/* Kuitukartta-demo. Paletti on sama kuin muissa sisäisissä sovelluksissa. */
:root{
  --bg:#f4f7fa; --surface:#fff; --surface-2:#eef3f8; --border:#dce4ee; --border-strong:#c3d0e0;
  --ink:#1e2c3b; --ink-2:#4a5c70; --muted:#69798e;
  --navy:#003a5a; --blue:#2f6fd0; --green:#1c8a4d; --yellow:#b3790c; --red:#cd4335; --orange:#d1762b;
  --blue-soft:#e4edfb; --green-soft:#e2f3ea; --yellow-soft:#fbf1dc; --red-soft:#fae6e4;
  --paper:#fbfaf7; --paper-line:#b9c3cf; --paper-wall:#5a6878; --paper-ink:#2b3744;
  --shadow:0 1px 2px rgba(16,36,56,.06),0 6px 20px rgba(16,36,56,.06); --r:12px;
  --sans:"IBM Plex Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif;
  --mono:"IBM Plex Mono",ui-monospace,Menlo,monospace;
  --cond:"Barlow Condensed","IBM Plex Sans",system-ui,sans-serif;
}
*{box-sizing:border-box}
/* hidden-attribuutti tulee selaimen omasta tyylistä (display:none), jonka MIKÄ TAHANSA
   oma display-sääntö ohittaa. Siksi .muokkauspaneeli{display:flex} piti paneelit näkyvissä
   vaikka niissä oli hidden. Tämä sääntö palauttaa hidden-attribuutin merkityksen. */
[hidden]{display:none!important}
html,body{margin:0;height:100%}
body{background:var(--bg);color:var(--ink);font:400 15px/1.6 var(--sans);-webkit-font-smoothing:antialiased;
  display:flex;flex-direction:column}
h1,h2,h3{margin:0;letter-spacing:-.015em}
a{color:var(--blue)}

.ylapalkki{background:var(--navy);color:#fff;flex:none}
.ylapalkki .sisus{max-width:1320px;margin:0 auto;padding:10px 18px;display:flex;align-items:center;gap:12px 22px;flex-wrap:wrap}
.merkki{display:flex;align-items:center;gap:10px;color:#fff;text-decoration:none;font:600 15px var(--sans)}
.merkki .logo{width:30px;height:30px;border-radius:7px;background:#1a5a82;display:grid;place-items:center;
  font:700 12px var(--cond);letter-spacing:.06em}
.merkki small{display:block;font:500 11px var(--cond);letter-spacing:.14em;text-transform:uppercase;color:#9fc4dd}
.paanavi{display:flex;gap:4px}
.paanavi a{color:#c5dcec;text-decoration:none;font:500 14px var(--sans);padding:6px 11px;border-radius:7px}
.paanavi a:hover{background:rgba(255,255,255,.12);color:#fff}
.paanavi{min-width:0;max-width:100%;overflow-x:auto;scrollbar-width:none} .paanavi a{white-space:nowrap}
/* Asetukset-alavalikko (13.10.2026). Lista on position:fixed, koska navin overflow-x leikkaisi absoluuttisen
   listan; paikka asetetaan avattaessa (js/yhteinen.js). */
.navivalikko summary{list-style:none;cursor:pointer;color:#c5dcec;font:500 14px var(--sans);padding:6px 11px;border-radius:7px;white-space:nowrap}
.navivalikko summary::-webkit-details-marker{display:none}
.navivalikko summary::after{content:"";display:inline-block;margin-left:6px;border:4px solid transparent;border-top-color:currentColor;transform:translateY(2px)}
.navivalikko summary:hover,.navivalikko[open] summary,.navivalikko.nyt summary{background:rgba(255,255,255,.12);color:#fff}
.navivalikko-lista{position:fixed;z-index:3000;min-width:190px;background:#fff;border:1px solid var(--border);border-radius:9px;
  box-shadow:0 10px 28px rgba(0,30,50,.18);padding:6px;display:flex;flex-direction:column}
.paanavi .navivalikko-lista a{color:var(--ink);padding:8px 12px;border-radius:6px}
.paanavi .navivalikko-lista a:hover{background:var(--surface-2);color:var(--ink)}
.paanavi .navivalikko-lista button{appearance:none;border:0;background:none;text-align:left;cursor:pointer;
  color:var(--ink);font:500 14px var(--sans);padding:8px 12px;border-radius:6px}
.paanavi .navivalikko-lista button:hover{background:var(--surface-2)}
.paanavi .navivalikko-lista a[aria-current]{font-weight:600;color:var(--navy, #003a5a)}
.kayttaja{margin-left:auto;display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.knimi{font-size:13.5px;line-height:1.25}
.knimi small{display:block;font-size:11.5px;color:#9fc4dd}
a.knimi{color:inherit;text-decoration:none}

main.kuori{max-width:1320px;width:100%;margin:0 auto;padding:22px 18px 40px;flex:1}
main.tayte{flex:1;display:flex;flex-direction:column;min-height:0}
.alapalkki{background:var(--surface-2);border-top:1px solid var(--border);flex:none;
  color:var(--muted);font-size:12.5px}
.alapalkki .sisus{max-width:1320px;margin:0 auto;padding:14px 18px}

.nappi{appearance:none;border:1px solid var(--navy);background:var(--navy);color:#fff;border-radius:9px;
  padding:9px 14px;font:600 13.5px var(--sans);cursor:pointer;text-decoration:none;display:inline-block}
.nappi:hover{filter:brightness(1.15)}
/* Vaalea nappi on OLETUS, koska useimmat ovat vaalealla pinnalla. Tumman yläpalkin
   variantti rajataan siihen — aiemmin se oli toisin päin, ja .kuori-säiliön ulkopuolella
   (esim. kaappinäkymä) napit olivat valkoista tekstiä valkoisella. */
.nappi.kevyt{background:var(--surface);border-color:var(--border-strong);color:var(--ink)}
/* Leafletin .leaflet-container a -väri ohittaisi linkkinapin tekstin (sininen tummalla pohjalla) */
.leaflet-container a.nappi{color:#fff;text-decoration:none}.leaflet-container a.nappi.kevyt{color:var(--ink)}
.ylapalkki .nappi.kevyt{background:rgba(255,255,255,.14);border-color:rgba(255,255,255,.3);color:#fff}
.nappi[disabled]{opacity:.45;cursor:not-allowed}
.nappi.pieni{padding:6px 11px;font-size:12.5px}
.nappi.vaara{color:var(--red);border-color:#e8a59e}
.nappi.vaara:hover{background:var(--red);border-color:var(--red);color:#fff}
.tiedot-toiminnot .nappi.vaara{margin-top:14px}

.kortti{background:var(--surface);border:1px solid var(--border);border-radius:var(--r);padding:18px 20px;box-shadow:var(--shadow)}
.eyebrow{font:600 11.5px/1 var(--cond);letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}

/* kirjautuminen */
.kirjaudu{max-width:420px;margin:6vh auto 0}
.kirjaudu h1{font-size:26px;margin-bottom:6px}
.kirjaudu p.apu{color:var(--ink-2);font-size:14px;margin:0 0 18px}
.kentta-rivi{display:flex;flex-direction:column;gap:5px;margin-bottom:13px}
.kentta-rivi label{font:600 12px var(--cond);letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
/* :not(checkbox/radio) on olennainen: ilman sitä valintaruutu venyy rivin levyiseksi
   ja viereinen teksti puristuu parin kirjaimen sarakkeeksi. Tämä ehti tapahtua kerran. */
.kentta-rivi input:not([type="checkbox"]):not([type="radio"]),
.kentta-rivi select{padding:10px 12px;border:1px solid var(--border-strong);border-radius:9px;
  font:15px var(--sans);background:var(--surface);color:var(--ink);width:100%}
.virhe{background:var(--red-soft);color:var(--red);border-radius:9px;padding:10px 13px;font-size:13.5px;margin-bottom:14px}
.tunnuslista{margin-top:20px;border-top:1px solid var(--border);padding-top:14px}
.tunnuslista h3{font-size:13.5px;margin-bottom:8px}
.tunnuslista button{display:flex;justify-content:space-between;gap:12px;width:100%;text-align:left;
  background:var(--surface-2);border:1px solid var(--border);border-radius:9px;padding:8px 11px;margin-bottom:5px;
  font:13px var(--sans);color:var(--ink);cursor:pointer}
.tunnuslista button:hover{border-color:var(--blue);background:var(--blue-soft)}
.tunnuslista span.r{color:var(--muted);font-size:12px;white-space:nowrap}

/* kohdelista + kartta */
.kaksio{display:grid;grid-template-columns:330px minmax(0,1fr);gap:18px;align-items:start}
#kartta{height:min(72vh,660px);border-radius:var(--r);border:1px solid var(--border);box-shadow:var(--shadow);z-index:1}
.kohdekortti{display:block;background:var(--surface);border:1px solid var(--border);border-radius:10px;
  padding:12px 14px;margin-bottom:9px;text-decoration:none;color:inherit}
.kohdekortti:hover{border-color:var(--blue);box-shadow:var(--shadow)}
.kohdekortti b{display:block;font-size:15px}
.kohdekortti small{color:var(--muted);font-size:12.5px}
.merkkipallo{display:inline-flex;align-items:center;gap:5px;font:600 10.5px var(--cond);letter-spacing:.09em;
  text-transform:uppercase;padding:3px 8px;border-radius:6px}
.m-ok{background:var(--green-soft);color:var(--green)} .m-huom{background:var(--yellow-soft);color:var(--yellow)}
.m-vika{background:var(--red-soft);color:var(--red)} .m-info{background:var(--blue-soft);color:var(--blue)}

/* pohjakuvanäkymä */
.tyokalupalkki{background:var(--surface);border-bottom:1px solid var(--border);flex:none}
.tyokalupalkki .sisus{max-width:1320px;margin:0 auto;padding:9px 18px;display:flex;align-items:center;gap:10px 14px;flex-wrap:wrap}
.murut{display:flex;align-items:center;gap:5px;flex-wrap:wrap;font-size:13.5px;min-width:0}
.murut a{text-decoration:none}.murut i{color:var(--muted);font-style:normal}
.murut .nyt{font-weight:600}
.kerrosvalinta{display:flex;gap:3px;background:var(--surface-2);border:1px solid var(--border);border-radius:9px;padding:3px}
.kerrosvalinta a{min-width:34px;text-align:center;padding:5px 9px;border-radius:6px;font:600 13px var(--mono);
  color:var(--ink-2);text-decoration:none}
.kerrosvalinta a.on{background:var(--navy);color:#fff}
.tyokalut-oik{margin-left:auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap}

.pohjaruutu{flex:1;display:grid;grid-template-columns:minmax(0,1fr) 312px;min-height:0}
.levy{background:var(--paper);position:relative;overflow:auto;min-width:0}
/* Vain pohjakuva venytetään levyn levyiseksi. Aiemmin tämä oli `.levy svg`, jolloin
   se osui myös tasovalitsimen ikoneihin ja teki niistä napin levyisiä. */
#piirros{display:block;width:100%;height:auto;margin:0 auto}
.levy.lisaystila{cursor:crosshair}
.tasot{position:sticky;bottom:0;left:0;display:flex;gap:6px;flex-wrap:wrap;padding:10px 12px;
  background:linear-gradient(transparent,rgba(244,247,250,.92) 40%)}
.tasot button{border:1px solid var(--border-strong);background:var(--surface);color:var(--ink-2);border-radius:7px;
  padding:5px 9px;font:600 11.5px var(--cond);letter-spacing:.07em;text-transform:uppercase;cursor:pointer;
  display:flex;align-items:center;gap:6px}
.tasot button[aria-pressed="true"]{background:var(--navy);border-color:var(--navy);color:#fff}

.tiedot{border-left:1px solid var(--border);background:var(--surface);display:flex;flex-direction:column;min-height:0}
.tiedot-ylä{padding:14px 16px 12px;border-bottom:1px solid var(--border)}
.tiedot-ylä .tyyppi{font:600 11px var(--cond);letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
.tiedot-ylä h3{font-size:17px;margin-top:6px}
.tiedot-ylä .tunnus{font:500 12.5px var(--mono);color:var(--muted);margin-top:3px}
.tiedot-sisus{padding:12px 16px;overflow:auto;flex:1}
.kentta{display:grid;grid-template-columns:116px minmax(0,1fr);gap:4px 12px;padding-block:7px;
  border-bottom:1px solid var(--border);font-size:13.5px;margin:0}
.kentta:last-of-type{border-bottom:0}
.kentta dt{color:var(--muted)} .kentta dd{margin:0;font-weight:500;word-break:break-word}
.tyhja{color:var(--muted);font-size:13.5px;padding:16px 2px;line-height:1.6}
.tiedot-toiminnot{padding:12px 16px;border-top:1px solid var(--border);display:flex;flex-direction:column;gap:8px}

.osuma{cursor:pointer}
.osuma:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
svg text{font-family:var(--cond);fill:var(--paper-ink)}

.ilmo{padding:10px 14px;border-radius:9px;font-size:13.5px;margin-bottom:14px}
.ilmo.ok{background:var(--green-soft);color:var(--green)}
.ilmo.huom{background:var(--yellow-soft);color:var(--yellow)}

@media (max-width:900px){
  .kaksio{grid-template-columns:minmax(0,1fr)}
  .pohjaruutu{grid-template-columns:minmax(0,1fr)}
  .tiedot{border-left:0;border-top:1px solid var(--border)}
  #kartta{height:52vh}
}

/* Irralliset alasvetovalikot (suodattimet, hitsauslomake) samannäköisiksi kuin muut kentät ja sormelle riittävän
   korkeiksi (UX-kierros 26.10.2026: selaimen oletusvalikko oli matala ja erottui muusta). :where = ei ohita
   .kentta-rivi- tai muita luokkasääntöjä. */
:where(select){font:14px var(--sans);color:var(--ink);background:var(--surface);border:1px solid var(--border-strong);
  border-radius:8px;padding:6px 10px;min-height:36px;max-width:100%}
:where(select):focus-visible{outline:2px solid var(--blue);outline-offset:1px}
/* ===== 02_kartta_lomakkeet.css ===== */
/* ---------- piirtotyökalut ---------- */
.tyokalurivi{background:var(--surface-2);border-bottom:1px solid var(--border);flex:none}
.tyokalurivi .sisus{max-width:1320px;margin:0 auto;padding:8px 18px;display:flex;align-items:center;gap:10px 14px;flex-wrap:wrap}
.tyokalut{display:flex;gap:3px;background:var(--surface);border:1px solid var(--border);border-radius:9px;padding:3px}
.tk{appearance:none;border:0;background:none;color:var(--ink-2);border-radius:6px;padding:7px 12px;
  font:600 13px var(--sans);cursor:pointer;white-space:nowrap}
.tk:hover{background:var(--surface-2);color:var(--ink)}
.tk[aria-pressed="true"]{background:var(--navy);color:#fff}
.tk.vaara[aria-pressed="true"]{background:var(--red)}
.alivalinta{display:flex;gap:4px;flex-wrap:wrap}
.alivalinta .av-valinta{font:inherit;font-size:13px;padding:4px 8px;border:1px solid #7a3fb0;border-radius:7px;background:#fff;color:inherit}
.alivalinta .av-valinta.valittu{background:#f1e9f8;color:#5b2a8a;font-weight:600}
.av{appearance:none;border:1px solid var(--border-strong);background:var(--surface);color:var(--ink-2);
  border-radius:7px;padding:6px 10px;font:600 12.5px var(--sans);cursor:pointer;display:flex;align-items:center;gap:6px}
.av[aria-pressed="true"]{background:var(--blue-soft);border-color:var(--blue);color:var(--blue)}
.av > i{width:9px;height:9px;border-radius:2px;display:block}   /* suora lapsi: .laji-kuva-näytteet (13.11.2026) saavat oman kokonsa */
.tyokaluohje{font-size:13px;color:var(--muted);flex:1;min-width:160px}
.tyokaluohje.virheteksti{color:var(--red);font-weight:600}
.levy.poistotila{cursor:not-allowed}
.levy.poistotila .osuma{cursor:crosshair}
.kerrosvalinta a#uusiKerros{color:var(--blue);font-weight:700;font-size:16px;line-height:1}

/* ---------- yhteydet ---------- */
.yht-taulu{width:100%;border-collapse:collapse;font-size:13.5px;min-width:860px}
.yht-taulu th{text-align:left;padding:10px 14px;background:var(--surface-2);
  font:600 11px var(--cond);letter-spacing:.12em;text-transform:uppercase;color:var(--muted);white-space:nowrap}
.yht-taulu td{padding:11px 14px;border-top:1px solid var(--border);vertical-align:top}
.yht-taulu tr:hover td{background:var(--surface-2)}
.paa{display:flex;flex-direction:column;gap:2px}
.paa b{font-weight:600}
.paa small{color:var(--muted);font-family:var(--mono);font-size:12px}
.nuoli-sarake{color:var(--muted);text-align:center;font-size:17px;width:34px}
.yht-suodin{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:14px}
.yht-suodin input[type="search"]{flex:1;min-width:180px;max-width:320px;padding:9px 12px;border:1px solid var(--border-strong);
  border-radius:9px;font:14px var(--sans);background:var(--surface);color:var(--ink)}

.selite{display:flex;gap:8px 18px;flex-wrap:wrap;margin-top:10px;font-size:12.5px;color:var(--ink-2)}
.selite span{display:flex;align-items:center;gap:7px}
/* Koko tulee näytteen muodosta (.nayte-*). Kiinteä 16×4 tässä ohitti ne, jolloin kaapin, kiepin ja
   jatkoskotelon valkoinen sisäreunus peitti koko kuvakkeen. */
.selite i{display:block}
/* Kartan jakokaappi: oma symboli, erottuu pyöreästä kaivosta */
.kaappi-merkki{background:none;border:0}

/* ---------- kartan tasovalitsin (selite on myös kytkin) ---------- */
.selite button{display:flex;align-items:center;gap:7px;appearance:none;cursor:pointer;
  border:1px solid var(--border-strong);background:var(--surface);color:var(--ink-2);
  border-radius:8px;padding:6px 11px;font:600 12.5px var(--sans)}
.selite button[aria-pressed="true"]{background:var(--surface-2);color:var(--ink);border-color:var(--border-strong)}
.selite button[aria-pressed="false"]{opacity:.45;background:transparent}
.selite button[aria-pressed="false"] i{filter:grayscale(1)}
.nayte-viiva{width:18px;height:4px;border-radius:2px;display:block;flex:none}
.nayte-pallo{width:11px;height:11px;border-radius:50%;display:block;flex:none}
.nayte-kaappi{width:10px;height:13px;border-radius:2px;display:block;flex:none;
  box-shadow:inset 0 2px 0 #fff, inset 0 -2px 0 #fff}
.selite-ohje{color:var(--muted);font-size:12.5px;margin:7px 0 0}

/* ---------- lomake kartan ikkunassa ---------- */
.karttalomake b{display:block;margin-bottom:9px;font-size:14px}
.karttalomake .mk{display:block;margin-bottom:7px}
.karttalomake .mk span{display:block;font:600 11px var(--cond);letter-spacing:.1em;
  text-transform:uppercase;color:var(--muted);margin-bottom:2px}
.karttalomake .mk input,.karttalomake .mk select{width:100%;padding:7px 9px;
  border:1px solid var(--border-strong);border-radius:7px;font:14px var(--sans);
  background:var(--surface);color:var(--ink)}
.kaappi-sijainti{font-size:14px;font-weight:600;color:var(--ink-2,#3a4a5c);margin:1px 0 2px}
.mk-napit{display:flex;gap:7px;margin-top:10px}
.mk-napit .nappi{flex:1;text-align:center}
.mk-napit .nappi.mk-sivu{flex:0 0 auto}   /* harvinainen toiminto pääasian vieressä, ei yhtä isona */
.mk-napit .nappi.m-poista{flex:0 0 auto;margin-left:auto;color:var(--red)}
.mk-virhe{font-size:12.5px;color:var(--red);margin-top:7px}
.leaflet-popup-content{margin:12px 14px;line-height:1.55}

/* ---------- kartan reitin tarkennus ---------- */
.muokkauspaneeli{display:flex;gap:14px;align-items:center;flex-wrap:wrap;justify-content:space-between;
  margin-top:10px;padding:12px 15px;background:var(--yellow-soft);border:1px solid var(--yellow);
  border-radius:var(--r);color:var(--ink)}
.muokkauspaneeli b{font-size:14px}
.muokkaustila{font:500 13px var(--mono);color:var(--ink-2);margin-top:3px}
.muokkausohje{font-size:12.5px;color:var(--ink-2);margin-top:4px;max-width:52ch}
.kahva-karki,.kahva-lisa{background:none;border:0}
.kahva-karki{cursor:move}
.kahva-lisa{cursor:copy}

/* ---------- pohjakarttavalitsin ---------- */
.pohjakartat{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:10px}
.pk-otsikko{font:600 11px var(--cond);letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
.kieppi-merkki{background:none;border:0}
.nayte-kieppi{width:12px;height:12px;border-radius:50%;display:block;flex:none;
  box-shadow:inset 0 0 0 2px #fff}
.rakennus-merkki{background:none;border:0}

/* ---------- nimikkeistö ---------- */
.ruudukko-nimikkeet{display:grid;gap:16px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}
.nimikekortti{display:flex;flex-direction:column;gap:12px}
.kortti-ylä h2{font-size:16px}
.kortti-ylä small{color:var(--muted);font-size:12.5px}
.nimikelista{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}
.nimikelista li{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:2px 10px;align-items:center;
  padding-block:9px;border-top:1px solid var(--border)}
.nimikelista li small{grid-column:1;color:var(--muted);font-size:12.5px}
.nimikelista li .napit{grid-column:2;grid-row:1/4;align-self:center;display:flex;gap:6px}
.nimikelista .rakenne{color:var(--ink-2)}.nimikelista .rakenne.puuttuu{color:var(--muted);font-style:italic}
.rakennelomake{grid-column:1/-1;display:flex;gap:6px;align-items:center;flex-wrap:wrap;margin-top:6px}
.rakennelomake input,.rakennekentat input{width:7.5em;min-width:0}
.rakennekentat{display:flex;gap:6px;flex-wrap:wrap;flex-basis:100%}
.nimikelista .arvo{font-weight:600;font-size:14px;display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.nimikelista li.piilotettu .arvo{color:var(--muted);font-weight:500}
.nimikelista .lukittu{color:var(--muted);font-size:12px}
.nimikelista .tyhja-rivi{color:var(--muted);font-size:13.5px}
.nimikelomake{display:flex;gap:7px;flex-wrap:wrap;border-top:1px solid var(--border);padding-top:12px}
.nimikelomake input{flex:1;min-width:110px;padding:8px 10px;border:1px solid var(--border-strong);
  border-radius:8px;font:14px var(--sans);background:var(--surface);color:var(--ink)}
.jatkos-merkki{background:none;border:0}
/* Jatkoskotelo = kyljellään oleva salmiakki (22.10.2026) */
.nayte-jatkos{width:18px;height:10px;display:block;flex:none;clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%)}
/* Kameran/WLAN:n liitäntä (0036) */
.karttalomake .ul-tapa{display:block;margin:6px 0;cursor:pointer;font:400 13.5px var(--sans);text-transform:none;letter-spacing:0;color:var(--ink)}
.karttalomake .ul-tapa input{margin:0 6px 0 0;vertical-align:-1px}
.karttalomake .ul-tapa b{display:inline;margin:0;font-size:13.5px}
.karttalomake .ul-tapa small{display:block;margin-left:22px;color:var(--muted);font-size:12px}
.ul-yhteys{margin-top:3px}
.ul-kesken{color:var(--orange,#b5651d)}
/* Pisteen tilanne (25.10.2026) */
.merkkipallo.tilanappi{border:0;cursor:pointer;font:600 10.5px var(--cond);letter-spacing:.09em}
.tilanappi:hover{filter:brightness(.95);text-decoration:underline}
.tilanne{margin:0 0 10px;padding:8px 10px;border-radius:8px;font-size:13px;line-height:1.35;border-left:4px solid currentColor}
.tilanne.m-huom{background:var(--yellow-soft,#fff6dd);color:#7a5200}
.tilanne.m-vika{background:var(--red-soft,#fde8e6);color:#a3271b}
.lapputeksti{font-size:14px;white-space:normal}
.muistilappu{cursor:pointer}
/* Muistilapun värivalinta (0042) */
.lappuvarit{display:flex;gap:6px;flex-wrap:wrap}
.lappuvarit button{font:600 12.5px/1 system-ui,sans-serif;padding:6px 10px;border-radius:6px;cursor:pointer;
  background:var(--lv,#ffd43b);border:2px solid var(--lr,#a07d00);color:#222}
.lappuvarit button.lappu-vihrea{--lv:#8ce99a;--lr:#2b8a3e}.lappuvarit button.lappu-keltainen{--lv:#ffd43b;--lr:#a07d00}.lappuvarit button.lappu-punainen{--lv:#ff8787;--lr:#c92a2a}
.lappuvarit button[aria-checked="true"]{outline:3px solid #2f6fd0;outline-offset:1px}

/* Läpiviennin kautta kulkevat kaapelit (25.10.2026) */
.lv-kaapelit{display:flex;flex-direction:column;gap:2px;max-height:170px;overflow-y:auto;margin:4px 0 2px;font-size:13px}
.lv-kaapelit label{display:flex;align-items:center;gap:6px;cursor:pointer}
.lv-kaapelit small{color:var(--muted)}
/* Iso kartta -nappi erottuu etusivulla (Aki 29.10.2026: "voisi olla eri värinen, helposti huomattava"): oranssi täyttö,
   koko ikkunan tilassa (aria-pressed) palaa tummaksi kuten muut päällä olevat valinnat. */
#isoKartta{background:#d1762b;border-color:#d1762b;color:#fff;font-weight:700;box-shadow:0 2px 8px rgba(209,118,43,.35)}
#isoKartta:hover,#isoKartta:focus-visible{background:#b8641f;border-color:#b8641f}
#isoKartta[aria-pressed="true"]{background:var(--navy);border-color:var(--navy);box-shadow:none}
/* Oikean napsautuksen valinta Muistilappu / Uusi tehtävä (14.11.2026) */
.karttalomake .ml-valinta{display:flex;gap:6px;margin:0 0 10px;padding-bottom:8px;border-bottom:1px solid var(--border)}
.karttalomake .ml-valinta .nappi{flex:1;text-align:center;text-decoration:none;white-space:nowrap}
.karttalomake .ml-valinta .ml-valittu{cursor:default}
/* ===== 03_kaappi.css ===== */
/* ---------- tietoliikennekaapin sisältö ---------- */
.kaapin-sisalto{margin-top:12px;border-top:1px solid var(--border);padding-top:10px}
.kaapin-sisalto h4{font:600 11px var(--cond);letter-spacing:.14em;text-transform:uppercase;
  color:var(--muted);margin:0 0 6px}
.laitelista{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}
.laitelista li{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:8px;align-items:center;
  padding-block:8px;border-bottom:1px solid var(--border)}
.laitelista li:last-child{border-bottom:0}
.laite-nimi b{display:block;font-size:13.5px}
.laite-nimi small{color:var(--muted);font-size:12px}
.laite-portit{font:500 13px var(--mono);text-align:right;white-space:nowrap}
.laite-portit small{display:block;font:400 11.5px var(--sans);color:var(--muted)}

/* ---------- kaappinäkymä ---------- */
.kaappinakyma{position:fixed;inset:0;z-index:1200;background:var(--bg);display:flex;
  flex-direction:column;overflow:auto}
.kaappi-ylä{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap;justify-content:space-between;
  padding:16px 20px;background:var(--surface);border-bottom:1px solid var(--border)}
.kaappi-ylä h2{font-size:21px;margin-top:4px}
.kaappi-ylä small{color:var(--muted);font-size:13px}
.kaappi-runko{flex:1;display:grid;grid-template-columns:300px minmax(0,1fr);gap:0;min-height:0}
.telineruutu{background:var(--surface-2);border-right:1px solid var(--border);padding:16px;overflow:auto}
#teline{display:block;width:100%;height:auto}
.porttiruutu{padding:16px 20px;overflow:auto;background:var(--surface)}
.porttiotsikko h3{font-size:17px}
.porttiotsikko small{color:var(--muted);font-size:13px}
.porttitaulu{margin-top:12px;border:1px solid var(--border);border-radius:10px;overflow:auto}
.porttitaulu table{width:100%;border-collapse:collapse;font-size:13.5px;min-width:560px}
.porttitaulu th{text-align:left;padding:9px 12px;background:var(--surface-2);position:sticky;top:0;
  font:600 11px var(--cond);letter-spacing:.11em;text-transform:uppercase;color:var(--muted)}
.porttitaulu td{padding:7px 12px;border-top:1px solid var(--border);vertical-align:middle}
.porttitaulu tr.vapaa td{color:var(--muted)}
.porttitaulu .pnro{font:600 13px var(--mono);width:58px;text-align:right}
.porttitaulu small{color:var(--muted);font-family:var(--mono);font-size:11.5px}
.vapaa-portti{color:var(--muted);font-size:12.5px}
.pkohde input{width:100%;min-width:180px;padding:5px 8px;border:1px solid var(--border);
  border-radius:6px;font:13px var(--sans);background:var(--surface);color:var(--ink)}
.pkohde input:focus{border-color:var(--blue);outline:none}
.pkohde input.tallennettu{border-color:var(--green);background:var(--green-soft)}
@media (max-width:860px){
  .kaappi-runko{grid-template-columns:minmax(0,1fr)}
  .telineruutu{border-right:0;border-bottom:1px solid var(--border)}
}
.pikanappi{appearance:none;border:1px solid var(--border-strong);background:var(--surface);
  color:var(--blue);border-radius:6px;padding:1px 7px;font:600 11.5px var(--sans);cursor:pointer}
.pikanappi:hover{background:var(--blue-soft)}
.kaapelikortti{position:fixed;z-index:60;width:300px;max-width:calc(100vw - 16px);background:var(--surface);
  color:var(--ink);border:1px solid var(--border-strong);border-radius:9px;box-shadow:0 8px 24px rgba(0,30,60,.18);
  padding:10px 12px;font:13px var(--sans)}
.kaapelikortti .kk-otsikko{display:flex;align-items:baseline;gap:8px;margin-bottom:6px}
.kaapelikortti .kk-otsikko small{color:var(--muted);flex:1}
.kaapelikortti .kk-sulje{appearance:none;border:0;background:none;font-size:18px;line-height:1;cursor:pointer;color:var(--muted);padding:0 2px}
.kaapelikortti dl{display:grid;grid-template-columns:auto 1fr;gap:3px 10px;margin:0}
.kaapelikortti dt{color:var(--muted)}
.kaapelikortti dd{margin:0;overflow-wrap:anywhere}
.kaapelikortti .kk-toiminnot{display:flex;gap:10px;align-items:center;margin-top:9px;flex-wrap:wrap}
.ehdotusvihje{font-size:12.5px;color:var(--muted);margin:-8px 0 11px;line-height:1.45}

/* ---------- ristikytkentä porttitaulukossa ---------- */
.pristi{min-width:190px}
/* Paneelin takapuoli / etupuoli (24.10.2026) */
.puoliselite{font-size:12.5px;color:var(--muted);margin:4px 0 8px;line-height:1.5}
.puoliselite .ptaka,.puoliselite .petu{font-weight:600;padding:1px 6px;border-radius:5px;color:var(--ink)}
.puoliselite .ptaka,.kaksipuolta th.ptaka{background:#efe9dc}
.puoliselite .petu,.kaksipuolta th.petu{background:#dcebf7}
.kaksipuolta td.ptaka{background:#faf7f0}
.kaksipuolta td.petu{background:#f2f8fd}
.kaksipuolta th.petu,.kaksipuolta td.petu{border-left:3px solid #2f6fb0}
.ristinappi{appearance:none;border:1px solid var(--border-strong);background:var(--surface);
  color:var(--ink);border-radius:7px;padding:4px 9px;font:500 12.5px var(--sans);cursor:pointer;
  text-align:left;max-width:100%}
.ristinappi:hover{border-color:var(--blue);background:var(--blue-soft)}
.ristinappi.tyhja{color:var(--muted);border-style:dashed}
.ristieditori{display:flex;gap:5px;flex-wrap:wrap;align-items:center}
.ristieditori select,.ristieditori input{padding:5px 7px;border:1px solid var(--border-strong);
  border-radius:6px;font:13px var(--sans);background:var(--surface);color:var(--ink)}
.ristieditori select{max-width:170px}
.ristieditori .r-portti{width:72px}
.ristieditori .r-kuvaus{min-width:150px;flex:1}
.ristivirhe{flex-basis:100%;color:var(--red);font:500 12.5px var(--sans);
  background:var(--red-soft);border:1px solid var(--red);border-radius:6px;padding:5px 8px}

/* ---------- kaappinäkymän paluupolku ---------- */
.kaappi-ylä{position:sticky;top:0;z-index:2}
.takaisinlinkki{appearance:none;background:none;border:0;padding:0 0 4px;cursor:pointer;
  color:var(--blue);font:500 12.5px var(--sans)}
.takaisinlinkki:hover{text-decoration:underline}

/* ---------- kaapin laitteiden hallinta ---------- */
.telinetyokalut{margin-top:14px;display:flex;flex-direction:column;gap:8px}
.telinevalitun{display:flex;gap:6px;flex-wrap:wrap}
.laitelomake{display:flex;flex-direction:column;gap:11px;margin-top:14px;max-width:420px}
.lrivi{display:flex;flex-direction:column;gap:4px}
.lrivi label{font:600 11.5px var(--sans);text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}
.lrivi input,.lrivi select{padding:7px 9px;border:1px solid var(--border-strong);border-radius:7px;
  font:13.5px var(--sans);background:var(--surface);color:var(--ink)}
.lrivi small{color:var(--muted);font-size:11.5px}
.lkiintea{font:500 13.5px var(--sans);color:var(--ink)}
.lnapit{flex-direction:row;gap:8px;margin-top:4px}
/* Kaapin kaapelit tiedoissa (23.10.2026) */
.kk-kaapelit{width:100%;border-collapse:collapse;font-size:13px;margin-bottom:8px}
.kk-kaapelit td{padding:5px 6px;border-bottom:1px solid var(--border);vertical-align:top}
.kk-kaapelit small{color:var(--muted)}
.kk-kesken{list-style:none;margin:0 0 10px;padding:0;display:grid;gap:6px;font-size:13px}
.kk-kesken li{border:1px solid var(--border);border-left:4px solid var(--orange,#d9822b);border-radius:6px;padding:6px 8px}
.kk-kesken small{color:var(--muted)}
.kk-kesken .nappi{margin-top:4px}
/* Rasiasta avattu portti korostettuna (24.10.2026) */
.porttitaulu tr.korostettu td{background:#fff3bf !important;box-shadow:inset 0 2px 0 #f0b400,inset 0 -2px 0 #f0b400}
/* Liitintyypin valinta (25.10.2026) */
.liitinvalinta{max-width:100%}
.liitinvalinta + input{margin-top:6px}

/* Johdotusnäkymä (29.10.2026, js/johdotus.js): teline edestä tummana kuten kaappi oikeasti, kytkentäkaapelit kaarina.
   Värit ovat SVG:ssä (kuten kaavio.js), tässä vain tekstit ja korostus. */
.johdotusikkuna{width:min(1240px,calc(100vw - 24px))}
.jd-runko{background:#0b0e12;border-radius:0 0 14px 14px}
.jd-runko svg.jd{width:100%;height:auto;min-width:900px;display:block}
.jd text{font-family:var(--sans,system-ui,sans-serif)}
.jd-otsikko{fill:#e6edf5;font-size:16px;font-weight:650}
.jd-tunnus{fill:#fff;font-size:9.5px;font-weight:700}
.jd-nimi{fill:#e6edf5;font-size:13px;font-weight:600}
.jd-ala{fill:#8fa0b3;font-size:10.5px;font-weight:400}
.jd-tyhja{fill:#5d6878;font-size:10.5px}
.jd-ulos{fill:#c5d0dc;font-size:10.5px}
.jd-varoitus{fill:#f0a32a;font-size:12px;font-weight:700}
.jd-laite{cursor:pointer}
.jd-laite:hover>rect:first-of-type,.jd-laite:focus>rect:first-of-type{stroke:#2fb8e8}
.jd-laite:focus{outline:none}
.jd-portti{cursor:pointer}
.jd-alla{fill:none;stroke:#0b0e12;stroke-width:4.5;stroke-linecap:round}
.jd-viiva{fill:none;stroke-width:2.2;stroke-linecap:round}
.jd-johto{transition:opacity .15s}
.jd-johdot:hover .jd-johto:not(:hover){opacity:.18}
.jd-johto:hover .jd-viiva{stroke-width:3.6}
.jd-selitteet{display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:8px}
.jd-selite{font-size:12px;color:var(--ink-2);display:inline-flex;align-items:center;gap:6px}
.jd-selite i{display:inline-block;width:18px;height:4px;border-radius:2px}
.jd-selite i.jd-katko{background:repeating-linear-gradient(90deg,var(--muted) 0 5px,transparent 5px 8px)}
/* Johdotuksen hiirivihje: johdon / portin tiedot ja yhteydet merkkeinä (29.10.2026) */
.jd-vihje{position:fixed;z-index:10;pointer-events:none;max-width:340px;background:var(--surface);border:1px solid var(--border-strong);
  border-radius:8px;box-shadow:0 6px 20px rgba(15,25,40,.25);padding:8px 10px;font-size:12.5px;color:var(--ink-2);line-height:1.45}
.jd-vihje b{display:block;color:var(--ink,#1e2c3b);font-size:13px;margin-bottom:2px}
.jd-v-media{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}
.jd-v-media i{display:inline-block;width:16px;height:4px;border-radius:2px}
.jd-v-yhteydet{margin-top:6px;padding-top:6px;border-top:1px solid var(--border);display:grid;gap:3px}
.jd-v-yhteydet small{color:var(--muted)}
.jd-v-ei{margin-top:4px;color:var(--muted);font-style:italic}
.jd-on-yhteys .jd-viiva{stroke-width:3.2}
.jd-on-yhteys .jd-alla{stroke-width:6}
.jd-selite i.jd-paksu{height:6px;background:var(--ink-2)}
/* Talon kaapit vierekkäin (29.10.2026): leveys zoomista (svg width), vieritys vaakaan */
.jaljitysikkuna.talokaapit{width:calc(100vw - 24px);max-width:none}
.jd-talo-runko{overflow:auto;max-height:calc(100vh - 150px)}
.jd-runko svg.jd.jd-talo{width:auto;min-width:0;max-width:none;height:auto}
.jd-nippu{pointer-events:none}
.jd-nippu-teksti{fill:#e6edf5;font-size:11.5px;font-weight:650}
.jd-runkoyhteys .jd-viiva{stroke-width:2.6}
/* ===== 04_pohjakuva.css ===== */
/* ---------- pohjakuvan zoom ---------- */
.zoomtyokalut{position:sticky;top:10px;left:100%;z-index:3;width:max-content;margin:10px 10px 0 0;
  display:flex;align-items:center;gap:2px;transform:translateX(-100%);
  background:var(--surface);border:1px solid var(--border-strong);border-radius:9px;
  padding:3px;box-shadow:0 2px 8px rgba(30,44,59,.12)}
.zoomtyokalut button{appearance:none;border:0;background:none;color:var(--ink-2);cursor:pointer;
  width:28px;height:28px;border-radius:6px;font:600 16px var(--sans);line-height:1}
.zoomtyokalut button.sanalla{width:auto;padding:0 9px;font:600 12px var(--sans)}
.zoomtyokalut button:hover:not(:disabled){background:var(--blue-soft);color:var(--blue)}
.zoomtyokalut button:disabled{opacity:.35;cursor:default}
.zoomtyokalut output{font:500 12px var(--mono);color:var(--muted);min-width:46px;text-align:center;
  font-variant-numeric:tabular-nums}
.levy.panorointi{cursor:grabbing}
#piirros{min-width:0}

/* ---------- kaapelin reittivalinta ---------- */
.reittivalinnat{display:flex;flex-direction:column;gap:4px;max-height:200px;overflow:auto;
  border:1px solid var(--border);border-radius:8px;padding:6px}
/* Valinta on <label>, joten .kentta-rivi label voittaisi sen tyypin takia.
   Siksi omat säännöt kirjoitetaan säiliön kautta — muuten teksti perii harmaan,
   harvennetun ja isoilla kirjaimilla ladotun kenttäotsikon tyylin. */
.reittivalinnat label.reittivalinta{display:flex;align-items:flex-start;gap:8px;padding:5px 6px;
  border-radius:6px;cursor:pointer;font-family:var(--sans);font-size:13px;font-weight:400;
  letter-spacing:normal;text-transform:none;color:var(--ink)}
.reittivalinnat label.reittivalinta:hover{background:var(--blue-soft)}
/* .kentta-rivi input asettaa width:100% ja 10px paddingin — se koskisi myös tätä
   valintaruutua, jolloin ruutu vie koko rivin ja teksti puristuu parin kirjaimen
   levyiseksi sarakkeeksi. Siksi ruudun mitat palautetaan tässä nimenomaisesti. */
.reittivalinnat label.reittivalinta input[type="checkbox"]{width:auto;min-width:0;padding:0;
  margin:2px 0 0;flex:0 0 auto;border-radius:3px}
.reittivalinnat label.reittivalinta span{display:flex;flex-direction:column;line-height:1.35;
  min-width:0;flex:1 1 auto}
.reittivalinnat label.reittivalinta b,
.reittivalinnat label.reittivalinta small{overflow-wrap:anywhere}
.reittivalinnat label.reittivalinta b{font-family:var(--sans);font-size:13.5px;font-weight:600;
  color:var(--ink);letter-spacing:normal;text-transform:none}
.reittivalinnat label.reittivalinta small{font-family:var(--sans);font-size:11.5px;font-weight:400;
  color:var(--muted);letter-spacing:normal;text-transform:none}
.kentta-rivi small.vihje{display:block;color:var(--muted);font-size:11.5px;margin-top:5px}

/* ---------- piirtoalueen koko ---------- */
.kokoruudukko{display:grid;grid-template-columns:1fr 1fr;gap:8px 10px;margin-bottom:4px}
.kokoruudukko .kentta-rivi{margin:0}

/* ---------- pisteen ominaisuusparit ---------- */
#omLista{display:flex;flex-direction:column;gap:6px}
.omrivi{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.2fr);gap:6px}
.omrivi input{padding:7px 9px;border:1px solid var(--border-strong);border-radius:7px;
  font-family:var(--sans);font-size:13px;background:var(--surface);color:var(--ink)}
/* Pikavalikko hiiren oikealla (21.10.2026) */
.pikavalikko{position:fixed;z-index:3000;min-width:200px;max-width:300px;background:#fff;border:1px solid var(--border);border-radius:9px;
  box-shadow:0 8px 24px rgba(15,30,50,.18);padding:4px;display:flex;flex-direction:column}
.pikavalikko .pv-otsikko{font-size:12px;color:var(--muted);padding:5px 10px 6px;border-bottom:1px solid var(--border);margin-bottom:3px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pikavalikko .pv-otsikko b{color:var(--ink)}
.pikavalikko button{all:unset;box-sizing:border-box;cursor:pointer;padding:7px 10px;border-radius:6px;font:500 14px var(--sans);color:var(--ink)}
.pikavalikko button:hover,.pikavalikko button:focus-visible{background:var(--surface-2)}
.pikavalikko button.pv-vaara{color:var(--red)}
.pikavalikko .pv-tyhja{padding:7px 10px;font-size:13px;color:var(--muted)}
.pikavalikko .pv-ryhma{border-top:1px solid var(--border);border-bottom:0;margin:3px 0 0;padding-top:7px;font-weight:600}
.pikavalikko button.pv-kaapeli{font-weight:600;display:flex;align-items:center;gap:7px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pikavalikko button.pv-kaapeli small{font-weight:400;color:var(--muted);overflow:hidden;text-overflow:ellipsis}
.pikavalikko .pv-media{width:14px;height:3px;border-radius:2px;flex:none;background:#2f6fd0}
.pikavalikko .pv-media.pari{background:#1c8a4d}
.pikavalikko{max-height:calc(100vh - 16px);overflow-y:auto}
.tasot button[data-pohja].himmea{opacity:.72}
.pikavalikko button.pv-ehdokas{display:flex;align-items:center;gap:7px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pikavalikko button.pv-ehdokas.valittu{background:var(--surface-2);font-weight:700}
.pikavalikko .pv-media.reitti{background:#cd4335;height:5px}

/* Patch-johdon tietolaatikko (0045): näkyy kun hiiri on johdon päällä */
.patchvihje { position: fixed; z-index: 3000; pointer-events: none; max-width: 320px;
  background: var(--surface); color: var(--ink); border: 1px solid #7a3fb0; border-left-width: 4px;
  border-radius: 6px; padding: 6px 9px; font-size: 13px; line-height: 1.4; box-shadow: 0 4px 14px rgba(0,0,0,.18); }
.patchvihje small { color: var(--muted); }
/* Läpi kulkee -osio ja jatkoa odottavat irtopäät (29.10.2026) */
.pikavalikko{max-width:min(460px,calc(100vw - 16px))}
.pikavalikko button.pv-lapi{display:flex;align-items:flex-start;gap:7px;font-size:13px;line-height:1.35;white-space:normal}
.pikavalikko button.pv-lapi .pv-media{margin-top:5px;flex:none}
.pikavalikko button.pv-lapi small{color:var(--muted);font-weight:400}
.pikavalikko button.pv-lapi[disabled]{cursor:default;opacity:1}
.pikavalikko .pv-lapi-nuoli{color:#d1762b;font-weight:700}
.pikavalikko .pv-paatelty{font-style:italic}
.pikavalikko .pv-odottaa{color:#b35a00;font-weight:600;font-size:12px}
.pikavalikko .pv-otsikko small{font-weight:400;color:var(--muted)}
.lv-odottava{cursor:pointer}
.lv-odottava:hover circle,.lv-odottava:focus circle{fill:#d1762b}
.lv-odottava:focus{outline:none}
.lv-odottava-teksti{paint-order:stroke;stroke:#fff;stroke-width:3px;stroke-linejoin:round}
/* Pisteen sijainti pikkuikkunassa (kaapin porttitaulukon linkistä, ptNaytaSijainti) */
.jaljitysikkuna.sijainti-ikkuna{width:min(980px,calc(100vw - 32px))}
.sij-sisus{padding:12px 16px 16px}
.sij-kuvat{display:flex;gap:12px;align-items:flex-start}
.sij-lahi{flex:1 1 0;min-width:0;border:1px solid var(--border);border-radius:8px;background:#fbfaf7}
.sij-sivu{flex:0 0 260px}
.sij-yleis{width:100%;border:1px solid var(--border);border-radius:8px;background:#fbfaf7}
.sij-tiedot{font-size:13px;margin-top:8px;line-height:1.45}
@media (max-width:700px){.sij-kuvat{flex-direction:column}.sij-sivu{flex:none;width:100%}}
/* Valintalistan esikatselu: valitun kohteen paikka pienenä kuvana (sijaintiEsikatselu) */
.k-sijainti{margin:6px 0 2px;width:100%;max-width:620px;flex:1 1 100%}
.k-sijainti:empty{display:none}
.sij-tiivis{gap:8px}
.sij-tiivis .sij-lahi{max-height:240px}
.sij-tiivis .sij-sivu{flex:0 0 150px}
.sij-tiivis .sij-tiedot{font-size:12px;margin-top:4px}
/* Nousumerkki: minne kerrosten välinen läpivienti vie ja montako kaapelia jatkuu; napsautus = toinen puoli */
.lv-nousu{cursor:pointer}
.lv-nousu:focus{outline:none}
.lv-nousu-teksti{paint-order:stroke;stroke:#fff;stroke-width:3.5px;stroke-linejoin:round}
.lv-nousu:hover .lv-nousu-teksti,.lv-nousu:focus .lv-nousu-teksti{text-decoration:underline;fill:#d1762b}
.pikavalikko .pv-kirjaamatta{border-top:1px dashed var(--border);margin-top:3px;font-size:12.5px}
/* ===== 05_tuloste.css ===== */
/* ---------- tuloste (selaimen "Tallenna PDF") ---------- */
.tulostenimio,.tulosteliite{display:none}
@media print {
  @page { size: A3 landscape; margin: 10mm }
  html,body{background:#fff;color:#000}
  .ylapalkki,.alapalkki,.polku,.tyokalurivi,.tiedot,.tasot,.zoomtyokalut,
  .kaappinakyma,.tyokalut-oik{display:none!important}
  main,.pohjaruutu{display:block;min-height:0;height:auto}
  .pohjaruutu{grid-template-columns:1fr}
  .levy{overflow:visible;background:#fff;padding:0}
  #piirros{width:100%;height:auto;page-break-inside:avoid}
  .tulostenimio{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;
    border-bottom:1.5px solid #000;padding-bottom:6px;margin-bottom:8px}
  .tulostenimio h1{font-family:var(--cond);font-size:20pt;margin:0;letter-spacing:.01em}
  .tulostenimio .tn-ala{font-size:10pt;color:#333;margin-top:2px}
  .tulostenimio .tn-tiedot{display:grid;grid-template-columns:repeat(2,auto);gap:2px 18px;margin:0}
  .tulostenimio .tn-tiedot dt{font-family:var(--cond);font-size:7.5pt;text-transform:uppercase;
    letter-spacing:.08em;color:#555}
  .tulostenimio .tn-tiedot dd{margin:0;font-size:9pt}
  .tulosteliite{display:block;margin-top:10mm;page-break-before:always}
  .tulosteliite h2{font-family:var(--cond);font-size:12pt;margin:8mm 0 2mm;letter-spacing:.02em}
  .tulosteliite h2:first-child{margin-top:0}
  .tl-selite ul{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:4px 16px}
  .tl-selite li{display:flex;align-items:center;gap:6px;font-size:9pt}
  .tl-selite i{width:9px;height:9px;border-radius:2px;display:block}
  .tl-taulu{width:100%;border-collapse:collapse;font-size:8.5pt}
  .tl-taulu th{text-align:left;border-bottom:1px solid #000;padding:3px 5px;
    font-family:var(--cond);text-transform:uppercase;letter-spacing:.06em;font-size:7.5pt}
  .tl-taulu td{border-bottom:.4px solid #bbb;padding:3px 5px}
  .tl-taulu .num{text-align:right;font-variant-numeric:tabular-nums}
  .tl-taulu thead{display:table-header-group}
  .tl-taulu tr{page-break-inside:avoid}
}
.ristieditori .k-piste{max-width:230px}
.ristieditori .k-aportti{width:120px}
#lomLista{display:flex;flex-direction:column;gap:6px}
#lomLista input{padding:7px 9px;border:1px solid var(--border-strong);border-radius:7px;
  font-family:var(--sans);font-size:13px;background:var(--surface);color:var(--ink)}
/* ===== 06_listat_ohjeet.css ===== */
/* ---------- kaapelin varrella olevat kohteet ---------- */
.varlista{display:flex;flex-direction:column;gap:4px;margin:8px 0;max-height:220px;overflow:auto}
.varrivi{display:flex;align-items:center;gap:8px;padding:5px 6px;border:1px solid var(--border);
  border-radius:7px;background:var(--surface)}
.varrivi[hidden],.var-lahella[hidden]{display:none}
/* Liitetyt ja lähellä olevat erikseen (06_kaapelityot.js liitosListat, 19.10.2026) */
.var-otsikko{margin:10px 0 0;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}
.var-tyhja{margin:4px 0 8px;font-size:12.5px;color:var(--muted)}
.var-selite{margin:4px 0 0;font-size:12px;line-height:1.4;color:var(--muted)}
.var-avaa,.var-kaikki{width:100%;margin-top:4px}
.var-nimi{display:flex;flex-direction:column;line-height:1.3;min-width:0;flex:1}
.var-nimi small{color:var(--muted);font-size:11px}
.var-rooli{padding:4px 6px;border:1px solid var(--border-strong);border-radius:6px;
  font-family:var(--sans);font-size:12px;background:var(--surface);color:var(--ink)}
.var-paate{font-family:var(--sans);font-size:11.5px;color:var(--muted)}
.var-napsauta{display:flex;align-items:center;gap:6px;font-family:var(--sans);font-size:12px;
  color:var(--muted)}
.tarkkuusvihje{font-family:var(--sans);font-size:11.5px;color:var(--yellow);
  background:var(--yellow-soft);border:1px solid var(--yellow);border-radius:6px;padding:3px 8px;
  white-space:nowrap}

/* ---------- toimintojen ohjeet ---------- */
.ohje{margin:0 0 10px;border:1px solid var(--border);border-radius:9px;background:var(--surface-2);
  overflow:hidden}
.ohje-nappi{display:flex;align-items:center;gap:7px;width:100%;appearance:none;border:0;
  background:none;cursor:pointer;padding:7px 10px;text-align:left;
  font-family:var(--cond);font-size:12.5px;font-weight:600;letter-spacing:.06em;
  text-transform:uppercase;color:var(--ink-2)}
.ohje-nappi:hover{color:var(--blue)}
.ohje-merkki{flex:none;width:16px;height:16px;border-radius:50%;background:var(--blue);color:#fff;
  font-family:var(--sans);font-size:11px;font-weight:700;line-height:16px;text-align:center;
  letter-spacing:0}
.ohje-teksti{margin:0;padding:0 10px 9px 33px;font-family:var(--sans);font-size:12.5px;
  line-height:1.5;color:var(--ink-2)}
.leaflet-popup-content .ohje{margin:8px 0}
.reittivalinnat label.reittivalinta .reittivari{flex:0 0 auto;width:12px;height:12px;border-radius:3px;
  margin-top:3px;box-shadow:0 0 0 1px rgba(30,44,59,.2)}
.vainmerkinta{display:flex;align-items:flex-start;gap:7px;margin-top:7px;
  font-family:var(--sans);font-size:12.5px;color:var(--ink-2);cursor:pointer}
.kentta-rivi .vainmerkinta input[type="checkbox"]{width:auto;min-width:0;padding:0;margin:2px 0 0;
  flex:0 0 auto}
/* ===== 07_raportit_haku_kuvat.css ===== */
/* ---------- mittaukset ja raportit ---------- */
.valinta-sarake{width:34px;text-align:center}
.yht-taulu .valinta-sarake input{width:auto;margin:0}
.pituus-sarake{white-space:nowrap}
.pituus-sarake.yli90{color:var(--red);font-weight:600}
.pituus-sarake .yks{color:var(--muted);font-size:11.5px;margin-left:3px}
.pituuskentta{width:74px;padding:5px 6px;border:1px solid var(--border-strong);border-radius:6px;
  font-family:var(--mono);font-size:12.5px;background:var(--surface);color:var(--ink);
  text-align:right}
.tuloskentta,.pvmkentta{padding:5px 6px;border:1px solid var(--border-strong);border-radius:6px;
  font-family:var(--sans);font-size:12.5px;background:var(--surface);color:var(--ink);max-width:150px}
.pvmkentta{margin-top:4px}
.tallennettu{border-color:var(--green);background:var(--green-soft)}
.virhekentta{border-color:var(--red);background:var(--red-soft)}
.yht-massa{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:14px;padding:10px 12px;
  background:var(--navy);border-radius:10px;color:#fff;font-family:var(--sans);font-size:13px}
.yht-massa select,.yht-massa input{padding:5px 7px;border:1px solid rgba(255,255,255,.35);
  border-radius:6px;font-family:var(--sans);font-size:12.5px;background:rgba(255,255,255,.12);color:#fff}
.yht-massa select option{color:var(--ink)}
.yht-massa .mk-virhe{color:#ffd9d4}
.raporttilista{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}
.raporttirivi{display:flex;align-items:center;gap:10px;padding:7px 9px;border:1px solid var(--border);
  border-radius:8px;background:var(--surface-2)}
.raporttilomake{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:0 14px;
  border-top:1px solid var(--border);padding-top:14px}
.raporttilomake .mk-napit,.raporttilomake .mk-virhe{grid-column:1/-1}

/* ---------- asiakkuudet ---------- */
.asiakkuus .as-ylä{display:flex;justify-content:space-between;align-items:flex-start;gap:14px;
  flex-wrap:wrap;margin-bottom:12px}
.asiakkuus .as-napit{display:flex;gap:6px;flex-wrap:wrap}
.asiakkuus .as-otsikko{font-family:var(--cond);font-size:12.5px;font-weight:600;letter-spacing:.07em;
  text-transform:uppercase;color:var(--muted);margin:14px 0 6px}
.asiakkuus .varlista{max-height:none}
.asiakkuus .siirto{padding:4px 7px;border:1px solid var(--border-strong);border-radius:6px;
  font-family:var(--sans);font-size:12px;background:var(--surface);color:var(--ink);max-width:180px}
.as-lomake:not(:empty){margin-top:12px;padding-top:12px;border-top:1px solid var(--border)}

/* ---------- kohdekortti: kerrokset ja karttayhteys ---------- */
.kohdekortti-kuori{margin-bottom:10px;border-radius:var(--r);transition:box-shadow .12s}
.kohdekortti-kuori.korostettu{box-shadow:0 0 0 2px var(--blue)}
.kohdekortti-kuori .kohdekortti{margin-bottom:0}
.kohde-kerrokset{display:flex;align-items:center;gap:5px;flex-wrap:wrap;padding:7px 14px 9px;
  background:var(--surface-2);border:1px solid var(--border);border-top:0;
  border-radius:0 0 var(--r) var(--r)}
.kohde-kerrokset a{min-width:26px;text-align:center;padding:3px 7px;border-radius:6px;
  background:var(--surface);border:1px solid var(--border-strong);color:var(--ink-2);
  text-decoration:none;font-family:var(--mono);font-size:12px}
.kohde-kerrokset a:hover{border-color:var(--blue);color:var(--blue);background:var(--blue-soft)}
.kohde-kerrokset .kartalle{margin-left:auto;appearance:none;border:0;background:none;cursor:pointer;
  color:var(--blue);font-family:var(--sans);font-size:12px;padding:3px 2px}
.kohde-kerrokset .kartalle:hover{text-decoration:underline}
.merkki-korostettu{filter:drop-shadow(0 0 4px var(--blue))}
/* Kortin hiiri → talon merkin ympärille punainen rengas (Aki 14.11.2026: "kohde voisi näkyä vieläkin selvemmin, esim.
   punainen ympyrä"). Rengas on pseudo-elementti, ei vaikuta merkin osumaan; liikettä vain jos käyttäjä ei ole kieltänyt. */
.rakennus-merkki.merkki-korostettu{overflow:visible}
.rakennus-merkki.merkki-korostettu::after{content:"";position:absolute;left:50%;top:50%;width:54px;height:54px;
  margin:-29px 0 0 -27px;border:3px solid #d62828;border-radius:50%;box-sizing:border-box;pointer-events:none;
  box-shadow:0 0 0 2px rgba(255,255,255,.85),inset 0 0 0 2px rgba(255,255,255,.85);animation:kk-rengas 1.4s ease-out infinite}
@keyframes kk-rengas{0%{transform:scale(.8);opacity:1}70%{transform:scale(1.15);opacity:.85}100%{transform:scale(.8);opacity:1}}
@media (prefers-reduced-motion: reduce){.rakennus-merkki.merkki-korostettu::after{animation:none}}

/* ---------- haku ---------- */
a.hakuosuma{text-decoration:none;color:inherit}
a.hakuosuma:hover{border-color:var(--blue);background:var(--blue-soft)}
.hakulaji{flex:0 0 auto;align-self:flex-start;padding:2px 7px;border-radius:5px;color:#fff;
  font-family:var(--cond);font-size:11px;font-weight:600;letter-spacing:.05em;text-transform:uppercase}
.hakunuoli{margin-left:auto;color:var(--muted);font-size:15px}
a.hakuosuma:hover .hakunuoli{color:var(--blue)}
#tulokset mark{background:var(--yellow-soft);color:var(--ink);padding:0 1px;border-radius:2px}

/* ---------- pisteen valokuvat ---------- */
.kuvanauha{display:flex;gap:6px;flex-wrap:wrap;margin:4px 0 6px}
.kuvapala{position:relative;display:block;width:76px;height:76px;border-radius:7px;overflow:hidden;
  border:1px solid var(--border-strong);background:var(--surface-2)}
.kuvapala img{width:100%;height:100%;object-fit:cover;display:block}
.kuvapala:hover{border-color:var(--blue)}
.kuvapois{position:absolute;top:2px;right:2px;width:19px;height:19px;border:0;border-radius:50%;
  background:rgba(30,44,59,.72);color:#fff;font:700 13px var(--sans);line-height:17px;cursor:pointer;
  padding:0;opacity:0;transition:opacity .12s}
.kuvapala:hover .kuvapois,.kuvapois:focus{opacity:1}
.kuvapois:hover{background:var(--red)}
.kuvapaikka{position:absolute;left:2px;bottom:2px;width:21px;height:21px;border:0;border-radius:50%;
  background:rgba(255,255,255,.85);font-size:12px;line-height:21px;padding:0;cursor:pointer}
.kuvapaikka:hover,.kuvapaikka:focus{background:#fff;box-shadow:0 0 0 2px var(--blue)}
/* ===== 08_kartan_tyokalut.css ===== */
/* ---------- tasonappien ikonit ---------- */
.tasot button{display:inline-flex;align-items:center;gap:6px}
.tasot button .tasoikoni{width:18px;height:18px;flex:none;display:block}
.tasot button[aria-pressed="false"] .tasoikoni{opacity:.45}
.tasot button[aria-pressed="true"]{color:#fff}
.tasot button[aria-pressed="true"] .tasoikoni{filter:brightness(1.9) saturate(.6)}
.tasot button:disabled{opacity:.35;cursor:default}

/* ---------- putken varaus ---------- */
.putkikartta{display:flex;flex-wrap:wrap;gap:3px;margin:6px 0 4px}
.putkiruutu{width:22px;height:20px;border:1px solid var(--border-strong);border-radius:4px;
  background:var(--surface);color:var(--muted);font-family:var(--mono);font-size:11px;
  line-height:19px;text-align:center}
.putkiruutu.varattu{background:var(--blue);border-color:var(--blue);color:#fff;font-weight:600}

/* ---------- kartan tuloste ---------- */
@media print {
  .kaksio{display:block}
  #kartta{height:150mm!important;width:100%;page-break-inside:avoid;box-shadow:none;border:1px solid #000}
  #kartta.tulostekoko{width:var(--tk-w)!important;height:var(--tk-h)!important}
  .tk-kahva{display:none!important}
  .leaflet-control-container,.pohjakartat,.selite,.selite-ohje,
  .kohdekortti-kuori,.tarkkuusvihje,.yht-suodin{display:none!important}
  #vasenpalsta,#paavalikkopaneeli,#karttaoheiset,#mobiilinavi,#mobiilitila,.karttanapit,.sivupaa{display:none!important}
  .kaksio{margin:0;padding:0}
  main.kuori{max-width:none;padding:0;margin:0}
  #karttanimio{display:flex!important}
  #karttaliite{display:block!important}
  #karttaliite.tk-ei{display:none!important}
}

/* Tulostusalue (14.10.2026): kehys, kulmakahvat ja palkki kartan oikeassa yläkulmassa */
#kartta.tulostekoko{width:var(--tk-w);height:var(--tk-h);max-width:none}
.tk-kahva{background:#fff;border:2px solid #0b5cad;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.3)}
.tk-kulma{cursor:nwse-resize}
.tk-siirto{cursor:move;border-radius:50%;color:#0b5cad;font:700 13px/14px var(--sans);text-align:center}
.tk-palkki{background:var(--surface);border:1px solid var(--border);border-radius:9px;padding:9px 11px;
  box-shadow:0 2px 10px rgba(0,0,0,.18);display:flex;flex-direction:column;gap:6px;font:13px var(--sans);
  color:var(--ink);max-width:250px}
.tk-palkki span{color:var(--ink-2);font-size:12px}
.tk-palkki select{margin-left:6px;font:inherit}
.tk-palkki label{display:flex;align-items:center;gap:6px}
.tk-palkki .tk-mk{color:var(--ink);font-variant-numeric:tabular-nums}
.tk-napit{display:flex;gap:6px;flex-wrap:wrap}

/* ---------- oma sijainti ---------- */
.karttanapit{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:8px}
.karttanapit .nappi[aria-pressed="true"]{background:var(--navy);border-color:var(--navy);color:#fff}
.oma-nuoli{background:none;border:0;pointer-events:none}
.sijaintitila{font-family:var(--sans);font-size:12px;color:var(--ink-2)}
.sijaintitila.epatarkka{color:var(--yellow);background:var(--yellow-soft);
  border:1px solid var(--yellow);border-radius:6px;padding:2px 7px}
.oda-ohje{margin:0 0 14px;border:1px solid var(--border);border-radius:9px;background:var(--surface-2);
  padding:10px 13px;font-family:var(--sans);font-size:13px;color:var(--ink-2)}
.oda-ohje summary{cursor:pointer;font-weight:600;color:var(--ink)}
.oda-ohje ol{margin:8px 0 0 18px;padding:0;line-height:1.7}
.oda-ohje code{background:var(--surface);border:1px solid var(--border);border-radius:4px;
  padding:1px 5px;font-family:var(--mono);font-size:12px}

/* 6.10.2026: "Mitä tälle voi tehdä?" — valitun kohteen tehtävät vaiheittain */
.tehtavat{margin:0 0 12px;border:1px solid #c8d8f2;border-radius:10px;background:#f4f8fe;padding:8px 10px 6px}
.tehtavat-otsikko{font-weight:700;font-size:13px;color:var(--navy);margin:0 0 4px}
.tehtava{border-top:1px solid #dde7f5;padding:2px 0}
.tehtava:first-of-type{border-top:0}
.tehtava summary{cursor:pointer;font-size:13px;font-weight:600;color:var(--ink);padding:6px 0;list-style-position:inside}
.tehtava summary:hover{color:var(--blue)}
.tehtava-tila{display:inline-block;margin-left:4px;padding:0 7px;border-radius:9px;background:var(--yellow-soft);color:var(--yellow);font-size:11px;font-weight:700}
.tehtava-tila.valmis{background:var(--green-soft);color:var(--green)}
.tehtava ol{margin:2px 0 8px;padding-left:22px;font-size:12.5px;line-height:1.55;color:var(--ink-2)}
.tehtava li{margin:3px 0}
.tehtava li.tehty{color:var(--muted)}
.tehty-merkki{color:var(--green);font-weight:700}
.tehtava-nappi{margin-left:4px;white-space:nowrap}
/* 6.10.2026: saapuva ristikytkentä kytkimen portissa (paneelin kytkentäkaapeli) */
.saapuva{color:#5b3fa0;font-weight:600}
/* 6.10.2026: etusivun kohdelista vierii omassa laatikossaan, jotta "Piirrä kartalle" pysyy näkyvissä */
.kohdehaku{width:100%;margin:0 0 10px;padding:9px 12px;border:1px solid var(--border-strong);border-radius:9px;
  font:inherit;font-size:14px;background:var(--surface)}
.kohdehaku:focus{outline:2px solid var(--blue);outline-offset:1px}
.kohdelista{max-height:max(300px, calc(100vh - 300px));overflow-y:auto;overscroll-behavior:contain;
  padding:2px 6px 2px 2px;margin:0 -6px 0 -2px;scrollbar-gutter:stable}
.kohdekortti .kuvausrivi{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
@media (max-width:900px){.kohdelista{max-height:60vh}}
.vasen-valilehdet{display:flex;gap:4px;margin:0 0 10px;border-bottom:2px solid var(--border)}
.vasen-valilehdet button{appearance:none;background:none;border:0;border-bottom:3px solid transparent;margin-bottom:-2px;
  padding:8px 12px;font:inherit;font-size:14px;font-weight:650;color:var(--muted);cursor:pointer}
.vasen-valilehdet button[aria-selected=true]{color:var(--navy);border-bottom-color:var(--blue)}
.vasen-valilehdet .vt-lkm{display:inline-block;min-width:20px;padding:0 6px;margin-left:3px;border-radius:9px;background:var(--surface-2);
  font-size:12px;color:var(--ink-2);text-align:center}
/* ===== 09_ulkokartta.css ===== */
/* ---------- ulkokartta: yhteiset osuudet ja kaapelin reitin korostus (6.10.2026) ---------- */
.korostuspaneeli{background:var(--surface);border-color:#0b2350;border-left-width:5px}
.osuuslista{list-style:none;margin:8px 0 0;padding:0;max-height:300px;overflow-y:auto}
.osuuslista li{display:flex;gap:10px;align-items:center;justify-content:space-between;
  padding:7px 0;border-top:1px solid var(--border)}
.osuuslista .ol-nimi{min-width:0;line-height:1.35}
.osuuslista .ol-napit{display:flex;gap:5px;flex-shrink:0}
.seuraa-rivi{display:flex;gap:7px;align-items:center;font-size:13px;margin-top:8px;cursor:pointer}
.yhdistyskysely{line-height:1.5}
.yhdistyskysely .yk-ohje{display:block;color:var(--muted);margin-top:6px;font-size:12px}

/* Turvaluokat (7.10.2026): vihreä / keltainen / punainen. Keltainen tummalla tekstillä,
   koska valkoinen keltaisella ei erotu. */
.turvamerkki{display:inline-block;font:600 11.5px var(--sans);padding:1px 8px;border-radius:999px;
  white-space:nowrap;vertical-align:1px;color:#fff}
.turvamerkki.tl-vihrea{background:#1c8a4d}
.turvamerkki.tl-keltainen{background:#f2c200;color:#3a2e00}
.turvamerkki.tl-punainen{background:#cd4335}
.turvalista{list-style:none;margin:6px 0 0;padding:0;font-size:13px}
.turvalista li{padding:5px 0;border-top:1px solid var(--border)}
.turvalista button{all:unset;cursor:pointer;color:var(--ink)}
.turvalista button:hover,.turvalista button:focus-visible{text-decoration:underline}
.turvarivi{display:flex;gap:8px;align-items:center;margin:6px 0}
.turvarivi .turvamerkki{min-width:72px;text-align:center}
.turvarivi input{flex:1;min-width:0}
.tasot .erotin{width:1px;align-self:stretch;background:var(--border);margin:0 4px}

/* Talon ristikytkentä kartalla (7.10.2026): neliö ja X, katkoviivakehys = sisätila. */
.rk-merkki{background:none;border:0}
/* Kamera ja WLAN (16.10.2026): kameran keila ei ota napsautuksia, jotta sen alla olevat kaapelit voi valita */
.ulkolaite-merkki{background:none;border:0;pointer-events:none!important}
.ulkolaite-merkki .runko{pointer-events:auto;cursor:pointer}
.nayte-kamera{width:14px;height:12px;display:block;flex:none;clip-path:polygon(50% 100%,0 0,100% 0);opacity:.85}
.nayte-wlan{width:12px;height:12px;border-radius:50%;display:block;flex:none;box-sizing:border-box;background:#fff!important;border:3px solid #b0367a}
.ul-kaanto{display:flex;align-items:center;gap:6px;margin-top:6px}
.ul-kaanto input[type=range]{flex:1;min-width:90px}
.ul-kaanto .nappi{font-size:17px;line-height:1;padding:4px 9px}
.ul-tila{font-size:11.5px;color:var(--muted);min-width:5.5em}
.nayte-rk{width:12px;height:12px;display:block;flex:none;border-radius:2px;background:#fff!important;
  border:2px solid #003a5a;position:relative}
.nayte-rk::before,.nayte-rk::after{content:"";position:absolute;left:50%;top:50%;width:11px;height:2px;
  background:#003a5a;transform:translate(-50%,-50%) rotate(45deg)}
.nayte-rk::after{transform:translate(-50%,-50%) rotate(-45deg)}
.nayte-lv{width:12px;height:12px;display:block;flex:none;border-radius:50%;background:#fff!important;
  border:2px solid #003a5a;position:relative;box-sizing:border-box}
.nayte-lv::before{content:"";position:absolute;left:50%;top:-1px;bottom:-1px;width:2px;margin-left:-1px;background:#003a5a;opacity:.5}
.nayte-lv::after{content:"";position:absolute;left:1px;right:1px;top:50%;height:2px;margin-top:-1px;background:#003a5a}
.urivi{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.urivi input{width:72px}
.urivi .ukork{font-weight:400;margin:0 0 0 6px}
.kaappitiedot h4{font:700 12.5px var(--sans);text-transform:uppercase;letter-spacing:.6px;color:var(--muted);margin:14px 0 6px}
.kuvalisays{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:8px}
.kuvalisays input[type=text]{flex:1;min-width:160px}
.kaappitiedot h4{font:700 12.5px var(--sans);text-transform:uppercase;letter-spacing:.6px;color:var(--muted);margin:14px 0 6px}
.kuvalisays{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:8px}
.kuvalisays input[type=text]{flex:1;min-width:160px}
/* Kaapelitunnelin selitenäyte: vaalea kaista katkoviivareunoin, kuten kartalla. */
.nayte-tunneli{width:18px;height:9px;display:block;flex:none;background:#eee3cf!important;
  border:2px dashed #5b4f3f;border-left:0;border-right:0}

/* Iso kartta (7.10.2026): kartta koko ikkunaan, vasen palsta ja kartan oheiset kelluvina paneeleina. */
.kelluva-kahva{display:none}
body.iso-kartta{overflow:hidden}
/* !important: Leaflet kirjoittaa kartalle inline-tyylin position:relative, joka ohittaisi tämän. */
body.iso-kartta #kartta{position:fixed!important;inset:0;height:auto;border-radius:0;border:0;z-index:900}
body.iso-kartta .kelluvapaneeli{position:fixed;z-index:1100;width:min(340px, calc(100vw - 16px));
  max-height:calc(100vh - 24px);display:flex;flex-direction:column;background:var(--surface);
  border:1px solid var(--border);border-radius:10px;box-shadow:0 10px 30px rgba(15,30,45,.28)}
body.iso-kartta #karttaoheiset{width:min(420px, calc(100vw - 16px))}
body.iso-kartta #vasenpalsta{width:min(340px, calc(100vw - 66px))}   /* zoom-napit vasemmalle jäävät näkyviin */
body.iso-kartta .kelluva-kahva{display:flex;align-items:center;justify-content:space-between;gap:8px;flex:none;
  padding:7px 8px 7px 12px;cursor:move;user-select:none;touch-action:none;background:var(--navy);color:#fff;
  border-radius:9px 9px 0 0;font:600 13px var(--sans)}
body.iso-kartta .kelluva-pienenna{appearance:none;border:0;background:rgba(255,255,255,.16);color:#fff;
  width:26px;height:24px;border-radius:5px;font:700 15px/1 var(--sans);cursor:pointer}
body.iso-kartta .kelluva-sisus{overflow:auto;padding:10px 12px;min-height:0}
body.iso-kartta .kelluvapaneeli.pienennetty .kelluva-sisus{display:none}
body.iso-kartta .kelluvapaneeli.pienennetty .kelluva-kahva{border-radius:9px}
body.iso-kartta .kelluva-sisus > .kortti{box-shadow:none;border:0;padding:0!important}
body.iso-kartta .kohdelista{max-height:none}
body.iso-kartta .selite-ohje{display:none}
body.iso-kartta .muokkauspaneeli{margin:0 0 10px}
/* Ison kartan Valikko-paneeli (13.10.2026): vain isossa kartassa; linkit vaakarivinä navy-pohjalla kuten yläpalkissa. */
#paavalikkopaneeli{display:none}
body.iso-kartta #paavalikkopaneeli{display:flex;width:auto;max-width:calc(100vw - 16px)}
body.iso-kartta #paavalikkopaneeli .kelluva-sisus{background:var(--navy);border-radius:0 0 9px 9px;padding:6px}
.kelluva-navi{flex-wrap:wrap;overflow:visible;gap:2px}
.kelluva-navi > a,.kelluva-navi .navivalikko summary{font-size:13px;padding:5px 8px}
.kelluva-navi .kelluva-ulos{color:#9fc4dd}
@media print{ body.iso-kartta #kartta{position:static} body.iso-kartta .kelluvapaneeli{display:none} }
/* Ulkoverkon pistemerkit pienempinä kauempaa (22.10.2026, paivitaMerkkikoko): svg skaalataan keskeltä, Leafletin sijainti ei muutu */
:is(.rk-merkki,.jatkos-merkki,.kaappi-merkki,.kieppi-merkki) svg{transition:transform .15s;transform-origin:50% 50%}
[data-merkit="keski"] :is(.rk-merkki,.jatkos-merkki,.kaappi-merkki,.kieppi-merkki) svg{transform:scale(.72)}
[data-merkit="pieni"] :is(.rk-merkki,.jatkos-merkki,.kaappi-merkki,.kieppi-merkki) svg{transform:scale(.48)}
/* Samassa kohdassa kulkevat reitit kaapelin ikkunan alla (24.10.2026) */
.samassa-kohdassa{margin-top:10px;padding-top:8px;border-top:1px solid var(--border);display:flex;flex-direction:column;gap:4px}
.samassa-rivi{display:block;width:100%;text-align:left;font:inherit;font-size:12.5px;padding:5px 8px;border:1px solid var(--border);border-radius:6px;background:var(--surface,#fff);color:inherit;cursor:pointer}
.samassa-rivi:hover{background:var(--hover,#f2f5fa)}
.samassa-rivi small{color:var(--muted)}
.paatemerkki{background:none;border:0}
.leaflet-tooltip.vapaapaa-vihje{color:#d9480f;font-weight:600;border-color:#d9480f}

/* Muistilappu kartalla (0041, 25.10.2026) */
.karttalappu{background:#ffd43b;border:1.6px solid #a07d00;border-radius:3px 3px 3px 10px;box-shadow:0 1px 4px rgba(0,0,0,.35);
  display:flex;align-items:center;justify-content:center;font:800 15px/1 system-ui,sans-serif;color:#5c4400}
.karttalappu.lappu-vihrea{background:#8ce99a;border-color:#2b8a3e;color:#1b4d2a}
.karttalappu.lappu-punainen{background:#ff8787;border-color:#c92a2a;color:#5c0f0f}
/* Kohteen alueen napit omalla rivillään talon ikkunassa (25.10.2026) */
.alue-napit{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:8px;padding-top:8px;border-top:1px solid #e3e7ec}
.alue-napit>span{font-size:12px;color:#5b6b7a;margin-right:2px}
.alue-napit .nappi{flex:none;width:auto;margin:0}
/* Kartan läpiviennin irtopää: sisältä odottaa jatkoa ulos (29.10.2026) */
.lv-irtopaa-merkki{pointer-events:none;background:none;border:0}
.lv-irtopaa-teksti{font:700 11.5px var(--sans,system-ui,sans-serif);fill:#b35a00;paint-order:stroke;stroke:#fff;stroke-width:3.5px;stroke-linejoin:round}
.lv-odottaa-ulos{margin-top:8px;padding:6px 8px;border-left:3px solid #d1762b;background:#fff6ec;border-radius:4px}
.lv-irtopaa-merkki svg{overflow:visible}
/* 30.10.2026 (Aki: "isossa kuvassa 100 m pitkä"): pää lyhenee kauempaa kuten muut merkit, mutta voimakkaammin; teksti
   kompensoidaan takaisin ~11,5 px:iin, jotta tunnus pysyy luettavana. Skaalauksen keskipiste = läpivienti (svg:n keskikohta). */
[data-merkit="keski"] .lv-irtopaa-merkki svg{transform:scale(.5)}
[data-merkit="pieni"] .lv-irtopaa-merkki svg{transform:scale(.3)}
[data-merkit="keski"] .lv-irtopaa-teksti{font-size:23px;stroke-width:7px}
[data-merkit="pieni"] .lv-irtopaa-teksti{font-size:38px;stroke-width:11.5px}
.lv-irtopaa-merkki .lv-irtopaa-tartu{pointer-events:auto;cursor:pointer}
.lv-irtopaa-merkki circle.lv-irtopaa-tartu:hover{fill:#d1762b}
.lv-irtopaa-valinta{display:grid;gap:6px;min-width:200px}
.lv-irtopaa-valinta .nappi{text-align:left}
/* ===== 10_hitsaus_jaljitys_vaikutus.css ===== */
/* Hitsauskotelo (10.10.2026): kuidun väripallo TIA-598 (täyttö = kuitu, reunus = putki), kotelon kaapelit, sarjalomake */
.kuitupallo{display:inline-block;width:10px;height:10px;border-radius:50%;margin:0 3px 0 2px;vertical-align:-1px;
  border:1px solid rgba(0,0,0,.35)}
.kotelokaapelit{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
.kotelokaapeli{font-size:12.5px;padding:4px 9px;border:1px solid var(--border);border-radius:999px;background:var(--surface-2);color:var(--ink-2);cursor:pointer;font:inherit;font-size:12.5px;display:inline-flex;align-items:center;gap:5px}
.kotelokaapeli.valittu{border-color:var(--ink-2);box-shadow:0 0 0 2px rgba(47,111,208,.25);background:var(--surface)}
.kaapelivari{display:inline-block;width:14px;height:4px;border-radius:2px}
.h-kartta{height:230px;border:1px solid var(--border);border-radius:8px;margin:0 0 12px;z-index:0}
.h-kartta-nimi span{display:inline-block;transform:translate(-50%,-50%);background:#fff;border:2px solid;border-radius:6px;padding:0 5px;font:700 11px/1.5 system-ui,sans-serif;white-space:nowrap;box-shadow:0 1px 3px rgba(0,0,0,.25)}
.hitsauslomake{border:1px solid var(--border);border-radius:10px;padding:10px 12px;margin:8px 0 4px;background:var(--surface)}
.hitsauslomake h4{font:700 12.5px var(--sans);text-transform:uppercase;letter-spacing:.6px;color:var(--muted);margin:0 0 8px}
.hrivi{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;margin-bottom:7px}
.hrivi label{font-size:12.5px;color:var(--muted)}
.hrivi input[type=number]{width:68px}
.h-vapaat{flex-direction:column;align-items:flex-start;gap:2px}
.h-vapaat small{font-size:12px;color:var(--muted)}
.h-vapaat small b{color:var(--ink)}
.h-vapaat .h-varattu{color:#8a5a00;font-weight:600}
.hrivi input[type=text]{flex:1;min-width:160px}
.hrivi select{max-width:100%}

/* Kuidun jäljitys (10.10.2026): dialogi, ketju pystysuorana janana */
.jaljitysikkuna{border:1px solid var(--border);border-radius:14px;padding:0;width:min(640px,calc(100vw - 32px));
  max-height:calc(100vh - 48px);background:var(--surface);color:var(--ink);box-shadow:0 20px 60px rgba(0,0,0,.25)}
.jaljitysikkuna::backdrop{background:rgba(15,25,40,.45)}
.jalj-yla{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;padding:14px 16px 10px;
  border-bottom:1px solid var(--border);position:sticky;top:0;background:var(--surface);z-index:1}
.jalj-yla h3{margin:2px 0 2px;font-size:16px}
.jalj-yla small{color:var(--muted);font-size:12.5px}
.jalj-huom{margin:10px 16px 0;padding:8px 10px;border-radius:8px;font-size:13px}
.jalj-huom.avoin{background:var(--red-soft,#fbe9e7);color:#8f2a20}
.jalj-huom.oletus{background:var(--yellow-soft,#fdf3d8);color:#7a5408}
ol.jaljitys{list-style:none;margin:8px 0 14px;padding:0 16px}
ol.jaljitys li{display:flex;gap:10px;padding:7px 0 7px;position:relative}
ol.jaljitys li:not(:last-child)::after{content:"";position:absolute;left:11px;top:30px;bottom:-6px;border-left:2px solid var(--border)}
.j-ikoni{flex:0 0 24px;height:24px;border-radius:50%;display:grid;place-items:center;font-size:13px;
  background:var(--surface-2);border:1px solid var(--border);color:var(--ink-2);z-index:1}
.j-portti .j-ikoni{background:#e6eefb;color:#2f6fd0;border-color:#b9cdf0}
.j-kuitu .j-ikoni{background:#e8f4ec;color:#1c8a4d;border-color:#b7dcc4}
.j-hitsaus .j-ikoni{background:#f6ece2;color:#a0612a;border-color:#e3c9ad}
.j-paate .j-ikoni{background:#003a5a;color:#fff;border-color:#003a5a}
.j-avoin .j-ikoni{background:#cd4335;border-color:#cd4335;color:#fff}
.j-alku .j-otsikko{font-weight:700}
.j-otsikko{font-size:14px}
ol.jaljitys small{display:block;color:var(--muted);font-size:12.5px}
ol.jaljitys small.j-oletus{color:#9a6a0a;font-style:italic}
.j-selite{display:flex;flex-wrap:wrap;gap:4px 14px;margin:6px 16px 2px;padding:8px 10px;border:1px solid var(--border);border-radius:8px;
  background:var(--surface-2);font-size:12.5px;color:var(--muted)}
.j-selite > span{display:inline-flex;align-items:center;gap:6px}
.j-selite .j-ikoni{flex:0 0 20px;width:20px;height:20px;font-size:11px}
ol.jaljitys .j-kytkenta{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap;margin:3px 0 1px;padding:2px 8px;border:1px solid var(--border);border-radius:6px;font-size:13px;font-weight:600;background:var(--surface-2)}
.jaljitysnappi{border:1px solid var(--border);background:var(--surface);border-radius:6px;padding:0 5px;margin-left:4px;
  font-size:12px;line-height:18px;cursor:pointer;color:var(--blue,#2f6fd0)}
.jaljitysnappi:hover{background:var(--blue-soft,#e6eefb)}
.kuitulinkki{border:0;background:none;padding:0;font:inherit;color:inherit;cursor:pointer;text-decoration:underline dotted}
.kuitulinkki:hover{color:var(--blue,#2f6fd0)}
.jaljitysrivi{align-items:center}
.jaljitysrivi label{display:flex;align-items:center;gap:5px;font-size:12.5px;color:var(--muted)}
.jaljitysrivi input{width:58px}
/* Kytkentäkuva (10.10.2026) */
.kaavioikkuna{width:min(1200px,calc(100vw - 24px))}
.kaavio-runko{padding:8px 12px 14px;overflow:auto;max-height:calc(100vh - 140px)}
.kaavio-runko svg.kaavio{width:100%;height:auto;min-width:720px;display:block}
.kaavio-napit,.kaappi-ylanapit{display:flex;gap:8px;align-items:flex-start}
.kaavio-napit{flex-wrap:wrap;justify-content:flex-end}
.kaavio-laajuus{font:12px var(--sans);color:var(--ink-2);display:flex;align-items:center;gap:6px}
.kaavio-laajuus select{font:inherit;padding:3px 5px}
.kaavio-rajaus{margin:0 12px;padding:7px 10px;border:1px solid var(--yellow);background:var(--yellow-soft);border-radius:7px;font-size:12.5px;color:var(--ink-2)}
/* Jäljitys kartalla (10.10.2026) */
.jaljityspalkki{position:absolute;top:10px;left:50%;transform:translateX(-50%);z-index:1000;display:flex;align-items:center;gap:10px;
  background:var(--surface,#fff);border:1px solid var(--border);border-radius:10px;padding:7px 10px;box-shadow:0 6px 20px rgba(0,0,0,.18);
  max-width:calc(100% - 120px);font-size:13px}
.jaljityspalkki b{display:block;font-size:13.5px}
.jaljityspalkki small{display:block;color:var(--muted);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:46vw}
.jp-viiva{flex:0 0 22px;height:6px;border-radius:3px;background:#e0218a;box-shadow:0 0 0 2px #fff,0 0 0 3px #e0218a33}
.jp-avoin{color:#cd4335;font-weight:700}
.jp-paluu{flex:0 0 auto;white-space:nowrap;text-decoration:none}
a.y-kohdista{font-size:12px;font-weight:400;white-space:nowrap;margin-left:4px}
.jalj-nro span{display:grid;place-items:center;width:24px;height:24px;border-radius:50%;background:#e0218a;color:#fff;
  font:700 12px system-ui,sans-serif;border:2px solid #fff;box-shadow:0 1px 4px rgba(0,0,0,.35)}
@media (max-width:700px){.jaljityspalkki{left:8px;right:8px;transform:none;max-width:none}.jaljityspalkki small{max-width:40vw}}
/* Katkon vaikutus (10.10.2026) */
.vk-yhteenveto{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:12px 16px 4px}
.vk-yhteenveto div{background:var(--surface-2);border:1px solid var(--border);border-radius:10px;padding:8px 10px}
.vk-yhteenveto b{display:block;font-size:20px;line-height:1.1}
.vk-yhteenveto span{font-size:12px;color:var(--muted)}
.vk-yhteenveto div:first-child b{color:#cd4335}
.vk-osio{margin:12px 16px 0}
.vk-osio .eyebrow{margin-bottom:6px}
.vk-asiakkaat{display:flex;flex-wrap:wrap;gap:6px}
.vk-asiakas{display:inline-block;background:#e6eefb;color:#1d4f9a;border-radius:6px;padding:0 6px;font-size:12px;line-height:18px}
.vk-asiakas.iso{font-size:13.5px;padding:3px 9px;line-height:20px}
.vk-asiakas.iso small{color:#5b77a3}
ul.vk-lista{list-style:none;margin:0 0 4px;padding:0}
ul.vk-lista li{display:grid;grid-template-columns:96px 1fr auto;gap:10px;align-items:center;padding:8px 0;border-top:1px solid var(--border)}
.vk-kuidut small{display:block;color:var(--muted);font-size:12px}
.vk-paat{display:grid;grid-template-columns:1fr 18px 1fr;gap:6px;align-items:start;font-size:13.5px}
.vk-paat small{display:block;color:var(--muted);font-size:12px}
.vk-nuoli{color:var(--muted);text-align:center}
.vk-vapaat{color:var(--muted);font-size:13px;margin-bottom:14px}
.vk-palvelu{font-weight:600;font-size:13px;color:#8f2a20;margin-top:2px}
ul.vk-lista li.vk-varattu{opacity:.72}
ul.vk-lista li.vk-varattu .vk-palvelu{color:inherit}
.vk-kuidut .merkkipallo{margin-top:3px;display:inline-block}
@media (max-width:560px){.vk-yhteenveto{grid-template-columns:repeat(2,1fr)}
  ul.vk-lista li{grid-template-columns:1fr auto}.vk-paat{grid-column:1/-1;grid-row:2;grid-template-columns:1fr}.vk-nuoli{display:none}}
/* Operaattorin reititin ja Mistä netti tulee (21.10.2026) */
.reititinkortti{margin:6px 0 2px;padding:8px 10px;border:1px solid #f0c9a8;border-left:4px solid #c2410c;border-radius:8px;background:#fff7f0;font-size:13.5px}
.reititinkortti small{display:block;color:var(--muted);font-size:12.5px}
.reititinkortti .rt-nimi{font-weight:600;margin-bottom:2px}
#porttiruutu > .reititinkortti{max-width:560px;margin:0 0 10px}
.netti-reitti{margin:10px 16px 14px;padding-top:8px;border-top:1px solid var(--border)}
.netti-osa{margin:6px 0;border:1px solid var(--border);border-radius:8px;padding:4px 10px}
.netti-osa > summary{cursor:pointer;font-size:13px;font-weight:600;padding:4px 0}
.sfp-merkki.wan-merkki{color:#c2410c;border-color:#f0c9a8;background:#fff7f0}
.paneelihitsaus{margin:6px 0 8px;display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px}
.paneelihitsaus small{color:var(--muted)}
/* Splitterin IN omana värinään, OUT-numerot 1… (24.10.2026) */
.spl-in{display:inline-block;font:700 12px var(--sans);color:#fff;background:#c2410c;border-radius:5px;padding:2px 8px}
.spl-out{font:600 10.5px var(--sans);color:#0e7490;letter-spacing:.04em}
tr.spl-in-rivi td{background:#fff4ec}

/* UX-kierros 26.10.2026: lomakkeen numerokentät samankokoisiksi kuin valikot, kaapelin tunnus ei katkea sirussa */
.hrivi input{min-height:34px;padding:5px 8px;border:1px solid var(--border-strong);border-radius:8px;font:14px var(--sans);background:var(--surface);color:var(--ink)}
.kotelokaapeli{text-align:left}
.kotelokaapeli b{white-space:nowrap;flex:none}
/* Hitsauslomake Mistä → Mihin (26.10.2026): numeroidut osat, valittu kuituväli näkyvissä, tallennus alhaalla */
.h-osa{display:grid;grid-template-columns:118px minmax(0,1fr);gap:4px 10px;align-items:center;padding:6px 0;border-top:1px solid var(--border)}
.h-osa:first-of-type{border-top:0}
.h-osa .hrivi{margin:0}
.h-osaots{font:600 13px var(--sans);color:var(--ink);display:flex;flex-wrap:wrap;align-items:center;gap:2px 6px}
.h-osaots b{display:inline-grid;place-items:center;width:20px;height:20px;border-radius:50%;background:var(--navy);color:#fff;font-size:11.5px}
.h-osaots small{flex:0 0 100%;padding-left:26px;font-weight:400;color:var(--muted);font-size:11.5px}
.h-vali{font-size:13px;font-weight:600;color:var(--navy);white-space:nowrap}
.h-yhteenveto{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 12px;margin-top:8px;padding:8px 10px;
  background:var(--surface-2);border-radius:8px;font-size:13.5px}
@media (max-width:640px){ .h-osa{grid-template-columns:minmax(0,1fr)} .h-osa select{width:100%} .h-osaots small{flex:none;padding:0} .h-vali{white-space:normal} .h-yhteenveto .nappi{width:100%} }
.h-kartta-suunta span{background:#f5a300;border-color:#c77d00;color:#1a1a1a}

/* Hitsausrivi (14.11.2026): kuva nuolen tilalla — A-kuidun väri, hitsauskohta, B-kuidun väri; kapea sarake ettei kuva
   valu taulukon keskelle. Kaapelisuodattimen kääntämä rivi peilataan. */
.porttitaulu td.h-liitos{width:72px;padding-left:4px;padding-right:4px;text-align:center;white-space:nowrap}
.h-hitsaus{display:block;margin:0 auto}
tr[data-kaannetty="1"] .h-hitsaus{transform:scaleX(-1)}
.porttitaulu td.h-asolu,.porttitaulu td.h-bsolu{white-space:nowrap;width:1%}   /* sisällön levyiset, Huom. saa loput */
.porttitaulu td.h-huom{width:99%}
.h-kartta-puoli span{font-weight:600;color:#1a2433}   /* keskeltä avatun kaapelin alku-/loppupää (14.11.2026) */
/* Hitsauksen huomautus muokattavana (14.11.2026) */
.h-huomkentta{width:100%;min-width:140px;box-sizing:border-box;border:1px solid transparent;border-radius:6px;padding:3px 6px;
  font:inherit;background:transparent;color:var(--ink)}
.h-huomkentta:hover{border-color:var(--border-strong)}
.h-huomkentta:focus{border-color:var(--blue);background:var(--surface);outline:none}
.h-huomkentta.virhe{border-color:var(--red)}
/* ===== 11_ohjesivu_suodatus.css ===== */
/* Ohjeet (11.10.2026) */
.ohj-runko{display:grid;grid-template-columns:230px 1fr;gap:24px;align-items:start}
.ohj-sisalto{position:sticky;top:12px;background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:12px}
.ohj-sisalto input[type=search]{width:100%;box-sizing:border-box}
.ohj-omat{display:flex;gap:6px;align-items:center;font-size:13px;color:var(--ink-2);margin:8px 0 4px}
.ohj-sisalto ol{margin:8px 0 0;padding-left:20px;font-size:14px;line-height:1.9}
.ohj-osio{margin-bottom:26px;scroll-margin-top:12px}
.ohj-osio h2{font-size:19px;margin:0 0 4px}
.ohj-johdanto{color:var(--ink-2);font-size:14px;margin:0 0 10px;max-width:80ch}
.ohj-kortti{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:12px 16px;margin-bottom:10px;scroll-margin-top:12px}
.ohj-kortti h3{font-size:15px;margin:0 0 6px;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.ohj-kortti ol{margin:0;padding-left:22px;font-size:14px;line-height:1.55}
.ohj-kortti ol li{margin:3px 0}
.ohj-kortti p{margin:0;font-size:14px;line-height:1.55}
.ohj-kortti.ei-oikeutta{opacity:.6}
.ohj-vinkki{margin-top:8px!important;padding:6px 10px;border-radius:8px;background:var(--yellow-soft,#fdf3d8);color:#6b4a06;font-size:13px!important}
.ohj-taulu{display:grid;gap:4px;margin-top:4px}
.ohj-kuva{margin:10px 0 0}
.ohj-kuva img{display:block;max-width:min(100%,680px);height:auto;border:1px solid var(--line,#ddd);border-radius:8px}
.ohj-kuva figcaption{margin-top:4px;font-size:12.5px;color:var(--muted)}
.ohj-taulu span{font-size:13.5px}
.ohj-taulu i{color:var(--muted)}
@media (max-width:760px){.ohj-runko{grid-template-columns:1fr}.ohj-sisalto{position:static}}
/* Suodatus-välilehti (11.10.2026) */
.suodatus{padding:14px 16px}
.sd-rivi{display:grid;grid-template-columns:78px 1fr auto 1fr;gap:6px;align-items:center;margin:6px 0;font-size:13px}
.sd-rivi label{color:var(--ink-2)}
.sd-rivi select,.sd-rivi input[type=search]{grid-column:2/5;min-width:0}
.sd-rivi input[type=number]{min-width:0;width:100%;box-sizing:border-box}
.sd-pikat{display:flex;flex-wrap:wrap;gap:5px;margin:2px 0 8px 84px}
.sd-pikat button{border:1px solid var(--border);background:var(--surface);border-radius:999px;padding:2px 9px;font-size:12px;cursor:pointer;color:var(--ink-2)}
.sd-pikat button[aria-pressed=true]{background:var(--navy,#003a5a);border-color:var(--navy,#003a5a);color:#fff}
.sd-valinta{display:flex;gap:6px;align-items:center;font-size:12.5px;color:var(--ink-2);margin:6px 0}
.sd-taulu{width:100%;border-collapse:collapse;font-size:13px;margin-top:4px}
.sd-taulu th{text-align:left;font-weight:500;color:var(--ink-2);padding:3px 0}
.sd-taulu td{text-align:right;padding:3px 0 3px 8px;white-space:nowrap}
.sd-taulu td:last-child{color:var(--muted);font-size:12px}
.sd-taulu tr+tr{border-top:1px solid var(--border)}
.sd-vuodet{margin-top:8px;font-size:13px}.sd-vuodet summary{cursor:pointer;color:var(--blue,#2f6fd0)}
.sd-huom{display:block;color:var(--muted);font-size:12px;margin-top:4px}
.sd-lista{max-height:260px;overflow:auto;border:1px solid var(--border);border-radius:8px;margin-top:4px}
.sd-kaapeli{display:flex;justify-content:space-between;gap:8px;width:100%;border:0;border-bottom:1px solid var(--border);background:none;
  padding:6px 9px;text-align:left;font:inherit;font-size:13px;cursor:pointer;color:var(--ink)}
.sd-kaapeli:hover{background:var(--surface-2)}
.sd-kaapeli span{color:var(--muted);font-size:12px;white-space:nowrap}
#suodin-merkki{color:#d1762b}
.vasen-valilehdet button{white-space:nowrap;padding-left:8px;padding-right:8px}
#suodin-merkki{background:none;min-width:0;padding:0 2px}
.kaivon-kotelo{margin-top:6px;padding-top:6px;border-top:1px solid var(--border,#dce4ee)}
.kaivon-kotelo .mk-napit{margin-top:4px}

/* Pieni ID ikkunoissa: kohteeseen viittaamista varten (11.10.2026) */
.id-merkki{display:inline-block;font:500 10.5px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--muted,#69798e);border:1px solid var(--border,#dce4ee);border-radius:4px;padding:0 4px;margin:0 2px;vertical-align:1px;user-select:all}
.h-valitut{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:8px}.h-valitut label{font-size:13px;display:flex;gap:4px;align-items:center}.h-valitut input{width:64px}
.sfp-merkki{display:inline-block;font:700 9px/1.4 system-ui,sans-serif;color:#7a4fb0;border:1px solid #c9b3e6;background:#f6f0fc;border-radius:3px;padding:0 3px;margin-left:3px;vertical-align:1px}

/* Kotelon kaapelisuodatin ja yhteenveto (25.10.2026) */
.h-suodatin { margin: 14px 0 6px; font-size: 13.5px; }
.h-suodatin select { margin-left: 6px; max-width: 100%; }
.h-yhteenveto { background: var(--surface-2); border: 1px solid var(--border); border-radius: 8px; padding: 10px 12px; margin: 0 0 10px; font-size: 13.5px; line-height: 1.6; }
.h-yv-puoli { margin-top: 6px; }
.h-yv-puoli > i { display: block; color: var(--ink-2); font-style: normal; font-weight: 600; font-size: 12.5px; }
.h-yv-vapaat { margin-top: 6px; color: var(--muted); }
/* ===== 12_yhteydet.css ===== */
/* ---------- Yhteydet (palvelut, 11.10.2026) ---------- */
.yhteysmerkki{display:inline-block;font:600 10.5px var(--mono);padding:1px 6px;border-radius:5px;border:1px solid var(--blue);color:var(--blue);background:var(--blue-soft);text-decoration:none;vertical-align:1px;white-space:nowrap}
.yhteysmerkki:hover{background:var(--blue);color:#fff}
.yhteysmerkki.t-suunniteltu,.yhteysmerkki.t-rakenteilla{border-style:dashed}
.yhteysmerkki.t-irtisanottu{border-color:var(--orange);color:var(--orange);background:var(--yellow-soft)}
.merkkipallo.t-suunniteltu{background:var(--surface-2);color:var(--ink-2)}
.merkkipallo.t-rakenteilla,.merkkipallo.t-kytkematta{background:var(--yellow-soft);color:var(--yellow)}
.merkkipallo.t-valmis{background:var(--green-soft);color:var(--green)}
.merkkipallo.t-irtisanottu{background:var(--red-soft);color:var(--orange)}
.merkkipallo.t-purettu{background:var(--surface-2);color:var(--muted);text-decoration:line-through}
.palvelulista{list-style:none;margin:6px 0;padding:0;display:flex;flex-direction:column;gap:8px}
.palvelulista li{border:1px solid var(--border);border-radius:8px;padding:8px 10px;background:var(--surface)}
.palvelulista small{display:block;color:var(--ink-2);margin-top:3px}
.pl-rivi{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.pl-vika{margin-top:5px;font-size:13px}
.pl-vika.puuttuu{color:var(--orange);font-size:12px}
.pl-napit{display:flex;gap:6px;margin-top:7px;flex-wrap:wrap}
.jalj-yhteys{margin:0 16px 10px}
.mk-yhteydet{margin-top:8px;max-height:360px;overflow:auto}
/* Yhteydet taulukkona (kaapelin ikkuna, katkon vaikutus) */
.pl-taulukko{margin-top:6px}
.pl-taulukko table.pl-taulu{min-width:0;font-size:12.5px}
.pl-taulu th{padding:6px 8px}
.pl-taulu td{padding:5px 8px;vertical-align:top}
.pl-taulu .pl-nimi{margin-top:2px;line-height:1.25}
.pl-taulu .pl-nimi small{font-family:inherit}
.pl-taulu td.yk-nro{font-size:12.5px}
.pl-taulu .pl-puuttuu{color:var(--orange);font-size:12px}
.pl-taulu a[href^="tel:"]{white-space:nowrap}
.y-otsake{display:flex;justify-content:space-between;align-items:flex-start;gap:14px;flex-wrap:wrap;margin-bottom:16px}
.y-otsake h1{font-size:24px;margin:4px 0;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.y-otsake p{color:var(--ink-2);font-size:14px;margin:4px 0 0;max-width:70ch}
.y-iso-tunniste{font-family:var(--mono);letter-spacing:.02em}
.y-nimi{font-size:17px!important;color:var(--ink)!important;font-weight:600}
.y-napit{display:flex;gap:8px;flex-wrap:wrap}
.y-paat{display:grid;grid-template-columns:1fr auto 1fr;gap:12px;align-items:stretch;margin:12px 0 16px}
.y-paat.pieni{margin:10px 0 6px}
.y-paa{border:1px solid var(--border);border-radius:10px;padding:12px 14px;background:var(--surface)}
.y-paa b{display:block;font-size:15px;margin:3px 0 2px}
.y-paa div{font-size:13px;color:var(--ink-2)}
.y-laitepaikka{font-family:var(--mono);font-size:12px!important;margin-top:4px}
.y-puuttuu{color:var(--orange)!important}
.y-nuoli{align-self:center;font-size:22px;color:var(--muted)}
.y-ruudukko{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:14px}
.y-ruudukko .kortti h2,.kortti > h2,.y-varausotsake h2{font-size:16px;margin:0 0 10px}
.y-tiedot{display:grid;grid-template-columns:auto 1fr;gap:6px 14px;margin:0}
.y-tiedot div{display:contents}
.y-tiedot dt{color:var(--muted);font-size:13px}
.y-tiedot dd{margin:0;font-size:14px}
.y-henkilot{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}
.y-varausotsake{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap}
.y-selite{color:var(--ink-2);font-size:13px;margin:0 0 10px}
.y-taulu .y-tunniste{font-family:var(--mono);font-weight:700;white-space:nowrap}
.y-lomake .kentta-rivi{margin-bottom:9px}
.y-paarivi{display:flex;gap:6px;align-items:center;flex-wrap:wrap;margin-bottom:8px}
.y-paarivi select{max-width:100%;flex:1 1 220px}
.y-paarivi .y-portti{width:80px}
.y-henkilorivi{display:grid;grid-template-columns:150px 1fr 1fr 130px 1fr auto;gap:6px;margin-bottom:6px}
.y-esikatselu{margin:8px 0 12px}
.y-esikatselu details{font-size:13px;margin-top:4px}
.y-tallennusrivi{margin-top:14px}
@media (max-width:760px){
  .y-ruudukko{grid-template-columns:1fr}
  .y-paat{grid-template-columns:1fr}
  .y-nuoli{transform:rotate(90deg);justify-self:center}
  .y-henkilorivi{grid-template-columns:1fr 1fr}
}

/* Yhteydet-lista puhelimessa korteiksi (UX-kierros 26.10.2026): taulukko leikkautui ja päät jäivät näkymättä */
@media (max-width:899px){
  .y-taulu thead{display:none}
  .porttitaulu table.y-taulu{min-width:0}
  .y-taulu,.y-taulu tbody,.y-taulu tr,.y-taulu td{display:block;width:auto}
  .y-taulu tr{border-bottom:1px solid var(--border);padding:10px 12px}
  .y-taulu td{border:0;padding:2px 0}
  .y-taulu td:first-child{display:flex;align-items:center;justify-content:space-between;gap:10px}
  .y-taulu td:first-child br{display:none}
  .y-taulu td[data-o]{position:relative;padding-left:86px;overflow-wrap:anywhere}
  .y-taulu td[data-o]::before{content:attr(data-o);position:absolute;left:0;top:4px;width:78px;font-size:11.5px;color:var(--muted)}
  .y-taulu td small{white-space:normal}
  .y-taulu td[data-o]:empty,.y-taulu td[data-o="Sopimus"]:has(small:empty),.y-taulu td[data-o="Kytketty"]:empty{display:none}
  .y-taulu td.tyhja{display:block}
}
/* ===== 13_puhelin.css ===== */
/* Puhelinasettelu (13.10.2026): body.mobiili asetetaan JS:llä (matchMedia max-width 899px). Kartta koko ruudulle,
   alareunassa nappirivi, paneelit alapaneeleina yksi kerrallaan, kartan ikkuna alapaneelina. */
.mobiilinavi,.mobiilitila{display:none}
body.mobiili{--mnavi:calc(58px + env(safe-area-inset-bottom, 0px));overflow:hidden}
body.mobiili #kartta{position:fixed!important;top:0;left:0;right:0;bottom:var(--mnavi);height:auto;border-radius:0;border:0;z-index:900}
body.mobiili .leaflet-control-zoom{display:none}            /* nipistys riittää, napit veivät tilaa */
body.mobiili #isoKartta,body.mobiili #vt-piirto,body.mobiili #vasen-piirto,
body.mobiili .selite-ohje{display:none!important}
.mobiilinavi{position:fixed;left:0;right:0;bottom:0;z-index:1150;height:var(--mnavi);padding-bottom:env(safe-area-inset-bottom, 0px);
  background:var(--navy);box-shadow:0 -4px 16px rgba(0,0,0,.18)}
body.mobiili .mobiilinavi{display:flex}
.mobiilinavi > *{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;min-width:0;
  appearance:none;border:0;background:none;color:#cfe0ee;font:600 11.5px var(--sans);text-decoration:none;cursor:pointer;
  -webkit-tap-highlight-color:transparent}
.mobiilinavi > * svg{flex:none}
.mobiilinavi > *{font-size:11px;letter-spacing:-.1px}
.mobiilinavi > [aria-pressed="true"]{color:#fff;background:rgba(255,255,255,.14)}
.mobiilinavi #mobiiliSijainti[aria-pressed="true"] svg{color:#5ec2ff}
/* Paneelit alapaneeleina: piilossa visibilityllä (ei display:none), jotta kartalle nostetut tilarivit voisivat näkyä */
body.mobiili .kelluvapaneeli{position:fixed;left:0;right:0;bottom:var(--mnavi);top:auto!important;width:auto!important;
  max-height:min(64vh, calc(100vh - var(--mnavi) - 70px));z-index:1100;display:flex;flex-direction:column;
  background:var(--surface);border-radius:16px 16px 0 0;box-shadow:0 -10px 30px rgba(15,30,45,.3);
  visibility:hidden;pointer-events:none}
body.mobiili .kelluvapaneeli.m-auki{visibility:visible;pointer-events:auto}
body.mobiili .kelluva-kahva{display:flex;align-items:center;justify-content:space-between;flex:none;
  padding:10px 10px 10px 16px;background:none;color:var(--ink);font:700 15px var(--sans);border-bottom:1px solid var(--border);cursor:default}
body.mobiili .kelluva-kahva > span{font-size:0}                 /* ⠿-kahvamerkki pois, otsikko data-otsikosta */
body.mobiili [data-kelluva="vasen"] .kelluva-kahva > span::after{content:'Kohteet';font-size:15px}

body.mobiili .vasen-valilehdet{display:none}                   /* välilehti valitaan alanappirivistä */
body.mobiili [data-kelluva="oheiset"] .kelluva-kahva > span::after{content:'Tasot ja karttapohja';font-size:15px}
body.mobiili [data-kelluva="oheiset"][data-mvt="suodatus"] .kelluva-kahva > span::after{content:'Suodatus'}
body.mobiili [data-kelluva="oheiset"][data-mvt="tyokalut"] .kelluva-kahva > span::after{content:'Työkalut'}
body.mobiili [data-kelluva="valikko"] .kelluva-kahva > span::after{content:'Valikko';font-size:15px}
body.mobiili .kelluva-pienenna{appearance:none;border:0;background:var(--bg);color:var(--ink);width:40px;height:40px;border-radius:50%;
  font-size:0;cursor:pointer}
body.mobiili .kelluva-pienenna::before{content:'×';font:400 26px/1 var(--sans)}
body.mobiili .kelluva-sisus{display:block!important;overflow:auto;padding:12px 16px 16px;min-height:0;-webkit-overflow-scrolling:touch}
body.mobiili .kelluva-sisus > .kortti{box-shadow:none;border:0;padding:0!important}
body.mobiili .kohdelista{max-height:none}
body.mobiili #paavalikkopaneeli{display:flex}
body.mobiili #paavalikkopaneeli .kelluva-sisus{background:none}
body.mobiili #paavalikkopaneeli .kelluva-navi{flex-direction:column;align-items:stretch;gap:0}
body.mobiili #paavalikkopaneeli .kelluva-navi > a,body.mobiili #paavalikkopaneeli .navivalikko summary{color:var(--ink);font-size:16px;
  padding:13px 4px;border-bottom:1px solid var(--border);border-radius:0;background:none}
body.mobiili #paavalikkopaneeli .navivalikko-lista{position:static;box-shadow:none;border:0;min-width:0}
body.mobiili #paavalikkopaneeli .kelluva-ulos{color:var(--red,#cd4335)}
/* Sormelle sopivat napit paneeleissa */
body.mobiili .kelluvapaneeli .nappi,body.mobiili .kelluvapaneeli .seg button,body.mobiili .kelluvapaneeli .selite button,
body.mobiili .kohde-kerrokset a,body.mobiili .kohde-kerrokset button{min-height:40px}
/* Sijainnin tila ja kartan ilmoitukset kartan päällä nappirivin yläpuolella */
body.mobiili .mobiilitila{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;position:fixed;left:8px;right:8px;
  bottom:calc(var(--mnavi) + 10px);z-index:1050;pointer-events:none}
body.mobiili .mobiilitila > *{pointer-events:auto;background:var(--surface);border-radius:999px;padding:6px 12px;
  box-shadow:0 3px 12px rgba(0,0,0,.2);font-size:13px}
body.mobiili .mobiilitila > [hidden]{display:none}
/* Kartan ikkuna alapaneelina (siirretty body-tasolle; Leafletin inline-sijainti ohitetaan) */
body.mobiili .leaflet-popup.m-alapaneeli{position:fixed!important;left:0!important;right:0;bottom:var(--mnavi)!important;top:auto!important;
  transform:none!important;margin:0!important;z-index:1120;opacity:1!important}
body.mobiili .m-alapaneeli .leaflet-popup-content-wrapper{border-radius:16px 16px 0 0;box-shadow:0 -10px 30px rgba(15,30,45,.3);
  max-height:min(62vh, calc(100vh - var(--mnavi) - 80px));overflow:auto;-webkit-overflow-scrolling:touch}
body.mobiili .m-alapaneeli .leaflet-popup-content{width:auto!important;max-height:none!important;margin:16px 16px 18px;font-size:14.5px}
body.mobiili .m-alapaneeli .leaflet-popup-tip-container{display:none}
body.mobiili .m-alapaneeli a.leaflet-popup-close-button{width:40px;height:40px;font:400 28px/40px var(--sans);top:6px;right:6px;
  position:absolute;bottom:auto;z-index:2}
body.mobiili .m-alapaneeli .nappi{min-height:42px}
/* Reittipalkki: yksi rivi yläreunassa */
body.mobiili .jaljityspalkki{top:8px;left:8px;right:8px;transform:none;max-width:none;flex-wrap:nowrap;gap:6px;padding:6px 8px}
body.mobiili .jaljityspalkki > div{min-width:0;flex:1}
body.mobiili .jaljityspalkki b{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:13px}
body.mobiili .jaljityspalkki small{max-width:none}
body.mobiili .jaljityspalkki .jp-viiva{display:none}
body.mobiili .jaljityspalkki .nappi{min-height:36px;padding:4px 9px}
@media print{ .mobiilinavi,.mobiilitila{display:none!important} }

/* Pohjakuva puhelimessa (13.10.2026): rakennus.php asettaa body.mobiili (alle 900 px). Yläreunassa murut ja kerrokset
   yhdellä rivillä, pohjakuva täyttää välin, tasot / tiedot / valikko alapaneeleina nappirivin yläpuolella. */
body:not(.mobiili) .m-vain,body:not(.mobiili) .m-valikko{display:none!important}
body.mobiili .ylapalkki,body.mobiili .alapalkki,body.mobiili .tyokalurivi,body.mobiili .tyokalupalkki .tyokalut-oik{display:none!important}
body.mobiili .tyokalupalkki{position:fixed;top:0;left:0;right:0;z-index:1000;height:52px}
body.mobiili .tyokalupalkki .sisus{flex-wrap:nowrap;height:100%;padding:0 10px;gap:8px}
body.mobiili .tyokalupalkki .murut{flex-wrap:nowrap;white-space:nowrap;overflow:hidden;flex:1 1 auto;min-width:0}
body.mobiili .tyokalupalkki .murut > *{overflow:hidden;text-overflow:ellipsis}
body.mobiili .tyokalupalkki .murut > a:first-child,body.mobiili .tyokalupalkki .murut > i:nth-of-type(1){display:none}
body.mobiili .kerrosvalinta{flex:none;overflow-x:auto;max-width:55vw}
body.mobiili .kerrosvalinta a{min-width:38px;min-height:34px;display:grid;place-items:center}
body.mobiili .pohjaruutu{position:fixed;top:52px;left:0;right:0;bottom:var(--mnavi);display:block}
body.mobiili .levy{height:100%}
body.mobiili .zoomtyokalut{position:fixed;top:auto;left:auto;right:10px;bottom:calc(var(--mnavi) + 12px);transform:none;margin:0;z-index:1050}
body.mobiili .zoomtyokalut button{min-width:40px;min-height:40px}
/* Alapaneelit: tasot (levyn sisällä), tiedot (sivupaneeli), valikko */
body.mobiili .tasot,body.mobiili aside.tiedot,body.mobiili .m-valikko{position:fixed;left:0;right:0;bottom:var(--mnavi);top:auto;z-index:1100;
  max-height:min(62vh, calc(100vh - var(--mnavi) - 70px));background:var(--surface);border:0;border-radius:16px 16px 0 0;
  box-shadow:0 -10px 30px rgba(15,30,45,.3);display:none}
body.mobiili .tasot.m-auki{display:flex;flex-wrap:wrap;align-content:flex-start;gap:8px;padding:0 16px 16px;overflow:auto}
body.mobiili .tasot .m-ots{flex:0 0 100%;margin:0 -16px}
body.mobiili .tasot button{min-height:40px;font-size:12.5px}
body.mobiili .tasot .m-sulje{font:400 26px/1 var(--sans);letter-spacing:0;text-transform:none;padding:0;border:0;
  background:var(--bg);color:var(--ink);width:40px;min-height:40px;justify-content:center}
body.mobiili aside.tiedot.m-auki{display:flex;flex-direction:column}
body.mobiili aside.tiedot .tiedot-ylä{position:relative;padding-right:56px}
body.mobiili .m-tsulje{position:absolute;top:8px;right:8px}
body.mobiili .tiedot-sisus{overflow:auto;-webkit-overflow-scrolling:touch}
body.mobiili .tiedot-toiminnot{flex-direction:row;flex-wrap:wrap}
body.mobiili .tiedot-toiminnot .nappi{flex:1 1 auto;min-height:42px}
body.mobiili .m-valikko.m-auki{display:flex;flex-direction:column}
body.mobiili .m-valikko .m-sisus{overflow:auto;padding:4px 16px 16px}
.m-ots{display:flex;align-items:center;justify-content:space-between;padding:10px 10px 10px 16px;border-bottom:1px solid var(--border);
  font:700 15px var(--sans);flex:none}
.m-sulje{appearance:none;border:0;background:var(--bg);color:var(--ink);width:40px;height:40px;border-radius:50%;
  font:400 26px/1 var(--sans);cursor:pointer;display:grid;place-items:center}
.m-linkit{display:flex;flex-direction:column}
.m-linkit > a,.m-linkit .navivalikko summary{color:var(--ink);font-size:16px;padding:13px 4px;border-bottom:1px solid var(--border);
  text-decoration:none;background:none;border-radius:0}
.m-linkit .navivalikko-lista{position:static;box-shadow:none;border:0;min-width:0}
.m-linkit .m-ulos{color:var(--red,#cd4335)}
/* Kaappinäkymä puhelimessa: otsikko rivittyy, teline lyhyemmäksi jotta portit näkyvät sen alla */
@media (max-width:899px){
  .kaappi-ylä{padding:10px 12px;gap:8px}
  .kaappi-ylä h2{font-size:18px}
  .kaappi-ylanapit{flex-wrap:wrap}
  .kaappi-ylanapit .nappi{min-height:40px}
  .telineruutu{max-height:46vh;padding:10px}
  .porttiruutu{padding:12px}
  .jaljitysikkuna{width:calc(100vw - 16px)!important;max-width:none;max-height:calc(100vh - 16px)}
}
/* ===== 14_versio_yhteysvalinta.css ===== */
/* Versio Asetukset-valikon lopussa (13.10.2026) */
.navi-versio{display:block;padding:7px 12px 5px;border-top:1px solid var(--border);margin-top:4px;font:500 11.5px var(--mono);color:var(--muted)!important}
.alapalkki a{color:inherit}

/* Yhteyden alkupään valinta kartalta (14.10.2026) */
.y-valitsin{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);grid-template-rows:auto 1fr;gap:8px 12px;margin:8px 0 12px}
.y-minikartta{grid-row:1 / span 2;height:320px;border:1px solid var(--border);border-radius:10px}
.y-kohde{font-size:13.5px}
.y-kohde b{display:block;margin-bottom:4px}
.y-kaappirivi{display:flex;flex-wrap:wrap;gap:5px;align-items:center;margin:3px 0}
.y-kaappirivi small{width:100%;color:var(--muted)}
.y-kaappirivi .nappi[aria-pressed="true"]{background:var(--navy,#003a5a);color:#fff;border-color:transparent}
.y-portit{max-height:236px;overflow:auto;border:1px solid var(--border);border-radius:8px}
.y-portit:empty{display:none}
.y-porttitaulu{width:100%;border-collapse:collapse;font-size:12.5px}
.y-porttitaulu td{padding:4px 7px;border-bottom:1px solid var(--border);vertical-align:top}
.y-porttitaulu td small{display:block;color:var(--muted)}
.y-porttitaulu .pnro{font-family:var(--mono);font-weight:700;width:2.5em;text-align:right}
.y-porttitaulu tr[tabindex]{cursor:pointer}
.y-porttitaulu tr[tabindex]:hover{background:#eef4fc}
.y-porttitaulu tr.pt-perilla .pnro{color:var(--green)}
.y-porttitaulu tr.pt-avoin .pnro{color:var(--orange)}
.y-porttitaulu tr.pt-tyhja{opacity:.6}
.y-porttitaulu tr.pt-varattu{color:var(--red);cursor:not-allowed}
.y-porttitaulu tr.valittu{background:#dbe8fb;box-shadow:inset 3px 0 0 #1f6fe0}
.y-paarivi.aktiivinen{outline:2px solid #1f6fe0;outline-offset:3px;border-radius:6px}
.y-merkki{background:none;border:0}
.y-merkki i{display:block;width:14px;height:14px;margin:2px;border-radius:50%;background:#003a5a;border:2px solid #fff;box-shadow:0 0 0 1px #003a5a;cursor:pointer}
.y-merkki.ulko i{background:#13717a;box-shadow:0 0 0 1px #13717a;border-radius:3px}
.y-merkki span{position:absolute;left:21px;top:0;white-space:nowrap;pointer-events:none;font:600 11.5px var(--cond,system-ui);color:#1e2c3b;
  text-shadow:0 0 3px #fff,0 0 3px #fff,0 0 3px #fff}
.y-merkki.valittu i{background:#1f6fe0;box-shadow:0 0 0 3px #1f6fe0}
.y-merkki.valittu span{color:#1f6fe0}
.y-kohdeotsake{display:flex;justify-content:space-between;align-items:baseline;gap:8px}
.linkkinappi{background:none;border:0;padding:0;color:var(--blue,#2f6fd0);font-size:12.5px;cursor:pointer;text-decoration:underline}
/* Lähellä-haku ja porttikuva (22.10.2026) */
.y-merkki.aktiivi i{background:#4b3fb5;box-shadow:0 0 0 1px #4b3fb5;width:12px;height:12px;margin:3px}
.y-kytketty{margin:2px 0 6px}
.y-lahella{display:grid;gap:4px;margin-top:4px}
.y-lahikohde{display:grid;grid-template-columns:1fr auto;gap:0 8px;text-align:left;padding:5px 9px;border:1px solid var(--border);border-radius:7px;background:var(--surface,#fff);cursor:pointer;font:inherit;color:inherit}
.y-lahikohde:hover{border-color:#4b3fb5;background:#f4f2ff}
.y-lahikohde span{font:600 12px var(--mono);color:#4b3fb5}
.y-lahikohde small{grid-column:1 / -1;color:var(--muted)}
.y-kytketty small{color:var(--muted)}
.y-portit{max-height:340px}
.y-etupaneeli{position:sticky;top:0;z-index:1;background:var(--surface,#fff);padding:7px 7px 5px;border-bottom:1px solid var(--border)}
.y-etu{display:grid;grid-template-rows:repeat(2,auto);grid-auto-flow:column;gap:3px;padding:5px;margin-bottom:5px;background:#2b3a4a;border-radius:5px}
.y-ep{min-width:0;height:22px;padding:0;border:0;border-radius:3px;font:700 10.5px var(--mono);color:#fff;cursor:pointer;background:#6b7b8c}
.y-ep.pt-perilla,.y-etuselite i.pt-perilla{background:var(--green,#1c8a4d)}
.y-ep.pt-avoin,.y-etuselite i.pt-avoin{background:var(--orange,#d9822b)}
.y-ep.pt-tyhja,.y-etuselite i.pt-tyhja{background:#8d99a6;color:#e8edf2}
.y-ep.pt-varattu,.y-etuselite i.pt-varattu{background:var(--red,#cd4335);cursor:not-allowed}
.y-ep.valittu{outline:3px solid #5aa0ff;outline-offset:-1px}
.y-ep.kohde,.y-etuselite i.kohde{box-shadow:0 0 0 3px #b9a8ff,inset 0 0 0 2px #4b3fb5}
.y-ep:hover{filter:brightness(1.15)}
.y-etuselite{display:flex;flex-wrap:wrap;align-items:center;gap:3px 6px;font-size:11.5px;color:var(--muted)}
.y-etuselite i{display:inline-block;width:11px;height:11px;border-radius:2px;margin-left:4px}
.y-porttitaulu tr.kohde{box-shadow:inset 3px 0 0 #4b3fb5}
.y-kohdemerkki{color:#4b3fb5!important;font-weight:700}
@media (max-width:899px){.y-valitsin{grid-template-columns:1fr}.y-minikartta{grid-row:auto;height:240px}}
/* ===== 15_ylapalkin_haku.css ===== */
/* ---------- Kokeilu 15.10.2026: yläpalkin haku, ⋯-valikko, zoom yläkulmaan ---------- */
.ylahaku{display:flex;align-items:center;margin:0 6px 0 0;flex:none}
.ylahaku input{width:250px;height:32px;border-radius:8px;border:1px solid rgba(255,255,255,.28);
  background:rgba(255,255,255,.1) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239fc4dd' stroke-width='2.2' stroke-linecap='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='M20 20l-4-4'/%3E%3C/svg%3E") no-repeat 9px 50%/15px;
  color:#fff;padding:0 10px 0 31px;font:14px var(--sans)}
.ylahaku input::placeholder{color:#9fc4dd}
.ylahaku input:focus{background-color:#fff;color:var(--ink);border-color:#fff;outline:2px solid #7fb6dc;outline-offset:1px}
/* Vaalealla pohjalla (puhelimen valikot) */
.m-linkit .ylahaku,body.mobiili .ylahaku{margin:0 0 8px}
.m-linkit .ylahaku input,body.mobiili .ylahaku input{width:100%;background-color:var(--surface);color:var(--ink);
  border-color:var(--border-strong)}
@media (min-width:900px){ .paanavi a.navi-kapea{display:none} }
/* Ison kartan kelluva valikko on kahden paneelin välissä: kapeampi kenttä, laajenee kirjoitettaessa */
body.iso-kartta #paavalikkopaneeli .ylahaku input{width:150px;transition:width .15s}
body.iso-kartta #paavalikkopaneeli .ylahaku input:focus{width:240px}

.lisavalikko{position:relative}
.lisavalikko summary{list-style:none;cursor:pointer;user-select:none}
.lisavalikko summary::-webkit-details-marker{display:none}
.lisavalikko[open] summary{background:var(--surface-2);border-color:var(--border-strong)}
.lisavalikko-lista{position:absolute;right:0;top:calc(100% + 6px);z-index:1200;min-width:190px;background:#fff;
  border:1px solid var(--border);border-radius:9px;box-shadow:0 10px 28px rgba(0,30,50,.18);padding:6px;
  display:flex;flex-direction:column}
.lisavalikko-lista a,.lisavalikko-lista button{appearance:none;border:0;background:none;text-align:left;cursor:pointer;
  color:var(--ink);padding:8px 12px;border-radius:6px;font:500 14px var(--sans);text-decoration:none}
.lisavalikko-lista a:hover,.lisavalikko-lista button:hover{background:var(--surface-2)}
.pohjaruutu{position:relative}
.mittauspaneeli{position:absolute;left:12px;top:12px;z-index:6;max-width:calc(100% - 24px);background:var(--surface);
  border:1px solid var(--border-strong);border-left:4px solid #9d1fb5;border-radius:9px;box-shadow:0 6px 18px rgba(0,30,60,.15);
  padding:9px 12px;font:13px var(--sans);display:grid;gap:5px}
.mittauspaneeli .mk-napit{display:flex;gap:6px;flex-wrap:wrap;margin:2px 0 0}
.mittauspaneeli .nappi{white-space:nowrap;width:auto}
#levy.mittaa #piirros{cursor:crosshair}
/* Aluevalinta (19.10.2026): oranssi reuna kuten korostus; lista vierii, ettei paneeli peitä koko kuvaa */
.aluepaneeli{border-left:4px solid #f08a00;width:320px}
.aluepaneeli .aluelista{list-style:none;margin:6px 0;padding:0;max-height:240px;overflow:auto;font-size:12.5px}
.aluepaneeli .aluelista li{padding:2px 0;border-bottom:1px solid var(--line,#e3e7ec)}
#levy.aluevalinta{touch-action:none}
#levy.aluevalinta #piirros{cursor:crosshair}
.lisavalikko-lista.vasen{right:auto;left:0}
.mittauspaneeli-kartta{border-left:4px solid #9d1fb5}
#kartta.mittaa,#kartta.mittaa .leaflet-interactive{cursor:crosshair!important}
#kartta.mittaa .leaflet-interactive{pointer-events:none!important}
.leaflet-tooltip.mittaluku{background:#fff;border:1px solid #9d1fb5;color:#9d1fb5;font:600 12px var(--sans);padding:1px 6px;box-shadow:none}
body.mobiili .mittauspaneeli{position:fixed;top:60px;left:8px;right:8px;max-width:none;z-index:1060}

/* Zoom on nyt piirroksen edellä: oikeaan reunaan ja negatiivinen alamarginaali, jottei se työnnä piirrosta alas
   (korkeus 36 px + ylämarginaali 10 px). */
.zoomtyokalut{left:auto;transform:none;margin:10px 10px -46px auto}
/* ===== 16_tunnukset.css ===== */
/* ---------- Tunnukset: voimassaolo ja kertasalasana (15.10.2026) ---------- */
.lrivi label.lvalinta{display:flex;align-items:center;gap:8px;font:400 14px var(--sans);text-transform:none;
  letter-spacing:0;color:var(--ink)}
.lrivi label.lvalinta input[type=radio]{margin:0}
.lrivi label.lvalinta input[type=date]{padding:5px 8px}
.tila-vanha{color:var(--red)}
.ks-arvo{font:600 20px var(--mono)!important;letter-spacing:.08em;text-align:center;background:var(--surface-2)}
.ks-ohje{font-size:13.5px;color:var(--ink-2);margin:0}
.varrivi.passivoitu .var-nimi, tr.passivoitu td:not(:last-child){opacity:.55}
/* ===== 17_ux_korjaukset.css ===== */
/* ---------- UX-korjaukset 18.10.2026 (Akin kuvakaappaukset) ---------- */
/* Puhelimen yläpalkki: navi oli vaakavieritteinen ilman vihjettä ("Kohteet S…"). Kapealla haku omalle
   rivilleen ja linkit rivittyvät; overflow näkyväksi, jotta Asetukset-valikko ei leikkaudu. */
.valikkonappi{display:none}
@media (max-width:699px){
  /* Puhelimen yläpalkki: navi oli vaakavieritteinen ilman vihjettä ("Kohteet S…") ja nimi + iso Kirjaudu ulos
     veivät 17 % ruudusta (Astra 18.10.2026). Rivi 1: logo, Kirjaudu ulos, ☰. Rivi 2: haku. Linkit ☰:n takana. */
  .ylapalkki .sisus{gap:8px;padding:8px 12px}
  .merkki{order:1}
  .ylapalkki .kayttaja{order:2;margin-left:auto;gap:8px;flex-wrap:nowrap}
  .ylapalkki .kayttaja .knimi{display:none}
  .ylapalkki .kayttaja .nappi{padding:5px 10px;font-size:12.5px;min-height:0}
  .valikkonappi{order:3;display:inline-flex;align-items:center;justify-content:center;width:40px;height:36px;
    background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.3);border-radius:8px;color:#fff;cursor:pointer}
  .valikkonappi svg{width:20px;height:20px}
  .ylapalkki .paanavi{order:4;flex:1 1 100%;flex-wrap:wrap;overflow:visible;gap:2px}
  .ylapalkki .paanavi .ylahaku{flex:1 1 100%;margin:0}
  .ylapalkki .paanavi .ylahaku input{width:100%}
  .ylapalkki .paanavi > a,.ylapalkki .paanavi > details{display:none}
  .ylapalkki.auki .paanavi > a{display:block;padding:9px 10px}
  .ylapalkki.auki .paanavi > details{display:block;align-self:center}
  /* Pohjakuvasivun tiedostorivi: napit omalle rivilleen, ettei tiedostotieto rivity sana kerrallaan */
  .varrivi{flex-wrap:wrap}
  .varrivi .var-nimi{flex:1 1 100%}
}
/* Iso kartta -napin ikoni (⛶ puuttui fonteista) */
.nappi-ikoni{width:14px;height:14px;flex:none;margin-right:6px;vertical-align:-2px}
#isoKartta{display:inline-flex;align-items:center}
/* Karttapohjan valitsin oli selaimen oletusnappeja */
.seg{display:inline-flex;border:1px solid var(--border-strong);border-radius:8px;overflow:hidden}
.seg button{appearance:none;border:0;background:var(--surface);color:var(--ink-2);cursor:pointer;
  font:600 12.5px var(--sans);padding:5px 12px}
.seg button+button{border-left:1px solid var(--border-strong)}
.seg button[aria-pressed="true"]{background:var(--navy);color:#fff}
/* Tasokytkimet näyttivät tavallisilta napeilta: otsikko ja suodatinsirun muoto */
.selite-otsikko{font:600 11px var(--cond);letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin-top:12px}
.selite{margin-top:6px}
.selite button{border-radius:999px;padding:4px 11px 4px 9px;font-weight:500}
.selite button[aria-pressed="true"]{background:var(--surface);border-color:var(--border-strong)}
/* Pitkä selitysteksti avattavaksi */
details.selite-ohje summary{cursor:pointer;color:var(--ink-2);font-weight:600}
details.selite-ohje p{margin:6px 0 0}

/* Muokkauspaneelin napit yhdelle riville (Poista kärki rivittyi, 18.10.2026) */
.muokkauspaneeli .nappi{white-space:nowrap}
.tyokaluohje.aktiivinen{color:var(--ink,#1c2733);background:#fdf3e7;border-left:3px solid #d1762b;padding:6px 10px;border-radius:4px}
.tyokaluohje.aktiivinen.virheteksti{color:var(--red);background:#fdecea;border-left-color:var(--red)}

/* Suomenkielinen tiedostovalitsin (js/yhteinen.js) */
.tiedostovalitsin{display:inline-flex;align-items:center;gap:10px;flex-wrap:wrap;position:relative;max-width:100%}
.tiedostovalitsin input.tiedosto-piilo{position:absolute;left:0;top:0;width:1px;height:1px;opacity:0;overflow:hidden}
.tiedostonimi{font-size:13px;color:var(--ink);overflow-wrap:anywhere}
.tiedostonimi.tyhja{color:var(--muted)}
.tyokaluvinkki{flex-basis:100%;display:flex;gap:14px;align-items:center;justify-content:space-between;flex-wrap:wrap;background:var(--surface,#fff);border:1px solid var(--border);border-radius:6px;padding:8px 12px;font-size:13px}
.tyokaluvinkki[hidden]{display:none}
.tyokaluvinkki p{margin:0}

/* Yhteysvirhe (yhteinen.js yhteysvirhe, 18.10.2026): kiinteä ilmoitus alareunaan, ei peitä koko näkymää */
#kk-yhteysvirhe{position:fixed;left:50%;bottom:16px;transform:translateX(-50%);z-index:5000;max-width:min(640px,calc(100vw - 32px));
  background:#fff4f2;color:#8a1c0f;border:1px solid #e0a49a;border-radius:8px;padding:8px 10px;box-shadow:0 4px 16px rgba(0,0,0,.18);
  display:flex;gap:8px;align-items:center;flex-wrap:wrap;font-size:14px}
#kk-yhteysvirhe span{flex:1 1 200px}

/* Ilmoitus ja Kumoa (26.10.2026): yhden ilmoituksen #kk-ilmoitus korvattiin ilmoituspinolla (#kk-ilmoitukset,
   40_yhteiset_v026.css); vanhat säännöt poistettu 10.11.2026. */

/* Vahvistusdialogi (26.10.2026): korvaa selaimen confirm/prompt-ikkunat */
.kk-dialogi{border:0;border-radius:14px;padding:0;width:min(440px,calc(100vw - 32px));box-shadow:0 20px 60px rgba(15,30,45,.35);color:var(--ink);background:var(--surface)}
.kk-dialogi::backdrop{background:rgba(15,30,45,.45)}
.kk-dialogi form{padding:20px 22px 18px}
.kk-dialogi h3{font-size:17px;margin:0 0 10px;line-height:1.35}
.kk-dialogi p{margin:0 0 8px;font-size:14px;color:var(--muted);white-space:pre-line}
.kk-d-syote{display:flex;flex-direction:column;gap:6px;margin:12px 0 4px;font-size:13.5px}
.kk-d-syote input,.kk-d-kentta{padding:9px 11px;border:1px solid var(--border-strong);border-radius:8px;font:15px var(--sans)}
.kk-d-kentta{display:block;width:100%;box-sizing:border-box;margin:12px 0 4px}
.kk-d-napit{display:flex;justify-content:flex-end;gap:8px;margin-top:16px;flex-wrap:wrap}
.kk-d-napit .nappi{min-height:40px;min-width:96px}
.nappi.vaara-taysi{background:var(--red);border-color:var(--red);color:#fff}
.nappi.vaara-taysi:disabled{opacity:.45}

/* Kartan kohdeikkunan "Lisää ▾" -valikko (26.10.2026): harvemmat toiminnot piiloon, 1–2 päätoimintoa näkyvissä */
.mk-lisaa{margin-top:8px}
.mk-lisaa>summary{list-style:none;cursor:pointer;display:inline-block;user-select:none}
.mk-lisaa>summary::-webkit-details-marker{display:none}
.mk-lisaa[open]>summary{background:var(--surface-2)}
.mk-lisaa .mk-napit{flex-wrap:wrap;margin-top:6px}
.mk-lisaa .mk-napit .nappi{flex:1 1 45%}

/* Ulkokaapelin sisäosuuden luonnos (0046) ja kerroksen Ulkoa tulevat kaapelit -lista */
.luonnosilmoitus{margin:8px 0 2px;padding:8px 10px;border-radius:8px;background:var(--yellow-soft);border:1px solid var(--yellow);font-size:13px;line-height:1.45}
.ulkoatulevat{list-style:none;margin:6px 0 0;padding:0;font-size:13px}
.ulkoatulevat li{padding:6px 0;border-top:1px solid var(--border)}
.ulkoatulevat .nappi.pieni{margin-left:4px;padding:3px 9px}

/* Muistilapun koko (0047): neutraalit valintanapit värinappien tapaan */
.lappukoot button{--lv:var(--surface);--lr:var(--border-strong);color:var(--ink)}

/* Pikanäppäinlista (?-näppäin) */
.kk-pikanappaimet table{border-collapse:collapse;width:100%;font-size:13.5px;margin:4px 0 6px}
.kk-pikanappaimet td{padding:5px 8px 5px 0;border-top:1px solid var(--border);vertical-align:top}
.kk-pikanappaimet td:first-child{white-space:nowrap;width:1%}
.kk-pikanappaimet kbd,.ohj-kortti kbd{font:600 12px var(--mono);background:var(--surface-2);border:1px solid var(--border-strong);border-bottom-width:2px;border-radius:5px;padding:1px 6px}
.zoomtyokalut .pikaohje{font-weight:700}

/* Virheet heti kentässä (UX-kohta 9) */
.kentta-virhe,.kentta-virhe:focus{border-color:var(--red)!important;box-shadow:0 0 0 3px var(--red-soft)!important}
.kentta-varoitus{border-color:var(--orange)!important}
.kenttavirhe{color:var(--red);font-size:12.5px;line-height:1.35;margin:4px 0 2px}
.kenttavirhe.varoitus{color:var(--orange)}
.nappi[disabled][data-syy]{opacity:.75;cursor:not-allowed}
.jatkotieto{background:var(--blue-soft,#e8f1fb);border-left:4px solid var(--blue,#1f6fd1);padding:8px 10px;border-radius:6px;margin:0 0 10px;font-size:13.5px;line-height:1.45}
.lappulisaykset{list-style:none;margin:6px 0;padding:0;display:grid;gap:4px}.lappulisaykset li{background:var(--surface-2,#f4f6f8);border-left:3px solid var(--border-strong,#c5ccd3);padding:4px 8px;border-radius:4px;font-size:13px;line-height:1.4}.lappulisaykset small{display:block;color:var(--muted,#667);font-size:11.5px}
/* Alustava sisäkulku (0057): kerros- ja kaappivalinnat dialogissa */
.kk-dialogi .kk-d-rivi{display:flex;flex-direction:column;gap:4px;margin:10px 0;font-size:14px;font-weight:600}
.kk-dialogi .kk-d-rivi small{font-weight:400;color:var(--muted);margin-left:4px}
.kk-dialogi .kk-d-rivi select{padding:7px 9px;font:inherit;font-weight:400;border:1px solid var(--border);border-radius:8px;background:var(--surface);color:var(--ink)}
.kk-dialogi .kk-d-tieto{color:var(--ink);margin:8px 0}
/* ===== 18_raportit.css ===== */
/* ---------- Raportit (raportti.php, 18.10.2026) ---------- */
.r-otsake{display:flex;align-items:flex-end;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-bottom:12px}
.r-aika{color:var(--muted);font-size:12.5px}
.r-napit{display:flex;gap:8px;flex-wrap:wrap}
.r-sisalto{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 18px}
.r-sisalto a{padding:5px 11px;border:1px solid var(--border);border-radius:999px;background:var(--surface);font-size:13px;text-decoration:none}
.r-sisalto a:hover{background:var(--blue-soft)}
.r-osio{margin:0 0 26px;scroll-margin-top:70px}
.r-osio h2{font-size:18px;margin:0 0 8px}
.r-selite{color:var(--ink-2);font-size:13.5px;margin:0 0 10px;max-width:80ch}
.r-ruudut{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:10px}
.r-ruutu{background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:11px 14px;display:grid;gap:2px}
.r-ruutu span{color:var(--muted);font-size:12.5px}
.r-ruutu b{font-size:24px;font-variant-numeric:tabular-nums}
.r-ruutu small{color:var(--ink-2);font-size:12.5px;min-height:1em}
.r-taulukko{padding:0;overflow-x:auto}
.r-taulukko .yht-taulu{min-width:720px}
.r-luku{text-align:right!important;font-variant-numeric:tabular-nums;white-space:nowrap}
.r-tyhja{color:var(--muted);padding:16px!important}
.r-palkki{display:inline-block;vertical-align:middle;width:80px;height:8px;border-radius:4px;background:var(--surface-2);
  border:1px solid var(--border);overflow:hidden}
.r-palkki i{display:block;height:100%;background:var(--blue)}
.r-palkki.huom i{background:#b3790c}
.r-palkki.tays i{background:#cd4335}
.r-palkki-tyhja{color:var(--muted)}
@media print{
  .r-napit,.r-sisalto{display:none!important}
  .r-osio{break-inside:auto}
  .r-taulukko{overflow:visible;border:0}
  .r-palkki{print-color-adjust:exact;-webkit-print-color-adjust:exact}
}

/* Mitä tässä kulkee (sisavaikutus, 18.10.2026) */
.jaljitysikkuna.sv-ikkuna{width:min(860px,calc(100vw - 32px))}
.sv-kaapeli{border-top:2px solid var(--border);padding-top:8px}
.sv-kaapeli-ots{display:flex;gap:8px;align-items:baseline;flex-wrap:wrap;margin-bottom:4px}
.sv-kaapeli-ots small{color:var(--muted)}
.sv-ulko{font-size:13px;color:var(--ink-2);margin:2px 0 4px}
.sv-tyhja{font-size:13px;padding:4px 0 6px!important}
.sv-oletus{grid-column:1/-1;font-size:12px;color:#8a5a00;margin-top:2px}
.sv-huom{font-size:13px;color:#8a5a00;background:#fdf6e3;border:1px solid #ecd9a6;border-radius:8px;padding:7px 10px;margin:0}
/* ===== 19_yhteyden_rakennus.css ===== */
/* Yhteyden rakentaminen koko näytöllä (22.10.2026): kartta vasemmalla, alkupää ja reitti oikealla */
main.kuori:has(.y-rakennus){max-width:none;padding-top:14px}
.y-rak-otsake{align-items:center;margin-bottom:10px}
.y-rak-otsake h1{font-size:21px}
.y-valilehdet{display:flex;gap:2px;background:var(--surface-2);padding:3px;border-radius:9px}
.y-valilehdet button{border:0;background:none;padding:7px 14px;border-radius:7px;font:600 13px inherit;color:var(--ink-2);cursor:pointer}
.y-valilehdet button[aria-selected="true"]{background:var(--surface,#fff);color:var(--ink);box-shadow:0 1px 2px rgba(0,0,0,.12)}
.y-rak{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(380px,1fr);gap:14px;align-items:start}
.y-rak .y-rak-kartta{position:sticky;top:10px;grid-row:auto;height:calc(100vh - 190px);min-height:420px}
.y-rak-oikea{display:flex;flex-direction:column;gap:14px;min-width:0}
.y-rak-oikea .kortti{margin:0}
.y-rak .y-valitsin{grid-template-columns:1fr;grid-template-rows:auto}
.y-rak .y-paarivi{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:6px 0}
.y-rak .y-paarivi .y-laite{flex:1 1 220px;min-width:0}
.y-rak .y-paarivi .y-portti{width:5.5em}
#y-reitti.haetaan{opacity:.55;transition:opacity .2s}
#y-reitti h3{font-size:14px;margin:12px 0 6px}
.y-alkukooste{display:flex;flex-wrap:wrap;align-items:center;gap:6px 14px}
.y-alkukooste div{flex:1 1 220px}
.y-alkukooste small{display:block;color:var(--muted)}
#y-alku.kooste h2{margin-bottom:6px}
.y-aikajana .jaljitys{margin-bottom:0}
.y-nyt{border:1px solid var(--border);border-radius:10px;padding:10px 12px;margin:8px 0 0 0;background:var(--surface,#fff)}
.y-nyt > b{display:block;font-size:15px}
.y-nyt > small{display:block;color:var(--muted)}
.y-nyt.avoin{border:2px solid #1f6fe0;box-shadow:0 0 0 4px #e3eefc}
.y-nyt.valmis{border-left:4px solid var(--green)}
.y-nyt.paatetty{border-left:4px solid var(--ink-2)}
.y-nyt-napit{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
.y-suunnmaara{margin-top:8px}
.y-jatko{margin-top:8px}
.y-jatko summary{cursor:pointer;font-weight:600;font-size:13px;color:var(--blue,#2f6fd0)}
.y-jatko-runko{padding:8px 0 2px}
.y-jatko-ohje{font-size:13px;margin:0 0 8px;color:var(--ink-2)}
.y-jatko-portit{margin-top:8px;max-height:300px;overflow:auto;border:1px solid var(--border);border-radius:8px}
.y-jatko-portit:empty{display:none}
.y-jatko-portit .y-etu{margin:6px}
.y-hitsaus{border-top:1px dashed var(--border);padding-top:8px;margin-top:8px}
.y-hitsaus:first-child{border-top:0;margin-top:0;padding-top:0}
.y-hitsaus .kentta-rivi select{max-width:100%}
.j-kohde{display:flex;gap:14px;font-size:13px;margin:4px 0 6px}
.y-suunnitelmalista{margin:0;padding-left:20px;display:grid;gap:6px;font-size:13px}
.y-suunnitelmalista li > div{display:inline-block;max-width:calc(100% - 140px);vertical-align:top}
.y-suunnitelmalista li .nappi{float:right;margin-left:8px}
.y-suunnitelmalista small{color:var(--muted)}
.y-toteutus{border-left:4px solid var(--yellow,#c88a00);margin-bottom:14px}
@media (max-width:999px){
  .y-rak{grid-template-columns:1fr}
  .y-rak .y-rak-kartta{position:static;height:300px;min-height:0}
}
/* Kytkentäkortti (22.10.2026): taulukko kuten Akin esimerkissä */
.y-kytkentakortti{margin-bottom:14px}
.y-kortti-taulu{width:100%;border-collapse:collapse;font-size:13.5px}
.y-kortti-taulu th{text-align:left;font:600 11px var(--cond);letter-spacing:.06em;text-transform:uppercase;color:var(--muted);padding:5px 8px;border-bottom:1px solid var(--border);white-space:nowrap}
.y-kortti-taulu td{padding:5px 8px;border-bottom:1px solid var(--border);vertical-align:top}
.y-kortti-taulu tbody tr:nth-child(even){background:var(--surface-2)}
.y-kortti-taulu td[title]:not([title=""]){cursor:help}
.yk-tunnus{font-family:var(--mono);white-space:nowrap}
.yk-nro{font:700 14px var(--mono);white-space:nowrap}
.yk-nro small{font:600 10px var(--cond)}
.yk-m{text-align:right;font-family:var(--mono);white-space:nowrap}
.yk-paate b{font-weight:700}
.yk-avoin b{color:var(--orange,#d9822b)}
.yk-kokonais{font-size:14px;color:var(--ink-2)}
.yk-kokonais b{font:700 16px var(--mono);color:var(--ink)}
.yk-kuidut{display:inline-flex;margin-bottom:8px}
@media print{.yk-kuidut{display:none}[data-ykuitupaneeli]{display:block!important}}
/* Aloitus kaapista (23.10.2026): kaapeli → kuitu → paneelin portti */
.y-aloitus{display:grid;gap:8px;padding:8px}
.y-aloitus-ots{font-size:13px}
.y-aloitus-ots small{color:var(--muted)}
.y-aloitus-kaapelit{display:grid;gap:4px}
.y-lahikohde.valittu{border-color:#1f6fe0;background:#e3eefc}
.y-kuituruudukko{display:grid;grid-template-columns:repeat(12,1fr);gap:3px;padding:5px;background:#2b3a4a;border-radius:5px}
.y-kuituruudukko .y-ep:disabled{opacity:.55;cursor:not-allowed}
.y-muupaa{margin:0 0 8px;font-size:13px;border:1px dashed var(--border);border-radius:8px;padding:6px 10px}
.y-muupaa summary{cursor:pointer}
.y-muupaa small{color:var(--muted)}

/* Työnimi ja työn alla (23.10.2026) */
.y-tyonimi{display:grid;gap:4px}
.y-tyonimi label{font-weight:600}
.y-tyonimi input{font-size:15px;padding:6px 8px}
.y-tyolista,.y-kohdekesken{display:grid;gap:6px}
.y-kohdekesken{margin-top:8px}
a.y-lahikohde{text-decoration:none}
.y-paarivi[hidden]{display:none}
/* Reittiehdotus loppupäähän (23.10.2026) */
.y-ehdotus{margin:8px 0;border:1px solid var(--border);border-radius:8px;padding:6px 10px;background:var(--surface,#fff)}
.y-ehdotus summary{cursor:pointer;font-weight:600;font-size:13px}
.ye-rivi{display:flex;gap:6px;flex-wrap:wrap;margin:8px 0}
.ye-rivi select{flex:1 1 220px;max-width:100%}
.ye-lista{display:grid;gap:5px}
.ye-rivit{margin:8px 0 4px 18px;font-size:13px}
.ye-rivit small{color:var(--muted)}
.y-kuituruudukko .pt-kaytossa{background:#1f6fe0;color:#fff}
.y-aikajana-tiivis{margin:0 0 8px;border:1px solid var(--border);border-radius:8px;padding:6px 10px}
.y-aikajana-tiivis summary{cursor:pointer;display:grid;gap:2px}
.y-aikajana-tiivis summary small{color:var(--muted)}

/* Seuraavan kaapelin vaihtoehdot: sama numero ja väri listassa ja kartalla (24.10.2026) */
.y-kaapelinapit{display:flex;flex-direction:column;gap:4px;flex:1;min-width:0}
.y-kaapelinapit button{display:flex;align-items:center;gap:8px;text-align:left;font:inherit;font-size:13px;padding:5px 8px;border:1px solid var(--border);border-left:5px solid var(--vari);border-radius:6px;background:var(--surface,#fff);color:inherit;cursor:pointer}
.y-kaapelinapit button:hover:not([disabled]){background:var(--hover,#f2f5fa)}
.y-kaapelinapit button[aria-pressed="true"]{outline:2px solid var(--vari);font-weight:600}
.y-kaapelinapit button[disabled]{opacity:.45;cursor:not-allowed}
.y-nro{flex:none;display:inline-grid;place-items:center;width:20px;height:20px;border-radius:50%;background:var(--vari);color:#fff;font-weight:700;font-size:12px}
.y-vnro{background:none;border:0}
.y-vnro span{display:grid;place-items:center;width:24px;height:24px;border-radius:50%;color:#fff;font:700 13px/1 system-ui,sans-serif;border:2px solid #fff;box-shadow:0 1px 4px rgba(0,0,0,.4)}
.y-vnro span.oma{transform:scale(1.25)}

/* Rakennettavan reitin askeleet kartalla ja ristikytkennän määränpääryhmät (24.10.2026) */
.y-askel{background:none;border:0}
.y-askel span{position:absolute;transform:translate(-50%,-50%);white-space:nowrap;display:inline-grid;place-items:center;min-width:22px;height:22px;padding:0 6px;
  border-radius:11px;background:#1f6fe0;color:#fff;font:700 12px/1 system-ui,sans-serif;border:2px solid #fff;box-shadow:0 1px 4px rgba(0,0,0,.45)}
.y-askel.alku span{background:#1c8a4d}
.y-askel.perilla span{background:#1c8a4d}
.y-askel.nyt span{background:#d9480f;font-size:13px;height:26px;border-radius:13px;padding:0 10px;animation:y-nyt-syke 1.6s ease-out infinite}
@keyframes y-nyt-syke{0%{box-shadow:0 0 0 0 rgba(217,72,15,.55)}70%{box-shadow:0 0 0 12px rgba(217,72,15,0)}100%{box-shadow:0 0 0 0 rgba(217,72,15,0)}}
.y-nuoli{background:none;border:0}
.y-nuoli span{position:absolute;display:block;color:#fff;font-size:15px;line-height:1;text-shadow:0 0 2px #0b3d91,0 0 3px #0b3d91}
.y-pryhmat{display:flex;flex-direction:column;gap:6px}
.y-pryhma{border:1px solid var(--border);border-left:5px solid var(--vari);border-radius:7px;background:var(--surface,#fff)}
.y-pr-paa{display:flex;gap:9px;align-items:flex-start;width:100%;text-align:left;font:inherit;font-size:13px;padding:7px 9px;border:0;background:none;color:inherit;cursor:pointer}
.y-pr-paa:hover{background:var(--hover,#f2f5fa)}
.y-pr-paa small{display:block;color:var(--muted);margin-top:2px}
.y-pr-portit{display:flex;flex-wrap:wrap;gap:4px;align-items:center;padding:0 9px 8px 38px}
.y-pr-portit small{color:var(--muted);margin-right:2px}
.y-pr-portit .y-ep{min-width:30px;padding:3px 5px}
.y-pr-tyhjat summary{cursor:pointer;font-size:12.5px;color:var(--muted);padding:4px 2px}
.y-pr-tyhjat .y-pr-portit{padding-left:2px}
.y-askel.vali span{min-width:0;width:12px;height:12px;padding:0;border-radius:50%}
/* Automaattitila (25.10.2026) */
.y-tapa{display:flex;gap:14px;flex-wrap:wrap;margin:-2px 0 10px;font-size:13.5px}
.y-tapa label{display:flex;align-items:center;gap:5px;cursor:pointer}
.y-ehdotus.y-auto{border-color:var(--blue,#2f6fd0);background:var(--blue-soft,#eef4fd)}
.ye-otsake{margin-top:8px;font-weight:600;font-size:13px}
.ye-umpikujat{margin-top:6px;font-size:13px}
.ye-umpikujat ul{margin:4px 0 4px 18px}
.y-autohuom{margin:6px 0}
/* ===== 20_tyolista.css ===== */
/* ---------- Yhteyden työlista tulosteena (25.10.2026) ----------
   Näytöllä piilossa; tulostettaessa vain työlista, A4 pysty (oma nimetty sivu, ettei pohjakuvan A3 vaakaa käytetä). */
.tyolista{display:none}
@page tyolista { size: A4 portrait; margin: 12mm }
@media print {
  body.tyolista-tulostus > *:not(#y-tyolista){display:none!important}
  body.tyolista-tulostus{background:#fff}
  body.tyolista-tulostus #y-tyolista{display:block;page:tyolista;color:#000;font-size:9.5pt;line-height:1.35}
  .tyolista h1{font-family:var(--cond);font-size:17pt;margin:0}
  .tyolista h2{font-family:var(--cond);font-size:11.5pt;margin:6mm 0 2mm;letter-spacing:.02em}
  .tyolista .tl-otsake{display:flex;justify-content:space-between;gap:16px;border-bottom:1.5px solid #000;padding-bottom:5px}
  .tyolista .tl-eyebrow,.tyolista dt,.tyolista th{font-family:var(--cond);font-size:7.5pt;text-transform:uppercase;letter-spacing:.08em;color:#444}
  .tyolista .tl-ala{font-size:10pt;margin-top:2px}
  .tyolista .tl-tiedot{display:grid;grid-template-columns:auto auto;gap:1px 12px;margin:0;align-content:start}
  .tyolista .tl-paat{display:grid;grid-template-columns:28mm 1fr;gap:2px 8px;margin:4mm 0 0}
  .tyolista dd{margin:0}
  .tyolista table{width:100%;border-collapse:collapse}
  .tyolista th{text-align:left;border-bottom:1px solid #000;padding:3px 5px}
  .tyolista td{border-bottom:.4px solid #aaa;padding:4px 5px;vertical-align:top}
  .tyolista thead{display:table-header-group}
  .tyolista tr{page-break-inside:avoid}
  .tyolista .tl-ruutu{font-size:16pt;line-height:1;width:12mm;text-align:center}
  .tyolista .tl-kuittaus{width:42mm}
  .tyolista .tl-nro{width:7mm;font-weight:700;text-align:right}
  .tyolista .tl-vali td{color:#555;font-size:8.5pt;padding:2px 5px;border-bottom-style:dotted}
  .tyolista .tl-tee td{background:#fff3cd;-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .tyolista .tl-huom{margin-top:5mm;font-size:8.5pt;color:#333}
}
/* ===== 21_tila_ja_kesken.css ===== */
/* Latauksen tila ja hakuvirhe (Astra 27.10.2026, korjaus 2): virhe erottuu tyhjästä tuloksesta. */
.kk-ladataan { color: var(--muted); font-style: italic; margin: 6px 0; }
.kk-tyhja { color: var(--text); margin: 6px 0; }
.kk-latausvirhe {
  background: #fff4e5; border: 1px solid #e0a040; border-left-width: 4px; border-radius: 6px;
  padding: 8px 10px; margin: 6px 0; color: #5a3a00; line-height: 1.45;
}
.kk-latausvirhe b { display: block; }
.kk-latausvirhe .nappi { margin-top: 6px; }
/* ===== 22_yhteys_korjaukset.css ===== */
/* Yhteyden rakentaminen ja rakennuksen yhteyslista (Astra 27.10.2026, korjaukset 2–4) */

/* Kytkentäkortti: KT-solun tiedot näkyvät Kytkennän tiedot -napista (ei vain hiirivihjeenä) */
.yk-kt-tiedot{display:none;color:var(--muted);font-size:12px;white-space:normal}
.y-kytkentakortti.yk-tiedot-auki .yk-kt-tiedot{display:block}
.yk-tiedotnappi{font-weight:600}

/* Puuttuva kirjaus toimintoineen sivun alussa */
.y-huomtoiminnot{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}

/* Merkitse valmiiksi -napin tilalla: mitä vielä puuttuu */
.y-valmiusvihje{margin-top:8px;padding:8px 10px;border:1px solid var(--border);border-left:4px solid var(--yellow,#c88a00);
  border-radius:8px;font-size:13px;color:var(--ink-2);background:var(--surface,#fff)}
.y-valmiusvihje ul{margin:4px 0 0;padding-left:18px}

/* Rakennuksen yhteyslista: automaattitallennus ja rivin tila */
.yht-autotallennus{font-size:13px;color:var(--ink-2);margin:0 0 10px;max-width:72ch}
.rivitila{font-size:12px;margin-top:4px;min-height:0}
.rivitila:empty{display:none}
.rivitila.rt-kesken{color:var(--muted)}
.rivitila.rt-ok{color:var(--green)}
.rivitila.rt-virhe{color:var(--red);font-weight:600}
.rivitila .nappi{margin-top:4px}
.yht-massa details{font-size:12.5px}
.yht-massa details summary{cursor:pointer;text-decoration:underline}
.yht-massa details ol{margin:6px 0 0;padding-left:20px;max-height:180px;overflow:auto}

/* Puhelin: yhteyslista ja kytkentäkortti korteiksi — päät, kaapeli, mittaus ja tallennustila näkyvät */
@media (max-width:700px){
  .yht-taulu.yht-kortit{min-width:0}
  .yht-kortit,.yht-kortit tbody,.yht-kortit tr,.yht-kortit td{display:block;width:auto}
  .yht-kortit thead tr{display:flex;align-items:center;padding:8px 12px}
  .yht-kortit thead th{display:none}
  .yht-kortit thead th.valinta-sarake{display:flex;align-items:center;gap:8px;width:auto;padding:0;background:none;
    text-transform:none;letter-spacing:0;font:13px var(--sans);color:var(--ink-2)}
  .yht-kortit thead th.valinta-sarake::after{content:'Valitse kaikki näkyvät'}
  .yht-kortit tbody tr{position:relative;border-top:1px solid var(--border);padding:10px 12px 12px}
  .yht-kortit tbody td{border:0;padding:3px 0}
  .yht-kortit td.nuoli-sarake{display:none}
  .yht-kortit td[data-o]{position:relative;padding-left:78px;overflow-wrap:anywhere}
  .yht-kortit td[data-o]::before{content:attr(data-o);position:absolute;left:0;top:5px;width:72px;font-size:11.5px;color:var(--muted)}
  .yht-kortit td.valinta-sarake{position:absolute;right:8px;top:6px;padding:0}
  .yht-kortit td.valinta-sarake input{width:28px;height:28px}
  .yht-kortit td[data-o="Kerros"]{padding-right:44px}
  .yht-kortit .pituuskentta,.yht-kortit .tuloskentta,.yht-kortit .pvmkentta{min-height:44px;font-size:15px;max-width:none}
  .yht-kortit .tuloskentta,.yht-kortit .pvmkentta{width:100%}
  .yht-kortit .rivitila .nappi{min-height:44px}
  .yht-kortit tr:hover td{background:none}

  .yk-kuori table.y-kortti-taulu{min-width:0}
  .y-kortti-taulu thead{display:none}
  .y-kortti-taulu,.y-kortti-taulu tbody,.y-kortti-taulu tr,.y-kortti-taulu td{display:block;width:auto}
  .y-kortti-taulu tbody tr{padding:8px 10px;border-bottom:1px solid var(--border)}
  .y-kortti-taulu td{border:0;padding:2px 0 2px 74px;position:relative;text-align:left;white-space:normal;overflow-wrap:anywhere}
  .y-kortti-taulu td[data-o]::before{content:attr(data-o);position:absolute;left:0;top:3px;width:68px;font:11.5px var(--sans);color:var(--muted);
    text-transform:none;letter-spacing:0}
  .y-kortti-taulu td:empty{display:none}
  .yk-tiedotnappi{min-height:44px}
}
/* ===== 23_kartta_korjaukset.css ===== */
/* Ulkoverkon kartta, Astra-korjauskierros 27.10.2026 (korjaukset 1 ja 3). Ohittaa aiempia sääntöjä numerojärjestyksellä. */

/* Korjaus 3 / h7: zoomnapit takaisin puhelimeen — isot (44 px) ja oikeassa alakulmassa peukalon ulottuvilla
   (14_mobiili.js siirtää ohjaimen bottomright-paikkaan). 13_puhelin.css piilotti ne kokonaan. */
body.mobiili .leaflet-control-zoom{display:block}
body.mobiili .leaflet-control-zoom a{width:44px;height:44px;line-height:44px;font-size:24px}
/* Oikean alakulman ohjaimet nappirivin tilailmoitusten (mobiilitila) yläpuolelle */
body.mobiili .leaflet-bottom.leaflet-right{margin-bottom:48px}

/* Korjaus 3 / h12: näkyvä Kirjaa havainto -nappi kartan oikeassa alakulmassa */
.leaflet-control.havaintonappi{min-height:36px;padding:6px 12px;font-weight:600;box-shadow:0 2px 8px rgba(0,0,0,.25);cursor:pointer}
body.mobiili .leaflet-control.havaintonappi{min-height:44px;font-size:14px}
@media print{ .leaflet-control.havaintonappi{display:none!important} }

/* Korjaus 3 / h6: asiakaspäätteen pieni merkki saa puhelimessa näkymättömän 44 px osuma-alueen (kuva ei kasva) */
body.mobiili .asiakas-merkki::before{content:'';position:absolute;left:50%;top:50%;width:44px;height:44px;transform:translate(-50%,-50%)}

/* Korjaus 3 / h6: muistilapun väri- ja kokovalinnat sekä Lisätoiminnot-valikko sormelle */
body.mobiili .lappuvarit button{min-height:44px;padding:8px 12px}
body.mobiili .mk-lisaa>summary{min-height:44px;display:inline-flex;align-items:center}

/* Korjaus 1: puhelimessa ei aloiteta piirtoa (ohjaimet #vasen-piirto ovat piilossa) */
body.mobiili [data-uusikaapeli],body.mobiili #yhd-uusikaapeli{display:none!important}
/* ===== 24_pohjakuva_kaappi_korjaukset.css ===== */
/* Pohjakuvan ja kaappinäkymän korjaukset (Astra 27.10.2026, korjaukset 1–3).
   Kootaan muiden jälkeen: säännöt ohittavat aiemmat tiedostot muokkaamatta niitä. */

/* ---------- Kaappinäkymä puhelimessa: Teline / Portit -välilehdet (js/kaappi.js kaappiValilehti) ----------
   Teline näkyi vain U7:ään asti ennen porttiruutua (46vh). Välilehdellä teline näkyy koko korkeudeltaan ja
   näkymä vierittyy; laitteen valinta avaa Portit-välilehden. Työpöydällä molemmat ruudut rinnakkain kuten ennen. */
.kaappi-valilehdet{display:none}
@media (max-width:899px){
  .kaappi-valilehdet{display:flex;gap:6px;flex:1 1 100%;margin-top:2px}
  .kaappi-valilehdet button{appearance:none;flex:1 1 0;min-height:44px;padding:6px 10px;border:1px solid var(--border-strong);
    border-radius:8px;background:var(--surface);color:var(--ink);font:600 14px var(--sans);cursor:pointer;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .kaappi-valilehdet button[aria-selected="true"]{background:var(--navy,#003a5a);border-color:var(--navy,#003a5a);color:#fff}
  .kaappinakyma[data-kvl] .telineruutu{max-height:none}
  .kaappinakyma[data-kvl="teline"] .porttiruutu{display:none}
  .kaappinakyma[data-kvl="portit"] .telineruutu{display:none}
  /* Kenttätoiminnot vähintään 44 px (korjaus 3) */
  .kaappinakyma .telinetyokalut .nappi,.kaappinakyma .porttiruutu .nappi,.kaappinakyma .kuvalisays .nappi{min-height:44px}
  .kaappinakyma .kuvalisays input{min-height:44px}
}

/* ---------- Pohjakuvan tietopaneeli puhelimessa: isommat kosketuskohteet (korjaus 3) ---------- */
body.mobiili .tiedot .tehtava-nappi,body.mobiili .tiedot #lisaaKuva,body.mobiili .kaapin-sisalto .nappi,
body.mobiili .tiedot .lappuvarit button,body.mobiili .tiedot #f-lisaa,body.mobiili .tiedot .kk-latausvirhe .nappi{min-height:44px}
body.mobiili .tiedot .tilanappi{min-height:36px}

/* ---------- Kuitujen jatko: puuttuva kenttä näkyy (korjaus 1) ---------- */
#lk-virhe{margin-top:8px}

/* ---------- Periaatekaavio: zoom ja Sovita palkissa (periaate.php) ---------- */
.periaate-palkki .pk-zoom{position:static;margin:0;left:auto;transform:none}
.pk-jatkuu{font-size:12.5px;color:var(--muted);font-style:italic}
@media (max-width:899px){
  .periaate-palkki .pk-zoom button{min-width:44px;min-height:44px}
}
/* ===== 25_mobiili_sivut.css ===== */
/* ---------- Puhelin 390 px: muut sivut, yhteinen navigaatio (Astra 27.10.2026, korjaus 3) ----------
   Kartta ja pohjakuva (body.mobiili, main.tayte) hoitavat oman puhelinasettelunsa css/13:ssa; tämä koskee
   tavallisia sivuja (main.kuori). */

/* Puhelimen alapalkki (yhteinen.php sivunAlapalkki): sama paikka ja järjestys kuin kartan nappirivissä */
.sivunavi{display:none}
.paanavi a.navi-ulos{display:none}   /* Kirjaudu ulos valikossa vain puhelimessa; työpöydällä yläpalkin oikeassa reunassa */
@media (max-width:699px){
  body:has(.sivunavi){--mnavi:calc(58px + env(safe-area-inset-bottom, 0px));padding-bottom:var(--mnavi);height:auto;min-height:100%;box-sizing:border-box}
  .sivunavi{display:flex;position:fixed;left:0;right:0;bottom:0;z-index:1150;height:var(--mnavi);
    padding-bottom:env(safe-area-inset-bottom, 0px);background:var(--navy);box-shadow:0 -4px 16px rgba(0,0,0,.18)}
  .sivunavi > *{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;min-width:0;
    appearance:none;border:0;background:none;color:#cfe0ee;font:600 11px var(--sans);text-decoration:none;cursor:pointer;
    -webkit-tap-highlight-color:transparent}
  .sivunavi > [aria-current="page"],.sivunavi > [aria-expanded="true"]{color:#fff;background:rgba(255,255,255,.14)}
  /* Uloskirjautuminen yläpalkista valikkoon: se vei näkyvimmän paikan (Astra 27.10.2026, kuvat kohta 1) */
  .ylapalkki .kayttaja .nappi{display:none}
  .ylapalkki.auki .paanavi > a.navi-ulos{display:block;color:#ffb4a8;border-top:1px solid rgba(255,255,255,.18);margin-top:4px}
  .valikkonappi{width:44px;height:44px}
  .ylapalkki.auki .paanavi > a,.ylapalkki.auki .paanavi summary{min-height:44px;display:flex;align-items:center}
  .ylapalkki .ylahaku input{min-height:44px;font-size:16px}   /* 16 px: iOS ei zoomaa kenttään */
}
@media print{ .sivunavi{display:none!important} }

/* Taulukot korttinäkymäksi (table.mkortti): rivi on kortti, jonka alussa tehtävän ydintieto (td.m-paa), sen alla
   lisätieto (td.m-lisa) ja luvut nimettyinä (td[data-o]). Pelkkä vaakavieritys jätti vastauksen piiloon. */
@media (max-width:700px){
  table.mkortti{min-width:0!important;width:100%;font-size:14px}
  table.mkortti thead{display:none}
  table.mkortti,table.mkortti tbody{display:block}
  table.mkortti tr{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 16px;padding:12px 14px;border-top:1px solid var(--border)}
  table.mkortti tr:first-child{border-top:0}
  table.mkortti td{display:block;flex:0 1 auto;border:0!important;padding:0!important;white-space:normal!important;
    text-align:left!important;background:none!important;min-width:0;overflow-wrap:anywhere}
  table.mkortti td.m-paa{order:-2;flex:1 1 100%;font-size:16px}
  table.mkortti td.m-lisa{order:-1;flex:1 1 100%;font-size:13px;color:var(--ink-2)}
  table.mkortti td[data-o]::before{content:attr(data-o);color:var(--muted);font-size:12px;margin-right:5px}
  table.mkortti td[data-o] br{display:none}
  table.mkortti td[data-o] small{display:inline!important;margin-left:4px}
  table.mkortti td.m-tarkea{font-weight:700}
  table.mkortti td.m-palkki{flex:1 1 100%}
  table.mkortti td.m-palkki:empty{display:none}
  table.mkortti td.m-napit{flex:1 1 100%;display:flex;flex-wrap:wrap;gap:8px;margin-top:6px}
  table.mkortti td[colspan]{flex:1 1 100%}
  table.mkortti td.selain{display:none}
  .r-taulukko,.kortti:has(> table.mkortti){overflow-x:visible}
}

/* Kosketuskohteet ≥ 44 px kenttäkäytössä. Vain tavallisilla sivuilla (main.kuori): kartan ja pohjakuvan
   työkalurivit (main.tayte, body.mobiili) ja upotetun kartan ohjaimet jäävät ennalleen. */
@media (max-width:699px){
  main.kuori .nappi,
  main.kuori .yht-suodin select,main.kuori .yht-suodin input:not([type="checkbox"]):not([type="radio"]){
    min-height:44px}
  main.kuori .leaflet-container .nappi{min-height:0}
  main.kuori a.nappi,main.kuori button.nappi{display:inline-flex;align-items:center;justify-content:center}
  main.kuori .nappi.pieni{padding:8px 14px;font-size:14px}
  main.kuori .yht-suodin input,main.kuori .yht-suodin select{font-size:16px}
  main.kuori .yht-suodin input[type="search"]{max-width:none;min-width:0;flex:1 1 100%}
  main.kuori .yht-suodin label:has(input[type="checkbox"]){min-height:44px}
  main.kuori .as-napit,main.kuori .nimikelista li .napit,main.kuori .vienti-napit{gap:8px;flex-wrap:wrap}
  main.kuori .r-sisalto a{display:inline-flex;align-items:center;min-height:44px}
}

/* Muutosloki: päivämäärille näkyvät nimet */
.pvm-nimi{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--muted)}
@media (max-width:699px){ .pvm-nimi{flex:1 1 calc(50% - 8px)} .pvm-nimi input{flex:1;min-width:0} }

/* Vienti: kohde latausnapin alla, napit rivitettynä */
.vienti-kohde{display:block;margin-top:8px;color:var(--ink-2)}
.vienti-napit{display:flex;flex-wrap:wrap;gap:6px}
.vienti-tekniikka summary{cursor:pointer;color:var(--ink-2);font-weight:600;font-size:13.5px}

/* Nimikkeistö: kortit oman sisältönsä korkuisiksi; ryhmävalinta ja haku piilottavat [hidden]-attribuutilla */
.ruudukko-nimikkeet{align-items:start}
.nimikekortti[hidden],.nimikelista li[hidden]{display:none}
/* ===== 26_kartta_v021.css ===== */
/* Kartta v0.21 (syväanalyysi 27.10.2026, v0.21): selite puhelimessa, selitenäytteet, Haku alapalkissa. */

/* Selite "Miten karttaa luetaan?": 13_puhelin.css piilotti sen puhelimessa juuri kentällä. Nyt näkyvissä Tasot-
   alapaneelin alaosassa, oletuksena suljettuna (details) mutta löydettävissä. Iso kartta piilottaa sen edelleen (09). */
body.mobiili #karttaoheiset .selite-ohje{display:block!important;margin:14px 0 4px;padding-top:10px;border-top:1px solid var(--border)}
body.mobiili #karttaoheiset .selite-ohje > summary{min-height:44px;display:flex;align-items:center;font:600 14px var(--sans);color:var(--ink);cursor:pointer}
.selite-ohje > summary{cursor:pointer}
.selite-ohje > p{margin:6px 0 8px}

/* Selitteen näyteluettelo: näyte (inline-SVG samoilla väreillä kuin kartta) + selitys */
.kselite{list-style:none;margin:6px 0 0;padding:0;display:flex;flex-direction:column;gap:8px}
.kselite li{display:flex;align-items:flex-start;gap:10px;line-height:1.45}
.kselite li > svg{flex:none;margin-top:1px}
.kselite li > span{min-width:0}
body.mobiili .kselite li{font-size:13px;color:var(--ink-2)}

/* Puhelimen nappirivi: seitsemän nappia (Haku lisätty) mahtuu 360–390 px:n leveydelle, kukin ≥ 44 px leveä ja 58 px korkea */
body.mobiili .mobiilinavi > *{min-width:44px;padding:0 1px;font-size:10.5px;letter-spacing:-.2px;white-space:nowrap}
@media (max-width: 379px){ body.mobiili .mobiilinavi > *{font-size:9.5px;letter-spacing:-.3px} }
/* ===== 27_kaappi_v021.css ===== */
/* Kaappinäkymän porttitaulukko v0.21 (syväanalyysi 27.10.2026, v0.21) — js/kaappi.js piirraPortit.
   1) Jäljitys tekstinapilla "Mihin tämä menee?" (ennen nimetön ⇢). 2) Toinen pää (piste, kaapeli) linkkinä.
   3) Puhelimessa (≤ 899 px, sama raja kuin js/pohjakuva/13_mobiili.js) porttitaulukko on lukunäkymä: kortti per
   portti, muokkauskentät ja kirjausohjeet vasta Muokkaa-napin takana (#porttiruutu.pt-muokkaustila). */

/* ---------- Jäljitysnappi ---------- */
#porttiruutu .jaljitysnappi{display:inline-flex;align-items:center;padding:1px 7px;margin-left:6px;font:600 12px var(--sans);
  line-height:18px;white-space:nowrap;border-color:var(--blue,#2f6fd0)}
#porttiruutu .jaljitysnappi .jn-pitka{display:none}
#porttiruutu .porttitaulu .pnro{width:auto;white-space:nowrap}
/* Kortin oma jäljitysrivi ja Muokkaa-nappi vain puhelimessa */
#porttiruutu .porttitaulu .pjalj{display:none}
#porttiruutu .pt-muokkaa{display:none}
#porttiruutu .pt-luku{display:none}

/* ---------- Toisen pään linkki (piste, kaapeli) ---------- */
.pt-linkki{appearance:none;border:0;background:none;padding:0;font:inherit;color:var(--blue,#2f6fd0);cursor:pointer;
  text-decoration:underline;text-underline-offset:2px;text-align:left}
.pt-linkki:hover{color:var(--navy,#003a5a)}
.pt-linkki:focus-visible{outline:2px solid var(--blue,#2f6fd0);outline-offset:2px;border-radius:3px}

@media (max-width:899px){
  /* Muokkaa-nappi otsikkoriville */
  #porttiruutu .pt-muokkaa{display:inline-flex;align-items:center;justify-content:center;min-height:44px;min-width:96px;margin:8px 0 0 10px}
  #porttiruutu .pt-muokkaa[aria-pressed="true"]{background:var(--navy,#003a5a);border-color:var(--navy,#003a5a);color:#fff}
  /* Kirjausohjeet ("Portti → rasia", "Kytkentäkaapeli") eivät ole lukijan ja taulukon välissä */
  #porttiruutu:not(.pt-muokkaustila) .pt-ohjeet,
  #porttiruutu:not(.pt-muokkaustila) .puoliselite{display:none}

  /* Kortti per portti */
  #porttiruutu .porttitaulu{border:0;border-radius:0;overflow:visible}
  #porttiruutu .porttitaulu table{display:block;min-width:0;font-size:14px}
  #porttiruutu .porttitaulu thead{display:none}
  #porttiruutu .porttitaulu tbody{display:block}
  #porttiruutu .porttitaulu tr{display:block;margin:0 0 10px;padding:8px 12px 10px;border:1px solid var(--border);
    border-radius:10px;background:var(--surface)}
  #porttiruutu .porttitaulu td{display:block;padding:4px 0;border:0;width:auto;min-width:0;text-align:left;background:none}
  #porttiruutu .porttitaulu td:empty{display:none}
  #porttiruutu .kaksipuolta td.petu{border-left:0;background:none}
  #porttiruutu .porttitaulu td[data-otsikko]::before{content:attr(data-otsikko);display:block;margin-bottom:1px;
    font:600 11px var(--cond,var(--sans));letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
  #porttiruutu .porttitaulu td.pnro{font-size:16px;padding-top:0}
  #porttiruutu .porttitaulu td.pnro .jaljitysnappi{display:none}
  #porttiruutu .porttitaulu td.pjalj{display:block;padding-top:8px}
  #porttiruutu .porttitaulu td.pjalj .jaljitysnappi{display:flex;justify-content:center;width:100%;min-height:44px;margin:0;
    font-size:15px;border-radius:8px}
  #porttiruutu .porttitaulu td.pjalj .jn-pitka{display:inline}
  #porttiruutu .porttitaulu td.pjalj .jn-lyhyt{display:none}
  #porttiruutu .pt-linkki{min-height:32px;display:inline-flex;align-items:center}

  /* Lukunäkymä: kentät ja kytkentänapit piiloon, kirjattu teksti näkyviin */
  #porttiruutu:not(.pt-muokkaustila) .porttitaulu :is([data-kytke],[data-irrota],.ristinappi.tyhja,.pkohde input){display:none}
  #porttiruutu:not(.pt-muokkaustila) .porttitaulu .pt-luku{display:inline}
  #porttiruutu:not(.pt-muokkaustila) .porttitaulu td.pkohde-tyhja{display:none}
  #porttiruutu:not(.pt-muokkaustila) .porttitaulu .ristinappi:not(.tyhja){border:0;background:none;padding:0;
    font:inherit;color:inherit;pointer-events:none;cursor:default}
  /* Tyhjä portti: numero ja "ei kytketty" samalla rivillä */
  #porttiruutu:not(.pt-muokkaustila) .porttitaulu tr.vapaa{display:flex;align-items:baseline;gap:12px;padding:6px 12px}
  #porttiruutu:not(.pt-muokkaustila) .porttitaulu tr.vapaa td:not(.pnro):not(.pjalj){display:none}
  #porttiruutu:not(.pt-muokkaustila) .porttitaulu tr.vapaa td.pjalj{padding:0}

  /* Muokkaustila: kentät ja napit kosketuskokoon */
  #porttiruutu.pt-muokkaustila .porttitaulu .ristinappi,
  #porttiruutu.pt-muokkaustila .porttitaulu .pikanappi{min-height:44px}
  #porttiruutu.pt-muokkaustila .pkohde input{min-height:44px;min-width:0;font-size:16px}
  #porttiruutu.pt-muokkaustila .ristieditori select,
  #porttiruutu.pt-muokkaustila .ristieditori input{min-height:44px;font-size:16px;max-width:100%}
}
/* ===== 28_pohjakuva_v021.css ===== */
/* Pohjakuva v0.21 (syväanalyysi 27.10.2026): Selite-osio Tasot-paneelissa, puhelimen jäljitysnapit Toinen pää -rivillä. */

/* Selite: työpöydällä tasonappien rivissä nappi, joka avaa paneelin rivin yläpuolelle (.tasot on sticky = ankkuri) */
.tasot .pk-selite > summary{list-style:none;border:1px solid var(--border-strong);background:var(--surface);color:var(--ink-2);
  border-radius:7px;padding:5px 9px;font:600 11.5px var(--cond);letter-spacing:.07em;text-transform:uppercase;cursor:pointer;
  display:flex;align-items:center;gap:6px;user-select:none}
.tasot .pk-selite > summary::-webkit-details-marker{display:none}
.tasot .pk-selite > summary::before{content:"?";display:grid;place-items:center;width:16px;height:16px;border-radius:50%;
  border:1.5px solid currentColor;font:700 10.5px/1 var(--sans);letter-spacing:0}
.tasot .pk-selite[open] > summary{background:var(--navy);border-color:var(--navy);color:#fff}
.pks-sisus{position:absolute;left:12px;bottom:100%;z-index:30;width:min(400px, calc(100% - 24px));max-height:min(62vh, 560px);
  overflow:auto;background:var(--surface);border:1px solid var(--border);border-radius:10px;box-shadow:var(--shadow, 0 10px 30px rgba(15,30,45,.22));
  padding:6px 12px 10px;text-transform:none;letter-spacing:0}
.pks-ryhma + .pks-ryhma{border-top:1px solid var(--border);margin-top:6px}
.pks-ots{font:700 11px var(--cond);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);padding:8px 0 2px}
.pks-vihje{margin:0 0 4px;font-size:12px;color:var(--ink-2);line-height:1.35}
.pks-ryhma ul{list-style:none;margin:0;padding:0}
.pks-ryhma li{display:flex;align-items:center;gap:10px;min-height:34px;font-size:13px;color:var(--ink);line-height:1.3}
.pks-ryhma li small{color:var(--muted)}
.pks-kuva{flex:none;display:block;background:#fbfaf7;border-radius:5px}

/* Puhelin: selite Tasot-alapaneelin lopussa koko levyisenä, avautuu paneelin sisään */
body.mobiili .tasot .pk-selite{flex:0 0 100%;margin-top:4px}
body.mobiili .tasot .pk-selite > summary{min-height:40px;font-size:12.5px;justify-content:center}
body.mobiili .pks-sisus{position:static;width:auto;max-height:none;box-shadow:none;border-radius:8px;margin-top:8px;overflow:visible}

/* Puhelin: Mihin tämä menee? / Mistä netti tulee? heti Toinen pää -rivin alla */
.pk-jaljitysnapit{display:flex;flex-wrap:wrap;gap:6px;margin:2px 0 12px}
.pk-jaljitysnapit .nappi{flex:1 1 calc(50% - 6px);min-height:44px;justify-content:center;text-align:center;white-space:normal}

@media print{ .pk-selite{display:none!important} }
/* ===== 29_sivut_v021.css ===== */
/* ---------- Muut sivut v0.21 (syväanalyysi 27.10.2026, v0.21) ---------- */

/* Raportin palveluyhteys: tunniste vie yhteyden sivulle, "kartalla" erillisenä pienenä linkkinä perässä */
.r-kartalla{margin-left:8px;font-size:12px;font-weight:500;color:var(--muted);white-space:nowrap}
.r-kartalla::before{content:"⌖ "}
.r-kartalla:hover{color:var(--ink)}

/* Ohjesivun sanasto: kuitujen värikoodi (TIA-598) pallorivinä */
.ohje-kuituvarit{display:flex;flex-wrap:wrap;gap:6px 12px;margin:6px 0 0;padding:0;list-style:none}
.ohje-kuituvarit li{display:flex;align-items:center;gap:6px;font-size:13px}
.ohje-kuituvarit i{display:inline-block;width:14px;height:14px;border-radius:50%;border:1px solid rgba(0,0,0,.35);flex:none}
/* ===== 30_pohjakuva_v022.css ===== */
/* Pohjakuva v0.22 (27.10.2026): sarjalomakkeet (rasiasarja, kaapelit kaapista monelle rasialle), symbolin koko,
   Pidä A-pää, kahden pisteen poiminta ja puhelimen Lisätoiminnot-valikko. */

/* Numeroitu sarjalomake (malli: hitsauksen sarjalomake): 1 Mitä/Mihin · 2 · 3 Esikatselu */
.sarjalomake{list-style:none;counter-reset:sarja;margin:0;padding:0}
.sarjalomake > li{counter-increment:sarja;margin:0 0 14px;padding:0 0 0 30px;position:relative}
.sarjalomake > li > b:first-child{display:block;font:600 13.5px var(--sans);margin:2px 0 8px}
.sarjalomake > li::before{content:counter(sarja);position:absolute;left:0;top:0;width:22px;height:22px;border-radius:50%;
  background:var(--navy);color:#fff;font:700 12px/22px var(--sans);text-align:center}
.sarja-esikatselu .sarja-yhteenveto{margin:0 0 6px;font:600 13px var(--sans)}
.sarja-esikatselu .sarja-rivit{margin:0;padding:0 0 0 22px;max-height:240px;overflow:auto;font-size:13px;line-height:1.5}
.sarja-esikatselu .sarja-rivit small{color:var(--muted)}
.sarja-esikatselu li.virhe,.sarja-taulu tr.virhe td{color:var(--red)}
.sarja-esikatselu .ristivirhe{margin:0 0 8px}
.sarja-taulu{width:100%;border-collapse:collapse;font-size:12.5px;display:block;max-height:260px;overflow:auto}
.sarja-taulu th{text-align:left;font:600 11px var(--cond);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);
  padding:3px 6px;border-bottom:1px solid var(--border);position:sticky;top:0;background:var(--surface)}
.sarja-taulu td{padding:3px 6px;border-bottom:1px solid var(--border);vertical-align:top;overflow-wrap:anywhere}

/* Rasiavalinta ryhmittäin: .kentta-rivi label -tyyli (isot kirjaimet) ei koske valintarivejä */
.sarja-valinnat{display:flex;flex-direction:column;gap:6px;max-height:300px;overflow:auto;border:1px solid var(--border);
  border-radius:9px;padding:6px 8px}
.kentta-rivi .sarja-valinnat label{font:400 13px var(--sans);letter-spacing:0;text-transform:none;color:var(--ink);
  display:flex;align-items:center;gap:6px;cursor:pointer}
.kentta-rivi .sarja-valinnat label small{color:var(--muted);font-size:11.5px}
.kentta-rivi .sarja-valinnat .sarja-kaikki{font-weight:600}
.sarja-ryhma{border:0;margin:0;padding:0}
.sarja-ryhma legend{padding:0}
.kentta-rivi .sarja-ryhma legend label{font-weight:600}
.kentta-rivi .sarja-valinnat .sarja-rasia{padding-left:22px}
.sarja-valinnat input[type="checkbox"]{width:auto;margin:0}

/* Symbolin koko −/+ tietopaneelissa */
.pk-koko{display:inline-flex;align-items:center;gap:8px}
.pk-koko .pikanappi{min-width:30px;justify-content:center;font-weight:700}
.pk-koko .pikanappi:disabled{opacity:.4;cursor:default}

/* Kaapelityökalun Pidä A-pää (alivalinta) */
.alivalinta label.av-rasti{cursor:pointer;font-weight:500}
.alivalinta label.av-rasti input{width:auto;margin:0}
.alivalinta label.av-rasti small{font-weight:400;color:var(--muted)}

/* Pisteiden poiminta kuvalta (rasiasarjan jana, mittakaava kahdella pisteellä) */
#levy.poiminta #piirros{cursor:crosshair}
.pk-mkkaksi .nappi{align-self:flex-start;width:auto}

/* Puhelin: toimintonapit tiiviimmin, muut Lisätoiminnot ▾ -valikossa */
.pk-lisatoiminnot{flex:1 1 100%}
.pk-lisatoiminnot > summary{list-style:none;justify-content:center;min-height:42px;cursor:pointer}
.pk-lisatoiminnot > summary::-webkit-details-marker{display:none}
.pk-lisatoiminnot-lista{display:flex;flex-direction:column;gap:6px;margin-top:6px}
.pk-lisatoiminnot-lista .nappi{width:100%;min-height:42px;justify-content:flex-start;text-align:left;white-space:normal}
/* ===== 31_kaappi_v022.css ===== */
/* Kaappinäkymän sarjalomakkeet v0.22 (27.10.2026) — js/kaappi.js sarjaLomakeRunko, kytkentaSarjaEditori ja
   js/pohjakuva/09_kaappi.js porttiSarjaEditori. Runko käyttää hitsauslomakkeen luokkia (.hitsauslomake, .h-osa);
   tässä vain sarjan omat osat: napit porttitaulukon yllä, rasialista ja esikatselu riveittäin. */

/* ---------- Sarjanapit porttitaulukon otsikon alla ---------- */
#porttiruutu .pt-sarjat{display:flex;flex-wrap:wrap;gap:6px 8px;margin:6px 0 8px}

/* ---------- Lomake ---------- */
.sarjalomake .hrivi{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px}
.sarjalomake input[type=number]{width:72px}
.sarjalomake .sarja-kohteet{flex:0 0 100%;max-height:220px;overflow:auto;border:1px solid var(--border);border-radius:8px;
  background:var(--surface);padding:4px 0}
.sarjalomake .sarja-kohteet label{display:flex;align-items:baseline;gap:8px;padding:4px 10px;font-size:13.5px;cursor:pointer}
.sarjalomake .sarja-kohteet label:hover{background:var(--surface-2)}
.sarjalomake .sarja-kohteet label small{color:var(--muted);font-size:12px}
.sarjalomake .sarja-kohteet label.sarja-este{cursor:default;color:var(--muted)}
.sarjalomake .sarja-kohteet .tyhja{margin:6px 10px}

/* ---------- Esikatselu: mikä kytketään mihin, varatut punaisella ---------- */
.sarja-esikatselu{margin:8px 0 0}
.sarja-esikatselu .sarja-rivit{margin:0;padding:6px 10px 6px 34px;max-height:260px;overflow:auto;border:1px solid var(--border);
  border-radius:8px;background:var(--surface);font-size:13px;line-height:1.55;font-variant-numeric:tabular-nums}
.sarja-esikatselu .sarja-vika{color:var(--red,#cd4335)}
.sarja-esikatselu .sarja-vika b{font-weight:600}
.sarja-esikatselu .sarja-vikateksti{margin:6px 0 0;color:var(--red,#cd4335);font-size:13px;font-weight:600}
.sarja-esikatselu .sarja-varoitus{margin:6px 0 0;color:#8a5a00;font-size:13px;font-weight:600}
.sarja-esikatselu .tyhja{margin:4px 0;font-size:13px}

/* Puhelin (≤ 899 px, sama raja kuin 27_kaappi_v021.css): sarjanapit vain Muokkaa-tilassa kuten muut kirjaustoiminnot;
   lomake toimii, kentät ja napit kosketuskokoon (≥ 44 px), mutta sitä ei ole erikseen optimoitu puhelimelle. */
@media (max-width:899px){
  #porttiruutu:not(.pt-muokkaustila) .pt-sarjat{display:none}
  #porttiruutu .pt-sarjat .nappi{min-height:44px}
  .sarjalomake input,.sarjalomake select,.sarjalomake .nappi{min-height:44px;font-size:16px}
  .sarjalomake .sarja-kohteet label{min-height:44px;align-items:center}
  .sarjalomake .sarja-kohteet input[type=checkbox]{width:22px;height:22px;flex:none}
}
/* ===== 32_kartta_putkeen.css ===== */
/* Jo piirretty kaapeli putkeen (v0.22.1): putken valinta dialogissa — koko rivi valittavissa, kosketukselle riittävä */
.kk-dialogi .kk-d-valinta{display:flex;gap:10px;align-items:center;padding:10px 12px;margin:6px 0;border:1px solid var(--border);
  border-radius:8px;cursor:pointer;min-height:44px;line-height:1.35}
.kk-dialogi .kk-d-valinta:has(input:checked){border-color:var(--navy,#003a5a);background:#eef4fa}
.kk-dialogi .kk-d-valinta input{width:20px;height:20px;flex:none}
.kk-dialogi [data-nrorivi]{display:block;margin-top:10px}
.kk-dialogi [data-nrorivi] input{display:block;width:8em;margin-top:4px}
/* ===== 33_kartta_v023.css ===== */
/* Kuitukartta v0.23 (27.10.2026): ulkoverkon kartta ja kenttätyö — putkikapasiteetti, kaivannon katko, valokuvat
   karttakohteisiin, Tässä kohdassa -valinta, pohjakartan himmennys ja kiepin kuva. */

/* Putkikapasiteetti: koko linja ja tämä kohta allekkain; muualla linjalla varattu putki haaleana */
.kapasiteetti{margin:6px 0 2px;display:grid;gap:2px}
.kap-rivi span{font-weight:600}
.putkiruutu.muualla{background:repeating-linear-gradient(135deg,#fde2df 0 3px,#fff 3px 6px);border-color:#e3a59e;color:#8a3a31}
.kap-epavarma{color:var(--muted);display:block}

/* Kaivannon katko */
.kv-kaapelit li{display:grid;gap:4px}
.kv-kaapelit .vk-kuidut small{margin-left:6px}
.kv-epavarma{margin:0 16px 10px}

/* Valokuvat kohteen ikkunassa */
.mk-kuvat{margin-top:6px}
.mk-kuvat .mk-napit{margin:4px 0}
.mk-kuvalista{margin-top:4px}
.mk-kuvalista .kuvanauha{display:flex;gap:6px;overflow-x:auto;padding-bottom:4px}
.mk-kuvalista .kuvapala{flex:none;width:84px;height:84px}
.mk-kuvalista .kuvapala img{width:100%;height:100%;object-fit:cover}
body.mobiili .mk-kuvat .nappi{min-height:44px}

/* Tässä kohdassa -valinta: sama tyyli kuin viivojen Samassa kohdassa, ilman yläreunan erotinta */
.tassa-kohdassa{border-top:0;margin-top:0;padding-top:0}
body.mobiili .tassa-kohdassa .samassa-rivi{min-height:44px}

/* Pohjakartan himmennys: säädin karttapohjan valinnan alla, arvo näkyvissä */
.pk-himmennys{display:flex;align-items:center;gap:8px;flex-basis:100%;font-size:13px}
.pk-himmennys span{font:600 11px var(--cond);letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
.pk-himmennys input{flex:1;min-width:110px;max-width:220px;accent-color:#003a5a}
.pk-himmennys output{min-width:3.2em;text-align:right;font-variant-numeric:tabular-nums}
body.mobiili .pk-himmennys input{min-height:44px}
.leaflet-container.pohja-himmennetty{background:#fff}

/* Kiepin kuva tasonapissa, piirron lajinapissa ja selitteessä */
.nayte-kieppi-kuva{display:block;flex:none;line-height:0}
.laji-kuva{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;vertical-align:-4px;margin-right:5px;line-height:0}
.kselite-kuva{display:inline-flex;justify-content:center;width:44px;flex:none}
/* ===== 34_rakennus_v023.css ===== */
/* Kuitukartta v0.23 (27.10.2026) — rakennus, pohjakuva ja kaappi.
   Dokumentoinnin tila -kortti, kerroksen kopiointilomake ja työpöydän toimintonappien ryhmät. */

/* Dokumentoinnin tila: koko rakennus kerroksittain (20_rakennuksen_tila.js) */
.rak-tila-kortti{margin:10px 0 12px}
.rak-tila-kortti:empty{display:none}
.rak-tila{border:1px solid var(--border);border-radius:10px;background:var(--surface-2);padding:6px 10px}
.rak-tila > summary{cursor:pointer;padding:4px 0;display:flex;align-items:baseline;gap:6px;flex-wrap:wrap}
.rak-tila > summary small{color:var(--muted);font-size:11.5px;margin-left:auto}
.rak-tila-ots{font-weight:700;font-size:13px;color:var(--navy)}
.rak-tila-lista{list-style:none;margin:4px 0 4px;padding:0;font-size:12.5px;line-height:1.45}
.rak-tila-lista li{display:flex;align-items:flex-start;gap:7px;padding:5px 0;border-top:1px solid var(--border)}
.rak-tila-lista li:first-child{border-top:0}
.rak-tila-lista .rt-merkki{flex:none;width:18px;height:18px;border-radius:50%;display:inline-flex;align-items:center;
  justify-content:center;font-size:11px;font-weight:700;margin-top:1px}
.rak-tila-lista .rt-teksti{flex:1 1 auto;min-width:0;color:var(--ink-2)}
.rak-tila-lista .rt-teksti b{color:var(--ink);font-weight:600}
.rak-tila-lista .pikanappi{flex:none;white-space:nowrap;font-size:12px}
.rt-valmis .rt-merkki{background:var(--green-soft);color:var(--green)}
.rt-valmis .rt-teksti > span{color:var(--green)}
.rt-kesken .rt-merkki,.rt-puuttuu .rt-merkki{background:var(--yellow-soft);color:var(--yellow)}
.rt-puuttuu .rt-teksti > span{color:var(--red);font-weight:600}
.rt-odottaa .rt-merkki{background:var(--surface);color:var(--muted);border:1px solid var(--border)}
.rt-odottaa .rt-teksti > span{color:var(--muted)}
body.mobiili .rak-tila-lista li{flex-wrap:wrap}
body.mobiili .rak-tila-lista .pikanappi{min-height:36px;margin-left:25px}

/* Kerroksen kopiointi: valinnat ja tunnusten esikatselu */
.pk-kopio-valinnat{border:1px solid var(--border);border-radius:9px;padding:6px 10px 8px;margin:10px 0}
.pk-kopio-valinnat legend{font-size:12px;font-weight:600;color:var(--ink-2);padding:0 4px}
.pk-kopio-valinta{display:flex;align-items:center;gap:7px;font-size:13px;padding:4px 0;cursor:pointer}
.pk-kopio-valinta input{width:auto;margin:0}
.pk-kopio-valinta small{color:var(--muted)}
.pk-kopio-esikatselu{font-size:12.5px;color:var(--ink-2);margin:4px 0 8px}
.pk-kopio-tapa{margin-bottom:4px}
.pk-kopio-tunnukset{list-style:none;margin:0;padding:6px 8px;background:var(--surface-2);border-radius:8px;
  max-height:180px;overflow:auto;font-family:var(--mono);font-size:12px;line-height:1.6}
.pk-kopio-tunnukset small{font-family:inherit;color:var(--muted);display:inline-block;min-width:64px}

/* Työpöydän toimintonapit ryhmiin (tiivistaToiminnot): Irrota kaapeli ▾ ja Lisätoiminnot ▾ */
body:not(.mobiili) .tiedot-toiminnot .pk-lisatoiminnot{flex:none}
body:not(.mobiili) .tiedot-toiminnot .pk-lisatoiminnot > summary{min-height:0;justify-content:space-between}
body:not(.mobiili) .tiedot-toiminnot .pk-lisatoiminnot[open] > summary{background:var(--surface-2)}
body:not(.mobiili) .tiedot-toiminnot .pk-lisatoiminnot-lista{padding-left:10px;border-left:2px solid var(--border)}
body:not(.mobiili) .tiedot-toiminnot .pk-lisatoiminnot-lista .nappi{min-height:0}
body:not(.mobiili) .tiedot-toiminnot .pk-lisatoiminnot-lista .nappi.vaara{margin-top:6px}
/* ===== 35_periaate_v023.css ===== */
/* Raportin Yhteenveto ulkoyhteydestä (v0.23, 27.10.2026): samat merkit kuin periaatekaaviossa
   (ulkokaapeli sininen, reititin oranssi). */
.r-ulkoyhteys{margin-top:14px;padding:14px 16px}
.r-ulkoyhteys h3{font-size:15px;margin:0 0 8px}
.r-ulkoyhteys ul{list-style:none;margin:0 0 8px;padding:0;display:grid;gap:6px}
.r-ulkoyhteys li{font-size:13.5px;line-height:1.45;padding-left:22px;position:relative;overflow-wrap:anywhere}
.r-uy-merkki{position:absolute;left:0;top:.45em;width:14px;height:8px;border-radius:2px}
.r-uy-merkki.kaapeli{height:3px;top:.65em;background:#2f6fd0}
.r-uy-merkki.reititin{background:#c46a10}
.r-uy-puuttuu{color:var(--muted)}
.r-ulkoyhteys .r-selite{margin:6px 0 0}
@media print{.r-ulkoyhteys{break-inside:avoid}}
/* ===== 36_lisaominaisuudet.css ===== */
/* Lisäominaisuudet (27.10.2026): merkki napissa ja himmeä nappi, kun ominaisuus ei ole käytössä */
.lisa-merkki{display:inline-block;margin-left:6px;padding:1px 6px;border-radius:9px;font-size:10.5px;font-weight:700;letter-spacing:.04em;
  text-transform:uppercase;vertical-align:1px;background:#f3e8ff;color:#5b2a91;border:1px solid #d4b8f0;line-height:1.4}
.lisa-pois{opacity:.62}
.lisa-pois:hover,.lisa-pois:focus-visible{opacity:.9}
.lisa-lista{list-style:none;padding:0;margin:8px 0 0}
.lisa-lista li{padding:8px 0;border-top:1px solid var(--border)}
.lisa-lista .lisa-tila{font-weight:700}
.lisa-lista .lisa-tila.kaytossa{color:#1c8a4d}.lisa-lista .lisa-tila.ei_kaytossa{color:var(--muted)}.lisa-lista .lisa-tila.tulossa{color:#b3790c}
.lisa-kiintio{height:8px;border-radius:4px;background:var(--surface-2,#eef2f6);overflow:hidden;margin-top:6px;max-width:320px}
.lisa-kiintio i{display:block;height:100%;background:#2f6fd0}.lisa-kiintio i.varoitus{background:#b3790c}.lisa-kiintio i.taynna{background:#cd4335}
/* Valokuvien paikat kartalla */
.kuvapaikka-merkki{background:#fff;border:2px solid #5b2a91;border-radius:50%;width:24px!important;height:24px!important;display:grid;place-items:center;font-size:12px;box-shadow:0 1px 3px rgba(0,0,0,.3)}
.kuvapaikka-ikkuna img{display:block;max-width:220px;max-height:160px;border-radius:6px;margin-bottom:6px}
/* ===== 37_yhteys_v025.css ===== */
/* Uuden yhteyden aloitusvaihe (v0.25, 27.10.2026): Valitse alkupää kolmella rinnakkaisella tavalla sivun alussa
   (Astra: "Uuden yhteyden ohjattu aloitus jää pitkälle sivun keskelle"). Napit ≥44 px puhelimessa. */
.y-alkutavat{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:4px 0 10px}
.y-alkutapa{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;min-height:58px;padding:8px 6px;
  border:1px solid var(--border-strong);border-radius:10px;background:var(--surface);color:var(--ink);font:600 14px/1.2 var(--sans);cursor:pointer;text-align:center}
.y-alkutapa svg{width:22px;height:22px;color:var(--blue);flex:none}
.y-alkutapa:hover{border-color:var(--blue);background:var(--blue-soft)}
.y-alkutapa[aria-pressed="true"]{border-color:var(--blue);background:var(--blue-soft);box-shadow:inset 0 0 0 1px var(--blue)}
.y-alkutapa:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
.y-alkuvalinta.haetaan{opacity:.55;transition:opacity .2s}
.y-alkurunko{margin:0 0 10px}
#y-alku.kooste .y-alkutavat{display:none}

/* Skannaa tarra: sama tähtäin kuin skannaa.php:ssä (inset 18 % / 12 %), koska luku rajataan sen alueelle */
.y-skanneri{position:relative;background:#000;border-radius:10px;overflow:hidden;aspect-ratio:4/3;max-height:45vh;margin:0 auto 8px}
.y-skanneri video{width:100%;height:100%;object-fit:cover;display:block}
.y-skanneri .y-tahtain{position:absolute;inset:18% 12%;border:3px solid rgba(255,255,255,.85);border-radius:12px;box-shadow:0 0 0 999px rgba(0,0,0,.35)}
.y-tarrarivi{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.y-tarrarivi input{flex:1 1 120px;min-width:0;min-height:44px;padding:6px 10px;font:500 16px var(--mono);text-transform:uppercase;
  letter-spacing:.05em;border:1px solid var(--border-strong);border-radius:9px}
.y-tarrarivi .nappi{min-height:44px}
#y-skannaatila{margin:6px 0 0}

/* Hae */
#y-alkuhaku{width:100%;min-height:44px;padding:8px 12px;font-size:16px;border:1px solid var(--border-strong);border-radius:9px}
.y-hakutulos{display:grid;gap:6px;margin-top:8px;max-height:46vh;overflow:auto}
.y-hakurivi{display:grid;gap:4px}
.y-hakurivi .y-lahikohde{min-height:44px;align-content:center}
.y-hakulaitteet{display:flex;flex-wrap:wrap;gap:6px;padding-left:12px}

/* Valintaruutu ja laitelista aloitusvaiheessa */
.y-valitsinohje{margin:0 0 4px}
.y-paatlista{margin:6px 0 0}
.y-paatlista > summary{cursor:pointer;color:var(--ink-2);font-size:13.5px;padding:6px 0}
#y-alku:has(.y-valitsin[hidden]) #y-lisaapaa{display:none}
#y-alku:has(.y-valitsin[hidden]):has(#y-alkuvalmis[hidden]) .y-alkunapit{display:none}

/* Jatka keskeneräistä: tiivis rivi, lista aukeaa napautuksella */
.y-jatkakesken{padding:6px 14px}
.y-jatkakesken summary{cursor:pointer;min-height:44px;display:flex;align-items:center;gap:6px;font-size:14px;color:var(--ink-2);
  overflow:hidden;text-overflow:ellipsis}
.y-jatkakesken summary b{color:var(--ink);white-space:nowrap}
.y-jatkakesken .y-tyolista{margin:4px 0 8px}

/* Puhelin ja kapea näyttö: aloitusvaiheessa valinta ensin ja kartta vasta Kartalta-valinnalla */
@media (max-width:999px){
  .y-rakennus.y-aloitusvaihe:not(.y-alku-kartta) .y-rak-kartta{display:none}
  .y-rakennus.y-aloitusvaihe:not(.y-alku-kartta) .y-rak-oikea{order:-1}
}
@media (max-width:420px){
  .y-alkutavat{gap:6px}
  .y-alkutapa{font-size:13px;min-height:56px;padding:6px 4px}
}
/* ===== 38_pohjakuva_v025.css ===== */
/* Pohjakuva v0.25 (27.10.2026): Tässä kohdassa -lista ja tunnisteiden asettelu. */

/* Tässä kohdassa -lista napsautuskohdan vieressä (rivit samaa tyyliä kuin kartan .samassa-rivi) */
#kohdassalista{position:fixed;z-index:1300;margin:0;padding:8px;min-width:220px;max-width:min(340px,calc(100vw - 8px));
  max-height:60vh;overflow:auto;background:var(--surface,#fff);border:1px solid var(--border);border-radius:10px;
  box-shadow:0 6px 24px rgba(16,32,52,.18)}
#kohdassalista>b{font-size:12.5px;padding:0 2px 2px}
#kohdassalista .samassa-rivi:focus-visible,#kohdassalista .samassa-rivi:hover{border-color:#f08c00;background:#fff6e8;outline:none}
#kohdassalista .pk-kohdassa-lisa{color:var(--muted);font-size:12px;padding:2px}
body.mobiili #kohdassalista .samassa-rivi{min-height:44px}

/* Piilotettu tunniste (ei mahtunut): näkyy kohdetta osoitettaessa, fokuksessa tai listan rivin osoituksessa.
   display eikä visibility: piilotettua tekstiä ei aseteta lainkaan, joten zoomaus pysyy kevyenä isossakin kerroksessa. */
#piirros text.tl-piilo{display:none;pointer-events:none}
#piirros .osuma:hover>text.tl-piilo,#piirros .osuma:focus-visible>text.tl-piilo,#piirros .osuma.tl-nayta>text.tl-piilo{display:inline}
/* ===== 39_pohjakuva_kaappi_v026.css ===== */
/* Pohjakuva ja kaappi v0.26 (27.10.2026): tunnisteiden johtoviivat, hitsauksen kaapelisirujen Mistä/Mihin-napit. */

/* Siirretyn tunnuksen johtoviiva kohteeseensa (asetteleTunnisteet): ei osumia, ei tulosteessa paksuna */
#piirros line.tl-johto{pointer-events:none}

/* Kaapelisiru = Näytä hitsaukset; vieressä pienet Mistä/Mihin-napit valitsevat kaapelin lomakkeeseen */
.kotelokaapeli-ryhma{display:inline-flex;align-items:stretch;gap:2px;max-width:100%}
.kotelokaapeli-ryhma .kotelokaapeli{min-width:0}
.kotelokaapeli-valitse{font:inherit;font-size:12px;padding:3px 8px;border:1px solid var(--border);border-radius:999px;
  background:var(--surface,#fff);color:var(--ink-2);cursor:pointer;white-space:nowrap}
.kotelokaapeli-valitse:hover,.kotelokaapeli-valitse:focus-visible{border-color:var(--ink-2);background:var(--surface-2)}
body.mobiili .kotelokaapeli-valitse{min-height:40px;padding:3px 12px}
@media (max-width:600px){.kotelokaapeli-ryhma{flex-wrap:wrap}}
/* ===== 40_yhteiset_v026.css ===== */
/* Yhteiset apurit v0.26 (27.10.2026) */

/* Ilmoituspino (v0.26, 27.10.2026): ennen yksi #kk-ilmoitus, jonka seuraava ilmoitus korvasi Kumoa-nappeineen.
   Nyt ilmoitukset pinoutuvat (enintään 3 kumottavaa + yksi tavallinen), uusin alimpana. Ulkoasu sama kuin ennen. */
#kk-ilmoitukset{position:fixed;left:50%;bottom:calc(var(--mnavi, 0px) + 18px);transform:translateX(-50%);z-index:4900;
  display:flex;flex-direction:column;align-items:center;gap:8px;width:max-content;max-width:min(560px,calc(100vw - 32px));
  pointer-events:none}
#kk-ilmoitukset:empty{display:none}
#kk-ilmoitukset .kk-ilm{pointer-events:auto;display:flex;align-items:center;gap:10px;max-width:100%;box-sizing:border-box;
  padding:10px 10px 10px 16px;background:#16263a;color:#fff;border-radius:10px;box-shadow:0 10px 30px rgba(15,30,45,.35);
  font-size:14px;line-height:1.4}
#kk-ilmoitukset .kk-ilm.virhe{background:#7d1f17}
#kk-ilmoitukset .kk-ilm span{flex:1 1 auto;white-space:pre-line;max-height:30vh;overflow:auto}
#kk-ilmoitukset .kk-ilm button{appearance:none;border:0;cursor:pointer;font:600 14px var(--sans);border-radius:7px;min-height:34px}
#kk-ilmoitukset .kk-kumoa{background:#fff;color:#16263a;padding:0 14px;white-space:nowrap}
#kk-ilmoitukset .kk-kumoa:disabled{opacity:.6}
#kk-ilmoitukset .kk-ilm-sulje{background:transparent;color:#c6d3e2;width:34px;font-size:16px}
#kk-ilmoitukset .kk-ilm button:focus-visible{outline:2px solid #9cc3ff;outline-offset:2px}
@media print{#kk-ilmoitukset{display:none!important}}

/* Välilehdet näppäimistöllä (v0.26, 27.10.2026): nuolinäppäimin valittu välilehti näkyy fokuksessa */
.y-valilehdet [role="tab"]:focus-visible{outline:2px solid var(--blue);outline-offset:1px}
/* Vaiheotsikko saa ohjelmallisen fokuksen (tabindex=-1) — ei kehystä hiirikäytössä */
.y-vaihe h2[tabindex="-1"]:focus:not(:focus-visible),.y-nyt[tabindex="-1"]:focus:not(:focus-visible){outline:none}
/* ===== 41_yhteys_v027.css ===== */
/* Yhteyden rakennus (v0.27, 27.10.2026): kameran / WLAN:n liitäntä on suunnitelmarivi. Jos laitteella on jo toinen
   liitäntä, valinnassa kerrotaan se huomiovärillä — kuittaus "tehty" ei korvaa vanhaa liitäntää hiljaa. */
.y-ul-nykyinen{padding:6px 10px;border-left:3px solid var(--yellow);background:var(--yellow-soft);border-radius:0 8px 8px 0;color:var(--ink)}
/* ===== 42_esimerkkipohjat.css ===== */
/* Esimerkkipohjat pohjakuvasivulla (v0.28, 27.10.2026) */
.esimerkkipohjat{margin-top:16px;padding-top:14px;border-top:1px solid var(--border)}
.esimerkkipohjat h3{font-size:15px;margin:0 0 4px}
.esimerkkipohjat p{color:var(--ink-2);font-size:13.5px;margin:0 0 10px}
.esimerkkipohjat ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}
.esimerkkipohjat li{display:flex;align-items:center;gap:8px;padding:8px 10px;border:1px solid var(--border);border-radius:6px;background:var(--surface)}
.esimerkkipohjat li>div{flex:1;min-width:0;display:flex;flex-direction:column}
.esimerkkipohjat li span{color:var(--muted);font-size:12.5px}
/* ===== 43_extra.css ===== */
/* Extra-valikko (v0.34, 30.10.2026): laiteluettelo, kuvat ja tehtävät */
.navivalikko-lista a.lisa-pois{opacity:.55}
.extra-pois{max-width:640px}
.extra-pois h2{font-size:18px;margin:0 0 8px}

/* Laiteluettelo */
.laiteluettelo th[data-jarj]:hover{color:var(--blue)}
.laiteluettelo th[aria-sort="ascending"]::after{content:" ▲";font-size:10px}
.laiteluettelo th[aria-sort="descending"]::after{content:" ▼";font-size:10px}
.laiteluettelo .ll-ip code{font-family:var(--mono);font-size:13px;white-space:nowrap}
.laiteluettelo .ll-tyhja{color:var(--muted)}
.laiteluettelo .ll-om{display:flex;flex-wrap:wrap;gap:4px 10px;font-size:12.5px;color:var(--ink-2)}
.laiteluettelo .ll-om i{font-style:normal;color:var(--muted)}
.laiteluettelo .ll-napit{white-space:nowrap;text-align:right}
.laiteluettelo .ll-akku{display:block;margin-top:4px;font-size:12px;font-weight:600;white-space:nowrap}
.laiteluettelo .ll-akku-ok{color:var(--green)} .laiteluettelo .ll-akku-pian{color:var(--yellow)}
.laiteluettelo .ll-akku-myoh{color:var(--red)} .laiteluettelo .ll-akku-tuntematon{color:var(--muted);font-weight:500}
.laiteluettelo .ll-akkupv{display:block;color:var(--muted);font-size:12px}
.laiteluettelo td[data-o="Asennettu"]{white-space:nowrap}
.ll-akkuhuom{border:0;cursor:pointer}
.ll-akkukentat{border:1px solid var(--border);border-radius:8px;margin:10px 0 0;padding:6px 10px 10px}
.ll-akkukentat legend{font-size:13px;font-weight:600;padding:0 4px}

/* Kartta + palsta (kuvat, tehtävät) */
.extra-sivu{flex:1;display:grid;grid-template-columns:minmax(300px,400px) 1fr;min-height:0}
#kartta.extra-kartta{height:auto;border-radius:0;border:0;box-shadow:none}
.extra-palsta{overflow-y:auto;padding:14px 16px;border-right:1px solid var(--border);background:var(--surface)}
.extra-kartta{min-height:320px}
.extra-selite{color:var(--ink-2);font-size:13px;margin:0 0 10px}
.extra-tila{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}
@media (max-width:760px){
  .extra-sivu{grid-template-columns:1fr;grid-template-rows:55vh auto}
  #kartta.extra-kartta{height:55vh}
  .extra-palsta{border-right:0;border-bottom:1px solid var(--border);order:2}
  .extra-kartta{order:1}
}

/* Kuvat */
.kv-merkki{display:inline-block;width:20px;height:20px;line-height:18px;text-align:center;border-radius:50%;font-size:11px}
.kuvapaikka-merkki.kv-kohde,.kv-merkki.kv-kohde{background:#fff;border:2px dashed var(--muted);border-radius:50%;opacity:.85}
.kuvapaikka-merkki.kv-gps,.kv-merkki.kv-gps{background:#fff;border:2px solid var(--blue);border-radius:50%}
.kuvapaikka-merkki{display:flex;align-items:center;justify-content:center;font-size:13px}
.kv-galleria{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:8px}
.kv-pala{display:flex;flex-direction:column;padding:0;border:1px solid var(--border);border-radius:6px;background:var(--surface);cursor:pointer;overflow:hidden;text-align:left;font:inherit}
.kv-pala:hover,.kv-pala:focus-visible{border-color:var(--blue)}
.kv-pala img{width:100%;aspect-ratio:4/3;object-fit:cover;display:block;background:var(--surface-2)}
.kv-pala span{padding:4px 6px;font-size:12px;line-height:1.3;overflow:hidden;text-overflow:ellipsis}
.kv-pala small{display:block;color:var(--muted);font-size:11px}

/* Tehtävät */
.th-lista{display:flex;flex-direction:column;gap:6px}
.th-kortti{display:block;width:100%;text-align:left;font:inherit;padding:8px 10px 8px 12px;border:1px solid var(--border);border-left:4px solid var(--blue);
  border-radius:6px;background:var(--surface);cursor:pointer}
.th-kortti:hover,.th-kortti:focus-visible{border-color:var(--blue);background:var(--blue-soft)}
.th-kortti.th-tyon_alla{border-left-color:var(--orange)} .th-kortti.th-odottaa{border-left-color:var(--muted)}
.th-kortti.th-valmis{border-left-color:var(--green);opacity:.75} .th-kortti.th-peruttu{border-left-color:var(--border-strong);opacity:.6}
.th-ots{display:block;font-weight:600;font-size:14px;margin-bottom:3px}
.th-tiedot{display:flex;flex-wrap:wrap;gap:3px 10px;font-size:12.5px;color:var(--ink-2)}
.th-tilamerkki{font-weight:600}
.th-ei{color:var(--muted);font-style:italic}
.th-myoh-teksti{color:var(--red);font-weight:600}
.th-kiiremerkki{color:var(--red);font-size:11px;text-transform:uppercase;letter-spacing:.03em}
.th-lomake{display:flex;flex-direction:column;gap:8px}
.th-lomake label{display:flex;flex-direction:column;gap:3px;font-size:13px;color:var(--ink-2)}
.th-lomake input,.th-lomake select,.th-lomake textarea{font:inherit;font-size:14px}
.th-rivi{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.th-paikka{font-size:13px;padding:8px 10px;background:var(--blue-soft);border-radius:6px}
.th-napit{display:flex;gap:8px;flex-wrap:wrap}
.th-napit #l-poista{margin-left:auto}
.th-tieto{font-size:12px;color:var(--muted);margin:0}
.th-merkki{display:flex;align-items:center;justify-content:center;border-radius:50%;border:2px solid #fff;background:var(--blue);
  box-shadow:0 1px 4px rgba(0,0,0,.4);color:#fff;font-weight:700;font-size:13px}
.th-merkki.th-tyon_alla{background:var(--orange)} .th-merkki.th-odottaa{background:var(--muted)}
.th-merkki.th-valmis{background:var(--green)} .th-merkki.th-peruttu{background:var(--border-strong)}
.th-merkki.th-kiire,.th-merkki.th-myoh{border-color:var(--red);box-shadow:0 0 0 2px var(--red),0 1px 4px rgba(0,0,0,.4)}
.th-merkki.th-kohteessa{border-style:dashed}
.th-merkki.th-valittu{transform:scale(1.35);box-shadow:0 0 0 3px var(--yellow),0 1px 6px rgba(0,0,0,.5)}
.th-lomake select{max-width:100%;min-width:0}
.th-rivi>label{min-width:0}
.kuvapaikka-merkki{position:relative}
.kv-lkm{position:absolute;top:-8px;right:-10px;background:var(--blue);color:#fff;border-radius:9px;font:700 10px/16px var(--sans);min-width:16px;padding:0 3px;text-align:center}
.kv-ryhma{max-height:340px;overflow-y:auto}
.kv-ryhma .kuvapaikka-ikkuna{border-top:1px solid var(--border);padding-top:6px;margin-top:6px}
/* Tehtävät pääkartalla (v0.34.1) */
.selite .nayte-tehtava{width:12px;height:12px;border-width:1.5px;box-shadow:none}
.th-ikkuna{display:flex;flex-direction:column;gap:3px;font-size:13px}
.th-ikkuna small{color:var(--muted)}
.th-ikkuna p{margin:2px 0;color:var(--ink-2)}
.th-ikkuna .nappi{align-self:flex-start;color:#fff}
/* ===== 44_karttatasot.css ===== */
/* Tuodut karttatasot (v0.41, 1.11.2026): selitteen kytkimet, kohteen ikkuna ja hallintasivu karttatasot.php */
.selite-tasot-otsikko{flex-basis:100%;display:flex;gap:10px;align-items:baseline;margin-top:4px;
  font:600 11px var(--cond);letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.selite-tasot-otsikko a{font:500 12.5px var(--sans);letter-spacing:0;text-transform:none}
.nayte-karttataso{width:20px;height:0;border-top:3px dashed;display:block;flex:none}
.selite button.lataa{cursor:progress;opacity:.7}
.karttataso-ikkuna table{border-collapse:collapse;font-size:12.5px;margin-top:4px}
.karttataso-ikkuna th{text-align:left;color:var(--muted);font-weight:500;padding:2px 10px 2px 0;vertical-align:top;white-space:nowrap}
.karttataso-ikkuna td{padding:2px 0;word-break:break-word}
.kt-lomake{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px 16px;align-items:end}
.kt-lomake label{display:block;font:600 11px var(--cond);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-bottom:4px}
.kt-lomake input[type=file]{width:100%}
.kt-lomake select,.kt-lomake input[type=text],.kt-muokkaus input[type=text],.kt-muokkaus select{padding:8px 11px;border:1px solid var(--border-strong);
  border-radius:9px;font:14px var(--sans);background:var(--surface);color:var(--ink)}
.kt-lomake select,.kt-lomake input[type=text]{width:100%}
.kt-lomake input[type=color]{width:52px;height:38px;padding:2px;border:1px solid var(--border-strong);border-radius:6px;background:var(--surface)}
.kt-valinta{display:flex;gap:8px;align-items:center;font-size:13.5px}
.kt-vari{display:inline-block;width:22px;height:0;border-top:4px dashed;vertical-align:middle;margin-right:6px}
.kt-muokkaus{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.kt-muokkaus input[type=text]{min-width:160px;flex:1}
.kt-muokkaus input[type=color]{width:40px;height:30px;padding:2px;border:1px solid var(--border-strong);border-radius:6px}
.kt-muokkaus select{width:auto}
.kt-luokat td,.kt-luokat th{vertical-align:middle}
.kt-viesti{padding:10px 14px;border-radius:8px;margin:0 0 14px;font-size:14px}
.kt-viesti.ok{background:#e7f5ec;color:#14532d;border:1px solid #b7e0c4}
.kt-viesti.virhe{background:#fdecea;color:#7a1d14;border:1px solid #f1b9b2}
@media (max-width:640px){.kt-muokkaus input[type=text]{min-width:0;width:100%}}
/* ===== 45_ominaisuudet.css ===== */
/* Ominaisuudet (v0.41.1, 1.11.2026): koko toimintolista ryhmittäin, ominaisuudet.php */
.om-johdanto{color:var(--ink-2);font-size:14.5px;margin:0 0 16px;max-width:76ch;line-height:1.55}
.om-pikalinkit{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 12px}
.om-pikalinkit a{display:inline-flex;gap:6px;align-items:center;padding:5px 11px;border:1px solid var(--border);border-radius:999px;
  background:var(--surface);font-size:13px;color:var(--ink);text-decoration:none}
.om-pikalinkit a:hover{border-color:var(--border-strong)}
.om-pikalinkit span{font:600 11px var(--mono);color:var(--muted)}
.om-haku{width:100%;max-width:360px;box-sizing:border-box;margin:0 0 6px;padding:8px 11px;border:1px solid var(--border-strong);border-radius:9px;font:14px var(--sans);background:var(--surface);color:var(--ink)}
.om-ryhma{margin:26px 0 0;scroll-margin-top:12px}
.om-ryhma h2{font-size:18px;margin:0 0 3px}
.om-ryhma-johdanto{color:var(--ink-2);font-size:13.5px;margin:0 0 12px}
.om-ruudukko{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}
.om-kortti{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:13px 15px;display:flex;flex-direction:column}
.om-kortti h3{font-size:14.5px;margin:0 0 6px;display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.om-kortti p{font-size:13.5px;color:var(--ink-2);margin:0 0 8px;line-height:1.5;flex:1}
.om-linkki{font-size:13px;font-weight:500;align-self:flex-start}
.om-merkki{font:600 10.5px var(--cond);letter-spacing:.06em;text-transform:uppercase;padding:2px 7px;border-radius:999px;border:1px solid}
.om-kaytossa{color:#14532d;background:#e7f5ec;border-color:#b7e0c4}
.om-pois{color:var(--muted);background:var(--surface-2);border-color:var(--border)}
.om-paikallinen{color:#1e3a8a;background:#eaf0fd;border-color:#c3d3f6}
@media (max-width:640px){.om-ruudukko{grid-template-columns:1fr}.om-haku{max-width:none}}
@media print{.om-pikalinkit,.om-haku,.om-linkki{display:none}.om-kortti{break-inside:avoid}}
/* ===== 46_piirtotila.css ===== */
/* Piirtotilan merkki (Aki 10.11.2026: "pitäisi olla jokin selvempi merkki mikä on päällä"). Kartalla ja pohjakuvalla
   sama ajatus: palkki piirtoalueen yläreunassa kertoo työn (laji, kärjet) ja tarjoaa Valmis / Kumoa / Peru hiiren
   viereen, ja alueen reunassa on työn värinen kehys. Väri tulee muuttujasta --piirtovari (js asettaa lajin mukaan). */
.piirtopalkki{position:absolute;top:10px;left:50%;transform:translateX(-50%);z-index:1001;display:flex;align-items:center;gap:8px;
  background:var(--surface,#fff);border:2px solid var(--piirtovari,#d1762b);border-radius:10px;padding:6px 8px 6px 10px;
  box-shadow:0 6px 20px rgba(0,0,0,.2);width:max-content;max-width:calc(100% - 110px);font-size:13px;cursor:default}
.piirtopalkki[hidden]{display:none}
.piirtopalkki .pp-vari{flex:0 0 22px;width:22px;height:6px;border-radius:3px;background:var(--piirtovari,#d1762b);
  box-shadow:0 0 0 2px #fff,0 0 0 3px color-mix(in srgb, var(--piirtovari,#d1762b) 30%, transparent)}
.piirtopalkki .pp-teksti{min-width:0}
.piirtopalkki b{display:block;font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ink)}
.piirtopalkki small{display:block;color:var(--muted);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.piirtopalkki .nappi{flex:0 0 auto;white-space:nowrap}
#kartta.piirtaa::after{content:"";position:absolute;inset:0;border:4px solid var(--piirtovari,#d1762b);
  border-radius:inherit;pointer-events:none;z-index:999}
/* Pohjakuva: levy vierii, joten palkin ankkuri on tarttuva (sticky) nollakorkuinen rivi levyn alussa ja kehys on levyn
   outline, joka piirtyy sisällön päälle eikä vieri. */
.pp-ankkuri{position:sticky;top:0;left:0;height:0;z-index:4;pointer-events:none}
.pp-ankkuri[hidden]{display:none}
.pp-ankkuri .piirtopalkki{pointer-events:auto;max-width:calc(100% - 250px)}
.levy.piirtaa{outline:4px solid var(--piirtovari,#d1762b);outline-offset:-4px}
body.mobiili .pp-ankkuri{display:none}
body.mobiili .levy.piirtaa{outline:0}
@media print{.piirtopalkki,.pp-ankkuri{display:none!important} #kartta.piirtaa::after{display:none} .levy.piirtaa{outline:0}}
@media (max-width:700px){.piirtopalkki small{display:none} .piirtopalkki{max-width:calc(100% - 20px)}}
/* ===== 47_poikkileikkaus.css ===== */
/* Mitä tässä kulkee: poikkileikkaus kartan kohdasta (10.11.2026, js/kartta/23_poikkileikkaus.js) */
.leikkauskortti{position:absolute;top:12px;right:12px;z-index:1000;width:min(430px,calc(100% - 24px));max-height:calc(100% - 70px);
  overflow:auto;background:#fff;border:1px solid var(--reuna,#d9dee4);border-top:4px solid #b3790c;border-radius:10px;
  box-shadow:0 6px 24px rgba(0,0,0,.22);padding:10px 14px 8px;font:400 14px/1.5 var(--sans);color:var(--ink);cursor:default}
.leikkauskortti[hidden]{display:none}
.leikkauskortti .pl-yla{display:flex;justify-content:space-between;align-items:center;gap:10px;position:sticky;top:-10px;background:#fff;padding:4px 0}
#kartta.leikkaa,#kartta.leikkaa .leaflet-interactive{cursor:help!important}
#kartta.leikkaa .leaflet-interactive{pointer-events:none!important}
.pl-yhteenveto{margin:4px 0 6px}
.pl-rakenne{border-top:1px solid var(--reuna,#d9dee4);padding:8px 0 4px}
.pl-otsikko{margin-bottom:6px}
.pl-rivi{display:flex;gap:14px;align-items:flex-start;flex-wrap:wrap}
.pl-kuva{flex:0 0 auto;max-width:100%;height:auto}
.pl-kuva .pl-nro{font-size:11px;fill:#5b6672}
.pl-kuva .pl-luku{font-size:14px;font-weight:700;fill:#1f2933}
.pl-lista{flex:1 1 220px;min-width:0;line-height:1.7}
.pl-vapaa{color:#5b6672}
.pl-huom{margin-top:8px;padding:8px 10px;border-radius:8px;background:#fdf3e1;border:1px solid #e8c98a;font-size:13px;line-height:1.5}
.pl-kaapeli{appearance:none;border:0;background:none;padding:0;font:inherit;font-weight:600;color:var(--linkki,#0b5cab);cursor:pointer;text-decoration:underline;text-underline-offset:2px}
.pl-kaapeli i{display:inline-block;width:10px;height:10px;border-radius:50%;margin-right:5px;vertical-align:baseline}
@media print{.leikkauskortti{display:none!important}}
.leikkauskortti .pl-napit{display:flex;gap:6px;flex:none}
#plAlue[aria-pressed=true]{background:#b3790c;border-color:#b3790c;color:#fff}
#kartta.leikkaa-alue,#kartta.leikkaa-alue .leaflet-interactive{cursor:crosshair!important}
/* ===== 48_tasot_tyokalut.css ===== */
/* Tasot ja työkalut -paneelin välilehdet Tasot | Työkalut | Suodatus (10.11.2026, index.php, js/kartta/12_vasen_paneeli.js) */
.oheis-valilehdet{display:flex;gap:4px;margin:0 0 10px;border-bottom:2px solid var(--border)}
.oheis-valilehdet button{appearance:none;background:none;border:0;border-bottom:3px solid transparent;margin-bottom:-2px;
  padding:8px 10px;font:inherit;font-size:14px;font-weight:650;color:var(--muted);cursor:pointer;white-space:nowrap}
.oheis-valilehdet button[aria-selected=true]{color:var(--navy);border-bottom-color:var(--blue)}
.oheis-tyokalut{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:2px 0 12px}
.oheis-tyokalut[hidden]{display:none}
.oheis-tyokalut .ot-linkit{font-size:13px;margin-left:6px}
#karttaoheiset .suodatus{padding:0 0 12px;max-width:440px}
.suodatus .sd-rivi input{padding:6px 8px;border:1px solid var(--border-strong);border-radius:7px;background:#fff;font:inherit;font-size:13px}
@media print{.oheis-valilehdet,.oheis-tyokalut,#karttaoheiset .suodatus{display:none!important}}
