/* ============================================================
   app.css —— 应用外壳与通用组件样式
   全部取值来自 tokens.css，不写魔法值
   ============================================================ */

*{box-sizing:border-box}
html,body,#app{height:100%}
body{
  margin:0;background:var(--c-bg);color:var(--c-ink);
  font-family:var(--font-sans);font-size:var(--fs-14);line-height:var(--lh-base);
  letter-spacing:-.006em;
  -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
}
a{color:inherit;text-decoration:none}
button{font-family:inherit;font-size:inherit;letter-spacing:inherit}
::selection{background:rgba(0,113,227,.18)}
::-webkit-scrollbar{width:11px;height:11px}
::-webkit-scrollbar-thumb{background:rgba(0,0,0,.18);border-radius:11px;border:3px solid transparent;background-clip:content-box}
::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,.32);background-clip:content-box}
::-webkit-scrollbar-track{background:transparent}

/* ---------------- 骨架布局 ---------------- */
.app-shell{display:flex;height:100vh;overflow:hidden}

/* ---------------- 侧边栏 ---------------- */
.sidebar{
  width:var(--layout-sidebar);flex:0 0 var(--layout-sidebar);
  display:flex;flex-direction:column;background:var(--c-nav-bg);color:var(--c-white);position:relative;z-index:30;
}
.sidebar::after{
  content:"";position:absolute;top:0;right:0;bottom:0;width:1px;
  background:linear-gradient(180deg,rgba(255,255,255,.10),rgba(255,255,255,.02));
}
.brand{display:flex;gap:11px;align-items:center;padding:22px 20px 20px}
.brand-logo{
  width:34px;height:34px;flex:0 0 34px;border-radius:var(--r-sm);
  background:linear-gradient(160deg,var(--c-brand-grad-1),var(--c-brand-grad-2) 55%,var(--c-brand-grad-3));
  display:grid;place-items:center;font-weight:var(--fw-bold);font-size:var(--fs-16);color:var(--c-white);
  letter-spacing:-.02em;
  box-shadow:0 2px 10px rgba(10,132,255,.35),inset 0 1px 0 rgba(255,255,255,.28);
}
.brand-title{font-size:13.5px;font-weight:var(--fw-bold);letter-spacing:-.01em;color:var(--c-nav-text-hi);white-space:nowrap}
.brand-sub{font-size:10.5px;color:var(--c-nav-dim);margin-top:2px;white-space:nowrap;letter-spacing:.01em}

.nav{flex:1;overflow-y:auto;padding:2px 12px 12px}
.nav::-webkit-scrollbar{width:0}
/* 一级项：不再有分组标题与二级子项，四个模块平铺 */
.nav-item{
  display:flex;align-items:center;gap:10px;padding:10px 11px;border-radius:10px;
  color:var(--c-nav-text);font-size:var(--fs-13);cursor:pointer;user-select:none;
  transition:background var(--dur-base) var(--ease),color var(--dur-base) var(--ease);
  position:relative;margin-bottom:var(--sp-1);border:0;background:none;width:100%;text-align:left;
}
.nav-item .ni-icon{width:18px;text-align:center;font-size:13.5px;opacity:.75;flex:0 0 18px}
.nav-item .ni-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.nav-item:hover{background:rgba(255,255,255,.07);color:var(--c-nav-text-hi)}
.nav-item:hover .ni-icon{opacity:1}
.nav-item.active{background:rgba(255,255,255,.12);color:var(--c-white);font-weight:var(--fw-medium)}
.nav-item.active .ni-icon{opacity:1;color:var(--c-nav-active)}
.nav-item.active::before{
  content:"";position:absolute;left:-12px;top:50%;transform:translateY(-50%);
  width:3px;height:16px;border-radius:0 3px 3px 0;background:var(--c-nav-active-strong);
}
.nav-badge{
  background:rgba(255,255,255,.16);color:var(--c-nav-text-hi);font-size:10.5px;font-weight:var(--fw-bold);
  min-width:19px;height:19px;border-radius:var(--r-pill);display:grid;place-items:center;padding:0 6px;
  font-variant-numeric:tabular-nums;
}
.nav-item.active .nav-badge{background:rgba(255,255,255,.24)}

.sidebar-foot{padding:12px;border-top:1px solid rgba(255,255,255,.07)}
.user-chip{
  display:flex;align-items:center;gap:10px;padding:9px;border-radius:var(--r-sm);
  background:rgba(255,255,255,.06);transition:background var(--dur-base) var(--ease);
}
.user-chip:hover{background:rgba(255,255,255,.1)}
.user-avatar{
  width:30px;height:30px;flex:0 0 30px;border-radius:50%;
  display:grid;place-items:center;font-size:12.5px;font-weight:var(--fw-bold);color:var(--c-white);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.25);
}
.user-meta{flex:1;min-width:0}
.user-name{font-size:12.5px;font-weight:var(--fw-medium);color:var(--c-nav-text-hi);letter-spacing:-.01em}
.user-role{font-size:10.5px;color:var(--c-nav-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.user-switch{
  background:rgba(255,255,255,.12);border:0;color:var(--c-nav-text-soft);width:24px;height:24px;border-radius:var(--r-pill);
  display:grid;place-items:center;font-size:var(--fs-12);transition:background var(--dur-base) var(--ease);flex:0 0 24px;cursor:pointer;
}
.user-switch:hover{background:var(--c-nav-active-strong);color:var(--c-white)}

/* ---------------- 主区 ---------------- */
.main{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}
.topbar{
  height:var(--layout-topbar);flex:0 0 var(--layout-topbar);
  background:rgba(255,255,255,.72);
  -webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px);
  border-bottom:1px solid var(--c-line);
  display:flex;align-items:center;justify-content:space-between;padding:0 22px;gap:14px;
  position:relative;z-index:20;
}
.crumb{font-size:12.5px;color:var(--c-muted-2)}
.crumb b{color:var(--c-ink);font-weight:var(--fw-medium)}
.topbar-right{display:flex;align-items:center;gap:var(--sp-2)}
.content{flex:1;overflow-y:auto;padding:26px var(--layout-content-x) 64px;scroll-behavior:smooth}

/* ---------------- 页头 ---------------- */
.page-head{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin-bottom:22px;flex-wrap:wrap}
.page-title{font-size:var(--fs-30);font-weight:var(--fw-bold);letter-spacing:-.022em;line-height:var(--lh-tight);display:flex;align-items:center;gap:11px}
.page-sub{color:var(--c-muted);font-size:var(--fs-13);margin-top:7px}
.page-actions{display:flex;gap:var(--sp-2);align-items:center;flex-wrap:wrap}

/* ---------------- 卡片 ---------------- */
.card{
  background:var(--c-card);border-radius:var(--r-lg);
  box-shadow:var(--sh-sm);border:1px solid rgba(0,0,0,.04);
  margin-bottom:var(--sp-4);overflow:hidden;
  transition:box-shadow .3s var(--ease);
}
.card.hoverable:hover{box-shadow:var(--sh-md)}
.card-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;gap:var(--sp-3)}
.card-title{font-size:var(--fs-16);font-weight:var(--fw-bold);letter-spacing:-.016em;display:flex;align-items:center;gap:var(--sp-2)}
.card-extra{font-size:12.5px;color:var(--c-muted);display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}
.card-body{padding:4px 20px 20px}
.card-body.tight{padding:2px 16px 16px}
.card-body.flush{padding:0}

