:root{--bg: #f6f7f9;--panel: #ffffff;--line: #e6e8ec;--line-strong: #d4d8de;--text: #1f2329;--text-2: #5c6470;--text-3: #8f97a3;--brand: #2f6feb;--brand-weak: #eaf1ff;--danger: #d93f3f;--danger-weak: #fdecec;--warn: #b4791a;--warn-weak: #fdf3e2;--ok: #1f9254;--ok-weak: #e8f6ee;--shadow: 0 1px 2px rgba(16, 24, 40, .04), 0 4px 16px rgba(16, 24, 40, .06);--radius: 10px;--st-produce: #f59e0b;--st-produce-bg: #fff5e6;--st-qc: #0e9fbe;--st-qc-bg: #e6f7fb;--st-client: #7c5cf0;--st-client-bg: #f1edff;--st-pass: #c99a10;--st-pass-bg: #fdf6dc;--st-rework: #14a06b;--st-rework-bg: #e6f7f0}*{box-sizing:border-box}html,body{margin:0;padding:0;background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,Hiragino Sans GB,sans-serif;font-size:14px;-webkit-font-smoothing:antialiased}a{color:inherit;text-decoration:none}button{font-family:inherit}.topbar{height:56px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:16px;padding:0 24px;position:sticky;top:0;z-index:20}.logo{font-weight:650;font-size:15px;letter-spacing:.2px;display:flex;align-items:center;gap:8px}.logo-mark{width:22px;height:22px;border-radius:6px;background:linear-gradient(135deg,#2f6feb,#6f9bff);display:grid;place-items:center;color:#fff;font-size:12px;font-weight:700}.topbar nav{display:flex;gap:4px;margin-left:8px}.topbar nav a{padding:7px 12px;border-radius:8px;color:var(--text-2);font-size:13px}.topbar nav a.active{background:var(--brand-weak);color:var(--brand);font-weight:600}.spacer{flex:1}.bell{position:relative;display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:8px;border:1px solid var(--line);background:#fff;cursor:pointer;font-size:13px;color:var(--text-2)}.bell .dot{min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:var(--danger);color:#fff;font-size:11px;display:grid;place-items:center;font-weight:600}.who{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--text-2)}.page{max-width:1320px;margin:0 auto;padding:20px 24px 64px}.page-head{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap}.page-title{font-size:20px;font-weight:650;margin:0}.crumb{font-size:13px;color:var(--text-3);display:flex;gap:6px;align-items:center;margin-bottom:10px}.crumb a:hover{color:var(--brand)}.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow)}.card-head{padding:14px 16px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px}.card-title{font-weight:600;font-size:14px}.card-body{padding:16px}.muted{color:var(--text-3)}.small{font-size:12px}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.pill{display:inline-flex;align-items:center;gap:5px;height:24px;padding:0 10px;border-radius:12px;font-size:12px;font-weight:600;white-space:nowrap}.pill:before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor;opacity:.9}.pill.plain:before{display:none}.st-PRODUCING{color:var(--st-produce);background:var(--st-produce-bg)}.st-SELF_QC{color:var(--st-qc);background:var(--st-qc-bg)}.st-CLIENT_QC{color:var(--st-client);background:var(--st-client-bg)}.st-CLIENT_PASSED{color:var(--st-pass);background:var(--st-pass-bg)}.st-REWORK{color:var(--st-rework);background:var(--st-rework-bg)}.tag{display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:6px;font-size:12px;background:#f1f3f5;color:var(--text-2)}.tag.warn{background:var(--warn-weak);color:var(--warn)}.tag.danger{background:var(--danger-weak);color:var(--danger)}.tag.ok{background:var(--ok-weak);color:var(--ok)}.tag.brand{background:var(--brand-weak);color:var(--brand)}.tag.green{background:var(--ok-weak);color:var(--ok)}.tag.red{background:var(--danger-weak);color:var(--danger)}.tag.orange{background:var(--warn-weak);color:var(--warn)}.tag.gray{background:#f1f3f5;color:var(--text-2)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:34px;padding:0 14px;border-radius:8px;border:1px solid var(--line-strong);background:#fff;color:var(--text);font-size:13px;font-weight:500;cursor:pointer;transition:.15s}.btn:hover:not(:disabled){border-color:#b9c0ca;background:#fafbfc}.btn:disabled{opacity:.45;cursor:not-allowed}.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}.btn.primary:hover:not(:disabled){background:#2861d4}.btn.danger{background:var(--danger);border-color:var(--danger);color:#fff}.btn.ghost{border-color:transparent;background:transparent;color:var(--text-2)}.btn.sm{height:28px;padding:0 10px;font-size:12px}.btn.block{width:100%}.toolbar{display:flex;align-items:center;gap:10px;padding:12px 16px;border-bottom:1px solid var(--line);flex-wrap:wrap}.seg{display:inline-flex;background:#f1f3f5;border-radius:8px;padding:3px;gap:2px}.seg button{border:0;background:transparent;padding:5px 12px;border-radius:6px;font-size:13px;color:var(--text-2);cursor:pointer}.seg button.on{background:#fff;color:var(--text);font-weight:600;box-shadow:0 1px 2px #10182814}.search{height:32px;border:1px solid var(--line-strong);border-radius:8px;padding:0 10px;font-size:13px;width:220px;outline:none;background:#fff}.search:focus{border-color:var(--brand);box-shadow:0 0 0 3px #2f6feb1f}table.grid{width:100%;border-collapse:separate;border-spacing:0;font-size:13px}table.grid th{text-align:left;font-weight:500;color:var(--text-3);font-size:12px;padding:10px 12px;background:#fafbfc;border-bottom:1px solid var(--line);white-space:nowrap;position:sticky;top:0;z-index:2}table.grid td{padding:11px 12px;border-bottom:1px solid #f1f2f4;vertical-align:middle}table.grid tbody tr{cursor:pointer}table.grid tbody tr:hover td{background:#f8fafd}.cust{font-weight:600}.proj{font-weight:500}.sub{color:var(--text-3);font-size:12px}.empty{padding:48px 16px;text-align:center;color:var(--text-3)}.detail-grid{display:grid;grid-template-columns:minmax(0,1fr) 340px;gap:16px;align-items:start}@media(max-width:1080px){.detail-grid{grid-template-columns:1fr}}.meta-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 18px}.meta-item .k{font-size:12px;color:var(--text-3);margin-bottom:3px}.meta-item .v{font-size:13px;font-weight:500}.stepper{display:flex;align-items:center;gap:0;padding:4px 0}.step{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.step .num{width:22px;height:22px;border-radius:11px;border:1.5px solid var(--line-strong);color:var(--text-3);display:grid;place-items:center;font-size:11px;font-weight:700;background:#fff;flex:none}.step .label{font-size:13px;color:var(--text-3);white-space:nowrap}.step.done .num{background:var(--ok);border-color:var(--ok);color:#fff}.step.done .label{color:var(--text-2)}.step.current .num{background:var(--brand);border-color:var(--brand);color:#fff;box-shadow:0 0 0 4px #2f6feb24}.step.current .label{color:var(--text);font-weight:650}.step .bar{flex:1;height:2px;background:var(--line);margin:0 10px;min-width:12px}.step.done .bar{background:var(--ok)}.timeline{padding:4px 0}.tl-item{display:grid;grid-template-columns:18px minmax(0,1fr);gap:12px;position:relative;padding-bottom:18px}.tl-rail{display:flex;flex-direction:column;align-items:center}.tl-dot{width:10px;height:10px;border-radius:50%;background:var(--line-strong);margin-top:6px;flex:none}.tl-item.done .tl-dot{background:var(--ok)}.tl-line{flex:1;width:2px;background:var(--line);margin-top:6px}.tl-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.tl-title{font-weight:600;font-size:13.5px}.tl-time{color:var(--text-3);font-size:12px}.tl-body{margin-top:6px;font-size:13px;color:var(--text-2);line-height:1.6}.tl-note{background:#fafbfc;border:1px solid var(--line);border-radius:8px;padding:8px 10px;margin-top:8px;white-space:pre-wrap;color:var(--text-2)}.artifact{display:flex;align-items:center;gap:10px;border:1px solid var(--line);border-radius:8px;padding:8px 10px;margin-top:8px;background:#fff}.artifact:hover{border-color:var(--brand)}.artifact .ico{width:28px;height:28px;border-radius:7px;background:var(--brand-weak);color:var(--brand);display:grid;place-items:center;font-size:13px;flex:none}.issues{margin:8px 0 0;padding-left:0;list-style:none}.issues li{display:flex;gap:8px;font-size:13px;padding:4px 0}.issues .idx{width:18px;height:18px;border-radius:5px;background:var(--danger-weak);color:var(--danger);font-size:11px;display:grid;place-items:center;flex:none;font-weight:700}.side{position:sticky;top:72px;display:flex;flex-direction:column;gap:12px}.incoming{border:1px solid #bcd2ff;background:linear-gradient(180deg,#f4f8ff,#fff);border-radius:var(--radius);padding:14px 16px;box-shadow:var(--shadow)}.incoming h4{margin:0 0 6px;font-size:13.5px}.actions{display:flex;flex-direction:column;gap:8px}.action-item{border:1px solid var(--line);border-radius:8px;padding:10px}.action-item .hint{font-size:12px;color:var(--text-3);margin-top:4px;line-height:1.5}.action-item .reason{font-size:12px;color:var(--warn);margin-top:6px}.modal-mask{position:fixed;top:0;right:0;bottom:0;left:0;background:#1018286b;display:grid;place-items:center;z-index:100;padding:24px}.modal{background:#fff;border-radius:14px;width:560px;max-width:100%;max-height:90vh;overflow:auto;box-shadow:0 24px 60px #1018283d}.modal-head{padding:18px 20px 0}.modal-head h3{margin:0;font-size:16px}.modal-head p{margin:6px 0 0;color:var(--text-3);font-size:13px;line-height:1.55}.modal-body{padding:16px 20px;display:flex;flex-direction:column;gap:14px}.modal-foot{padding:0 20px 18px;display:flex;justify-content:flex-end;gap:8px}.field label{display:block;font-size:12.5px;color:var(--text-2);margin-bottom:6px;font-weight:500}.field textarea,.field input[type=text]{width:100%;border:1px solid var(--line-strong);border-radius:8px;padding:9px 10px;font-size:13px;font-family:inherit;outline:none;resize:vertical}.field textarea:focus,.field input:focus{border-color:var(--brand);box-shadow:0 0 0 3px #2f6feb1f}.drop{border:1.5px dashed var(--line-strong);border-radius:10px;padding:18px;text-align:center;color:var(--text-3);font-size:13px;cursor:pointer;background:#fafbfc}.drop:hover,.drop.has{border-color:var(--brand);background:var(--brand-weak);color:var(--brand)}.progress{height:6px;border-radius:3px;background:#eef0f3;overflow:hidden}.progress>i{display:block;height:100%;background:var(--brand);transition:width .2s}.alert{border-radius:8px;padding:10px 12px;font-size:13px;line-height:1.5}.alert.error{background:var(--danger-weak);color:var(--danger)}.alert.ok{background:var(--ok-weak);color:var(--ok)}.alert.info{background:var(--brand-weak);color:#234f9e}.login-wrap{min-height:100vh;display:grid;place-items:center;background:radial-gradient(1200px 600px at 50% -10%,#e9f0ff 0%,var(--bg) 60%);padding:24px}.login-card{width:380px;background:#fff;border:1px solid var(--line);border-radius:16px;box-shadow:0 24px 60px #1018281f;padding:28px}.login-card h1{margin:0 0 6px;font-size:19px}.login-card p{margin:0 0 20px;color:var(--text-3);font-size:13px}.login-card .field{margin-bottom:14px}.login-card input{height:38px}.hint-users{margin-top:16px;font-size:12px;color:var(--text-3);line-height:1.7;border-top:1px dashed var(--line);padding-top:12px}.badge-mini{font-size:11px;padding:1px 6px;border-radius:4px;background:#eef2f8;color:#5b6b85}.crumbs{display:flex;gap:8px;align-items:center;font-size:13px;color:var(--text-3);margin-bottom:12px}.crumbs a:hover{color:var(--brand)}.kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin-bottom:16px}@media(max-width:900px){.kpis{grid-template-columns:repeat(2,minmax(0,1fr))}}.kpi{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:14px 16px;position:relative;overflow:hidden}.kpi:after{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--line-strong)}.kpi.accent-orange:after{background:#f59e0b}.kpi.accent-red:after{background:var(--danger)}.kpi.accent-green:after{background:var(--ok)}.kpi-label{font-size:12px;color:var(--text-3)}.kpi-value{font-size:26px;font-weight:650;line-height:1.3;letter-spacing:-.3px}.kpi-sub{font-size:12px;color:var(--text-3);line-height:1.5}.stage{display:inline-flex;align-items:center;gap:5px;height:24px;padding:0 10px;border-radius:12px;font-size:12px;font-weight:600;white-space:nowrap}.stage:before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor;opacity:.9}.stage.s-PRODUCING{color:var(--st-produce);background:var(--st-produce-bg)}.stage.s-SELF_QC{color:var(--st-qc);background:var(--st-qc-bg)}.stage.s-CLIENT_QC{color:var(--st-client);background:var(--st-client-bg)}.stage.s-CLIENT_PASSED{color:var(--st-pass);background:var(--st-pass-bg)}.stage.s-REWORK{color:var(--st-rework);background:var(--st-rework-bg)}.card-body.flush{padding:0}table.grid tbody tr.group-row{cursor:default}table.grid tbody tr.group-row td{background:#fbfcfd;font-size:12px;color:var(--text-2);font-weight:600;padding:8px 12px}table.grid tbody tr.group-row:hover td{background:#fbfcfd}table.grid tbody tr.row-todo td{background:#fdfaf3}table.grid tbody tr.row-todo:hover td{background:#fbf5e9}.cell-link{font-weight:600}.cell-link:hover{color:var(--brand)}.whochip{display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:6px;font-size:12px;background:var(--brand-weak);color:var(--brand)}.whochip.overdue{background:var(--danger-weak);color:var(--danger)}select{height:32px;border:1px solid var(--line-strong);border-radius:8px;padding:0 8px;font-size:13px;background:#fff;color:var(--text);outline:none}.meta-label{font-size:12px;color:var(--text-3);margin-bottom:3px}.meta-grid>div>div:last-child{font-size:13px;font-weight:500}.due-cell{display:flex;align-items:baseline;gap:8px}.link-btn{padding:0;border:none;background:none;color:var(--brand);font-size:12px;cursor:pointer}.link-btn:hover{text-decoration:underline}.due-edit{display:flex;align-items:center;gap:6px;margin-top:6px}.due-edit input{padding:3px 6px;font-size:12px;border:1px solid var(--line);border-radius:6px;background:#fff}.due-history{margin-top:10px;padding-top:8px;border-top:1px dashed var(--line)}.due-history-row{line-height:1.7}.steps{display:flex;align-items:center;gap:10px;margin-top:18px;padding-top:16px;border-top:1px dashed var(--line);flex-wrap:wrap}.steps .step{display:inline-flex;align-items:center;gap:8px;flex:1}.step-dot{width:22px;height:22px;border-radius:11px;border:1.5px solid var(--line-strong);color:var(--text-3);display:grid;place-items:center;font-size:11px;font-weight:700;background:#fff;flex:none}.steps .step>span:last-child{font-size:13px;color:var(--text-3);white-space:nowrap}.steps .step.done .step-dot{background:var(--ok);border-color:var(--ok);color:#fff}.steps .step.done>span:last-child{color:var(--text-2)}.steps .step.current .step-dot{background:var(--brand);border-color:var(--brand);color:#fff;box-shadow:0 0 0 4px #2f6feb24}.steps .step.current>span:last-child{color:var(--text);font-weight:650}.steps .step.danger .step-dot{background:var(--st-rework);border-color:var(--st-rework);color:#fff;box-shadow:0 0 0 4px #14a06b24}.steps .step.danger>span:last-child{color:var(--st-rework);font-weight:650}.files{display:flex;flex-direction:column;gap:8px;margin:10px 0 0}.file{display:flex;align-items:center;gap:10px;border:1px solid var(--line);border-radius:8px;padding:8px 10px;background:#fff}.file:hover{border-color:var(--brand)}.file-kind{font-size:11px;padding:2px 7px;border-radius:5px;background:var(--brand-weak);color:var(--brand);font-weight:600;flex:none}.file-name{font-size:13px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.note-box{margin-top:10px;background:#fafbfc;border:1px solid var(--line);border-radius:8px;padding:8px 10px;font-size:13px;color:var(--text-2);line-height:1.6}ol.timeline{list-style:none;margin:0;padding:4px 0 0}.tl-item{display:grid;grid-template-columns:14px minmax(0,1fr);gap:12px;position:relative;padding-bottom:18px}.tl-item:last-child{padding-bottom:0}.tl-line{position:absolute;left:6px;top:14px;bottom:0;width:2px;background:var(--line)}.tl-item:last-child .tl-line{display:none}.tl-dot{width:10px;height:10px;border-radius:50%;background:var(--line-strong);margin-top:5px;margin-left:1px;z-index:1}.tl-item.pending .tl-dot{background:var(--brand);box-shadow:0 0 0 4px #2f6feb24}.tl-body{min-width:0}.tl-top{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.tl-flow{display:inline-flex;align-items:center;gap:6px}.issues ol{margin:6px 0 0;padding-left:18px;font-size:13px;color:var(--text-2);line-height:1.7}.action-hint{font-size:12px;color:var(--text-3);margin-top:6px;line-height:1.5}.btn.disabled{opacity:.45;cursor:not-allowed}.dropzone{border:1.5px dashed var(--line-strong);border-radius:10px;padding:18px;text-align:center;color:var(--text-3);font-size:13px;cursor:pointer;background:#fafbfc;line-height:1.7}.dropzone:hover,.dropzone.has{border-color:var(--brand);background:var(--brand-weak);color:var(--brand)}.progress{position:relative;height:8px;border-radius:4px;background:#eef0f3;overflow:hidden}.progress-bar{height:100%;background:var(--brand);transition:width .2s}.progress span{position:absolute;right:0;top:-18px;color:var(--text-3)}.overdue{color:var(--danger);font-weight:600}.login-card .field input{width:100%;border:1px solid var(--line-strong);border-radius:8px;padding:0 10px;font-size:13px;font-family:inherit;outline:none}.login-card .field input:focus{border-color:var(--brand);box-shadow:0 0 0 3px #2f6feb1f}.modal-body .field label{display:block;font-size:12.5px;color:var(--text-2);margin-bottom:6px;font-weight:500}.modal-body .field textarea{width:100%;border:1px solid var(--line-strong);border-radius:8px;padding:9px 10px;font-size:13px;font-family:inherit;outline:none;resize:vertical}.modal-body .field textarea:focus{border-color:var(--brand);box-shadow:0 0 0 3px #2f6feb1f}.board-top{display:flex;align-items:center;gap:10px;margin-bottom:14px;flex-wrap:wrap}.board-title{font-size:20px;font-weight:650;letter-spacing:-.2px;display:flex;align-items:baseline;gap:10px}.board-sub{font-size:12.5px;font-weight:400;color:var(--text-3)}.stat-strip{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:10px;margin-bottom:16px}@media(max-width:1320px){.stat-strip{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(max-width:1200px){.stat-strip{grid-template-columns:repeat(3,minmax(0,1fr))}}.stat{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:10px 12px;position:relative;overflow:hidden}.stat:after{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:#dfe3e9}.stat.accent-orange:after{background:#f59e0b}.stat.accent-red:after{background:var(--danger)}.stat.accent-blue:after{background:var(--brand)}.stat-k{display:block;font-size:12px;color:var(--text-3)}.stat-v{display:block;font-size:22px;font-weight:650;line-height:1.35;letter-spacing:-.3px}.stat-s{display:block;font-size:11.5px;color:var(--text-3)}.lanes{display:flex;flex-direction:column;gap:14px}.lane{background:var(--panel);border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow);padding:12px 14px 14px}.lane-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding-bottom:8px}.lane-id{display:inline-flex;align-items:center;gap:6px}.lane-customer{font-size:12px;color:var(--text-2);background:#f2f4f7;border-radius:5px;padding:1px 6px}.lane-sep{color:var(--text-3)}.lane-code{font-size:15px;font-weight:650}.lane-meta{font-size:12px;color:var(--text-3)}.lane-people{font-size:12px;color:var(--text-3);border-left:1px solid var(--line);padding-left:8px}.pstage{font-size:11.5px;font-weight:600;padding:1px 7px;border-radius:5px;border:1px solid transparent}.ps-trial{color:#b45309;background:#fff7ea;border-color:#f6dfc0}.ps-deliver{color:#1d4ed8;background:#eef3fe;border-color:#d5e2fb}.ps-accepted{color:#15803d;background:#eefaf2;border-color:#cdebd8}.ps-lost,.ps-idle{color:var(--text-3);background:#f4f5f7;border-color:var(--line)}.tag.amber{color:#b45309;background:#fff7ea}.lane-bar{height:4px;border-radius:2px;background:#eef0f3;overflow:hidden;margin-bottom:12px}.lane-bar i{display:block;height:100%;background:linear-gradient(90deg,#7fd1a8,#35b06f)}.pipe{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;align-items:start}.col{position:relative;border:1px solid var(--line);border-radius:10px;background:#fcfdfe;padding:8px;min-height:58px}.col:not(:last-child):after{content:"→";position:absolute;right:-13px;top:14px;font-size:14px;color:#c3c9d2;z-index:1}.col-head{display:flex;align-items:center;gap:6px;padding:2px 2px 4px;border-bottom:1px dashed var(--line);margin-bottom:6px}.col-idx{width:16px;height:16px;border-radius:8px;font-size:10px;display:grid;place-items:center;background:#eef1f5;color:var(--text-2);font-weight:700}.col-name{font-size:12.5px;font-weight:650}.col-count{font-size:11px;color:var(--text-2);background:#eef1f5;border-radius:8px;padding:0 6px}.col-hint{font-size:11px;color:var(--text-3);padding:0 2px 6px}.col-producing{background:#fffdf8;border-color:#f3e3c9}.col-self_qc{background:#f8fdff;border-color:#d3ecf7}.col-client_qc{background:#fbf9ff;border-color:#e0d8fb}.col-client_passed{background:#f9fdfa;border-color:#d6ebdc}.col-body{display:flex;flex-direction:column;gap:6px}.col-empty{font-size:11.5px;color:#b9c0ca;text-align:center;padding:8px 0}.bcard{display:block;background:#fff;border:1px solid var(--line);border-radius:8px;padding:7px 9px;transition:border-color .12s,box-shadow .12s,transform .12s}.bcard:hover{border-color:var(--brand);box-shadow:0 2px 8px #14285014;transform:translateY(-1px)}.bcard.is-mine{border-color:var(--brand);background:#f7faff;box-shadow:0 0 0 2px #2f6feb14}.bcard.is-late{border-left:3px solid var(--danger)}.bcard.is-done{opacity:.72;background:#fbfdfb}.bcard-top{display:flex;align-items:baseline;gap:6px}.bcard-title{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bcard-vol{margin-left:auto;font-size:11.5px;color:var(--text-3);flex:none}.bcard-meta{display:flex;align-items:center;gap:4px;font-size:11.5px;color:var(--text-2);margin-top:2px;overflow:hidden;white-space:nowrap}.bcard-who{font-weight:500}.bcard-dot,.bcard-ago{color:var(--text-3)}.bcard-flags{display:flex;flex-wrap:wrap;gap:4px;margin-top:5px}.bcard-flags:empty{display:none}.flag{font-size:10.5px;line-height:16px;padding:0 5px;border-radius:4px;font-weight:600;white-space:nowrap}.flag.mine{color:#fff;background:var(--brand)}.flag.late{color:#fff;background:var(--danger)}.flag.rework{color:#0f7a55;background:#e7f7f0}.flag.stale{color:#b45309;background:#fff6e6}.flag.warn{color:#b91c1c;background:#fdecec}.flag.ghost{color:var(--text-3);background:#f2f4f7}.rework-lane{margin-top:10px;border:1px dashed #b9e3cd;background:#f7fdfa;border-radius:10px;padding:8px 10px 10px}.rework-tag{display:flex;align-items:center;gap:6px;font-size:12px;font-weight:650;color:#0f7a55;margin-bottom:6px}.rework-arrow{font-size:14px}.rework-note{font-weight:400;font-size:11.5px;color:var(--text-3)}.rework-cards{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}.finished{margin-top:16px;background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:10px 14px}.finished summary{cursor:pointer;font-size:13px;color:var(--text-2)}.finished ul{margin:8px 0 0;padding-left:18px;font-size:13px;line-height:1.9;color:var(--text-2)}.work-grid{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:16px;align-items:start}@media(max-width:1100px){.work-grid{grid-template-columns:minmax(0,1fr)}}.work-main{display:flex;flex-direction:column;gap:14px;min-width:0}.worksection{background:var(--panel);border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow);overflow:hidden}.worksection>header{display:flex;align-items:center;gap:8px;padding:10px 14px;border-bottom:1px solid var(--line);background:#fbfcfd}.worksection.urgent>header{background:#fff8f4;border-bottom-color:#f6dccd}.worksection.urgent{border-color:#f3d9cb}.worksection.quiet>header{background:#fafbfc}.ws-title{font-size:13px;font-weight:650}.ws-count{font-size:11px;background:#eef1f5;border-radius:8px;padding:0 6px;color:var(--text-2)}.worksection.urgent .ws-count{background:var(--danger);color:#fff}.ws-hint{font-size:11.5px;color:var(--text-3)}.workrow{display:flex;align-items:center;gap:12px;padding:9px 14px;border-bottom:1px solid #f1f3f6}.workrow:last-child{border-bottom:none}.workrow:hover{background:#fbfcfe}.workrow.is-late{background:#fffaf8}.wr-main{min-width:0;flex:1}.wr-title{font-size:13px;font-weight:600;display:inline-flex;align-items:baseline;gap:8px}.wr-title:hover{color:var(--brand)}.wr-batch{font-weight:400;font-size:12px;color:var(--text-3);background:#f2f4f7;border-radius:4px;padding:0 5px}.wr-sub{display:flex;align-items:center;gap:8px;margin-top:4px;font-size:11.5px;color:var(--text-3)}.wr-side{text-align:right;flex:none;font-size:12px}.load-list{padding:6px 12px 10px;display:flex;flex-direction:column;gap:2px}.loadrow{display:grid;grid-template-columns:62px minmax(0,1fr) 24px;gap:8px;align-items:center;padding:4px 0;border-bottom:1px solid #f4f6f8}.loadrow:last-child{border-bottom:none}.load-name{font-size:12.5px}.load-bar{height:6px;border-radius:3px;background:#eef0f3;overflow:hidden}.load-bar i{display:block;height:100%;background:#9db8e8;border-radius:3px}.loadrow.is-over .load-bar i{background:var(--danger)}.loadrow.is-over .load-num{color:var(--danger);font-weight:700}.load-num{font-size:12px;text-align:right}.load-detail{grid-column:2 / 4;font-size:10.5px;margin-top:-2px}.tips p{margin:0 0 6px;font-size:12px;color:var(--text-2);line-height:1.7}.tips p:last-child{margin-bottom:0}.cust-group{display:flex;flex-direction:column;gap:10px}.cust-head{display:flex;align-items:center;gap:10px;padding:2px 2px 0;border-bottom:1px solid var(--line);margin-top:4px}.cust-name{font-size:13.5px;font-weight:700;color:var(--text)}.cust-count,.cust-meta{font-size:11.5px;color:var(--text-3)}.lane.compact{padding:8px 12px 10px}.lane.compact .lane-head{padding-bottom:4px}.lane.compact .lane-bar{margin-bottom:8px}.lane.compact .col{min-height:0;padding:6px}.lane.compact .col-hint{display:none}.lane.compact .col-head{margin-bottom:4px;padding-bottom:3px}.lane.compact .col-empty{padding:2px 0;font-size:11px}.lane-head{cursor:pointer}.lane-head:hover .lane-code{color:var(--brand)}.lane-caret{width:10px;flex:none;font-size:10px;color:#a7adb6}.lane.is-closed .lane-owners{border-bottom:0}.lane-mini{display:flex;gap:10px;margin-left:14px;font-size:12px;color:#bcc1c9;white-space:nowrap}.lane-mini .mini-on{color:#5b6472;font-weight:600}.lane-owners{display:flex;align-items:center;gap:14px;padding:2px 12px 8px;font-size:12px;color:var(--muted)}.own-item{display:inline-flex;align-items:center;gap:5px;white-space:nowrap}.own-item b{font-weight:600;color:#3d4753}.own-dot{width:6px;height:6px;border-radius:50%;display:inline-block}.own-produce{background:#f0a04b}.own-qc{background:#3fa9c9}.own-client{background:#8b7bd8}.own-owner{background:#6b7280}.lane-bar-inline{display:block;width:120px;height:4px;background:#eef1f5;border-radius:3px;overflow:hidden}.lane-bar-inline i{display:block;height:100%;background:#3fa96b;border-radius:3px}.lanes-hint{font-size:12px;color:var(--muted);margin:2px 0 10px}.board-divider{width:1px;height:18px;background:var(--line)}.lane-caret{width:0;height:0;flex:none;border-left:5px solid #b6bcc5;border-top:4px solid transparent;border-bottom:4px solid transparent;transition:transform .15s;margin-right:2px}.lane:not(.is-closed) .lane-caret{transform:rotate(90deg)}.lane.is-closed{padding:8px 12px}.lane.is-closed .lane-head{padding:0}.lane.is-closed .lane-owners{padding:2px 0 0 14px}.lane-caret-btn{width:18px;height:18px;flex:none;display:inline-flex;align-items:center;justify-content:center;padding:0;border:0;border-radius:4px;background:transparent;cursor:pointer}.lane-caret-btn:hover{background:#eef1f5}.lane-open-hint{font-size:12px;color:#a7adb6;margin-left:10px;white-space:nowrap}.lane-head:hover .lane-open-hint{color:var(--brand, #2f6feb)}.bell.on{background:#eaf1ff;border-color:#c9dbff;color:var(--brand, #2f6feb)}.drawer-wrap{position:fixed;top:0;right:0;bottom:0;left:0;z-index:90}.drawer-mask{position:absolute;top:0;right:0;bottom:0;left:0;background:#171c2652;animation:mask-in .16s ease-out}@keyframes mask-in{0%{opacity:0}to{opacity:1}}.drawer{position:absolute;top:0;right:0;bottom:0;max-width:92vw;display:flex;flex-direction:column;background:#fff;border-left:1px solid #e6e9ee;box-shadow:-18px 0 40px #141a2629;animation:drawer-in .2s cubic-bezier(.22,.61,.36,1)}@keyframes drawer-in{0%{transform:translate(24px);opacity:.6}to{transform:translate(0);opacity:1}}.drawer-head{display:flex;align-items:flex-start;gap:12px;padding:16px 18px 14px;border-bottom:1px solid #eef1f5}.drawer-titles{min-width:0}.drawer-title{font-size:16px;font-weight:700;color:#1b2130}.drawer-sub{margin-top:4px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:12px;color:#6b7280}.drawer-x{margin-left:auto;width:28px;height:28px;border:1px solid #e6e9ee;border-radius:8px;background:#fff;color:#6b7280;font-size:18px;line-height:1;cursor:pointer}.drawer-x:hover{background:#f3f5f8}.drawer-body{flex:1;overflow:auto;padding:14px 18px 20px}.drawer-foot{display:flex;gap:8px;justify-content:flex-end;padding:12px 18px;border-top:1px solid #eef1f5;background:#fafbfd}.drawer-sec{margin:16px 0 8px;font-size:12px;font-weight:700;color:#8b93a1;letter-spacing:.04em}.drawer-sec:first-child{margin-top:0}.drawer-alert{display:flex;gap:6px;flex-wrap:wrap;margin-top:12px}.inbox{display:grid;gap:10px}.inbox-row{border:1px solid #e6e9ee;border-radius:10px;padding:12px;background:#fff}.inbox-row.is-late{border-color:#f3c2b8;background:#fff9f7}.inbox-top{display:flex;align-items:center;gap:8px}.inbox-title{font-weight:650;color:#1b2130;text-decoration:none}.inbox-title:hover{color:var(--brand, #2f6feb)}.inbox-meta{display:flex;gap:12px;flex-wrap:wrap;margin-top:6px;font-size:12px;color:#6b7280}.inbox-files{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px}.inbox-note{margin-top:8px;padding:8px 10px;background:#f7f8fa;border-radius:8px;font-size:12px;color:#4b5563;white-space:pre-wrap}.inbox-actions{display:flex;gap:8px;margin-top:10px}.small-empty{padding:22px 0;font-size:13px}.notifies{display:grid;gap:8px}.notify{display:flex;align-items:center;gap:10px;padding:8px 0;border-bottom:1px dashed #eef1f5}.notify:last-child{border-bottom:0}.notify-main{flex:1;min-width:0}.mem-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px 14px}.mem{display:flex;align-items:center;gap:6px;font-size:13px}.mem-role{color:#8b93a1;font-size:12px;min-width:44px}.dlist{display:grid;gap:14px}.dgroup-head{display:flex;align-items:center;gap:8px;margin-bottom:6px}.drow{display:grid;grid-template-columns:minmax(0,1fr) 88px 76px 56px 46px;gap:8px;align-items:center;padding:7px 8px;border-radius:8px;color:#2b3342;text-decoration:none;font-size:13px}.drow:hover{background:#f4f6f9}.drow-name{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.drow-who{color:#4b5563;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.drow-date{text-align:right;font-size:12px}.drow-vol{text-align:right;color:#8b93a1;font-size:12px}.drow-edit{font-size:12px;padding:3px 6px;border:1px solid var(--line);border-radius:999px;background:#fff;color:#6b7280;cursor:pointer;white-space:nowrap}.drow-edit:hover,.drow-edit.on{border-color:var(--brand);color:var(--brand);background:#f2f6ff}.drow-panel{margin:2px 0 8px;padding:10px 12px;border:1px solid var(--line);border-radius:8px;background:#fafbfd;max-height:62vh;overflow:auto}.drow-panel-foot{position:sticky;bottom:0;display:flex;justify-content:flex-end;gap:8px;margin-top:10px;padding-top:8px;background:#fafbfd}.ledger th{white-space:nowrap}.ledger .pick{width:34px;text-align:center;padding-left:8px;padding-right:0}.ledger td.pick input,.ledger th.pick input{cursor:pointer}.ledger tr.row-pick td{background:#f3f7ff}.th-sort{display:inline-flex;align-items:center;gap:3px;padding:0;border:0;background:transparent;font:inherit;color:inherit;cursor:pointer}.th-sort:hover{color:var(--brand, #2f6feb)}.sort-arrow{font-size:10px;color:var(--brand, #2f6feb)}.bulkbar{position:fixed;left:50%;bottom:20px;transform:translate(-50%);z-index:60;display:flex;align-items:center;gap:12px;padding:10px 14px;border-radius:12px;border:1px solid #dbe3ef;background:#fff;box-shadow:0 12px 32px #141a2624}.bulk-count{font-weight:700;color:#1b2130;white-space:nowrap}.bulk-field{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:#6b7280;white-space:nowrap}.bulk-field select,.bulk-field input[type=date]{height:30px;font-size:13px}.ledger td,.ledger th,.ledger td .tag{white-space:nowrap}.lane-caret-btn{width:22px;height:22px}.ledger{font-size:13px}.drawer-sec{display:flex;align-items:center;gap:8px}.proj-actions{display:flex;flex-wrap:wrap;gap:8px;padding:0 12px 10px}.inline-form{margin:0 12px 12px;padding:12px;border:1px dashed var(--line);border-radius:10px;background:#fbfcfd;display:grid;gap:8px}.form-row{display:grid;grid-template-columns:64px 1fr;align-items:center;gap:10px;font-size:13px}.form-row>label{color:var(--muted)}.form-row>.hint{grid-column:1 / -1;line-height:1.5}.form-row input,.form-row select{width:100%;box-sizing:border-box;padding:5px 8px;font-size:13px;border:1px solid var(--line);border-radius:7px;background:#fff}.form-check{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--muted)}.form-foot{display:flex;justify-content:flex-end;gap:8px;padding-top:4px}.rollback-row{display:flex;align-items:center;gap:10px;margin-top:16px;padding-top:12px;border-top:1px dashed var(--line)}.danger-text{color:var(--danger)!important}.issue-pick{display:grid;gap:6px;max-height:180px;overflow:auto;padding:8px;border:1px solid var(--line);border-radius:8px;background:#fbfcfd}.issue-pick-row{display:flex;align-items:flex-start;gap:8px;font-size:13px;line-height:1.5}.issues li.resolved{color:var(--muted);text-decoration:line-through}.modal-head{display:flex;align-items:center;gap:10px;padding:18px 20px 0}.modal-head .card-title{font-size:15px;font-weight:600}.modal{width:min(560px,calc(100vw - 48px))}.acc-box{margin:0 12px 10px;padding:10px 12px;border:1px solid var(--line);border-radius:8px;background:#fbfcfd;display:grid;gap:6px}.acc-line{display:flex;align-items:baseline;gap:8px;font-size:12.5px}.acc-line .link{color:#1d4ed8;text-decoration:none;max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.acc-form{margin:0 12px 10px;padding:12px;border:1px dashed #c8d3e0;border-radius:8px;background:#f8fbff;display:grid;gap:8px}.acc-hint{font-size:12px;color:var(--text-2);line-height:1.6}.acc-form .field{display:grid;grid-template-columns:76px minmax(0,1fr);align-items:center;gap:8px;font-size:12.5px}.st-cols{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px}@media(max-width:1180px){.st-cols{grid-template-columns:1fr}}.st-rows{display:grid;gap:14px}.st-row{display:grid;grid-template-columns:84px 1fr 220px;align-items:center;gap:12px}.st-name{font-size:12.5px;color:#374151;text-align:center}.st-name.plain{color:#6b7280}.st-track{height:10px;border-radius:999px;background:#f0f2f5;overflow:hidden}.st-fill{height:100%;border-radius:999px;background:#94a3b8}.st-fill.s-PRODUCING{background:var(--st-produce)}.st-fill.s-SELF_QC{background:var(--st-qc)}.st-fill.s-CLIENT_QC{background:var(--st-client)}.st-fill.s-REWORK{background:var(--st-rework)}.st-fill.grey{background:#b6c2d1}.st-nums{display:flex;align-items:baseline;gap:8px;font-size:12px;color:#6b7280;flex-wrap:wrap}.st-nums b{color:#111827;font-size:13px}.st-now{color:#b45309}.st-note{margin:4px 0 0;padding:10px 12px;background:#f8fafc;border-radius:8px;font-size:12.5px;line-height:1.7;color:#6b7280}.st-months{display:grid;gap:8px}.st-mrow{display:grid;grid-template-columns:48px 1fr 130px;align-items:center;gap:12px;font-size:12.5px}.st-mlabel{color:#6b7280;text-align:right}.st-mtrack{height:14px;border-radius:6px;background:#f3f5f8;overflow:hidden}.st-mbar{height:100%;border-radius:6px;background:linear-gradient(90deg,#7aa2f7,#4f7ff0)}.st-mnum{color:#374151}.st-table{width:100%;border-collapse:collapse;font-size:13px}.notify-sum{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px}.st-table th{text-align:left;font-weight:500;color:#8a93a0;font-size:12px;padding:8px 10px;border-bottom:1px solid var(--line, #eceff3);white-space:nowrap}.st-table td{padding:9px 10px;border-bottom:1px solid #f3f5f8;color:#374151}.st-table td.num{text-align:left;font-variant-numeric:tabular-nums}.st-table tr.st-warn td:first-child{color:#b45309;font-weight:600}.st-bad{display:inline-block;min-width:20px;padding:1px 6px;border-radius:999px;background:#fde8e8;color:#b91c1c;font-size:12px;text-align:center}.page-tools{display:flex;align-items:center;gap:10px}.toast-ok{margin:0 0 12px;padding:9px 12px;border-radius:8px;background:#ecfdf5;color:#047857;font-size:13px}.err-box{margin:0 0 12px;padding:9px 12px;border-radius:8px;background:#fef2f2;color:#b91c1c;font-size:13px}.form-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px 14px;margin-bottom:14px}@media(max-width:1100px){.form-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}.form-grid label{display:grid;gap:6px;font-size:12.5px;color:#6b7280}.form-grid label.wide{grid-column:1 / -1}.form-grid input,.form-grid select{padding:8px 10px;border:1px solid var(--line, #e5e8ee);border-radius:8px;font-size:13px;background:#fff;color:#111827}.row-actions{display:flex;gap:10px}.inline-edit{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.inline-edit input,.inline-edit select{padding:5px 8px;border:1px solid var(--line, #e5e8ee);border-radius:7px;font-size:12.5px;max-width:130px}.assign-grid{display:flex;align-items:flex-end;gap:10px;padding:0 12px 12px;flex-wrap:wrap}.assign-grid label{display:flex;flex-direction:column;gap:4px;font-size:12px;color:#6b7280}.assign-grid select{min-width:120px}.upload-box{display:grid;gap:6px}.upload-meta{display:flex;align-items:center;gap:8px}.upload-meta .tag{flex:none}.round-card .card-head .tag{margin-left:8px}.round-people{display:flex;flex-wrap:wrap;gap:8px}.round-chip{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border:1px dashed var(--line);border-radius:999px;font-size:13px;color:var(--text-3);background:#fff}.round-chip.ok{border-style:solid;border-color:#b7e1c2;background:#f1faf3;color:#1e7a3c}.round-mark{font-weight:600}.people-pick{display:grid;grid-template-columns:1fr 1fr;gap:6px}.people-pick label{display:flex;align-items:center;gap:8px;padding:6px 10px;border:1px solid var(--line);border-radius:8px;font-size:13px;cursor:pointer}.people-pick label.on{border-color:var(--brand);background:#f2f6ff}.mode-pick{display:flex;gap:8px;flex-wrap:wrap;margin-top:6px}.mode-pick button{font-size:12px;padding:5px 10px;border-radius:999px;border:1px solid var(--line);background:#fff;cursor:pointer}.mode-pick button.on{border-color:var(--brand);color:var(--brand);background:#f2f6ff}
