:root{
  --bg:#F4F6FA; --card:#FFFFFF; --screen-border:#E3E7EF; --line:#EEF1F6;
  --text:#17181C; --text-2:#3F4652; --text-3:#6B7280; --text-4:#6F7A8C; --text-5:#7A8496;
  --primary:#2B6DEF; --primary-tint:#F0F5FE; --primary-soft:#E8EFFD; --primary-border:#C6D4F2;
  --fill:#F7F8FA; --navy:#1E3A8A; --navy-tint:#E8EDF9;
  --amber:#D97706; --amber-tint:#FEF3E2; --amber-text:#B45309;
  --green:#16A34A; --green-tint:#E8F7EE; --red:#DC2626; --gray-tint:#F0F2F5;
}
*{margin:0;padding:0;box-sizing:border-box;}
html,body{width:100%;height:100%;overflow:hidden;background:#E9EDF3;
  font-family:"Noto Sans SC","PingFang SC","Microsoft YaHei",sans-serif;color:var(--text);
  font-variant-numeric:tabular-nums;} /* 等宽数字：日期 / 工号 / 计数纵向对齐 */
button{font-family:inherit;border:none;background:none;cursor:pointer;}
input,select{font-family:inherit;outline:none;}
a{text-decoration:none;}

/* ===== 舞台：1440x900 原始画布 + 等比缩放 ===== */
#stage{position:absolute;left:50%;top:50%;width:1440px;height:900px;
  transform-origin:center center;background:var(--bg);border-radius:28px;
  border:1px solid var(--screen-border);overflow:hidden;
  box-shadow:0 24px 80px rgba(23,24,28,.14);}

/* ===== 通用 ===== */
.screen{position:absolute;inset:0;display:none;}
.screen.active{display:block;}
.icon{flex:none;display:inline-block;}

