:root,[data-theme="light"]{
  --bg:#f7f6f2;--surface:#fdfdfb;--surface-2:#f3f0ec;
  --divider:#dcd9d5;--border:#d4d1ca;
  --text:#28251d;--text-muted:#7a7974;--text-faint:#bab9b4;
  --primary:#01696f;--primary-hover:#0c4e54;--primary-soft:#cedcd8;
  --bund:#a13544;--bund-bg:#f5e8ea;
  --kanton:#006494;--kanton-bg:#e0eef5;
  --gemeinde:#437a22;--gemeinde-bg:#e5eee0;
  --mark-bg:#f5eedb;--mark-text:#6b4e00;
  --danger:#b23b3b;
  --shadow-sm:0 1px 2px rgba(40,37,29,.06);
  --shadow-md:0 4px 12px rgba(40,37,29,.08);
}
[data-theme="dark"]{
  --bg:#171614;--surface:#1c1b19;--surface-2:#22211f;
  --divider:#2c2b29;--border:#393836;
  --text:#cdccca;--text-muted:#8d8c8a;--text-faint:#5a5957;
  --primary:#4f98a3;--primary-hover:#6fb2bc;--primary-soft:#25393b;
  --bund:#dd6974;--bund-bg:#2d1e1f;
  --kanton:#5591c7;--kanton-bg:#1a2535;
  --gemeinde:#6daa45;--gemeinde-bg:#1c2d17;
  --mark-bg:#3a3220;--mark-text:#e8c15a;
  --danger:#e08585;
  --shadow-sm:0 1px 2px rgba(0,0,0,.3);
  --shadow-md:0 4px 12px rgba(0,0,0,.4);
}
*{box-sizing:border-box}
html,body{margin:0;padding:0;height:100%}
body{background:var(--bg);color:var(--text);font-family:system-ui,-apple-system,'Segoe UI',sans-serif;font-size:14px;line-height:1.5}
#root{height:100vh;display:flex;flex-direction:column}
mark{background:var(--mark-bg);color:var(--mark-text);border-radius:2px;padding:0 1px}
.mono{font-family:ui-monospace,'SF Mono',Menlo,Consolas,monospace}
a{color:var(--primary)}

/* ---- portal top bar (canton switcher / user) ------------------------------ */
.portal-bar{display:flex;align-items:center;gap:.9rem;padding:.6rem 1.1rem;
  border-bottom:1px solid var(--divider);background:var(--surface);flex-wrap:wrap}
.brand{display:flex;align-items:center;gap:.55rem;font-weight:700;letter-spacing:-.01em}
.brand .logo{width:1.5rem;height:1.5rem;flex-shrink:0}
.brand .brand-sub{font-weight:400;color:var(--text-muted);font-size:.72rem;margin-left:.15rem}
.portal-bar .spacer{flex:1}
.canton-picker{display:flex;align-items:center;gap:.45rem}
.canton-picker label{font-size:.72rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em}
select.canton-select{font:inherit;font-size:.85rem;padding:.35rem 1.8rem .35rem .6rem;border:1px solid var(--border);
  border-radius:.5rem;background:var(--surface) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6'><path d='M0 0l5 6 5-6z' fill='%23888'/></svg>") no-repeat right .6rem center;
  color:var(--text);appearance:none;cursor:pointer;max-width:16rem}