.grid{display:grid;gap:var(--sp-4)}
.g2{grid-template-columns:repeat(2,minmax(0,1fr))}
.g3{grid-template-columns:repeat(3,minmax(0,1fr))}
.g4{grid-template-columns:repeat(4,minmax(0,1fr))}
.g-2-1{grid-template-columns:minmax(0,2fr) minmax(0,1fr)}
.g-1-1-3{grid-template-columns:minmax(0,1.1fr) minmax(0,1.1fr) minmax(0,.9fr)}
@media(max-width:1240px){.g4{grid-template-columns:repeat(2,minmax(0,1fr))}.g-2-1{grid-template-columns:minmax(0,1fr)}}
@media(max-width:1080px){.g2,.g3,.g-1-1-3{grid-template-columns:minmax(0,1fr)}}

/* ---------------- KPI ---------------- */
.kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--sp-4);margin-bottom:var(--sp-4)}
@media(max-width:1100px){.kpis{grid-template-columns:repeat(2,minmax(0,1fr))}}
.kpi{
  background:var(--c-card);border-radius:var(--r-lg);padding:18px 18px 16px;
  display:flex;align-items:flex-start;gap:var(--sp-3);
  box-shadow:var(--sh-sm);border:1px solid rgba(0,0,0,.04);position:relative;overflow:hidden;
  transition:transform .3s var(--ease),box-shadow .3s var(--ease);
}
.kpi:hover{transform:translateY(-2px);box-shadow:var(--sh-md)}
.kpi.alert{border-color:rgba(255,59,48,.16)}
.kpi.alert::before{content:"";position:absolute;inset:0 0 auto 0;height:2px;background:linear-gradient(90deg,var(--c-danger),rgba(255,59,48,0))}
.kpi-icon{width:38px;height:38px;flex:0 0 38px;border-radius:var(--r-sm);display:grid;place-items:center;font-size:17px;background:rgba(0,0,0,.04)}
.kpi-icon.blue{background:var(--c-primary-50);color:var(--c-primary)}
.kpi-icon.green{background:var(--c-success-50);color:var(--c-success-text)}
.kpi-icon.amber{background:var(--c-warn-50);color:var(--c-warn-text)}
.kpi-icon.red{background:var(--c-danger-50);color:var(--c-danger-text)}
.kpi-icon.purple{background:var(--c-purple-50);color:var(--c-purple-text)}
.kpi-main{flex:1;min-width:0}
.kpi-val{font-size:26px;font-weight:var(--fw-bold);letter-spacing:-.028em;line-height:1.1;display:flex;align-items:baseline;gap:5px;font-variant-numeric:tabular-nums}
.kpi-val .unit{font-size:var(--fs-12);font-weight:var(--fw-medium);color:var(--c-muted);letter-spacing:0}
.kpi-label{font-size:12.5px;color:var(--c-muted);margin-top:5px;display:block}
.kpi-hint{font-size:var(--fs-11);color:var(--c-muted-2);margin-top:3px;line-height:1.4}

/* ---------------- 徽标 ---------------- */
.badge{
  display:inline-flex;align-items:center;gap:5px;font-size:var(--fs-11);font-weight:var(--fw-medium);
  padding:2px 9px;border-radius:var(--r-pill);white-space:nowrap;line-height:1.6;
}
.badge .bdot{width:5px;height:5px;border-radius:50%;background:currentColor;flex:0 0 5px}
.badge-blue{background:var(--c-primary-50);color:var(--c-primary)}
.badge-green{background:var(--c-success-50);color:var(--c-success-text)}
.badge-amber{background:var(--c-warn-50);color:var(--c-warn-text)}
.badge-red{background:var(--c-danger-50);color:var(--c-danger-text)}
.badge-purple{background:var(--c-purple-50);color:var(--c-purple-text)}
.badge-cyan{background:var(--c-cyan-50);color:var(--c-cyan-text)}
.badge-gray{background:rgba(0,0,0,.05);color:var(--c-muted)}
.badge-ghost{background:var(--c-white);border:1px solid var(--c-line);color:var(--c-muted)}
.badge-lg{font-size:12.5px;padding:4px 12px}

/* ---------------- 出入口徽标（本轮的验收重点） ---------------- */
.if-badge{
  display:inline-flex;align-items:center;gap:5px;height:22px;padding:0 9px;
  border-radius:var(--r-pill);font-size:var(--fs-11);font-weight:var(--fw-bold);
  border:1px solid transparent;cursor:pointer;white-space:nowrap;
  transition:all var(--dur-base) var(--ease);line-height:1;
  font-variant-numeric:tabular-nums;
}
.if-badge .if-arrow{font-size:12px;line-height:1}
.if-badge.in{background:var(--c-info-50);color:var(--c-info-text);border-color:var(--c-info-line)}
.if-badge.out{background:var(--c-purple-50);color:var(--c-purple-text);border-color:var(--c-purple-line-2)}
.if-badge:hover{transform:translateY(-1px);box-shadow:var(--sh-xs)}
.if-badge.in:hover{background:var(--c-primary-25);border-color:var(--c-primary-line)}
.if-badge.out:hover{background:var(--c-purple-100);border-color:var(--c-purple-line)}
.if-badge.todo{background:var(--c-fill);color:var(--c-muted);border-color:var(--c-line)}
.if-badge.todo:hover{background:var(--c-fill-3)}
.if-badge:focus-visible{outline:2px solid var(--c-primary);outline-offset:2px}
.if-card{width:320px;padding:0}
.if-card-head{display:flex;align-items:center;gap:8px;padding-bottom:10px;border-bottom:1px solid var(--c-line-2);margin-bottom:10px}
.if-card-title{font-size:13.5px;font-weight:var(--fw-bold);letter-spacing:-.01em}
.if-rows{display:flex;flex-direction:column;gap:0}
.if-row{display:flex;gap:12px;padding:7px 0;font-size:12.5px;border-bottom:1px dashed var(--c-line-2)}
.if-row:last-child{border-bottom:0}
.if-row .k{color:var(--c-muted);flex:0 0 68px}
.if-row .v{flex:1;font-weight:var(--fw-medium);color:var(--c-ink);word-break:break-all}
.if-note{margin-top:10px;padding:10px 12px;border-radius:var(--r-xs);background:var(--c-warn-50);border:1px solid var(--c-warn-line);font-size:11.5px;color:var(--c-warn-text);line-height:var(--lh-loose)}

/* ---------------- 来源说明条（外部数据必须可溯源） ---------------- */
.source-bar{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  background:var(--c-info-50);border:1px solid var(--c-info-line);border-radius:var(--r-sm);
  padding:9px 13px;font-size:12.5px;color:var(--c-info-text);margin-bottom:var(--sp-3);
}
.source-bar.gray{background:var(--c-fill-2);border-color:var(--c-line);color:var(--c-muted)}
.source-bar .sb-ico{font-size:13px;opacity:.9}
.source-bar b{font-weight:var(--fw-bold);color:var(--c-info-text)}
.source-bar .sb-right{margin-left:auto;display:flex;align-items:center;gap:var(--sp-2)}

/* ---------------- 提示块 ---------------- */
.callout{
  background:var(--c-fill-2);border:1px solid var(--c-line-2);border-left:2.5px solid var(--c-primary);
  border-radius:var(--r-sm);padding:12px 14px;font-size:12.5px;color:var(--c-ink-2);line-height:var(--lh-loose);
}
.callout.warn{background:var(--c-warn-50);border-left-color:var(--c-warn);border-color:var(--c-warn-line);color:var(--c-warn-text)}
.callout.green{background:var(--c-success-50);border-left-color:var(--c-success);border-color:var(--c-success-line);color:var(--c-success-text)}
.callout.red{background:var(--c-danger-50);border-left-color:var(--c-danger);border-color:var(--c-danger-line);color:var(--c-danger-text)}
.callout b{font-weight:var(--fw-bold)}

