:root{color-scheme:dark;--bg:#0c1016;--panel:#131921;--border:#252d37;--muted:#84909f;--text:#e4eaf1;--green:#55d9b2;--red:#fc7d87;--amber:#dfb76f}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:14px/1.6 "Microsoft YaHei","Segoe UI",sans-serif}button,input,select{font:inherit}button,a{ -webkit-tap-highlight-color:transparent}button{cursor:pointer}a{color:var(--green);text-decoration:none}button:focus-visible,a:focus-visible{outline:2px solid var(--green);outline-offset:3px}.sidebar{position:fixed;inset:0 auto 0 0;width:216px;background:#10151c;border-right:1px solid var(--border);padding:29px 18px;display:flex;flex-direction:column}.brand{display:flex;align-items:center;gap:9px;color:#f0f5f9;font-size:23px;font-weight:750;letter-spacing:1px}.brand-icon{background:var(--green);color:#10241f;border-radius:8px;font-size:25px;width:34px;text-align:center}.brand-sub{font-size:11px;font-weight:400;letter-spacing:0;color:var(--muted)}.nav-label{font-size:10px;color:#5f6b7a;margin:47px 14px 14px;letter-spacing:2px}.nav{border:0;background:transparent;color:#8f9aa9;display:flex;align-items:center;gap:12px;width:100%;padding:13px;border-radius:7px;text-align:left;margin-bottom:7px}.nav.active{background:#1b302d;color:var(--green)}.nav b{margin-left:auto;font-size:11px;background:#314139;padding:0 6px;border-radius:4px}.sidebar-bottom{margin-top:auto;font-size:12px;color:#9babb6;padding:12px}.sidebar-bottom p{font-size:10px;color:#607080}.dot{display:inline-block;width:6px;height:6px;background:var(--green);border-radius:50%;margin-right:6px}main{margin-left:216px;padding:0 32px 28px;max-width:2100px}header{height:70px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--border);font-size:11px}.breadcrumb{color:var(--muted)}.breadcrumb span{margin:0 13px;color:#425061}.breadcrumb strong{font-weight:400;color:#c5ced8}.demo-badge{color:#b7c3ce;border:1px solid #35404a;border-radius:5px;padding:4px 9px;font-size:10px;letter-spacing:1px}.page-heading{display:flex;align-items:center;justify-content:space-between;padding:29px 0 25px;gap:15px}.eyebrow{color:var(--green);font-size:10px;letter-spacing:2px}h1{font-size:27px;font-weight:600;letter-spacing:1px;margin:8px 0 7px}.heading-dot{color:var(--green)}p{color:var(--muted);margin:6px 0;font-size:12px}.button{background:#1b242e;border:1px solid #36424e;color:#d5dee6;padding:8px 15px;border-radius:6px;white-space:nowrap}.button:hover{border-color:var(--green);color:var(--green)}.filters{display:flex;gap:15px;align-items:end;background:var(--panel);border:1px solid var(--border);padding:15px 18px;border-radius:9px}.filters label{font-size:10px;color:var(--muted);display:flex;flex:1;flex-direction:column;gap:6px}.filters .search-label{flex:1.7}input,select{background:#0e141c;border:1px solid #2c3642;color:#cbd5df;border-radius:5px;padding:8px 10px;min-width:0;width:100%;font-size:12px;height:36px;outline:none}input:focus,select:focus{border-color:var(--green)}.snapshot{display:flex;justify-content:space-between;color:#697989;font-size:10px;padding:13px 2px}.metrics{display:grid;grid-template-columns:repeat(5,1fr);gap:14px;margin-bottom:20px}.metric{border:1px solid var(--border);border-radius:8px;background:var(--panel);padding:17px 19px;position:relative}.metric>span{font-size:12px;color:#97a5b3}.metric strong{display:block;font-size:32px;line-height:1.8;font-family:"Segoe UI",sans-serif;font-weight:600;letter-spacing:.5px}.metric small{font-size:10px;color:#6e8091}.metric.alert{border-color:#573137;background:linear-gradient(130deg,#211a23,#161921)}.metric .mini-icon{position:absolute;right:18px;top:17px;color:#687d89}.good{color:var(--green)!important}.bad{color:var(--red)!important}.warn{color:var(--amber)!important}.flow-panel,.ledger{border:1px solid var(--border);border-radius:9px;background:var(--panel);margin-bottom:20px}.section-title{display:flex;justify-content:space-between;align-items:center;padding:17px 20px;gap:10px}.section-title h2{font-size:14px;font-weight:500;margin:0}.section-title>span,.legend{color:#6f8091;font-size:10px}.section-title p{font-size:10px;margin-top:5px}.flow{display:flex;padding:7px 22px 22px;align-items:center;gap:14px}.flow-node{flex:1;border:1px solid #2c3944;padding:12px 14px;background:#172029;border-radius:6px}.flow-node strong{font-size:19px;float:right;color:#cfe2e7}.flow-node span{font-size:11px}.flow-node small{display:block;color:#718491;font-size:10px;margin-top:8px}.flow-arrow{color:#44616a}.flow-node.exception{border-style:dashed;background:#201e22}.legend{display:flex;gap:16px}.small-count{font-size:10px;border:1px solid #34404c;padding:1px 6px;border-radius:5px;margin-left:7px;color:#a7b2bd}.tabs{display:flex;padding:0 20px;border-bottom:1px solid var(--border);gap:26px}.tabs button{border:0;background:none;color:#7d8d9b;font-size:12px;padding:10px 1px 13px;border-bottom:2px solid transparent}.tabs button.selected{color:var(--green);border-bottom-color:var(--green)}.table-wrap{overflow:auto}table{border-collapse:collapse;width:100%;white-space:nowrap;font-size:11px;text-align:left}th{font-weight:400;color:#758697;padding:12px 13px;background:#111820}td{padding:14px 13px;border-top:1px solid #232c35;color:#bbc7d4}th:first-child,td:first-child{padding-left:20px}tr{cursor:pointer}tbody tr:hover{background:#1b2630}td small{display:block;font-size:10px;color:#6e7f90;margin-top:3px}.sn{font-family:Consolas,monospace;font-size:12px;letter-spacing:.2px}.seq{color:#607184;margin-right:9px;font-size:10px}.status{padding:4px 7px;border-radius:4px;font-size:10px;background:#253039}.status.bad{background:#382329}.status.good{background:#19332e}.status.warn{background:#352f23}.table-link{border:0;background:transparent;color:var(--green);font-size:11px}.row-alert td:first-child{box-shadow:inset 2px 0 var(--red)}.table-footer{display:flex;justify-content:space-between;border-top:1px solid var(--border);padding:12px 20px;color:#6d7e8e;font-size:10px}.bottom-note{color:#647888;font-size:10px}.empty{text-align:center;padding:50px;color:#8a9aab}.scrim{position:fixed;inset:0;background:#0008;z-index:9}.drawer{position:fixed;right:0;top:0;bottom:0;width:500px;max-width:95vw;background:#141c25;border-left:1px solid #3a4957;z-index:10;padding:27px;overflow:auto;box-shadow:-20px 0 60px #0006}.drawer h2{font-size:20px;margin:18px 0 4px}.drawer h3{font-size:13px;margin-top:24px}.close{float:right;border:0;background:none;color:#b9c5ce;font-size:22px}.detail-meta{display:grid;grid-template-columns:1fr 1fr;gap:12px;background:#10171e;padding:14px;margin:20px 0}.detail-meta span{font-size:10px;color:#7d90a1;display:block}.detail-meta b{font-size:12px;font-weight:400}.reason{padding:13px;border:1px solid #564037;background:#282323;color:#d9c1b5;font-size:12px;border-radius:5px}.timeline{border-left:1px solid #354754;margin-left:7px;padding-left:23px}.event{position:relative;padding:0 0 24px}.event:before{content:"";position:absolute;left:-28px;top:5px;width:8px;height:8px;background:var(--green);border-radius:50%;box-shadow:0 0 0 4px #14212a}.event.error:before{background:var(--red)}.event time{color:#788d9f;font-size:10px}.event strong{display:block;font-size:12px;margin-top:2px;font-weight:500}.event p{font-size:11px}.source-id{font-size:9px;color:#577184;font-family:Consolas,monospace}.camera{padding:16px;background:#10171e;border:1px dashed #3c4b58;border-radius:6px}.camera p{font-size:11px}.camera .button{margin-top:10px;font-size:11px}.arch-grid{display:grid;grid-template-columns:1fr 1fr;gap:20px}.arch-grid article,.arch-wide{background:var(--panel);padding:24px;border:1px solid var(--border);border-radius:8px}.arch-grid h2,.arch-wide h2{font-size:18px}.arch-grid p,.arch-wide p{line-height:2;font-size:13px}.arch-wide{margin-top:20px}.system-flow{padding:20px;background:#102623;color:var(--green);margin:15px 0}#toast{position:fixed;bottom:30px;left:50%;transform:translateX(-50%);background:#29463f;color:#d9fff1;z-index:20;padding:10px 20px;border-radius:6px;display:none}[hidden]{display:none!important}@media(max-width:1150px){.sidebar{width:180px;padding:24px 10px}.brand-sub{display:none}main{margin-left:180px;padding:0 20px}.metrics{gap:8px}.metric{padding:12px}.snapshot{gap:15px}.flow{gap:8px;padding-left:14px;padding-right:14px}.flow-node{padding:10px}.legend{display:none}h1{font-size:24px}}@media(max-width:800px){.sidebar{position:static;width:100%;padding:14px;display:block}.brand{font-size:18px}.nav-label,.sidebar-bottom{display:none}nav{display:flex;margin-top:15px}.nav{font-size:11px;margin:0;padding:8px}.nav b{display:none}main{margin-left:0;padding:0 14px}.page-heading{align-items:start}.page-heading .button{font-size:10px}.filters{flex-wrap:wrap}.filters label{flex:1 1 35%}.metrics{grid-template-columns:repeat(2,1fr)}.metric:last-child{grid-column:span 2}.flow{overflow:auto}.flow-node{min-width:145px}.snapshot{flex-direction:column;gap:4px}.section-title>span{display:none}.tabs{gap:18px}.arch-grid{grid-template-columns:1fr}h1{font-size:21px}.eyebrow{font-size:8px}.table-footer{gap:15px}}
.metrics{grid-template-columns:repeat(6,minmax(0,1fr))}.muted{color:var(--muted)}.flow{align-items:stretch;flex-wrap:wrap}.flow-node{min-width:165px}.flow-node strong{margin-left:12px}.health-strip{border-top:1px solid var(--border);padding:10px 20px;display:flex;gap:6px 20px;flex-wrap:wrap}.health-item{font-size:10px}.gap-panel{border:1px solid var(--border);border-radius:9px;background:var(--panel);margin-bottom:20px}.gap-panel .section-title h2 span{display:block;font-size:10px;color:var(--muted);margin-top:4px}#gap-hints{display:grid;grid-template-columns:repeat(auto-fit,minmax(290px,1fr));gap:8px;padding:0 20px}.gap-card{display:block;text-align:left;border:1px solid #3f3d34;background:#201e21;border-radius:5px;color:var(--text);padding:10px}.gap-card small{display:block;font-size:10px;color:var(--muted);overflow-wrap:anywhere;margin-top:4px}.pause-note{padding:10px 20px 15px;font-size:11px;line-height:1.8}.gap-reason{margin-top:12px}.tabs{overflow:auto}.tabs button{white-space:nowrap}.button:disabled{opacity:.55;cursor:default}.table-wrap th:nth-child(2){min-width:110px}@media(max-width:1300px){.metrics{grid-template-columns:repeat(3,minmax(0,1fr))}.filters{flex-wrap:wrap}.filters label{min-width:120px}.filters .search-label{min-width:230px}}@media(max-width:800px){.metrics{grid-template-columns:repeat(2,minmax(0,1fr))}.metric:last-child{grid-column:auto}.gap-panel .section-title{align-items:flex-start;flex-direction:column}.flow{flex-wrap:nowrap}.table-footer{flex-wrap:wrap}.drawer h2{overflow-wrap:anywhere}#gap-hints{grid-template-columns:minmax(0,1fr)}nav{flex-wrap:wrap}.nav{width:auto;flex:1 1 40%}}

.live-panel-content{padding:0 20px 20px}.live-panel-content details{margin:12px 0}.live-panel-content label{display:block;font-size:12px;color:var(--muted)}.live-panel-content select{max-width:430px}.case-history article{border:1px solid var(--border);padding:12px;margin-bottom:12px}.case-history .button{margin-top:8px}.case-history input{margin-top:6px}.case-history p{overflow-wrap:anywhere}

/* WMS 补上传：整页字号放大（仅在 #reupload-page 内生效，不影响台账 / 异常等其它页面） */
#reupload-page .section-title h2{font-size:20px}
#reupload-page .panel-help{font-size:15px}
#reupload-page .filters label{font-size:13px}
#reupload-page input,#reupload-page select{font-size:16px;height:44px}
#reupload-page .button{font-size:15px}
#reupload-page #ru-summary{font-size:18px}
#reupload-page #ru-config{font-size:14px}
#reupload-page table{font-size:16px}
#reupload-page th{font-size:15px;color:#9dadbd;padding:14px 15px}
#reupload-page td{font-size:16px;padding:16px 15px;line-height:1.5}
#reupload-page td small{font-size:14px;margin-top:5px}
#reupload-page .sn{font-size:17px}
#reupload-page .ru-pick{width:48px}
#reupload-page .ru-pick input[type=checkbox]{width:20px;height:20px;padding:0;cursor:pointer}
#reupload-page #ru-foot{font-size:15px}
#reupload-page h3{font-size:20px}
/* 列表里的工单卡片与记录卡片同步放大 */
#reupload-page .ru-order-list{grid-template-columns:repeat(auto-fit,minmax(390px,1fr))}
#reupload-page .ru-order-card .ru-order-no{font-size:20px;padding:4px 11px}
#reupload-page .ru-order-card .ru-order-count{font-size:16px}
#reupload-page .ru-order-card .button{padding:8px 14px;font-size:15px}
#reupload-page .ru-batch p{font-size:16px}
#reupload-page .ru-batch .button{font-size:15px}
#reupload-page .ru-selection ol{font-size:16px}
#reupload-page .ru-receipt .ru-meta{font-size:15px}
#reupload-page #ru-result p{font-size:16px}
#reupload-page #ru-result details summary{font-size:16px}
#reupload-page .ru-packet{font-size:14px}
/* WMS 补上传：不可补上传清单（默认折叠，不占主表位置）+ 补上传记录按工单分组 */
#reupload-page .ru-blocked-box{margin:0 20px 6px;border:1px solid var(--border);border-radius:6px;background:var(--panel)}
#reupload-page .ru-blocked-box>summary{cursor:pointer;padding:12px 16px;font-size:16px;font-weight:600;color:var(--amber)}
#reupload-page .ru-blocked-box>summary:hover{color:var(--text)}
#reupload-page .ru-blocked-box>.panel-help{padding:0 16px;margin:0}
#reupload-page .ru-blocked-box .table-wrap{margin-top:8px}
#reupload-page .ru-blocked-box .table-footer{font-size:15px}
#reupload-page .ru-batch-order-tag{color:var(--muted);font-size:14px}
#reupload-page .ru-batch-orders{display:grid;gap:6px;margin:8px 0}
#reupload-page .ru-batch-order{display:flex;align-items:center;gap:10px;flex-wrap:wrap;border:1px dashed var(--border);border-radius:5px;padding:7px 10px}
#reupload-page .ru-batch-order .ru-order-no{cursor:copy;font-family:Consolas,"Courier New",monospace;font-size:17px;letter-spacing:.4px;color:var(--text);background:#1b2733;border:1px dashed #3a4756;border-radius:4px;padding:3px 9px}
#reupload-page .ru-batch-order .ru-order-no:hover{border-color:var(--green);color:var(--green)}
#reupload-page .ru-batch-order .ru-batch-order-count{font-size:15px;color:var(--muted)}
#reupload-page .ru-batch-order .button{padding:5px 11px;font-size:14px}
#reupload-page .ru-batch-group{margin:8px 0;border-top:1px solid var(--border);padding-top:6px}
#reupload-page .ru-batch-group>summary{cursor:pointer;font-size:16px;padding:4px 0}
#reupload-page .ru-batch-group p{margin:2px 0 2px 14px}
/* WMS 补上传：工单卡片、报文、收货校验 */
.ru-order-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(330px,1fr));gap:8px;padding:0 20px 4px}
.ru-order-card{display:flex;align-items:center;gap:10px;flex-wrap:wrap;border:1px solid var(--border);background:var(--panel);border-radius:6px;padding:12px 14px}
.ru-order-card .ru-order-no{font-family:Consolas,"Courier New",monospace;font-size:17px;letter-spacing:.4px;color:var(--text);background:#1b2733;border:1px dashed #3a4756;border-radius:4px;padding:3px 9px;cursor:copy}
.ru-order-card .ru-order-no:hover{border-color:var(--green);color:var(--green)}
.ru-order-card .ru-order-count{font-size:14px;color:var(--amber)}
.ru-order-card .ru-order-actions{margin-left:auto;display:flex;gap:6px;flex-wrap:wrap}
.ru-order-card .button{padding:6px 12px;font-size:14px}
.ru-order-card .button.ru-primary{background:#1b302d;border-color:var(--green);color:var(--green)}
.ru-pick{width:38px}
.ru-packet{background:#0f1620;border:1px solid var(--border);border-radius:5px;padding:10px;font-size:13px;line-height:1.7;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere}
.ru-batch{border:1px solid var(--border);border-radius:6px;padding:12px 14px;margin-bottom:10px}
.ru-batch p{margin:0 0 6px;font-size:14px}
.ru-selection{background:#131b24;border:1px solid var(--border);border-radius:6px;padding:10px 12px;margin:10px 0}
.ru-selection ol{margin:6px 0 0;padding-left:22px;font-family:Consolas,"Courier New",monospace;font-size:14px;max-height:260px;overflow:auto}
.ru-receipt{border:1px solid #3a4756;border-radius:6px;padding:12px 14px;margin-top:12px;background:#121a23}
.ru-receipt h4{margin:0 0 8px;font-size:16px;color:var(--text)}
.ru-receipt .ru-bar{height:8px;border-radius:4px;background:#232c37;overflow:hidden;margin:10px 0}
.ru-receipt .ru-bar i{display:block;height:100%;background:var(--green);transition:width .4s}
.ru-receipt .ru-meta{font-size:14px;color:var(--muted);line-height:1.95}
.ru-receipt .ru-meta b{color:var(--text);font-weight:600}
#ru-result p{font-size:14px;line-height:1.8}
#ru-result details summary{font-size:14px}
.ru-countdown{font-variant-numeric:tabular-nums;color:var(--amber)}
.ru-receipt .button-row{margin-top:10px}
.ru-done{border-color:var(--green)}
.metric[data-metric]{text-align:left;color:var(--text)}.metric[data-metric]:hover{border-color:var(--green)}.panel-help{padding:0 20px 12px;font-size:13px;line-height:1.8}.ledger table{font-size:13px}.ledger td small{font-size:12px;color:#aab9c8;font-variant-numeric:tabular-nums}.ledger .sn{font-size:14px}.ledger .status,.ledger .table-link{font-size:12px}
/* 逐台台账的目标：1920×1200 一屏看全一整条记录。压缩行内边距与来源小字字号；
   表头的「来源：…」小字允许换行，避免它反过来把整列撑宽（列宽交给单元格内容决定）。 */
.ledger th{padding:9px 10px}.ledger td{padding:10px 10px}.ledger th:first-child,.ledger td:first-child{padding-left:16px}
.ledger th small.th-origin{display:block;font-size:10px;font-weight:400;line-height:1.35;color:#6c7c8c;white-space:normal;margin-top:2px}
.ledger td small{margin-top:2px}
.ledger .section-title h2{font-size:18px}.ledger .table-footer,.ledger .section-title p{font-size:12px}.event time{font-size:13px;color:#b6c5d4}.import-dialog{background:var(--panel);color:var(--text);border:1px solid var(--border);border-radius:10px;width:min(850px,94vw);max-height:85vh;padding:24px}.import-dialog::backdrop{background:#0009}.import-dialog p{font-size:14px}.import-dialog label{display:block;margin:14px 0}.import-dialog pre{white-space:pre-wrap}.import-dialog td,.import-dialog th{padding:8px}.import-dialog input[type=file]{height:auto}

.ledger-pagination{display:flex;align-items:center;justify-content:flex-end;gap:12px;padding:14px 20px;border-top:1px solid var(--border);flex-wrap:wrap}.ledger-pagination label{display:flex;align-items:center;gap:8px}.ledger-pagination select{width:90px}.ledger-pagination span{color:var(--muted)}

.button-row{display:flex;gap:10px;flex-shrink:0}.filters label.range .range-inputs{display:flex;align-items:center;gap:6px;min-width:0}.filters label.range .range-sep{flex:0 0 auto}.filters label.range input[type=date]{min-width:0;width:100%}
.collector-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,400px),1fr));gap:18px}.collector-card{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:20px}.collector-card h3{margin:0;font-size:16px}.collector-card dl{display:grid;grid-template-columns:1fr 1fr;gap:9px;font-size:12px}.collector-card dd{margin:0;text-align:right}.collector-card p{font-size:13px;overflow-wrap:anywhere}.collector-card .muted{font-size:12px}.collector-card .section-title{gap:12px;padding:0 0 12px}.collector-card .status{white-space:nowrap;flex-shrink:0}.collector-card h3{font-size:14px}.collector-card dt{color:var(--muted)}@media(max-width:600px){.collector-grid{grid-template-columns:1fr}}
.filters{flex-wrap:nowrap;align-items:end}.filters label{flex:1 1 0;min-width:0}.filters .search-label{flex:1.6 1 0;min-width:150px}.filters label.range{flex:1.8 1 0;min-width:0}.filters>button.button{flex:0 0 auto}@media(max-width:1100px){.filters{flex-wrap:wrap}.filters label,.filters label.range{flex:1 1 200px}.filters .search-label{flex:1 1 260px}}

/* 切页签 / 改筛选时的等待反馈。后台重投影是同步的（实测数秒），这段时间请求只能排队，
   没有任何反馈就会被当成「点不动」。表格不清空、只压暗并加一条扫过的进度条：
   保留上一次结果比白屏更可信，也避免闪烁。 */
.ledger-busy{display:flex;align-items:center;gap:8px;padding:9px 20px 0;font-size:12px;color:var(--muted)}
.ledger-busy .spinner{width:11px;height:11px;flex:0 0 11px;border:2px solid #34404c;border-top-color:var(--green);border-radius:50%;animation:ledger-spin .8s linear infinite}
@keyframes ledger-spin{to{transform:rotate(360deg)}}
.table-wrap{position:relative}
.table-wrap.is-loading table{opacity:.4;transition:opacity .18s}
.table-wrap.is-loading::after{content:"";position:absolute;left:0;right:0;top:0;height:2px;background:linear-gradient(90deg,transparent,var(--green),transparent);animation:ledger-sweep 1.1s ease-in-out infinite}
@keyframes ledger-sweep{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}
/* 页签上的台数：点之前就知道有没有、有多少台，不必切过去才发现是空的 */
.tabs button small{margin-left:5px;font-size:10px;color:#7d8d9b;font-variant-numeric:tabular-nums}
.tabs button.selected small{color:var(--green);opacity:.85}
.tabs button.is-empty{opacity:.5}
.tabs button.pending{opacity:.65}
@media (prefers-reduced-motion:reduce){.ledger-busy .spinner,.table-wrap.is-loading::after{animation:none}}
/* 表头常驻「来源：…」小字：这一列的数据从哪个采集通道来，一眼就能看到，不用点开详情猜 */
#table-head th .th-origin{display:block;font-weight:400;font-size:10px;color:#6d8296;margin-top:4px;letter-spacing:0}
.ledger #table-head th .th-origin{font-size:11px}
#table-head th{cursor:help}
/* 单元格与详情页的文字都要能直接选中复制：行点击已做「正在选字就不弹窗」的处理 */
.ledger td,.drawer .source-id{cursor:text}
.source-id{cursor:copy!important}
.drawer-tools{display:flex;align-items:center;gap:10px;margin:12px 0 6px}
.drawer-tools .button{padding:6px 12px;font-size:12px}
.drawer-tools small{font-size:10px}
