:root{font-family:Inter,"Microsoft YaHei",sans-serif;color:#19322d;background:#f4f6f3;font-size:14px}*{box-sizing:border-box}body{margin:0}button,input,select{font:inherit}button{cursor:pointer;border:0;border-radius:7px;background:#17664f;color:white;padding:11px 16px}button:hover{filter:brightness(.93)}button.secondary{background:#eaf0eb;color:#254e40}button.danger{background:#fff0ec;color:#b14a35;padding:6px 10px}input,select{border:1px solid #d9e2da;border-radius:7px;background:white;padding:11px;width:100%;color:#19322d}label{display:grid;gap:7px;color:#62726b}header{height:78px;background:#fff;border-bottom:1px solid #e1e7df;padding:0 4vw;display:flex;align-items:center;justify-content:space-between}.brand{font-size:21px;font-weight:750;letter-spacing:1px}.brand span{background:#17664f;color:white;padding:7px 10px;border-radius:9px;margin-right:10px}.muted{color:#7a8880;font-size:13px}.layout{display:grid;grid-template-columns:235px 1fr;min-height:calc(100vh - 78px)}aside{padding:30px 20px;background:#fff;border-right:1px solid #e1e7df}aside button{display:block;width:100%;text-align:left;margin:5px 0;background:transparent;color:#52665a}aside button.selected{background:#e9f2eb;color:#17664f;font-weight:700}main{padding:34px 4vw;max-width:1600px;width:100%}h1{font-size:28px;letter-spacing:-.7px;margin:0 0 10px}h2{font-size:17px;margin:0 0 20px}h3{font-size:14px}.heading{display:flex;justify-content:space-between;align-items:center;gap:20px;margin-bottom:27px}.cards{display:grid;grid-template-columns:repeat(4,1fr);gap:17px;margin:24px 0}.card,.panel{background:#fff;border:1px solid #e0e6de;border-radius:11px;padding:22px}.card b{display:block;font-size:27px;margin:14px 0 6px;font-variant-numeric:tabular-nums}.card.primary{background:#17664f;color:#fff}.card.primary .muted{color:#c1dccb}.panel{margin-bottom:20px}.row{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.row>*{flex:1}.row button{flex:0 0 auto}.formgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:15px}.formgrid button{align-self:end}.tablewrap{overflow:auto}table{width:100%;border-collapse:collapse;text-align:left;white-space:nowrap}th{color:#79857d;font-size:12px;font-weight:500;background:#f7f9f5}td,th{padding:15px 12px;border-bottom:1px solid #edf0e9}td{font-variant-numeric:tabular-nums}a{color:#17664f;text-decoration:none}.badge{background:#e7f4eb;color:#267451;padding:5px 9px;border-radius:5px;font-size:12px}.revoked{opacity:.48;text-decoration:line-through}.login{max-width:420px;margin:15vh auto}.login input{margin:20px 0}.empty{padding:35px;color:#79857d;text-align:center}.tabs{display:flex;gap:10px;margin:18px 0}.tabs button{background:#e8eee6;color:#52675a}.tabs .selected{background:#17664f;color:white}#toast{position:fixed;bottom:25px;left:50%;transform:translateX(-50%);background:#263d32;color:white;padding:13px 22px;border-radius:8px;display:none;max-width:90vw}.link{word-break:break-all}.public{max-width:1400px;margin:auto}.note{line-height:1.9;color:#768378;font-size:13px}.operator{display:flex;justify-content:space-between;align-items:center;padding:9px 0;border-bottom:1px solid #eee}@media(max-width:950px){.cards{grid-template-columns:repeat(2,1fr)}.formgrid{grid-template-columns:repeat(2,1fr)}.layout{grid-template-columns:180px 1fr}main{padding:25px 20px}}@media(max-width:600px){.layout{display:block}aside{border-right:0;padding:12px;display:flex;overflow:auto;gap:5px}aside h3,aside .note{display:none}aside button{white-space:nowrap;width:auto}.cards{gap:9px}.card{padding:16px}.card b{font-size:23px}.formgrid{grid-template-columns:1fr}.heading{align-items:start;flex-direction:column}header{padding:0 20px}.login{margin:10vh 20px}.row{align-items:stretch}.row>*{min-width:120px}}
.refresh-button{min-width:112px;display:inline-flex;align-items:center;justify-content:center;gap:7px;white-space:nowrap}button:disabled{cursor:wait;opacity:.7}.refresh-spinner{display:inline-block;width:14px;height:14px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:refresh-spin .7s linear infinite}@keyframes refresh-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.refresh-spinner{animation:none}}
