:root{--ink:#172033;--muted:#718096;--line:#dce4ef;--paper:#f4f7fb;--card:#fff;--blue:#2b5cff;--violet:#6d43e8;--green:#079669;--amber:#c17814;--red:#d14b59;--shadow:0 18px 50px rgba(27,49,87,.08)}
*{box-sizing:border-box}body{margin:0;background:var(--paper);color:var(--ink);font:14px/1.55 Inter,ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif}button,input,textarea,select{font:inherit}button{cursor:pointer;border:0}button:focus-visible,input:focus-visible,textarea:focus-visible,select:focus-visible{outline:3px solid rgba(43,92,255,.2);outline-offset:2px}.hidden{display:none!important}.muted{color:var(--muted)}.eyebrow{margin:0 0 8px;color:#7180a0;font-size:11px;letter-spacing:.15em;font-weight:800}.error{color:var(--red)}
.login-shell{min-height:100vh;display:grid;place-items:center;padding:24px;background:radial-gradient(circle at 20% 10%,#e7e9ff 0,#f4f7fb 42%,#eef5f5 100%)}.login-card{width:min(430px,100%);padding:42px;background:rgba(255,255,255,.9);border:1px solid #fff;border-radius:28px;box-shadow:var(--shadow)}.brand-mark{display:grid;place-items:center;width:48px;height:48px;border-radius:15px;background:var(--ink);color:#fff;font-size:24px;font-weight:900;box-shadow:8px 8px 0 #b7c5ff}.brand-mark.small{width:34px;height:34px;border-radius:10px;font-size:17px;box-shadow:none;background:var(--violet)}h1,h2,h3,p{margin-top:0}.login-card h1{font-size:36px;line-height:1.1;margin:18px 0 10px;letter-spacing:-.04em}.login-card form{display:grid;gap:16px;margin-top:28px}
label{display:grid;gap:7px;color:#43516a;font-size:12px;font-weight:750}input,textarea,select{width:100%;border:1px solid var(--line);border-radius:10px;background:#fff;color:var(--ink);padding:11px 12px;min-height:42px}textarea{resize:vertical}.primary,.secondary,.link-button{border-radius:10px;padding:11px 16px;font-weight:800}.primary{background:var(--ink);color:#fff;box-shadow:0 8px 16px rgba(23,32,51,.12)}.primary:hover{background:#2a3750}.secondary{background:#fff;border:1px solid var(--line);color:var(--ink)}.secondary:hover{border-color:#9eacd1}.wide{width:100%;margin-top:8px}
.app-shell{min-height:100vh;display:grid;grid-template-columns:238px 1fr}.sidebar{position:sticky;top:0;height:100vh;background:#101622;color:#cbd4e5;padding:26px 18px;display:flex;flex-direction:column}.brand-row{display:flex;align-items:center;gap:11px;color:#fff}.brand-row strong,.brand-row span{display:block}.brand-row span{color:#8792a7;font-size:11px;margin-top:2px}.sidebar nav{display:grid;gap:7px;margin-top:58px}.nav-item{background:transparent;color:#94a0b7;text-align:left;border-radius:10px;padding:12px 13px;font-weight:750}.nav-item.active,.nav-item:hover{background:#202938;color:#fff}.sidebar-foot{display:grid;gap:5px;margin-top:auto;border-top:1px solid #273244;padding:18px 5px 0}.sidebar-foot span{color:#9bace5;font-size:10px;letter-spacing:.12em}.sidebar-foot strong{color:#fff}.link-button{padding:0;background:none;color:#abb8d0;text-align:left;font-size:12px}.content{min-width:0;padding:34px clamp(22px,4vw,64px) 64px}.topbar{display:flex;align-items:center;justify-content:space-between;margin-bottom:28px}.topbar h2{font-size:25px;letter-spacing:-.03em;margin:0}.top-actions{display:flex;gap:9px}.hero-panel{display:flex;align-items:end;justify-content:space-between;gap:20px;padding:32px;border-radius:22px;background:linear-gradient(115deg,#202c45 0%,#334c72 72%,#5142a3 100%);color:#fff;box-shadow:var(--shadow);margin-bottom:18px}.hero-panel h1{font-size:clamp(26px,3vw,42px);line-height:1.05;max-width:680px;letter-spacing:-.045em;margin:3px 0 11px}.hero-panel p{color:#cad8f0;margin:0}.hero-panel .primary{background:#fff;color:#1c2940;white-space:nowrap}.stat-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin-bottom:18px}.stat-card{padding:19px 20px;background:var(--card);border:1px solid var(--line);border-radius:16px;box-shadow:0 7px 20px rgba(41,65,112,.04);position:relative;overflow:hidden}.stat-card:after{content:"";position:absolute;right:-22px;top:-22px;width:70px;height:70px;border-radius:50%;background:currentColor;opacity:.08}.stat-card span{display:block;color:var(--muted);font-size:12px;font-weight:750}.stat-card strong{display:block;font-size:31px;line-height:1.2;margin-top:8px}.stat-card.blue{color:var(--blue)}.stat-card.green{color:var(--green)}.stat-card.violet{color:var(--violet)}.stat-card.amber{color:var(--amber)}
.panel{background:var(--card);border:1px solid var(--line);border-radius:18px;box-shadow:0 7px 20px rgba(41,65,112,.04);overflow:hidden}.panel-heading{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:21px 22px;border-bottom:1px solid #edf1f6}.panel-heading h3{margin:0;font-size:16px}.panel-heading .hint{color:var(--muted);font-size:12px}.panel-heading select{max-width:240px}.channel-filters{display:grid;grid-template-columns:minmax(220px,2fr) repeat(2,minmax(145px,1fr)) minmax(190px,1.4fr) auto;align-items:end;gap:12px;padding:16px 22px;border-bottom:1px solid #edf1f6;background:#fbfcff}.channel-filters label{min-width:0}.channel-filters .secondary{height:42px;white-space:nowrap}.table-wrap{overflow:auto}table{width:100%;border-collapse:collapse;min-width:930px}th,td{text-align:left;padding:15px 18px;border-bottom:1px solid #edf1f6;vertical-align:middle}th{color:#8190aa;font-size:11px;letter-spacing:.06em;font-weight:850;white-space:nowrap}td strong{display:block;font-size:13px}td small{display:block;color:#8a96ab;font-size:11px;margin-top:3px;max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}code{color:#4b5f82;font-size:12px}.type-pill,.status{display:inline-block;padding:3px 8px;border-radius:999px;font-size:11px;font-weight:800}.type-pill{background:#eef1ff;color:#4c57bd}.status.success{background:#e4f8f0;color:#057e5a}.status.failed{background:#fff0f0;color:#ba4052}.status.submitting{background:#fff6df;color:#a76b08}.error-text{color:var(--red)!important}.icon-button{width:29px;height:29px;border-radius:8px;background:#fff1f2;color:var(--red);font-size:20px;line-height:1}.empty{text-align:center;color:var(--muted);padding:40px}.section-intro{margin:8px 0 24px}.section-intro h1{font-size:34px;letter-spacing:-.04em;margin:0 0 8px}.section-intro p{color:var(--muted);margin:0}.form-layout{display:grid;gap:16px}.form-panel{padding-bottom:22px}.field-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:17px;padding:22px}.field-grid.four{grid-template-columns:repeat(4,minmax(0,1fr));padding-bottom:0}.span-2{grid-column:span 2}.checkbox{display:flex;align-items:center;gap:9px;padding-top:27px}.checkbox input{width:17px;min-height:17px}.name-preview{margin:19px 22px 0;padding:14px 16px;border-radius:12px;background:#f0f3ff;display:flex;justify-content:space-between;align-items:center;gap:20px}.name-preview span{font-size:12px;color:#6574a1}.name-preview strong{color:#3545b3;font-size:16px}.form-actions{display:flex;justify-content:flex-end;gap:10px}.notice{margin:16px 0 0;padding:13px 16px;border-radius:10px}.notice.success{background:#e4f8f0;color:#057e5a}.notice.error{background:#fff0f0;color:#ba4052}.compact{padding-bottom:20px;margin-top:18px}.compact h3{padding:20px 22px 0}.mini-button{padding:7px 10px;border:1px solid var(--line);background:#fff;border-radius:8px;font-size:12px}.mini-button:hover{border-color:#8798cd}.toast{position:fixed;right:22px;bottom:22px;padding:13px 17px;border-radius:10px;background:#172033;color:#fff;box-shadow:var(--shadow);z-index:3}.toast.error{background:#a73648}.toast.success{background:#087d5f}dialog{border:0;border-radius:18px;padding:28px;max-width:min(700px,calc(100vw - 32px));box-shadow:0 20px 80px rgba(0,0,0,.25)}dialog::backdrop{background:rgba(10,16,28,.55)}dialog pre{background:#101622;color:#d9e4ff;padding:18px;border-radius:12px;overflow:auto;font-size:12px}.dialog-close{position:absolute;right:17px;top:13px;background:none;font-size:25px;color:#78859b}
@media(max-width:900px){.app-shell{grid-template-columns:1fr}.sidebar{position:static;height:auto;padding:17px 18px}.sidebar nav{display:flex;margin-top:18px;overflow:auto}.sidebar-foot{display:flex;align-items:center;gap:9px;margin-top:15px}.sidebar-foot .link-button{margin-left:auto}.content{padding:25px 18px 45px}.stat-grid{grid-template-columns:repeat(2,1fr)}.hero-panel{align-items:flex-start;flex-direction:column}.field-grid.four{grid-template-columns:repeat(2,1fr)}.channel-filters{grid-template-columns:repeat(2,minmax(0,1fr))}.channel-filters label:first-child{grid-column:1/-1}.channel-filters .secondary{width:100%}}@media(max-width:560px){.topbar{align-items:flex-start;gap:15px;flex-direction:column}.top-actions{width:100%}.top-actions button{flex:1}.hero-panel{padding:24px}.section-intro h1{font-size:29px}.field-grid,.field-grid.four{grid-template-columns:1fr;padding:18px}.span-2{grid-column:auto}.name-preview{margin:17px 18px 0;align-items:flex-start;flex-direction:column;gap:6px}.form-actions{flex-direction:column-reverse}.form-actions button{width:100%}.stat-card strong{font-size:25px}.channel-filters{grid-template-columns:1fr;padding:14px 18px}}
.model-picker{display:grid;gap:9px}
.model-picker-head{display:flex;align-items:center;justify-content:space-between;gap:12px}.model-picker-head label{display:block}.model-picker>input[type=search]{background:#f8faff;border-color:#cfd9eb}.model-options{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:8px;max-height:220px;overflow:auto;padding:10px;border:1px solid var(--line);border-radius:12px;background:#f8faff}.model-option{display:flex;align-items:center;gap:9px;min-width:0;padding:9px 10px;border:1px solid #e1e7f1;border-radius:9px;background:#fff;color:#43516a;font-size:12px;cursor:pointer;transition:border-color .15s,background .15s,box-shadow .15s}.model-option:hover{border-color:#a8b8e8;background:#fbfcff}.model-option:has(input:checked){border-color:#8498e3;background:#eef2ff;box-shadow:0 3px 8px rgba(73,91,173,.08);color:#3545b3}.model-option input{width:16px;min-height:16px;flex:0 0 auto;accent-color:var(--blue)}.model-option span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.model-option em{margin-left:5px;padding:1px 6px;border-radius:999px;border:1px solid #d5ddf5;background:#eef2ff;color:#3545b3;font-size:10px;font-style:normal}.model-empty{grid-column:1/-1;padding:14px;color:var(--muted);text-align:center;font-size:12px}
.mini-button:disabled{opacity:.5;cursor:not-allowed}.user-actions{display:flex;gap:7px;flex-wrap:wrap}
.field-grid > label{align-content:start}
.stat-grid.two{grid-template-columns:repeat(2,minmax(240px,1fr))}
.stat-grid.three{grid-template-columns:repeat(3,minmax(0,1fr))}
.stat-grid.five{grid-template-columns:repeat(5,minmax(0,1fr))}
@media(max-width:900px){.stat-grid.five{grid-template-columns:repeat(2,minmax(0,1fr))}}
.panel:has(.channel-filters){overflow:visible}.channel-filter-field{position:relative;min-width:0}.filter-label{display:block;margin-bottom:7px;color:#43516a;font-size:12px;font-weight:750}.filter-select{display:flex;align-items:center;justify-content:space-between;width:100%;height:42px;padding:11px 12px;border:1px solid var(--line);border-radius:10px;background:#fff;color:var(--ink);text-align:left}.filter-select:hover{border-color:#9eacd1}.filter-select-arrow{font-size:18px;line-height:12px;color:#53627c;transform:translateY(-2px)}.date-range-panel{position:absolute;z-index:20;top:calc(100% + 11px);left:0;width:min(490px,calc(100vw - 44px));padding:15px 14px 12px;border:1px solid var(--line);border-radius:18px;background:#fff;box-shadow:0 16px 38px rgba(27,49,87,.16)}.date-range-presets{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:5px 9px;padding-bottom:13px;border-bottom:1px solid #edf1f6}.date-range-presets button{padding:10px 8px;border-radius:10px;background:#fff;color:#35445e;font-size:13px}.date-range-presets button:hover{background:#f1fbf9;color:#008e74}.date-range-presets button.active{background:#d8f6ef;color:#008e74;font-weight:800}.date-range-custom{display:grid;grid-template-columns:minmax(0,1fr) 20px minmax(0,1fr) auto;align-items:end;gap:8px;padding-top:13px}.date-range-custom label{gap:6px}.date-range-custom input{height:42px}.date-range-arrow{align-self:center;margin-top:22px;color:#8490a5;font-size:18px;text-align:center}.date-range-custom .primary{height:42px;padding:10px 15px;background:#079669;box-shadow:none}.date-range-custom .primary:hover{background:#057e5a}
.filter-select-arrow{font-size:0;width:8px;height:8px;margin-right:3px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;color:#53627c;transform:rotate(45deg) translateY(-2px);transition:transform .15s ease}.filter-select[aria-expanded="true"] .filter-select-arrow{transform:rotate(225deg) translateY(-2px)}
.usage-error{color:var(--red);font-size:12px;cursor:help}.status.disabled{background:#fff0f0;color:#ba4052}.error-text{color:var(--red)!important;max-width:360px!important;white-space:normal!important;overflow:visible!important;text-overflow:clip!important;word-break:break-word;line-height:1.4}
.usage-zero{color:var(--red);font-weight:850}.channel-pagination{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 18px;border-top:1px solid #edf1f6;background:#fbfcff}.channel-pagination-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.channel-page-info{min-width:110px;color:var(--muted);font-size:12px;text-align:center}.channel-page-size,.channel-page-jump{display:flex;align-items:center;gap:8px;white-space:nowrap}.channel-page-size select{width:auto;min-width:88px;min-height:36px;padding:7px 9px}.channel-page-jump input{width:68px;min-width:68px;min-height:36px;padding:7px 9px}.channel-test-button{white-space:nowrap}
@media(max-width:560px){.channel-pagination{align-items:stretch;flex-direction:column}.channel-pagination-actions{justify-content:space-between}.panel-heading:has(#channelExportButton){align-items:flex-start;flex-direction:column}.panel-heading:has(#channelExportButton) #channelExportButton{width:100%}}
.password-input{position:relative;display:flex;align-items:center}.password-input input{padding-right:42px}.password-toggle{position:absolute;right:8px;width:28px;height:28px;padding:0;border-radius:7px;background:transparent;color:#73809a;font-size:15px;line-height:1}.password-toggle:hover{background:#eef2ff;color:#3545b3}.role-select{min-height:34px;padding:7px 9px;font-size:12px}.delete-user-button{color:var(--red)}
.channel-loading{text-align:center;color:var(--muted);padding:40px}.loading-spinner{display:inline-block;width:15px;height:15px;margin-right:8px;vertical-align:-3px;border:2px solid #cbd6e7;border-top-color:var(--blue);border-radius:50%;animation:channel-spin .8s linear infinite}@keyframes channel-spin{to{transform:rotate(360deg)}}.password-input input::-ms-reveal,.password-input input::-ms-clear{display:none}
.status.unknown{background:#eef1f6;color:#68758a}
.stat-card small{display:block;min-height:18px;margin-top:7px;color:var(--muted);font-size:11px}
.channel-actions{display:flex;align-items:center;gap:6px;white-space:nowrap}
.status{white-space:nowrap}
.channel-created-at{white-space:nowrap}

.key-file-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:8px}
.key-file-row input[type=file]{flex:1;min-width:200px;font-size:12px;color:var(--muted)}
.key-file-row .hint.error-text{color:var(--red)}

/* ===================================================================== */
/* 2026-10 UI refresh: login, sidebar, dashboard, users                   */
/* ===================================================================== */
:root{--sb-bg:#0d1320;--sb-bg-2:#121a2b;--sb-line:rgba(255,255,255,.07);--sb-text:#9aa8c3;--sb-text-strong:#f3f6ff;--sb-accent:#7c8cff;--rose:#d55181}
input::placeholder,textarea::placeholder{color:#a3aec4}

/* ---------- Dashboard ---------- */
.dash-head{display:flex;align-items:center;justify-content:space-between;gap:20px;margin:-6px 0 18px}
.dash-caption{margin:0;max-width:640px}
.dash-controls{display:flex;align-items:flex-end;gap:12px;flex-wrap:wrap}
.dash-owner{min-width:200px}.dash-owner select{min-height:40px}
.segmented{display:inline-flex;padding:4px;border:1px solid var(--line);border-radius:12px;background:#fff;gap:2px}
.segmented button{padding:8px 14px;border-radius:9px;background:transparent;color:#5b6a86;font-weight:750;font-size:13px;transition:background .15s,color .15s}
.segmented button:hover{color:var(--ink)}
.segmented button.active{background:var(--ink);color:#fff;box-shadow:0 4px 10px rgba(23,32,51,.18)}
.segmented.small button{padding:6px 11px;font-size:12px}
.dash-tiles{display:grid;gap:14px;margin-bottom:18px}
.dash-tiles.three{grid-template-columns:repeat(3,minmax(0,1fr))}
.dash-tiles.five{grid-template-columns:repeat(5,minmax(0,1fr))}
.stat-card.rose{color:var(--rose)}
.stat-card strong{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;font-variant-numeric:tabular-nums;color:var(--ink)}
.stat-card.blue strong,.stat-card.green strong,.stat-card.violet strong,.stat-card.amber strong,.stat-card.rose strong{color:currentColor}
.stat-card strong em{font-style:normal;font-size:11px;font-weight:800;padding:2px 7px;border-radius:999px;background:#eef1f6;color:#68758a}
.stat-card strong em.up{background:#e4f8f0;color:#057e5a}
.stat-card strong em.down{background:#fff0f0;color:#ba4052}
.dash-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;margin-bottom:18px}
.chart-panel{padding:18px 18px 10px;min-height:280px;display:flex;flex-direction:column}
.chart-panel.span-2{grid-column:span 2}
.chart-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:8px}
.chart-head h3{margin:0;font-size:15px}
.chart-head p{margin:3px 0 0;font-size:12px}
.chart-legend{list-style:none;margin:0;padding:0;display:flex;gap:12px;flex-wrap:wrap;font-size:12px;color:#5b6a86;font-weight:650}
.chart-legend li{display:flex;align-items:center;gap:6px;white-space:nowrap}
.chart-legend i{width:10px;height:10px;border-radius:3px}
.chart-body{flex:1;min-height:220px;position:relative}
.chart-svg{display:block;width:100%;height:auto;overflow:visible}
.chart-grid{stroke:#edf1f6;stroke-width:1}
.chart-axis{fill:#8190aa;font-size:11px;font-weight:650}
.chart-bar{transition:opacity .15s}
.chart-svg:hover .chart-bar{opacity:.85}
.chart-line{fill:none;stroke-width:2;stroke-linejoin:round;stroke-linecap:round}
.chart-area{opacity:.12}
.chart-dot{stroke:#fff;stroke-width:2}
.chart-crosshair{stroke:#b3bdd2;stroke-width:1;stroke-dasharray:3 3;pointer-events:none}
.chart-hit{cursor:crosshair}
.chart-empty,.chart-loading{display:grid;place-items:center;min-height:220px;color:var(--muted);font-size:13px}
.chart-loading{flex-direction:row;gap:6px}
.chart-tooltip{position:fixed;z-index:40;min-width:160px;padding:10px 12px;border-radius:10px;background:#172033;color:#fff;box-shadow:0 12px 30px rgba(10,16,28,.3);font-size:12px;pointer-events:none}
.chart-tooltip strong{display:block;margin-bottom:6px;font-size:12px;color:#c8d2ea}
.chart-tooltip div{display:flex;align-items:center;gap:7px;padding:2px 0}
.chart-tooltip i{width:9px;height:9px;border-radius:2px;flex:0 0 auto}
.chart-tooltip span{color:#aab6d6}
.chart-tooltip b{margin-left:auto;font-variant-numeric:tabular-nums}
.dash-table-panel .panel-heading{padding:18px 22px}
.dash-table{min-width:720px}
.dash-table td{font-variant-numeric:tabular-nums}
@media(max-width:1200px){.dash-tiles.five{grid-template-columns:repeat(3,minmax(0,1fr))}.dash-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.chart-panel.span-2{grid-column:span 2}}
@media(max-width:900px){.dash-head{flex-direction:column;align-items:flex-start}.dash-tiles.five,.dash-tiles.three{grid-template-columns:repeat(2,minmax(0,1fr))}.dash-grid{grid-template-columns:1fr}.chart-panel.span-2{grid-column:auto}}
@media(max-width:560px){.dash-tiles.five,.dash-tiles.three{grid-template-columns:1fr}.segmented{width:100%}.segmented button{flex:1;padding:8px 6px}}

/* ---------- Users ---------- */
.user-summary{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin-bottom:18px}
.users-panel .panel-heading{flex-wrap:wrap}
.users-tools{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.users-tools input[type=search]{width:220px;min-height:38px;padding:8px 12px;border-radius:10px}
.users-table{min-width:860px}
.users-table th{padding:13px 18px}
.user-cell{display:flex;align-items:center;gap:12px;min-width:0}
.user-avatar{display:grid;place-items:center;flex:0 0 auto;width:38px;height:38px;border-radius:12px;background:linear-gradient(135deg,#e7ebff,#d9f4ee);color:#3545b3;font-weight:900;font-size:15px}
.user-avatar.admin{background:linear-gradient(135deg,#1c2540,#4b3fb0);color:#fff}
.user-cell strong{display:flex;align-items:center;gap:6px}
.self-tag{display:inline-block;padding:1px 6px;border-radius:999px;background:#eef2ff;color:#3545b3;font-size:10px;font-style:normal;font-weight:800}
.users-table tr.is-disabled td:not(:last-child){opacity:.6}
.status .dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:currentColor;margin-right:5px;vertical-align:1px}
.perm-pill{display:inline-block;padding:3px 9px;border-radius:999px;font-size:11px;font-weight:800;white-space:nowrap}
.perm-pill.on{background:#eef2ff;color:#3545b3}
.perm-pill.off{background:#f1f3f7;color:#7a8699}
.token-hint{display:inline-block;padding:3px 8px;border-radius:7px;background:#f4f6fb;border:1px solid #e3e8f2}
.users-table .role-select{min-width:96px}
.users-table .user-actions{flex-wrap:nowrap}.users-table td{white-space:nowrap}.users-table td:first-child{white-space:normal}.user-actions .mini-button{padding:6px 9px;border-radius:8px;font-size:11.5px;transition:background .15s,border-color .15s,color .15s}
.user-actions .token-button{border-color:#c9d3f5;color:#3545b3;background:#f5f7ff}
.user-actions .token-button:hover{background:#e9edff}
.user-actions .delete-user-button:hover:not(:disabled){background:#fff1f2;border-color:#ffc9cf}
.user-actions .mini-button:disabled{opacity:.45}
@media(max-width:1200px){.user-summary{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:560px){.user-summary{grid-template-columns:1fr}.users-tools{width:100%}.users-tools input[type=search]{width:100%}}

.users-tools .primary{min-height:38px;padding:8px 16px;white-space:nowrap}

/* ---------- 新建用户弹窗 ---------- */
.user-dialog{width:min(560px,calc(100vw - 32px));padding:0;border-radius:20px;overflow:hidden}
.user-dialog[open]{animation:dialog-in .18s ease-out}
.user-dialog::backdrop{background:rgba(15,23,41,.42);backdrop-filter:blur(3px)}
@keyframes dialog-in{from{opacity:0;transform:translateY(8px) scale(.98)}to{opacity:1;transform:none}}
.dialog-head{display:flex;align-items:flex-start;gap:14px;padding:22px 24px 18px;border-bottom:1px solid #eef1f6}
.dialog-head h3{margin:0 0 4px;font-size:17px}
.dialog-head p{margin:0;font-size:12.5px}
.dialog-icon{display:grid;place-items:center;flex:0 0 auto;width:40px;height:40px;border-radius:12px;background:#eef1ff;color:#4c5fd5}
.dialog-icon svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.dialog-x{margin-left:auto;width:32px;height:32px;border-radius:9px;background:transparent;color:#8590a6;font-size:22px;line-height:1}
.dialog-x:hover{background:#f4f6fb;color:#172033}
.dialog-body{padding:20px 24px 6px;gap:16px}
.dialog-hint{margin:0;padding:10px 12px;border-radius:10px;background:#f6f8fc;color:#6b7690;font-size:12px}
.dialog-body .error{margin:0;font-size:12.5px}
.dialog-foot{display:flex;justify-content:flex-end;gap:10px;padding:16px 24px 20px}
.dialog-foot .primary{min-width:120px}
@media(max-width:560px){.dialog-body{grid-template-columns:1fr}.dialog-body .span-2{grid-column:auto}}

/* ---------- 指标卡数字：按卡片宽度自适应，小数部分缩小 ---------- */
.stat-card{container-type:inline-size;min-width:0}
.stat-card strong{font-size:clamp(24px,15cqi,32px);min-width:0}
.stat-value.long{font-size:max(19px,min(1em,12.5cqi))}
@media(max-width:1200px) and (min-width:901px){.stat-grid.five{grid-template-columns:repeat(3,minmax(0,1fr))}}
.stat-value{font:inherit;color:inherit;white-space:nowrap;letter-spacing:-.02em}
.num-frac{font-style:normal;font-size:.62em;font-weight:750;opacity:.75;letter-spacing:0}

/* ---------- 紧凑页头（替代原大标题 + 横幅） ---------- */
.content{padding-top:0}
.topbar{position:sticky;top:0;z-index:10;display:flex;align-items:center;justify-content:space-between;gap:20px;margin:0 calc(-1 * clamp(22px,4vw,64px)) 22px;padding:18px clamp(22px,4vw,64px) 16px;background:rgba(244,247,251,.86);backdrop-filter:saturate(1.4) blur(10px);border-bottom:1px solid transparent;transition:border-color .2s,box-shadow .2s}
.topbar.is-stuck{border-bottom-color:#e6ebf3;box-shadow:0 6px 18px rgba(27,49,87,.05)}
.topbar-title{min-width:0}
.topbar h2{margin:0;font-size:22px;letter-spacing:-.02em;line-height:1.25}
.topbar-title p{margin:4px 0 0;color:var(--muted);font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.top-actions{display:flex;align-items:center;gap:10px;flex:0 0 auto}
.last-updated{color:#8a94a8;font-size:12px;white-space:nowrap;margin-right:2px}
.icon-text{display:inline-flex;align-items:center;gap:7px}
.icon-text svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.icon-text.is-spinning svg{animation:channel-spin .8s linear infinite}
.top-actions .primary,.top-actions .secondary{min-height:40px;padding:9px 16px}
.section-intro.slim{margin:0 0 16px}
.section-intro.slim .notice{margin:0}
#channelsPage .stat-grid{margin-top:2px}
@media(max-width:900px){.topbar{position:static;margin:0 -18px 18px;padding:18px 18px 12px}}
@media(max-width:560px){.topbar-title p{white-space:normal}.top-actions{flex-wrap:wrap}.last-updated{width:100%}}


/* ===================================================================== */
/* New API（新版 shadcn 界面）主题：令牌、外框、控件、页面                    */
/* 规格取自 QuantumNous/new-api web/src（theme.css 与 components/ui/*）      */
/* ===================================================================== */
:root{
  --na-bg:#ffffff;--na-fg:#0a0a0a;--na-primary:#3ea4ec;--na-primary-hover:#2f95de;
  --na-secondary:#eeeeee;--na-secondary-fg:#004c9f;--na-muted:#f5f5f5;--na-muted-fg:#606060;
  --na-accent:#eaf4fe;--na-destructive:#e7000b;--na-success:#009966;--na-warning:#d08700;--na-info:#0084d1;
  --na-border:#e8e8e8;--na-border-soft:rgba(232,232,232,.6);--na-ring:#42a6ff;--na-ring-soft:rgba(66,166,255,.35);
  --na-sidebar:#fefefe;--na-sidebar-accent:#eaf4fe;--na-sidebar-accent-fg:#0276ea;
  --na-chart-1:#35a9ff;--na-chart-2:#00a9b3;--na-chart-3:#9095e8;--na-chart-4:#d068d8;--na-chart-5:#20b46b;
  --na-r-sm:9.6px;--na-r-md:12.8px;--na-r-lg:16px;--na-r-xl:22.4px;--na-r-2xl:28.8px;
  --na-shadow-xs:0 1px 2px rgba(0,0,0,.05);--na-shadow-sm:0 1px 3px rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);
  --na-shadow-md:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--na-shadow-lg:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);
  --na-mono:ui-monospace,"SFMono-Regular","JetBrains Mono",Consolas,"Liberation Mono",monospace;
  /* 旧样式里仍在用的变量，统一映射到新令牌 */
  --ink:#0a0a0a;--muted:#606060;--line:#e8e8e8;--paper:#ffffff;--card:#ffffff;--blue:#3ea4ec;--green:#009966;--amber:#d08700;--red:#e7000b;--violet:#9095e8;
}
body{margin:0;background:var(--na-bg);color:var(--na-fg);font:14px/1.43 "Public Sans","Inter",system-ui,-apple-system,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;-webkit-font-smoothing:antialiased}
*{border-color:var(--na-border)}
.sr-only,.visually-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}
.page-hidden{display:none!important}
.muted{color:var(--na-muted-fg)}
.mono{font-family:var(--na-mono)}
::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{background:var(--na-border);border-radius:8px}::-webkit-scrollbar-track{background:transparent}
@keyframes na-pulse{50%{opacity:.5}}

/* ---------- Button ---------- */
.btn,.primary,.secondary{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:32px;padding:0 10px;border:1px solid transparent;border-radius:var(--na-r-lg);background:transparent;color:var(--na-fg);font-size:14px;font-weight:500;line-height:1;white-space:nowrap;box-shadow:none;cursor:pointer;transition:background .15s,color .15s,border-color .15s,box-shadow .15s}
.btn svg,.primary svg,.secondary svg{width:16px;height:16px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.btn:active:not(:disabled),.primary:active:not(:disabled),.secondary:active:not(:disabled){transform:translateY(1px)}
.btn:focus-visible,.primary:focus-visible,.secondary:focus-visible{outline:none;border-color:var(--na-ring);box-shadow:0 0 0 3px var(--na-ring-soft)}
.btn:disabled,.primary:disabled,.secondary:disabled{opacity:.5;cursor:not-allowed}
.btn.primary,.primary{background:var(--na-primary);color:#fff}
.btn.primary:hover:not(:disabled),.primary:hover:not(:disabled){background:var(--na-primary-hover)}
.btn.outline,.secondary{border-color:var(--na-border);background:#fff;color:var(--na-fg)}
.btn.outline:hover:not(:disabled),.secondary:hover:not(:disabled){background:var(--na-muted)}
.btn.ghost{background:transparent}
.btn.ghost:hover:not(:disabled){background:var(--na-muted)}
.btn.muted{color:var(--na-muted-fg)}.btn.muted:hover{color:var(--na-fg)}
.btn.dashed{border-style:dashed}
.btn.sm{height:28px;padding:0 10px;gap:4px;border-radius:var(--na-r-md);font-size:12.8px}
.btn.sm svg{width:14px;height:14px}
.btn.icon{width:32px;padding:0}
.btn.icon.sm{width:28px;height:28px}
.btn.icon svg{color:var(--na-muted-fg)}.btn.icon:hover svg{color:var(--na-fg)}
.btn.is-busy svg,.is-spinning svg{animation:channel-spin .8s linear infinite}
.mini-button{display:inline-flex;align-items:center;justify-content:center;height:28px;padding:0 10px;border:1px solid var(--na-border);border-radius:var(--na-r-md);background:#fff;color:var(--na-fg);font-size:12.8px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background .15s}
.mini-button:hover:not(:disabled){background:var(--na-muted);border-color:var(--na-border)}
.mini-button:disabled{opacity:.5;cursor:not-allowed}

/* ---------- Input / Select / Label ---------- */
label{display:grid;gap:8px;color:var(--na-fg);font-size:14px;font-weight:500;line-height:1.25}
label small,.field-hint{display:block;color:var(--na-muted-fg);font-size:13px;font-weight:400;line-height:1.5}
.req{margin-left:2px;color:var(--na-destructive);font-weight:500}
input,textarea,select{width:100%;height:32px;min-height:32px;padding:4px 10px;border:1px solid var(--na-border);border-radius:var(--na-r-lg);background:transparent;color:var(--na-fg);font:inherit;font-size:14px;font-weight:400;box-shadow:none;transition:border-color .15s,box-shadow .15s}
textarea{height:auto;min-height:64px;padding:8px 10px;line-height:1.5;resize:vertical}
select{appearance:none;-webkit-appearance:none;padding-right:30px;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23606060' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m7 15 5 5 5-5M7 9l5-5 5 5'/%3E%3C/svg%3E") no-repeat right 8px center/16px;cursor:pointer}
input::placeholder,textarea::placeholder{color:#8a8a8a}
input:hover,textarea:hover,select:hover{border-color:var(--na-border);background-color:transparent}
select:hover{background-color:#fff}
input:focus,textarea:focus,select:focus,input:focus-visible,textarea:focus-visible,select:focus-visible{outline:none;border-color:var(--na-ring);box-shadow:inset 0 0 0 3px var(--na-ring-soft);background-color:#fff}
input[readonly],input:disabled,textarea:disabled,select:disabled{background-color:#fafafa;color:var(--na-muted-fg)}
input[type=checkbox],input[type=radio]{width:16px;height:16px;min-height:16px;padding:0;border-radius:var(--na-r-sm);accent-color:var(--na-primary);box-shadow:none;cursor:pointer}
/* 文字输入框不定死 height，靠 min-height 撑到原来的高度：Windows 的系统中文字体（微软雅黑）在定死高度的 input 里画不出下划线，
   g6_azure_zhilian_ 会显示成 g6 azure zhilian（select、textarea 没这个问题）。勾选框、开关、文件框不是文字框，不动 */
input:not([type=checkbox]):not([type=radio]):not([type=file]):not(.switch){height:auto}
input[type=file]{height:auto;min-height:0;padding:0;border:0;border-radius:0;box-shadow:none}
.password-input{position:relative;display:block}
.password-input input{padding-right:38px}
.password-toggle{position:absolute;top:50%;right:4px;display:grid;place-items:center;width:24px;height:24px;padding:0;border:0;border-radius:var(--na-r-md);background:transparent;color:var(--na-muted-fg);transform:translateY(-50%);cursor:pointer}
.password-toggle svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.password-toggle:hover,.password-toggle.is-visible{background:var(--na-muted);color:var(--na-fg)}
.check-row{display:flex!important;align-items:center;gap:8px;font-size:14px;font-weight:500;cursor:pointer}
.form-error{margin:0;color:var(--na-destructive);font-size:14px}
.notice{margin:0;padding:10px 12px;border-radius:var(--na-r-md);font-size:14px}
.notice.success{background:#e6f5f0;color:var(--na-success)}
.notice.error{background:#fde6e7;color:var(--na-destructive)}

/* ---------- Badge / status ---------- */
.badge{display:inline-flex;align-items:center;justify-content:center;gap:4px;height:20px;padding:0 8px;border:1px solid transparent;border-radius:999px;font-size:12px;font-weight:500;white-space:nowrap}
.badge.secondary{background:var(--na-secondary);color:var(--na-secondary-fg);border-radius:var(--na-r-sm);padding:0 5px;font-weight:400}
.badge.outline{border-color:var(--na-border);background:#fff;color:var(--na-fg)}
.badge.muted{color:var(--na-muted-fg)}
.badge.mono{font-family:var(--na-mono)}
.status{display:inline-flex;align-items:center;gap:4px;height:20px;padding:0 6px;border-radius:999px;background:none!important;font-size:14px;font-weight:500;white-space:nowrap}
.status .dot{display:none}
.status.success{color:var(--na-success)}
.status.failed,.status.disabled{color:var(--na-destructive)}
.status.submitting{color:var(--na-warning)}
.status.unknown{color:var(--na-muted-fg)}
.icon-badge{display:inline-grid;place-items:center;flex:0 0 auto;width:28px;height:28px;border-radius:var(--na-r-md);background:#ebf6ff;color:var(--na-chart-1)}
.icon-badge svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.icon-badge.lg{width:36px;height:36px;border-radius:var(--na-r-lg)}.icon-badge.lg svg{width:16px;height:16px}
.icon-badge.info,.icon-badge.blue{background:#e6f3fa;color:var(--na-info)}
.icon-badge.success,.icon-badge.green{background:#e6f5f0;color:var(--na-success)}
.icon-badge.warning,.icon-badge.amber{background:#faf3e6;color:var(--na-warning)}
.icon-badge.violet{background:#f4f4fd;color:#7c82dc}
.icon-badge.cyan{background:#e6f6f7;color:var(--na-chart-2)}
.icon-badge.pink,.icon-badge.rose{background:#faf0fb;color:#c454cc}
.logo-tile{display:inline-grid;place-items:center;flex:0 0 auto;border-radius:5px;color:#fff;font-weight:700;line-height:1}
.logo-svg{display:block;flex:0 0 auto}
.type-badge{display:inline-flex;align-items:center;gap:6px;min-width:0;color:var(--na-muted-fg);font-weight:500}

/* ---------- Tabs (pill) ---------- */
.tabs{display:inline-flex;align-items:center;height:32px;padding:3px;border-radius:var(--na-r-lg);background:var(--na-muted);flex:0 0 auto}
.tabs button{height:100%;padding:0 10px;border:1px solid transparent;border-radius:var(--na-r-md);background:transparent;color:#6c6c6c;font-size:14px;font-weight:500;white-space:nowrap;cursor:pointer;transition:color .15s,background .15s}
.tabs button:hover{color:var(--na-fg)}
.tabs button.active{background:#fff;color:var(--na-fg);box-shadow:var(--na-shadow-sm)}

/* ---------- Login（单列，无卡片） ---------- */
.login-shell{position:relative;display:block;min-height:100vh;padding:0;background:#fff;place-items:stretch}
.login-logo{position:absolute;top:32px;left:32px;z-index:1;display:flex;align-items:center;gap:8px;color:var(--na-fg);text-decoration:none;transition:opacity .15s}
.login-logo:hover{opacity:.8}
.login-logo h1{margin:0;font-size:20px;font-weight:500;letter-spacing:0}
.logo-mark{display:grid;place-items:center;flex:0 0 auto;width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,#3ea4ec,#6a7dff);color:#fff;font-size:15px;font-weight:700}
.logo-mark.sm{width:20px;height:20px;border-radius:var(--na-r-md);font-size:11px}
.login-center{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:72px 16px 32px}
.login-column{display:grid;gap:32px;width:min(480px,100%);padding:32px}
.login-heading{display:grid;gap:8px}
.login-heading h2{margin:0;font-size:24px;line-height:32px;font-weight:600;letter-spacing:-.025em}
.login-heading p{margin:0;color:var(--na-muted-fg);font-size:16px;line-height:24px}
.login-heading b{color:var(--na-fg);font-weight:500;text-decoration:underline;text-underline-offset:4px}
.login-form{display:grid;gap:16px}
.form-item{display:grid;gap:8px}
.form-item>label{display:block;font-size:14px;font-weight:500;line-height:1}
.label-row{display:flex;align-items:center;justify-content:space-between}
.link-muted{padding:0;border:0;background:none;color:var(--na-muted-fg);font-size:14px;font-weight:500;cursor:pointer}
.link-muted:hover{opacity:.75}
.login-form .check-row{font-size:14px;color:var(--na-muted-fg);font-weight:400}
.login-submit{position:relative;width:100%;margin-top:8px}
.login-submit.is-loading>*{visibility:hidden}
.login-submit.is-loading:after{content:"";position:absolute;left:50%;top:50%;width:16px;height:16px;margin:-8px 0 0 -8px;border:2px solid rgba(255,255,255,.45);border-top-color:#fff;border-radius:50%;animation:channel-spin .8s linear infinite}
.login-form.shake{animation:login-shake .5s}
@keyframes login-shake{10%,90%{transform:translateX(-1px)}20%,80%{transform:translateX(2px)}30%,50%,70%{transform:translateX(-4px)}40%,60%{transform:translateX(4px)}}
.terms{margin:0;text-align:center;color:var(--na-muted-fg);font-size:12px}

/* ---------- Console shell ---------- */
.app-shell{display:flex;flex-direction:column;min-height:100vh;background:var(--na-sidebar)}
.app-header{position:sticky;top:0;z-index:40;display:flex;align-items:center;gap:8px;height:48px;padding:0 12px;background:var(--na-sidebar)}
.system-brand{display:inline-flex;align-items:center;gap:6px;height:28px;min-width:0;padding:0 6px;border-radius:var(--na-r-md);color:var(--na-fg);font-size:14px;font-weight:500;text-decoration:none;transition:background .15s}
.system-brand:hover{background:var(--na-accent)}
.header-spacer{flex:1}
.profile{position:relative}
.avatar-btn{display:grid;place-items:center;width:24px;height:24px;padding:0;border:0;border-radius:50%;background:none;cursor:pointer}
.avatar{display:grid;place-items:center;width:24px;height:24px;border-radius:50%;background:#5b8def;color:#fff;font-size:11px;font-weight:600}
.avatar.lg{width:32px;height:32px;font-size:13px}
.menu{position:absolute;top:calc(100% + 8px);right:0;z-index:60;width:224px;padding:4px;border-radius:var(--na-r-lg);background:#fff;box-shadow:var(--na-shadow-md),0 0 0 1px #e7e7e7}
.menu-user{display:flex;align-items:center;gap:8px;padding:6px}
.menu-user strong{display:block;font-size:14px;font-weight:500}
.menu-user small{display:block;margin-top:2px;color:var(--na-muted-fg);font-size:12px}
.menu-sep{height:1px;margin:4px -4px;background:var(--na-border)}
.menu-item{display:flex;align-items:center;gap:6px;width:100%;min-height:30px;padding:4px 6px;border:0;border-radius:var(--na-r-md);background:none;color:var(--na-fg);font-size:14px;text-align:left;cursor:pointer}
.menu-item svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;color:var(--na-muted-fg)}
.menu-item:hover{background:var(--na-accent)}
.menu-item.danger,.menu-item.danger svg{color:var(--na-destructive)}
.menu-item.danger:hover{background:#fde6e7}
.app-body{display:flex;flex:1;min-height:0}
.sidebar{position:sticky;top:48px;display:flex;flex-direction:column;flex:0 0 208px;width:208px;height:calc(100vh - 48px);padding:8px;background:var(--na-sidebar);border:0;box-shadow:none;color:var(--na-fg);overflow-x:hidden;overflow-y:auto;transition:flex-basis .2s,width .2s}
.sidebar nav{display:flex;flex-direction:column;gap:0;margin:0;padding:8px 0}
.nav-group{display:block;margin:0;padding:4px 8px}
.nav-label{display:flex;align-items:center;height:32px;margin:0;padding:0 8px;color:#909090;font-size:11px;font-weight:500;letter-spacing:.05em;text-transform:uppercase;white-space:nowrap;transition:opacity .2s}
.nav-item{position:relative;display:flex;align-items:center;gap:8px;width:100%;height:32px;margin:0 0 4px;padding:8px;border:0;border-radius:var(--na-r-md);background:transparent;color:var(--na-fg);font-size:14px;font-weight:400;text-align:left;white-space:nowrap;cursor:pointer;transition:background .15s,color .15s}
.nav-item svg{flex:0 0 auto;width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;color:currentColor}
.nav-item:hover{background:var(--na-muted);color:var(--na-fg)}
.nav-item.active{background:var(--na-sidebar-accent);color:var(--na-sidebar-accent-fg);font-weight:500}
.nav-item.active svg{color:var(--na-sidebar-accent-fg)}
.nav-item:before{display:none}
.sidebar-rail{position:absolute;top:0;right:0;bottom:0;width:10px;padding:0;border:0;background:transparent;cursor:ew-resize}
.sidebar-rail span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}
.sidebar-rail:after{content:"";position:absolute;top:0;bottom:0;right:4px;width:2px;background:transparent;transition:background .15s}
.sidebar-rail:hover:after{background:var(--na-border)}
.app-shell.sidebar-collapsed .sidebar{flex-basis:62px;width:62px}
.app-shell.sidebar-collapsed .nav-label{height:0;opacity:0;overflow:hidden}
.app-shell.sidebar-collapsed .nav-item{width:32px;justify-content:center}
.app-shell.sidebar-collapsed .nav-item span{display:none}
.content{display:flex;flex-direction:column;flex:1;min-width:0;height:calc(100vh - 64px);margin:8px 8px 8px 0;padding:0;overflow:hidden;background:#fff;border-radius:var(--na-r-xl);box-shadow:var(--na-shadow-sm)}
.app-shell.sidebar-collapsed .content{margin-left:8px}
.content>.topbar{position:static;flex-shrink:0;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 16px;margin:0;padding:20px 16px 12px;background:none;backdrop-filter:none;border:0;box-shadow:none}
.content>.topbar.is-stuck{box-shadow:none;border-color:transparent}
.content>.topbar h2{margin:0;font-size:18px;line-height:28px;font-weight:700;letter-spacing:-.025em}
.top-actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:8px}
.last-updated{margin:0;color:var(--na-muted-fg);font-size:12px;white-space:nowrap}
.page{flex:1;min-height:0;overflow:auto;padding:6px 16px 16px}
#channelsPage,#usersPage{display:flex;flex-direction:column;gap:12px}
#dashboardPage{display:flex;flex-direction:column;gap:16px}

/* ---------- KPI strip（New API models 页的指标条） ---------- */
.kpi-strip{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:1px;flex-shrink:0;overflow:hidden;border:1px solid var(--na-border);border-radius:var(--na-r-lg);background:var(--na-border-soft)}
.kpi-strip.three{grid-template-columns:repeat(3,minmax(0,1fr))}
.kpi-strip.four{grid-template-columns:repeat(4,minmax(0,1fr))}
.kpi-strip.two{grid-template-columns:repeat(2,minmax(0,1fr))}
#userSummary{grid-template-columns:repeat(4,minmax(0,1fr))}
.kpi-cell{min-width:0;padding:16px 20px;background:#fff;container-type:inline-size}
.kpi-head{display:flex;align-items:center;gap:8px;min-width:0}
.kpi-title{overflow:hidden;color:var(--na-muted-fg);font-size:12px;font-weight:500;letter-spacing:.05em;text-transform:uppercase;text-overflow:ellipsis;white-space:nowrap}
.kpi-value{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 8px;margin-top:8px;color:var(--na-fg);font-family:var(--na-mono);font-size:clamp(16px,12.5cqi,24px);font-weight:700;letter-spacing:-.025em;line-height:1.25;font-variant-numeric:tabular-nums}
.kpi-value .stat-value,.kpi-value .stat-value.long{font:inherit;color:inherit;letter-spacing:inherit;white-space:nowrap}
.kpi-value .num-frac{font-size:.6em;font-style:normal;font-weight:600;opacity:.5;letter-spacing:0}
.kpi-value em{display:inline-flex;align-items:center;height:20px;padding:0 6px;border-radius:999px;background:var(--na-muted);color:var(--na-muted-fg);font-family:"Public Sans","Inter",system-ui,sans-serif;font-size:11px;font-style:normal;font-weight:500;letter-spacing:0}
.kpi-value em.up{background:#e6f5f0;color:var(--na-success)}
.kpi-value em.down{background:#fde6e7;color:var(--na-destructive)}
.kpi-desc{margin-top:4px;overflow:hidden;color:#a0a0a0;font-size:12px;text-overflow:ellipsis;white-space:nowrap}

/* ---------- Toolbar ---------- */
.toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px;flex-shrink:0;margin:0}
.search-input{position:relative;width:240px}
.search-input svg{position:absolute;top:50%;left:10px;width:16px;height:16px;fill:none;stroke:var(--na-muted-fg);stroke-width:2;stroke-linecap:round;opacity:.6;transform:translateY(-50%);pointer-events:none}
.search-input input{padding-left:32px;background:rgba(232,232,232,.3)}
.search-input input:focus{background:#fff}
.facet{position:relative}
.facet .btn.dashed{height:32px}
.facet-sep{display:inline-block;width:1px;height:16px;margin:0 4px;background:var(--na-border)}
.select-wrap select{width:180px;min-width:0;text-overflow:ellipsis}
.toolbar-right{display:flex;flex:1 1 0;align-items:center;justify-content:flex-end;gap:8px;min-width:0;margin-left:auto}
.toolbar-right .toolbar-note{min-width:0}
.toolbar-note{margin:0;max-width:340px;overflow:hidden;color:var(--na-muted-fg);font-size:12px;text-overflow:ellipsis;white-space:nowrap}
#channelDateRangePanel{position:absolute;top:calc(100% + 6px);left:0;z-index:30;width:min(440px,calc(100vw - 32px));padding:10px;border:0;border-radius:var(--na-r-lg);background:#fff;box-shadow:var(--na-shadow-md),0 0 0 1px #e7e7e7}
#channelDateRangePanel .date-range-presets{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:4px;padding-bottom:10px;border-bottom:1px solid var(--na-border)}
#channelDateRangePanel .date-range-presets button{height:30px;padding:0 6px;border:0;border-radius:var(--na-r-md);background:none;color:var(--na-fg);font-size:13px;cursor:pointer}
#channelDateRangePanel .date-range-presets button:hover{background:var(--na-accent);color:var(--na-fg)}
#channelDateRangePanel .date-range-presets button.active{background:var(--na-accent);color:var(--na-sidebar-accent-fg);font-weight:500}
#channelDateRangePanel .date-range-custom{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto;align-items:end;gap:8px;padding-top:10px}
#channelDateRangePanel .date-range-custom label{gap:6px;color:var(--na-muted-fg);font-size:12px}
#channelDateRangePanel .date-range-custom input{height:32px}
#channelDateRangePanel .btn.primary{background:var(--na-primary)}

/* ---------- Table ---------- */
table{width:100%;border-collapse:separate;border-spacing:0;font-size:14px;font-variant-numeric:tabular-nums}
th,td{border-bottom:1px solid var(--na-border)}
th{height:40px;padding:0 8px;background:#fbfbfb;color:var(--na-fg);font-size:14px;font-weight:500;letter-spacing:0;text-align:left;white-space:nowrap}
td{padding:8px;color:var(--na-fg);font-size:14px;font-weight:500;vertical-align:middle;white-space:nowrap}
tbody tr{transition:background .12s}
tbody tr:hover td{background:#fafafa}
.table-frame,.table-wrap{border:1px solid var(--na-border);border-radius:var(--na-r-lg);background:#fff;overflow:auto}
.table-frame{flex:1 1 auto;min-height:260px}
.table-frame table{min-width:960px}
.table-frame thead th{position:sticky;top:0;z-index:2}
.table-frame th:first-child,.table-frame td:first-child,.table-wrap th:first-child,.table-wrap td:first-child{padding-left:16px}
.table-frame th:last-child,.table-frame td:last-child,.table-wrap th:last-child,.table-wrap td:last-child{padding-right:16px}
.table-frame tbody tr,.table-wrap tbody tr{height:60px}
.table-frame tbody tr:last-child td,.table-wrap tbody tr:last-child td{border-bottom:0}
.table-frame td strong,.table-wrap td strong{display:block;font-size:14px;font-weight:500}
.table-frame td small,[data-table-text=secondary]{display:block;max-width:280px;margin-top:2px;overflow:hidden;color:var(--na-muted-fg);font-size:12px;font-weight:400;text-overflow:ellipsis;white-space:nowrap}
.cell-stack{display:flex;flex-direction:column;gap:2px;min-width:0}
.cell-name{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.table-frame td.mono{font-family:var(--na-mono)}
.key-mask{padding:0;background:none;color:var(--na-muted-fg);font-family:var(--na-mono);font-size:13px}
.badge-list{display:flex;align-items:center;gap:4px}
.badge-list .badge{max-width:150px;overflow:hidden;text-overflow:ellipsis}
.row-disabled td{background:#f6f6f6}
tbody tr.row-disabled:hover td{background:#f2f2f2}
.row-disabled td:first-child{box-shadow:inset 4px 0 0 #d2d2d2}
.channel-created-at{color:var(--na-muted-fg)!important;font-weight:400!important}
.cell-actions{position:sticky;right:0;background:#fff}
.table-frame thead th:last-child{position:sticky;right:0;z-index:3}
.row-actions{display:flex;align-items:center;gap:4px;margin-left:-6px}
.usage-zero{color:var(--na-destructive);font-weight:600}
.usage-error{color:var(--na-destructive)}
.empty-row td{height:400px;padding:0!important;background:#fff!important}
.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:24px;text-align:center;white-space:normal}
.empty-icon{display:grid;place-items:center;width:32px;height:32px;margin-bottom:8px;border-radius:var(--na-r-lg);background:var(--na-muted)}
.empty-icon svg{width:18px;height:18px;fill:none;stroke:var(--na-fg);stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.empty-state strong{font-size:14px;font-weight:500}
.empty-state span{color:var(--na-muted-fg);font-size:14px;font-weight:400}
.skeleton-row td{padding-top:12px;padding-bottom:12px}
.skeleton{display:block;height:16px;border-radius:var(--na-r-sm);background:var(--na-muted);animation:na-pulse 2s cubic-bezier(.4,0,.6,1) infinite}

/* ---------- Pagination（页脚，右对齐） ---------- */
.pagination{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:12px;flex-shrink:0;margin:0 -16px -16px;padding:12px 16px;border-top:1px solid var(--na-border);background:#fff}
.page-total{color:var(--na-fg);font-size:14px;font-weight:500;font-variant-numeric:tabular-nums}
.page-total span{color:#808080}
.page-total b{font-weight:500}
.page-size{display:flex!important;align-items:center;gap:8px;font-size:14px;font-weight:500;white-space:nowrap}
.page-size select{width:70px}
.channel-pagination-actions{display:flex;align-items:center;gap:6px}
.page-numbers{display:flex;align-items:center;gap:6px}
.btn.page-num{min-width:32px;padding:0 8px;font-variant-numeric:tabular-nums}
.btn.page-num.outline{color:var(--na-muted-fg)}
.btn.page-num.primary{font-weight:600}
.page-ellipsis{min-width:16px;color:#a0a0a0;text-align:center}

/* ---------- Dashboard panels ---------- */
.dash-head{display:flex;margin:0}
.dash-head .toolbar-note{flex:1;min-width:200px;max-width:none;text-align:right;white-space:normal}
.panel{background:#fff;border:1px solid var(--na-border);border-radius:var(--na-r-2xl);box-shadow:var(--na-shadow-xs);overflow:hidden}
.dash-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;margin:0}
.chart-panel{display:flex;flex-direction:column;min-height:300px;padding:0}
.chart-panel.span-2{grid-column:span 2}
.chart-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0;padding:12px 20px;border-bottom:1px solid var(--na-border)}
.chart-head h3{margin:0;font-size:14px;font-weight:600}
.chart-head p{margin:2px 0 0;color:var(--na-muted-fg);font-size:12px}
.chart-legend{color:var(--na-muted-fg);font-size:12px;font-weight:500}
.chart-body{flex:1;min-height:220px;padding:16px 20px}
.chart-axis{fill:#8a8a8a;font-weight:500}
.chart-grid{stroke:#f0f0f0}
.chart-tooltip{border-radius:var(--na-r-md);background:#0a0a0a}
.dash-table-panel{border-radius:var(--na-r-2xl)}
.panel-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 20px;border-bottom:1px solid var(--na-border)}
.panel-header h3{margin:0;font-size:14px;font-weight:600}
.panel-header p{margin:2px 0 0;color:var(--na-muted-fg);font-size:12px}
.dash-table-panel .table-wrap{border:0;border-radius:0}

/* ---------- Users ---------- */
.user-cell{display:flex;align-items:center;gap:10px;min-width:0}
.user-avatar{display:grid;place-items:center;flex:0 0 auto;width:32px;height:32px;border-radius:50%;background:var(--na-accent);color:var(--na-sidebar-accent-fg);font-size:13px;font-weight:600}
.user-avatar.admin{background:var(--na-primary);color:#fff}
.self-tag{display:inline-flex;align-items:center;height:18px;margin-left:6px;padding:0 6px;border-radius:999px;background:var(--na-secondary);color:var(--na-secondary-fg);font-size:11px;font-style:normal;font-weight:500}
.users-table tr.is-disabled td:not(:last-child){opacity:.6}
.users-table .role-select{width:auto;min-width:96px;height:28px;min-height:28px;border-radius:var(--na-r-md);font-size:13px}
.perm-pill{display:inline-flex;align-items:center;height:20px;padding:0 8px;border:1px solid var(--na-border);border-radius:999px;background:#fff;font-size:12px;font-weight:500}
.perm-pill.on{color:var(--na-fg)}
.perm-pill.off{color:var(--na-muted-fg)}
.token-hint{padding:0;border:0;background:none;color:var(--na-muted-fg);font-family:var(--na-mono);font-size:13px}
.user-actions{display:flex;flex-wrap:nowrap;gap:6px}
.user-actions .delete-user-button{border-color:transparent;background:#fde6e7;color:var(--na-destructive)}
.user-actions .delete-user-button:hover:not(:disabled){background:#faccce}

/* ---------- Dialog（New API：1px ring、无阴影、灰色底栏） ---------- */
dialog.user-dialog{width:min(672px,calc(100vw - 32px));max-width:none;padding:24px;border:0;border-radius:var(--na-r-xl);background:#fff;box-shadow:0 0 0 1px #e7e7e7;overflow:visible}
dialog.user-dialog::backdrop{background:rgba(0,0,0,.1);backdrop-filter:blur(4px)}
.user-dialog form{display:flex;flex-direction:column;gap:16px}
.user-dialog .dialog-head{position:relative;display:flex;flex-direction:column;align-items:stretch;gap:8px;padding:0;border:0}
.user-dialog .dialog-head h3{margin:0;font-size:16px;font-weight:500;line-height:1}
.user-dialog .dialog-head p{margin:0;color:var(--na-muted-fg);font-size:14px}
.user-dialog .dialog-x{position:absolute;top:-16px;right:-16px}
.user-dialog .dialog-body{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;padding:0}
.user-dialog .span-2{grid-column:1/-1}
.user-dialog .dialog-hint{margin:0;padding:10px 12px;border-radius:var(--na-r-md);background:var(--na-muted);color:var(--na-muted-fg);font-size:13px}
.user-dialog .dialog-foot{display:flex;justify-content:flex-end;gap:8px;margin:0 -24px -24px;padding:16px 24px;border-top:1px solid var(--na-border);border-radius:0 0 var(--na-r-xl) var(--na-r-xl);background:#fafafa}

/* ---------- Create channel sheet（右侧抽屉） ---------- */
.sheet-root{position:fixed;inset:0;z-index:80}
.sheet-overlay{position:absolute;inset:0;background:rgba(0,0,0,.1);backdrop-filter:blur(4px);opacity:0;transition:opacity .15s}
.sheet{position:absolute;top:0;right:0;bottom:0;display:flex;flex-direction:column;width:min(1280px,100%);background:#fff;border-left:1px solid var(--na-border);opacity:0;transform:translateX(40px);transition:transform .2s ease-in-out,opacity .2s ease-in-out}
.sheet-root.open .sheet-overlay{opacity:1}
.sheet-root.open .sheet{opacity:1;transform:none}
body.drawer-open{overflow:hidden}
.sheet-header{position:relative;flex-shrink:0;padding:16px 56px 16px 24px;border-bottom:1px solid rgba(232,232,232,.7);background:rgba(255,255,255,.95);backdrop-filter:blur(8px)}
.sheet-header-row{display:flex;flex-wrap:wrap;align-items:center;gap:12px}
.sheet-title{display:flex;align-items:center;gap:10px;margin:0;font-size:16px;font-weight:500}
.sheet-desc{margin:8px 0 0;color:var(--na-muted-fg);font-size:14px}
.sheet-owner{margin:4px 0 0;color:#a0a0a0;font-size:12px}
.sheet-close{position:absolute;top:12px;right:12px}
.provider-button{max-width:420px;gap:8px}
.provider-button .muted{color:var(--na-muted-fg)}
.provider-logo{display:inline-flex;align-items:center;flex:0 0 auto}
.sheet-picker{flex:1;min-height:0;overflow:auto;padding:24px}
.provider-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}
.provider-card{display:flex;flex-direction:column;justify-content:space-between;gap:10px;min-height:128px;padding:12px;border:1px solid var(--na-border);border-radius:var(--na-r-lg);background:#fff;color:var(--na-fg);text-align:left;cursor:pointer;transition:border-color .15s,background .15s}
.provider-card:hover,.provider-card.current{border-color:rgba(62,164,236,.5);background:rgba(62,164,236,.05)}
.provider-top{display:flex;align-items:flex-start;gap:10px}
.provider-text{min-width:0}
.provider-text strong{display:block;font-size:14px;font-weight:500}
.provider-text p{margin:4px 0 0;color:var(--na-muted-fg);font-size:12px;line-height:1.6}
.provider-bottom{display:flex;align-items:center;justify-content:space-between}
.provider-bottom .badge.secondary{height:18px;padding:0 6px;border-radius:var(--na-r-md);font-size:10px}
.provider-no{color:var(--na-muted-fg);font-size:11px;font-variant-numeric:tabular-nums}
.sheet-form{display:flex;flex-direction:column;flex:1;min-height:0}
.sheet-tabs{display:flex;flex-shrink:0;gap:4px;padding:16px 24px 6px}
.sheet-tab{position:relative;display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 12px;border:0;background:none;color:rgba(10,10,10,.6);font-size:14px;font-weight:500;cursor:pointer}
.sheet-tab:hover,.sheet-tab.active{color:var(--na-fg)}
.sheet-tab.active:after{content:"";position:absolute;right:12px;bottom:-5px;left:12px;height:2px;border-radius:2px;background:var(--na-fg)}
.tab-status{display:inline-grid;place-items:center}
.tab-status svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}
.tab-status.ready{color:var(--na-success)}
.tab-status.pending{color:var(--na-warning)}
.sheet-body{display:flex;flex-direction:column;gap:20px;flex:1;min-height:0;padding:20px 24px;overflow-y:auto;overscroll-behavior:contain}
.form-cols{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:24px}
.form-col{display:flex;flex-direction:column;gap:20px;min-width:0}
.drawer-section{display:flex;flex-direction:column;gap:16px;padding-bottom:24px;border-bottom:1px solid var(--na-border-soft)}
.form-col .drawer-section:last-child{padding-bottom:0;border-bottom:0}
.tab-pane[data-pane=routing]{display:flex;flex-direction:column;gap:20px;max-width:920px}
.config-block{display:flex;flex-direction:column;gap:16px;padding:16px;border:1px solid var(--na-border-soft);border-radius:var(--na-r-lg)}
.section-head{display:flex;align-items:flex-start;gap:12px}
.section-head .icon-badge{width:32px;height:32px;border-radius:var(--na-r-lg)}
.section-head .icon-badge svg{width:16px;height:16px}
.section-head h3{margin:0;font-size:14px;font-weight:600;line-height:1;letter-spacing:-.025em}
.section-head p{margin:4px 0 0;color:var(--na-muted-fg);font-size:12px;line-height:20px}
.inner-card{display:flex;flex-direction:column;gap:16px;padding:16px;border:1px solid var(--na-border-soft);border-radius:var(--na-r-lg);background:rgba(245,245,245,.35)}
.inner-card.plain{background:#fff}
.auth-block{display:flex;flex-direction:column;gap:12px;padding-top:16px;border-top:1px solid var(--na-border-soft)}
.auth-block h4{display:flex;align-items:center;gap:6px;margin:0;color:var(--na-muted-fg);font-size:12px;font-weight:500;letter-spacing:.05em;text-transform:uppercase}
.auth-block h4 svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.inline-field{display:flex;align-items:center;justify-content:space-between;gap:12px}
.inline-field span{color:var(--na-muted-fg);font-size:12px}
.inline-field select{width:224px;height:28px;min-height:28px;border-radius:var(--na-r-md);font-size:13px}
.auth-block .field-hint{margin-top:-6px}
.grid-2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
.switch-row{display:flex!important;align-items:center;justify-content:space-between;gap:12px;min-height:64px;padding:12px 0;border-top:1px solid var(--na-border-soft)}
.switch-row strong{display:block;font-size:14px;font-weight:500}
.switch-row small{display:block;margin-top:4px;color:var(--na-muted-fg);font-size:12px;font-weight:400}
input.switch{position:relative;flex:0 0 auto;width:32px;height:18.4px;min-height:18.4px;padding:0;border:0;border-radius:999px;background:var(--na-border);appearance:none;-webkit-appearance:none;cursor:pointer;transition:background .15s}
input.switch:before{content:"";position:absolute;top:1.2px;left:1.2px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.2);transition:transform .15s}
input.switch:checked{background:var(--na-primary)}
input.switch:checked:before{transform:translateX(13.6px)}
input.switch:focus-visible{box-shadow:0 0 0 3px var(--na-ring-soft)}
.key-file-row{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-top:4px}
.key-file-row input[type=file]{flex:1;min-width:200px;color:var(--na-muted-fg);font-size:12px}
.batch-prefix{color:var(--na-muted-fg);font-weight:400}
.model-picker{display:grid;gap:10px}
.model-picker-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.model-picker-head label{display:inline;font-size:14px;font-weight:500}
.model-picker-head small{display:block;margin-top:6px;color:var(--na-muted-fg);font-size:13px}
.model-picker>input[type=search]{background:#fff;border-color:var(--na-border)}
.model-options{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:6px;max-height:280px;padding:8px;overflow:auto;border:1px solid var(--na-border);border-radius:var(--na-r-lg);background:#fff}
.model-option{display:flex;align-items:center;gap:8px;min-width:0;padding:6px 10px;border:1px solid transparent;border-radius:var(--na-r-md);background:var(--na-muted);color:var(--na-fg);font-size:12px;font-weight:500;cursor:pointer;box-shadow:none;transition:border-color .15s,background .15s}
.model-option:hover{border-color:rgba(62,164,236,.35);background:var(--na-muted)}
.model-option:has(input:checked){border-color:rgba(62,164,236,.45);background:var(--na-accent);color:var(--na-sidebar-accent-fg);box-shadow:none}
.model-option em{border-color:rgba(62,164,236,.3);background:#fff;color:var(--na-sidebar-accent-fg)}
.model-empty{color:var(--na-muted-fg)}
.sheet-footer{display:flex;flex-shrink:0;justify-content:flex-end;gap:8px;padding:16px 24px;border-top:1px solid rgba(232,232,232,.7);background:rgba(255,255,255,.95)}

/* ---------- Toast（sonner 风格） ---------- */
.toast{right:24px;bottom:24px;max-width:420px;padding:12px 16px;border:1px solid var(--na-border);border-radius:var(--na-r-lg);background:#fff;color:var(--na-fg);font-size:14px;box-shadow:var(--na-shadow-lg);z-index:120}
.toast.error{background:#fff;color:var(--na-destructive)}
.toast.success{background:#fff;color:var(--na-success)}

/* ---------- Responsive ---------- */
@media(max-width:1280px){.dash-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:1100px){.kpi-strip.five{grid-template-columns:repeat(3,minmax(0,1fr))}}

@media(max-width:1024px){.form-cols{grid-template-columns:1fr}.provider-grid{grid-template-columns:repeat(2,minmax(0,1fr))}#userSummary{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:768px){
  .app-body{flex-direction:column}
  .sidebar,.app-shell.sidebar-collapsed .sidebar{position:static;flex:0 0 auto;width:auto;height:auto;padding:0 8px}
  .sidebar nav{flex-direction:row;padding:0;overflow-x:auto}
  .nav-group{display:flex;gap:4px;padding:0 4px}
  .nav-label,.sidebar-rail,#sidebarToggle{display:none}
  .nav-item,.app-shell.sidebar-collapsed .nav-item{width:auto;margin:0}
  .app-shell.sidebar-collapsed .nav-item span{display:inline}
  .content,.app-shell.sidebar-collapsed .content{height:auto;min-height:calc(100vh - 100px);margin:8px;overflow:visible}
  .page{overflow:visible}
  .table-frame{min-height:0}
  .kpi-strip.five,.kpi-strip.four,.kpi-strip.three{grid-template-columns:repeat(2,minmax(0,1fr))}
  .dash-grid{grid-template-columns:1fr}.chart-panel.span-2{grid-column:auto}
  .search-input{width:100%}
  .toolbar-right{margin-left:0}
  .provider-grid,.grid-2,.user-dialog .dialog-body{grid-template-columns:1fr}
  .sheet-header{padding:12px 48px 12px 16px}.sheet-tabs{padding:12px 16px 6px}.sheet-body{padding:16px}.sheet-picker{padding:16px}
  .sheet-footer{display:grid;grid-template-columns:1fr 1fr;padding:12px 16px}
  .login-logo{top:16px;left:16px}.login-column{padding:32px 16px}
}


/* ===================================================================== */
/* v3：对照用户部署的 New API（2026-09-11 前版本）                           */
/* ===================================================================== */
/* ---------- 表格 ---------- */
.channel-table{min-width:1080px}
.users-table{min-width:720px}
.channel-table td .cell-stack small{max-width:240px}
.type-badge{color:var(--na-muted-fg)}
.page-jump{display:flex!important;align-items:center;gap:8px;color:var(--na-fg);font-size:14px;font-weight:500;white-space:nowrap}
.page-jump input{width:64px}

/* ---------- 行内“…”菜单 ---------- */
.row-menu{position:fixed;z-index:90;width:192px}
.menu-item span{flex:1}
.menu-item:disabled{opacity:.5;cursor:not-allowed;background:none}

/* ---------- 抽屉尺寸 ---------- */
.sheet.sheet-lg{width:min(1024px,100%)}
.sheet.sheet-sm{width:min(600px,100%)}
.sheet-title{gap:12px}
.sheet-title-sub{color:var(--na-muted-fg);font-size:14px;font-weight:400}
.sheet-desc{margin-top:6px}
#drawerTypeLogo{background:#e6f3fa}
.drawer-section.stack{gap:16px;padding-bottom:0;border-bottom:0}

/* ---------- 创建渠道：左侧分区导航 + 右侧表单 ---------- */
.editor-layout{display:grid;grid-template-columns:208px minmax(0,1fr);align-items:start;gap:20px}
.editor-nav{position:sticky;top:0;display:flex;flex-direction:column;gap:12px}
.editor-summary{display:flex;align-items:center;gap:10px;min-width:0;padding:12px;border:1px solid var(--na-border-soft);border-radius:var(--na-r-lg);background:#fdfdfd}
.editor-summary-logo{display:grid;place-items:center;flex:0 0 auto;width:32px;height:32px;border:1px solid var(--na-border);border-radius:var(--na-r-md);background:#fff}
.editor-summary>div{min-width:0}
.editor-summary strong{display:block;overflow:hidden;font-size:14px;font-weight:500;text-overflow:ellipsis;white-space:nowrap}
.editor-summary small{display:block;margin-top:2px;color:var(--na-muted-fg);font-size:12px}
.editor-nav-list{display:flex;flex-direction:column;gap:2px;padding:4px;border:1px solid var(--na-border-soft);border-radius:var(--na-r-lg);background:#fff}
.editor-nav-item{display:flex;align-items:center;gap:8px;width:100%;padding:8px;border:0;border-radius:var(--na-r-md);background:none;color:var(--na-fg);font-size:14px;font-weight:500;text-align:left;cursor:pointer;transition:background .15s}
.editor-nav-item:hover{background:rgba(245,245,245,.6)}
.editor-nav-item.active{background:rgba(245,245,245,.85)}
.editor-nav-icon{display:grid;place-items:center;flex:0 0 auto;width:28px;height:28px;border-radius:var(--na-r-md);background:var(--na-muted);color:var(--na-muted-fg)}
.editor-nav-icon svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.editor-nav-item.active .editor-nav-icon{color:var(--na-fg)}
.editor-main{display:flex;flex-direction:column;gap:20px;min-width:0}
.editor-main .drawer-section{padding-bottom:0;border-bottom:0;scroll-margin-top:16px}
.form-item{display:grid;gap:8px;min-width:0}
.form-label{display:block;color:var(--na-fg);font-size:14px;font-weight:500;line-height:1.25}
.inner-card{background:#fdfdfd}

/* 渠道类型下拉（带图标） */
.combo{position:relative}
.combo-trigger{position:relative;display:flex;align-items:center;gap:8px;width:100%;height:32px;padding:0 36px 0 12px;border:1px solid var(--na-border);border-radius:var(--na-r-lg);background:#fff;color:var(--na-fg);font-size:14px;text-align:left;cursor:pointer}
.combo-trigger:focus-visible,.combo-trigger[aria-expanded=true]{outline:none;border-color:var(--na-ring);box-shadow:inset 0 0 0 3px var(--na-ring-soft)}
.combo-logo{display:inline-flex;flex:0 0 auto}
.combo-text{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.combo-caret{position:absolute;top:50%;right:12px;width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;opacity:.5;transform:translateY(-50%)}
.combo-list{position:absolute;top:calc(100% + 4px);right:0;left:0;z-index:40;max-height:220px;padding:4px;overflow:auto;border:1px solid var(--na-border);border-radius:var(--na-r-md);background:#fff;box-shadow:var(--na-shadow-md)}
.combo-item{display:flex;align-items:center;gap:8px;width:100%;padding:6px 8px;border:0;border-radius:var(--na-r-sm);background:none;color:var(--na-fg);font-size:14px;text-align:left;cursor:pointer}
.combo-item:hover{background:var(--na-accent)}
.combo-item.selected{font-weight:500}
.combo-check{flex:0 0 auto;width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;opacity:0}
.combo-item.selected .combo-check{opacity:1}

/* 支持模型：标签框 + 下拉列表 */
.model-picker{display:grid;gap:12px}
.model-picker-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.model-picker-title{display:grid;gap:6px;min-width:0}
.model-picker-title label{display:block;font-size:14px;font-weight:500;line-height:1}
.model-picker-title .hint{color:var(--na-muted-fg);font-size:13px}
.model-picker-actions{display:flex;align-items:center;gap:8px;flex:0 0 auto}
.chips-wrap{position:relative}
.chips-box{display:flex;flex-wrap:wrap;align-items:center;gap:4px;min-height:32px;padding:4px;border:1px solid var(--na-border);border-radius:var(--na-r-lg);background:#fff;cursor:text;transition:border-color .15s,box-shadow .15s}
.chips-box.focused,.chips-box:focus-within{border-color:var(--na-ring);box-shadow:0 0 0 3px var(--na-ring-soft)}
.chips{display:contents}
.chip{display:inline-flex;align-items:center;gap:2px;max-width:16rem;height:21px;padding:0 0 0 6px;border:0;border-radius:var(--na-r-sm);background:var(--na-muted);color:var(--na-fg);font-size:12px;font-weight:500}
.chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chip-x{display:grid;place-items:center;width:20px;height:20px;padding:0;border:0;border-radius:6px;background:none;color:var(--na-fg);opacity:.5;cursor:pointer}
.chip-x:hover{opacity:1}
.chip-x svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}
.chip-more{padding:0 6px;color:var(--na-muted-fg);cursor:pointer}
.chips-box input{flex:1 1 180px;min-width:120px;height:24px;min-height:24px;padding:0 6px;border:0;border-radius:0;background:transparent!important;box-shadow:none!important}
.model-picker .model-options{position:absolute;top:calc(100% + 6px);right:0;left:0;z-index:40;display:flex;flex-direction:column;gap:0;max-height:252px;padding:4px;overflow:auto;border:0;border-radius:var(--na-r-lg);background:#fff;box-shadow:var(--na-shadow-md),0 0 0 1px #e7e7e7}
.model-picker .model-option{position:relative;display:flex;align-items:center;gap:6px;min-height:28px;padding:4px 32px 4px 8px;border:0;border-radius:var(--na-r-md);background:none;color:var(--na-fg);font-size:14px;font-weight:400;box-shadow:none;cursor:pointer}
.model-picker .model-option:hover,.model-picker .model-option:has(input:focus-visible){background:var(--na-accent)}
.model-picker .model-option input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.model-picker .model-option:has(input:checked){border:0;background:none;color:var(--na-fg);font-weight:500;box-shadow:none}
.model-picker .model-option:has(input:checked):hover{background:var(--na-accent)}
.model-picker .model-option:has(input:checked)::after{content:"";position:absolute;top:50%;right:12px;width:10px;height:5px;border-bottom:2px solid currentColor;border-left:2px solid currentColor;transform:translateY(-70%) rotate(-45deg)}
.model-picker .model-option span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.model-picker .model-empty{padding:12px;color:var(--na-muted-fg);font-size:14px;text-align:center}

/* 高级设置折叠区 */
.collapse-trigger{display:flex;align-items:center;justify-content:space-between;width:100%;padding:12px;border:1px solid var(--na-border-soft);border-radius:var(--na-r-lg);background:#fff;color:var(--na-fg);text-align:left;cursor:pointer;transition:background .15s}
.collapse-trigger:hover{background:rgba(245,245,245,.4)}
.collapse-left{display:flex;align-items:center;gap:12px;min-width:0}
.collapse-icon{display:grid;place-items:center;flex:0 0 auto;width:32px;height:32px;border-radius:var(--na-r-md);background:var(--na-muted);color:var(--na-muted-fg)}
.collapse-icon svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.collapse-text strong{display:block;font-size:13px;font-weight:600}
.collapse-text small{display:block;margin-top:2px;color:var(--na-muted-fg);font-size:12px}
.collapse-caret{width:16px;height:16px;flex:0 0 auto;fill:none;stroke:var(--na-muted-fg);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .2s}
.collapse-trigger.open .collapse-caret{transform:rotate(180deg)}
.collapse-body{display:flex;flex-direction:column;gap:20px;margin-top:20px}
.sub-card{display:flex;flex-direction:column;gap:16px;padding:12px;border:1px solid var(--na-border-soft);border-radius:var(--na-r-lg)}
.sub-card h4{display:flex;align-items:center;gap:8px;margin:0;color:var(--na-muted-fg);font-size:12px;font-weight:500;letter-spacing:.05em;text-transform:uppercase}
.icon-badge.xs{width:20px;height:20px;border-radius:var(--na-r-md)}
.icon-badge.xs svg{width:12px;height:12px}
.sub-card .switch-row{min-height:0;padding:12px 0 0}

/* ---------- 数据看板：StatCard 小卡 + 图表卡片 ---------- */
.stat-tiles{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:12px;flex-shrink:0}
.stat-tiles.three{grid-template-columns:repeat(3,minmax(0,1fr))}
.stat-tile{display:flex;flex-direction:column;justify-content:space-between;gap:12px;min-width:0;min-height:128px;padding:12px;border:1px solid var(--na-border);border-radius:var(--na-r-xl);background:#fff;box-shadow:var(--na-shadow-xs);container-type:inline-size}
.stat-tile-head{display:flex;align-items:center;gap:8px;min-width:0;color:var(--na-muted-fg);font-size:12px;font-weight:500}
.stat-tile-head span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.stat-tile-value{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 8px;color:var(--na-fg);font-family:var(--na-mono);font-size:clamp(16px,12cqi,24px);font-weight:600;letter-spacing:-.025em;line-height:1.2;font-variant-numeric:tabular-nums}
.stat-tile-value .stat-value,.stat-tile-value .stat-value.long{font:inherit;color:inherit;letter-spacing:inherit;white-space:nowrap}
.stat-tile-value .num-frac{font-size:.6em;font-style:normal;opacity:.5;letter-spacing:0}
.stat-tile-value em{display:inline-flex;align-items:center;height:20px;padding:0 6px;border-radius:999px;background:var(--na-muted);color:var(--na-muted-fg);font-family:"Public Sans","Inter",system-ui,sans-serif;font-size:11px;font-style:normal;font-weight:500;letter-spacing:0}
.stat-tile-value em.up{background:#e6f5f0;color:var(--na-success)}
.stat-tile-value em.down{background:#fde6e7;color:var(--na-destructive)}
.stat-tile-desc{overflow:hidden;color:#a0a0a0;font-size:12px;text-overflow:ellipsis;white-space:nowrap}
.stat-tile-spark{height:32px;overflow:hidden;border-radius:var(--na-r-lg)}
.sparkline{display:block;width:100%;height:32px}
.chart-card{display:flex;flex-direction:column;min-width:0;overflow:hidden;border:1px solid var(--na-border);border-radius:var(--na-r-lg);background:#fff;box-shadow:none}
.chart-card.chart-panel{min-height:0;padding:0}
.chart-card-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 20px;border-bottom:1px solid var(--na-border)}
.chart-card-title{display:flex;align-items:center;gap:8px;min-width:0}
.chart-card-title h3{margin:0;font-size:14px;font-weight:600;white-space:nowrap}
.chart-total{overflow:hidden;color:var(--na-muted-fg);font-size:12px;text-overflow:ellipsis;white-space:nowrap}
.chart-card .chart-body{min-height:300px;padding:8px 12px 0}
.chart-card .chart-legend{display:flex;flex-wrap:wrap;justify-content:center;gap:16px;margin:0;padding:4px 12px 12px;list-style:none}
.dash-table-panel .table-wrap{border:0;border-radius:0}
@media(max-width:1280px){.stat-tiles.five{grid-template-columns:repeat(3,minmax(0,1fr))}}

@media(max-width:1024px){.editor-layout{grid-template-columns:1fr}.editor-nav{display:none}}
@media(max-width:768px){.stat-tiles.five,.stat-tiles.three{grid-template-columns:repeat(2,minmax(0,1fr))}.pagination{justify-content:center}}

/* 带 !important 显示规则的元素（check-row、switch-row 等）也要能被 .hidden 隐藏 */
.hidden.hidden,.check-row.hidden,.switch-row.hidden,.page-size.hidden,.page-jump.hidden{display:none!important}


/* ===================================================================== */
/* v4：用户管理表格 + 看板归属筛选                                         */
/* ===================================================================== */
.users-table{table-layout:fixed;min-width:760px}
.users-table td{overflow:hidden;text-overflow:ellipsis}
.role-text{color:var(--na-fg);font-weight:500}
.role-text.admin{color:var(--na-info)}
.token-hint{color:var(--na-fg)}
.token-none{color:var(--na-muted-fg);font-weight:400}
.menu-item{justify-content:space-between}
.menu-icon{flex:0 0 auto;width:16px;height:16px;fill:none;stroke:var(--na-muted-fg);stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.menu-item.danger .menu-icon{stroke:var(--na-destructive)}
.row-menu{width:200px}

/* New API faceted filter：虚线按钮 + 可搜索的单选弹层 */
.facet{position:relative}
.facet-trigger{height:32px}
.facet-trigger .badge{max-width:180px;overflow:hidden;text-overflow:ellipsis}
.facet-trigger .facet-sep{margin:0 2px}
.facet-pop{position:absolute;top:calc(100% + 6px);left:0;z-index:40;display:flex;flex-direction:column;width:288px;overflow:hidden;border-radius:var(--na-r-lg);background:#fff;box-shadow:var(--na-shadow-md),0 0 0 1px #e7e7e7}
.facet-search{position:relative;padding:4px;border-bottom:1px solid var(--na-border)}
.facet-search svg{position:absolute;top:50%;left:14px;width:16px;height:16px;fill:none;stroke:var(--na-muted-fg);stroke-width:2;stroke-linecap:round;opacity:.5;transform:translateY(-50%);pointer-events:none}
.facet-search input{height:32px;padding-left:32px;border:0;border-radius:var(--na-r-md);background:rgba(232,232,232,.3);box-shadow:none!important}
.facet-list{max-height:300px;padding:4px;overflow-y:auto}
.facet-item{display:flex;align-items:center;gap:8px;width:100%;padding:6px 8px;border:0;border-radius:var(--na-r-sm);background:none;color:var(--na-fg);font-size:14px;text-align:left;cursor:pointer}
.facet-item:hover,.facet-item:focus-visible{outline:none;background:var(--na-muted)}
.facet-check{display:grid;place-items:center;flex:0 0 auto;width:16px;height:16px;border:1px solid var(--na-primary);border-radius:var(--na-r-sm);opacity:.5}
.facet-check svg{width:12px;height:12px;fill:none;stroke:#fff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;visibility:hidden}
.facet-item.selected .facet-check{background:var(--na-primary);opacity:1}
.facet-item.selected .facet-check svg{visibility:visible}
.facet-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.facet-meta{margin-left:auto;padding-left:8px;color:var(--na-muted-fg);font-family:var(--na-mono);font-size:12px;white-space:nowrap}
.facet-empty{padding:24px 8px;color:var(--na-muted-fg);font-size:14px;text-align:center}
.facet-divider{height:1px;margin:4px -4px;background:var(--na-border)}
.facet-clear{width:100%;padding:6px 8px;border:0;border-radius:var(--na-r-sm);background:none;color:var(--na-fg);font-size:14px;text-align:center;cursor:pointer}
.facet-clear:hover{background:var(--na-muted)}


/* ===================================================================== */
/* v5：看板按天查看（日期筛选、日历、高亮）                                  */
/* ===================================================================== */
.calendar-pop{width:292px;gap:8px;padding:12px;overflow:visible}
.cal-quick{display:flex;align-items:center;gap:6px;padding-bottom:10px;border-bottom:1px solid var(--na-border)}
.cal-quick #calClear{margin-left:auto}
.cal-head{display:flex;align-items:center;justify-content:space-between}
.cal-head strong{font-size:14px;font-weight:500}
.cal-week,.cal-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:2px}
.cal-week span{display:grid;place-items:center;height:28px;color:var(--na-muted-fg);font-size:12px}
.cal-day{height:34px;padding:0;border:0;border-radius:var(--na-r-md);background:none;color:var(--na-fg);font-size:14px;font-variant-numeric:tabular-nums;cursor:pointer;transition:background .12s,color .12s}
.cal-day:hover:not(:disabled){background:var(--na-muted)}
.cal-day.outside{color:#a0a0a0}
.cal-day.today{background:var(--na-accent);color:var(--na-sidebar-accent-fg);font-weight:600}
.cal-day.selected,.cal-day.selected:hover:not(:disabled){background:var(--na-primary);color:#fff;font-weight:600}
.cal-day:disabled{opacity:.35;cursor:not-allowed}
.cal-note{margin:2px 0 0;color:var(--na-muted-fg);font-size:12px}
.chart-highlight{fill:rgba(62,164,236,.12)}
.chart-axis.is-selected{fill:var(--na-primary);font-weight:600}
.chart-svg.pickable .chart-hit{cursor:pointer}
.chart-tooltip .tip-hint{display:block;margin-top:6px;color:#a3a3a3;font-size:11px;font-style:normal}
.dash-table tbody tr{cursor:pointer}
.dash-table tbody tr.selected-day td{background:var(--na-accent)!important}
.stat-tiles.day-mode .stat-tile{border-color:rgba(62,164,236,.35)}

/* v6：表单对齐修正
   grid-2 的两列高度不同时（右列多一行提示），左列被拉伸，内部的“标签 + 控件”会平分多出的空间，
   导致控件下沉。统一改为顶部对齐，控件就能和同一行的输入框平齐。 */
.grid-2{align-items:start}
.form-item,label{align-content:start}
/* 分区标题只有一行标题（没有说明文字），与图标垂直居中 */
.section-head{align-items:center}
.section-head h3{line-height:1.25}


/* v7：用户管理表格对照 New API 用户表（ID、用户名两行、状态、角色纯文字、时间小字） */
.users-table{min-width:900px}
.users-table td.user-id{color:var(--na-muted-fg);font-variant-numeric:tabular-nums}
.users-table .role-text,.users-table .role-text.admin{color:var(--na-fg);font-weight:500}
.users-table .token-hint{color:var(--na-fg);font-family:var(--na-mono);font-size:13px}
.time-grid{display:grid;grid-template-columns:auto 1fr;gap:4px 8px;color:var(--na-muted-fg);font-size:12px;font-weight:400;font-variant-numeric:tabular-nums}


/* v8：系统设置 · 上游连接卡片（New API 设置页卡片样式） */
#settingsPage{display:flex;flex-direction:column;gap:16px}
.settings-card{max-width:880px;overflow:hidden;border:1px solid var(--na-border);border-radius:var(--na-r-xl);background:#fff;box-shadow:var(--na-shadow-xs)}
.settings-card-head{display:flex;align-items:center;gap:12px;padding:16px 20px;border-bottom:1px solid var(--na-border)}
.settings-card-head .icon-badge{width:32px;height:32px;border-radius:var(--na-r-lg)}
.settings-card-head .icon-badge svg{width:16px;height:16px}
.settings-card-head h3{margin:0;font-size:15px;font-weight:600}
.settings-card-head p{margin:4px 0 0;color:var(--na-muted-fg);font-size:13px}
.settings-card-body{display:flex;flex-direction:column;gap:20px;padding:20px}
.settings-rows{display:grid;gap:0;margin:0;overflow:hidden;border:1px solid var(--na-border-soft);border-radius:var(--na-r-lg)}
.settings-rows>div{display:grid;grid-template-columns:140px minmax(0,1fr);align-items:center;gap:12px;padding:12px 16px;border-top:1px solid var(--na-border-soft)}
.settings-rows>div:first-child{border-top:0}
.settings-rows dt{color:var(--na-muted-fg);font-size:13px}
.settings-rows dd{display:flex;flex-wrap:wrap;align-items:center;gap:10px;min-width:0;margin:0;font-size:14px;word-break:break-all}
.settings-rows code{padding:0;background:none;color:var(--na-fg);font-size:13px}
#upstreamTokenSource{color:var(--na-muted-fg);font-weight:400}
#upstreamTokenSource.from-settings{border-color:rgba(62,164,236,.4);color:var(--na-sidebar-accent-fg)}
.settings-form{display:flex;flex-direction:column;gap:12px;max-width:560px}
.settings-form small{font-size:13px}
.settings-actions{display:flex;justify-content:flex-end;gap:8px}


/* v10：看板日期范围选择（双月日历） */
.calendar-pop{width:auto;gap:10px}
.cal-quick{flex-wrap:wrap}
.cal-months-wrap{position:relative}
.cal-months{display:grid;grid-template-columns:repeat(2,252px);gap:24px}
.cal-month-title{display:grid;place-items:center;height:28px;font-size:14px;font-weight:500}
.cal-nav{position:absolute;top:0;z-index:1}
.cal-nav.prev{left:0}
.cal-nav.next{right:0}
.cal-grid{row-gap:2px;column-gap:0}
.cal-empty{height:34px}
.cal-day{border-radius:0}
.cal-day:hover:not(:disabled){border-radius:var(--na-r-md)}
.cal-day.today{background:none;color:var(--na-sidebar-accent-fg);font-weight:700}
.cal-day.in-range{background:var(--na-accent);color:var(--na-fg)}
.cal-day.in-range:hover:not(:disabled){border-radius:0;background:#d8ebfd}
.cal-day.range-start,.cal-day.range-end,.cal-day.range-start:hover:not(:disabled),.cal-day.range-end:hover:not(:disabled){background:var(--na-primary);color:#fff;font-weight:600}
.cal-day.range-start{border-radius:var(--na-r-md) 0 0 var(--na-r-md)}
.cal-day.range-end{border-radius:0 var(--na-r-md) var(--na-r-md) 0}
.cal-day.range-start.range-end{border-radius:var(--na-r-md)}
.cal-status{margin:0;padding-top:10px;border-top:1px solid var(--na-border);color:var(--na-fg);font-size:13px;font-weight:500}
.facet-trigger .badge{max-width:240px}
@media(max-width:700px){.cal-months{grid-template-columns:252px}.cal-month:first-child{display:none}}

/* ---- 系统设置：渠道类型 ---- */
#settingsPage .settings-card{flex:0 0 auto;width:100%;max-width:1200px}
.settings-card-head .head-action{margin-left:auto;flex:0 0 auto}

/* ===== 系统设置：照 New API 的设置页——顶上一排标签页，一次只看一块；卡片是「标题 + 分隔线 + 多列表单」，
   标签加粗在上、输入框灰底圆角、说明小字在下，开关放在标题下面 ===== */
.settings-tabs{display:flex;align-items:flex-end;gap:2px;flex:0 0 auto;margin-bottom:-2px;overflow-x:auto;border-bottom:1px solid var(--na-border)}
.settings-tabs button{display:inline-flex;align-items:center;gap:8px;flex:0 0 auto;height:42px;margin-bottom:-1px;padding:0 16px;border:1px solid transparent;border-bottom:0;border-radius:8px 8px 0 0;background:none;color:var(--na-muted-fg);font:inherit;font-size:15px;font-weight:500;white-space:nowrap;cursor:pointer}
.settings-tabs button svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.settings-tabs button:hover{color:var(--na-fg)}
.settings-tabs button.active{border-color:var(--na-border);background:#fff;color:var(--na-fg);font-weight:600}
#settingsPage .settings-card{max-width:none;border-radius:var(--na-r-lg);box-shadow:none}
#settingsPage .settings-card-head{padding:14px 20px 12px}
#settingsPage .settings-card-head .icon-badge{display:none}
#settingsPage .settings-card-head h3{font-size:19px;font-weight:700}
#settingsPage .settings-card-head p{margin-top:6px;line-height:1.6}
#settingsPage .settings-form{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));align-items:start;gap:22px 24px;max-width:none}
#settingsPage .settings-form>.form-error,#settingsPage .settings-form>.settings-actions,#settingsPage .settings-form>.settings-rows{grid-column:1/-1}
#settingsPage #upstreamTokenForm>label{grid-column:span 2}
#settingsPage .settings-form .form-label,#settingsPage .settings-form>label:not(.switch-row),#settingsPage .settings-form .switch-row strong{color:var(--na-fg);font-size:14.5px;font-weight:600}
#settingsPage .settings-form .field-hint,#settingsPage .settings-form small{color:var(--na-muted-fg);font-size:13px;font-weight:400;line-height:1.6}
#settingsPage .settings-form input:not([type=checkbox]){height:auto;min-height:38px;padding:8px 14px;border-color:transparent;border-radius:8px;background:#f4f5f6;font-weight:400}
#settingsPage .settings-form input:not([type=checkbox]):hover{background:#eceef0}
#settingsPage .settings-form input:not([type=checkbox]):focus{border-color:var(--na-primary);background:#fff}
#settingsPage .settings-form .switch-row{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:0;border:0}
#settingsPage .settings-form .switch-row>span{display:flex;flex-direction:column;gap:4px}
#settingsPage .settings-actions{justify-content:flex-start;padding-top:4px}
@media(max-width:1100px){#settingsPage .settings-form{grid-template-columns:repeat(2,minmax(0,1fr))}}
/* Azure 区域：创建表单里地址下面的检测结果；系统设置里的拦截记录 */
.azure-region-status{display:block;margin-top:6px;font-size:13px;line-height:1.5}
.azure-region-status.pending{color:var(--na-muted-fg)}
.azure-region-status.ok{color:#16a34a}
.azure-region-status.bad{color:#dc2626;font-weight:500}
.toast.top{top:20px;right:auto;bottom:auto;left:50%;transform:translateX(-50%);z-index:80}
.azure-blocks{display:flex;flex-direction:column;gap:12px;padding-top:4px;border-top:1px solid var(--na-border-soft)}
.azure-blocks-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding-top:16px}
.azure-blocks-toolbar h4{display:flex;align-items:center;gap:8px;margin:0 auto 0 0;font-size:15px;font-weight:600}
.azure-blocks-toolbar .search-input{width:260px}
.azure-blocks-toolbar .select-wrap select{min-width:140px}
.azure-blocks-frame{min-height:0;max-height:none}
.azure-blocks-table{table-layout:fixed}
.azure-blocks-table th:nth-child(1){width:160px}.azure-blocks-table th:nth-child(2){width:15%}.azure-blocks-table th:nth-child(3){width:11%}
.azure-blocks-table th:nth-child(5){width:20%}.azure-blocks-table th:nth-child(6){width:15%}.azure-blocks-table th:nth-child(7){width:110px}.azure-blocks-table th:nth-child(8){width:80px}
.azure-blocks-table td{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:13.5px}
.azure-blocks-table td small{display:block;font-size:12px}
.azure-block-region.muted{color:var(--na-muted-fg)}
.azure-block-kind{font-weight:500;cursor:help;text-decoration:underline dotted;text-underline-offset:3px}
.azure-block-kind.wrong_region{color:#dc2626}
.azure-block-kind.not_found,.azure-block-kind.unknown_region{color:#d97706}
.azure-block-kind.lookup_failed{color:var(--na-muted-fg)}
.azure-blocks-foot{display:flex;align-items:center;justify-content:flex-end;gap:8px}
/* 扫描现有渠道 */
.azure-scan-summary{margin:0;font-size:13px;line-height:1.7;color:var(--na-muted-fg)}
.azure-scan-summary b{color:var(--na-fg,inherit);font-weight:600}
.azure-scan-chip{display:inline-block;margin-right:12px;font-weight:500}
.azure-scan-chip.ok,.azure-block-kind.ok{color:#16a34a}
.azure-scan-chip.wrong_region{color:#dc2626}
.azure-scan-chip.not_found,.azure-scan-chip.unknown_region{color:#d97706}
.azure-scan-chip.lookup_failed,.azure-scan-chip.skipped,.azure-block-kind.skipped{color:var(--na-muted-fg)}
.azure-scan-stale{display:inline-block;margin-left:4px;color:#d97706;font-weight:500}
.azure-scan-table{table-layout:fixed}
.azure-scan-table th:nth-child(1){width:32%}.azure-scan-table th:nth-child(2){width:15%}.azure-scan-table th:nth-child(3){width:84px}
.azure-scan-table th:nth-child(5){width:15%}.azure-scan-table th:nth-child(6){width:104px}
.azure-scan-table td{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:13.5px}
.azure-scan-table td small{display:block;font-size:12px}
/* 渠道名、地址、供应商要看全：折行，不打省略号 */
.azure-scan-table .channel-text.wrap,.azure-scan-table .azure-block-region{display:block;white-space:normal;overflow-wrap:anywhere;text-overflow:clip}
@media(max-width:720px){#settingsPage .settings-form{grid-template-columns:minmax(0,1fr)}#settingsPage #upstreamTokenForm>label{grid-column:auto}}
.type-toolbar{justify-content:space-between}
.type-toolbar .search-input{width:260px;max-width:100%}
.tab-count{margin-left:6px;color:var(--na-muted-fg);font-size:12px;font-weight:400;font-variant-numeric:tabular-nums}
.type-frame{max-height:640px;min-height:0}
.table-frame table.type-table{min-width:900px;table-layout:fixed}
.type-table th:nth-child(1){width:76px}
.type-table th:nth-child(2){width:230px}
.type-table th:nth-child(3){width:150px}
.type-table th:nth-child(5){width:190px}
.type-table th:nth-child(6){width:132px}
.type-table tr.is-off td:nth-child(n+2):nth-child(-n+5){opacity:.55}
.type-cell{display:flex;align-items:center;gap:10px;min-width:0}
.type-cell>div{min-width:0}
.type-cell strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.table-frame .type-cell small{display:flex;align-items:center;gap:6px;overflow:visible}
.type-cell .badge.secondary{height:18px;font-size:11px}
.group-badge{max-width:100%;overflow:hidden;text-overflow:ellipsis}
.field-badges{display:flex;flex-wrap:wrap;gap:4px}
.field-badges .badge em{margin-left:4px;color:var(--na-muted-fg);font-style:normal;font-weight:400}
.field-badges .badge.required em{color:var(--na-destructive)}
.field-badges .badge.fixed em{color:var(--na-info)}
.table-frame .type-models-cell small{max-width:100%}
.muted-dash{color:var(--na-muted-fg);font-size:13px}
.btn.danger-text{color:var(--na-destructive)}
.btn.danger-text:hover:not(:disabled){background:#fdecec}
.sheet.sheet-md{width:min(760px,100%)}
.sheet-type-logo{display:inline-flex}
.sheet-type-logo:empty{display:none}
.logo-tile.add-tile{width:22px;height:22px;background:var(--na-primary)}
.logo-tile.add-tile svg{width:14px;height:14px;fill:none;stroke:#fff;stroke-width:2.4;stroke-linecap:round}
.section-head .section-desc{margin:4px 0 0;color:var(--na-muted-fg);font-size:13px;font-weight:400}
.section-head .section-meta{margin-left:auto;color:var(--na-muted-fg);font-size:13px;white-space:nowrap}
.type-note{margin:0;padding:10px 12px;border-radius:var(--na-r-lg);background:var(--na-accent);color:#0b5cad;font-size:13px;line-height:1.5}
.field-rule{overflow:hidden;border:1px solid var(--na-border);border-radius:var(--na-r-lg)}
.field-rule-head{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#fbfbfb}
.field-rule-head>div{flex:1;min-width:0}
.field-rule-head strong{display:block;font-size:14px;font-weight:500}
.field-rule-head small{display:block;margin-top:2px;color:var(--na-muted-fg);font-family:var(--na-mono);font-size:12px}
.field-rule-head select{flex:0 0 auto;width:112px}
.field-rule-body{padding:16px;border-top:1px solid var(--na-border)}
.form-item{display:grid;gap:8px}
.form-item-head{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:28px}
.form-label{font-size:14px;font-weight:500}
.sheet-footer .footer-spacer{flex:1}
@media (max-width:720px){.sheet-footer .footer-spacer{display:none}}

/* ---- 创建渠道：按类型配置显示的字段 ---- */
.type-warning{margin:0;padding:10px 12px;border:1px solid #f6dfa6;border-radius:var(--na-r-lg);background:#fdf8ea;color:#8a5a00;font-size:13px;line-height:1.5}
.dyn-fields{display:flex;flex-direction:column;gap:16px}
.dyn-fields .switch-row{min-height:0;padding:0;border-top:0}
.sub-card .dyn-fields{gap:14px}
.mono{font-family:var(--na-mono)}
textarea.mono{font-size:12.5px;line-height:1.55}
.text-link{padding:0;border:0;background:none;color:var(--na-primary);font-size:13px;font-weight:500;cursor:pointer}
.text-link:hover{text-decoration:underline}
.text-link.muted{color:var(--na-muted-fg)}
.kv-editor,.json-field{display:grid;gap:8px}
.kv-head{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:32px}
.kv-tools{display:flex;align-items:center;gap:14px}
.kv-tabs{display:inline-flex;align-items:center;height:32px;padding:3px;border-radius:var(--na-r-lg);background:var(--na-muted)}
.kv-tabs button{display:inline-flex;align-items:center;gap:6px;height:100%;padding:0 10px;border:0;border-radius:var(--na-r-md);background:transparent;color:#6c6c6c;font-size:13px;font-weight:500;cursor:pointer}
.kv-tabs button svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.kv-tabs button.active{background:#fff;color:var(--na-fg);box-shadow:var(--na-shadow-sm)}
.kv-visual{display:grid;gap:8px}
.kv-rows{display:grid;gap:6px}
.kv-empty{display:grid;place-items:center;min-height:96px;padding:16px;border:1px dashed var(--na-border);border-radius:var(--na-r-lg);color:var(--na-muted-fg);font-size:13px;text-align:center}
.kv-row{display:grid;grid-template-columns:minmax(0,1fr) 16px minmax(0,1fr) 32px;align-items:center;gap:8px}
.kv-row-head{color:var(--na-muted-fg);font-size:12px}
.kv-row input{height:32px;min-height:32px;font-size:12.5px}
.kv-arrow{color:var(--na-muted-fg);text-align:center}
.kv-del svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.kv-del:hover{color:var(--na-destructive)}
.btn.kv-add{width:100%;justify-content:center;gap:6px}
.btn.kv-add svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}
.kv-missing{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;padding:8px 10px;border-radius:var(--na-r-md);background:var(--na-accent);color:#0b5cad;font-size:12.5px}
.kv-editor .form-error,.json-field .form-error{font-size:13px}

/* ---- 系统设置：逐个字段配置显示方式 ---- */
.field-summary{display:block;margin-top:4px;color:var(--na-muted-fg);font-size:12px}
.table-frame td small.field-summary{max-width:none}
.mode-legend{display:flex;flex-wrap:wrap;gap:6px 16px;margin:0;padding:10px 12px;border-radius:var(--na-r-lg);background:#fbfbfb;list-style:none;color:var(--na-muted-fg);font-size:12px}
.mode-legend li{display:inline-flex;align-items:center;gap:6px}
.mode-legend strong{color:var(--na-fg);font-weight:500}
.mode-dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto}
.mode-dot.m-optional,.policy-row[data-mode=optional] .policy-mode{--mode-color:#0084d1}
.mode-dot.m-required,.policy-row[data-mode=required] .policy-mode{--mode-color:#e7000b}
.mode-dot.m-readonly,.policy-row[data-mode=readonly] .policy-mode{--mode-color:#009966}
.mode-dot.m-fixed,.policy-row[data-mode=fixed] .policy-mode{--mode-color:#9095e8}
.mode-dot.m-hidden,.policy-row[data-mode=hidden] .policy-mode{--mode-color:#a1a1a1}
.mode-dot{background:var(--mode-color)}
.policy-groups{display:flex;flex-direction:column;gap:12px}
.policy-group{overflow:hidden;border:1px solid var(--na-border);border-radius:var(--na-r-lg)}
.policy-group-head{padding:8px 14px;background:#fbfbfb;color:var(--na-muted-fg);font-size:12px;font-weight:500;letter-spacing:.04em}
.policy-row{display:grid;grid-template-columns:minmax(0,1fr) 196px minmax(0,1.15fr);align-items:center;gap:8px 12px;padding:10px 14px;border-top:1px solid var(--na-border-soft)}
.policy-name{min-width:0}
.policy-name strong{display:block;font-size:13.5px;font-weight:500}
.policy-name span{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:2px}
.policy-name code{padding:0;background:none;color:var(--na-muted-fg);font-family:var(--na-mono);font-size:11.5px}
.lock-tag{padding:0 6px;border-radius:var(--na-r-sm);background:var(--na-muted);color:var(--na-muted-fg);font-size:11px}
.policy-mode{height:32px;min-height:32px;font-size:13px;box-shadow:inset 3px 0 0 var(--mode-color)}
.policy-value{display:flex;align-items:center;gap:8px;min-width:0}
.policy-value-label{flex:0 0 auto;color:var(--na-muted-fg);font-size:12px}
.policy-value>input,.policy-value>select{flex:1;min-width:0;height:32px;min-height:32px;font-size:13px}
.policy-row.wide .policy-value{grid-column:1/-1;flex-direction:column;align-items:stretch;gap:6px}
.policy-row.wide textarea{min-height:72px;font-size:12.5px}
.policy-row[data-mode=hidden] .policy-value>:not(.policy-value-label),.policy-row[data-mode=hidden] .policy-switch{display:none}
.policy-row[data-mode=hidden] .policy-name strong{color:var(--na-muted-fg)}
.policy-switch{display:inline-flex!important;align-items:center;gap:8px;font-size:13px;font-weight:400}
.policy-hint{grid-column:1/-1;margin-top:-2px;color:var(--na-muted-fg);font-size:12px}
.policy-text{grid-column:1/-1;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;padding:10px;border-radius:var(--na-r-md);background:#fbfbfb}
.policy-text label{gap:4px;font-size:12px;color:var(--na-muted-fg);font-weight:400}
.policy-text input{height:30px;min-height:30px;font-size:12.5px}
@media (max-width:720px){.policy-row{grid-template-columns:1fr}.policy-text{grid-template-columns:1fr}}
.policy-name code{overflow-wrap:anywhere}


/* ===================================================================== */
/* mini：在 dami 的 New API 主题之上，只补本项目多出来的那几处            */
/* ===================================================================== */
/* 表格比 dami 多一列「原价消耗」 */
.channel-table{min-width:1180px}
/* 四段命名拼出来的最终名称 */
.name-preview{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:10px 12px;border:1px solid var(--na-border-soft);border-radius:var(--na-r-lg);background:var(--na-accent)}
.name-preview span{flex:0 0 auto;color:var(--na-muted-fg);font-size:12px}
.name-preview strong{min-width:0;font-family:var(--na-mono);font-size:13px;font-weight:600;color:var(--na-sidebar-accent-fg);word-break:break-all;text-align:right}
.grid-3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;align-items:start}
@media(max-width:768px){.grid-3{grid-template-columns:1fr}}
/* 指标卡副标题里的折后金额 */
.kpi-desc.discounted{color:var(--na-muted-fg)}
/* 系统设置 · 渠道命名规则表 */
.type-table .family-chip{display:inline-flex;align-items:center;gap:6px;font-weight:500}
.type-table td .badge.outline{font-family:var(--na-mono);font-size:12px}
.settings-card-body .table-frame.type-frame{min-height:0;max-height:none}
.settings-card-body .type-table{min-width:760px;table-layout:auto}
.settings-card-body .type-table th:nth-child(n){width:auto}
/* 系统设置 · 上游同步 */
.sync-interval{display:flex;flex-wrap:wrap;align-items:center;gap:10px}
.input-suffix{display:inline-flex;align-items:center;width:140px;overflow:hidden;border:1px solid var(--na-border);border-radius:var(--na-r-lg);background:#fff}
.input-suffix:focus-within{border-color:var(--na-ring);box-shadow:0 0 0 3px var(--na-ring-soft)}
.input-suffix input{flex:1;min-width:0;border:0!important;box-shadow:none!important}
.input-suffix span{padding:0 10px;color:var(--na-muted-fg);font-size:13px;white-space:nowrap}
.sync-presets{display:flex;flex-wrap:wrap;gap:6px}
.sync-presets button{height:28px;padding:0 10px;border:1px solid var(--na-border);border-radius:999px;background:#fff;color:var(--na-fg);font-size:12.5px;cursor:pointer}
.sync-presets button:hover{background:var(--na-muted)}
.sync-presets button.active{border-color:var(--na-primary);background:var(--na-accent);color:#0276ea}
.muted-block{opacity:.5}
/* 系统设置 · 渠道类型表（mini：模型族） */
.type-table th:nth-child(2){width:220px}
.type-table th:nth-child(3){width:170px}
.type-table th:nth-child(5){width:200px}
.type-table th:nth-child(6){width:96px}
.type-table .badge-pair{display:flex;flex-wrap:wrap;gap:4px}
#typeFixedRows>div{grid-template-columns:120px minmax(0,1fr)}

/* 读数引擎状态条（总览页顶部） */
.sync-bar{display:flex;align-items:center;gap:8px;min-width:0;padding:2px 2px 0;color:var(--na-muted-fg);font-size:12px}
.sync-bar #syncBarText{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sync-dot{flex:0 0 auto;width:8px;height:8px;border-radius:50%;background:var(--na-success)}
.sync-bar.running .sync-dot{background:var(--na-chart-1);animation:syncPulse 1.2s ease-in-out infinite}
.sync-bar.error .sync-dot{background:var(--na-destructive)}
.sync-bar .text-link{flex:0 0 auto;padding:0;background:none;border:0;color:var(--na-chart-1);font-size:12px;cursor:pointer}
.sync-bar .text-link:disabled{color:var(--na-muted-fg);cursor:default}
@keyframes syncPulse{0%,100%{opacity:1}50%{opacity:.35}}
/* 渠道状态 */
.status.auto{color:var(--na-warning)}
.status.deleted{color:var(--na-muted-fg);text-decoration:line-through}
.state-reason{display:block;max-width:260px;overflow:hidden;color:var(--na-muted-fg);font-size:11px;text-overflow:ellipsis;white-space:nowrap;cursor:help}
/* 对账抽屉 */
.verify-table{width:100%;min-width:0;margin:0 0 12px;border-collapse:collapse}
.verify-table th,.verify-table td{padding:10px 12px;border-bottom:1px solid var(--na-border-soft);text-align:left;font-size:13px}
.verify-table thead th{color:var(--na-muted-fg);font-size:12px;font-weight:500}
.verify-table tbody th{font-weight:500}
.verify-diff.ok{color:var(--na-success)}
.verify-diff.warn{color:var(--na-warning)}
.verify-diff.bad{color:var(--na-destructive)}
#syncLastError.error-text{word-break:break-word}

/* 批量创建 */
.key-mode-row{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:10px}
.key-mode-row .hint{color:var(--na-muted-fg);font-size:12px}
.key-mode-row .hint.error-text{color:var(--na-destructive)}
.tabs button:disabled{opacity:.45;cursor:not-allowed}
.batch-results{margin:16px 0 0;padding:14px 16px;border:1px solid var(--na-border-soft);border-radius:var(--na-r-lg);background:#fff}
.batch-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:10px;font-size:14px}
.batch-actions{display:flex;gap:8px}
.batch-bar{height:4px;margin-bottom:10px;overflow:hidden;border-radius:999px;background:var(--na-muted)}
.batch-bar span{display:block;height:100%;width:0;background:var(--na-chart-1);transition:width .3s ease}
.batch-list{max-height:320px;margin:0;padding:0;overflow:auto;list-style:none}
.batch-item{display:grid;grid-template-columns:18px minmax(0,1.4fr) auto minmax(0,1fr);align-items:center;gap:10px;padding:6px 2px;border-top:1px solid var(--na-border-soft);font-size:13px}
.batch-item:first-child{border-top:0}
.batch-name,.batch-detail{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.batch-detail{color:var(--na-muted-fg);font-size:12px}
.batch-icon{font-weight:600;text-align:center;color:var(--na-muted-fg)}
.batch-item.success .batch-icon{color:var(--na-success)}
.batch-item.failed .batch-icon,.batch-item.failed .batch-detail{color:var(--na-destructive)}
.batch-item.running .batch-icon{color:var(--na-chart-1)}

/* 看板 9 张卡（管理员）：第一行 5 张按天的，第二行 4 张「现在」的（近 1 小时请求数 / Token、全站 RPM / TPM） */
.stat-tiles.nine{grid-template-columns:repeat(20,minmax(0,1fr))}
.stat-tiles.nine>.stat-tile{grid-column:span 4}
.stat-tiles.nine>.stat-tile:nth-child(n+6){grid-column:span 5}
@media(max-width:1280px){.stat-tiles.nine{grid-template-columns:repeat(3,minmax(0,1fr))}.stat-tiles.nine>.stat-tile,.stat-tiles.nine>.stat-tile:nth-child(n+6){grid-column:auto}}
@media(max-width:768px){.stat-tiles.nine{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* ---- 和 dami 对齐：Logo 留在顶栏左侧，收起按钮放到侧边栏底部 ---- */
.app-header{padding:0 12px 0 18px}
.sidebar-bottom{margin-top:auto;padding:4px 8px}
.sidebar-bottom .nav-item{margin:0;color:var(--na-muted-fg)}
@media(max-width:768px){.sidebar-bottom{display:none}}

/* ---- 登录页：黑色主按钮、加粗标签 ---- */
.login-logo{top:40px;left:48px;gap:10px}
.login-logo h1{font-size:22px;font-weight:700;letter-spacing:-.01em}
.login-logo .logo-mark{width:30px;height:30px;font-size:14px}
.login-center{padding:96px 16px 48px}
.login-column{gap:32px;width:min(520px,100%)}
.login-heading h2{font-size:28px;line-height:36px;font-weight:700;letter-spacing:-.02em}
.login-form{gap:18px}
.login-form label{font-size:14px;font-weight:600;color:var(--na-fg)}
.login-form input{height:40px;min-height:40px;padding:0 14px;border-radius:12px;font-size:14px}
.login-form input::placeholder{color:#9a9a9a}
.login-form .link-muted{font-weight:500}
.login-submit.btn-dark,.login-form .login-submit{height:40px;margin-top:6px;border-radius:999px;background:#0a0a0a!important;color:#fff;font-size:15px;font-weight:600;box-shadow:none}
.login-form .login-submit:hover{background:#262626!important}
.login-form .login-submit svg{width:18px;height:18px}
@media (max-width:720px){.login-logo{top:20px;left:20px}.login-center{padding:80px 16px 32px}}

/* ===================================================================== */
/* 使用日志（布局对照上游「通用日志」页：筛选卡片 + 统计 + 表格 + 页脚分页）    */
/* 颜色、圆角、按钮、表格、分页全部沿用上面的令牌和组件                        */
/* ===================================================================== */
#logsPage{display:flex;flex-direction:column;gap:12px}
/* ---- 筛选卡片 ---- */
.logs-filter{display:flex;flex-direction:column;gap:10px;flex-shrink:0;padding:12px;border:1px solid var(--na-border);border-radius:var(--na-r-xl);background:#fff}
.logs-filter-row{display:grid;grid-template-columns:minmax(300px,2.2fr) repeat(3,minmax(140px,1fr)) auto;align-items:center;gap:10px}
.logs-filter-row.more{grid-template-columns:repeat(4,minmax(140px,1fr))}
/* 管理员的使用日志多一个「归属」筛选：按钮只占自己的宽度 */
@media (min-width:1181px){.logs-filter-row:has(> .owner-facet:not(.hidden)){grid-template-columns:minmax(300px,2.2fr) repeat(2,minmax(140px,1fr)) auto minmax(110px,.8fr) auto}}
.logs-range{min-width:0}
.logs-range-trigger{display:flex;align-items:center;gap:8px;width:100%;height:32px;padding:0 10px;border:1px solid var(--na-border);border-radius:var(--na-r-lg);background:#fff;color:var(--na-fg);font-size:14px;text-align:left;cursor:pointer;transition:border-color .15s,box-shadow .15s}
.logs-range-trigger svg{flex:0 0 auto;width:16px;height:16px;fill:none;stroke:var(--na-muted-fg);stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.logs-range-trigger #logRangeText{flex:1;min-width:0;overflow:hidden;font-size:13.5px;text-overflow:ellipsis;white-space:nowrap}
.logs-range-trigger:focus-visible,.logs-range-trigger[aria-expanded=true]{outline:none;border-color:var(--na-ring);box-shadow:inset 0 0 0 3px var(--na-ring-soft)}
.logs-range-pop{width:380px;gap:10px;padding:10px;overflow:visible}
.logs-range-presets{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:4px;padding-bottom:10px;border-bottom:1px solid var(--na-border)}
.logs-range-presets button{height:30px;padding:0 6px;border:0;border-radius:var(--na-r-md);background:none;color:var(--na-fg);font-size:13px;cursor:pointer}
.logs-range-presets button:hover{background:var(--na-accent)}
.logs-range-presets button.active{background:var(--na-accent);color:var(--na-sidebar-accent-fg);font-weight:500}
.logs-range-custom{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto;align-items:end;gap:8px}
.logs-range-custom label{gap:6px;color:var(--na-muted-fg);font-size:12px}
.logs-range-custom .btn{height:32px}
.logs-range-pop .form-error{font-size:13px}
.logs-range-pop .cal-note{margin:0;color:var(--na-muted-fg);font-size:12px}
.logs-more-toggle{justify-self:start;color:var(--na-fg)}
.logs-more-toggle svg{transition:transform .15s}
.logs-more-toggle[aria-expanded=true] svg{transform:rotate(180deg)}
.logs-filter-foot{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 12px}
.logs-chips{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-width:0}
.logs-chip{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 12px;border:1px solid var(--na-border);border-radius:999px;background:#fff;color:var(--na-muted-fg);font-size:12.8px;white-space:nowrap}
.logs-chip i{width:2px;height:12px;border-radius:2px;background:var(--na-border)}
.logs-chip.usage i{background:var(--na-chart-1)}
.logs-chip.rpm i{background:#f0577b}
.logs-chip.tpm i{background:#c9c9c9}
.logs-chip b{color:var(--na-fg);font-size:13px;font-weight:600}
.logs-chip-action{height:20px;margin-right:-6px;padding:0 8px;border:0;border-radius:999px;background:var(--na-accent);color:var(--na-sidebar-accent-fg);font:inherit;font-size:12px;font-weight:500;cursor:pointer}
.logs-chip-action:hover{background:#d8ebfd}
.logs-chip-action:disabled{opacity:.5;cursor:not-allowed}
.logs-actions{display:flex;align-items:center;gap:8px;margin-left:auto}
.logs-actions #logSensitive svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
#logSearch.is-busy:before{content:"";width:12px;height:12px;border:2px solid rgba(255,255,255,.45);border-top-color:#fff;border-radius:50%;animation:channel-spin .8s linear infinite}
.logs-columns-pop{right:0;left:auto;width:176px;padding:4px}
.logs-export-pop{right:0;left:auto;width:360px;gap:12px;padding:14px}
.logs-export-head{display:grid;gap:2px}
.logs-export-head strong{font-size:14px;font-weight:600}
.logs-export-head span,.logs-export-note,.logs-export-muted{margin:0;color:var(--na-muted-fg);font-size:12.5px;line-height:1.55}
.logs-export-scope{display:grid;grid-template-columns:auto minmax(0,1fr);gap:4px 10px;margin:0;font-size:13px}
.logs-export-scope dt{color:var(--na-muted-fg)}
.logs-export-scope dd{min-width:0;margin:0;overflow-wrap:anywhere}
.logs-export-limit{display:flex!important;align-items:center;gap:8px;font-size:13px;font-weight:500}
.logs-export-limit select{width:auto;min-width:96px}
.logs-export-form{display:grid;gap:10px}
.logs-export-form>.btn{justify-self:end}
.logs-export-status{display:grid;gap:8px;padding:10px 12px;border-radius:var(--na-r-md);background:var(--na-muted);font-size:13px;line-height:1.55}
.logs-export-status strong{font-weight:600}
.logs-export-status.failed{background:#fdeeee;color:#b3000a}
.logs-export-status>.btn{justify-self:start}
.logs-export-wait{margin:0;color:#8a5a00;font-size:12.5px}
#channelExportButton.is-busy svg{display:none}
#logExportTrigger.is-busy:before,#channelExportButton.is-busy:before{content:"";width:12px;height:12px;border:2px solid rgba(62,164,236,.3);border-top-color:var(--na-primary);border-radius:50%;animation:channel-spin .8s linear infinite}
.logs-columns-head{padding:6px 8px 4px;color:var(--na-muted-fg);font-size:12px}
.logs-columns-list{display:flex;flex-direction:column}
.log-col-item{display:flex!important;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--na-r-sm);font-size:14px;font-weight:400;cursor:pointer}
.log-col-item:hover{background:var(--na-muted)}
.log-col-item.is-fixed{color:var(--na-muted-fg);cursor:default}
/* ---- 提示条：熔断暂停、读取失败 ---- */
.logs-banner{display:flex;align-items:center;gap:10px;flex-shrink:0;padding:10px 12px;border:1px solid #f6dfa6;border-radius:var(--na-r-lg);background:#fdf8ea;color:#8a5a00;font-size:13px;line-height:1.5}
.logs-banner.error{border-color:#f7c5c8;background:#fdeeee;color:#b3000a}
.logs-banner svg{flex:0 0 auto;width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.logs-banner>span{flex:1;min-width:0}
.logs-banner strong{font-weight:600}
.logs-banner b{font-family:var(--na-mono);font-weight:600}
.logs-banner .btn{flex:0 0 auto;background:#fff}
.logs-banner.info{border-color:#cfe5fb;background:#f3f9ff;color:#0b5394}
.logs-banner .loading-spinner{flex:0 0 auto;margin:0}
.logs-chip.is-off b{color:var(--na-muted-fg);font-weight:500}
/* ---- 表格 ---- */
.logs-frame{position:relative}
.logs-table{table-layout:fixed}
.logs-frame thead th:last-child{position:sticky;right:auto;z-index:2}
.logs-table td{overflow:hidden;text-overflow:ellipsis}
.logs-table td small{max-width:100%}
.logs-table tbody tr.log-row{cursor:pointer}
.logs-table tbody tr.log-row:focus-visible{outline:none}
.logs-table tbody tr.log-row:focus-visible td{background:var(--na-accent)}
.logs-table tbody tr.is-error td{background:#fff8f8}
.logs-table tbody tr.is-error:hover td{background:#fff1f1}
.logs-table tbody tr.log-spacer,.logs-table tbody tr.log-spacer:hover td{background:none}
.logs-table tbody tr.log-spacer td{height:auto;padding:0!important;border:0!important}
.logs-frame.is-loading tbody{opacity:.45;pointer-events:none;transition:opacity .15s}
.log-sort{display:inline-flex;align-items:center;gap:4px;height:28px;margin-left:-6px;padding:0 6px;border:0;border-radius:var(--na-r-md);background:none;color:inherit;font:inherit;cursor:pointer}
.log-sort:hover{background:var(--na-muted)}
.log-sort svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;opacity:.45}
.log-sort.active{color:var(--na-sidebar-accent-fg)}
.log-sort.active svg{opacity:1}
.log-time{font-variant-numeric:tabular-nums}
.log-type{font-size:12px;font-weight:500}
.log-type.success{color:var(--na-success)!important}
.log-type.danger{color:var(--na-destructive)!important}
.log-type.warning{color:var(--na-warning)!important}
.log-type.info{color:var(--na-info)!important}
.log-type.violet{color:#7c82dc!important}
.log-type.muted{color:var(--na-muted-fg)!important}
.log-channel{color:#7c82dc;font-weight:500;font-variant-numeric:tabular-nums}
.log-num{font-variant-numeric:tabular-nums}
.log-none{color:#a0a0a0}
.log-ellipsis{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.log-user{display:flex;align-items:center;gap:8px;min-width:0}
.log-avatar{display:grid;place-items:center;flex:0 0 auto;width:24px;height:24px;border-radius:50%;color:#fff;font-size:11px;font-weight:600}
.log-token{align-self:flex-start;max-width:100%;gap:4px;justify-content:flex-start}
.log-token svg{flex:0 0 auto;width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.logs-table td small.log-group{color:var(--na-primary)}
.log-model{max-width:100%;height:26px;gap:6px;border-radius:var(--na-r-md);font-size:13px;justify-content:flex-start}
.log-model-icon{flex:0 0 auto;width:14px;height:14px}
.log-cost{font-size:13px;font-variant-numeric:tabular-nums}
.log-timing{display:flex;align-items:center;gap:8px}
.log-timing i{flex:0 0 auto;width:3px;height:32px;border-radius:2px;background:#c9c9c9}
.log-timing span{font-variant-numeric:tabular-nums}
.log-timing em{color:var(--na-muted-fg);font-size:12px;font-style:normal}
.log-timing.success i{background:var(--na-success)}.log-timing.success span{color:var(--na-success)}
.log-timing.warning i{background:var(--na-warning)}.log-timing.warning span{color:var(--na-warning)}
.log-timing.danger i{background:var(--na-destructive)}.log-timing.danger span{color:var(--na-destructive)}
.log-detail{display:block;overflow:hidden;color:var(--na-muted-fg);font-weight:400;text-overflow:ellipsis;white-space:nowrap}
.logs-state{position:absolute;inset:40px 0 0 0;display:grid;place-items:center;background:#fff}
.logs-state .empty-state{max-width:520px}
.logs-state .loading-spinner{width:20px;height:20px;margin:0 0 8px}
.log-error .empty-icon{background:#fdeeee}
.log-error .empty-icon svg{stroke:var(--na-destructive)}
.logs-meta{margin-right:auto;max-width:none}
.logs-meta.is-stale{color:var(--na-warning)}
.logs-jump{display:flex;align-items:center;gap:8px}
.logs-jump.hidden{display:none}
#logTimeJump{width:196px}
/* ---- 详情抽屉 ---- */
.log-sheet-body{gap:20px}
#logSheetTitle .log-type{display:inline-flex;align-items:center;height:22px;padding:0 8px;border:1px solid currentColor;border-radius:999px}
.log-section h4{margin:0 0 10px;font-size:14px;font-weight:600}
.log-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 24px;margin:0}
.log-field{min-width:0}
.log-field dt{color:var(--na-muted-fg);font-size:12px}
.log-field dd{display:flex;align-items:center;gap:4px;min-height:24px;margin:2px 0 0;font-size:14px;word-break:break-all}
.log-field dd.mono{font-size:13px}
.log-copy svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.log-pre-wrap{position:relative}
.log-pre-wrap>.btn{position:absolute;top:8px;right:8px;background:#fff}
.log-pre{max-height:360px;margin:0;padding:12px;overflow:auto;border-radius:var(--na-r-md);background:var(--na-muted);font-size:12.5px;line-height:1.6;white-space:pre-wrap;word-break:break-word}
@media (max-width:1180px){.logs-filter-row{grid-template-columns:repeat(2,minmax(0,1fr))}.logs-filter-row.more{grid-template-columns:repeat(2,minmax(0,1fr))}.logs-range{grid-column:1/-1}}
@media (max-width:720px){.log-fields{grid-template-columns:1fr}.logs-range-pop{width:min(380px,calc(100vw - 48px))}}

/* mini：导出进度条（dami 的任务进度条，mini 没有任务列表，这里单独带上） */
.job-bar{height:8px;overflow:hidden;border-radius:999px;background:var(--na-muted)}
.job-bar span{display:block;height:100%;border-radius:999px;background:var(--na-primary);transition:width .3s}
/* mini：详情里「调用方」被上游脱敏时的一句说明 */
.log-note{margin:0;color:var(--na-muted-fg);font-size:13px}


/* ===================================================================== */
/* v13：用户管理对照 New API 用户表（搜索框 + 状态 / 角色筛选 + 查看；勾选批量；表头排序；时间两行；编辑 + 菜单） */
/* ===================================================================== */
#userCreateOpen{border-radius:999px}
.users-toolbar{flex-wrap:wrap;gap:12px;margin-bottom:16px}
.users-search{width:270px;max-width:100%}
.users-search input{height:36px;min-height:36px;border-radius:999px;background:#fff;border:1px solid var(--na-border)}
.users-toolbar .facet-trigger{height:32px;border-radius:10px;font-weight:500}
.users-toolbar .facet-trigger .facet-sep{width:1px;height:16px;margin:0 2px;background:var(--na-border)}
.users-toolbar .facet-badges{display:inline-flex;gap:4px}
.users-toolbar .facet-badges:empty{display:none}
.users-facet-pop{width:200px}
.users-view{border-radius:999px;height:32px}
.users-toolbar .toolbar-right{display:flex;align-items:center;gap:12px;margin-left:auto}
#userColumnsPop{width:176px}
.users-bulk{display:flex;align-items:center;gap:8px;margin:-4px 0 12px;padding:8px 12px;border:1px solid var(--na-border);border-radius:var(--na-r-lg);background:var(--na-muted);font-size:13px}
.users-bulk span{margin-right:4px}
.users-table{table-layout:fixed;min-width:1080px}
.users-table thead th{height:46px;color:var(--na-fg);font-size:14px;font-weight:500;letter-spacing:0}
.users-table tbody tr{height:68px}
/* 列宽按比例分：表格总是撑满这一栏，所有列都在一屏里（窗口窄到表格不足 1040px 才横向滚动）；放不下的文字显示省略号 */
.users-table th.col-select,.users-table td.col-select{width:40px;text-align:center;padding-left:16px;padding-right:4px}
.users-table th.col-id{width:40px}
.users-table th.col-status{width:109px}
.users-table th.col-channels{width:72px}
.users-table th.col-quota{width:104px}
.users-table th.col-role{width:94px}
/* 用户名、归属不给宽度：其余几列是固定内容，剩下的宽度这两列平分 */
.users-table th.col-token{width:128px}
.users-table th.col-time{width:204px}
.users-table th,.users-table td{padding:12px 10px}
.users-table th.col-actions{width:85px}
.users-table .log-sort{font-weight:500}
.users-table td{color:var(--na-fg);font-size:14px}
.users-table .user-id{color:var(--na-muted-fg);font-variant-numeric:tabular-nums}
.users-table .cell-name{font-size:15px}
.user-check{appearance:none;-webkit-appearance:none;display:inline-block;flex:0 0 auto;width:16px;height:16px;min-height:16px;margin:0;padding:0;border:1px solid #d4d4d8;border-radius:50%;background:#fff;box-shadow:none;cursor:pointer;vertical-align:middle;transition:background .12s,border-color .12s}
.user-check:hover{border-color:var(--na-primary)}
.user-check:checked{border-color:var(--na-primary);background:var(--na-primary) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E") center/11px no-repeat}
.user-check:indeterminate{border-color:var(--na-primary);background:var(--na-primary) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.2' stroke-linecap='round'%3E%3Cpath d='M6 12h12'/%3E%3C/svg%3E") center/11px no-repeat}
.user-state{font-size:14px;font-weight:500}
.user-state.on{color:#16a34a}
.user-state.off{color:var(--na-muted-fg)}
.user-muted{color:var(--na-muted-fg)}
.user-count{font-variant-numeric:tabular-nums}
.user-times{display:grid;grid-template-columns:auto auto;justify-content:start;gap:4px 10px;font-size:12.5px;font-variant-numeric:tabular-nums;white-space:nowrap}
.user-times span:nth-child(odd){color:var(--na-muted-fg)}
.user-times span:nth-child(even){color:#52525b}
.users-table .row-actions{justify-content:flex-start;gap:6px}
.user-edit-button svg{width:16px;height:16px}
.users-table tr.is-selected td{background:rgba(0,114,255,.04)}


/* 渠道管理的状态筛选：上游渠道列表那样的「⊕ 状态」单选弹层（圆形选择框） */
.state-facet-pop{width:200px}
.facet-check.round{border-radius:50%}

.field-hint b{color:var(--na-fg);font-weight:500}
.user-active{display:inline-flex;align-items:center;gap:8px;cursor:pointer}
/* ===== 渠道管理表格：照上游渠道列表（ID ⇕ / 名称 ⇕ / 类型 / 状态 / 分组 / 操作），一行一条、单行显示；
   列宽按比例分（app.js renderChannelHead），放不下的文字显示省略号、悬停看全；操作列固定在最右边 ===== */
.channel-table{table-layout:fixed}
.channel-table thead th{height:46px;color:var(--na-fg);font-size:14px;font-weight:500;white-space:nowrap}
.channel-table th,.channel-table td{padding:10px 12px}
.channel-table tbody tr:not(.empty-row):not(.skeleton-row){height:61px}
.channel-table td{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--na-fg);font-size:14px}
.channel-table .log-sort{font-weight:500}
.channel-id{color:var(--na-muted-fg);font-family:var(--na-mono);font-size:13px;font-variant-numeric:tabular-nums}
.channel-id.muted{font-family:inherit;font-size:12.5px}
.channel-name,.channel-text,.channel-group{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.channel-remark{color:#0e9f6e;font-weight:600}
.channel-full{color:#3f3f46}
.channel-text.muted{color:var(--na-muted-fg)}
.channel-type{display:inline-flex;align-items:center;gap:10px;max-width:100%;overflow:hidden;color:var(--na-fg)}
.channel-type>span{overflow:hidden;text-overflow:ellipsis}
.channel-group{color:#0e9f6e}
.channel-num{font-variant-numeric:tabular-nums}
.channel-num small{display:block}
.channel-table td.col-created{font-size:13px}
.channel-state{font-weight:500}
.channel-state.has-tip{cursor:help;text-decoration:underline dotted;text-underline-offset:3px}
.channel-state.success{color:#16a34a}
.channel-state.disabled,.channel-state.failed{color:#dc2626}
.channel-state.auto{color:#d97706}
.channel-state.deleted,.channel-state.unknown,.channel-state.submitting{color:var(--na-muted-fg)}
.channel-table th.col-actions,.channel-table td.col-actions{position:sticky;right:0;z-index:1;background:#fff;box-shadow:inset 1px 0 0 var(--na-border)}
.channel-table tbody tr:hover td.col-actions{background:#fafafa}
.channel-table tbody tr.row-disabled td{background:#f3f3f4}
.channel-table tbody tr.row-disabled:hover td{background:#eeeef0}
.channel-table tbody tr.row-disabled td:first-child{box-shadow:inset 3px 0 0 #a1a1aa}
.channel-table td.col-actions .row-actions{justify-content:flex-start;gap:4px}
.logo-icon{display:inline-block;flex:0 0 auto;vertical-align:middle}
/* 用户表的最小宽度：比这还窄才横向滚动（压过 .table-frame table 的 960px） */
.table-frame table.users-table{min-width:1040px}
.user-active input.switch:disabled{cursor:not-allowed;opacity:.5}

/* ===== 登录页：照 New API 登录页的样子（顶部导航 + 居中的卡片）。登录前顶部那些入口只是摆着，点不了 ===== */
.auth-page{position:relative;min-height:100vh;overflow:hidden;background:#fff;color:#1c1f23}
.auth-bg{position:absolute;inset:0;pointer-events:none}
.auth-blob{position:absolute;border-radius:50%;filter:blur(80px)}
.auth-blob.a{left:-14%;top:34%;width:48vw;height:48vw;max-width:760px;max-height:760px;background:radial-gradient(circle,rgba(190,238,226,.75) 0,rgba(190,238,226,0) 68%)}
.auth-blob.b{left:40%;top:-26%;width:54vw;height:54vw;max-width:900px;max-height:900px;background:radial-gradient(circle,rgba(214,214,255,.8) 0,rgba(214,214,255,0) 68%)}
.auth-nav{position:relative;z-index:1;display:flex;align-items:center;gap:8px;height:68px;padding:0 16px}
.auth-brand{display:inline-flex;align-items:center;gap:10px;margin-right:16px;font-size:22px;white-space:nowrap}
.auth-brand b{font-weight:700;letter-spacing:-.01em}
.brand-logo{display:block;flex:0 0 auto;object-fit:contain}
.auth-page [aria-disabled=true]{cursor:not-allowed;user-select:none}
.auth-tools{display:flex;align-items:center;gap:10px}
.auth-tool{display:grid;place-items:center;width:36px;height:36px;border-radius:50%;background:#f1f2f4;color:#41464f}
.auth-tool svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.auth-switch{display:inline-flex;align-items:center;margin-left:4px;border-radius:999px;background:#f1f2f4;font-size:14px;font-weight:600}
.auth-switch-item{padding:8px 14px;white-space:nowrap}
.auth-switch-item.primary{border-radius:999px;background:#0064fa;color:#fff}
/* 卡片上方不再放名称（左上角已经有了）；卡片收小，放在顶栏下面那块区域的中间偏上 */
.auth-center{position:relative;z-index:1;display:grid;place-items:center;min-height:calc(100vh - 68px);padding:16px}
.auth-card{width:min(380px,100%);padding:28px 24px 22px;border:1px solid #e3e5e8;border-radius:14px;background:#fff}
.auth-card h2{margin:0 0 22px;font-size:22px;line-height:1.2;font-weight:700;text-align:center;letter-spacing:.12em}
.auth-form{display:grid;gap:14px}
.auth-form .form-item{display:grid;gap:6px}
.auth-form .form-item>label{font-size:14px;line-height:1.3;font-weight:600;color:#1c1f23}
.auth-input{position:relative;display:flex;align-items:center}
.auth-input>svg{position:absolute;left:11px;z-index:1;width:16px;height:16px;fill:#6b7078;pointer-events:none}
.auth-form .auth-input input{height:36px;min-height:36px;padding:0 12px 0 36px;border:1px solid transparent;border-radius:8px;background:#f3f4f5;font-size:14px}
.auth-form .auth-input input::placeholder{color:#8a8f98}
.auth-form .auth-input input:hover{background:#eceef0}
.auth-form .auth-input input:focus,.auth-form .auth-input input:focus-visible{border-color:#0064fa;background:#fff;box-shadow:none}
.auth-form .auth-input.password-input input{padding-right:40px}
.auth-form .auth-submit{height:36px;margin-top:8px;border-radius:999px;background:#0064fa!important;color:#fff;font-size:14px;font-weight:600;box-shadow:none}
.auth-form .auth-submit:hover{background:#0057da!important}
.auth-forgot{justify-self:center;padding:0;border:0;background:none;color:#1c1f23;font-size:13px;font-weight:600;cursor:pointer}
.auth-forgot:hover{opacity:.75}
.auth-register{margin:2px 0 0;text-align:center;color:#41464f;font-size:13px}
.auth-register span{color:#0064fa}
.system-brand .brand-logo{width:22px;height:22px}
@media (max-width:520px){.auth-tool{display:none}.auth-card{padding:24px 16px 20px}}

/* ===== 下拉框的选项列表（static/select.js）：全站的 <select> 都用这个浮层，不用浏览器自带的列表 ===== */
.ui-select-pop{position:fixed;z-index:200;max-width:min(520px,calc(100vw - 16px));padding:4px;overflow:auto;border-radius:var(--na-r-lg);background:#fff;box-shadow:var(--na-shadow-md),0 0 0 1px #e7e7e7;color:var(--na-fg);font-size:14px;line-height:1.4;animation:ui-select-in .1s ease-out}
.ui-option{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:32px;padding:6px 8px 6px 10px;border-radius:var(--na-r-sm);cursor:pointer}
.ui-option span{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.ui-option svg{flex:0 0 auto;width:16px;height:16px;fill:none;stroke:var(--na-primary);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;visibility:hidden}
.ui-option.active{background:var(--na-accent)}
.ui-option.selected{font-weight:500}
.ui-option.selected svg{visibility:visible}
.ui-option.disabled{color:var(--na-muted-fg);cursor:not-allowed}
.ui-optgroup{padding:6px 10px 2px;color:var(--na-muted-fg);font-size:12px}
select{cursor:pointer}
select:disabled{cursor:not-allowed}
select.is-open{border-color:var(--na-ring);box-shadow:inset 0 0 0 3px var(--na-ring-soft)}
@keyframes ui-select-in{from{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:none}}
/* 三级账号：角色标签、「未分配」、归属链 */
.level-tag{display:inline-flex;align-items:center;height:22px;padding:0 7px;border-radius:999px;background:var(--na-muted);color:#404040;font-size:12px;font-weight:500;white-space:nowrap}
.level-tag.super{background:#f3e8ff;color:#7e22ce}
.level-tag.admin{background:var(--na-accent);color:var(--na-sidebar-accent-fg)}
.level-tag.unassigned{background:#fff7ed;color:#c2410c}
.user-owner-count{display:block;overflow:hidden;color:var(--na-fg);font-size:13.5px;text-overflow:ellipsis;white-space:nowrap}
.owner-chain{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 「归属」树形筛选（数据看板、渠道管理、使用日志、用户管理） */
.owner-pop{width:320px}
.owner-list{max-height:360px}
.owner-row{display:flex;align-items:center;gap:2px;padding-left:calc(var(--depth,0) * 18px)}
.owner-caret,.owner-caret-gap{flex:0 0 22px;width:22px;height:22px}
.owner-caret{display:grid;place-items:center;padding:0;border:0;border-radius:6px;background:none;color:var(--na-muted-fg);cursor:pointer}
.owner-caret:hover{background:var(--na-muted);color:var(--na-fg)}
.owner-caret svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;transition:transform .15s}
.owner-caret.open svg{transform:rotate(90deg)}
.owner-item{display:flex;flex:1 1 auto;align-items:center;min-width:0;padding:6px 8px;border:0;border-radius:var(--na-r-sm);background:none;color:var(--na-fg);font-size:14px;text-align:left;cursor:pointer}
.owner-item:hover,.owner-item:focus-visible{outline:none;background:var(--na-muted)}
.owner-item.selected{background:var(--na-accent);color:var(--na-sidebar-accent-fg);font-weight:600}
.owner-item.is-group .owner-name{font-weight:600}
.owner-item.is-off .owner-name{color:var(--na-muted-fg)}
.owner-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.owner-role{flex:0 0 auto;color:var(--na-muted-fg);font-size:13px;font-weight:400}
.owner-meta{flex:0 1 auto;min-width:0;margin-left:auto;padding-left:10px;overflow:hidden;color:var(--na-muted-fg);font-size:12px;font-weight:400;text-overflow:ellipsis;white-space:nowrap}
/* 分配归属 / 关联供应商 */
.assign-search{width:100%;max-width:none;margin-bottom:12px}
.assign-list{display:flex;flex-direction:column;gap:6px}
.assign-row{display:flex!important;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--na-border);border-radius:var(--na-r-md);cursor:pointer}
.assign-row:hover{background:var(--na-muted)}
.assign-row.is-checked{border-color:var(--na-primary);background:var(--na-accent)}
.assign-row.is-off .assign-main b{color:var(--na-muted-fg)}
.assign-row input{flex:0 0 auto;width:16px;height:16px;min-height:0;margin:0;padding:0}
.assign-main{display:flex;flex-direction:column;gap:2px;min-width:0}
.assign-main b{overflow:hidden;font-weight:500;text-overflow:ellipsis;white-space:nowrap}
.assign-main small{overflow:hidden;color:var(--na-muted-fg);font-size:12px;font-weight:400;text-overflow:ellipsis;white-space:nowrap}
.assign-meta{margin-left:auto;color:var(--na-muted-fg);font-size:12px;font-weight:400;white-space:nowrap}
.assign-meta em{color:var(--na-destructive);font-style:normal}
.assign-count{align-self:center;color:var(--na-muted-fg);font-size:13px}
.user-quota{font-variant-numeric:tabular-nums}
/* 批量删除无渠道 / 无消耗用户 */
.btn.danger-outline{border-color:#f3c7c7;color:var(--na-destructive)}
.btn.danger-outline:hover:not(:disabled){background:#fdf2f2}
.btn.danger{border-color:var(--na-destructive);background:var(--na-destructive);color:#fff}
.btn.danger:hover:not(:disabled){background:#c62828}
.btn.danger:disabled{opacity:.5;cursor:not-allowed}
.cleanup-group+.cleanup-group{margin-top:20px}
.cleanup-all{display:flex!important;align-items:center;gap:10px;padding:4px 2px 10px;border-bottom:1px solid var(--na-border);font-size:14px;font-weight:600;cursor:pointer}
.cleanup-all small{margin-left:8px;color:var(--na-muted-fg);font-size:12px;font-weight:400}
.cleanup-all input,.cleanup-row input{flex:0 0 auto;width:16px;height:16px;min-height:0;margin:0;padding:0}
.cleanup-list{display:grid}
.cleanup-row{display:flex!important;align-items:center;gap:10px;padding:10px 2px;border-bottom:1px solid var(--na-border-soft);font-weight:400;cursor:pointer}
.cleanup-row:hover{background:var(--na-muted)}
.cleanup-row.is-off .cleanup-name strong{color:var(--na-muted-fg)}
.cleanup-name{display:grid;flex:1 1 auto;min-width:0}
.cleanup-name strong{overflow:hidden;font-size:14px;font-weight:500;text-overflow:ellipsis;white-space:nowrap}
.cleanup-name small,.cleanup-meta small{color:var(--na-muted-fg);font-size:12px;font-weight:400}
.cleanup-meta{display:grid;flex:0 0 auto;justify-items:end;gap:2px}
.cleanup-meta em{color:var(--na-warning);font-size:12px;font-style:normal}
.cleanup-meta em.neutral{color:var(--na-fg)}
.cleanup-note{margin:8px 2px 4px;padding:8px 10px;border-radius:var(--na-r-sm);background:#fff7ed;color:#9a3412;font-size:12.5px;line-height:1.5}
.cleanup-note.muted{margin-top:16px;background:var(--na-muted);color:var(--na-muted-fg)}
.cleanup-none{margin:10px 2px;color:var(--na-muted-fg);font-size:13px}
.cleanup-confirm+.cleanup-confirm{margin-top:18px}
.cleanup-confirm h4{margin:0 0 8px;font-size:14px;font-weight:600}
.cleanup-confirm.warn h4{color:#9a3412}
.cleanup-confirm ul{display:grid;gap:6px;margin:0;padding:0;list-style:none}
.cleanup-confirm li{display:flex;align-items:baseline;gap:8px;padding:8px 10px;border:1px solid var(--na-border);border-radius:var(--na-r-sm);font-size:14px}
.cleanup-confirm li b{font-weight:500}
.cleanup-confirm li small{min-width:0;overflow:hidden;color:var(--na-muted-fg);font-size:12px;text-overflow:ellipsis;white-space:nowrap}
.cleanup-confirm li em{margin-left:auto;color:var(--na-muted-fg);font-size:12px;font-style:normal;white-space:nowrap}
/* 用户管理按归属排成树：下级缩进，前面一个 └ */
.user-tree{position:relative;display:flex;align-items:flex-start;min-width:0;padding-left:calc(var(--depth,0) * 20px)}
.user-tree .cell-stack{min-width:0}
.users-table .user-tree .cell-name{max-width:100%;font-weight:600}
.user-branch{position:absolute;top:3px;left:calc(var(--depth,0) * 20px - 15px);width:9px;height:10px;border-bottom:1.5px solid #8f96a1;border-left:1.5px solid #8f96a1;border-bottom-left-radius:2px}
/* 「分配给…」的去处是一棵树：一行一个账号，按层级缩进；要挪的和它的下级灰掉 */
.assign-list:has(.assign-row.tree){gap:2px}
.assign-row.tree{padding:7px 10px 7px calc(10px + var(--depth,0) * 20px);border-color:transparent}
.assign-row.tree:hover{border-color:var(--na-border)}
.assign-row.tree.is-checked{border-color:var(--na-primary)}
.assign-row.tree.is-group .assign-main b{font-weight:600}
.assign-row.is-disabled{cursor:not-allowed;opacity:.5}
.assign-row.is-disabled:hover{border-color:transparent;background:none}
/* 固定模型（照上游模板渠道）：标签不带 ×，框不能点开 */
.chips-box.is-locked{background:var(--na-muted);cursor:default}
.chips-box.is-locked .chip{background:#fff;padding-right:8px}
.type-models-cell strong .badge{margin-left:6px;vertical-align:1px}
/* 导入上游渠道 */
.import-body{display:grid;grid-template-columns:minmax(0,1fr);gap:16px;align-content:start}
.import-body>*{min-width:0}
.import-body>label{display:grid;grid-template-columns:minmax(0,1fr);gap:8px;font-size:14px;font-weight:500}
.import-body textarea{width:100%;min-height:180px;white-space:pre;overflow-x:auto}
.import-preview table.import-table{width:100%;min-width:0;border-collapse:collapse;font-size:13px;table-layout:fixed}
.import-table th,.import-table td{padding:6px 8px;border-bottom:1px solid var(--na-border-soft);text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.import-table th{color:var(--na-muted-fg);font-weight:500}
.import-table th:first-child{width:110px}
.import-table th:last-child{width:150px}
.import-result li span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 直台模板 */
#channelForm label.is-locked input{background:var(--na-muted);color:var(--na-muted-fg);cursor:not-allowed;opacity:1}
#channelForm label.is-locked small{color:#065f46}
.template-note{margin:12px 0 0;padding:10px 12px;border-radius:var(--na-r-sm);background:#ecfdf5;color:#065f46;font-size:13px;line-height:1.6}
.template-card{margin-top:12px;padding:12px 14px;border:1px solid var(--na-border);border-radius:var(--na-r-lg);background:var(--na-muted)}
.template-card dl{display:grid;grid-template-columns:auto minmax(0,1fr);gap:6px 14px;margin:0;font-size:13px}
.template-card dt{color:var(--na-muted-fg)}
.template-card dd{min-width:0;margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.template-card small{display:block;margin-top:10px;color:var(--na-muted-fg);font-size:12px}
.template-card .form-error{margin:8px 0 0}
.badge.warning{background:#fff7ed;color:#9a3412}
/* 调台（公共模块 channel_copy，static/common/channel-copy.css）：渠道表里叠在下面的那一行不撑成 61px 高、文字能换行；
   公共设置面板的挂载点不占 #settingsPage 的一格间距（收起的面板 display:none，展开的那一块直接当设置页里的一张卡片） */
.channel-table tbody tr.gw-cc-subrow{height:auto!important}
.channel-table tbody tr.gw-cc-subrow td{overflow:visible;white-space:normal}
#settingsCommonPanels{display:contents}
/* 操作列的「调台」：带字的蓝色按钮，和后面三个灰图标隔开一点，一眼就能看到 */
.channel-table .channel-copy-button{flex:0 0 auto;margin-right:6px;padding:0 10px 0 8px;border-color:color-mix(in oklab,var(--na-primary) 55%,transparent);background:var(--na-accent);color:#0276ea;font-weight:600}
.channel-table .channel-copy-button svg{color:currentColor}
.channel-table .channel-copy-button:hover:not(:disabled){border-color:var(--na-primary);background:var(--na-primary);color:#fff}
.channel-table .channel-copy-button:disabled{border-color:var(--na-border);background:transparent;color:var(--na-muted-fg)}
/* 调过台的渠道下面那一行（app.js 的 copyNoteHtml）：当前渠道总消耗　调度 ➡️ 台子 #号 · 状态 · 消耗 */
.cc-note{display:flex;flex-wrap:wrap;align-items:center;gap:8px 28px;padding:7px 14px;border:1px solid #d6e8fb;border-radius:10px;background:#f5faff;color:var(--na-muted-fg);font-size:13px;line-height:1.5}
.cc-note b{color:var(--na-fg);font-weight:600;font-variant-numeric:tabular-nums}
.cc-note-total{color:var(--na-fg);font-weight:500;cursor:help}
.cc-note-total b{color:#0276ea;font-size:14px}
.cc-note-hop{display:inline-flex;flex-wrap:wrap;align-items:center;gap:4px 8px}
.cc-note-label{color:var(--na-fg);font-weight:500}
.cc-note-arrow{font-size:14px;line-height:1}
.cc-note-peer{color:var(--na-fg);font-weight:600;white-space:nowrap}
.cc-note .cc-note-peer small{display:inline;max-width:none;margin:0;color:var(--na-muted-fg);font-size:12px;font-weight:400}
.cc-note-state{display:inline-flex;align-items:center;gap:4px;font-size:12px;font-weight:500}
.cc-note-state::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}
.cc-note-state.success{color:#16a34a}
.cc-note-state.disabled{color:#dc2626}
.cc-note-state.auto{color:#d97706}
.cc-note-state.muted{color:var(--na-muted-fg)}
.cc-note .cc-note-pending{color:var(--na-warning);font-weight:500}
.cc-note-hop.has-error .cc-note-peer{text-decoration:underline dotted var(--na-warning);text-underline-offset:3px}

/* 本页单独登录（「在本页登录其他账号」，公共模块 GwCommon.session）：页头、登录卡片上的小标记和「回到默认账号」 */
.slot-mark{display:inline-flex;align-items:center;gap:6px;height:24px;padding:0 3px 0 9px;border:1px solid #fed7aa;border-radius:999px;background:#fff7ed;color:#9a3412;font-size:12px;white-space:nowrap}
.slot-mark-text{font-weight:600}
.slot-mark-back{height:18px;padding:0 8px;border:0;border-radius:999px;background:#fff;color:var(--na-primary);font-size:12px;font-weight:500;cursor:pointer}
.slot-mark-back:hover{text-decoration:underline}
.auth-slot{margin:-8px 0 16px;padding:8px 10px;border:1px solid #fed7aa;border-radius:8px;background:#fff7ed;color:#9a3412;font-size:13px;line-height:1.5}
.auth-slot .slot-mark-text{margin-right:6px}
.auth-slot .text-link{margin-left:4px}
@media (max-width:520px){.app-header .slot-mark-text{display:none}}

/* 公共模块（static/common/，源头 null53/gateway-common）的颜色：mini 的变量是 --na-* 这一套，这里对上 --gw-* */
:root{
  --gw-fg:var(--na-fg);--gw-border:var(--na-border);--gw-muted-fg:var(--na-muted-fg);--gw-success:var(--na-success);
  --gw-danger:var(--na-destructive);--gw-warning:var(--na-warning);--gw-table-header:#fbfbfb;--gw-mono:var(--na-mono);
}
/* 「系统设置 → 渠道归属」：归属筛选和「选新的归属账号」是渠道管理那个归属树形下拉（app.js 的 mountCommonOwnerPicker）。
   卡片本来 overflow:hidden（裁圆角），弹层会被卡片底边切掉，这张卡片放开；贴在下面的「新归属」放不下时往上弹（.up） */
#settingsPage .settings-card.gw-cho{overflow:visible}
.facet-pop.up{top:auto;bottom:calc(100% + 6px)}
/* 公共模块给查找栏、改归属那一栏的按钮都定了 36px 高：弹层里的行、展开按钮不跟着变 */
.gw-cho .owner-picker .facet-pop button{height:auto}
.gw-cho .owner-picker .facet-pop .owner-caret{height:22px}
.gw-cho .owner-picker .facet-trigger .badge{max-width:240px}
/* 不能改给的账号（blocked）：灰掉、不能选，原因写在右边；有下级照样能展开 */
.owner-item.is-blocked{cursor:not-allowed}
.owner-item.is-blocked:hover{background:none}
.owner-item.is-blocked .owner-name,.owner-item.is-blocked .owner-role{color:var(--na-muted-fg)}

/* 付费方式（公共模块 channel_billing，static/common/channel-billing.css）：渠道名称后面的「跑付 / 买断」小标签（名称照旧
   省略号截断，标签一直露出来）、表格上方的筛选（和旁边的虚线筛选按钮一个样子）、创建抽屉里那一组按钮的字号跟旁边的表单项 */
.channel-name-line{display:flex;align-items:center;gap:6px;min-width:0}
.channel-name-line .channel-name{min-width:0}
.channel-name-line .gw-billing-tag{flex:0 0 auto}
.billing-filter{width:auto;min-width:128px;height:32px;min-height:32px;border-style:dashed;border-radius:var(--na-r-md);font-size:12.8px;font-weight:500}
#billingModeField .gw-billing-title{font-size:14px}
#billingModeField .gw-billing-note{font-size:13px}

.proxy-pool-table{table-layout:fixed}
.proxy-pool-table th:nth-child(1){width:48%}
.proxy-pool-table th:nth-child(2){width:110px}
.proxy-pool-table th:nth-child(3){width:auto}
.proxy-pool-table td{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:13.5px}
.proxy-pool-table td:last-child{white-space:normal;text-overflow:clip;overflow:visible}
.proxy-pool-table .badge{margin-right:4px}
