/* ============ 注塑智能排产系统 ============ */
:root{
  --primary:#2563eb; --primary-600:#1d4ed8; --primary-50:#eff6ff; --primary-100:#dbeafe;
  --bg:#eef2f7; --card:#ffffff; --border:#e2e8f0; --border-2:#cbd5e1;
  --text:#16233b; --text-2:#51617d; --text-3:#94a3b8;
  --sidebar:#0c1729; --sidebar-hover:#16263f; --sidebar-active:#1d3a63;
  --green:#16a34a; --green-bg:#dcfce7;
  --orange:#d97706; --orange-bg:#fef3c7;
  --red:#dc2626; --red-bg:#fee2e2;
  --blue:#2563eb; --blue-bg:#dbeafe;
  --cyan:#0891b2; --cyan-bg:#cffafe;
  --violet:#7c3aed; --violet-bg:#ede9fe;
  --gray-bg:#e2e8f0;
  --radius:10px; --shadow:0 1px 3px rgba(15,23,42,.07);
}
*{margin:0;padding:0;box-sizing:border-box}
html,body{height:100%}
body{font-family:-apple-system,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;background:var(--bg);color:var(--text);font-size:14px;-webkit-font-smoothing:antialiased}
::-webkit-scrollbar{width:9px;height:9px}
::-webkit-scrollbar-thumb{background:#c3ccd9;border-radius:6px}
::-webkit-scrollbar-thumb:hover{background:#a8b4c6}
::-webkit-scrollbar-track{background:transparent}

/* ---------- 布局 ---------- */
.app{display:flex;height:100vh;overflow:hidden}
.sidebar{width:216px;background:var(--sidebar);color:#cbd5e1;display:flex;flex-direction:column;flex-shrink:0}
.logo{display:flex;gap:10px;align-items:center;padding:16px 14px;border-bottom:1px solid rgba(255,255,255,.08)}
.logo-icon{width:38px;height:38px;border-radius:9px;background:linear-gradient(135deg,#2563eb,#06b6d4);display:flex;align-items:center;justify-content:center;flex-shrink:0}
.logo-text b{color:#fff;font-size:15px;display:block;letter-spacing:.5px}
.logo-text span{font-size:10px;color:#64748b;letter-spacing:.2px}
.nav{flex:1;padding:10px 10px;overflow-y:auto}
.nav-group{font-size:10.5px;color:#475569;padding:12px 12px 5px;letter-spacing:1px}
.nav-item{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:8px;cursor:pointer;color:#9fb0ca;font-size:13.5px;margin-bottom:2px;transition:background .15s,color .15s;user-select:none}
.nav-item:hover{background:var(--sidebar-hover);color:#e2e8f0}
.nav-item.active{background:var(--sidebar-active);color:#fff;font-weight:600}
.nav-item svg{width:17px;height:17px;flex-shrink:0;opacity:.9}
.nav-item .n-badge{margin-left:auto;background:var(--red);color:#fff;font-size:10.5px;border-radius:9px;padding:1px 6px;font-weight:600}
.sidebar-foot{padding:11px 14px;font-size:11px;color:#55657f;border-top:1px solid rgba(255,255,255,.08);line-height:1.7}
.nav-item .nav-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 折叠按钮（桌面端）—— 轻量一条，尺寸写死，避免任何情况下被放大 */
.sb-collapse{display:flex;align-items:center;justify-content:center;gap:7px;margin:2px 10px 8px;padding:7px 10px;border:none;border-radius:7px;background:transparent;color:#6b7c96;font-family:inherit;font-size:12px;line-height:1;cursor:pointer;transition:background .15s,color .15s;flex-shrink:0}
.sb-collapse:hover{background:var(--sidebar-hover);color:#dbe4f0}
.sb-collapse svg{display:block;width:15px;height:15px;max-width:15px;max-height:15px;flex-shrink:0;transition:transform .2s}
.sb-collapse span{white-space:nowrap}
/* 桌面端：侧边栏可折叠为图标栏，鼠标悬停弹出完整菜单（浮层，不挤压内容） */
@media(min-width:769px){
  .sidebar{transition:width .2s ease}
  .app.sb-collapsed .sidebar{position:fixed;top:0;bottom:0;left:0;z-index:120;width:64px;overflow:hidden;box-shadow:6px 0 22px rgba(2,8,23,.3)}
  .app.sb-collapsed .main{margin-left:64px}
  .app.sb-collapsed .logo{justify-content:center;padding:16px 0}
  .app.sb-collapsed .logo-text{display:none}
  .app.sb-collapsed .nav{padding:10px 0}
  .app.sb-collapsed .nav-group{font-size:0;padding:11px 0 5px}
  .app.sb-collapsed .nav-group::after{content:"";display:block;height:1px;background:rgba(255,255,255,.09);margin:0 16px}
  .app.sb-collapsed .nav-item{position:relative;justify-content:center;padding:10px 0;gap:0}
  .app.sb-collapsed .nav-label{display:none}
  .app.sb-collapsed .nav-item .n-badge{position:absolute;top:5px;right:15px;width:8px;height:8px;min-width:0;padding:0;font-size:0;border-radius:50%}
  .app.sb-collapsed .sb-collapse{justify-content:center;margin:4px 0 8px;padding:9px 0}
  .app.sb-collapsed .sb-collapse span{display:none}
  .app.sb-collapsed .sb-collapse svg{transform:rotate(180deg)}
  .app.sb-collapsed .sidebar-foot{display:none}
  /* 折叠态不显示滚动条（避免占掉 64px 栏宽），弹出时恢复 */
  .app.sb-collapsed .nav{scrollbar-width:none}
  .app.sb-collapsed .nav::-webkit-scrollbar{width:0;height:0}
  /* 悬停：弹出完整菜单（覆盖在内容上方） */
  .app.sb-collapsed .sidebar:hover{width:216px}
  .app.sb-collapsed .sidebar:hover .logo{justify-content:flex-start;padding:16px 14px}
  .app.sb-collapsed .sidebar:hover .logo-text{display:block}
  .app.sb-collapsed .sidebar:hover .nav{padding:10px}
  .app.sb-collapsed .sidebar:hover .nav-group{font-size:10.5px;padding:12px 12px 5px}
  .app.sb-collapsed .sidebar:hover .nav-group::after{display:none}
  .app.sb-collapsed .sidebar:hover .nav-item{justify-content:flex-start;padding:9px 12px;gap:10px}
  .app.sb-collapsed .sidebar:hover .nav-label{display:inline}
  .app.sb-collapsed .sidebar:hover .nav-item .n-badge{position:static;width:auto;height:auto;min-width:0;padding:1px 6px;font-size:10.5px;border-radius:9px}
  .app.sb-collapsed .sidebar:hover .sb-collapse{justify-content:flex-start;margin:4px 10px 8px;padding:9px 12px}
  .app.sb-collapsed .sidebar:hover .sb-collapse span{display:inline}
  .app.sb-collapsed .sidebar:hover .sb-collapse svg{transform:none}
  .app.sb-collapsed .sidebar:hover .sidebar-foot{display:block}
}
.main{flex:1;display:flex;flex-direction:column;min-width:0}
.topbar{height:54px;background:#fff;border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;padding:0 20px;flex-shrink:0;z-index:5}
.topbar h1{font-size:16.5px;font-weight:700}
.topbar-right{display:flex;align-items:center;gap:14px}
.clock{color:var(--text-2);font-size:12.5px;font-variant-numeric:tabular-nums}
.page{flex:1;overflow-y:auto;padding:18px 20px}

/* ---------- 通用组件 ---------- */
.btn{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--border-2);background:#fff;color:var(--text);border-radius:8px;padding:7px 14px;font-size:13px;cursor:pointer;transition:.15s;font-family:inherit;white-space:nowrap}
.btn:hover{border-color:var(--primary);color:var(--primary);background:var(--primary-50)}
.btn:active{transform:translateY(1px)}
.btn-primary{background:var(--primary);border-color:var(--primary);color:#fff}
.btn-primary:hover{background:var(--primary-600);border-color:var(--primary-600);color:#fff}
.btn-danger{color:var(--red);border-color:#fca5a5}
.btn-danger:hover{background:var(--red-bg);border-color:var(--red);color:var(--red)}
.btn-sm{padding:4px 10px;font-size:12px;border-radius:6px}
.btn-ghost{border-color:transparent;background:transparent}
.btn-ghost:hover{background:var(--gray-bg)}
.btn:disabled{opacity:.45;cursor:not-allowed}
.icon-btn{width:26px;height:26px;display:inline-flex;align-items:center;justify-content:center;border-radius:6px;border:none;background:transparent;cursor:pointer;color:var(--text-3)}
.icon-btn:hover{background:var(--blue-bg);color:var(--primary)}
.icon-btn.danger:hover{background:var(--red-bg);color:var(--red)}

.card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow)}
.card-head{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--border);gap:10px;flex-wrap:wrap}
.card-head h3{font-size:14.5px;font-weight:700}
.card-head .sub{font-size:12px;color:var(--text-3);font-weight:400;margin-top:2px}
.card-body{padding:16px}
.toolbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:14px}
.toolbar .spacer{flex:1}
.input,.select{border:1px solid var(--border-2);border-radius:8px;padding:7px 10px;font-size:13px;background:#fff;color:var(--text);outline:none;font-family:inherit;min-width:0}
.input:focus,.select:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-100)}
.search-box{position:relative}
.search-box svg{position:absolute;left:9px;top:50%;transform:translateY(-50%);color:var(--text-3)}
.search-box .input{padding-left:30px;width:220px}

/* 表格 */
.tbl-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
table.tbl{width:100%;border-collapse:collapse;font-size:13px}
/* 宽表：保持自然列宽，不挤压/不强制换行/不截断 —— 由外层 .tbl-wrap 横向滚动查看完整内容 */
.tbl-wrap>table.tbl{width:auto;min-width:100%}
.tbl-wrap>table.tbl td,.tbl-wrap>table.tbl th{white-space:nowrap}
.tbl th{text-align:left;padding:9px 12px;background:#f8fafc;color:var(--text-2);font-weight:600;font-size:12px;border-bottom:1px solid var(--border);white-space:nowrap;position:sticky;top:0}
.tbl td{padding:9px 12px;border-bottom:1px solid var(--border);vertical-align:middle}
.tbl tr:last-child td{border-bottom:none}
.tbl tbody tr:hover{background:#f8fafc}
.tbl.daily-detail th,.tbl.daily-detail td{height:26px;padding-top:0;padding-bottom:0;line-height:26px}
.tbl.sum-tbl th,.tbl.sum-tbl td{height:28px;padding-top:0;padding-bottom:0;line-height:28px}
.pg-vehicles{padding-top:0}
.pg-vehicles .qa-bar{margin-top:0}
.tbl .num{font-variant-numeric:tabular-nums}
.empty{padding:44px 20px;text-align:center;color:var(--text-3)}
.empty svg{width:42px;height:42px;margin-bottom:10px;opacity:.5}

/* 徽章 */
.badge{display:inline-flex;align-items:center;gap:5px;padding:2.5px 9px;border-radius:20px;font-size:11.5px;font-weight:600;white-space:nowrap}
.badge::before{content:'';width:6px;height:6px;border-radius:50%;background:currentColor}
.badge.b-green{background:var(--green-bg);color:#15803d}
.badge.b-blue{background:var(--blue-bg);color:#1d4ed8}
.badge.b-orange{background:var(--orange-bg);color:#b45309}
.badge.b-red{background:var(--red-bg);color:#b91c1c}
.badge.b-gray{background:var(--gray-bg);color:#475569}
.badge.b-cyan{background:var(--cyan-bg);color:#0e7490}
.badge.b-violet{background:var(--violet-bg);color:#6d28d9}
.tag{display:inline-block;padding:1.5px 8px;border-radius:5px;font-size:11px;font-weight:500;background:var(--gray-bg);color:var(--text-2)}
.due-soon{color:var(--orange);font-weight:600}
.due-late{color:var(--red);font-weight:700}

/* KPI */
.kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(215px,1fr));gap:14px;margin-bottom:16px}
.kpi{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:15px 17px;box-shadow:var(--shadow);display:flex;gap:13px;align-items:flex-start;min-width:0}
.kpi .k-icon{width:44px;height:44px;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.kpi .k-icon svg{width:22px;height:22px}
.kpi .k-main{min-width:0}
.kpi .k-val{font-size:24px;font-weight:800;line-height:1.1;font-variant-numeric:tabular-nums;white-space:normal;overflow-wrap:anywhere}
.kpi .k-val small{font-size:12px;font-weight:600;color:var(--text-3);margin-left:3px}
.kpi .k-label{font-size:12.5px;color:var(--text-2);margin-top:4px;font-weight:600}
.mini-stat{background:var(--gray-bg);border:1px solid var(--border);border-radius:10px;padding:10px 16px;min-width:96px;display:flex;flex-direction:column;align-items:center;gap:2px}
.mini-stat .ms-val{font-size:19px;font-weight:800;line-height:1.1;font-variant-numeric:tabular-nums}
.mini-stat .ms-lb{font-size:11.5px;color:var(--text-3);font-weight:600}
.kpi .k-sub{font-size:11px;color:var(--text-3);margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.k-blue{background:var(--blue-bg);color:var(--blue)} .k-green{background:var(--green-bg);color:var(--green)}
.k-orange{background:var(--orange-bg);color:var(--orange)} .k-red{background:var(--red-bg);color:var(--red)}
.k-cyan{background:var(--cyan-bg);color:var(--cyan)} .k-violet{background:var(--violet-bg);color:var(--violet)}

.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.grid-3-2{display:grid;grid-template-columns:3fr 2fr;gap:16px}
@media(max-width:1100px){.grid-2,.grid-3-2{grid-template-columns:1fr}}

/* 进度条 */
.prog{height:7px;background:var(--gray-bg);border-radius:5px;overflow:hidden;min-width:70px}
.prog>i{display:block;height:100%;background:linear-gradient(90deg,#2563eb,#0891b2);border-radius:5px;transition:width .3s}
.prog.p-done>i{background:var(--green)}
.prog-txt{font-size:11.5px;color:var(--text-2);margin-top:3px;font-variant-numeric:tabular-nums}

/* 机台小徽章（订单列表） */
.mc-chip{display:inline-block;font-size:10.5px;font-weight:600;padding:1px 7px;border-radius:10px;background:#eef2ff;color:#3730a3;border:1px solid #dbe3ff;margin:1px 3px 1px 0;white-space:nowrap;cursor:default}
.mc-chip.on{background:#dcfce7;color:#166534;border-color:#bbf7d0}
.mc-chip.on::after{content:"▶";font-size:8px;margin-left:3px;vertical-align:1px}
.mc-chip.link-chip{cursor:pointer;transition:.12s}
.mc-chip.link-chip:hover{background:#2563eb;color:#fff;border-color:#2563eb;box-shadow:0 2px 6px rgba(37,99,235,.35)}

/* ---------- 模态框 ---------- */
.modal-mask{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(10,18,34,.5);display:flex;align-items:flex-start;justify-content:center;z-index:1000;padding:40px 16px;overflow-y:auto;animation:fadeIn .15s}
.modal{background:#fff;border-radius:14px;width:560px;max-width:100%;box-shadow:0 20px 50px rgba(2,8,23,.35);animation:slideUp .2s ease-out}
.modal.modal-lg{width:860px}
.modal.modal-xl{width:1680px;max-width:96vw}
.modal-head{display:flex;align-items:center;justify-content:space-between;padding:15px 20px;border-bottom:1px solid var(--border)}
.modal-head h3{font-size:15.5px;font-weight:700}
.modal-close{border:none;background:transparent;cursor:pointer;color:var(--text-3);width:28px;height:28px;border-radius:6px;display:flex;align-items:center;justify-content:center}
.modal-close:hover{background:var(--gray-bg);color:var(--text)}
.modal-body{padding:20px;max-height:calc(100vh - 220px);overflow-y:auto}
.modal-foot{display:flex;justify-content:flex-end;gap:10px;padding:14px 20px;border-top:1px solid var(--border)}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
@keyframes slideUp{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:translateY(0)}}

/* 表单 */
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px 16px}
.form-grid .full{grid-column:1/-1}
.rp-row{margin-bottom:6px}
.rp-row .input{width:100%}
.amount-preview{background:var(--bg-2,#f4f6fb);border:1px solid var(--border-2);border-radius:8px;padding:10px 12px;font-size:14px;color:var(--text-2)}
.amount-preview b{color:var(--accent,#2563eb);font-size:16px}
input[type=file].input{padding:8px;cursor:pointer}
.field label{display:block;font-size:12.5px;font-weight:600;color:var(--text-2);margin-bottom:5px}
.field label .req{color:var(--red)}
.field .input,.field .select{width:100%}
.field textarea.input{resize:vertical;min-height:60px}
.field .hint{font-size:11.5px;color:var(--text-3);margin-top:4px;line-height:1.5}
.field .hint b{color:var(--cyan)}
.form-info{background:var(--cyan-bg);border:1px solid #a5f3fc;border-radius:8px;padding:10px 12px;font-size:12.5px;color:#155e75;line-height:1.7;margin-bottom:14px}
.form-warn{background:var(--orange-bg);border:1px solid #fde68a;border-radius:8px;padding:10px 12px;font-size:12.5px;color:#92400e;line-height:1.7}

/* ---------- Toast ---------- */
#toastRoot{position:fixed;top:16px;right:16px;z-index:2000;display:flex;flex-direction:column;gap:8px}
.toast{display:flex;align-items:center;gap:9px;background:#fff;border:1px solid var(--border);border-left:4px solid var(--primary);border-radius:9px;padding:11px 16px;font-size:13px;box-shadow:0 8px 24px rgba(2,8,23,.16);animation:toastIn .25s ease-out;max-width:380px}
.toast.t-success{border-left-color:var(--green)} .toast.t-success .t-ic{color:var(--green)}
.toast.t-error{border-left-color:var(--red)} .toast.t-error .t-ic{color:var(--red)}
.toast.t-info{border-left-color:var(--cyan)} .toast.t-info .t-ic{color:var(--cyan)}
.toast.out{animation:toastOut .25s forwards}
@keyframes toastIn{from{opacity:0;transform:translateX(30px)}to{opacity:1;transform:translateX(0)}}
@keyframes toastOut{to{opacity:0;transform:translateX(30px)}}

/* tooltip */
.tooltip{position:fixed;z-index:1500;background:#0f1b2d;color:#e6edf7;border-radius:9px;padding:10px 13px;font-size:12px;line-height:1.8;pointer-events:none;display:none;box-shadow:0 10px 30px rgba(2,8,23,.35);max-width:300px}
.tooltip b{color:#fff}
.tooltip .tt-row{display:flex;justify-content:space-between;gap:16px}
.tooltip .tt-row span:first-child{color:#7d90ad}

/* ---------- 甘特图 ---------- */
.gantt-wrap{background:#fff;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;box-shadow:var(--shadow)}
.gantt-toolbar{display:flex;gap:8px;padding:10px 14px;border-bottom:1px solid var(--border);align-items:center;flex-wrap:wrap}
.gantt-toolbar .title{font-weight:700;font-size:13.5px;margin-right:4px}
.gantt-toolbar .sep{width:1px;height:18px;background:var(--border);margin:0 4px}
.gantt-scroll{overflow:auto;max-height:calc(100vh - 235px);min-height:420px;position:relative}
.gantt-scroll.g-expand{max-height:none}
.g-content{position:relative}
.gantt-grid{display:grid;grid-template-columns:130px 1fr;font-size:12px}
.g-head-corner{position:sticky;left:0;top:0;z-index:31;background:#f1f5f9;border-right:1px solid var(--border);border-bottom:2px solid var(--border-2);display:flex;align-items:center;padding:0 8px;font-size:12px;color:var(--text-2);font-weight:600;white-space:nowrap}
.g-head-days{position:sticky;top:0;z-index:30;display:flex;background:#f1f5f9;border-bottom:2px solid var(--border-2)}
.g-day{flex-shrink:0;border-right:1px dashed var(--border-2);padding:5px 0 4px;text-align:center;color:var(--text-3);font-size:10.5px;line-height:1.5;position:relative}
.g-day .d{font-size:14px;font-weight:700;color:var(--text);line-height:1.2}
.g-day.weekend{background:#fff7ed}
.g-day.today{background:var(--primary-50)}
.g-day.today .d{color:var(--primary)}
.g-row{display:contents}
.g-row-head{position:sticky;left:0;z-index:10;background:#fff;border-right:1px solid var(--border);border-bottom:1px solid var(--border);padding:2px 8px;display:flex;flex-direction:row;align-items:center;gap:5px;cursor:default;overflow:hidden;line-height:1.25}
.g-row-head .m-name{font-weight:700;font-size:12.5px;display:flex;align-items:center;gap:5px;white-space:nowrap;flex-shrink:0}
.g-row-head .m-sub{font-size:10px;color:var(--text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dot{width:8px;height:8px;border-radius:50%;display:inline-block;flex-shrink:0}
.g-row-body{position:relative;border-bottom:1px solid var(--border);height:32px;background-image:repeating-linear-gradient(90deg,transparent 0,transparent 0)}
.g-row-body:nth-child(4n+3){background:rgba(241,245,249,.45)}
.g-gridline{position:absolute;top:0;bottom:0;border-left:1px dashed var(--border);z-index:1}
.g-task{position:absolute;top:2px;height:28px;border-radius:5px;overflow:hidden;cursor:grab;display:flex;align-items:stretch;z-index:5;border:1.5px solid transparent;transition:box-shadow .15s}
.g-task:hover{box-shadow:0 4px 14px rgba(2,8,23,.22);z-index:8}
.g-task.dragging{cursor:grabbing;opacity:.88;z-index:20;box-shadow:0 8px 22px rgba(2,8,23,.3)}
.g-setup{flex-shrink:0}
.g-main{flex:1;min-width:0;display:flex;align-items:center;gap:6px;padding:0 8px;color:#fff;overflow:hidden;white-space:nowrap}
.g-main b{font-size:11px;font-weight:600;text-overflow:ellipsis;overflow:hidden;flex:1}
.g-main span{font-size:10px;opacity:.92;font-variant-numeric:tabular-nums}
.g-task.running{border-color:#15803d;border-width:3px;box-shadow:0 0 0 2px var(--green-bg),0 0 12px rgba(22,163,74,.45);z-index:6}
/* 生产中：左右边线（生产起止边界）加粗加重 */
.g-task.running::before,.g-task.running::after{content:'';position:absolute;top:-1px;bottom:-1px;width:3px;background:#15803d}
.g-task.running::before{left:-1px;border-radius:6px 0 0 6px}
.g-task.running::after{right:-1px;border-radius:0 6px 6px 0}
.g-task.done{opacity:.62;filter:saturate(.5)}
.g-task.done .g-main{text-decoration:line-through}
.g-task.paused{border-color:var(--orange)}
.g-task.delayed{border-color:var(--red)}
.g-task.nodrag{cursor:pointer}
.g-warn{position:absolute;top:-1px;right:-1px;background:var(--red);color:#fff;font-style:normal;font-size:10px;font-weight:800;width:14px;height:14px;border-radius:0 5px 0 6px;display:flex;align-items:center;justify-content:center;line-height:1}
.g-lock{position:absolute;bottom:-1px;right:-1px;background:#334155;color:#fff;width:14px;height:14px;border-radius:6px 0 5px 0;display:flex;align-items:center;justify-content:center}
.g-lock svg{width:8px;height:8px}
.g-now{position:absolute;top:0;bottom:0;width:0;border-left:2px solid #ef4444;z-index:12;pointer-events:none}
.g-now::after{content:'今天';position:absolute;top:-1px;left:3px;background:#ef4444;color:#fff;font-size:9.5px;padding:1px 5px;border-radius:0 0 4px 4px;white-space:nowrap}
.g-legend{display:flex;gap:16px;align-items:center;flex-wrap:wrap;padding:10px 14px;border-top:1px solid var(--border);font-size:11.5px;color:var(--text-2)}
.g-legend .lg{display:flex;align-items:center;gap:5px}
.g-legend .sw{width:14px;height:10px;border-radius:3px;display:inline-block}
.g-legend .sw.setup{background:repeating-linear-gradient(45deg,#94a3b8 0 3px,#cbd5e1 3px 6px)}
.g-legend .sw.late{background:#fff;border:1.5px solid var(--red);width:12px;height:9px}

/* ================= 机台管理：设备看板（浅色，与管理看板风格一致） =================
   注意：容器类名用 .mdeck，不可复用 .mc-board —— 那是管理看板「机台状态看板」的网格类，
   同名会让本页的状态条/卡片区被当成网格单元格而被压成窄列。 */
.mdeck{display:block;background:transparent;padding:2px 0}

/* 顶部状态统计条 */
.mc-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin-bottom:14px}
.mc-stat{display:flex;align-items:center;justify-content:space-between;gap:10px;border:none;border-radius:9px;padding:12px 15px;font-family:inherit;font-size:15px;font-weight:700;color:#fff;cursor:pointer;transition:.15s;letter-spacing:.3px}
.mc-stat b{font-size:17px;font-weight:700}
.mc-stat:hover{filter:brightness(1.06)}
.mc-stat.on{box-shadow:0 0 0 3px rgba(15,23,42,.38)}
.mc-stat.t-all{background:#2563eb}
.mc-stat.t-running{background:#16a34a}
.mc-stat.t-idle{background:#dca800}
.mc-stat.t-down{background:#dc2626}
.mc-stat.t-maintenance{background:#7c3aed}
.mc-stat.t-stopped{background:#5b6b80}
.mc-stat.t-pending{background:#dca800}
.mc-stat.t-scheduled{background:#7c3aed}
.mc-stat.t-done{background:#0d9488}

/* 机台卡片 */
.machine-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}
.mcard{position:relative;background:var(--card);border:1px solid var(--border);border-radius:12px;padding:13px 14px;color:var(--text);display:flex;flex-direction:column;overflow:hidden;transition:.15s;box-shadow:var(--shadow)}
.mcard:hover{border-color:var(--border-2);box-shadow:0 6px 20px rgba(15,23,42,.12);transform:translateY(-1px)}
.mc-top{display:flex;gap:10px;align-items:flex-start}
.mc-info{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.mc-type{font-size:15px;font-weight:700;color:var(--text)}
.mc-brand{font-size:11.5px;color:var(--text-2)}
.mc-model{font-size:11.5px;color:var(--text-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mc-state{margin-top:7px;font-size:13.5px;font-weight:700;letter-spacing:.3px}
.mcard.st-running .mc-state{color:#16a34a}
.mcard.st-idle .mc-state{color:#d97706}
.mcard.st-maintenance .mc-state{color:#7c3aed}
.mcard.st-down .mc-state{color:#dc2626}
.mcard.st-stopped .mc-state{color:#64748b}
.mc-visual{flex:none;width:142px;text-align:right}
.mc-code{font-size:17px;font-weight:700;line-height:1;color:#0e7490;letter-spacing:.5px}
.mc-img{display:block;width:100%;height:auto;margin-top:6px;filter:drop-shadow(0 3px 7px rgba(15,23,42,.18))}

/* 卡片下半部：生产 / 负荷 / 操作 */
.mcard .muted{color:var(--text-3)}
.mcard .mc-meta{display:flex;flex-wrap:wrap;gap:3px 16px;margin-top:11px;padding-top:9px;border-top:1px dashed var(--border);font-size:12px;color:var(--text-2)}
.mcard .mc-meta .mi{display:inline-flex;align-items:baseline;gap:5px;min-width:0}
.mcard .mc-meta .mi i{font-style:normal;color:var(--text-3);font-size:11px}
.mcard .mc-meta b{font-weight:700;color:var(--text)}
.mcard .mc-load{display:flex;align-items:center;gap:9px;margin-top:9px}
.mcard .mc-load .load-bar{flex:1;margin:0;height:12px;background:var(--gray-bg)}
.mcard .mc-load .prog-txt{margin:0;white-space:nowrap;font-size:11px;color:var(--text-2)}
.mcard .mc-foot{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap;align-items:center}
.mcard .mc-foot .btn{background:#fff;border:1px solid var(--border-2);color:var(--text)}
.mcard .mc-foot .btn:hover{background:var(--primary-50);border-color:var(--primary);color:var(--primary)}
.mcard .mc-foot .select{background:#fff;border:1px solid var(--border-2);color:var(--text);font-size:12px;padding:4px 6px;border-radius:7px;cursor:pointer}
.mcard .mc-foot .select:focus{border-color:var(--primary);box-shadow:0 0 0 3px rgba(37,99,235,.18)}
.mcard .mc-foot .select option{background:#fff;color:var(--text)}
.mcard .mc-foot .icon-btn{color:var(--text-3);border:1px solid var(--border)}
.mcard .mc-foot .icon-btn:hover{color:var(--primary);background:var(--primary-50)}
.mc-none{grid-column:1/-1;padding:40px;text-align:center;color:var(--text-3)}

.mstat-dot{width:9px;height:9px;border-radius:50%;display:inline-block;margin-right:5px}

/* 图表 */
.chart-box{width:100%;overflow:hidden}
.legend-h{display:flex;gap:12px;flex-wrap:wrap;font-size:11.5px;color:var(--text-2);margin-top:8px}
.legend-h .lg{display:flex;align-items:center;gap:5px}
.legend-h .sw{width:11px;height:11px;border-radius:3px}

/* 负荷条 */
.load-row{display:grid;grid-template-columns:120px 1fr 52px;gap:10px;align-items:center;margin-bottom:9px;font-size:12.5px}
.load-row .lb{color:var(--text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.load-row .val{text-align:right;font-variant-numeric:tabular-nums;font-weight:600}
.load-bar{height:14px;background:var(--gray-bg);border-radius:6px;overflow:hidden;position:relative}
.load-bar>i{display:block;height:100%;border-radius:6px;background:linear-gradient(90deg,#2563eb,#06b6d4)}
.load-bar.warn>i{background:linear-gradient(90deg,#f59e0b,#f97316)}
.load-bar.over>i{background:linear-gradient(90deg,#dc2626,#ef4444)}

/* 打印 */
.print-area{display:none}
.modal .print-area{display:block} /* 弹窗内正常预览，打印规则不受影响 */
@media print{
  body *{visibility:hidden}
  .print-area,.print-area *{visibility:visible}
  /* 解除弹窗/容器裁剪：让打印内容在正常文档流中分页输出，长内容（多轮报告/参数表）不再被截断 */
  .modal-mask{position:absolute!important;inset:0;overflow:visible!important;background:#fff!important;display:block!important;padding:0!important}
  .modal{box-shadow:none!important;border:none!important;border-radius:0;width:100%!important;max-width:100%!important;background:#fff!important}
  .modal-head,.modal-foot{display:none!important}
  .modal-body{padding:0!important;max-height:none!important;overflow:visible!important}
  .modal-body > *:not(.print-area){display:none!important}
  .print-area{display:block!important;position:static!important;top:auto!important;left:auto!important;width:100%!important;padding:20px!important}
  .print-area fieldset{max-height:none!important;overflow:visible!important}
  .print-area pre{max-height:none!important;overflow:visible!important;white-space:pre-wrap!important}
  /* 分页：尽量不拆断表格行、卡片与区块，区块间自然分页 */
  .print-area table tr{page-break-inside:avoid;break-inside:avoid}
  .print-area .pi-item,.print-area .td-img,.print-area .section-title,.print-area .ov-mold,.print-area fieldset,.print-area .prev-issues{page-break-inside:avoid;break-inside:avoid}
  .print-head{display:flex!important;justify-content:space-between;border-bottom:2px solid #000;padding-bottom:8px;margin-bottom:12px;page-break-after:avoid}
  .print-area table{width:100%;border-collapse:collapse;font-size:12px}
  .print-area th,.print-area td{border:1px solid #999;padding:6px 8px;text-align:left}
  /* 三大块并排：打印时保持同一行，去掉卡片圆角与阴影，压缩字号以适配纸面 */
  .prow{grid-template-columns:repeat(3,minmax(0,1fr));gap:6px}
  .prow .pcol{gap:6px}
  .prow .pblk{border:none;border-radius:0;box-shadow:none}
  .prow .psheet td{padding:2px 3px;font-size:9.5px}
  .prow .psheet td.k{font-size:9px}
  .prow .psheet tr.colhead td{font-size:9px;padding:2px 2px}
  .prow .psheet tr.sec td{font-size:9.5px;padding:2px 4px;letter-spacing:1px}
  .prow .psheet input{font-size:9.5px;padding:0 1px}
  .prow .psheet select{font-size:9.5px}
  .wsplit{grid-template-columns:minmax(0,400px) 1fr;gap:6px;margin-bottom:4px}
  .wtab{font-size:9.5px}
  .wtab td{padding:2px 3px}
  .wtab tr.colhead td{font-size:9px;padding:2px 2px}
  .wtab select,.wtab input{font-size:9.5px}
  .wsplit .water-svg{border-color:#999;background:#fff;overflow:visible;border-width:1px!important;padding:4px;print-color-adjust:exact;-webkit-print-color-adjust:exact}
  .wsplit .water-svg svg{min-width:0;width:100%;max-height:400px;print-color-adjust:exact;-webkit-print-color-adjust:exact}
  .no-print{display:none!important}
}

/* 成型参数表 */
.psheet{width:100%;border-collapse:collapse;font-size:12.5px}
.psheet td{border:1px solid var(--border);padding:6px 10px}
.psheet td.k{background:var(--gray-bg);color:var(--text-2);white-space:nowrap;width:128px}
.psheet tr.sec td{background:#eef2ff;font-weight:700;color:#1e3a8a;font-size:12px;padding:5px 10px;letter-spacing:1px}
.psheet tr.colhead td{background:#f4f7fc;color:#33415c;font-weight:600;font-size:11px;text-align:center;padding:4px 6px;letter-spacing:0}
.psheet tr.colhead td.k{background:#eaeff8}
.psheet tr.subsec td{background:#e8f0ff;color:#1e3a8a;font-weight:700;font-size:11.5px;padding:4px 8px;letter-spacing:1px}
.rev-pick{float:right;font-weight:400;font-size:12px;color:#33415c;letter-spacing:0}
.rev-pick select{font-size:12px;padding:1px 4px;vertical-align:middle;max-width:120px}
.psheet input{border:none;background:transparent;border-bottom:1px dashed #b6c2d9;width:52px;font:inherit;font-weight:600;text-align:right;outline:none;padding:0 2px}
.psheet input:focus{border-bottom:1.5px solid var(--primary)}
.psheet .u{color:var(--text-3);font-size:11px;margin-left:3px}
.ptag{margin:14px 0 8px;background:#eef2ff;color:#1e3a8a;font-weight:700;font-size:12px;padding:5px 10px;border-radius:6px;letter-spacing:1px;border-left:3px solid #2563eb}

/* 《注塑工艺成型条件表》v3：紧凑双栏版式（对齐厂内纸质工艺卡） */
.pgrid2{display:grid;grid-template-columns:1fr 1fr;gap:10px;align-items:start}
.pgrid2.wide-right{grid-template-columns:1fr 286px}
.pgrid2>table{margin:0}
.psheet.ps3{font-size:12px}
.psheet.ps3 td{border:1px solid var(--border);padding:3px 5px}
.psheet.ps3 td.k{width:auto;min-width:56px;background:var(--gray-bg);color:var(--text-2);white-space:nowrap;font-size:11.5px;text-align:center}
.psheet.ps3 tr.colhead td{font-size:11px;padding:3px 4px}
.psheet.ps3 tr.sec td{font-size:11.5px;padding:3px 6px}
.psheet.ps3 input{width:100%;min-width:28px;box-sizing:border-box;text-align:right;border-bottom:1px solid #cfd8e8;font-size:12px;padding:1px 3px}
.psheet.ps3 input[type=text]{text-align:left}
.psheet.ps3 select{width:100%;border:none;background:transparent;font:inherit;font-size:12px;color:var(--text);outline:none;cursor:pointer;padding:1px 0;box-sizing:border-box}
.psheet.ps3 textarea{font-size:12px}
@media (max-width:900px){.pgrid2,.pgrid2.wide-right{grid-template-columns:1fr}}
/* 运水接驳图：左表右图（组 | 方式 | 左孔 | 右孔 | 补充）+ 按配孔自动生成示意图 */
.wsplit{display:grid;grid-template-columns:minmax(0,420px) 1fr;gap:10px;align-items:start;margin-bottom:8px}
.wsplit>table{margin:0}
.wtab tr.colhead td{text-align:center;white-space:nowrap;padding:3px 2px;font-size:10.5px}
.wtab td{padding:3px 4px}
.wtab td.k{min-width:0;width:34px;padding:3px 2px}
.wtab select{font-size:11.5px}
.wtab input{font-size:11px}
/* 作用域到 .wsplit，确保压过后文通用 .water-svg 规则（含 min-width:560px / overflow-x:auto） */
.wsplit .water-svg{border:1px solid #cbd5e1;border-radius:6px;background:#fff;padding:4px 2px;box-sizing:border-box;overflow:hidden;margin-top:0}
.wsplit .water-svg svg{display:block;width:100%;height:auto;min-width:0;max-height:460px}
@media (max-width:900px){.wsplit{grid-template-columns:1fr}}

/* 射出 / 保压 / 储料+射退：三大块并排同一行（窄列紧凑卡片版式） */
.prow{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;align-items:start}
.prow .pcol{display:flex;flex-direction:column;gap:12px;min-width:0}
.prow .pblk{border:1px solid var(--border);border-radius:9px;overflow:hidden;background:#fff;box-shadow:0 1px 2px rgba(15,23,42,.06)}
.prow .pblk>table.psheet{width:100%;margin:0;border:none}
.prow .pblk>table.psheet td:first-child{border-left:none}
.prow .pblk>table.psheet td:last-child{border-right:none}
.prow .pblk>table.psheet tr:last-child td{border-bottom:none}
.prow .psheet td{padding:3px 5px;font-size:11.5px}
.prow .psheet td.k{width:auto;min-width:0;padding:3px 5px;font-size:11px;white-space:nowrap;text-align:center}
.prow .psheet tr.colhead td{padding:4px 4px;font-size:10.5px;line-height:1.3;background:#f7f9fd;white-space:nowrap}
.prow .psheet tr.colhead td.k{background:#eef2f9;text-align:center;font-size:10.5px}
.prow .psheet tr.sec td{padding:5px 8px;font-size:11.5px;letter-spacing:2.5px;background:linear-gradient(180deg,#f2f6ff,#e7eeff);color:#1d4ed8;border-bottom:1px solid #dbe5f7;text-align:center}
.prow .psheet input{width:100%;min-width:0;box-sizing:border-box;font-size:11.5px;padding:1px 3px}
.prow .psheet select{width:100%;font-size:11.5px;padding:1px 0}
.prow .psheet .u{margin:0 2px;font-size:10px;color:var(--text-3)}
.prow .psheet .dual{display:flex;align-items:center;gap:2px}
.prow .psheet .dual>input{width:0;flex:1 1 0;min-width:26px}
/* 窄列下让各参数列宽度更均衡（避免个别列被撑宽） */
.prow .psheet td>.dual{width:100%}
@media (max-width:1100px){.prow{grid-template-columns:1fr 1fr}}
@media (max-width:700px){.prow{grid-template-columns:1fr}}
.pgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:10px}
.pgrid .psheet{font-size:11.5px}
.pgrid .psheet td{padding:4px 7px}
.pgrid .psheet td.k{width:auto;min-width:44px;padding:4px 5px}
@media(max-width:860px){.pgrid{grid-template-columns:1fr}}
/* 运水连接示意 */
.water-svg{margin-top:10px;border:1px solid var(--border);border-radius:8px;background:#fbfcfe;padding:6px 4px;overflow-x:auto}
.water-svg svg{min-width:560px}
.water-empty{padding:18px 12px;text-align:center;color:var(--text-3);font-size:12.5px}
#wserWrap{margin-top:10px}
#wserWrap .psheet input{width:100%;text-align:left;font-weight:500}

/* 其他 */
.stat-strip{display:flex;gap:10px;flex-wrap:wrap}
.stat-chip{display:flex;align-items:center;gap:7px;background:#fff;border:1px solid var(--border);border-radius:8px;padding:7px 12px;font-size:12.5px;color:var(--text-2)}
.stat-chip b{color:var(--text);font-size:15px}
.notice{border-radius:9px;padding:11px 14px;font-size:12.5px;line-height:1.7;margin-bottom:14px}
.notice.n-info{background:var(--blue-bg);color:#1e40af;border:1px solid #bfdbfe}
.notice.n-warn{background:var(--orange-bg);color:#92400e;border:1px solid #fde68a}
.muted{color:var(--text-3);font-size:12px}
.link{color:var(--primary);cursor:pointer;text-decoration:none}
.link:hover{text-decoration:underline}
.task-detail{font-size:13px;line-height:1.6}
.task-detail .td-grid{display:grid;grid-template-columns:86px 1fr 86px 1fr;gap:8px 12px;background:#f8fafc;border:1px solid var(--border);border-radius:9px;padding:13px;margin-bottom:14px}
.task-detail .td-grid .lb{color:var(--text-3);font-size:12px}
.task-detail .td-grid .vl{font-weight:600}
.progress-form{display:flex;gap:8px;align-items:flex-end;flex-wrap:wrap}
.progress-form .field{flex:1;min-width:110px}
.btn-group-row{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px}
.section-title{font-size:13px;font-weight:700;margin:4px 0 10px;color:var(--text)}
footer.ver{padding:8px 0 2px;font-size:11px;color:var(--text-3);text-align:center}

/* ============ 手机端适配（≤768px） ============ */
.nav-toggle{display:inline-flex;border:none;background:transparent;color:var(--text);width:36px;height:36px;border-radius:8px;align-items:center;justify-content:center;cursor:pointer;margin-right:2px}
.nav-toggle:hover{background:var(--gray-bg)}
.sb-mask{display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(10,18,34,.45);z-index:90}
@media(max-width:768px){
  /* 侧边栏抽屉 */
  .sidebar{position:fixed;left:0;top:0;bottom:0;z-index:100;width:250px;transform:translateX(-100%);transition:transform .22s ease;box-shadow:6px 0 24px rgba(2,8,23,.3)}
  .sidebar.open{transform:none}
  .sb-mask.show{display:block;animation:fadeIn .15s}
  .nav-toggle{display:inline-flex}
  .sb-collapse{display:none}
  /* 顶栏 */
  .topbar{padding:0 12px;height:auto;min-height:50px}
  .topbar-right{gap:8px}
  .topbar-right .btn{padding:6px 10px;font-size:12.5px}
  .clock{display:none}
  .page{padding:12px 12px 20px}
  /* 布局与组件压缩 */
  .kpi-grid{gap:10px}
  .kpi{padding:12px 13px}
  .kpi .k-icon{width:38px;height:38px;border-radius:9px}
  .toolbar{gap:8px;font-size:12.5px}
  .toolbar .select,.toolbar .input{min-width:0;max-width:100%}
  .search-box .input{width:100%}
  .card-head,.card-body{padding:12px}
  .grid-2,.grid-3-2{gap:12px}
  /* 表格：保持自然列宽，由 .tbl-wrap 横向滑动查看（不缩小字号、不挤压） */
  .tbl th,.tbl td{padding:8px 10px}
  /* 弹窗：接近平铺全屏 */
  .modal-mask{padding:0}
  .modal{width:100%;max-width:100%;min-height:100vh;border-radius:0}
  .modal.modal-lg{width:100%}
  .modal-body{padding:14px 12px;max-height:calc(100vh - 130px)}
  .modal-foot{padding:12px}
  .modal-foot .btn{flex:1;justify-content:center;padding:10px}
  .form-grid{grid-template-columns:1fr}
  .q-form-4col{grid-template-columns:1fr 1fr!important}
  /* 触摸目标加大 */
  .btn{padding:8px 13px}
  .icon-btn{width:32px;height:32px}
  /* 成型参数表：单列并允许横滑 */
  .psheet td.k{width:auto;min-width:64px}
  .psheet{font-size:12px}
  .psheet td{padding:6px 8px}
  .pgrid .psheet td{padding:5px 6px}
  /* 甘特图（左列宽 130px 由 JS 计算，保持一致靠横滑） */
  .gantt-toolbar{padding:8px 10px;gap:6px}
  .gantt-toolbar .title{font-size:12.5px}
  /* 任务详情/进度表单 */
  .task-detail .td-grid{grid-template-columns:78px 1fr 78px 1fr;gap:6px 8px;padding:10px}
  .progress-form .field{min-width:90px}
  .stat-chip{padding:6px 10px;font-size:12px}
  /* 打印按钮等次要元素在手机上隐藏，避免遮挡 */
  .water-svg svg{min-width:520px}
}
/* iOS Safari 地址栏收放回退 */
@supports(height:100dvh){.app{height:100dvh}}

/* ============ 多用户版：登录页 / 用户栏 / 角色权限 ============ */
.login-wrap{position:fixed;top:0;left:0;right:0;bottom:0;z-index:999;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(135deg,#0f172a 0%,#1e3a8a 55%,#2563eb 100%);padding:20px}
.login-card{background:#fff;border-radius:16px;box-shadow:0 24px 60px rgba(0,0,0,.35);padding:34px 34px 26px;width:100%;max-width:380px;text-align:center}
.login-logo{width:62px;height:62px;border-radius:16px;background:linear-gradient(135deg,#2563eb,#0ea5e9);display:flex;align-items:center;justify-content:center;margin:0 auto 14px}
.login-card h2{font-size:20px;margin:0 0 4px}
.login-sub{color:#64748b;font-size:12.5px;margin:0 0 20px}
.login-err{background:#fef2f2;color:#dc2626;border:1px solid #fecaca;border-radius:8px;padding:8px 12px;font-size:13px;margin-bottom:14px}
.login-field{display:block;text-align:left;margin-bottom:14px}
.login-field span{display:block;font-size:12.5px;color:#475569;margin-bottom:6px;font-weight:600}
.login-field input{width:100%;box-sizing:border-box;border:1.5px solid #e2e8f0;border-radius:9px;padding:11px 13px;font-size:15px;outline:none;transition:border .15s}
.login-field input:focus{border-color:#2563eb}
.login-btn{width:100%;height:44px;font-size:15.5px;letter-spacing:6px;margin-top:4px}
.login-tip{margin-top:18px;padding-top:14px;border-top:1px dashed #e2e8f0;color:#94a3b8;font-size:11.5px;line-height:1.8}
/* 登录页：公司选择（全称 ↔ 简称） */
.login-field select.login-select{width:100%;box-sizing:border-box;border:1.5px solid #e2e8f0;border-radius:9px;padding:11px 13px;font-size:14.5px;font-family:inherit;color:#0f172a;background:#fff;outline:none;transition:border .15s;cursor:pointer}
.login-field select.login-select:focus{border-color:#2563eb}
.login-com-short{display:block;font-style:normal;font-size:11.5px;color:#94a3b8;margin-top:5px}
/* 登录页：记住账号和密码 */
.login-remember{display:flex;align-items:center;gap:8px;text-align:left;margin:-2px 0 14px;cursor:pointer;user-select:none}
.login-remember input[type=checkbox]{width:16px;height:16px;flex:none;accent-color:#2563eb;cursor:pointer;margin:0}
.login-remember span{font-size:13px;color:#475569}
.login-remember-clear{margin-left:auto;font-size:11.5px;font-weight:600;color:#94a3b8;padding:2px 8px;border-radius:6px;border:1px solid transparent;cursor:pointer}
.login-remember-clear:hover{color:#dc2626;background:#fef2f2;border-color:#fecaca}
/* 数据管理：公司列表行（全称 / 简称） */
.co-row{display:grid;grid-template-columns:1fr 200px auto;gap:10px;align-items:center;margin-bottom:10px}
.co-row .input{width:100%}
.co-del{flex:none;color:#dc2626;border-color:#fecaca;background:#fff}
.co-del:hover{background:#fef2f2;border-color:#fca5a5;color:#b91c1c}
@media(max-width:720px){.co-row{grid-template-columns:1fr;gap:6px}}
/* 顶栏用户区 */
.user-box{display:inline-flex;align-items:center;gap:8px;margin-right:6px}
.u-name{font-size:13px;color:#334155;display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.u-role{font-style:normal;font-size:11px;padding:1px 7px;border-radius:99px;font-weight:600}
.u-role.r-admin{background:#ede9fe;color:#7c3aed}
.u-role.r-editor{background:#dbeafe;color:#2563eb}
.u-role.r-viewer{background:#f1f5f9;color:#64748b}
.u-logout{border:1px solid #e2e8f0;background:#fff;border-radius:8px;padding:5px 11px;font-size:12.5px;color:#475569;cursor:pointer}
.u-logout:hover{border-color:#f87171;color:#dc2626}
/* 只读角色（车间查看）：隐藏全部写操作入口 */
.role-viewer .icon-btn[title="编辑"],.role-viewer .icon-btn[title="删除"],
.role-viewer #btnTopSchedule,.role-viewer #btnSchAppend,.role-viewer #btnSchRerun,.role-viewer #btnBatchChange,
.role-viewer [id^="btnNew"],.role-viewer [id^="btnImp"],
.role-viewer .btn-danger,.role-viewer [data-act="save"],.role-viewer .data-act-save{display:none!important}
/* 甘特图任务块：批量勾选 + 跨行拖动视觉 */
.g-pick{position:absolute;left:2px;top:2px;z-index:6;width:14px;height:14px;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.88);border-radius:3px;cursor:pointer;box-shadow:0 0 0 1px rgba(0,0,0,.15)}
.g-pick input{width:12px;height:12px;margin:0;cursor:pointer}
.role-viewer .g-pick{display:none!important}
.g-row-body.row-hover{background:rgba(37,99,235,.08)!important;box-shadow:inset 0 0 0 1.5px var(--primary)}
.g-row-body.row-bad{background:rgba(239,68,68,.08)!important;box-shadow:inset 0 0 0 1.5px var(--red)}
.g-task.dragging-cross{opacity:.92;transition:none}
.g-task.dragging{opacity:.92}
/* 手机端登录页与用户栏适配 */
@media(max-width:768px){
  .login-card{padding:26px 22px 20px}
  .user-box .u-name{font-size:12px}
  .u-logout{padding:4px 8px;font-size:11.5px}
}

/* ================= 通知中心（岗位订阅铃铛） ================= */
.notice-bell{position:relative;cursor:pointer;display:flex;align-items:center;padding:6px;border-radius:8px;color:var(--text-2)}
.notice-bell:hover{background:var(--bg)}
.notice-bell.has-unread{color:var(--red,#dc2626)}
.notice-bell.has-unread svg{stroke:var(--red,#dc2626)}
.notice-bell.has-unread .nb-badge{box-shadow:0 0 0 2px #fff;animation:nbpulse 1.6s ease-in-out infinite}
@keyframes nbpulse{0%,100%{transform:scale(1)}50%{transform:scale(1.12)}}
.notice-bell .nb-badge{position:absolute;top:-2px;right:-4px;background:var(--red,#dc2626);color:#fff;font-size:10.5px;font-weight:700;min-width:17px;height:17px;border-radius:9px;display:none;align-items:center;justify-content:center;padding:0 4px;line-height:1}
.notice-drop{position:absolute;top:40px;right:0;width:390px;max-width:calc(100vw - 24px);background:#fff;border:1px solid var(--border);border-radius:12px;box-shadow:0 12px 40px rgba(15,23,42,.16);z-index:100;display:none;overflow:hidden}
.notice-drop.open{display:block}
.nd-head{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid var(--border);font-size:13.5px;gap:8px}
.nd-unread{font-size:11.5px;color:var(--text-3)}
.nd-unread.has{color:var(--red,#dc2626);font-weight:600}
.nd-posts{padding:8px 14px;border-bottom:1px solid var(--border);display:flex;gap:5px;flex-wrap:wrap;align-items:center}
.np-chip{display:inline-block;padding:2.5px 9px;border-radius:20px;font-size:11px;background:var(--bg);color:var(--text-3);border:1px solid var(--border);cursor:pointer;user-select:none;transition:all .12s}
.np-chip.on{background:#e0edff;color:#1d4ed8;border-color:#93c5fd;font-weight:600}
.np-chip.sm{cursor:default;padding:1.5px 7px;font-size:10.5px}
.nd-list{max-height:340px;overflow:auto}
.nd-item{padding:10px 14px;border-bottom:1px solid var(--border);cursor:pointer;transition:background .1s}
.nd-item:hover{background:var(--bg)}
.nd-item.unread{background:#f8faff}
.nd-item.read{opacity:.82}
.nd-read{font-style:normal;font-size:10px;line-height:1;color:#94a3b8;background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 5px;flex-shrink:0}
.nd-item .nd-t{display:flex;align-items:center;gap:6px;font-size:12.5px}
.nd-item .nd-t b{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.nd-dot{width:7px;height:7px;border-radius:50%;background:var(--red,#dc2626);flex-shrink:0}
.nd-time{font-size:10.5px;color:var(--text-3);flex-shrink:0;font-weight:400}
.nd-m{font-size:11.8px;color:var(--text-2);margin:3px 0 4px;line-height:1.55}
.nd-p{display:flex;gap:4px;flex-wrap:wrap}
.notice-detail{font-size:13px}
.notice-detail .np-chip.on{padding:3px 10px;font-size:11px}

/* ================= 试模时间线 ================= */
.tl{display:flex;flex-direction:column}
.tl-step{display:flex;gap:12px;position:relative;padding-bottom:16px}
.tl-step:last-child{padding-bottom:2px}
.tl-step::before{content:'';position:absolute;left:13px;top:30px;bottom:0;width:2px;background:var(--border)}
.tl-step:last-child::before{display:none}
.tl-step.on::before{background:#bfdbfe}
.tl-dot{width:28px;height:28px;border-radius:50%;background:var(--bg);border:2px solid var(--border);display:flex;align-items:center;justify-content:center;font-size:13px;flex-shrink:0;z-index:1}
.tl-step.on .tl-dot{background:#eff6ff;border-color:#3b82f6}
.tl-body{flex:1;min-width:0;font-size:13px;padding-top:3px}
.tl-body b{font-size:12.8px}
.tl-sub{font-size:11.8px;color:var(--text-3);margin-top:3px;line-height:1.65;word-break:break-all}
.tl-step:not(.on) .tl-body{opacity:.55}

/* ============ 品质管理 ============ */
.q-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-top:12px}
.q-card{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:14px 16px}
.q-num{font-size:26px;font-weight:700;line-height:1.1;color:var(--text)}
.q-lab{font-size:12px;color:var(--text-3);margin-top:4px}
.pq-chart{display:flex;flex-direction:column;gap:8px;padding:12px 8px 4px}
.pq-row{display:flex;align-items:center;gap:10px}
.pq-name{width:96px;font-size:12.5px;color:var(--text-2);text-align:right;flex-shrink:0}
.pq-barwrap{display:flex;align-items:flex-end;height:130px;flex:1;background:linear-gradient(180deg,#f8fafc,#f1f5f9);border-radius:6px;padding:4px 8px}
.pq-bar{width:60%;max-width:80px;border-radius:4px 4px 0 0;transition:height .2s}
.pq-val{width:64px;font-size:12.5px;font-weight:600;color:var(--text);flex-shrink:0}
.q-deflist{display:flex;flex-direction:column;gap:6px}
.q-def-row{display:grid;grid-template-columns:120px 70px 1fr 40px 34px;gap:6px;align-items:center}
.q-def-photo{padding:6px 8px;font-size:15px;line-height:1}
.q-def-file{display:none}
.q-def-img{display:none}
.q-def-imgbox{grid-column:1 / -1;display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-top:2px}
.q-def-img-thumb{width:80px;height:80px;object-fit:cover;border-radius:8px;border:1px solid var(--border);cursor:zoom-in}
.q-def-img-thumb:hover{outline:2px solid var(--blue,#2563eb)}
.q-ph{color:var(--blue,#2563eb);font-size:11px;white-space:nowrap}
.q-def-imgdel{padding:2px 9px;font-size:13px}
.q-def-row.q-def-empty{grid-template-columns:1fr;font-size:12px;color:var(--text-3);padding:4px 0}
.q-def-row .icon-btn{border:none;background:transparent;color:var(--red)}
.q-def-row .icon-btn:hover{background:var(--red-bg)}


/* ================= 独立报工悬浮按钮 ================= */
.fab{position:fixed;z-index:80;display:flex;align-items:center;justify-content:center;cursor:pointer;border:none;
  font-family:inherit;transition:transform .15s ease, box-shadow .15s ease;
  touch-action:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;}
.fab-report{right:26px;bottom:26px;gap:8px;height:54px;padding:0 22px;border-radius:30px;
  background:linear-gradient(135deg,#fb923c,#ef4444);color:#fff;font-size:15px;font-weight:700;letter-spacing:.5px;
  box-shadow:0 10px 26px rgba(239,68,68,.38);animation:fabPulse 2.4s ease-in-out infinite;}
.fab-report svg{width:20px;height:20px;flex-shrink:0}
.fab-report:hover{transform:translateY(-2px);box-shadow:0 14px 34px rgba(239,68,68,.5)}
.fab-report:active{transform:translateY(0)}
@keyframes fabPulse{
  0%,100%{box-shadow:0 10px 26px rgba(239,68,68,.38)}
  50%{box-shadow:0 10px 26px rgba(239,68,68,.38),0 0 0 7px rgba(239,68,68,.12)}
}
/* 报工图标长按进入可拖动：放大+抖动提示，松手后停在新位置 */
.fab.fab-ready{transform:scale(1.14);cursor:grabbing;animation:fabWiggle .45s ease-in-out infinite;
  box-shadow:0 0 0 10px rgba(239,68,68,.16),0 14px 34px rgba(239,68,68,.5);}
.fab.fab-dragging{transition:none;cursor:grabbing;animation:none;
  box-shadow:0 0 0 12px rgba(239,68,68,.14),0 18px 42px rgba(239,68,68,.55);}
@keyframes fabWiggle{0%,100%{transform:scale(1.14) rotate(-3deg)}50%{transform:scale(1.14) rotate(3deg)}}
/* 报工表单 */
.report-form{display:flex;flex-direction:column;gap:14px}
.rf-row{display:flex;gap:14px;flex-wrap:wrap}
.rf-row .field{flex:1;min-width:150px}
.report-form .field label{display:block;font-size:12.5px;color:var(--text-2);margin-bottom:6px;font-weight:600}
.report-form .req{color:#ef4444;margin-left:2px}
.report-form .hint{font-size:11.5px;color:var(--text-3);margin-top:5px;line-height:1.5}
.report-form textarea.input{resize:vertical;font-family:inherit}
.report-ctx{font-size:12px;color:var(--text-3);min-height:18px;line-height:1.5;margin-top:2px;transition:all .15s}
.report-ctx.ok{color:var(--green,#16a34a);background:var(--green-bg,#eafaf0);border-radius:8px;padding:7px 10px;margin-top:6px;font-weight:500}
.report-ctx.ok b{font-weight:700}

/* ================= 手机版：底部导航栏 ================= */
/* 仅窄屏显示；桌面端隐藏 */
.bottom-nav{display:none}
.app.tv .bottom-nav{display:none!important}
@media(max-width:768px){
  /* 顶栏：一键排产改为纯图标按钮，节省空间 */
  #btnTopSchedule .top-btn-label{display:none}
  #btnTopSchedule{padding:8px;width:38px;height:38px;justify-content:center;flex:0 0 auto}
  /* 顶栏防挤压：标题单行省略号；电视/缩放等大屏专用控件在手机上无意义，直接隐藏 */
  .topbar{gap:8px;padding-left:calc(12px + env(safe-area-inset-left,0px));padding-right:calc(12px + env(safe-area-inset-right,0px))}
  .topbar h1{flex:1;min-width:0;white-space:normal;overflow:visible}
  .zoom-ctl,#btnTV{display:none!important}
  .u-name{display:none}
  /* 用户区精简：隐藏角色/部门小标签，仅留姓名与退出 */
  .u-role,.u-dept{display:none}
  .user-box{gap:6px;margin-right:0}
  .topbar-right .btn{padding:7px 11px;font-size:12.5px}

  /* 底部导航栏（固定底部，5 项：4 快捷 + 更多） */
  .bottom-nav{display:flex;position:fixed;left:0;right:0;bottom:0;z-index:80;
    background:#fff;border-top:1px solid var(--border);
    box-shadow:0 -2px 14px rgba(15,23,42,.10);
    padding:5px 4px calc(5px + env(safe-area-inset-bottom,0px));
    justify-content:space-around;align-items:stretch;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
  .bn-item{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;
    padding:4px 2px;color:var(--text-3);font-size:11px;cursor:pointer;border-radius:10px;
    -webkit-tap-highlight-color:transparent;user-select:none;min-width:0;overflow:hidden}
  .bn-item svg{width:22px;height:22px;flex-shrink:0}
  .bn-item span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
  .bn-item.active{color:var(--primary);font-weight:600}
  .bn-item.active svg{filter:drop-shadow(0 2px 3px rgba(37,99,235,.35))}
  .bn-item:active{background:var(--blue-bg)}
  .bn-more svg{opacity:.85}
  .bn-item .n-badge{margin-left:4px;padding:0 5px;font-size:10px}
  .bn-item .n-ro{display:none}

  /* 内容区底部留白，避免被底栏遮挡 */
  .page{padding-bottom:calc(78px + env(safe-area-inset-bottom,0px))}
  /* KPI 两列更紧凑 */
  .kpi-grid{grid-template-columns:repeat(2,1fr);gap:10px}
  .kpi .k-icon{width:38px;height:38px;border-radius:9px}
  /* 表格横向滚动更顺滑 */
  .tbl-wrap{-webkit-overflow-scrolling:touch}
  /* 触摸目标加大 */
  .btn{padding:9px 14px}
  .toolbar .btn,.card-head .btn{font-size:13px}
  .icon-btn{width:32px;height:32px}
  /* 甘特图左列在手机上略缩，主区横滑 */
  .gantt-grid{grid-template-columns:104px 1fr}
  .g-head-corner,.g-row-head{padding-left:7px;padding-right:7px}
}
@media(max-width:380px){
  .bn-item svg{width:20px;height:20px}
}

/* ===== 品质不良明细 + 拍照上传 ===== */
.q-def-list{display:flex;flex-direction:column;gap:8px;margin-bottom:8px}
.q-def-row{display:flex;flex-wrap:wrap;align-items:center;gap:6px}
.q-def-grid{display:grid;grid-template-columns:92px 1fr 72px 1fr;gap:6px;flex:1;min-width:0}
.q-row-time{display:inline-flex;align-items:center;height:32px;padding:0 8px;border-radius:6px;background:#f0f9ff;color:#0369a1;font-size:13px;font-weight:600;font-variant-numeric:tabular-nums;user-select:none}
.q-def-row .q-def-imgbox{flex-basis:100%;display:flex;gap:6px;flex-wrap:wrap;margin-top:2px;min-height:0}
.q-def-img-thumb{max-width:92px;max-height:92px;border-radius:6px;border:1px solid #e2e8f0;cursor:zoom-in}
.q-def-photo{font-size:16px;line-height:1}
.q-ph-tag{display:inline-block;font-size:12px;color:#b45309;background:#fef3c7;border-radius:4px;padding:0 5px;margin-left:2px}
.q-ph-clear{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:#fee2e2;color:#b91c1c;cursor:pointer;font-size:12px;font-weight:700}
.q-ph-lightbox{position:fixed;inset:0;background:rgba(0,0,0,.82);display:flex;align-items:center;justify-content:center;z-index:9999}
.q-ph-lightbox-in{position:relative;max-width:92vw;max-height:92vh}
.q-ph-lightbox-in img{max-width:92vw;max-height:92vh;border-radius:8px}
.q-ph-lightbox-in .q-ph-close{position:absolute;top:-14px;right:-14px;width:34px;height:34px;border-radius:50%;background:#fff;color:#000;display:flex;align-items:center;justify-content:center;cursor:pointer;font-weight:700;font-size:16px}
/* ============ 品质管理（看板 + 记录） ============ */
.q-form-4col{grid-template-columns:repeat(4,1fr)!important}
.q-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:14px}
.q-card{background:#fff;border:1px solid var(--border);border-radius:10px;padding:14px 16px}
.q-card-l{font-size:12.5px;color:var(--text-2);margin-bottom:6px}
.q-card-v{font-size:26px;font-weight:700;line-height:1}
.q-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:14px}
.q-charts{display:grid;grid-template-columns:1fr 1.45fr 1.45fr;gap:14px;margin-bottom:14px;align-items:stretch}
.qbar{display:flex;align-items:center;gap:10px;margin:9px 0;font-size:13px}
.qbar-l{flex:0 0 130px;color:var(--text-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.qbar-track{flex:1;height:14px;background:var(--gray-bg);border-radius:7px;overflow:hidden}
.qbar-track>i{display:block;height:100%;border-radius:7px;transition:width .35s ease}
.qbar-v{flex:0 0 46px;text-align:right;font-variant-numeric:tabular-nums;color:var(--text);font-weight:600}
/* 合格率环形图 */
.q-donut-card .card-head{margin-bottom:6px}
.q-donut-body{display:flex;flex-direction:column;align-items:center;gap:12px;padding:6px 4px 10px}
.q-donut{width:162px;height:162px;display:block}
.q-donut-v{font-size:27px;font-weight:800;fill:var(--text);font-variant-numeric:tabular-nums}
.q-donut-s{font-size:11px;fill:var(--text-2)}
.q-donut-legend{width:100%;display:flex;flex-direction:column;gap:9px;padding:4px 10px 0}
.q-lg{display:flex;align-items:center;gap:9px;font-size:13px;color:var(--text-2)}
.q-lg b{margin-left:auto;color:var(--text);font-variant-numeric:tabular-nums;font-weight:700}
.q-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}
@media(max-width:1100px){.q-charts{grid-template-columns:1fr;align-items:start}.q-kpis{grid-template-columns:repeat(2,1fr)}}
@media(max-width:760px){.q-kpis{grid-template-columns:repeat(2,1fr)}.qbar-l{flex-basis:90px}}

/* ============ 管理看板（总览） ============ */
.mb16{margin-bottom:16px}
.vd-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}
.vd-item{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--border);border-radius:8px;background:#f8fafc;flex-wrap:wrap}
.vd-plate{display:flex;align-items:center;gap:6px;font-size:14px}
.vd-sub{color:var(--text-2);font-size:12px;font-variant-numeric:tabular-nums}
.vd-item .tag{font-size:11px;background:var(--card);border:1px solid var(--border);padding:1px 6px;border-radius:6px}
.subtabs{display:flex;gap:6px;margin-bottom:12px;flex-wrap:wrap}
.qa-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:10px 0 4px;height:36px;padding:0 12px;background:var(--gray-bg,#f5f7fa);border:1px solid var(--border-2,#e5e9f0);border-radius:10px}
.qa-bar .qa-label{font-size:13px;color:var(--text-2,#64748b);font-weight:600;margin-right:2px}
.cc-chips{display:flex;flex-wrap:wrap;gap:6px;padding:8px;border:1px solid var(--border-2,#e5e9f0);border-radius:8px;background:var(--card,#fff)}
.cc-chip{padding:4px 12px;border:1px solid var(--border-2,#dbe2ea);background:var(--gray-bg,#f5f7fa);color:var(--text-2,#475569);border-radius:999px;font-size:13px;cursor:pointer;transition:.15s;font-family:inherit;line-height:1.4}
.cc-chip:hover{border-color:var(--primary,#2563eb);color:var(--primary,#2563eb)}
.cc-chip.on{background:var(--primary,#2563eb);border-color:var(--primary,#2563eb);color:#fff;font-weight:600}
.cc-picked{font-size:12px;color:var(--text-2,#475569);margin-top:6px;padding:4px 2px}
.cc-picked:empty::before{content:"（未选）";color:var(--text-3,#94a3b8)}
.subtab{padding:7px 16px;border:1px solid var(--border-2);background:#fff;color:var(--text-2);border-radius:8px;font-size:13px;cursor:pointer;transition:.15s;font-family:inherit}
.subtab:hover{border-color:var(--primary);color:var(--primary)}
.subtab.active{background:var(--primary);border-color:var(--primary);color:#fff}
.sum-total{font-weight:700}
.sum-total td{background:var(--gray-bg)}
.board-row{display:grid;grid-template-columns:1.55fr 1fr;gap:16px;margin-bottom:16px;align-items:stretch}
/* 订单流转看板行：4 列看板需要横向空间，给它更宽的占比；两卡按自身内容高度对齐，
   避免右侧「品质合格率」被左侧高看板拉高后底部留出大片空白 */
.board-row-kanban{grid-template-columns:2fr 1fr;align-items:start}
@media(max-width:1100px){.board-row{grid-template-columns:1fr}}
/* 核心指标行内间距已由 .kpi-grid 控制 */
/* 机台状态看板（管理看板·总览）—— 保持原有浅色卡片与内容不变，
   仅参考「机台管理」页布局：在卡片右侧放置注塑机图片（machine-photo.png，白底与白卡自然融合）。 */
.mc-board{display:grid;grid-template-columns:repeat(auto-fill,minmax(232px,1fr));gap:12px}
.mk-card{background:var(--card);border:1px solid var(--border);border-left-width:4px;border-radius:10px;padding:11px 12px;display:flex;align-items:center;gap:10px;min-height:106px;transition:box-shadow .15s,transform .15s}
.mk-card:hover{box-shadow:0 6px 18px rgba(15,23,42,.10);transform:translateY(-1px)}
.mk-info{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px}
.mk-head{display:flex;align-items:center;gap:7px}
.mk-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0}
.mk-code{font-size:15px;font-weight:700;color:var(--text)}
.mk-ton{margin-left:auto;font-size:11.5px;color:var(--text-2);background:var(--gray-bg);padding:1px 7px;border-radius:6px;white-space:nowrap}
.mk-dual{font-size:10.5px;font-weight:700;color:#fff;background:var(--violet,#7c5cff);padding:1px 7px;border-radius:6px;white-space:nowrap}
.mk-body{flex:1;display:flex;flex-direction:column;justify-content:center;min-width:0}
.mk-prod{font-size:13px;color:var(--text);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mk-prod.muted{color:var(--text-3);font-weight:400}
.mk-prog{height:7px;background:var(--gray-bg);border-radius:4px;overflow:hidden;margin:8px 0 5px}
.mk-prog>i{display:block;height:100%;border-radius:4px;background:linear-gradient(90deg,#16a34a,#22c55e)}
.mk-meta{font-size:11.5px;color:var(--text-2);white-space:nowrap}
.mk-foot{display:flex}
.mk-photo{flex:none;width:96px;height:auto;align-self:center;pointer-events:none}
@media(max-width:560px){.mc-board{grid-template-columns:1fr}.mk-photo{width:84px}}
@media(max-width:900px){.mc-visual{width:118px}.mc-code{font-size:15px}}
@media(max-width:560px){.mdeck{padding:10px}.mc-stats{grid-template-columns:1fr 1fr;gap:8px}.mc-stat{padding:10px 12px;font-size:13.5px}.mc-stat b{font-size:15px}.machine-grid{grid-template-columns:1fr}.mc-visual{width:112px}}
/* 订单流转看板 */
.ok-board{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
@media(max-width:900px){.ok-board{grid-template-columns:repeat(2,1fr)}}
.ok-col{background:var(--gray-bg);border-radius:10px;padding:8px;display:flex;flex-direction:column;min-height:140px}
.ok-col-head{display:flex;align-items:center;gap:6px;font-size:12.5px;font-weight:700;color:var(--text-2);margin-bottom:8px;padding:0 2px}
.ok-dot{width:8px;height:8px;border-radius:50%}
.ok-dot.b-orange{background:#f59e0b}.ok-dot.b-blue{background:#3b82f6}.ok-dot.b-cyan{background:#06b6d4}.ok-dot.b-green{background:#22c55e}
.ok-count{margin-left:auto;background:var(--card);border:1px solid var(--border);border-radius:10px;padding:0 8px;font-size:11px;color:var(--text);font-variant-numeric:tabular-nums}
.ok-col-body{display:flex;flex-direction:column;gap:7px;overflow-y:auto;max-height:340px}
.ok-card{background:var(--card);border:1px solid var(--border);border-radius:8px;padding:8px 9px;cursor:pointer;transition:box-shadow .15s,transform .15s}
.ok-card:hover{box-shadow:0 4px 14px rgba(15,23,42,.10);transform:translateY(-1px)}
.ok-top{display:flex;align-items:center;justify-content:space-between;gap:6px;font-size:12.5px}
.ok-top b{color:var(--text)}
.ok-cust{font-size:11.5px;color:var(--text-2);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ok-prod{font-size:12.5px;font-weight:600;color:var(--text);margin:3px 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ok-foot{display:flex;align-items:center;justify-content:space-between;font-size:11.5px;color:var(--text-2)}
.ok-foot .num{font-variant-numeric:tabular-nums;color:var(--text)}
.ok-empty{color:var(--text-3);text-align:center;font-size:12px;padding:16px 0}
.ok-more{text-align:center;font-size:11px;color:var(--text-3);padding:3px}
.ok-def-title{font-size:12px;font-weight:700;color:var(--text-2);margin:14px 0 5px}
.q-def{width:100%}
.q-def-empty{text-align:center;font-size:12px;color:var(--text-3);padding:14px 0}
/* 预警看板 */
.alert-sub{font-size:12px;font-weight:700;color:var(--text-2);margin:2px 0 8px}
.alert-mc{display:flex;flex-wrap:wrap;gap:8px;margin-top:2px}
.alert-mc-chip{display:inline-flex;align-items:center;gap:6px;background:var(--gray-bg);border-radius:8px;padding:5px 9px;font-size:12px;color:var(--text)}

/* 品质：不良现象下拉勾选 + 尺寸检验多行 */
.q-def-phen{position:relative}
.q-def-phen-btn{width:100%;text-align:left;display:flex;flex-wrap:wrap;gap:4px;align-items:center;min-height:34px;padding:4px 8px;cursor:pointer;background:var(--card)}
.q-def-phen-btn .muted{color:var(--text-3);font-size:12px}
.q-tag{display:inline-flex;align-items:center;font-size:11.5px;line-height:1.6;padding:1px 7px;border-radius:4px;background:var(--blue-bg,#e0edff);color:var(--blue,#1d4ed8);white-space:nowrap}
.q-def-phen-panel{display:none;position:absolute;z-index:60;top:calc(100% + 4px);left:0;right:0;max-height:240px;overflow:auto;background:var(--card);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px rgba(15,23,42,.16);padding:8px;display:none}
.q-def-phen-panel.open{display:block}
.q-def-phen-opt{display:flex;align-items:center;gap:7px;font-size:13px;padding:5px 6px;border-radius:6px;cursor:pointer}
.q-def-phen-opt:hover{background:var(--gray-bg)}
.q-def-phen-opt.on{background:var(--blue-bg,#e0edff)}
.q-def-phen-opt input{accent-color:var(--blue,#2563eb)}
.q-dim-list{display:flex;flex-direction:column;gap:6px;margin-bottom:8px}
.q-dim-row{display:flex;align-items:center;gap:6px}
.q-dim-grid{display:grid;grid-template-columns:92px 1fr 1fr 96px;gap:6px;flex:1;min-width:0}
.q-dim-row .icon-btn{border:none;background:transparent;color:var(--red)}
.q-dim-row .icon-btn:hover{background:var(--red-bg)}

/* 移动端：报工悬浮按钮上移，避免与底部导航栏重叠 */
@media(max-width:768px){
  .fab-report{right:calc(14px + env(safe-area-inset-right,0px));bottom:calc(70px + env(safe-area-inset-bottom,0px));height:48px;padding:0 18px;font-size:14px}
  .fab-report svg{width:18px;height:18px}
}

/* 报表中心·子文件（标签）切换 */
.rep-tabs{display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap}
/* 报表公司抬头（报表抬头）—— 出现在日报表顶部与导出表头 */
.rpt-letterhead{display:flex;flex-direction:column;align-items:center;gap:2px;padding:16px 0 12px;border-bottom:2px solid var(--primary);margin-bottom:12px}
.rpt-letterhead b{font-size:22px;font-weight:800;color:var(--text);letter-spacing:1px}
.rpt-letterhead span{font-size:13px;color:var(--text-2)}
.rep-tab{border:1px solid var(--border);background:#fff;color:var(--text-2);padding:9px 20px;border-radius:10px;font-size:13.5px;font-weight:600;cursor:pointer;transition:all .15s ease;font-family:inherit}
.rep-tab:hover{border-color:var(--primary);color:var(--primary)}
.rep-tab.active{background:var(--primary);border-color:var(--primary);color:#fff;box-shadow:0 4px 12px rgba(37,99,235,.25)}

/* ============ 键盘焦点可见（遥控器方向键导航 / 华为电视） ============ */
:focus-visible{outline:3px solid var(--primary);outline-offset:2px;border-radius:6px}
.nav-item:focus-visible{outline:3px solid #fff;outline-offset:-3px;background:var(--sidebar-active)}
@media (min-width:1920px){:focus-visible{outline-width:4px}}

/* ============ 大屏自适应放大（1920 / 2560 / 3840 等） ============ */
@media (min-width:1920px){
  body{font-size:16px}
  .sidebar{width:248px}
  .logo{padding:20px 16px}
  .logo-text b{font-size:17px}
  .nav-item{font-size:15px;padding:11px 14px}
  .nav-item svg{width:19px;height:19px}
  .topbar{height:62px;padding:0 26px}
  .topbar h1{font-size:19px}
  .page{padding:22px 28px}
  .kpi-grid{gap:16px}
  .kpi{padding:17px 19px}
  .kpi .k-val{font-size:28px}
  .kpi .k-icon{width:50px;height:50px;border-radius:12px}
  .kpi .k-label{font-size:14px}
  .card-head h3{font-size:16.5px}
  .card-body{padding:20px}
  .card-head{padding:16px 20px}
  table.tbl{font-size:14.5px}
  .tbl th,.tbl td{padding:11px 14px}
  .btn{padding:9px 16px;font-size:14px}
  .board-row{gap:20px;margin-bottom:20px}
  .mc-board{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px}
  .machine-grid{grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:16px}
  .mk-card{min-height:124px;padding:14px 16px}
  .mk-code{font-size:17px}
  .mk-photo{width:120px}
  .q-charts{gap:18px}
  .q-kpis{gap:18px}
  .ok-board{gap:14px}
  .gantt-grid{font-size:14px}
  .modal{width:680px}
  .modal.modal-lg{width:1000px}
}
@media (min-width:2560px){
  body{font-size:18px}
  .sidebar{width:288px}
  .logo{padding:24px 18px}
  .logo-text b{font-size:19px}
  .nav-item{font-size:17px;padding:13px 16px;gap:12px}
  .nav-item svg{width:22px;height:22px}
  .topbar{height:72px;padding:0 32px}
  .topbar h1{font-size:22px}
  .topbar-right{gap:18px}
  .page{padding:28px 36px}
  .kpi-grid{gap:18px}
  .kpi{padding:20px 22px}
  .kpi .k-val{font-size:34px}
  .kpi .k-icon{width:58px;height:58px;border-radius:14px}
  .kpi .k-label{font-size:16px}
  .kpi .k-val small{font-size:14px}
  .card-head h3{font-size:19px}
  .card-body{padding:24px}
  .card-head{padding:18px 22px}
  table.tbl{font-size:16px}
  .tbl th,.tbl td{padding:13px 16px}
  .btn{padding:11px 20px;font-size:15.5px;border-radius:10px}
  .btn-sm{padding:6px 13px;font-size:14px}
  .board-row{gap:24px;margin-bottom:24px}
  .mc-board{grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:20px}
  .machine-grid{grid-template-columns:repeat(auto-fill,minmax(420px,1fr));gap:20px}
  .mk-card{min-height:140px;padding:16px 20px}
  .mk-code{font-size:20px}
  .mk-photo{width:140px}
  .q-charts{gap:22px}
  .q-kpis{gap:22px}
  .ok-board{gap:16px}
  .gantt-grid{font-size:16px}
  .g-day .d{font-size:16px}
  .modal{width:760px}
  .modal.modal-lg{width:1100px}
  .fab-report{height:62px;padding:0 26px;font-size:17px}
}
@media (min-width:3840px){
  body{font-size:22px}
  .sidebar{width:340px}
  .logo{padding:30px 22px}
  .logo-text b{font-size:23px}
  .logo-text span{font-size:13px}
  .nav-item{font-size:20px;padding:16px 20px;gap:14px}
  .nav-item svg{width:26px;height:26px}
  .topbar{height:88px;padding:0 40px}
  .topbar h1{font-size:27px}
  .topbar-right{gap:22px}
  .page{padding:34px 46px}
  .kpi-grid{gap:22px}
  .kpi{padding:24px 26px}
  .kpi .k-val{font-size:42px}
  .kpi .k-icon{width:72px;height:72px;border-radius:16px}
  .kpi .k-label{font-size:19px}
  .kpi .k-val small{font-size:16px}
  .card-head h3{font-size:23px}
  .card-body{padding:30px}
  .card-head{padding:22px 28px}
  table.tbl{font-size:19px}
  .tbl th,.tbl td{padding:16px 20px}
  .btn{padding:14px 26px;font-size:19px;border-radius:12px}
  .btn-sm{padding:8px 16px;font-size:17px}
  .board-row{gap:30px;margin-bottom:30px}
  .mc-board{grid-template-columns:repeat(auto-fill,minmax(380px,1fr));gap:24px}
  .machine-grid{grid-template-columns:repeat(auto-fill,minmax(500px,1fr));gap:24px}
  .mk-card{min-height:170px;padding:20px 24px}
  .mk-code{font-size:24px}
  .mk-photo{width:170px}
  .q-charts{gap:28px}
  .q-kpis{gap:28px}
  .ok-board{gap:20px}
  .gantt-grid{font-size:19px}
  .g-day .d{font-size:19px}
  .modal{width:900px}
  .modal.modal-lg{width:1300px}
  .fab-report{height:74px;padding:0 32px;font-size:20px}
}

/* ============ 电视看板模式（车间大屏 / 华为电视墙） ============ */
body.tv{overflow:hidden;cursor:none}
body.tv ::-webkit-scrollbar{width:0;height:0}
body.tv .sidebar,body.tv .topbar,body.tv .fab-report,body.tv .bottom-nav,body.tv .sb-mask{display:none!important}
body.tv .app{display:block}
body.tv .main{margin-left:0!important;width:100%;height:100vh}
body.tv .page{height:100vh;overflow:auto;padding:96px 40px 40px}
.tv-bar{position:fixed;top:0;left:0;right:0;z-index:200;display:none;align-items:center;gap:20px;padding:16px 32px;background:linear-gradient(90deg,#0c1729,#1e3a8a);color:#fff;box-shadow:0 2px 18px rgba(2,8,23,.28)}
body.tv .tv-bar{display:flex}
.tv-bar-title{font-size:clamp(16px,1.6vw,26px);font-weight:800;letter-spacing:1px;white-space:nowrap}
.tv-bar-clock{margin-left:auto;font-size:clamp(13px,1.2vw,18px);font-variant-numeric:tabular-nums;opacity:.92;white-space:nowrap}
.tv-exit{opacity:0;pointer-events:none;transition:opacity .2s;border:1px solid rgba(255,255,255,.45);background:rgba(255,255,255,.1);color:#fff;border-radius:10px;padding:9px 18px;font-size:15px;cursor:pointer;font-family:inherit}
body.tv.tv-awake .tv-exit{opacity:1;pointer-events:auto}
body.tv.tv-awake{cursor:auto}
/* 电视模式：以紧凑尺寸铺满大屏，确保一屏显示更多内容（克制放大，抵消 2K/4K 媒体查询的膨胀） */
.app.tv{font-size:15px}
.app.tv .page{padding:88px 32px 32px}
.app.tv .kpi-grid{gap:14px}
.app.tv .kpi{padding:14px 16px}
.app.tv .kpi .k-val{font-size:clamp(22px,2.2vw,38px);line-height:1.12}
.app.tv .kpi .k-val small{font-size:.5em}
.app.tv .kpi .k-icon{width:46px;height:46px;border-radius:11px}
.app.tv .kpi .k-icon svg{width:22px;height:22px}
.app.tv .kpi .k-label{font-size:14px}
.app.tv .card-head{padding:13px 18px}
.app.tv .card-head h3{font-size:18px}
.app.tv .card-body{padding:16px 18px}
.app.tv .mc-board{grid-template-columns:repeat(auto-fill,minmax(252px,1fr));gap:14px}
.app.tv .mk-card{min-height:106px;padding:12px 14px}
.app.tv .mk-code{font-size:16px}
.app.tv .mk-photo{width:102px}
.app.tv .machine-grid{grid-template-columns:repeat(auto-fill,minmax(312px,1fr));gap:14px}
.app.tv .ok-board{gap:12px}
.app.tv .ok-col-body{max-height:300px}
.app.tv .board-row{gap:16px;margin-bottom:16px}
.app.tv .board-row-kanban{grid-template-columns:2.2fr 1fr}
.app.tv .q-charts,.app.tv .q-kpis{gap:14px}
.app.tv .tbl th,.app.tv .tbl td{padding:9px 12px}
.app.tv table.tbl{font-size:14px}
.app.tv .btn{padding:7px 14px;font-size:13.5px;border-radius:8px}
.app.tv .btn-sm{padding:5px 11px;font-size:12.5px}
@media (min-width:1920px){.tv-bar{padding:16px 32px}}

/* ============ 电视场景：机台管理页同样一屏排更多（目标 6 台/行） ============
 * body.tv-env 由 js/app.js 在识别到电视/大屏（含已进入电视模式）时打上，普通电脑不受影响。
 * 缩放 55% 后逻辑宽度约 1745px，收窄列宽 + 收起侧边栏（让出约 150px）后即可排到 6 列。 */
body.tv-env .page{padding:14px 14px}
body.tv-env .machine-grid{grid-template-columns:repeat(auto-fill,minmax(254px,1fr));gap:11px}
body.tv-env .mdeck .mc-stats{grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:8px;margin-bottom:11px}
body.tv-env .mc-stat{padding:9px 12px;font-size:14px}
body.tv-env .mcard{padding:10px 11px;border-radius:11px}
body.tv-env .mc-top{gap:8px}
body.tv-env .mc-visual{width:96px}
body.tv-env .mc-code{font-size:15px}
body.tv-env .mc-type{font-size:14px}
body.tv-env .mcard .mc-meta{margin-top:8px;padding-top:7px;gap:2px 10px;font-size:11px}
body.tv-env .mcard .mc-meta .mi{flex:1 1 100%;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
body.tv-env .mc-brand{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
body.tv-env .mcard .mc-load{margin-top:7px;gap:6px;flex-wrap:wrap}
body.tv-env .mcard .mc-load .load-bar{flex:1 1 100%}
body.tv-env .mcard .mc-load .prog-txt{font-size:10px}
body.tv-env .mcard .mc-foot{margin-top:8px;gap:6px}
body.tv-env .mcard .mc-foot .select{font-size:11.5px;padding:3px 5px}
body.tv-env .mcard .mc-foot .btn{padding:4px 8px;font-size:11.5px}
body.tv-env .mc-none{padding:28px}

/* ============ 显示比例：整页缩放（电视 / 大屏 / 远距离观看） ============
 * 电视浏览器常只给出很小的 CSS 视口（如 960×540），再放大到 65 吋屏幕上，
 * 于是「字和图标巨大、一屏装不下几个卡片」。
 * 这里用整页 zoom 缩小渲染比例 —— zoom 会改变排版宽度，因此不只是变小，
 * 还会让网格重排出更多列（transform:scale 做不到这一点）。
 * --ui-zoom 由 js/app.js 的「显示比例」模块写入（默认 1）。 */
html{zoom:var(--ui-zoom,1)}
/* 缩放后整屏高度要用 100vh / zoom 补齐（vh 不随 zoom 变化） */
html body .app{height:calc(100vh / var(--ui-zoom,1))}
html body.tv .main{height:calc(100vh / var(--ui-zoom,1))}
html body.tv .page{height:calc(100vh / var(--ui-zoom,1))}
/* 顶栏「显示比例」下拉 */
.zoom-ctl{flex:none;display:inline-flex;align-items:center;gap:5px;height:32px;box-sizing:border-box;padding:0 6px 0 9px;
  border:1px solid var(--border);border-radius:8px;background:#fff;color:#64748b;cursor:pointer}
.zoom-ctl svg{flex:none;display:block}
.zoom-sel{border:none;background:transparent;font-family:inherit;font-size:13px;color:var(--text);outline:none;cursor:pointer;padding:0;max-width:118px}
/* 电视模式下顶栏隐藏，比例控件改挂到 .tv-bar（深色） */
.tv-zoom{flex:none;margin-left:auto;display:inline-flex;align-items:center;gap:6px;
  border:1px solid rgba(255,255,255,.45);background:rgba(255,255,255,.1);color:#fff;border-radius:10px;padding:7px 12px;white-space:nowrap}
.tv-zoom svg{flex:none;display:block}
.tv-zoom select{border:none;background:transparent;color:#fff;font-family:inherit;font-size:15px;outline:none;cursor:pointer;padding:0;max-width:160px}
.tv-zoom select option{color:#0f172a;background:#fff}
.tv-bar-clock{margin-left:14px}

/* ============ 订单管理 · 待排产池 ============ */
.pend-pool{background:linear-gradient(180deg,var(--orange-bg) 0%,var(--card) 46%);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);margin-bottom:16px;padding:14px 16px 16px;position:relative;overflow:hidden}
.pend-pool::before{content:'';position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--orange)}
.pp-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:12px}
.pp-title{display:inline-flex;align-items:center;gap:8px;font-size:15.5px;font-weight:700;color:var(--text)}
.pp-title .pp-ico{display:inline-flex;color:var(--orange)}
.pp-count{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:22px;padding:0 8px;border-radius:20px;background:var(--orange);color:#fff;font-size:12.5px;font-weight:700}
.pp-summary{display:flex;align-items:center;gap:14px;color:#64748b;font-size:13px}
.pp-summary b{color:var(--text);font-weight:700}
.pp-summary .pp-danger{color:var(--red);font-weight:700}
.pp-head .spacer{flex:1}
.pp-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(232px,1fr));gap:12px}
.pp-card{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:11px 12px;display:flex;flex-direction:column;gap:6px;transition:border-color .15s,box-shadow .15s,transform .1s}
.pp-card:hover{border-color:var(--orange);box-shadow:0 4px 14px rgba(245,158,11,.16)}
.pp-card.pp-overdue{border-color:var(--red)}
.pp-top{display:flex;align-items:center;justify-content:space-between;gap:8px}
.pp-no{font-weight:700;font-size:14px;color:var(--text);font-family:var(--mono,monospace)}
.pp-cust{font-size:13px;color:var(--text);font-weight:600}
.pp-prod{font-size:12.5px;color:#64748b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pp-meta{display:flex;gap:14px;font-size:12px;color:#475569}
.pp-meta b{color:var(--text);font-weight:700}
.pp-due{font-size:12px;color:#475569;display:flex;align-items:center;gap:6px}
.pp-due.danger{color:var(--red);font-weight:600}
.pp-due .pp-tag{margin-left:auto;font-size:10.5px;padding:1px 6px;border-radius:5px;background:var(--red-bg);color:var(--red);font-weight:700}
.pp-actions{display:flex;gap:8px;margin-top:2px}
.pp-actions .btn{flex:1;justify-content:center}
.pp-empty{padding:26px;text-align:center;color:#94a3b8;font-size:13.5px}
.pp-empty .pp-ok{display:inline-flex;align-items:center;gap:6px;color:var(--green)}
@media(max-width:560px){.pend-pool{padding:12px}.pp-grid{grid-template-columns:1fr 1fr}.pp-summary{width:100%;gap:10px}}

/* ============ 甘特图：任务块右边缘拖拽调时长 ============ */
.g-resize{position:absolute;right:-1px;top:0;bottom:0;width:10px;cursor:ew-resize;z-index:9;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .15s}
.g-resize::after{content:'';width:3.5px;height:14px;border-radius:2px;background:rgba(255,255,255,.85);box-shadow:0 0 3px rgba(2,8,23,.4)}
.g-task:hover .g-resize{opacity:1}
.g-task.resizing{cursor:ew-resize;opacity:.9;z-index:22;box-shadow:0 6px 18px rgba(2,8,23,.28)}
.g-task.resizing .g-main{opacity:.65}

/* ============ 试模管理：模具试模主线（以模具归集） ============ */
.ov-sub{font-size:12.5px;font-weight:700;color:var(--text-2);margin:14px 2px 8px}
.mold-ov{padding:12px 14px;margin-bottom:14px}
.mold-ov .ov-head{font-size:13px;font-weight:700;color:var(--text);margin-bottom:10px}
.ov-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px}
.ov-card{background:var(--bg);border:1px solid var(--border);border-radius:10px;padding:10px 12px}
.ov-mold{font-size:13px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:8px}
.ov-mold .muted{font-size:11.5px}
.ov-steps{display:flex;align-items:center;flex-wrap:wrap;gap:2px;margin-bottom:9px}
.ov-t{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:22px;padding:0 5px;font-size:11.5px;font-weight:700;border-radius:6px;background:#fff;border:1px solid var(--border-2);color:var(--text-2)}
.ov-t.ok{background:var(--green-bg);border-color:#86efac;color:#15803d}
.ov-t.do{background:var(--orange-bg);border-color:#fcd34d;color:#b45309}
.ov-t.pending{background:var(--blue-bg);border-color:#bfdbfe;color:#1d4ed8}
.ov-t.miss{background:#f1f5f9;border-style:dashed;color:#cbd5e1}
.ov-arrow{color:var(--text-3);font-size:11px;margin:0 1px}
.ov-foot{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.ov-next{font-size:12px}

/* 申请弹窗：自动带出的前轮问题点与改善方案 */
.prev-issues{margin:4px 0 2px}
.pi-head{font-size:12.5px;font-weight:700;color:var(--text);margin-bottom:6px}
.pi-item{background:var(--bg);border:1px solid var(--border);border-left:3px solid var(--orange);border-radius:8px;padding:7px 10px;margin-bottom:6px}
.pi-t{font-size:11.5px;font-weight:700;color:var(--text-2);margin-bottom:4px}
.pi-row{display:flex;gap:8px;font-size:12px;line-height:1.6;margin:2px 0}
.pi-k{flex:0 0 56px;color:var(--text-3);font-weight:600}
.pi-v{flex:1;color:var(--text);word-break:break-word}
.pi-v.muted{color:var(--text-3)}

/* 试模问题图片：缩略图 + 点击放大 */
.td-imgs{display:flex;gap:8px;flex-wrap:wrap}
.td-img{width:92px;height:92px;object-fit:cover;border-radius:8px;border:1px solid var(--border);cursor:pointer;transition:transform .15s,box-shadow .15s}
.td-img:hover{transform:translateY(-2px);box-shadow:0 4px 14px rgba(2,8,23,.18)}
.td-img.big{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:auto;max-width:90vw;max-height:88vh;height:auto;z-index:9999;box-shadow:0 12px 40px rgba(0,0,0,.4);border-color:#fff}

/* 试模轮次快捷勾选 T0~T9 */
.tno-chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.tno-chip{height:26px;padding:0 12px;border-radius:14px;border:1px solid var(--line,#d8dee9);background:var(--bg,#fff);color:var(--text-2,#475569);font-size:12px;font-weight:600;cursor:pointer;transition:all .15s}
.tno-chip:hover{border-color:var(--violet,#7c5cff);color:var(--violet,#7c5cff)}
.tno-chip.on{background:var(--violet,#7c5cff);border-color:var(--violet,#7c5cff);color:#fff;box-shadow:0 2px 8px rgba(124,92,255,.35)}

/* 试模单：物料需求可增删列表 */
.mat-row{display:grid;grid-template-columns:1fr 1fr 1fr 92px auto 30px;gap:8px;margin-bottom:8px;align-items:center}
.mat-row .input,.mat-row .mat-unit{padding:7px 9px}
.mat-total{font-size:11.5px;font-weight:700;color:var(--warn,#d97706);white-space:nowrap;min-width:64px;line-height:1.3}
.mat-del{flex:0 0 auto;width:28px;height:28px;border-radius:8px;border:1px solid var(--bd,#e2e8f0);background:var(--bg,#fff);color:var(--red,#dc2626);font-size:15px;line-height:1;cursor:pointer}
.mat-del:hover{background:var(--red,#dc2626);color:#fff}
.mat-tag{display:inline-block;margin:2px 6px 2px 0;padding:3px 10px;border-radius:8px;background:var(--bg,#f1f5f9);border:1px solid var(--bd,#e2e8f0);font-size:12px;color:var(--text,#334155)}
.td-mats{margin-bottom:10px}

/* 车辆到期提醒（管理看板） */
.veh-alert-list{display:flex;flex-direction:column;gap:7px;max-height:240px;overflow:auto}
.veh-alert-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;padding:5px 0;border-bottom:1px dashed var(--border)}
.veh-alert-row:last-child{border-bottom:none}
.veh-alert-row .tag{font-size:11px}

/* ERP 模块（供应商 / 采购 / 库存） */
.table .num{font-variant-numeric:tabular-nums;text-align:right}
.tag.ok{background:rgba(16,185,129,.12);color:#0f9d6b;border:1px solid rgba(16,185,129,.3)}
.tag.warn{background:rgba(245,158,11,.14);color:#c2710a;border:1px solid rgba(245,158,11,.35)}
.danger-text{color:#dc2626;font-weight:600}
.warn-h{color:#c2710a;font-weight:600}
.ok-box{color:#0f9d6b;font-weight:500}
.table.sub{background:var(--bg,#f8fafc);margin:6px 0}
.table.sub td,.table.sub th{padding:6px 10px;font-size:12px}
.po-detail td{border-top:none;padding:0 12px 8px}

/* 齐套性 (BOM) 相关 */
.bom-editor{margin-top:14px;padding:12px 14px;background:var(--bg,#f8fafc);border:1px solid var(--border,#e2e8f0);border-radius:10px}
.bom-editor .bom-head{font-weight:600;font-size:14px;margin-bottom:4px}
.bom-row{display:flex;gap:8px;align-items:center;margin:6px 0;flex-wrap:wrap}
.bom-row .input{flex:1;min-width:120px}
.bom-row .bom-code{min-width:170px;font-weight:600}
.bom-row .bom-qty{max-width:110px}
.bom-row .bom-unit{max-width:90px}
.bom-empty{font-size:12.5px;color:var(--text-3,#94a3b8);padding:6px 0}
.bom-editor .icon-btn{width:30px;height:30px}

.pp-kitrow{display:flex;margin:2px 0 4px}
.pp-kit{display:inline-block;font-size:11px;padding:2px 8px;border-radius:10px;font-weight:600}
.pp-kit.kit-ready{background:rgba(16,185,129,.14);color:#0f9d6b;border:1px solid rgba(16,185,129,.3)}
.pp-kit.kit-short{background:rgba(220,38,38,.14);color:#dc2626;border:1px solid rgba(220,38,38,.35)}
.pp-kit.kit-nobom{background:rgba(100,116,139,.14);color:#64748b;border:1px solid rgba(100,116,139,.3)}

.g-short{position:absolute;top:-7px;right:-7px;width:18px;height:18px;border-radius:50%;background:#dc2626;color:#fff;font-style:normal;font-size:12px;line-height:18px;text-align:center;z-index:5;box-shadow:0 1px 3px rgba(0,0,0,.3)}
.g-qc{position:absolute;bottom:-7px;right:-7px;width:18px;height:18px;border-radius:50%;color:#fff;font-style:normal;font-size:12px;line-height:18px;text-align:center;z-index:5;box-shadow:0 1px 3px rgba(0,0,0,.3)}
.g-qc-fail{background:#dc2626}
.g-qc-pending{background:#f59e0b}
.g-qc-rework{background:#7c3aed}
.qc-badge{display:inline-block;font-size:11px;padding:2px 8px;border-radius:10px;font-weight:600;margin-right:4px;white-space:nowrap}
.qc-pass{background:rgba(16,185,129,.14);color:#0f9d6b;border:1px solid rgba(16,185,129,.3)}
.qc-fail{background:rgba(220,38,38,.14);color:#dc2626;border:1px solid rgba(220,38,38,.35)}
.qc-pending{background:rgba(245,158,11,.16);color:#b45309;border:1px solid rgba(245,158,11,.35)}

/* ===== 权限管理：导航「仅查看」角标 + 权限勾选网格 ===== */
.n-ro{display:inline-flex;align-items:center;justify-content:center;margin-left:6px;font-size:10px;line-height:1;padding:2px 4px;border-radius:4px;background:rgba(234,88,12,.16);color:#ea580c;font-weight:600}
.perm-toolbar{display:flex;gap:8px;align-items:center;margin-bottom:10px;flex-wrap:wrap}
.perm-grid{display:flex;flex-direction:column;gap:4px;max-height:calc(100vh - 330px);min-height:220px;overflow:auto;padding-right:4px}
.perm-grid > *{flex:none}
.perm-grid::-webkit-scrollbar{width:8px}
.perm-grid::-webkit-scrollbar-thumb{background:#c7d0de;border-radius:4px}
.perm-grid::-webkit-scrollbar-thumb:hover{background:#a8b4c6}

/* ===== 三级菜单：数据管理子模块（侧边栏 + 页内 Tab） ===== */
.n-caret{margin-left:auto;width:0;height:0;border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid currentColor;opacity:.55;transition:transform .15s;flex-shrink:0}
.n-caret.open{transform:rotate(180deg)}
.nav-subs{margin:0 0 4px;padding-left:16px}
.nav-subitem{padding:6px 10px;font-size:12.5px;margin-bottom:1px;border-radius:6px;gap:7px}
.nav-subitem .s-dot{width:5px;height:5px;border-radius:50%;background:currentColor;opacity:.55;flex-shrink:0}
.app.sb-collapsed .nav-subs{display:none}
.subtabs{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px}
.subtab{border:1px solid var(--border);background:#fff;color:#475569;border-radius:18px;padding:6px 16px;font-size:13px;cursor:pointer;transition:all .15s}
.subtab:hover{border-color:var(--primary);color:var(--primary)}
.subtab.active{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}
.perm-group{font-size:12px;color:#8a94a6;margin:8px 0 4px;font-weight:600}
.perm-items{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:6px 10px}
.perm-items label{display:flex;align-items:center;gap:6px;font-size:13px;padding:6px 8px;border:1px solid var(--line,#e5e9f2);border-radius:8px;cursor:pointer;user-select:none;background:var(--card,#fff)}
.perm-items label:hover{background:rgba(59,130,246,.07)}
.perm-items input{accent-color:var(--primary,#3b82f6)}
.role-card{border:1px solid var(--line,#e5e9f2);border-radius:10px;padding:10px 12px;margin-bottom:10px;background:var(--card,#fff)}
.role-card-h{display:flex;align-items:center;gap:6px}
.rp{display:inline-flex;align-items:center;gap:5px;margin:4px 14px 4px 0;font-size:13px;white-space:nowrap;cursor:pointer;user-select:none}
/* 模块 → 子模块 树形权限网格（角色模板） */
.perm-mod{border:1px solid var(--border,#e2e8f0);border-radius:10px;margin-bottom:8px;overflow:hidden;background:var(--card,#fff)}
.pm-row{display:flex;align-items:center;gap:10px;padding:9px 12px;background:rgba(59,130,246,.07);border-bottom:1px solid var(--border,#e2e8f0)}
.pm-name{font-size:13.5px;font-weight:700}
.pm-count{font-size:11.5px;margin-left:2px}
.pm-boxes{margin-left:auto;display:flex;gap:16px;font-size:12.5px;white-space:nowrap}
.pm-boxes label,.ps-boxes label{display:inline-flex;align-items:center;gap:5px;cursor:pointer;user-select:none;white-space:nowrap}
.perm-mod input{accent-color:var(--primary,#3b82f6)}
.perm-subs{padding:2px 12px 6px}
.ps-row{display:flex;align-items:center;gap:10px;padding:6px 0 6px 14px;border-top:1px dashed var(--border,#eef2f7)}
.ps-row.ps2{padding-left:38px;position:relative}
.ps-row.ps2::before{content:'';position:absolute;left:18px;top:50%;width:14px;height:1px;background:#c3cede}
.ps-row.ps2 .ps-name{color:#64748b;font-size:12.5px}
.ps-row:first-child{border-top:none}
.ps-name{font-size:13px;min-width:76px}
.ps-boxes{margin-left:auto;display:flex;gap:16px;font-size:12.5px;white-space:nowrap}
.rp input{margin:0;accent-color:var(--primary,#3b82f6)}

.reimb-filter { position: relative; display: inline-block; }
.rt-panel { position: absolute; right: 0; top: 100%; z-index: 60; background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; box-shadow: 0 8px 24px rgba(2,8,23,.14); margin-top: 6px; min-width: 158px; display: none; text-align: left; }
.rt-panel label { display: flex; align-items: center; gap: 6px; padding: 4px 2px; cursor: pointer; font-size: 13px; white-space: nowrap; color: var(--text); }
.rt-panel input[type=checkbox] { width: 15px; height: 15px; cursor: pointer; }
.rt-panel #reimbTypeClear { margin-top: 6px; }
.reimb-filter-hint { font-size: 12px; color: var(--text-3); margin: 4px 0 8px; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.reimb-filter-hint .tag { background: var(--accent-soft, #eef2ff); color: var(--accent, #3b5bdb); border: 1px solid var(--accent, #3b5bdb); }

/* ============ 费用审核工作流（2026-10-08） ============
 * 审核弹窗：只读详情网格 + 审核意见 + 通过/退回按钮。 */
.btn-xs { padding: 3px 9px; font-size: 12px; line-height: 1.6; border-radius: 6px; }
.rev-detail { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 16px; background: var(--bg-2, #f5f7fa); border: 1px solid var(--border-2, #e3e7ee); border-radius: 10px; padding: 12px 14px; margin-bottom: 4px; }
.rev-detail .kv { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.rev-detail .kv.full { grid-column: 1 / -1; }
.rev-detail .kv > span { font-size: 11.5px; color: var(--text-3, #8a93a6); }
.rev-detail .kv > b { font-size: 13.5px; font-weight: 600; word-break: break-word; }
.review-actions { display: flex; gap: 10px; }
.review-action-wrap { margin-top: 10px; }

@media (max-width: 768px) {
  .rev-detail { grid-template-columns: 1fr; }
}

/* ============ 手机端表单适配（2026-10-08） ============
 * 1) 输入字号 ≥16px：iOS/微信 webview 对 <16px 输入框聚焦会自动放大页面，
 *    缩放扰动会导致键入的数字乱序/反序 —— 除 viewport maximum-scale=1 外的双重保险。
 * 2) 费用组栅格（高速/停车/保养）在窄屏改为两列堆叠，附件整行，避免金额框被压到极窄。 */
@media (max-width: 768px) {
  .input, .select { font-size: 16px; }
  .grp-grid { grid-template-columns: 1fr 1fr !important; }
  .grp-grid .att-cell { grid-column: 1 / -1; }
  .grp-grid .tg-del { justify-self: end; }
  /* 通知中心下拉：近全屏面板 + 列表自适应滚动 */
  .notice-drop { position: fixed; top: 54px; left: 8px; right: 8px; width: auto; max-width: none; }
  .nd-list { max-height: calc(100vh - 150px); -webkit-overflow-scrolling: touch; }
  .nd-item { padding: 11px 12px; }
  .nd-item .nd-t { font-size: 13px; }
  .nd-item .nd-m { font-size: 12.5px; }
  .nd-head { padding: 11px 12px; }
}

/* ============ 报销管理·科技感版面（2026-10-08） ============ */
.veh-hero { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: 12px 0 0; height: 36px; padding: 0 16px; border-radius: 14px; border: 1px solid var(--border); background: linear-gradient(100deg, #eef4ff 0%, #f8fbff 45%, #eefbf3 100%); box-shadow: 0 1px 2px rgba(15, 23, 42, .04); }
.veh-hero .subtabs { margin-bottom: 0; }
.veh-hero .vh-title { display: flex; align-items: center; gap: 8px; font-size: 14.5px; font-weight: 800; color: #0f2a5f; letter-spacing: .5px; }
.veh-hero .vh-dot { width: 9px; height: 9px; border-radius: 50%; background: linear-gradient(135deg, #2563eb, #06b6d4); box-shadow: 0 0 0 3px rgba(37, 99, 235, .15); flex-shrink: 0; }
.veh-hero .vh-note { font-size: 11.5px; color: var(--text-3); }
.vh-seg { display: inline-flex; background: #fff; border: 1px solid var(--border); border-radius: 9px; padding: 2px; gap: 2px; }
.vh-seg button { border: none; background: transparent; cursor: pointer; font-size: 12.5px; padding: 5px 12px; border-radius: 7px; color: var(--text-3); font-weight: 600; transition: all .15s; font-family: inherit; }
.vh-seg button.on { background: linear-gradient(135deg, #2563eb, #3b82f6); color: #fff; box-shadow: 0 2px 6px rgba(37, 99, 235, .35); }
/* KPI 卡片：auto-fit 自适应等分 —— 4~5 张卡片自动调节尺寸排满同一行；宽度不足时按最小宽 graceful 换行不溢出 */
.veh-kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(148px, 1fr)); gap: 8px; margin: 8px 0 0; }
.veh-kpi { position: relative; display: flex; align-items: center; gap: 9px; padding: 9px 12px; border-radius: 12px; border: 1px solid var(--border); background: linear-gradient(135deg, #ffffff 55%, #f4f8ff); box-shadow: 0 1px 3px rgba(15, 23, 42, .05); overflow: hidden; min-width: 0; }
.veh-kpi::after { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; }
.vk-blue::after { background: linear-gradient(90deg, #2563eb, #38bdf8); }
.vk-violet::after { background: linear-gradient(90deg, #7c3aed, #c084fc); }
.vk-orange::after { background: linear-gradient(90deg, #ea580c, #fbbf24); }
.vk-green::after { background: linear-gradient(90deg, #059669, #34d399); }
.vk-red::after { background: linear-gradient(90deg, #dc2626, #f87171); }
.veh-kpi .vk-ico { width: 34px; height: 34px; border-radius: 9px; display: flex; align-items: center; justify-content: center; font-size: 16px; flex-shrink: 0; }
.vk-blue .vk-ico { background: #eff6ff; }
.vk-violet .vk-ico { background: #f5f3ff; }
.vk-orange .vk-ico { background: #fff7ed; }
.vk-green .vk-ico { background: #ecfdf5; }
.vk-red .vk-ico { background: #fef2f2; }
.veh-kpi .vk-body { min-width: 0; }
.veh-kpi .k-label { font-size: 11px; color: var(--text-3); font-weight: 600; white-space: normal; }
.veh-kpi .k-val { font-size: 17px; font-weight: 800; color: var(--text); font-variant-numeric: tabular-nums; line-height: 1.15; white-space: normal; overflow-wrap: anywhere; }
.veh-kpi .k-val small { font-size: 11px; font-weight: 600; color: var(--text-3); }
.veh-kpi .k-sub { font-size: 10.5px; color: var(--text-3); margin-top: 0; overflow-wrap: break-word; }
/* 图表卡：复用 KPI 卡外壳（顶部色条+圆角+边框+阴影）；内部纵向 flex——标题横排一行，
   主内容区（环形图 + 图例）水平一行分布，图例各项垂直堆叠、间距一致 */
.veh-kpi.vk-chart { display: flex; flex-direction: column; gap: 3px; padding: 8px 10px; }
.veh-kpi.vk-chart .agg-chart-t { flex-shrink: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.veh-kpi.vk-chart > svg { display: block; width: 100%; height: 108px; }   /* 趋势柱状图：标题下整卡宽 */
.veh-kpi.vk-chart .agg-legend { flex: 1; width: 100%; min-width: 0; display: flex; flex-direction: row; flex-wrap: wrap; align-items: flex-end; justify-content: space-around; gap: 3px 2px; margin-top: 2px; font-size: 10px; padding: 2px 2px 0; }
.veh-kpi.vk-chart .agg-lg { display: flex; flex-direction: column; align-items: center; gap: 3px; min-width: 0; max-width: 100%; }
.veh-kpi.vk-chart .agg-lg .agg-t { writing-mode: vertical-rl; text-orientation: sideways; white-space: nowrap; max-height: 76px; overflow: hidden; text-overflow: ellipsis; line-height: 1.1; color: #475569; }
.veh-kpi.vk-chart .agg-lg i { flex: 0 0 auto; }
/* 修复 vk-teal 缺少顶部色条与图标底色（与 KPI 家族统一） */
.vk-teal::after { background: linear-gradient(90deg, #0d9488, #2dd4bf); }
.vk-teal .vk-ico { background: #ecfdf5; }
/* 中窄屏（平板/小窗）：压缩卡片内边距与图标，尽量保持一行 */
@media (min-width: 769px) and (max-width: 1180px) {
  .veh-kpis { gap: 9px; }
  .veh-kpi { padding: 12px; gap: 9px; }
  .veh-kpi .vk-ico { width: 34px; height: 34px; font-size: 16px; border-radius: 9px; }
}
@media (max-width: 768px) {
  .veh-kpis { grid-template-columns: 1fr 1fr; gap: 9px; }
  .veh-kpi { padding: 11px 12px; gap: 9px; }
  /* 奇数张卡片时最后一张独占整行，避免半宽错位 */
  .veh-kpi:last-child:nth-child(odd) { grid-column: 1 / -1; }
  /* 图表卡在窄屏独占整行，保证图表可读 */
  .veh-kpi.vk-chart { grid-column: 1 / -1; }
  .veh-kpi .vk-ico { width: 34px; height: 34px; font-size: 16px; border-radius: 9px; }
  .veh-hero { height: auto; padding: 8px 12px; }
  .qa-bar { height: auto; padding: 8px 12px; }
  .vh-seg button { padding: 5px 9px; }
}

/* ============ 分页（分面）控件 ============ */
.pager-wrap { margin: 14px 2px 4px; }
.pager {
  display: flex; align-items: center; flex-wrap: wrap; gap: 6px;
  padding: 8px 12px; background: var(--card, #fff); border: 1px solid var(--border, #e6e9f0);
  border-radius: 10px; font-size: 13px;
}
.pager-single { color: var(--text-3); }
.pager .pg-info { margin-right: auto; color: var(--text-3); font-size: 12.5px; white-space: nowrap; }
.pg-btn {
  min-width: 32px; height: 30px; padding: 0 9px; border: 1px solid var(--border-2, #d5d9e0);
  background: #fff; color: var(--text); border-radius: 7px; cursor: pointer; font-size: 13px;
  transition: all .15s; line-height: 1;
}
.pg-btn:hover:not(:disabled) { border-color: var(--primary, #3b6cf6); color: var(--primary, #3b6cf6); }
.pg-btn.active { background: var(--primary, #3b6cf6); border-color: var(--primary, #3b6cf6); color: #fff; font-weight: 700; }
.pg-btn:disabled { opacity: .4; cursor: not-allowed; }
.pg-gap { color: var(--text-3); padding: 0 2px; }
.pg-jump { display: inline-flex; align-items: center; gap: 5px; color: var(--text-3); margin-left: 4px; }
.pg-jump .pg-input { width: 56px; height: 28px; border: 1px solid var(--border-2, #d5d9e0); border-radius: 6px; padding: 0 8px; font-size: 13px; text-align: center; }
@media (max-width: 768px) {
  .pager { padding: 8px 10px; gap: 5px; font-size: 12.5px; justify-content: center; }
  .pager .pg-info { width: 100%; margin: 0 0 4px; text-align: center; font-size: 12px; }
  .pg-btn { min-width: 30px; height: 28px; padding: 0 7px; }
  .pg-jump { margin-left: 0; }
  .pg-jump .pg-input { width: 48px; }
}

/* ===== 周期报销汇总 · 按报销人分组 + 付款 ===== */
.agg-payees { display: flex; flex-direction: column; gap: 14px; }
.payee-card { border: 1px solid var(--border-2, #e3e6ec); border-radius: 12px; padding: 12px 14px; background: var(--bg-1, #fff); box-shadow: 0 1px 3px rgba(20,30,50,.04); }
.payee-head { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; }
.payee-head .num { color: var(--bz-amber, #b45309); }
.payee-sub { font-size: 12.5px; color: var(--text-2, #5b6472); margin: 4px 0 10px; }
.payee-catsum { margin-top: 10px; font-size: 12.5px; }
.payee-catsum summary { cursor: pointer; color: var(--text-2, #5b6472); }
.payee-catsum table.mini { margin-top: 8px; width: auto; }
.payee-catsum table.mini td { padding: 4px 10px; }
.payee-pay { margin-top: 10px; text-align: right; }
.pay-zone { margin-top: 16px; padding: 14px 16px; border-radius: 12px; }
.pay-zone.ok { background: #ecfdf3; border: 1px solid #a7f3d0; }
.pay-zone.pending { background: #fff7ed; border: 1px solid #fed7aa; }
.pay-zone-h { font-weight: 700; font-size: 14px; margin-bottom: 6px; }
.pay-zone.ok .pay-zone-h { color: #15803d; }
.pay-zone.pending .pay-zone-h { color: #b45309; }
.pay-total { font-size: 13px; color: var(--text-2, #5b6472); margin-bottom: 10px; }
.pay-total b { color: var(--bz-amber, #b45309); font-size: 16px; }
.pay-actions { display: flex; flex-wrap: wrap; gap: 8px; }
/* 付款弹窗头部：左列=信息+全部表单项（垂直排列）· 右列=超大收款码；两列等高、内容垂直居中 */
.pay-main { display: flex; gap: 16px; align-items: stretch; margin: 0 0 12px; }
.pay-left { flex: 1 1 320px; min-width: 0; display: flex; flex-direction: column; justify-content: center; gap: 10px; }
.pay-info { background: var(--cyan-bg, #f5f6f8); border: 1px solid #a5f3fc; border-left: 3px solid var(--primary, #2b6cb0); border-radius: 10px; padding: 12px 14px; display: flex; flex-direction: column; justify-content: center; gap: 10px; }
.pay-quick { margin: 0; }
.pay-quick .input { height: 38px; }
.pi-name { font-size: 13px; color: #155e75; }
.pi-name b { font-size: 16px; color: #0f172a; }
.pi-stats { display: flex; flex-wrap: wrap; gap: 8px; }
.pi-chip { display: inline-flex; flex-direction: column; gap: 2px; padding: 6px 12px; border-radius: 8px; background: #fff; border: 1px solid #e5e7eb; min-width: 96px; }
.pi-chip small { font-size: 11px; color: var(--text-3, #94a3b8); }
.pi-chip b { font-size: 14px; color: #0f172a; white-space: nowrap; }
.pi-chip.ok b { color: #16a34a; }
.pi-chip.warn b { color: #b45309; }
.pay-qr { flex: 0 0 auto; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; background: #fff; border: 1px solid #e5e7eb; border-radius: 12px; padding: 10px 12px 8px; box-shadow: 0 1px 4px rgba(15, 23, 42, .06); }
.pay-qr img { display: block; width: 260px; height: 260px; object-fit: contain; border-radius: 6px; image-rendering: pixelated; }
.pay-qr .qr-cap { margin-top: 4px; font-size: 11px; color: var(--text-3, #94a3b8); }
.pay-qr-none { width: 260px; height: 190px; display: flex; align-items: center; justify-content: center; text-align: center; font-size: 12px; line-height: 1.6; color: #b91c1c; background: #fef2f2; border: 1px dashed #fecaca; border-radius: 8px; }
/* 报销表单·常用类别速选 chips（按报销人历史自动带出） */
.rq-chip { display: inline-flex; align-items: center; gap: 5px; padding: 3px 11px; border-radius: 14px; border: 1px solid var(--border-2, #d5d9e0); background: #fff; font-size: 12px; color: var(--text-1, #1f2937); cursor: pointer; transition: border-color .15s, background .15s; }
.rq-chip i { font-style: normal; font-size: 10px; line-height: 16px; color: var(--text-3, #94a3b8); background: #f1f5f9; border-radius: 8px; padding: 0 6px; }
.rq-chip:hover { border-color: var(--primary, #2b6cb0); color: var(--primary, #2b6cb0); }
.rq-chip.on { border-color: var(--primary, #2b6cb0); color: var(--primary, #2b6cb0); background: #eff6ff; }
.rq-chip.on i { background: #dbeafe; color: var(--primary, #2b6cb0); }
@media (max-width: 640px) {
  .pay-main { flex-direction: column-reverse; }  /* 手机：收款码置顶居中，信息+表单随后 */
  .pay-qr { align-self: center; }
  .pay-left { width: 100%; flex-basis: auto; }
}
/* 收款二维码设置 */
.qr-list { display: flex; flex-direction: column; gap: 10px; max-height: 60vh; overflow: auto; }
.qr-row { display: flex; align-items: center; gap: 12px; padding: 8px 10px; border: 1px solid var(--border-2, #e3e6ec); border-radius: 10px; }
.qr-name { flex: 0 0 120px; font-weight: 600; }
.qr-prev { flex: 0 0 70px; height: 70px; display: flex; align-items: center; justify-content: center; background: #f3f4f6; border-radius: 8px; overflow: hidden; }
.qr-prev img { max-width: 100%; max-height: 100%; display: block; }
.qr-act { margin-left: auto; display: flex; gap: 6px; }

/* 周期统计独立页：图表区 + 骨架屏/空状态 */
.agg-charts { display: grid; grid-template-columns: 1.4fr 1fr; gap: 12px; margin: 14px 0 0; }
.agg-chart-card { background: var(--color-background-primary, #fff); border: 0.5px solid var(--color-border-tertiary, #d5d9e0); border-radius: 12px; padding: 12px 14px; }
.agg-chart-t { font-size: 12px; font-weight: 500; color: #0f2a5f; margin-bottom: 3px; }
.agg-chart-card svg { display: block; width: 100%; height: 170px; }
.agg-legend { display: flex; flex-wrap: wrap; gap: 6px 12px; margin-top: 8px; font-size: 11px; color: #475569; }
.agg-lg { display: inline-flex; align-items: center; gap: 5px; }
.agg-lg i { width: 9px; height: 9px; border-radius: 2px; display: inline-block; }

/* 加载骨架屏 */
.veh-loading .sk, .sk { background: linear-gradient(90deg, #eef2f7 25%, #e2e8f0 37%, #eef2f7 63%); background-size: 400% 100%; animation: sk-shimmer 1.2s ease-in-out infinite; border-radius: 8px; }
.veh-kpi.sk { min-height: 54px; }
.agg-chart-card.sk { min-height: 210px; }
.sk-block { border-radius: 12px; }
@keyframes sk-shimmer { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } }
@media (max-width: 768px) { .agg-charts { grid-template-columns: 1fr; } }

/* 扫码称重 / 配料称量台账 */
.weigh-wrap { display: flex; gap: 14px; align-items: flex-start; }
.weigh-left { flex: 0 0 250px; max-width: 250px; }
.weigh-right { flex: 1 1 auto; min-width: 0; }
.wl-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 10px; }
.wl-title { font-weight: 700; font-size: 15px; }
.wl-list { display: flex; flex-direction: column; gap: 8px; max-height: calc(100vh - 190px); overflow: auto; padding-right: 2px; }
.wl-card { border: 1px solid var(--color-border-tertiary, #d5d9e0); border-radius: 10px; padding: 10px 12px; cursor: pointer; background: #fff; position: relative; transition: .15s; }
.wl-card:hover { border-color: #9db4d8; }
.wl-card.active { border-color: var(--color-primary, #2f6bff); box-shadow: 0 0 0 2px rgba(47, 107, 255, .15); }
.wlc-top { display: flex; align-items: center; justify-content: space-between; }
.wlc-no { font-weight: 700; color: var(--color-primary, #2f6bff); font-size: 13px; }
.wlc-del { border: none; background: transparent; color: #c0392b; cursor: pointer; font-size: 13px; padding: 2px 4px; }
.wlc-name { font-weight: 600; margin: 4px 0 2px; }
.wlc-meta { font-size: 12px; color: #64748b; }
.weigh-bar { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; background: #0f2a5f; color: #fff; padding: 10px 14px; border-radius: 10px; margin-bottom: 12px; }
.wb-scan { display: flex; align-items: center; gap: 8px; flex: 1 1 320px; }
.wb-ico { font-size: 18px; }
.wb-scan .input { flex: 1; height: 38px; font-size: 15px; }
.wb-prefix { font-size: 12px; display: flex; align-items: center; gap: 6px; }
.wb-prefix .input { height: 30px; }
.wb-status { font-size: 13px; min-width: 200px; margin-left: auto; }
.wb-status.ok { color: #7ff0a0; }
.wb-status.warn { color: #ffd27f; }
.weigh-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; flex-wrap: wrap; margin-bottom: 10px; }
.weigh-head h3 { margin: 0; font-size: 16px; }
.weigh-acts { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.weigh-prog { font-size: 13px; background: #eef2f7; padding: 4px 10px; border-radius: 8px; }
.weigh-prog b { color: var(--color-primary, #2f6bff); font-size: 15px; }
.wl-row.armed { background: #fff7e6; box-shadow: inset 3px 0 0 #f59e0b; }
.wl-row.weighed { background: #f0fdf4; }
.weigh-tbl input.input { height: 30px; padding: 2px 6px; font-size: 13px; }
.nowrap { white-space: nowrap; }
.ml-row { display: flex; align-items: center; gap: 8px; padding: 6px 2px; border-bottom: 1px dashed var(--color-border-tertiary, #e3e6ec); font-size: 13px; }
.btn-xs { height: 24px; padding: 0 8px; font-size: 11px; }
.badge.b-gray { background: #eef2f7; color: #94a3b8; }
.print-area { font-size: 13px; }
@media (max-width: 768px) { .weigh-wrap { flex-direction: column; } .weigh-left { flex: none; max-width: none; width: 100%; } .wl-list { max-height: none; } }



