* { box-sizing: border-box; }
body { margin: 0; font-family: -apple-system, "Microsoft YaHei", sans-serif; background: #f5f6f8; color: #333; }

.hidden { display: none !important; }

/* 登录 */
.login-wrap { min-height: 100vh; display: flex; align-items: center; justify-content: center; }
.login-card { background: #fff; padding: 36px 32px; border-radius: 10px; box-shadow: 0 4px 24px rgba(0,0,0,.08); width: 340px; display: flex; flex-direction: column; gap: 12px; }
.login-card h1 { margin: 0; font-size: 22px; text-align: center; }
.login-card .sub { margin: 0 0 8px; text-align: center; color: #888; font-size: 13px; }
.msg { color: #d33; font-size: 13px; min-height: 18px; }
.login-form { display: flex; flex-direction: column; gap: 12px; }

/* 主应用 */
.app header { background: #1f3b5c; color: #fff; padding: 14px 24px; display: flex; justify-content: space-between; align-items: center; }
.app header h1 { margin: 0; font-size: 18px; }
.header-right { display: flex; align-items: center; gap: 12px; font-size: 14px; }
main { max-width: 1100px; margin: 20px auto; padding: 0 16px; display: flex; flex-direction: column; gap: 16px; }

.card { background: #fff; border-radius: 8px; padding: 16px 20px; box-shadow: 0 1px 4px rgba(0,0,0,.06); }
.card h2 { margin: 0 0 12px; font-size: 16px; }

.row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 8px; }
.row:last-child { margin-bottom: 0; }
input, select, textarea { padding: 8px 10px; border: 1px solid #ccc; border-radius: 6px; font-size: 14px; }
input, select { min-width: 140px; }
/* 上面那条 min-width 是给**文本框**的（一行里几个输入框，别窄成一条），
   但勾选框也是 <input>，照样吃这一条：原生 13px 的方框被撑成 160px 宽，
   方框贴在最左边、名字被推到 160px 外——看着就是「勾选框跟人隔了老远」。
   全站勾选框（派活名单、批量派活的企业多选、隐患条）都在这里还原一次。
   手机端当初是在 mobile.css 里单独给 #new-roster-pick 写死 17px 绕过去的，
   桌面端一直漏着，这里补上根上的。 */
input[type="checkbox"] { min-width: 0; width: auto; padding: 0; }
textarea { flex: 1; min-width: 260px; resize: vertical; }

button { padding: 8px 16px; border: none; border-radius: 6px; cursor: pointer; font-size: 14px; }
button.primary { background: #1f6feb; color: #fff; }
button.ghost { background: #eef1f5; color: #444; }
button.danger { background: #fdecec; color: #c0392b; margin-left: 6px; }
button:disabled { opacity: .5; cursor: not-allowed; }

/* 台账「操作」列：修改 / 删除并排。表格列本来就窄，默认 padding 会把两颗按钮
   挤成上下两块（看着像两个色块堆在一起）。这里收窄按钮、禁止换行。 */
.hz-acts { display: flex; gap: 6px; align-items: center; white-space: nowrap; }
.hz-acts button { margin: 0; padding: 4px 10px; font-size: 12px; }

.muted { color: #888; font-size: 13px; }

/* 企业搜索下拉 */
.search-select { position: relative; flex: 1; min-width: 260px; }
.search-select input { width: 100%; }
.search-panel { position: absolute; top: 100%; left: 0; right: 0; z-index: 10; margin-top: 4px; background: #fff; border: 1px solid #ccc; border-radius: 6px; max-height: 240px; overflow-y: auto; box-shadow: 0 6px 16px rgba(0,0,0,.12); }
.search-panel .item { padding: 8px 10px; cursor: pointer; font-size: 14px; border-bottom: 1px solid #f0f0f0; }
.search-panel .item:hover { background: #eef4ff; }
.search-panel .item:last-child { border-bottom: none; }
.search-panel .sub { color: #999; font-size: 12px; margin-left: 6px; }
.search-panel .hint { padding: 7px 10px; color: #1f6feb; font-size: 14px; font-weight: 600; background: #eef4ff; border-bottom: 1px solid #d6e4ff; }
.search-panel .empty { padding: 8px 10px; color: #999; font-size: 13px; }

/* 识别结果卡片 */
.result-card { border: 1px solid #e0e0e0; border-radius: 8px; padding: 14px; margin-top: 8px; background: #fafbfc; }
.result-card.needs-review { border-color: #f0ad4e; background: #fffaf0; }
.result-card .hdr { font-weight: 600; margin-bottom: 8px; }
.result-card .tag { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 12px; margin-right: 6px; background: #eef1f5; }
.result-card .tag.major { background: #fde8e8; color: #c00; }
.result-card .tag.warn { background: #fef0d8; color: #a70; }
.result-card ul { margin: 6px 0; padding-left: 20px; }
.result-card ul li { margin: 3px 0; }
.result-card .v-del { padding: 0 7px; margin-left: 8px; font-size: 12px; line-height: 18px; font-weight: bold; background: #e8f5e9; color: #2e7d32; border-radius: 4px; }
.result-card .v-del:hover { background: #c8e6c9; }
.result-card .v-del.wrong { background: #fde8e8; color: #c00; }
.result-card .v-del.wrong:hover { background: #f5b7b7; }
.result-card .v-del.trim { background: #e3f2fd; color: #1565c0; }
.result-card .v-del.trim:hover { background: #bbdefb; }
.result-card li.trim { list-style: none; padding: 6px 8px; background: #fafbfc; border: 1px solid #e8ecf1; border-radius: 6px; }
.result-card .subitems { margin: 6px 0 0; padding-left: 4px; }
.result-card .subitem { display: block; margin: 4px 0; font-size: 13px; color: #333; cursor: pointer; }
.result-card .subitem input { margin-right: 6px; vertical-align: middle; }
/* 子条缩进一级（层级来自 clauseSubItems 的 depth），与手机端同一套判据 */
.result-card .subitem--kid { padding-left: 20px; }
/* 父条勾住＝这一支整条要裁掉，子条跟着勾上并锁住（disabled），不给单独改。
   整行压暗一点，与手机端同一套（见 mobile.css）。 */
.result-card .subitem--locked { opacity: .45; cursor: default; }
.result-card label { display: block; margin: 6px 0 2px; font-size: 13px; color: #666; }

/* 表格 */
table { width: 100%; border-collapse: collapse; margin-top: 8px; }
th, td { text-align: left; padding: 8px 10px; border-bottom: 1px solid #eee; font-size: 14px; }
th { background: #f7f8fa; color: #555; }
.badge { display: inline-block; padding: 2px 6px; border-radius: 4px; font-size: 12px; background: #eef1f5; }
.badge.warn { background: #fef0d8; color: #a70; }
.badge.edit { background: #e3f2fd; color: #1565c0; }
.badge.major { background: #fde8e8; color: #c00; }
.badge.ok { background: #e6f4ea; color: #1a7f37; }
.review-section { margin-top: 8px; padding: 8px 0 2px; border-top: 1px dashed #d0d7de; display: flex; align-items: center; gap: 8px; }
.review-section .review-label { font-size: 13px; color: #57606a; font-weight: 600; }

/* 待整理草稿 */
.draft-box { margin-top: 12px; border-top: 1px dashed #d0d7de; padding-top: 10px; }
.draft-box b { font-size: 14px; }
.draft-item { display: flex; align-items: center; gap: 8px; padding: 6px 8px; margin-top: 6px; border: 1px solid #e8ecf1; border-radius: 6px; background: #fbfcfe; }
.draft-item .draft-date { flex: none; font-size: 12px; color: #888; background: #f0f2f5; padding: 2px 6px; border-radius: 4px; }
.draft-item .draft-desc { flex: 1; font-size: 14px; }
.draft-item .tag { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 12px; background: #eef1f5; white-space: nowrap; }
.draft-item .tag.major { background: #fde8e8; color: #c00; }
.draft-item .tag.warn { background: #fef0d8; color: #a70; }
.draft-item .draft-actions { display: flex; gap: 6px; }

/* 企业端整改上传表单 */
.upload-form { margin-top: 10px; display: flex; flex-direction: column; gap: 8px; }
.upload-form textarea { width: 100%; min-height: 64px; flex: none; }
.upload-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.file-btn { display: inline-block; padding: 6px 12px; background: #eef1f5; border: 1px solid #d6dae0; border-radius: 6px; cursor: pointer; font-size: 13px; color: #444; }
.file-btn input { display: none; }

/* 顶部标签导航（电脑） */
.tabs { max-width: 1100px; margin: 16px auto 0; padding: 0 16px; display: flex; gap: 8px; }
.tab { padding: 10px 20px; background: #eef1f5; color: #555; border-radius: 8px; font-size: 15px; }
.tab:hover { background: #e2e8f0; }
.tab.active { background: #1f3b5c; color: #fff; font-weight: 600; }
.tab-panel { display: flex; flex-direction: column; gap: 16px; }

/* 手机：整体排版 + 标签导航变底部导航 */
@media (max-width: 640px) {
  /* 底部导航 */
  .tabs { position: fixed; bottom: 0; left: 0; right: 0; z-index: 20; margin: 0; padding: 0; background: #fff; border-top: 1px solid #e5e5e5; box-shadow: 0 -2px 8px rgba(0,0,0,.05); }
  .tab { flex: 1; border-radius: 0; background: transparent; color: #666; font-size: 14px; padding: 12px 0; }
  .tab.active { background: transparent; color: #1f6feb; font-weight: 600; }

  /* 标题栏 */
  .app header { padding: 12px 16px; }
  .app header h1 { font-size: 16px; }

  /* 内容区 */
  main { padding: 0 12px; margin-top: 14px; margin-bottom: 76px; }
  .card { padding: 14px; }
  .card h2 { font-size: 15px; }

  /* 输入框：全宽竖排，16px 防 iOS 聚焦缩放 */
  input, select, textarea { width: 100%; min-width: 0; font-size: 16px; padding: 10px 12px; }
  .search-select { min-width: 0; }

  /* 按钮：触控友好 */
  button { font-size: 15px; padding: 10px 14px; }

  /* 表格：横向滑动，不撑破页面 */
  table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }
  th, td { white-space: nowrap; font-size: 13px; padding: 7px 8px; }

  /* 登录卡片自适应 */
  .login-wrap { padding: 16px; }
  .login-card { width: 100%; }
}

/* ⑥ 企业管理：左列表 + 右档案 */
/* 左右各自滚动、整块锁一个高度。不锁的话左栏把卡片撑多高，右栏就跟着多高——
   14 家已经空出一屏，140 家会彻底没法用。210px = 顶栏 + 标签栏 + 卡片头，量准后再调。 */
.ent-split { display: flex; gap: 16px; align-items: stretch; height: calc(100vh - 210px); min-height: 360px; }
.ent-list { flex: 0 0 260px; border-right: 1px solid #eee; padding-right: 12px; display: flex; flex-direction: column; min-height: 0; }
.ent-list .item { padding: 8px 10px; border-radius: 6px; cursor: pointer; font-size: 14px; }
.ent-list .item:hover { background: #eef4ff; }
.ent-list .item.active { background: #1f6feb; color: #fff; }
.ent-list .item.active .sub { color: #dbe7ff; }
.ent-list .item .sub { color: #888; font-size: 12px; display: block; }
/* 企业名可能很长（盐城悦凯机械有限公司），截断而不是换行 */
.ent-list .item .nm { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 企业管理左栏只有 260px：搜索框 + 勾选 + 刷新硬塞一行，输入框会被压成一条缝，
   placeholder 都显示不全。搜索框和刷新独占一行（输入吃满剩余宽度），
   「只看手机建档」另起一行。 */
.ent-admin-tools { display: flex; gap: 8px; align-items: center; margin-bottom: 8px; }
#ent-admin-q { flex: 1; min-width: 0; }
.ent-admin-tools button { flex: none; white-space: nowrap; padding-left: 12px; padding-right: 12px; }
.ent-admin-field {
  display: flex; align-items: center; gap: 6px;
  font-size: 13px; color: #556; cursor: pointer; margin-bottom: 8px;
}
.ent-admin-field input[type="checkbox"] { margin: 0; }
/* 只有列表滚，筛选框和「共 N 家」钉在上面 */
#ent-admin-count { margin-bottom: 6px; }
#ent-admin-table { overflow-y: auto; flex: 1; min-height: 0; }
.ent-dossier { flex: 1; min-width: 0; overflow-y: auto; }
.ent-dossier h3 { margin: 0; font-size: 16px; }
.ent-dossier .meta { color: #555; font-size: 13px; margin-bottom: 10px; }
/* 标题行：企业名 + 删除按钮。删除按钮原来是夹在信息块和检查历史之间的红边大按钮，
   既抢眼又挨着常用区；改成次要样式（灰底小号、hover 才变红），放到标题行最右 */
.dz-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 4px; }
/* 标题行右侧那两颗（编辑资料 / 删除该企业）。flex:none 是必须的：企业名长了之后
   它俩会被压扁换行，而这两颗是这一行唯一的操作入口。 */
.dz-acts { display: flex; align-items: center; gap: 8px; flex: none; }
.del-ent { background: #eef1f5; color: #666; font-size: 12px; padding: 2px 10px; border-radius: 4px; }
.del-ent:hover { background: #fdecec; color: #c0392b; }
/* 编辑资料表单：浅底一坨，跟只读的信息块明显分开 —— 它不是档案的一部分，
   是「正在改」的状态，不能长成只读区的样子让人以为已经存进去了。 */
.ent-edit { background: #f7f9fc; border: 1px solid #e3e8ef; border-radius: 6px; padding: 10px 12px; margin: 10px 0 14px; }
.ent-edit .muted { font-size: 12px; line-height: 1.6; }
.ent-dossier .sec { margin-top: 14px; border-top: 1px solid #eee; padding-top: 10px; }
.ent-dossier .sec > .sec-h { font-weight: 600; font-size: 14px; margin-bottom: 6px; }
.insp-row { border: 1px solid #e8ecf1; border-radius: 6px; margin-bottom: 6px; }
/* 只有头部可点（下钻出来的隐患清单不在头部里，点它不会收起检查） */
.insp-head { padding: 8px 10px; cursor: pointer; }
.insp-head:hover { background: #fafbfc; }
/* 展开的那次检查：行头轻微染色 + 边框加深。比下面隐患行的选中蓝**更浅**——
   两层都铺同一个蓝，就分不出谁是父谁是子。 */
.insp-row.open { border-color: #c9d8f0; }
.insp-row.open .insp-head { background: #f8fafd; }
.insp-row .hdr { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; font-size: 14px; }
.insp-row .cnt { font-size: 12px; padding: 1px 7px; border-radius: 4px; background: #eef1f5; }
/* 展开箭头。原来行首什么都没有，只有 hover 才知道能点 */
.chev { color: #aaa; font-size: 10px; width: 10px; display: inline-block; transition: transform .15s; }
.chev.open { transform: rotate(90deg); }
/* 状态色一条规则：**彩色 = 状态，灰实心胶囊 = 描述性**（分类/定级/风险/数量）。
   所以「已结束」用灰**描边**而不是灰实心，跟描述性胶囊区分开；「进行中」紫，
   刻意避开销号计数在用的绿/黄/蓝，免得「进行中」和「待整改」看着像同一类东西 */
.insp-row .insp-status { font-size: 12px; padding: 1px 7px; border-radius: 4px; border: 1px solid #dfe4ea; color: #8a93a0; }
.insp-row .insp-status.ongoing { border-color: transparent; background: #ece5ff; color: #5b3cc4; }
.insp-row .cnt.closed { background: #e8f5e9; color: #2e7d32; }
.insp-row .cnt.pending { background: #fef0d8; color: #a70; }
.insp-row .cnt.submitted { background: #e3f2fd; color: #1565c0; }
.insp-row .reports { color: #666; font-size: 12px; margin-top: 4px; }
/* 隐患清单：整张清单一条竖脊，行和详情块共用——「这一坨都属于上面那次检查」。
   竖脊原来画在 .hz-row 自己的 border-left 上、详情块却缩进 20px 且底色跟行的 hover
   是同一个值，于是详情块看着像「一行刚好被鼠标停住了」，跟相邻隐患分不开。
   分层的视觉重量由此定死：卡片阴影 > 检查行 1px 边框 > 清单竖脊 2px 灰 > 展开层填色。 */
.hz-list { border-left: 2px solid #dfe6ee; margin: 6px 0 6px 6px; }
/* 隐患行分列：专家复查时是**竖着扫一列**（「这批都什么风险等级」），原来是空格连排的
   一整句，读不出列来。编号/分类/定级/风险/状态定宽，描述列弹性并截断。
   列数 = 箭头 + 编号 + 描述 + 分类 + 定级 + 风险 + 状态 */
.hz-row {
  display: grid; align-items: center; gap: 8px;
  grid-template-columns: 10px 74px minmax(0, 1fr) 92px 72px 72px 84px;
  padding: 7px 10px; margin: 0 0 2px; border-radius: 0 4px 4px 0;
  cursor: pointer; font-size: 13px;
}
.hz-row .no { color: #888; }
.hz-row .desc { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.hz-row:hover { background: #f4f7fb; }
/* 展开的那条整行变色 + 描述加粗。原来只有箭头转 90°，行本身毫无变化，
   「哪条开着」在视觉上没有答案（用户：「跟相邻隐患分隔不清」）。
   用选中企业那套蓝，全站「当前这一条」一个色。 */
.hz-row.open { background: #eef4ff; }
.hz-row.open .desc { font-weight: 600; color: #1f3b5c; }
/* 详情块：白底 + 1px 边框 + 左侧 3px 强调色，从竖脊上「长出来」。margin-top 0 紧贴
   它所属的那一行——原来上下都留白、又是个灰块，看起来是独立的一坨浮在中间。 */
.hz-detail {
  margin: 0 0 6px; padding: 10px 12px;
  background: #fff; border: 1px solid #d6e4ff; border-left: 3px solid #1f6feb;
  border-radius: 0 6px 6px 0; font-size: 13px;
}
/* label 定宽成列：描述：/ 分类：/ 引用条款： 长度不一，原来值的起点是锯齿状的。
   只对带头 label 的 .kv 用 grid；附件那行没 label（.atts），否则图片会被摊进列里。 */
.hz-detail .kv { display: grid; grid-template-columns: 5.5em minmax(0, 1fr); gap: 8px; margin: 4px 0; }
.hz-detail .kv > b { color: #666; font-weight: 600; }
/* 条款正文限宽：main 是 1100px 通栏，一行 80+ 字，读起来串行 */
.hz-detail ul { max-width: 82ch; line-height: 1.6; margin: 4px 0 8px; padding-left: 20px; }
.hz-detail .atts { margin: 4px 0; }

/* 窄屏：企业管理改成上下堆叠，隐患行退回整行（grid 在 600px 以下会挤成一团）。
   这一页 spec 说了不管手机端，这条只是别让它挤烂，不做专门适配。 */
@media (max-width: 640px) {
  .ent-split { display: block; height: auto; }
  .ent-list { flex: none; border-right: none; padding-right: 0; margin-bottom: 12px; }
  #ent-admin-table { max-height: 260px; }
  .ent-dossier { overflow-y: visible; }
  .hz-list { margin-left: 4px; }
  .hz-row { display: block; }
  .hz-row .desc { white-space: normal; }
  .hz-row .chev { display: none; }
  .hz-detail .kv { grid-template-columns: 1fr; gap: 0; }
}

/* ---------- 模态框（重置密码的一次性口令） ---------- */
.modal { position: fixed; inset: 0; background: rgba(0,0,0,.45);
         display: flex; align-items: center; justify-content: center; z-index: 100; }
.modal__box { background: #fff; border-radius: 10px; padding: 24px 28px; min-width: 320px;
              max-width: 90vw; box-shadow: 0 8px 32px rgba(0,0,0,.2);
              display: flex; flex-direction: column; gap: 10px; }
.modal__box h3 { margin: 0; font-size: 17px; }
.modal__box p { margin: 0; font-size: 14px; }
/* 口令用等宽字体：要口头念给本人，字形分不清就会念错一位 */
.modal__pw { display: flex; align-items: center; gap: 8px; }
.modal__pw code { font-family: Consolas, "Courier New", monospace; font-size: 18px;
                  letter-spacing: 1px; background: #f5f6f8; padding: 8px 12px;
                  border-radius: 6px; user-select: all; }
.modal__warn { color: #d33; font-size: 13px !important; }

/* ---------- 派谁去（检查人员多选） ---------- */
.roster { margin: 6px 0 10px; }
.roster__title { font-size: 13px; color: #667; margin-bottom: 6px; }
.roster__picker { display: flex; flex-wrap: wrap; gap: 6px 14px; }
/* 一个选项不许换行：「崔亮（待批准）」断成两行后，勾选框和名字就分家了 */
.roster__item { display: inline-flex; align-items: center; gap: 4px;
                font-size: 13px; white-space: nowrap; cursor: pointer; }

/* ---------- 当天在册（派完活一眼看见今天派了哪些） ---------- */
.day { background: #fafbfc; border: 1px solid #e6e8eb; border-radius: 6px;
       padding: 8px 10px; margin-bottom: 12px; }
.day__list { max-height: 260px; overflow-y: auto; }
.day__list .empty { color: #999; font-size: 13px; padding: 4px 0; }
.daygroup { margin-bottom: 6px; }
.daygroup__head { font-size: 13px; font-weight: 600; color: #444;
                  margin: 6px 0 2px; display: flex; align-items: baseline; gap: 6px; }
.daygroup__head .sub { font-weight: 400; color: #999; font-size: 12px; }
.dayrow { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap;
          padding: 3px 6px; border-radius: 4px; font-size: 13px; cursor: pointer; }
.dayrow:hover { background: #eef3fb; }
.dayrow__name { min-width: 160px; }
.dayrow .sub { color: #888; font-size: 12px; }
.tag { font-size: 11px; padding: 1px 6px; border-radius: 9px; white-space: nowrap; }
.tag--done { background: #eef0f2; color: #666; }
.tag--todo { background: #fdeaea; color: #b42318; }
.tag--warn { background: #fff4e5; color: #b26a00; }

/* ---------- 名录批量建档（从 Excel 粘名单） ---------- */
.roster-import { margin-top: 10px; border-top: 1px dashed #ddd; padding-top: 8px; }
.roster-import summary { font-size: 13px; color: #1f6feb; cursor: pointer; margin-bottom: 8px; }
.roster-import textarea { width: 100%; box-sizing: border-box; font-family: inherit;
                          font-size: 13px; padding: 6px 8px; resize: vertical; }
.roster-import .muted { margin: 6px 0; }

/* ---------- 批量派活（企业多选） ---------- */
.batch { margin-top: 10px; border-top: 1px dashed #ddd; padding-top: 8px; }
.batch summary { font-size: 13px; color: #1f6feb; cursor: pointer; margin-bottom: 8px; }
/* 结果列表给固定高度 + 滚动：勾到 40 家时列表不能把「建检查」按钮顶到屏幕外面去，
   否则人勾完还得往下滚半天才点得到。 */
.batch__list { display: flex; flex-wrap: wrap; gap: 6px 14px;
               max-height: 180px; overflow-y: auto; margin: 6px 0 10px; }
.batch__list .empty { color: #999; font-size: 13px; }
.batch__item { display: inline-flex; align-items: center; gap: 4px;
               font-size: 13px; white-space: nowrap; cursor: pointer; }
.batch__item .sub { color: #999; font-size: 12px; }

/* ---------- 待复核队列（按企业分组、默认收起） ---------- */
/* 收起时一家只占一行（组头上就带着它家的条数）—— 这一屏正是为「企业一多」才从
   一行一条整改平铺改成这样的（用户 2026-10-16：「都排在一起等待审核怎吃得消」）。 */
.review-ent { margin-top: 10px; border-top: 1px dashed #ddd; padding-top: 8px; }
.review-ent summary { font-size: 14px; font-weight: 600; color: #1f6feb; cursor: pointer; }
.review-ent summary .muted { font-weight: 400; }
.review-ent[open] summary { margin-bottom: 8px; }

/* ---------- 普通管理员看到的「检查员」页（账号表复用） ---------- */
/* 他只能看检查员，也没有任何行操作，所以第 3 列（角色）与第 5 列（操作）
   对他整列都是空的，直接不显示。**藏列不是判权** —— 判权在 accountActions
   与后端：列藏了，行按钮也是真的没生成。 */
#account-section.roster-view #account-table th:nth-child(3),
#account-section.roster-view #account-table td:nth-child(3),
#account-section.roster-view #account-table th:nth-child(5),
#account-section.roster-view #account-table td:nth-child(5) { display: none; }

/* ---------- 账号表：行内编辑用户名 / 姓名 ---------- */
/* 输入框要够宽才看得见全名（表格默认列宽会把它压成一截），但别撑到把
   「保存/取消」挤出视野。 */
#account-table td input { width: 100%; max-width: 160px; box-sizing: border-box; }
/* 正在编的那一行底色挑出来：同一页上还有别的行摆着按钮，得让操作者一眼看出
   「现在敲的字会落到哪一行」。 */
#account-table tr.editing { background: #fffbe6; }
/* 提示行别长成一个可以点的行 —— 它只是说明文字，压在编辑行下面。 */
#account-table tr.row-hint td { padding: 0 8px 8px; font-size: 12px; color: #8a8f99; }