/* ===== A1 登录页 ===== */
#screen-login.active{display:flex;}
.brand-panel{width:520px;height:100%;background:linear-gradient(135deg,#2B6DEF 0%,#1B3A7A 100%);
  border-radius:28px 0 0 28px;padding:56px;display:flex;flex-direction:column;gap:22px;
  position:relative;overflow:hidden;}
/* 氛围层：运行图网格 + 右下角光晕，避免大面积纯色渐变显得空 */
.brand-panel::before{content:'';position:absolute;inset:0;pointer-events:none;
  background-image:linear-gradient(rgba(255,255,255,.07) 1px,transparent 1px),
                   linear-gradient(90deg,rgba(255,255,255,.07) 1px,transparent 1px);
  background-size:46px 46px;
  -webkit-mask-image:radial-gradient(130% 95% at 12% 8%,#000 26%,transparent 76%);
  mask-image:radial-gradient(130% 95% at 12% 8%,#000 26%,transparent 76%);}
.brand-panel::after{content:'';position:absolute;right:-140px;bottom:-160px;width:460px;height:460px;
  border-radius:50%;pointer-events:none;
  background:radial-gradient(circle,rgba(255,255,255,.18),rgba(255,255,255,0) 70%);}
.brand-panel>*{position:relative;z-index:1;}
.brand-stats{margin-top:auto;display:flex;gap:0;}
.brand-stats>div{flex:1;padding-right:16px;margin-right:16px;border-right:1px solid rgba(255,255,255,.16);}
.brand-stats>div:last-child{border-right:none;margin-right:0;padding-right:0;}
.brand-stats b{display:block;font-size:22px;font-weight:700;color:#fff;line-height:1.1;
  font-variant-numeric:tabular-nums;}
.brand-stats span{font-size:11px;color:#B7CDF3;}
.brand-foot{display:flex;align-items:center;justify-content:space-between;
  font-size:11px;color:#9FBBEF;letter-spacing:.02em;padding-top:20px;
  border-top:1px solid rgba(255,255,255,.14);}
.brand-logo{width:48px;height:48px;background:#fff;border-radius:12px;display:flex;align-items:center;justify-content:center;}
.brand-name{font-size:26px;font-weight:700;color:#fff;}
.brand-sub{font-size:14px;color:#C7D7F5;margin-top:-14px;}
.brand-bullet{display:flex;align-items:center;gap:10px;height:20px;font-size:13px;color:#E8EFFD;}
.login-card{position:absolute;left:760px;top:50%;transform:translateY(-50%);width:420px;background:#fff;
  border-radius:16px;padding:34px;display:flex;flex-direction:column;gap:16px;
  box-shadow:0 8px 32px rgba(23,24,28,.08);}
.login-title{font-size:22px;font-weight:700;}
.fld-label{font-size:13px;font-weight:500;color:var(--text-2);}
.fld-input{width:100%;height:46px;background:var(--fill);border:1px solid var(--screen-border);
  border-radius:10px;padding:0 14px;font-size:14px;color:var(--text);transition:border-color .15s;}
.fld-input::placeholder{color:var(--text-5);}
.fld-input:focus{border-color:var(--primary);background:#fff;}
.btn-primary{width:100%;height:48px;background:var(--primary);color:#fff;border-radius:10px;
  font-size:15px;font-weight:600;transition:background .15s;}
.btn-primary:hover{background:#1F5BD0;}
.login-foot{font-size:12px;color:var(--text-5);text-align:center;margin-top:auto;}
.login-tabs{display:flex;gap:4px;background:#F1F4F9;border-radius:9px;padding:3px;}
.login-tab{flex:1;height:32px;border:0;background:transparent;border-radius:7px;font-size:13px;
  color:#6B7280;cursor:pointer;font-family:inherit;transition:all .15s;}
.login-tab.active{background:#fff;color:#17181C;font-weight:500;box-shadow:0 1px 3px rgba(16,24,40,.10);}
.login-pane{display:none;flex-direction:column;gap:14px;flex:1;}
.login-pane.active{display:flex;}
.qr-wrap{display:flex;flex-direction:column;align-items:center;gap:9px;padding:4px 0 0;}
.qr-box{width:128px;height:128px;border:1px solid #E3E7EF;border-radius:10px;background:#fff;
  padding:8px;display:flex;align-items:center;justify-content:center;}
.login-hint{font-size:11.5px;color:#6B7280;line-height:1.65;background:#F7F9FC;
  border-radius:8px;padding:9px 11px;}
.login-hint b{color:#17181C;font-weight:500;}
.scan-msg{display:none;margin-top:10px;padding:9px 11px;border-radius:8px;font-size:11.5px;line-height:1.6;}
.scan-msg.err{display:block;background:#FEF3F2;border:1px solid #F5D2CE;color:#B42318;}
.scan-msg.ok{display:block;background:#F0F9F2;border:1px solid #CBE7CF;color:#2E7D32;}

/* ===== 应用外壳（侧边栏 + 顶栏） ===== */
#shell{position:absolute;inset:0;display:none;}
#shell.active{display:block;}
.sidebar{position:absolute;left:0;top:0;width:220px;height:100%;background:#fff;border-radius:28px 0 0 28px;}
.sidebar-div{position:absolute;left:219px;top:0;width:1px;height:100%;background:var(--line);}
.sidebar-logo{display:flex;align-items:center;gap:10px;height:64px;padding:0 16px;}
.sidebar-logo-mark{width:32px;height:32px;background:var(--primary);border-radius:8px;
  display:flex;align-items:center;justify-content:center;flex:none;}
.sidebar-logo-t1{font-size:14px;font-weight:700;line-height:1.2;}
.sidebar-logo-t2{font-size:10px;color:var(--text-5);line-height:1.2;}
.nav-list{padding:12px;display:flex;flex-direction:column;gap:4px;}
.nav-item{display:flex;align-items:center;gap:10px;height:42px;padding:0 12px;border-radius:8px;
  font-size:14px;color:var(--text-2);cursor:pointer;transition:background .12s;width:100%;text-align:left;}
.nav-item:hover{background:var(--fill);}
.nav-item.active{background:var(--primary-tint);color:var(--primary);font-weight:600;}
.nav-item svg{flex:none;}
.sidebar-user{position:absolute;left:12px;top:824px;width:196px;height:64px;background:var(--fill);
  border-radius:12px;padding:12px;display:flex;align-items:center;gap:10px;}
.avatar{width:32px;height:32px;border-radius:50%;background:var(--primary);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:700;flex:none;}
.sidebar-user-t1{font-size:13px;font-weight:600;line-height:1.25;}
.sidebar-user-t2{font-size:11px;color:var(--text-5);line-height:1.25;}

.topbar{position:absolute;left:220px;top:0;width:1220px;height:64px;background:#fff;
  padding:0 24px;display:flex;align-items:center;justify-content:space-between;}
.topbar-title{font-size:18px;font-weight:600;}
.topbar-right{display:flex;align-items:center;gap:16px;}
.topbar-date{font-size:13px;color:var(--text-3);}
.topbar-div{position:absolute;left:220px;top:63px;width:1220px;height:1px;background:var(--line);}

.content{position:absolute;left:220px;top:64px;width:1220px;height:836px;padding:24px;overflow:hidden;}
.page{display:none;height:100%;}
.page.active{display:block;overflow-y:auto;padding-right:2px;}
/* 列表页（时刻表 / 交路表）：表格撑满剩余高度，避免下方大片空白 */
.page.page-fill.active{display:flex;flex-direction:column;overflow:hidden;}
.page-fill>.table-card{flex:1;min-height:0;display:flex;flex-direction:column;margin-top:16px;}
/* 上传栏 / 说明文字不能被压扁（否则上传区会被表格挤掉） */
.page-fill>.page-desc,.page-fill>.up-bar,.page-fill>.view-role-banner{flex:none;}
.page-fill .list-scroll{flex:1;max-height:none;min-height:0;}
.page-fill .tr-head,.page-fill .tr-foot{flex:none;}
/* 列表页行高放宽到 60：少量版本时也能填满卡片高度，不出现大白带 */
.page-fill .list-scroll .tr-body{height:60px!important;} /* 行内写了 52px，这里强制放宽 */
.page-desc{font-size:13px;color:var(--text-4);margin-bottom:16px;}

/* ===== 统计卡 ===== */
.stat-row{display:flex;gap:12px;margin-bottom:20px;}
.today-card{display:flex;align-items:center;justify-content:space-between;gap:24px;
  background:linear-gradient(135deg,#2B6DEF,#1E4FBF);border-radius:14px;padding:16px 22px;
  margin-bottom:16px;color:#fff;box-shadow:0 8px 24px rgba(43,109,223,.22);}
.today-lb{font-size:12px;color:rgba(255,255,255,.78);margin-bottom:5px;}
.today-tt{display:flex;align-items:baseline;gap:10px;}
.today-code{font-size:26px;font-weight:700;letter-spacing:.5px;}
.today-ver{font-size:13px;color:rgba(255,255,255,.9);}
.today-meta{font-size:11px;color:rgba(255,255,255,.72);margin-top:6px;}
.today-right{text-align:right;flex:none;}
.today-date{font-size:14px;font-weight:500;}
.today-time{font-size:24px;font-weight:700;font-variant-numeric:tabular-nums;line-height:1.25;}
.today-dow{font-size:11px;color:rgba(255,255,255,.78);}
.stat-card{flex:1;min-width:0;height:104px;background:#fff;border:1px solid var(--line);border-radius:12px;
  padding:16px;display:flex;flex-direction:column;gap:4px;}
.stat-label{font-size:12px;color:var(--text-4);}
.stat-value{font-size:28px;font-weight:700;line-height:1.15;}
.stat-sub{font-size:11px;color:var(--text-4);}
.stat-sub.warn{color:var(--amber);}
.stat-sub.ok{color:#15803D;}

/* ===== 提醒条 ===== */
.alert-bar{display:flex;align-items:center;gap:12px;height:64px;background:var(--amber-tint);
  border-radius:12px;padding:0 16px;margin-bottom:20px;}
.alert-txt{flex:1;font-size:13px;font-weight:500;color:var(--amber-text);}
.btn-amber{height:32px;background:var(--amber);color:#fff;border-radius:8px;padding:0 12px;
  font-size:12px;font-weight:500;display:flex;align-items:center;}
.btn-amber:hover{background:#B45309;}

/* ===== 面板 ===== */
.panel-row{display:flex;gap:16px;}
.panel{background:#fff;border:1px solid var(--line);border-radius:12px;padding:20px;
  display:flex;flex-direction:column;gap:8px;}
.panel-head{display:flex;align-items:center;justify-content:space-between;height:28px;}
.panel-title{font-size:15px;font-weight:600;}
.panel-link{font-size:12px;color:var(--primary);cursor:pointer;}
.chip-ok{display:flex;align-items:center;gap:4px;height:24px;background:var(--green-tint);
  color:var(--green);border-radius:12px;padding:0 12px;font-size:11px;font-weight:500;}

.import-row{display:flex;align-items:center;gap:12px;height:48px;}
.type-chip{width:48px;height:24px;border-radius:6px;display:flex;align-items:center;justify-content:center;
  font-size:11px;font-weight:500;flex:none;}
.type-chip.blue{background:var(--primary-soft);color:var(--primary);}
.type-chip.navy{background:var(--navy-tint);color:var(--navy);}
.type-chip.amber{background:var(--amber-tint);color:var(--amber-text);}
.import-file{flex:1;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.import-time{width:90px;font-size:12px;color:var(--text-4);text-align:right;}
.import-res{width:48px;font-size:12px;font-weight:500;color:var(--green);text-align:right;}

.status-row{display:flex;align-items:center;gap:10px;height:48px;}
.status-dot{width:8px;height:8px;border-radius:50%;background:var(--green);flex:none;}
.status-name{flex:1;font-size:13px;}
.status-meta{width:200px;font-size:12px;color:var(--text-4);text-align:right;}
.panel-note{font-size:11px;color:var(--text-5);margin-top:auto;}

/* ===== 工具栏 ===== */
.toolbar{display:flex;align-items:center;justify-content:space-between;height:48px;margin-bottom:16px;}
.toolbar-left{display:flex;gap:12px;}
.search-box{width:280px;height:36px;background:#fff;border:1px solid var(--screen-border);
  border-radius:8px;padding:0 12px;display:flex;align-items:center;gap:8px;}
.search-box input{flex:1;border:none;font-size:13px;background:none;}
.search-box input::placeholder{color:var(--text-5);}
.sel-box{height:36px;background:#fff;border:1px solid var(--screen-border);border-radius:8px;
  padding:0 12px;display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:13px;color:var(--text-2);}
.btn-blue-sm{height:36px;background:var(--primary);color:#fff;border-radius:8px;padding:0 16px;
  font-size:13px;font-weight:600;display:flex;align-items:center;}
.btn-blue-sm:hover{background:#1F5BD0;}

/* ===== 警告条（工号缺失） ===== */
.warn-bar{display:flex;align-items:center;gap:10px;height:44px;background:var(--amber-tint);
  border-radius:10px;padding:0 14px;margin-bottom:16px;}
.warn-txt{flex:1;font-size:13px;color:var(--amber-text);}
.warn-link{font-size:13px;font-weight:500;color:var(--primary);cursor:pointer;}

/* ===== 数据表 ===== */
.table-card{background:#fff;border:1px solid var(--line);border-radius:12px;overflow:hidden;}
.tr{display:flex;align-items:center;gap:12px;padding:0 16px;}
/* 固定列禁止收缩：否则表头与数据行内容宽度不同时，各自压缩比例不一样 → 列对不齐 */
.tr>span{flex-shrink:0;}
/* 记录类列表：条目增多时内部滚动，高度稳定，避免顶走下面的派班看板 */
.list-scroll{max-height:162px;overflow-y:auto;overscroll-behavior:auto;display:flex;flex-direction:column;}
/* 行是 flex 子项，默认会被压缩：条目一多就变窄。这里锁死行高，超出交给滚动 */
.list-scroll>.tr{flex:none;}
.list-scroll::-webkit-scrollbar{width:8px;}
.list-scroll::-webkit-scrollbar-thumb{background:#D8DEE9;border-radius:4px;}
.list-scroll::-webkit-scrollbar-thumb:hover{background:#C2CAD8;}
/* 列表底部统计行吸底：滚动时始终可见条数与口径 */
.list-scroll .tr-foot{position:sticky;bottom:0;margin-top:auto;background:#fff;z-index:2;box-shadow:0 -8px 14px rgba(23,24,28,.05);}
.tr>span[style*="flex:1"]{flex-shrink:1;}
.tr-head{height:44px;background:var(--fill);font-size:12px;font-weight:500;color:var(--text-4);}
.tr-body{height:60px;border-top:1px solid var(--line);font-size:13px;}
.tr-body:hover{background:#FAFBFD;}
.td-name{width:140px;font-size:14px;font-weight:500;}
.td-no{width:110px;font-size:13px;color:var(--text-4);}
.td-team{width:110px;font-size:13px;color:var(--text-2);}
.td-role{width:130px;font-size:13px;color:var(--text-2);}
.td-role.navy{color:var(--navy);font-weight:500;}
.td-bind{width:130px;font-size:13px;font-weight:500;}
.td-bind.ok{color:var(--green);}
.td-bind.no{color:var(--text-4);}
.td-code{flex:1;font-size:13px;color:var(--text-2);}
.td-act{width:110px;font-size:13px;font-weight:500;color:var(--primary);text-align:right;cursor:pointer;}
.td-act:hover{text-decoration:underline;}
.td-act.muted{color:var(--text-4);font-weight:400;cursor:default;}
.td-act.muted:hover{text-decoration:none;}
.tr-foot{height:44px;border-top:1px solid var(--line);justify-content:space-between;font-size:12px;color:var(--text-4);}

/* ===== 上传页（单条横栏：上传 + 文件信息 + 表单 + 确认导入） ===== */
/* ===== 上传栏：时刻表 / 交路表 / 班表 三页共用同一套骨架与节奏 =====
   结构统一为：步骤条 → 一行[上传按钮 | 文件与解析结果 | 表单字段 | 操作] → 格式提示行。
   三页只有「内容」不同（字段、标签、提示），排版、尺寸、配色完全一致。 */
.up-bar{display:flex;flex-direction:column;gap:10px;background:#fff;
  border:1px solid var(--line);border-radius:12px;padding:12px 16px;position:relative;}
/* 步骤条：让人一眼看出三个页面走的是同一个上传流程 */
.up-flow{display:flex;align-items:center;gap:9px;font-size:11px;color:var(--text-5);}
.up-flow .st{display:inline-flex;align-items:center;gap:5px;white-space:nowrap;}
.up-flow .st i{width:15px;height:15px;border-radius:8px;background:#F0F2F6;color:#6F7A8C;
  font-size:9px;font-style:normal;font-weight:600;display:inline-flex;align-items:center;justify-content:center;flex:none;}
.up-flow .st.on{color:var(--text-2);font-weight:500;}
.up-flow .st.on i{background:var(--primary-tint);color:var(--primary);}
.up-flow em{font-style:normal;color:#CBD2DE;line-height:1;}
.up-flow .sp{flex:1;}
.up-flow .hint{font-size:11px;color:var(--text-5);white-space:nowrap;}
.up-row{display:flex;align-items:center;flex-wrap:wrap;gap:12px 16px;}
/* 上传按钮：三页同尺寸 */
.up-dzbtn{width:96px;height:56px;flex:none;border:1.5px dashed var(--primary-border);border-radius:10px;
  background:#FBFCFE;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;
  cursor:pointer;transition:border-color .15s,background .15s;}
.up-dzbtn:hover{border-color:var(--primary);background:#F4F8FF;}
.up-dzbtn span{font-size:12px;font-weight:500;color:#17181C;}
/* 文件与解析结果 */
.up-info{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:6px;}
.up-file{display:flex;align-items:center;flex-wrap:wrap;gap:4px 10px;min-width:0;}
.up-file .pv-name{flex:0 1 auto;max-width:280px;font-size:13px;font-weight:500;color:#17181C;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.up-file .pv-reselect{flex:none;font-size:11px;color:var(--primary);cursor:pointer;}
.up-file .up-ok{flex:none;font-size:11px;color:#2E7D32;}
.up-meta{display:flex;align-items:center;flex-wrap:wrap;gap:4px 10px;min-width:0;}
.up-sub{font-size:11px;color:var(--text-4);line-height:1.65;white-space:normal;}
.up-sub.warn{color:#B45309;}
/* 参数区：独立一行，字段横向铺开不再挤压，右侧说明文字紧贴「周期」字段 */
.up-params{display:flex;align-items:center;flex-wrap:wrap;gap:10px 16px;padding-top:10px;
  border-top:1px dashed var(--line);}
.up-param-hint{font-size:11px;color:var(--text-4);white-space:nowrap;}
/* 表单字段：标签、控件高度、圆角三页一致 */
.up-form{display:flex;align-items:center;flex-wrap:wrap;gap:8px 14px;flex:none;}
.up-fld{display:flex;align-items:center;gap:7px;}
.up-fld>span{font-size:11px;color:var(--text-4);white-space:nowrap;}
.up-fld input,.up-fld select{height:32px;width:96px;border:1px solid #E3E7EF;border-radius:8px;
  padding:0 9px;font-size:12px;outline:none;background:#fff;color:var(--text);}
.up-fld input.wide,.up-fld select.wide{width:140px;}
.up-fld input:focus,.up-fld select:focus{border-color:var(--primary);}
/* 没有字段的页面（班表）用同高度的说明块补位，三页第二段视觉对齐 */
.up-note{display:flex;align-items:center;gap:8px;max-width:430px;min-height:32px;padding:5px 12px;
  border-radius:8px;background:#F7F9FC;border:1px solid #EDF1F7;
  font-size:11px;color:var(--text-3);line-height:1.55;}
.up-note b{color:var(--text-2);font-weight:600;}
.up-note svg{flex:none;}
/* 操作按钮：三页同高同 padding */
.up-actions{display:flex;gap:8px;align-items:center;flex:none;margin-left:auto;}
.up-actions .btn-ghost{height:32px;padding:0 14px;font-size:12px;border-radius:8px;}
.up-actions .btn-solid{height:32px;padding:0 18px;font-size:12px;border-radius:8px;}
/* 格式提示行：常驻可见，右侧给「下载模板」留位 */
.up-tips{display:flex;align-items:center;flex-wrap:wrap;gap:6px 18px;
  margin-top:2px;padding-top:10px;border-top:1px dashed var(--line);
  font-size:11px;color:var(--text-4);}
.up-tips .tip-i{display:inline-flex;align-items:center;gap:6px;}
.up-tips .tip-i b{width:15px;height:15px;border-radius:8px;background:#F0F2F6;color:#6F7A8C;
  font-size:9px;font-weight:600;display:inline-flex;align-items:center;justify-content:center;flex:none;}
.up-tpl{margin-left:auto;display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 11px;
  border:1px solid var(--primary-border);border-radius:8px;background:#F7FAFF;
  color:var(--primary);font-size:12px;font-weight:500;cursor:pointer;white-space:nowrap;}
.up-tpl:hover{background:var(--primary-tint);}
/* 没有模板的页面（时刻表）：右侧用同尺寸的说明占位，保持三页底部对齐 */
.up-plain{margin-left:auto;display:inline-flex;align-items:center;height:28px;padding:0 11px;
  border:1px dashed #DDE3EC;border-radius:8px;background:#FBFCFE;
  color:var(--text-4);font-size:11px;white-space:nowrap;cursor:default;}
.up-tag{display:inline-flex;align-items:center;gap:4px;height:20px;padding:0 8px;border-radius:5px;
  background:#F7F8FA;font-size:11px;color:#6B7280;white-space:nowrap;flex:none;}
.up-tag.ok{background:#F0F9F2;color:#2E7D32;}
.up-tag.warn{background:#FEF6E7;color:#B45309;}
.up-tag-lbl{font-size:11px;color:#9AA3B2;flex:none;white-space:nowrap;}
.dropzone{width:420px;height:200px;background:#fff;border:2px dashed var(--primary-border);
  border-radius:12px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;
  cursor:pointer;transition:border-color .15s,background .15s;}
.dropzone:hover{border-color:var(--primary);background:#FBFCFE;}
.dz-icon{width:48px;height:48px;background:var(--primary-tint);border-radius:24px;
  display:flex;align-items:center;justify-content:center;}
.dz-main{font-size:14px;font-weight:500;}
.dz-sub{font-size:12px;color:var(--text-4);}
.dz-tpl{font-size:12px;font-weight:500;color:var(--primary);}
.fmt-card{width:420px;background:#fff;border:1px solid var(--line);border-radius:12px;
  padding:16px;display:flex;flex-direction:column;gap:10px;margin-top:16px;}
.fmt-title{font-size:14px;font-weight:600;}
.fmt-item{display:flex;align-items:center;gap:8px;height:18px;font-size:12px;color:var(--text-2);}
.fmt-dot{width:5px;height:5px;border-radius:50%;background:var(--primary);flex:none;}

.preview-card{flex:1;min-width:0;background:#fff;border:1px solid var(--line);border-radius:12px;
  padding:14px 18px;display:flex;flex-direction:column;gap:10px;}
.pv-head{display:flex;align-items:center;gap:10px;height:32px;}
.pv-name{flex:1;font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.pv-reselect{font-size:12px;color:var(--primary);cursor:pointer;}
.pv-stats{display:flex;gap:12px;height:58px;}
.pv-stat{flex:1;background:var(--fill);border-radius:8px;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:2px;}
.pv-stat-v{font-size:20px;font-weight:700;}
.pv-stat-l{font-size:11px;color:var(--text-4);}
.pv-check{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-2);line-height:1.5;}
.pv-check.warn{color:var(--amber-text);}

/* ===== 审批监控 ===== */
.ap-stats{display:flex;gap:16px;margin-bottom:16px;}
.ap-stat{flex:1;background:#fff;border:1px solid var(--line);border-radius:12px;
  padding:13px 18px;display:flex;flex-direction:column;gap:3px;}
.ap-stat-v{font-size:23px;font-weight:700;line-height:1.2;}
.ap-stat-l{font-size:12px;color:var(--text-4);}
.ap-stat.hot .ap-stat-v{color:#B45309;}
.ap-type{display:inline-flex;align-items:center;gap:5px;height:22px;padding:0 8px;border-radius:5px;
  font-size:11px;font-weight:500;white-space:nowrap;}
.ap-type.swap{background:#EAF1FE;color:#1E3A8A;}
.ap-type.cover{background:#FEF3E2;color:#B45309;}
.ap-flow{display:flex;align-items:center;flex-wrap:wrap;column-gap:7px;row-gap:3px;
  font-size:13px;color:var(--text-2);}
/* 一侧人员 = 一个不可拆分单元：姓名 / 车队 / 交路 永远整体出现，不会被挤到第二行只留半截 */
.ap-pair{display:inline-flex;align-items:center;gap:5px;flex:none;white-space:nowrap;}
.ap-op{flex:none;color:#AEB6C4;font-size:12px;line-height:1;}
.ap-flow b{color:#17181C;font-weight:600;}
/* 车队降级为浅灰小标签：比「（客车二队）」省宽，且不抢交路号的视觉权重 */
.ap-team{font-size:10px;color:#7B8496;background:#F2F4F8;border-radius:4px;
  padding:1px 5px;line-height:1.6;font-weight:400;}
.ap-route{background:#EEF3FD;color:#2B6DEF;border-radius:4px;padding:1px 7px;
  font-size:11px;font-weight:500;font-style:normal;white-space:nowrap;}
.ap-rest{background:#FEF3E2;color:#B45309;border-radius:4px;padding:1px 7px;
  font-size:11px;font-weight:500;font-style:normal;white-space:nowrap;}
.ap-res{max-width:76px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-size:12px;color:#9AA3B2;cursor:default;}
.ap-res.auto{color:#B42318;font-weight:500;max-width:64px;}
.ap-confirm{display:inline-flex;align-items:center;gap:4px;font-size:12px;font-weight:500;white-space:nowrap;}
.ap-confirm.ok{color:#2E7D32;}
.ap-confirm.wait{color:#B45309;}
.ap-st{font-weight:500;}
.ap-st.pending{color:#B45309;}
.ap-st.approved{color:#2E7D32;}
.ap-st.rejected{color:#B42318;}
.ap-kv{display:flex;gap:10px;font-size:13px;line-height:1.9;}
.ap-kv span{width:76px;flex:none;color:var(--text-4);}
.ap-kv b{color:#17181C;font-weight:500;}
.ap-reason{width:100%;min-height:76px;border:1px solid #E3E7EF;border-radius:8px;padding:9px 11px;
  font-size:13px;font-family:inherit;outline:none;resize:vertical;}
.ap-reason:focus{border-color:var(--primary);}
.pv-ver{display:flex;align-items:center;gap:12px;height:40px;}
.pv-ver-label{width:80px;font-size:13px;color:var(--text-4);}
.pv-ver-box{flex:1;height:40px;background:var(--fill);border-radius:8px;padding:0 12px;
  display:flex;align-items:center;font-size:13px;border:1px solid transparent;transition:border-color .15s;}
.pv-ver-box:focus-within{border-color:var(--primary);background:#fff;}
.pv-ver-box input{flex:1;border:none;background:none;font-size:13px;}
.bind-select{flex:1;height:44px;background:var(--primary-tint);border:1.5px solid var(--primary);border-radius:8px;
  padding:0 12px;font-size:13px;font-weight:500;color:var(--primary);cursor:pointer;}
.cal-date{height:36px;border:1px solid #E3E7EF;border-radius:8px;padding:0 10px;font-size:13px;color:#17181C;background:#fff;flex:1;}
.cal-select{height:36px;border:1px solid #E3E7EF;border-radius:8px;padding:0 10px;font-size:13px;color:#17181C;background:#fff;flex:1;}
.cal-date:focus,.cal-select:focus{outline:none;border-color:#2B6DEF;}
#calScroll::-webkit-scrollbar{width:8px;}
#calScroll::-webkit-scrollbar-thumb{background:#D8DEE8;border-radius:4px;}
.board-tab{flex:1;height:40px;border:none;background:none;font-size:13px;font-weight:500;color:#6B7280;cursor:pointer;border-bottom:2px solid transparent;}
.board-tab.active{color:#2B6DEF;font-weight:600;border-bottom-color:#2B6DEF;}
.org-select{height:28px;border:1px solid #E3E7EF;border-radius:6px;padding:0 8px;font-size:12px;color:#17181C;background:#fff;min-width:118px;cursor:pointer;}
.org-select:focus{outline:none;border-color:#2B6DEF;}
.org-item{display:flex;align-items:center;gap:4px;}
.org-lb{font-size:11px;color:#8A93A6;white-space:nowrap;}

.rcard{background:#fff;border:1px solid #EEF1F6;border-radius:8px;padding:8px 10px;display:flex;flex-direction:column;gap:4px;min-height:104px;height:auto;width:calc(25% - 6px);min-width:200px;transition:border-color .12s;}
.rcard-info{display:flex;flex-direction:column;gap:3px;}
.rcard-drop{min-height:36px;margin-top:auto;padding-top:4px;}
.rcard.has-driver{border-color:#C7D7F5;background:#FBFCFE;}
.rcard.drag-over{border-color:#2B6DEF;background:#F0F5FE;}
.rcard-head{display:flex;align-items:center;gap:6px;font-size:13px;}
.rcard-head b{color:#17181C;}
.rcard-head .rcard-names{flex:1;min-width:0;font-size:12px;font-weight:600;color:#1E3A8A;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.rcard-head .rcard-names.empty{color:#C3C9D4;font-weight:400;}
.rcard-meta{font-size:10px;color:#8A93A6;line-height:1.4;}
.rcard-tags{display:flex;gap:4px;}
.rcard-tag{display:inline-flex;align-items:center;height:18px;padding:0 6px;border-radius:4px;background:#F0F5FE;font-size:10px;color:#2B6DEF;font-weight:500;}
.rcard-route{font-size:10px;color:#3F4652;line-height:1.5;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;word-break:break-all;}
.rcard-route.standby{font-family:inherit;font-size:11px;font-weight:600;color:#B45309;}
.rcard-note{font-size:10px;color:#B45309;background:#FEF3E2;border-radius:4px;padding:2px 6px;}
.rcard-seats{display:flex;flex-wrap:wrap;gap:4px;min-height:22px;align-items:center;}
.rcard.has-driver .rcard-seats{background:#F0F5FE;border:1px dashed #C7D7F5;border-radius:6px;padding:3px;min-height:36px;}
.rcard-hint{font-size:10px;color:#C3C9D4;}
.dchip{display:inline-flex;flex-direction:column;justify-content:center;min-height:30px;padding:2px 8px;border-radius:8px;background:#F0F5FE;border:1px solid #C7D7F5;color:#1E3A8A;cursor:grab;user-select:none;max-width:100%;}
.dchip-n{font-size:11px;font-weight:600;line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.dchip-r{font-size:9px;line-height:1.25;color:#2B6DEF;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.dchip:active{cursor:grabbing;}
.dchip.dragging{opacity:.5;}
.dchip.unassigned{background:#F7F8FA;border-color:#E3E7EF;color:#6B7280;}
.dchip.unassigned .dchip-r{color:#9AA3B2;}
.dchip:hover{border-color:#2B6DEF;}
.note-amber{display:flex;align-items:center;gap:8px;background:var(--amber-tint);border-radius:8px;
  padding:0 12px;min-height:44px;font-size:12px;color:var(--amber-text);}
.pv-btns{display:flex;gap:12px;justify-content:flex-end;height:44px;}
.btn-ghost{width:96px;height:44px;background:#fff;border:1px solid var(--screen-border);border-radius:10px;
  font-size:14px;color:var(--text-2);display:flex;align-items:center;justify-content:center;}
.btn-ghost:hover{background:var(--fill);}
.btn-solid{height:44px;background:var(--primary);color:#fff;border-radius:10px;padding:0 24px;
  font-size:14px;font-weight:600;display:flex;align-items:center;justify-content:center;}
.btn-solid:hover{background:#1F5BD0;}
.btn-danger{flex:1;height:44px;background:#DC2626;color:#fff;border-radius:10px;font-size:14px;font-weight:600;display:flex;align-items:center;justify-content:center;}
.btn-danger:hover{background:#B91C1C;}
/* 通用确认弹窗的主按钮：文案与色调由调用方决定（同意=主色，删除/撤回=危险色） */
.confirm-ok{flex:1;height:44px;border-radius:10px;font-size:14px;font-weight:600;color:#fff;
  background:var(--primary);display:flex;align-items:center;justify-content:center;transition:background .15s;}
.confirm-ok:hover{background:#1F5BD0;}
.confirm-ok.danger{background:#DC2626;}
/* 确认弹窗里的「删除 / 保留」清单 */
.confirm-list{display:flex;flex-direction:column;gap:6px;}
.confirm-list .ci{display:flex;gap:8px;font-size:12px;line-height:1.6;align-items:flex-start;}
.confirm-list .ci-k{flex:none;height:18px;padding:0 6px;border-radius:4px;font-size:10px;font-weight:500;
  display:inline-flex;align-items:center;margin-top:1px;}
.confirm-list .ci.del .ci-k{background:#FDECEC;color:#B42318;}
.confirm-list .ci.keep .ci-k{background:#F1F3F7;color:#6B7280;}
.confirm-list .ci-v{color:var(--text-2);}
/* 补录生效范围弹窗 */
.imp-range-grid{display:flex;gap:12px;}
.imp-range-grid label{flex:1;display:flex;flex-direction:column;gap:6px;font-size:13px;color:#3F4652;}
.imp-range-grid input{height:36px;border:1px solid #E3E7EF;border-radius:8px;padding:0 10px;font-size:13px;
  outline:none;color:var(--text);font-family:inherit;}
.imp-range-grid input:focus{border-color:var(--primary);}
.imp-range-tip{font-size:11px;color:var(--text-4);line-height:1.7;background:var(--fill);border-radius:8px;padding:8px 10px;}
/* 批次导入明细 */
.bd-head,.bd-row{display:flex;align-items:center;gap:10px;padding:0 12px;font-size:12px;}
.bd-head{height:32px;background:var(--fill);color:var(--text-4);font-size:11px;border-radius:8px 8px 0 0;}
.bd-list{max-height:300px;overflow-y:auto;border:1px solid var(--line);border-top:none;border-radius:0 0 8px 8px;}
.bd-row{min-height:38px;border-bottom:1px solid var(--line);}
.bd-row:last-child{border-bottom:none;}
.bd-row.bad{background:#FFFBFA;flex-wrap:wrap;padding-top:8px;padding-bottom:8px;row-gap:4px;}
.bd-row.bad .bd-reason{flex-basis:100%;white-space:normal;line-height:1.6;color:#B45309;}
.bd-name{flex:1;min-width:104px;font-weight:500;color:var(--text);display:flex;align-items:center;gap:5px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.bd-name i{font-style:normal;font-size:11px;color:var(--text-5);font-family:ui-monospace,Consolas,monospace;}
.bd-team{width:78px;flex:none;color:var(--text-4);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.bd-day{width:46px;flex:none;color:var(--text-3);font-variant-numeric:tabular-nums;}
.bd-shift{width:40px;flex:none;color:var(--text-2);}
.bd-route{width:52px;flex:none;font-family:ui-monospace,Consolas,monospace;color:var(--text-2);}
.bd-time{width:104px;flex:none;color:var(--text-3);font-variant-numeric:tabular-nums;}
.bd-state{width:66px;flex:none;}
.bd-reason{flex:1;min-width:0;color:#B45309;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.bd-reason::before{content:'原因：';}

/* 导入记录分页 */
/* 列表主体固定 5 行高度（5×52）：末页条数少也不塌陷，翻页时卡片高度不变 */
#importRows{min-height:260px;}
.imp-pager{display:inline-flex;align-items:center;gap:4px;}
.imp-pager .imp-pg:first-child,.imp-pager .imp-pg:last-child{font-size:13px;}
.imp-pg{min-width:22px;height:22px;padding:0 6px;border:1px solid var(--screen-border);border-radius:6px;
  display:inline-flex;align-items:center;justify-content:center;cursor:pointer;color:var(--text-2);
  background:#fff;font-size:12px;line-height:1;}
.imp-pg:hover{border-color:var(--primary);color:var(--primary);}
.imp-pg.active{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600;cursor:default;}
.imp-pg.active:hover{color:#fff;}
.imp-pg.dis{color:#C3C9D4;border-color:var(--line);cursor:not-allowed;background:#fff;}
.imp-pg.dis:hover{border-color:var(--line);color:#C3C9D4;}
.imp-pg-gap{color:var(--text-5);padding:0 1px;}
.imp-jump{display:inline-flex;align-items:center;gap:4px;margin-left:10px;font-size:11px;color:var(--text-4);}
.imp-jump input{width:42px;height:22px;border:1px solid var(--screen-border);border-radius:6px;
  text-align:center;font-size:12px;color:var(--text);outline:none;font-family:inherit;}
.imp-jump input:focus{border-color:var(--primary);}

/* 导入记录的推送回执 */
.imp-push-cell{display:flex;flex-direction:column;gap:4px;}
/* 司机池 = 吸顶托盘：只装「未安排」的人，安排后立即从托盘消失。
   托盘固定一行高（横向滚动），不再像之前那样铺成 2~3 行大块占地方。 */
.pool-hd{display:flex;align-items:center;gap:10px;padding:8px 16px;flex-wrap:wrap;}
.pool-grip{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;
  border-radius:6px;background:var(--fill);flex:none;}
.pool-lb{font-size:13px;font-weight:600;flex:none;}
.pool-n{font-size:11px;color:var(--text-4);font-variant-numeric:tabular-nums;flex:none;}
.pool-tip{font-size:11px;color:var(--text-5);}
.pool-all{display:inline-flex;align-items:center;gap:5px;font-size:11px;color:var(--text-3);
  cursor:pointer;user-select:none;white-space:nowrap;}
.pool-all input{accent-color:var(--primary);margin:0;}
.pool-tray{display:flex;align-items:center;gap:6px;padding:0 16px 10px;overflow-x:auto;
  min-height:34px;overscroll-behavior-x:contain;}
.pool-tray::-webkit-scrollbar{height:6px;}
.pool-tray::-webkit-scrollbar-thumb{background:#D8DEE9;border-radius:3px;}
.pool-tray .dchip{flex:none;}
.pool-blank{padding:5px 2px;font-size:12px;color:var(--text-5);}
.pool-blank.ok{color:#15803D;font-weight:500;}
/* 司机池：吸顶常驻条。拖人时无论滚到页面哪里都能直接抓取 */
.board-card{overflow:visible;}
.pool-bar{position:sticky;top:0;z-index:6;background:#fff;border-bottom:1px solid #EEF1F6;
  box-shadow:0 6px 12px -8px rgba(23,24,28,.18);}
/* 拖拽/点选落位的视觉反馈 */
.dchip.sel{outline:2px solid var(--primary);outline-offset:2px;background:#F0F5FE;}
#routeGrid.picking .rcard{border-style:dashed;border-color:#B9CFF5;}
#routeGrid.picking .rcard:hover{border-color:var(--primary);background:#F7FAFF;}
.rcard.landed{animation:landPop .22s ease-out;}
@keyframes landPop{from{transform:scale(.985);}to{transform:scale(1);}}
.imp-mini-bar{height:4px;border-radius:2px;background:#E3E7EF;overflow:hidden;}
.imp-mini-bar i{display:block;height:100%;border-radius:2px;}
.rc-sum{display:flex;gap:18px;font-size:12px;color:var(--text-4);}
.rc-sum b{font-weight:600;}
.rc-tabs{display:flex;gap:6px;}
.rc-tab{height:28px;padding:0 11px;border-radius:14px;background:#fff;border:1px solid var(--screen-border);
  font-size:12px;color:var(--text-2);cursor:pointer;display:inline-flex;align-items:center;gap:4px;}
.rc-tab:hover{background:var(--fill);}
.rc-tab.active{background:var(--primary);border-color:var(--primary);color:#fff;}
.rc-tab .num{font-size:11px;opacity:.8;}
.rc-list{max-height:262px;overflow-y:auto;overscroll-behavior:contain;border:1px solid var(--line);border-radius:10px;}
.rc-row{display:flex;align-items:center;gap:12px;height:40px;padding:0 12px;border-bottom:1px solid var(--line);font-size:12px;}
.rc-row:last-child{border-bottom:none;}
.rc-name{width:120px;flex:none;font-weight:500;color:var(--text);display:flex;align-items:center;gap:6px;}
.rc-name i{font-style:normal;font-size:11px;color:var(--text-5);font-family:ui-monospace,Consolas,monospace;}
.rc-team{flex:1;min-width:0;color:var(--text-4);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rc-state{width:56px;flex:none;}
.rc-at{width:118px;flex:none;text-align:right;color:var(--text-5);font-size:11px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

/* 公告详情 */
.an-d-hd{display:flex;align-items:flex-start;gap:12px;justify-content:space-between;}
.an-d-title{font-size:16px;font-weight:600;line-height:1.5;min-width:0;}
.an-d-meta{display:flex;flex-wrap:wrap;gap:6px 18px;font-size:12px;color:var(--text-4);}
.an-d-meta b{font-weight:500;color:var(--text-2);}
.an-d-body{background:var(--fill);border-radius:10px;padding:12px 14px;font-size:13px;line-height:1.9;
  color:var(--text-2);white-space:pre-wrap;max-height:300px;overflow:auto;}
.an-d-body.empty{color:var(--text-5);}
.an-read-row{display:flex;flex-direction:column;gap:7px;}
.an-read-lb{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--text-4);}
.an-read-lb b{color:var(--text-2);font-weight:600;}
.an-read-bar{height:6px;border-radius:3px;background:#E3E7EF;overflow:hidden;}
.an-read-bar i{display:block;height:100%;background:var(--primary);border-radius:3px;transition:width .2s;}
.an-read-sub{font-size:11px;color:var(--text-5);}

/* 文件保留策略表 */
.ret-table{border:1px solid var(--line);border-radius:10px;overflow:hidden;}
.ret-table .rt-hd,.ret-table .rt-row{display:flex;gap:12px;padding:9px 12px;font-size:12px;align-items:flex-start;}
.ret-table .rt-hd{background:var(--fill);color:var(--text-4);font-size:11px;font-weight:500;border-bottom:1px solid var(--line);}
.ret-table .rt-row{border-bottom:1px solid var(--line);}
.ret-table .rt-row:last-child{border-bottom:none;}
.ret-table .rt-hd span:nth-child(1),.ret-table .rt-row span:nth-child(1){width:130px;flex:none;color:var(--text-2);font-weight:500;}
.ret-table .rt-hd span:nth-child(2),.ret-table .rt-row span:nth-child(2){width:150px;flex:none;}
.ret-table .rt-hd span:nth-child(3),.ret-table .rt-row span:nth-child(3){flex:1;min-width:0;color:var(--text-4);line-height:1.6;}
.confirm-ok.danger:hover{background:#B91C1C;}

/* ===== 权限页 ===== */
/* ===== 权限管理 Tab ===== */
.perm-tabs{display:grid;grid-template-columns:repeat(2,minmax(0,180px));align-items:center;gap:8px;margin-bottom:16px;}
.perm-tab{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:40px;min-width:0;padding:0 12px;border-radius:8px;font-family:inherit;box-sizing:border-box;
  font-size:13px;color:var(--text-2);background:#fff;border:1px solid var(--screen-border);cursor:pointer;}
.perm-tab:hover{background:var(--fill);}
.perm-tab.active{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:500;}
.perm-tab .n{font-size:11px;opacity:.8;font-weight:400;}
/* ===== 组织架构编辑器（任意深度）===== */
.oe-toolbar{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap;}
.oe-cols{display:grid;grid-template-columns:minmax(300px,2fr) minmax(0,3fr);gap:16px;align-items:start;}
.oe-tree{min-width:0;background:#fff;border:1px solid var(--line);border-radius:8px;overflow:hidden;}
.oe-cols > #livePager-org_logs{grid-column:2;min-width:0;padding-top:0;}
.oe-tree-hd{display:flex;align-items:center;gap:8px;padding:11px 14px;border-bottom:1px solid var(--line);
  font-size:13px;font-weight:600;}
.oe-tree-hd span:last-child{margin-left:auto;font-size:11px;color:var(--text-5);font-weight:400;}
#oeTree{max-height:520px;overflow-y:auto;padding:6px 6px 10px;}
.oe-node{display:flex;align-items:center;gap:6px;height:44px;border-radius:6px;padding:0 6px;
  cursor:pointer;border:1px solid transparent;}
.oe-node:hover{background:var(--fill);}
.oe-node.sel{background:var(--primary-tint);border-color:#C7D7F5;}
.oe-node.drop-in{background:#F0F5FE;border-color:var(--primary);}
.oe-node.ins-top{box-shadow:inset 0 2px 0 var(--primary);}
.oe-node.ins-bot{box-shadow:inset 0 -2px 0 var(--primary);}
.oe-node.dragging{opacity:.45;}
.oe-twist{width:14px;flex:none;text-align:center;color:var(--text-4);font-size:9px;line-height:1;}
.oe-node .oe-twist,.oe-twist-placeholder{width:26px;height:26px;flex:none;}
.oe-node .oe-twist{display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--primary-border);
  border-radius:4px;background:var(--primary-tint);color:#235EC5;font-size:18px;line-height:1;}
.oe-node .oe-twist:hover{background:var(--primary-soft);border-color:var(--primary);}
.oe-node .oe-twist:focus-visible{outline:2px solid var(--primary);outline-offset:2px;}
.oe-kind{flex:none;height:18px;padding:0 6px;border-radius:4px;font-size:10px;font-weight:500;
  display:inline-flex;align-items:center;background:#F1F3F7;color:#5B6472;}
.oe-kind.k1{background:#F0F5FE;color:#1E3A8A;}
.oe-kind.k3{background:#FEF3E2;color:#B45309;}
.oe-kind.k4{background:#E9F7EF;color:#15803D;}
.oe-name{min-width:0;font-size:13px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.oe-meta{margin-left:auto;flex:none;font-size:11px;color:var(--text-4);font-variant-numeric:tabular-nums;}
.oe-acts{margin-left:auto;display:none;align-items:center;gap:2px;flex:none;}
.oe-node:hover .oe-acts{display:inline-flex;}
.oe-node:hover .oe-meta{display:none;}
.oe-act{width:24px;height:24px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;
  color:var(--text-4);cursor:pointer;}
.oe-act:hover{background:#fff;color:var(--primary);box-shadow:0 1px 4px rgba(23,24,28,.14);}
.oe-act.danger:hover{color:#DC2626;}
.oe-off .oe-name{color:var(--text-5);text-decoration:line-through;}
.oe-blank{padding:28px 12px;text-align:center;font-size:12px;color:var(--text-5);line-height:1.9;}
/* 详情面板 */
.oe-detail{container-type:inline-size;min-width:0;background:#fff;border:1px solid var(--line);border-radius:8px;padding:18px 20px;}
.oe-dt-hd{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.oe-dt-path{font-size:11px;color:var(--text-5);margin:2px 0 16px;overflow-wrap:anywhere;}
.oe-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 18px;}
.oe-field{display:flex;align-items:center;gap:10px;min-width:0;}
.oe-field.full{grid-column:1 / -1;}
.oe-field label{width:52px;flex:none;font-size:12px;color:var(--text-4);}
.oe-input{flex:1;width:100%;min-width:0;height:34px;border:1px solid var(--screen-border);border-radius:6px;
  padding:0 10px;font-size:13px;outline:none;background:#fff;color:var(--text);font-family:inherit;}
.oe-input:focus{border-color:var(--primary);}
.oe-input[readonly]{background:var(--fill);color:var(--text-4);}
.oe-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin:16px 0 2px;}
.oe-stat{min-width:0;border:1px solid var(--line);border-radius:6px;padding:10px 12px;}
.oe-stat b{display:block;font-size:20px;font-weight:700;line-height:1.2;font-variant-numeric:tabular-nums;}
.oe-stat span{font-size:11px;color:var(--text-5);}
.oe-mem{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px;}
.oe-mem-chip{display:inline-flex;align-items:center;gap:5px;height:24px;padding:0 8px;border-radius:6px;
  background:#F7F8FA;border:1px solid #EEF1F6;font-size:11px;color:var(--text-2);}
.oe-mem-chip i{font-style:normal;color:var(--text-5);font-size:10px;}
.oe-btns{display:flex;gap:8px;margin-top:16px;padding-top:14px;border-top:1px solid var(--line);flex-wrap:wrap;}
.oe-log{margin-top:16px;border-top:1px solid var(--line);padding-top:12px;}
.oe-log-t{font-size:12px;font-weight:600;margin-bottom:4px;}
.oe-log-row{display:flex;gap:8px;font-size:11px;color:var(--text-4);padding:3px 0;line-height:1.6;}
.oe-log-row span{min-width:0;overflow-wrap:anywhere;}
.oe-log-row span:last-child{flex:1;}
.oe-log-row b{flex:none;color:var(--text-3);font-weight:500;}
@container (max-width:460px){
  .oe-grid{grid-template-columns:minmax(0,1fr);}
  .oe-stats{grid-template-columns:repeat(2,minmax(0,1fr));}
}
/* 归档区 */
.oe-arc{margin-top:16px;background:#fff;border:1px solid var(--line);border-radius:12px;overflow:hidden;}
.oe-arc-hd{display:flex;align-items:center;gap:10px;padding:11px 14px;cursor:pointer;font-size:13px;font-weight:600;}
.oe-arc-hd:hover{background:var(--fill);}
.oe-arc-n{font-size:11px;color:var(--text-4);font-weight:400;}
.oe-arc-tip{font-size:11px;color:var(--text-5);font-weight:400;}
.oe-arc-row{display:flex;align-items:center;gap:10px;padding:10px 14px;border-top:1px solid var(--line);font-size:12px;}
.oe-arc-row .p{color:var(--text-2);font-weight:500;}
.oe-arc-row .m{color:var(--text-5);font-size:11px;}
.oe-arc-row .bt{margin-left:auto;display:flex;gap:12px;}
/* 删除弹窗 */
.oe-del-k{display:flex;gap:10px;padding:8px 0;border-bottom:1px dashed var(--line);font-size:13px;line-height:1.6;}
.oe-del-k:last-of-type{border-bottom:none;}
.oe-del-k .lb{width:76px;flex:none;color:var(--text-4);font-size:12px;}
.oe-del-k b{font-weight:600;}
.oe-warn{display:flex;gap:8px;background:#FEF3E2;border-radius:8px;padding:10px 12px;
  font-size:12px;color:#B45309;line-height:1.7;}
.perm-cols{display:grid;grid-template-columns:minmax(300px,2fr) minmax(0,3fr);gap:16px;align-items:start;}
.org-card{width:360px;background:#fff;border:1px solid var(--line);border-radius:12px;
  padding:16px;display:flex;flex-direction:column;gap:6px;max-height:560px;}
#permOrgTree{flex:1;min-height:0;overflow-y:auto;padding-right:2px;}
.org-title{font-size:14px;font-weight:600;margin-bottom:4px;flex:none;}
.org-note{padding-top:12px;border-top:1px solid var(--line);
  font-size:11px;color:var(--text-5);line-height:1.7;flex:none;}
.org-row{display:flex;align-items:center;gap:8px;height:36px;font-size:14px;font-weight:600;}
.org-row.lv2{height:36px;font-size:13px;font-weight:500;padding-left:20px;}
.org-row.lv3{height:40px;font-size:13px;font-weight:400;color:var(--text-2);padding-left:40px;cursor:default;}
.org-row.lv2.on{background:#F0F5FE;color:#2B6DEF;border-radius:8px;padding-left:12px;font-weight:600;}
.org-meta{margin-left:auto;font-size:11px;color:var(--text-4);font-weight:400;}
.perm-table{width:780px;background:#fff;border:1px solid var(--line);border-radius:12px;overflow:hidden;}
.perm-note{display:flex;align-items:center;gap:8px;min-height:64px;padding:0 16px;
  border-top:1px solid var(--line);font-size:11px;color:var(--text-4);}
.td-perm{flex:1;font-size:13px;color:var(--text-2);}
.td-perm.direct{color:var(--primary);}
.td-granter{width:110px;font-size:13px;color:var(--text-4);}
.td-op{width:80px;font-size:13px;font-weight:500;color:var(--primary);text-align:right;cursor:pointer;}
.td-op:hover{text-decoration:underline;}

/* ===== 推送页 ===== */
.push-tabs{display:flex;gap:10px;margin-bottom:16px;}
.ptab{display:flex;align-items:center;gap:4px;height:32px;border-radius:16px;padding:0 12px;
  font-size:13px;color:var(--text-2);background:#fff;border:1px solid var(--screen-border);cursor:pointer;}
.ptab:hover{background:var(--fill);}
.ptab.active{background:var(--primary);color:#fff;border-color:var(--primary);font-weight:500;}
.ptab .red{color:var(--red);font-weight:500;}
.ptab.active .red{color:#fff;}
.td-type{width:130px;font-size:13px;font-weight:500;color:var(--text-2);}
.td-driver{width:130px;font-size:13px;}
.td-shift{width:150px;font-size:13px;color:var(--text-2);}
.td-plan{width:170px;font-size:13px;color:var(--text-2);}
.td-status{width:110px;font-size:13px;font-weight:500;}
.td-status.ok{color:var(--green);}
.td-status.sent{color:var(--primary);}
.td-status.wait{color:var(--text-4);}
.td-status.fail{color:var(--red);}
.td-receipt{flex:1;font-size:12px;color:var(--text-4);}
.td-push-act{width:100px;font-size:13px;font-weight:500;color:var(--primary);text-align:right;cursor:pointer;}
.td-push-act:hover{text-decoration:underline;}
.td-push-act.muted{color:var(--text-4);font-weight:400;cursor:default;}
.td-push-act.muted:hover{text-decoration:none;}
.push-action-group{width:100px;flex-shrink:0;display:flex;justify-content:flex-end;align-items:center;gap:8px;}
.push-action-group .td-push-act{width:auto;}

/* ===== 占位页 ===== */
.placeholder{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;}
.ph-icon{width:64px;height:64px;background:#fff;border:1px solid var(--line);border-radius:16px;
  display:flex;align-items:center;justify-content:center;}
.ph-title{font-size:16px;font-weight:600;color:var(--text-3);}
.ph-sub{font-size:13px;color:var(--text-5);}

/* ===== 激活码弹层 ===== */
.modal-mask{position:absolute;inset:0;background:rgba(23,24,28,.4);display:none;
  align-items:center;justify-content:center;z-index:50;}
.modal-mask.active{display:flex;}
.modal-card{width:420px;max-height:calc(100% - 56px);overflow:auto;overscroll-behavior:contain;background:#fff;
  border-radius:16px;padding:28px;display:flex;flex-direction:column;gap:16px;
  box-shadow:0 12px 40px rgba(23,24,28,.2);}
.modal-title{font-size:16px;font-weight:600;}
.code-box{height:64px;background:var(--primary-tint);border-radius:10px;display:flex;
  align-items:center;justify-content:center;font-size:30px;font-weight:700;color:var(--primary);
  letter-spacing:2px;}
.code-meta{font-size:12px;color:var(--text-4);text-align:center;}
.code-note{font-size:11px;color:var(--text-5);line-height:1.6;}

/* ===== Toast ===== */
/* ===== 状态徽标（绑定、发布、草稿等），统一 20px 高、5px 圆角 ===== */
.bdg{display:inline-flex;align-items:center;height:20px;padding:0 7px;border-radius:5px;
  font-size:11px;font-weight:500;white-space:nowrap;line-height:1;}
.bdg.ok{background:#E9F7EF;color:#15803D;}
.bdg.warn{background:#FEF3E2;color:#B45309;}
.bdg.info{background:#F0F5FE;color:#1E3A8A;}
.bdg.mute{background:#F1F3F7;color:#6B7280;}
.bdg.bad{background:#FDECEC;color:#B42318;}
.mono{font-family:ui-monospace,Consolas,"SFMono-Regular",monospace;font-size:12px;letter-spacing:.02em;}
.mono.mute{color:var(--text-5);}
.sub{margin-left:6px;font-size:11px;color:var(--text-5);}
/* 公告「下发范围」：范围单行省略 + 渠道徽标，避免结尾「微」被挤到第二行 */
.an-scope{width:200px;display:flex;align-items:center;gap:6px;min-width:0;}
.an-scope i{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-style:normal;font-size:12px;color:#3F4652;}
.an-scope .ch{flex:none;height:18px;padding:0 6px;border-radius:4px;font-size:10px;font-style:normal;
  font-weight:500;display:inline-flex;align-items:center;}
.an-scope .ch.wx{background:#F0F5FE;color:#1E3A8A;}
.an-scope .ch.mini{background:#F1F3F7;color:#6B7280;}
/* 时刻表 / 交路表状态：状态徽标 + 灰色附注 */
.st-meta{font-size:11px;color:var(--text-5);white-space:nowrap;}

/* ===== 单独推送：工业实用向（发丝边框 / 等宽编号 / 密信息行 / 微信外观预览卡） ===== */
.solo-mask.active{animation:soloMaskIn .18s ease-out both;}
.solo-card{width:760px;padding:0;gap:0;overflow:hidden;animation:soloIn .34s cubic-bezier(.16,1,.3,1) both;}
.solo-anim{animation:soloIn .34s cubic-bezier(.16,1,.3,1) both;}
@keyframes soloMaskIn{from{opacity:0;}to{opacity:1;}}
@keyframes soloIn{from{opacity:0;transform:translateY(14px) scale(.985);}to{opacity:1;transform:none;}}
.solo-hd{display:flex;align-items:flex-start;gap:12px;padding:18px 24px 14px;border-bottom:1px solid var(--line);}
.solo-title{font-size:16px;font-weight:600;letter-spacing:-.01em;}
.solo-sub{font-size:11px;color:var(--text-5);margin-top:5px;line-height:1.7;}
.solo-x{width:28px;height:28px;border-radius:8px;display:flex;align-items:center;justify-content:center;color:var(--text-4);}
.solo-x:hover{background:var(--fill);color:var(--text);}
.solo-body{display:grid;grid-template-columns:1fr 1fr;align-items:stretch;height:424px;overflow:hidden;}
.solo-col{padding:14px 20px 16px;display:flex;flex-direction:column;gap:9px;overflow:hidden;}
.solo-col.r{border-left:1px solid var(--line);background:linear-gradient(180deg,#FFFFFF 0%,#FAFBFE 100%);}
.solo-step{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;color:var(--text-2);}
.solo-step i{width:18px;height:18px;border-radius:5px;background:var(--navy);color:#fff;font-style:normal;
  font-size:11px;font-weight:600;display:flex;align-items:center;justify-content:center;}
.solo-meta{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--text-5);}
.solo-check{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text-2);cursor:pointer;}
.solo-check input{accent-color:var(--primary);}
.solo-list-wrap{position:relative;flex:1;min-height:0;display:flex;}
.solo-list{border:1px solid var(--screen-border);border-radius:10px;background:#fff;
  flex:1;overflow-y:auto;}
/* 底部渐隐：提示列表可继续滚动，同时避免半行显得像被截断 */
.solo-list-wrap::after{content:'';position:absolute;left:1px;right:1px;bottom:1px;height:22px;pointer-events:none;
  background:linear-gradient(to top,#fff 10%,rgba(255,255,255,0));border-radius:0 0 10px 10px;}
.solo-row{display:flex;align-items:center;gap:9px;height:44px;padding:0 12px;border-bottom:1px solid var(--line);
  cursor:pointer;transition:background .12s;}
.solo-row:last-child{border-bottom:none;}
.solo-row:hover{background:var(--fill);}
.solo-row.on{background:var(--primary-tint);box-shadow:inset 2px 0 0 var(--primary);}
.solo-cb{width:16px;height:16px;flex:none;border:1.5px solid #C8D0DE;border-radius:4px;background:#fff;
  display:flex;align-items:center;justify-content:center;}
.solo-row.on .solo-cb{background:var(--primary);border-color:var(--primary);}
.solo-cb svg{opacity:0;}
.solo-row.on .solo-cb svg{opacity:1;}
.solo-nm{font-size:13px;font-weight:500;color:var(--text);}
.solo-no{font-family:ui-monospace,Consolas,"SFMono-Regular",monospace;font-size:11px;color:var(--text-4);}
.solo-path{margin-left:auto;font-size:11px;color:var(--text-5);white-space:nowrap;}
.solo-empty{padding:44px 0;text-align:center;font-size:12px;color:var(--text-5);line-height:2;}
/* 正文输入区撑满右栏：左列表与右内容自然等高 */
.solo-ta{flex:1;min-height:76px;resize:none;}
.solo-chips{display:flex;flex-wrap:wrap;gap:6px;align-items:center;}
.solo-chip{height:26px;padding:0 10px;border-radius:13px;border:1px solid var(--screen-border);background:#fff;
  font-size:12px;color:var(--text-2);transition:border-color .15s,color .15s,background .15s;}
.solo-chip:hover{border-color:var(--primary-border);color:var(--primary);}
.solo-chip.on{background:var(--navy-tint);border-color:var(--primary-border);color:var(--navy);font-weight:500;}
.solo-prev{border:1px solid var(--primary-border);border-radius:12px;overflow:hidden;background:#fff;
  box-shadow:0 10px 28px rgba(43,109,239,.10);}
.solo-prev-hd{display:flex;align-items:center;gap:8px;height:34px;padding:0 12px;
  background:var(--primary-tint);border-bottom:1px solid var(--primary-border);}
.solo-prev-hd b{font-size:11px;font-weight:600;color:var(--navy);}
.solo-prev-hd em{margin-left:auto;font-style:normal;font-size:10px;color:var(--text-4);
  font-family:ui-monospace,Consolas,monospace;}
.solo-prev-bd{padding:12px;font-size:12px;line-height:1.8;color:var(--text-2);white-space:pre-wrap;min-height:74px;
  max-height:132px;overflow-y:auto;}
.solo-prev-bd .ph{color:var(--text-5);}
.solo-prev-ft{display:flex;align-items:center;gap:8px;padding:8px 12px;border-top:1px dashed var(--screen-border);
  font-size:10px;color:var(--text-5);}
.solo-prev-to{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-family:ui-monospace,Consolas,monospace;color:var(--text-3);}
#soloPrevWay{color:var(--text-4);white-space:nowrap;}
.solo-ft{display:flex;align-items:center;gap:12px;padding:14px 24px;border-top:1px solid var(--line);background:var(--fill);}
.solo-count{font-size:12px;color:var(--text-2);}
.solo-count b{font-family:ui-monospace,Consolas,monospace;color:var(--primary);font-weight:600;}
.btn-solid[disabled]{background:#B9CBE8;cursor:not-allowed;}
.btn-solid[disabled]:hover{background:#B9CBE8;}
.solo-card input:focus-visible,.solo-card textarea:focus-visible,.solo-card button:focus-visible{
  outline:2px solid var(--primary);outline-offset:2px;}
@media (prefers-reduced-motion: reduce){
  .solo-card,.solo-anim,.solo-mask.active{animation:none!important;}
}

/* ===== Toast ===== */
#toast{position:absolute;left:50%;bottom:48px;transform:translateX(-50%) translateY(20px);
  background:rgba(23,24,28,.88);color:#fff;font-size:13px;padding:10px 20px;border-radius:10px;
  opacity:0;pointer-events:none;transition:opacity .25s,transform .25s;z-index:99;white-space:nowrap;}
#toast.show{opacity:1;transform:translateX(-50%) translateY(0);}