/* ---------------- 表格（Element Plus 覆盖） ---------------- */
.el-table{--el-table-border-color:var(--c-line-2);--el-table-header-bg-color:transparent;--el-table-row-hover-bg-color:var(--c-fill-2);font-size:var(--fs-13)}
.el-table th.el-table__cell{background:transparent;font-size:11.5px;font-weight:var(--fw-medium);color:var(--c-muted-2);padding:10px 0}
.el-table td.el-table__cell{padding:12px 0;border-bottom:1px solid var(--c-line-2);color:var(--c-ink-2)}
.el-table__inner-wrapper::before{display:none}
.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell{background:var(--c-fill-2)}
.el-table .cell{padding:0 16px;line-height:1.5}
.el-table__body tr.row-click{cursor:pointer}
.mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}
.tbl-code{font-family:var(--font-mono);font-size:12.5px;font-weight:var(--fw-bold);color:var(--c-primary)}
.tbl-strong{font-weight:var(--fw-bold);color:var(--c-ink)}
.tbl-sub{font-size:11.5px;color:var(--c-muted-2);margin-top:2px;line-height:1.4}
.num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12.5px}
.tr{text-align:right}
.tc{text-align:center}

/* ---------------- 筛选条 ---------------- */
.filterbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:13px 20px;border-bottom:1px solid var(--c-line-2);background:var(--c-fill-2)}
.filterbar .right{margin-left:auto}
.filterbar .fb-count{font-size:var(--fs-12);color:var(--c-muted-2)}
.filterbar .fb-count b{color:var(--c-ink);font-weight:var(--fw-bold)}

/* ---------------- 空态 / 加载 ---------------- */
.empty-state{padding:52px 20px;text-align:center;color:var(--c-muted-2)}
.empty-state .es-ico{font-size:34px;opacity:.35;margin-bottom:12px}
.empty-state .es-text{font-size:var(--fs-13)}
.empty-state .es-sub{font-size:var(--fs-12);margin-top:6px;color:var(--c-muted-2)}

/* ---------------- 时间轴 ---------------- */
.timeline{position:relative;padding:4px 0 0}
.tl-item{display:flex;gap:14px;position:relative;padding-bottom:20px}
.tl-item:last-child{padding-bottom:2px}
.tl-item::before{content:"";position:absolute;left:11px;top:24px;bottom:0;width:1.5px;background:var(--c-track)}
.tl-item:last-child::before{display:none}
.tl-item.done::before{background:var(--c-success-line)}
.tl-dot{
  width:23px;height:23px;flex:0 0 23px;border-radius:50%;display:grid;place-items:center;
  font-size:10.5px;font-weight:var(--fw-bold);background:var(--c-track);color:var(--c-muted-2);z-index:1;
  border:2px solid var(--c-white);
}
.tl-item.done .tl-dot{background:var(--c-success);color:var(--c-white)}
.tl-item.current .tl-dot{background:var(--c-primary);color:var(--c-white);box-shadow:0 0 0 5px rgba(0,113,227,.15)}
.tl-item.warn .tl-dot{background:var(--c-warn);color:var(--c-white);box-shadow:0 0 0 5px rgba(255,159,10,.18)}
.tl-item.fail .tl-dot{background:var(--c-danger);color:var(--c-white)}
.tl-body{flex:1;min-width:0;padding-top:1px}
.tl-title{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:var(--fw-medium);color:var(--c-muted-2);flex-wrap:wrap}
.tl-item.done .tl-title,.tl-item.current .tl-title,.tl-item.fail .tl-title{color:var(--c-ink);font-weight:var(--fw-bold)}
.tl-desc{font-size:12px;color:var(--c-muted);margin-top:3px;line-height:var(--lh-loose)}
.tl-meta{font-size:11px;color:var(--c-muted-2);font-family:var(--font-mono);margin-left:auto;white-space:nowrap}
/* 外部环节占位：连接线走虚线，明确「这一段还没在本应用发生」 */
.tl-item.out::before{background:repeating-linear-gradient(180deg,var(--c-track) 0 5px,transparent 5px 9px)}
/* 半实心：已到货但还没入库（有实收、没入库），与 done 的整实心区分开 */
.tl-item.half .tl-dot{background:linear-gradient(90deg,var(--c-primary) 0 50%,var(--c-track) 50% 100%);box-shadow:0 0 0 4px rgba(0,113,227,.10)}
.tl-item.half .tl-title{color:var(--c-ink);font-weight:var(--fw-bold)}

/* ---------------- 库管回执汇总（只读镜像四格数字） ---------------- */
.echo-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--sp-2)}
@media(max-width:1240px){.echo-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
.echo-cell{background:var(--c-fill-2);border:1px solid var(--c-line-2);border-radius:var(--r-sm);padding:var(--sp-3)}
.echo-num{font-size:var(--fs-24);font-weight:var(--fw-bold);letter-spacing:-.02em;line-height:1.1;font-variant-numeric:tabular-nums;color:var(--c-ink)}
.echo-cell.is-ok .echo-num{color:var(--c-success-text)}
.echo-cell.is-ng .echo-num{color:var(--c-danger-text)}
.echo-label{font-size:var(--fs-11);color:var(--c-muted-2);margin-top:var(--sp-1);letter-spacing:.02em}
.echo-foot{font-size:var(--fs-11);color:var(--c-muted-2);line-height:var(--lh-loose);margin-top:var(--sp-3)}

/* ---------------- 信息行 ---------------- */
.info-rows{display:flex;flex-direction:column}
.info-row{display:flex;justify-content:space-between;gap:16px;padding:10px 0;border-bottom:1px solid var(--c-line-2);font-size:var(--fs-13)}
.info-row:last-child{border-bottom:0}
.info-row .ir-k{color:var(--c-muted);flex:0 0 88px;font-size:12.5px}
.info-row .ir-v{font-weight:var(--fw-medium);text-align:right;word-break:break-all;flex:1;min-width:0}
.section-label{font-size:11px;letter-spacing:.06em;color:var(--c-muted-2);font-weight:var(--fw-bold);margin:20px 0 10px}
.section-label:first-child{margin-top:0}

/* ---------------- 重复采购（SOP 环节 1 第 2 步） ----------------
   留痕故意做成一行灰字：它是「已确认」的事后记录，不该和超库存告警抢注意力。
   确认框里的命中条目用编号列表——一次要看好几条，靠序号对齐比靠缩进可靠。 */
.dup-trace{margin-top:var(--sp-3);font-size:var(--fs-11);color:var(--c-muted);line-height:var(--lh-loose)}
.dup-list{display:flex;flex-direction:column;gap:var(--sp-2);margin-top:var(--sp-3)}
.dup-item{display:flex;gap:var(--sp-2);padding:var(--sp-3);border-radius:var(--r-xs);background:var(--c-warn-50);border:1px solid var(--c-warn-line);color:var(--c-warn-text);font-size:var(--fs-12);line-height:var(--lh-loose)}
.dup-item.is-invalid{background:var(--c-danger-50);border-color:var(--c-danger-line);color:var(--c-danger-text)}
.dup-item .di-idx{flex:0 0 auto;min-width:1.1em;font-family:var(--font-mono);font-weight:var(--fw-bold);opacity:.65;text-align:right}
.dup-item .mono{font-weight:var(--fw-bold)}
/* 分组标题：待审的重复单 vs 已通过的重复单 —— 处理动作不同，不能混在一个列表里 */
.dup-group-title{font-size:var(--fs-11);letter-spacing:.04em;color:var(--c-muted);font-weight:var(--fw-bold);margin-top:var(--sp-2)}
.dup-group-title:first-child{margin-top:0}
.rel-list{display:flex;flex-direction:column;gap:var(--sp-2)}
.rel-row{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);border:1px solid var(--c-line-2);border-radius:var(--r-xs);background:var(--c-fill-2);font-size:var(--fs-12);color:var(--c-ink-2);cursor:pointer;transition:background var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease);flex-wrap:wrap}
.rel-row:hover{background:var(--c-white);border-color:var(--c-primary-line)}
.rel-row:focus-visible{outline:2px solid var(--c-primary);outline-offset:1px}
.rel-row .rel-no{font-weight:var(--fw-bold);color:var(--c-primary)}
.rel-row .rel-mat{color:var(--c-muted);font-size:var(--fs-12);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rel-row .rel-meta{margin-left:auto;color:var(--c-muted);font-size:var(--fs-11);white-space:nowrap}

/* ---------------- 物流跟进（环节 4 第 2 步） ----------------
   五节点续跑条：不是进度条而是「谁到哪了」的对照表，所以用等宽格子 + 时间，
   比一条彩色进度条更能说明「跳跃前进过」和「回退过」。 */
.tk-steps{display:flex;gap:var(--sp-2);margin:var(--sp-3) 0 var(--sp-4);flex-wrap:wrap}
.tk-step{flex:1 1 0;min-width:104px;padding:var(--sp-2) var(--sp-3);border-radius:var(--r-xs);border:1px solid var(--c-line-2);background:var(--c-fill-2);color:var(--c-muted-2);transition:background var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease)}
.tk-step .tk-name{display:block;font-size:var(--fs-12);font-weight:var(--fw-medium)}
.tk-step .tk-at{display:block;font-family:var(--font-mono);font-size:var(--fs-11);margin-top:2px;opacity:.9}
.tk-step.done{background:var(--c-success-50);border-color:var(--c-success-line);color:var(--c-success-text)}
.tk-step.current{background:var(--c-primary-50);border-color:var(--c-primary-line);color:var(--c-primary);font-weight:var(--fw-bold)}
.tk-step.current .tk-name{font-weight:var(--fw-bold)}
.tk-form{border:1px dashed var(--c-line);border-radius:var(--r-sm);padding:var(--sp-4);background:var(--c-fill-2)}
.tbl-sub.tk-inline{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;margin-top:var(--sp-1)}

