/* ===== DCAMS-GIS 专业工程界面样式 ===== */
:root{
  --c-primary:#0f4c81; --c-primary-l:#1e88c7; --c-accent:#e11d48;
  --c-bg:#f1f5f9; --c-surface:#fff; --c-border:#dbe3ec; --c-text:#1e293b;
  --c-muted:#64748b; --c-ok:#16a34a; --c-warn:#f59e0b; --c-danger:#dc2626;
  --g1:#2E8B57; --g2:#7CB342; --g3:#F2C200; --g4:#EF7C00; --g5:#D32F2F;
  --sh-sm:0 1px 2px rgba(15,23,42,.06);
  --sh-md:0 4px 14px rgba(15,23,42,.10);
  --sh-lg:0 12px 34px rgba(15,23,42,.16);
}
*{box-sizing:border-box}
html,body{height:100%}
body{
  margin:0;font-family:"Segoe UI","Microsoft JhengHei","PingFang HK",system-ui,-apple-system,sans-serif;
  color:var(--c-text);background:var(--c-bg);font-size:13px;-webkit-font-smoothing:antialiased;
}
.hidden{display:none !important}
button{font-family:inherit}
input,select,textarea{font-family:inherit;font-size:13px}

/* ---------- 按钮 ---------- */
.btn{
  border:1px solid var(--c-primary);background:var(--c-primary);color:#fff;
  padding:7px 14px;border-radius:5px;cursor:pointer;font-size:12.5px;font-weight:600;
  transition:.15s;white-space:nowrap;
}
.btn:hover{background:#0d3f6b;border-color:#0d3f6b}
.btn.ghost{background:#fff;color:var(--c-primary);border-color:var(--c-border)}
.btn.ghost:hover{background:#f1f7fd;border-color:var(--c-primary-l)}
.btn.danger{background:var(--c-danger);border-color:var(--c-danger)}
.btn.danger:hover{background:#b91c1c;border-color:#b91c1c}
.btn.sm{padding:5px 11px;font-size:12px}
.btn.tiny{padding:3px 8px;font-size:11px;border-radius:4px}
.btn:disabled{opacity:.5;cursor:not-allowed}

/* ---------- 登录 ---------- */
.login-wrap{
  position:fixed;inset:0;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(135deg,#0b3358 0%,#0f4c81 42%,#1e88c7 100%);
  overflow:hidden;
}
.login-wrap::before{
  content:"";position:absolute;inset:0;
  background-image:linear-gradient(rgba(255,255,255,.045) 1px,transparent 1px),
                   linear-gradient(90deg,rgba(255,255,255,.045) 1px,transparent 1px);
  background-size:44px 44px;
}
.login-card{
  position:relative;width:400px;background:#fff;border-radius:12px;
  padding:34px 32px 26px;box-shadow:var(--sh-lg);
}
.login-brand{text-align:center;margin-bottom:24px}
.brand-mark{
  display:inline-flex;align-items:center;justify-content:center;
  width:66px;height:66px;border-radius:10px;
  background:linear-gradient(135deg,#0f4c81,#1e88c7);color:#fff;
  font-weight:800;font-size:14px;letter-spacing:.5px;margin-bottom:14px;
  box-shadow:0 6px 18px rgba(15,76,129,.35);
}
.brand-mark.sm{width:34px;height:34px;font-size:9px;border-radius:7px;margin:0;box-shadow:none}
.login-brand h1{font-size:19px;margin:0 0 6px;color:var(--c-primary);letter-spacing:.5px}
.login-brand p{font-size:11px;color:var(--c-muted);margin:0;line-height:1.5}
#loginForm{display:flex;flex-direction:column;gap:7px}
#loginForm label{font-size:11.5px;color:var(--c-muted);font-weight:600;margin-top:6px}
#loginForm input{
  padding:10px 12px;border:1px solid var(--c-border);border-radius:6px;outline:none;
  transition:.15s;font-size:13.5px;
}
#loginForm input:focus{border-color:var(--c-primary-l);box-shadow:0 0 0 3px rgba(30,136,199,.13)}
#loginForm button{
  margin-top:16px;padding:11px;border:0;border-radius:6px;cursor:pointer;
  background:linear-gradient(135deg,#0f4c81,#1e88c7);color:#fff;font-size:14px;font-weight:700;
  letter-spacing:3px;transition:.15s;
}
#loginForm button:hover{filter:brightness(1.08)}
.err{color:var(--c-danger);font-size:12px;min-height:16px;margin-top:6px}
.login-hint{
  margin-top:18px;padding-top:14px;border-top:1px dashed var(--c-border);
  font-size:10.5px;color:var(--c-muted);line-height:1.8;
}
.login-hint code{background:#eef4fb;padding:1px 5px;border-radius:3px;color:var(--c-primary);font-size:10.5px}

/* ---------- 顶栏 ---------- */
.app{display:flex;flex-direction:column;height:100vh;overflow:hidden}
.topbar{
  display:flex;align-items:center;gap:20px;height:52px;flex:0 0 52px;
  padding:0 16px;background:var(--c-primary);color:#fff;box-shadow:var(--sh-md);z-index:30;
}
.tb-left{display:flex;align-items:center;gap:10px}
.tb-title{font-size:14px;font-weight:600;letter-spacing:.3px}
.tb-title span{
  font-size:9.5px;background:rgba(255,255,255,.2);padding:2px 6px;
  border-radius:3px;margin-left:5px;font-weight:700;letter-spacing:1px;vertical-align:1px;
}
.tb-nav{display:flex;gap:2px;flex:1}
.tb-nav a{
  padding:7px 16px;border-radius:5px;cursor:pointer;font-size:12.8px;
  color:rgba(255,255,255,.8);transition:.15s;font-weight:500;
}
.tb-nav a:hover{background:rgba(255,255,255,.12);color:#fff}
.tb-nav a.on{background:rgba(255,255,255,.19);color:#fff;font-weight:600}
.tb-right{display:flex;align-items:center;gap:10px}
.tb-user{font-size:12px;opacity:.9}
.tb-right .btn.ghost{background:rgba(255,255,255,.13);color:#fff;border-color:rgba(255,255,255,.3)}
.tb-right .btn.ghost:hover{background:rgba(255,255,255,.22)}

/* ---------- 视图 ---------- */
.view{display:none;flex:1;min-height:0}
.view.on{display:flex}
#view-map{position:relative}

/* ---------- 面板 ---------- */
.panel{
  background:var(--c-surface);display:flex;flex-direction:column;min-height:0;
  flex:0 0 250px;box-shadow:var(--sh-sm);z-index:10;
}
.panel.left{border-right:1px solid var(--c-border)}
.panel.right{border-left:1px solid var(--c-border);flex:0 0 330px}
.panel.wide{flex:0 0 288px}
.ph{
  display:flex;align-items:center;justify-content:space-between;
  padding:11px 13px;border-bottom:1px solid var(--c-border);flex:0 0 auto;
  background:linear-gradient(180deg,#fbfdff,#f4f8fc);
}
.ph h3{margin:0;font-size:12.5px;color:var(--c-primary);font-weight:700;letter-spacing:.3px}
.ph-act{display:flex;gap:5px}
.lysearch{padding:8px 10px;border-bottom:1px solid var(--c-border)}
.lysearch input{
  width:100%;padding:6px 9px;border:1px solid var(--c-border);border-radius:5px;
  outline:none;font-size:12px;background:#fbfdff;
}
.lysearch input:focus{border-color:var(--c-primary-l);background:#fff}

/* ---------- 图层列表 ---------- */
.lylist{flex:1;overflow-y:auto;padding:4px 0}
.lygroup{
  padding:7px 13px 4px;font-size:10px;font-weight:700;color:var(--c-muted);
  letter-spacing:.7px;text-transform:uppercase;
}
.lygrp{
  padding:5px 13px 5px 24px;font-size:11.5px;font-weight:700;color:#334155;
  background:#f8fafc;border-top:1px solid #eef2f7;
}
.lyitem{
  display:flex;align-items:center;gap:7px;padding:4px 13px 4px 26px;
  cursor:pointer;font-size:11.8px;transition:.1s;user-select:none;
}
.lyitem:hover{background:#f1f8fd}
.lyitem .chk{
  width:13px;height:13px;border-radius:3px;border:1.5px solid #cbd5e1;
  flex:0 0 13px;display:flex;align-items:center;justify-content:center;
  background:#fff;transition:.1s;
}
.lyitem.on .chk{background:var(--c-primary-l);border-color:var(--c-primary-l)}
.lyitem.on .chk::after{
  content:"";width:4px;height:7px;border:solid #fff;border-width:0 1.8px 1.8px 0;
  transform:rotate(45deg) translate(-.5px,-.5px);
}
.lyitem .sw{width:9px;height:9px;border-radius:2px;flex:0 0 9px}
.lyitem .nm{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lyitem .ct{font-size:10px;color:#94a3b8;font-variant-numeric:tabular-nums}
.lystat{
  padding:8px 13px;border-top:1px solid var(--c-border);font-size:10.5px;
  color:var(--c-muted);background:#fbfdff;line-height:1.7;
}
.lystat b{color:var(--c-primary);font-variant-numeric:tabular-nums}

/* ---------- 地图 ---------- */
.mapwrap{flex:1;position:relative;min-width:0;display:flex;flex-direction:column}
.mapcanvas{flex:1;position:relative;overflow:hidden;background:#eef3f7;min-height:0}
.mapcanvas canvas{outline:none}
/* MapLibre 控件微调, 避免与自定义工具条重叠 */
.maplibregl-ctrl-bottom-right{bottom:26px}
.maplibregl-ctrl-bottom-left{bottom:26px}
.maplibregl-ctrl-attrib{font-size:10px}
.mapsearch{
  position:absolute;top:12px;left:50%;transform:translateX(-50%);z-index:12;
  display:flex;gap:6px;background:#fff;padding:6px;border-radius:8px;
  box-shadow:var(--sh-md);width:min(460px,calc(100% - 40px));
}
.mapsearch input{
  flex:1;border:0;outline:none;padding:6px 10px;font-size:12.5px;background:transparent;
}
.sresult{
  position:absolute;top:calc(100% + 6px);left:0;right:0;background:#fff;
  border-radius:8px;box-shadow:var(--sh-lg);max-height:330px;overflow-y:auto;padding:4px;
}
.sresult .ri{
  padding:7px 10px;border-radius:5px;cursor:pointer;display:flex;gap:8px;
  align-items:center;font-size:12px;transition:.1s;
}
.sresult .ri:hover{background:#f1f8fd}
.sresult .ri .badge{
  font-size:9.5px;padding:1px 6px;border-radius:3px;background:#eef4fb;
  color:var(--c-primary);font-weight:700;flex:0 0 auto;
}
.sresult .ri .nm{font-weight:600;flex:0 0 auto}
.sresult .ri .sub{color:var(--c-muted);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mapctl{
  position:absolute;right:14px;bottom:34px;z-index:12;display:flex;flex-direction:column;
  gap:1px;background:#fff;border-radius:7px;box-shadow:var(--sh-md);overflow:hidden;
}
.mapctl .btn{border:0;border-radius:0;background:#fff;color:var(--c-primary);padding:8px 11px;font-size:14px;font-weight:700}
.mapctl .btn:hover{background:#f1f8fd}
.mapctl .btn+.btn{border-top:1px solid var(--c-border)}
.mapinfo{
  position:absolute;left:14px;bottom:10px;z-index:11;font-size:10.5px;color:#475569;
  background:rgba(255,255,255,.9);padding:4px 10px;border-radius:5px;box-shadow:var(--sh-sm);
}
.mapbadge{
  position:absolute;left:50%;transform:translateX(-50%);bottom:22px;z-index:11;
  background:rgba(15,76,129,.92);color:#fff;font-size:11px;padding:6px 14px;border-radius:16px;
  box-shadow:var(--sh-md);display:flex;gap:10px;align-items:center;
}
.spin{
  width:11px;height:11px;border:2px solid rgba(255,255,255,.35);
  border-top-color:#fff;border-radius:50%;animation:sp .7s linear infinite;
}
@keyframes sp{to{transform:rotate(360deg)}}

/* ---------- 详情面板 ---------- */
.info-body{flex:1;overflow-y:auto;padding:0}
.empty{
  padding:44px 22px;text-align:center;color:#94a3b8;font-size:12px;line-height:1.8;
}
.empty.big{padding:90px 30px;font-size:13px}
.sec{padding:12px 14px;border-bottom:1px solid #eef2f7}
.sec h4{
  margin:0 0 9px;font-size:11px;color:var(--c-primary);font-weight:700;
  letter-spacing:.6px;text-transform:uppercase;display:flex;align-items:center;gap:6px;
}
.sec h4::before{content:"";width:3px;height:11px;background:var(--c-primary-l);border-radius:2px}
.kv{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:#eef2f7;border:1px solid #eef2f7;border-radius:5px;overflow:hidden}
.kv .k{background:#f8fafc;padding:5px 8px;font-size:10.5px;color:var(--c-muted);font-weight:600}
.kv .v{background:#fff;padding:5px 8px;font-size:11.5px;word-break:break-all;font-variant-numeric:tabular-nums}
.kv .v.full{grid-column:span 1}
.kv2{display:grid;grid-template-columns:34% 66%;gap:1px;background:#eef2f7;border:1px solid #eef2f7;border-radius:5px;overflow:hidden}
.kv2 .k{background:#f8fafc;padding:5px 8px;font-size:10.5px;color:var(--c-muted);font-weight:600}
.kv2 .v{background:#fff;padding:5px 8px;font-size:11.5px;font-variant-numeric:tabular-nums}
.tag{
  display:inline-block;padding:1.5px 7px;border-radius:3px;font-size:10px;font-weight:700;
  background:#eef4fb;color:var(--c-primary);
}
.tag.g1{background:#e8f5e9;color:#1b5e20}
.tag.g2{background:#f1f8e9;color:#33691e}
.tag.g3{background:#fffde7;color:#f57f17}
.tag.g4{background:#fff3e0;color:#e65100}
.tag.g5{background:#ffebee;color:#b71c1c}
.link{
  color:var(--c-primary-l);cursor:pointer;font-size:11.5px;text-decoration:none;
  display:inline-flex;align-items:center;gap:3px;
}
.link:hover{text-decoration:underline}
.reclist{display:flex;flex-direction:column;gap:5px}
.rec{
  border:1px solid var(--c-border);border-radius:5px;padding:7px 9px;cursor:pointer;
  transition:.12s;background:#fff;
}
.rec:hover{border-color:var(--c-primary-l);background:#f8fbfe;box-shadow:var(--sh-sm)}
.rec .rt{font-weight:600;font-size:11.5px;display:flex;justify-content:space-between;gap:6px}
.rec .rs{font-size:10.5px;color:var(--c-muted);margin-top:2px}

/* ---------- 项目列表 ---------- */
.plist{flex:1;overflow-y:auto;padding:7px}
.pitem{
  border:1px solid var(--c-border);border-radius:6px;padding:9px 11px;margin-bottom:6px;
  cursor:pointer;transition:.12s;background:#fff;
}
.pitem:hover{border-color:var(--c-primary-l);box-shadow:var(--sh-sm)}
.pitem.on{border-color:var(--c-primary);background:#f4f9fe;box-shadow:0 0 0 2px rgba(15,76,129,.1)}
.pitem .pn{font-weight:600;font-size:12.3px;margin-bottom:4px;line-height:1.4}
.pitem .pm{font-size:10.5px;color:var(--c-muted);display:flex;gap:9px;flex-wrap:wrap;font-variant-numeric:tabular-nums}
.pitem .pm span{display:inline-flex;align-items:center;gap:3px}

/* ---------- 工作区 ---------- */
.workarea{flex:1;overflow-y:auto;padding:0;min-width:0;background:var(--c-bg)}
.wahead{
  position:sticky;top:0;z-index:8;background:#fff;border-bottom:1px solid var(--c-border);
  padding:12px 18px;display:flex;align-items:center;justify-content:space-between;gap:14px;
  box-shadow:var(--sh-sm);
}
.wahead .wt{font-size:15px;font-weight:700;color:var(--c-primary);letter-spacing:.2px}
.wahead .ws{font-size:11px;color:var(--c-muted);margin-top:3px;display:flex;gap:12px;flex-wrap:wrap}
.wahead .wa{display:flex;gap:7px;flex:0 0 auto}
.wabody{padding:16px 18px 40px}

/* ---------- 统计卡 ---------- */
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(128px,1fr));gap:10px;margin-bottom:16px}
.stat{
  background:#fff;border:1px solid var(--c-border);border-radius:7px;padding:12px 14px;
  box-shadow:var(--sh-sm);
}
.stat .sl{font-size:10.5px;color:var(--c-muted);font-weight:600;margin-bottom:5px;letter-spacing:.3px}
.stat .sv{font-size:21px;font-weight:700;color:var(--c-primary);font-variant-numeric:tabular-nums;line-height:1.1}
.stat .su{font-size:11px;color:var(--c-muted);font-weight:500;margin-left:2px}

/* ---------- 表格 ---------- */
.tbl{width:100%;border-collapse:collapse;background:#fff;font-size:12px;border-radius:7px;overflow:hidden;box-shadow:var(--sh-sm)}
.tbl th{
  background:#f4f8fc;color:#334155;font-weight:700;font-size:11px;padding:8px 9px;
  text-align:left;border-bottom:1px solid var(--c-border);white-space:nowrap;letter-spacing:.2px;
}
.tbl td{padding:7px 9px;border-bottom:1px solid #eef2f7;vertical-align:middle}
.tbl tr:last-child td{border-bottom:0}
.tbl tbody tr:hover{background:#f8fbfe}
.tbl tbody tr.sel{background:#eaf4fd}
.tbl .num{text-align:right;font-variant-numeric:tabular-nums}
.tbl .ctr{text-align:center}
.tbl .acts{display:flex;gap:5px;justify-content:flex-end}

/* ---------- 表单 ---------- */
.form{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:11px}
.field{display:flex;flex-direction:column;gap:4px}
.field label{font-size:10.8px;color:var(--c-muted);font-weight:600;letter-spacing:.2px}
.field input,.field select,.field textarea{
  padding:7px 9px;border:1px solid var(--c-border);border-radius:5px;outline:none;
  font-size:12.3px;background:#fff;transition:.12s;
}
.field input:focus,.field select:focus,.field textarea:focus{
  border-color:var(--c-primary-l);box-shadow:0 0 0 3px rgba(30,136,199,.1);
}
.field.full{grid-column:1/-1}
.field textarea{resize:vertical;min-height:56px}
.field .hint{font-size:10px;color:#94a3b8}

/* ---------- 模态 ---------- */
.modal{
  position:fixed;inset:0;z-index:80;background:rgba(15,23,42,.45);
  display:flex;align-items:center;justify-content:center;padding:24px;
  backdrop-filter:blur(2px);
}
.modal-card{
  background:#fff;border-radius:10px;box-shadow:var(--sh-lg);width:min(880px,100%);
  max-height:calc(100vh - 48px);display:flex;flex-direction:column;overflow:hidden;
}
.modal-card.wide{width:min(1180px,100%)}
.mh{
  padding:14px 18px;border-bottom:1px solid var(--c-border);display:flex;
  align-items:center;justify-content:space-between;
  background:linear-gradient(180deg,#fbfdff,#f4f8fc);
}
.mh h3{margin:0;font-size:14.5px;color:var(--c-primary);font-weight:700}
.mb{padding:18px;overflow-y:auto;flex:1}
.mf{
  padding:12px 18px;border-top:1px solid var(--c-border);display:flex;
  justify-content:flex-end;gap:8px;background:#fbfdff;
}

/* ---------- Toast ---------- */
.toast{
  position:fixed;left:50%;bottom:34px;transform:translateX(-50%);z-index:99;
  background:#0f172a;color:#fff;padding:10px 20px;border-radius:7px;font-size:12.5px;
  box-shadow:var(--sh-lg);animation:tin .2s ease;
}
.toast.ok{background:#15803d}
.toast.err{background:#b91c1c}
@keyframes tin{from{opacity:0;transform:translate(-50%,8px)}}

/* ---------- 仪表盘 ---------- */
.dash{padding:22px 26px;overflow-y:auto;flex:1}
.dash h2{font-size:17px;color:var(--c-primary);margin:0 0 4px}
.dash .sub{font-size:12px;color:var(--c-muted);margin-bottom:20px}
.dashgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:14px;margin-bottom:22px}
.card{background:#fff;border:1px solid var(--c-border);border-radius:9px;padding:16px 18px;box-shadow:var(--sh-sm)}
.card h3{margin:0 0 12px;font-size:12.5px;color:var(--c-primary);font-weight:700}
.bars{display:flex;flex-direction:column;gap:8px}
.bar{display:flex;align-items:center;gap:9px;font-size:11.5px}
.bar .bl{width:66px;color:var(--c-muted);flex:0 0 66px}
.bar .bt{flex:1;height:9px;background:#eef2f7;border-radius:5px;overflow:hidden}
.bar .bf{height:100%;border-radius:5px;transition:width .4s}
.bar .bv{width:44px;text-align:right;font-variant-numeric:tabular-nums;font-weight:600;flex:0 0 44px}

/* 缺陷录入表 */
.defects .tbl td{padding:4px 5px}
.defects input,.defects select{padding:4px 6px;font-size:11.5px;width:100%;border:1px solid #dfe6ee;border-radius:4px}
.defects .tbl th{font-size:10px;padding:5px 4px}

.scroll-x{overflow-x:auto}
.muted{color:var(--c-muted)}
.mono{font-family:ui-monospace,Consolas,monospace;font-variant-numeric:tabular-nums}
.row{display:flex;gap:8px;align-items:center}
.row.between{justify-content:space-between}
.mt{margin-top:14px}

/* ---------- 地图版权标注 (地政总署要求) ---------- */
.mapcopyright{
  position:absolute;right:14px;bottom:8px;z-index:11;
  font-size:10px;color:#475569;background:rgba(255,255,255,.88);
  padding:3px 9px;border-radius:4px;box-shadow:var(--sh-sm);
  pointer-events:none;letter-spacing:.2px;
}
.mapcopyright span{font-weight:700;color:#0f4c81}
.mapctl .btn.on{background:#0f4c81;color:#fff}

/* ================= MSCC 规范录入表 (复刻原 siteinfo.html 布局) ================= */
.mscc-form{
  border:1px solid #c8d3e0;border-radius:6px;overflow:hidden;margin-bottom:14px;
  background:#fff;
}
.mscc-row-title{
  display:flex;background:#505984;color:#fff;
}
.mscc-row-title span{
  flex:1;min-width:0;padding:5px 4px;font-size:10px;font-weight:600;
  text-align:center;border-right:1px solid rgba(255,255,255,.16);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;letter-spacing:.2px;
}
.mscc-row-title span:last-child{border-right:0}
.mscc-row-title span.wide{flex:3;text-align:left;padding-left:8px}
.mscc-row{
  display:flex;border-bottom:1px solid #e2e8f0;
}
.mscc-row:last-child{border-bottom:0}
.mscc-row input,.mscc-row select{
  flex:1;min-width:0;border:0;border-right:1px solid #e6ecf2;
  padding:5px 6px;font-size:11.5px;outline:none;background:#fff;
}
.mscc-row input:last-child,.mscc-row select:last-child{border-right:0}
.mscc-row input:focus,.mscc-row select:focus{background:#fffbe6;box-shadow:inset 0 0 0 1px #1e88c7}
.mscc-row input.ro{background:#EBEBE4;color:#475569}
.mscc-row input.wide,.mscc-row select.wide{flex:3}

/* 缺陷表 */
.defect-wrap{border:1px solid #c8d3e0;border-radius:6px;overflow:hidden;margin-bottom:14px;background:#fff}
.dhead{
  display:flex;align-items:center;justify-content:space-between;
  padding:8px 12px;background:#f4f8fc;border-bottom:1px solid #dbe3ec;
}
.dhead h4{margin:0;font-size:11.5px;color:var(--c-primary);font-weight:700}
.defect-tbl{width:100%;border-collapse:collapse;font-size:11px}
.defect-tbl th{
  background:#505984;color:#fff;padding:4px 3px;font-size:9.5px;font-weight:600;
  border:1px solid #44506f;text-align:center;line-height:1.25;
}
.defect-tbl td{
  border:1px solid #e2e8f0;padding:1px;text-align:center;
}
.defect-tbl td input,.defect-tbl td select{
  width:100%;border:0;padding:4px 4px;font-size:11.5px;outline:none;background:transparent;
}
.defect-tbl td input:focus,.defect-tbl td select:focus{background:#fffbe6;box-shadow:inset 0 0 0 1px #1e88c7}
.defect-tbl .rno{font-size:10px;color:#94a3b8;font-variant-numeric:tabular-nums}
/* 必填标记 (依 require_value) */
.defect-tbl input.req,.defect-tbl select.req{
  background:#fff5f5;box-shadow:inset 0 0 0 1px #f0a0a0;
}
.defect-tbl select.g4{background:#fff3e0;font-weight:600}
.defect-tbl select.g5{background:#ffebee;font-weight:700}

/* ================= IDMS Manhole Record Card (复刻原 editinfo.html) ================= */
.idms-card{border:1px solid #b9c6d6;border-radius:4px;overflow:hidden;background:#fff}
.idms-head{
  background:#2c3e5d;color:#fff;text-align:center;padding:7px;font-size:13px;
  font-weight:700;letter-spacing:1.2px;
}
.idms-t,.idms-pipe{width:100%;border-collapse:collapse;font-size:10.5px;table-layout:fixed}
.idms-t td,.idms-pipe td,.idms-pipe th{
  border:1px solid #c9d5e2;padding:2px 3px;vertical-align:middle;
}
.idms-t .lb{background:#eef3f9;color:#334155;font-weight:600;font-size:10px;white-space:nowrap}
.idms-t .nc{background:#f8fafc;border-color:#e6edf5}
.idms-t .yc{background:#fff}
.idms-t .sec{
  background:#4a5d7e;color:#fff;font-weight:700;font-size:10.5px;
  letter-spacing:1px;padding:4px 8px;
}
.idms-t input,.idms-t select,.idms-pipe input,.idms-pipe select{
  width:100%;border:0;background:transparent;padding:2px 3px;font-size:10.5px;
  outline:none;color:#1e293b;
}
.idms-t input:focus,.idms-t select:focus,
.idms-pipe input:focus,.idms-pipe select:focus{background:#fffbe6;box-shadow:inset 0 0 0 1px #1e88c7}
.idms-pipe th{background:#eef3f9;font-weight:600;font-size:9.5px;color:#334155;padding:3px}
.idms-pipe .ph th{text-align:center;line-height:1.25}
.idms-pipe .rno{font-size:9.5px;color:#94a3b8}
.idms-pipe input[placeholder]{color:#475569}
/* GIS 关联提示条 */
.gis-link{
  margin-bottom:10px;padding:7px 11px;background:#eef7ff;border:1px solid #b9dcf5;
  border-radius:5px;font-size:11.5px;color:#0f4c81;
}
.gis-link b{font-family:ui-monospace,Consolas,monospace}

/* ---------- 重叠要素切换 ---------- */
.hitswitch{display:flex;flex-wrap:wrap;gap:5px}
.hititem{
  font-size:10.5px;padding:3px 9px;border-radius:12px;cursor:pointer;
  background:#fff;border:1px solid var(--c-border);color:#334155;
  transition:.12s;white-space:nowrap;
}
.hititem:hover{border-color:var(--c-primary-l);background:#f1f8fd}
.hititem.on{background:var(--c-primary);border-color:var(--c-primary);color:#fff;font-weight:600}

/* ============================================================
   项目列表（進行中 / 已完成按年折叠）
   ============================================================ */
.plist{display:flex;flex-direction:column;gap:0}
.pstats{
  display:flex;gap:14px;padding:8px 11px;background:#f8fafc;border:1px solid var(--c-border);
  border-radius:6px;margin:0 7px 8px;font-size:11px;color:var(--c-muted);
}
.pstats b{color:var(--c-primary);font-size:14px;font-variant-numeric:tabular-nums;margin-right:2px}

.btn.block{display:block;width:calc(100% - 14px);margin:0 7px 10px}
.ro-hint{
  margin:0 7px 10px;padding:7px 11px;background:#fef3c7;border:1px solid #fcd34d;
  border-radius:5px;font-size:11px;color:#92400e;
}

.pgroup{margin:0 7px 12px}
.pghead{
  display:flex;align-items:center;gap:8px;padding:6px 4px 5px;
  border-bottom:1px solid var(--c-border);margin-bottom:6px;
}
.pgt{font-size:11.5px;font-weight:700;color:var(--c-primary);letter-spacing:.4px}
.pgc{
  font-size:10px;background:var(--c-primary);color:#fff;border-radius:9px;
  padding:1px 7px;font-variant-numeric:tabular-nums;
}

.yeargroup{border:1px solid var(--c-border);border-radius:6px;margin-bottom:7px;overflow:hidden;background:#fff}
.yearhead{
  display:flex;align-items:center;gap:8px;padding:8px 11px;cursor:pointer;
  background:#f8fafc;user-select:none;transition:.12s;
}
.yearhead:hover{background:#eef4fa}
.yeargroup.open .yearhead{border-bottom:1px solid var(--c-border)}
.ych{font-size:10px;color:var(--c-primary);width:10px}
.yt{font-size:12.5px;font-weight:700;color:var(--c-text)}
.yc{font-size:10.5px;color:var(--c-muted)}
.ysc{margin-left:auto;font-size:10.5px;color:var(--c-muted);font-variant-numeric:tabular-nums}
.yearbody{padding:6px}
.yearbody:empty{display:none}

.projrow{
  border:1px solid var(--c-border);border-radius:6px;padding:8px 9px;margin-bottom:5px;
  background:#fff;transition:.12s;
}
.projrow:hover{border-color:var(--c-primary-l);box-shadow:var(--sh-sm)}
.pr-name{
  font-weight:600;font-size:12px;line-height:1.35;cursor:pointer;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  word-break:break-word;
}
.pr-name:hover{color:var(--c-primary);text-decoration:underline}
.pr-meta{
  display:flex;gap:5px;flex-wrap:wrap;align-items:center;margin-top:5px;
  font-size:9.8px;color:var(--c-muted);font-variant-numeric:tabular-nums;
}
.pr-std{background:#eef4fa;color:var(--c-primary);border-radius:3px;padding:0 4px;font-weight:700}
.pr-assignee{color:#7c3aed;font-weight:600}
.pr-sub{
  display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:3px;
  font-size:9.8px;color:var(--c-muted);font-variant-numeric:tabular-nums;
}
.pr-sub .pm1{color:var(--c-primary);font-weight:700}
.pr-acts{display:flex;gap:3px;flex-wrap:wrap;margin-top:6px}

/* 紧凑图标按钮 */
.pbtn{
  display:inline-flex;align-items:center;gap:2px;border:1px solid var(--c-border);
  background:#fff;color:var(--c-primary);border-radius:4px;padding:2px 5px;
  font-size:9.8px;cursor:pointer;transition:.12s;font-family:inherit;line-height:1.5;
}
.pbtn i{font-style:normal;font-size:10px;opacity:.8}
.pbtn:hover{background:#f1f7fd;border-color:var(--c-primary-l)}
.pbtn.danger{color:#b91c1c}
.pbtn.danger:hover{background:#fef2f2;border-color:#fca5a5}

/* 状态徽章 */
.stbadge{
  display:inline-flex;align-items:center;gap:3px;font-size:9.8px;font-weight:700;
  border-radius:3px;padding:1px 5px;letter-spacing:.2px;white-space:nowrap;
}
.stbadge.draft{background:#f1f5f9;color:#475569}
.stbadge.doing{background:#dbeafe;color:#1d4ed8}
.stbadge.wait{background:#fef3c7;color:#b45309}
.stbadge.done{background:#dcfce7;color:#15803d}
.stbadge.reject{background:#fee2e2;color:#b91c1c}

/* 评分徽章 */
.scbadge{
  display:inline-flex;align-items:center;gap:2px;font-size:9.8px;font-weight:800;
  border-radius:3px;padding:1px 5px;font-variant-numeric:tabular-nums;white-space:nowrap;
}
.scbadge.rA{background:#dcfce7;color:#15803d}
.scbadge.rB{background:#dbeafe;color:#1d4ed8}
.scbadge.rC{background:#fef3c7;color:#b45309}
.scbadge.rD{background:#fee2e2;color:#b91c1c}

/* 只读横幅 */
.ro-banner{
  margin:12px 18px 0;padding:8px 13px;background:#f1f5f9;border:1px solid var(--c-border);
  border-left:3px solid var(--c-primary-l);border-radius:4px;font-size:11.5px;color:var(--c-muted);
}

/* 面板标题上的规范徽标 */
.ph-std{
  font-size:9.5px;font-weight:700;color:var(--c-primary);background:#eef4fa;
  border:1px solid #cfe0f0;border-radius:3px;padding:1px 5px;letter-spacing:.3px;
}

/* ============================================================
   IDMS Manhole Record Card —— 完整版样式
   ============================================================ */
.idms-head{background:linear-gradient(180deg,#0f4c81,#155e9e);color:#fff;padding:10px 14px;
  display:flex;align-items:baseline;gap:12px}
.idms-head .ih-title{font-size:15px;font-weight:800;letter-spacing:.4px}
.idms-head .ih-sub{font-size:10px;opacity:.85}
.idms-t .req{color:#dc2626;font-weight:800;margin-left:2px}
.idms-t .ss{font-size:8.5px;color:#94a3b8;font-weight:400}
.idms-t .split{display:flex;align-items:center;gap:3px}
.idms-t .split i{font-style:normal;color:#94a3b8}
.idms-t .split input{min-width:0}

/* 管位表：内容较多，允许横向滚动 */
.idms-pipe{min-width:760px}
.idms-pipe th{background:#eef3f9;color:#334155;font-size:8.6px;line-height:1.25;
  padding:3px 2px;border:1px solid #d8e2ee;font-weight:700;text-align:center}
.idms-pipe td{padding:1px 2px;border:1px solid #e6edf5;text-align:center}
.idms-pipe .rno{font-size:9px;color:#94a3b8}
.idms-pipe input,.idms-pipe select{width:100%;font-size:9.6px;padding:1px 2px}
.idms-card>div:has(> .idms-pipe){overflow-x:auto}

/* 构件照片按钮与缩略图 */
.ph-btn{
  border:1px dashed #93b4d4;background:#f4f9fe;color:#0f4c81;border-radius:3px;
  font-size:9px;padding:1px 5px;cursor:pointer;font-family:inherit;white-space:nowrap;
}
.ph-btn:hover{background:#e6f0fa;border-color:#0f4c81}
.ph-thumb{display:inline-block;width:46px;height:34px;line-height:32px;border:1px solid #e2e8f0;
  border-radius:3px;background:#f8fafc;color:#cbd5e1;font-size:9px;overflow:hidden}
.ph-thumb img{width:100%;height:100%;object-fit:cover;cursor:pointer;display:block}

/* 補充危害项网格 */
.idms-extra{border-top:1px solid #b9c6d6}
.idms-extra .sec{background:#dfe9f4;color:#0f4c81;font-weight:800;font-size:10px;
  letter-spacing:.3px;padding:4px 10px}
.ex-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:0}
.ex-item{display:flex;flex-direction:column;gap:1px;padding:3px 5px;
  border-right:1px solid #e6edf5;border-bottom:1px solid #e6edf5;min-width:0}
.ex-item label{font-size:9px;color:#475569;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis}
.ex-item input{font-size:10px;padding:1px 3px;border:1px solid #dbe3ec;border-radius:2px}

/* Cover type 勾选 */
.ct-row{display:flex;flex-wrap:wrap;gap:4px 12px}
.ct-chk{display:flex;align-items:center;gap:3px;font-size:9.6px;color:#334155;
  cursor:pointer;white-space:nowrap}
.ct-chk input{margin:0;width:12px;height:12px;cursor:pointer}

/* 手绘图 */
.idms-sketch{border-top:1px solid #b9c6d6}
.idms-sketch .sec{background:#dfe9f4;color:#0f4c81;font-weight:800;font-size:10px;
  letter-spacing:.3px;padding:4px 10px}
.sk-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;padding:9px}
.sk-box{border:1px solid #dbe3ec;border-radius:4px;overflow:hidden;background:#fff}
.sk-cap{background:#f8fafc;border-bottom:1px solid #dbe3ec;padding:4px 8px;
  font-size:9.6px;font-weight:700;color:#475569}
.sk-canvaswrap{position:relative;background:#fff;min-height:200px;display:flex;
  align-items:center;justify-content:center}
.sk-canvas{width:100%;height:auto;display:block}
.sk-img{width:100%;height:auto;display:block}
.sk-img.hidden{display:none}
.sk-act{display:flex;gap:5px;padding:5px 8px;border-top:1px solid #eef2f7;flex-wrap:wrap}

.idms-foot{padding:7px 12px;background:#f8fafc;border-top:1px solid #dbe3ec;
  font-size:9.4px;color:#64748b}

/* 窄屏适配 */
@media (max-width:1180px){
  .ex-grid{grid-template-columns:repeat(3,1fr)}
  .sk-grid{grid-template-columns:1fr}
}

/* 必填项提示条（替代阻塞式 confirm，避免顶掉编辑卡片） */
.miss-warn{
  margin:0 0 10px;padding:8px 12px;background:#fef2f2;border:1px solid #fca5a5;
  border-left:3px solid #dc2626;border-radius:4px;font-size:11.5px;color:#991b1b;
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
}
.miss-warn b{font-weight:700}
.miss-warn .mw-act{margin-left:auto;display:flex;gap:6px}

/* ================= 系統管理（使用者 / 機構 / 日誌） ================= */
.mgbar{
  display:flex;align-items:center;gap:9px;margin-bottom:12px;
  padding-bottom:11px;border-bottom:1px solid var(--c-border);
}
.mgbar.wrap{flex-wrap:wrap}
.mgbar input,.mgbar select{
  height:30px;padding:0 9px;border:1px solid var(--c-border);border-radius:5px;
  background:#fff;color:var(--c-text);font-size:12px;outline:none;
}
.mgbar input:focus,.mgbar select:focus{border-color:var(--c-primary-l);box-shadow:0 0 0 2px rgba(30,136,199,.12)}
.mgbar input[type=date]{width:132px}

.tblwrap{max-height:calc(78vh - 190px);overflow:auto;border-radius:7px}
.tblwrap .tbl{box-shadow:none}
.tblwrap .tbl thead th{position:sticky;top:0;z-index:2}
.tbl td.act{white-space:nowrap}
.tbl td.act .btn{margin-right:3px}
.tbl tr.dim{opacity:.55}
.tbl .mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11.5px}
.tbl .mono.sm{font-size:11px}
.tbl .empty{text-align:center;color:var(--c-muted);padding:26px 0}

/* 狀態小標籤 */
.pill{
  display:inline-block;padding:1px 7px;border-radius:20px;font-size:10.5px;
  font-weight:700;line-height:1.65;white-space:nowrap;
  background:#eef2f7;color:var(--c-muted);
}
.pill.ok{background:#dcfce7;color:#15803d}
.pill.off{background:#fee2e2;color:#b91c1c}
.pill.on{background:#dbeafe;color:#1d4ed8}
.pill.edit{background:#fef3c7;color:#b45309}
.pill.del{background:#fee2e2;color:#b91c1c}

/* 表單兩欄網格 */
.form2{
  display:grid;grid-template-columns:112px 1fr;gap:10px 12px;align-items:center;
}
.form2>label{
  font-size:12px;color:var(--c-muted);font-weight:600;text-align:right;
}
.form2>input,.form2>select{
  height:32px;padding:0 10px;border:1px solid var(--c-border);border-radius:5px;
  font-size:12.5px;color:var(--c-text);background:#fff;outline:none;width:100%;
}
.form2>input:focus,.form2>select:focus{
  border-color:var(--c-primary-l);box-shadow:0 0 0 2px rgba(30,136,199,.12);
}
.form2>.hint{
  grid-column:2;font-size:11px;color:var(--c-muted);line-height:1.6;margin-top:-4px;
}
.form2>.hint[style*="1/-1"]{grid-column:1/-1}
.req{color:var(--c-danger)}
.formerr{
  margin-top:12px;min-height:17px;font-size:12px;color:var(--c-danger);font-weight:600;
}
.formerr:not(:empty){
  padding:8px 11px;background:#fef2f2;border:1px solid #fecaca;border-radius:5px;
}
.lgbody{min-height:180px}
.lgbody .empty.err{color:var(--c-danger)}
.tbl .btn.danger-t{color:var(--c-danger)}
.tbl .btn.danger-t:hover{background:#fef2f2;border-color:#fecaca;color:var(--c-danger)}

/* 使用者下拉：管理員入口 */
.user-menu{position:relative;display:inline-flex;align-items:center}
.tb-user{
  cursor:pointer;user-select:none;display:inline-flex;align-items:center;gap:6px;
}
.tb-user::after{
  content:"▾";font-size:9px;opacity:.6;transition:.15s;
}
.tb-user:hover{color:var(--c-primary)}
.umenu{
  position:absolute;top:calc(100% + 8px);right:0;min-width:172px;z-index:120;
  background:#fff;border:1px solid var(--c-border);border-radius:8px;
  box-shadow:var(--sh-md);padding:5px;font-size:12.5px;
}
.umenu button{
  display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;
  border:0;background:none;border-radius:5px;cursor:pointer;
  color:var(--c-text);font-size:12.5px;text-align:left;white-space:nowrap;
}
.umenu button:hover{background:#f1f7fd;color:var(--c-primary)}
.umenu button .ic{width:14px;text-align:center;opacity:.75}
.umenu .sep{height:1px;background:var(--c-border);margin:4px 2px}

/* ---------- 手機 / 平板自適應（H5 預留） ---------- */
@media (max-width:820px){
  .tblwrap{max-height:none}
  .mgbar{gap:7px}
  .mgbar input,.mgbar select{flex:1 1 auto;min-width:110px}
  .form2{grid-template-columns:1fr;gap:5px}
  .form2>label{text-align:left;margin-top:6px}
  .form2>.hint,.form2>.hint[style*="1/-1"]{grid-column:1}
  .modal-card.wide{width:100%}
  .tbl th:nth-child(5),.tbl td:nth-child(5){display:none}
}
