*{box-sizing:border-box}html{overflow-x:hidden;clip-path:inset(0)}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;color:#1f2329;background:#f5f6f8;overflow-x:hidden;max-width:100vw}button{cursor:pointer;border:none;border-radius:6px;padding:6px 14px;background:#07c160;color:#fff;font-size:14px}button:hover{opacity:.9}button.danger{background:#e54545;margin-left:6px}button.ghost{background:#fff;color:#07c160;border:1px solid #07c160}input,select{padding:9px 12px;border:1px solid #dcdfe6;border-radius:8px;font-size:14px;line-height:1.4;outline:none;height:38px;box-sizing:border-box;background:#fff;transition:border-color .15s,box-shadow .15s}select{appearance:none;-webkit-appearance:none;-moz-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23999' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 11px center;padding-right:30px;cursor:pointer}select option{padding:8px 14px;font-size:14px;line-height:1.5;color:#333;background:#fff}input:focus,select:focus{border-color:#07c160;box-shadow:0 0 0 3px #07c1601a}.login-page{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#07c160,#0aa84a)}.login-card{background:#fff;padding:40px;border-radius:12px;width:340px;display:flex;flex-direction:column;gap:16px;box-shadow:0 8px 30px #00000026}.login-card h2{margin:0 0 8px;text-align:center;color:#07c160;font-size:22px;white-space:nowrap}.login-logo{display:block;width:160px;height:auto;margin:0 auto 12px;object-fit:contain}.login-card .err{color:#e54545;font-size:13px}.captcha-row{display:flex;gap:10px;align-items:center;width:100%}.captcha-input{flex:1;min-width:0}.captcha-code{width:100px;height:32px;line-height:32px;text-align:center;letter-spacing:2px;font-size:16px;font-weight:600;color:#1f2329;background:#f2f3f5;border:1px solid #dcdfe6;border-radius:6px;cursor:pointer;-webkit-user-select:none;user-select:none;font-family:Courier New,monospace;flex-shrink:0}.captcha-code:hover{background:#e8e9eb}.password-row{position:relative;display:flex;align-items:center;width:100%}.password-row input{width:100%;padding-right:40px}.eye-btn{position:absolute;right:10px;top:50%;transform:translateY(-50%);background:transparent;border:none;cursor:pointer;font-size:18px;line-height:1;padding:4px;color:#666}.eye-btn:hover{color:#07c160}.layout{display:flex;flex-direction:column;height:100vh;overflow-x:hidden}.body{flex:1;display:flex;min-height:0;overflow:hidden;background:#f5f6f8;padding:12px;gap:12px}.sidebar{flex:none;width:220px;background:#1f2329;color:#fff;display:flex;flex-direction:column;border-radius:8px;box-shadow:0 1px 4px #0000000a;overflow:hidden}.sidebar-logo{display:block;width:150px;height:auto;margin:0 auto 18px;padding:0 10px;object-fit:contain}.sidebar nav{flex:1;display:flex;flex-direction:column;min-height:0;overflow-y:auto}.sidebar nav a{color:#c9cdd4;text-decoration:none;padding:12px 20px;font-size:14px}.sidebar nav a:hover{background:#ffffff14;color:#fff}.sidebar nav a.active{background:#07c16033;color:#fff}.nav-group{margin-top:2px}.nav-group-header{display:flex;align-items:center;justify-content:space-between;padding:13px 20px;font-size:14px;color:#c9cdd4;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .2s,color .2s}.nav-group-header:hover{background:#ffffff0f;color:#fff}.nav-group-header:focus-visible{outline:2px solid rgba(7,193,96,.6);outline-offset:-2px}.nav-group-label{font-weight:500}.nav-group-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #8a8f99;transition:transform .25s ease}.nav-group.open .nav-group-arrow{transform:rotate(180deg)}.nav-group-items{display:flex;flex-direction:column;max-height:0;overflow:hidden;transition:max-height .25s ease}.nav-group.open .nav-group-items{max-height:800px}.sidebar nav a.nav-sub{padding:11px 20px 11px 36px;font-size:13px;color:#c9cdd4}.sidebar nav a.nav-sub.active{background:#07c16033;color:#fff}.stat-cards{display:flex;gap:16px;flex-wrap:wrap;margin-bottom:20px}.stat-card{background:#fff;border-radius:8px;padding:16px 20px;min-width:160px;box-shadow:0 1px 4px #0000000f}.stat-card .label{font-size:13px;color:#888}.stat-card .value{font-size:22px;font-weight:600;margin-top:6px;color:#07c160}.tag{display:inline-block;padding:2px 8px;border-radius:4px;font-size:12px}.tag-danger{background:#fdeaea;color:#e54545}.tag-warn{background:#fff4e5;color:#d9822b}.sidebar .user{padding:14px 20px;border-top:1px solid rgba(255,255,255,.1);display:flex;align-items:center;justify-content:space-between;font-size:13px}.sidebar .user .icon-btn{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;padding:0;background:none;border:none;border-radius:4px;color:#c9cdd4;cursor:pointer;transition:background .15s,color .15s}.sidebar .user .icon-btn:hover{background:#ffffff14;color:#fff}.sidebar .user .icon-btn svg{width:16px;height:16px}.content{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden;background:transparent;padding:0;gap:12px}.top-header{flex:none;display:flex;align-items:center;gap:12px;height:60px;padding:0 24px;background:#fff;border-bottom:1px solid #e5e6eb}.top-header-logo{height:36px;width:auto;object-fit:contain}.top-header-title{font-size:18px;font-weight:600;color:#1d2129;margin:0;line-height:1}.tab-bar{flex:none;display:flex;align-items:center;height:44px;background:#fff;border-radius:8px;box-shadow:0 1px 4px #0000000a;padding:0 12px;gap:2px;overflow-x:auto}.tab{display:flex;align-items:center;gap:6px;padding:0 18px;height:32px;font-size:13px;color:#4e5969;cursor:pointer;border-radius:4px;white-space:nowrap;-webkit-user-select:none;user-select:none;transition:background .15s,color .15s}.tab+.tab{border-left:1px solid #e5e6eb}.tab:hover{background:#f2f3f5}.tab.active{background:#e8ffef;color:#07c160;font-weight:500}.tab-label{line-height:1}.tab-close{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:50%;font-size:14px;line-height:1;color:#86909c}.tab-close:hover{background:#d0d3d9;color:#1d2129}.tab-icon{width:14px;height:14px;flex:none}.tab-panes{flex:1;min-width:0;overflow-y:auto;overflow-x:hidden;background:#fff;border-radius:8px;box-shadow:0 1px 4px #0000000a;padding:20px 24px}.loading{padding:60px;text-align:center;color:#888}.page-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.page-head h2{margin:0;font-size:18px;font-weight:600;color:#1d2129}.page-head .toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.page-head .search-input{width:220px;padding:7px 12px;border:1px solid #d1d5db;border-radius:6px;font-size:14px;outline:none}.page-head .search-input:focus{border-color:#07c160}.page-tabs{display:flex;gap:28px;border-bottom:1px solid #e5e6eb;margin-bottom:16px}.page-tab{padding:10px 2px;font-size:15px;color:#4e5969;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;-webkit-user-select:none;user-select:none;white-space:nowrap}.page-tab:hover{color:#1d2129}.page-tab.active{color:#07c160;font-weight:500;border-bottom-color:#07c160}.grid{width:100%;border-collapse:collapse;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 1px 4px #0000000f}.grid th,.grid td{text-align:left;padding:12px 14px;border-bottom:1px solid #f0f0f0;font-size:14px}.grid th{background:#fafafa;color:#555;font-weight:600}.grid tr:hover td{background:#fafcfa}.grid tr.highlight td{background:#e6f7ef;box-shadow:inset 3px 0 #07c160}.grid tr.row-expired td{background:#fff1f0;box-shadow:inset 3px 0 #e54545}.grid tr.row-expired:hover td{background:#ffe0de}.grid tr.row-expiring td{background:#fffbe6;box-shadow:inset 3px 0 #faad14}.grid tr.row-expiring:hover td{background:#fff4cc}.grid td button{margin:0 8px 6px 0;border:1px solid #06ad56}.modal{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000059;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:1000;animation:modal-fade-in .18s ease-out}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-slide-up{0%{opacity:0;transform:translateY(16px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.modal-body{background:#fff;border-radius:14px;padding:0;width:440px;max-height:88vh;overflow-y:auto;display:flex;flex-direction:column;box-shadow:0 12px 48px #0000001f,0 4px 12px #0000000f;animation:modal-slide-up .22s ease-out;position:relative}.modal-body>*{min-height:0}.modal-body>h3:first-child,.modal-body:not(.scan-modal)>div:has(>h3){padding:20px 24px 16px;border-bottom:1px solid #f0f2f5;position:sticky;top:0;z-index:3;flex-shrink:0;background:#fff;border-radius:14px 14px 0 0}.modal-body>h3:first-child{font-size:17px;font-weight:600;color:#1a1a2e;margin:0;line-height:1.3}.modal-body>.property-form,.modal-body>p:not(.modal-actions){padding:20px 24px}.modal-body>table.grid{margin:0 24px;border-radius:10px;overflow:hidden}.modal-actions{display:flex;gap:10px;justify-content:flex-end;padding:14px 24px 18px;border-top:1px solid #f0f2f5;margin-top:auto;z-index:3;flex-shrink:0;background:#fff;border-radius:0 0 14px 14px;box-shadow:0 -4px 12px #0000000d}.modal-actions button{padding:8px 22px;font-size:13px;font-weight:500;border-radius:8px;transition:all .15s}.modal-actions button:hover{transform:translateY(-1px);box-shadow:0 2px 8px #07c16033}.modal-actions button.ghost:hover{box-shadow:0 2px 6px #00000014;transform:translateY(-1px)}.modal-body.wide{width:1100px;max-width:96vw;height:88vh;overflow:hidden;resize:both;min-width:480px;min-height:320px}.modal-body.wide>h3,.modal-body.wide>div:has(>h3),.modal-body.wide>.modal-actions{flex-shrink:0}.modal-body.wide>form,.modal-body.wide>.property-form,.modal-body.wide>table.grid{flex:1 1 0;overflow-y:auto;min-height:0;padding:20px 24px}.modal-body.medium{width:580px;max-width:92vw;max-height:80vh;resize:both;min-width:360px}.expiring-modal{width:900px;max-width:94vw;max-height:80vh;resize:both;min-width:480px}.modal-body.medium.inbound-modal{width:960px;max-width:94vw}.searchable-select{position:relative;width:100%}.filter-bar .searchable-select{width:auto;min-width:180px}.searchable-select.disabled .ss-trigger{background:#f5f7fa;cursor:not-allowed;color:#999}.ss-trigger{display:flex;align-items:center;justify-content:space-between;height:38px;box-sizing:border-box;padding:9px 30px 9px 12px;border:1px solid #dcdfe6;border-radius:8px;background:#fff;font-size:14px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:border-color .15s,box-shadow .15s}.ss-trigger:focus{outline:none;border-color:#07c160;box-shadow:0 0 0 3px #07c1601a}.ss-value{color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ss-placeholder{color:#aaa}.ss-arrow{position:absolute;right:10px;top:50%;transform:translateY(-50%);color:#999;font-size:12px;pointer-events:none}.ss-panel{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:60;background:#fff;border:1px solid #e4e7ed;border-radius:8px;box-shadow:0 8px 24px #00000024;overflow:hidden}.ss-search-wrap{padding:8px;border-bottom:1px solid #f0f0f0}.ss-search{width:100%;box-sizing:border-box;height:34px;padding:6px 10px;border:1px solid #dcdfe6;border-radius:6px;font-size:14px;outline:none;transition:border-color .15s}.ss-search:focus{border-color:#07c160}.ss-list{max-height:260px;overflow:auto;padding:4px 0}.ss-item{padding:9px 14px;font-size:14px;color:#333;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ss-item:hover,.ss-item.ss-active{background:#f5f7fa}.ss-item.ss-selected{color:#07c160;font-weight:500;background:#f0faf4}.ss-empty{padding:12px 14px;color:#999;font-size:13px;text-align:center}.expiring-grid th,.expiring-grid td{white-space:nowrap;text-align:left;padding:10px 12px}.expiring-grid th:nth-child(1),.expiring-grid td:nth-child(1){width:48px}.expiring-grid th:nth-child(3),.expiring-grid td:nth-child(3){width:180px}.expiring-grid th:nth-child(4),.expiring-grid td:nth-child(4){width:110px}.expiring-grid th:nth-child(5),.expiring-grid td:nth-child(5){width:90px}.expiring-grid th:nth-child(6),.expiring-grid td:nth-child(6){width:80px}.property-form{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px 20px;width:100%;box-sizing:border-box;min-width:0}.property-form>label{margin:0;min-width:0}.property-form .form-section,.property-form .full-width{grid-column:1 / -1}.property-form input,.property-form select{width:100%;box-sizing:border-box}.property-form input:focus,.property-form select:focus{border-color:#07c160;box-shadow:0 0 0 3px #07c1601a}.property-form label>span{display:block;width:100%;padding:8px 12px;background:#f7f8fa;border-radius:8px;font-size:13px;color:#2c3140;word-break:break-all;line-height:1.5;border:1px solid #eef0f4}.contract-selector{display:flex;flex-direction:column;gap:10px}.contract-selected-tags{display:flex;flex-wrap:wrap;gap:8px;min-height:28px;align-items:center}.contract-tag{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;background:#e6f7ed;color:#07a35a;border:1px solid #b7ebcd;border-radius:4px;font-size:13px;line-height:1}.contract-tag button{background:transparent;border:none;color:#07a35a;cursor:pointer;font-size:16px;line-height:1;padding:0 2px}.contract-candidate-list{border:1px solid #e5e7eb;border-radius:6px;max-height:200px;overflow-y:auto;background:#fafafa}.contract-candidate-row{display:flex;align-items:center;gap:10px;padding:8px 10px;cursor:pointer;border-bottom:1px solid #f0f0f0;font-size:13px}.contract-candidate-row:last-child{border-bottom:none}.contract-candidate-row:hover,.contract-candidate-row.selected{background:#e6f7ed}.contract-candidate-row input[type=checkbox]{width:16px;height:16px;accent-color:#07c160;flex-shrink:0;cursor:pointer}.contract-candidate-no{color:#07c160;font-weight:500;min-width:120px;flex-shrink:0}.contract-candidate-title{color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.contract-candidate-pager{display:flex;align-items:center;justify-content:space-between;font-size:13px;color:#666}.ms-selector{display:flex;flex-direction:column;gap:10px}.ms-selected-tags{display:flex;flex-wrap:wrap;gap:8px;min-height:28px;align-items:center}.ms-tag{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;background:#e6f7ed;color:#07a35a;border:1px solid #b7ebcd;border-radius:4px;font-size:13px;line-height:1}.ms-tag button{background:transparent;border:none;color:#07a35a;cursor:pointer;font-size:16px;line-height:1;padding:0 2px}.ms-candidate-list{border:1px solid #e5e7eb;border-radius:6px;max-height:220px;overflow-y:auto;background:#fafafa}.ms-candidate-row{display:flex;align-items:center;gap:10px;padding:8px 10px;cursor:pointer;border-bottom:1px solid #f0f0f0;font-size:13px}.ms-candidate-row:last-child{border-bottom:none}.ms-candidate-row:hover,.ms-candidate-row.selected{background:#e6f7ed}.ms-candidate-row input[type=checkbox]{width:16px;height:16px;accent-color:#07c160;flex-shrink:0;cursor:pointer}.ms-candidate-name{color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.badge{display:inline-block;min-width:20px;height:20px;padding:0 6px;background:#e54545;color:#fff;border-radius:10px;font-size:12px;line-height:20px;text-align:center;font-weight:600;vertical-align:middle}.badge-dot{position:absolute;top:-8px;right:-8px}.badge-warn{display:inline-block;padding:1px 7px;background:#fff7e6;color:#d48806;border:1px solid #ffd591;border-radius:4px;font-size:12px;line-height:18px;font-weight:500}.badge-ok{display:inline-block;padding:1px 7px;background:#f6ffed;color:#389e0d;border:1px solid #b7eb8f;border-radius:4px;font-size:12px;line-height:18px;font-weight:500}.badge-danger{display:inline-block;padding:1px 7px;background:#fff1f0;color:#cf1322;border:1px solid #ffa39e;border-radius:4px;font-size:12px;line-height:18px;font-weight:500}.badge-info{display:inline-block;padding:1px 7px;background:#e6f4ff;color:#1677ff;border:1px solid #91caff;border-radius:4px;font-size:12px;line-height:18px;font-weight:500}.field-checkbox-group{display:grid;grid-template-columns:repeat(4,1fr);gap:8px 12px;max-height:240px;overflow-y:auto;padding:4px}.modal-body.wide .field-checkbox-group{flex:1 1 0;min-height:120px;max-height:none;overflow-y:auto}.export-scope{display:flex;gap:24px;margin:4px 0 14px;padding:10px 14px;background:#f6fdf9;border:1px solid #07c16033;border-radius:8px}.export-scope label{display:flex;align-items:center;gap:6px;font-size:13px;color:#333;cursor:pointer}.export-scope label.disabled{color:#aaa;cursor:not-allowed}.export-scope-count{color:#07c160;font-weight:600}.field-checkbox-item{display:flex;align-items:center;gap:6px;font-size:13px;color:#333;cursor:pointer;padding:6px 8px;border-radius:6px;background:#fff;border:1px solid #e5e7eb}.field-checkbox-item:hover{border-color:#07c160}.field-checkbox-item input[type=checkbox]{width:16px;height:16px;accent-color:#07c160;cursor:pointer;flex-shrink:0}.field-checkbox-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal-body h3{margin:0}.modal-body label{display:flex;flex-direction:column;gap:5px;font-size:13px;color:#5a6072;font-weight:500}.form-section{border:1px solid #e8f0ec;border-radius:10px;padding:14px 16px 10px;background:#fafdfb;display:flex;flex-direction:column;gap:12px}.form-section-title{font-size:13px;font-weight:600;color:#07a050;margin-bottom:2px;letter-spacing:.3px}.checkbox-group{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}.checkbox-all,.checkbox-item{display:flex;align-items:center;gap:8px;font-size:13px;color:#333;cursor:pointer;padding:8px 12px;border-radius:8px;background:#fafbfc;border:1px solid #e5e7eb;transition:all .15s ease;-webkit-user-select:none;user-select:none}.checkbox-item:hover{border-color:#07c160;background:#f0faf4}.checkbox-item input[type=checkbox]{width:18px;height:18px;accent-color:#07c160;cursor:pointer;flex-shrink:0}.checkbox-all{grid-column:1 / -1;font-weight:600;padding-bottom:6px;border-bottom:1px solid #e5e7eb}.checkbox-group input[type=checkbox]{width:16px;height:16px;accent-color:#07c160;cursor:pointer}.hint{font-size:13px;color:#666;line-height:1.5;margin:0}.error-list{margin:0;padding-left:18px;font-size:12px;color:#d32f2f;max-height:120px;overflow-y:auto}.error-list li{margin-bottom:4px}.status-tag{display:inline-block;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:500}.status-pending{background:#fff7e6;color:#fa8c16}.status-processing{background:#e6f7ff;color:#1890ff}.status-done{background:#f6ffed;color:#52c41a}.status-failed{background:#fff1f0;color:#f5222d}.info-row{display:flex;justify-content:space-between;align-items:center;padding:10px 0;border-bottom:1px solid #f0f0f0;font-size:14px}.info-row:last-child{border-bottom:none}.info-label{color:#666}.info-value{color:#1f2329;font-weight:500;word-break:break-all;max-width:60%;text-align:right}.dict-split{display:flex;gap:20px;align-items:flex-start}.dict-list{width:240px;background:#fff;border-radius:8px;padding:8px;box-shadow:0 1px 4px #0000000f}.dict-list .item{padding:10px 12px;border-radius:6px;cursor:pointer;font-size:14px}.dict-list .item:hover{background:#f2f9f4}.dict-list .item.active{background:#07c160;color:#fff}.dict-detail{flex:1;background:#fff;border-radius:8px;padding:16px;box-shadow:0 1px 4px #0000000f}.pager{margin-top:12px;display:flex;align-items:center;gap:12px;font-size:13px;color:#666}.filter-bar{display:flex;flex-wrap:wrap;align-items:flex-end;gap:12px;background:#fff;border-radius:8px;padding:14px 16px;margin-bottom:14px;box-shadow:0 1px 4px #0000000f}.filter-bar label{display:flex;flex-direction:column;font-size:12px;color:#666;gap:4px}.filter-bar input,.filter-bar select{padding:7px 10px;border:1px solid #dcdfe6;border-radius:8px;font-size:13px;min-width:140px;height:36px;box-sizing:border-box;background:#fff;color:#333;outline:none;transition:border-color .2s,box-shadow .2s}.filter-bar select{appearance:none;-webkit-appearance:none;-moz-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23999' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 9px center;padding-right:26px;cursor:pointer}.filter-bar select option{padding:7px 12px;font-size:13px}.filter-bar input:focus,.filter-bar select:focus{border-color:#07c160;box-shadow:0 0 0 3px #07c1601a}.filter-bar input::placeholder{color:#999}.filter-bar select:has(option:checked[value=""]){color:#999}.filter-bar.advanced{background:#f6fdf9;border-color:#07c16033}.filter-bar button{padding:7px 16px;height:36px;display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;font-size:13px;border-radius:6px;cursor:pointer;box-sizing:border-box;transition:all .15s}.filter-bar button.primary{background:#07c160;color:#fff;border:none}.filter-bar button.primary:hover{opacity:.9}.filter-bar button.default{background:#fff;color:#555;border:1px solid #dcdfe6}.filter-bar button.default:hover{border-color:#07c160;color:#07c160}.date-range-wrap{display:inline-flex;align-items:center;gap:4px}.date-sep{color:#999;font-size:13px;-webkit-user-select:none;user-select:none}.date-picker-wrap{position:relative;display:inline-block}.calendar-popup{position:absolute;top:calc(100% + 4px);left:0;z-index:1000;width:280px;background:#fff;border:1px solid #e5e7eb;border-radius:8px;box-shadow:0 6px 20px #0000001f;padding:12px;-webkit-user-select:none;user-select:none}.calendar-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:10px;border-bottom:1px solid #f0f0f0;margin-bottom:8px}.calendar-title{font-size:15px;font-weight:600;color:#333}.calendar-nav{cursor:pointer;color:#666;font-size:14px;padding:2px 6px;border-radius:4px;line-height:1;transition:background .15s,color .15s}.calendar-nav:hover{color:#07c160;background:#f0faf5}.calendar-weekdays{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;font-size:12px;color:#999;padding:6px 0 4px}.calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.calendar-cell{width:32px;height:28px;display:flex;align-items:center;justify-content:center;font-size:13px;border-radius:6px;cursor:pointer;border:none;background:transparent;color:#333;transition:all .15s}.calendar-cell:hover:not(.empty):not(.selected){background:#f5f5f5}.calendar-cell.selected{background:#07c160;color:#fff;font-weight:600}.calendar-cell.today:not(.selected){color:#07c160;font-weight:600;border:1px solid #07c16033}.calendar-cell.empty{cursor:default}.bar-chart{background:#fff;border-radius:8px;padding:14px 16px;box-shadow:0 1px 4px #0000000f;margin-bottom:14px}.bar-row{display:flex;align-items:center;gap:10px;margin:6px 0;font-size:13px}.bar-row .bar-label{width:130px;flex-shrink:0;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bar-row .bar-track{flex:1;background:#f0f2f5;border-radius:4px;height:18px;position:relative;overflow:hidden}.bar-row .bar-fill{height:100%;background:linear-gradient(90deg,#07c160,#3ddc84);border-radius:4px}.bar-row .bar-fill.warn{background:linear-gradient(90deg,#ff9f43,#ffbe76)}.bar-row .bar-value{width:120px;flex-shrink:0;text-align:right;color:#07c160;font-variant-numeric:tabular-nums}.perm-modal{max-height:88vh!important}.perm-tree-section{border:1px solid #e5e7eb;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.perm-tree-header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:#f9fafb;border-bottom:1px solid #e5e7eb;flex-shrink:0}.perm-tree-title{font-size:13px;font-weight:600;color:#333}.perm-tree-summary{font-size:12px;color:#666;display:flex;align-items:center;gap:4px}.perm-tree-summary b{color:#07a050}.perm-select-all-label{display:inline-flex;align-items:center;gap:4px;cursor:pointer;font-size:12px;color:#1f6feb;white-space:nowrap}.perm-select-all-label input[type=checkbox]{width:15px;height:15px;accent-color:#07c160;cursor:pointer}.perm-tree-body{max-height:420px;overflow-y:auto;padding:4px 0}.perm-group{border-bottom:1px solid #f0f0f0}.perm-group:last-child{border-bottom:none}.perm-group-header{display:flex;align-items:center;gap:6px;padding:9px 14px;cursor:pointer;-webkit-user-select:none;user-select:none;background:#fff;transition:background .15s}.perm-group-header:hover{background:#f6fdf9}.perm-group-arrow{font-size:10px;color:#999;transition:transform .2s ease;display:inline-block;width:12px;flex-shrink:0}.perm-group-arrow.open{transform:rotate(90deg)}.perm-group-check{width:16px;height:16px;accent-color:#07c160;cursor:pointer;flex-shrink:0}.perm-group-label{font-size:13px;font-weight:600;color:#1f2937;flex:1}.perm-group-count{font-size:11px;color:#999;background:#f0f0f0;padding:1px 7px;border-radius:10px;flex-shrink:0}.perm-items{padding:4px 10px 10px 34px;display:grid;grid-template-columns:repeat(2,1fr);gap:4px 12px}.perm-item{display:flex;align-items:center;gap:6px;font-size:12.5px;color:#444;cursor:pointer;padding:4px 6px;border-radius:5px;transition:background .12s}.perm-item:hover{background:#f0faf5}.perm-item input[type=checkbox]{width:15px;height:15px;accent-color:#07c160;cursor:pointer;flex-shrink:0}.perm-item-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.perm-item-code{font-size:10.5px;color:#aaa;background:#f5f5f5;padding:1px 5px;border-radius:3px;font-family:SFMono-Regular,Menlo,monospace;flex-shrink:0}.scan-modal{width:760px;max-width:94vw;height:88vh;padding:0;overflow:hidden;display:flex;flex-direction:column;resize:both;min-width:480px;min-height:320px}.scan-modal-head{display:flex;align-items:center;gap:12px;padding:16px 24px;border-bottom:1px solid #f0f2f5;flex-shrink:0}.scan-modal-head h3{margin:0;font-size:16px;font-weight:600;color:#1a1a2e}.scan-modal-count{font-size:12px;color:#8a90a2}.scan-modal-close{margin-left:auto;border:none;background:transparent;font-size:22px;line-height:1;color:#8a90a2;cursor:pointer;padding:0 4px}.scan-modal-close:hover{color:#1a1a2e}.scan-modal-canvas{flex:1 1 0;min-height:0;padding:16px 24px;overflow:auto;background:#f7f8fa;display:flex;align-items:flex-start;justify-content:center}.scan-modal-canvas img{max-width:100%;max-height:68vh;object-fit:contain;border-radius:6px;box-shadow:0 2px 12px #0000001f;background:#fff}.scan-modal-error{padding:40px 0;color:#e64340;font-size:13px}.scan-modal-pager{display:flex;gap:8px;margin-right:auto}.scan-modal-link{display:inline-flex;align-items:center;padding:8px 16px;font-size:13px;border-radius:8px;text-decoration:none}.table-scroll{width:100%;max-width:100%;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;padding-bottom:4px;display:block}.table-scroll-wrap{max-width:100%;overflow:hidden}.table-scroll>.grid{border-radius:8px}.contract-grid{min-width:1520px}.contract-grid th,.contract-grid td{white-space:nowrap;vertical-align:middle}.contract-grid th:nth-child(1),.contract-grid td:nth-child(1){width:56px}.contract-grid th:nth-child(2),.contract-grid td:nth-child(2){width:140px}.contract-grid th:nth-child(5),.contract-grid td:nth-child(5){width:90px}.contract-grid th:nth-child(6),.contract-grid td:nth-child(6){width:90px}.contract-grid th:nth-child(7),.contract-grid td:nth-child(7){width:210px}.contract-grid th:nth-child(8),.contract-grid td:nth-child(8){width:100px}.contract-grid th:nth-child(10),.contract-grid td:nth-child(10){width:80px}.contract-grid th:nth-child(11),.contract-grid td:nth-child(11){width:70px}.contract-grid th:nth-child(12),.contract-grid td:nth-child(12){width:70px}.contract-grid th:nth-child(13),.contract-grid td:nth-child(13){width:80px}.contract-grid th:nth-child(15),.contract-grid td:nth-child(15){width:110px}.cell-ellipsis{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cell-ops{white-space:nowrap;min-width:260px}.history-grid{table-layout:fixed;width:100%}.history-grid th:nth-child(1),.history-grid td:nth-child(1){width:8%}.history-grid th:nth-child(2),.history-grid td:nth-child(2){width:12%}.history-grid th:nth-child(3),.history-grid td:nth-child(3){width:12%}.history-grid th:nth-child(4),.history-grid td:nth-child(4){width:14%}.history-grid th:nth-child(6),.history-grid td:nth-child(6){width:22%}.hist-note{word-break:break-word;font-size:.88em}.hist-time{white-space:nowrap;font-size:.85em}.upload-hint{display:block;margin-top:6px;padding:7px 10px;font-size:12.5px;line-height:1.5;color:#ad6800;background:#fffbe6;border:1px solid #ffe58f;border-radius:6px}.modal-actions button:disabled{opacity:.5;cursor:not-allowed}.modal-actions button:disabled:hover{transform:none;box-shadow:none}.site-footer{position:fixed;left:0;right:0;bottom:0;text-align:center;padding:10px 0;font-size:12px;line-height:1.5;color:#ffffffd9;background:transparent;z-index:10;pointer-events:auto}.site-footer a{color:#fff;text-decoration:none}.site-footer a:hover{text-decoration:underline}