/* ---------------- 只读区（金蝶账务段） ---------------- */
.readonly-zone{background:var(--c-fill);border:1px solid var(--c-line);border-radius:var(--r-sm);padding:14px 16px}
.readonly-zone .rz-head{display:flex;align-items:center;gap:var(--sp-2);margin-bottom:10px;flex-wrap:wrap}
.readonly-zone .rz-title{font-size:12.5px;font-weight:var(--fw-bold);color:var(--c-muted)}
.readonly-zone .rz-lock{font-size:var(--fs-11);color:var(--c-muted-2);display:inline-flex;align-items:center;gap:4px}
.readonly-zone .el-input__wrapper{background:var(--c-readonly-bg);box-shadow:none}
.readonly-zone .el-input__inner{color:var(--c-muted)}

/* ---------------- 抽屉 / 弹窗（EP 覆盖） ---------------- */
.el-drawer{--el-drawer-bg-color:var(--c-bg)}
.el-drawer__header{margin-bottom:0;padding:18px 24px;border-bottom:1px solid var(--c-line);background:rgba(255,255,255,.78);-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px)}
.el-drawer__body{padding:20px 24px 28px}
.el-drawer__footer{padding:14px 24px;border-top:1px solid var(--c-line);background:rgba(255,255,255,.78)}
.drawer-title{font-size:var(--fs-19);font-weight:var(--fw-bold);letter-spacing:-.018em;display:flex;align-items:center;gap:10px;color:var(--c-ink);flex-wrap:wrap;row-gap:6px}
.drawer-title .mono{min-width:0;overflow-wrap:anywhere}
.drawer-sub{font-size:var(--fs-12);color:var(--c-muted);margin-top:4px;font-weight:var(--fw-regular)}
.drawer-section{background:var(--c-white);border-radius:var(--r-md);border:1px solid rgba(0,0,0,.04);box-shadow:var(--sh-xs);padding:16px 18px;margin-bottom:var(--sp-3)}
.el-dialog{border-radius:var(--r-xl)}
.el-dialog__header{padding:20px 24px 14px;margin:0;border-bottom:1px solid var(--c-line-2)}
.el-dialog__title{font-size:var(--fs-19);font-weight:var(--fw-bold);letter-spacing:-.02em;color:var(--c-ink)}
.el-dialog__body{padding:18px 24px;color:var(--c-ink-2);font-size:var(--fs-13)}
.el-dialog__footer{padding:14px 24px;border-top:1px solid var(--c-line-2);background:var(--c-fill-2)}
.el-dialog__headerbtn{top:14px;right:14px}

/* ---------------- 按钮（Apple 胶囊） ---------------- */
.el-button{
  --el-button-border-color:rgba(0,0,0,.10);
  --el-button-bg-color:rgba(255,255,255,.9);
  --el-button-text-color:var(--c-ink);
  --el-button-hover-bg-color:var(--c-white);
  --el-button-hover-border-color:rgba(0,0,0,.18);
  --el-button-hover-text-color:var(--c-ink);
  border-radius:var(--r-pill);font-weight:var(--fw-medium);font-size:var(--fs-13);
  padding:8px 16px;height:auto;transition:all var(--dur-base) var(--ease);
}
.el-button+.el-button{margin-left:var(--sp-2)}
.el-button:hover{transform:translateY(-1px);box-shadow:var(--sh-xs)}
.el-button:active{transform:translateY(0) scale(.985)}
.el-button--primary{
  --el-button-bg-color:var(--c-primary);--el-button-border-color:transparent;--el-button-text-color:var(--c-white);
  --el-button-hover-bg-color:var(--c-primary-hover);--el-button-hover-border-color:transparent;
  --el-button-hover-text-color:var(--c-white);--el-button-active-bg-color:var(--c-primary-active);
  box-shadow:0 1px 3px rgba(0,113,227,.28);
}
.el-button--primary:hover{box-shadow:0 4px 14px -2px rgba(0,113,227,.42)}
.el-button--danger{
  --el-button-bg-color:var(--c-danger);--el-button-border-color:transparent;--el-button-text-color:var(--c-white);
  --el-button-hover-bg-color:var(--c-danger-hover);--el-button-hover-border-color:transparent;--el-button-hover-text-color:var(--c-white);
}
.el-button--success{
  --el-button-bg-color:var(--c-success);--el-button-border-color:transparent;--el-button-text-color:var(--c-white);
  --el-button-hover-bg-color:var(--c-success-hover);--el-button-hover-border-color:transparent;--el-button-hover-text-color:var(--c-white);
}
.el-button--small{font-size:var(--fs-12);padding:5px 13px}
.el-button.is-disabled,.el-button.is-disabled:hover{transform:none;box-shadow:none;opacity:.4}
.el-button--text{--el-button-bg-color:transparent;border-color:transparent;padding:4px 6px;color:var(--c-primary)}
.el-button--text:hover{background:var(--c-primary-50);box-shadow:none;transform:none}

/* ---------------- 表单（EP 覆盖） ---------------- */
.el-input__wrapper,.el-textarea__inner,.el-select__wrapper{
  border-radius:10px;box-shadow:0 0 0 1px rgba(0,0,0,.10) inset;background:var(--c-white);
  transition:box-shadow var(--dur-base) var(--ease);
}
.el-input__wrapper:hover,.el-textarea__inner:hover,.el-select__wrapper:hover{box-shadow:0 0 0 1px rgba(0,0,0,.18) inset}
.el-input__wrapper.is-focus,.el-textarea__inner:focus,.el-select__wrapper.is-focused{
  box-shadow:0 0 0 1px var(--c-primary) inset,0 0 0 4px rgba(0,113,227,.13) !important;
}
.el-form-item__label{font-size:12.5px;font-weight:var(--fw-medium);color:var(--c-ink-2)}
.el-form-item{margin-bottom:var(--sp-4)}
.form-hint{font-size:var(--fs-11);color:var(--c-muted-2);line-height:1.5;margin-top:2px}
.req-star{color:var(--c-danger);margin-left:3px}

