* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: -apple-system, "Microsoft YaHei", sans-serif; background: #f4f6f9; color: #222; }
.hidden { display: none !important; }

/* 登录 */
.login-box { width: 320px; margin: 12vh auto; background: #fff; padding: 28px; border-radius: 10px; box-shadow: 0 4px 20px rgba(0,0,0,.08); }
.login-box h2 { margin-bottom: 18px; font-size: 18px; }
.login-box input { width: 100%; padding: 10px; margin-bottom: 12px; border: 1px solid #d9dde3; border-radius: 6px; }
.login-box button { width: 100%; padding: 10px; background: #2563eb; color: #fff; border: none; border-radius: 6px; cursor: pointer; }
.login-box .err { color: #e04545; font-size: 13px; min-height: 18px; }
.login-box .hint { color: #999; font-size: 12px; margin-top: 8px; text-align: center; }

/* 布局 */
header { height: 52px; background: #1f2a44; color: #fff; display: flex; align-items: center; justify-content: space-between; padding: 0 18px; }
header .title { font-size: 16px; font-weight: 600; }
header .user { display: flex; align-items: center; gap: 12px; font-size: 14px; }
header #logoutBtn { background: #38507f; color: #fff; border: none; padding: 6px 12px; border-radius: 5px; cursor: pointer; }
/* 页头小入口：根证书下载页（工具型入口，弱化显示，不占导航栏） */
header .ca-link { color: #b9c4dd; font-size: 13px; line-height: 1; text-decoration: none; padding: 6px 8px; border-radius: 5px; white-space: nowrap; }
header .ca-link:hover { background: #38507f; color: #fff; }
header .ca-link:active { background: #2563eb; color: #fff; }

/* 记录上报参数条（账号管理页顶部，服务端下发） */
.track-cfg { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; background: #fff;
  border: 1px solid #e6eaf0; border-radius: 8px; padding: 10px 14px; margin: 0 0 12px; font-size: 13px; }
.track-cfg .tc-label { font-weight: 600; color: #1f2a44; }
.track-cfg select { padding: 6px 8px; border: 1px solid #d9dde3; border-radius: 6px; font-size: 13px; background: #fff; color: #222; }
.track-cfg button { background: #2563eb; color: #fff; border: none; padding: 6px 14px; border-radius: 6px; cursor: pointer; font-size: 13px; }
.track-cfg button:disabled { background: #c3cee0; cursor: not-allowed; }
.track-cfg .tc-hint { color: #7a8699; font-size: 12px; }
.track-cfg .tc-hint.ok { color: #1a9c5b; }
.track-cfg .tc-hint.err { color: #e04545; }

/* 顶部导航 */
.topnav { background: #28365a; display: flex; gap: 6px; padding: 8px 18px; }
.topnav button { background: transparent; color: #b9c4dd; border: none; padding: 8px 16px; border-radius: 6px; cursor: pointer; font-size: 14px; }
.topnav button.active { background: #2563eb; color: #fff; font-weight: 600; }
.topnav button .nav-badge { display: inline-block; min-width: 16px; padding: 0 5px; margin-left: 4px; font-size: 11px; line-height: 16px; color: #fff; background: #e04545; border-radius: 9px; text-align: center; }
.topnav button:not(.active) .nav-badge { background: #e04545; }

/* 资料审核面板 */
#profileMgmt { padding: 18px; overflow-y: auto; height: calc(100vh - 52px - 45px); }
.pc-item { background: #fff; border-radius: 10px; padding: 14px 16px; margin-bottom: 12px; box-shadow: 0 1px 4px rgba(0,0,0,.05); border-left: 4px solid #f0a020; }
.pc-item.s-approved { border-left-color: #2ecc71; }
.pc-item.s-rejected { border-left-color: #e04545; }
.pc-item.s-pending { border-left-color: #f0a020; }
.pc-head { display: flex; justify-content: space-between; align-items: center; }
.pc-worker { font-size: 15px; font-weight: 700; color: #1f2a44; }
.pc-worker .pc-team { font-size: 12px; color: #888; font-weight: 400; margin-left: 8px; }
.pc-badge { font-size: 12px; color: #fff; border-radius: 10px; padding: 2px 10px; }
.pc-badge.b-pending { background: #f0a020; } .pc-badge.b-approved { background: #2ecc71; } .pc-badge.b-rejected { background: #e04545; }
.pc-time { font-size: 12px; color: #999; margin-top: 2px; }
.pc-fields { margin-top: 10px; }
.pc-field { display: flex; align-items: flex-start; gap: 10px; padding: 6px 0; border-top: 1px dashed #eee; font-size: 13px; }
.pc-field:first-child { border-top: none; }
.pc-fk { flex: 0 0 64px; color: #666; }
.pc-fv { flex: 1; }
.pc-old { color: #999; text-decoration: line-through; }
.pc-new { color: #1f8a4c; font-weight: 600; }
.pc-del-btn { width: 18px; height: 18px; border-radius: 4px; border: none; background: #f0f0f0; color: #999; cursor: pointer; font-size: 12px; line-height: 16px; }
.pc-avatar-row { display: flex; gap: 16px; align-items: center; }
.pc-avatar-row img { width: 48px; height: 48px; border-radius: 50%; object-fit: cover; border: 1px solid #e0e4ea; }
.pc-arr { color: #bbb; }
.pc-review { margin-top: 10px; padding-top: 10px; border-top: 1px solid #eee; font-size: 12px; color: #888; }
.pc-actions { display: flex; gap: 10px; margin-top: 10px; }
.pc-actions button { flex: 1; padding: 9px; border: none; border-radius: 8px; font-size: 14px; cursor: pointer; }
.pc-approve { background: #2ecc71; color: #fff; }
.pc-reject { background: #f4f6f9; color: #c0392b; border: 1px solid #f3c4c4 !important; }
.pc-reason { width: 100%; margin-top: 8px; padding: 8px 10px; border: 1px solid #e0e4ea; border-radius: 8px; font-size: 13px; box-sizing: border-box; font-family: inherit; }
.pc-empty { text-align: center; color: #999; padding: 40px 0; font-size: 14px; }

/* 内容管理（公告 & 知识库） */
#announcementMgmt, #knowledgeMgmt { padding: 18px; overflow-y: auto; height: calc(100vh - 52px - 45px); }
.mgmt-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; max-width: 1100px; margin: 0 auto; }
.mgmt-card { background: #fff; border-radius: 12px; padding: 18px; box-shadow: 0 1px 6px rgba(0,0,0,.05); }
.mgmt-card h3 { font-size: 16px; margin-bottom: 14px; color: #1f2a44; }
.mgmt-form { display: flex; flex-direction: column; gap: 10px; margin-bottom: 16px; }
.mgmt-form input, .mgmt-form textarea { width: 100%; padding: 10px; border: 1px solid #d9dde3; border-radius: 6px; font-size: 14px; font-family: inherit; }
.mgmt-form textarea { min-height: 70px; resize: vertical; }
.mgmt-form .row { display: flex; gap: 10px; align-items: center; }
.mgmt-form .row input { flex: 1; }
.mgmt-form .chk { display: flex; align-items: center; gap: 6px; font-size: 14px; color: #555; white-space: nowrap; }
.mgmt-form button { padding: 10px; background: #2563eb; color: #fff; border: none; border-radius: 6px; cursor: pointer; font-size: 14px; }
.mgmt-list { display: flex; flex-direction: column; gap: 10px; }
.mgmt-item { border: 1px solid #e6e9ee; border-radius: 8px; padding: 12px; }
.mgmt-item .mi-top { display: flex; justify-content: space-between; align-items: center; gap: 8px; }
.mgmt-item .mi-title { font-weight: 600; color: #1f2a44; font-size: 14px; }
.mgmt-item .mi-meta { font-size: 12px; color: #999; margin: 4px 0; }
.mgmt-item .mi-body { font-size: 13px; color: #444; white-space: pre-wrap; line-height: 1.5; }
.mgmt-item .mi-link { font-size: 13px; color: #2563eb; word-break: break-all; }
.mgmt-item .mi-actions { display: flex; gap: 8px; margin-top: 8px; }
.mgmt-item .mi-actions button { padding: 5px 12px; border: none; border-radius: 6px; font-size: 13px; cursor: pointer; }
.mgmt-item .mi-actions .edit { background: #eef1f6; color: #555; }
.mgmt-item .mi-actions .del { background: #fde8e8; color: #e04545; }
.filter-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: 14px; padding: 10px; background: #f6f8fb; border-radius: 8px; }
.filter-bar .fb-label { font-size: 13px; color: #555; }
.filter-bar .fb-sep { font-size: 13px; color: #999; }
.filter-bar input[type=date] { padding: 6px 8px; border: 1px solid #d9dde3; border-radius: 6px; font-size: 13px; font-family: inherit; }
.filter-bar .fb-kw { flex: 1; min-width: 160px; padding: 6px 10px; border: 1px solid #d9dde3; border-radius: 6px; font-size: 13px; font-family: inherit; }
.filter-bar .fb-btn { padding: 6px 14px; background: #2563eb; color: #fff; border: none; border-radius: 6px; cursor: pointer; font-size: 13px; white-space: nowrap; }
.filter-bar .fb-btn.ghost { background: #eef1f6; color: #555; }

/* 记录：段耗时标签 */
.traj-seg { background: #e04545; color: #fff; border-radius: 10px; padding: 1px 6px; font-size: 11px; white-space: nowrap; text-align: center; }

.layout { display: grid; grid-template-columns: 260px 1fr; height: calc(100vh - 52px); }
.left, .right { background: #fff; overflow-y: auto; padding: 14px; border-right: 1px solid #e6e9ee; }
.right { border-right: none; border-left: 1px solid #e6e9ee; }

.cards { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 14px; }
.card { background: #f7f9fc; border: 1px solid #e6e9ee; border-radius: 8px; padding: 10px; text-align: center; }
.card .num { font-size: 22px; font-weight: 700; color: #2563eb; }
.card .lbl { font-size: 12px; color: #888; margin-top: 2px; }
.card.clickable { cursor: pointer; transition: transform .05s ease, box-shadow .1s ease; }
.card.clickable:hover { background: #eef4ff; border-color: #2563eb; box-shadow: 0 2px 8px rgba(37,99,235,.12); }
.card.clickable:active { transform: scale(0.98); }

.section-title { font-size: 13px; font-weight: 600; color: #555; margin: 10px 0 8px; display: flex; align-items: center; justify-content: space-between; }

/* 人员列表 */
.worker-list { display: flex; flex-direction: column; gap: 8px; }
.worker { display: flex; align-items: center; gap: 8px; padding: 8px 10px; border: 1px solid #e6e9ee; border-radius: 8px; cursor: pointer; }
.worker:hover { background: #f0f5ff; }
.worker.active { border-color: #2563eb; background: #eaf1ff; }
.dot { width: 9px; height: 9px; border-radius: 50%; background: #c3c8d0; flex: 0 0 auto; }
.dot.on { background: #2ecc71; }
.worker .nm { font-size: 14px; font-weight: 600; }
.worker .mt { font-size: 11px; color: #999; margin-left: auto; }

/* 作业人员筛选 */
.worker-filter { display: flex; flex-direction: column; gap: 6px; margin-bottom: 10px; }
.worker-filter input, .worker-filter select { padding: 6px 8px; border: 1px solid #d9dde3; border-radius: 6px; font-size: 12px; background: #fff; }
.worker-filter input::placeholder { color: #aaa; }
.worker-filter button { padding: 6px; background: #eef1f6; color: #555; border: none; border-radius: 6px; cursor: pointer; font-size: 12px; }
.worker-filter button:hover { background: #dde3ed; }

/* 地图 */
.center { position: relative; display: flex; flex-direction: column; min-width: 0; }
.map-bar { display: flex; align-items: center; gap: 10px; padding: 6px 10px; background: #1f2a44; color: #fff; font-size: 13px; z-index: 600; }
.map-bar select { padding: 3px 6px; border-radius: 5px; border: none; font-size: 13px; }
.map-bar button { background: #2563eb; color: #fff; border: none; padding: 4px 12px; border-radius: 5px; cursor: pointer; font-size: 13px; }
.map-bar .base-tip { color: #cfe0ff; font-size: 12px; }
#map { width: 100%; flex: 1; position: relative; }
.map-tip { position: absolute; left: 12px; bottom: 12px; background: rgba(255,255,255,.9); padding: 6px 10px; border-radius: 6px; font-size: 12px; color: #555; z-index: 500; }

/* 地址搜索框（地图左上角，用于核对工人停留位置） */
.geo-search { position: absolute; left: 12px; top: 12px; width: 320px; max-width: calc(100% - 24px); z-index: 700; font-size: 13px; }
.geo-search .gs-box { display: flex; align-items: center; background: #fff; border-radius: 6px; box-shadow: 0 2px 10px rgba(0,0,0,.18); overflow: hidden; }
.geo-search .gs-box input { flex: 1; min-width: 0; border: none; outline: none; padding: 8px 10px; font-size: 13px; color: #1f2937; background: transparent; }
.geo-search .gs-box input::placeholder { color: #9ca3af; }
.geo-search .gs-box button { flex: none; width: 32px; height: 32px; border: none; background: none; color: #9ca3af; font-size: 18px; cursor: pointer; line-height: 1; }
.geo-search .gs-box button:hover { color: #e04545; }
.geo-search .gs-list { position: absolute; left: 0; right: 0; top: calc(100% + 4px); background: #fff; border-radius: 6px; box-shadow: 0 4px 16px rgba(0,0,0,.18); max-height: 320px; overflow-y: auto; display: none; }
.geo-search .gs-list.show { display: block; }
.geo-search .gs-item { padding: 8px 10px; cursor: pointer; border-bottom: 1px solid #f2f4f7; }
.geo-search .gs-item:last-child { border-bottom: none; }
.geo-search .gs-item:hover, .geo-search .gs-item.hover { background: #f0f5ff; }
.geo-search .gs-item .gs-name { font-weight: 600; color: #1f2937; }
.geo-search .gs-item .gs-name em { font-style: normal; color: #2563eb; }
.geo-search .gs-item .gs-addr { font-size: 11.5px; color: #9ca3af; margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.geo-search .gs-empty { padding: 12px 10px; color: #9ca3af; text-align: center; font-size: 12.5px; }
.geo-search .gs-loading { padding: 12px 10px; color: #2563eb; text-align: center; font-size: 12.5px; }

/* 搜索打点标记（📍 醒目，与工人停留点叠加比对） */
.search-hit-marker { background: transparent; border: none; }
.search-hit-pin { width: 30px; height: 30px; margin: 0 auto; display: flex; align-items: center; justify-content: center; font-size: 22px; filter: drop-shadow(0 2px 5px rgba(0,0,0,.4)); }
.search-hit-label { margin-top: 2px; padding: 3px 8px; background: rgba(37,99,235,.94); color: #fff; border-radius: 4px; font-size: 12px; white-space: nowrap; text-align: center; box-shadow: 0 2px 6px rgba(0,0,0,.3); }


/* 任务表单 */
.task-form { display: flex; flex-direction: column; gap: 8px; margin-bottom: 8px; }
.task-form input, .task-form textarea, .task-form select { padding: 8px; border: 1px solid #d9dde3; border-radius: 6px; font-size: 13px; }
.task-form .row { display: flex; gap: 8px; }
.task-form .row select { flex: 1; }
.task-form button { padding: 9px; background: #2563eb; color: #fff; border: none; border-radius: 6px; cursor: pointer; }
.mini { font-size: 12px; padding: 3px 6px; border: 1px solid #d9dde3; border-radius: 5px; }

/* 任务看板：派发区（单条 + 批量） */
.dispatch-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; margin-top: 12px; }
.batch-box { border: 1px dashed #c7d0e0; border-radius: 8px; padding: 14px; display: flex; flex-direction: column; gap: 10px; align-self: start; }
.batch-box .batch-title { font-weight: 600; font-size: 14px; color: #2f3c5c; }
.batch-box input[type=file] { font-size: 12px; }
.batch-box .mini { align-self: flex-start; }
.mi-meta { font-size: 12px; min-height: 16px; }
.mi-meta.ok { color: #1f9d55; }
.mi-meta.err { color: #e04545; }
@media (max-width: 760px) { .dispatch-grid { grid-template-columns: 1fr; } }

/* 任务列表 */
.task-list { display: flex; flex-direction: column; gap: 8px; }
.task { border: 1px solid #e6e9ee; border-radius: 8px; padding: 8px 10px; font-size: 13px; cursor: pointer; }
.task:hover { border-color: #c7d4f5; background: #fafbff; }
/* 折叠态固定一行：箭头 + 工单号/标题（省略号）+ 照片数 + 状态，一张卡约 40px */
.task .t-h { display: flex; justify-content: flex-start; align-items: center; gap: 8px; }
/* 标题最多两行：不再单行省略（「工单号 + 区域网格 + 资源名」经常放不下，用户要求显示两行） */
.task .t-title {
  font-weight: 600; flex: 1 1 auto; min-width: 0; line-height: 1.45;
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;
  overflow: hidden; word-break: break-all;
}
.task.open .t-title { display: block; overflow: visible; }
.task .badge { flex: 0 0 auto; }
.task .t-exp {
  flex: 0 0 auto; width: 20px; height: 20px; padding: 0; border: none; border-radius: 5px;
  background: #eaf0fd; color: #2563eb; font-size: 11px; font-weight: 700; line-height: 20px;
  text-align: center; cursor: pointer; transition: background .15s, color .15s;
}
.task .t-exp:hover { background: #2563eb; color: #fff; }
.task .t-pic { flex: 0 0 auto; font-size: 11px; color: #8a94a6; }
/* 任务处理人数（2026-11-02 用户需求）：收起态就能看出几个人在干、有没有工人协助。
 * 1 人用灰色中性底，≥2 人（团队/协助）用蓝色强调，任务池待认领用虚线框。 */
.task .t-hp {
  flex: 0 0 auto; white-space: nowrap;
  font: 600 11px/1 ui-monospace, Consolas, monospace;
  font-variant-numeric: tabular-nums;
  color: #6b7280; background: #f3f4f6;
  border: 1px solid #e5e7eb; border-radius: 5px;
  padding: 3px 6px;
}
.task .t-hp-team { color: #1d4ed8; background: #eaf0fd; border-color: #c7d4f5; }
.task .t-hp-pool { color: #b45309; background: #fffaf0; border-color: #fde3b8; border-style: dashed; }
.task .t-hp-none { color: #9ca3af; background: #fafafa; border-color: #eceef1; }
/* 卡片收起态的派发 / 完成时间（2026-11-01 用户需求：外面一眼看出新增归档任务多少）
 * 用等宽字体 + tabular-nums，让时间数字纵向对齐，扫列表时不跳。 */
.task .t-tm {
  flex: 0 0 auto; white-space: nowrap;
  font: 600 11px/1 ui-monospace, Consolas, monospace;
  font-variant-numeric: tabular-nums;
  color: #6b7280; background: #f3f4f6;
  border: 1px solid #e5e7eb; border-radius: 5px;
  padding: 3px 6px;
}
.task .t-tm-done { color: #1f8a4c; background: #eafaf0; border-color: #bdebd0; }
/* 窄屏空间不足：只留「完成时间」（归档判断最需要的那个），派发时间收起仍可在展开区看到 */
@media (max-width: 640px) {
  .task .t-tm:not(.t-tm-done) { display: none; }
}
.task .t-body { margin-top: 8px; padding-top: 8px; border-top: 1px dashed #eef1f5; }
.task.open { border-color: #c7d4f5; background: #fafbff; }
/* 「继续显示」：分批渲染的加载更多 */
.tb-more { display: flex; justify-content: center; padding: 6px 0; }
.tb-more button {
  font-size: 13px; padding: 8px 18px; border: 1px dashed #c7d4e0; background: #fff;
  color: #2563eb; border-radius: 8px; cursor: pointer; font-family: inherit;
}
.tb-more button:hover { background: #f2f6ff; border-color: #9db6ee; }
.badge { font-size: 11px; padding: 2px 7px; border-radius: 10px; color: #fff; }
.b-pending { background: #f0a020; }
.b-accepted { background: #4098fc; }
.b-in_progress { background: #7b5cff; }
.b-review { background: #e8960a; }
.b-completed { background: #2ecc71; }
.b-rejected { background: #e04545; }
.task .t-meta { color: #888; font-size: 12px; margin: 4px 0; }
.task .t-report { background: #f7f9fc; border-radius: 6px; padding: 6px; margin-top: 6px; }
.task .t-report img { width: 56px; height: 56px; object-fit: cover; border-radius: 4px; margin: 3px; }

/* 上一轮上报标记（2026-10-24 用户需求：回退保留原信息） */
.stale-tag { display: inline-block; font-size: 10.5px; line-height: 1; padding: 2px 5px; border-radius: 4px;
  background: #fff4e5; color: #b26a00; border: 1px solid #ffd9a8; margin-right: 5px;
  vertical-align: 1px; white-space: nowrap; font-weight: normal; }
.task .t-report-prev { background: #fffaf2; border: 1px dashed #ffd9a8; color: #8a6d3b; }
.td-prev-sec .td-sec-t { color: #b26a00; }
.task .t-actions { margin-top: 6px; display: flex; gap: 6px; flex-wrap: wrap; }
.task .t-actions button { font-size: 12px; padding: 4px 8px; border: none; border-radius: 5px; cursor: pointer; background: #eef1f6; }
.task .t-actions .del { background: #fdeaea; color: #e04545; }

/* 任务看板头部 */
.tb-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 14px; flex-wrap: wrap; gap: 10px; }
.tb-head h3 { margin: 0; }
.tb-filters { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.tb-filters .mini { min-width: 90px; }

/* 手机端访问地址条 */
.net-bar { display: flex; align-items: center; gap: 10px; padding: 6px 18px; background: #eef3ff; border-bottom: 1px solid #d6e2ff; font-size: 13px; color: #33446a; }
.net-label { white-space: nowrap; }
.net-url { background: #fff; border: 1px solid #cdd9f0; border-radius: 5px; padding: 3px 8px; font-family: Consolas, Menlo, monospace; color: #2563eb; }
.net-copy { background: #2563eb; color: #fff; border: none; padding: 4px 12px; border-radius: 5px; cursor: pointer; }

/* 账号管理 */
#accountMgmt { padding: 18px; overflow-y: auto; height: calc(100vh - 52px - 45px); }
/* 账号管理下三个标签（人员录入 / 账号列表 / 角色调整）列都不少，
 * 全局 .mgmt-grid 的 1100px 上限在这里会剩一大片右侧空白，单独放宽 */
#accountMgmt .mgmt-grid { max-width: 1320px; }
.mgmt-form textarea { width: 100%; min-height: 70px; padding: 10px; border: 1px solid #d9dde3; border-radius: 6px; font-size: 14px; font-family: inherit; }
.mgmt-form .row { display: flex; gap: 10px; }
.mgmt-form .row input, .mgmt-form .row select { flex: 1; min-width: 0; }
.acc-filter input, .acc-filter select { flex: 1; min-width: 0; padding: 8px; border: 1px solid #d9dde3; border-radius: 6px; font-size: 14px; }
.acc-list { margin-top: 10px; display: flex; flex-direction: column; gap: 8px; }
.acc-item { display: flex; align-items: center; gap: 10px; background: #fff; border: 1px solid #eef1f6; border-radius: 8px; padding: 10px 12px; }
.acc-item .acc-chk { flex: 0 0 auto; width: 18px; height: 18px; }
.acc-item .acc-main { flex: 1; min-width: 0; }
.acc-item .acc-nm { font-size: 15px; font-weight: 600; }
.acc-item .acc-sub { font-size: 12px; color: #888; margin-top: 2px; }
.acc-item .acc-role { flex: 0 0 auto; font-size: 12px; color: #fff; border-radius: 10px; padding: 3px 10px; background: #4098fc; }
.acc-item .acc-role.r-super_admin, .acc-item .acc-role.r-admin { background: #e04545; }
.acc-item .acc-role.r-city_admin { background: #f0a020; }
.acc-item .acc-role.r-region_admin { background: #4098fc; }
.acc-item .acc-role.r-team_admin { background: #7b5cff; }
.acc-item .acc-role.r-worker { background: #2ecc71; }
.acc-item .acc-del { flex: 0 0 auto; font-size: 12px; padding: 5px 10px; border: none; border-radius: 5px; cursor: pointer; background: #fdeaea; color: #e04545; }
.acc-item .acc-dev { flex: 0 0 auto; font-size: 12px; padding: 5px 10px; border: none; border-radius: 5px; cursor: pointer; background: #edf5ff; color: #2563a9; }
#accList .empty { text-align: center; color: #999; padding: 30px 0; font-size: 14px; }
#accBatchFile { flex: 1; }
#accBatchBtn, #accRefresh { background: #2563eb; color: #fff; border: none; padding: 8px 14px; border-radius: 6px; cursor: pointer; font-size: 14px; }
#accBatchDel { background: #e04545; color: #fff; border: none; padding: 8px 14px; border-radius: 6px; cursor: pointer; font-size: 14px; }
.mi-meta { color: #888; font-size: 13px; margin-top: 6px; }
.mi-meta.ok { color: #2ecc71; }
.mi-meta.err { color: #e04545; }

/* 任务看板（独立页） */
#taskBoard { padding: 18px; overflow-y: auto; height: calc(100vh - 52px - 45px); }
.tb-tabs { display: flex; flex-wrap: wrap; gap: 10px; }
.tb-tab { background: #eef1f6; color: #555; border-radius: 9px; padding: 10px 16px; cursor: pointer; font-size: 14px; display: flex; align-items: center; gap: 8px; }
.tb-tab.active { background: #2563eb; color: #fff; font-weight: 600; }
.tb-cnt { display: inline-block; min-width: 20px; text-align: center; font-size: 12px; padding: 1px 7px; border-radius: 10px; background: rgba(0,0,0,.12); }
.tb-tab.active .tb-cnt { background: rgba(255,255,255,.28); }
.tb-list-item { display: flex; align-items: flex-start; gap: 10px; background: #fff; border: 1px solid #eef1f6; border-radius: 10px; padding: 12px 14px; margin-bottom: 10px; cursor: pointer; }
.tb-list-item:hover { border-color: #c7d4f5; }
.tb-list-item .tb-main { flex: 1; min-width: 0; }
.tb-list-item .tb-title { font-size: 15px; font-weight: 600; }
.tb-list-item .tb-sub { font-size: 12px; color: #888; margin-top: 3px; }
.tb-list-item .tb-badge { flex: 0 0 auto; font-size: 12px; color: #fff; border-radius: 10px; padding: 3px 10px; }
#taskBoard .empty { text-align: center; color: #999; padding: 30px 0; font-size: 14px; }
#taskModal .back { background: transparent; border: none; color: #888; font-size: 18px; cursor: pointer; }

/* 弹层（修改密码 / 任务详情）：全屏遮罩并置于所有内容之上，避免被地图等层级遮挡 */
.mask {
  position: fixed;
  inset: 0;
  z-index: 1000;
  background: rgba(0, 0, 0, .45);
  overflow: auto;
}
.sheet {
  position: relative;
  z-index: 1001;
  background: #fff;
  border-radius: 14px;
  box-shadow: 0 12px 40px rgba(0, 0, 0, .3);
  margin: 0 auto;
  overflow: hidden;
}
/* 弹窗头部：标题 + 关闭按钮分行对齐 */
.sheet .hd {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 18px;
  border-bottom: 1px solid #eef1f6;
  font-size: 16px;
  font-weight: 600;
  color: #1f2a44;
}
.sheet .hd button {
  width: 32px;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: #f4f6f9;
  border: none;
  border-radius: 8px;
  color: #666;
  font-size: 16px;
  cursor: pointer;
  line-height: 1;
}
.sheet .hd button:hover { background: #eef1f6; color: #333; }
/* 弹窗内容区内边距 */
.sheet .mgmt-form { padding: 18px; margin-bottom: 0; }
#taskModalBody { padding: 18px; }
/* 移动端已在自身样式中定义 .mask/.sheet，此处规则对管理端生效 */

/* 人员工作量看板表格：居中、更精致的卡片式表格 */
.wl-table-wrap {
  width: 100%;
  border-radius: 12px;
  /* 窄屏（人员表 7 列）靠容器横向滚动，不再被 overflow:hidden 裁掉 */
  overflow-x: auto;
  overflow-y: hidden;
  box-shadow: 0 2px 10px rgba(0,0,0,.08);
  border: 1px solid #e8ecf2;
  background: #fff;
}
.wl-table {
  width: 100%;
  min-width: 560px;
  border-collapse: collapse;
  font-size: 14px;
  text-align: center;
}
.wl-table thead { background: #1f2a44; color: #fff; }
.wl-table th {
  padding: 12px 8px;
  font-weight: 600;
  white-space: nowrap;
  letter-spacing: .5px;
}
.wl-table td {
  padding: 12px 8px;
  border-bottom: 1px solid #eef1f6;
  color: #333;
  vertical-align: middle;
}
.wl-table tbody tr:nth-child(even) { background: #f8fafc; }
.wl-table tbody tr:hover { background: #eef4ff; }
.wl-table tbody tr:last-child td { border-bottom: none; }
.wl-table td:first-child { font-weight: 600; color: #1f2a44; }
.wl-table .wl-empty {
  padding: 30px 0;
  color: #999;
  text-align: center;
  border-bottom: none;
}
/* 行政区统计：完成率进度条 + 合计行 + 提示行 */
.wl-rate { position: relative; display: flex; align-items: center; gap: 8px; min-width: 130px; }
.wl-rate-bar { height: 8px; border-radius: 4px; background: linear-gradient(90deg, #2ecc71, #27ae60); flex: 0 0 auto; max-width: 90px; }
.wl-rate-num { font-size: 12px; color: #1f8a4c; font-weight: 600; white-space: nowrap; }
.wl-table tfoot tr.wl-total td { background: #f0f4fa; font-weight: 700; color: #1f2a44; border-top: 2px solid #d9dde3; }
.wl-hint { font-size: 12px; color: #999; }

/* 工作量看板筛选栏：两行布局，日期一行、其它条件一行 */
.wl-filter {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-bottom: 12px;
}
/* 筛选栏单独成一张卡给两张表共用时，卡片自己已有内边距，不要再压一层底距 */
.wl-filter-card { padding: 10px 14px; }
.wl-filter-card .wl-filter { margin-bottom: 0; }
.wl-row {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-items: flex-end;
}
.wl-row .wl-field {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.wl-row .wl-field label {
  font-size: 12px;
  color: #666;
  white-space: nowrap;
}
/* 所有筛选控件统一高度与边框 */
.wl-row input,
.wl-row select,
.wl-row button {
  height: 36px;
  padding: 0 12px;
  border: 1px solid #d9dde3;
  border-radius: 6px;
  font-size: 14px;
  font-family: inherit;
  box-sizing: border-box;
  background: #fff;
}
.wl-row input::placeholder { color: #999; }
.wl-row button {
  border: none;
  cursor: pointer;
  padding: 0 16px;
  font-weight: 500;
}
.wl-row button:not(.ghost) { background: #2563eb; color: #fff; }
.wl-row button.ghost { background: #f4f6f9; color: #333; border: 1px solid #d9dde3; }
/* 日期字段固定宽度 */
.wl-row .wl-field input { width: 170px; flex: 0 0 auto; }
/* 第二行控件宽度 */
#wlRegion { width: 130px; flex: 0 0 auto; }
#wlTeam, #wlKw { flex: 1; min-width: 140px; max-width: 240px; }

/* 记录：当前上报位置「小人骑电动」图标
 * 2026-10-24：原来只有一个 32px 图标、zIndex 0，工人下班打卡后「最后上报点」与「终」
 * 完全重合，被起终点圆标（zIndexOffset 900+）整个盖住，用户根本看不见。
 * 现在 → 提到最上层 + 选中某人时常驻一枚「xx:xx 上报 · N 分钟前」小标签。 */
.scooter-marker { background: transparent; border: none; }
.scooter-wrap { width: 32px; height: 32px; margin: 0 auto; filter: drop-shadow(0 2px 3px rgba(0,0,0,.35)); }
.scooter-wrap svg { display: block; width: 100%; height: 100%; }
.scooter-label {
  margin-top: 1px; padding: 1px 6px; text-align: center; white-space: nowrap;
  font-size: 11px; line-height: 1.45; color: #17407e;
  background: rgba(255,255,255,.95); border: 1px solid #b9d2fb; border-radius: 5px;
  box-shadow: 0 1px 4px rgba(31,42,68,.18);
}

/* 记录：停留施工点标记，直接显示停留时长 */
.stay-marker { background: transparent; border: none; }
.stay-pin { width: 14px; height: 14px; margin: 0 auto; background: #e04545; border: 2px solid #fff; border-radius: 50%; box-shadow: 0 2px 6px rgba(0,0,0,.35); }
.stay-label { margin-top: 4px; padding: 3px 8px; background: rgba(31,42,68,.88); color: #fff; border-radius: 4px; font-size: 12px; white-space: nowrap; text-align: center; box-shadow: 0 2px 6px rgba(0,0,0,.25); }

/* 图片灯箱（审核放大） */
.lbx { position: fixed; inset: 0; z-index: 3000; background: rgba(0,0,0,.88); display: flex; align-items: center; justify-content: center; }
.lbx.hidden { display: none !important; }
.lbx-inner { display: flex; flex-direction: column; align-items: center; gap: 10px; max-width: 92vw; max-height: 92vh; }
.lbx-inner img { max-width: 92vw; max-height: 84vh; object-fit: contain; border-radius: 6px; box-shadow: 0 4px 30px rgba(0,0,0,.5); background: #fff; }
.lbx-bar { display: flex; align-items: center; gap: 14px; color: #cfd6e4; font-size: 13px; }
.lbx-bar button { background: #38507f; color: #fff; border: none; border-radius: 6px; padding: 6px 14px; font-size: 13px; cursor: pointer; }
.lbx-bar button:hover { background: #4a639b; }
.lbx-bar .lbx-prev, .lbx-bar .lbx-next { background: #2b3d63; }
.lbx-bar .lbx-prev:hover, .lbx-bar .lbx-next:hover { background: #38507f; }
.lbx-bar .lbx-close { background: transparent; border: 1px solid #5a6b8c; }
.lbx-bar .lbx-close:hover { background: #e04545; border-color: #e04545; }
/* 灯箱左右翻页：在大图两侧的悬浮箭头（同组多张时可用），鼠标移到图片上显示 */
.lbx-nav { position: absolute; top: 50%; transform: translateY(-50%); width: 44px; height: 44px; border-radius: 50%; background: rgba(43,61,99,.75); color: #fff; border: 1px solid rgba(255,255,255,.35); font-size: 22px; cursor: pointer; display: flex; align-items: center; justify-content: center; z-index: 3001; }
.lbx-nav:hover { background: rgba(56,80,127,.95); }
.lbx-nav.left { left: calc(50% - 46vw); }
.lbx-nav.right { right: calc(50% - 46vw); }
/* 可点击放大的图片统一手型 */
img[onclick*="openLightbox"] { cursor: zoom-in; }

/* ---------- 系统日志（仅超级管理员） ---------- */
.log-badge { display: inline-block; padding: 1px 8px; border-radius: 10px; font-size: 12px; }
.log-badge.ok { background: #e6f6ec; color: #1e8e4a; }
.log-badge.fail { background: #fdeaea; color: #c0392b; }
.log-fail-row td { background: #fffafa; }
.log-stat-row { display: flex; gap: 12px; flex-wrap: wrap; }
.log-stat { flex: 1; min-width: 130px; background: #f7f9fc; border: 1px solid #e6ebf3; border-radius: 8px; padding: 10px 14px; display: flex; flex-direction: column; gap: 4px; }
.log-stat span { font-size: 12px; color: #7b8794; }
.log-stat b { font-size: 20px; color: #1f2a44; }
.log-top { margin-top: 10px; font-size: 13px; color: #445; display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.log-chip { background: #eef3ff; color: #2563eb; border-radius: 12px; padding: 3px 10px; font-size: 12px; }
.log-chip b { margin-left: 4px; }
.log-trend { display: flex; align-items: flex-end; gap: 8px; margin-top: 10px; height: 70px; }
.log-bar { display: flex; flex-direction: column; align-items: center; justify-content: flex-end; gap: 4px; flex: 1; max-width: 70px; }
.log-bar i { display: block; width: 100%; background: linear-gradient(180deg, #6d9bff, #2563eb); border-radius: 3px 3px 0 0; }
.log-bar span { font-size: 11px; color: #8a94a6; }

/* 实时看板：有记录的日期快捷提示 */
.wf-days-tip { padding: 4px 8px 8px; font-size: 12px; color: #8a94a6; line-height: 1.9; }
.wf-days-tip .wf-days-hd { display: flex; align-items: center; gap: 6px; cursor: pointer; user-select: none;
  padding: 5px 8px; border: 1px solid #e4e9f1; border-radius: 8px; background: #f8fafc; color: #5a6577; font-size: 12px; }
.wf-days-tip .wf-days-hd:hover { background: #eef3fb; }
.wf-days-tip .wf-days-t { flex: 1; min-width: 0; line-height: 1.5; word-break: break-all; }
.wf-days-tip .wf-days-hd b { color: #2563eb; font-weight: 600; white-space: nowrap; }
.wf-days-tip .wf-days-arrow { font-size: 10px; color: #9aa4b5; width: 12px; }
.wf-days-tip .wf-days-body { padding: 6px 2px 2px; }
.wf-days-tip .wf-day { display: inline-block; margin: 0 6px 4px 0; padding: 2px 8px; border-radius: 10px; background: #eef1f6; color: #5a6577; text-decoration: none; cursor: pointer; }
.wf-days-tip .wf-day:hover { background: #dbe6ff; color: #2563eb; }
.wf-days-tip .wf-day.cur { background: #2563eb; color: #fff; font-weight: 600; }
.wf-days-tip .wf-day.cur:hover { background: #245fd4; }
.wf-days-tip .wf-day i { font-style: normal; margin-left: 4px; color: #7b8794; font-size: 11px; }
.wf-days-tip .wf-day.cur i { color: #dbe6ff; }
.wf-days-tip .wf-days-empty { color: #b0b7c3; }

/* 人员按区域分组折叠 */
.wgroup-hd { display: flex; align-items: center; gap: 6px; padding: 7px 10px; margin-top: 2px;
  background: #eef2f8; border: 1px solid #dfe5ee; border-radius: 8px; cursor: pointer;
  font-size: 13px; font-weight: 600; color: #3d4a5f; user-select: none; }
.wgroup-hd:hover { background: #e4ebf5; }
.wgroup-hd .wgroup-arrow { font-size: 10px; color: #8a94a6; width: 12px; }
.wgroup-hd .wgroup-n { margin-left: auto; font-size: 11px; font-weight: 500; color: #8a94a6;
  background: #fff; border: 1px solid #e4e9f1; border-radius: 10px; padding: 1px 8px; }
.wgroup-body { display: flex; flex-direction: column; gap: 8px; padding: 6px 0 2px 6px; }

/* 实时看板：记录显示模式切换（原始 / 平滑 / 贴路） */
.map-bar { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.traj-modes { display: flex; align-items: center; gap: 6px; font-size: 12px; }
.traj-modes .tm-label { color: #7b8794; margin-right: 2px; }
.traj-modes button { padding: 3px 12px; font-size: 12px; border: 1px solid #d9dde3; background: #fff; color: #445; border-radius: 12px; cursor: pointer; }
.traj-modes button:hover { border-color: #9db8f5; color: #2563eb; }
.traj-modes button.active { background: #2563eb; border-color: #2563eb; color: #fff; }
.traj-modes .tm-all { display: flex; align-items: center; gap: 4px; margin-left: 8px; color: #7b8794; cursor: pointer; }
.traj-modes .tm-all input { margin: 0; }

/* ===================================================================
   移动端适配（≤900px）— 2026-10-20
   目标：管理端同一套页面在手机 / iPad 竖屏可直接使用。
   原则：不新增页面、不改业务逻辑，只重排布局 + 放大可点区域。
   说明：iOS Safari 的 100vh 会随地址栏伸缩跳动，凡高度一律先用 100vh
        兜底、再用 100dvh 覆盖（支持的浏览器取后者）。
   =================================================================== */
@media (max-width: 900px) {

  /* ---------- 1. 顶部栏：压缩 + 导航横向滑动 ---------- */
  header { height: 48px; padding: 0 12px; }
  header .title { font-size: 14px; letter-spacing: 0; }
  header .user { gap: 8px; font-size: 12px; }
  header .user #chgPwdBtn { display: none; }          /* 手机上常驻按钮太多，改密码低频，先隐藏 */
  header .user .ca-link { font-size: 12px; padding: 5px 6px; }   /* 证书入口保留（手机上正是最需要的场景），仅缩小 */
  header #logoutBtn { padding: 5px 10px; font-size: 12px; }

  /* 记录参数条：窄屏换行，提示独占一行，控件放大到可点 */
  .track-cfg { padding: 8px 10px; gap: 8px; font-size: 12px; }
  .track-cfg select, .track-cfg button { font-size: 15px; min-height: 38px; padding: 8px 10px; }
  .track-cfg .tc-hint { flex: 1 1 100%; }

  .topnav {
    padding: 6px 8px; gap: 4px;
    flex-wrap: nowrap; overflow-x: auto; overflow-y: hidden;
    -webkit-overflow-scrolling: touch; scrollbar-width: none;
  }
  .topnav::-webkit-scrollbar { display: none; }
  .topnav button {
    flex: 0 0 auto; padding: 7px 12px; font-size: 13px; white-space: nowrap;
  }

  /* ---------- 2. 实时看板：上下堆叠 ---------- */
  .layout {
    grid-template-columns: 1fr !important;
    grid-template-rows: auto 1fr;
    height: calc(100vh - 48px);
    height: calc(100dvh - 48px);
  }
  .left {
    max-height: 32vh; overflow-y: auto;
    padding: 10px; border-right: none; border-bottom: 1px solid #e6e9ee;
  }
  .cards { grid-template-columns: repeat(4, 1fr); gap: 6px; margin-bottom: 8px; }
  .card { padding: 7px 4px; }
  .card .num { font-size: 17px; }
  .card .lbl { font-size: 10px; }
  .section-title { margin: 8px 0 6px; font-size: 12px; }

  .worker-filter { flex-direction: row; flex-wrap: wrap; gap: 6px; }
  .worker-filter input, .worker-filter select { flex: 1 1 45%; min-width: 0; }
  .worker-filter button { flex: 1 1 100%; }

  .worker { padding: 9px 10px; }                       /* 加大点击区域 */

  .center { min-height: 40vh; }
  #map { min-height: 40vh; }
  .map-bar { padding: 6px 8px; gap: 6px; font-size: 12px; }
  .map-bar select, .map-bar button { font-size: 12px; padding: 3px 8px; }
  .map-bar .base-tip { display: none; }
  .traj-modes { flex-wrap: wrap; gap: 4px; }
  .traj-modes .tm-label { display: none; }
  .traj-modes button { padding: 3px 9px; font-size: 11px; }
  .map-tip { left: 8px; right: 8px; bottom: 8px; font-size: 11px; line-height: 1.5; }

  /* ---------- 3. 各功能页：统一高度 + 收窄内边距 ---------- */
  #profileMgmt, #announcementMgmt, #knowledgeMgmt, #accountMgmt,
  #workloadMgmt, #anomalyMgmt, #roleMgmt, #logMgmt, #taskBoard {
    padding: 12px;
    height: calc(100vh - 96px);
    height: calc(100dvh - 96px);
  }

  /* ---------- 4. 栅格：双列改单列 ---------- */
  .mgmt-grid { grid-template-columns: 1fr !important; gap: 12px; }
  .dispatch-grid { grid-template-columns: 1fr !important; gap: 14px; }
  .mgmt-card { padding: 14px; }

  /* ---------- 5. 筛选栏：控件全宽，避免横向溢出 ---------- */
  .filter-bar { gap: 6px; padding: 8px; }
  .filter-bar input[type=date], .filter-bar .fb-kw { flex: 1 1 100%; min-width: 0; }
  .filter-bar .fb-btn { flex: 1 1 auto; }

  .wl-row { gap: 6px; }
  .wl-row .wl-field { flex: 1 1 45%; }
  .wl-row .wl-field input,
  #wlRegion, #wlTeam, #wlKw { width: 100% !important; flex: 1 1 45%; min-width: 0; max-width: none; }
  .wl-row button { flex: 1 1 30%; }

  /* 内联固定宽度的关键字输入（角色搜索、日志搜索、班组）改自适应 */
  #roleKeyword, #logKeyword, #roleTargetTeam { min-width: 0 !important; width: 100% !important; }

  /* ---------- 6. 表格：横向滚动，不挤压内容 ---------- */
  .wl-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  .wl-table { min-width: 620px; font-size: 13px; }
  .wl-table th, .wl-table td { padding: 9px 6px; }
  #logWrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  #logWrap table { min-width: 660px; }

  /* ---------- 7. 弹层：手机上全屏、底部贴合 ---------- */
  .mask { padding: 0; }
  .sheet {
    width: 100% !important;
    max-width: 100% !important;
    margin: 10vh 0 0 !important;
    border-radius: 14px 14px 0 0 !important;
    max-height: 90vh;
    max-height: 90dvh;
    overflow-y: auto;
  }
  .sheet .mgmt-form, #taskModalBody { padding: 14px; }

  /* ---------- 8. 列表项：允许换行，防止标签挤出屏幕 ---------- */
  .acc-item { gap: 8px; padding: 10px; flex-wrap: wrap; }
  .acc-item .acc-main { flex: 1 1 auto; min-width: 0; }
  .pc-head { flex-wrap: wrap; gap: 6px; }
  .pc-field { flex-direction: column; gap: 2px; }
  .pc-fk { flex: none; font-size: 12px; }
  .tb-head { gap: 8px; }
  .tb-list-item { padding: 11px 12px; }
  .mgmt-item .mi-top { flex-wrap: wrap; }

  /* ---------- 9. 统计卡 / 日志图表：窄屏两列 ---------- */
  .log-stat-row { gap: 8px; }
  .log-stat { flex: 1 1 44%; min-width: 0; padding: 9px 11px; }
  .log-stat b { font-size: 17px; }
  .log-trend { height: 56px; gap: 5px; }

  /* ---------- 10. 登录框 ---------- */
  .login-box {
    width: auto; max-width: 360px; margin: 10vh 16px;
    padding: 22px;
  }
  .login-box input { font-size: 16px; }               /* iOS 上 <16px 会触发自动放大 */

  /* ---------- 11. 手机端访问地址条 ---------- */
  .net-bar { flex-wrap: wrap; padding: 8px 12px; font-size: 12px; gap: 6px; }
  .net-url { flex: 1 1 100%; word-break: break-all; }

  /* 表单控件字号统一 ≥16px，避免 iOS 聚焦时页面缩放 */
  .mgmt-form input, .mgmt-form textarea, .worker-filter input,
  .worker-filter select, .task-form input, .task-form select, .task-form textarea,
  .wl-row input, .wl-row select, .filter-bar input, .filter-bar select {
    font-size: 16px;
  }
}

/* 超窄屏（≤400px）：统计卡两列更好读 */
@media (max-width: 400px) {
  .cards { grid-template-columns: repeat(2, 1fr); }
  .log-stat { flex: 1 1 100%; }
}

/* ---- 移动端修正（2026-10-20 第二轮：截图实测后调整） ---- */
@media (max-width: 900px) {
  /* 标题与用户信息单行省略，避免把 header 撑成两行 */
  header .title {
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    flex: 1 1 auto; min-width: 0; margin-right: 8px;
  }
  header .user { flex: 0 0 auto; }
  header .user #who {
    max-width: 84px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    font-size: 11px; color: #cfd8ea;
  }

  /* 手机端访问提示条：只留一行，省出地图高度 */
  .net-bar .net-label { display: none; }
  .net-bar { padding: 6px 10px; }
  .net-url { flex: 1 1 auto; font-size: 11px; padding: 2px 6px; }
  .net-copy { flex: 0 0 auto; padding: 4px 10px; font-size: 12px; }

  /* 人员筛选：三列紧凑排布（原来 5 个控件占 3 行） */
  .worker-filter input, .worker-filter select { flex: 1 1 30%; font-size: 13px; padding: 5px 6px; }
  .worker-filter button { flex: 1 1 100%; padding: 5px; }

  /* 工作量筛选：用 grid 精确两列，杜绝溢出屏幕 */
  .wl-row { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; align-items: end; }
  .wl-row .wl-field { flex: none; min-width: 0; }
  .wl-row .wl-field input { width: 100% !important; flex: none; }
  .wl-row > input, .wl-row > select { width: 100% !important; min-width: 0; max-width: none; }
  .wl-row > #wlKw { grid-column: 1 / -1; }
  .wl-row > .wl-hint { grid-column: 1 / -1; }
  .wl-row > button { width: 100%; }

  /* 表格容器必须锁宽，否则 min-width 会撑破整屏 */
  .mgmt-card { min-width: 0; overflow: hidden; }
  .wl-table-wrap { max-width: 100%; overflow-x: auto; }
  .wl-table { min-width: 560px; }
  #logWrap { max-width: 100%; }
  #logWrap table { min-width: 600px; }
}

@media (max-width: 400px) {
  .wl-row { grid-template-columns: 1fr; }
  .worker-filter input, .worker-filter select { flex: 1 1 45%; }
}

/* ---- 移动端修正（第三轮：日志表格与窄屏栅格） ---- */
@media (max-width: 900px) {
  /* 系统日志表格：固定总宽 + 小字号，容器横滑查看完整列 */
  #logWrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  #logWrap table.acc-table { min-width: 820px; font-size: 12px; }
  #logWrap table.acc-table th {
    font-size: 12px; font-weight: 600; padding: 8px 6px; white-space: nowrap;
  }
  #logWrap table.acc-table td { padding: 8px 6px; font-size: 12px; vertical-align: top; }
}
@media (max-width: 400px) {
  /* 窄屏仍用两列，避免一行一个控件太占竖向空间 */
  .wl-row { grid-template-columns: 1fr 1fr; }
  .log-stat { flex: 1 1 44%; }
}

/* ---------- 路径列表浮动面板（点击人员展开，可单选路径1/2/3） ---------- */
.path-panel { position: absolute; right: 12px; top: 58px; width: 286px; max-height: calc(100% - 130px); overflow-y: auto;
  background: #fff; border-radius: 10px; box-shadow: 0 6px 20px rgba(15,23,42,.18); z-index: 600; display: none; }
.path-panel.show { display: block; }
.path-panel .pp-hd { display: flex; align-items: center; justify-content: space-between; gap: 6px;
  padding: 9px 11px; border-bottom: 1px solid #f0f1f3; font-size: 12.5px; font-weight: 600; color: #374151; }
.path-panel .pp-hd .pp-who { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.path-panel .pp-hd .pp-x { flex: none; cursor: pointer; color: #9ca3af; font-size: 15px; line-height: 1; padding: 0 3px; border: 0; background: none; }
.path-panel .pp-hd .pp-x:hover { color: #e04545; }
.path-panel .pp-actions { display: flex; gap: 6px; padding: 7px 11px; border-bottom: 1px solid #f5f6f8; }
.path-panel .pp-actions button { flex: 1; padding: 3px 0; font-size: 11px; border: 1px solid #d9dde3; background: #fff;
  border-radius: 6px; cursor: pointer; color: #445; }
.path-panel .pp-actions button:hover { border-color: #9db8f5; color: #2563eb; }
.path-panel .pp-item { display: flex; align-items: center; gap: 8px; padding: 8px 11px; border-bottom: 1px solid #f7f8fa; cursor: pointer; }
.path-panel .pp-item:hover { background: #f7f9ff; }
.path-panel .pp-item.off { opacity: .42; }
.path-panel .pp-dot { flex: none; width: 9px; height: 9px; border-radius: 50%; }
.path-panel .pp-main { flex: 1; min-width: 0; }
.path-panel .pp-t { font-size: 12px; font-weight: 600; color: #1f2937; display: flex; align-items: center; gap: 5px; }
.path-panel .pp-t .pp-tag { font-weight: 400; font-size: 10px; padding: 0 4px; border-radius: 3px; background: #f3f4f6; color: #6b7280; }
.path-panel .pp-m { font-size: 11px; color: #9ca3af; margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.path-panel .pp-eye { flex: none; font-size: 10.5px; color: #6b7280; border: 1px solid #e5e7eb; background: #fafbfc;
  border-radius: 5px; padding: 1px 5px; }
.path-panel .pp-item.off .pp-eye { color: #c2c8d0; }
.path-panel .pp-solo { flex: none; font-size: 10.5px; color: #2563eb; border: 1px solid #c7d7fb; background: #f5f8ff;
  border-radius: 5px; padding: 1px 5px; cursor: pointer; }
.path-panel .pp-solo:hover { background: #e8f0ff; border-color: #9db8f5; }
.path-panel .pp-empty { padding: 16px 12px; text-align: center; color: #9ca3af; font-size: 11.5px; line-height: 1.7; }

/* 记录模式按钮：计算中给出视觉反馈（同一个人同一天只算一次，切换复用缓存） */
.traj-modes.busy button[data-mode] { opacity: .55; }
.traj-modes.busy { cursor: progress; }
.traj-modes .tm-refresh { color: #7b8794; border-style: dashed; }
.traj-modes .tm-refresh:hover { color: #b45309; border-color: #f0c48a; }

/* ===== 记录视觉强化：让路径在信息密集的高德底图上"抬"出来 ===== */
/* （2026-10-21 用户反馈"选路径时整体色调变暗"不喜欢 → 已移除底图压淡滤镜，
    底图保持原色；记录醒目性由起终点圆环、白色描边、路径编号承担） */
/* 记录起终点：白边圆环 + 起绿终红，比小箭头醒目得多 */
.tr-end {
  width: 27px; height: 27px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font: 600 12.5px/1 -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;
  color: #fff; border: 2.5px solid #fff;
  box-shadow: 0 2px 7px rgba(0, 0, 0, .42);
  letter-spacing: 0;
}
.tr-end.tr-start { background: #17a05c; }
.tr-end.tr-finish { background: #e04545; }
/* 起终点旁的时间胶囊（2026-10-22）：只标「起」「终」看不出谁先谁后，把时分直接贴在圆标右侧。
 * 用绝对定位向右溢出，这样 iconAnchor 仍对准圆心，坐标点不会偏。 */
.tr-end-box { position: relative; width: 27px; height: 27px; }
.tr-end-time {
  position: absolute; left: 31px; top: 50%; transform: translateY(-50%);
  padding: 2px 7px; border-radius: 9px; white-space: nowrap;
  font: 600 11.5px/1.3 -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;
  background: rgba(255, 255, 255, .97); color: #0f7a44;
  border: 1.5px solid #17a05c; box-shadow: 0 2px 6px rgba(0, 0, 0, .22);
}
.tr-end-time.tr-finish { color: #b83232; border-color: #e04545; }
/* 胶囊的落位方向由 admin.js 的四向避让算出（右/下/上/左）：一片区域里圆标常常挤在一起，
 * 死守右侧必然和邻近标注叠住。下面四个类必须与 admin.js 的 R / CAP_H 常量对得上。 */
.tr-end-time.pos-r { left: 31px; top: 50%; transform: translateY(-50%); }
.tr-end-time.pos-l { left: auto; right: 31px; top: 50%; transform: translateY(-50%); }
.tr-end-time.pos-b { left: 50%; top: 31px; transform: translateX(-50%); }
.tr-end-time.pos-t { left: 50%; top: auto; bottom: 31px; transform: translateX(-50%); }
/* 断口 / 打卡标注胶囊：白底 + 描边 + 阴影，压在底图上不糊 */
.tr-tag {
  display: inline-block; background: rgba(255, 255, 255, .97);
  border: 1.5px solid #e04545; color: #a83232;
  padding: 2px 8px; border-radius: 10px;
  font: 500 11px/1.45 -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;
  white-space: nowrap; box-shadow: 0 2px 6px rgba(0, 0, 0, .22);
}
.tr-tag.gray { border-color: #9aa0a6; color: #4b5563; }

/* ══════════════ 任务系统改造（2026-10-20）：新建任务弹层 / 上报链接 ══════════════ */
.mini.primary { background: #2563eb; color: #fff; border-color: #2563eb; font-weight: 500; }
.mini.primary:hover { background: #2559c4; }
.req { color: #e04545; margin-left: 2px; }

.nt-sheet { max-width: 760px !important; margin: 4vh auto 4vh !important; border-radius: 14px !important;
            max-height: 92vh; overflow: hidden; display: flex; flex-direction: column; }
.nt-body { overflow: auto; padding: 4px 18px 18px; }
.nt-sec { border: 1px solid #e8edf4; border-radius: 12px; padding: 14px; margin-top: 14px; background: #fcfdfe; }
.nt-sec-t { font-size: 13.5px; font-weight: 600; color: #2f3c5c; margin-bottom: 12px;
            display: flex; align-items: center; gap: 6px; }
.nt-sec-t::before { content: ''; width: 3px; height: 13px; border-radius: 2px; background: #2563eb; }
.nt-opt { font-weight: 400; font-size: 12px; color: #8b98ab; }
.nt-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.nt-f { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.nt-f label { font-size: 12.5px; color: #66748a; }
.nt-f input, .nt-f select, .nt-f textarea {
  padding: 8px 10px; border: 1px solid #d9dde3; border-radius: 7px; font-size: 13px;
  font-family: inherit; background: #fff; color: #1b2430; outline: none; width: 100%;
}
.nt-f input:focus, .nt-f select:focus, .nt-f textarea:focus { border-color: #2563eb; }
.nt-f textarea { min-height: 74px; resize: vertical; line-height: 1.55; }
.nt-2col { display: flex; gap: 8px; }
/* 多人派发：执行人多选（同班组，2026-10-23） */
.nt-f-wide { grid-column: 1 / -1; }
.pick {
  display: flex; flex-wrap: wrap; gap: 6px; align-content: flex-start;
  max-height: 128px; overflow: auto; padding: 8px;
  border: 1px solid #d9dde3; border-radius: 7px; background: #fbfcff;
}
.pick-item {
  display: inline-flex; align-items: center; gap: 5px; padding: 4px 10px;
  border: 1px solid #dde3ee; border-radius: 14px; background: #fff;
  font-size: 12.5px; color: #33415c; cursor: pointer; user-select: none;
  white-space: nowrap;
}
.pick-item em { font-style: normal; font-size: 11px; color: #9aa4b6; }
.pick-item em::before { content: '·'; margin-right: 3px; }
.pick-item:hover { border-color: #a9c2f5; }
.pick-item.on { background: #e8f0fe; border-color: #2563eb; color: #1d4ed8; font-weight: 600; }
.pick-item.on em { color: #5b8def; }
.pick-item.lock { background: #f4f5f7; color: #b3bccb; cursor: not-allowed; border-color: #e8ebf0; }
.pick-item.lock::before { content: '🔒'; font-size: 10px; }
.pick-empty { font-size: 12px; color: #9aa4b6; padding: 6px 2px; }
.pick-bar { display: flex; align-items: center; gap: 8px; margin-top: 2px; }
.pick-bar .pick-cnt { font-size: 11.5px; color: #66748a; }
.pick-bar .pick-clr {
  font-size: 11.5px; color: #2563eb; background: none; border: none;
  cursor: pointer; padding: 0; text-decoration: underline;
}
.nt-tip { font-size: 11.5px; color: #8b98ab; line-height: 1.5; }
.nt-tip b { color: #2563eb; font-weight: 600; }
.nt-res-wrap { position: relative; }
.nt-res-list { position: absolute; left: 0; right: 0; top: calc(100% + 4px); z-index: 60; background: #fff;
               border: 1px solid #e2e8f1; border-radius: 8px; box-shadow: 0 8px 22px rgba(20,40,70,.14);
               max-height: 210px; overflow: auto; }
.nt-res-list > div { padding: 8px 11px; font-size: 13px; border-bottom: 1px solid #f2f5f8; cursor: pointer; }
.nt-res-list > div:last-child { border-bottom: none; }
.nt-res-list > div:hover { background: #f0f7ff; }
.nt-res-list .sub { display: block; font-size: 11.5px; color: #8b98ab; margin-top: 2px; }
.nt-tags { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 8px; }
.nt-tag { display: inline-flex; align-items: center; gap: 6px; background: #eef4fd; color: #17457f;
          border: 1px solid #cfe2fa; border-radius: 999px; padding: 4px 9px; font-size: 12.5px; }
.nt-tag i { font-style: normal; cursor: pointer; color: #7a94b3; font-size: 14px; line-height: 1; }
/* 关联资源的「箱体类型」标记：自动识别出来的显示为小徽章，识别不出的给下拉手选 */
.rt-tag { font-style: normal; font-size: 11px; line-height: 1.5; padding: 0 5px; border-radius: 4px;
          background: #e8f0fe; color: #2563eb; border: 1px solid #cddffb; white-space: nowrap; }
.rt-tag.rt-unknown { background: #fff4e5; color: #b76b00; border-color: #ffd8a8; }
/* 勘察里补选的资源标记（区别于派单时指定的，2026-10-24） */
.rt-tag.rt-tag-survey { background: #fff4e5; color: #b26a00; border-color: #ffd9a8; }
.nt-res-list .rt-tag { margin-right: 5px; vertical-align: 1px; }
.rt-pick { font-size: 11px; padding: 1px 3px; border-radius: 4px; border: 1px solid #ffd8a8;
           background: #fff4e5; color: #b76b00; max-width: 104px; }
.nt-mapbar { display: flex; gap: 8px; margin-bottom: 8px; align-items: center; }
#ntMap { height: 200px; border-radius: 10px; border: 1px solid #e2e8f1; z-index: 1; }
.nt-ph-grid { display: flex; flex-wrap: wrap; gap: 8px; }
.nt-ph { position: relative; width: 76px; height: 76px; border-radius: 8px; overflow: hidden; background: #eef2f6; }
.nt-ph img { width: 100%; height: 100%; object-fit: cover; display: block; }
.nt-ph .x { position: absolute; right: 2px; top: 2px; width: 18px; height: 18px; border-radius: 50%;
            background: rgba(0,0,0,.62); color: #fff; font-size: 12px; line-height: 18px; text-align: center; cursor: pointer; }
.nt-ph.add { display: flex; align-items: center; justify-content: center; border: 1.5px dashed #c4d2e2;
             color: #8b98ab; font-size: 20px; cursor: pointer; background: #fafcfe; }
.nt-foot { display: flex; justify-content: flex-end; gap: 10px; padding: 14px 0 4px;
           border-top: 1px solid #eef2f7; margin-top: 16px; }
.nt-foot .mini { padding: 8px 20px; font-size: 13.5px; border-radius: 8px; }

/* 上报链接管理面板 */
.rl-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 12px; margin-top: 10px; }
.rl-gate { margin-bottom: 12px; }
.rl-gate-card { border: 1px solid #bcd6f5; border-radius: 10px; padding: 12px; background: #f2f8ff; }
.rl-gate-card .hd2 { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 8px; }
.rl-gate-card .nm { font-weight: 600; font-size: 13.5px; color: #2f3c5c; }
.rl-gate-card .st { font-size: 11.5px; padding: 2px 7px; border-radius: 20px; }
.rl-gate-card .st.ok { background: #e8f7ef; color: #17844a; }
.rl-gate-card .st.no { background: #fdecec; color: #b83232; }
.rl-gate-card .url { font-size: 11.5px; color: #2563eb; word-break: break-all; background: #fff;
                border-radius: 6px; padding: 7px 8px; margin: 6px 0; font-family: ui-monospace, Consolas, monospace; border: 1px solid #dbe8fa; }
.rl-gate-card .meta { font-size: 11.5px; color: #6b7a8c; line-height: 1.7; }
.rl-gate-ctl { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.rl-gate-ctl input { flex: 1; min-width: 180px; padding: 7px 9px; border: 1px solid #d9dde3; border-radius: 6px; font-size: 12.5px; }
.rl-card { border: 1px solid #e8edf4; border-radius: 10px; padding: 12px; background: #fcfdfe; }
.rl-card .hd2 { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 8px; }
.rl-card .nm { font-weight: 600; font-size: 13.5px; color: #2f3c5c; }
.rl-card .st { font-size: 11.5px; padding: 2px 7px; border-radius: 20px; }
.rl-card .st.ok { background: #e8f7ef; color: #17844a; }
.rl-card .st.no { background: #fdecec; color: #b83232; }
.rl-card .url { font-size: 11.5px; color: #4b5563; word-break: break-all; background: #f4f7fb;
                border-radius: 6px; padding: 7px 8px; margin: 6px 0; font-family: ui-monospace, Consolas, monospace; }
.rl-card .meta { font-size: 11.5px; color: #8b98ab; line-height: 1.6; }
.rl-card .acts { display: flex; gap: 6px; margin-top: 9px; flex-wrap: wrap; }
.rl-new { border: 1px dashed #c7d0e0; border-radius: 10px; padding: 12px; background: #fafcfe;
          display: flex; flex-direction: column; gap: 8px; }
.rl-new .ttl { font-weight: 600; font-size: 13px; color: #2f3c5c; }
.rl-new input, .rl-new select { padding: 7px 9px; border: 1px solid #d9dde3; border-radius: 6px; font-size: 12.5px; }

/* 任务卡片新增字段 */
.t-no { font: 600 11.5px/1 ui-monospace, Consolas, monospace; color: #2563eb; background: #eef4fd;
        border: 1px solid #d5e6fb; border-radius: 5px; padding: 3px 6px; margin-right: 7px; vertical-align: 1px; }
.t-chips { display: flex; flex-wrap: wrap; gap: 5px; margin: 5px 0; }
.t-chip { font-size: 11px; padding: 2px 7px; border-radius: 4px; background: #f1f4f9; color: #4b5563; border: 1px solid #e5eaf1; }
.t-chip.type { background: #eef4fd; color: #17457f; border-color: #d5e6fb; }
.t-chip.src-installer { background: #fff5e6; color: #96601a; border-color: #fbe3c4; }
.t-chip.src-lineman { background: #f0f9ee; color: #2b6b32; border-color: #d6ecd2; }
.t-chip.pool { background: #f5f0ff; color: #5b3a9e; border-color: #e3d9f8; }
.t-mat { font-size: 11.5px; color: #4b5563; background: #f8fafc; border-left: 3px solid #2563eb;
         padding: 6px 9px; border-radius: 0 6px 6px 0; margin-top: 6px; line-height: 1.65; }
.t-mat b { color: #2f3c5c; }
@media (max-width: 760px) {
  .nt-grid { grid-template-columns: 1fr; }
  .nt-sheet { margin: 0 !important; max-height: 100vh; border-radius: 0 !important; }
  .rl-grid { grid-template-columns: 1fr; }
}

/* 任务详情弹层：内容左对齐（原 .card 内文本居中，字段多时读起来跳） */
#taskModalBody { text-align: left; }
#taskModalBody .card { text-align: left; }
#taskModalBody .card .t { text-align: left; }
#taskModalBody .card .row { justify-content: flex-start; }
#taskModalBody .m { text-align: left; line-height: 1.7; }
#taskModalBody .t-chips { justify-content: flex-start; }

/* ══════════ 任务详情弹窗（桌面端宽版双栏，2026-10-21 改版） ══════════ */
#taskModal .sheet {
  width: min(94vw, 1160px);
  max-width: 1160px !important;
  margin: 5vh auto 4vh !important;
  max-height: 90vh;
  display: flex;
  flex-direction: column;
  border-radius: 14px;
}
#taskModal .sheet .hd {
  flex: 0 0 auto;
  padding: 14px 20px;
  background: #fff;
  position: sticky;
  top: 0;
  z-index: 3;
}
#taskModal .hd-title { display: flex; align-items: center; gap: 10px; min-width: 0; }
#taskModal .hd-order { font-family: ui-monospace, Consolas, monospace; font-size: 12.5px; color: #2563eb;
  background: #eef4fd; border: 1px solid #d5e6fb; border-radius: 5px; padding: 2px 7px; }
#taskModal .hd-actions { display: flex; align-items: center; gap: 8px; }
#taskModalBody { padding: 0 !important; overflow: auto; flex: 1 1 auto; min-height: 0; }

/* 头部摘要区（标题 + 状态 + 标签），横跨两栏 */
.td-head { padding: 16px 20px 12px; border-bottom: 1px solid #eef1f6; background: #fbfcfe; }
.td-title { font-size: 19px; font-weight: 600; color: #1f2a44; line-height: 1.45; word-break: break-word; }
.td-head .badge { font-size: 12px; padding: 3px 9px; border-radius: 10px; vertical-align: 2px; margin-left: 8px; }

/* 两栏主体 */
.td-grid { display: grid; grid-template-columns: minmax(0, 1fr) 330px; gap: 16px; padding: 16px 20px 20px; align-items: start; }
.td-main { min-width: 0; }
.td-side { position: sticky; top: 8px; }

/* 分区卡片 */
.td-sec { background: #fff; border: 1px solid #e8ecf2; border-radius: 10px; padding: 14px 16px; margin-bottom: 14px; }
.td-sec:last-child { margin-bottom: 0; }
.td-sec-t { font-size: 13px; font-weight: 600; color: #5b6b85; letter-spacing: .3px; margin-bottom: 10px;
  display: flex; align-items: center; gap: 6px; }
.td-sec-t::before { content: ''; width: 3px; height: 13px; border-radius: 2px; background: #2563eb; }
.td-p { font-size: 14px; color: #2c3a4f; line-height: 1.75; white-space: pre-wrap; word-break: break-word; }
.td-empty { font-size: 13px; color: #9aa7b8; }

/* 资源行 */
.td-res { display: flex; flex-direction: column; gap: 4px; }
.td-res-item { padding: 9px 11px; background: #f8fafd; border: 1px solid #eef2f8; border-radius: 8px; }
.td-res-name { font-size: 13.5px; color: #1f2a44; font-weight: 500; word-break: break-all; }
.td-res-name .rt-tag { margin-right: 6px; vertical-align: 1px; }
.td-res-sub { font-size: 12px; color: #7b8aa0; margin-top: 3px; line-height: 1.6; word-break: break-all; }

/* 图片网格（原 .imgs 无样式 → 缩略图按原尺寸散落，改版后统一九宫格） */
.td-imgs { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; }
.td-imgs img { width: 100%; height: 150px; object-fit: cover; border-radius: 8px; cursor: zoom-in;
  border: 1px solid #e8ecf2; background: #f4f6f9; transition: transform .12s, box-shadow .12s; }
.td-imgs img:hover { transform: translateY(-1px); box-shadow: 0 6px 16px rgba(20,40,70,.16); }

/* 右栏键值表 */
.td-kv { display: grid; grid-template-columns: 74px minmax(0, 1fr); gap: 9px 10px; font-size: 13px; }
.td-kv dt { color: #8b98ab; }
.td-kv dd { color: #25324a; margin: 0; word-break: break-word; line-height: 1.55; }
.td-kv dd a { color: #2563eb; text-decoration: none; }
.td-kv dd a:hover { text-decoration: underline; }
.td-actions { margin-top: 14px; display: flex; flex-direction: column; gap: 8px; }
#taskModal .td-reassign { width: 100%; background: #2563eb; color: #fff; border: 1px solid #2563eb;
  border-radius: 9px; padding: 9px 14px; font-size: 13.5px; cursor: pointer; }
#taskModal .td-reassign:hover { background: #275fd0; }
#taskModal .td-del { width: 100%; background: #fff; color: #e04545; border: 1px solid #f4c7c7;
  border-radius: 9px; padding: 9px 14px; font-size: 13.5px; cursor: pointer; }
#taskModal .td-del:hover { background: #fdf3f3; border-color: #e04545; }
#taskModal .td-share { width: 100%; background: #fff; color: #b45309; border: 1px solid #fcd9a4;
  border-radius: 9px; padding: 9px 14px; font-size: 13.5px; cursor: pointer; }
#taskModal .td-share:hover { background: #fff8ec; border-color: #f0a94a; }
#taskModal .td-archive { width: 100%; background: linear-gradient(180deg,#34c38f,#0baa75); color: #fff; border: none;
  border-radius: 9px; padding: 9px 14px; font-size: 13.5px; cursor: pointer; font-weight: 600; }
#taskModal .td-archive:hover { filter: brightness(1.06); box-shadow: 0 3px 8px rgba(11,170,117,.3); }
#taskModal .td-archive:active { transform: translateY(1px); box-shadow: none; }

/* 改派弹层：同区域候选人列表 */
.rs-head { font-size: 13px; color: #4b5563; line-height: 1.8; background: #f8fafd;
  border: 1px solid #eef2f8; border-radius: 8px; padding: 10px 12px; margin-bottom: 12px; }
.rs-list { max-height: 46vh; overflow: auto; border: 1px solid #eef2f8; border-radius: 8px; }
.rs-item { display: flex; align-items: center; gap: 10px; padding: 10px 12px; cursor: pointer;
  border-bottom: 1px solid #f2f5f8; font-size: 14px; }
.rs-item:last-child { border-bottom: none; }
.rs-item:hover { background: #f6f9ff; }
.rs-item input { width: 16px; height: 16px; accent-color: #2563eb; }
.rs-item .rs-nm { font-weight: 500; color: #1f2a44; }
.rs-item .rs-meta { color: #8b98ab; font-size: 12.5px; }
.rs-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 14px; }
.rs-actions .mini { min-width: 84px; }

/* 超管资源编辑弹窗（2026-11-04 需求1：任意环节可增删关联资源） */
.td-res-edit { margin-left: 8px; padding: 2px 10px; font-size: 12px; border-radius: 6px;
  cursor: pointer; background: #fff; color: #b45309; border: 1px solid #fcd9a4; }
.td-res-edit:hover { background: #fff8ec; border-color: #f0a94a; }
.sr-list { max-height: 40vh; overflow: auto; border: 1px solid #eef2f8; border-radius: 8px; }
.sr-row { display: flex; align-items: center; gap: 10px; padding: 8px 12px; cursor: pointer;
  border-bottom: 1px solid #f2f5f8; font-size: 13.5px; }
.sr-row:last-child { border-bottom: none; }
.sr-row:hover { background: #f6f9ff; }
.sr-row .sr-check { width: 16px; height: 16px; accent-color: #2563eb; flex: 0 0 auto; }
.sr-row .sr-item { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; }
.sr-row .sr-item b { color: #1f2a44; font-weight: 600; }
.sr-row .sr-sub { color: #8b98ab; font-size: 12px; margin-top: 2px; }
.sr-pending { background: #fffdf7; }
.sr-add { display: flex; gap: 8px; margin-top: 12px; }
.sr-add input { flex: 1; padding: 8px 10px; border: 1px solid #dbe3ef; border-radius: 8px; font-size: 13.5px;
  transition: border-color .15s, box-shadow .15s; }
.sr-add input:focus { border-color: #2563eb; outline: none; box-shadow: 0 0 0 3px rgba(37,99,235,.12); }
.sr-add select { padding: 8px; border: 1px solid #dbe3ef; border-radius: 8px; font-size: 13.5px; background: #fff; }
.sr-add button { padding: 8px 16px; border-radius: 8px; border: none; background: linear-gradient(180deg,#4d8bff,#2563eb);
  color: #fff; font-size: 13.5px; font-weight: 500; cursor: pointer; white-space: nowrap;
  box-shadow: 0 1px 2px rgba(20,40,70,.08); transition: filter .15s, transform .06s, box-shadow .15s; }
.sr-add button:hover { filter: brightness(1.06); box-shadow: 0 3px 8px rgba(37,99,235,.28); }
.sr-add button:active { transform: translateY(1px); box-shadow: none; }
.sr-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 16px; padding-top: 14px;
  border-top: 1px solid #eef2f8; }
/* 主/次操作按钮（层级统一：主=蓝渐变实心，次=白底灰描边） */
.sr-actions button { height: 36px; min-width: 88px; border-radius: 8px; padding: 0 16px; font-size: 13.5px;
  font-weight: 500; cursor: pointer; transition: all .15s ease; }
.sr-actions .btn-primary { background: linear-gradient(180deg,#4d8bff,#2563eb); color: #fff; border: none;
  box-shadow: 0 1px 2px rgba(20,40,70,.08); }
.sr-actions .btn-primary:hover { filter: brightness(1.06); box-shadow: 0 3px 8px rgba(37,99,235,.28); }
.sr-actions .btn-primary:active { transform: translateY(1px); box-shadow: none; }
.sr-actions .btn-ghost { background: #fff; color: #5b6b82; border: 1px solid #d5deeb; }
.sr-actions .btn-ghost:hover { background: #f6f8fb; border-color: #c3cede; color: #33415c; }
.sr-actions .btn-ghost:active { background: #eef2f7; }

/* 超管关联资源：纯资源库搜索选择（2026-11-04 改：去手填、调 /api/resources、限任务区县） */
.sr-pick { display: flex; flex-direction: column; gap: 10px; }
.sr-search { display: flex; gap: 8px; }
.sr-search input { flex: 1; padding: 8px 11px; border: 1px solid #dbe3ef; border-radius: 8px; font-size: 13.5px;
  transition: border-color .15s, box-shadow .15s; }
.sr-search input:focus { border-color: #2563eb; outline: none; box-shadow: 0 0 0 3px rgba(37,99,235,.12); }
.sr-search select { padding: 8px; border: 1px solid #dbe3ef; border-radius: 8px; font-size: 13.5px; background: #fff;
  color: #33415c; cursor: pointer; flex: 0 0 auto; }
.sr-tip { font-size: 12px; color: #9aa4b2; line-height: 1.6; }
.sr-res { max-height: 30vh; overflow: auto; border: 1px solid #eef2f8; border-radius: 8px; }
.sr-opt { display: flex; align-items: baseline; gap: 8px; padding: 8px 12px; cursor: pointer;
  border-bottom: 1px solid #f2f5f8; font-size: 13.5px; }
.sr-opt:last-child { border-bottom: none; }
.sr-opt:hover { background: #f0f6ff; }
.sr-opt b { color: #1f2a44; font-weight: 600; }
.sr-opt .sub { color: #8b98ab; font-size: 12px; }
.sr-opt i { font-style: normal; color: #2563eb; font-size: 11.5px; margin-left: auto; }
.sr-opt.off { opacity: .55; cursor: default; }
.sr-opt.off:hover { background: transparent; }
.sr-sel-hd { display: flex; align-items: center; justify-content: space-between; margin-top: 4px;
  font-size: 12.5px; color: #66748a; }
.sr-sel-hd i { font-style: normal; color: #8b98ab; }
.sr-sel { display: flex; flex-wrap: wrap; gap: 7px; }
.sr-sel .mi-meta { width: 100%; }

/* 团队任务成员进度（2026-10-23） */
.t-chip.team { background: #fff4e5; color: #b45309; border-color: #fcd9a4; font-weight: 600; }
.td-team { display: flex; flex-direction: column; gap: 8px; }
.td-team-item {
  border: 1px solid #eef2f8; border-radius: 8px; padding: 9px 11px; background: #fbfcfe;
}
.td-team-hd { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.td-team-nm { font-weight: 600; color: #1f2a44; font-size: 13.5px; }
.td-team-team { font-size: 11.5px; color: #8b98ab; }
.td-team-st { font-size: 11.5px; padding: 1px 7px; border-radius: 10px; font-weight: 600; }
.td-team-st.s-done { background: #e7f7ee; color: #1f9254; }
.td-team-st.s-doing { background: #e8f0fe; color: #1d4ed8; }
.td-team-st.s-wait { background: #f1f3f7; color: #8b98ab; }
.td-team-st.s-rej { background: #fdecec; color: #c92a2a; }
.td-team-st.s-review { background: #fef3e0; color: #b86506; }
#taskModal .td-approve { background: #2ecc71; color: #fff; border: 1px solid #2ecc71;
  padding: 2px 8px; border-radius: 4px; font-size: 12px; cursor: pointer; margin-left: 4px; }
#taskModal .td-approve:hover { background: #27ae60; }
#taskModal .td-reject { background: #e04545; color: #fff; border: 1px solid #e04545;
  padding: 2px 8px; border-radius: 4px; font-size: 12px; cursor: pointer; margin-left: 2px; }
#taskModal .td-reject:hover { background: #c0392b; }
.td-team-body { margin-top: 6px; font-size: 12.5px; color: #4b5563; line-height: 1.7; }
.td-team-body .lbl { color: #9aa4b6; }
.td-team-imgs { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 6px; }
.td-team-imgs img { width: 58px; height: 58px; object-fit: cover; border-radius: 6px; cursor: zoom-in; }
.td-team-ops { margin-left: auto; display: flex; gap: 6px; }
.td-team-ops button {
  font-size: 11.5px; padding: 2px 8px; border-radius: 6px; cursor: pointer;
  border: 1px solid #e2e8f2; background: #fff; color: #66748a;
}
.td-team-ops button:hover { border-color: #f3b4b4; color: #c92a2a; }
.td-progress-bar { height: 6px; border-radius: 3px; background: #eef2f8; overflow: hidden; margin-top: 8px; }
.td-progress-bar i { display: block; height: 100%; background: #2563eb; border-radius: 3px; }

@media (max-width: 980px) {
  #taskModal .sheet { width: 96vw; margin: 3vh auto 3vh !important; max-height: 94vh; }
  .td-grid { grid-template-columns: 1fr; }
  .td-side { position: static; }
}

/* ══════════ 重复派单提示弹层（2026-10-21） ══════════ */
#dupResModal .sheet .hd { padding: 14px 18px; }
.dup-sum { font-size: 13px; color: #4b5563; line-height: 1.7; background: #fff8e8; border: 1px solid #ffe0a3;
  border-radius: 8px; padding: 10px 12px; margin-bottom: 12px; }
.dup-grp { border: 1px solid #e8ecf2; border-radius: 10px; padding: 10px 12px; margin-bottom: 10px; background: #fbfcfe; }
.dup-hd { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: 14px; color: #1f2a44; }
.dup-hd b { font-weight: 600; word-break: break-all; }
.dup-meta { font-size: 12px; color: #8b96a8; font-weight: 400; }
.dup-list { margin-top: 6px; }
.dup-task { display: flex; align-items: center; gap: 8px; padding: 6px 0; border-top: 1px dashed #eef1f6; font-size: 13px; }
.dup-task:first-child { border-top: none; }
.dup-no { font-family: ui-monospace, Consolas, monospace; font-size: 12px; color: #2563eb; white-space: nowrap; }
.dup-t { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #2c3a4f; }
.dup-time { font-size: 12px; color: #9aa4b2; white-space: nowrap; }
.dup-task .mini { flex: 0 0 auto; padding: 3px 10px; }
.dup-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 14px; }

/* ══════════ 历史任务小窗（2026-10-21） ══════════ */
.th-hd { padding-bottom: 12px; border-bottom: 1px solid #eef1f6; margin-bottom: 14px; }
.th-title { font-size: 17px; font-weight: 600; color: #1f2a44; line-height: 1.5; }
.th-title .t-no { font-family: ui-monospace, Consolas, monospace; font-size: 13px; color: #2563eb; margin-right: 8px; }
.th-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.th-grid { display: grid; gap: 12px; }
.th-sec { background: #fff; border: 1px solid #e8ecf2; border-radius: 10px; padding: 12px 14px; }
.th-sec-t { font-size: 13px; font-weight: 600; color: #1f2a44; margin-bottom: 8px; display: flex; align-items: center; gap: 6px; }
.th-sec-t::before { content: ''; width: 3px; height: 13px; border-radius: 2px; background: #2563eb; }
.th-res { padding: 5px 0; font-size: 13px; color: #2c3a4f; word-break: break-all; }
.th-res .rt-tag { margin-right: 6px; }
.th-flow { list-style: none; margin: 0; padding: 0; }
.th-flow li { display: flex; align-items: baseline; gap: 10px; padding: 6px 0; border-bottom: 1px dashed #f2f5f8; font-size: 13px; }
.th-flow li:last-child { border-bottom: none; }
.th-f-time { font-family: ui-monospace, Consolas, monospace; font-size: 12px; color: #8b96a8; white-space: nowrap; }
.th-f-act { font-weight: 600; color: #1f2a44; min-width: 92px; }
.th-f-by { color: #4b5563; }
.th-f-note { color: #9aa4b2; font-size: 12px; }
.th-sec .td-imgs img { height: 96px; }

/* ══════════ 资源派单台账页（2026-10-21） ══════════ */
.rl-sum { display: flex; flex-wrap: wrap; gap: 8px; margin: 6px 0 12px; }
.rl-sum-i { display: flex; align-items: baseline; gap: 6px; flex-wrap: wrap;
  background: #f6f9ff; border: 1px solid #e2ecff; border-radius: 10px; padding: 8px 12px; }
.rl-sum-k { font-size: 12px; color: #6b7891; }
.rl-sum-i b { font-size: 17px; color: #1f2a44; font-variant-numeric: tabular-nums; }
.rl-sum-sub { font-size: 11px; color: #9aa4b2; }
.rl-sum-tip { background: #fff8e8; border-color: #ffe0a3; font-size: 12px; color: #a9761a; align-items: center; }
.rl-chk { display: flex; align-items: center; gap: 5px; cursor: pointer; }
.rl-row { border: 1px solid #e8ecf2; border-radius: 10px; margin-bottom: 8px; background: #fff; overflow: hidden; }
.rl-hd { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding: 10px 12px; background: #fbfcfe; }
.rl-name { font-size: 13px; color: #1f2a44; word-break: break-all; flex: 1 1 320px; min-width: 0; }
.rl-region { font-size: 12px; color: #4b5563; background: #eef2f8; border-radius: 5px; padding: 1px 7px; white-space: nowrap; }
.rl-count { font-size: 12px; color: #2563eb; white-space: nowrap; }
.rl-count b { font-size: 15px; font-variant-numeric: tabular-nums; }
.rl-split { font-size: 12px; color: #8b96a8; white-space: nowrap; }
.rl-last { font-size: 12px; color: #9aa4b2; white-space: nowrap; font-family: ui-monospace, Consolas, monospace; }
.rl-hd .mini { margin-left: auto; padding: 4px 12px; }
.rl-tasks { padding: 4px 12px 10px; background: #fff; }
.rl-task { display: flex; align-items: center; gap: 10px; padding: 7px 0; border-top: 1px dashed #eef1f6; font-size: 13px; }
.rl-t-title { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #2c3a4f; }
.rl-t-who { font-size: 12px; color: #8b96a8; white-space: nowrap; max-width: 150px; overflow: hidden; text-overflow: ellipsis; }
.rl-task .mini { flex: 0 0 auto; padding: 3px 10px; }
@media (max-width: 720px) {
  .rl-last, .rl-split { display: none; }
  .rl-hd .mini { margin-left: 0; }
}

/* 看板任务卡片：关联资源行（搜索可命中资源名称/编码，需可见） */
.t-meta.t-res { color: #2c3a4f; }
.t-meta.t-res::before { content: ''; }

/* 分页按钮成组，窄屏不让「上一页 / 下一页」被拆到两行 */
.pager-btns { display: inline-flex; gap: 8px; flex: 0 0 auto; }

/* 资源台账页顶部的子标签切换（派单台账 / 耗材台账，互斥显示，避免长列表把另一张表挤到看不见） */
.lt-tabs { display: flex; gap: 6px; background: #fff; border: 1px solid #e6eaf0;
  border-radius: 10px; padding: 6px; }
.lt-tab { border: none; background: transparent; color: #5a6880; font-size: 14px; font-weight: 600;
  padding: 9px 18px; border-radius: 8px; cursor: pointer; font-family: inherit; transition: background .15s, color .15s; }
.lt-tab:hover { background: #f2f6ff; color: #2563eb; }
.lt-tab.active { background: #2563eb; color: #fff; }
@media (max-width: 900px) {
  .lt-tabs { gap: 4px; padding: 5px; }
  .lt-tab { flex: 1 1 0; padding: 10px 6px; font-size: 13px; min-height: 40px; white-space: nowrap; }
}

/* 派单台账每行的「用料」列（该资源关联工单用过的耗材，多资源工单会重复计到每个资源，不可跨行相加） */
.rl-mats { display: flex; align-items: baseline; gap: 6px; margin-top: 6px; padding-top: 6px;
  border-top: 1px dashed #eef1f5; font-size: 12px; color: #5a6880; }
.rl-mats-k { flex: 0 0 auto; background: #eef4ff; color: #2563eb; border-radius: 4px;
  padding: 1px 6px; font-size: 11px; line-height: 16px; }
.rl-mats-v { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ===== 耗材使用台账（2026-10-24） ===== */
/* 「起始 至 截止」作为一个整体，窄屏换行时不被拆散（否则「至」会孤零零留在上一行末） */
.date-range { display: inline-flex; align-items: center; gap: 6px; flex: 0 0 auto; flex-wrap: nowrap; }
.date-range .mini { flex: 0 0 auto; min-width: 0; }
.mt-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; border: 1px solid #e6eaf0; border-radius: 8px; }
/* min-width 让列不被压扁（否则「天河区」竖排成两行），窄屏靠容器横向滚动 */
.mt-table { width: 100%; min-width: 760px; border-collapse: collapse; font-size: 12.5px; background: #fff; }
.mt-table th, .mt-table td { padding: 6px 8px; border-bottom: 1px solid #eef1f5; text-align: left; vertical-align: top; white-space: nowrap; }
.mt-table th { background: #f7f9fc; color: #5a6880; font-weight: 600; }
.mt-table tbody tr:last-child td { border-bottom: none; }
.mt-table tbody tr:hover { background: #f9fbff; }
.mt-table td.num { text-align: right; font-variant-numeric: tabular-nums; }
.mt-table td.mt-spec-cell { white-space: normal; max-width: 200px; }
.mt-table td.mt-txt { white-space: pre-line; min-width: 150px; max-width: 240px; }
.mt-table td.mt-res { max-width: 220px; overflow: hidden; text-overflow: ellipsis; }
.mt-spec { margin: 0 0 12px; }
.mt-spec summary { cursor: pointer; font-size: 12.5px; color: #2563eb; padding: 4px 0; }
.mt-spec .mt-table-wrap { margin-top: 6px; }
.mt-spec .mt-table { min-width: 520px; }
/* 台账两个搜索框宽度：桌面放宽，窄屏收紧让「刷新 / 导出 Excel」同排，避免主按钮被挤到单独一行 */
#rlKw { min-width: 220px; }
#mtKw { min-width: 190px; }
@media (max-width: 900px) {
  #rlKw { min-width: 150px; }
  #mtKw { min-width: 128px; }
}

/* ══════════ 面板「顶部标签 + 单页全宽」（2026-10-24）══════════
   用户要求：不要左右两栏，要像工作量看板那样一页一页切（标签互斥、一次只显示一页）。
   标签条复用 .lt-tabs；每张卡 grid-column:1/-1 占满一行，靠 .hidden 互斥切换。 */
#taskBoard .mgmt-grid { max-width: 1500px; }
#formCollectPanel .mgmt-grid { max-width: 1200px; }
#taskBoard .mgmt-card,
#formCollectPanel .mgmt-card,
#announcementMgmt .mgmt-card,
#knowledgeMgmt .mgmt-card,
#accountMgmt .mgmt-card { align-self: start; }

/* ══════════ 通用二次确认弹层 ══════════ */
.cfm-sheet { width: min(92vw, 420px); margin: 20vh auto 0; }
.cfm-body { padding: 18px 18px 2px; }
.cfm-text { font-size: 14px; color: #1f2a44; line-height: 1.6; word-break: break-all; }
.cfm-warn {
  margin-top: 10px; font-size: 12.5px; color: #c0392b; background: #fdeaea;
  border-radius: 8px; padding: 8px 10px; line-height: 1.55;
}
.cfm-acts { display: flex; justify-content: flex-end; gap: 10px; padding: 16px 18px 18px; }
.cfm-acts button {
  font-size: 14px; padding: 9px 20px; border-radius: 8px; cursor: pointer;
  border: 1px solid #d9dde3; background: #fff; color: #3c4a63; font-family: inherit;
}
.cfm-acts button:hover { background: #f4f6fa; }
.cfm-acts .cfm-ok { background: #2563eb; border-color: #2563eb; color: #fff; }
.cfm-acts .cfm-ok:hover { background: #255cc9; }
.cfm-acts .cfm-ok.danger { background: #e04545; border-color: #e04545; }
.cfm-acts .cfm-ok.danger:hover { background: #c93a3a; }

/* ══════════ 个人信息处理告知书 · 签署情况（2026-10-25）══════════
 * 复用 .wl-table 的视觉语言，只补三样：表格容器横向滚动、状态徽标、次要信息降灰。
 * 10 列在窄屏必然放不下，靠 .cs-table-wrap 横滚，不裁内容。
 */
.cs-table-wrap {
  width: 100%;
  border-radius: 12px;
  overflow-x: auto;
  overflow-y: hidden;
  box-shadow: 0 2px 10px rgba(0,0,0,.08);
  border: 1px solid #e8ecf2;
  background: #fff;
}
.cs-table {
  width: 100%;
  min-width: 880px;
  border-collapse: collapse;
  font-size: 13.5px;
  text-align: center;
}
.cs-table thead { background: #1f2a44; color: #fff; }
.cs-table th {
  padding: 11px 8px;
  font-weight: 600;
  white-space: nowrap;
  letter-spacing: .4px;
}
.cs-table td {
  padding: 10px 8px;
  border-bottom: 1px solid #eef1f6;
  color: #333;
  vertical-align: middle;
  white-space: nowrap;
}
.cs-table tbody tr:nth-child(even) { background: #f8fafc; }
.cs-table tbody tr:hover { background: #eef4ff; }
.cs-table tbody tr:last-child td { border-bottom: none; }
.cs-table td:first-child { font-weight: 600; color: #1f2a44; }
/* 设备与 IP 是辅助信息，不抢视觉 */
.cs-table td.cs-dim { color: #8b95a5; font-size: 12px; line-height: 1.5; white-space: normal; }

/* 状态徽标：绿=已签、橙=待办（未签/需重签）、红=已撤回 */
.cs-badge {
  display: inline-block;
  padding: 3px 9px;
  border-radius: 10px;
  font-size: 12px;
  font-weight: 600;
  line-height: 1.5;
  white-space: nowrap;
}
.cs-badge.cs-ok   { background: #e8f8ee; color: #1f8a4c; }
.cs-badge.cs-warn { background: #fdf3e3; color: #b26a00; }
.cs-badge.cs-bad  { background: #fdeaea; color: #c0342b; }

/* ══════════════════════════════════════════════════════════════════
   三线整治项目（2026-10-28）
   沿用现有视觉语言：主色 #2563eb、白卡片 + 1px 边框、圆角 8~10。
   六环节横向看板，窄屏退化为纵向列表。
   ══════════════════════════════════════════════════════════════════ */

.sx-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: 14px; }
.sx-toolbar input, .sx-toolbar select { padding: 7px 10px; border: 1px solid #d9dde3; border-radius: 8px; font-size: 13px; }
.sx-toolbar button { padding: 7px 14px; border: none; border-radius: 8px; background: #2563eb; color: #fff; font-size: 13px; cursor: pointer; }
.sx-toolbar button.ghost { background: #fff; color: #40506b; border: 1px solid #d9dde3; }

.sx-board { display: flex; gap: 12px; overflow-x: auto; align-items: flex-start; padding-bottom: 6px; }
.sx-col { flex: 0 0 250px; background: #f7f9fc; border-radius: 10px; padding: 10px; }
.sx-col-hd { display: flex; align-items: center; justify-content: space-between; font-size: 13px; font-weight: 600; color: #1f2a44; margin-bottom: 8px; }
.sx-col-hd .n { font-size: 12px; font-weight: 500; color: #7a8699; background: #fff; border-radius: 10px; padding: 1px 8px; }
.sx-col.empty .sx-col-hd { color: #9aa5b5; }

.sx-card { background: #fff; border: 1px solid #e6eaf0; border-radius: 8px; padding: 10px; margin-bottom: 8px; cursor: pointer; transition: border-color .15s, box-shadow .15s; }
.sx-card:hover { border-color: #9fbdf7; box-shadow: 0 2px 8px rgba(37,99,235,.10); }
.sx-card .no { font-family: ui-monospace, Consolas, monospace; font-size: 11px; color: #2563eb; }
.sx-card .tt { font-size: 13px; font-weight: 600; color: #1f2a44; margin: 3px 0; line-height: 1.35; }
.sx-card .mt { font-size: 12px; color: #7a8699; line-height: 1.6; }
.sx-card .daily { display: inline-block; margin-top: 5px; font-size: 11px; color: #1a9c5b; background: #eafaf1; border-radius: 4px; padding: 1px 6px; }
.sx-card .due { display: inline-block; margin-top: 5px; font-size: 11px; color: #b26a00; background: #fdf3e3; border-radius: 4px; padding: 1px 6px; }
.sx-empty { font-size: 12px; color: #a8b2c1; text-align: center; padding: 12px 0; }

/* 弹层 */
.sx-modal { width: min(940px, 94vw); max-height: 90vh; background: #fff; border-radius: 12px; display: flex; flex-direction: column; overflow: hidden; }
.sx-modal-hd { display: flex; align-items: center; justify-content: space-between; padding: 14px 18px; border-bottom: 1px solid #eef1f6; }
.sx-modal-hd b { font-size: 15px; color: #1f2a44; }
.sx-close { background: none; border: none; font-size: 22px; line-height: 1; color: #9aa5b5; cursor: pointer; padding: 0 4px; }
.sx-close:hover { color: #1f2a44; }
.sx-modal-bd { padding: 16px 18px 20px; overflow-y: auto; }

/* 环节进度条 */
.sx-steps { display: flex; gap: 4px; margin-bottom: 16px; }
.sx-step { flex: 1; text-align: center; font-size: 12px; color: #9aa5b5; padding: 7px 4px; border-radius: 6px; background: #f4f6f9; position: relative; }
.sx-step.done { background: #eef4ff; color: #2563eb; font-weight: 600; }
.sx-step.cur { background: #2563eb; color: #fff; font-weight: 600; }
.sx-step.rej { background: #fdeaea; color: #c0342b; }

/* 信息块 */
.sx-kv { display: grid; grid-template-columns: 96px 1fr; gap: 6px 12px; font-size: 13px; margin-bottom: 14px; }
.sx-kv dt { color: #7a8699; }
.sx-kv dd { color: #1f2a44; word-break: break-all; }

.sx-sec { border: 1px solid #eef1f6; border-radius: 10px; padding: 12px 14px; margin-bottom: 12px; }
.sx-sec-t { font-size: 13px; font-weight: 600; color: #1f2a44; margin-bottom: 10px; display: flex; align-items: center; justify-content: space-between; }
.sx-sec-t .tag { font-size: 11px; font-weight: 500; color: #1a9c5b; background: #eafaf1; border-radius: 4px; padding: 1px 6px; }

.sx-form { display: flex; flex-direction: column; gap: 10px; }
.sx-form label { font-size: 12px; color: #5a6880; display: block; margin-bottom: 4px; }
.sx-form input[type=text], .sx-form input[type=date], .sx-form input[type=number],
.sx-form input:not([type]), .sx-form textarea, .sx-form select {
  width: 100%; padding: 8px 10px; border: 1px solid #d9dde3; border-radius: 8px;
  font-size: 13px; font-family: inherit; box-sizing: border-box; background: #fff; color: #1d2129;
}
.sx-form input[type=number] { -moz-appearance: textfield; }
.sx-form input[type=number]::-webkit-outer-spin-button,
.sx-form input[type=number]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.sx-form input:focus, .sx-form select:focus, .sx-form textarea:focus {
  outline: none; border-color: #2563eb; box-shadow: 0 0 0 3px rgba(37,99,235,.12);
}
.sx-form select { appearance: none; -webkit-appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%2386909c' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 10px center; padding-right: 28px;
}
/* 两列布局不被长文本撑破 */
.sx-form .row2 { grid-template-columns: minmax(0,1fr) minmax(0,1fr); }
.sx-form textarea { min-height: 64px; resize: vertical; }
.sx-form .row2 { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1fr); gap: 10px; }
.sx-actions { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 4px; }
.sx-actions button { padding: 9px 16px; border: none; border-radius: 8px; font-size: 13px; cursor: pointer; }
.sx-actions .primary { background: #2563eb; color: #fff; }
.sx-actions .ok { background: #16a34a; color: #fff; }
.sx-actions .danger { background: #fff; color: #c0342b; border: 1px solid #f0b8b3; }
.sx-actions .ghost { background: #fff; color: #40506b; border: 1px solid #d9dde3; }

/* 图片缩略 */
.sx-imgs { display: flex; gap: 6px; flex-wrap: wrap; }
.sx-imgs img, .sx-imgs .add { width: 62px; height: 62px; border-radius: 6px; object-fit: cover; border: 1px solid #e6eaf0; }
.sx-imgs .add { display: flex; align-items: center; justify-content: center; font-size: 20px; color: #9aa5b5; cursor: pointer; background: #f7f9fc; }
.sx-imgs .del { position: relative; }
.sx-imgs .del::after { content: "×"; position: absolute; top: -6px; right: -6px; width: 18px; height: 18px; border-radius: 50%; background: #e04545; color: #fff; font-size: 13px; line-height: 18px; text-align: center; cursor: pointer; }

/* 每日核实 */
.sx-daily { display: flex; flex-direction: column; gap: 8px; }
.sx-daily-item { border-left: 3px solid #2563eb; background: #fafcff; border-radius: 6px; padding: 9px 12px; font-size: 13px; }
.sx-daily-item .d { font-weight: 600; color: #1f2a44; }
.sx-daily-item .n { color: #40506b; margin-top: 3px; line-height: 1.6; }
.sx-daily-item .m { color: #7a8699; font-size: 12px; margin-top: 4px; }
.sx-daily-item .num { color: #1a9c5b; font-weight: 600; }

@media (max-width: 900px) {
  .sx-board { flex-direction: column; overflow-x: visible; }
  .sx-col { flex: 1 1 auto; width: 100%; }
  .sx-steps { flex-wrap: wrap; }
  .sx-step { flex: 1 1 30%; }
  .sx-form .row2 { grid-template-columns: 1fr; }
}

/* 三线整治修正（2026-10-28）：.mask 是 overflow:auto 且非 flex，弹层必须自己居中 */
.sx-modal { margin: 30px auto; max-height: calc(100vh - 60px); }
/* 七个环节列平分视口，避免最后一列被挤出屏幕；窄屏时退回固定宽 + 横向滚动 */
.sx-board { gap: 10px; }
.sx-col { flex: 1 1 176px; min-width: 168px; }

/* 卡片标题最多两行，超出省略号（标题里带区域+类型+地址，容易长到三行把卡片撑高） */
.sx-card .tt { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }

/* ══════════════════════════════════════════════════════════════════
   UI 调整：参考「现代工作台」风格（2026-10-28）
   ──────────────────────────────────────────────────────────────────
   参照用户给的设计稿，抓四个特征：
     1. 底色浅灰蓝，卡片纯白且大圆角 + 极柔阴影（没有硬边框）；
     2. 顶栏白底，导航选中项是**蓝色实心胶囊 + 白字**，不是浅色底；
     3. 主色用更稳的蓝 #2563eb（原来的 #2f6fed 偏荧光）；
     4. 表格表头极浅、行分隔淡化，状态用圆角胶囊。
   全部为追加覆盖，删掉本段即回到原样。
   ══════════════════════════════════════════════════════════════════ */

body { background: #f0f4fa; }

/* ── 顶栏：白底 + 细边，标题深灰蓝 ── */
header {
  background: #ffffff;
  border-bottom: 1px solid #e8edf5;
  color: #1a2233;
  box-shadow: none;
}
header .title { color: #1a2233; font-weight: 700; letter-spacing: .2px; }
header .user { color: #5a6b85; }
header #logoutBtn {
  background: #fff; color: #40506b;
  border: 1px solid #dfe6f0; border-radius: 9px; padding: 6px 14px;
}
header #logoutBtn:hover { background: #f4f7fc; border-color: #cbd7e8; color: #1a2233; }
header .ca-link { color: #8b98ab; }
header .ca-link:hover { background: #f1f5fb; color: #2563eb; }

/* ── 导航：白底 + 蓝色实心胶囊（参考稿的关键特征） ── */
.topnav {
  background: #ffffff;
  border-bottom: 1px solid #e8edf5;
  padding: 8px 18px;
  gap: 6px;
}
.topnav button {
  color: #5a6b85;
  background: transparent;
  font-weight: 500;
  border-radius: 10px;
  padding: 8px 16px;
  transition: background-color .15s, color .15s;
}
.topnav button:hover { background: #f2f6fc; color: #2563eb; }
.topnav button.active {
  background: #2563eb;
  color: #ffffff;
  font-weight: 600;
  box-shadow: 0 4px 12px -4px rgba(37, 99, 235, .5);
}

/* ── 卡片：白 + 大圆角 + 柔和双层阴影，去硬边框 ── */
.mgmt-card {
  background: #ffffff;
  border: none;
  border-radius: 14px;
  box-shadow: 0 1px 2px rgba(16, 24, 40, .04), 0 10px 26px -14px rgba(16, 24, 40, .16);
}
.track-cfg {
  background: #fff;
  border: none;
  border-radius: 12px;
  box-shadow: 0 1px 2px rgba(16, 24, 40, .04), 0 8px 20px -14px rgba(16, 24, 40, .14);
}

/* ── 按钮：圆角 9，主色调统一 ── */
button, .btn { border-radius: 9px; font-weight: 500; }
button:active:not(:disabled) { transform: translateY(0.5px); }

/* ── 表单：浅边框 + 聚焦蓝光晕 ── */
input, select, textarea {
  border: 1px solid #dfe6f0;
  border-radius: 9px;
  background: #fff;
  transition: border-color .15s, box-shadow .15s;
}
input:focus, select:focus, textarea:focus {
  outline: none;
  border-color: #2563eb;
  box-shadow: 0 0 0 3px rgba(37, 99, 235, .12);
}

/* ── 子标签：浅灰槽 + 白块激活 ── */
.lt-tabs { background: #eef2f9; border: none; border-radius: 11px; padding: 4px; gap: 3px; }
.lt-tab { border-radius: 8px; font-weight: 500; color: #5a6b85; }
.lt-tab.active {
  background: #fff; color: #2563eb; font-weight: 600;
  box-shadow: 0 1px 3px rgba(16, 24, 40, .10);
}

/* ── 表格：表头极浅、行分隔淡、悬停微亮 ── */
.mt-table thead th {
  background: #f8fafd;
  color: #40506b;
  font-weight: 600;
  border-bottom: 1px solid #eef2f8;
}
.mt-table tbody td { border-bottom: 1px solid #f2f5fa; }
.mt-table tbody tr:hover { background: #fafcff; }

/* ── 状态标签：统一圆角胶囊 ── */
.t-chip { border-radius: 7px; font-weight: 500; }
.sx-col { background: #eef2f9; border-radius: 12px; }
.sx-card {
  background: #fff; border: none; border-radius: 10px;
  box-shadow: 0 1px 2px rgba(16, 24, 40, .05);
}
.sx-card:hover { box-shadow: 0 4px 14px -6px rgba(37, 99, 235, .35); }

/* ── 滚动条 ── */
::-webkit-scrollbar { width: 9px; height: 9px; }
::-webkit-scrollbar-thumb {
  background: rgba(26, 34, 51, .16); border-radius: 99px;
  border: 2px solid transparent; background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover { background: rgba(26, 34, 51, .28); background-clip: content-box; }

/* 顶栏右侧统一（2026-10-28）
 * 问题：原始 CSS 只给 #logoutBtn 写了样式，#chgPwdBtn 一行都没有 ——
 * 深色顶栏时代它能勉强藏在背景里，换成白底后直接露出浏览器默认按钮的黑框白底。
 * 另外「用户名 / 证书 / 修改密码」原本是三种不同的灰，看着零散。
 * 统一成一套层级：用户名是信息色，证书与修改密码是同一个弱化的工具入口，只有「退出」是按钮。
 */
header .user { color: #5a6b85; gap: 10px; }

header .ca-link,
header #chgPwdBtn {
  color: #93a0b4;
  font-size: 13px;
  line-height: 1;
  padding: 7px 10px;
  border: none;
  background: none;
  border-radius: 8px;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  transition: background-color .15s, color .15s;
}
header .ca-link:hover,
header #chgPwdBtn:hover { background: #f2f6fc; color: #2563eb; }

header #logoutBtn {
  background: #fff;
  color: #40506b;
  border: 1px solid #dfe6f0;
  border-radius: 9px;
  padding: 6px 14px;
  font-size: 13px;
  cursor: pointer;
  transition: background-color .15s, border-color .15s, color .15s;
}
header #logoutBtn:hover { background: #f4f7fc; border-color: #cbd7e8; color: #1a2233; }

/* 三线整治修正（2026-10-28）：列宽均分 + 资源标签间距 */
.sx-col { flex: 1 1 0; min-width: 150px; }   /* 原来 1 1 176px 会让空列被压窄，七列宽度不一 */
.nt-res-wrap { position: relative; }
.nt-tags { margin-top: 10px; }
.nt-tip { margin-top: 6px; }

/* 七列改用 grid 强制等宽（flex 在内容长度差异下会被撑开，实测七列宽度仍然不一） */
.sx-board {
  display: grid;
  grid-template-columns: repeat(7, minmax(0, 1fr));
  gap: 10px;
  overflow-x: auto;
  align-items: start;
}
.sx-col { flex: none; min-width: 0; }
@media (max-width: 900px) {
  .sx-board { grid-template-columns: 1fr; }
}

/* ══════════════════════════════════════════════════════════════════
   Codex-inspired operations workspace (2026-10-29)
   ──────────────────────────────────────────────────────────────────
   A calmer, denser workbench: neutral surfaces, a persistent left rail,
   crisp typography and one restrained blue accent. Existing component
   selectors are kept intact so the current admin.js behaviour is unchanged.
   ══════════════════════════════════════════════════════════════════ */

:root {
  --ui-bg: #f8fbff;
  --ui-surface: #ffffff;
  --ui-surface-soft: #fbfdff;
  --ui-ink: #151b26;
  --ui-muted: #566273;
  --ui-faint: #7e8a9a;
  --ui-line: #e8edf4;
  --ui-line-strong: #d5dee9;
  --ui-accent: #1677ff;
  --ui-accent-soft: #edf5ff;
  --ui-radius-lg: 16px;
  --ui-radius-md: 12px;
  --ui-shadow: 0 1px 2px rgba(15, 23, 42, .025), 0 10px 26px -22px rgba(15, 23, 42, .18);
  --ui-font: "Microsoft YaHei UI", "Microsoft YaHei", "PingFang SC", "Segoe UI Variable", "Noto Sans SC", sans-serif;
}

html, body { height: 100%; }
body {
  font-family: var(--ui-font);
  color: var(--ui-ink);
  background:
    radial-gradient(circle at 8% 0%, rgba(22, 119, 255, .07), transparent 30rem),
    radial-gradient(circle at 96% 92%, rgba(22, 119, 255, .045), transparent 34rem),
    linear-gradient(180deg, #ffffff 0%, #f9fcff 58%, #f4f9ff 100%);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: geometricPrecision;
  font-synthesis: none;
}

::selection { background: rgba(37, 99, 235, .18); }

/* ── Login: a quiet, centered entry point ── */
.login-box {
  position: relative;
  width: min(380px, calc(100vw - 32px));
  margin: 13vh auto 0;
  padding: 30px;
  background: #ffffff;
  border: 1px solid var(--ui-line);
  border-radius: 20px;
  box-shadow: 0 20px 55px -32px rgba(15, 23, 42, .28);
  backdrop-filter: none;
}
.login-brand {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 15px;
  font-weight: 600;
  letter-spacing: 0;
}
.login-sub {
  margin: 7px 0 28px 44px;
  color: var(--ui-faint);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .10em;
  text-transform: uppercase;
}
.login-box h2 {
  margin-bottom: 18px;
  font-size: 22px;
  font-weight: 600;
  letter-spacing: -.015em;
}
.login-box input {
  height: 43px;
  margin-bottom: 10px;
  padding: 0 13px;
  border: 1px solid var(--ui-line-strong);
  border-radius: 10px;
  background: #fbfdff;
  font: inherit;
  font-size: 14px;
}
.login-box button {
  height: 43px;
  margin-top: 4px;
  border-radius: 10px;
  background: var(--ui-accent);
  color: #fff;
  font-size: 14px;
  font-weight: 600;
  transition: background-color .15s, transform .15s;
}
.login-box button:hover { background: #0f63d8; }
.login-box button:active { transform: translateY(1px); }
.login-box .err { margin-top: 10px; }

/* ── Shared brand mark ── */
.brand-mark {
  display: inline-grid;
  place-items: center;
  flex: 0 0 34px;
  width: 34px;
  height: 34px;
  border-radius: 10px;
  background: var(--ui-accent);
  color: #fff;
  font-size: 15px;
  font-weight: 700;
  line-height: 1;
  box-shadow: 0 6px 16px -10px rgba(22, 119, 255, .8), inset 0 1px 0 rgba(255, 255, 255, .26);
}

/* ── App frame: left rail + content column ── */
#app {
  display: grid;
  grid-template-columns: 248px minmax(0, 1fr);
  grid-template-rows: 64px minmax(0, 1fr);
  height: 100vh;
  overflow: hidden;
  background: transparent;
}
.nav-toggle {
  display: none;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  padding: 0;
  border: 0;
  border-radius: 8px;
  background: transparent;
  color: var(--ui-ink, #1f2a44);
  cursor: pointer;
}
.nav-toggle svg { display: block; width: 22px; height: 22px; }
.nav-backdrop { display: none; }

#app > header {
  grid-column: 2;
  grid-row: 1;
  height: 64px;
  padding: 0 28px;
  background: #ffffff;
  border-bottom: 1px solid var(--ui-line);
  box-shadow: 0 1px 2px rgba(15, 23, 42, .025);
  backdrop-filter: none;
  color: var(--ui-ink);
}
.topbar-context { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.topbar-context .eyebrow {
  color: var(--ui-faint);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .08em;
  line-height: 1.2;
  text-transform: uppercase;
}
header .title {
  color: var(--ui-ink);
  font-size: 19px;
  font-weight: 600;
  letter-spacing: -.015em;
  line-height: 1.25;
}
header .user { color: var(--ui-muted); gap: 8px; }
header #who {
  padding: 6px 10px;
  border-radius: 8px;
  background: #f2f7fd;
  color: #4f5e72;
  font-size: 12.5px;
  line-height: 1;
}
header .ca-link,
header #chgPwdBtn {
  color: #7b8797;
  font-size: 12.5px;
  padding: 7px 9px;
  border-radius: 8px;
}
header .ca-link:hover,
header #chgPwdBtn:hover { background: #eef5ff; color: #0f63d8; }
header #logoutBtn {
  padding: 7px 13px;
  border: 1px solid var(--ui-line-strong);
  border-radius: 9px;
  background: #fff;
  color: #4d5a6c;
  font-size: 12.5px;
}
header #logoutBtn:hover { background: #f3f8ff; border-color: #c6d5e8; color: #0f63d8; }

/* ── Navigation rail ── */
#app > .topnav {
  grid-column: 1;
  grid-row: 1 / span 2;
  display: flex;
  flex-direction: column;
  min-height: 0;
  padding: 14px 12px 12px;
  background: rgba(255, 255, 255, .9);
  border-right: 1px solid var(--ui-line);
  border-bottom: 0;
  overflow: hidden;
}
.nav-brand {
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: 44px;
  padding: 0 8px 12px;
  border-bottom: 1px solid var(--ui-line);
}
.brand-copy { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.brand-copy b { color: var(--ui-ink); font-size: 15px; font-weight: 600; letter-spacing: 0; }
.brand-copy small {
  color: #7d8999;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: .11em;
  text-transform: uppercase;
}
.nav-items {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: 4px;
  min-height: 0;
  padding: 14px 0 10px;
  overflow-y: auto;
  overscroll-behavior: contain;
  scrollbar-width: thin;
  scrollbar-color: #d6e2f1 transparent;
}
.topnav button {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  min-height: 40px;
  padding: 8px 10px;
  border: 0;
  border-radius: 9px;
  background: transparent;
  color: #626a75;
  font-size: 13.5px;
  font-weight: 500;
  text-align: left;
  transition: background-color .15s, color .15s;
}
.topnav button:hover { background: #f1f7ff; color: #0f63d8; }
.topnav button.active {
  background: #eaf3ff;
  color: #0f63d8;
  font-weight: 600;
  box-shadow: inset 0 0 0 1px #d8e8ff;
}
.nav-ico {
  display: grid;
  place-items: center;
  flex: 0 0 18px;
  width: 18px;
  height: 18px;
  color: #8793a3;
  transition: color .15s;
}
.nav-ico svg { display: block; width: 17px; height: 17px; }
.topnav button:hover .nav-ico { color: #0f63d8; }
.topnav button.active .nav-ico { color: var(--ui-accent); }
.nav-label { flex: 1 1 auto; min-width: 0; white-space: nowrap; }
.topnav .nav-badge {
  flex: 0 0 auto;
  min-width: 18px;
  margin-left: auto;
  padding: 0 6px;
  border-radius: 999px;
  background: #e5484d;
  color: #fff;
  font-size: 10px;
  font-weight: 600;
  line-height: 18px;
  text-align: center;
}
.nav-foot {
  display: flex;
  align-items: center;
  gap: 7px;
  padding: 12px 8px 0;
  border-top: 1px solid var(--ui-line);
  color: #7d8999;
  font-size: 11px;
}
.status-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: #30a46c;
  box-shadow: 0 0 0 3px rgba(48, 164, 108, .12);
}
.nav-version { margin-left: auto; font-family: ui-monospace, "Cascadia Code", Consolas, monospace; font-size: 10px; }

/* ── Content areas ── */
#app > .layout,
#app > #announcementMgmt,
#app > #knowledgeMgmt,
#app > #formCollectPanel,
#app > #accountMgmt,
#app > #profileMgmt,
#app > #workloadMgmt,
#app > #anomalyMgmt,
#app > #logMgmt,
#app > #consentMgmt,
#app > #resLedgerMgmt,
#app > #resLibMgmt,
#app > #taskBoard {
  grid-column: 2;
  grid-row: 2;
  min-width: 0;
  min-height: 0;
}
#app > #announcementMgmt,
#app > #knowledgeMgmt,
#app > #formCollectPanel,
#app > #accountMgmt,
#app > #profileMgmt,
#app > #workloadMgmt,
#app > #anomalyMgmt,
#app > #logMgmt,
#app > #consentMgmt,
#app > #resLedgerMgmt,
#app > #resLibMgmt,
#app > #taskBoard {
  height: 100%;
  padding: 24px;
  overflow-y: auto;
}
#app > .layout {
  display: grid;
  grid-template-columns: 300px minmax(0, 1fr);
  gap: 16px;
  height: 100%;
  padding: 16px;
  overflow: hidden;
}
#app > .layout > .left {
  min-height: 0;
  padding: 16px;
  border: 1px solid var(--ui-line);
  border-right: 1px solid var(--ui-line);
  border-radius: var(--ui-radius-lg);
  background: var(--ui-surface);
  box-shadow: var(--ui-shadow);
}
#app > .layout > .center {
  min-width: 0;
  min-height: 0;
  overflow: hidden;
  border: 1px solid var(--ui-line);
  border-radius: var(--ui-radius-lg);
  background: #eef4fa;
  box-shadow: var(--ui-shadow);
}

/* ── Dashboard cards and filters ── */
.cards { gap: 10px; margin-bottom: 18px; }
.card {
  padding: 14px;
  border: 1px solid #eceef1;
  border-radius: 12px;
  background: #fafafa;
  text-align: left;
}
.card .num { color: #1f2328; font-size: 26px; font-weight: 600; letter-spacing: -.025em; line-height: 1.1; }
.card .lbl { margin-top: 5px; color: var(--ui-muted); font-size: 12px; }
.card.clickable:hover { background: #f2f6fc; border-color: #cbd9ef; box-shadow: none; }
.section-title { margin: 4px 0 10px; color: #4f5e72; font-size: 12.5px; font-weight: 600; letter-spacing: .01em; }
.worker-filter { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
.worker-filter input,
.worker-filter select { min-width: 0; height: 34px; padding: 0 9px; border-color: var(--ui-line); border-radius: 8px; font-size: 11.5px; }
.worker-filter input[type="date"],
.worker-filter select { grid-column: span 1; }
.worker-filter #wfTeam,
.worker-filter #wfName,
.worker-filter #wfPhone,
.worker-filter #wfReset { grid-column: 1 / -1; }
.worker-filter button { height: 32px; border-radius: 8px; background: #f3f4f5; font-size: 11.5px; }
.worker { padding: 9px 10px; border-color: #eceef1; border-radius: 10px; }
.worker:hover { background: #f7f8fa; }
.worker.active { border-color: #b9cdf0; background: var(--ui-accent-soft); }

/* ── Map toolbar: light, compact, easy to scan ── */
.map-bar {
  flex-wrap: wrap;
  gap: 8px;
  padding: 10px 12px;
  background: #ffffff;
  border-bottom: 1px solid var(--ui-line);
  color: #4d5560;
  backdrop-filter: none;
}
.map-bar .base-tip { color: #667386; font-size: 12px; }
.map-bar .traj-modes { gap: 4px; }
.map-bar .traj-modes button {
  padding: 5px 10px;
  border: 1px solid #e1e4e8;
  border-radius: 7px;
  background: #f7f8f9;
  color: #4d5560;
  font-size: 12px;
}
.map-bar .traj-modes button:hover { background: #eef1f4; }
.map-bar .traj-modes button.active { background: #20242a; border-color: #20242a; color: #fff; }
.map-bar .traj-modes .tm-refresh { background: #fff; color: #4d5560; }
.map-bar .tm-all { color: #5d6a7c; font-size: 12px; }
#map { background: #e8edf3; }
.map-tip {
  padding: 7px 11px;
  border: 1px solid rgba(255, 255, 255, .8);
  border-radius: 9px;
  background: rgba(255, 255, 255, .9);
  box-shadow: 0 8px 24px -16px rgba(15, 23, 42, .45);
  color: #5d646e;
  font-size: 11.5px;
  backdrop-filter: blur(10px);
}
.geo-search .gs-box { border: 1px solid rgba(255, 255, 255, .8); border-radius: 9px; box-shadow: 0 10px 28px -18px rgba(15, 23, 42, .45); }
.geo-search .gs-box input { height: 38px; }

/* ── Management panels ── */
.mgmt-grid { max-width: 1440px; margin: 0 auto; gap: 18px; }
.mgmt-grid {
  width: 100%;
  max-width: none;
  margin: 0;
}
.mgmt-card {
  padding: 22px;
  border: 1px solid var(--ui-line);
  border-radius: var(--ui-radius-lg);
  background: var(--ui-surface);
  box-shadow: var(--ui-shadow);
}

/* 管理页与实时看板共用左侧内容边界，避免大屏切页时整块内容突然居中跳位。 */
#app > #announcementMgmt,
#app > #knowledgeMgmt,
#app > #formCollectPanel,
#app > #accountMgmt,
#app > #profileMgmt,
#app > #workloadMgmt,
#app > #anomalyMgmt,
#app > #logMgmt,
#app > #consentMgmt,
#app > #resLedgerMgmt,
#app > #resLibMgmt,
#app > #taskBoard {
  padding: 20px 22px 28px;
}

#taskBoard .mgmt-grid,
#taskBoard .mgmt-card,
#taskBoard .lt-tabs {
  max-width: none;
}

#taskBoard .mgmt-card {
  min-width: 0;
}

/* 任务看板筛选区用稳定网格，避免宽屏下按钮被挤到第二行左侧。 */
#tbBoardCard .tb-head {
  display: block;
}

#tbBoardCard .tb-head .tb-filters {
  display: grid;
  grid-template-columns: repeat(6, minmax(0, 1fr));
  width: 100%;
  gap: 9px;
}

#tbBoardCard .tb-head .tb-filters .mini {
  width: 100%;
  min-width: 0;
}

#tbBoardCard #tfKw {
  grid-column: span 2;
}

#tbBoardCard #tfReset,
#tbBoardCard #tfExport {
  justify-self: stretch;
}
.mgmt-card h3 { color: var(--ui-ink); font-size: 16px; font-weight: 600; letter-spacing: 0; }
.mgmt-form { gap: 9px; }
.mgmt-form input,
.mgmt-form select,
.mgmt-form textarea,
.filter-bar input,
.filter-bar select,
.acc-filter input,
.acc-filter select {
  border-color: var(--ui-line-strong);
  border-radius: 9px;
  background: #fff;
  font-family: var(--ui-font);
}
.mgmt-form input,
.mgmt-form select { height: 40px; }
.mgmt-form textarea { min-height: 82px; padding: 10px 12px; }
.mgmt-form button { min-height: 40px; border-radius: 9px; background: var(--ui-accent); font-weight: 600; }
.mgmt-form button:hover { background: #0f63d8; }
.filter-bar {
  gap: 7px;
  padding: 9px;
  border: 1px solid #eceef1;
  border-radius: 12px;
  background: #f8fbff;
}
.filter-bar .fb-btn { min-height: 34px; border-radius: 8px; background: var(--ui-accent); font-size: 12.5px; }
.filter-bar .fb-btn.ghost { background: #fff; border: 1px solid var(--ui-line); color: #4d5560; }
.lt-tabs {
  gap: 3px;
  padding: 3px;
  border: 0;
  border-radius: 11px;
  background: #f0f5fb;
}
.lt-tab { min-height: 36px; padding: 8px 14px; border-radius: 8px; color: #586678; font-size: 13px; font-weight: 600; }
.lt-tab:hover { background: #fff; color: #0f63d8; }
.lt-tab.active { background: #fff; color: #0f63d8; box-shadow: 0 1px 3px rgba(16, 24, 40, .08), inset 0 0 0 1px #e6edf6; }
.track-cfg { border: 1px solid var(--ui-line); border-radius: 12px; box-shadow: none; }

/* ── Tables and chips ── */
.mt-table thead th,
.cs-table thead th { background: #f7f8f9; color: #555d68; font-weight: 600; }
.mt-table tbody td { border-bottom-color: #f0f1f3; }
.mt-table tbody tr:hover { background: #fafbfc; }
.badge,
.pc-badge,
.t-chip { border-radius: 999px; font-weight: 600; }
.task,
.rl-row,
.mgmt-item,
.sx-card { border-color: var(--ui-line); border-radius: 10px; }
.task:hover { background: #fafbfc; border-color: #cfd8e6; }

/* ── Bright, crisp workbench polish ── */
html { background: #f8fbff; }
.mini {
  padding: 5px 9px;
  border-radius: 7px;
  font-size: 12.5px;
}
.tb-head { margin-bottom: 16px; }
.tb-filters { gap: 10px; }
.tb-tab.active { background: var(--ui-accent); }
.mini.primary { background: var(--ui-accent); border-color: var(--ui-accent); }
.mini.primary:hover { background: #0f63d8; }
.filter-bar .fb-btn:hover,
.filter-bar .fb-btn.ghost:hover { background: #eef5ff; color: #0f63d8; }
.mi-meta { color: #687587; }
input, select, textarea, button, .btn { font-family: var(--ui-font); }
input::placeholder, textarea::placeholder { color: #9aa6b5; opacity: 1; }
.worker-filter input,
.worker-filter select,
.worker-filter button { font-size: 12px; }
header .user { color: #536070; }
.mt-table thead th,
.cs-table thead th { background: #f6f9fd; color: #4f5e72; }

/* ── Dialogs ── */
.mask { background: rgba(15, 23, 42, .38); backdrop-filter: blur(3px); }
.sheet,
.sx-modal { border: 1px solid rgba(255, 255, 255, .65); border-radius: 16px; box-shadow: 0 30px 90px -26px rgba(15, 23, 42, .48); }
.sheet .hd,
.sx-modal-hd { border-bottom-color: var(--ui-line); }
.sheet .hd span,
.sx-modal-hd b { color: var(--ui-ink); font-weight: 600; }

/* ── Subtle page transition ── */
#app > .layout,
#app > #announcementMgmt,
#app > #knowledgeMgmt,
#app > #formCollectPanel,
#app > #accountMgmt,
#app > #profileMgmt,
#app > #workloadMgmt,
#app > #anomalyMgmt,
#app > #logMgmt,
#app > #consentMgmt,
#app > #resLedgerMgmt,
#app > #resLibMgmt,
#app > #taskBoard {
  animation: workspaceIn .24s ease-out both;
}
@keyframes workspaceIn {
  from { opacity: 0; transform: translateY(5px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  #app > .layout,
  #app > #announcementMgmt,
  #app > #knowledgeMgmt,
  #app > #formCollectPanel,
  #app > #accountMgmt,
  #app > #profileMgmt,
  #app > #workloadMgmt,
  #app > #anomalyMgmt,
  #app > #logMgmt,
  #app > #consentMgmt,
  #app > #resLedgerMgmt,
  #app > #resLibMgmt,
  #app > #taskBoard { animation: none; }
}

/* ── Responsive: rail becomes a compact horizontal switcher ── */
@media (max-width: 1120px) {
  #app { grid-template-columns: 220px minmax(0, 1fr); }
  #app > .layout { grid-template-columns: 280px minmax(0, 1fr); }
  .topnav button { padding-left: 8px; padding-right: 8px; }
}

@media (max-width: 980px) {
  #app {
    display: flex;
    flex-direction: column;
    height: auto;
    min-height: 100vh;
    overflow: visible;
  }
  #app > header {
    order: 1;
    height: 58px;
    padding: 0 16px;
  }
  #app > .topnav {
    order: 2;
    display: block;
    flex: none;
    padding: 0 10px;
    border-right: 0;
    border-bottom: 1px solid var(--ui-line);
    background: rgba(255, 255, 255, .92);
    overflow-x: auto;
    overflow-y: hidden;
  }
  .nav-brand,
  .nav-foot { display: none; }
  .nav-items {
    flex-direction: row;
    gap: 3px;
    padding: 7px 0;
    overflow: visible;
  }
  .topnav button {
    flex: 0 0 auto;
    width: auto;
    min-height: 34px;
    padding: 6px 10px;
    border-radius: 8px;
    white-space: nowrap;
  }
  .nav-ico { display: none; }
  .nav-label { white-space: nowrap; }
  #app > .layout,
  #app > #announcementMgmt,
  #app > #knowledgeMgmt,
  #app > #formCollectPanel,
  #app > #accountMgmt,
  #app > #profileMgmt,
  #app > #workloadMgmt,
  #app > #anomalyMgmt,
  #app > #logMgmt,
  #app > #consentMgmt,
  #app > #resLedgerMgmt,
  #app > #resLibMgmt,
  #app > #taskBoard {
    order: 3;
    height: auto;
    min-height: calc(100vh - 99px);
    padding: 14px;
  }
  #app > .layout {
    display: grid;
    grid-template-columns: 1fr;
    height: auto;
    min-height: calc(100vh - 99px);
    overflow: visible;
  }
  #tbBoardCard .tb-head .tb-filters {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  #tbBoardCard #tfKw {
    grid-column: 1 / -1;
  }
  #app > .layout > .left { max-height: none; }
  #app > .layout > .center { min-height: 62vh; }
  .mgmt-grid { grid-template-columns: 1fr !important; }
}

@media (max-width: 640px) {
  /* 手机端：侧栏默认隐藏，汉堡按钮显示；点开浮出侧栏 + 半透明遮罩 */
  .nav-toggle { display: flex; flex-shrink: 0; }
  #app { grid-template-columns: 1fr; }
  #app > header { grid-column: 1; grid-row: 1; display: flex; align-items: center; gap: 10px; }
  #app > .topnav {
    position: fixed;
    top: 0; left: 0; bottom: 0;
    width: 240px;
    max-width: 82vw;
    grid-column: auto; grid-row: auto;
    transform: translateX(-105%);
    transition: transform .22s ease;
    z-index: 1000;
    background: #ffffff;
    box-shadow: 2px 0 16px rgba(15, 23, 42, .18);
    border-right: 1px solid var(--ui-line);
    overflow-y: auto;
  }
  #app.nav-open > .topnav { transform: translateX(0); }
  /* 遮罩：侧栏展开时盖住内容区，点一下关闭 */
  #app > .nav-backdrop {
    display: none;
    position: fixed;
    inset: 0;
    background: rgba(15, 23, 42, .42);
    z-index: 999;
  }
  #app.nav-open > .nav-backdrop { display: block; }
  #app > .layout,
  #app > #announcementMgmt,
  #app > #knowledgeMgmt,
  #app > #formCollectPanel,
  #app > #accountMgmt,
  #app > #profileMgmt,
  #app > #workloadMgmt,
  #app > #anomalyMgmt,
  #app > #logMgmt,
  #app > #consentMgmt,
  #app > #resLedgerMgmt,
  #app > #resLibMgmt,
  #app > #taskBoard { grid-column: 1; }

  .topbar-context .eyebrow { display: none; }
  header .title { font-size: 16px; }
  header #who { display: none; }
  #app > header { padding: 0 12px; }
  .topnav button { padding: 7px 9px; font-size: 12px; }
  #app > .layout,
  #app > #announcementMgmt,
  #app > #knowledgeMgmt,
  #app > #formCollectPanel,
  #app > #accountMgmt,
  #app > #profileMgmt,
  #app > #workloadMgmt,
  #app > #anomalyMgmt,
  #app > #logMgmt,
  #app > #consentMgmt,
  #app > #resLedgerMgmt,
  #app > #resLibMgmt,
  #app > #taskBoard { padding: 8px; }
  #app > .layout > .left { padding: 13px; }
  #tbBoardCard .tb-head .tb-filters {
    grid-template-columns: 1fr;
  }
  #tbBoardCard #tfKw {
    grid-column: auto;
  }
  .map-bar { align-items: flex-start; }
  .map-bar .base-tip { display: none; }
  .map-bar .traj-modes { flex-wrap: wrap; }
  .mgmt-card { padding: 15px; border-radius: 13px; }
}

@media (min-width: 2000px) {
  #app { grid-template-columns: 270px minmax(0, 1fr); }
  #app > .layout { grid-template-columns: 320px minmax(0, 1fr); }
  .topnav button { min-height: 42px; font-size: 15px; }
  .brand-copy b { font-size: 16px; }
  .brand-copy small,
  .topbar-context .eyebrow { font-size: 12px; }
  header .title { font-size: 20px; }
  .mini { padding: 6px 11px; font-size: 13.5px; }
  .lt-tab { min-height: 38px; padding: 9px 16px; font-size: 14px; }
  .mgmt-card { padding: 26px; }
  .mgmt-card h3 { font-size: 17px; }
}

/* ═══════════ 红线内杆路可视化 · 地图定制（2026-11-04）═══════════ */
/* 底图调暗：仅针对高德瓦片 pane 加暗，不进点位/弹窗 */
#rodMap .leaflet-tile-pane,
#rodMap .leaflet-map-pane canvas {
  filter: brightness(0.82) saturate(0.9) contrast(1.05);
}
/* 有照片的点：圆形缩略图，亮色描边 */
.rod-photo-marker {
  box-sizing: border-box;
  background-color: #eef1f4; /* 图片加载前的底色 */
}
.rod-photo-marker img,
.rod-photo-marker {
  -webkit-user-select: none; user-select: none;
}
/* 无照片的点：亮色圆点 hover 放大 */
.rod-dot-marker {
  transition: transform .12s ease;
}
.rod-dot-marker:hover { transform: scale(1.25); }

/* 杆路地图工具栏（2026-11-05）：统一风格，圆润紧凑 */
.rod-bar {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 14px;
  background: #fff; border-radius: 12px;
  border: 1px solid #e8edf3;
}
.rod-stats {
  font-size: 13px; color: #6b7a8d; white-space: nowrap;
  padding-right: 10px; border-right: 1px solid #e8edf3; margin-right: 2px;
}
.rod-search-wrap {
  position: relative; flex: 1; min-width: 200px;
}
.rod-search-icon {
  position: absolute; left: 11px; top: 50%; transform: translateY(-50%);
  width: 16px; height: 16px; color: #9aa8b8; pointer-events: none;
}
.rod-search-inp {
  width: 100%; padding: 8px 12px 8px 34px !important;
  border: 1px solid #dde3ea; border-radius: 9px;
  font-size: 13px; background: #f8fafb;
  transition: border-color .15s, box-shadow .15s;
}
.rod-search-inp:focus {
  border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59,130,246,.12);
  background: #fff; outline: none;
}
.rod-search-inp::placeholder { color: #b4c0cf; }
.rod-bar .rod-btn {
  padding: 8px 18px; min-height: 36px; border-radius: 9px;
  font-size: 13px; font-weight: 500; border: none; cursor: pointer;
  white-space: nowrap; transition: all .12s;
}
.rod-bar .rod-btn:first-of-type { background: #2563eb; color: #fff; }
.rod-bar .rod-btn:first-of-type:hover { background: #1d4ed8; }
.rod-bar .rod-btn.ghost { background: #f1f4f8; color: #556270; border: 1px solid #e0e5ec; }
.rod-bar .rod-btn.ghost:hover { background: #e8ecf2; color: #3b4050; }
.rod-chk {
  display: flex; align-items: center; gap: 7px;
  font-size: 13px; color: #556070; cursor: pointer; white-space: nowrap;
  padding-left: 4px; border-left: 1px solid #e8edf3; margin-left: 2px; padding-left: 12px;
}
.rod-chk input[type=checkbox] { accent-color: #2563eb; width: 15px; height: 15px; cursor: pointer; }
.rod-bar .rod-district {
  padding: 6px 10px; min-height: 36px; border: 1px solid #d9dde3; border-radius: 9px;
  font-size: 13px; color: #333; background: #fff; cursor: pointer; outline: none;
  transition: border-color .12s;
}
.rod-bar .rod-district:focus { border-color: #2563eb; box-shadow: 0 0 0 3px rgba(37,99,235,.12); }

/* ── 杆路详情弹层：不遮左侧 248px 导航栏 ── */
#rodDetailMask {
  position: fixed;
  top: 0; left: 248px; right: 0; bottom: 0;
  z-index: 2000;
  background: rgba(0,0,0,.45);
  display: flex; align-items: flex-start; justify-content: center;
  overflow-y: auto;
  padding: 40px 20px 60px;
}
#rodDetailMask.hidden { display: none !important; }
#rodDetailMask .modal {
  background: #fff;
  border-radius: 14px;
  box-shadow: 0 12px 40px rgba(0,0,0,.18);
  max-width: 560px;
  width: 100%;
  overflow: hidden;
}
#rodDetailMask .modal-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 14px 18px;
  border-bottom: 1px solid #eef0f3;
  font-size: 15px;
}
#rodDetailMask .modal-x {
  background: none; border: none; font-size: 20px; line-height: 1; cursor: pointer;
  color: #8a94a6; padding: 0 4px;
}
#rodDetailMask .modal-x:hover { color: #1f2a44; }
#rodDetailMask .modal-body { padding: 16px 18px; }

/* 照片灯箱中点击放大的杆路照片 */
#rodPhotoLightbox {
  position: fixed; inset: 0; z-index: 9999;
  background: rgba(0,0,0,.92);
  display: flex; align-items: center; justify-content: center;
  cursor: pointer;
}
#rodPhotoLightbox.hidden { display: none !important; }
#rodPhotoLightbox img {
  max-width: 94vw; max-height: 94vh;
  border-radius: 8px;
  box-shadow: 0 4px 30px rgba(0,0,0,.4);
}

/* ─── 三线整治 V2 弹窗（2026-11-06）─────────────────────────────────────────
 * 之前用了 btn-mini 等未定义的类，导致按钮显示成浏览器默认样式。
 * 这里与主页面 .sx-toolbar button 保持一致：主色 #2563eb、圆角 8px。
 * ------------------------------------------------------------------------ */
.sx-form button {
  padding: 8px 16px; border: none; border-radius: 8px;
  background: #2563eb; color: #fff; font-size: 13px; cursor: pointer;
  font-family: inherit;
}
.sx-form button:hover { background: #1d4ed8; }
.sx-form button:disabled { background: #c3cee0; cursor: not-allowed; }
.sx-form button.btn-mini {
  background: #fff; color: #40506b; border: 1px solid #d9dde3; padding: 6px 12px;
}
.sx-form button.btn-mini:hover { background: #f2f6ff; border-color: #9db6ee; }

/* 图片缩略图：固定尺寸 + 右上角删除 + 点击放大 */
.sx-img { position: relative; width: 62px; height: 62px; flex: none; }
.sx-img img {
  width: 62px; height: 62px; object-fit: cover; border-radius: 6px;
  border: 1px solid #e6eaf0; display: block; cursor: zoom-in;
}
.sx-img-x {
  position: absolute; right: -5px; top: -5px; width: 18px; height: 18px;
  border-radius: 50%; background: rgba(0,0,0,.6); color: #fff; font-size: 12px;
  line-height: 18px; text-align: center; text-decoration: none;
}
.sx-img-add {
  display: flex; align-items: center; justify-content: center; font-size: 22px;
  color: #9aa5b5; cursor: pointer; background: #f7f9fc;
  border: 1px dashed #d9dde3; border-radius: 6px; width: 62px; height: 62px;
}

/* 资源搜索结果：限高可滚动（手机上不至于一屏拉不完）+ 整行勾选 */
.sx2-hits { max-height: 250px; overflow-y: auto; border: 1px solid #eef1f4; border-radius: 8px; background: #fff; }
.sx2-hit {
  display: flex; align-items: center; gap: 10px; padding: 8px 10px;
  border-bottom: 1px solid #f4f6f9; font-size: 13px; cursor: pointer;
}
.sx2-hit:last-child { border-bottom: none; }
.sx2-hit:hover { background: #f7faff; }
.sx2-hit.on { background: #eef4ff; }
.sx2-hit input[type=checkbox] { width: 16px; height: 16px; flex: none; cursor: pointer; accent-color: #2563eb; }
.sx2-hit .nm { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sx2-hit .tp { color: #6b7280; font-size: 12px; flex: none; }

/* 图片放大遮罩 */
.sx2-lightbox {
  position: fixed; inset: 0; background: rgba(0,0,0,.85); z-index: 99999;
  display: flex; align-items: center; justify-content: center; cursor: zoom-out;
}
.sx2-lightbox img { max-width: 92vw; max-height: 92vh; object-fit: contain; }

/* 三线整治导出菜单（2026-11-12） */
.sx2-exp-item{display:flex;align-items:center;justify-content:space-between;gap:14px;
  padding:8px 12px;border-radius:5px;cursor:pointer;font-size:13px;color:#1d2129}
.sx2-exp-item:hover{background:#f2f7ff;color:#2563eb}
.sx2-exp-item .n{color:#86909c;font-size:12px}
.sx2-exp-item:hover .n{color:#2563eb}

/* 数字 + 单位 组合（2026-11-12）：紧凑内联，标签/数字/单位三件套 */
.sx-num { display: inline-flex; align-items: center; gap: 6px; }
.sx-num input { width: 88px !important; flex: none; text-align: center; }
.sx-num .u { font-size: 12px; color: #86909c; flex: none; }
.sx-num .k { font-size: 12.5px; color: #4e5969; flex: none; white-space: nowrap; }
.sx-num-row { display: flex; align-items: center; gap: 22px; flex-wrap: wrap; }
