:root{--bg:#f5f7fb;--surface:#fff;--surface-2:#f8fafc;--text:#152238;--muted:#66758c;--line:#dfe5ee;--primary:#2457d6;--primary-dark:#1945b5;--success:#14845c;--danger:#c43d4c;--warning:#a96609;--sidebar:#142039;--shadow:0 12px 32px rgba(26,43,73,.08);--radius:14px}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",Arial,sans-serif;font-size:14px;line-height:1.55}button,input,select,textarea{font:inherit;color:inherit}button,a{ -webkit-tap-highlight-color:transparent}a{color:var(--primary);text-decoration:none}h1,h2,p{margin-top:0}h1{font-size:28px;line-height:1.2;margin-bottom:5px}h2{font-size:20px;line-height:1.3;margin-bottom:5px}.brand{display:inline-flex;align-items:center;gap:11px;color:inherit}.brand-mark{display:grid;place-items:center;width:38px;height:38px;border-radius:10px;background:#2d62dd;color:#fff;font-size:21px;font-weight:800;box-shadow:0 5px 14px rgba(36,87,214,.23)}.brand strong,.brand small{display:block}.brand strong{font-size:18px;letter-spacing:.2px}.brand small{color:var(--muted);font-size:11px}.eyebrow{margin:0 0 4px;color:var(--primary);font-size:11px;font-weight:800;letter-spacing:.12em;text-transform:uppercase}.panel{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:0 3px 14px rgba(24,39,75,.04);padding:22px}.panel-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin-bottom:20px}.panel-heading p:not(.eyebrow){margin:0;color:var(--muted)}.panel-heading.compact{align-items:center}.field{min-width:0}.field label,.scope-field legend,.node-select legend{display:block;margin-bottom:7px;font-weight:700}.field small{display:block;color:var(--muted);font-size:12px;margin-top:5px}input,select,textarea{width:100%;border:1px solid #cbd4e1;border-radius:9px;background:#fff;padding:10px 12px;outline:0;transition:.18s border,.18s box-shadow}input,select{height:43px}textarea{resize:vertical}input:focus,select:focus,textarea:focus,button:focus-visible,a:focus-visible,summary:focus-visible{border-color:var(--primary);box-shadow:0 0 0 3px rgba(36,87,214,.14);outline:none}.form-stack{display:grid;gap:16px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}.form-grid.cols-3{grid-template-columns:repeat(3,1fr)}.field-row{display:flex;gap:14px}.field-row .grow{flex:1}.field-row .port{width:120px}.password-wrap,.suffix-input{position:relative}.password-wrap input{padding-right:68px}.icon-button{position:absolute;right:6px;top:6px;height:31px;border:0;background:var(--surface-2);border-radius:6px;color:var(--primary);font-weight:700;cursor:pointer}.suffix-input input{padding-right:45px}.suffix-input span{position:absolute;right:13px;top:10px;color:var(--muted)}.button{display:inline-flex;align-items:center;justify-content:center;min-height:40px;padding:9px 16px;border:1px solid transparent;border-radius:9px;font-weight:700;cursor:pointer;transition:.18s}.button.primary{background:var(--primary);color:#fff}.button.primary:hover{background:var(--primary-dark)}.button.secondary{border-color:var(--line);background:#fff;color:var(--text)}.button.danger-text{background:#fff;border-color:#eed0d3;color:var(--danger)}.button.large{min-height:47px}.button.small{min-height:34px;padding:6px 10px;font-size:12px}.button:disabled{opacity:.45;cursor:not-allowed}.alert{display:flex;flex-direction:column;gap:2px;padding:13px 15px;border:1px solid;border-radius:10px}.alert-success{color:#096642;background:#edf9f4;border-color:#bfe6d6}.alert-error{color:#9f2637;background:#fff3f4;border-color:#f1c5cb}.alert-info{color:#24518f;background:#f0f6ff;border-color:#c9dcf7}.badge{display:inline-flex;align-items:center;gap:6px;width:max-content;padding:4px 9px;border-radius:999px;font-size:12px;font-weight:700;white-space:nowrap}.badge i{width:6px;height:6px;border-radius:50%;background:currentColor}.badge.success{background:#eaf8f2;color:#0d7953}.badge.warning{background:#fff5e5;color:#97600d}.badge.danger{background:#fff0f1;color:#b62f40}.badge.neutral{background:#edf1f6;color:#5e6b7d}.muted{color:var(--muted)}.mono,code{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.auth-page{min-height:100vh}.install-shell{max-width:1120px;margin:0 auto;padding:32px 24px 50px}.install-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:30px}.secure-label{color:var(--muted);font-weight:700}.steps{display:grid;grid-template-columns:repeat(3,1fr);list-style:none;padding:0;margin:0 0 24px;background:var(--surface);border:1px solid var(--line);border-radius:12px;overflow:hidden}.steps li{position:relative;display:flex;align-items:center;gap:11px;padding:15px 20px}.steps li+li{border-left:1px solid var(--line)}.steps span{display:grid;place-items:center;width:29px;height:29px;border-radius:50%;background:#edf1f6;color:var(--muted);font-weight:800}.steps strong,.steps small{display:block}.steps small{font-size:11px;color:var(--muted)}.steps .current{background:#f4f7ff}.steps .current span{background:var(--primary);color:#fff}.steps .done span{background:#e7f7f0;color:var(--success)}.install-grid{display:grid;grid-template-columns:minmax(0,1.7fr) minmax(280px,.8fr);gap:20px}.install-main{padding:30px}.step-count{color:var(--muted);font-size:12px;white-space:nowrap}.check-list{list-style:none;padding:0;margin:0}.check-list li{display:flex;gap:12px;padding:14px 0;border-bottom:1px solid var(--line)}.check-list li>span{display:grid;place-items:center;width:25px;height:25px;border-radius:50%;background:#e8f8f1;color:var(--success);font-weight:800}.check-list strong,.check-list small{display:block}.check-list small{color:var(--muted)}.help-box{margin-top:20px;padding:15px;background:var(--surface-2);border-radius:10px}.help-box p{color:var(--muted);margin:5px 0 0}.login-shell{display:grid;grid-template-columns:1.1fr minmax(380px,.7fr);min-height:100vh}.login-brand{display:flex;flex-direction:column;justify-content:space-between;padding:8vh 9vw;background:var(--sidebar);color:#fff}.login-brand .brand small{color:#aab7cc}.login-brand .eyebrow{margin-top:12vh;color:#8eafff}.login-brand h1{font-size:46px;line-height:1.23;margin:10px 0 20px}.login-brand p{max-width:580px;color:#b9c4d7;font-size:16px}.feature-list{display:flex;gap:24px;list-style:none;padding:0;margin:40px 0 0;color:#d9e0ed}.feature-list span{color:#66d4aa;margin-right:5px}.login-card{width:min(430px,calc(100% - 40px));align-self:center;justify-self:center;padding:34px;box-shadow:var(--shadow)}.login-title{display:flex;gap:14px;align-items:center;margin-bottom:26px}.login-title h2{font-size:25px}.login-title p{margin:0;color:var(--muted)}.security-note{display:flex;gap:11px;margin-top:20px;padding-top:18px;border-top:1px solid var(--line);color:var(--muted);font-size:12px}.security-note span{color:var(--success);font-weight:800}.security-note p{margin:0}.app-shell{min-height:100vh}.sidebar{position:fixed;inset:0 auto 0 0;width:246px;display:flex;flex-direction:column;background:var(--sidebar);padding:23px 18px;color:#dbe3f0;z-index:20}.sidebar .brand{padding:0 9px 24px}.sidebar .brand small{color:#8fa0ba}.sidebar nav{display:grid;gap:5px}.sidebar nav a{display:flex;align-items:center;gap:11px;padding:10px 12px;border-radius:8px;color:#aebbd0;font-weight:600}.sidebar nav a:hover,.sidebar nav a.active{background:#243451;color:#fff}.sidebar nav a.active{box-shadow:inset 3px 0 #6e94ff}.sidebar nav span{width:18px;text-align:center}.sidebar-foot{margin-top:auto;display:grid;gap:16px;padding:10px}.sidebar-foot>a{color:#aebbd0}.security-mini{padding:12px;background:#1d2c48;border:1px solid #31425f;border-radius:9px}.security-mini strong,.security-mini small{display:block}.security-mini small{margin-top:3px;color:#92a2bb;font-size:11px}.main-content{margin-left:246px;min-width:0}.topbar{position:sticky;top:0;z-index:10;display:flex;align-items:center;justify-content:space-between;height:78px;padding:0 30px;background:rgba(255,255,255,.96);border-bottom:1px solid var(--line)}.topbar h1{font-size:21px}.top-actions{display:flex;align-items:center;gap:16px}.system-state{color:var(--muted);font-size:12px}.system-state i{display:inline-block;width:7px;height:7px;margin-right:6px;border-radius:50%;background:#24a474}.menu-toggle{display:none}.content{display:grid;gap:22px;max-width:1500px;margin:0 auto;padding:26px 30px 40px}.section-title{display:flex;align-items:end;justify-content:space-between;margin-bottom:13px}.section-title h2{margin:0}.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}.stat{display:flex;gap:13px;min-width:0;padding:18px;background:#fff;border:1px solid var(--line);border-radius:12px}.stat-icon{display:grid;place-items:center;flex:0 0 38px;height:38px;border-radius:9px;font-weight:800}.stat-icon.blue{background:#edf3ff;color:#3461ca}.stat-icon.green{background:#eaf8f2;color:#16845c}.stat-icon.amber{background:#fff4e3;color:#a6660a}.stat-icon.violet{background:#f3efff;color:#7051bd}.stat small,.stat strong,.stat p{display:block}.stat strong{font-size:20px;margin:2px 0}.stat p{margin:0;color:var(--muted);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.table-wrap{overflow:auto;margin:0 -22px -22px}.table-wrap table{width:100%;border-collapse:collapse;min-width:800px}th,td{padding:13px 18px;text-align:left;border-top:1px solid var(--line);vertical-align:middle}th{background:var(--surface-2);color:#647188;font-size:11px;letter-spacing:.04em}td strong,td small{display:block}td small{margin-top:3px;color:var(--muted);font-size:11px}.empty{text-align:center;padding:30px;color:var(--muted)}.empty strong{color:var(--text)}.empty p{margin:4px 0 0}.empty.compact{padding:10px;text-align:left}.token-alert{border-color:#efcf8b;background:#fff9eb;color:#694b12;padding:19px}.token-alert p{margin:3px 0 12px}.token-alert dl{margin:0;display:grid;gap:8px}.token-alert dl>div{display:grid;grid-template-columns:90px 1fr;align-items:center}.token-alert dt{font-weight:700}.token-alert dd{display:flex;align-items:center;min-width:0;margin:0}.token-alert code{padding:7px 9px;background:#fff;border:1px solid #e9d8ad;border-radius:6px;word-break:break-all}.copy-button{margin-left:8px;border:1px solid #d8bd7a;background:#fff;border-radius:6px;padding:6px 10px;cursor:pointer}.create-box{margin-bottom:20px;border:1px solid var(--line);border-radius:10px}.create-box summary{cursor:pointer;padding:13px 15px;font-weight:700}.create-box[open] summary{border-bottom:1px solid var(--line)}.create-box form{padding:16px}.scope-field,.node-select{grid-column:1/-1;border:0;padding:0;margin:0}.checks{display:flex;flex-wrap:wrap;gap:9px}.checks label{display:flex;align-items:center;gap:7px;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--surface-2);cursor:pointer}.checks input{width:16px;height:16px;margin:0}.inline-form{display:inline-flex;align-items:end;gap:7px;margin:2px 6px 2px 0}.inline-form label{font-size:10px;color:var(--muted)}.inline-form input{display:block;width:82px;height:34px;padding:5px}.policy-form{display:grid;gap:20px}.switch-row{display:flex;position:relative;align-items:center;justify-content:space-between;padding:14px;background:var(--surface-2);border:1px solid var(--line);border-radius:10px;cursor:pointer}.switch-row strong,.switch-row small{display:block}.switch-row small{color:var(--muted)}.switch-row input{position:absolute;opacity:0}.switch-row i{width:43px;height:24px;padding:3px;border-radius:20px;background:#aab4c3;transition:.2s}.switch-row i:after{content:"";display:block;width:18px;height:18px;border-radius:50%;background:#fff;transition:.2s}.switch-row input:checked+i{background:var(--primary)}.switch-row input:checked+i:after{transform:translateX(19px)}.node-select{padding-top:16px;border-top:1px solid var(--line)}.node-select .checks label{min-width:180px}.node-select .checks small{display:block;color:var(--muted)}.form-actions{display:flex;align-items:center;justify-content:space-between;padding-top:18px;border-top:1px solid var(--line)}.form-actions p{margin:0;color:var(--muted);font-size:12px}footer{text-align:center;color:var(--muted);font-size:11px;padding:5px}
@media(max-width:1100px){.stats{grid-template-columns:1fr 1fr}.login-brand{padding:7vh 5vw}.feature-list{display:grid}.form-grid.cols-3{grid-template-columns:1fr 1fr}}
@media(max-width:760px){h1{font-size:24px}.install-shell{padding:20px 14px}.secure-label{display:none}.steps li{padding:11px 8px}.steps li div{display:none}.steps li{justify-content:center}.install-grid{grid-template-columns:1fr}.install-main{padding:20px}.panel-heading{flex-direction:column}.check-card{order:-1}.login-shell{display:block;padding:24px 0}.login-brand{display:none}.login-card{margin:6vh auto}.sidebar{transform:translateX(-100%);transition:.2s;box-shadow:var(--shadow)}.sidebar.open{transform:none}.main-content{margin-left:0}.topbar{height:69px;padding:0 15px}.menu-toggle{display:block;border:1px solid var(--line);border-radius:8px;background:#fff;padding:7px 10px}.topbar .eyebrow,.system-state{display:none}.top-actions .button{display:none}.content{padding:18px 13px 32px}.stats{grid-template-columns:1fr 1fr}.panel{padding:17px}.table-wrap{margin:0 -17px -17px}.form-grid,.form-grid.cols-3{grid-template-columns:1fr}.token-alert dl>div{grid-template-columns:1fr}.token-alert dd{margin-top:4px}.inline-form{display:flex}.form-actions{align-items:stretch;flex-direction:column;gap:12px}.form-actions .button{width:100%}.section-title .muted{display:none}}
@media(max-width:460px){.stats{grid-template-columns:1fr}.field-row{display:grid}.field-row .port{width:auto}.login-card{padding:23px}.checks{display:grid}.node-select .checks label{min-width:0}.topbar h1{font-size:18px}}
@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important}}

/* 手机端控制台：抽屉导航、触控尺寸、表格卡片化 */
.nav-backdrop,.sidebar-close{display:none}
@media(max-width:760px){
 body.nav-open{overflow:hidden}
 .sidebar{width:min(86vw,320px);padding:20px 16px max(18px,env(safe-area-inset-bottom));overflow-y:auto;overscroll-behavior:contain;z-index:40}
 .sidebar-close{display:grid;place-items:center;position:absolute;right:10px;top:10px;width:40px;height:40px;border:0;border-radius:9px;background:rgba(255,255,255,.08);color:#fff;font-size:25px;line-height:1;cursor:pointer}
 .nav-backdrop{display:block;position:fixed;inset:0;z-index:35;border:0;background:rgba(8,16,31,.55);opacity:0;visibility:hidden;transition:opacity .2s,visibility .2s}
 body.nav-open .nav-backdrop{opacity:1;visibility:visible}
 .sidebar .brand{padding-right:42px}
 .sidebar nav a{min-height:46px;padding:12px}
 .topbar{padding-top:env(safe-area-inset-top);height:calc(69px + env(safe-area-inset-top));gap:11px}
 .menu-toggle{min-width:48px;min-height:44px;font-weight:700}
 .topbar>div:nth-child(2){min-width:0;flex:1}.topbar h1{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
 .content{padding-left:max(13px,env(safe-area-inset-left));padding-right:max(13px,env(safe-area-inset-right));padding-bottom:max(32px,env(safe-area-inset-bottom))}
 .panel-heading{gap:10px;margin-bottom:16px}.panel-heading .badge{align-self:flex-start}
 input,select{height:46px}textarea{min-height:90px}.button{min-height:44px}.button.small{min-height:40px}
 .switch-row{gap:14px}.switch-row>span{min-width:0}.switch-row i{flex:0 0 43px}
 .checks label{min-height:44px}.checks input{flex:0 0 18px;width:18px;height:18px}
 .token-alert dd{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:7px;width:100%}.token-alert code{min-width:0;overflow-wrap:anywhere}.copy-button{min-height:40px;margin-left:0}
 .create-box summary{min-height:46px;padding:13px 14px}.create-box form{padding:14px}
 .inline-form{align-items:end;width:100%;margin:5px 0}.inline-form label{flex:1}.inline-form input{width:100%;height:40px}.inline-form .button{flex:0 0 auto}
 .table-wrap{overflow:visible;margin:0}
 .table-wrap table{display:block;min-width:0}.table-wrap thead{display:none}.table-wrap tbody{display:grid;gap:12px}.table-wrap tr{display:grid;padding:14px;border:1px solid var(--line);border-radius:11px;background:var(--surface-2)}
 .table-wrap td{display:grid;grid-template-columns:110px minmax(0,1fr);align-items:start;gap:8px;padding:8px 0;border:0;border-bottom:1px solid var(--line);overflow-wrap:anywhere}
 .table-wrap td:last-child{border-bottom:0}.table-wrap td:before{color:var(--muted);font-size:12px;font-weight:700}
 #nodes td:nth-child(1):before{content:'节点'}#nodes td:nth-child(2):before{content:'角色'}#nodes td:nth-child(3):before{content:'健康状态'}#nodes td:nth-child(4):before{content:'权重'}#nodes td:nth-child(5):before{content:'负载'}#nodes td:nth-child(6):before{content:'服务能力'}#nodes td:nth-child(7):before{content:'最近心跳'}
 #apps td:nth-child(1):before{content:'应用'}#apps td:nth-child(2):before{content:'权限与网段'}#apps td:nth-child(3):before{content:'状态'}#apps td:nth-child(4):before{content:'调用情况'}#apps td:nth-child(5):before{content:'凭据操作'}
 .table-wrap td[colspan]{display:block;padding:0;border:0}.table-wrap td[colspan]:before{content:none}.empty{padding:22px 12px}
 footer{padding-bottom:env(safe-area-inset-bottom)}
}
@media(max-width:390px){
 .content{padding-top:14px}.stats{gap:10px}.stat{padding:15px}.panel{padding:14px}.panel h2{font-size:18px}
 .table-wrap td{grid-template-columns:92px minmax(0,1fr)}.topbar h1{font-size:17px}
}
