/* ============================================================================
   文档二维码管理平台 —— 视觉体系 v2（2026-09-12 重制）
   ----------------------------------------------------------------------------
   设计语言：现代企业控制台（Modern Enterprise Console）
   · 层次：三层表面（页面底 #f5f7fa / 卡片 #fff / 内嵌块 #f7f9fc），
     卡片用「细边框 + 极浅投影」而非重投影，靠边界而非阴影分层。
   · 字族只有两套：正文 var(--font)，代码/编号 var(--mono)。
   · 字号 8 档化：12 / 13 / 14 / 15 / 16 / 18 / 20 / 24（--fs-*），
     不再出现 10/11/12.5/17/21 等散值；数字统一 tabular-nums 对齐。
   · 语义色一律「浅底 + 深字 + 同色细边」三件套，杜绝满饱和色块。
   · 主色 #2563eb（企业蓝）；破坏性操作用浅红描边而非实心红，降低视觉噪音。
   ============================================================================ */

:root{
  /* ---- 字族 ---- */
  --font:system-ui,-apple-system,"Segoe UI",Roboto,"PingFang SC","Hiragino Sans GB",
         "Microsoft YaHei UI","Microsoft YaHei","Source Han Sans SC","Noto Sans SC",sans-serif;
  --mono:ui-monospace,"SF Mono","Cascadia Mono","JetBrains Mono",Consolas,
         "Liberation Mono",Menlo,"Courier New",monospace;

  /* ---- 字号 8 档 ---- */
  --fs-xs:12px;   /* 辅助、徽标、表头 */
  --fs-sm:13px;   /* 表格、控件、正文次级 */
  --fs-base:14px; /* 正文 */
  --fs-md:15px;   /* 强调 */
  --fs-lg:16px;   /* 区块标题 */
  --fs-xl:18px;   /* 详情标题 */
  --fs-2xl:20px;  /* 登录主标题 */
  --fs-3xl:24px;  /* 空态数字 */

  /* ---- 中性色（冷灰阶） ---- */
  --n-0:#ffffff;  --n-25:#fcfdfe; --n-50:#f7f9fc;  --n-100:#eef2f7;
  --n-150:#e7ecf3;--n-200:#dde3ec;--n-300:#c8d0dc;--n-400:#98a4b6;
  --n-500:#6b7889;--n-600:#4e5a6b;--n-700:#37424f;--n-800:#222b36;--n-900:#131a23;

  /* ---- 表面 ---- */
  --bg:#f5f7fa;
  --bg-tint:#eef3fa;
  --card:#ffffff;
  --sunken:#f7f9fc;
  --line:#e4e9f0;
  --line-soft:#eef1f6;
  --line-strong:#d5dce6;
  --ink:#1b2430;
  --muted:#6b7889;
  --faint:#98a4b6;

  /* ---- 主色 ---- */
  --brand:#2563eb;
  --brand-d:#1d4ed8;
  --brand-l:#4f8bfa;
  --brand-soft:#eff5ff;
  --brand-soft2:#dbe8fe;
  --brand-line:#bfd6fb;
  --brand-ring:rgba(37,99,235,.16);
  --brand-grad:linear-gradient(180deg,#3d7bf7 0%,#2563eb 100%);

  /* ---- 语义色（浅底/深字/描边 三件套） ---- */
  --ok:#059669;      --ok-ink:#047857;      --ok-soft:#ecfdf5;   --ok-line:#a7f3d0;
  --warn:#d97706;    --warn-ink:#b45309;    --warn-soft:#fffbeb; --warn-line:#fde68a;
  --err:#dc2626;     --err-ink:#b91c1c;     --err-soft:#fef2f2;  --err-line:#fecaca;
  --info:#0284c7;    --info-ink:#0369a1;    --info-soft:#f0f9ff; --info-line:#bae6fd;
  --purple:#7c3aed;  --purple-ink:#6d28d9;  --purple-soft:#f5f3ff;--purple-line:#ddd6fe;

  /* ---- 形状与投影 ---- */
  --radius:14px;
  --radius-sm:10px;
  --radius-xs:8px;
  --shadow-xs:0 1px 2px rgba(16,24,40,.05);
  --shadow:0 1px 2px rgba(16,24,40,.04),0 6px 18px -8px rgba(16,24,40,.12);
  --shadow-lg:0 24px 56px -20px rgba(16,24,40,.28),0 2px 10px rgba(16,24,40,.06);
  --t:.16s cubic-bezier(.4,0,.2,1);
}

*{box-sizing:border-box}
[hidden]{display:none!important}
html{-webkit-text-size-adjust:100%}
body{margin:0;font-family:var(--font);background:var(--bg);color:var(--ink);
  font-size:var(--fs-base);line-height:1.55;letter-spacing:.005em;
  -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
::selection{background:var(--brand-soft2);color:var(--ink)}
h1,h2,h3,h4{margin:0;font-weight:650;letter-spacing:.005em;line-height:1.35}
button{font-family:inherit;cursor:pointer}
b,strong{font-weight:650}

/* 细滚动条 */
*::-webkit-scrollbar{width:10px;height:10px}
*::-webkit-scrollbar-track{background:transparent}
*::-webkit-scrollbar-thumb{background:#ccd4e0;border-radius:8px;border:2px solid transparent;background-clip:content-box}
*::-webkit-scrollbar-thumb:hover{background:#a9b5c6;background-clip:content-box}

/* ============================ 表单控件 ============================ */
input,select,textarea{font-family:inherit;font-size:var(--fs-sm);line-height:1.4;
  padding:8px 11px;border:1px solid var(--line-strong);border-radius:var(--radius-xs);
  background:#fff;color:var(--ink);transition:border-color var(--t),box-shadow var(--t),background var(--t)}
input::placeholder,textarea::placeholder{color:var(--faint)}
input:hover:not(:focus),select:hover:not(:focus),textarea:hover:not(:focus){border-color:var(--n-300)}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-ring)}
input:disabled,select:disabled,textarea:disabled{background:var(--n-50);color:var(--faint);cursor:not-allowed}
input[type=checkbox],input[type=radio]{accent-color:var(--brand);width:16px;height:16px;cursor:pointer;
  padding:0;border-radius:4px;vertical-align:-3px}
select{appearance:none;-webkit-appearance:none;padding-right:30px;cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%236b7889' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6l4 4 4-4'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 9px center;background-size:13px}

/* ============================ 按钮 ============================ */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;
  height:34px;padding:0 14px;border-radius:var(--radius-xs);border:1px solid transparent;
  font-size:var(--fs-sm);font-weight:600;line-height:1;white-space:nowrap;text-decoration:none;
  background:var(--brand-grad);color:#fff;
  box-shadow:0 1px 2px rgba(37,99,235,.26);
  transition:background var(--t),box-shadow var(--t),transform var(--t),border-color var(--t),color var(--t)}
.btn:hover{background:linear-gradient(180deg,#3474f4,#1d4ed8);box-shadow:0 3px 8px rgba(37,99,235,.3)}
.btn:active{transform:translateY(1px);box-shadow:0 1px 2px rgba(37,99,235,.22)}
.btn:focus-visible{outline:none;box-shadow:0 0 0 3px var(--brand-ring)}
.btn:disabled,.btn.disabled{opacity:.45;cursor:not-allowed;box-shadow:none;transform:none}
.btn:disabled:hover,.btn.disabled:hover{background:var(--brand-grad);box-shadow:none}

/* 次级按钮：中性灰描边，不再用蓝色文字，避免整屏彩色噪音 */
.btn.ghost{background:#fff;color:var(--n-700);border-color:var(--line-strong);box-shadow:var(--shadow-xs)}
.btn.ghost:hover{background:#f6f8fb;border-color:var(--n-300);color:var(--ink);box-shadow:var(--shadow-xs)}
.btn.ghost:focus-visible{box-shadow:0 0 0 3px var(--brand-ring)}
.btn.ghost.active{background:var(--brand-soft);color:var(--brand);border-color:var(--brand-line)}
.btn.sm{height:29px;padding:0 11px;font-size:var(--fs-xs);border-radius:7px;gap:4px}
.btn.lg{height:40px;padding:0 20px;font-size:var(--fs-base);border-radius:var(--radius-xs)}

/* 破坏性：浅红描边（危险但克制），比实心红安静得多 */
.btn.danger{background:#fff;color:var(--err-ink);border-color:var(--err-line);box-shadow:var(--shadow-xs)}
.btn.danger:hover{background:var(--err-soft);border-color:#f5a3a3;color:#991b1b;box-shadow:var(--shadow-xs)}
.btn.danger:disabled:hover{background:#fff}
/* 恢复：浅绿描边 */
.btn.restore{background:#fff;color:var(--ok-ink);border-color:var(--ok-line);box-shadow:var(--shadow-xs)}
.btn.restore:hover{background:var(--ok-soft);border-color:#6ee7b7;color:#065f46;box-shadow:var(--shadow-xs)}

.link{background:none;border:none;color:var(--brand);text-decoration:none;padding:0;cursor:pointer;
  font-weight:600;font-size:inherit;transition:color var(--t)}
.link:hover{color:var(--brand-d);text-decoration:underline;text-underline-offset:2px}
.link.danger{color:var(--err)}
.link.danger:hover{color:var(--err-ink)}

/* 表格「操作」列的小胶囊按钮（版本时间线的「切换/回退」·「删除」）：
   原先是无边界的裸文字链接，跟文件名/徽标混在一起时看不出来能点；
   改成描边胶囊 + 颜色语义（蓝=切换、红=删除），点击热区也更大。
   负 margin 抵消胶囊比行内文字高出的部分，尽量不把表格行撑高。 */
.act-pill{display:inline-flex;align-items:center;justify-content:center;
  height:22px;padding:0 9px;margin:-2px 0;border-radius:999px;
  border:1px solid var(--line-strong);background:#fff;color:var(--n-700);
  font-size:var(--fs-xs);font-weight:650;line-height:1;cursor:pointer;white-space:nowrap;
  transition:background var(--t),border-color var(--t),color var(--t),box-shadow var(--t),transform var(--t)}
.act-pill+.act-pill{margin-left:6px}
.act-pill:hover{box-shadow:var(--shadow-xs)}
.act-pill:active{transform:translateY(1px);box-shadow:none}
.act-pill:focus-visible{outline:none;box-shadow:0 0 0 3px var(--brand-ring)}
.act-pill.switch{color:var(--brand-d);border-color:var(--brand-line)}
.act-pill.switch:hover{background:var(--brand-soft);border-color:var(--brand);color:var(--brand-d)}
.act-pill.del{color:var(--err-ink);border-color:var(--err-line)}
.act-pill.del:hover{background:var(--err-soft);border-color:#f5a3a3;color:#991b1b}

/* ============================ 登录页 ============================ */
.login-wrap{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:24px;
  background:
    radial-gradient(900px 520px at 12% -10%,rgba(79,139,250,.16),transparent 60%),
    radial-gradient(760px 480px at 92% 108%,rgba(5,150,105,.10),transparent 62%),
    linear-gradient(168deg,#f9fbfe 0%,#eef3fb 52%,#e7eefa 100%)}
.login-card{background:#fff;padding:36px 34px 30px;border-radius:20px;border:1px solid var(--line);
  box-shadow:0 28px 64px -28px rgba(16,24,40,.30),0 2px 8px rgba(16,24,40,.05);
  width:392px;max-width:100%;display:flex;flex-direction:column;gap:16px}
.login-head{text-align:center;margin-bottom:4px;display:flex;flex-direction:column;align-items:center;gap:12px}
/* 品牌图形：白色方块阵列 + 蓝色渐变底（呼应二维码主题，纯 CSS 零依赖） */
.login-head::before{content:"";width:48px;height:48px;border-radius:14px;flex:none;
  background:
    linear-gradient(#fff,#fff) 11px 11px/10px 10px no-repeat,
    linear-gradient(#fff,#fff) 11px 27px/10px 10px no-repeat,
    linear-gradient(#fff,#fff) 27px 11px/10px 10px no-repeat,
    linear-gradient(#fff,#fff) 27px 27px/10px 10px no-repeat,
    linear-gradient(135deg,#5b95fb,#2563eb);
  box-shadow:0 8px 20px -8px rgba(37,99,235,.55)}
.login-card h1{margin:0;font-size:var(--fs-2xl);font-weight:700;color:var(--ink)}
.login-sub{margin:0;color:var(--muted);font-size:var(--fs-sm)}
.login-card label.field{display:flex;flex-direction:column;gap:6px;font-size:var(--fs-sm);
  color:var(--n-700);font-weight:600}
.login-card label.field input{padding:10px 12px}
.login-card .pw-wrap{position:relative;display:flex}
.login-card .pw-wrap input{width:100%;padding:10px 40px 10px 12px}
.login-card .pw-toggle{position:absolute;right:6px;top:50%;transform:translateY(-50%);
  width:30px;height:28px;display:flex;align-items:center;justify-content:center;
  background:none;border:none;cursor:pointer;color:var(--faint);border-radius:6px;transition:var(--t)}
.login-card .pw-toggle:hover{color:var(--brand);background:var(--brand-soft)}
.login-card .cap-wrap{position:relative;display:flex;gap:10px;align-items:center}
.login-card .cap-wrap input{flex:1;min-width:0;letter-spacing:6px;text-align:center;
  font-size:var(--fs-lg);font-weight:700;font-family:var(--mono)}
.login-card .cap-img{flex:none;width:140px;height:48px;border:1px solid var(--line);border-radius:var(--radius-xs);
  cursor:pointer;background:#fafbfd;transition:var(--t)}
.login-card .cap-img:hover{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-ring)}
.login-card .cap-refresh{flex:none;width:32px;height:32px;border:1px solid var(--line-strong);border-radius:50%;
  background:#fff;color:var(--n-500);font-size:var(--fs-lg);line-height:1;display:flex;align-items:center;
  justify-content:center;cursor:pointer;transition:var(--t)}
.login-card .cap-refresh:hover{background:var(--brand-soft);border-color:var(--brand-line);color:var(--brand)}
.login-btn{margin-top:8px;height:46px;background:var(--brand-grad);color:#fff;border:none;
  border-radius:var(--radius-sm);font-size:var(--fs-lg);font-weight:650;cursor:pointer;
  box-shadow:0 8px 20px -8px rgba(37,99,235,.55);transition:var(--t)}
.login-btn:hover{background:linear-gradient(180deg,#3474f4,#1d4ed8);box-shadow:0 10px 24px -8px rgba(37,99,235,.6)}
.login-btn:active{transform:translateY(1px)}
.err{color:var(--err);font-size:var(--fs-sm);min-height:16px;margin:0;text-align:center}

/* ============================ 顶栏 ============================ */
.topbar{height:60px;position:sticky;top:0;z-index:30;display:flex;align-items:center;
  justify-content:space-between;padding:0 22px;
  background:rgba(255,255,255,.86);backdrop-filter:saturate(180%) blur(14px);
  -webkit-backdrop-filter:saturate(180%) blur(14px);
  border-bottom:1px solid var(--line)}
.topbar .brand{font-weight:700;font-size:var(--fs-md);display:flex;align-items:center;gap:11px;
  letter-spacing:.01em;color:var(--n-800)}
/* 品牌图形：与登录页同源，缩到 30px */
.topbar .brand::before{content:"";width:30px;height:30px;border-radius:9px;flex:none;
  background:
    linear-gradient(#fff,#fff) 7px 7px/6px 6px no-repeat,
    linear-gradient(#fff,#fff) 7px 17px/6px 6px no-repeat,
    linear-gradient(#fff,#fff) 17px 7px/6px 6px no-repeat,
    linear-gradient(#fff,#fff) 17px 17px/6px 6px no-repeat,
    linear-gradient(135deg,#5b95fb,#2563eb);
  box-shadow:0 6px 14px -6px rgba(37,99,235,.6)}
.topbar .env{font-size:var(--fs-xs);font-weight:600;background:var(--n-100);color:var(--n-600);
  border:1px solid var(--line);padding:2px 9px;border-radius:999px;margin-left:2px;
  font-family:var(--mono);letter-spacing:0}
.topbar .userbox{display:flex;align-items:center;gap:14px;font-size:var(--fs-sm);color:var(--n-600)}
.topbar .link{color:var(--n-500);font-weight:600}
.topbar .link:hover{color:var(--brand)}

/* ============================ 布局 / 侧栏 ============================ */
.layout{display:flex;min-height:calc(100vh - 60px);align-items:stretch}
.side{width:238px;background:#fff;border-right:1px solid var(--line);padding:16px 12px 22px;
  flex:0 0 auto;display:flex;flex-direction:column;gap:14px}
.side nav{display:flex;flex-direction:column;gap:2px}
.side nav a{position:relative;display:flex;align-items:center;gap:10px;
  padding:9px 12px;border-radius:var(--radius-xs);
  color:var(--n-700);text-decoration:none;font-weight:550;font-size:var(--fs-sm);
  transition:background var(--t),color var(--t)}
.side nav a::before{content:"";position:absolute;left:-12px;top:50%;transform:translateY(-50%) scaleY(.3);
  width:3px;height:20px;border-radius:0 3px 3px 0;background:var(--brand);opacity:0;transition:var(--t)}
.side nav a:hover{background:#f3f6fa;color:var(--ink)}
.side nav a.active{background:var(--brand-soft);color:var(--brand);font-weight:650}
.side nav a.active::before{opacity:1;transform:translateY(-50%) scaleY(1)}
.side nav a .nav-ico{width:17px;height:17px;flex:none;color:var(--n-400);transition:color var(--t)}
.side nav a:hover .nav-ico{color:var(--n-600)}
.side nav a.active .nav-ico{color:var(--brand)}

/* 文件夹树 */
.tree{font-size:var(--fs-sm);flex:1;min-height:0;overflow:auto;padding-right:2px}
.tree .node{padding:6px 8px;border-radius:7px;cursor:pointer;display:flex;justify-content:space-between;
  gap:6px;color:var(--n-700);transition:background var(--t),color var(--t)}
.tree .node:hover{background:#f3f6fa;color:var(--ink)}
.tree .node.sel{background:var(--brand-soft);color:var(--brand);font-weight:650}
.tree .ch{margin-left:14px}

.content{flex:1;min-width:0;padding:22px 26px 40px;overflow:auto}
.content>*{max-width:1680px}
.side-resizer{width:9px;flex:0 0 9px;cursor:col-resize;background:transparent;
  transition:background var(--t);display:flex;align-items:center;justify-content:center}
.side-resizer::before{content:"";display:block;width:2px;height:30px;background:var(--line-strong);
  border-radius:2px;transition:background var(--t)}
.side-resizer:hover,.side-resizer.dragging{background:var(--brand-soft)}
.side-resizer:hover::before,.side-resizer.dragging::before{background:var(--brand)}

/* ============================ 卡片 / 工具条 ============================ */
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  padding:13px 16px;margin-bottom:14px;box-shadow:var(--shadow-xs)}
.card h2{margin:0 0 15px;font-size:var(--fs-lg);font-weight:650;color:var(--n-800)}
.card>h2,.list-head h2{display:flex;align-items:center;gap:10px;margin-bottom:0}
.card>h2::before,.list-head h2::before{content:"";width:3px;height:16px;border-radius:2px;flex:none;
  background:linear-gradient(180deg,var(--brand-l),var(--brand))}
/* 文档列表页头：标题 + 快速标签同排（2026-09-12 紧凑化） */
.list-head{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin-bottom:11px}
.list-head .quick-tabs{margin-bottom:0}
.toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:9px}
.toolbar .grow{flex:1}

/* ============================ 分页器 ============================ */
.pager{display:flex;gap:12px;align-items:center;justify-content:space-between;flex-wrap:wrap;
  margin-top:9px;padding-top:9px;border-top:1px solid var(--line)}
.pager-left{display:flex;align-items:center;gap:6px;color:var(--muted);font-size:var(--fs-sm)}
.pager-right{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.pager .pg-input{padding:5px 6px;border:1px solid var(--line-strong);border-radius:7px;
  font-size:var(--fs-sm);background:#fff;font-variant-numeric:tabular-nums}
.pager .pz{padding:5px 26px 5px 9px;border:1px solid var(--line-strong);border-radius:7px;
  font-size:var(--fs-sm);background-color:#fff;
  background-position:right 6px center;background-size:12px}
.pager .muted{font-size:var(--fs-sm);font-variant-numeric:tabular-nums}
.pager .btn.ghost{height:29px;padding:0 10px;font-size:var(--fs-xs)}
.pager .btn.ghost:disabled{opacity:.38;background:#fff;color:var(--faint);border-color:var(--line)}

/* 筛选条（2026-09-12 改版：状态/日期下线 → 水印 + 用途；右侧并入迷你拖拽区） */
.filterbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:9px;
  padding:7px 10px;background:var(--sunken);border:1px solid var(--line);border-radius:var(--radius-sm)}
.filterbar .flt{font-size:var(--fs-sm);height:29px;padding:0 26px 0 9px;color:var(--n-700);
  border:1px solid var(--line-strong);border-radius:var(--radius-xs);background-color:#fff;
  background-position:right 6px center;background-size:12px;cursor:pointer}
.filterbar .flt:hover{border-color:var(--brand-line)}
.filterbar .btn.sm{height:29px;padding:0 10px;font-size:var(--fs-xs)}
.filterbar .flt-spacer{flex:1;min-width:8px}

/* 分段式标签（替代旧下划线 tab） */
.quick-tabs{display:inline-flex;gap:3px;padding:3px;margin-bottom:14px;
  background:var(--n-100);border:1px solid var(--line);border-radius:12px}
.quick-tabs .tab{background:transparent;border:none;color:var(--n-500);font-size:var(--fs-sm);
  font-weight:600;padding:5px 13px;border-radius:9px;cursor:pointer;
  transition:background var(--t),color var(--t),box-shadow var(--t)}
.quick-tabs .tab:hover{color:var(--ink);background:rgba(255,255,255,.72)}
.quick-tabs .tab.active{background:#fff;color:var(--brand);box-shadow:var(--shadow-xs)}
.quick-tabs .tab.trash.active{color:var(--err)}

/* 可排序列表头 */
#manual-list table th.sortable{cursor:pointer;user-select:none;white-space:nowrap;transition:color var(--t),background var(--t)}
#manual-list table th.sortable:hover{color:var(--brand);background:#f2f7ff}
#manual-list table th.sortable.active{color:var(--brand);background:var(--brand-soft)}

/* 批量操作条：常驻固定，不随选择出现/消失，避免表格跳动 */
.batch-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  position:sticky;top:0;z-index:6;margin:0 0 9px;
  padding:6px 12px;background:linear-gradient(180deg,#fffdf7,#fffaf0);
  border:1px solid #fde8b8;border-radius:var(--radius-sm);box-shadow:var(--shadow-xs)}
.batch-bar.idle{opacity:.66}
.batch-bar .batch-count{font-weight:650;color:var(--n-800);margin-right:auto;font-variant-numeric:tabular-nums}
.batch-bar .btn.ghost{border-color:#f0dcae;background:#fff}

/* ============================ 表格 ============================ */
.tbl-scroll{overflow-x:auto;margin-top:4px;border-radius:var(--radius-sm)}
table{width:100%;border-collapse:separate;border-spacing:0;font-size:var(--fs-sm);
  font-variant-numeric:tabular-nums}
th,td{padding:6px 11px;text-align:left;border-bottom:1px solid var(--line)}
th{color:var(--n-500);font-weight:650;background:var(--n-50);font-size:var(--fs-xs);
  letter-spacing:.03em;white-space:nowrap;position:sticky;top:0;z-index:2;
  border-bottom:1px solid var(--line-strong)}
td{color:var(--n-700);vertical-align:middle}
/* 表格内的操作链接/按钮不折行（否则「详情」会被压成竖排两字） */
td a,td button,td .btn,td .link{white-space:nowrap}
tbody tr{transition:background var(--t)}
tbody tr:hover td{background:#f7faff}
tbody tr:last-child td{border-bottom:none}
table .muted{color:var(--muted)}
table b{color:var(--n-800)}

/* 复选框列与选中行 */
.checkbox-col{width:40px;text-align:center;padding-left:16px!important;padding-right:6px!important}
.checkbox-col input[type=checkbox]{width:16px;height:16px;cursor:pointer;accent-color:var(--brand)}
.row-selected td{background:var(--brand-soft)!important}
.row-selected:hover td{background:var(--brand-soft2)!important}

/* 徽标：浅底 + 深字 + 同色细边（无变体时回落中性灰，绝不出现隐形徽标）
   2026-09-12 紧凑化：padding 2px 9px→1px 8px、line-height 1.6→1.35
   —— 徽标是表格行内最高元素，原先每行被它撑到 39px，收紧后 ~35px。 */
.badge{display:inline-flex;align-items:center;gap:4px;padding:1px 8px;border-radius:999px;
  font-size:var(--fs-xs);font-weight:650;line-height:1.35;white-space:nowrap;
  background:var(--n-100);color:var(--n-600);border:1px solid var(--n-200)}
.badge.pub{background:var(--ok-soft);color:var(--ok-ink);border-color:var(--ok-line)}
.badge.draft{background:var(--n-100);color:var(--n-600);border-color:var(--n-200)}
.badge.arch{background:var(--n-100);color:var(--n-500);border-color:var(--n-200)}
.badge.wmoff{background:var(--err-soft);color:var(--err-ink);border-color:var(--err-line)}
.badge.erp{background:var(--info-soft);color:var(--info-ink);border-color:var(--info-line)}
/* 「全员」= 登录即有、不可关。原先借用 .wmoff（红色 = 关闭/异常）语义反了，改用中性蓝 */
.badge.always{background:var(--info-soft);color:var(--info-ink);border-color:var(--info-line)}
/* 搜索词命中「版本文件名称」：提示该文件已在本文档内，别再另建文档重复上传 */
.badge.vhit{background:var(--warn-soft,#fff7e6);color:var(--warn-ink,#a56a00);
  border-color:var(--warn-line,#f2d08a);cursor:help}
.badge.voided{background:var(--err-soft);color:var(--err-ink);border-color:var(--err-line)}

/* 编号高亮（搜索命中文件编号时标黄，规则五） */
mark.hl{background:#fef3c7;color:#8a5300;padding:0 3px;border-radius:4px;font-weight:650;
  box-shadow:inset 0 -1px 0 #fcd34d}
.file-no-tag{display:inline-block;background:var(--brand-soft);color:var(--brand-d);
  border:1px solid var(--brand-line);border-radius:7px;padding:1px 8px;font-size:var(--fs-sm);
  font-weight:650;vertical-align:middle;font-family:var(--mono);letter-spacing:-.01em}
.audit-bar{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.tbl{width:100%;border-collapse:separate;border-spacing:0;margin-top:6px;
  border:1px solid var(--line);border-radius:var(--radius-sm);overflow:hidden}
.tbl th,.tbl td{padding:9px 12px;text-align:left;font-size:var(--fs-sm);border-bottom:1px solid var(--line-soft)}
.tbl th{background:var(--n-50);color:var(--n-500);font-weight:650;font-size:var(--fs-xs);
  position:static;border-bottom:1px solid var(--line)}
.tbl tr:last-child td{border-bottom:none}

/* ============================ 详情页 ============================ */
.detail-nav{display:flex;align-items:center;gap:8px;margin-bottom:12px}
/* 一行三栏：文档信息（自适应）｜二维码（固定）｜图片(文件服务)（固定）。
   图片不再独占一行，把纵向空间让给下方「版本时间线」，详情页首屏即可看全版本列表。 */
.detail-head{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;
  margin-bottom:14px;flex-wrap:wrap}
.detail-main{flex:1 1 420px;min-width:0;display:flex;flex-direction:column;gap:10px}
.detail-main h2{margin:0;font-size:var(--fs-xl);font-weight:700;line-height:1.4;color:var(--n-900);
  letter-spacing:-.005em}
.detail-main .kv{grid-template-columns:92px minmax(0,1fr) 92px minmax(0,1fr);gap:9px 18px}
@media (max-width:1150px){
  .detail-main .kv{grid-template-columns:92px minmax(0,1fr)}
  .img-sec{flex:1 1 100%;width:100%}
}
.qr-card{border:1px solid var(--line);border-radius:var(--radius);padding:12px;background:#fff;
  width:196px;flex:0 0 196px;display:flex;flex-direction:column;align-items:center;gap:9px;
  box-shadow:var(--shadow)}
.qr-img{width:158px;height:158px;object-fit:contain;background:#fff;border-radius:var(--radius-xs);
  border:1px solid var(--line-soft)}
.qr-url{font-size:var(--fs-xs);color:var(--muted);word-break:break-all;text-align:center;cursor:pointer;
  line-height:1.4;max-height:48px;overflow:auto;padding:0 2px;font-family:var(--mono);transition:color var(--t)}
.qr-url:hover{color:var(--brand)}
.qr-actions{display:flex;gap:6px}
.qr-actions .btn{font-size:var(--fs-xs);height:27px;padding:0 10px}

/* 详情页工具条：分组面板排列，管理类操作独占一行 */
.toolbar-groups,.toolbar-manage{align-items:center;gap:8px;margin-bottom:9px;
  background:var(--sunken);border:1px solid var(--line);border-radius:var(--radius-sm);padding:9px 11px}
.toolbar-manage{margin-bottom:0}
.tgroup-sep,.toolbar-groups .tgroup-sep,.toolbar-manage .tgroup-sep{width:1px;height:22px;
  background:var(--line-strong);margin:0 7px;flex:none}

/* ============================ 弹层 ============================ */
.modal{position:fixed;inset:0;background:rgba(15,23,42,.46);display:flex;align-items:center;
  justify-content:center;z-index:50;padding:20px;
  backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);animation:fadeIn .14s ease}
.modal-box{background:#fff;border-radius:var(--radius);padding:22px 24px;width:min(660px,94vw);
  max-height:90vh;overflow:auto;box-shadow:var(--shadow-lg);border:1px solid var(--line);
  animation:popIn .18s cubic-bezier(.2,.9,.3,1.1)}
.modal-box h3{margin:0 0 15px;font-size:var(--fs-lg);font-weight:650;color:var(--n-800);
  display:flex;align-items:center;gap:9px}
.field{display:flex;flex-direction:column;gap:6px;margin-bottom:14px;font-size:var(--fs-sm);
  color:var(--n-600);font-weight:600}
/* 口令复杂度实时提示条（新增用户 / 重置密码对话框）：满足变绿、缺项灰、含用户名标红 */
.pwd-hint{display:flex;flex-wrap:wrap;gap:6px;margin:-6px 0 14px}
.pwd-tag{display:inline-flex;align-items:center;gap:3px;padding:1px 8px;border-radius:999px;
  border:1px solid var(--line);background:var(--sunken);color:var(--muted);
  font-size:var(--fs-xs);font-weight:600;line-height:1.7;white-space:nowrap}
.pwd-tag.ok{background:var(--ok-soft);border-color:var(--ok-line);color:var(--ok-ink)}
.pwd-tag.bad{background:var(--err-soft);border-color:var(--err-line);color:var(--err-ink)}
.row{display:flex;gap:12px;flex-wrap:wrap}
.row>*{flex:1;min-width:0}
.modal-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:16px;
  padding-top:14px;border-top:1px solid var(--line)}
.toast{position:fixed;bottom:26px;left:50%;transform:translateX(-50%);
  background:rgba(34,43,54,.96);color:#fff;padding:11px 20px;border-radius:var(--radius-sm);
  z-index:80;font-size:var(--fs-sm);font-weight:550;box-shadow:0 12px 32px -10px rgba(0,0,0,.4);
  animation:popIn .18s cubic-bezier(.2,.9,.3,1.1);max-width:min(620px,92vw);text-align:center}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
@keyframes popIn{from{opacity:0;transform:translateY(6px) scale(.985)}to{opacity:1;transform:none}}
/* toast 已有 translateX(-50%)，单独覆盖动画避免被覆盖 */
.toast{animation:toastIn .2s cubic-bezier(.2,.9,.3,1.1)}
@keyframes toastIn{from{opacity:0;transform:translateX(-50%) translateY(8px)}
  to{opacity:1;transform:translateX(-50%) translateY(0)}}

code.zpl{display:block;white-space:pre-wrap;background:#111a26;color:#cfe3ff;padding:14px;
  border-radius:var(--radius-xs);font-family:var(--mono);font-size:var(--fs-xs);
  max-height:300px;overflow:auto;line-height:1.6}
.qr-box{text-align:center;padding:8px}

/* ============================ 预览 / 上传 ============================ */
.pv-wrap{height:62vh;overflow:auto;border:1px solid var(--line);border-radius:var(--radius-sm);
  background:var(--sunken);display:flex;align-items:center;justify-content:center}
.pv-wrap:fullscreen{height:100%;border-radius:0;background:#fff}
.pv-toolbar{display:flex;gap:8px;margin-top:12px;flex-wrap:wrap}
.pv-toolbar .btn.ghost.active{background:var(--brand-soft);color:var(--brand);border-color:var(--brand-line)}
.muted{color:var(--muted)}
.hr{height:1px;background:var(--line);margin:16px 0;border:none}
.kv{display:grid;grid-template-columns:110px 1fr;gap:9px 14px;font-size:var(--fs-sm);
  font-variant-numeric:tabular-nums}
.kv>span:nth-child(odd){color:var(--muted)}

.dropzone{border:1.5px dashed var(--brand-line);border-radius:var(--radius);padding:24px;
  text-align:center;color:var(--brand);background:linear-gradient(180deg,#f7faff,#eff5ff);
  margin-bottom:14px;cursor:pointer;transition:var(--t);font-weight:600;font-size:var(--fs-sm)}
.dropzone:hover{border-color:var(--brand);background:var(--brand-soft)}
.dropzone.drag{border-color:var(--brand);background:var(--brand-soft2);color:var(--brand-d);
  box-shadow:0 0 0 4px var(--brand-ring)}
/* 文档列表页的迷你投放区：并进筛选条右侧，只占 29px 高（旧版独占一整块 80px 高的大区域） */
.dropzone.mini{display:inline-flex;align-items:center;height:29px;padding:0 12px;margin:0;
  font-size:var(--fs-xs);font-weight:600;white-space:nowrap;border-width:1px;
  border-radius:var(--radius-xs);background:#fff}
.visually-hidden{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* 版本时间线：高亮当前生效版本 */
.row-active td{background:var(--brand-soft)!important;font-weight:600;color:var(--n-800)}
.file-link{color:var(--brand);cursor:pointer;font-weight:650}
.file-link:hover{text-decoration:underline;text-underline-offset:2px}

/* 上传进度条 */
.progress{height:8px;background:var(--n-100);border-radius:999px;overflow:hidden;margin:10px 0 4px}
.progress .bar{height:100%;width:0;border-radius:999px;
  background:linear-gradient(90deg,var(--brand-l),var(--brand));transition:width .18s ease}

/* ============================ 文件夹树：工具条 ============================ */
/* 工具条可占多行：上行「刷新/展开/折叠 + 新建类」，下行「编辑/删除（作用于选中分组）」。
   原为 nowrap + 隐藏横向滚动条，窄侧栏下后半截直接被裁掉 —— 改为 wrap，放不下就折行，绝不裁。 */
.tree-toolbar{display:flex;flex-wrap:wrap;gap:3px;align-items:center;margin-bottom:5px}
/* 只有最后一行画与下方树的分隔线 */
.tree-toolbar.tree-toolbar-last{margin-bottom:8px;padding-bottom:9px;border-bottom:1px solid var(--line)}
.tree-toolbar .btn-icon{width:26px;height:26px;flex:none;border:1px solid transparent;border-radius:7px;
  background:transparent;color:var(--n-500);font-size:var(--fs-base);display:inline-flex;
  align-items:center;justify-content:center;cursor:pointer;transition:var(--t)}
.tree-toolbar .btn-icon:hover{background:#f2f6fb;color:var(--brand)}
.tree-toolbar .btn-icon.danger:hover{background:var(--err-soft);color:var(--err)}
.tree-toolbar .ico{width:15px;height:15px;display:block}
.tree-toolbar .tb-sep{width:1px;height:16px;background:var(--line-strong);margin:0 4px;flex:none}
.tree-toolbar .tbtn{height:26px;padding:0 9px;flex:none;border:1px solid var(--line-strong);
  border-radius:7px;background:#fff;color:var(--n-600);font-size:var(--fs-xs);display:inline-flex;
  align-items:center;justify-content:center;cursor:pointer;transition:var(--t);white-space:nowrap;
  font-weight:600}
.tree-toolbar .tbtn:hover{background:var(--brand-soft);border-color:var(--brand-line);color:var(--brand)}
.tree-toolbar .tbtn.danger{color:var(--err-ink);border-color:var(--err-line)}
.tree-toolbar .tbtn.danger:hover{background:var(--err-soft);border-color:#f5a3a3;color:#991b1b}
.tree-toolbar .tbtn:disabled{opacity:.4;cursor:not-allowed;background:var(--n-50);color:var(--faint);
  border-color:var(--line)}
.tree-toolbar .tbtn:disabled:hover{background:var(--n-50);border-color:var(--line);color:var(--faint)}
.tree-node-wrap{user-select:none}
.tree .node{align-items:flex-start;gap:4px}
.tree .node .node-arrow{width:18px;text-align:center;color:var(--n-400);font-size:var(--fs-sm);
  line-height:1.5;font-weight:700;cursor:pointer;display:inline-block;transition:transform var(--t),color var(--t)}
.tree .node:hover .node-arrow{color:var(--n-600)}
.tree .node .node-arrow.empty{visibility:hidden}
.tree .node .node-label{flex:1;min-width:0;white-space:normal;word-break:break-word;line-height:1.45}
.tree-children{border-left:1px dashed var(--n-200);margin-left:9px}

/* ============================ 版本差异对比 ============================ */
.diff-pick .field{flex:1;margin-bottom:0}
.diff-side{display:flex;gap:12px}
.diff-side iframe{flex:1;width:50%;height:60vh;border:1px solid var(--line);
  border-radius:var(--radius-xs);background:#fff}
.diff-summary{font-size:var(--fs-sm);margin:0 0 12px;color:var(--ink)}
.diff-summary .add{color:var(--ok);font-weight:700}
.diff-summary .del{color:var(--err);font-weight:700}
.diff-table{border:1px solid var(--line);border-radius:var(--radius-sm);overflow:hidden}
.diff-table .diff-head{display:flex;background:var(--n-50);border-bottom:1px solid var(--line);
  font-size:var(--fs-xs);font-weight:650;color:var(--n-500);letter-spacing:.03em}
.diff-table .diff-head span{flex:1;padding:9px 14px;border-right:1px solid var(--line)}
.diff-table .diff-head span:last-child{border-right:none}
.diff-body{max-height:62vh;overflow:auto}
.drow{display:flex;border-bottom:1px solid var(--line-soft);font-family:var(--mono);
  font-size:var(--fs-sm);line-height:1.6}
.drow .dc{flex:1;width:50%;padding:3px 14px;white-space:pre-wrap;word-break:break-word;
  border-right:1px solid var(--line-soft);min-height:1.6em}
.drow .dc:last-child{border-right:none}
.drow .dc.empty{background:var(--n-25)}
.drow.eq .dc{color:var(--n-600)}
.drow.del{background:#fef4f4}
.drow.del .dc:first-child{background:#fdeaea;color:#9f2b2b}
.drow.add{background:#f2fdf7}
.drow.add .dc:last-child{background:#e7fbef;color:#126b41}
.drow.chg{background:#fffaf3}
.drow.chg .dc:first-child{background:#fff3e6;color:#9a4d1c}
.drow.chg .dc:last-child{background:#f0fbf5;color:#126b41}
mark.a{background:#b8f0cc;color:#0c5a2f;border-radius:3px;padding:0 2px}
mark.d{background:#ffc6c6;color:#8a1f1f;border-radius:3px;padding:0 2px}

/* ============================ 列表：可点击单元格 ============================ */
.cell-link{color:var(--brand);text-decoration:none;font-weight:650}
.cell-link:hover{text-decoration:underline;text-underline-offset:2px}

/* ============================ 关联物料编码（可编辑栏） ============================ */
.mm-editor{margin-top:2px}
.mm-label{font-size:var(--fs-sm);font-weight:650;color:var(--n-800);margin-bottom:7px}
.mm-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}
.mm-chip{display:inline-flex;align-items:center;gap:6px;padding:4px 11px;border:1px solid var(--line-strong);
  border-radius:999px;background:var(--n-50);font-size:var(--fs-sm);font-weight:550;
  color:var(--n-700);transition:var(--t)}
.mm-chip.primary{background:var(--brand-soft);border-color:var(--brand-line);color:var(--brand-d)}
.mm-chip .mm-tag{font-size:var(--fs-xs);background:var(--brand);color:#fff;border-radius:999px;
  padding:1px 7px;font-weight:600}
.mm-chip-link{cursor:pointer}
.mm-chip-link:hover{text-decoration:underline;color:var(--brand)}
.mm-chip .mm-x{border:none;background:transparent;color:var(--faint);font-size:var(--fs-base);
  line-height:1;cursor:pointer;padding:0 3px;border-radius:999px;transition:var(--t)}
.mm-chip .mm-x:hover{color:var(--err)}
/* 二次确认态：第一次点 × 后整颗变红、按钮显示「确认删除?」，再点一次才删 */
.mm-chip.confirm{background:var(--err-soft);border-color:#f5a3a3;color:var(--err-ink)}
.mm-chip.confirm .mm-x{color:#fff;background:var(--err);font-size:var(--fs-xs);padding:2px 8px;
  white-space:nowrap;border-radius:999px}
.mm-row{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.mm-input{max-width:280px}
/* 详情页内联搜索：输入框与下方下拉同宽（否则下拉比输入框宽一截，看着错位） */
.mm-row .mm-input{max-width:none}
.mm-tabs{display:flex;gap:3px;margin-bottom:9px;padding:3px;background:var(--n-100);
  border-radius:11px;border:1px solid var(--line);width:fit-content}
.mm-tab{border:1px solid transparent;background:transparent;color:var(--n-500);padding:6px 15px;
  border-radius:8px;font-size:var(--fs-sm);cursor:pointer;font-weight:600;transition:var(--t)}
.mm-tab:hover{color:var(--ink)}
.mm-tab.active{background:#fff;border-color:transparent;color:var(--brand);box-shadow:var(--shadow-xs)}
.mm-more{display:inline-block;font-size:var(--fs-xs);color:var(--brand);background:var(--brand-soft);
  border:1px solid var(--brand-line);border-radius:999px;padding:1px 8px;margin-left:4px;
  cursor:help;font-weight:650}

/* ============================ 在线人数徽标 ============================ */
.online-badge{display:inline-flex;align-items:center;gap:6px;font-size:var(--fs-xs);
  color:var(--ok-ink);font-weight:650;background:var(--ok-soft);border:1px solid var(--ok-line);
  border-radius:999px;padding:3px 11px;white-space:nowrap}
.online-badge::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--ok);
  box-shadow:0 0 0 3px rgba(5,150,105,.16);animation:pulse 2.2s ease-in-out infinite}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.45}}

/* ============================ 图片卡片（详情页右侧，与二维码同排） ============================ */
.img-sec{flex:0 0 208px;width:208px;display:flex;flex-direction:column;gap:9px;
  border:1px solid var(--line);border-radius:var(--radius);padding:12px;background:#fff;
  box-shadow:var(--shadow)}
.img-sec-title{font-size:var(--fs-sm);font-weight:650;color:var(--n-700);text-align:center}
.img-card{display:flex;flex-direction:column;gap:8px;width:100%}
.img-stage{display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:6px;min-height:150px;border-radius:var(--radius-xs);overflow:hidden;background:var(--n-25)}
.img-thumb{max-width:100%;max-height:150px;border-radius:6px;object-fit:contain}
.img-caption{display:flex;align-items:center;gap:8px;max-width:100%;font-size:var(--fs-xs);
  justify-content:center;flex-wrap:wrap}
.img-caption .img-name{font-weight:650;color:var(--n-800);word-break:break-all;font-size:var(--fs-xs);
  text-align:center}
.img-placeholder{display:flex;flex-direction:column;align-items:center;gap:8px;padding:28px 10px;
  color:var(--faint)}
.img-placeholder-icon{font-size:42px;opacity:.4}
.img-actions{display:flex;justify-content:center;gap:16px;padding-top:8px;border-top:1px solid var(--line-soft)}
.img-icon-btn{border:none;background:transparent;cursor:pointer;font-size:var(--fs-lg);line-height:1;
  padding:5px 7px;border-radius:7px;color:var(--n-600);opacity:.8;transition:var(--t)}
.img-icon-btn:hover:not(:disabled){background:var(--brand-soft);color:var(--brand);opacity:1}
.img-icon-btn:disabled{opacity:.25;cursor:not-allowed}
.btn.disabled{opacity:.5;cursor:not-allowed}

/* ============================ 固件管理：物料多选器 ============================ */
.fw-chips{display:flex;flex-wrap:wrap;gap:6px;margin:4px 0 8px;min-height:10px}
.fw-chip{display:inline-flex;align-items:center;gap:6px;background:var(--brand-soft);
  border:1px solid var(--brand-line);color:var(--brand-d);border-radius:999px;padding:2px 11px;
  font-size:var(--fs-sm);font-weight:600}
.fw-chip a{cursor:pointer;color:var(--err);font-weight:700;text-decoration:none}
.fw-mopts{max-height:180px;overflow:auto;border:1px solid var(--line);border-radius:var(--radius-xs);
  margin-bottom:10px;background:#fff}
.fw-mopt{display:flex;align-items:center;gap:8px;padding:7px 11px;cursor:pointer;font-size:var(--fs-sm);
  border-bottom:1px solid var(--line-soft);transition:background var(--t)}
.fw-mopt:hover{background:#f6faff}
.fw-mopt:last-child{border-bottom:none}
.fw-mopt input[type=checkbox]{width:16px;height:16px;flex:none;accent-color:var(--brand)}
.sh-qr{text-align:center;margin:10px 0}
.sh-qr svg{width:180px;height:180px}

/* ============================ 物料搜索建议 ============================ */
.mm-sug-wrap{position:relative;flex:1;display:flex;min-width:0}
.mm-sug-wrap input{flex:1;width:100%}
.mm-sug-box{position:absolute;top:100%;left:0;right:0;z-index:60;background:#fff;
  border:1px solid var(--line-strong);border-radius:var(--radius-xs);box-shadow:var(--shadow-lg);
  max-height:240px;overflow:auto;margin-top:5px;padding:4px}
.mm-sug-row{padding:8px 11px;cursor:pointer;font-size:var(--fs-sm);border-radius:7px;
  transition:background var(--t);color:var(--n-700)}
.mm-sug-row:hover{background:var(--brand-soft);color:var(--brand-d)}
.mm-sug-empty{padding:11px 12px;color:var(--err-ink);background:var(--err-soft);font-size:var(--fs-sm);
  font-weight:600;border-radius:7px;border-left:3px solid var(--err)}
/* 多选模式：下拉内复选框 + 底部「添加选中」条 */
.mm-sug-row.mm-sug-multi{display:flex;align-items:center;gap:8px;cursor:pointer}
/* pointer-events:none → 整行才是唯一命中目标：点方框图形也算点行，不会出现
   「浏览器先自行翻转 + 我们的行处理器再翻一次」的双触发（那份翻转=勾了个寂寞） */
.mm-sug-row.mm-sug-multi input[type=checkbox]{width:auto;flex:none;margin:0;cursor:inherit;pointer-events:none}
.mm-sug-row.mm-sug-multi.is-on{background:var(--brand-soft)}
.mm-sug-row.mm-sug-multi.is-dis{opacity:.6;cursor:default}
.mm-sug-row.mm-sug-multi.is-dis:hover{background:transparent;color:var(--n-700)}
.mm-sug-foot{position:sticky;bottom:-4px;display:flex;align-items:center;gap:8px;
  padding:8px 10px;margin:4px -4px -4px;border-top:1px solid var(--line);background:#fff}
/* 「已选 N 个」计数：胶囊徽标，有勾选时点亮品牌蓝，一眼看出「有东西待提交」 */
.mm-sug-count{font-size:var(--fs-xs);font-weight:600;color:var(--muted);white-space:nowrap;
  font-variant-numeric:tabular-nums;background:var(--n-50);border:1px solid var(--line);
  border-radius:999px;padding:4px 11px;transition:var(--t)}
.mm-sug-count.has{background:var(--brand-soft);border-color:var(--brand-line);color:var(--brand-d)}
/* 「清空」：与 .btn.sm 同高同圆角的描边按钮（原先是裸文字链，太轻、不好点）。
   悬停转浅红 = 弱破坏性提示；无勾选时置灰不可点，避免空点。 */
.mm-clear{display:inline-flex;align-items:center;gap:5px;flex:none;height:29px;padding:0 11px;
  border-radius:7px;border:1px solid var(--line-strong);background:#fff;color:var(--n-600);
  font-size:var(--fs-xs);font-weight:600;line-height:1;box-shadow:var(--shadow-xs);transition:var(--t)}
.mm-clear svg{width:13px;height:13px;flex:none;transition:transform var(--t)}
.mm-clear:hover:not(:disabled){background:var(--err-soft);border-color:var(--err-line);color:var(--err-ink)}
.mm-clear:hover:not(:disabled) svg{transform:rotate(-45deg)}
.mm-clear:active:not(:disabled){transform:translateY(1px);box-shadow:none}
.mm-clear:disabled{opacity:.42;cursor:not-allowed;box-shadow:none}
.mm-clear:focus-visible{outline:none;box-shadow:0 0 0 3px var(--err-soft),0 0 0 4px var(--err-line)}

/* 各版本下载量：紧凑 chip 行（版本多时表格会拖出十几行 0，纯占版面） */
.dl-chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:4px}
.dl-chip{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:999px;
  font-size:var(--fs-xs);font-weight:600;color:var(--n-600);background:var(--n-50);
  border:1px solid var(--line);font-variant-numeric:tabular-nums}
.dl-chip b{color:var(--ink);font-weight:700}
.dl-chip.zero{opacity:.62}
.dl-chip:not(.zero){background:var(--brand-soft);border-color:var(--brand-line);color:var(--brand-d)}

/* ============================ 版本对比页（独立整页，左右并排） ============================ */
.cmp-title{font-size:var(--fs-md);font-weight:650;color:var(--n-800)}
.cmp-title b{font-weight:700;color:var(--ink)}
.cmp-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:11px;
  background:var(--sunken);border:1px solid var(--line);border-radius:var(--radius-sm);padding:9px 11px}
.cmp-hint{color:var(--muted);font-size:var(--fs-sm)}
.cmp-grid{display:flex;gap:12px;align-items:stretch}
.cmp-grid.stack{flex-direction:column}
.cmp-pane{flex:1;min-width:0;display:flex;flex-direction:column;background:#fff;
  border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;box-shadow:var(--shadow-xs)}
.cmp-pane-head{display:flex;align-items:center;gap:8px;padding:8px 10px;flex-wrap:nowrap;
  background:var(--n-50);border-bottom:1px solid var(--line)}
.cmp-sel{flex:1;min-width:0;height:30px;padding:0 8px;font-size:var(--fs-xs);font-weight:600;
  border-radius:7px;background:#fff}
.cmp-pane-head .cmp-file{flex:0 0 auto;font-size:var(--fs-xs);color:var(--n-500);white-space:nowrap}
.cmp-pane-head .btn.sm{padding:0 9px;flex:none}
/* 视图吃满剩余视口：两页并排各占半屏，不必上下滚动才能看全。
   336px = 顶栏 60 + 内容上下内边距 22/40 + 卡片内边距 18/18 + 卡片下外边距 16
          + 返回条 41 + 工具条 63 + 栏头 ~48。改动详情页/对比页外壳高度时需重算。 */
.cmp-view{height:calc(100vh - 336px);min-height:340px;background:var(--sunken);position:relative;
  display:flex;align-items:center;justify-content:center;overflow:hidden}
.cmp-view iframe,.cmp-view img{width:100%;height:100%;border:0;display:block;background:#fff}
.cmp-view img{object-fit:contain}
.cmp-grid.stack .cmp-view{height:calc(50vh - 90px);min-height:300px}
.cmp-loading{margin:auto;padding:16px}
.cmp-none{text-align:center;padding:24px;line-height:1.7}

/* ============================ 打印标签：三步流程 ============================ */
.pl-list{display:flex;flex-direction:column;gap:6px;max-height:240px;overflow:auto;
  border:1px solid var(--line);border-radius:var(--radius-xs);padding:8px;margin:6px 0 10px;
  background:var(--n-25)}
.pl-item{display:flex;align-items:center;gap:8px;padding:7px 9px;border-radius:7px;cursor:pointer;
  transition:background var(--t)}
.pl-item:hover{background:#fff;box-shadow:var(--shadow-xs)}
.pl-item input{accent-color:var(--brand);width:16px;height:16px}

/* ---------- 标签预览卡：40×30mm 四要素（几何必须与后端 ZPL 实测坐标一致，勿改） ---------- */
.lbl-card{width:min(420px,100%);aspect-ratio:4/3;background:#fff;color:#000;
  border:1px solid #999;border-radius:4px;margin:8px auto;position:relative;
  box-shadow:0 1px 6px rgba(0,0,0,.18);overflow:hidden;
  font-family:var(--font);}
/* 二维码：左上，边距 5%/6.67%，边长 = 123 点 = 宽 38.4% / 高 51.25% */
.lbl-qr{position:absolute;left:5%;top:6.67%;width:38.4%;height:51.25%;}
.lbl-qr img{width:100%;height:100%;display:block;image-rendering:pixelated;}
/* 提示语：二维码正下方，宽度与二维码同宽，居中（中文/英文随语言版本切换） */
.lbl-hint{position:absolute;left:5%;top:60.4%;width:38.4%;height:6.67%;
  display:flex;align-items:center;justify-content:center;text-align:center;
  font-size:12px;font-weight:700;letter-spacing:.3px;line-height:1;}
/* 文字块：提示语下方三行左对齐，占满内容区宽度 */
.lbl-lines{position:absolute;left:5%;top:69.6%;width:90%;
  font-size:13px;line-height:1.5;}
.lbl-line b{font-weight:700;font-family:var(--mono);}

/* ============================ 权限管理：角色 × 模块 矩阵 ============================ */
/* 2026-09-12 紧凑化改版。原版两个毛病：
   ① 表格 width:100% → 「功能模块」列被撑到半屏（本来只需装下「标签 + key」）；
   ② 每行的 key 用 display:block 独占第二行 → 行高接近翻倍。
   改法：宽度贴合内容（width:auto）+ key 挪到同行右侧 + 行内边距 8px→5px。 */
.perm-table{border-collapse:separate;border-spacing:0;width:auto;max-width:100%;
  font-size:var(--fs-sm);border:1px solid var(--line);border-radius:var(--radius-sm);overflow:hidden}
.perm-table th,.perm-table td{padding:5px 10px;text-align:center;vertical-align:middle;
  white-space:nowrap;border-bottom:1px solid var(--line-soft)}
.perm-table thead th{background:var(--n-50);font-weight:650;position:sticky;top:0;z-index:1;
  color:var(--n-600);font-size:var(--fs-xs);border-bottom:1px solid var(--line);padding:7px 10px}
.perm-table th .pcnt{display:block;font-weight:400;font-size:var(--fs-xs);color:var(--faint);
  line-height:1.3;margin-top:1px}
/* 模块列：宽度交还给内容；角色列定宽 → 多余空间不再全灌给第一列 */
.perm-table th.perm-mod,.perm-table td.perm-mod{text-align:left;padding-right:20px}
.perm-table td.perm-mod{color:var(--n-800);font-weight:600}
.perm-table td.perm-mod .badge{margin-left:7px;font-size:var(--fs-xs);vertical-align:1px}
/* key 从「独占第二行」改为「同行右侧小字」——这一条把行高砍掉近一半 */
.perm-key{display:inline;font-family:var(--mono);font-size:var(--fs-xs);color:var(--faint);
  font-weight:400;margin-left:8px}
.perm-table .perm-cell{width:112px}
.perm-table tbody tr:nth-child(even) td{background:var(--n-25)}   /* 16 行太密，极浅斑马线 */
.perm-table tbody tr:hover td{background:#f7faff}
.perm-table tbody tr:last-child td{border-bottom:none}
.perm-table .perm-cell input[type=checkbox]{width:16px;height:16px;accent-color:var(--brand);
  cursor:pointer;margin:0;padding:0}
.perm-table .perm-cell.locked{background:var(--n-50)}
.perm-table .perm-cell input:disabled{cursor:not-allowed;opacity:.5}
/* 底部「说明」降一档字号/颜色：信息保留，但不再与矩阵抢视觉重量 */
.perm-note{font-size:var(--fs-xs);color:var(--faint);line-height:1.65;margin:10px 0 0;max-width:980px}
/* 窄屏：矩阵宽度贴合内容后可能超出卡片 → 允许横向滚动，而不是撑破布局 */
.perm-scroll{overflow-x:auto}
@media (max-width:1180px){ .perm-key{display:none} }   /* 窄屏再省掉 key，矩阵整体收窄 */

/* ============================ 响应式 ============================ */
@media (max-width:1024px){
  .content{padding:18px 16px 32px}
  .side{width:206px}
  .detail-head{flex-direction:column}
  .qr-card{width:100%;flex:none;flex-direction:row;justify-content:center}
  .img-sec{width:100%;flex:none}
  /* 窄屏对比改为上下两栏，各自占半屏 */
  .cmp-grid{flex-direction:column}
  .cmp-view{height:calc(50vh - 90px);min-height:280px}
}

/* ---------- 备份与恢复（2026-10-09）---------- */
.bk-info{display:flex;flex-wrap:wrap;gap:9px;margin-top:4px}
.bk-kv{display:inline-flex;align-items:baseline;gap:6px;padding:5px 11px;border-radius:999px;
  background:var(--n-50);border:1px solid var(--line-soft);font-size:var(--fs-sm);color:var(--n-700)}
.bk-kv b{color:var(--n-500);font-weight:650;font-size:var(--fs-xs)}
.bk-path{max-width:100%;font-family:var(--mono);font-size:var(--fs-xs);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bk-tbl{margin-top:10px}
.bk-ops{line-height:2}
