:root { --ink:#172033; --muted:#687389; --line:#e8ebf1; --canvas:#f6f7fb; --panel:#fff; --blue:#3959f7; --blue-soft:#edf0ff; --green:#159b74; --green-soft:#e8f7f1; --amber:#ba7705; --amber-soft:#fff5dd; --red:#cc4b5e; --red-soft:#fff0f2; --radius:18px; }
* { box-sizing:border-box; }
body { margin:0; background:var(--canvas); color:var(--ink); font-family:Inter,ui-sans-serif,system-ui,-apple-system,"PingFang SC","Microsoft YaHei",sans-serif; font-size:14px; }
button, input, select, textarea { font:inherit; }
button { cursor:pointer; }
.shell { min-height:100vh; display:grid; grid-template-columns:242px minmax(0,1fr); }
.sidebar { background:#10182b; color:#d8def0; padding:22px 14px; display:flex; flex-direction:column; min-height:100vh; position:sticky; top:0; height:100vh; }
.brand { display:flex; gap:10px; align-items:center; padding:3px 10px 28px; color:#fff; font-weight:760; letter-spacing:.1px; }
.brand-mark { width:31px; height:31px; border-radius:10px; display:grid; place-items:center; color:#fff; background:linear-gradient(135deg,#6a8cff,#7a5df7); box-shadow:0 7px 16px #0004; }
.brand small { display:block; color:#8f9aba; font-weight:500; font-size:11px; margin-top:1px; }
.nav-label { color:#75809e; font-size:11px; letter-spacing:.12em; padding:0 11px 9px; }
.nav { display:grid; gap:3px; }
.nav button { border:0; background:transparent; color:inherit; padding:11px 10px; border-radius:10px; text-align:left; display:flex; align-items:center; gap:10px; transition:.18s; }
.nav button:hover { color:#fff; background:#1b2741; }
.nav button.active { color:#fff; background:linear-gradient(100deg,#3454e6,#4e3fd6); box-shadow:0 4px 12px #0002; }
.nav .icon { width:18px; height:18px; display:inline-grid; place-items:center; font-size:16px; }
.sidebar-bottom { margin-top:auto; border-top:1px solid #293550; padding:17px 9px 2px; }
.identity { display:flex; align-items:center; justify-content:space-between; gap:8px; }
.user { display:flex; align-items:center; gap:9px; min-width:0; }.avatar { display:grid; place-items:center; width:29px; height:29px; border-radius:50%; background:#4c64d6; color:#fff; font-weight:700; font-size:12px; }.user b,.user span { display:block; }.user span { color:#8290af; font-size:11px; margin-top:2px; }.role-toggle { border:1px solid #425070; color:#c9d1e9; background:#19253e; padding:5px 6px; border-radius:7px; font-size:11px; }
.main { min-width:0; }
.topbar { height:76px; display:flex; justify-content:space-between; align-items:center; padding:0 34px; background:#fff; border-bottom:1px solid var(--line); position:sticky; top:0; z-index:5; }
.breadcrumb { font-size:13px; color:var(--muted); }.breadcrumb strong { color:var(--ink); margin-left:6px; }.top-actions { display:flex; align-items:center; gap:13px; }.bell { background:var(--amber-soft); color:#a76b00; border:0; border-radius:10px; padding:8px 10px; }.badge-dot { display:inline-block; width:6px; height:6px; background:#f06a75; border-radius:50%; vertical-align:top; margin-left:-2px; }
.content { max-width:1540px; padding:31px 34px 42px; margin:0 auto; }
.page-heading { display:flex; align-items:flex-start; justify-content:space-between; margin-bottom:24px; gap:16px; }.page-heading h1 { font-size:24px; letter-spacing:-.03em; margin:0 0 7px; }.page-heading p { margin:0; color:var(--muted); }.btn { border:0; border-radius:10px; font-weight:650; padding:10px 14px; transition:.16s; }.btn:hover { transform:translateY(-1px); }.btn.primary { background:var(--blue); color:#fff; box-shadow:0 5px 14px #3959f733; }.btn.ghost { background:#fff; border:1px solid var(--line); color:#394258; }.btn.subtle { background:#f2f4f9; color:#475168; }.btn.danger { background:var(--red-soft); color:var(--red); }.btn.small { padding:7px 10px; border-radius:8px; font-size:12px; }
.stat-grid { display:grid; grid-template-columns:repeat(4,1fr); gap:15px; margin-bottom:17px; }.stat { background:var(--panel); border:1px solid var(--line); padding:17px; border-radius:var(--radius); min-height:120px; }.stat-top { display:flex; align-items:center; justify-content:space-between; color:var(--muted); font-size:12px; }.stat-icon { width:31px; height:31px; border-radius:9px; display:grid; place-items:center; font-size:15px; }.stat-icon.blue{background:var(--blue-soft);color:var(--blue)}.stat-icon.green{background:var(--green-soft);color:var(--green)}.stat-icon.amber{background:var(--amber-soft);color:var(--amber)}.stat-icon.red{background:var(--red-soft);color:var(--red)}.stat-number { font-size:25px; font-weight:750; margin-top:14px; letter-spacing:-.04em; }.stat-footer { color:var(--muted); font-size:12px; margin-top:4px; }.up { color:var(--green); }.warn {color:var(--amber);}
.grid-2 { display:grid; grid-template-columns:minmax(0,1.63fr) minmax(300px, .9fr); gap:17px; }.panel { background:var(--panel); border:1px solid var(--line); border-radius:var(--radius); overflow:hidden; }.panel-head { display:flex; justify-content:space-between; align-items:center; padding:18px 19px 14px; }.panel-head h2 { font-size:15px; margin:0; }.panel-head span,.link-btn { color:var(--blue); font-size:12px; font-weight:650; }.link-btn{border:0;background:transparent;padding:3px;}.mini-kicker { margin:2px 0 0; color:var(--muted); font-size:12px; }
.project-card { display:grid; grid-template-columns:42px minmax(0,1fr) auto; gap:12px; align-items:center; padding:12px 18px; border-top:1px solid var(--line); cursor:pointer; }.project-card:hover { background:#fbfcff; }.project-logo { width:38px; height:38px; display:grid; place-items:center; border-radius:11px; background:#f0f3ff; color:#5268d5; font-weight:750; }.project-name { font-weight:700; margin-bottom:4px; }.project-meta { color:var(--muted); font-size:12px; display:flex; gap:7px; align-items:center; flex-wrap:wrap; }.project-right { text-align:right; min-width:130px; }.progress-num { font-size:12px; font-weight:700; color:#49536a; margin-bottom:5px; }.progress { height:6px; background:#edf0f5; border-radius:20px; overflow:hidden; min-width:120px; }.progress b { display:block; height:100%; border-radius:inherit; background:var(--blue); }.progress.warn b {background:#edac35}.progress.red b {background:#e26674}
.reminder { border-top:1px solid var(--line); display:flex; gap:10px; padding:13px 18px; align-items:flex-start; }.reminder:first-of-type { border-top:0; }.reminder-icon{width:30px;height:30px;display:grid;place-items:center;border-radius:9px;background:var(--amber-soft);flex:0 0 auto}.reminder strong{display:block;font-size:13px;margin-bottom:3px}.reminder p{margin:0;color:var(--muted);font-size:12px;line-height:1.5}.reminder .days{margin-left:auto;font-size:11px;color:var(--amber);white-space:nowrap;font-weight:700}.empty { text-align:center; color:var(--muted); padding:45px 18px; }.chart { padding:3px 19px 17px; }.bar-chart { height:148px; display:flex; gap:17px; align-items:flex-end; border-bottom:1px solid var(--line); padding:0 8px; }.bar-group { flex:1; height:100%; display:flex; align-items:flex-end; gap:4px; position:relative; }.bar { flex:1; min-width:4px; border-radius:5px 5px 0 0; background:#aebaff; }.bar.actual{background:var(--blue)}.chart-labels{display:flex;justify-content:space-around;color:var(--muted);font-size:11px;padding:8px 0 0}.legend{display:flex;gap:14px;font-size:11px;color:var(--muted);padding:8px 0 0}.legend i{display:inline-block;width:8px;height:8px;border-radius:3px;background:var(--blue);margin-right:4px}.legend i.plan{background:#aebaff}
.filters { display:flex; gap:9px; flex-wrap:wrap; padding:14px 16px; background:#fff; border:1px solid var(--line); border-radius:14px; margin-bottom:16px; }.search { min-width:220px; flex:1; max-width:380px; border:1px solid var(--line); border-radius:9px; padding:9px 11px; outline:0; }.search:focus,select:focus,input:focus,textarea:focus { border-color:#8f9dff; box-shadow:0 0 0 3px #e8ebff; outline:0; }.filters select { border:1px solid var(--line); border-radius:9px; padding:8px 9px; color:#4c566c; background:#fff; }
.table-wrap { overflow:auto; }.data-table { border-collapse:collapse; width:100%; min-width:960px; background:#fff; border:1px solid var(--line); border-radius:var(--radius); overflow:hidden; }.data-table th { background:#fafbfe; color:#707b91; font-size:11px; text-transform:uppercase; letter-spacing:.03em; font-weight:700; text-align:left; padding:12px 15px; white-space:nowrap; }.data-table td { border-top:1px solid var(--line); padding:14px 15px; vertical-align:middle; }.data-table tbody tr { cursor:pointer; }.data-table tbody tr:hover{background:#fafbff}.client-cell b{display:block;margin-bottom:4px}.client-cell span{font-size:11px;color:var(--muted)}.money{font-variant-numeric:tabular-nums;font-weight:650;white-space:nowrap}.sub{display:block;color:var(--muted);font-size:11px;margin-top:3px;font-weight:400}.service-tags{display:flex;gap:4px;flex-wrap:wrap;max-width:180px}.tag{display:inline-block;border-radius:6px;padding:3px 6px;background:#f1f3f8;color:#566176;font-size:11px;white-space:nowrap}.status{display:inline-flex;align-items:center;gap:5px;border-radius:99px;padding:4px 8px;font-weight:650;font-size:11px}.status::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}.status.active{background:var(--green-soft);color:#178667}.status.risk{background:var(--amber-soft);color:#ad7205}.status.done{background:#eff1f5;color:#6c7486}.status.expired{background:var(--red-soft);color:#c33b40}.status.none{background:#eff1f5;color:#8b93a7}.owner{display:flex;align-items:center;gap:6px;white-space:nowrap}.owner .avatar{width:24px;height:24px;font-size:10px;background:#6577ca}.pill{border:1px solid var(--line);padding:5px 8px;color:#657087;border-radius:99px;font-size:11px;background:#fff}.risk-dot{color:var(--red);font-size:13px}
.reminder-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:15px}.alert-card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:17px;position:relative}.alert-card.urgent{border-color:#ffc8cd;background:linear-gradient(140deg,#fff,#fff8f8)}.alert-card .alert-head{display:flex;justify-content:space-between;align-items:flex-start}.alert-card h3{font-size:14px;margin:14px 0 7px}.alert-card p{color:var(--muted);line-height:1.55;font-size:12px;margin:0 0 15px}.alert-card .alert-time{font-size:11px;color:#a27716}.alert-type{padding:4px 7px;background:var(--blue-soft);color:var(--blue);border-radius:6px;font-size:11px;font-weight:650}.alert-card.urgent .alert-type{background:var(--red-soft);color:var(--red)}
.docs-layout{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(300px,.8fr);gap:17px}.doc-list{padding:0 17px}.doc-row{display:grid;grid-template-columns:37px minmax(0,1fr) auto;gap:11px;align-items:center;padding:13px 0;border-top:1px solid var(--line)}.doc-row:first-child{border-top:0}.doc-icon{width:35px;height:35px;border-radius:9px;display:grid;place-items:center;background:#fff0ef;color:#dd604d;font-size:11px;font-weight:800}.doc-icon.pdf{background:#fff2f3;color:#c84d5e}.doc-icon.sheet{background:#eaf8f0;color:#1c9b6e}.doc-row b{display:block;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.doc-row span{display:block;color:var(--muted);font-size:11px;margin-top:4px}.doc-side{padding:19px}.doc-side h3{margin:0 0 7px;font-size:15px}.doc-side p{color:var(--muted);font-size:12px;line-height:1.6;margin:0 0 13px}.dropzone{border:1.5px dashed #cbd2e4;border-radius:12px;padding:20px 12px;text-align:center;background:#fbfcff}.dropzone strong{display:block;color:#45506a;font-size:12px;margin:6px 0}.dropzone span{font-size:11px;color:var(--muted)}.hidden{display:none!important}
.detail-back{border:0;background:transparent;color:var(--muted);padding:0 0 10px;font-size:13px}.detail-top{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:21px;margin-bottom:17px}.detail-title{display:flex;gap:13px;align-items:center;justify-content:space-between}.detail-title-left{display:flex;gap:12px;align-items:center}.detail-title h1{font-size:20px;margin:0 0 5px}.detail-title p{margin:0;color:var(--muted);font-size:12px}.detail-tabs{display:flex;gap:3px;margin-top:22px;border-top:1px solid var(--line);padding-top:12px}.tab-btn{border:0;background:transparent;padding:8px 11px;border-radius:8px;color:var(--muted);font-weight:650;font-size:12px}.tab-btn.active{color:var(--blue);background:var(--blue-soft)}.detail-grid{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(300px,.85fr);gap:17px}.info-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:0}.info{padding:14px 18px;border-top:1px solid var(--line)}.info:nth-child(odd){border-right:1px solid var(--line)}.info label{display:block;color:var(--muted);font-size:11px;margin-bottom:7px}.info b{font-size:13px}.kpi-card{padding:18px}.kpi-card h2{font-size:14px;margin:0 0 12px}.kpi-value{font-size:25px;font-weight:780;color:var(--blue);letter-spacing:-.04em}.kpi-value span{font-size:12px;color:var(--muted);font-weight:500;margin-left:4px}.kpi-desc{color:var(--muted);font-size:12px;line-height:1.6;margin:10px 0 13px}.timeline{padding:3px 18px 17px}.timeline-item{position:relative;padding:0 0 17px 23px;border-left:1px solid #dfe4ef;margin-left:7px}.timeline-item::before{content:"";position:absolute;width:9px;height:9px;border-radius:50%;background:var(--blue);left:-5px;top:2px;box-shadow:0 0 0 3px #eef0ff}.timeline-item:last-child{padding-bottom:0}.timeline-item b{display:block;font-size:13px}.timeline-item span{display:block;color:var(--muted);font-size:11px;margin:3px 0}.timeline-item p{margin:4px 0 0;font-size:12px;color:#4d5770;line-height:1.45}.report-list{padding:0 18px}.report-row{padding:14px 0;border-top:1px solid var(--line);display:flex;align-items:center;gap:12px}.report-row b{font-size:13px}.report-row span{color:var(--muted);font-size:11px;display:block;margin-top:3px}.report-row .status{margin-left:auto}.finance-line{padding:13px 18px;border-top:1px solid var(--line);display:flex;justify-content:space-between;gap:10px}.finance-line span{font-size:12px;color:var(--muted)}.finance-line b{font-size:13px}.finance-line b.good{color:var(--green)}
dialog { border:0; border-radius:18px; padding:0; width:min(650px,calc(100vw - 26px)); box-shadow:0 25px 65px #15203a44; }.modal-head{padding:19px 21px 14px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:center}.modal-head h2{margin:0;font-size:16px}.close{border:0;background:#f1f3f7;border-radius:8px;width:29px;height:29px;font-size:18px;color:#687389}.modal-body{padding:18px 21px;max-height:72vh;overflow:auto}.form-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:13px}.field{display:grid;gap:6px}.field.full{grid-column:1/-1}.field label{font-size:12px;font-weight:650;color:#4e5870}.field input,.field select,.field textarea{border:1px solid var(--line);border-radius:9px;padding:9px 10px;color:var(--ink);background:#fff;width:100%}.field textarea{resize:vertical;min-height:75px}.modal-actions{display:flex;justify-content:flex-end;gap:9px;padding:14px 21px 19px;border-top:1px solid var(--line)}dialog::backdrop{background:#12182a66}.toast{position:fixed;bottom:24px;left:50%;transform:translate(-50%,16px);opacity:0;pointer-events:none;transition:.2s;background:#1d2945;color:#fff;padding:10px 14px;border-radius:10px;box-shadow:0 8px 25px #1118;font-size:13px;z-index:10}.toast.show{opacity:1;transform:translate(-50%,0)}
.login-shell{min-height:100vh;display:grid;place-items:center;padding:28px;background:radial-gradient(circle at 18% 16%,#e9edff 0,transparent 31%),radial-gradient(circle at 85% 80%,#e4f8f2 0,transparent 32%),#f6f7fb}.login-card{width:min(430px,100%);background:#fff;border:1px solid var(--line);box-shadow:0 25px 60px #1d29451c;border-radius:22px;padding:28px}.login-brand{display:flex;align-items:center;gap:10px}.login-brand .brand-mark{width:35px;height:35px}.login-brand b,.login-brand span{display:block}.login-brand span{font-size:11px;color:var(--muted);margin-top:2px}.login-card h1{font-size:23px;margin:28px 0 7px;letter-spacing:-.03em}.login-card>p{line-height:1.65;font-size:13px;color:var(--muted);margin:0 0 21px}.login-card form{display:grid;gap:12px}.login-card label{display:grid;gap:6px;font-size:12px;font-weight:650;color:#465169}.login-card input{border:1px solid var(--line);border-radius:9px;padding:10px;width:100%}.login-card form .btn{margin-top:4px}.login-error{min-height:16px;margin:0;color:var(--red);font-size:12px}.demo-accounts{display:grid;gap:5px;margin-top:20px;padding:13px;border-radius:11px;background:#f5f7ff;color:#59647b;font-size:11px;line-height:1.4}.demo-accounts b{color:#3d4fb6;font-size:12px}
/* Multi-service, reporting and finance-ledger views */
.service-list,.finance-service-list{padding:0 18px}.service-row,.finance-service{border-top:1px solid var(--line);padding:14px 0}.service-row{display:grid;grid-template-columns:112px minmax(0,1fr) auto;gap:12px;align-items:center}.service-platform{font-weight:750;color:#35415e}.service-actions,.finance-actions{display:flex;gap:7px;align-items:center;flex-wrap:wrap}.report-block{border-top:1px solid var(--line);padding:15px 0}.report-main{display:flex;justify-content:space-between;gap:14px;align-items:flex-start}.report-main b{display:block;font-size:13px}.report-main p{margin:7px 0 0;color:#4d5770;font-size:12px;line-height:1.6}.comment{margin:11px 0 0;padding:10px 12px;border-left:3px solid #92a3ff;background:#f6f8ff;border-radius:0 9px 9px 0;color:#4c5874;font-size:12px;line-height:1.55}.comment b{color:#354aad}.finance-service-head{display:flex;justify-content:space-between;gap:12px;align-items:flex-start}.finance-service-head h3{margin:0 0 4px;font-size:14px}.finance-service-head p{margin:0;color:var(--muted);font-size:12px}.finance-metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-top:12px}.finance-metrics div{background:#f8f9fc;border-radius:9px;padding:9px}.finance-metrics span{display:block;color:var(--muted);font-size:10px;margin-bottom:4px}.finance-metrics b{font-size:12px}.ledger{margin-top:12px;border-top:1px dashed #dbe0eb;padding-top:10px;font-size:12px;color:#526078;line-height:1.7}.platform-checks{display:flex;flex-wrap:wrap;gap:7px}.platform-checks label{display:inline-flex;align-items:center;gap:5px;padding:6px 8px;border:1px solid var(--line);border-radius:8px;font-size:12px;color:#4c5770}.platform-checks input{width:auto!important;padding:0!important;box-shadow:none!important}
@media (max-width:1000px){.shell{grid-template-columns:70px 1fr}.sidebar{padding:17px 9px}.brand{padding:3px 9px 25px}.brand div:not(.brand-mark),.nav-label,.nav button span:not(.icon),.user div,.role-toggle{display:none}.nav button{justify-content:center;padding:11px}.sidebar-bottom{padding:15px 11px}.topbar,.content{padding-left:22px;padding-right:22px}.stat-grid{grid-template-columns:repeat(2,1fr)}.grid-2,.docs-layout,.detail-grid{grid-template-columns:1fr}.reminder-grid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:650px){.shell{display:block}.sidebar{position:sticky;height:58px;min-height:58px;top:0;z-index:8;flex-direction:row;padding:8px;background:#10182b;overflow:auto}.brand{padding:5px 10px}.brand small,.brand>div:not(.brand-mark),.sidebar-bottom{display:none}.nav-label{display:none}.nav{display:flex;gap:2px}.nav button{padding:9px}.nav button .icon{font-size:16px}.main{min-width:0}.topbar{height:64px;padding:0 15px}.top-actions .ghost{display:none}.content{padding:21px 15px}.page-heading{align-items:flex-end}.page-heading h1{font-size:20px}.page-heading p{font-size:12px}.stat-grid{grid-template-columns:1fr 1fr;gap:9px}.stat{padding:13px;min-height:106px}.stat-number{font-size:21px;margin-top:10px}.grid-2{grid-template-columns:1fr}.reminder-grid{grid-template-columns:1fr}.project-card{padding:12px 13px}.project-right{min-width:90px}.progress{min-width:82px}.detail-title{align-items:flex-start}.detail-title .btn.ghost{display:none}.info-grid{grid-template-columns:1fr}.info:nth-child(odd){border-right:0}.form-grid{grid-template-columns:1fr}.detail-tabs{overflow:auto}.top-actions .bell{padding:7px}.filters .search{max-width:none;min-width:100%}}
@media (max-width:650px){.service-row{grid-template-columns:1fr}.finance-metrics{grid-template-columns:repeat(2,1fr)}.finance-service-head,.report-main{flex-direction:column}}

/* v2 operational views */
.dashboard-grid{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(300px,.9fr);gap:17px}.dashboard-side{display:grid;gap:17px;align-content:start}.todo-list{padding:0 18px}.todo-row{display:grid;grid-template-columns:26px minmax(0,1fr) auto;align-items:center;gap:9px;padding:12px 0;border-top:1px solid var(--line)}.todo-row:first-child{border-top:0}.todo-row b{display:block;font-size:12px}.todo-row span{display:block;font-size:11px;color:var(--muted);margin-top:3px}.todo-check{border:0;background:transparent;color:var(--blue);font-size:19px;padding:0}.todo-check:disabled{color:#9ca5b8}.header-actions,.detail-actions{display:flex;gap:8px;flex-wrap:wrap}.reminder-note{margin:-7px 0 15px;padding:10px 13px;border-radius:10px;background:var(--blue-soft);color:#4658ac;font-size:12px}.partner-grid,.performance-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:15px}.partner-card,.performance-card{border:1px solid var(--line);background:#fff;border-radius:var(--radius);padding:17px;text-align:left}.partner-card h3{margin:14px 0 6px;font-size:15px}.partner-card p{margin:0;color:var(--muted);font-size:12px;line-height:1.5}.partner-metrics{display:grid;gap:6px;margin-top:14px;padding-top:11px;border-top:1px solid var(--line)}.partner-metrics span{display:flex;justify-content:space-between;color:var(--muted);font-size:11px}.partner-metrics b{color:var(--ink)}.performance-card{cursor:pointer}.performance-card.active{border-color:#7890ff;background:#f5f7ff}.performance-card span,.performance-card small{display:block;color:var(--muted);font-size:11px}.performance-card b{display:block;font-size:21px;color:var(--blue);margin:8px 0}.performance-total{font-size:12px;color:var(--muted)}.performance-total b{font-size:15px;color:var(--green);margin-left:5px}
.performance-totals{display:flex;align-items:flex-start;gap:20px;flex-wrap:wrap}.performance-totals .performance-total{display:block}.performance-totals .sub{display:block;font-size:11px;color:var(--muted);margin-top:3px}.preline{white-space:pre-line;line-height:1.55}.detail-actions{justify-content:flex-end}.report-actions{margin-left:auto;display:grid;gap:8px;justify-items:end}.ledger-row{display:flex;justify-content:space-between;gap:8px;padding:5px 0;color:#526078;font-size:12px}.compact{padding:12px}@media (max-width:1000px){.dashboard-grid{grid-template-columns:1fr}.partner-grid,.performance-cards{grid-template-columns:repeat(2,1fr)}}@media (max-width:650px){.partner-grid,.performance-cards{grid-template-columns:1fr}.detail-actions{justify-content:flex-start}.detail-actions .btn.ghost{display:inline-block}.report-actions{margin-left:0;justify-items:start}}
.project-external{color:var(--ink);font-weight:700;text-decoration:none}.project-external:hover{color:var(--blue);text-decoration:underline;text-underline-offset:3px}

/* ===== 工资绩效管理：表格内联编辑 ===== */
.cell-input{border:1px solid var(--line,#e5e9f2);border-radius:8px;padding:6px 8px;font-size:13px;background:#fff;color:var(--ink,#1d2434);width:84px}
.cell-input.num{text-align:right;font-variant-numeric:tabular-nums}
.cell-input:focus{border-color:var(--blue,#3454e6);outline:0;box-shadow:0 0 0 3px var(--blue-soft,#e8edff)}
.cell-input[readonly]{background:var(--soft,#f7f8fa);color:var(--muted,#7a8499)}
.note-line{margin:0 0 15px;padding:9px 13px;border-radius:10px;background:var(--blue-soft,#e8edff);color:var(--blue-deep,#3f4fb4);font-size:12px;line-height:1.6}


/* ============================================================
   v3 设计系统：深色侧栏 + 紫色主色（叠加层，放最后生效）
   ============================================================ */
:root{
  --canvas:#f5f6fa;
  --panel:#fff;
  --line:#e7e9f2;
  --line-soft:#f0f2f8;
  --ink:#0f1320;
  --muted:#7a8199;
  --blue:#5b57f5;
  --blue-deep:#4338ca;
  --blue-soft:#eeedff;
  --soft:#fafbfe;
  --green:#0ea97a;
  --green-soft:#e6f7f1;
  --amber:#e08c00;
  --amber-soft:#fff5e2;
  --red:#e5484d;
  --red-soft:#feeced;
  --radius:18px;
  --shadow-sm:0 1px 2px rgba(16,24,40,.05);
  --shadow:0 1px 2px rgba(16,24,40,.04),0 10px 26px -14px rgba(16,24,40,.22);
}

/* ---------- 骨架 ---------- */
.shell{grid-template-columns:250px minmax(0,1fr)}
.sidebar{
  background:
    radial-gradient(120% 60% at 12% -10%,rgba(108,99,255,.34),transparent 60%),
    radial-gradient(90% 50% at 110% 4%,rgba(139,92,246,.22),transparent 55%),
    #0d1018;
  border-right:1px solid rgba(255,255,255,.06);
  padding:18px 14px 14px;
  color:#e8eaf5;
}
.brand{padding:6px 8px 16px;gap:11px;font-weight:700}
.brand-mark{
  width:36px;height:36px;border-radius:11px;font-size:16px;
  background:linear-gradient(135deg,#6d68ff,#a855f7);
  box-shadow:0 8px 18px -8px rgba(109,104,255,.9),inset 0 1px 0 rgba(255,255,255,.35);
}
.brand small{color:#9aa0bd;letter-spacing:.04em}
.nav-label{color:#7d84a4;font-weight:600}
.nav{gap:2px}
.nav button{color:#b9bed4;border-radius:11px;padding:9.5px 11px}
.nav button:hover{color:#fff;background:rgba(255,255,255,.07)}
.nav button.active{
  color:#fff;
  background:linear-gradient(90deg,rgba(109,104,255,.28),rgba(109,104,255,.1));
  box-shadow:none;
  position:relative;
}
.nav button.active::before{
  content:"";position:absolute;left:-14px;top:50%;transform:translateY(-50%);
  width:3px;height:20px;border-radius:0 3px 3px 0;background:#8b7dff;
  box-shadow:0 0 14px 2px rgba(139,125,255,.7);
}
.nav .icon{width:18px;height:18px;font-size:14px}
.sidebar-bottom{border-top:1px solid rgba(255,255,255,.08);padding-top:14px;margin-top:auto}
.identity{padding:6px 8px;border-radius:12px;background:rgba(255,255,255,.05)}
.user span{color:#9aa0bd}
.role-toggle{border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.06);color:#c9d1e9;border-radius:8px;font-size:11.5px}
.role-toggle:hover{background:rgba(255,255,255,.12);color:#fff}.avatar,.user .avatar,.owner .avatar{
  border-radius:10px;background:linear-gradient(135deg,#6d68ff,#a855f7);font-weight:650;
}
.owner .avatar{width:24px;height:24px;border-radius:8px;font-size:10px}
/* 侧边栏身份区头像：`.user span{display:block;font-size:11px;margin-top:2px}` 会覆盖 .avatar，
   导致姓名缩写「凤利」贴左上角、不居中；这里提高优先级强制恢复 grid 居中。 */
.user .avatar{
  display:grid;place-items:center;text-align:center;
  margin:0;font-size:11px;line-height:1;letter-spacing:0;overflow:hidden;
}

/* ---------- 顶栏与内容区 ---------- */
.topbar{
  height:auto;padding:12px 28px;background:rgba(245,246,250,.82);
  backdrop-filter:blur(14px) saturate(140%);border-bottom:1px solid var(--line);z-index:30;
}
.breadcrumb{font-size:12.5px}
.breadcrumb strong{margin-left:0;font-weight:600}
.top-actions{gap:8px}
.bell{background:#fff;border:1px solid var(--line);border-radius:11px;color:var(--ink);box-shadow:var(--shadow-sm)}
.content{max-width:1240px;padding:20px 28px 56px}

/* ---------- 按钮 ---------- */
.btn{border-radius:11px;font-weight:550;box-shadow:var(--shadow-sm);border:1px solid var(--line);background:#fff;color:#3d4457}
.btn:hover{transform:translateY(-1px);box-shadow:var(--shadow)}
.btn.primary{
  background:linear-gradient(135deg,#5b57f5,#8b5cf6);color:#fff;border-color:transparent;
  box-shadow:0 10px 20px -12px rgba(91,87,245,.9),inset 0 1px 0 rgba(255,255,255,.25);
}
.btn.ghost{border-color:var(--line);color:#3d4457}
.btn.subtle{background:var(--soft);border-color:var(--line-soft)}
.btn.danger{background:#fff;border-color:#f6d7d8;color:var(--red)}
.btn.danger:hover{background:var(--red-soft)}
.btn.small{border-radius:9px;font-size:12.5px;padding:6.5px 10px}
.link-btn{color:var(--blue)}
.panel-head span,.panel-head .link-btn{color:var(--blue)}
.pill{border-color:var(--line);background:var(--soft);color:#657087}
.status{font-size:11.5px}

/* ---------- 卡片 / 面板 ---------- */
.panel{border-radius:var(--radius);box-shadow:var(--shadow-sm);border-color:var(--line)}
.panel-head{padding:17px 19px 13px;border-bottom:1px solid var(--line-soft);align-items:flex-start}
.panel-head h2{font-size:15px;font-weight:650;letter-spacing:-.01em}
.panel-head div>p,.mini-kicker{font-size:12.5px}
.stat,.alert-card,.partner-card,.performance-card{border-radius:var(--radius);box-shadow:var(--shadow-sm);border-color:var(--line)}
.stat{border-radius:var(--radius);padding:16px 17px;min-height:0}
.stat-number{font-size:24px;margin-top:12px}
.filters{border-radius:14px;border-color:var(--line);box-shadow:var(--shadow-sm)}
.search,.filters select{border-radius:10px}
.search:focus,select:focus,input:focus,textarea:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(91,87,245,.13)}
.data-table{border-radius:var(--radius);box-shadow:var(--shadow-sm);border-color:var(--line)}
.data-table th{background:var(--soft);color:#707b91;font-size:12px;text-transform:none;letter-spacing:.03em}
.data-table tbody tr:hover{background:#fbfbfe}
.detail-top{border-radius:var(--radius);box-shadow:var(--shadow);padding:21px 22px}
.detail-title h1{font-size:21px;font-weight:700;letter-spacing:-.02em}
/* 头卡 4 项关键指标 */
.detail-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-top:18px;padding-top:16px;border-top:1px solid var(--line-soft)}
.dstat{padding:0 16px;border-left:1px solid var(--line-soft)}
.dstat:first-child{padding-left:0;border-left:0}
.dstat label{display:block;font-size:11.5px;color:var(--muted);letter-spacing:.03em}
.dstat b{display:block;font-size:19px;font-weight:680;letter-spacing:-.02em;margin-top:3px}
.dstat b i{font-size:12px;font-weight:550;color:var(--muted);font-style:normal;margin-left:3px}
.dstat .trend{font-size:11.5px;color:#0e9b6a;margin-top:2px;display:flex;align-items:center;gap:4px}
.dstat .trend.dim{color:var(--muted)}
/* 更多操作「⋯」溢出菜单：危险操作默认收起 */
.menu-wrap{position:relative}
.icon-btn{width:34px;height:34px;display:grid;place-items:center;border:1px solid var(--line);border-radius:10px;background:#fff;color:#687389;font-size:16px;line-height:1}
.icon-btn:hover{border-color:#d7daea;color:var(--blue)}
.menu-pop{display:none;position:absolute;right:0;top:calc(100% + 6px);min-width:150px;padding:6px;background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:0 18px 40px #1d294526;z-index:20}
.menu-pop.open{display:grid;gap:2px}
.menu-item{border:0;background:transparent;text-align:left;padding:8px 10px;border-radius:8px;font-size:13px;color:var(--ink)}
.menu-item:hover{background:var(--soft)}
.menu-item.danger{color:var(--danger,#cc4b5e)}
.menu-item.danger:hover{background:var(--red-soft,#fff0f2)}
.detail-tabs{border-top:1px solid var(--line);padding-top:12px;gap:2px}
.tab-btn{position:relative;padding:9px 12px;border-radius:9px;font-size:13px;color:var(--muted);font-weight:600}
.tab-btn.active{color:var(--ink);background:transparent}
.tab-btn.active::after{
  content:"";position:absolute;left:8px;right:8px;bottom:-13px;height:2px;border-radius:2px;
  background:linear-gradient(90deg,#5b57f5,#8b5cf6);
}
.progress{background:var(--line-soft);height:6px}
.progress b{background:linear-gradient(90deg,#5b57f5,#8b5cf6)}
.project-logo{border-radius:12px;background:var(--blue-soft);color:#4338ca}
.project-card:hover{background:#fbfbff}
.report-block{padding:16px 0}
.comment{border-left:3px solid #cdc8ff;background:var(--blue-soft);border-radius:0 11px 11px 0}
.comment b{color:#4338ca}
.finance-metrics div{background:var(--soft);border:1px solid var(--line-soft);border-radius:10px}
dialog{border-radius:18px;box-shadow:0 26px 60px -20px rgba(16,24,40,.5)}
.modal-head{padding:16px 20px 13px}
.modal-head h2{font-size:15.5px;font-weight:650}
.field label{font-size:12px;color:#4e5870}
.field input,.field select,.field textarea{border-radius:10px}
.field input:focus,.field select:focus,.field textarea:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(91,87,245,.13)}
.toast{background:#0d1018;border-radius:11px}

/* ---------- 收款管理 / 项目资料 新模块 ---------- */
.sum-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin-bottom:16px}
.sum{position:relative;overflow:hidden;padding:16px 18px;border-radius:var(--radius);background:#fff;border:1px solid var(--line);box-shadow:var(--shadow-sm)}
.sum::after{content:"";position:absolute;inset:0;pointer-events:none;background:radial-gradient(80% 120% at 100% 0,rgba(139,92,246,.08),transparent 60%)}
.sum label{display:block;font-size:12px;color:var(--muted)}
.sum b{display:block;font-size:22px;font-weight:680;letter-spacing:-.02em;margin-top:5px;font-variant-numeric:tabular-nums}
.sum .sub{font-size:11.5px;color:var(--muted);margin-top:3px}
.sum.hero{background:linear-gradient(135deg,#5b57f5,#8b5cf6);border-color:transparent;color:#fff;box-shadow:0 14px 30px -16px rgba(91,87,245,.85)}
.sum.hero label{color:rgba(255,255,255,.85)}
.sum.hero .sub{color:rgba(255,255,255,.8)}
.track{height:6px;border-radius:999px;background:var(--line-soft);overflow:hidden;margin-top:10px}
.track i{display:block;height:100%;border-radius:999px;background:linear-gradient(90deg,#5b57f5,#8b5cf6)}
.sum.hero .track{background:rgba(255,255,255,.25)}
.sum.hero .track i{background:#fff}
.track.green i{background:linear-gradient(90deg,#0ea97a,#38bdf8)}
.track.amber i{background:linear-gradient(90deg,#f59e0b,#e08c00)}
.chip{display:inline-flex;align-items:center;gap:6px;padding:3.5px 9px;border-radius:999px;font-size:12px;font-weight:550;background:var(--soft);border:1px solid var(--line);color:#3d4457}
.chip .d{width:6px;height:6px;border-radius:50%;background:var(--muted)}
.chip.ok{background:var(--green-soft);border-color:#cdeee2;color:#0a7f5c}
.chip.ok .d{background:var(--green)}
.chip.warn{background:var(--amber-soft);border-color:#f7e4bd;color:#96650a}
.chip.warn .d{background:var(--amber)}
.chip.brand{background:var(--blue-soft);border-color:#ddd9ff;color:#4338ca}
.chip.brand .d{background:var(--blue)}
.chip.danger{background:var(--red-soft);border-color:#f8d3d5;color:#b4232a}
.chip.danger .d{background:var(--red)}
.subtabs{display:flex;gap:2px;margin-bottom:16px;border-bottom:1px solid var(--line)}
.subtab{position:relative;padding:9px 14px 11px;font-size:13.5px;font-weight:550;color:var(--muted);border-bottom:2px solid transparent;background:transparent}
.subtab:hover{color:#3d4457}
.subtab.active{color:var(--ink)}
.subtab.active::after{content:"";position:absolute;left:10px;right:10px;bottom:-1px;height:2px;border-radius:2px;background:linear-gradient(90deg,#5b57f5,#8b5cf6)}

.settle{border:1px solid var(--line);border-radius:14px;background:#fff;margin-bottom:12px;overflow:hidden}
.settle-head{display:flex;align-items:center;gap:12px;padding:14px 16px;flex-wrap:wrap}
.settle-head .period{font-weight:650;font-size:14px}
.settle-head .meta{display:flex;gap:8px;flex-wrap:wrap;align-items:center;font-size:12.5px;color:var(--muted)}
.settle-head .nums{margin-left:auto;display:flex;gap:18px;text-align:right}
.settle-head .nums .k{font-size:11px;color:var(--muted);display:block}
.settle-head .nums .v{font-size:15px;font-weight:650;font-variant-numeric:tabular-nums}
.settle-head .act{display:flex;gap:6px}
.settle-prog{display:flex;align-items:center;gap:10px;padding:0 16px 12px}
.settle-prog .track{flex:1;max-width:300px;margin-top:0}
.settle-body{border-top:1px dashed var(--line);padding:12px 16px 14px;background:var(--soft)}
.settle-body .head{display:flex;align-items:center;gap:8px;margin-bottom:9px}
.settle-body .head b{font-size:13px}
.pay-row{display:flex;align-items:center;gap:12px;padding:9px 12px;border-radius:11px;background:#fff;border:1px solid var(--line-soft);margin-bottom:8px;font-size:13px;flex-wrap:wrap}
.pay-row:last-of-type{margin-bottom:0}
.pay-row .stage{font-size:11.5px;padding:2px 8px;border-radius:999px;background:var(--blue-soft);color:#4338ca;font-weight:600}
.pay-row .amt{font-weight:650;font-variant-numeric:tabular-nums}
.pay-row .who{display:flex;align-items:center;gap:6px;color:var(--muted);font-size:12px}
.pay-row .act{margin-left:auto;display:flex;gap:4px}
.rail{display:grid;gap:16px;align-content:start}
.kv{display:grid;gap:10px;font-size:12.5px}
.kv .row{display:flex;align-items:center;gap:8px;color:var(--muted)}
.kv .row b{margin-left:auto;color:var(--ink);font-weight:600;font-variant-numeric:tabular-nums}

.link-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.link-card{position:relative;padding:14px 15px;border-radius:14px;border:1px solid var(--line);background:#fff;transition:transform .16s,box-shadow .16s,border-color .16s}
.link-card:hover{transform:translateY(-2px);box-shadow:var(--shadow);border-color:#dcdff0}
.link-card.core{border-color:#d9d4ff;background:linear-gradient(180deg,#fff,#f7f6ff)}
.link-head{display:flex;align-items:center;gap:9px}
.link-head b{font-size:13.5px;font-weight:620}
.core-tag{margin-left:auto;font-size:11px;font-weight:600;color:#fff;background:linear-gradient(135deg,#6d68ff,#a855f7);padding:2px 8px;border-radius:999px}
.link-card p{font-size:12.5px;color:var(--muted);margin-top:7px}
.link-foot{display:flex;align-items:center;gap:8px;margin-top:11px;flex-wrap:wrap}
.link-foot .who{display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--muted)}
.link-foot .act{margin-left:auto;display:flex;gap:6px;flex-wrap:wrap}
.file-row{display:flex;align-items:center;gap:11px;padding:11px 13px;border-radius:11px;background:var(--soft);border:1px solid var(--line-soft);margin-bottom:8px}
.file-row .ico{width:32px;height:32px;border-radius:9px;display:grid;place-items:center;color:#fff;background:linear-gradient(135deg,#0ea97a,#38bdf8);font-size:11px;font-weight:650}
.file-row .ico.pdf{background:linear-gradient(135deg,#e5484d,#f59e0b)}
.file-row .ico.ppt{background:linear-gradient(135deg,#e08c00,#ef4444)}
.file-row .ico.xls{background:linear-gradient(135deg,#0ea97a,#2dd4bf)}
.file-row b{font-size:13px;font-weight:600;display:block}
.file-row .m{font-size:11.5px;color:var(--muted)}
.file-row .act{margin-left:auto;display:flex;gap:6px}
.copy-btn{border:1px solid var(--line);background:#fff;border-radius:8px;padding:3px 8px;font-size:11.5px;color:var(--blue);box-shadow:var(--shadow-sm)}
.copy-btn:hover{background:var(--blue-soft)}
.perm-note{margin-top:12px;padding:11px 13px;border-radius:11px;background:var(--soft);border:1px dashed var(--line);font-size:12.5px;color:var(--muted)}
.recv-filters{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-bottom:14px}
.recv-filters .grow{flex:1;min-width:180px;max-width:320px}
.alert-box{display:flex;gap:9px;padding:11px 12px;border-radius:11px;font-size:12.5px;margin-bottom:14px}
.alert-box.info{background:var(--blue-soft);border:1px solid #ddd9ff;color:#4338ca}
.alert-box.warn{background:var(--amber-soft);border:1px solid #f7e4bd;color:#8a5c05}
.alert-box.danger{background:var(--red-soft);border:1px solid #f8d3d5;color:#a32025}
.switch{display:inline-flex;align-items:center;gap:8px;font-size:13px;cursor:pointer;user-select:none}
.switch .box{width:38px;height:21px;border-radius:999px;background:#dcdff0;position:relative;transition:background .18s}
.switch .box::after{content:"";position:absolute;top:2px;left:2px;width:17px;height:17px;border-radius:50%;background:#fff;box-shadow:var(--shadow-sm);transition:transform .18s}
.switch.on .box{background:linear-gradient(135deg,#5b57f5,#8b5cf6)}
.switch.on .box::after{transform:translateX(17px)}
.switch input[type=checkbox]{width:38px;height:21px;margin:0;appearance:none;-webkit-appearance:none;background:#dcdff0;border-radius:999px;position:relative;transition:background .18s;cursor:pointer;flex:none}
.switch input[type=checkbox]::after{content:"";position:absolute;top:2px;left:2px;width:17px;height:17px;border-radius:50%;background:#fff;box-shadow:var(--shadow-sm);transition:transform .18s}
.switch input[type=checkbox]:checked{background:linear-gradient(135deg,#5b57f5,#8b5cf6)}
.switch input[type=checkbox]:checked::after{transform:translateX(17px)}

@media (max-width:1000px){
  .shell{grid-template-columns:76px minmax(0,1fr)}
  .sidebar{padding:16px 10px}
  .sum-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .link-grid{grid-template-columns:1fr}
  .nav button.active::before{left:-10px}
}
@media (max-width:650px){
  .sum-grid{grid-template-columns:1fr}
  .content{padding:16px 15px 48px}
  .settle-head .nums{margin-left:0;width:100%;justify-content:flex-start}
  .pay-row .act{margin-left:0;width:100%}
  .topbar{padding:10px 15px}
}

/* ---------- 未读提醒角标 ---------- */
.nav-badge{min-width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center;padding:0 5px;border-radius:999px;background:var(--red);color:#fff;font-size:11px;font-weight:700}
.tab-badge{min-width:17px;height:17px;display:inline-flex;align-items:center;justify-content:center;padding:0 5px;margin-left:4px;border-radius:999px;background:var(--red);color:#fff;font-size:10.5px;font-weight:700}
.unread-tip{color:var(--red)}
.entity-select{min-width:126px;padding:6px 8px;border:1px solid var(--line);border-radius:9px;background:#fff;font:inherit;font-size:12.5px;color:#3d4457}
.entity-input{min-width:126px;max-width:190px;padding:6px 8px;border:1px solid var(--line);border-radius:9px;background:#fff;font:inherit;font-size:12.5px;color:#3d4457}

/* ---------- 执行汇报 v2（.v2reports 命名空间，不影响其它页面） ---------- */
.v2reports{--p:#5b57f5;--p2:#8b5cf6;--p-deep:#4338ca;--p-soft:#eeedff;--p-line:#ddd9ff;--ok:#1f9d6b;--ok-soft:#eaf9f1;--warn:#96650a;--warn-soft:#fff5dd;--warn-dot:#e08c00;--ink2:#39415a}
.v2reports .panel{border-radius:22px;border-color:var(--line);box-shadow:0 1px 2px rgba(16,24,40,.04),0 22px 46px -30px rgba(16,24,40,.35)}
.v2reports .panel-head{display:flex;align-items:center;gap:13px;padding:20px 22px 8px;border-bottom:0}
.v2reports .panel-head .r2-ico{width:40px;height:40px;flex:none;border-radius:14px;display:grid;place-items:center;color:#fff;background:linear-gradient(145deg,var(--p2),var(--p));box-shadow:0 12px 22px -12px rgba(91,87,245,.85)}
.v2reports .panel-head .r2-ico svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.v2reports .panel-head h2{font-size:15px;font-weight:650;letter-spacing:-.01em}
.v2reports .panel-head .kicker{margin-left:5px;font-size:12.5px;color:var(--muted)}
.v2reports .panel-head .kicker b{color:var(--red);font-weight:700}
.v2reports .panel-head .btn{margin-left:auto}
.v2reports .r2-list{display:flex;flex-direction:column;gap:22px;padding:14px 22px 24px}
.v2reports .empty{margin:0 22px 24px}
/* 左侧时间轴 */
.v2reports .report{display:grid;grid-template-columns:42px minmax(0,1fr);gap:12px;align-items:start}
.v2reports .mark{display:flex;flex-direction:column;align-items:center;gap:7px;padding-top:5px}
.v2reports .mark .badge-m{width:42px;padding:4px 0 4px;border-radius:9px;background:var(--p-soft);color:var(--p-deep);text-align:center;line-height:1.05;font-weight:680;border:1px solid var(--p-line)}
.v2reports .mark .badge-m span{display:block;font-size:12.5px;letter-spacing:0}
.v2reports .mark .line{width:2px;flex:1;min-height:18px;border-radius:2px;background:linear-gradient(180deg,#dedbff,#f4f3fb 65%,transparent)}
.v2reports .mark .dot{width:6px;height:6px;border-radius:50%;background:#d7dae9}
.v2reports .report-main{display:block;min-width:0}
/* 汇报卡片 */
.v2reports .card{background:#fff;border:1px solid var(--line);border-radius:18px;padding:17px 20px 16px;box-shadow:0 1px 2px rgba(16,24,40,.03)}
.v2reports .card-head{display:flex;align-items:center;gap:11px;flex-wrap:wrap}
.v2reports .card-head .type{font-size:14px;font-weight:700;letter-spacing:-.01em}
.v2reports .card-head .sep{color:#cfd4e0}
.v2reports .card-head .who{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:640;color:var(--ink2)}
.v2reports .avatar{width:26px;height:26px;border-radius:50%;flex:none;display:inline-grid;place-items:center;color:#fff;font-size:12px;font-weight:650}
.v2reports .avatar.p{background:linear-gradient(145deg,var(--p2),var(--p))}
.v2reports .avatar.g{background:linear-gradient(145deg,#34b37c,var(--ok))}
.v2reports .vline{width:1px;height:15px;background:#e3e6ee}
.v2reports .date{font-size:12px;color:var(--muted)}
.v2reports .pill{margin-left:auto;display:inline-flex;align-items:center;gap:6px;padding:4px 11px;border-radius:999px;font-size:11.5px;font-weight:620;white-space:nowrap}
.v2reports .pill .d{width:6px;height:6px;border-radius:50%}
.v2reports .pill.unread{background:var(--warn-soft);color:var(--warn)}
.v2reports .pill.unread .d{background:var(--warn-dot)}
.v2reports .pill.boss{background:#f0eeff;color:var(--p-deep)}
.v2reports .pill.self{background:#e9f8f0;color:#127a53}
.v2reports .body{margin-top:13px;padding:13px 16px;border-radius:14px;background:var(--soft);color:var(--ink2);font-size:14px;line-height:1.78}
/* 批注：与正文同一左边界起缩进，带时间轴点 */
.v2reports .comments{position:relative;margin-top:15px;padding-top:15px;border-top:1px solid var(--line-soft);display:flex;flex-direction:column;gap:10px}
.v2reports .comments::before{content:"";position:absolute;left:3px;top:26px;bottom:14px;width:1px;background:#e9ecf4}
.v2reports .comment{position:relative;margin-left:26px;padding:12px 16px 13px;border-radius:14px}
.v2reports .comment::before{content:"";position:absolute;left:-26px;top:22px;width:7px;height:7px;border-radius:50%;background:#d7dae9;box-shadow:0 0 0 3px #fff}
.v2reports .comment.boss{background:#f5f3ff}
.v2reports .comment.self{background:#f0faf5}
.v2reports .comment-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.v2reports .comment-head b{font-size:14px;font-weight:700}
.v2reports .comment p{margin-top:7px;font-size:14px;line-height:1.75;color:var(--ink2)}
.v2reports .comment .del{opacity:0;transition:opacity .15s;border:0;background:none;color:var(--muted);font-size:12px;font-weight:600;padding:0 2px;cursor:pointer}
.v2reports .comment:hover .del{opacity:1}
/* 批注输入框 */
.v2reports .composer{display:none;margin-top:11px;margin-left:26px;padding:12px;border-radius:14px;background:var(--p-soft);border:1px dashed var(--p-line)}
.v2reports .composer.open{display:block;animation:rvPop .18s ease-out}
@keyframes rvPop{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.v2reports .composer textarea{width:100%;min-height:64px;resize:vertical;font:inherit;font-size:14px;color:#1a2233;padding:10px 12px;border-radius:11px;border:1px solid #dcd8ff;background:#fff;outline:none}
.v2reports .composer textarea:focus{border-color:var(--p);box-shadow:0 0 0 3px rgba(91,87,245,.14)}
.v2reports .composer .row{display:flex;gap:8px;align-items:center;margin-top:9px}
.v2reports .composer .hint{font-size:11.5px;color:#6459c9;margin-right:auto}
/* 底部胶囊按钮 */
.v2reports .acts{display:flex;align-items:center;gap:8px;margin-top:12px;flex-wrap:wrap}
/* 与右上角「＋ 填写周/月报」保持同一尺寸（.btn.small） */
.v2reports .acts .btn{display:inline-flex;align-items:center;gap:6px;padding:6.5px 12px;border-radius:9px;font-size:12.5px;line-height:1.2;font-weight:660;border:1px solid var(--line);background:#fff;color:var(--ink2);box-shadow:var(--shadow-sm)}
.v2reports .acts .btn.p{background:linear-gradient(140deg,var(--p2),var(--p));border-color:transparent;color:#fff;box-shadow:0 8px 16px -10px rgba(91,87,245,.9)}
.v2reports .acts .btn svg{width:13px;height:13px;flex:none;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
/* 右侧栏 */
.v2reports .rail .card{border-radius:18px}
.v2reports .rail .panel{padding:0}
.v2reports .panel-body{padding:17px 19px 19px}
.v2reports .side-head{display:flex;align-items:center;gap:11px}
.v2reports .side-head .ico{width:36px;height:36px;border-radius:12px;flex:none;display:grid;place-items:center;color:#fff;background:linear-gradient(145deg,var(--p2),var(--p))}
.v2reports .side-head .ico svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.v2reports .side-head b{font-size:14.5px;font-weight:700}
.v2reports .side-txt{margin-top:10px;font-size:12.5px;line-height:1.85;color:var(--muted)}
.v2reports .divider{height:1px;background:var(--line-soft);margin:14px 0}
.v2reports .rhythm{display:flex;flex-direction:column;gap:11px}
.v2reports .rhythm .row{display:flex;align-items:center;gap:10px;font-size:13px}
.v2reports .rhythm .row .k{color:var(--muted)}
.v2reports .rhythm .row b{margin-left:auto;font-weight:650}
.v2reports .mini-track{height:5px;border-radius:999px;background:var(--line-soft);overflow:hidden}
.v2reports .mini-track i{display:block;height:100%;border-radius:999px;background:linear-gradient(90deg,var(--p),var(--p2))}
.v2reports .quick{display:grid;gap:9px;margin-top:13px}
.v2reports .quick .btn{justify-content:flex-start;border-radius:13px;padding:10px 14px}
@media (max-width:760px){
  .v2reports .report{grid-template-columns:1fr;gap:10px}
  .v2reports .mark{flex-direction:row;align-items:center;gap:10px}
  .v2reports .mark .line,.v2reports .mark .dot{display:none}
  .v2reports .comment,.v2reports .composer{margin-left:0}
  .v2reports .comments::before,.v2reports .comment::before{display:none}
  .v2reports .panel-head{flex-wrap:wrap}
}
/* ---------- 消息通知中心 ---------- */
.msg-list{display:flex;flex-direction:column;gap:10px;padding:15px 18px 18px}
.msg{display:flex;gap:12px;align-items:flex-start;padding:14px 16px;border:1px solid var(--line);border-radius:14px;background:#fff;cursor:pointer;transition:border-color .16s,box-shadow .16s}
.msg:hover{border-color:#d9dded;box-shadow:var(--shadow-sm)}
.msg.un{background:#fbfbff;border-color:#e2dfff}
.msg .dot{width:8px;height:8px;border-radius:50%;flex:none;margin-top:7px;background:#dee2ee}
.msg.un .dot{background:linear-gradient(145deg,#8b5cf6,#5b57f5);box-shadow:0 0 0 3px rgba(91,87,245,.12)}
.msg-body{flex:1;min-width:0}
.msg-top{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.msg-top .proj{font-size:14px;font-weight:700}
.msg-top .kind{font-size:11.5px;font-weight:620;padding:3px 9px;border-radius:999px;background:#eeedff;color:#4338ca}
.msg-top .kind.note{background:#eaf9f1;color:#127a53}
.msg-top .who{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:600;color:#525a72}
.msg-top .who .avatar{width:22px;height:22px;font-size:9.5px}
.msg-top .who .avatar.p{background:linear-gradient(145deg,#8b5cf6,#5b57f5)}
.msg-top .who .avatar.g{background:linear-gradient(145deg,#34b37c,#1f9d6b)}
.msg-top .time{margin-left:auto;font-size:12px;color:var(--muted)}
.msg-txt{margin-top:8px;font-size:13px;line-height:1.7;color:#4d5773;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.msg-foot{margin-top:9px;display:flex;align-items:center;gap:10px;font-size:12px;color:var(--muted)}
.msg-foot .go{margin-left:auto;color:#5b57f5;font-weight:620}
.msg.un .msg-foot .go{color:#4338ca}

/* ---------- 项目总览「最新消息」小卡 ---------- */
.dash-msg-list{display:flex;flex-direction:column}
.dash-msg{display:flex;gap:10px;align-items:flex-start;padding:11px 16px;border-top:1px solid var(--line-soft);cursor:pointer;transition:background .16s}
.dash-msg:first-child{border-top:0}
.dash-msg:hover{background:#fafbff}
.dash-msg .dot{width:7px;height:7px;border-radius:50%;flex:none;margin-top:7px;background:#dee2ee}
.dash-msg.un .dot{background:linear-gradient(145deg,#8b5cf6,#5b57f5);box-shadow:0 0 0 3px rgba(91,87,245,.12)}
.dash-msg .bd{flex:1;min-width:0}
.dash-msg .t{display:flex;align-items:center;gap:8px}
.dash-msg .t b{font-size:13px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dash-msg .t .kind{font-size:11px;font-weight:620;padding:2px 8px;border-radius:999px;background:#eeedff;color:#4338ca;flex:none}
.dash-msg .t .kind.note{background:#eaf9f1;color:#127a53}
.dash-msg .t .time{margin-left:auto;font-size:11.5px;color:var(--muted);flex:none}
.dash-msg p{margin:5px 0 0;font-size:12.5px;line-height:1.6;color:#5a6480;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dash-msg.un p{color:#3b4460}
.dash-msg-foot{padding:10px 16px;border-top:1px solid var(--line-soft);display:flex;align-items:center;font-size:12.5px;color:var(--muted)}
.dash-msg-foot .link-btn{margin-left:auto;font-size:12.5px}

/* ---------- 合作方名录（Excel 式表格） ---------- */
.data-table tfoot td{background:var(--soft);font-weight:700;border-top:1px solid var(--line)}
.data-table td.money .sub{display:block;font-weight:500;color:var(--muted)}

/* ---------- 合作方卡片：仅保留「总收款」 ---------- */
.partner-card .partner-metrics{margin-top:12px;padding-top:11px;border-top:1px solid var(--line-soft);display:flex;flex-wrap:wrap;align-items:baseline;gap:8px}
.partner-card .partner-metrics label{font-size:12.5px;color:var(--muted)}
.partner-card .partner-metrics b{font-size:18px;font-weight:730;color:var(--green);letter-spacing:-.01em}
.partner-card .partner-metrics .sub{flex-basis:100%;font-size:11.5px;color:var(--muted)}

/* ---------- 响应式：1180 折右栏 / 980 侧栏收成图标 ---------- */
@media (max-width:1180px){.dashboard-grid,.grid-2,.docs-layout,.detail-grid{grid-template-columns:1fr}
  .dashboard-side,.rail{align-content:start}
  .detail-stats{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 12px}
  .dstat{padding:0;border-left:0}
}
@media (max-width:980px){
  .shell{grid-template-columns:76px minmax(0,1fr)}
  .sidebar{padding:16px 10px}
  .brand div:not(.brand-mark),.nav-label,.nav button span:not(.icon),.user div,.role-toggle{display:none}
  .nav button{justify-content:center;padding:11px}
  .topbar,.content{padding-left:22px;padding-right:22px}
}
@media (max-width:760px){
  .detail-stats{grid-template-columns:1fr 1fr;gap:10px}
  .dstat b{font-size:17px}
  .detail-title{flex-direction:column;align-items:flex-start}
}

/* ---------- 工资结算记录弹窗（宽屏可读版） ---------- */
dialog.wide{width:min(1200px,90vw)}
.modal-body.salary-panel{max-height:78vh;overflow:auto;padding:20px 24px 22px}
.salary-panel .stat-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;margin-bottom:18px}
.salary-panel .stat{min-width:0;padding:16px 17px}
.salary-panel .stat-number{font-size:23px;margin-top:12px}
.salary-panel .stat-footer{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 银行卡信息：独立成行，左侧信息、右侧复制按钮 */
.salary-panel .bank-row{
  display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;
  margin:0 0 18px;padding:12px 16px;border:1px solid var(--line);border-radius:12px;
  background:var(--blue-soft);color:var(--blue-deep);font-size:12.5px;
}
.salary-panel .bank-row.is-empty{background:var(--soft);color:var(--muted);justify-content:flex-start}
.salary-panel .bank-info{display:flex;align-items:center;gap:10px;flex-wrap:wrap;min-width:0}
.salary-panel .bank-tag{flex:none;padding:3px 9px;border-radius:8px;background:#fff;color:var(--blue-deep);font-weight:650}
.salary-panel .bank-info b{font-size:13px}
.salary-panel .bank-card{font-variant-numeric:tabular-nums;letter-spacing:.02em;font-weight:650}
.salary-panel .bank-branch{color:#5f6a99}
.salary-panel .bank-actions{display:flex;gap:8px;margin-left:auto}
/* 明细表：横向滚动 + 固定表头 + 首列固定 */
.salary-panel .table-wrap{max-height:46vh;overflow:auto;border:1px solid var(--line);border-radius:var(--radius);background:#fff}
/* 注意：基础样式里 .data-table 带 overflow:hidden，会让表格自己成为滚动容器导致粘性失效，这里必须放开 */
.salary-panel .data-table{min-width:1270px;border:0;border-radius:0;box-shadow:none;overflow:visible;border-collapse:separate;border-spacing:0}
.salary-panel .data-table th,.salary-panel .data-table td{padding:13px 16px;white-space:nowrap}
/* 表头固定（表格自身滚动容器内） */
.salary-panel .data-table thead th{position:sticky;top:0;z-index:3;background:var(--soft);box-shadow:inset 0 -1px 0 var(--line)}
.salary-panel .data-table th:first-child,.salary-panel .data-table td:first-child{position:sticky;left:0;z-index:2;background:#fff}
.salary-panel .data-table thead th:first-child{z-index:4;background:var(--soft);box-shadow:inset -1px 0 0 var(--line),inset 0 -1px 0 var(--line)}
.salary-panel .data-table tbody tr:hover td{background:#fafbff}
.salary-panel .data-table tbody tr:hover td:first-child{background:#fafbff}
.salary-panel .data-table tbody td:first-child{box-shadow:inset -1px 0 0 var(--line-soft)}
/* 实出勤与金额列（第 3–8 列）统一右对齐 + 等宽数字 */
.salary-panel .data-table th:nth-child(n+3):nth-child(-n+8),
.salary-panel .data-table td:nth-child(n+3):nth-child(-n+8){text-align:right;font-variant-numeric:tabular-nums}
.salary-panel .data-table td.num{font-weight:600}
.salary-panel .data-table td.month-cell .sub{display:block;color:var(--muted);font-size:11.5px;font-weight:500;margin-top:2px}
/* 备注列允许换行，避免把表格撑得过宽 */
.salary-panel .data-table td.note-cell{white-space:normal;color:var(--muted);min-width:190px}
@media (max-width:640px){.salary-panel .stat-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
/* 表单里的复选框行（固定底薪设置：是否同步待发放工资条） */
.check-line{display:flex;align-items:center;gap:8px;font-weight:600;color:var(--ink)}
.check-line input{width:16px;height:16px;accent-color:var(--blue-deep);cursor:pointer}
/* ===== 全部项目：最新周报时间 / 最新周报内容 / 最新老板批注 ===== */
.projects-table{min-width:1120px}
.projects-table .cell-name{min-width:210px;max-width:250px}
.projects-table .cell-name b,.projects-table .cell-name .project-external{font-weight:650;letter-spacing:-.01em}
.projects-table .cell-name .sub{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:240px}
.projects-table .cell-time{min-width:104px;white-space:nowrap}
.projects-table .cell-time b{font-variant-numeric:tabular-nums;font-weight:650}
.projects-table .cell-report{max-width:250px}
.projects-table .cell-note{max-width:210px}
.projects-table .row-actions{white-space:nowrap}
.projects-table .row-actions .btn+.btn{margin-left:6px}
/* 单元格单行省略：被截断时鼠标悬停弹出完整内容 */
.clip{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#3d4459;outline:none}
.clip.none{color:#b7bccd}
.clip:hover,.clip:focus-visible{color:var(--ink)}
/* 悬停弹框 */
.tip{position:fixed;z-index:120;max-width:340px;background:#fff;border:1px solid var(--line);border-radius:13px;box-shadow:0 18px 42px -18px rgba(16,24,40,.45),0 2px 6px rgba(16,24,40,.06);padding:11px 13px 12px;font-size:12.5px;line-height:1.75;color:#3d4459;opacity:0;transform:translateY(-4px) scale(.985);transition:opacity .15s ease,transform .15s ease;pointer-events:none}
.tip.show{opacity:1;transform:none}
.tip b{display:block;font-size:12px;font-weight:700;color:var(--ink);margin-bottom:5px}
.tip b em{font-style:normal;font-weight:600;color:var(--muted);margin-left:6px;font-size:11.5px}
.tip .body{max-height:264px;overflow:auto;white-space:pre-wrap;word-break:break-word}
.tip .foot{margin-top:7px;padding-top:7px;border-top:1px dashed var(--line);font-size:11.5px;color:var(--muted)}
.tip .arrow{position:absolute;width:10px;height:10px;background:#fff;border-left:1px solid var(--line);border-top:1px solid var(--line);transform:rotate(45deg)}
.tip.below .arrow{top:-6px}
.tip.above .arrow{bottom:-6px;transform:rotate(225deg)}
/* ===== 悬浮预览：列宽上限 + 弹框尺寸 =====
   表格可横向滚动时，单元格不限宽会被长文本撑开、省略号不生效，因此给可截断元素本身设上限 */
.projects-table .cell-name .clip{max-width:230px;display:block}
.projects-table .cell-report .clip{max-width:250px}
.projects-table .cell-note .clip{max-width:210px}
/* 弹框宽度随内容自适应（短内容窄、长内容最多 360px），高度随内容自适应、超出可视范围时内部滚动 */
.tip{width:max-content;min-width:200px;max-width:360px}
/* ===== 共享资料 ===== */
.sf-toolbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:14px 16px;border-bottom:1px solid var(--line)}
.sf-search{position:relative;flex:1;min-width:210px;max-width:330px}
.sf-search input{width:100%;border:1px solid var(--line);border-radius:10px;padding:9px 12px 9px 32px;font-size:13px;background:#fbfcfe;outline:none;font-family:inherit;color:var(--ink)}
.sf-search input:focus{border-color:#b9bcf5;box-shadow:0 0 0 3px var(--blue-soft)}
.sf-mag{position:absolute;left:11px;top:8px;color:#a3abc0;font-size:13px}
.sf-filters{display:flex;gap:6px;flex-wrap:wrap}
.sf-filters button{border:1px solid var(--line);background:#fff;color:#657087;border-radius:99px;padding:6px 12px;font-size:12.5px;cursor:pointer;font-family:inherit}
.sf-filters button.on{background:var(--blue-soft);border-color:transparent;color:var(--blue);font-weight:600}
.sf-toolbar select{border:1px solid var(--line);border-radius:10px;padding:8px 10px;font-size:12.5px;background:#fff;font-family:inherit;color:var(--ink);cursor:pointer}
.sf-drop{margin:16px;border:1.5px dashed #cfd4e6;border-radius:14px;background:#fbfcfe;padding:22px;text-align:center;cursor:pointer;transition:.18s}
.sf-drop:hover,.sf-drop.over{border-color:var(--blue);background:var(--blue-soft)}
.sf-drop b{display:block;font-size:14px;margin-bottom:4px;color:var(--ink)}
.sf-drop span{font-size:12.5px;color:var(--muted)}
.sf-note{margin-top:10px;font-size:11.5px;color:#9099ae}
.sf-up{margin:0 16px 14px;border:1px solid var(--line);border-radius:12px;padding:12px 14px;display:flex;align-items:center;gap:12px;background:#fbfcfe}
.sf-un{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sf-bar{flex:1;height:6px;border-radius:99px;background:#eceef6;overflow:hidden;margin-top:6px}
.sf-bar i{display:block;height:100%;width:0;background:linear-gradient(90deg,#6b66f6,#5b57f5);transition:width .2s}
.sf-state{font-size:12px;color:var(--muted);white-space:nowrap}
.sf-count{padding:12px 16px 0;font-size:12.5px;color:var(--muted)}
.sf-wrap{overflow-x:auto;padding:0 16px 16px}
.sf-table{width:100%;border-collapse:collapse;min-width:900px}
.sf-table th{background:#fafbfe;color:#707b91;font-size:11px;text-transform:uppercase;letter-spacing:.03em;font-weight:700;text-align:left;padding:11px 12px;white-space:nowrap;border-bottom:1px solid var(--line)}
.sf-table td{border-bottom:1px solid var(--line-soft);padding:12px;font-size:13px;vertical-align:middle}
.sf-table tbody tr:hover{background:#fafbff}
.sf-name{display:flex;align-items:center;gap:10px;min-width:0}
.sf-fn{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:360px;font-weight:600}
.sf-sub{font-size:11.5px;color:#9099ae;font-weight:400;margin-top:2px}
.sf-ftype{width:34px;height:34px;border-radius:9px;display:inline-grid;place-items:center;font-size:10.5px;font-weight:800;color:#fff;flex:0 0 34px;letter-spacing:-.02em}
.sf-pdf{background:#e5484d}.sf-xls{background:#0ea97a}.sf-doc{background:#3454e6}.sf-ppt{background:#e08c00}.sf-img{background:#8b5cf6}.sf-other{background:#64748b}
.sf-who{display:flex;align-items:center;gap:7px;font-size:12.5px;white-space:nowrap}
.sf-ops{display:flex;gap:6px;justify-content:flex-end}
.sf-op{border:1px solid var(--line);background:#fff;border-radius:8px;padding:4px 9px;font-size:12px;cursor:pointer;color:#4b5563;font-family:inherit}
.sf-op:hover{border-color:#b9bcf5;color:var(--blue)}
.sf-op.del:hover{border-color:#f3c7ca;color:var(--red);background:#fff5f5}
.sf-mine{margin-left:2px;font-size:11px;color:var(--muted);border:1px solid var(--line);border-radius:999px;padding:1px 6px}
.sf-op-disabled{font-size:12px;color:#b3b9c8;border:1px dashed var(--line);border-radius:8px;padding:4px 9px;cursor:not-allowed}
/* 预览弹窗 */
dialog.sf-viewer{width:min(1120px,calc(100vw - 26px));height:min(88vh,880px);padding:0;border:0;border-radius:16px;box-shadow:0 30px 70px -20px rgba(15,19,32,.5);flex-direction:column}
dialog.sf-viewer[open]{display:flex}
.sf-vhead{display:flex;align-items:center;gap:12px;padding:14px 18px;border-bottom:1px solid var(--line)}
.sf-vmeta{min-width:0;flex:1}
.sf-vmeta b{display:block;font-size:14.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sf-vmeta span{font-size:12px;color:var(--muted)}
.sf-vright{margin-left:auto;display:flex;gap:8px;align-items:center}
.sf-vbody{flex:1;background:#f0f2f8;overflow:auto;padding:18px;display:flex;flex-direction:column;align-items:center;gap:14px}
.sf-vfoot{padding:10px 18px;border-top:1px solid var(--line);font-size:12px;color:var(--muted)}
.sf-vloading{margin:auto;color:var(--muted);font-size:13px}
.sf-frame{width:100%;flex:1;min-height:520px;border:0;border-radius:10px;background:#fff}
.sf-imgview{max-width:100%;max-height:100%;border-radius:10px;background:#fff}
.sf-paper{background:#fff;box-shadow:0 8px 24px -12px rgba(15,19,32,.35);width:min(800px,100%);padding:28px 32px;border-radius:10px;font-size:13.5px;line-height:1.9;color:#26304a}
.sf-paper table{border-collapse:collapse;width:100%;font-size:12.5px}
.sf-paper th,.sf-paper td{border:1px solid #e3e7f2;padding:6px 8px;text-align:left;background:#fff}
.sf-paper th{background:#f4f6fc;font-weight:700}
.sf-sheets{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:14px}
.sf-sheet{border:1px solid var(--line);background:#fff;border-radius:99px;padding:5px 12px;font-size:12px;cursor:pointer;font-family:inherit;color:#4b5563}
.sf-sheet.on{background:var(--blue-soft);border-color:transparent;color:var(--blue);font-weight:600}
.sf-doc h1,.sf-doc h2,.sf-doc h3{line-height:1.5}
.sf-doc img{max-width:100%}
.sf-slide{width:min(760px,100%);min-height:360px;background:linear-gradient(135deg,#eef1ff,#f7f8ff);border:1px solid #dfe3f2;border-radius:12px;padding:36px 44px}
.sf-slide h4{font-size:23px;margin:8px 0 6px;letter-spacing:-.02em}
.sf-slide ul{margin:10px 0 0;padding-left:20px;font-size:14px;line-height:2;color:#3b4763}
.sf-slide-head{font-size:12px;color:#8b95ae}
.sf-slidenav{display:flex;gap:10px;align-items:center}
.sf-pager{font-size:12.5px;color:var(--muted)}
.sf-none{text-align:center;color:#5b6379;margin:auto;padding:20px}
.sf-none-icon{width:74px;height:74px;border-radius:18px;background:#eceff7;display:grid;place-items:center;margin:0 auto 14px;font-size:12px;font-weight:800;color:#8b95ae}
.sf-none p{margin:8px 0 16px}
.sf-dot{width:7px;height:7px;border-radius:50%;background:var(--green);display:inline-block;margin-right:6px}
.sf-dot.warn{background:var(--amber)}
/* ==================== 项目资料：拖拽上传 + 在线预览 ==================== */
.file-row .ico.img{background:linear-gradient(135deg,#3b82f6,#8b5cf6)}
.file-row .ico.other{background:linear-gradient(135deg,#64748b,#94a3b8)}
.doc-files{margin-top:12px}
.doc-drop{border:1.5px dashed #cbd2e4;border-radius:12px;padding:18px 14px;text-align:center;background:#fbfcff;cursor:pointer;margin-bottom:10px;transition:border-color .15s,background .15s}
.doc-drop:hover{border-color:var(--blue);background:#f5f7ff}
.doc-drop.over{border-color:var(--blue);background:#eef3ff}
.doc-drop strong{display:block;font-size:13px;font-weight:650;color:#2b3348}
.doc-drop .muted{display:block;font-size:11.5px;margin-top:4px;line-height:1.6}
.doc-drop-ico{display:inline-grid;place-items:center;width:34px;height:34px;border-radius:10px;background:#e8edff;color:var(--blue);font-size:17px;margin-bottom:8px}
#doc-ups:empty{display:none}
.doc-up{display:flex;align-items:center;gap:10px;padding:9px 11px;border-radius:10px;background:var(--soft);border:1px solid var(--line-soft);margin-bottom:7px}
.doc-utype{width:30px;height:30px;border-radius:8px;display:grid;place-items:center;background:linear-gradient(135deg,var(--p),var(--p2));color:#fff;font-size:9.5px;font-weight:800;flex:none}
.doc-un{font-size:12.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.doc-bar{height:4px;border-radius:99px;background:#e6e9f2;overflow:hidden;margin-top:5px}
.doc-bar i{display:block;height:100%;width:0;border-radius:99px;background:var(--blue);transition:width .18s}
.doc-state{font-size:11.5px;font-weight:650;flex:none}
dialog.doc-preview{width:min(1080px,calc(100vw - 24px));max-width:none}
.doc-preview .modal-head{align-items:center;gap:12px}
.doc-preview .modal-head h2{font-size:14.5px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.doc-pv-tools{display:flex;align-items:center;gap:8px;flex:none}
.doc-preview-body{padding:0;min-height:46vh;max-height:76vh;overflow:auto;background:#f4f6fb}
.doc-pv-tip{padding:60px 18px;text-align:center;color:var(--muted);font-size:12.5px}
.doc-pv-fail{padding:56px 18px;text-align:center;color:var(--muted);display:flex;flex-direction:column;align-items:center;gap:12px}
.doc-pv-frame{width:100%;height:76vh;border:0;display:block;background:#fff}
.doc-pv-img{padding:16px;display:grid;place-items:center;min-height:40vh}
.doc-pv-img img{max-width:100%;max-height:72vh;border-radius:10px;background:#fff;box-shadow:0 8px 26px rgba(16,24,40,.12)}
.doc-pv-text{margin:0;padding:16px 18px;font-size:12.5px;line-height:1.75;white-space:pre-wrap;word-break:break-word}
.doc-preview-body.is-docx{padding:0;background:#fff}
.doc-tabs{display:flex;gap:6px;flex-wrap:wrap;padding:10px 12px;border-bottom:1px solid var(--line);background:#fff;position:sticky;top:0;z-index:2}
.doc-tab{border:1px solid var(--line);background:#fff;border-radius:8px;padding:5px 11px;font-size:12px;cursor:pointer;color:#4c566b}
.doc-tab.active{border-color:var(--blue);color:var(--blue);background:#eef3ff;font-weight:650}
.doc-sheet{padding:12px;overflow:auto}
.doc-sheet table{border-collapse:collapse;width:max-content;min-width:100%;background:#fff;font-size:12px}
.doc-sheet td,.doc-sheet th{border:1px solid #e2e6f0;padding:5px 8px;white-space:nowrap}
.doc-sheet th{background:#f1f4fb;font-weight:650;text-align:left}
/* 资料上传区上方的「归属项目 / 资料分类」选择行 */
.doc-upbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin:0 0 10px}
.doc-upbar label{font-size:12px;font-weight:650;color:#5b6479}
.doc-upbar select{border:1px solid var(--line);border-radius:10px;padding:8px 10px;font-size:13px;background:#fff;color:#2b3348}
.pptx-deck{padding:12px;display:flex;flex-direction:column;gap:14px;align-items:center}
.pptx-page{position:relative;background:#fff;border:1px solid var(--line);border-radius:8px;box-shadow:0 6px 20px rgba(16,24,40,.1);zoom:.62;flex:none;overflow:hidden}
.pptx-no{position:absolute;right:10px;bottom:6px;font-size:12px;font-weight:700;color:#b0b7c9}
.pptx-shape{position:absolute;overflow:hidden;line-height:1.35;color:#22242c}
.pptx-shape img{width:100%;height:100%;object-fit:contain}
.pptx-p{margin:0 0 3px;word-break:break-word;white-space:normal}

/* ---- PDF 预览：PDF.js 站内渲染，替代 iframe（全站 X-Frame-Options: DENY 会拦截 iframe） ---- */
.sf-vtools{display:flex;gap:6px;align-items:center;flex-wrap:wrap;padding:8px 12px;border-bottom:1px solid var(--line);background:#f7f8fb;position:sticky;top:0;z-index:2}
.sf-vtools .btn.small{padding:5px 10px}
.btn.small:disabled{opacity:.45;cursor:not-allowed}
.pdf-num{font-size:12px;color:#5b6479;display:inline-flex;align-items:center;gap:4px}
.pdf-num input{width:54px;border:1px solid var(--line);border-radius:8px;padding:4px 6px;text-align:center;font-size:12px;color:#2b3348;background:#fff}
.pdf-zoom{font-size:12px;color:#5b6479;min-width:46px;text-align:center}
.pdf-scroll{width:100%;height:100%;overflow:auto;background:#eef0f5;display:flex;justify-content:center;padding:14px}
.pdf-page{display:flex;justify-content:center;align-items:flex-start}
.pdf-canvas{background:#fff;box-shadow:0 2px 14px rgba(20,28,50,.16);border-radius:2px}
.sf-vbody:fullscreen{background:#eef0f5;padding:0}
.sf-vbody:fullscreen .pdf-scroll{height:100vh}


/* ---- 预览弹窗：统一缩放容器（图片 / 文本 / Word / Excel / PPT 共用） ---- */
.sf-vbody.zoomable{padding:0;overflow:hidden;align-items:stretch;gap:0;background:#eef0f5}
.sf-viewport{flex:1;min-height:0;overflow:auto;background:#eef0f5;padding:12px}
.sf-scale-wrap{margin:0 auto;position:relative}
.sf-scale{transform-origin:top left;background:#fff;box-shadow:0 2px 16px rgba(20,28,50,.16);border-radius:6px;overflow:hidden}
.sf-scale>img{display:block;max-width:none;width:auto;height:auto;background:#fff}
.sf-scale .docx-wrapper{padding:30px 38px;background:#fff}
.sf-scale .doc-sheet{padding:0;overflow:visible}
.sf-scale .doc-tabs{padding:8px 10px;border-bottom:1px solid var(--line);background:#f7f8fb}
.sf-scale .pptx-deck{padding:0;gap:0}
.sf-scale .pptx-page{zoom:1;border:0;border-radius:0;box-shadow:none}
.sf-scale .doc-pv-text{padding:18px 22px;background:#fff;min-width:0}
.sf-vtools .btn.small.on{border-color:var(--blue);color:var(--blue);background:#eef3ff;font-weight:650}
.sf-vbody:fullscreen .sf-viewport{height:100vh}
.sf-vbody:fullscreen .pdf-scroll{height:100vh}

/* 共享资料：私密标记与私密开关（仅老板可见） */
.sf-priv{display:inline-block;margin-right:6px;font-size:11px;color:#9a3412;background:#fff7ed;border:1px solid #fed7aa;border-radius:999px;padding:1px 7px;vertical-align:middle}
.sf-op.on{background:#fff7ed;border-color:#fdba74;color:#9a3412;font-weight:600}