select.canton-select:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 2px var(--primary-soft)}
.user-menu{display:flex;align-items:center;gap:.6rem;font-size:.78rem;color:var(--text-muted)}
.user-menu .who{white-space:nowrap}
.mode-toggle{display:inline-flex;border:1px solid var(--border);border-radius:.5rem;overflow:hidden;background:var(--surface)}
.mode-toggle .seg{font:inherit;font-size:.78rem;padding:.35rem .8rem;border:none;background:transparent;color:var(--text-muted);cursor:pointer}
.mode-toggle .seg+.seg{border-left:1px solid var(--border)}
.mode-toggle .seg:hover{color:var(--text);background:var(--surface-2)}
.mode-toggle .seg.active{background:var(--primary);color:#fff}

/* ---- per-canton view header ----------------------------------------------- */
.app{display:flex;flex-direction:column;flex:1;min-height:0}
.app-header{padding:.85rem 1.25rem .7rem;border-bottom:1px solid var(--divider);background:var(--surface)}
.app-header h1{margin:0;font-size:1.05rem;font-weight:600;letter-spacing:-.01em}
.app-header .sub{margin-top:2px;font-size:.75rem;color:var(--text-muted)}
.controls{display:flex;gap:.5rem;align-items:center;margin-top:.75rem;flex-wrap:wrap}
.search{flex:1 1 240px;max-width:420px;position:relative}
.search input{width:100%;padding:.45rem .75rem .45rem 2rem;border:1px solid var(--border);border-radius:.5rem;background:var(--bg);color:var(--text);font:inherit;font-size:.85rem;outline:none}
.search input:focus{border-color:var(--primary);box-shadow:0 0 0 2px var(--primary-soft)}
.search .icon{position:absolute;left:.6rem;top:50%;transform:translateY(-50%);color:var(--text-faint);pointer-events:none;font-size:.8rem}
.btn{padding:.4rem .7rem;border:1px solid var(--border);border-radius:.5rem;background:var(--surface);color:var(--text);font:inherit;font-size:.8rem;cursor:pointer}
.btn:hover{background:var(--surface-2);border-color:var(--text-faint)}
.btn.primary{background:var(--primary);border-color:var(--primary);color:#fff}
.btn.primary:hover{background:var(--primary-hover);border-color:var(--primary-hover)}
.stats{display:flex;gap:.5rem;margin-top:.75rem;flex-wrap:wrap}
.tile{background:var(--surface-2);border:1px solid var(--divider);border-radius:.5rem;padding:.35rem .7rem;display:flex;flex-direction:column;min-width:5.2rem}
.tile .v{font-size:1.05rem;font-weight:600;font-variant-numeric:tabular-nums}
.tile .k{font-size:.65rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em}

.layout{display:flex;flex:1;min-height:0}
.tree-pane{flex:1;overflow-y:auto;padding:.75rem .75rem 3rem}
.detail-pane{width:360px;flex-shrink:0;border-left:1px solid var(--divider);background:var(--surface);overflow-y:auto;padding:1rem 1.15rem 2rem}
@media(max-width:860px){.layout{flex-direction:column}.detail-pane{width:auto;border-left:none;border-top:1px solid var(--divider);max-height:40vh}}

.row{display:flex;align-items:center;gap:.5rem;padding:.28rem .5rem;border-radius:.45rem;cursor:pointer;user-select:none}
.row:hover{background:var(--surface-2)}
.row.selected{background:var(--primary-soft)}
.chevron{width:1.15rem;height:1.15rem;flex-shrink:0;display:flex;align-items:center;justify-content:center;border:none;background:none;color:var(--text-muted);cursor:pointer;padding:0;border-radius:.25rem;font-size:.7rem;transition:transform .12s}
.chevron:hover{color:var(--text)}
.chevron.open{transform:rotate(90deg)}
.chevron.spacer{visibility:hidden}
.code-chip{font-family:ui-monospace,'SF Mono',Menlo,Consolas,monospace;font-size:.72rem;font-weight:600;background:var(--surface-2);border:1px solid var(--divider);border-radius:.3rem;padding:.05rem .4rem;white-space:nowrap;color:var(--text-muted)}
.row .name{font-size:.87rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.badge{font-size:.62rem;font-weight:600;padding:.08rem .42rem;border-radius:99px;white-space:nowrap;letter-spacing:.02em}
.badge.lvl-root{background:var(--surface-2);color:var(--text-muted);border:1px solid var(--divider)}
.badge.kanton{background:var(--primary-soft);color:var(--primary);font-family:ui-monospace,'SF Mono',Menlo,Consolas,monospace}
.code-chip.codemap{color:var(--text);background:var(--bg)}
details.doc{margin-top:1.1rem;border:1px solid var(--divider);border-radius:.5rem;background:var(--surface-2);font-size:.76rem}
details.doc summary{cursor:pointer;padding:.5rem .7rem;font-weight:600;color:var(--text)}
details.doc .doc-body{padding:0 .7rem .7rem}
details.doc dl{display:grid;grid-template-columns:minmax(5.5rem,auto) 1fr;gap:.25rem .6rem;margin:.3rem 0}
details.doc dt{color:var(--text-muted)}
details.doc dd{margin:0;min-width:0;overflow-wrap:anywhere}
details.doc .feld{border-top:1px solid var(--divider);padding:.35rem 0}
details.doc .feld .fname{font-family:ui-monospace,'SF Mono',Menlo,Consolas,monospace;font-weight:600}
details.doc .feld .flabel{color:var(--text-muted)}
.badge.lvl-bund{background:var(--bund-bg);color:var(--bund)}
.badge.lvl-kanton{background:var(--kanton-bg);color:var(--kanton)}
.badge.lvl-gemeinde{background:var(--gemeinde-bg);color:var(--gemeinde)}
.count{font-size:.7rem;color:var(--text-faint);font-variant-numeric:tabular-nums;margin-left:auto;padding-right:.25rem}
.swatch{width:.95rem;height:.95rem;border-radius:.25rem;border:1px solid rgba(0,0,0,.18);flex-shrink:0}
[data-theme="dark"] .swatch{border-color:rgba(255,255,255,.22)}
.swatch.none{background:transparent;border:1px dashed var(--divider)}

.detail-pane h2{margin:.25rem 0 .1rem;font-size:1rem;font-weight:600}
.crumbs{font-size:.7rem;color:var(--text-muted);line-height:1.6}
.crumbs .sep{color:var(--text-faint);padding:0 .25rem}
.detail-pane .desc{font-size:.84rem;margin-top:.6rem;color:var(--text)}
.kv{margin-top:.9rem;display:grid;grid-template-columns:auto 1fr;gap:.3rem .8rem;font-size:.78rem}
.kv dt{color:var(--text-muted)}
.kv dd{margin:0}
.swatch-lg{display:inline-block;width:2.4rem;height:1.3rem;border-radius:.3rem;border:1px solid rgba(0,0,0,.18);vertical-align:middle;margin-right:.5rem}
.hint{color:var(--text-muted);font-size:.8rem;margin-top:.75rem}
.note{font-size:.68rem;color:var(--text-faint);margin-top:1.25rem;border-top:1px solid var(--divider);padding-top:.6rem}
.doc-list{margin:.4rem 0 0;padding:0;list-style:none}
.doc-list li{padding:.3rem 0;border-bottom:1px solid var(--divider);font-size:.78rem;line-height:1.45}
.doc-list a{color:var(--primary);text-decoration:none}
.doc-list a:hover{text-decoration:underline}
.badge.doctype{background:var(--surface-2);color:var(--text-muted);border:1px solid var(--divider);font-size:.6rem}
.child-list{margin:.4rem 0 0;padding:0;list-style:none}
.child-list li{padding:.25rem 0;border-bottom:1px solid var(--divider);font-size:.8rem;display:flex;gap:.5rem;align-items:center;cursor:pointer}
.child-list li:hover .name{color:var(--primary)}

details.map-block{border-bottom:1px solid var(--divider);background:var(--surface)}
details.map-block summary{cursor:pointer;padding:.5rem 1.25rem;font-size:.8rem;font-weight:600;color:var(--text)}
details.map-block summary .map-count{font-weight:400;color:var(--text-muted);margin-left:.5rem}
.map-wrap{padding:0 1.25rem .35rem}
.map-svg{display:block;width:100%;height:320px}
.map-svg path{fill:var(--primary-soft);stroke:var(--surface);stroke-width:1;cursor:pointer}
.map-svg path:hover{fill:var(--primary-hover)}
.map-svg path.active{fill:var(--primary)}
.map-hint{font-size:.72rem;color:var(--text-muted);padding:0 1.25rem .5rem;min-height:1.1rem}
.gem-group{margin-top:.9rem}
.gem-group .ghead{display:flex;gap:.5rem;align-items:center;cursor:pointer;font-size:.8rem;font-weight:600;padding:.25rem 0;border-bottom:2px solid var(--divider)}
.gem-group .ghead:hover .name{color:var(--primary)}
.gem-group .gcount{margin-left:auto;font-weight:400;color:var(--text-faint);font-size:.7rem}

/* ---- loading / error / empty ---------------------------------------------- */
.center-note{flex:1;display:flex;align-items:center;justify-content:center;color:var(--text-muted);padding:2rem;text-align:center}
.center-note .box{max-width:30rem}
.spinner{width:1.6rem;height:1.6rem;border:2px solid var(--divider);border-top-color:var(--primary);border-radius:50%;
  animation:spin .8s linear infinite;margin:0 auto .8rem}
@keyframes spin{to{transform:rotate(360deg)}}
.err{color:var(--danger)}

/* ---- login ---------------------------------------------------------------- */
.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:1.5rem}
.login-card{width:100%;max-width:22rem;background:var(--surface);border:1px solid var(--divider);
  border-radius:.9rem;box-shadow:var(--shadow-md);padding:1.6rem 1.5rem}
.login-card .brand{justify-content:center;margin-bottom:.25rem;font-size:1.1rem}
.login-card .tagline{text-align:center;color:var(--text-muted);font-size:.78rem;margin-bottom:1.2rem}
.login-card label{display:block;font-size:.74rem;color:var(--text-muted);margin:.7rem 0 .25rem;text-transform:uppercase;letter-spacing:.04em}
.login-card input{width:100%;padding:.55rem .7rem;border:1px solid var(--border);border-radius:.55rem;
  background:var(--bg);color:var(--text);font:inherit;font-size:.9rem;outline:none}
.login-card input:focus{border-color:var(--primary);box-shadow:0 0 0 2px var(--primary-soft)}
.login-card button{width:100%;margin-top:1.1rem;padding:.6rem;font-size:.9rem;font-weight:600}
.login-error{margin-top:.9rem;background:var(--bund-bg);color:var(--bund);border:1px solid var(--bund);
  border-radius:.5rem;padding:.5rem .7rem;font-size:.78rem;text-align:center}
.login-foot{text-align:center;color:var(--text-faint);font-size:.68rem;margin-top:1.2rem}
