:root{--bg: #eef1f5;--surf: #ffffff;--surf2: #f4f6f9;--surf3: #eef2f7;--bd: #dde3ec;--bd2: #c8d2df;--ink: #12202f;--ink2: #51657c;--ink3: #8296ac;--pri: #1b5fb8;--pri-ink: #ffffff;--pri-soft: #e7f0fb;--navy: #13293f;--pos: #0a7d45;--pos-s: #e2f3e9;--pos-bd: #bfe3cd;--neg: #c23934;--neg-s: #fbe8e7;--neg-bd: #f0cfcd;--amber: #b5790f;--amber-s: #fbf0da;--sb: #0f1b2b;--sb-edge: #0a131f;--sb2: #17283c;--sb-ink: #9fb2ca;--sb-ink2: #6f87a3;--sb-active: #4f97ec;--radius: 10px;--radius-sm: 8px;--shadow: 0 1px 2px rgba(16,32,52,.05), 0 4px 16px rgba(16,32,52,.05);--mono: "SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace;--font: "Inter", "PingFang SC", "PingFang HK", "Microsoft YaHei", "Segoe UI", system-ui, sans-serif}:root[data-theme=dark]{--bg: #0c141f;--surf: #141f2d;--surf2: #1a2735;--surf3: #1f2d3d;--bd: #27374a;--bd2: #3a4c62;--ink: #e7eef6;--ink2: #a6b6c9;--ink3: #74889f;--pri: #4a90ec;--pri-ink: #081321;--pri-soft: #15273f;--navy: #0e1f31;--pos: #35c07c;--pos-s: #11281d;--pos-bd: #1f4433;--neg: #f0766a;--neg-s: #2a1614;--neg-bd: #4a2420;--amber: #e0a84a;--amber-s: #2a2112;--shadow: 0 1px 2px rgba(0,0,0,.3), 0 8px 24px rgba(0,0,0,.35)}@media (prefers-color-scheme: dark){:root:not([data-theme=light]){--bg: #0c141f;--surf: #141f2d;--surf2: #1a2735;--surf3: #1f2d3d;--bd: #27374a;--bd2: #3a4c62;--ink: #e7eef6;--ink2: #a6b6c9;--ink3: #74889f;--pri: #4a90ec;--pri-ink: #081321;--pri-soft: #15273f;--navy: #0e1f31;--pos: #35c07c;--pos-s: #11281d;--pos-bd: #1f4433;--neg: #f0766a;--neg-s: #2a1614;--neg-bd: #4a2420;--amber: #e0a84a;--amber-s: #2a2112;--shadow: 0 1px 2px rgba(0,0,0,.3), 0 8px 24px rgba(0,0,0,.35)}}*{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%}body{font-family:var(--font);background:var(--bg);color:var(--ink);font-size:14px;-webkit-font-smoothing:antialiased}.tnum{font-variant-numeric:tabular-nums}button{font-family:inherit;cursor:pointer}.shell{display:flex;height:100vh;overflow:hidden}.sidebar{width:240px;flex:none;background:var(--sb);color:var(--sb-ink);border-right:1px solid var(--sb-edge);display:flex;flex-direction:column}.brand{display:flex;align-items:center;gap:11px;padding:18px 18px 16px}.brand .logo{width:34px;height:34px;border-radius:9px;flex:none;display:grid;place-items:center;background:linear-gradient(145deg,#2b6fd0,#143a66);box-shadow:inset 0 1px #ffffff2e}.brand b{color:#fff;font-size:15px;letter-spacing:.2px;line-height:1.2;display:block}.brand small{color:var(--sb-ink2);font-size:11px}.nav-lbl{color:var(--sb-ink2);font-size:10.5px;letter-spacing:1.4px;text-transform:uppercase;font-weight:600;padding:14px 20px 7px}.nav{display:flex;align-items:center;gap:11px;padding:9px 18px;margin:1px 10px;border-radius:8px;color:var(--sb-ink);font-weight:500;font-size:13.5px;cursor:pointer;border:0;background:transparent;width:calc(100% - 20px);text-align:left}.nav svg{opacity:.85;flex:none}.nav:hover{background:var(--sb2);color:#dce6f3}.nav.on{background:#1c4e8a47;color:#fff;box-shadow:inset 2px 0 0 var(--sb-active)}.nav.on svg{opacity:1;color:var(--sb-active)}.nav[disabled]{opacity:.5;cursor:default}.sb-foot{margin-top:auto;padding:12px;border-top:1px solid var(--sb2);display:flex;flex-direction:column;gap:6px}.sb-ctl{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;border-radius:8px;color:var(--sb-ink);font-size:12.5px;font-weight:500}.seg{display:inline-flex;background:var(--sb2);border-radius:7px;padding:2px;gap:2px}.seg button{border:0;background:transparent;color:var(--sb-ink2);font-size:12px;font-weight:600;padding:3px 9px;border-radius:5px}.seg button.on{background:#27405e;color:#fff}.icon-btn{display:inline-grid;place-items:center;width:30px;height:28px;border-radius:6px;border:0;background:var(--sb2);color:var(--sb-ink)}.icon-btn:hover{background:#22364d;color:#fff}.col{flex:1;display:flex;flex-direction:column;min-width:0}.topbar{height:54px;flex:none;background:var(--surf);border-bottom:1px solid var(--bd);display:flex;align-items:center;gap:12px;padding:0 22px}.crumb{color:var(--ink3);font-size:13px;display:flex;align-items:center;gap:7px}.crumb b{color:var(--ink);font-weight:600}.crumb .sep{color:var(--bd2)}.content{flex:1;overflow:auto;padding:22px 26px 48px}.content.narrow{max-width:1120px}.spacer{flex:1}.btn{display:inline-flex;align-items:center;gap:7px;height:36px;padding:0 15px;border-radius:8px;background:var(--pri);color:var(--pri-ink);border:0;font-weight:600;font-size:13.5px}.btn:hover{filter:brightness(1.07)}.btn:disabled{opacity:.45;cursor:not-allowed;filter:none}.btn.ghost{background:var(--surf);color:var(--ink2);border:1px solid var(--bd2)}.btn.ghost:hover{background:var(--surf2);color:var(--ink);filter:none}.btn.sm{height:30px;padding:0 11px;font-size:12.5px}.chip{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:600;padding:3px 10px;border-radius:6px;background:var(--surf2);color:var(--ink2);border:1px solid var(--bd)}.chip.pos{background:var(--pos-s);color:var(--pos);border-color:var(--pos-bd)}.chip.neg{background:var(--neg-s);color:var(--neg);border-color:var(--neg-bd)}.chip.amber{background:var(--amber-s);color:var(--amber);border-color:transparent}.badge{font-size:10px;font-weight:700;padding:2px 7px;border-radius:5px;letter-spacing:.3px}.badge.amber{background:var(--amber-s);color:var(--amber)}.badge.high{background:var(--neg-s);color:var(--neg)}.badge.medium{background:var(--amber-s);color:var(--amber)}.badge.low{background:var(--surf3);color:var(--ink3)}.card{background:var(--surf);border:1px solid var(--bd);border-radius:var(--radius);box-shadow:var(--shadow)}.card-h{display:flex;align-items:center;gap:10px;padding:13px 16px;border-bottom:1px solid var(--bd)}.card-h b{font-size:14px}.card-h .sub{color:var(--ink3);font-size:12px;margin-left:auto}.pad{padding:20px}.page-title{font-size:21px;font-weight:700;letter-spacing:-.3px}.muted{color:var(--ink2)}.subtle{color:var(--ink3);font-size:12.5px}.input{height:38px;padding:0 13px;border-radius:8px;border:1px solid var(--bd2);background:var(--surf);color:var(--ink);font-size:14px;font-family:inherit;width:100%}.input:focus{outline:none;border-color:var(--pri);box-shadow:0 0 0 3px var(--pri-soft)}.jobs-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:16px}.job-card{padding:18px;cursor:pointer;transition:transform .08s,border-color .12s,box-shadow .12s}.job-card:hover{transform:translateY(-2px);border-color:var(--bd2);box-shadow:0 6px 20px #10203414}.job-card h3{font-size:16px;margin-bottom:5px}.job-card .meta{display:flex;gap:10px;margin-top:14px;flex-wrap:wrap}.empty{text-align:center;color:var(--ink3);padding:54px 10px}.empty .big{font-size:15px;color:var(--ink2);margin-bottom:4px}.steps{display:flex;align-items:center;margin-bottom:22px;flex-wrap:wrap;row-gap:10px}.step{display:flex;align-items:center;gap:9px;color:var(--ink3);font-size:13px;font-weight:600}.step .d{width:24px;height:24px;border-radius:50%;background:var(--surf);border:1.5px solid var(--bd2);display:grid;place-items:center;font-size:12px;color:var(--ink3)}.step.on{color:var(--ink)}.step.on .d{background:var(--pri);border-color:var(--pri);color:#fff}.step.done .d{background:var(--pos);border-color:var(--pos);color:#fff}.step.clickable{cursor:pointer}.step .ln{width:42px;height:2px;background:var(--bd2);margin:0 12px}.step.done .ln{background:var(--pos)}.kpis{display:grid;grid-template-columns:repeat(7,1fr);gap:12px;margin-bottom:20px}@media (max-width: 1000px){.kpis{grid-template-columns:repeat(4,1fr)}}@media (max-width: 620px){.kpis{grid-template-columns:repeat(2,1fr)}}.kpi{background:var(--surf);border:1px solid var(--bd);border-radius:10px;padding:13px 14px;position:relative;overflow:hidden}.kpi .t{font-size:11px;color:var(--ink3);font-weight:600;letter-spacing:.3px;margin-bottom:9px}.kpi .flow{display:flex;align-items:baseline;gap:6px}.kpi .c{color:var(--ink3);font-size:13px}.kpi .arr{color:var(--bd2);font-size:11px}.kpi .a{font-size:22px;font-weight:700;letter-spacing:-.5px}.kpi .dl{margin-top:7px;font-size:12px;font-weight:700;display:inline-flex;align-items:center;gap:3px}.kpi .bar{position:absolute;left:0;bottom:0;height:3px}.kpi.net{background:linear-gradient(150deg,#15304d,#0f2338);border-color:#15304d;color:#fff}.kpi.net .t{color:#8fb0d6}.kpi.net .c{color:#7f9dbd}.kpi.net .arr{color:#456}.kpi.net .a{color:#fff}.pos{color:var(--pos)}.neg{color:var(--neg)}.zero{color:var(--ink3)}.kpi.net .pos{color:#5fd998}.kpi.net .neg{color:#ff9f94}.table-wrap{overflow-x:auto}table.cmp{width:100%;border-collapse:collapse;font-size:13px}table.cmp th,table.cmp td{padding:9px 10px;text-align:center;white-space:nowrap}table.cmp thead.g th{background:var(--navy);color:#dce7f4;font-weight:600;font-size:12px;position:sticky;top:0;z-index:2}table.cmp thead.s th{background:var(--surf2);color:var(--ink2);font-size:11px;font-weight:600;position:sticky;top:36px;z-index:2;border-bottom:1px solid var(--bd)}table.cmp th.dno,table.cmp td.dno{text-align:left;font-family:var(--mono);font-weight:600;position:sticky;left:0;background:var(--surf);z-index:1}table.cmp thead.g th.dno{background:var(--navy);z-index:3}table.cmp thead.s th.dno{background:var(--surf2);z-index:3}table.cmp tbody td{border-bottom:1px solid var(--bd)}table.cmp tbody tr:hover td{background:var(--pri-soft);cursor:pointer}table.cmp tbody tr:hover td.dno{background:var(--pri-soft)}table.cmp .grp{border-left:1px solid var(--bd)}.pill{display:inline-block;min-width:34px;padding:2px 7px;border-radius:5px;font-weight:700;font-size:12px}.pill.pos{background:var(--pos-s);color:var(--pos)}.pill.neg{background:var(--neg-s);color:var(--neg)}.pill.zero,.na{color:var(--ink3)}.st{font-size:10.5px;font-weight:700;letter-spacing:.3px}.st.COMMON{color:var(--ink3)}.st.NEW{color:var(--pri)}.st.REMOVED{color:var(--ink3)}table.cmp tfoot td{background:var(--amber-s);font-weight:700;border-top:2px solid var(--bd2);position:sticky;bottom:0}table.cmp tfoot td.dno{background:var(--amber-s)}.drop-row{display:grid;grid-template-columns:1fr 1fr;gap:16px}@media (max-width: 760px){.drop-row{grid-template-columns:1fr}}.drop{border:1.5px dashed var(--bd2);border-radius:var(--radius);padding:24px 22px;background:var(--surf);text-align:center;transition:border-color .12s,background .12s}.drop.over{border-color:var(--pri);background:var(--pri-soft)}.drop .ico{width:44px;height:44px;border-radius:11px;background:var(--surf3);color:var(--ink2);display:grid;place-items:center;margin:0 auto 12px}.drop h4{font-size:15px;margin-bottom:4px}.drop .hint{color:var(--ink3);font-size:12.5px;margin-bottom:14px}.file-pill{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:7px 11px;border-radius:7px;background:var(--surf2);font-size:13px;margin-top:6px}.file-pill .no{font-family:var(--mono);font-weight:600}.progress{height:8px;border-radius:999px;background:var(--surf3);overflow:hidden}.progress-fill{height:100%;background:linear-gradient(90deg,var(--pri),#3f84e0);border-radius:999px;transition:width .3s ease}.exc-head{display:flex;align-items:center;gap:10px;margin-bottom:14px;flex-wrap:wrap}.exc{display:flex;gap:12px;padding:14px 16px;border-bottom:1px solid var(--bd);align-items:flex-start}.exc:last-child{border-bottom:0}.exc.reviewed{opacity:.55}.sev{width:8px;height:8px;border-radius:50%;margin-top:7px;flex:none}.sev.high{background:var(--neg)}.sev.medium{background:var(--amber)}.sev.low{background:var(--ink3)}.exc .title{font-weight:600;font-size:14px}.exc .detail{color:var(--ink2);font-size:12.5px;margin-top:3px}.exc .acts{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap}.ev-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#08101a99;z-index:50;display:grid;place-items:center;padding:24px}.ev-modal{background:var(--surf);border-radius:var(--radius);width:min(1040px,96vw);max-height:92vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 24px 64px #0006}.ev-top{display:flex;align-items:center;gap:10px;padding:13px 18px;border-bottom:1px solid var(--bd)}.ev-stage{flex:1;overflow:auto;background:var(--surf2)}.ev-stage .frame{position:relative;display:inline-block;min-width:100%}.ev-stage img{display:block}.ev-box{position:absolute;border:2px solid var(--neg);border-radius:2px;box-shadow:0 0 0 2px #c239342e;pointer-events:none}.ev-box.FDO{border-color:#0066e6;box-shadow:0 0 0 2px #0066e62e}.ev-box.VDO{border-color:#093;box-shadow:0 0 0 2px #0099332e}.ev-box.FDF{border-color:#f80;box-shadow:0 0 0 2px #f803}.ev-box.HDF{border-color:#93c;box-shadow:0 0 0 2px #93c3}.ev-box.ROOM{border-radius:50%;border-color:#08a;box-shadow:none}.ev-label{position:absolute;left:100%;top:0;margin-left:3px;background:#fff;color:#163;font:600 10px/1.2 var(--mono, monospace);padding:1px 3px;white-space:nowrap}.ev-label.review{color:#c0392b;font-family:inherit}.ev-leaders{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none}.ev-leaders .FDO{stroke:#0066e6}.ev-leaders .VDO{stroke:#093}.ev-leaders .FDF{stroke:#f80}.ev-leaders .HDF{stroke:#93c}.ev-leaders line{stroke-width:1.2}.swatch{display:inline-block;width:12px;height:12px;border:2px solid;margin-right:4px;vertical-align:-2px}.swatch.ROOM{border-color:#08a;border-radius:50%}.swatch.FDO{border-color:#0066e6}.swatch.VDO{border-color:#093}.swatch.FDF{border-color:#f80}.swatch.HDF{border-color:#93c}.ev-legend{display:flex;gap:14px;align-items:center;padding:10px 18px;border-top:1px solid var(--bd);font-size:12.5px;color:var(--ink2);flex-wrap:wrap}.lg{display:inline-flex;align-items:center;gap:6px}.lg i{width:11px;height:11px;border-radius:3px;display:inline-block}.select{height:30px;padding:0 8px;border-radius:6px;border:1px solid var(--bd2);background:var(--surf);color:var(--ink);font-size:12.5px}.spin{display:inline-block;width:16px;height:16px;border:2px solid var(--bd2);border-top-color:var(--pri);border-radius:50%;animation:s .7s linear infinite;vertical-align:-3px}@keyframes s{to{transform:rotate(360deg)}}.toast{position:fixed;bottom:22px;left:50%;transform:translate(-50%);background:var(--navy);color:#fff;padding:10px 18px;border-radius:10px;font-size:13.5px;z-index:60;box-shadow:var(--shadow)}.login-wrap{min-height:100vh;display:grid;place-items:center;background:var(--sb);padding:20px}.login-card{width:min(380px,94vw);background:var(--surf);border:1px solid var(--bd);border-radius:14px;padding:28px;box-shadow:0 20px 60px #00000059}.login-brand{display:flex;align-items:center;gap:12px;margin-bottom:22px}.login-brand .logo{background:linear-gradient(145deg,#2b6fd0,#143a66);display:grid;place-items:center}.login-brand b{font-size:17px}.login-lbl{display:block;font-size:12.5px;font-weight:600;color:var(--ink2);margin:12px 0 5px}.login-err{margin-top:12px;font-size:13px;color:var(--neg);display:flex;align-items:center;gap:6px}.pw-wrap{position:relative}.pw-wrap .input{padding-right:38px}.pw-eye{position:absolute;right:6px;top:50%;transform:translateY(-50%);width:28px;height:28px;display:grid;place-items:center;border:0;background:transparent;color:var(--ink3);border-radius:6px}.pw-eye:hover{background:var(--surf2);color:var(--ink2)}.sb-user{display:flex;align-items:center;gap:9px;padding:8px 10px;border-radius:8px;background:var(--sb2);margin-bottom:4px}.sb-user .av{width:30px;height:30px;border-radius:50%;background:#24405f;color:#cfe0f5;display:grid;place-items:center;font-weight:700;font-size:13px;flex:none}.sb-user .nm{color:#dce6f3;font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sb-user .rl{color:var(--sb-ink2);font-size:11px}.job-card{position:relative}.job-actions{position:absolute;top:12px;right:12px;display:flex;gap:4px;opacity:0;transition:opacity .12s}.job-card:hover .job-actions{opacity:1}.job-actions button{width:28px;height:28px;border-radius:7px;border:1px solid var(--bd);background:var(--surf);color:var(--ink2);display:grid;place-items:center}.job-actions button:hover{background:var(--surf2);color:var(--ink)}.status-pill{font-size:10px;font-weight:700;padding:2px 8px;border-radius:999px;letter-spacing:.3px}.status-pill.signed{background:var(--pos-s);color:var(--pos)}.status-pill.ready{background:var(--pri-soft);color:var(--pri)}.status-pill.draft{background:var(--surf3);color:var(--ink3)}.audit-row{display:flex;gap:10px;padding:8px 2px;border-bottom:1px solid var(--bd);font-size:13px}.audit-row:last-child{border-bottom:0}.audit-row .when{color:var(--ink3);font-size:12px;white-space:nowrap}.audit-row .who{font-weight:600;white-space:nowrap}.signoff-box{border:1px solid var(--pos-bd);background:var(--pos-s);border-radius:10px;padding:16px}.gate-box{border:1px solid var(--amber);background:var(--amber-s);border-radius:10px;padding:16px}