/* ---------------- 分页 ---------------- */
.el-pagination{--el-pagination-button-bg-color:transparent;padding:12px 20px;justify-content:flex-end;font-weight:var(--fw-medium)}
.el-pagination .el-pager li{border-radius:var(--r-pill);font-size:var(--fs-12);min-width:28px;height:28px;line-height:28px}
.el-pagination .el-pager li.is-active{background:var(--c-primary);color:var(--c-white)}
.el-pagination button{border-radius:var(--r-pill)}

/* ---------------- Tabs（EP 覆盖） ---------------- */
.el-tabs__header{margin-bottom:var(--sp-4)}
.el-tabs__nav-wrap::after{height:1px;background:var(--c-line)}
.el-tabs__item{font-size:var(--fs-13);font-weight:var(--fw-medium);color:var(--c-muted)}
.el-tabs__item.is-active{color:var(--c-ink);font-weight:var(--fw-bold)}
.el-tabs__active-bar{background:var(--c-primary);height:2px;border-radius:2px}

/* ---------------- 页内模块 Tab 条（替代二级菜单） ----------------
   细下划线 + 主色选中态；高度 40、字号 14；窄屏横向滚动，不换行堆叠 */
.mtabs{
  display:flex;flex-wrap:nowrap;align-items:stretch;gap:var(--sp-5);
  overflow-x:auto;overflow-y:hidden;
  border-bottom:1px solid var(--c-line);
  margin:0 0 var(--sp-5);
  scrollbar-width:none;-ms-overflow-style:none;
}
.mtabs::-webkit-scrollbar{height:0;width:0}
.mtab{
  position:relative;flex:0 0 auto;white-space:nowrap;
  display:inline-flex;align-items:center;height:40px;padding:0;
  border:0;background:none;cursor:pointer;
  font-size:var(--fs-14);font-weight:var(--fw-medium);color:var(--c-muted);
  letter-spacing:-.01em;
  transition:color var(--dur-base) var(--ease);
}
.mtab:hover{color:var(--c-ink)}
.mtab.active{color:var(--c-primary);font-weight:var(--fw-bold)}
.mtab::after{
  content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px; /* -1px 让下划线与容器边框重合 */
  border-radius:2px;background:transparent;
  transition:background var(--dur-base) var(--ease);
}
.mtab.active::after{background:var(--c-primary)}
.mtab:focus-visible{outline:2px solid var(--c-primary);outline-offset:2px;border-radius:var(--r-xs)}

/* ---------------- 树 ---------------- */
.el-tree{--el-tree-node-hover-bg-color:var(--c-fill);font-size:13px;background:transparent}
.el-tree-node__content{height:32px;border-radius:var(--r-xs);margin-bottom:2px}
.el-tree-node.is-current>.el-tree-node__content{background:var(--c-primary-50);color:var(--c-primary);font-weight:var(--fw-bold)}

/* ---------------- 提示条 ---------------- */
.el-alert{border-radius:var(--r-sm);padding:11px 14px}
.el-alert__title{font-size:12.5px;line-height:var(--lh-loose)}
.el-alert--warning.is-light{background:var(--c-warn-50);color:var(--c-warn-text)}
.el-alert--error.is-light{background:var(--c-danger-50);color:var(--c-danger-text)}
.el-alert--info.is-light{background:var(--c-fill);color:var(--c-muted)}
.el-message{border-radius:var(--r-md);box-shadow:var(--sh-md);border:1px solid var(--c-line);background:rgba(255,255,255,.92);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px)}
.el-message__content{font-size:var(--fs-13)}
.el-message-box{border-radius:var(--r-xl);padding:20px 22px}
.el-message-box__title{font-size:var(--fs-19);font-weight:var(--fw-bold);letter-spacing:-.02em}
.el-message-box__content{font-size:var(--fs-13);color:var(--c-ink-2);line-height:var(--lh-loose)}
.el-message-box__btns{padding-top:var(--sp-4)}

/* ---------------- 工具类 ---------------- */
.split{display:flex;align-items:center;gap:var(--sp-2)}
.right{margin-left:auto}
.muted{color:var(--c-muted)}
.dim{color:var(--c-muted-2)}
.nowrap{white-space:nowrap}
.fs11{font-size:var(--fs-11)}.fs12{font-size:var(--fs-12)}.fs13{font-size:var(--fs-13)}
.fw6{font-weight:var(--fw-bold)}
.mt8{margin-top:var(--sp-2)}.mt12{margin-top:var(--sp-3)}.mt16{margin-top:var(--sp-4)}
.mb0{margin-bottom:0}.mb8{margin-bottom:var(--sp-2)}.mb12{margin-bottom:var(--sp-3)}
.hidden{display:none!important}
.stack{display:flex;flex-direction:column;gap:var(--sp-2)}
.tag-list{display:flex;gap:6px;flex-wrap:wrap}
.link{color:var(--c-primary);font-weight:var(--fw-medium);cursor:pointer}
.link:hover{color:var(--c-primary-hover)}

/* ---------------- 角色切换 ---------------- */
.role-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.role-card{
  border:1px solid var(--c-line);border-radius:var(--r-md);padding:12px 13px;cursor:pointer;
  transition:all var(--dur-base) var(--ease);display:flex;gap:10px;align-items:center;background:var(--c-white);text-align:left;
}
.role-card:hover{border-color:rgba(0,113,227,.4);background:var(--c-fill-2);transform:translateY(-1px)}
.role-card.active{border-color:var(--c-primary);background:var(--c-primary-50);box-shadow:0 0 0 4px rgba(0,113,227,.1)}
.role-avatar{width:32px;height:32px;flex:0 0 32px;border-radius:50%;display:grid;place-items:center;color:var(--c-white);font-size:13px;font-weight:var(--fw-bold)}
.role-name{font-size:12.5px;font-weight:var(--fw-bold)}
.role-desc{font-size:11px;color:var(--c-muted);line-height:1.45;margin-top:1px}

/* ---------------- 响应式 ---------------- */
@media(max-width:900px){
  .sidebar{width:64px;flex:0 0 64px}
  .brand-text,.nav-item .ni-label,.nav-badge,.user-meta{display:none}
  .nav{padding:2px 8px 12px}
  .nav-item{justify-content:center;padding:10px 0}
  .nav-item.active::before{display:none}
  .content{padding:18px 16px 48px}
  .mtabs{gap:var(--sp-4)}
  .page-title{font-size:22px}
  .kpis{grid-template-columns:minmax(0,1fr)}
}

/* ============================================================
   组件补充样式（表单域 / 物料选择器 / 三态进度 / 余额校验 / 高亮行）
   ============================================================ */

/* ---------------- 表单域 ---------------- */
.field{display:flex;flex-direction:column;gap:7px;min-width:0}
.field>label{font-size:12.5px;font-weight:var(--fw-medium);color:var(--c-ink-2);letter-spacing:-.005em}
.field>.el-select,.field>.el-date-editor,.field .el-input{width:100%}

/* ---------------- 来源条文字 ---------------- */
.source-bar .sb-text{flex:1;min-width:0;line-height:1.55}
.source-bar.gray .sb-text b{color:var(--c-ink-2)}
.source-bar.gray{color:var(--c-muted)}

