:root{--brand: #006c5b;--brand-hover: #005545;--brand-bg: #e5f1ed;--ink-1: #17211f;--ink-2: #596761;--ink-3: #88928e;--line: #dde4e0;--bg-page: #f3f5f1;--bg-card: #FFFFFF;--success: #52C41A;--warning: #FAAD14;--danger: #FF4D4F;--info: #3D7EFF;--sidebar: #17211f}*{margin:0;padding:0;box-sizing:border-box}html,body,#root{height:100%}body{font-family:PingFang SC,Noto Sans SC,Microsoft YaHei,sans-serif;background:var(--bg-page);color:var(--ink-1);font-size:13px;line-height:1.5}.num{font-variant-numeric:tabular-nums;font-feature-settings:"tnum"}.layout{display:flex;min-height:100vh}.sidebar{width:232px;flex:0 0 232px;background:var(--sidebar);color:#ffffffb8;display:flex;flex-direction:column;min-height:100vh;position:sticky;top:0;height:100vh}.logo{padding:21px 20px 19px;display:flex;align-items:center;gap:11px;border-bottom:1px solid rgba(255,255,255,.07)}.logo-mark{width:34px;height:34px;border-radius:10px;background:#d7ee82;display:flex;align-items:center;justify-content:center;color:#17332b;font-size:10px;font-weight:800;letter-spacing:-1px}.logo-text{line-height:1.25}.logo-text b{display:block;color:#fff;font-size:15px;font-weight:600;letter-spacing:.4px}.logo-text span{font-size:9px;color:#ffffff6b;letter-spacing:.75px}.menu{padding:15px 12px;flex:1;overflow-y:auto}.menu-group{font-size:11px;color:#ffffff59;padding:14px 12px 6px}.menu-item{display:flex;align-items:center;gap:10px;padding:10px 12px;margin:3px 0;border-radius:8px;font-size:13px;color:#ffffffb3;cursor:pointer;-webkit-user-select:none;user-select:none}.menu-item .mi-icon{width:15px;height:15px;flex:0 0 15px;opacity:.75;display:inline-flex}.menu-item .mi-icon svg{width:15px;height:15px}.menu-item:hover{background:#ffffff0f;color:#fff}.menu-item.active{background:#d7ee82;color:#17332b;font-weight:700}.menu-item.active .mi-icon{opacity:1}.menu-item .arrow{margin-left:auto;font-size:10px;opacity:.5}.submenu{margin-left:12px;border-left:1px solid rgba(255,255,255,.1);padding-left:4px}.submenu .menu-item{font-size:12.5px;padding:7px 12px;color:#fff9}.submenu .menu-item.active{background:#d7ee821f;color:#d7ee82;font-weight:600}.main{flex:1;min-width:0;display:flex;flex-direction:column}.header{height:64px;background:#ffffffe6;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:20px;padding:0 24px;position:sticky;top:0;z-index:100}.crumb{font-size:13px;color:var(--ink-2);white-space:nowrap;display:flex;align-items:center;gap:7px}.crumb-kicker{font-size:10px;color:var(--brand);font-weight:700;letter-spacing:.8px;text-transform:uppercase;padding-right:8px;border-right:1px solid var(--line)}.crumb i{color:#bac2be;font-style:normal}.crumb b{color:var(--ink-1);font-weight:600}.header-search{flex:1;max-width:360px;margin-left:auto;position:relative}.header-search input{width:100%;height:34px;border:1px solid transparent;border-radius:18px;padding:0 12px 0 32px;font-size:12.5px;color:var(--ink-1);background:var(--bg-page);outline:none;font-family:inherit}.header-search input::placeholder{color:var(--ink-3)}.header-search input:focus{border-color:var(--brand);background:#fff}.header-search .s-icon{position:absolute;left:10px;top:8px;color:var(--ink-3)}.bell{position:relative;width:32px;height:32px;border-radius:6px;display:flex;align-items:center;justify-content:center;cursor:pointer}.bell:hover{background:var(--bg-page)}.bell .badge{position:absolute;top:2px;right:-2px;min-width:16px;height:16px;padding:0 4px;background:var(--danger);color:#fff;border-radius:8px;font-size:10px;line-height:16px;text-align:center;font-weight:600}.header-user{display:flex;align-items:center;gap:8px;cursor:pointer}.avatar{width:30px;height:30px;border-radius:50%;background:var(--brand-bg);color:var(--brand);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600}.header-user span{font-size:13px;color:var(--ink-2)}.header-live{color:var(--brand);background:var(--brand-bg);padding:5px 9px;border-radius:20px;font-size:11px;white-space:nowrap}.header-live svg{margin-right:5px;color:#83a20d}.content{padding:24px 28px 36px;display:flex;flex-direction:column;gap:18px;max-width:1780px;width:100%;margin:0 auto}.card{background:var(--bg-card);border-radius:12px;border:1px solid rgba(221,228,224,.82);box-shadow:0 3px 12px #1b2b2509}.card-head{display:flex;align-items:center;padding:16px 20px 0}.card-title{font-size:15px;font-weight:600;color:var(--ink-1)}.card-sub{font-size:12px;color:var(--ink-3);margin-left:10px}.card-more{margin-left:auto;font-size:12px;color:var(--ink-3);cursor:pointer}.card-more:hover{color:var(--brand)}.card-body{padding:16px 20px 20px}.page-head{display:flex;align-items:flex-end}.page-title{font-size:20px;font-weight:600}.page-desc{font-size:12.5px;color:var(--ink-3);margin-top:4px}.page-actions{margin-left:auto;display:flex;gap:10px}.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}.kpi{padding:18px 20px;min-height:125px;position:relative;overflow:hidden}.kpi:before{content:"";position:absolute;left:0;top:20px;width:3px;height:31px;background:var(--brand);border-radius:0 3px 3px 0}.kpi-attention:before{background:var(--warning)}.kpi-attention:last-child:before{background:var(--danger)}.kpi .label{font-size:12.5px;color:var(--ink-2);display:flex;align-items:center;gap:6px}.kpi .value{font-size:26px;font-weight:600;margin-top:8px;letter-spacing:-.3px}.kpi .value.danger{color:var(--danger)}.kpi .foot{font-size:12px;color:var(--ink-3);margin-top:8px;display:flex;gap:12px}.kpi .foot .warn{color:var(--danger)}.kpi-mini{padding:14px 20px;display:flex;align-items:center;gap:14px}.kpi-mini .icon{width:38px;height:38px;border-radius:8px;background:var(--brand-bg);color:var(--brand);display:flex;align-items:center;justify-content:center;flex:0 0 38px}.kpi-mini .icon.warn{background:#e8a13d24;color:#b97a1e}.kpi-mini .icon.danger{background:#d549411a;color:var(--danger)}.kpi-mini .label{font-size:12px;color:var(--ink-2)}.kpi-mini .value{font-size:20px;font-weight:600;margin-top:2px}.kpi-mini .value.warn{color:var(--warning)}.kpi-mini .value.danger{color:var(--danger)}.cols{display:flex;gap:16px;align-items:flex-start}.col-main{flex:2;min-width:0;display:flex;flex-direction:column;gap:16px}.col-side{flex:1;min-width:300px;display:flex;flex-direction:column;gap:16px}.alert-count{margin-left:10px;background:var(--danger);color:#fff;font-size:12px;font-weight:600;border-radius:10px;padding:1px 9px}.title-warning{color:var(--warning);font-size:14px;margin-right:8px}.dashboard-hero{min-height:194px;background:#19312b;border-radius:14px;color:#fff;display:flex;align-items:stretch;overflow:hidden;position:relative;box-shadow:0 10px 25px #152f2826}.dashboard-hero:after{content:"";position:absolute;width:480px;height:480px;border:1px solid rgba(215,238,130,.18);border-radius:50%;right:-220px;top:-275px;box-shadow:0 0 0 56px #d7ee820a,0 0 0 112px #d7ee8206}.hero-copy{padding:27px 30px 26px;flex:1;min-width:0;position:relative;z-index:1}.hero-eyebrow{color:#d7ee82;font-size:10px;font-weight:700;letter-spacing:1.2px;display:flex;align-items:center;gap:8px}.hero-eyebrow span{width:20px;height:2px;background:#d7ee82}.hero-copy h1{font-size:28px;letter-spacing:-.9px;margin:9px 0 4px;line-height:1.3;font-weight:600}.hero-copy h1 em{font-style:normal;color:#d7ee82}.hero-copy p{font-size:12.5px;color:#ffffff9e}.hero-actions{display:flex;align-items:center;gap:9px;margin-top:17px}.hero-actions .ant-btn-primary{background:#d7ee82;color:#17332b;border-color:#d7ee82;font-weight:600;box-shadow:none}.hero-actions .ant-btn-default{background:transparent;color:#fff;border-color:#ffffff47}.hero-link{background:none;border:0;color:#d7ee82;cursor:pointer;font:inherit;font-size:12px;padding:5px}.hero-link svg{margin-left:4px}.hero-risk-panel{width:330px;padding:24px 28px;background:#0000001f;border-left:1px solid rgba(255,255,255,.09);position:relative;z-index:1}.risk-panel-top{display:flex;justify-content:space-between;align-items:center;color:#ffffffb8;font-size:11px}.risk-panel-top svg{color:#d7ee82;margin-right:5px}.date-chip{font-size:10px;color:#d7ee82;border:1px solid rgba(215,238,130,.3);border-radius:12px;padding:2px 7px}.risk-score{display:flex;align-items:baseline;gap:10px;margin:12px 0 11px}.risk-score strong{font-size:40px;line-height:1;color:#fff}.risk-score span{font-size:12px;color:#ffffff8c}.risk-bars>div{display:grid;grid-template-columns:74px 22px 1fr;gap:8px;align-items:center;margin:6px 0;font-size:11px;color:#ffffffa3}.risk-bars b{color:#fff;text-align:right}.risk-bars i{display:block;height:4px;background:#ffffff1f;border-radius:9px;overflow:hidden}.risk-bars u{height:100%;display:block;background:#f06d64;border-radius:inherit;text-decoration:none;min-width:2px}.risk-bars u.amber{background:#e9b85c}.risk-bars u.blue{background:#86aaa1}.alert-group{font-size:12px;font-weight:600;color:var(--ink-2);padding:12px 0 6px;display:flex;align-items:center;gap:8px}.alert-group .g-count{font-weight:400;color:var(--ink-3)}.alert-group:after{content:"";flex:1;height:1px;background:var(--line)}.alert-item{display:flex;align-items:center;gap:12px;padding:10px 8px;border-radius:6px;cursor:pointer}.alert-item:hover{background:var(--bg-page)}.alert-tag{flex:0 0 auto;font-size:11px;font-weight:500;border-radius:4px;padding:2px 7px;line-height:16px}.alert-tag.danger{background:#d549411a;color:var(--danger)}.alert-tag.warning{background:#e8a13d1f;color:#b97a1e}.alert-tag.info{background:#3d7eff1a;color:var(--info)}.alert-body{flex:1;min-width:0}.alert-title{font-size:13px;color:var(--ink-1);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.alert-title .type{color:var(--ink-3);font-size:12px;margin-right:8px}.alert-desc{font-size:12px;color:var(--ink-3);margin-top:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.alert-amount{flex:0 0 110px;text-align:right;font-size:13px;font-weight:500}.alert-amount.none{color:var(--ink-3);font-weight:400}.alert-footer{padding:12px 0 0;text-align:center;border-top:1px solid var(--line);margin-top:10px}.alert-footer a{font-size:12.5px;color:var(--brand);text-decoration:none}.stat-rows{display:flex;flex-direction:column}.stat-row{display:flex;align-items:baseline;padding:7px 0;border-bottom:1px dashed var(--line)}.stat-row:last-child{border-bottom:none}.stat-row .k{font-size:12.5px;color:var(--ink-2)}.stat-row .v{margin-left:auto;font-size:14px;font-weight:600}.stat-row .v small{font-size:11px;color:var(--ink-3);font-weight:400;margin-left:4px}.stat-row .v.danger{color:var(--danger)}.donut-wrap{display:flex;align-items:center;gap:20px;margin-top:12px}.donut-legend{display:flex;flex-direction:column;gap:10px;font-size:12.5px}.donut-legend .li{display:flex;align-items:center;gap:8px;color:var(--ink-2)}.dot{width:8px;height:8px;border-radius:2px;flex:0 0 8px;display:inline-block}.donut-legend .li b{margin-left:auto;padding-left:16px;color:var(--ink-1)}.health-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}.health-cell{border:1px solid var(--line);border-radius:6px;padding:10px 12px}.health-cell .hk{font-size:12px;color:var(--ink-2);display:flex;align-items:center;gap:6px}.health-cell .hv{font-size:20px;font-weight:600;margin-top:4px}.exp-badge{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;white-space:nowrap}.exp-badge .d{width:8px;height:8px;border-radius:50%;flex:0 0 8px}.exp-badge.exp-ok{color:var(--success)}.exp-badge.exp-ok .d{background:var(--success)}.exp-badge.exp-near{color:#b97a1e}.exp-badge.exp-near .d{background:var(--warning)}.exp-badge.exp-urgent{color:var(--danger);font-weight:500}.exp-badge.exp-urgent .d{background:var(--danger)}.exp-badge.exp-out{color:var(--ink-1);font-weight:500}.exp-badge.exp-out .d{background:var(--ink-1)}.exp-badge .exp-days{color:var(--ink-3);font-size:11.5px;margin-left:2px}.hint{display:flex;align-items:center;gap:8px;margin:0 20px;background:#e8a13d1a;border:1px solid rgba(232,161,61,.3);color:#8a5a12;font-size:12.5px;border-radius:6px;padding:8px 12px}.hint .legend-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin:0 2px 0 8px;vertical-align:1px}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;color:var(--ink-2)}.cold-tag{font-size:10px;color:var(--info);background:#3d7eff1a;border-radius:3px;padding:1px 5px;font-weight:500;white-space:nowrap}.p-name{font-weight:500;color:var(--ink-1);display:flex;align-items:center;gap:6px}.p-sub{font-size:11.5px;color:var(--ink-3);margin-top:2px}.row-danger{background:#fff1f0}.supplier-expired-row td:first-child{box-shadow:inset 3px 0 0 var(--danger)}.cert-expiry{display:inline-flex;align-items:center;gap:5px;font-variant-numeric:tabular-nums}.cert-expiry.warn{color:#d48806;font-weight:600}.cert-expiry.expired{color:var(--danger);font-weight:600}.cert-expiry b{font-size:10px;border-radius:9px;padding:1px 5px;background:#fff7e6;color:#d48806;font-weight:600}.cert-expiry.expired b{background:#fff1f0;color:var(--danger)}.filter-bar{display:flex;gap:12px;padding:16px 20px;align-items:center;flex-wrap:wrap}.filter-bar .f-label{font-size:12.5px;color:var(--ink-2)}.filter-bar .f-count{margin-left:auto;font-size:12px;color:var(--ink-3)}.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;background:#eef5f3;padding:16px}.login-card2{width:min(960px,100%);min-height:600px;display:flex;border-radius:24px;overflow:hidden;background:#fff;box-shadow:0 24px 60px #1a233224}.login-brand2{width:50%;position:relative;display:flex;flex-direction:column;justify-content:space-between;padding:48px;background:linear-gradient(150deg,#e6f4f1,#f4faf8 60%,#fff);overflow:hidden}.login-brand2:before{content:"";position:absolute;width:380px;height:380px;border-radius:50%;background:radial-gradient(circle,rgba(14,124,107,.16),transparent 70%);right:-120px;top:-100px}.login-brand2:after{content:"";position:absolute;width:300px;height:300px;border-radius:50%;background:radial-gradient(circle,rgba(14,124,107,.12),transparent 70%);left:-100px;bottom:-90px}.login-brand2 .lb-bg{position:absolute;top:0;right:0;bottom:0;left:0;background-size:cover;background-position:center}.login-brand2 .lb-veil{position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(150deg,#e6f4f1e6,#f0f8f6d6 55%,#ffffffc2)}.login-brand2 .lb-top{position:relative;z-index:1;display:flex;align-items:center;gap:12px}.login-brand2 .lb-logo{width:44px;height:44px;border-radius:12px;background:var(--brand);display:flex;align-items:center;justify-content:center;color:#fff;font-size:20px;font-weight:600;box-shadow:0 6px 16px #0e7c6b4d}.login-brand2 .lb-name{font-size:20px;font-weight:700;color:var(--ink-1);letter-spacing:.5px}.login-brand2 .lb-mid{position:relative;z-index:1}.login-brand2 .lb-mid h2{font-size:32px;font-weight:700;line-height:1.4;color:var(--ink-1)}.login-brand2 .lb-mid p{margin-top:16px;font-size:14.5px;line-height:1.9;color:var(--ink-2);max-width:380px}.login-brand2 .lb-foot{position:relative;z-index:1;font-size:12px;color:var(--ink-3)}.login-form2{width:50%;padding:48px;display:flex;flex-direction:column;justify-content:center}.login-form2 .lf-inner{max-width:340px;margin:0 auto;width:100%}.login-form2 h1{font-size:24px;font-weight:700;color:var(--ink-1)}.login-form2 .lf-sub{color:var(--ink-3);font-size:13px;margin:8px 0 28px}.login-form2 .lf-label{display:block;font-size:13px;font-weight:500;color:var(--ink-2);margin:0 0 6px}.login-form2 .lf-field{margin-bottom:18px}.login-error{display:flex;align-items:center;gap:8px;padding:10px 12px;margin-bottom:18px;background:#d5494112;color:var(--danger);font-size:12.5px;border-radius:10px}.login-error:before{content:"";width:6px;height:6px;border-radius:50%;background:var(--danger);flex:0 0 6px}.login-form2 .lf-foot{margin-top:26px;text-align:center;font-size:12.5px;color:var(--ink-3)}@media (max-width: 900px){.login-brand2{display:none}.login-form2{width:100%}}.captcha{width:320px;-webkit-user-select:none;user-select:none;margin:0 auto}.captcha-box{position:relative;width:100%;background:#fff;border-radius:12px;border:1px solid var(--line);box-shadow:0 4px 16px #1a23321a;overflow:hidden}.captcha-head{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid var(--line);background:#fafbfc}.captcha-title{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:500;color:var(--ink-2)}.captcha-icon-btn{padding:5px;border-radius:50%;color:var(--ink-3);cursor:pointer;border:none;background:transparent;display:inline-flex;font-size:14px;line-height:1}.captcha-icon-btn:hover{background:var(--line);color:var(--ink-1)}.captcha-spin{animation:captcha-rotate .8s linear infinite}@keyframes captcha-rotate{to{transform:rotate(360deg)}}.captcha-canvas-wrap{position:relative;width:100%;height:160px;background:#f0f1f3}.captcha-loading{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;background:#f0f1f3;z-index:20}.captcha-spinner{width:24px;height:24px;border:2px solid var(--brand);border-top-color:transparent;border-radius:50%;animation:captcha-rotate .8s linear infinite}.captcha-result{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;background:#ffffffd9;z-index:20}.captcha-result-inner{display:flex;flex-direction:column;align-items:center}.captcha-result-icon{width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;margin-bottom:8px;font-size:20px}.captcha-result-icon.ok{background:#2ba47126;color:var(--success)}.captcha-result-icon.err{background:#d549411f;color:var(--danger)}.captcha-result-text{font-size:13px;font-weight:600}.captcha-result-text.ok{color:var(--success)}.captcha-result-text.err{color:var(--danger)}.captcha-slider{padding:8px;background:#fff}.captcha-track{position:relative;height:40px;background:#f0f1f3;border-radius:999px;cursor:pointer;touch-action:none}.captcha-track-text{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;font-size:12px;color:var(--ink-3);transition:opacity .3s}.captcha-progress{position:absolute;left:0;top:0;height:100%;border-radius:999px;background:var(--brand-bg)}.captcha-progress.ok{background:#2ba4712e}.captcha-progress.err{background:#d5494124}.captcha-handle{position:absolute;top:0;height:40px;width:40px;background:#fff;border-radius:50%;box-shadow:0 1px 4px #0003;border:1px solid var(--line);display:flex;align-items:center;justify-content:center;cursor:grab;touch-action:none;color:var(--ink-2);font-size:15px}.captcha-handle:active{cursor:grabbing}.captcha-handle.ok{border-color:var(--success);color:var(--success)}.captcha-handle.err{border-color:var(--danger);color:var(--danger)}.captcha-modal-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;display:flex;align-items:center;justify-content:center;background:#00000080;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.captcha-modal{background:#fff;padding:24px;border-radius:16px;box-shadow:0 24px 60px #1a233233;width:100%;max-width:368px;margin:0 16px}.captcha-modal-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.captcha-modal-head h3{font-size:16px;font-weight:600;color:var(--ink-1)}.captcha-modal-close{border:none;background:transparent;cursor:pointer;color:var(--ink-3);font-size:15px;padding:4px;display:inline-flex}.captcha-modal-close:hover{color:var(--ink-1)}.captcha-modal-tip{margin-top:14px;text-align:center;font-size:12px;color:var(--ink-3)}@media (max-width: 1180px){.sidebar{width:206px;flex-basis:206px}.dashboard-hero{min-height:208px}.hero-risk-panel{width:292px;padding-left:20px;padding-right:20px}.cols{flex-direction:column}.col-main,.col-side{width:100%}.col-side{display:grid;grid-template-columns:repeat(3,1fr)}.col-side .card:last-child{grid-column:span 3}}@media (max-width: 880px){.sidebar{width:62px;flex-basis:62px}.logo{padding:18px 14px;justify-content:center}.logo-text,.menu-item:not(.submenu .menu-item)>:not(.mi-icon),.menu-item .arrow,.submenu{display:none}.menu{padding:12px 8px}.menu-item{justify-content:center;padding:11px}.menu-item .mi-icon{width:18px;height:18px}.menu-item .mi-icon svg{width:18px;height:18px}.header{padding:0 18px;gap:12px}.crumb-kicker,.header-live{display:none}.content{padding:18px}.dashboard-hero{display:block}.hero-risk-panel{width:100%;border-left:0;border-top:1px solid rgba(255,255,255,.09)}.risk-bars>div{max-width:350px}.kpis{grid-template-columns:repeat(2,1fr)}.col-side{grid-template-columns:1fr}.col-side .card:last-child{grid-column:auto}}@media (max-width: 600px){.header-search,.header-user span,.header-user svg{display:none}.header{justify-content:space-between}.content{padding:12px}.hero-copy{padding:22px 20px}.hero-copy h1{font-size:23px}.hero-actions{flex-wrap:wrap}.kpis{grid-template-columns:1fr}.page-head{align-items:flex-start;gap:12px;flex-direction:column}.page-actions{margin-left:0}.filter-bar{padding:14px}.card-head,.card-body{padding-left:16px;padding-right:16px}}
