:root{font-family:"Microsoft YaHei","PingFang SC",system-ui,sans-serif;color:#183442;background:#f4f7f8;font-synthesis:none;--ink:#123f52;--accent:#1e8e72;--line:#d8e2e6;--muted:#67808b;--danger:#b43e43;--paper:#fff}*{box-sizing:border-box}body{margin:0;min-height:100vh}button,input,select,textarea{font:inherit}button{cursor:pointer}.boot{display:grid;place-items:center;height:100vh;color:var(--muted)}#toast{position:fixed;z-index:100;left:50%;bottom:28px;transform:translateX(-50%);background:#123f52;color:#fff;border-radius:10px;padding:12px 18px;box-shadow:0 12px 32px #123f5266;max-width:min(90vw,620px)}.login-page{min-height:100vh;display:grid;grid-template-columns:minmax(320px,520px) 1fr;background:linear-gradient(135deg,#eff6f4,#d9e9e9)}.login-panel{background:#fff;padding:clamp(32px,7vw,96px);display:flex;flex-direction:column;justify-content:center}.login-visual{padding:8vw;display:flex;flex-direction:column;justify-content:flex-end;color:#143d4e;background:radial-gradient(circle at 70% 20%,#5ee0b46b,transparent 28%)}.brand{display:flex;align-items:center;gap:12px;margin-bottom:50px}.brand-mark{display:grid;place-items:center;width:44px;height:44px;border-radius:12px;background:var(--ink);color:#5fe0b5;font-size:26px}.brand b{font-size:20px}.brand small{display:block;color:var(--muted);font-size:12px;margin-top:3px}.login-panel h1{font-size:32px;margin:0 0 10px}.login-panel>p{color:var(--muted);margin:0 0 30px}.field{display:grid;gap:7px;margin-bottom:16px}.field>span{font-size:13px;color:#49636e}.field input,.field select,.field textarea{width:100%;border:1px solid var(--line);border-radius:9px;padding:11px 12px;background:#fff;color:#183442;outline:none}.field input:focus,.field select:focus,.field textarea:focus{border-color:#1e8e72;box-shadow:0 0 0 3px #1e8e721c}.primary,.secondary,.danger,.ghost{border:0;border-radius:9px;padding:11px 16px;font-weight:700}.primary{background:var(--ink);color:#fff}.secondary{background:#e8f5f0;color:#14644f}.danger{background:#fdebec;color:#9d3138}.ghost{background:transparent;color:#49636e;border:1px solid var(--line)}.login-form .primary{width:100%;margin-top:8px}.hint{margin-top:22px;padding:12px;border-radius:8px;background:#f1f6f7;color:#5f7580;font-size:13px}.shell{display:grid;grid-template-columns:246px minmax(0,1fr);min-height:100vh}.sidebar{position:sticky;top:0;height:100vh;background:var(--ink);color:#fff;padding:26px 18px;display:flex;flex-direction:column}.sidebar .brand{margin:0 8px 34px}.sidebar .brand small{color:#a8c0ca}.nav{display:grid;gap:7px}.nav button{border:0;text-align:left;padding:12px 14px;border-radius:9px;background:transparent;color:#c7d8de}.nav button.active,.nav button:hover{background:#ffffff15;color:#fff}.sidebar-footer{margin-top:auto;border-top:1px solid #ffffff1f;padding:18px 8px 0}.sidebar-footer b,.sidebar-footer small{display:block}.sidebar-footer small{color:#a8c0ca;margin:4px 0 12px}.main{min-width:0}.topbar{height:78px;padding:0 30px;background:#fff;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10}.topbar h1{font-size:22px;margin:0}.top-actions{display:flex;gap:9px}.content{padding:28px;max-width:1500px;margin:auto}.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:24px}.stat,.card{background:var(--paper);border:1px solid var(--line);border-radius:14px;box-shadow:0 5px 16px #123f5208}.stat{padding:22px}.stat b{display:block;font-size:30px;color:var(--ink)}.stat span{color:var(--muted);font-size:13px}.card{padding:20px;margin-bottom:20px}.card-head{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:16px}.card-head h2{font-size:18px;margin:0}.actions{display:flex;flex-wrap:wrap;gap:9px}.table-wrap{overflow:auto}table{width:100%;border-collapse:collapse;min-width:760px}th,td{text-align:left;border-bottom:1px solid #e6edef;padding:12px 10px;font-size:14px}th{color:#59717b;font-weight:600;background:#f8fafb}.status{display:inline-flex;border-radius:99px;padding:4px 9px;font-size:12px;background:#edf2f4;color:#536974}.status.draft{background:#eef2f3}.status.submitted,.status.reviewing{background:#fff4d9;color:#835d00}.status.approved{background:#e8f7ee;color:#187047}.status.rejected{background:#fdebec;color:#9d3138}.empty{padding:50px;text-align:center;color:var(--muted)}.grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.grid .wide{grid-column:1/-1}.meta{display:flex;gap:18px;flex-wrap:wrap;color:var(--muted);font-size:13px}.report-title{display:flex;align-items:start;justify-content:space-between;gap:20px}.report-title h2{margin:0 0 7px}.signature-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}.signature-card{border:1px solid var(--line);border-radius:12px;padding:14px}.signature-card img{display:block;width:100%;height:105px;object-fit:contain;background:#fbfcfc;border:1px dashed var(--line);margin:10px 0}.signature-card .blank-sign{height:105px;display:grid;place-items:center;background:#fbfcfc;color:#91a2a9;border:1px dashed var(--line);margin:10px 0}.modal{position:fixed;z-index:50;inset:0;background:#092b3977;display:grid;place-items:center;padding:20px}.modal-panel{background:#fff;border-radius:16px;width:min(720px,100%);max-height:92vh;overflow:auto;padding:22px}.modal-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}.modal-head h2{margin:0}.icon-btn{border:0;background:#edf2f4;border-radius:8px;padding:7px 10px}.signature-canvas{width:100%;height:240px;border:1px solid var(--line);border-radius:10px;touch-action:none;background:#fff}.permission-list{display:grid;grid-template-columns:repeat(2,1fr);gap:8px 16px}.check{display:flex;align-items:center;gap:8px;font-size:14px}.audit-list{display:grid;gap:8px}.audit-item{display:grid;grid-template-columns:170px 120px 1fr 110px;gap:12px;padding:12px;background:#f8fafb;border-radius:9px;font-size:13px}.muted{color:var(--muted)}.mobile-nav{display:none}.notice{border-left:4px solid #1e8e72;background:#eef8f5;padding:12px 14px;margin-bottom:18px;border-radius:0 8px 8px 0}.review-box{display:grid;grid-template-columns:1fr auto auto;gap:10px;align-items:end}.review-box .field{margin:0}.error{color:var(--danger);font-size:13px;margin:8px 0}.account-line{display:flex;align-items:center;gap:8px}.dot{width:8px;height:8px;border-radius:50%;background:#42ac79}.dot.off{background:#aebbc0}@media(max-width:850px){.login-page{display:block}.login-panel{min-height:100vh}.login-visual{display:none}.shell{display:block;padding-bottom:68px}.sidebar{display:none}.topbar{height:64px;padding:0 16px}.content{padding:16px}.top-actions .ghost{display:none}.stats{grid-template-columns:repeat(2,1fr);gap:10px}.stat{padding:16px}.stat b{font-size:24px}.grid,.signature-grid{grid-template-columns:1fr}.review-box{grid-template-columns:1fr 1fr}.review-box .field{grid-column:1/-1}.mobile-nav{position:fixed;z-index:30;display:grid;grid-auto-flow:column;grid-auto-columns:1fr;bottom:0;left:0;right:0;background:#fff;border-top:1px solid var(--line);padding-bottom:env(safe-area-inset-bottom)}.mobile-nav button{border:0;background:#fff;padding:11px 5px;color:#647b84;font-size:12px}.mobile-nav button.active{color:#12664f;font-weight:700}.audit-item{grid-template-columns:1fr 1fr}.audit-item span:nth-child(3){grid-column:1/-1}.permission-list{grid-template-columns:1fr}.modal{padding:8px}.modal-panel{padding:16px}.signature-canvas{height:220px}}
.paste-import{margin-bottom:20px;padding:16px;border:1px solid #bcded4;border-radius:12px;background:#f2faf7}.paste-import b,.paste-import small{display:block}.paste-import small{margin-top:4px;color:var(--muted)}.paste-import textarea{width:100%;min-height:125px;margin:12px 0;border:1px solid var(--line);border-radius:9px;padding:11px;resize:vertical}.import-result{margin-top:10px;color:#526e78;font-size:13px}
.document-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 0;border-bottom:1px solid #e6edef}.document-row:last-child{border-bottom:0}.document-row b,.document-row small{display:block}.document-row small{margin-top:4px;color:var(--muted)}
.download-column{min-width:252px}.report-downloads{display:flex;gap:8px;white-space:nowrap}.report-downloads button{padding:8px 11px;font-size:13px}.report-downloads .secondary{border:1px solid #b9d9ce}
@media(max-width:850px){.download-column{min-width:228px}.report-downloads{flex-direction:column}.report-downloads button{width:100%}}

.report-opening{opacity:.65;cursor:progress}.report-opening td:first-child:after{content:" 正在打开…";font-size:12px;color:#59717b}tr[data-report-id]{cursor:pointer}tr[data-report-id]:focus{outline:2px solid #1e8e72;outline-offset:-2px}

.paste-import .import-result b{display:inline}

/* The report data remains one table on desktop and becomes stacked records
   on phones, so the same actions and account permissions serve both layouts. */
.report-client,.report-project{display:block}
.report-table-wrap .report-table td{vertical-align:top}
.report-table .report-status .status{white-space:nowrap}
.report-table .report-manage button{white-space:nowrap}
@media(max-width:850px){
 .report-table-wrap{overflow:visible}
 .report-table{display:block;min-width:0;width:100%}
 .report-table thead{display:none}
 .report-table tbody{display:grid;gap:14px}
 .report-table .report-list-item{display:grid;grid-template-columns:minmax(0,1fr) auto auto;grid-template-areas:"number manage status" "identity identity identity" "owner owner version" "time time time" "files files files";gap:0 8px;padding:12px;border:1px solid var(--line);border-radius:12px;background:#fff;box-shadow:0 2px 6px #123f5205}
 .report-table td{display:block;min-width:0;border:0;padding:0;font-size:13px;line-height:1.5}
 .report-table .report-number{grid-area:number;align-self:center;color:var(--ink);font-size:12.5px;line-height:20px;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}
 .report-table .report-status{grid-area:status;align-self:center}
 .report-table .status{font-size:12px;line-height:20px;padding:2px 8px}
 .report-table .report-identity{grid-area:identity;margin:6px 0 8px}
 .report-table .report-client{font-size:16px;font-weight:700;line-height:1.55;overflow-wrap:anywhere}
 .report-table .report-project{display:block;margin-top:3px;font-size:13px;line-height:1.5;overflow-wrap:anywhere}
 .report-table .report-project:before{content:"项目："}
 .report-table .report-owner{grid-area:owner;color:#49636e;font-size:12px;overflow-wrap:anywhere}
 .report-table .report-version{grid-area:version;justify-self:end;color:#49636e;font-size:12px;white-space:nowrap}
 .report-table .report-time{grid-area:time;margin-top:4px;color:#59717b;font-size:12px;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}
 .report-table [data-label]:before{content:attr(data-label) "：";color:#59717b}
 .report-table .report-files{grid-area:files;margin-top:8px;padding-top:8px;border-top:1px solid #e6edef}
 .report-table .report-downloads{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;white-space:normal}
 .report-table .report-downloads button{min-height:44px;padding:10px 6px;font-size:13px;white-space:nowrap}
 .report-table .report-manage{grid-area:manage;justify-self:end;align-self:center;margin-top:0}
 .report-table .report-manage button{min-width:52px;min-height:44px;padding:8px 10px;font-size:12px}
 .report-table-wrap .report-opening td:first-child:after{display:block}
 .card:has(>.report-table-wrap){padding:0;border:0;background:transparent;box-shadow:none}
 .card:has(>.report-table-wrap)>.card-head{align-items:flex-start;flex-wrap:wrap;margin-bottom:14px;gap:10px}
 .card:has(>.report-table-wrap)>.card-head>.actions{gap:8px}
 .card:has(>.report-table-wrap)>.card-head .muted{display:block;margin-top:5px;font-size:12px;line-height:1.5}
 .card:has(>.report-table-wrap)>.card-head button{min-height:44px;white-space:nowrap}
 .report-table .report-list-item:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
}

.report-search input{width:300px;max-width:100%;padding:11px 12px;border:1px solid #cbdce3;border-radius:8px;font:inherit}.report-list-actions{flex-wrap:wrap}.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}[data-search-count]{display:block;color:#607d8b;margin-top:10px}@media(max-width:900px){.report-list-actions{width:100%}.report-search{width:100%;flex-basis:100%}.report-search input{width:100%;box-sizing:border-box}}

@media(max-width:900px){.report-list-head{flex-direction:column;align-items:stretch;gap:12px}.report-list-actions{justify-content:flex-start}.report-list-actions button{flex:0 0 auto}}