/* ---------------- 物料选择器 ---------------- */
.mp-body{display:grid;grid-template-columns:176px minmax(0,1fr);gap:var(--sp-4)}
.mp-tree{border-right:1px solid var(--c-line-2);padding-right:var(--sp-3);max-height:440px;overflow-y:auto}
.mp-tree-title{font-size:11px;letter-spacing:.06em;color:var(--c-muted-2);font-weight:var(--fw-bold);margin-bottom:var(--sp-2)}
.mp-main{min-width:0}
.mp-search{display:flex;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-2)}
.mp-search .fb-count{font-size:var(--fs-12);color:var(--c-muted-2)}
.mp-search .fb-count b{color:var(--c-ink);font-weight:var(--fw-bold)}
.mp-table .el-table__row{cursor:pointer}
@media(max-width:820px){.mp-body{grid-template-columns:minmax(0,1fr)}.mp-tree{border-right:0;padding-right:0;max-height:160px}}

/* ---------------- 准三态进度 ---------------- */
.stage-track{display:flex;align-items:flex-start;gap:0}
.stage-node{flex:0 0 auto;width:150px;text-align:center;opacity:.55}
.stage-node.done,.stage-node.current{opacity:1}
.stage-dot{
  width:28px;height:28px;border-radius:50%;margin:0 auto var(--sp-2);
  display:grid;place-items:center;font-size:12px;font-weight:var(--fw-bold);
  background:var(--c-track);color:var(--c-muted-2);
}
.stage-node.done .stage-dot{background:var(--c-success);color:var(--c-white)}
.stage-node.current .stage-dot{background:var(--c-primary);color:var(--c-white);box-shadow:0 0 0 5px rgba(0,113,227,.15)}
.stage-name{font-size:12.5px;font-weight:var(--fw-bold);color:var(--c-ink)}
.stage-desc{font-size:11px;color:var(--c-muted-2);margin-top:2px;line-height:1.45}
.stage-bar{flex:1;height:2px;background:var(--c-track);margin-top:14px;border-radius:2px}
.stage-bar.on{background:var(--c-success-line)}

/* ---------------- 余额校验 ---------------- */
.balance-box{
  display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;
  background:var(--c-fill-2);border:1px solid var(--c-line-2);border-radius:var(--r-md);
  padding:var(--sp-4);
}
.bal-item{flex:1;min-width:110px;text-align:center;padding:var(--sp-2) 0}
.bal-item.accent{background:var(--c-primary-50);border-radius:var(--r-sm)}
.bal-k{font-size:11px;color:var(--c-muted);margin-bottom:4px}
.bal-v{font-family:var(--font-mono);font-size:15px;font-weight:var(--fw-bold);letter-spacing:-.02em;color:var(--c-ink)}
.bal-item.accent .bal-v{color:var(--c-primary)}
.bal-op{font-size:15px;color:var(--c-muted-2);font-weight:var(--fw-bold);padding:0 2px}

/* ---------------- 询价最优行高亮 ---------------- */
.el-table .rfq-best-row>td.el-table__cell{background:var(--c-success-50)!important}
.el-table .rfq-best-row:hover>td.el-table__cell{background:var(--c-success-25)!important}

/* ---------------- 文件条 / 日志行 ---------------- */
.file-chip{
  display:flex;align-items:center;gap:10px;background:var(--c-fill-2);border:1px solid var(--c-line-2);
  border-radius:var(--r-sm);padding:10px 13px;font-size:12.5px;margin-bottom:6px;
}
.file-chip .fc-ico{color:var(--c-primary)}
.logline{font-family:var(--font-mono);font-size:12px;color:var(--c-ink-2);padding:6px 0;display:flex;gap:12px;border-bottom:1px solid var(--c-line-2)}
.logline:last-child{border-bottom:0}
.logline .lt{color:var(--c-muted-2);flex:0 0 auto}
.logline .lm{flex:1;line-height:1.6}
.logline .lm.ok{color:var(--c-success-text)}

/* 表头里放徽标时不换行 */
.el-table th .split.nowrap{white-space:nowrap}

/* ---------------- 键盘可达 / 焦点可见 ---------------- */
.nav-item:focus-visible,.mtab:focus-visible,.user-switch:focus-visible,.role-card:focus-visible{
  outline:2px solid var(--c-primary);outline-offset:2px;
}
.nav-item:focus-visible{outline-offset:-2px}

/* ---------------- 表格内数字/编码不折行，长文本省略 ---------------- */
.el-table .num{white-space:nowrap}
.cell-ell{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}

/* 资质完备：提示项，不用大面积底色 */
.qual{font-size:12px;white-space:nowrap;letter-spacing:-.01em}
.qual.ok{color:var(--c-success-text)}
.qual.warn{color:var(--c-warn-text)}

/* ============================================================
   批次二：侧边栏分组 / 顶栏更新日志入口 / 更新日志弹窗 / 工作台 / 系统设置
   ============================================================ */

/* ---------------- 侧边栏分组 ---------------- */
.nav-group + .nav-group{margin-top:18px}
.nav-group-title{
  font-size:11px;font-weight:var(--fw-bold);color:var(--c-muted);letter-spacing:.04em;
  padding:0 0 6px 12px;cursor:default;user-select:none;
}
.nav-group:first-child .nav-group-title{padding-top:8px}
/* 无分组标题的组（工作台）单独置顶，补一个与标题等高的上间距，免得贴边 */
.nav-group-plain{padding-top:8px}
.nav-group-plain + .nav-group{margin-top:18px}
/* 图标换成 20×20 内联线框，选中态与文字一起变白 */
.nav-item .ni-icon{
  width:20px;flex:0 0 20px;display:grid;place-items:center;
  font-size:0;opacity:.72;color:inherit;
}
.nav-item .ni-icon svg{width:20px;height:20px;display:block}
.nav-item:hover .ni-icon{opacity:.95}
.nav-item.active .ni-icon{opacity:1;color:var(--c-white)}

/* ---------------- 顶栏 ghost 按钮（更新日志） ---------------- */
.ghost-btn{
  display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 11px;
  border:1px solid var(--c-line);background:transparent;border-radius:8px;
  color:var(--c-ink-2);font-family:var(--font-sans);font-size:var(--fs-12);font-weight:var(--fw-medium);
  cursor:pointer;white-space:nowrap;transition:all var(--dur-fast) var(--ease);
}
.ghost-btn .ghost-ico{display:grid;place-items:center;opacity:.75}
.ghost-btn .ghost-ico svg{width:15px;height:15px;display:block}
.ghost-btn:hover{border-color:var(--c-primary);color:var(--c-primary);background:var(--c-primary-50)}
.ghost-btn:hover .ghost-ico{opacity:1}
.ghost-btn:focus-visible{outline:2px solid var(--c-primary);outline-offset:2px}

/* ---------------- 更新日志弹窗 ---------------- */
.cl-dialog{border-radius:16px!important;overflow:hidden}
.cl-dialog .el-dialog__header{padding:22px 28px 0;margin:0}
.cl-dialog .el-dialog__body{padding:0 28px;color:var(--c-ink-2)}
.cl-dialog .el-dialog__footer{padding:0 28px 18px}
.cl-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}
.cl-title{font-size:var(--fs-19);font-weight:var(--fw-bold);color:var(--c-ink);letter-spacing:-.02em;line-height:1.2}
/* 版本串（版本号 + 内容指纹）：和标题同一行当副标签用，等宽数字方便肉眼比"这次变了没有" */
.cl-build{
  display:inline-block;margin-left:var(--sp-2);vertical-align:2px;
  font-size:var(--fs-12);font-weight:var(--fw-medium);letter-spacing:0;
  color:var(--c-muted);background:var(--c-fill);border:1px solid var(--c-line-2);
  border-radius:var(--r-pill);padding:1px var(--sp-2);font-variant-numeric:tabular-nums;
}
.cl-sub{font-size:var(--fs-13);color:var(--c-muted);margin-top:7px}
.cl-close{
  flex:0 0 auto;background:none;border:0;padding:3px 4px;border-radius:6px;cursor:pointer;
  color:var(--c-ink-2);font-family:var(--font-sans);font-size:var(--fs-13);font-weight:var(--fw-medium);
  transition:color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease);
}
.cl-close:hover{color:var(--c-primary);background:var(--c-primary-50)}
.cl-close:focus-visible{outline:2px solid var(--c-primary);outline-offset:2px}

