/* 通用组件：上传区 / 按钮 / 报告书版式 / 表单表格 / 图表 */
.uploads{display:grid; grid-template-columns:1fr 1fr; gap:var(--s-4)}
@media (max-width:640px){.uploads{grid-template-columns:1fr}}
.drop{border:1.5px dashed var(--accent-line); border-radius:var(--r-md); padding:var(--s-5);
  text-align:center; background:var(--surface-2); cursor:pointer; transition:border-color var(--dur), background var(--dur)}
.drop:hover{border-color:var(--accent-2); background:var(--accent-bg)}
.drop .lbl{font-weight:600; display:block}
.drop .hint{color:var(--mut); font-size:var(--t-sm); margin-top:var(--s-1)}
.drop .fname{margin-top:var(--s-2); font-family:var(--mono); font-size:var(--t-sm); color:var(--accent-text); word-break:break-all}
.drop input[type=file]{display:none}

.actions{margin-top:var(--s-4); display:flex; align-items:center; gap:var(--s-3); flex-wrap:wrap}
button.run{appearance:none; border:0; border-radius:var(--r-md); cursor:pointer;
  background:var(--accent); color:var(--accent-ink); font-size:var(--t-md); font-weight:600;
  padding:var(--s-3) var(--s-5); transition:transform var(--dur), opacity var(--dur), box-shadow var(--dur); box-shadow:var(--sh-1)}
button.run:hover:not(:disabled){transform:translateY(-1px); box-shadow:var(--sh-2)}
button.run:disabled{opacity:.5; cursor:not-allowed}
button.run.ghost{background:var(--surface-2); color:var(--accent-text); border:1px solid var(--accent-line); box-shadow:none}
button.run.ghost:hover:not(:disabled){background:var(--accent-bg)}
.status{color:var(--mut); font-size:var(--t-sm)}
.status.err{color:var(--bad-text)}
.ai-progress{flex:1 1 320px; min-width:min(280px,100%); max-width:620px}
.ai-progress-meta{display:flex; justify-content:space-between; gap:var(--s-3);
  margin-bottom:5px; font-size:var(--t-xs); color:var(--txt-2)}
.ai-progress-value{font-family:var(--mono); color:var(--accent-text); white-space:nowrap}
.ai-progress-track{height:8px; overflow:hidden; border:1px solid var(--line);
  border-radius:var(--r-pill); background:var(--surface-2)}
.ai-progress-fill{display:block; height:100%; width:0; border-radius:inherit;
  background:var(--accent); transition:width 180ms ease, background 180ms ease}
.ai-progress.waiting .ai-progress-fill{width:35% !important;
  animation:ai-progress-wait 1.25s ease-in-out infinite}
.ai-progress.err .ai-progress-label,.ai-progress.err .ai-progress-value{color:var(--bad-text)}
.ai-progress.err .ai-progress-fill{background:var(--bad)}
@keyframes ai-progress-wait{
  0%{transform:translateX(-110%)}
  100%{transform:translateX(290%)}
}
@media (prefers-reduced-motion:reduce){
  .ai-progress.waiting .ai-progress-fill{animation:none; opacity:.65}
}

.preview2d{margin:var(--s-4) 0 0; border:1px solid var(--line); border-radius:var(--r-md); overflow:hidden; background:var(--surface)}
.preview2d .pv-head{padding:8px 14px; background:var(--surface-2); border-bottom:1px solid var(--line);
  font-size:var(--t-sm); color:var(--txt-2); font-weight:600; display:flex; align-items:center; gap:8px}
