:root{--nav:#142744;--nav-muted:#94a7c3;--blue:#3065e8;--blue-soft:#ecf2ff;--ink:#1b2d48;--muted:#8190a5;--line:#e8edf4;--canvas:#f4f7fc;--radius:16px;--shadow:0 5px 24px #233b6105;font-family:Inter,"Segoe UI","Microsoft YaHei",sans-serif;color:var(--ink);font-size:14px;font-synthesis:none}*{box-sizing:border-box}body{margin:0;background:var(--canvas);line-height:1.5}button,input,select,textarea{font:inherit}button,a,input,select,textarea{-webkit-tap-highlight-color:transparent}button,a{touch-action:manipulation}button{cursor:pointer}button:disabled{opacity:.45;cursor:not-allowed}a{color:inherit;text-decoration:none}h1,h2,h3,p{margin:0}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible{outline:3px solid #7da4ff;outline-offset:3px}[hidden]{display:none!important}.sidebar{position:fixed;inset:0 auto 0 0;width:244px;background:var(--nav);color:#d4dff0;display:flex;flex-direction:column;z-index:30;padding:30px 18px 18px;background-image:radial-gradient(ellipse at 0 0,#28497599,transparent 60%)}.brand{display:flex;gap:12px;align-items:center;padding:0 10px 29px}.brand-mark{display:grid;place-items:center;width:42px;height:42px;flex-shrink:0;border-radius:13px;background:linear-gradient(145deg,#5d90ff,#315fdd);font-size:23px;color:#fff;font-weight:700;box-shadow:0 6px 16px #0c1b3540}.brand b{font-size:16px;display:block;color:#fff;max-width:146px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.brand small{font-size:9px;letter-spacing:1.1px;color:#a5b8d4;display:block;margin-top:4px}.nav-label{font-size:10px;letter-spacing:1.7px;color:#6e86a8;padding:10px 14px 8px}.sidebar nav>a{display:flex;align-items:center;gap:13px;min-height:46px;border-radius:9px;padding:10px 14px;color:#aebfd8;font-size:13px;margin:5px 0;transition:.2s}.sidebar nav>a:hover{background:#ffffff0b;color:#fff}.sidebar nav>a.active{background:linear-gradient(95deg,#3065e8,#3d70e5);color:#fff;box-shadow:0 4px 14px #071b493d}.sidebar nav i{font-style:normal;font-size:20px;font-weight:400;width:21px;text-align:center}.nav-badge{margin-left:auto;font-size:10px;border-radius:5px;background:#ffffff25;padding:0 6px}.nav-badge:empty{display:none}.sidebar-bottom{margin-top:auto}.workspace-note{padding:20px 12px;font-size:11px;color:#91a8c9;display:flex;align-items:center;gap:8px}.online-dot{width:6px;height:6px;background:#57d6af;border-radius:50%;display:inline-block;box-shadow:0 0 0 4px #57d6af12}.profile-summary{border:1px solid #ffffff10;background:#ffffff06;border-radius:12px;padding:13px 10px;width:100%;color:#e2eaf7;display:flex;align-items:center;text-align:left;gap:10px}.profile-summary b{font-size:12px;display:block}.profile-summary small{font-size:10px;color:var(--nav-muted);display:block;margin-top:2px}.profile-summary i{margin-left:auto;color:#92a9ca}.avatar{width:34px;height:34px;background:#e7efff;color:#3b66b6;border-radius:50%;display:grid;place-items:center;font-weight:600;object-fit:cover;overflow:hidden;flex-shrink:0}.avatar img{width:100%;height:100%;object-fit:cover}.app-main{margin-left:244px;min-width:0}.topbar{height:74px;display:flex;align-items:center;justify-content:space-between;gap:14px;padding:0 34px;border-bottom:1px solid var(--line);background:#ffffffed;position:sticky;top:0;z-index:20;backdrop-filter:blur(12px)}.topbar-left,.topbar-actions{display:flex;gap:15px;align-items:center}.topbar-actions form{margin:0}.breadcrumb{font-size:12px;color:#9aa6b8}.breadcrumb span{margin:0 12px;color:#c2cbd8}.breadcrumb b{font-weight:500;color:#51647d}.icon-button,.quiet-button,.text-button,.link-button{background:none;border:0;display:inline-flex;align-items:center;justify-content:center;gap:5px;color:#6e819b;padding:8px;border-radius:7px;min-height:34px;line-height:1.4}.icon-button{font-size:19px;width:36px}.quiet-button,.text-button,.link-button{font-size:12px}.icon-button:hover,.quiet-button:hover,.text-button:hover{background:#edf2fa;color:var(--blue)}.link-button{color:var(--blue)}.danger{color:#d35b63!important}.menu-toggle{display:none}#main{padding:32px 34px 44px;max-width:1740px;margin:auto;min-height:calc(100vh - 120px)}.page-heading{display:flex;justify-content:space-between;align-items:center;gap:20px;margin:0 0 26px}.eyebrow{font-size:10px;letter-spacing:1.6px;color:#8b9ab0;margin-bottom:8px;font-weight:600}h1{font-size:27px;letter-spacing:-.8px;font-weight:650;line-height:1.35}.heading-dot{color:var(--blue);margin-left:4px}.subheading{font-size:12px;color:#8b99ad;margin-top:7px}.actions{display:flex;align-items:center;gap:9px;flex-wrap:wrap}.button{display:inline-flex;align-items:center;justify-content:center;gap:7px;min-height:39px;padding:9px 15px;border:1px solid transparent;border-radius:8px;white-space:nowrap;font-size:12px;font-weight:500;transition:.15s}.primary{background:var(--blue);color:#fff;box-shadow:0 4px 10px #3065e81a}.primary:hover{background:#2457d5;transform:translateY(-1px)}.secondary{background:#fff;border-color:#dfe7f1;color:#526780}.secondary:hover{border-color:#a3b9e7;color:var(--blue);background:#fafcff}.button.small{font-size:11px;min-height:31px;padding:5px 10px}.stat-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:18px}.stat-card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:21px 23px;box-shadow:var(--shadow);text-align:left;position:relative;overflow:hidden}.stat-card::after{content:"";width:74px;height:74px;border:16px solid var(--stat-tint);border-radius:50%;position:absolute;right:-25px;bottom:-35px;opacity:.5}.stat-top{display:flex;align-items:center;justify-content:space-between;color:#8796a9;font-size:12px}.stat-icon{width:34px;height:34px;background:var(--stat-tint);color:var(--stat-color);display:grid;place-items:center;border-radius:10px;font-size:19px}.stat-value{font-size:35px;letter-spacing:-1px;font-weight:650;line-height:1.3;margin:6px 0 8px;display:block}.stat-foot{display:flex;align-items:center;gap:6px;color:#a0acbb;font-size:10px}.stat-foot i{font-style:normal;color:var(--stat-color)}.finance-strip{margin:20px 0 24px;display:grid;grid-template-columns:1fr 1fr 1fr 1.5fr;background:linear-gradient(110deg,#eaf1ff,#edf7fa);border:1px solid #e0eaf8;border-radius:12px;padding:19px 24px;gap:22px;align-items:center}.finance-number small{display:block;font-size:10px;color:#8296b4}.finance-number b{font-size:20px;font-weight:650;color:#3c5d86;letter-spacing:-.4px;display:block;margin-top:3px}.progress-label{display:flex;justify-content:space-between;color:#778da9;font-size:10px;margin-bottom:8px}.progress-track{height:6px;background:#dce7f5;border-radius:10px;overflow:hidden}.progress-track i{display:block;height:100%;background:#6692ed;border-radius:10px}.dashboard-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:21px}.widget[data-widget="expiring"]{grid-column:1/-1}.panel,.widget{background:#fff;border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden;min-width:0}.widget-header,.section-heading{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:18px 23px}.widget-header{border-bottom:1px solid #f0f3f8}.widget-header h2{font-size:14px;font-weight:600}.widget-header .widget-mark{height:13px;width:3px;background:#5e88ee;display:inline-block;border-radius:4px;margin-right:9px;vertical-align:middle}.widget-content{padding:20px 23px}.widget-content.no-padding{padding:0}.widget-actions{display:flex;gap:1px}.widget-actions button{font-size:12px;min-height:28px;width:28px}.chart-box{height:240px;position:relative}.table-wrap{overflow:auto;max-width:100%;scrollbar-width:thin;scrollbar-color:#cbd7e7 transparent}table{border-collapse:collapse;width:100%;font-size:12px;line-height:1.6}th{font-size:10px;color:#91a0b5;background:#f9fbfe;font-weight:500;text-align:left;letter-spacing:.3px;padding:13px 18px;white-space:nowrap;border-bottom:1px solid var(--line)}td{padding:15px 18px;border-bottom:1px solid #f0f3f8;vertical-align:middle;color:#52657f;max-width:300px}tbody tr:last-child td{border-bottom:0}tbody tr:hover{background:#fcfdff}td b{color:#304662;font-weight:500}td code{font-size:10px;color:#94a4b9;display:block}.money{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums;color:#345477;font-weight:500}.nowrap{white-space:nowrap}.cell-actions{display:flex;gap:4px;flex-wrap:nowrap}.cell-actions button{font-size:11px;padding:4px;min-height:30px;white-space:nowrap}.tag{display:inline-flex;gap:5px;align-items:center;font-size:10px;padding:4px 8px;border-radius:5px;background:#edf8f3;color:#4caa86;white-space:nowrap}.tag::before{content:"";width:4px;height:4px;border-radius:50%;background:currentColor}.tag.expiring{background:#fff6e8;color:#cf9c46}.tag.expired{background:#fef0f1;color:#d78489}.tag.terminated{background:#f0f2f5;color:#919ba9}.tag.blue{background:#eff4ff;color:#7294dd}.table-footer{display:flex;justify-content:space-between;align-items:center;padding:13px 20px;border-top:1px solid var(--line);color:#98a6b8;font-size:10px;gap:12px;flex-wrap:wrap}.pagination{display:flex;align-items:center;gap:5px}.pagination button{border:1px solid #e6ecf4;background:white;border-radius:5px;min-width:29px;height:29px;font-size:11px;color:#6c819c}.pagination button.active{color:#fff;background:var(--blue);border-color:var(--blue)}.pagination select{width:auto;min-height:29px;font-size:11px}.sort-button{border:0;background:none;padding:0;color:inherit;white-space:nowrap;cursor:pointer;font-size:inherit}.filters{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;padding:22px 23px;border-bottom:1px solid var(--line);align-items:end}.field{display:flex;flex-direction:column;gap:7px;min-width:0;font-size:12px}.field>span,.field>label{color:#71839d;font-size:11px}.field.full{grid-column:1/-1}.field small{font-size:10px;color:#94a2b6}.field input,.field select,.field textarea,input,select,textarea{max-width:100%;min-width:0;min-height:38px;padding:8px 11px;border:1px solid #dfe7f1;background:#fff;border-radius:7px;color:#3d5270;outline:none;font-size:12px;transition:border-color .15s}input::placeholder,textarea::placeholder{color:#b1bdcd}input:focus,textarea:focus,select:focus{border-color:#7b9fec;box-shadow:0 0 0 3px #3065e80b}input[type="checkbox"]{width:16px;height:16px;min-height:0;accent-color:var(--blue);flex-shrink:0;padding:0;cursor:pointer}input[type="file"]{padding:9px;background:#f9fbff}textarea{resize:vertical;min-height:75px}.filters .clear-filters{justify-self:start}.panel-toolbar{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;padding:18px 23px;border-bottom:1px solid var(--line)}.search-field{display:flex;align-items:center;gap:7px;border:1px solid #e2e9f2;border-radius:8px;padding:0 11px;max-width:100%;width:310px;background:#fff}.search-field span{color:#9aabc1;font-size:21px}.search-field input{border:0;box-shadow:none;width:100%;padding-left:0;background:none}.dept-table{table-layout:fixed;min-width:880px}.dept-table .tree-row td{padding:12px 18px;vertical-align:middle}.dept-table .tree-row:hover td{background:#fcfdff}.dept-name-inner{display:flex;align-items:center;gap:9px;min-width:0}.dept-name-text{display:block;min-width:0}.dept-name-text b{display:block;font-size:13px;font-weight:500;color:#2b405c;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dept-name-text small{display:block;color:#95a5b9;font-size:10px;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tree-symbol{background:#edf3ff;color:#6b93e3;border-radius:8px;width:32px;height:32px;display:grid;place-items:center;flex-shrink:0}.tree-expander{width:22px;border:0;background:none;color:#8093af;padding:0;font-size:12px;min-height:30px}.dept-table .dept-ops .cell-actions{flex-wrap:nowrap;justify-content:flex-start}.dept-table .dept-ops .cell-actions{flex-wrap:nowrap}.batch-toolbar{display:flex;align-items:center;gap:12px;background:#edf4ff;padding:11px 23px;color:#4879d6;font-size:12px}.table-summary{padding:13px 23px;background:#f8fbff;font-size:12px;color:#8094b0;display:flex;gap:26px;flex-wrap:wrap}.table-summary b{color:#416da7;font-weight:500;margin-left:6px}.tabs{display:flex;gap:20px;border-bottom:1px solid #e2e9f2;margin-bottom:20px}.tabs button{border:0;background:none;padding:12px 5px;color:#8b9bb1;border-bottom:2px solid transparent;font-size:13px}.tabs button.active{color:var(--blue);border-color:var(--blue);font-weight:600}.role-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}.role-card{padding:23px;border:1px solid var(--line);border-radius:14px;background:#fff}.role-card h3{font-size:16px;margin:14px 0 5px}.role-card p{min-height:38px;color:#91a1b7;font-size:12px}.role-card footer{border-top:1px solid var(--line);margin-top:20px;padding-top:16px;display:flex;justify-content:space-between;align-items:center;gap:8px}.permission-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}.permission-group{border:1px solid var(--line);border-radius:10px;padding:14px}.permission-group h4{margin:0 0 12px;font-size:12px;display:flex;justify-content:space-between}.checkbox-label{display:flex!important;flex-direction:row!important;align-items:center;gap:8px;font-size:12px;color:#6b7f9b;padding:5px 0}.settings-grid{display:grid;grid-template-columns:1.2fr 1fr;gap:22px;align-items:start}.settings-panel{padding:24px}.settings-panel h2{font-size:16px;margin-bottom:6px}.settings-panel>.subheading{margin-bottom:22px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}.setting-footer{margin-top:24px;display:flex;justify-content:flex-end}.brand-preview{display:flex;align-items:center;gap:14px;border:1px dashed #cfdcf0;border-radius:10px;padding:20px;margin:18px 0;background:#f8fbff}.brand-preview b{display:block}.brand-preview small{color:#93a5bd;font-size:11px}.editor-dialog{padding:0;border:1px solid #e0e8f4;border-radius:18px;width:min(780px,calc(100vw - 32px));max-height:calc(100dvh - 40px);color:var(--ink);box-shadow:0 30px 100px #11264340;overflow:hidden}.editor-dialog::backdrop{background:#15294770;backdrop-filter:blur(4px)}.editor-dialog form{display:flex;flex-direction:column;max-height:calc(100dvh - 42px);min-height:0}.dialog-header{padding:22px 26px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--line);flex-shrink:0;background:#fff}.dialog-header h2{font-size:19px;font-weight:600}.dialog-header .eyebrow{font-size:9px;margin:0 0 4px}.dialog-body{padding:24px 26px;overflow:auto;overscroll-behavior:contain;min-height:0}.dialog-footer{padding:15px 26px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;gap:10px;align-items:center;background:#fafcff;flex-shrink:0}.dialog-footer>span{margin-right:auto;font-size:11px;color:#8d9bb0}.form-error{color:#c8656c;background:#fff4f4;font-size:12px;margin:0 26px 14px;padding:10px 13px;border-radius:7px}.form-error:empty{display:none}.repeat-row{display:flex;gap:9px;align-items:center;margin-bottom:9px}.repeat-row input{flex:1}.repeat-row label{flex:1}.subsection{grid-column:1/-1;border-top:1px solid var(--line);padding-top:18px}.subsection h3{font-size:13px;margin-bottom:12px}.notice{padding:12px 15px;background:#f2f6fd;border-radius:9px;font-size:12px;color:#6a83a7;margin-bottom:16px}.notice.warning{background:#fff7ea;color:#b79155}.empty-state{padding:48px 22px;text-align:center;color:#b3bfd0}.empty-state .empty-symbol{font-size:35px;color:#b8c9e1;display:block;margin-bottom:12px}.empty-state h3{font-weight:500;font-size:14px;color:#8da0b9}.empty-state p{font-size:11px;margin-top:6px}.spinner{width:24px;height:24px;border:2px solid #e3ebf9;border-top-color:var(--blue);border-radius:50%;animation:spin .7s linear infinite;margin:0 auto 16px}@keyframes spin{to{transform:rotate(360deg)}}.app-footer{display:flex;justify-content:space-between;color:#b1bed0;font-size:10px;padding:0 34px 20px;gap:20px}.toast-region{position:fixed;bottom:25px;right:28px;z-index:100;max-width:calc(100vw - 32px);display:grid;gap:8px}.toast{padding:13px 18px;border-radius:10px;background:#1f3658;color:#eef5ff;font-size:12px;box-shadow:0 6px 25px #142e5533;max-width:440px}.toast.error{background:#9c4d58}.update-banner{display:flex;align-items:center;justify-content:space-between;background:#ecf3ff;border:1px solid #d9e8ff;border-radius:9px;padding:9px 14px;margin-bottom:20px;color:#5e84bc;font-size:12px}.editable{cursor:pointer;text-decoration:underline;text-decoration-style:dotted;text-underline-offset:5px}.quick-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}.quick-grid button{padding:19px;border:1px solid #e6edf8;background:#fafcff;border-radius:10px;color:#6c8ab2;text-align:left;font-size:12px}.quick-grid button:hover{background:#edf4ff}.drop-zone{border:1px dashed #b5c9e9;border-radius:12px;padding:24px;text-align:center;background:#f7faff;color:#839abd;font-size:12px}.drop-zone.dragover{background:#e6f0ff}.ocr-preview{max-height:150px;max-width:100%;object-fit:contain;display:block;margin:12px auto}.ocr-progress{height:5px;width:100%;accent-color:var(--blue)}.ocr-fields{display:grid;grid-template-columns:1fr 1fr;gap:9px;font-size:12px}.confidence{font-size:10px;color:#b59b6e}.mapping-grid{display:grid;gap:10px}.mapping-row{display:grid;grid-template-columns:22px minmax(0,1fr) minmax(0,1fr);align-items:center;gap:8px}.mapping-row small{color:#95a4ba;font-size:10px}.skip-link{position:fixed;left:15px;top:-60px;z-index:101;padding:12px;background:white}.skip-link:focus{top:15px}.sidebar-scrim{display:none}.profile-avatar{width:65px;height:65px;margin:0 auto 12px;font-size:25px}.detail-list{display:grid;grid-template-columns:120px 1fr;gap:13px;font-size:12px}.detail-list dt{color:#8a9eb9}.detail-list dd{margin:0;overflow-wrap:anywhere}.page{animation:appear .2s ease}@keyframes appear{from{opacity:.6;transform:translateY(4px)}to{opacity:1;transform:none}}.login-page{min-height:100dvh;background:#edf3fc;display:grid;place-items:center;padding:25px}.login-layout{display:grid;grid-template-columns:1.15fr 1fr;width:min(1000px,100%);min-height:600px;border-radius:24px;overflow:hidden;background:#fff;box-shadow:0 25px 80px #1d426a12}.login-art{background:linear-gradient(150deg,#172f55,#294f83);padding:42px;color:white;position:relative;overflow:hidden;display:flex;flex-direction:column;justify-content:space-between}.login-art .brand{padding:0}.login-art h2{font-size:31px;font-weight:500;line-height:1.65;letter-spacing:1px;margin:70px 0 15px;position:relative;z-index:2}.login-art p{font-size:12px;color:#a9c0e0;line-height:2;position:relative;z-index:2}.login-art small{color:#7e9bbe;font-size:10px;letter-spacing:1px}.art-ring{position:absolute;width:320px;height:320px;border:1px solid #81a9e225;border-radius:50%;right:-140px;bottom:50px;box-shadow:0 0 0 42px #7da9ef09,0 0 0 84px #7da9ef06}.login-form-wrap{display:flex;flex-direction:column;justify-content:center;padding:58px}.login-form-wrap h1{font-size:25px;margin-bottom:8px}.login-form-wrap .subheading{margin-bottom:30px}.login-form-wrap .field{margin:20px 0}.login-form-wrap .button{width:100%;margin-top:20px;min-height:44px}.login-form-wrap .form-error{margin:0 0 14px}.login-footer{margin-top:40px;font-size:10px;color:#b5c1d1;text-align:center}.login-options{display:flex;justify-content:space-between;align-items:center;font-size:11px;color:#91a3bb}.field-error{font-size:11px;color:#c8656c}.validation-summary-valid{display:none}
@media(min-width:1550px){.stat-card{padding:26px}.stat-value{font-size:40px}.dashboard-grid{grid-template-columns:1fr 1fr}.widget[data-widget="expiring"]{grid-column:1/-1}}
@media(max-width:1200px){.sidebar{width:216px;padding:25px 13px 14px}.app-main{margin-left:216px}.brand{gap:9px;padding-left:6px}.brand b{max-width:130px;font-size:14px}#main{padding:26px 24px}.topbar{padding:0 24px}.page-heading{align-items:flex-start}.page-heading>.actions{justify-content:flex-end;max-width:52%}.stat-grid{gap:12px}.stat-card{padding:17px}.stat-value{font-size:30px}.stat-top{font-size:11px}.stat-icon{width:29px;height:29px;font-size:16px}.filters{grid-template-columns:repeat(3,minmax(0,1fr))}.role-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.finance-strip{padding:17px}.finance-number b{font-size:18px}.settings-grid{grid-template-columns:1fr}.login-form-wrap{padding:40px}}
@media(max-width:900px){.sidebar{transform:translateX(-100%);width:244px;transition:transform .2s}.sidebar.open{transform:translateX(0)}.sidebar.open~.app-main{margin-left:0}.sidebar-scrim.open{display:block;position:fixed;inset:0;background:#0f274260;z-index:29;backdrop-filter:blur(2px)}.app-main{margin-left:0}.menu-toggle{display:inline-flex}.topbar{height:64px;padding:0 20px}.topbar-left{gap:7px}.topbar-actions{gap:5px}.page-heading h1{font-size:24px}.finance-strip{grid-template-columns:repeat(3,1fr)}.finance-strip .collection-progress{grid-column:1/-1}.dashboard-grid{gap:15px}.login-art{padding:30px}.login-art h2{font-size:26px}}
@media(max-width:600px){#main{padding:22px 15px 30px}.topbar{padding:0 12px}.breadcrumb{font-size:11px}.breadcrumb>span{margin:0 6px}.topbar-actions .quiet-button{font-size:10px;padding:6px}.topbar-actions .icon-button{display:none}.page-heading{flex-direction:column;gap:16px;margin-bottom:20px}.page-heading>.actions{max-width:100%;justify-content:flex-start}.page-heading h1{font-size:23px}.page-heading .eyebrow{font-size:9px}.page-heading .subheading{font-size:11px}.button{min-height:39px;padding:8px 12px;font-size:11px}.stat-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.stat-card{padding:16px}.stat-value{font-size:31px}.stat-top{font-size:11px}.stat-foot{font-size:9px}.finance-strip{padding:15px 13px;gap:14px;margin:14px 0 18px}.finance-number small{font-size:9px}.finance-number b{font-size:15px}.dashboard-grid{grid-template-columns:1fr}.widget-header{padding:16px}.widget-content{padding:17px}.chart-box{height:210px}.filters{grid-template-columns:repeat(2,minmax(0,1fr));padding:17px 15px;gap:14px 10px}.filters .field:first-child{grid-column:1/-1}.filters .clear-filters{grid-column:1/-1}th,td{padding:12px 14px}.panel-toolbar{padding:15px;gap:12px}.panel-toolbar .search-field{width:100%}.dept-table{min-width:0}.dept-table .tree-row td{padding:10px 8px}.tree-symbol{width:26px;height:26px}.dept-name-text b{font-size:12px}.dept-table .dept-ops{width:auto}.dept-table .dept-ops .cell-actions{gap:1px}.tree-ops .cell-actions button{font-size:10px}.tree-row .batch-toolbar{padding:10px;gap:8px;font-size:11px}.role-grid{grid-template-columns:1fr}.permission-grid{grid-template-columns:1fr}.editor-dialog{width:calc(100vw - 16px);max-height:calc(100dvh - 16px);border-radius:14px}.editor-dialog form{max-height:calc(100dvh - 18px)}.dialog-header{padding:18px}.dialog-header h2{font-size:18px}.dialog-body{padding:18px}.dialog-footer{padding:12px 18px;flex-wrap:wrap}.dialog-footer>span{font-size:10px;max-width:45%}.form-grid{grid-template-columns:1fr;gap:16px}.form-error{margin:0 18px 10px}.settings-panel{padding:19px}.tabs{gap:15px}.table-summary{padding:13px 15px;gap:9px 18px;font-size:11px}.app-footer{padding:0 15px 18px;font-size:9px}.app-footer span:last-child{display:none}.table-footer{padding:12px 14px}.toast-region{right:16px;bottom:16px}.login-layout{grid-template-columns:1fr;min-height:0;max-width:440px}.login-art{padding:25px}.login-art h2{font-size:19px;margin:24px 0 8px;line-height:1.5}.login-art>small{display:none}.login-art p{font-size:11px}.login-form-wrap{padding:30px}.login-footer{margin-top:25px}.repeat-row{gap:6px}.repeat-row input[type=date]{max-width:58%}.detail-list{grid-template-columns:90px 1fr}.ocr-fields{grid-template-columns:1fr}}
@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}

/* 台账类表格列数多（应收 12 列），容器压缩会导致中文逐字折行；给出最小宽度，交由 .table-wrap 横向滚动承接。 */
#contract-table table{min-width:1000px}
#user-table table{min-width:920px}
#receivable-table table{min-width:1440px}
#receivable-table th:nth-child(1),#receivable-table td:nth-child(1){min-width:180px}
#receivable-table th:nth-child(3),#receivable-table td:nth-child(3){min-width:160px}
#receivable-table th:nth-child(4),#receivable-table td:nth-child(4){min-width:130px}
#receivable-table th:nth-child(8),#receivable-table td:nth-child(8){min-width:140px}
#receivable-table th:nth-child(10),#receivable-table td:nth-child(10){min-width:150px}

/* 收支管理子模块：四个入口与总览并列展示，子层级只做视觉缩进，不改变导航语义 */
.sidebar nav>.nav-sub{display:flex;flex-direction:column;gap:2px;margin:0 0 8px;padding-left:10px;border-left:2px solid #ffffff14}
.sidebar nav>.nav-sub a{display:flex;align-items:center;gap:10px;min-height:38px;border-radius:8px;padding:8px 12px;color:#9fb2cd;font-size:12.5px;transition:.2s}
.sidebar nav>.nav-sub a:hover{background:#ffffff0b;color:#fff}
.sidebar nav>.nav-sub a.active{background:#ffffff1a;color:#fff;box-shadow:none}
.sidebar nav>.nav-sub i{font-size:15px;width:17px}
.sidebar nav>.nav-sub:not(:has(a:not([hidden]))){display:none}
@media (max-width:720px){.sidebar nav>.nav-sub a{min-height:44px;font-size:14px}}

/* 总览页的四子模块入口：并列等宽卡片，弱化装饰、突出数字与去向 */
.scope-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:12px;margin-bottom:18px}
.scope-card{display:flex;align-items:flex-start;gap:12px;padding:16px 18px;border:1px solid var(--line,#e3e8ef);border-radius:14px;background:var(--surface,#fff);text-decoration:none;transition:transform .18s,box-shadow .18s,border-color .18s}
.scope-card:hover{transform:translateY(-2px);border-color:#9fb6d6;box-shadow:0 10px 24px #0f1f3d1a}
.scope-card:focus-visible{outline:2px solid #2f6fd0;outline-offset:2px}
.scope-icon{flex:0 0 34px;height:34px;display:grid;place-items:center;border-radius:10px;background:#eef3fb;color:#2f6fd0;font-size:16px;line-height:1}
.scope-body{flex:1;min-width:0}
.scope-body>b{display:block;font-size:15px;font-weight:600}
.scope-body>p{margin:2px 0 0;font-size:12px;line-height:1.5;opacity:.62}
.scope-go{align-self:center;margin-left:6px;font-size:12px;color:#2f6fd0;white-space:nowrap}
@media (max-width:720px){.scope-grid{grid-template-columns:1fr}.scope-card{padding:14px}}

/* 子模块表格列宽：表头多、中文短，给最小宽度交由 .table-wrap 横向滚动 */
#ledger-contracts-table table{min-width:1240px}
/* 应收账款：账期列换成「数电发票号码 + 回款日期」后多一列，收紧左右内距（12px）刚好放得下 13 列；
   最小宽度按自然宽度给 1280，1600 视口下不出现横向滚动，更窄时交给 .table-wrap 滚动。 */
#ledger-receivables-table table{min-width:1280px}
#ledger-bank-table table{min-width:980px}
#bank-account-table table{min-width:960px}

/* 合同列表：编号 / 名称 / 金额 / 部门等所有列统一居中，长短文本混排时保持列向对齐，不再左一块右一块 */
#ledger-contracts-table th,#ledger-contracts-table td{text-align:center}
#ledger-contracts-table .cell-actions{justify-content:center}
/* 勾选列取消右侧 0 内距，复选框跟随整列居中 */
#ledger-contracts-table th.pick,#ledger-contracts-table td.pick{padding-left:0;padding-right:0}
/* 副行（编号、日期、金额明细）不折行：否则「未开票 ¥ 268,000.00」会被劈成两行 */
#ledger-contracts-table td code{white-space:nowrap}

/* 应收账款：前两列（勾选列 + 单据 / 名称）保持原样，其余各列内容水平居中。
   勾选列本来就没有文字，保持零内距、复选框位置不动；单据 / 名称列左对齐、缩进不变。
   金额列要额外用 ID 选择器压掉 .money 的右对齐（.money 权重 0,1,0，这里 1,0,1 天然胜出）。 */
#ledger-receivables-table th,#ledger-receivables-table td{text-align:center;vertical-align:middle;padding-left:12px;padding-right:12px}
#ledger-receivables-table th.col-no,#ledger-receivables-table td.col-no{text-align:left}
/* 勾选列也恢复默认左对齐（复选框位置与改动前一致），只取消左右内距 */
#ledger-receivables-table th.pick,#ledger-receivables-table td.pick{text-align:left;padding-left:0;padding-right:0}
#ledger-receivables-table .cell-actions{justify-content:center}
/* 第二行副信息（编号、期间、客户公司、回款笔数）不折行，居中后也不允许被劈开 */
#ledger-receivables-table td code{white-space:nowrap}
/* 未开票 / 未回款的占位破折号：灰一点，避免和真实值抢注意力 */
#ledger-receivables-table .cell-empty{color:#b3bfd0}

/* 银行存款：账户表与流水表整表居中（与合同列表、回收站、人员名册同一口径）——
   表头、单元格文字、金额、方向标签、行内按钮组全部水平居中；
   td 全局已是 vertical-align:middle，这里对 th 也显式声明，两行单元格（账户 + 币种、开户行 + 账号）上下也居中。 */
#bank-account-table th,#bank-account-table td,
#ledger-bank-table th,#ledger-bank-table td{text-align:center;vertical-align:middle}
/* 金额列原本靠 .money / .num 右对齐，这里统一收回到居中；tabular-nums 保留，小数点仍然纵向对齐 */
#bank-account-table th.money,#bank-account-table td.num,
#ledger-bank-table th.money,#ledger-bank-table td.money{text-align:center}
/* 行内按钮组默认右贴边，改为居中；卡片内无操作列时不生效 */
#bank-account-table .cell-actions,#ledger-bank-table .cell-actions{justify-content:center}
/* 勾选列取消左右内距，复选框跟随整列居中（与合同列表、人员名册一致） */
#ledger-bank-table th.pick,#ledger-bank-table td.pick{padding-left:0;padding-right:0}
/* 流水表去掉「核销」列后共 10 列（含勾选与操作）：内距从 18 收到 14，1440px 下不横向滚动；
   摘要列给最小宽度，长一点的摘要不会被挤成两行。 */
#ledger-bank-table th,#ledger-bank-table td{padding-left:14px;padding-right:14px}
#ledger-bank-table .col-title{min-width:172px}

/* 日期输入：连写识别失败时标红，与后端规则提示呼应 */
.field input.invalid{border-color:#d35b63;box-shadow:0 0 0 3px #d35b6314}
.field small b{font-weight:600;color:#6b7f9b}

/* 删除与回收站：危险按钮、批量操作条、勾选列、确认弹窗与回收站表格 */
.button.danger{background:#d35b63;color:#fff!important;box-shadow:0 4px 10px #d35b631a}
.button.danger:hover{background:#c14a52}
.button.danger:disabled{background:#e6b3b7;box-shadow:none}
.batch-bar{display:flex;align-items:center;gap:12px;padding:11px 20px;background:#f7fafe;border-bottom:1px solid var(--line);color:#6c819c;font-size:12px;flex-wrap:wrap}
.batch-bar b{color:#3f5f92;font-weight:600;margin:0 2px}
.batch-bar .button{margin-left:auto}
.batch-bar .text-button{min-height:31px}
th.pick,td.pick{width:46px;padding-right:0}
th.pick input,td.pick input{vertical-align:middle}
.confirm-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}
.confirm-sheet{margin:0 0 14px}
.confirm-list{margin:0 0 16px;padding-left:20px;font-size:12px;color:#5a708e;line-height:2}
.confirm-list b{color:#3d5270;font-weight:500}
.trash-wrap{max-height:52vh;border:1px solid var(--line);border-radius:10px}
/* 回收站：7 列（编号 / 名称 / 金额 / 部门 / 子模块 / 删除时间 / 操作），弹窗放宽并给表格最小宽度，四字段完整可见 */
.editor-dialog.wide{width:min(1120px,calc(100vw - 32px))}
.trash-wrap table{min-width:980px}
.trash-wrap th,.trash-wrap td{text-align:center}
.trash-wrap .cell-actions{justify-content:center}
.trash-wrap .wrap-cell{max-width:260px;white-space:normal;overflow-wrap:anywhere}
/* 页头操作键统一尺寸：min-width 取最长文案（导出应收 CSV）之上，高度锁 39px 与 .button 基线一致；
   文案长短不同也保持同一尺寸，图标 + 文字双向居中，间距（gap:9px）与右对齐不变。
   用 min-width 而非定宽：极端长文案会撑开而不是溢出裁切 */
.page-heading .actions>.button,.page-heading>.button{min-width:120px;height:39px;padding:0 12px;justify-content:center}
/* 收支总览页 6 个页头键（3 工具 + 3 新增）文案长短不一，统一 120px 且标题区可收缩，
   保证 1440px 下仍单行；最长「新增应收与回款」自然宽约 108px，留 10px 余量不裁切 */
.page-heading>div:first-child{flex:1 1 320px;min-width:0}

/* ===== 收支总览·资金报表（替代原「四域汇总」）：维度切换 + 按期间分组的银行存款收支明细 ===== */
.report-title{display:flex;align-items:center;gap:10px;flex-wrap:wrap;min-width:0}
.report-title h2{font-size:14px;font-weight:600}
.report-meta{font-size:11px;color:#8b99ad}
.seg{display:inline-flex;gap:2px;padding:3px;background:#f2f6fc;border:1px solid #e2e9f2;border-radius:9px}
.seg-item{padding:5px 13px;min-height:28px;border:0;border-radius:7px;background:none;font-size:11px;color:#65778f;white-space:nowrap;transition:.15s}
.seg-item:hover{color:var(--blue);background:#ffffffcc}
.seg-item.active{background:#fff;color:var(--blue);font-weight:600;box-shadow:0 1px 4px #233b611f}
.report-body{padding:20px 23px 0}
.report-body>.finance-strip{margin:0 0 14px}
.finance-number b.alarm{color:#c06a78}
.report-table table{min-width:880px}
.report-table tr.report-group:hover{background:none}
.report-table .report-group td{background:#f8fbff;border-top:1px solid #eef3fa;border-bottom:1px solid var(--line);padding:9px 18px;max-width:none}
.report-group-cell{display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-size:11px;color:#8094b0}
.report-group-cell b{font-size:12px;font-weight:600;color:#3f5c83}
.report-group-cell i{width:1px;height:11px;background:#dbe4f0}
.report-group-cell em{font-style:normal;font-variant-numeric:tabular-nums;color:#416da7}
.report-in{color:#2f6fd0!important;font-weight:500}
.report-out{color:#c06a78!important;font-weight:500}
@media(max-width:900px){
 .report-body{padding:16px 15px 0}
 .report-group-cell{gap:8px}
 .seg-item{padding:5px 10px}
}

/* 窄屏页头按钮：文案长短不一，两三个挤一行会出现「2+1」参差，统一改为每键独占一行 */
@media(max-width:600px){
 .page-heading .actions{width:100%}
 .page-heading .actions>.button,.page-heading>.button{flex:1 1 100%;min-width:0}
}

/* 部门管理列表：表格承载层级，名称 / 部门代码 / 部门负责人各占一列，跨行严格对齐
   —— 缩进只发生在「部门名称」列内部，不会推动右侧两列，因此任意层级下三列都对齐。 */
.dept-table{table-layout:fixed;min-width:900px}
.dept-table th{padding:12px 18px;background:#fafcff;color:#8a99ad;font-size:11px;font-weight:500;white-space:nowrap;border-bottom:1px solid var(--line)}
.dept-table td{padding:12px 18px;border-bottom:1px solid #f0f3f8;vertical-align:middle}
.dept-table th.dept-name,.dept-table td.dept-name{padding-left:20px}
.dept-table .dept-code{width:152px}
.dept-table .dept-manager{width:152px}
.dept-table .dept-state{width:92px}
.dept-table .dept-ops{width:288px}
.dept-table td.dept-code code{display:inline-block;padding:1px 7px;border:1px solid #e2ecf9;border-radius:5px;background:#f1f6fd;color:#45607f;font-size:11px;font-variant-numeric:tabular-nums}
.dept-table td.dept-manager{color:#3f5875;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dept-table .tree-symbol{width:28px;height:28px;border-radius:8px;font-size:13px}
.dept-table .tree-expander,.dept-table .dept-check{flex-shrink:0}
.dept-table .dept-ops .cell-actions{justify-content:center}
/* 列表居中范式（与合同台账 / 回收站 / 人员名册 / 银行存款同一套）：数据列内容水平居中；
   唯独「部门名称」是树形列，缩进本身承载层级，居中会让每行名称随内容宽度浮动、深浅看不出来，故保持左对齐。 */
.dept-table th,.dept-table td{text-align:center}
.dept-table th.dept-name,.dept-table td.dept-name{text-align:left}
.dept-table td.dept-name .dept-name-inner{width:100%}
@media(max-width:900px){.dept-table{min-width:760px}}
.dept-table td.dept-code .dept-code-empty{color:#b3bfd0}
/* 部门代码自动生成：表单里只读展示，视觉上明确「不是可填字段」——等宽字形 + 浅底 + 无 hover 态。
   与列表里的 dept-code 标签同一套配色，读起来是同一个东西。 */
.field input[data-dept-code]{background:#f1f6fd;border-color:#e2ecf9;color:#45607f;cursor:default;
 font-family:ui-monospace,SFMono-Regular,Consolas,"Liberation Mono",monospace;letter-spacing:.06em}
.field input[data-dept-code]:focus{border-color:#e2ecf9;box-shadow:none}
.field input[data-dept-code]::placeholder{font-family:Inter,"Segoe UI","Microsoft YaHei",sans-serif;letter-spacing:0}
/* 窄屏部门表：固定列收窄，名称列仍留出可读宽度，其余靠面板内横向滚动 */
@media(max-width:600px){
 .dept-table{min-width:700px}
 .dept-table .dept-code{width:110px}
 .dept-table .dept-manager{width:110px}
 .dept-table .dept-state{width:80px}
 .dept-table .dept-ops{width:190px}
 /* 窄屏优先保住部门名称的可读宽度：图标块与多按钮隐藏/收窄，其余列仍在面板内滚动 */
 .dept-table .tree-symbol{display:none}
 .dept-table .dept-ops .cell-actions button{font-size:10px;padding:3px}
}

/* 离职人员页：工具栏里的日期区间与「离职原因」长文本。
   日期用原生 date 控件，宽度固定避免与部门下拉挤在一起；原因列限两行，完整内容走 title 悬浮。 */
#page-people-resigned .panel-toolbar input[type="date"]{width:148px;flex:0 0 auto}
#resigned-table table{min-width:1100px}
/* 列宽按字段轻重分配：姓名 / 账号 / 部门 / 角色 / 日期固定，离职原因吃掉剩余空间，避免长原因把操作列挤出去。
   姓名与账号是两列（账号只放登录名，不再跟姓名挤一格），账号列给等宽字留出足够宽度、超长省略走 title。 */
#resigned-table th.col-name,#resigned-table td.col-name{width:110px}
#resigned-table th.col-account,#resigned-table td.col-account{width:120px}
#resigned-table th.col-dept,#resigned-table td.col-dept{width:140px}
#resigned-table th.col-role,#resigned-table td.col-role{width:104px}
#resigned-table th.col-date,#resigned-table td.col-date{width:148px}
#resigned-table th.col-contact,#resigned-table td.col-contact{width:152px}
#resigned-table th.col-ops,#resigned-table td.col-ops{width:158px}
#resigned-table th.col-name,#resigned-table td.col-name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#resigned-table .reason-cell{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;color:#5b708c;overflow-wrap:anywhere}
#resigned-table td .cell-sub{display:block;margin-top:3px;color:#98a6b8;font-size:10px;white-space:nowrap}
@media(max-width:600px){
 #page-people-resigned .panel-toolbar input[type="date"]{width:calc(50% - 6px)}
 #resigned-table table{min-width:900px}
}

/* 账号列：姓名与账号各自独立成列后，账号用等宽字形 + 浅底圆角标签承载，
   与加粗的姓名形成明确的视觉分层；超长账号省略号截断（完整值走 title），
   不换行、不撑高行高，窄屏由 .table-wrap 横向滚动承接。 */
td .account-chip{display:inline-block;max-width:100%;padding:1px 7px;border:1px solid #e4ecf7;border-radius:5px;
 background:#f6f9fe;color:#4b6481;font-size:11px;line-height:1.75;font-style:normal;font-family:ui-monospace,"SFMono-Regular",Consolas,"Liberation Mono","Microsoft YaHei",monospace;
 white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}
td .account-chip.is-empty{color:#b0bdcf;background:#f8fafc;border-color:#eef2f7}
#people-table td.col-account,#resigned-table td.col-account{white-space:nowrap}
#people-table td.col-name,#people-table th.col-name{width:130px}
#people-table td.col-account,#people-table th.col-account{width:150px}

/* 人员管理与离职人员：两张名册同构（同一份 Users 数据的在职 / 离职两半），
   整表统一居中 —— 表头、单元格文字、标签、行内按钮组全部居中，长短文本混排时列向仍对齐；
   与合同列表、回收站三处保持同一种排版口径，单文件演示版使用同一套规则。
   窄屏不压折文字：给表格最小宽度，超出部分由 .table-wrap 横向滚动承担。 */
#people-table th,#people-table td,
#resigned-table th,#resigned-table td{text-align:center}
#people-table .cell-actions,#resigned-table .cell-actions{justify-content:center}
/* 勾选列取消左右内距，复选框跟随整列居中（与合同列表、回收站一致） */
#people-table th.pick,#people-table td.pick,
#resigned-table th.pick,#resigned-table td.pick{padding-left:0;padding-right:0}
#people-table table{min-width:990px}
@media(max-width:600px){
 #people-table table{min-width:900px}
}

/* ===== 合同有效期：起止两段同格式 =====
   起始日与终止日必须同字号、同色值、同字体，「至」只作弱化的连接符。
   终止日期不能套 <code> —— 那是 10px 灰色附注样式，会让同一字段的起止两段看起来是两种格式。 */
.date-range{display:inline-flex;align-items:baseline;gap:7px;white-space:nowrap}
.date-range i{font-style:normal;font-size:10px;color:#b4c1d3}

/* ===== 合同到期提醒：只有「即将到期 / 已到期」两态 =====
   两态与履约状态同源（有效期在 60 天内即为即将到期），不做剩余天数分档；
   提醒条只做状态提示：计数恒按全部未终止合同统计，不参与任何筛选 / 过滤 / 排序。 */
.alert-strip{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:12px 23px;background:#f8fbff;border-bottom:1px solid var(--line)}
.alert-strip-title{font-size:11px;font-weight:500;color:#66799a;letter-spacing:.3px}
.alert-strip-note{font-size:10px;color:#9dabc0;margin-left:2px}
.alert-chip{--alert-ink:#6d7f99;--alert-tint:#f4f7fc;--alert-line:#e2e9f4;
 display:inline-flex;align-items:center;gap:6px;border:1px solid var(--alert-line);background:var(--alert-tint);
 color:var(--alert-ink);border-radius:999px;padding:4px 6px 4px 11px;font-size:11px;line-height:1.7;
 white-space:nowrap;cursor:default;user-select:none}
.alert-chip b{background:#fff;border-radius:999px;padding:0 7px;font-size:11px;font-weight:600;color:inherit}
.alert-chip.expiring{--alert-ink:#b8912f;--alert-tint:#fffaeb;--alert-line:#f2e5c2}
.alert-chip.expired{--alert-ink:#cf5f68;--alert-tint:#fdf1f2;--alert-line:#f6d9dc}
/* 首页提醒模块的两态小结：不可点击，只说明「每一态各有多少份」 */
.alert-summary{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:12px 23px;border-bottom:1px solid var(--line);background:#fbfdff}
.alert-summary span{font-size:11px;color:#71839d;display:inline-flex;align-items:center;gap:5px}
.alert-summary b{font-size:12px;font-weight:600}
.alert-summary .expiring b{color:#b8912f}
.alert-summary .expired b{color:#cf5f68}
/* 系统设置里的节点说明（只读文本，不可编辑） */
.alert-rules{margin:0;padding:9px 12px;background:#f7fafe;border:1px dashed #dbe6f5;border-radius:7px;font-size:11px;color:#5d7a9e;line-height:1.7}
/* ===== 合同行状态高亮：即将到期 / 已到期整行着色 =====
   只按履约状态着色（与服务端 ContractState 同源），不在行内写剩余天数。
   左侧色条用首列的 inset 阴影画，不占列宽，勾选列与金额列都不会被挤出。 */
tbody tr.row-expiring{background:#fffaf1}
tbody tr.row-expiring:hover{background:#fff4e2}
tbody tr.row-expiring td:first-child{box-shadow:inset 3px 0 0 #d8a25b}
tbody tr.row-expired{background:#fdf3f4}
tbody tr.row-expired:hover{background:#fbe8ea}
tbody tr.row-expired td:first-child{box-shadow:inset 3px 0 0 #cf5f68}
@media(max-width:900px){
 .alert-strip,.alert-summary{padding:10px 15px;gap:6px}
 .alert-strip-note{display:none}
}
@media(max-width:600px){
 .alert-chip{padding:3px 5px 3px 9px;font-size:10px}
 .alert-chip b{padding:0 5px;font-size:10px}
 .date-range{gap:5px}
}
/* ===== 部门选择器（可输入部门名称或负责人检索） =====
   收起时只是一个普通输入框；展开后在下方浮出候选列表，输入即过滤，↑↓ 移动、Enter 选中、Esc 收起并还原。
   候选列表绝对定位、z-index 高于弹窗内容，避免被 .dialog-body 的 overflow 裁掉。 */
.dept-picker .picker{position:relative;display:flex;align-items:center;min-width:0}
.dept-picker .picker-input{width:100%;padding-right:30px}
.dept-picker .picker-clear{position:absolute;right:4px;top:50%;transform:translateY(-50%);
 width:24px;height:24px;min-height:0;border:0;background:none;color:#9aabc1;font-size:15px;line-height:1;
 border-radius:6px;padding:0;display:grid;place-items:center}
.dept-picker .picker-clear:hover{background:#eef3fb;color:#5b7392}
.dept-picker .picker-list{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:40;
 margin:0;padding:5px;list-style:none;background:#fff;border:1px solid #dbe5f3;border-radius:9px;
 box-shadow:0 12px 32px #1c335612;max-height:212px;overflow:auto;overscroll-behavior:contain}
.dept-picker .picker-item{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:6px;
 font-size:12px;color:#3d5270;cursor:pointer;line-height:1.4}
.dept-picker .picker-item:hover{background:#f4f8ff}
.dept-picker .picker-item.is-active{background:#edf3ff;box-shadow:inset 2px 0 0 var(--blue)}
.dept-picker .picker-name{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:52%}
.dept-picker .picker-manager{color:#93a4ba;font-size:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dept-picker .picker-off{margin-left:auto;font-style:normal;font-size:10px;color:#a2adbc;background:#f1f4f8;
 border-radius:4px;padding:1px 5px;flex-shrink:0}
.dept-picker .picker-item.is-off .picker-name{color:#8b99ab}
.dept-picker .picker-empty{padding:11px 10px;font-size:11px;color:#8d9db3;line-height:1.7;cursor:default}
.dept-picker .picker-empty small{display:block;color:#a9b6c6;font-size:10px}
/* 客户检索的提示行：命中应收账款客户（可对账）与自定义往来单位（不对账）用颜色区分，
   只改提示语颜色，不影响输入框本身 —— 自定义往来单位是合法输入，不做拦截。 */
.customer-picker .picker-hint.is-linked{color:#3f8a68}
.customer-picker .picker-hint.is-custom{color:#b08a46}
/* 客户名 + 应收单数/未结金额：候选行可能较长，允许副标题吃掉剩余宽度 */
.customer-picker .picker-name{max-width:56%}
.customer-picker .picker-manager{flex:1;text-align:right;font-variant-numeric:tabular-nums}
/* 合同检索的候选行：「编号 · 名称」是主体，客户单位与合同额作为副标题右对齐。
   合同名往往比部门名长得多，主行给到 62%、副标题吃掉剩余宽度并单行省略，行高才不会被撑成两行。 */
.contract-picker .picker-name{max-width:62%}
/* 副标题拆成「客户单位（可省略）」+「合同额（不省略）」：整体省略会把金额先截掉，
   而选合同时最需要一眼看到的恰恰是金额这一项。 */
.contract-picker .picker-manager{flex:1;display:flex;align-items:center;justify-content:flex-end;gap:8px;min-width:0}
.contract-picker .pm-party{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.contract-picker .pm-amount{flex:none;font-variant-numeric:tabular-nums}
/* 原关联合同已不在可选列表时的提示：用与「自定义往来单位」同一档琥珀色，表示「需要人来处理一下」 */
.contract-picker .picker-hint.is-custom{color:#b08a46}

/* ============ 应收账款：本期三项金额（开票 / 回款 / 未到账） ============
   原来这里是一行文字（应计 / 已收 / 未收 / 逾期），并排的「已收」和「逾期」互相重叠、
   也没有「属于哪个期间」的概念。现改为三块金额 + 一行取值口径：
   ① 三格等宽（.three 覆盖 dashboard 的四格布局），金额用元、千分位、两位小数；
   ② 回款格内嵌细进度条表示回款率，不再单独占第四格；
   ③ 口径说明 .strip-scope 字号小一档、紧贴金额条下方，说明三项分别怎么算、
      统计范围是哪个期间，避免「本期」被理解成全库合计。 */
.table-summary.has-strip{display:block;padding:0;background:transparent}
.table-summary.has-strip .finance-strip{margin:18px 23px 12px}
.finance-strip.three{grid-template-columns:repeat(3,minmax(0,1fr))}
.finance-number .strip-sub{display:block;font-size:10px;color:#8ba0bd;margin-top:6px}
.finance-number b.alarm{color:#c06a78}
.strip-track{display:block;height:5px;border-radius:20px;background:#ffffffcc;overflow:hidden;margin-top:9px;max-width:100%}
.strip-track i{display:block;height:100%;border-radius:20px;background:linear-gradient(90deg,#5d90ff,#48c2b0)}
.strip-scope{margin:0 23px;padding:0 0 14px;font-size:10.5px;line-height:1.95;color:#8b9ab0}
.strip-scope b{color:#5f7799;font-weight:600}
@media (max-width:900px){.finance-strip.three{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:600px){.finance-strip.three{grid-template-columns:minmax(0,1fr)}.table-summary.has-strip .finance-strip,.strip-scope{margin-left:16px;margin-right:16px}}

/* ================= 费用结算：Excel 表格风格（2026-10-26 rev 10） =================
   版式参照财务在用的一张 Excel 结算表（凤栖台结算表）：整张表做成「一张纸」——
   居中标题 + 右侧「月份」小格 + 浅蓝表头带 + 细网格线 + 序号列 + 金额右对齐两位小数
   + 合计行蓝底加粗 + 底部表注。全部是展示层：归集与求和仍由服务端 ExpenseProjectStats
   完成，前端不聚合、不改任何字段，结构也只做了「加序号列 / 拆标题条 / 去装饰」这些纯视觉调整。 */
.cost-panel{padding:0;background:transparent;border:0;border-radius:0;box-shadow:none;overflow:visible}
.cost-sheet{--sheet-ink:#16233a;--sheet-soft:#6b7d94;--sheet-line:#bccbdd;--sheet-line-strong:#8fa3bb;
 --sheet-head:#d7e4f4;--sheet-total:#c4d9ee;--sheet-dept:#eaf1fa;--sheet-paper:#f7fafd;
 --sheet-font:"SimSun","宋体",Calibri,"Microsoft YaHei",sans-serif;
 border:1px solid var(--sheet-line-strong);background:#fff;color:var(--sheet-ink);font-family:var(--sheet-font)}
/* 标题行：照设计图居中加粗，字距略放开，像打印表头 */
.cost-sheet .sheet-title{padding:15px 16px 5px;text-align:center;font-size:16px;font-weight:700;letter-spacing:.09em;color:var(--sheet-ink)}
/* 标题下的信息条：左边「单位：元」，中间口径行（部门 / 项目 / 笔数），右边「月份：xxx」带细边框小格 */
.cost-sheet .sheet-bar{display:flex;align-items:center;gap:14px;padding:0 14px 10px;font-size:12px;color:var(--sheet-soft)}
.cost-sheet .sheet-meta{font-variant-numeric:tabular-nums}
.cost-sheet .sheet-period{margin-left:auto;border:1px solid var(--sheet-line);background:var(--sheet-paper);padding:1px 12px;white-space:nowrap}
/* 抬头右侧可能有两枚数值块（开票 / 成本费用）：只有第一枚吃 auto 外边距，
   否则两枚各吃一半空白、被均匀拉开成分散的两块。 */
.cost-sheet .sheet-period+.sheet-period{margin-left:0}
.cost-sheet .sheet-period b{font-weight:700;color:var(--sheet-ink);font-variant-numeric:tabular-nums}
.cost-sheet .table-wrap{border-top:1px solid var(--sheet-line-strong)}
.cost-table{width:100%;border-collapse:collapse;min-width:760px;font-family:inherit;font-size:12.5px;background:#fff}
/* 三板块各自的列宽下限：开票明细与固定/零星两块都是 7 列、全部部门汇总 8 列，窄屏靠 .table-wrap 横向滚动。 */
.cost-table.cost-type-block{min-width:860px}
.cost-table.cost-grand{min-width:900px}
.cost-table.cost-invoice{min-width:900px}
.cost-table th,.cost-table td{border:1px solid var(--sheet-line);padding:3px 8px;vertical-align:middle;text-align:left;line-height:1.6}
/* 设计图表头一律居中（含金额列），数据行才按「文字左、数字右」分布 */
.cost-table thead th{background:var(--sheet-head);font-weight:700;text-align:center;color:var(--sheet-ink);padding:7px 8px;white-space:nowrap}
.cost-table th.num{text-align:center}
.cost-table td.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap;padding-right:10px}
.cost-table th.seq,.cost-table td.seq{width:46px;min-width:46px;text-align:center;color:var(--sheet-soft);font-size:11.5px}
.cost-table th.seq{color:var(--sheet-ink)}
/* 项目行单行呈现：项目名 + 灰色编号·分类后缀，行高保持在 26px 上下，与 Excel 观感一致 */
.cost-table .cell-main{display:inline;font-weight:400}
.cost-table .cell-sub{display:inline;margin-left:8px;font-size:11px;color:var(--sheet-soft)}
/* 两层结构：部门小计行浅蓝底 + 名称加粗；下辖项目行名称缩进一级，归属一眼可见 */
.cost-table .cost-dept td{background:var(--sheet-dept);border-top:1px solid var(--sheet-line-strong)}
.cost-table .cost-dept .cost-name{font-weight:700}
.cost-table .cost-meta{margin-left:8px;font-size:11px;font-weight:400;color:var(--sheet-soft)}
.cost-table .cost-project td:nth-child(2){padding-left:26px}
.cost-table .cost-project:hover td{background:#f3f8fd}
.cost-table .cost-total td{background:var(--sheet-total);font-weight:700;border-top:2px solid var(--sheet-line-strong)}
.cost-table .cost-total .cost-meta{font-weight:400}
/* 表注：替代原来的「按项目所属部门归集」标签，用表下小字说明口径，视觉上更像正式报表 */
.cost-sheet .sheet-note{margin:0;padding:8px 14px 10px;border-top:1px solid var(--sheet-line);background:var(--sheet-paper);font-size:11.5px;line-height:1.95;color:var(--sheet-soft)}
.cost-sheet .cost-empty{padding:34px 16px;color:var(--sheet-soft)}
.cost-sheet .cost-empty h3{font-size:13px;font-weight:700;color:#41506a}
.cost-sheet .cost-empty p{margin-top:5px;font-size:11.5px}
/* ---- 多块布局（rev 11）：一个部门一张纸，块内三个小节 ---- */
/* 顶部总览条：不在任何一张纸里，只回答「当前看的是哪个范围、合计多少」 */
.cost-summary-bar{display:flex;align-items:center;flex-wrap:wrap;gap:6px 18px;margin-bottom:12px;padding:9px 14px;
 border:1px solid var(--sheet-line-strong);background:var(--sheet-head);color:var(--sheet-ink);font-size:12px;
 font-family:"SimSun","宋体",Calibri,"Microsoft YaHei",sans-serif}
.cost-summary-bar b{font-weight:700;font-variant-numeric:tabular-nums}
.cost-summary-bar .sheet-unit{font-weight:700}
.cost-summary-bar .spacer{flex:1}
.cost-panel>.cost-sheet+.cost-sheet{margin-top:16px}
/* 小节标题自带分隔线，表体不要再叠一条上边框 */
.cost-section .table-wrap{border-top:0}
.section-title{margin:0;padding:6px 12px;background:var(--sheet-dept);
 border-top:1px solid var(--sheet-line-strong);border-bottom:1px solid var(--sheet-line);
 font-size:12.5px;font-weight:700;letter-spacing:.04em;color:var(--sheet-ink);
 display:flex;align-items:baseline;justify-content:space-between;gap:12px}
/* 板块标题右侧的合计：三块各有自己的口径（开票 / 固定 / 零星），标题上直接写清这块是多少 */
.section-title .section-total{font-weight:400;font-size:11.5px;color:var(--sheet-soft);letter-spacing:0}
.section-title .section-total b{font-weight:700;color:var(--sheet-ink);font-variant-numeric:tabular-nums}
/* 无权限 / 无记录时的说明行：不留空表，直接讲清为什么没有数 */
.section-hint{margin:0;padding:10px 14px;border-bottom:1px solid var(--sheet-line);background:var(--sheet-paper);
 font-size:11.5px;line-height:1.8;color:var(--sheet-soft)}
.cost-section+.cost-section .section-title{border-top:1px solid var(--sheet-line)}
/* 二、三两块：期间小计行 + 逐笔行。期间行给底色、逐笔行靠左内距缩进，不加图标也能看出层级 */
.cost-type-block .cost-period-row td{background:var(--sheet-head);font-weight:700}
.cost-type-block .cost-period-row td:nth-child(2){font-weight:400;color:var(--sheet-soft)}
.cost-type-block .cost-entry td:nth-child(2){padding-left:26px}
.cost-type-block .cost-entry .entry-name{font-weight:400}
.cost-type-block .cost-entry .cell-sub{display:block;margin-left:0;line-height:1.5}
.cost-type-block .cost-entry:hover td{background:var(--sheet-paper)}
.cost-type-block .cost-empty-row td{text-align:center;color:var(--sheet-soft);font-size:11.5px}
/* 一、开票明细：一笔开票一行，七列固定顺序（项目名称 / 客户单位 / 所属期间 / 开票日期 / 开票金额 / 回款日期 / 回款金额）。
   ① table-layout:fixed 是这类表能不能对齐的前提：默认 auto 布局下百分比列宽根本不生效，
      浏览器按内容撑列，实测出现过「开票金额 232px / 回款金额 82px」「期间 150 / 开票日期 177 /
      回款日期 164」这种同类列悬殊、日期列各不相等的情况（七条 :nth-child{width} 规则全被忽略）。
   ② 列宽按「类」定义一次，不再逐列重复写 nth-child：三个日期列共用 .ci-date、两个金额列共用 .ci-money，
      同类列宽度必然相等（<colgroup> 里的 col 与单元格用同一套类名，一处改、两处同步）。
   ③ 行高统一：全表数据单元格固定 30px、垂直居中、单行省略，避免长项目名换行把某一行撑高造成参差。 */
.cost-invoice{table-layout:fixed}
.cost-invoice col.ci-project{width:23%}
.cost-invoice col.ci-customer{width:17%}
/* 后五列（所属期间 / 开票日期 / 开票金额 / 回款日期 / 回款金额）统一 12%：
   原来是日期 11%、金额 13%，两档宽度让同类单元格差 27px，看上去像「同一件事被拆成一大一小」。
   23 + 17 + 12 × 5 = 100%，五列一律等宽，金额与日期都落在同一格宽里。 */
.cost-invoice col.ci-date,.cost-invoice col.ci-money{width:12%}
.cost-invoice th{text-align:center}
/* 行高统一：单元格给一个「比任何一行内容都高」的最小高度 31px，内容再用 line-height 20px 垂直居中。
   踩过的坑：① 只写 height:30px 不够 —— 有的行因数字/日期落在 Calibri 回退字体上，
   行盒比中文字高 1px，会把该行顶成 31，于是整表 31/32 交替；把最小值提到 31 就没有行能被「顶破」。
   ② 不要同时给 tr 写 height，border-collapse 下相邻边框按半像素分摊，反而多出 1px 抖动。 */
.cost-invoice td{text-align:left;height:31px;padding-top:0;padding-bottom:0;line-height:20px;
 vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cost-invoice td.ci-date{text-align:center}
.cost-invoice td.ci-money{text-align:right}
.cost-invoice .cost-empty-row td{color:var(--sheet-soft);font-size:11.5px;text-align:center;white-space:normal}
.cost-grand td:first-child{font-weight:700}
.cost-empty-sheet .cost-empty{padding:38px 16px}
/* ---- 导出弹窗：按部门列出，可单个也可全部 ---- */
.export-list{margin:4px 0 0;padding:0;list-style:none;max-height:320px;overflow:auto;border:1px solid var(--line);border-radius:8px}
.export-item{display:flex;align-items:center;gap:12px;padding:9px 12px;border-bottom:1px solid var(--line)}
.export-item:last-child{border-bottom:0}
.export-item.is-empty{background:#fafbfd}
.export-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.export-name{font-weight:600;font-size:12.5px;color:var(--ink)}
.export-meta{font-size:11px;color:var(--muted);font-variant-numeric:tabular-nums}
.export-item.is-empty .export-name,.export-item.is-empty .export-meta{color:#a6b2c4}
.export-item .button{flex:0 0 auto;min-height:29px;padding:4px 12px;font-size:12px}
/* 外层筛选条也用同一套线条语言：方角、细边框、更矮的控件，避免「白纸上贴一块圆角卡片」 */
/* 只改筛选条那张卡片；统计表自己的 .cost-panel 必须留白，否则会和 .cost-sheet 的边框叠成双线 */
#page-ledger-expenses .panel:not(.cost-panel){border-radius:2px;border-color:#bccbdd;box-shadow:none}
#page-ledger-expenses .filters{padding:12px 14px;gap:10px 14px;border-bottom:0}
#page-ledger-expenses .filters .field>span{font-size:11px;color:#6b7d94}
#page-ledger-expenses .filters input,#page-ledger-expenses .filters select{min-height:29px;padding:3px 8px;border-radius:2px;border-color:#c3cfdf;font-size:12.5px}
#page-ledger-expenses .filters .text-button{height:29px;min-height:29px;border:1px solid #c3cfdf;border-radius:2px;padding:0 10px;background:var(--sheet-paper);color:#5b6a7e;font-size:12px}
#page-ledger-expenses .filters .text-button:hover{border-color:#8fa3bb;background:#eaf1fa;color:#16233a}
/* 登记费用弹窗里的「计费口径」做成同一套小表：浅蓝抬头 + 细线 + 数字右对齐等宽。
   .form-block 是同一套分组块的通用版本（固定费用弹窗用它），与 .billing-block 共用规则 ——
   两处只留一份样式，避免以后改了一处、另一处漂移。 */
#editor-form .billing-block,#editor-form .form-block{border:1px solid #bccbdd;border-radius:2px;background:#f7fafd;padding:0;overflow:hidden}
#editor-form .billing-block>h3,#editor-form .form-block>h3{margin:0;padding:6px 11px;background:#d7e4f4;border-bottom:1px solid #bccbdd;font-size:12.5px;font-weight:700;color:#16233a;font-family:"SimSun","宋体","Microsoft YaHei",sans-serif}
#editor-form .billing-block>h3 .subheading,#editor-form .form-block>h3 .subheading{font-size:11px;font-weight:400;color:#6b7d94}
#editor-form .billing-block .form-grid,#editor-form .form-block .form-grid{padding:11px 12px 10px;gap:10px 14px}
#editor-form .billing-block .field>span,#editor-form .form-block .field>span{font-size:11px;color:#6b7d94}
#editor-form .billing-block input,#editor-form .billing-block select,#editor-form .form-block input,#editor-form .form-block select{min-height:29px;padding:3px 8px;border-radius:2px;border-color:#c3cfdf;font-size:12.5px;font-variant-numeric:tabular-nums}
#editor-form .billing-block small{display:block;color:#6b7d94;font-size:11px;line-height:1.85;padding:8px 12px 0;border-top:1px solid #dde5ef}
#editor-form .form-block .form-note{margin:0;color:#6b7d94;font-size:11px;line-height:1.85;padding:8px 12px 9px;border-top:1px solid #dde5ef}
#editor-form .billing-preview{padding:8px 10px;border-radius:2px;background:#eaf1fa;border:1px solid #d3deec;font-size:12px;line-height:1.9;color:#41506a}
#editor-form .billing-preview b{color:#16233a;font-variant-numeric:tabular-nums}
#editor-form .billing-preview .muted{color:#8a99ac}
@media (max-width:900px){
  .cost-table{min-width:680px;font-size:12px}
  .cost-sheet .sheet-title{font-size:15px}
}
@media (max-width:600px){
  .cost-sheet .sheet-bar{flex-wrap:wrap;gap:6px 10px;padding-bottom:8px}
  .cost-sheet .sheet-period{margin-left:0}
  .cost-table .cost-project td:nth-child(2){padding-left:18px}
  .cost-table .cost-meta{margin-left:6px}
  .cost-table .cell-sub{margin-left:6px}
}

/* ==================== 费用结算：固定费用维护（rev 20） ====================
   与上方成本统计共用本页「细线条纸张」观感（2px 圆角、#bccbdd 边框、无阴影），
   但它是维护表单不是结算表：列宽按内容分配（table-layout:fixed + colgroup），
   金额右对齐用 tabular-nums，其余居中（与全站列表同一条版式约定）。 */
.fixed-host{margin-top:16px}
.fixed-panel{padding:0}
.fixed-panel .fixed-head{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap;padding:14px 16px;border-bottom:1px solid #bccbdd}
.fixed-panel .fixed-head h2{font-size:15px;font-weight:700;letter-spacing:.04em;color:var(--sheet-ink,#16233a)}
.fixed-panel .fixed-sub{font-size:11px;color:#6b7d94;margin-top:5px;max-width:760px;line-height:1.7}
.fixed-panel .fixed-sub strong,.fixed-panel .fixed-note strong{color:#16233a;font-weight:600}
.fixed-toolbar{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap;padding:12px 16px;background:var(--sheet-paper,#f7fafd);border-bottom:1px solid #d7e4f4}
.fixed-toolbar .field{min-width:260px;max-width:380px;margin:0}
.fixed-toolbar .field>span{font-size:11px;color:#6b7d94}
.fixed-toolbar .field input{min-height:29px;padding:3px 8px;border-radius:2px;border-color:#c3cfdf;font-size:12.5px}
.fixed-toolbar .field small{font-size:10px;color:#8fa3bb;line-height:1.5}
.fixed-toolbar .fixed-clear{align-self:center;height:29px;min-height:29px;border:1px solid #c3cfdf;border-radius:2px;padding:0 10px;background:#fff;color:#5b6a7e;font-size:12px}
.fixed-toolbar .fixed-clear:hover{border-color:#8fa3bb;background:#eaf1fa;color:#16233a}
.fixed-echo{padding:9px 16px;font-size:11.5px;color:#5b6a7e;background:#fff;border-bottom:1px solid #eaf1fa}
.fixed-echo b{color:#16233a;font-weight:600}
.fixed-list{padding:12px 16px 2px;background:#fff}
.fixed-list .empty-state{padding:34px 16px}
.fixed-empty h3{font-size:13px}
/* 一个部门一块：块头浅蓝（比表头浅一档），块内表格用服务端下发的列宽比例。 */
.fixed-dept{border:1px solid #bccbdd;background:#fff;margin-bottom:12px}
.fixed-dept-head{display:flex;justify-content:space-between;align-items:center;gap:10px 14px;flex-wrap:wrap;padding:8px 12px;background:#eaf1fa;border-bottom:1px solid #bccbdd}
.fixed-dept-title{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;min-width:0}
.fixed-dept-title b{font-size:13.5px;font-weight:700;letter-spacing:.04em;color:#16233a}
.fixed-dept-title small{font-size:10.5px;color:#6b7d94}
.fixed-dept-meta{font-size:10.5px;color:#6b7d94;font-variant-numeric:tabular-nums}
.fixed-chips{display:flex;gap:6px;flex-wrap:wrap}
.fixed-chip{display:inline-flex;align-items:baseline;gap:6px;padding:2px 8px;border:1px solid #c4d9ee;background:#f7fafd;font-size:10.5px;color:#6b7d94}
.fixed-chip i{font-style:normal}
.fixed-chip b{color:#16233a;font-weight:600;font-variant-numeric:tabular-nums}
.fixed-chip.is-empty{border-style:dashed;color:#8fa3bb}
.fixed-table{table-layout:fixed;min-width:880px;border-collapse:collapse}
.fixed-table col.fx-name{width:21%}
.fixed-table col.fx-kind{width:11%}
.fixed-table col.fx-cycle{width:10%}
.fixed-table col.fx-amount{width:15%}
.fixed-table col.fx-state{width:8%}
.fixed-table col.fx-remark{width:24%}
/* 操作列给 11%：两枚按钮并排要占住「编辑」「删除」四个字，8% 会被压成竖排 */
.fixed-table col.fx-ops{width:11%}
.fixed-table th{padding:7px 8px;background:#d7e4f4;border:1px solid #bccbdd;color:#16233a;font-size:11px;font-weight:600;letter-spacing:.04em;text-align:center;white-space:nowrap}
.fixed-table td{padding:7px 8px;border:1px solid #dbe6f2;color:#16233a;font-size:12px;text-align:center;vertical-align:middle}
.fixed-table th.money,.fixed-table td.money{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
/* 长名称 / 长备注一律单行省略并把全文放进 title，避免某一格把整行撑成两行高度 */
.fixed-table td.fixed-name,.fixed-table td.fixed-remark{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.fixed-table .cell-actions{justify-content:center;gap:2px;flex-wrap:nowrap}
.fixed-table .cell-actions button{font-size:11px;padding:2px 4px;min-height:24px;white-space:nowrap}
.fixed-table tbody tr.is-off td{color:#94a3b8}
.fixed-table tbody tr.is-off td.money{color:#94a3b8}
.fixed-note{padding:10px 16px 14px;font-size:10.5px;line-height:1.85;color:#6b7d94;background:#fff;border-top:1px solid #eaf1fa}
.fixed-note b{color:#16233a;font-weight:600;letter-spacing:.04em}
@media(max-width:900px){
 .fixed-toolbar .field{min-width:0;max-width:none;flex:1 1 220px}
 .fixed-list{padding:10px 10px 2px}
 .fixed-dept-head{align-items:flex-start;flex-direction:column}
}

/* UI refresh 2026-10-30 — local assets only; business table geometry retained. */
:root{--nav:#fff;--nav-muted:#687b74;--blue:#236653;--blue-soft:#eaf3ed;--ink:#263b34;--muted:#6d7c76;--line:#e2e7e1;--canvas:#f4f5f0;--radius:14px;--shadow:0 2px 5px #20392b03;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif}
body{line-break:strict;word-break:normal}
.sidebar{background:#fcfdf9;background-image:none;color:var(--ink);border-right:1px solid var(--line);padding-top:28px;overflow-y:auto}
.brand{padding-bottom:30px;gap:11px}
.brand-mark{background:#244e40;border-radius:12px;box-shadow:none;color:#fffdf5}
.brand b{color:#253e33;font-size:16px}
.brand small{color:#7a847a;font-size:9px;letter-spacing:1px}
.nav-label{color:#7c897f;font-size:11px;letter-spacing:1.4px;padding-top:16px}
.sidebar nav>a{color:#53675d;font-size:14px;min-height:45px;border-radius:9px;transition:background .15s,color .15s}
.sidebar nav>a:hover,.sidebar nav>.nav-sub a:hover{background:#edf2eb;color:#204f3b}
.sidebar nav>a.active{background:#e4eee2;color:#214d36;box-shadow:inset 3px 0 #47794e;font-weight:600}
.sidebar nav i{color:inherit;opacity:.8}
.sidebar nav>.nav-sub{border-color:#e0e6dc;margin-left:24px;padding-left:8px}
.sidebar nav>.nav-sub a{color:#627468;font-size:13px;min-height:36px}
.sidebar nav>.nav-sub a.active{background:#edf3e9;color:#315b3d;font-weight:600}
.nav-badge{background:#ecdfc5;color:#73562a;font-size:11px}
.workspace-note{color:#6b7f70;font-size:11px}
.online-dot{background:#467e54;box-shadow:0 0 0 4px #467e5410}
.profile-summary{background:#f0f4ec;border-color:#e0e7da;color:#304c3b;border-radius:10px}
.profile-summary small,.profile-summary i{color:#6c7e6d}
.profile-summary b{font-size:13px}
.avatar{background:#e0eadb;color:#3b6544}
.topbar{height:70px;background:#fcfdf9f5;border-color:var(--line);backdrop-filter:blur(10px)}
.breadcrumb{font-size:12px;color:#78867c}.breadcrumb b{color:#3c5347}.breadcrumb span{color:#aab5ac}
.topbar-actions{gap:10px}.topbar-actions .quiet-button{color:#586d60}
#sync-status{background:#eef4e9;border:1px solid #e0e9d9;border-radius:99px;padding:5px 12px;font-size:11px}
#main{padding-top:34px}
.page-heading{margin-bottom:26px;align-items:center}
.page-heading h1{font-size:30px;font-weight:600;letter-spacing:-.5px;line-height:1.45;color:#243d31}
.eyebrow{color:#71816d;font-size:10px;letter-spacing:1.8px;margin-bottom:9px}
.heading-dot{color:#9aab66}.subheading{color:#6a7b70;font-size:13px;line-height:1.75}
.page-heading .subheading{margin-top:9px}
.button{font-size:13px;border-radius:8px;min-height:40px;padding:9px 15px}
.primary{background:#28634c;box-shadow:0 2px 3px #153f1f08}.primary:hover{background:#1e503d;transform:none}
.secondary{border-color:#d8e0d3;color:#52674f;background:#fff}.secondary:hover{border-color:#8ca480;background:#f7faf3;color:#264d37}
.quiet-button,.text-button,.link-button{font-size:12px}.icon-button:hover,.quiet-button:hover,.text-button:hover{background:#edf3e8;color:#28634c}
button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible{outline:3px solid #84a66a;outline-offset:3px}
.stat-grid{gap:16px}.stat-card{padding:22px 23px 20px;border-color:#dfe5d9;box-shadow:none;border-radius:12px;transition:border-color .15s,box-shadow .15s}
.stat-card:hover{border-color:#9eb291;box-shadow:0 4px 14px #30553508}.stat-card::after{display:none}
.stat-top{font-size:12px;color:#61725e}.stat-icon{width:31px;height:31px;border-radius:8px;background:#eff3e9;color:#657d4b}
.stat-value{font-size:40px;font-weight:600;line-height:1.25;letter-spacing:-1px;margin:12px 0 11px;color:#304933;font-variant-numeric:tabular-nums}
.stat-foot{font-size:11px;color:#75816f}.stat-foot i{color:#6c8653}
#dashboard-stats .stat-card:first-child{background:#264d3d;border-color:#264d3d}
#dashboard-stats .stat-card:first-child .stat-top,#dashboard-stats .stat-card:first-child .stat-foot{color:#d1dfc7}
#dashboard-stats .stat-card:first-child .stat-value{color:#fffef2}
#dashboard-stats .stat-card:first-child .stat-icon{background:#ffffff12;color:#d2dfa6}
#dashboard-stats .stat-card:first-child .stat-foot i{color:#c5d995}
.finance-strip{background:#ebefdf;border-color:#dce3cc;border-radius:12px;gap:24px;padding:23px 24px;grid-template-columns:1.15fr 1fr 1.15fr 1fr;margin:20px 0 28px}
.finance-number small{font-size:11px;color:#677554}.finance-number b{font-size:21px;font-weight:600;color:#3a5331;letter-spacing:-.3px;font-variant-numeric:tabular-nums}
.finance-number .strip-sub{color:#677554;font-size:11px;line-height:1.7}
.progress-label{color:#657650;font-size:11px}.progress-track{background:#d6dfc8}.progress-track i{background:#6f8c48}
.strip-track{background:#d6dfc8}.strip-track i{background:#739453}
.panel,.widget,.role-card{border-color:#dfe5da;box-shadow:var(--shadow)}
.widget-header{padding:20px 23px;border-bottom-color:#e8ece4}.widget-header h2{font-size:15px;color:#344a36}.widget-header .widget-mark{background:#85955d;height:14px;width:3px}
.widget-actions button{color:#788774}.widget-actions button:hover{background:#edf3e7}
.alert-summary,.alert-strip{background:#fcfdf8;border-color:#e8ece2;padding-top:12px;padding-bottom:12px}
.alert-summary span,.alert-strip-title{font-size:12px;color:#6d795c}.alert-summary b{font-size:13px}
/* Exclude the printable settlement and fixed-cost sheets from general table typography. */
table:not(.cost-table):not(.fixed-table){font-size:13px}
table:not(.cost-table):not(.fixed-table) th{background:#f4f6ef;color:#68775d;font-size:11px;font-weight:500;padding-top:13px;padding-bottom:13px;border-color:#e2e7dc}
table:not(.cost-table):not(.fixed-table) td{color:#4d5f4a;border-color:#edf0e8;padding-top:16px;padding-bottom:16px}
table:not(.cost-table):not(.fixed-table) td b{color:#354c35;font-weight:500}
table:not(.cost-table):not(.fixed-table) tbody tr:not(.row-expiring):not(.row-expired):hover{background:#f7faf1}
table:not(.cost-table):not(.fixed-table) td code{color:#7b8774;font-size:11px}
.money{font-variant-numeric:tabular-nums}.tag{font-size:11px;background:#eaf2e4;color:#48743d;padding:4px 8px}
.tag.blue{background:#e9eff3;color:#526f82}.tag.expiring{background:#faf0d9;color:#98712d}.tag.expired{background:#f9e9e5;color:#aa5a4e}.tag.terminated{background:#edf0e8;color:#727e68}
.table-footer{font-size:11px;color:#78866c;background:#fcfdf9}.pagination button,.pagination select{font-size:12px;min-width:31px;height:31px;border-color:#dce3d5;color:#607451}.pagination button.active{background:#3c6949;border-color:#3c6949}
.filters,.panel-toolbar{background:#fcfdf9;border-color:#e5eade}.field>span,.field>label{font-size:12px;color:#627354}
.field input,.field select,.field textarea,input,select,textarea{font-size:13px;border-color:#d9e1d1;color:#3e5337;border-radius:7px;min-height:39px}
input::placeholder,textarea::placeholder{color:#909a83}
input:focus,textarea:focus,select:focus{border-color:#91a878;box-shadow:0 0 0 3px #779a4b10}
.search-field{border-color:#d9e1d1}.search-field span{color:#87967a}.search-field input{box-shadow:none}
.dept-name-text b{color:#385039}.dept-name-text small{color:#7d8974}.tree-symbol{background:#edf2e4;color:#77975b}.tree-expander{color:#768b63}
.tabs{border-color:#dce4d4;gap:26px}.tabs button{font-size:14px;color:#7b8a6a}.tabs button.active{color:#3e6541;border-color:#52744d}
.role-card p{color:#728167;line-height:1.75}.role-card h3{color:#3c5536}
.editor-dialog{border-color:#d8e2d0;border-radius:16px;box-shadow:0 28px 90px #19351e35}
.editor-dialog::backdrop{background:#1a30254d;backdrop-filter:blur(3px)}
.dialog-header,.dialog-footer{border-color:#e0e7d9}.dialog-footer{background:#f6f8f1}.dialog-header h2{color:#304d36}
.app-footer{color:#7c8b72;font-size:11px;padding-bottom:24px}
.login-page{background:#eef1e7;background-image:radial-gradient(ellipse at 80% 0,#fffdf4 0,transparent 60%)}
.login-layout{border:1px solid #dde4d3;border-radius:18px;box-shadow:0 30px 70px #2a472413;min-height:620px}
.login-art{background:#274c3b;padding:44px;color:#fffdf1}.login-art .brand b{color:#fffef1}.login-art .brand small{color:#bbcfad}.login-art .brand-mark{background:#f2f3d9;color:#395535}
.login-art h2{font-size:32px;font-weight:500;line-height:1.8;letter-spacing:.3px}.login-art p{font-size:13px;color:#c2d1b4}.login-art>small{color:#b2c99c;letter-spacing:1.4px}
.art-ring{width:340px;height:340px;border-radius:24%;border-color:#b5cd8c55;transform:rotate(32deg);right:-170px;bottom:95px;box-shadow:0 0 0 36px #bad29409,0 0 0 72px #bad29406}
.login-form-wrap h1{font-size:29px;color:#2a4431}.login-form-wrap{padding:52px}.login-form-wrap .field input{min-height:46px}.login-form-wrap .button{min-height:46px}.login-options{color:#738364}.login-footer{color:#849178;font-size:11px}
@media(min-width:1550px){.stat-value{font-size:44px}.stat-card{padding:25px 26px}}
@media(max-width:1200px){.brand b{font-size:14px}.page-heading h1{font-size:28px}.stat-card{padding:19px}.stat-value{font-size:36px}.finance-strip{gap:16px;padding:21px}.finance-number b{font-size:18px}}
@media(max-width:900px){.topbar{height:64px}.sidebar{padding-top:24px}.finance-strip{grid-template-columns:repeat(3,minmax(0,1fr))}.finance-strip .collection-progress{grid-column:1/-1}.page-heading h1{font-size:26px}.login-art{padding:30px}.login-form-wrap{padding:36px}}
@media(max-width:600px){#main{padding:24px 15px 30px}.topbar{padding:0 10px}.topbar-actions{gap:2px}.topbar-actions .quiet-button{font-size:11px;padding:6px}.breadcrumb{font-size:11px}.page-heading{align-items:flex-start;gap:15px;margin-bottom:22px}.page-heading h1{font-size:24px}.page-heading .subheading{font-size:12px}.page-heading .eyebrow{font-size:10px}.button{font-size:12px}.stat-grid{gap:10px}.stat-card{padding:17px 15px}.stat-value{font-size:34px;margin:10px 0}.stat-top{font-size:11px}.stat-icon{width:26px;height:26px;font-size:16px}.stat-foot{font-size:10px}.finance-strip{grid-template-columns:1fr;gap:14px;padding:19px;margin:16px 0 22px}.finance-number{padding-bottom:12px;border-bottom:1px solid #dce3cc}.finance-number b{font-size:23px}.finance-number small{font-size:12px}.finance-strip .collection-progress{grid-column:auto}.finance-strip.three{grid-template-columns:1fr}.widget-header{padding:17px 16px}.widget-header h2{font-size:14px}.sidebar nav>.nav-sub a{min-height:41px}.login-page{padding:15px}.login-layout{min-height:0;border-radius:14px}.login-form-wrap{padding:32px 24px}.login-options{gap:12px;flex-wrap:wrap}.app-footer{padding-left:15px;padding-right:15px;gap:12px;flex-wrap:wrap}}
@media(prefers-reduced-motion:reduce){.stat-card,.sidebar nav>a{transition:none}}
/* A desktop 320px flex-basis becomes height when the mobile heading stacks. */
@media(max-width:600px){.page-heading>div:first-child{flex:0 1 auto;width:100%}.page-heading>.button{flex:0 0 auto}}
.panel:not(.cost-panel)>.table-summary:not(.has-strip),.batch-toolbar,.batch-bar{background:#f1f5eb;color:#657951}
.panel:not(.cost-panel)>.table-summary:not(.has-strip) b{color:#405f36}
.alert-strip-note,.strip-scope{color:#7b896c}.strip-scope b{color:#536e47}
@media(max-width:600px){.dialog-footer{flex-wrap:wrap}.dialog-footer>span{flex:1 1 100%;font-size:11px;line-height:1.6}.dialog-footer .button{flex:1}}
/* Long auto-number guidance must not force a form grid wider than its dialog. */
.form-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
@media(max-width:600px){.form-grid{grid-template-columns:minmax(0,1fr)}.field small{overflow-wrap:anywhere}}
