/* 混凝土强度检测与判定 —— 检测报告纸的视觉语言
   材料：纸（冷灰）、墨、氧化铁红；结构：表格线与双线报告头，不用圆角卡片 */
:root{
  --paper:#e5e4df;
  --sheet:#f3f2ee;
  --sheet-2:#eceae4;
  --ink:#181a1a;
  --ink-2:#54585a;
  --ink-3:#74777a;
  --rule:#c6c4bb;
  --rule-soft:#dcdaD2;
  --iron:#9a3c22;
  --iron-wash:rgba(154,60,34,.14);
  --pass:#4c6a58;
  --warn:#8a6a2f;
  --fang:"仿宋","FangSong","华文仿宋",serif;
  --sans:"等线","Microsoft YaHei",system-ui,sans-serif;
  --num:"Bahnschrift","Cascadia Mono",Consolas,monospace;
}
*{box-sizing:border-box}
/* hidden 属性会被显式 display（.sect/.cal-row/.msgs 都是 flex/grid）覆盖 → 统一兜住 */
[hidden]{display:none !important}
html,body{height:100%}
body{
  margin:0;background:var(--paper);color:var(--ink);
  font:13px/1.62 var(--sans);
  -webkit-font-smoothing:antialiased;
}
::selection{background:#f0d9cd}
.num{font-family:var(--num);font-variant-numeric:tabular-nums}

/* ---------- 骨架 ---------- */
.app{display:grid;grid-template-columns:186px minmax(0,1fr);min-height:100vh}
.rail{
  position:sticky;top:0;height:100vh;display:flex;flex-direction:column;
  background:var(--paper);border-right:1px solid var(--rule);
}
.rail .nav-h{
  padding:26px 20px 10px;font-family:var(--fang);font-size:13px;
  letter-spacing:.24em;color:var(--ink-3);
}
nav{padding:0 0 0 0;display:flex;flex-direction:column}
nav button{
  display:flex;align-items:baseline;gap:9px;width:100%;text-align:left;
  background:none;border:0;border-left:2px solid transparent;color:var(--ink-2);
  padding:9px 18px;font:inherit;font-size:12.5px;cursor:pointer;line-height:1.5;
}
nav button i{font-style:normal;font-family:var(--fang);font-size:12px;color:var(--ink-3)}
nav button:hover{color:var(--ink);background:var(--sheet-2)}
nav button[aria-selected="true"]{
  color:var(--ink);border-left-color:var(--iron);background:var(--sheet);
  font-weight:600;
}
nav button[aria-selected="true"] i{color:var(--iron)}
.rail-foot{
  margin-top:auto;padding:14px 18px 20px;border-top:1px solid var(--rule-soft);
  font-size:10.5px;color:var(--ink-3);line-height:1.7;word-break:break-all;
}
.rail-foot b{display:block;color:var(--ink-2);font-weight:400;font-size:11px;margin-bottom:2px}
.rail-foot .dot{display:inline-block;width:5px;height:5px;border-radius:50%;
  background:var(--ink-3);margin-right:5px;vertical-align:1px}
.rail-foot .dot.ok{background:var(--pass)}
.rail-foot .dot.bad{background:var(--iron)}

main{padding:0 0 80px;min-width:0;background:var(--sheet);
  border-left:1px solid rgba(0,0,0,.04);min-height:100vh}
.view{max-width:1120px;padding:0 40px}
.view[hidden]{display:none}

/* ---------- 报告头 ---------- */
.report-head{
  padding:30px 0 0;
  border-top:3px solid var(--ink);
  margin-top:0;
}
.report-head .rh-top{display:flex;align-items:flex-end;gap:20px;flex-wrap:wrap;
  padding-bottom:14px;border-bottom:1px solid var(--rule)}
.rh-title{margin:0}
.rh-title h1{margin:0;font-family:var(--fang);font-weight:400;font-size:26px;
  letter-spacing:.06em;line-height:1.2}
.rh-title p{margin:6px 0 0;font-size:11px;color:var(--ink-3);letter-spacing:.05em}
.rh-no{margin-left:auto;text-align:right;font-size:10.5px;color:var(--ink-3);
  line-height:1.9;letter-spacing:.04em}
.rh-no b{display:block;font-family:var(--num);color:var(--ink-2);font-weight:500;
  font-size:12px;letter-spacing:.02em}
.report-head .rh-rule{height:1px;background:var(--ink);opacity:.35;
  margin:2px 0 0;transform:translateY(-1px)}

/* ---------- 通用 ---------- */
.sect{
  display:flex;align-items:baseline;gap:6px;margin:34px 0 12px;
  font-family:var(--fang);font-size:14px;letter-spacing:.14em;color:var(--ink-2);
}
.sect .no{font-size:12px;color:var(--iron);letter-spacing:0;margin-right:2px}
.sect::after{content:"";flex:1;height:1px;background:var(--rule-soft);
  transform:translateY(-4px)}
.stack{display:grid;gap:6px}
.muted{color:var(--ink-3)}
a.ghost,button.ghost{
  background:none;border:1px solid var(--rule);color:var(--ink-2);border-radius:0;
  padding:4px 9px;font:inherit;font-size:11px;cursor:pointer;letter-spacing:.04em;
}
a.ghost:hover,button.ghost:hover{border-color:var(--iron);color:var(--iron)}
button.ghost:active{transform:translateY(1px)}
:focus-visible{outline:1px solid var(--iron);outline-offset:2px}

/* ---------- 顶部提示 ---------- */
.banner{
  display:flex;gap:14px;align-items:flex-start;padding:12px 40px;
  background:#f6e7df;border-bottom:1px solid #d9b7a6;color:#5e2f1e;font-size:12px;
  line-height:1.75;
}
.banner[hidden]{display:none}
.banner code{font-family:var(--num);background:#ead3c7;padding:1px 5px;color:#4a2417}
.banner b{color:#3d1d12;font-weight:600}
.banner a{color:#7d3a24}
.banner .fix{flex:1}

/* ---------- 工作台 ---------- */
.workbench{display:grid;grid-template-columns:minmax(300px,336px) minmax(0,1fr);
  gap:44px;margin-top:34px}

/* 配合比：表格式填单 */
.form-tbl{width:100%;border-collapse:collapse}
.form-tbl caption{caption-side:top;text-align:left;font-size:10.5px;color:var(--ink-3);
  padding-bottom:6px;letter-spacing:.06em}
.form-tbl td{border-bottom:1px solid var(--rule-soft);padding:5px 0;vertical-align:middle}
.form-tbl .lbl{width:46%;font-size:12.5px;color:var(--ink-2);padding-right:8px}
.form-tbl input{
  width:100%;border:0;background:transparent;padding:2px 6px 2px 0;
  text-align:right;font-family:var(--num);font-variant-numeric:tabular-nums;
  font-size:16px;color:var(--ink);
}
.form-tbl input:hover{background:rgba(255,255,255,.5)}
.form-tbl input:focus{outline:none;background:#fff;box-shadow:inset 0 -1px 0 var(--iron)}
.form-tbl input.bad{box-shadow:inset 0 -1px 0 var(--iron)}
.form-tbl .unit{width:50px;text-align:right;font-size:10.5px;color:var(--ink-3);
  padding-left:6px;white-space:nowrap}
.form-tbl td label{display:inline-flex;align-items:center;gap:6px;cursor:pointer}
.form-tbl select{
  width:100%;border:0;background:transparent;text-align:right;font:inherit;
  font-size:12.5px;color:var(--ink);padding:2px 0;cursor:pointer;
}
.form-tbl select:focus{outline:none;background:#fff}

/* 示例：正文里的引用式链接 */
.refs{display:flex;flex-wrap:wrap;gap:4px 14px;padding-top:8px}
.refs button{
  background:none;border:0;padding:0;font:inherit;font-size:11.5px;color:var(--ink-2);
  cursor:pointer;border-bottom:1px solid var(--rule);line-height:1.5;
}
.refs button:hover{color:var(--iron);border-bottom-color:var(--iron)}
.refs button[aria-pressed="true"]{color:var(--iron);border-bottom-color:var(--iron)}

/* 校准：脚注式开关 */
.cal-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-size:11.5px;
  color:var(--ink-2);padding-top:6px}
.cal-row label{display:inline-flex;align-items:center;gap:5px;cursor:pointer}
.cal-row select,.cal-row input[type=number]{
  border:0;border-bottom:1px solid var(--rule);background:transparent;color:var(--ink);
  font-family:var(--num);font-size:12px;padding:1px 2px;
}
.cal-row input[type=number]{width:58px;text-align:right}
.cal-row select:focus,.cal-row input[type=number]:focus{outline:none;border-bottom-color:var(--iron)}
input[type=checkbox]{accent-color:var(--iron);width:13px;height:13px}
input[type=number]::-webkit-outer-spin-button,
input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
input[type=number]{appearance:textfield;-moz-appearance:textfield}

/* ---------- 检测结论 ---------- */
.rep-head{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;
  padding-bottom:8px;border-bottom:1px solid var(--ink);opacity:.9}
.rep-head .meta{font-size:10.5px;color:var(--ink-3);letter-spacing:.04em;
  font-family:var(--num)}
.rep-head .meta b{color:var(--ink-2);font-weight:500}
.rep-head .tags{display:flex;gap:8px;flex-wrap:wrap;margin-left:auto}
.tag{
  display:inline-block;font-size:10.5px;letter-spacing:.06em;padding:1px 6px;
  border:1px solid var(--rule);color:var(--ink-2);line-height:1.6;white-space:nowrap;
}
.tag.ok{color:var(--pass);border-color:#a9b8ac}
.tag.bad{color:var(--iron);border-color:#cf9f8d}
.tag.warn{color:var(--warn);border-color:#c3b18c}
.tag.acc{color:var(--iron);border-color:var(--iron)}

/* 读数：试块标记 */
.reading{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:22px;
  align-items:start;padding:20px 0 4px}
.reading .v{font-family:var(--num);font-variant-numeric:tabular-nums;font-size:62px;
  line-height:.92;letter-spacing:-.015em;font-weight:500}
.reading .v.void{color:var(--ink-3);font-family:var(--sans);font-size:30px;line-height:1.7}
.reading .u{font-size:11.5px;color:var(--ink-3);letter-spacing:.06em;
  padding-top:8px;display:block}
.reading .sub{margin-top:8px;font-size:11.5px;color:var(--ink-2);line-height:1.7}
/* 外推估计：域外时出现，用双线把它与检测结论隔开，避免被当成正式读数 */
.extrap{margin-top:30px;padding:16px 0 18px;border-top:1px solid var(--rule);
  border-bottom:1px solid var(--rule);background:linear-gradient(180deg,rgba(154,60,34,.035),transparent 60%)}
.extrap .ex-head{display:flex;align-items:baseline;gap:12px}
.extrap .ex-title{font-family:var(--fang);font-size:14px;letter-spacing:.14em;color:var(--ink)}
.extrap .ex-tag{font-size:10.5px;letter-spacing:.08em;color:var(--iron)}
.extrap .ex-v{font-family:var(--num);font-variant-numeric:tabular-nums;
  font-size:34px;line-height:1.05;margin-top:10px;color:var(--ink-2)}
.extrap .ex-v .u{font-family:var(--sans);font-size:10.5px;color:var(--ink-3);
  letter-spacing:.06em;margin-left:7px}
.extrap .ex-note{margin-top:8px;font-size:11.5px;color:var(--ink-2);line-height:1.72;max-width:640px}
.stamp{
  min-width:112px;border:2px double var(--iron);color:var(--iron);
  padding:8px 12px 7px;text-align:center;transform:rotate(-2.4deg);
  font-family:var(--fang);letter-spacing:.14em;line-height:1.45;
  background:rgba(154,60,34,.03);
}
.stamp .g{font-family:var(--num);font-size:22px;letter-spacing:.04em;
  display:block;line-height:1.1}
.stamp .s{font-size:10px;color:var(--iron);opacity:.85;display:block;margin-top:3px}
.stamp.cn .g{font-family:var(--fang);font-size:21px;letter-spacing:.16em}
.stamp.empty{border-color:var(--rule);color:var(--ink-3);background:none;transform:none}
.stamp.empty .s{color:var(--ink-3)}

/* 试验机刻度轴 */
.axis{position:relative;height:58px;margin:24px 0 2px}
.axis .baseline{position:absolute;left:0;right:0;top:30px;height:1px;background:var(--ink-2);
  opacity:.55}
.axis .band{position:absolute;top:26px;height:9px;background:var(--iron-wash);
  border-left:1px solid var(--iron);border-right:1px solid var(--iron);
  transition:left .26s cubic-bezier(.2,.7,.3,1), width .26s cubic-bezier(.2,.7,.3,1)}
.axis .needle{position:absolute;top:19px;width:1px;height:23px;background:var(--iron)}
.axis .grade{position:absolute;top:12px;height:36px;border-left:1px dashed var(--ink-2)}
.axis .grade span{position:absolute;top:-11px;left:4px;font-size:10px;color:var(--ink-2);
  white-space:nowrap;letter-spacing:.04em}
.axis .tick{position:absolute;top:30px;width:1px;height:5px;background:var(--rule)}
.axis .tick.major{height:8px;background:var(--ink-3)}
.scale{display:flex;justify-content:space-between;font-family:var(--num);
  font-variant-numeric:tabular-nums;font-size:10px;color:var(--ink-3);
  letter-spacing:.02em}
.scale span{flex:1}
.scale span:first-child{text-align:left}
.scale span:last-child{text-align:right}
.scale span:not(:first-child):not(:last-child){text-align:center}

/* 判定表 */
table.sheet{width:100%;border-collapse:collapse;margin-top:20px}
table.sheet caption{
  caption-side:top;text-align:left;font-size:10.5px;color:var(--ink-3);
  padding:0 0 6px;letter-spacing:.06em;
}
table.sheet th{
  text-align:left;font-weight:400;font-size:10.5px;color:var(--ink-3);
  letter-spacing:.08em;padding:5px 10px;border:1px solid var(--rule);
  background:var(--sheet-2);
}
table.sheet td{
  padding:8px 10px;border:1px solid var(--rule-soft);vertical-align:top;
  font-size:12.5px;
}
table.sheet td.k{color:var(--ink-2);white-space:nowrap}
table.sheet td.v{font-family:var(--num);font-variant-numeric:tabular-nums;font-size:14px}
table.sheet td.v.ok{color:var(--pass)}
table.sheet td.v.bad{color:var(--iron)}
table.sheet td.v.warn{color:var(--warn)}
table.sheet td.note{font-size:11px;color:var(--ink-3);line-height:1.65}

/* 派生参数 */
.derived{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:0;
  border-top:1px solid var(--rule);border-bottom:1px solid var(--rule-soft)}
.dv{padding:12px 14px 11px 0}
.dv + .dv{padding-left:14px;border-left:1px solid var(--rule-soft)}
.dv .k{font-size:10.5px;color:var(--ink-3);letter-spacing:.05em}
.dv .v{font-family:var(--num);font-variant-numeric:tabular-nums;font-size:19px;
  margin-top:4px;letter-spacing:-.01em}
.dv .u{font-size:10px;color:var(--ink-3);margin-left:4px;font-family:var(--sans);
  letter-spacing:.02em}

/* 分布位置 */
.spectrum{margin-top:2px}
.sp-row{display:grid;grid-template-columns:78px 84px minmax(0,1fr) 122px;
  align-items:center;gap:10px;padding:4px 0;border-bottom:1px solid var(--rule-soft);
  font-size:11.5px}
.sp-row:last-child{border-bottom:0}
.sp-row .k{color:var(--ink-2)}
.sp-row .v{font-family:var(--num);font-variant-numeric:tabular-nums;text-align:right}
.sp-track{position:relative;height:12px}
.sp-track::before{content:"";position:absolute;left:0;right:0;top:5px;height:1px;
  background:var(--rule)}
.sp-fill{position:absolute;left:0;top:5px;height:1px;background:var(--ink-3)}
.sp-mark{position:absolute;top:2px;width:1px;height:7px;background:var(--iron)}
.sp-row .r{font-family:var(--num);font-size:10px;color:var(--ink-3);text-align:right;
  font-variant-numeric:tabular-nums}
.sp-row.out .v,.sp-row.out .r{color:var(--iron)}
.sp-row.out .sp-mark{background:var(--iron);width:2px}

/* 注脚 */
.msgs{list-style:none;margin:16px 0 0;padding:0;counter-reset:note;
  display:grid;gap:3px}.msgs li{
  counter-increment:note;font-size:11px;line-height:1.75;color:var(--ink-3);
  padding-left:26px;position:relative;
}
.msgs li::before{
  content:"注" counter(note);position:absolute;left:0;top:0;
  font-family:var(--fang);font-size:10px;color:var(--ink-3);letter-spacing:.02em;
}
.msgs li.w{color:var(--iron)}
.msgs li.w::before{color:var(--iron)}
.msgs:empty{display:none}

/* ---------- 表格视图 ---------- */
.tbl{width:100%;border-collapse:collapse;font-size:12px}
.tbl th{text-align:left;font-weight:400;color:var(--ink-3);font-size:10.5px;
  letter-spacing:.08em;padding:6px 10px 6px 0;border-bottom:1px solid var(--ink);
  background:none}
.tbl td{padding:8px 10px 8px 0;border-bottom:1px solid var(--rule-soft);
  vertical-align:top}
.tbl td.num{font-family:var(--num);font-variant-numeric:tabular-nums;white-space:nowrap}
.tbl td{word-break:break-word}
.tbl tr.sel td{background:var(--sheet-2)}
.tbl tr:last-child td{border-bottom:0}
.tbl .sm{font-size:10.5px;color:var(--ink-3)}
.tbl .ok{color:var(--pass)}
.tbl .bad{color:var(--iron)}
.tbl .warn{color:var(--warn)}
#srcTbl,#scenarioTbl{table-layout:fixed;width:100%}
#srcTbl th:nth-child(1),#srcTbl td:nth-child(1){width:38%}
#srcTbl th:nth-child(2),#srcTbl td:nth-child(2){width:36%}
#srcTbl th:nth-child(3),#srcTbl td:nth-child(3){width:8%}
#srcTbl th:nth-child(4),#srcTbl td:nth-child(4){width:8%}
#srcTbl th:nth-child(5),#srcTbl td:nth-child(5){width:10%}
#scenarioTbl th:nth-child(1),#scenarioTbl td:nth-child(1){width:20%}
#scenarioTbl th:nth-child(2),#scenarioTbl td:nth-child(2){width:10%}
#scenarioTbl th:nth-child(3),#scenarioTbl td:nth-child(3){width:24%}
#scenarioTbl th:nth-child(4),#scenarioTbl td:nth-child(4){width:10%}
#scenarioTbl th:nth-child(5),#scenarioTbl td:nth-child(5){width:14%}
#scenarioTbl th:nth-child(6),#scenarioTbl td:nth-child(6){width:22%}

/* ---------- 参数条（模型视图） ---------- */
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));
  border-top:1px solid var(--rule);border-bottom:1px solid var(--rule-soft)}
.card{padding:11px 14px 12px 0}
.card + .card{padding-left:14px;border-left:1px solid var(--rule-soft)}
.card .k{font-size:10.5px;color:var(--ink-3);letter-spacing:.05em}
.card .v{font-family:var(--num);font-variant-numeric:tabular-nums;font-size:17px;
  margin-top:4px;letter-spacing:-.01em}
.card .v.ok{color:var(--pass)}
.card .v.bad{color:var(--iron)}
.card .n{font-size:10px;color:var(--ink-3);margin-top:2px;line-height:1.5}

/* 边界：编号注记 */
.notes{display:grid;gap:9px;margin-top:4px;counter-reset:bd}
.note-row{display:grid;grid-template-columns:56px minmax(0,1fr);gap:14px;
  font-size:12px;line-height:1.8;color:var(--ink-2);
  padding-bottom:9px;border-bottom:1px solid var(--rule-soft)}
.note-row:last-child{border-bottom:0}
.note-row b{font-family:var(--fang);font-weight:400;color:var(--ink-3);font-size:11px;
  letter-spacing:.08em;padding-top:2px}
.bd-tag{margin-right:8px;font-size:10.5px;color:var(--ink-3);letter-spacing:.05em}

/* ---------- 龄期预报 ---------- */
.age{margin-top:30px}
.age-head{display:flex;align-items:baseline;gap:10px;padding-bottom:8px;
  border-bottom:1px solid var(--rule)}
.age-title{font-family:var(--fang);font-size:14px;letter-spacing:.14em;color:var(--ink-2)}
.age-head .meta{margin-left:auto;font-size:10.5px;color:var(--ink-3);letter-spacing:.04em}
.age-chart{margin:12px 0 2px}
.age-chart svg{display:block;width:100%;height:auto;overflow:visible}
.age-grid{stroke:var(--rule-soft);stroke-width:1}
.age-axis{stroke:var(--ink-3);stroke-width:1}
.age-grade{stroke:var(--ink-2);stroke-width:1;stroke-dasharray:4 3}
.age-line{fill:none;stroke:var(--ink);stroke-width:1.6;stroke-linejoin:round}
.age-dot{fill:var(--sheet);stroke:var(--ink);stroke-width:1.4}
.age-target{fill:var(--iron)}
.age-wisk{stroke:var(--iron);stroke-width:1.2}
.age-lbl{font-family:var(--num);font-size:9px;fill:var(--ink-3);
  paint-order:stroke;stroke:var(--sheet);stroke-width:3px;stroke-linejoin:round}
.age-lbl-strong{fill:var(--iron);font-size:10px}
#ageTbl{margin-top:12px}

/* ---------- 响应式 ---------- */
@media (max-width:1080px){
  .app{grid-template-columns:1fr}
  .rail{position:static;height:auto;flex-direction:row;align-items:stretch;
    border-right:0;border-bottom:1px solid var(--rule);overflow-x:auto;
    background:var(--paper)}
  .rail .nav-h{display:none}
  nav{flex-direction:row;padding:0}
  nav button{border-left:0;border-bottom:2px solid transparent;white-space:nowrap;
    padding:11px 14px}
  nav button[aria-selected="true"]{border-left:0;border-bottom-color:var(--iron);
    background:var(--sheet)}
  .rail-foot{display:none}
  .view{padding:0 16px}
  .report-head{padding-top:20px}
  .rh-title h1{font-size:21px}
  .rh-no{margin-left:0;text-align:left;width:100%}
  .workbench{grid-template-columns:1fr;gap:28px}
  .sect{margin-top:26px}
  .derived{grid-template-columns:1fr 1fr}
  .dv + .dv{border-left:0;padding-left:0}
  .sp-row{grid-template-columns:68px 70px minmax(0,1fr);gap:8px}
  .sp-row .r{display:none}
  .reading .v{font-size:46px}
  .tbl-wrap{overflow-x:auto}
  .banner{padding:12px 16px}
}
@media (prefers-reduced-motion:reduce){
  .axis .band{transition:none}
}

/* 报告要能打出来 */
@media print{
  .rail,#banner,.refs,.ref-sect,button,#examples{display:none}
  .app{display:block}
  body,main{background:#fff}
  .view{max-width:none;padding:0}
  .report-head{border-top-width:2px}
  .stamp{transform:none}
  .axis .band{transition:none}
}

/* ================= 三页流程：输入 / 过程 / 结果 ================= */

/* ---------- 输入页 ---------- */
.input-grid{display:grid;grid-template-columns:minmax(0,620px) 340px;gap:60px;margin-top:28px;justify-content:start}
.input-aside{position:sticky;top:24px;align-self:start;display:grid;gap:16px}
.kv-tbl td{border:1px solid var(--rule-soft);padding:7px 10px}
.kv-tbl td.k{width:46%;color:var(--ink-2);font-size:11.5px}
.kv-tbl td.v{font-family:var(--num);font-size:13px;text-align:right}
.steps{list-style:none;margin:0;padding:0;display:grid;gap:11px;counter-reset:st}
.steps li{display:grid;grid-template-columns:18px 1fr;gap:10px;font-size:11.5px;color:var(--ink-3)}
.steps li::before{counter-increment:st;content:counter(st);font-family:var(--num);font-size:9.5px;
  border:1px solid var(--rule);width:16px;height:16px;line-height:15px;text-align:center}
.steps li.on::before{border-color:var(--iron);color:var(--iron)}
.steps li > b,.steps li > span{grid-column:2}
.steps b{display:block;color:var(--ink-2);font-weight:400;font-size:12.5px;letter-spacing:.03em}
.steps li.on b{color:var(--ink)}
.steps span{display:block;line-height:1.65}
button.primary{background:var(--ink);color:var(--sheet);border:1px solid var(--ink);
  padding:11px 16px;font:inherit;font-size:13px;letter-spacing:.1em;cursor:pointer;border-radius:0}
button.primary:hover{background:#000}
button.primary:disabled{opacity:.5;cursor:default}
.hint{font-size:11px;color:var(--ink-3);line-height:1.75}
.hint.bad{color:var(--iron)}
a.primary{display:inline-block;background:var(--ink);color:var(--sheet);padding:9px 14px;
  text-decoration:none;font-size:12.5px;letter-spacing:.06em}
.empty{padding:56px 0;color:var(--ink-2);font-size:12.5px}
.empty p{margin:0 0 14px}

/* ---------- 结果页（单栏报告） ---------- */
.report-solo{padding-bottom:40px}
.report-solo .rep-head{margin-top:14px}

/* ---------- 过程页 ---------- */
.proc-rail{display:flex;flex-wrap:wrap;gap:6px 20px;margin-top:22px;
  padding-bottom:9px;border-bottom:1px solid var(--rule-soft)}
.pr-item{display:inline-flex;align-items:baseline;gap:6px;font-size:11.5px;color:var(--ink-3);
  transition:color .2s}
.pr-item i{font-family:var(--num);font-style:normal;font-size:9.5px}
.pr-item.on,.pr-item.on i{color:var(--iron)}
.pr-item.done{color:var(--ink-2)}
.stage-wrap{position:relative;height:min(58vh,470px);margin-top:24px}
.stage{position:absolute;inset:0;visibility:hidden;opacity:0;display:flex;flex-direction:column}
.stage.shown{visibility:visible;opacity:1}
.stage-h{display:flex;align-items:baseline;gap:12px;padding-bottom:10px;
  border-bottom:1px solid var(--rule)}
.stage-no{font-family:var(--num);font-size:11px;color:var(--iron)}
.stage-title{font-family:var(--fang);font-size:20px;letter-spacing:.1em}
.stage-sub{font-size:11px;color:var(--ink-3);margin-top:3px;letter-spacing:.03em}
.stage-b{flex:1;min-height:0;overflow:auto;padding:18px 0;display:flex;flex-direction:column;justify-content:center}
.stage-foot{margin-top:14px;font-size:10.5px;color:var(--ink-3);letter-spacing:.03em}
.drv-inputs{display:flex;flex-wrap:wrap;gap:6px 16px;font-size:10.5px;color:var(--ink-3);margin-bottom:6px}
.drv-chip{padding-bottom:2px;border-bottom:1px solid var(--rule-soft)}
.drv-chip b{font-weight:400;color:var(--ink-2);margin-right:6px}
.drv-arrow{font-size:10px;color:var(--ink-3);letter-spacing:.12em;margin:10px 0 12px}
.proc-foot{display:flex;align-items:center;gap:14px;margin-top:8px;padding-top:14px;
  border-top:1px solid var(--rule-soft)}
.proc-foot .meta{margin-right:auto}

/* 校验 */
.val-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 36px}
.val-row{display:grid;grid-template-columns:1fr auto 50px;gap:10px;align-items:baseline;
  padding:6px 0;border-bottom:1px solid var(--rule-soft);font-size:12px}
.val-row .k{color:var(--ink-2)}
.val-row .v{font-family:var(--num);text-align:right}
.val-row .t{font-size:9.5px;color:var(--ink-3);text-align:right;letter-spacing:.05em}
.val-row .t.ok{color:var(--pass)}

/* 派生 */
.drv-grid{display:grid;grid-template-columns:repeat(4,1fr);
  border-top:1px solid var(--rule);border-bottom:1px solid var(--rule-soft)}
.drv{padding:14px 16px 12px 0}
.drv + .drv{padding-left:16px;border-left:1px solid var(--rule-soft)}
.drv .k{font-size:10.5px;color:var(--ink-3);letter-spacing:.05em}
.drv .v{font-family:var(--num);font-size:32px;margin-top:5px;letter-spacing:-.01em;line-height:1}
.drv .u{font-size:9.5px;color:var(--ink-3);margin-top:4px}

/* 邻域 / z 分 */
.z-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 36px}
.z-row{display:grid;grid-template-columns:64px 46px 1fr;gap:10px;align-items:center;
  padding:3px 0;font-size:11px}
.z-row .k{color:var(--ink-2)}
.z-row .v{font-family:var(--num);text-align:right;color:var(--ink-3)}
.z-track{position:relative;height:10px}
.z-mid{position:absolute;left:50%;top:0;bottom:0;width:1px;background:var(--rule)}
.z-bar{position:absolute;top:3px;height:3px;background:var(--ink-3)}
.z-bar.right{transform-origin:left center}
.z-bar.left{transform-origin:right center}
.ad-gauge{margin-top:20px}
.ad-track{position:relative;height:2px;background:var(--rule);margin-top:14px}
.ad-radius{position:absolute;top:-8px;width:1px;height:18px;background:var(--ink-2)}
.ad-mark{position:absolute;top:-5px;width:2px;height:12px;background:var(--iron)}
.ad-mark.ok{background:var(--pass)}
.ad-labels{display:flex;justify-content:space-between;font-family:var(--num);
  font-size:9.5px;color:var(--ink-3);margin-top:6px}
.ad-labels .t{color:var(--ink-2)}
.ad-bottom{display:flex;align-items:baseline;gap:18px;margin-top:10px}
.ad-verdict{font-family:var(--fang);font-size:15px;letter-spacing:.12em;color:var(--pass)}
.ad-verdict.bad{color:var(--iron)}
.ad-k{font-size:11px;color:var(--ink-3)}
.ad-k b{font-family:var(--num);color:var(--ink);font-weight:500}

/* 树集成 */
.forest-svg{display:block;width:100%;height:auto;overflow:visible}
.f-base,.f-tick{stroke:var(--ink-3);stroke-width:1}
.f-lbl{font-family:var(--num);font-size:9px;fill:var(--ink-3)}
.f-dot{fill:var(--ink-3);opacity:.5}
.f-dot.up{fill:var(--iron);opacity:.45}
.f-mean{stroke:var(--iron);stroke-width:1.4}
.f-info{display:flex;align-items:flex-end;gap:26px;margin-top:2px}
.f-mean-num{font-family:var(--num);font-size:36px;line-height:1;letter-spacing:-.01em}
.f-mean-num .u{font-size:10px;color:var(--ink-3);margin-left:6px;font-family:var(--sans)}
.f-side{font-size:10.5px;color:var(--ink-3);line-height:1.85;padding-bottom:2px}

/* 区间 */
.iv-track{position:relative;height:2px;background:var(--rule);margin-top:40px}
.iv-band{position:absolute;top:-6px;height:14px;background:var(--iron-wash);
  border-left:1px solid var(--iron);border-right:1px solid var(--iron)}
.iv-point{position:absolute;top:-9px;width:2px;height:20px;background:var(--iron)}
.iv-labels{display:flex;justify-content:space-between;font-family:var(--num);
  font-size:9.5px;color:var(--ink-3);margin-top:6px}
.iv-read{display:grid;grid-template-columns:repeat(3,1fr);margin-top:20px;
  border-top:1px solid var(--rule);border-bottom:1px solid var(--rule-soft)}
.iv-item{padding:10px 14px 10px 0}
.iv-item + .iv-item{padding-left:14px;border-left:1px solid var(--rule-soft)}
.iv-item .k{font-size:10px;color:var(--ink-3)}
.iv-item .v{font-family:var(--num);font-size:22px;margin-top:4px}
.iv-item.big .v{font-size:32px;color:var(--iron)}

/* 规范派生 */
.gb-grid{display:flex;align-items:stretch}
.gb-cell{flex:1;padding:12px 12px 10px 0}
.gb-cell .k{font-size:10.5px;color:var(--ink-3)}
.gb-cell .v{font-family:var(--num);font-size:26px;margin-top:5px;letter-spacing:-.01em}
.gb-cell .u{font-size:9.5px;color:var(--ink-3);margin-top:2px}
.gb-arrow{align-self:center;color:var(--ink-3);font-size:12px;padding:0 12px}

/* 判定 */
.v-stamp{width:158px;border:2px double var(--iron);color:var(--iron);padding:14px 16px;
  text-align:center;transform:rotate(-2.4deg);margin:24px 0 0 4px;
  background:rgba(154,60,34,.03)}
.v-stamp .g{display:block;font-family:var(--num);font-size:30px;letter-spacing:.03em}
.v-stamp .s{display:block;margin-top:5px;font-family:var(--fang);font-size:12px;letter-spacing:.16em}
.v-stamp.cn .g{font-family:var(--fang);font-size:25px;letter-spacing:.1em}
.v-stamp.off{border-color:var(--rule);color:var(--ink-3);background:none}
.v-lines{margin-top:18px;font-size:11.5px;color:var(--ink-2);line-height:1.95}

/* 静态回退（prefers-reduced-motion / 窄屏） */
body.reduce .stage-wrap{height:auto}
body.reduce .stage{position:static;visibility:visible;opacity:1;margin-bottom:34px}
body.reduce .stage-b{overflow:visible}

@media (max-width:900px){
  .input-grid{grid-template-columns:1fr;gap:26px}
  .input-aside{position:static}
  .val-grid,.z-grid{grid-template-columns:1fr}
  .drv-grid{grid-template-columns:1fr 1fr}
  .drv + .drv{border-left:0;padding-left:0}
  .stage-wrap{height:auto}
  .stage{position:static;visibility:visible;opacity:1;margin-bottom:26px}
  .stage-b{overflow:visible}
  .gb-grid{flex-wrap:wrap}
  .gb-arrow{padding:0 6px}
  .iv-item.big .v{font-size:26px}
}
/* 读数前的物理量名称 / 轴名 */
.reading .k{font-size:11px;letter-spacing:.08em;color:var(--ink-3);margin-bottom:6px}
.reading .sub-k{font-size:10.5px;letter-spacing:.08em;color:var(--ink-3);margin-top:16px}
.axis-cap{margin-top:22px;font-size:10px;letter-spacing:.08em;color:var(--ink-3)}