.cl-body{
  max-height:60vh;overflow-y:auto;margin-top:18px;padding:18px 16px 4px 0;
  border-top:1px solid var(--c-line-2);
}
.cl-body::-webkit-scrollbar{width:8px}
.cl-body::-webkit-scrollbar-thumb{background:rgba(0,0,0,.16);border-radius:8px}
.cl-body::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,.3)}
.cl-body::-webkit-scrollbar-track{background:transparent}

.cl-rel + .cl-rel{margin-top:24px}
.cl-rel-line{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.cl-ver{font-size:15px;font-weight:var(--fw-bold);color:var(--c-primary);font-variant-numeric:tabular-nums}
.cl-date{font-size:var(--fs-13);color:var(--c-muted-2);font-variant-numeric:tabular-nums}
.cl-name{font-size:15px;font-weight:var(--fw-bold);color:var(--c-ink)}

.cl-grp{margin-top:14px}
.cl-cat{font-size:var(--fs-12);font-weight:var(--fw-bold);letter-spacing:.01em}
.cl-cat.k-struct{color:var(--c-primary)}
.cl-cat.k-exp{color:var(--c-success)}
.cl-cat.k-fix{color:var(--c-warn)}

.cl-items{list-style:none;margin:8px 0 0;padding:0;display:flex;flex-direction:column;gap:10px}
.cl-items li{display:flex;gap:9px;font-size:var(--fs-14);line-height:1.75;color:var(--c-ink-2)}
.cl-dot{flex:0 0 6px;width:6px;height:6px;border-radius:50%;margin-top:10px;background:var(--c-muted-2)}
.cl-items li.k-struct .cl-dot{background:var(--c-primary)}
.cl-items li.k-exp .cl-dot{background:var(--c-success)}
.cl-items li.k-fix .cl-dot{background:var(--c-warn)}
.cl-text{min-width:0}
.cl-text b{font-weight:var(--fw-bold);color:var(--c-ink)}
.cl-note-inline{color:var(--c-ink-2)}
.cl-dash{color:var(--c-muted-2);padding:0 2px}
.cl-em{font-weight:var(--fw-bold);color:var(--c-ink)}

.cl-foot{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-top:14px;border-top:1px solid var(--c-line-2)}
.cl-note{font-size:var(--fs-12);color:var(--c-muted-2)}

/* ---------------- 工作台 ---------------- */
.wb-hero{
  display:flex;align-items:center;gap:16px;padding:20px 24px;margin-bottom:var(--sp-4);
  background:var(--c-card);border-radius:var(--r-lg);border:1px solid rgba(0,0,0,.04);box-shadow:var(--sh-sm);
}
.wb-avatar{
  width:52px;height:52px;flex:0 0 52px;border-radius:50%;display:grid;place-items:center;
  color:var(--c-white);font-size:19px;font-weight:var(--fw-bold);
  box-shadow:0 8px 18px -8px rgba(0,0,0,.45),inset 0 1px 0 rgba(255,255,255,.28);
}
.wb-hero-main{min-width:0}
.wb-hello{font-size:22px;font-weight:var(--fw-bold);color:var(--c-ink);letter-spacing:-.02em;line-height:1.25}
.wb-meta{font-size:var(--fs-13);color:var(--c-muted);margin-top:5px}
.wb-hero-side{margin-left:auto;text-align:right;white-space:nowrap}
.wb-today{font-size:var(--fs-13);color:var(--c-muted)}
.wb-today b{color:var(--c-primary);font-size:20px;font-weight:var(--fw-bold);padding:0 3px;font-variant-numeric:tabular-nums}
.wb-kpi-note{font-size:var(--fs-11);color:var(--c-muted-2);margin-top:3px;line-height:1.45}

.wb-list{display:flex;flex-direction:column}
.wb-group + .wb-group{margin-top:14px;padding-top:12px;border-top:1px solid var(--c-line-2)}
.wb-group-title{
  font-size:var(--fs-12);font-weight:var(--fw-bold);color:var(--c-muted);
  display:flex;align-items:center;gap:8px;margin-bottom:4px;padding-left:8px;
}
.wb-group-title em{
  font-style:normal;font-size:10.5px;font-weight:var(--fw-bold);color:var(--c-muted-2);
  background:var(--c-fill);border-radius:var(--r-pill);padding:1px 7px;
}
.wb-row{
  display:flex;align-items:center;gap:12px;width:100%;text-align:left;
  padding:9px 8px;border:0;background:none;border-radius:var(--r-xs);cursor:pointer;
  font-family:var(--font-sans);transition:background var(--dur-fast) var(--ease);
}
.wb-row:hover{background:var(--c-fill-2)}
.wb-row.static{cursor:default}
.wb-row.static:hover{background:transparent}
.wb-no{
  flex:0 0 152px;font-family:var(--font-mono);font-size:var(--fs-12);color:var(--c-primary);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.wb-text{flex:1;min-width:0;font-size:var(--fs-13);color:var(--c-ink-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wb-text b{font-weight:var(--fw-bold);color:var(--c-ink)}
.wb-sub{color:var(--c-muted-2);font-size:var(--fs-11);margin-left:8px}
.wb-hint{flex:0 0 auto;font-size:var(--fs-11);color:var(--c-muted-2);white-space:nowrap}
.wb-go{flex:0 0 auto;font-size:var(--fs-12);font-weight:var(--fw-medium);color:var(--c-primary);white-space:nowrap}
.wb-count{
  flex:0 0 44px;font-size:20px;font-weight:var(--fw-bold);color:var(--c-ink);
  font-variant-numeric:tabular-nums;text-align:left;
}
.wb-row.tail .wb-no{color:var(--c-muted-2)}
.wb-row.tail .wb-text{color:var(--c-muted)}
.wb-row.tail:hover{background:var(--c-fill)}
.wb-chips{display:flex;flex-wrap:wrap;gap:6px}
.wb-chip{
  font-size:var(--fs-12);color:var(--c-ink-2);background:var(--c-fill);
  border:1px solid var(--c-line);border-radius:var(--r-pill);padding:4px 10px;line-height:1.4;
}
.wb-note{font-size:var(--fs-11);color:var(--c-muted-2);margin-top:10px;line-height:1.6}

/* ---------------- 系统设置 ---------------- */
.set-row{display:flex;align-items:center;gap:16px;padding:14px 0;border-bottom:1px solid var(--c-line-2)}
.set-row:last-child{border-bottom:0}
.set-main{flex:1;min-width:0}
.set-name{font-size:13.5px;font-weight:var(--fw-bold);color:var(--c-ink);display:flex;align-items:center;gap:8px}
.set-desc{font-size:12.5px;color:var(--c-ink-2);margin-top:4px;line-height:1.6}
.set-note{font-size:var(--fs-11);color:var(--c-muted-2);margin-top:3px}

/* ============================================================
   批次三：采购计划（合并选择器 / 应急与立项角标）/ 合同要点
   取值全部来自 tokens.css，不写魔法值
   ============================================================ */

/* ---------------- 计划：左选申请 / 右看合并 ---------------- */
.plan-pick{display:grid;grid-template-columns:minmax(0,.78fr) minmax(0,1.72fr);gap:var(--sp-4)}
@media(max-width:1100px){.plan-pick{grid-template-columns:minmax(0,1fr)}}
.plan-pick-col{min-width:0}
.plan-col-head{
  display:flex;align-items:baseline;justify-content:space-between;gap:var(--sp-2);
  font-size:12.5px;font-weight:var(--fw-bold);color:var(--c-ink);
  padding-bottom:var(--sp-2);margin-bottom:var(--sp-2);border-bottom:1px solid var(--c-line-2);
}

/* 申请勾选卡：整卡就是复选框 label（可点、可 Tab、空格可切） */
.req-pick-list{display:flex;flex-direction:column;gap:6px;max-height:360px;overflow-y:auto;padding-right:2px}
.req-pick{
  display:flex;align-items:flex-start;gap:10px;height:auto;margin-right:0;
  padding:10px 12px;border:1px solid var(--c-line);border-radius:var(--r-sm);background:var(--c-white);
  transition:border-color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease);
}
.req-pick:hover{border-color:var(--c-primary-line);background:var(--c-fill-2)}
.req-pick.is-checked{border-color:var(--c-primary);background:var(--c-primary-50)}
.req-pick .el-checkbox__input{flex:0 0 auto;margin-top:1px}
.req-pick .el-checkbox__label{padding-left:0;flex:1;min-width:0;color:inherit;font-weight:var(--fw-regular)}
.req-pick-body{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1;text-align:left}
.req-pick-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.req-pick-mid{font-size:12.5px;font-weight:var(--fw-medium);color:var(--c-ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.req-pick-sub{font-size:var(--fs-11);color:var(--c-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* 合并结果表：数量输入框窄一点，行高紧凑 */
.merged-table .el-table__cell{padding:6px 0}

/* 应急 / 高价值立项角标：行首出现，同一行可同时命中 */
.plan-flag{
  display:inline-block;font-size:10.5px;line-height:1.5;padding:0 5px;border-radius:var(--r-xs);
  font-weight:var(--fw-bold);white-space:nowrap;
}
.plan-flag.urgent{background:var(--c-warn-50);color:var(--c-warn-text);border:1px solid var(--c-warn-line)}
.plan-flag.high{background:var(--c-purple-50);color:var(--c-purple-text);border:1px solid var(--c-purple-line)}

/* 逐行标记按钮（未选中是描边，选中是实心浅底） */
.flag-btn{
  font-size:11px;line-height:1.5;padding:2px 6px;margin:0 2px 2px 0;cursor:pointer;
  border:1px solid var(--c-line);border-radius:var(--r-xs);background:var(--c-white);color:var(--c-muted);
  transition:all var(--dur-fast) var(--ease);
}
.flag-btn:hover{border-color:var(--c-warn);color:var(--c-warn-text)}
.flag-btn.on{background:var(--c-warn-50);border-color:var(--c-warn-line);color:var(--c-warn-text);font-weight:var(--fw-bold)}
.flag-btn.high:hover{border-color:var(--c-purple);color:var(--c-purple-text)}
.flag-btn.high.on{background:var(--c-purple-50);border-color:var(--c-purple-line);color:var(--c-purple-text)}
.flag-btn:focus-visible{outline:2px solid var(--c-primary);outline-offset:1px}

/* ---------------- 合同要点正文（保留换行，不渲染富文本） ---------------- */
.contract-points{
  font-size:var(--fs-13);color:var(--c-ink-2);line-height:var(--lh-loose);
  background:var(--c-fill-2);border:1px solid var(--c-line-2);border-radius:var(--r-sm);
  padding:var(--sp-3) var(--sp-4);white-space:pre-wrap;word-break:break-word;
}

/* ============================================================
   环节 6 · 发票三单匹配 / 对账单单据齐套
   仅用 tokens.css 变量，不引入新色值；与 .echo-cell / .info-row 同一视觉语言
   ============================================================ */

/* 匹配状态图例（页脚规则卡） */
.doc-legend{display:flex;gap:var(--sp-4);flex-wrap:wrap;align-items:center;font-size:var(--fs-11);color:var(--c-muted-2)}
.doc-legend>span{display:inline-flex;align-items:center;gap:6px}

/* 三单并排对比（抽屉内：订单 / 入库 / 发票） */
.match-col{background:var(--c-fill-2);border:1px solid var(--c-line-2);border-radius:var(--r-sm);padding:var(--sp-3)}
.match-col-h{font-size:var(--fs-11);letter-spacing:.06em;color:var(--c-muted-2);font-weight:var(--fw-bold)}
.match-amt{font-family:var(--font-mono);font-size:var(--fs-19);font-weight:var(--fw-bold);letter-spacing:-.02em;line-height:1.2;margin-top:6px;color:var(--c-ink);font-variant-numeric:tabular-nums;overflow-wrap:anywhere}
.match-amt.diff{color:var(--c-danger-text)}
.match-meta{font-size:var(--fs-11);color:var(--c-muted-2);margin-top:6px;line-height:var(--lh-loose)}

/* 单据齐套：四个小勾 / 叉（合同 · 验收单 · 入库单 · 送货单） */
.doc-flags{display:inline-flex;gap:4px;align-items:center}
.doc-flag{
  display:inline-flex;align-items:center;justify-content:center;
  width:18px;height:18px;border-radius:6px;font-size:11px;font-weight:var(--fw-bold);line-height:1;
  background:var(--c-success-50);color:var(--c-success-text);border:1px solid var(--c-success-line);
}
.doc-flag.no{background:var(--c-danger-50);color:var(--c-danger-text);border-color:var(--c-danger-line)}
.doc-flag.na{background:var(--c-fill);color:var(--c-muted);border-color:var(--c-line)}
.doc-flag-more{font-size:var(--fs-11);color:var(--c-danger-text);font-weight:var(--fw-bold);white-space:nowrap}

/* 缺件行：整行淡红，配合下方汇总条 */
.el-table .row-bad>td.el-table__cell{background:rgba(255,59,48,.035)}
.el-table .row-bad:hover>td.el-table__cell{background:rgba(255,59,48,.07)}

/* ============================================================
   仓储域并入的样式（2026-11-06 合并）
   -----------------------------------------------------------------
   来源：库管应用 styles/app.css 中采购侧没有的 7 条规则，原样搬过来，
   全部走同一套 tokens（--c-* / --sp-* / --r-* / --dur-* / --fw-*），
   不新增颜色、不改动既有类，避免第二套样式体系。
   · .btn-ico / .danger-text / .plus-text / .minus-text —— 按钮内图标与增减量文字
   · .joint-row / .joint-dept / .joint-user —— 验收三方联检签字行
   ============================================================ */
.btn-ico{display:inline-flex;align-items:center;vertical-align:-2px}
.btn-ico svg{display:block}

.joint-row{
  display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:var(--r-xs);
  border:1px solid var(--c-line-2);background:var(--c-fill-2);margin-bottom:var(--sp-2);
  transition:background var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease);
}
.joint-row:hover{background:var(--c-fill);border-color:var(--c-line)}
.joint-row:last-child{margin-bottom:0}
.joint-dept{font-size:12.5px;font-weight:var(--fw-bold);color:var(--c-ink);flex:0 0 76px}
.joint-user{font-size:12.5px;color:var(--c-ink-2);flex:1;min-width:0;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.joint-row:focus-visible{outline:2px solid var(--c-primary);outline-offset:2px}

.plus-text{color:var(--c-success-text);font-weight:var(--fw-bold);white-space:nowrap}
.minus-text{color:var(--c-danger-text);font-weight:var(--fw-bold);white-space:nowrap}
.danger-text{color:var(--c-danger-text)}
