:root{--green:#4caf50;--green-dark:#43a047;--green-soft:#eafcf0;--ink:#1f2a24;--sub:#6b7c74;--muted:#9aa8a1;--line:#e7ede9;--bg:#f4f7f5;--card:#fff;--warn:#e9a23b;--danger:#e45b5b;--radius:14px;--mono:ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace}*{box-sizing:border-box}html,body{background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,sans-serif;font-size:14px;line-height:1.6}a{color:var(--green-dark);text-decoration:none}.topbar{z-index:10;-webkit-backdrop-filter:saturate(180%)blur(8px);backdrop-filter:saturate(180%)blur(8px);border-bottom:1px solid var(--line);background:#ffffffeb;position:sticky;top:0}.topbar-inner{align-items:center;gap:20px;max-width:940px;height:58px;margin:0 auto;padding:0 20px;display:flex}.brand{letter-spacing:.3px;white-space:nowrap;font-size:16px;font-weight:700}.brand span{color:var(--green)}.nav{flex:1;gap:4px;display:flex}.nav a{color:var(--sub);border-radius:9px;padding:6px 12px;font-weight:500}.nav a:hover,.nav a.active{background:var(--green-soft);color:var(--green-dark)}.topbar-right{align-items:center;gap:8px;display:flex}.topbar-user{color:var(--sub);white-space:nowrap;font-size:13px}.btn-sm{border-radius:9px;padding:5px 11px;font-size:13px}.wrap{max-width:940px;margin:0 auto;padding:22px 20px 96px}.page-title{margin:4px 0 2px;font-size:20px;font-weight:700}.page-sub{color:var(--sub);margin:0 0 18px}.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);margin-bottom:16px;padding:18px 20px}.card>h2{margin:0 0 2px;font-size:15px;font-weight:700}.card>.card-desc{color:var(--sub);margin:0 0 14px;font-size:13px}.field{grid-template-columns:190px 1fr;align-items:start;gap:12px;padding:10px 0;display:grid}.field+.field{border-top:1px dashed var(--line)}.field>label{color:var(--sub);padding-top:8px;font-weight:500}.field .label-note{color:var(--muted);font-size:12px;font-weight:400;display:block}.field .control{min-width:0}input[type=text],input[type=password],input[type=number]{border:1px solid var(--line);width:100%;color:var(--ink);background:#fcfdfc;border-radius:10px;outline:none;padding:9px 12px;font-family:inherit;font-size:14px;transition:border-color .15s,box-shadow .15s,background .15s}input[type=text]:focus,input[type=password]:focus,input[type=number]:focus{border-color:var(--green);background:#fff;box-shadow:0 0 0 3px #4caf5024}input.dirty{border-color:var(--warn);background:#fffdf7}.mono{font-family:var(--mono);font-size:13px}.hint{color:var(--muted);margin-top:6px;font-size:12px}.hint code{font-family:var(--mono);background:#f2f5f3;border-radius:5px;padding:1px 5px}.inline-btn{color:var(--green-dark);cursor:pointer;background:0 0;border:none;padding:2px 4px;font-size:12px}.inline-btn.danger{color:var(--danger)}.switch{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:9px;padding-top:6px;display:inline-flex}.switch input{appearance:none;cursor:pointer;background:#d9e2dc;border-radius:999px;width:40px;height:22px;margin:0;transition:background .16s;position:relative}.switch input:after{content:"";background:#fff;border-radius:50%;width:18px;height:18px;transition:transform .16s;position:absolute;top:2px;left:2px;box-shadow:0 1px 3px #0003}.switch input:checked{background:var(--green)}.switch input:checked:after{transform:translate(18px)}.btn{border:1px solid var(--line);color:var(--ink);cursor:pointer;background:#fff;border-radius:10px;padding:9px 16px;font-family:inherit;font-size:14px;transition:background .15s,border-color .15s,opacity .15s}.btn:hover{background:#f7faf8}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background:var(--green);border-color:var(--green);color:#fff;font-weight:500}.btn-primary:hover{background:var(--green-dark)}.btn-row{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.pill{color:var(--sub);white-space:nowrap;background:#f1f4f2;border-radius:999px;align-items:center;gap:5px;padding:2px 10px;font-size:12px;font-weight:500;display:inline-flex}.pill.ok{background:var(--green-soft);color:var(--green-dark)}.pill.bad{color:var(--danger);background:#fdeeee}.pill.warn{color:#a9761f;background:#fdf6e8}.kv{grid-template-columns:190px 1fr;gap:12px;padding:9px 0;display:grid}.kv+.kv{border-top:1px dashed var(--line)}.kv>.k{color:var(--sub)}.alert{white-space:pre-wrap;word-break:break-all;border-radius:10px;margin:10px 0 0;padding:10px 14px;font-size:13px}.alert.ok{background:var(--green-soft);color:var(--green-dark)}.alert.bad{color:var(--danger);background:#fdeeee}.alert.warn{color:#8a6216;background:#fdf6e8}.savebar{border-top:1px solid var(--line);-webkit-backdrop-filter:saturate(180%)blur(8px);backdrop-filter:saturate(180%)blur(8px);background:#fffffff2;position:fixed;bottom:0;left:0;right:0}.savebar-inner{align-items:center;gap:12px;max-width:940px;margin:0 auto;padding:12px 20px;display:flex}.savebar .spacer{color:var(--sub);flex:1;font-size:13px}.gate{background:linear-gradient(#d5f2dc 0%,#eef9f1 40%,#f4f7f5 100%);justify-content:center;align-items:center;min-height:100vh;padding:24px;display:flex}.gate-card{border:1px solid var(--line);background:#fff;border-radius:18px;width:100%;max-width:420px;padding:28px 26px;box-shadow:0 12px 32px #1f2a2414}.gate-card h1{margin:0 0 4px;font-size:19px}.gate-card p{color:var(--sub);margin:0 0 18px;font-size:13px}.gate-card input{margin-bottom:12px}.gate-card .btn{width:100%}.gate-foot{color:var(--muted);margin-top:16px;font-size:12px}.empty{color:var(--muted);text-align:center;padding:24px 0}.modal-mask{z-index:50;background:#141c186b;justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}.modal{background:#fff;border-radius:16px;width:100%;max-width:420px;padding:22px 22px 18px;box-shadow:0 18px 48px #1f2a2438}.modal h2{margin:0 0 4px;font-size:16px;font-weight:700}.modal p{color:var(--sub);margin:0 0 14px;font-size:13px}.modal input{margin-bottom:12px}.modal .btn-row{justify-content:flex-end;margin-top:6px}@media (max-width:620px){.field,.kv{grid-template-columns:1fr;gap:4px}.field>label{padding-top:0}.topbar-inner{gap:10px;padding:0 14px}.wrap{padding:16px 14px 100px}}