.preview2d .pv-tag{margin-left:auto; font-weight:500; color:var(--mut); font-size:var(--t-xs)}
.preview2d img{display:block; width:100%; height:auto; background:#fdfdfb; max-height:520px; object-fit:contain}

.summary{display:flex; flex-wrap:wrap; gap:var(--s-2); margin-bottom:var(--s-4)}
.pill{display:inline-flex; align-items:center; gap:var(--s-1); padding:var(--s-1) var(--s-3);
  border-radius:var(--r-pill); font-size:var(--t-sm); font-weight:600; border:1px solid var(--line)}
.pill.total{background:var(--surface-2); color:var(--txt-2)}
.pill.high{background:var(--bad-bg); color:var(--bad-text); border-color:transparent}
.pill.medium{background:var(--warn-bg); color:var(--warn-text); border-color:transparent}
.pill.low{background:var(--accent-bg); color:var(--accent-text); border-color:transparent}
.pill.clean{background:var(--ok-bg); color:var(--ok-text); border-color:transparent}

.facts{display:grid; grid-template-columns:1fr 1fr; gap:12px; margin:var(--s-4) 0}
@media (max-width:640px){.facts{grid-template-columns:1fr}}
.evi-col{border:1px solid var(--line); border-radius:var(--r-md); background:var(--surface-2); padding:12px 14px}
.evi-col h4{margin:0 0 9px; font-size:var(--t-xs); font-weight:700; letter-spacing:.4px; text-transform:uppercase;
  color:var(--mut); display:flex; align-items:center; gap:7px}
.evi-col h4 .src{margin-left:auto; font-weight:500; letter-spacing:0; text-transform:none; color:var(--faint); font-size:var(--t-xs); font-family:var(--mono)}
.kv{display:flex; justify-content:space-between; gap:12px; padding:5px 0; border-top:1px solid var(--line-soft); font-size:var(--t-sm)}
.kv:first-of-type{border-top:0}
.kv .k{color:var(--txt-2); white-space:nowrap}
.kv .v{font-family:var(--mono); color:var(--txt); text-align:right}
.kv .v.miss{color:var(--bad-text); font-weight:600}
.kv .chips{display:flex; gap:5px; flex-wrap:wrap; justify-content:flex-end}
.kv .chip{font-family:var(--mono); font-size:var(--t-xs); background:var(--surface-3); color:var(--txt-2); padding:1px 7px; border-radius:6px}

.finding{border:1px solid var(--line); border-left-width:4px; border-radius:var(--r-md); padding:var(--s-4); margin-bottom:var(--s-3); background:var(--surface)}
.finding.high{border-left-color:var(--bad); background:var(--bad-bg)}
.finding.medium{border-left-color:var(--warn); background:var(--warn-bg)}
.finding.low{border-left-color:var(--accent-2); background:var(--accent-bg)}
.finding .head{display:flex; align-items:center; gap:var(--s-2); flex-wrap:wrap}
.badge{font-size:var(--t-xs); font-weight:700; letter-spacing:.4px; padding:2px var(--s-2); border-radius:var(--r-sm); background:var(--surface-3); color:var(--txt-2)}
.badge.sev-high{background:var(--bad); color:#fff}
.badge.sev-medium{background:var(--warn); color:#fff}
.badge.sev-low{background:var(--accent-2); color:#fff}
.badge.conf-high{background:var(--ok-bg); color:var(--ok-text)}
.badge.conf-soft{background:var(--warn-bg); color:var(--warn-text)}
.finding .msg{font-weight:600; margin:var(--s-2) 0 var(--s-1)}
.finding .basis{margin:var(--s-2) 0; padding:6px 12px; border-left:3px solid var(--txt-2);
  background:var(--surface-2); color:var(--txt-2); font-size:var(--t-sm)}
.finding .sug{color:var(--txt-2); font-size:var(--t-sm)}
.finding .sug b{color:var(--txt)}
.empty{color:var(--mut); text-align:center; padding:var(--s-6) 0}

/* 报告书版式 */
.report-toolbar{display:flex; align-items:center; gap:var(--s-3); margin-bottom:var(--s-3)}
.print-btn{margin-left:auto; font-size:var(--t-sm); font-weight:600; cursor:pointer; padding:6px 12px;
  border-radius:var(--r-sm); border:1px solid var(--accent-line); background:var(--surface-2); color:var(--accent-text)}
.print-btn:hover{background:var(--accent-bg)}
.report-head{text-align:center; border-bottom:2px solid var(--txt); padding-bottom:var(--s-4); margin-bottom:var(--s-4)}
.report-title{margin:0 0 var(--s-3); font-size:24px; letter-spacing:8px; font-weight:700}
.grade-badge{display:inline-flex; align-items:center; gap:10px; padding:8px 18px; border-radius:var(--r-md);
  color:#fff; margin-bottom:var(--s-3); text-align:left}
.grade-badge .g-letter{font-size:26px; font-weight:800; line-height:1}
.grade-badge .g-label{font-size:var(--t-md); font-weight:700}
.grade-badge .g-reason{font-size:var(--t-xs); opacity:.92}
.grade-A{background:var(--ok)} .grade-B{background:var(--accent-2)}
.grade-C{background:var(--warn)} .grade-D{background:var(--bad)}
.report-meta{display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:4px 24px; margin:0;
  text-align:left; font-size:var(--t-sm)}
@media (max-width:640px){.report-meta{grid-template-columns:1fr}}
.report-meta > div{display:flex; gap:8px; border-bottom:1px solid var(--line-soft); padding:3px 0}
.report-meta dt{color:var(--mut); white-space:nowrap}
.report-meta dd{margin:0; font-family:var(--mono); word-break:break-all}
.purpose-box{border:1px solid var(--accent-line); background:var(--accent-bg); border-radius:var(--r-md);
  padding:var(--s-3) var(--s-4); font-size:var(--t-sm); color:var(--txt-2); margin-bottom:var(--s-4)}
.purpose-box b{color:var(--accent-text)}
.rf-group{margin-bottom:var(--s-4)}
.rf-group > h3{margin:0 0 var(--s-3); font-size:var(--t-md); border-left:4px solid var(--accent); padding-left:10px}
.rf-clean{color:var(--ok-text); background:var(--ok-bg); border-radius:var(--r-sm); padding:8px 12px;
  font-size:var(--t-sm); font-weight:600}
.report-aux{border:1px solid var(--line); border-radius:var(--r-md); background:var(--surface-2);
  padding:var(--s-2) var(--s-4); margin-top:var(--s-4)}
.report-aux > summary{cursor:pointer; font-size:var(--t-sm); font-weight:600; color:var(--mut); padding:6px 0}
.report-foot{margin-top:var(--s-5); border-top:1px solid var(--line); padding-top:var(--s-3)}
.report-foot .report-disclaimer{color:var(--mut); font-size:var(--t-xs); line-height:1.6; margin:0 0 var(--s-4)}
.sign-row{display:flex; justify-content:space-between; gap:var(--s-4); font-size:var(--t-base); color:var(--txt-2)}

/* 编辑 2D → 重跑（证明内容驱动）*/
.edit-grid{display:grid; grid-template-columns:1fr 1fr; gap:var(--s-3) var(--s-4)}
@media (max-width:640px){.edit-grid{grid-template-columns:1fr}}
.fld{display:flex; flex-direction:column; gap:3px}
.fld label{font-size:var(--t-xs); color:var(--mut); font-weight:600}
.fld input{font-family:var(--mono); font-size:var(--t-sm); padding:7px 9px; border:1px solid var(--line);
  border-radius:var(--r-sm); background:var(--surface); color:var(--txt)}
.fld input:focus{outline:2px solid var(--accent-line); border-color:var(--accent-2)}

/* 表单/表格通用 */
.form-grid{display:grid; grid-template-columns:repeat(3,1fr); gap:var(--s-3) var(--s-4)}
@media (max-width:640px){.form-grid{grid-template-columns:1fr 1fr}}
table.tbl{width:100%; border-collapse:collapse; font-size:var(--t-sm)}
table.tbl th,table.tbl td{padding:8px 10px; border-bottom:1px solid var(--line-soft); text-align:left}
table.tbl th{color:var(--mut); font-weight:600; font-size:var(--t-xs); text-transform:uppercase; letter-spacing:.3px}
table.tbl td{font-variant-numeric:tabular-nums}
.tbl-wrap{overflow-x:auto}
.tag-pass{color:var(--ok-text); background:var(--ok-bg); padding:2px 8px; border-radius:var(--r-pill); font-weight:700; font-size:var(--t-xs)}
.tag-fail{color:var(--bad-text); background:var(--bad-bg); padding:2px 8px; border-radius:var(--r-pill); font-weight:700; font-size:var(--t-xs)}
.tag-pending{color:var(--warn-text); background:var(--warn-bg); padding:2px 8px; border-radius:var(--r-pill); font-weight:700; font-size:var(--t-xs)}

/* 供应商评估图表 */
.charts{display:grid; grid-template-columns:1fr 1fr; gap:var(--s-4)}
@media (max-width:720px){.charts{grid-template-columns:1fr}}
.chart{border:1px solid var(--line); border-radius:var(--r-md); padding:var(--s-4); background:var(--surface-2)}
.chart h3{margin:0 0 var(--s-3); font-size:var(--t-sm); color:var(--txt-2)}
.bar-row{display:grid; grid-template-columns:96px 1fr 52px; align-items:center; gap:var(--s-2); margin:7px 0; font-size:var(--t-sm)}
.bar-row .name{color:var(--txt-2); white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.bar-track{background:var(--surface-3); border-radius:var(--r-pill); height:16px; overflow:hidden}
.bar-fill{height:100%; border-radius:var(--r-pill); transition:width var(--dur)}
.bar-row .val{text-align:right; font-family:var(--mono); font-variant-numeric:tabular-nums}
.hist{display:flex; align-items:flex-end; gap:8px; height:130px; padding-top:6px}
.hist .col{flex:1; display:flex; flex-direction:column; align-items:center; gap:4px; height:100%; justify-content:flex-end}
.hist .col .b{width:70%; background:var(--accent-2); border-radius:4px 4px 0 0; min-height:2px}
.hist .col .c{font-size:var(--t-xs); font-family:var(--mono); color:var(--txt-2)}
.hist .col .l{font-size:9px; color:var(--mut); text-align:center; line-height:1.2}
