:root{--bg:#f4f7fb;--panel:#fff;--ink:#172033;--muted:#748095;--line:#e4e9f1;--primary:#2867e8;--primary-dark:#194fb9;--accent:#eaf1ff;--danger:#d84646;--success:#168a5b;--warning:#d98218;--shadow:0 12px 36px rgba(39,55,86,.09);font-family:"Microsoft YaHei UI","Microsoft YaHei",system-ui,sans-serif;color:var(--ink)}
*{box-sizing:border-box}body{margin:0;background:var(--bg);font-size:14px}.app-shell{min-height:100vh;display:grid;grid-template-columns:228px 1fr}.sidebar{position:sticky;top:0;height:100vh;background:#13213b;color:#dbe5f7;padding:22px 14px;display:flex;flex-direction:column}.brand{display:flex;align-items:center;gap:12px;padding:0 9px 25px}.brand strong{display:block;color:#fff;font-size:21px;font-weight:700;letter-spacing:.5px;line-height:1.3}nav{display:grid;gap:4px}.nav-item{border:0;background:transparent;color:#aebcd2;padding:11px 13px;border-radius:9px;text-align:left;font:inherit;cursor:pointer;display:flex;gap:12px;align-items:center}.nav-item:hover{background:#1d3052;color:#fff}.nav-item.active{background:#2867e8;color:#fff;box-shadow:0 8px 18px #07132766}.nav-item>span{font-size:15px}.sidebar-foot{margin-top:auto;border-top:1px solid #2a3b57;padding:18px 10px 0}.local-badge{font-size:13px;color:#9fb1cb;margin-bottom:12px}.local-badge i{display:inline-block;width:8px;height:8px;border-radius:50%;background:#38c483;margin-right:7px;box-shadow:0 0 0 4px #38c48322}.text-button{border:0;background:none;color:#91a5c5;cursor:pointer;padding:0;font-size:14px}.text-button:hover{color:#fff}.main{min-width:0}.topbar{height:96px;background:#fff;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;padding:0 30px;position:sticky;top:0;z-index:5}.topbar h1{font-size:22px;font-weight:700;line-height:1.3;margin:0 0 6px}.topbar p{margin:0;color:var(--muted);font-size:13px;line-height:1.6}.top-actions{display:flex;align-items:center;gap:16px;color:var(--muted)}button{font:inherit}.primary,.secondary,.danger,.success,.ghost{border:1px solid transparent;border-radius:8px;padding:0 13px;min-height:38px;display:inline-flex;align-items:center;justify-content:center;gap:8px;cursor:pointer;font-weight:600;line-height:1.2;white-space:nowrap;text-decoration:none}.primary{background:var(--primary);color:#fff}.primary:hover{background:var(--primary-dark)}.secondary{background:var(--accent);color:var(--primary)}.ghost{background:#fff;border:1px solid var(--line);color:var(--ink)}.danger{background:#fff1f1;color:var(--danger)}.success{background:#e7f7f0;color:var(--success)}.small{min-height:29px;padding:0 8px;font-size:12px}.content{padding:26px 30px 60px}.stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;margin-bottom:20px}.stat-card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:20px;box-shadow:0 5px 18px rgba(39,55,86,.04)}.stat-card small{color:var(--muted)}.stat-card strong{display:block;font-size:28px;margin-top:10px}.stat-card em{font-style:normal;font-size:12px;color:var(--muted)}.grid-2{display:grid;grid-template-columns:1.35fr .65fr;gap:16px}.panel{background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:0 5px 18px rgba(39,55,86,.04);overflow:hidden}.panel-head{padding:10px 18px;min-height:60px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;gap:16px}.panel-head h2{font-size:15px;font-weight:600;line-height:1.4;margin:0}.panel-body{padding:18px}.toolbar{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-bottom:16px}.toolbar .search{flex:1;min-width:220px}.input,select,textarea{width:100%;border:1px solid #d7deea;border-radius:8px;padding:9px 10px;background:#fff;color:var(--ink);font-family:inherit;font-size:14px;outline:none}
/* Chrome 下 input[type=text] 的固有高度比 select 与 input[type=date] 少 2px，
   只给 padding 不给 height，同一列就会高低不齐。统一在这里定，
   所有筛选表单与表单栏位一并受惠，不必各自再补。textarea 例外，保留可拉伸。 */
.input,select{height:38px;line-height:1.2}
textarea.input,textarea{height:auto}.input:focus,select:focus,textarea:focus{border-color:#5b8df0;box-shadow:0 0 0 3px #3976e91a}.toolbar select{width:auto;min-width:150px}
.toolbar label{display:inline-flex;align-items:center;gap:8px;white-space:nowrap}
.toolbar label .input,.toolbar label select{width:auto;min-width:150px}.table-wrap{overflow:auto;border:1px solid var(--line);border-radius:10px}table{width:100%;border-collapse:collapse;white-space:nowrap}th,td{text-align:left;padding:11px 12px;border-bottom:1px solid var(--line);vertical-align:middle}th{background:#f7f9fc;color:#657086;font-weight:600;font-size:12px;position:sticky;top:0}tr:last-child td{border-bottom:0}tbody tr:hover{background:#f9fbff}.muted{color:var(--muted)}.code{font-family:Consolas,monospace;color:#4c5e79}.qty{font-weight:700;font-size:15px}.tag{display:inline-block;padding:3px 8px;border-radius:20px;background:#edf2fb;color:#53627a;font-size:12px}.tag.blue{background:#e8f0ff;color:#2560d0}.tag.green{background:#e6f7ef;color:#178557}.tag.orange{background:#fff2df;color:#c46d0b}.row-actions{display:flex;gap:4px}.empty{text-align:center;padding:48px 20px;color:var(--muted)}.empty strong{display:block;color:#536078;margin-bottom:6px}.recent{display:grid}.recent-item{display:grid;grid-template-columns:1fr auto;gap:8px;padding:11px 0;border-bottom:1px solid var(--line)}.recent-item:last-child{border:0}.recent-item small{display:block;color:var(--muted);margin-top:4px}.positive{color:var(--success);font-weight:700}.negative{color:var(--danger);font-weight:700}.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(245px,1fr));gap:16px}.board-card,.category-card{background:#fff;border:1px solid var(--line);border-radius:13px;padding:17px;cursor:pointer;transition:.15s}.board-card:hover,.category-card:hover{transform:translateY(-2px);box-shadow:var(--shadow);border-color:#c9d7ef}.board-card h3,.category-card h3{margin:0 0 7px;font-size:15px;font-weight:600;line-height:1.4}.board-card p,.category-card p{margin:0;color:var(--muted);font-size:13px}.board-meta{display:flex;justify-content:space-between;margin-top:17px;color:#52617a}.modal{width:min(720px,92vw);border:0;border-radius:15px;padding:0;box-shadow:0 25px 80px #0b18375c}.modal::backdrop{background:#14213b80;backdrop-filter:blur(2px)}.modal-head{padding:19px 22px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:center}.modal-head h2{margin:0;font-size:17px;font-weight:600;line-height:1.4}.modal-body{padding:20px 22px;max-height:70vh;overflow:auto}.modal-foot{padding:15px 22px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;gap:8px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}.form-group label{display:block;font-size:12px;color:#667188;margin:0 0 6px}.form-group.full{grid-column:1/-1}.form-group textarea{min-height:76px;resize:vertical}.close-x{border:0;background:none;font-size:21px;color:var(--muted);cursor:pointer}.toast{position:fixed;right:25px;bottom:25px;background:#18263e;color:#fff;padding:12px 17px;border-radius:9px;box-shadow:var(--shadow);opacity:0;transform:translateY(15px);pointer-events:none;transition:.2s;z-index:20}.toast.show{opacity:1;transform:none}.toast.error{background:#ad3333}.drop-zone{border:2px dashed #b8c7df;border-radius:13px;padding:35px;text-align:center;background:#f9fbff;cursor:pointer}.drop-zone:hover{border-color:var(--primary);background:#f3f7ff}.drop-zone strong{display:block;font-size:15px;font-weight:600;margin-bottom:7px}.import-steps{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:18px}.step{padding:12px;border-radius:9px;background:#eef2f8;color:#748096;text-align:center}.step.active{background:#e5eeff;color:#245fd2;font-weight:700}.mapping-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}.notice{padding:12px 14px;border-radius:9px;background:#fff7e9;color:#8d5c19;margin:12px 0;border:1px solid #f2dfbd}.detail-head{display:flex;justify-content:space-between;gap:20px;align-items:flex-start}.detail-head h2{margin:0 0 4px}.big-number{font-size:28px;font-weight:700}.backup-list{display:grid;gap:8px}.backup-item{display:flex;justify-content:space-between;padding:12px;border:1px solid var(--line);border-radius:9px}.footer-note{margin-top:20px;color:var(--muted);font-size:12px}
.drop-zone{display:block;width:100%;min-height:120px}.tag.red{background:#fff1f1;color:var(--danger)}
.input-suggestions-panel{margin-top:5px;border:1px solid #cfdaf0;border-radius:9px;background:white;box-shadow:0 5px 16px #14213b12;overflow:hidden}.input-suggestions-panel[hidden]{display:none}.suggestion-help{display:block;padding:8px 10px;background:#f7f9fd;color:#657086;font-size:12px}.input-suggestions-panel [role="listbox"]{max-height:165px;overflow:auto}.suggestion-option{padding:9px 11px;cursor:pointer;white-space:normal;overflow-wrap:anywhere;line-height:1.5}.suggestion-option:hover,.suggestion-option[aria-selected="true"]{background:#eaf2ff}.suggestion-option .search-hit{font-weight:700}
.filter-panel{background:#fff;border:1px solid var(--line);border-radius:10px;margin:0 0 14px;padding:12px 16px}.filter-panel summary{cursor:pointer;font-weight:600}.filter-panel summary .muted{font-weight:400;font-size:12px}.filter-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}.filter-range{display:flex;align-items:center;gap:8px}.filter-range .input{min-width:0}.filter-actions{display:flex;align-items:center;flex-wrap:wrap;gap:12px;margin-top:16px}.filter-actions small{flex:1;min-width:200px}.queue-note{font-size:12px;margin:0 0 12px}.material-subtype{display:inline-block;margin-top:5px;white-space:normal;max-width:180px}.subtype-manage{margin-top:12px}button:disabled{opacity:.55;cursor:wait}@media(max-width:1000px){.filter-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:600px){.filter-grid{grid-template-columns:1fr}}
.search-hit{background:#ffdf57;color:#382900;border-radius:3px;padding:1px 2px;box-shadow:0 0 0 1px #e7b900}.package-groups{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:16px}.package-chips{display:grid;gap:8px}.package-chip{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px;border:1px solid var(--line);border-radius:9px;background:#f9fbff}.package-chip span{min-width:0}.package-chip strong{display:block}.package-chip small{display:block;color:var(--muted);margin-top:3px}
/* 让「电阻」与卡片内的「0201」、「添加」与「删除」对齐：
   卡片内文相对面板边缘缩排 18px(.panel-body) + 1px(边框) + 12px(.package-chip)
   = 31px，标题列跟上同一个值。 */
.package-groups .panel-head{padding-left:31px;padding-right:31px}
.compact-input{min-width:105px;padding:7px 8px}.mini-input{min-width:76px;width:88px}.wrap-cell{white-space:normal;min-width:170px;line-height:1.5}.editable-preview td{vertical-align:top}.editable-preview input[type="checkbox"]{width:17px;height:17px}.compare-stats{grid-template-columns:repeat(5,minmax(0,1fr))}
.warning{background:#fff2df;color:#b96200;border:0;border-radius:8px;font-weight:600;cursor:pointer}.preferred-row{background:#fffdf2}.preferred-star{color:#e4a000}.alias-line{color:#4d69a1;white-space:pre-line}.check-line{display:flex!important;align-items:center;gap:8px;color:var(--ink)!important}.check-line input{width:17px;height:17px;flex:0 0 auto}.wide{width:100%;margin-top:8px}.card-actions{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin:12px 0}
/* 只读人员：写入型控件一律不显示，服务端本来就会 403 */
body.role-reader [data-write]{display:none!important}
/* 输入即搜的物料挑选框（板卡加物料）：清单可能上万笔，不放 <select> */
.picker-status{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-top:8px;font-size:13px}
.picker-list{margin-top:8px;max-height:280px;overflow:auto;border:1px solid var(--line);border-radius:8px;display:grid;background:#fff}
.picker-item{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;padding:9px 12px;border:0;border-bottom:1px solid var(--line);background:none;text-align:left;cursor:pointer;line-height:1.5}
.picker-item:last-child{border-bottom:0}
.picker-item:hover{background:#f3f7ff}
.picker-item.picked{background:var(--accent);color:var(--primary)}
.picker-more{padding:10px 12px;font-size:12px;line-height:1.6}.compact-stats{grid-template-columns:repeat(3,minmax(0,1fr))}.compare-detail{white-space:normal;margin:12px 0;border:1px solid var(--line)}.compare-detail th{position:static}.compare-detail td{min-width:180px;overflow-wrap:anywhere}
@media(max-width:900px){.sidebar{padding:18px 9px}.brand{padding:0 7px 22px}.topbar{padding:0 18px}.content{padding:18px}.stats{grid-template-columns:1fr 1fr}.grid-2{grid-template-columns:1fr}.top-actions #clock{display:none}}
@media(max-width:600px){.stats{grid-template-columns:1fr}.form-grid,.mapping-grid,.import-steps{grid-template-columns:1fr}.topbar p{display:none}.content{padding:12px}.topbar{height:76px}.topbar h1{font-size:20px}}
