:root{
  --font:'JetBrains Mono','SF Mono',Monaco,Inconsolata,monospace;
  --bg:#fbfaf8; --card:#fff; --ink:#000; --dim:#686868; --line:#000; --line2:#dedad2;
  --muted:#f2f0ec; --marker-ink:#fff;
  --under:#00a05a; --over:#e5392f; --warn:#e08a00; --accent:#0047ff;
  --shadow:4px 4px 0 rgba(0,0,0,.22);
}
html.dark{
  --bg:#0d0d0d; --card:#171717; --ink:#f1f1f1; --dim:#9a9a9a; --line:#f1f1f1; --line2:#2b2b2b;
  --muted:#222; --marker-ink:#0d0d0d;
  --under:#0fbf6b; --over:#ff5544; --warn:#ffab00; --accent:#6aa0ff;
  --shadow:4px 4px 0 rgba(255,255,255,.16);
}
*{scrollbar-width:thin;scrollbar-color:#999 transparent}
html,body{height:100%}
body{
  margin:0;background:var(--bg);color:var(--ink);font-family:var(--font);font-size:12px;
  display:flex;flex-direction:column;overflow:hidden;-webkit-font-smoothing:antialiased;
}
a{color:inherit}
button{font-family:inherit;cursor:pointer}

/* ---------- header ---------- */
.hdr{
  display:flex;align-items:center;gap:18px;padding:10px 12px;border-bottom:1px solid var(--line2);
  flex:0 0 auto;min-height:52px;background:var(--bg);z-index:5;
}
.hdr-left{display:flex;align-items:baseline;gap:10px;min-width:0}
.logo{font-weight:700;font-size:17px;letter-spacing:.02em;text-decoration:none;white-space:nowrap}
.logo span{color:var(--dim);font-weight:400}
.tagline{color:var(--dim);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hdr-mid{flex:1;display:flex;gap:14px;justify-content:center;flex-wrap:wrap}
.stat{display:flex;flex-direction:column;line-height:1.15}
.stat b{font-size:14px}
.stat span{font-size:10px;color:var(--dim);text-transform:uppercase;letter-spacing:.06em}
.hdr-right{display:flex;align-items:center;gap:8px}
.sample{font-size:9px;text-transform:uppercase;letter-spacing:.08em;color:var(--dim);border:1px solid var(--line2);border-radius:99px;padding:3px 7px;cursor:help}
.icon-btn{border:1px solid var(--line2);background:var(--card);color:var(--ink);border-radius:8px;padding:5px 9px;font-size:12px;line-height:1}
.icon-btn:hover{background:var(--muted)}

/* ---------- filters ---------- */
.filters{
  display:flex;align-items:center;gap:6px;padding:7px;border-bottom:1px solid var(--line2);
  overflow-x:auto;flex:0 0 auto;background:var(--bg);white-space:nowrap;
}
.f, .searchrow input{
  font-family:inherit;font-size:11px;padding:5px 7px;border:1px solid var(--line2);border-radius:7px;
  background:var(--card);color:var(--ink);
}
.f:focus-visible,.searchrow input:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
.check{display:inline-flex;align-items:center;gap:5px;font-size:11px;padding:4px 7px;border:1px solid var(--line2);border-radius:7px;background:var(--card);cursor:pointer;color:var(--ink)}
.check input{accent-color:var(--ink);margin:0}
.check:has(input:checked){border-color:var(--line);box-shadow:inset 0 0 0 1px var(--line)}
.f-spacer{flex:1}
.filters2{padding-top:4px;padding-bottom:5px;border-top:1px dashed var(--line2);font-size:10px;color:var(--dim)}
.numf{display:inline-flex;align-items:center;gap:4px;font-size:10px;color:var(--dim);white-space:nowrap}
.numf input{width:68px;font-family:inherit;font-size:10px;padding:4px 5px;border:1px solid var(--line2);border-radius:6px;background:var(--card);color:var(--ink)}
.numf input:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
.mobile-only{display:none}
.map-fab{display:none;position:fixed;right:12px;bottom:12px;z-index:45;box-shadow:0 2px 10px rgba(0,0,0,.28);padding:8px 12px;font-weight:700}

/* ---------- split ---------- */
main{flex:1;display:flex;min-height:0}
.list{width:min(760px,52vw);overflow-y:auto;overflow-x:hidden;border-right:1px solid var(--line2);background:var(--bg);position:relative}
.map{flex:1;position:relative;background:var(--muted)}
.maplibregl-canvas{filter:grayscale(100%) contrast(1.02)}
html.dark .maplibregl-canvas{filter:grayscale(100%) invert(1) hue-rotate(180deg) brightness(.92) contrast(1.05)}

/* ---------- histograms ---------- */
.list-head{position:sticky;top:0;z-index:3;background:var(--bg);border-bottom:1px solid var(--line2)}
.histos{display:flex;gap:14px;padding:6px 14px 2px}
.histo{flex:1;position:relative;padding-top:2px;display:flex;flex-direction:column}
.histo + .histo{border-left:1px solid var(--line2);padding-left:12px}
.histo canvas{display:block;width:100%}
.histo-label{display:flex;justify-content:space-between;align-items:baseline;font-size:10px;color:var(--dim);text-transform:uppercase;letter-spacing:.06em;padding:2px 0 3px}
.histo-label b{color:var(--ink);font-weight:500;letter-spacing:0;text-transform:none}
.range2{position:relative;height:16px;margin-top:5px}
.range2::before{content:'';position:absolute;left:4px;right:4px;top:7px;height:2px;background:var(--line2)}
.range2 input[type=range]{
  position:absolute;left:4px;top:0;width:calc(100% - 8px);height:16px;margin:0;background:none;pointer-events:none;
  -webkit-appearance:none;appearance:none;
}
.range2 input[type=range]::-webkit-slider-runnable-track{height:16px;background:none}
.range2 input[type=range]::-webkit-slider-thumb{
  -webkit-appearance:none;pointer-events:auto;width:8px;height:14px;border-radius:3px;
  background:var(--ink);border:1px solid var(--bg);margin-top:1px;cursor:ew-resize;box-shadow:0 0 0 1px var(--ink);
}
.range2 input[type=range]::-moz-range-track{height:16px;background:none}
.range2 input[type=range]::-moz-range-thumb{
  pointer-events:auto;width:8px;height:16px;border-radius:3px;background:var(--ink);border:1px solid var(--bg);cursor:ew-resize;
}

/* ---------- list ---------- */
.searchrow{display:flex;align-items:center;gap:8px;padding:8px 14px 8px}
.searchrow input{flex:1;min-width:0}
.count{font-size:10px;color:var(--dim);white-space:nowrap}
.cards{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding:8px 14px 40px}
.card{
  border:1px solid var(--line);border-radius:10px;overflow:hidden;background:var(--card);
  cursor:pointer;position:relative;transition:transform .18s cubic-bezier(.25,1,.25,1),box-shadow .18s;
}
.card:hover,.card.hover{box-shadow:var(--shadow);outline:2px solid var(--ink);outline-offset:1px}
.card .photo{position:relative;aspect-ratio:16/10;overflow:hidden;background:var(--muted);border-bottom:1px solid var(--line)}
.card .photo img{width:100%;height:100%;object-fit:cover;display:block}
.card .photo>svg{position:absolute;inset:0;width:100%;height:100%}
.card .photo.has-cadastre>img{display:none}
.card .pricebox{
  position:absolute;left:6px;top:6px;display:flex;flex-direction:column;gap:1px;
  padding:5px 8px;border-radius:9px;background:rgba(15,17,20,.78);color:#fff;
  box-shadow:0 1px 5px rgba(0,0,0,.35);backdrop-filter:blur(2px);pointer-events:none;
}
.card .pricebox b{font-size:19px;line-height:1.05;font-weight:700;letter-spacing:-.02em}
.card .pricebox span{font-size:11px;line-height:1.2;font-weight:600;opacity:.95;white-space:nowrap}
.card .badge{position:absolute;right:6px;top:6px;left:auto;font-size:10px;padding:3px 7px;box-shadow:0 1px 4px rgba(0,0,0,.35)}
/* the Google-Maps-style "locate": bottom right of the photo, above the
   orthophoto credit so the attribution stays readable */
.card .locate{position:absolute;right:6px;bottom:22px;width:27px;height:27px;display:grid;place-items:center;border-radius:50%;border:1px solid var(--line);background:rgba(255,255,255,.94);color:#111;cursor:pointer;padding:0;box-shadow:0 1px 4px rgba(0,0,0,.35)}
.card .locate:hover{background:#fff;scale:1.08}
.card .locate svg{width:15px;height:15px;display:block}
.card .body{padding:7px 8px 9px}
.card h3{margin:0 0 2px;font-size:12px;line-height:1.25;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.card .sub{font-size:10px;color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.card .metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:4px;margin-top:6px;border-top:1px solid var(--line2);padding-top:5px}
.card .metrics div{line-height:1.15;min-width:0}
.card .metrics b{display:block;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.card .metrics span{font-size:9px;color:var(--dim);text-transform:uppercase;letter-spacing:.04em}
.card .foot{margin-top:5px;font-size:10px;color:var(--dim);display:flex;justify-content:space-between;gap:8px;white-space:nowrap}
.card .foot>span:first-child{min-width:0;overflow:hidden;text-overflow:ellipsis}
.card .foot>span:last-child{flex:0 0 auto}
.card .foot em{font-style:normal;color:var(--ink)}
.card .flag{display:inline-block;margin-top:4px;font-size:9px;padding:1px 5px;border:1px solid currentColor;border-radius:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}

.badge{font-size:9px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;padding:2px 6px;border-radius:99px;border:1px solid var(--line);background:var(--card);color:var(--ink)}
.badge.under{background:var(--under);border-color:var(--under);color:#fff}
.badge.over{background:var(--over);border-color:var(--over);color:#fff}
.badge.warn{background:var(--warn);border-color:var(--warn);color:#111}
.badge.ghost{background:var(--card)}
.ok{color:var(--under)} .bad{color:var(--over)} .mid{color:var(--warn)}
.empty{padding:40px 16px;text-align:center;color:var(--dim)}
.footnote{padding:0 14px 30px;font-size:10px;line-height:1.6;color:var(--dim)}
.footnote b{color:var(--ink);font-weight:500}

/* ---------- markers ---------- */
/* MapLibre owns the marker's transform (it writes the anchor + position inline),
   so the visual lives on an inner span: scaling the button itself would scale
   the translation and throw the pin across the map. */
.mk{display:inline-flex;width:max-content;font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer}
.mki{
  display:inline-flex;align-items:center;transform-origin:center;
  font-size:10px;font-weight:700;padding:3px 6px;border-radius:99px;border:1px solid rgba(0,0,0,.35);
  background:var(--card);color:var(--ink);white-space:nowrap;box-shadow:0 1px 4px rgba(0,0,0,.25);
}
.mk.under .mki{background:var(--under);color:#fff;border-color:var(--under)}
.mk.over .mki{background:var(--over);color:#fff;border-color:var(--over)}
.mk.warn .mki{background:var(--warn);color:#111;border-color:var(--warn)}
/* bound to a register parcel: a real white keyline, because the fill colour is
   already carrying the price verdict and cannot carry this too */
.mk.mv .mki{box-shadow:0 0 0 2px #fff,0 1px 4px rgba(0,0,0,.4)}
/* candidate only: the pin is close but the parcel is not confirmed */
.mk.un .mki{opacity:.62;border-style:dashed}
/* an aggregate mixes verdicts, so it carries none of them: neutral fill, visible   border in both themes, and the count is the whole label. border-box + a square
   min-width: one digit is a true circle, two digits grow into a pill. */
.mk.agg .mki{
  box-sizing:border-box;min-width:18px;height:18px;padding:0 4px;justify-content:center;
  border-radius:99px;background:var(--card);border-color:var(--dim);
}
.mk.agg .n{font-size:10px;line-height:1}
.maplegend{
  position:absolute;left:10px;bottom:10px;z-index:2;background:var(--card);border:1px solid var(--line);
  border-radius:6px;padding:5px 8px;font-size:9.5px;line-height:1.7;color:var(--dim);pointer-events:none;
  max-width:calc(100% - 200px);   /* the OSM attribution owns the bottom-right corner */
}
.maplegend b{color:var(--ink);font-weight:600}
/* the dot says the price, the aerial says what is on the land; 46 sits above the
   full-screen map (40) and below the modal (50) */
.hover-tile{position:fixed;z-index:46;width:260px;height:165px;pointer-events:none;overflow:hidden;
  border:1px solid var(--line);background:#14161a;box-shadow:var(--shadow)}
.hover-tile[hidden]{display:none}
.hover-tile svg{display:block;width:100%;height:100%}
.mk:hover,.mk.hover{z-index:5}
.mk:hover .mki,.mk.hover .mki{outline:2px solid var(--ink);outline-offset:1px;transform:scale(2)}

/* ---------- modal ---------- */
.mhero-wrap{position:relative;flex:0 0 220px;width:220px;height:220px;border:1px solid var(--line2);border-radius:10px;overflow:hidden;background:#14161a}
.mhero{width:100%;height:100%;background:#14161a;display:flex;align-items:center;justify-content:center}
.mhero svg,.mhero img{display:block;width:100%;height:100%;object-fit:contain}
.mhero-toggle{position:absolute;right:5px;bottom:5px;z-index:2;font-size:9px;padding:2px 5px}
.mhead-copy{flex:1;min-width:0;display:flex;flex-direction:column}
.mhero .hero-wait{margin:0;padding:120px 18px;text-align:center;font-size:11px;color:var(--dim)}
.modal-backdrop{position:fixed;inset:0;background:rgba(20,20,20,.45);display:none;z-index:50;cursor:zoom-out}
.modal-backdrop.on{display:block}
.modal{
  position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);width:min(920px,94vw);max-height:92vh;
  background:var(--bg);border:1px solid var(--line);border-radius:12px;box-shadow:6px 6px 0 rgba(0,0,0,.28);
  overflow-y:auto;display:none;z-index:51;
}
.modal.on{display:block}
.modal-inner{padding:0 0 30px}
.mhead{background:var(--bg);border-bottom:1px solid var(--line2);padding:12px 16px 0}
.mhead-row{display:flex;justify-content:space-between;align-items:flex-start;gap:16px}
.mhead h2{margin:0;font-size:16px;line-height:1.25}
.mhead .sub{color:var(--dim);font-size:11px;margin-top:3px}
.mhead-titleline{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}
.mhead-pricecost{margin-top:6px}
.mhead .ask{text-align:left;line-height:1.1}
.mhead-costs .secttl{margin:2px 0 4px}
.mhead-costs table.kv td{padding:2px 0;font-size:10px}
.mhead-costs .note{font-size:9px;line-height:1.45}
.mhead .ask b{font-size:22px}
.mhead .ask span{display:block;font-size:10px;color:var(--dim)}
.close-x{border:1px solid var(--line2);background:var(--card);color:var(--ink);border-radius:7px;width:26px;height:26px;line-height:1;font-size:14px}
.close-x:hover{background:var(--muted)}
.tabs{display:flex;gap:16px;margin-top:10px}
.tabs button{background:none;border:none;border-bottom:2px solid transparent;color:var(--dim);font-family:inherit;font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;padding:0 0 7px}
.tabs button.active{color:var(--ink);border-bottom-color:var(--ink)}
.tabs button:focus-visible{outline:2px solid var(--accent)}
.tab{padding:14px 16px 0}
.mgrid{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start}
@media (max-width:820px){.mgrid{grid-template-columns:1fr}}

table.kv{width:100%;border-collapse:collapse;font-size:11.5px}
table.kv td{padding:4px 0;border-bottom:1px dotted var(--line2);vertical-align:top}
table.kv td.k{color:var(--dim);white-space:nowrap;padding-right:10px}
table.kv td.v{text-align:right;font-weight:500}
table.kv tr.big td{border-bottom:1px solid var(--line2);padding:6px 0}
table.kv tr.big td.v{font-size:13px}
.note{font-size:10px;color:var(--dim);line-height:1.5;margin:8px 0 0}
.secttl{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--dim);margin:14px 0 6px;padding-bottom:3px;border-bottom:1px solid var(--line2)}
.imgtoggle{float:right;margin:-3px 0 0 8px;font:inherit;font-size:9px;letter-spacing:.04em;text-transform:none;color:var(--dim);background:none;border:1px solid var(--line2);border-radius:20px;padding:1px 8px;cursor:pointer}
.imgtoggle:hover{color:var(--fg);border-color:var(--dim)}
.metric-big{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:0 0 4px}
.metric-big div{border:1px solid var(--line2);border-radius:8px;padding:6px 7px;background:var(--card)}
.metric-big b{display:block;font-size:15px;line-height:1.1}
.metric-big span{font-size:9px;text-transform:uppercase;letter-spacing:.05em;color:var(--dim)}
.bar{height:9px;border-radius:99px;background:var(--muted);border:1px solid var(--line2);position:relative;overflow:hidden;margin:6px 0}
.bar i{position:absolute;left:0;top:0;bottom:0;background:var(--ink)}
.bar i.under{background:var(--under)} .bar i.over{background:var(--over)}
.agents{width:100%;border-collapse:collapse;font-size:11px;margin-top:4px}
.agents th{text-align:left;font-size:9px;text-transform:uppercase;letter-spacing:.06em;color:var(--dim);border-bottom:1px solid var(--line2);padding:4px 6px 4px 0;font-weight:500}
.agents td{padding:5px 6px 5px 0;border-bottom:1px dotted var(--line2);vertical-align:top}
.agents td.n{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
.cadmap{border:1px solid var(--line2);border-radius:8px;background:var(--card);padding:6px}
.cadmap svg{display:block;width:100%;height:auto}
.legend{display:flex;gap:12px;font-size:9px;color:var(--dim);margin-top:6px;text-transform:uppercase;letter-spacing:.05em}
.legend i{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:4px;vertical-align:-1px}
.comp{display:flex;justify-content:space-between;gap:8px;font-size:11px;padding:5px 0;border-bottom:1px dotted var(--line2);cursor:pointer}
.comp:hover{color:var(--accent)}
.mphoto{width:100%;border:1px solid var(--line2);border-radius:8px;display:block;aspect-ratio:16/9;object-fit:cover;margin-bottom:4px}
.comp .r{text-align:right;white-space:nowrap}
.comp .l,.comp .r{display:flex;flex-direction:column;gap:1px;min-width:0}
.comp .l .note,.comp .r .note{font-size:10px}
.costs select{width:100%}
.warnbox{border:1px solid var(--over);border-radius:8px;padding:7px 9px;font-size:11px;line-height:1.45;margin-top:8px;background:var(--card)}
.warnbox b{color:var(--over)}

@media (max-width:1080px){
  .map-fab{display:inline-block}
  .list{width:100%;border-right:none}
  .map{display:none}
  body.map-visible .map{display:block;position:fixed;inset:0;z-index:40;margin-top:0}
  body.map-visible .list{display:none}
  .mobile-only{display:inline-block}
  .hdr-mid{display:none}
  .tagline{display:none}
}
@media (max-width:640px){
  .cards{grid-template-columns:1fr}
  .histos{flex-direction:column;gap:2px}
}

/* ---------- source links and register tags ---------- */
.srctag{font-size:9px;text-transform:uppercase;letter-spacing:.06em;border:1px solid var(--line2);border-radius:99px;padding:1px 6px;margin-left:6px;color:var(--dim)}
.srctag.mid{color:var(--warn,#8a6d1f)}
.flag.ok{background:var(--muted);color:var(--ink)}
.mini-link{color:var(--ink);text-decoration:none;border-bottom:1px solid currentColor;font-size:10px;white-space:nowrap}
.mini-link:hover{color:var(--ok)}
.srclink{color:var(--ink);text-decoration:underline;text-underline-offset:2px}
.srclink:hover{color:var(--ok)}
.adlink{display:block;margin-top:7px;padding:4px 6px;font-size:10px;color:var(--ink);text-decoration:none;
  background:var(--muted);border:1px solid var(--line);border-radius:5px;text-align:center;letter-spacing:.02em}
.adlink:hover{background:var(--ink);color:var(--bg);border-color:var(--ink)}

/* The cadastre tab leads with identity, then one line per fact, so the register
   entry reads top-down instead of repeating itself in two tables. */
.idline{font-size:15px;font-weight:600;letter-spacing:.01em;margin-bottom:2px}
.idline b{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;font-weight:600}
.idline .note{margin-top:3px;font-size:10px}
.zoneline{font-size:11px;color:var(--fg);margin:4px 0 10px;padding-bottom:8px;border-bottom:1px solid var(--line2)}
.zoneline .note{font-size:10px}
.trust{font-size:9px;color:var(--dim);text-transform:uppercase;letter-spacing:.05em;margin-left:8px;cursor:help}
.trust b{color:var(--fg);font-weight:600}
details.regentry{margin-top:10px;font-size:11px}
details.regentry summary{cursor:pointer;color:var(--dim);font-size:9px;text-transform:uppercase;letter-spacing:.06em}
details.regentry[open] summary{margin-bottom:4px}

/* the register's own record: no frame, the labels and row rules are enough */
.regblock{margin:4px 0 10px}
.regblock .kv td{padding:2px 0}
.regblock .kv tr:first-child .k{padding-top:0}

@media (max-width:760px){
  .mhead-row{flex-wrap:wrap}
  .mhero-wrap{width:140px;height:140px;flex-basis:140px}
  .mhead-copy{flex:1 1 calc(100% - 156px)}
}
.agents tr.hit td{background:color-mix(in srgb, var(--ok) 12%, transparent);border-bottom-color:var(--ok)}
