:root{
  --bg:#e9eff2;--surface:#ffffff;--ink:#0f2a3d;--muted:#56707f;--rule:#cddae1;
  --accent:#0b6e8a;--accent-ink:#ffffff;--soft:#dcebf1;--est:#8a5300;--est-bg:#fbeed6;
  --bp:#10324a;--bp-line:#d6ecf5;--bp-dim:#8fd0e8;--brick:#c4633c;--soil:#1c4460;--conc:#9fb2bc;--water:#3a93bf;--void:#163d57;
}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){
  --bg:#0b1820;--surface:#11222d;--ink:#e2edf2;--muted:#8ea6b4;--rule:#22394a;
  --accent:#4fb3d3;--accent-ink:#06202b;--soft:#16303f;--est:#f0b861;--est-bg:#2b2211;--bp:#07192a;--void:#0e2c42;
}}
:root[data-theme="dark"]{
  --bg:#0b1820;--surface:#11222d;--ink:#e2edf2;--muted:#8ea6b4;--rule:#22394a;
  --accent:#4fb3d3;--accent-ink:#06202b;--soft:#16303f;--est:#f0b861;--est-bg:#2b2211;--bp:#07192a;--void:#0e2c42;
}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.5 "Public Sans",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;font-variant-numeric:tabular-nums}
button,input,select{font:inherit;color:inherit}
:focus-visible{outline:3px solid var(--accent);outline-offset:2px}
.wrap{max-width:1180px;margin:0 auto;padding:0 20px}
header.top{background:var(--surface);border-bottom:1px solid var(--rule)}
header.top .wrap{display:flex;justify-content:space-between;align-items:center;gap:16px;padding-top:14px;padding-bottom:14px;flex-wrap:wrap}
.brand{display:flex;align-items:center;gap:12px}
.brand svg{flex:none}
.brand b{display:block;font-size:17px;letter-spacing:-.01em}
.brand span{font-size:13px;color:var(--muted)}
.books{font-size:13px;color:var(--muted)}
nav.tabs{display:flex;gap:4px;overflow-x:auto;padding:18px 0 0}
nav.tabs button{border:1px solid transparent;border-bottom:none;background:none;padding:10px 16px;border-radius:8px 8px 0 0;cursor:pointer;color:var(--muted);font-weight:600;white-space:nowrap}
nav.tabs button[aria-selected="true"]{background:var(--surface);color:var(--ink);border-color:var(--rule)}
.sheet{background:var(--surface);border:1px solid var(--rule);border-radius:0 10px 10px 10px;padding:28px}
.head h1{margin:0 0 6px;font-size:clamp(26px,3.2vw,34px);line-height:1.15;letter-spacing:-.02em;font-weight:800}
.head p{margin:0;max-width:72ch;color:var(--muted)}
.head .refs{margin-top:8px;font-size:13px}
.grid{display:grid;grid-template-columns:290px 1fr;gap:28px;margin-top:24px;align-items:start}
@media (max-width:880px){.grid{grid-template-columns:1fr}.sheet{padding:18px;border-radius:0 10px 10px 10px}}
aside{position:sticky;top:16px;border:1px solid var(--rule);border-radius:10px;padding:18px}
@media (max-width:880px){aside{position:static}}
aside h2,.panel h2{font-size:15px;margin:0 0 14px;font-weight:700}
.fld{display:block;margin-bottom:14px}
.fld .lab{display:block;font-size:13px;font-weight:600;margin-bottom:5px}
.fld small{font-weight:400;color:var(--muted)}
.fld select,.fld input{width:100%;padding:9px 10px;border:1px solid var(--rule);border-radius:7px;background:var(--bg)}
.chk{display:flex;gap:8px;align-items:center;font-size:14px;margin-bottom:14px;cursor:pointer}
.chk input{width:18px;height:18px;accent-color:var(--accent)}
.derived{background:var(--soft);border-radius:8px;padding:12px 14px;margin:6px 0 0;font-size:13px}
.derived div{display:flex;justify-content:space-between;gap:10px;padding:2px 0}
.derived dd{margin:0;font-weight:700}
.derived dt{color:var(--muted)}
.blueprint{background:var(--bp);border-radius:10px;padding:16px 16px 10px;color:var(--bp-line)}
.blueprint .views{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
@media (max-width:640px){.blueprint .views{grid-template-columns:1fr}}
.blueprint figure{margin:0}
.blueprint figcaption{font-size:12px;font-weight:600;color:var(--bp-dim);margin-bottom:4px}
.blueprint svg{width:100%;height:auto;display:block}
.blueprint .stamp{display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;border-top:1px solid rgba(214,236,245,.2);margin-top:10px;padding-top:8px;font-size:12px;color:var(--bp-dim)}
svg .soil{fill:var(--soil)}
svg .void{fill:var(--void)}
svg .wall{fill:var(--brick);stroke:var(--bp-line);stroke-width:.6}
svg .conc{fill:var(--conc);stroke:var(--bp-line);stroke-width:.6}
svg .water{fill:var(--water);opacity:.55}
svg .ln{stroke:var(--bp-line);stroke-width:1;fill:none}
svg .dash{stroke:var(--bp-line);stroke-width:.8;fill:none;stroke-dasharray:3 2}
svg .pipe{stroke:var(--bp-dim);stroke-linecap:butt}
svg .valve{fill:var(--bp-line)}
svg .dim line{stroke:var(--bp-dim);stroke-width:.7}
svg text{fill:var(--bp-line);font:600 7.5px "Public Sans",sans-serif}
svg .dim text{fill:var(--bp-dim)}
.panel{margin-top:22px}
.tablebox{overflow-x:auto;border:1px solid var(--rule);border-radius:10px}
table{border-collapse:collapse;width:100%;min-width:720px}
thead th:nth-child(3){width:48%}
thead th{background:var(--ink);color:var(--surface);text-align:left;font-size:12px;font-weight:600;padding:10px 12px}
th.n,td.n{text-align:right;white-space:nowrap}
td{padding:11px 12px;border-top:1px solid var(--rule);vertical-align:top;font-size:14px}
td.code{font-weight:600;color:var(--accent);white-space:nowrap;font-size:13px}
td .nm{font-weight:700}
td .ds{color:var(--muted);font-size:13px;margin-top:2px;max-width:60ch}
td .bs{font-size:12px;margin-top:4px;color:var(--ink);opacity:.75}
tr.grp td{background:var(--soft);font-weight:700;font-size:13px;padding:8px 12px}
.tag{display:inline-block;font-size:11px;font-weight:700;color:var(--est);background:var(--est-bg);border-radius:4px;padding:1px 6px;margin-left:6px}
.totalbar{display:flex;justify-content:space-between;align-items:center;gap:18px;flex-wrap:wrap;margin-top:16px;padding:18px 20px;border-radius:10px;background:var(--soft)}
.totalbar .recap{font-size:13px;color:var(--muted);max-width:60ch}
.totalbar .sum{font-size:13px;color:var(--muted)}
.totalbar .big{font-size:clamp(28px,4vw,38px);font-weight:800;letter-spacing:-.02em;color:var(--ink);line-height:1.1}
.btn{border:none;background:var(--accent);color:var(--accent-ink);font-weight:700;padding:11px 18px;border-radius:8px;cursor:pointer}
.btn[hidden]{display:none}
.cols{display:grid;grid-template-columns:3fr 2fr;gap:18px;margin-top:22px}
@media (max-width:880px){.cols{grid-template-columns:1fr}}
.box{border:1px solid var(--rule);border-radius:10px;padding:16px 18px}
.box ul{margin:0;padding-left:18px}
.box li{margin:0 0 7px;font-size:14px;max-width:75ch}
.box.est{border-color:var(--est);background:var(--est-bg)}
footer{font-size:12px;color:var(--muted);padding:22px 0 40px}
footer p{max-width:90ch;margin:0 0 6px}
#toast{font-size:13px;color:var(--muted)}
nav.links a{color:var(--accent);font-weight:600;text-decoration:none;margin-left:16px;font-size:14px}
nav.links a:hover{text-decoration:underline}
.saverow{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:10px}
.saverow input{padding:10px;border:1px solid var(--rule);border-radius:7px;background:var(--bg);min-width:220px;flex:1}
.btn.ghost{background:transparent;color:var(--accent);border:1px solid var(--accent)}
.plain{width:100%;min-width:0}
.plain td input,.plain td select{padding:6px 8px;border:1px solid var(--rule);border-radius:6px;background:var(--bg);width:100%}
.msg{padding:10px 14px;border-radius:8px;background:var(--soft);margin-bottom:14px}
a{color:var(--accent)}
.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px}
.card{display:flex;flex-direction:column;gap:6px;border:1px solid var(--rule);border-radius:10px;padding:16px;text-decoration:none;color:var(--ink)}
.card:hover{border-color:var(--accent)}
.card b{font-size:17px}
.card span{font-size:14px;color:var(--muted)}
.card .meta{font-size:13px}
.card .amt{margin-top:auto;padding-top:8px;font-size:20px;font-weight:800;color:var(--ink)}
.card .amt small{font-size:12px;font-weight:500;color:var(--muted)}
.bars{display:flex;flex-direction:column;gap:6px}
.bar{display:grid;grid-template-columns:minmax(120px,38%) 1fr 52px;gap:10px;align-items:center;color:var(--bp-line);text-decoration:none;font-size:13px}
.bar:hover .bl{text-decoration:underline}
.bl{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bt{height:12px;background:rgba(214,236,245,.12);border-radius:3px;overflow:hidden}
.bt i{display:block;height:100%;background:var(--bp-dim)}
.bv{text-align:right;color:var(--bp-dim);font-weight:600}
table.boq{min-width:980px}
.qin{width:110px;padding:6px 8px;border:1px solid var(--rule);border-radius:6px;background:var(--bg);text-align:right}
.qin[readonly]{background:var(--soft);border-style:dashed}
.shape{display:inline-block;font-size:11px;font-weight:700;background:var(--soft);border-radius:4px;padding:1px 6px;margin-right:4px}
td.warn{color:var(--est);font-weight:700}
.mbtn{border:1px solid var(--accent);background:none;color:var(--accent);border-radius:6px;padding:5px 10px;cursor:pointer;font-weight:600;white-space:nowrap}
.mbtn.on{background:var(--accent);color:var(--accent-ink)}
.linkbtn{border:none;background:none;color:var(--accent);cursor:pointer;text-decoration:underline}
dialog{border:1px solid var(--rule);border-radius:12px;background:var(--surface);color:var(--ink);width:min(760px,96vw);padding:20px}
dialog::backdrop{background:rgba(6,20,30,.55)}
dialog h2{margin:0 0 4px}
.err{color:#c0392b;font-weight:600;min-height:1.2em;margin:6px 0}
svg .dimln{stroke:var(--bp-dim);stroke-width:.8}
.grid>section{min-width:0}
table.boq th:nth-child(2){width:34%}
#msketch{display:block;width:100%;height:auto;max-height:180px}
dialog table.plain{min-width:560px}
#mbody input,#mbody select{min-width:84px}
