.admin-shell{display:grid;grid-template-columns:164px 1fr;min-height:100vh;transition:grid-template-columns .22s var(--ease)}
.admin-shell.is-collapsed{grid-template-columns:72px 1fr}
.admin-side{
  display:flex;flex-direction:column;align-items:stretch;gap:8px;
  border-right:1px solid var(--border);background:rgba(7,9,13,.62);backdrop-filter:blur(16px);
  padding:14px 10px 16px;position:sticky;top:0;height:100vh;overflow:auto
}
.admin-side .logo{display:flex;align-items:center;gap:10px;padding:6px 10px 16px;font-weight:800;font-size:14px}
.admin-side .logo .b{width:9px;height:9px;border-radius:50%;background:var(--accent);box-shadow:0 0 0 4px rgba(45,212,191,.15)}
.admin-nav{display:flex;flex-direction:column;gap:6px}
.admin-nav button{
  display:flex;align-items:center;gap:12px;width:100%;text-align:left;
  padding:8px 10px;min-height:48px;border-radius:14px;border:1px solid transparent;
  background:transparent;color:var(--text-md);font:inherit;font-size:14px;font-weight:700;
  letter-spacing:.01em;cursor:pointer;
  transition:background .15s,color .15s,border-color .15s,box-shadow .15s
}
.admin-nav button:hover{background:var(--fill-md);color:var(--text-hi)}
.admin-nav button.active{background:var(--acc-soft);border-color:var(--acc-soft-bd);color:var(--accent);box-shadow:var(--sh-glow)}
.admin-nav button i{
  width:34px;height:34px;border-radius:11px;flex:none;
  display:inline-flex;align-items:center;justify-content:center;
  font-size:16px;background:rgba(255,255,255,.05)
}
.admin-nav button.active i{background:rgba(45,212,191,.16);color:var(--accent)}
.admin-nav .nav-label{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:14px}
.admin-nav .nav-group{display:flex;flex-direction:column;gap:4px;margin-top:4px}
.admin-nav .nav-group-label{
  display:flex;align-items:center;gap:12px;padding:6px 10px 2px;
  color:var(--text-lo);font-size:11px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;
  opacity:.85;pointer-events:none;user-select:none
}
.admin-nav .nav-group-label i{
  width:34px;height:22px;border-radius:8px;flex:none;
  display:inline-flex;align-items:center;justify-content:center;
  font-size:13px;background:transparent;color:var(--text-lo)
}
.admin-nav .nav-group-items{display:flex;flex-direction:column;gap:4px;padding-left:0}
.admin-nav .nav-group-items button{min-height:42px;padding:6px 10px 6px 14px;font-size:13px}
.admin-nav .nav-group.is-open .nav-group-label{color:var(--accent);opacity:1}
.admin-shell.is-collapsed .nav-group-label .nav-label{display:none}
.admin-shell.is-collapsed .nav-group-label{justify-content:center;padding:4px 0 0;gap:0}
.admin-shell.is-collapsed .nav-group-label i{width:auto;height:auto;font-size:12px;opacity:.55}
.admin-shell.is-collapsed .nav-group-items{align-items:center;gap:8px}
.admin-shell.is-collapsed .nav-group-items button{width:52px;height:48px;min-height:48px;padding:0;justify-content:center}
.admin-shell.is-collapsed .admin-side{align-items:center;padding:14px 8px}
.admin-shell.is-collapsed .admin-nav{align-items:center;gap:10px}
.admin-shell.is-collapsed .admin-nav button{
  width:52px;height:52px;min-height:52px;padding:0;gap:0;justify-content:center;border-radius:16px
}
.admin-shell.is-collapsed .admin-nav button i{width:auto;height:auto;background:transparent;font-size:18px}
.admin-shell.is-collapsed .nav-label{display:none}
.admin-side-toggle{
  appearance:none;-webkit-appearance:none;flex:none;
  display:inline-flex;align-items:center;justify-content:center;
  width:28px;height:28px;border-radius:8px;cursor:pointer;padding:0;
  border:1px solid var(--border);background:transparent;
  color:var(--text-md);font-size:12px;line-height:1;
  transition:background .15s,color .15s,border-color .15s
}
.admin-side-toggle:hover{background:var(--fill-md);color:var(--accent);border-color:var(--acc-soft-bd)}
.admin-main{padding:18px clamp(14px,2.5vw,26px) 56px;min-width:0;max-width:1280px}
.admin-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px}
.admin-head h1{font-size:22px;font-weight:800;font-family:var(--font-display);letter-spacing:-.02em}
.admin-sub{font-size:13px;color:var(--text-lo);width:100%;margin-top:-6px;margin-bottom:8px}
.admin-toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:12px}
.admin-toolbar input,.admin-toolbar select,.admin-field input,.admin-field select,.admin-field textarea{
  height:38px;padding:0 12px;border-radius:10px;background:var(--input-bg);border:1px solid var(--border);
  color:var(--text-hi);font:inherit;font-size:13px;min-width:0}
.admin-field textarea{height:auto;min-height:68px;padding:10px 12px;resize:vertical}
.admin-field{display:flex;flex-direction:column;gap:6px;font-size:12px;color:var(--text-md)}
.admin-field label{font-weight:700;color:var(--text-md)}
.admin-grid-stats{display:grid;grid-template-columns:repeat(auto-fill,minmax(148px,1fr));gap:10px;margin-bottom:14px}
.stat-card{padding:14px 16px;border-radius:var(--r-md);cursor:pointer;transition:transform .15s,border-color .15s}
.stat-card:hover{transform:translateY(-2px);border-color:var(--acc-soft-bd)}
.stat-card .k{font-size:11.5px;color:var(--text-lo);font-weight:700;letter-spacing:.02em}
.stat-card .v{font-size:26px;font-weight:800;font-family:var(--font-display);margin-top:4px}
.admin-table-wrap{overflow:auto;border-radius:var(--r-md);border:1px solid var(--border);max-height:min(68vh,720px)}
table.admin-table{width:100%;border-collapse:collapse;font-size:12.5px}
table.admin-table th,table.admin-table td{padding:9px 11px;text-align:left;border-bottom:1px solid var(--border);vertical-align:middle}
table.admin-table th{position:sticky;top:0;background:rgba(13,17,23,.94);color:var(--text-lo);font-size:10.5px;letter-spacing:.05em;text-transform:uppercase;z-index:1}
table.admin-table tr:hover td{background:var(--fill-lo)}
table.admin-table .mono{font-family:var(--font-display);font-size:11.5px}
.admin-panel{padding:16px;margin-bottom:14px}
.admin-form{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px}
.admin-form .span2{grid-column:span 2}
.admin-msg{padding:10px 12px;border-radius:10px;font-size:13px;margin-top:10px;line-height:1.45}
.admin-msg.ok{background:rgba(52,211,153,.12);border:1px solid rgba(52,211,153,.28);color:#7ee3bf}
.admin-msg.err{background:rgba(248,113,113,.12);border:1px solid rgba(248,113,113,.28);color:#fca5a5}
.admin-msg.info{background:var(--acc-soft);border:1px solid var(--acc-soft-bd);color:var(--accent)}
.admin-msg.warn{background:rgba(251,191,36,.12);border:1px solid rgba(251,191,36,.28);color:#fcd34d}
.progress{height:8px;border-radius:999px;background:rgba(255,255,255,.08);overflow:hidden;margin-top:8px}
.progress>i{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--accent),var(--accent2));transition:width .15s}
.row-actions{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.seg{display:inline-flex;padding:3px;border-radius:12px;border:1px solid var(--border);background:rgba(0,0,0,.18);gap:2px}
.seg button{height:30px;padding:0 12px;border:0;border-radius:9px;background:transparent;color:var(--text-md);font:inherit;font-size:12px;font-weight:700;cursor:pointer}
.seg button.on{background:var(--acc-soft);color:var(--accent)}
.btn-sm{height:32px!important;font-size:12px!important;padding:0 12px!important}
.toast-host{position:fixed;right:16px;bottom:16px;z-index:80;display:flex;flex-direction:column;gap:8px;max-width:min(420px,92vw)}
.toast{padding:12px 14px;border-radius:12px;background:rgba(13,17,23,.92);border:1px solid var(--border);box-shadow:var(--sh-card);font-size:13px;backdrop-filter:blur(12px)}
.toast.ok{border-color:rgba(52,211,153,.35)}
.toast.err{border-color:rgba(248,113,113,.4)}
.modal-mask{position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:70;display:flex;align-items:center;justify-content:center;padding:20px}
.modal{width:min(480px,100%);padding:20px;border-radius:16px}
.modal h3{font-size:17px;font-weight:800;margin-bottom:8px}
.modal .body{font-size:13px;color:var(--text-md);line-height:1.55;margin-bottom:16px}
.modal .body.is-done-sub{margin-bottom:14px;color:var(--text-lo);font-size:12.5px}
.modal.is-success h3,.modal.is-partial h3{color:var(--text-hi)}
.modal-ok-ico{
  width:52px;height:52px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;
  background:radial-gradient(circle at 35% 30%,rgba(110,231,183,.28),rgba(52,211,153,.1) 62%,rgba(52,211,153,.06));
  border:1px solid rgba(110,231,183,.38);color:#6ee7b7;
  font-size:20px;margin-bottom:14px;
  box-shadow:0 0 0 6px rgba(52,211,153,.08),0 10px 28px rgba(0,0,0,.28),inset 0 1px 0 rgba(255,255,255,.12);
  animation:confirmIcoIn .42s cubic-bezier(.2,.8,.2,1) both
}
.modal-ok-ico.is-busy{
  background:radial-gradient(circle at 35% 30%,rgba(45,212,191,.22),rgba(45,212,191,.08));
  border-color:rgba(45,212,191,.35);color:var(--accent);
  box-shadow:0 0 0 6px rgba(45,212,191,.08),0 10px 28px rgba(0,0,0,.28)
}
.modal-ok-ico.is-warn{
  background:radial-gradient(circle at 35% 30%,rgba(251,191,36,.28),rgba(251,191,36,.1));
  border-color:rgba(251,191,36,.4);color:#fcd34d;
  box-shadow:0 0 0 6px rgba(251,191,36,.08),0 10px 28px rgba(0,0,0,.28)
}
@keyframes confirmIcoIn{
  from{opacity:0;transform:scale(.72)}
  to{opacity:1;transform:scale(1)}
}
.confirm-modal.is-success,.confirm-modal.is-partial{
  padding:28px 24px 22px;
  border:1px solid rgba(255,255,255,.08);
  box-shadow:0 24px 64px rgba(0,0,0,.5),0 0 0 1px rgba(255,255,255,.03)
}
.confirm-modal.is-success{border-color:rgba(52,211,153,.22);box-shadow:0 24px 64px rgba(0,0,0,.5),0 0 72px rgba(52,211,153,.07)}
.confirm-modal.is-partial{border-color:rgba(251,191,36,.28);box-shadow:0 24px 64px rgba(0,0,0,.5),0 0 72px rgba(251,191,36,.06)}
.confirm-modal.is-progress{padding:26px 22px 20px}
.confirm-stats{
  display:grid;grid-template-columns:repeat(3,1fr);gap:8px;
  margin:0 0 18px
}
.confirm-stat{
  padding:12px 8px;border-radius:12px;text-align:center;
  background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.06)
}
.confirm-stat-n{
  display:block;font-size:22px;font-weight:800;line-height:1.1;
  letter-spacing:-.03em;color:var(--text-hi);font-family:var(--font-display)
}
.confirm-stat-l{
  display:block;margin-top:4px;font-size:11px;font-weight:650;
  color:var(--text-lo);letter-spacing:.02em
}
.confirm-stat.is-ok .confirm-stat-n{color:#6ee7b7}
.confirm-stat.is-fail .confirm-stat-n{color:#fca5a5}
.confirm-stat.is-fail.is-zero .confirm-stat-n{color:var(--text-lo)}
.confirm-stat.is-ok{background:rgba(52,211,153,.07);border-color:rgba(52,211,153,.2)}
.confirm-stat.is-fail:not(.is-zero){background:rgba(248,113,113,.08);border-color:rgba(248,113,113,.22)}
.confirm-progress{margin:4px 0 6px}
.confirm-bar{height:6px;margin-top:0;background:rgba(255,255,255,.06)}
.confirm-bar>i{background:linear-gradient(90deg,var(--accent),#5eead4);box-shadow:0 0 12px rgba(45,212,191,.35)}
.confirm-progress-meta{
  display:flex;justify-content:space-between;align-items:baseline;gap:12px;
  margin-top:8px;font-size:12px;color:var(--text-lo)
}
.confirm-progress-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-md)}
.confirm-progress-pct{flex:none;font-variant-numeric:tabular-nums;font-weight:700;color:var(--accent)}
.confirm-actions{justify-content:flex-end;margin-top:4px}
.confirm-done-btn{min-width:108px}
html[data-theme="light"] .confirm-stat{background:rgba(15,23,42,.03);border-color:rgba(15,23,42,.08)}
html[data-theme="light"] .confirm-stat.is-ok{background:rgba(16,185,129,.08);border-color:rgba(16,185,129,.22)}
html[data-theme="light"] .confirm-modal.is-success{border-color:rgba(16,185,129,.28);box-shadow:0 20px 48px rgba(15,23,42,.12)}

.ota-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.step{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-lo);margin-bottom:10px}
.step b{width:20px;height:20px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;background:var(--acc-soft);color:var(--accent);font-size:11px}
.copy{cursor:pointer;opacity:.7}.copy:hover{opacity:1;color:var(--accent)}
@media (max-width:960px){
  .admin-shell,.admin-shell.is-collapsed{grid-template-columns:1fr}
  .admin-side{position:relative;height:auto;border-right:none;border-bottom:1px solid var(--border);flex-direction:row;align-items:center;padding:8px}
  .admin-nav{flex-direction:row;flex-wrap:wrap;flex:1}
  .admin-nav button{width:auto}
  .admin-shell.is-collapsed .admin-nav button{width:52px}
  .ota-grid{grid-template-columns:1fr}
  .admin-form .span2{grid-column:span 1}
}

.gbtn.danger{border-color:rgba(248,113,113,.45)!important;color:#fca5a5!important}
.gbtn.danger:hover{background:rgba(248,113,113,.12)!important}
.modal.wide{width:min(560px,100%)}
.modal .admin-form{margin-top:8px}

/* SSH console — terminal-first ops surface */
.ssh-mask{
  padding:clamp(12px,2.5vw,28px);
  background:rgba(2,6,12,.72);
  backdrop-filter:blur(10px);
  align-items:center
}
.ssh-mask.is-fullscreen{padding:0;align-items:stretch}
.ssh-console{
  width:min(1280px,100%);
  height:min(90vh,920px);
  max-height:min(90vh,920px);
  padding:0;
  overflow:hidden;
  display:flex;flex-direction:column;
  border:1px solid rgba(45,212,191,.18);
  box-shadow:0 28px 80px rgba(0,0,0,.55),0 0 0 1px rgba(255,255,255,.04),0 0 90px rgba(45,212,191,.07);
  background:
    radial-gradient(120% 80% at 0% 0%,rgba(45,212,191,.1),transparent 42%),
    radial-gradient(90% 60% at 100% 0%,rgba(56,189,248,.07),transparent 45%),
    rgba(8,12,18,.94)
}
.ssh-console.is-fullscreen{
  width:100%;height:100%;max-height:none;border-radius:0;border-width:0 0 0 0;
  box-shadow:none
}
.ssh-console-top{
  display:flex;align-items:center;justify-content:space-between;gap:14px;
  padding:12px 16px;border-bottom:1px solid rgba(255,255,255,.06)
}
.ssh-console-brand{display:flex;gap:14px;align-items:flex-start;min-width:0}
.ssh-console-orb{
  width:42px;height:42px;border-radius:14px;flex:none;margin-top:2px;
  background:
    radial-gradient(circle at 30% 28%,#5eead4,#0f766e 62%,#042f2e);
  box-shadow:0 0 0 1px rgba(94,234,212,.35),0 10px 28px rgba(45,212,191,.25);
  position:relative
}
.ssh-console-orb::after{
  content:"";position:absolute;inset:11px;border-radius:8px;
  border:1.5px solid rgba(255,255,255,.55);border-bottom-color:transparent;border-left-color:transparent;
  transform:rotate(45deg)
}
.ssh-console-headtxt{min-width:0}
.ssh-console-kicker{
  font-size:10px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;
  color:var(--accent);opacity:.9;margin-bottom:4px
}
.ssh-console-title{
  margin:0;font-family:var(--font-display);font-size:22px;font-weight:800;
  letter-spacing:-.03em;line-height:1.15
}
.ssh-console-sub{
  margin:4px 0 0;font-size:12px;color:var(--text-lo);line-height:1.35;max-width:62ch;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap
}
.ssh-console-x{
  appearance:none;width:36px;height:36px;border-radius:12px;flex:none;
  border:1px solid var(--border);background:rgba(255,255,255,.03);color:var(--text-md);
  display:inline-flex;align-items:center;justify-content:center;cursor:pointer;
  transition:background .15s,color .15s,border-color .15s
}
.ssh-console-x:hover{background:rgba(248,113,113,.12);color:#fca5a5;border-color:rgba(248,113,113,.35)}
.ssh-console-actions-top{display:flex;align-items:center;gap:8px;flex:none}
.ssh-console-fs{
  appearance:none;width:36px;height:36px;border-radius:12px;flex:none;
  border:1px solid var(--border);background:rgba(255,255,255,.03);color:var(--text-md);
  display:inline-flex;align-items:center;justify-content:center;cursor:pointer;
  transition:background .15s,color .15s,border-color .15s
}
.ssh-console-fs:hover{background:var(--acc-soft);color:var(--accent);border-color:var(--acc-soft-bd)}
.ssh-console.is-fullscreen .ssh-console-bar{padding-top:10px;padding-bottom:10px}
.ssh-console.is-fullscreen .ssh-cmd-row{padding-top:6px;padding-bottom:8px}

.ssh-console-bar{
  display:grid;
  grid-template-columns:minmax(100px,.7fr) minmax(160px,1.4fr) minmax(88px,.55fr) auto;
  gap:10px;align-items:end;padding:12px 20px;border-bottom:1px solid rgba(255,255,255,.05)
}
.ssh-field{display:flex;flex-direction:column;gap:5px;min-width:0;font-size:11px;font-weight:700;color:var(--text-lo);letter-spacing:.02em}
.ssh-console .ssh-field .ssh-input,
.ssh-console .ssh-field .ginput,
.ssh-console .ssh-field input{
  height:40px;width:100%;padding:0 12px;border-radius:11px;
  background:#0b1418 !important;border:1px solid rgba(94,234,212,.22) !important;
  color:#e7fff8 !important;caret-color:#5eead4;
  font:inherit;font-size:13.5px;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.04);
  -webkit-text-fill-color:#e7fff8
}
.ssh-console .ssh-field .ssh-input.mono,
.ssh-console .ssh-field .ginput.mono,
.ssh-console .ssh-field input.mono{
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;letter-spacing:.02em;color:#9aefd9 !important;-webkit-text-fill-color:#9aefd9
}
.ssh-console .ssh-field .ssh-input:focus,
.ssh-console .ssh-field .ginput:focus,
.ssh-console .ssh-field input:focus{
  outline:none;border-color:rgba(45,212,191,.55) !important;box-shadow:0 0 0 3px rgba(45,212,191,.16),inset 0 1px 0 rgba(255,255,255,.05)
}
.ssh-console .ssh-field .ssh-input::placeholder,
.ssh-console .ssh-field input::placeholder{color:rgba(167,243,208,.45);-webkit-text-fill-color:rgba(167,243,208,.45)}
.ssh-console-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end;padding-bottom:1px}
.ssh-cmd-row{
  display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;
  padding:8px 20px 12px
}
.ssh-cmd{
  display:block;min-width:0;flex:1;padding:8px 12px;border-radius:10px;
  background:rgba(0,0,0,.35);border:1px solid rgba(255,255,255,.07);
  color:#9ae6d5;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:12px;line-height:1.4;overflow:auto;white-space:nowrap
}
.ssh-pill{
  flex:none;font-size:11px;font-weight:700;padding:5px 10px;border-radius:999px;
  background:rgba(45,212,191,.1);border:1px solid rgba(45,212,191,.22);color:var(--accent)
}
.ssh-stage{
  margin:0 16px 16px;border-radius:14px;overflow:hidden;flex:1 1 auto;min-height:240px;
  display:flex;flex-direction:column;
  border:1px solid rgba(255,255,255,.08);
  background:#070b10;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.04)
}
.ssh-console.is-fullscreen .ssh-stage{margin:0 12px 12px;min-height:0}
.ssh-chrome{
  display:flex;align-items:center;gap:8px;padding:9px 12px;flex:none;
  background:linear-gradient(180deg,rgba(255,255,255,.05),rgba(255,255,255,.02));
  border-bottom:1px solid rgba(255,255,255,.06)
}
.ssh-dot{width:9px;height:9px;border-radius:50%;flex:none;opacity:.9}
.ssh-dot.r{background:#f87171}.ssh-dot.y{background:#fbbf24}.ssh-dot.g{background:#34d399}
.ssh-chrome-path{
  margin-left:6px;min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;color:var(--text-md)
}
.ssh-chrome-btn{
  appearance:none;width:28px;height:28px;border-radius:8px;flex:none;padding:0;
  border:1px solid rgba(255,255,255,.1);background:rgba(255,255,255,.03);color:var(--text-md);
  display:inline-flex;align-items:center;justify-content:center;cursor:pointer;font-size:12px;
  transition:background .15s,color .15s,border-color .15s
}
.ssh-chrome-btn:hover{background:var(--acc-soft);color:var(--accent);border-color:var(--acc-soft-bd)}
.ssh-chrome-live{
  font-size:10px;font-weight:800;letter-spacing:.08em;padding:3px 8px;border-radius:999px;
  background:rgba(52,211,153,.12);color:#6ee7b7;border:1px solid rgba(52,211,153,.28)
}
.ssh-frame{
  width:100%;flex:1 1 auto;min-height:0;height:100%;
  border:0;background:#070b10;display:block
}
/* SSH boot / connecting overlay — teal ops, staged handshake */
.ssh-frame-wrap{position:relative;flex:1 1 auto;min-height:0;display:flex;flex-direction:column;background:#070b10}
.ssh-frame-wrap .ssh-frame{flex:1 1 auto}
.ssh-chrome-live.is-boot{
  background:rgba(251,191,36,.12);color:#fbbf24;border-color:rgba(251,191,36,.32);
  animation:sshBootLive 1.2s ease-in-out infinite
}
@keyframes sshBootLive{0%,100%{opacity:1}50%{opacity:.55}}
.ssh-boot{
  position:absolute;inset:0;z-index:5;display:flex;align-items:center;justify-content:center;
  padding:24px 18px;overflow:hidden;
  background:
    radial-gradient(80% 70% at 50% 35%,rgba(45,212,191,.14),transparent 55%),
    linear-gradient(180deg,rgba(7,11,16,.55),rgba(7,11,16,.92));
  backdrop-filter:blur(2px);
  animation:sshBootIn .35s var(--ease,cubic-bezier(.22,1,.36,1)) both
}
@keyframes sshBootIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
.ssh-boot.is-out{animation:sshBootOut .3s ease forwards;pointer-events:none}
@keyframes sshBootOut{to{opacity:0;transform:scale(1.02)}}
.ssh-boot-scan{
  pointer-events:none;position:absolute;inset:0;opacity:.35;
  background:repeating-linear-gradient(
    0deg,transparent,transparent 2px,rgba(94,234,212,.035) 2px,rgba(94,234,212,.035) 3px
  );
  animation:sshBootScan 7s linear infinite
}
@keyframes sshBootScan{from{transform:translateY(0)}to{transform:translateY(12px)}}
.ssh-boot-grid{
  pointer-events:none;position:absolute;inset:-20%;opacity:.22;
  background-image:
    linear-gradient(rgba(45,212,191,.09) 1px,transparent 1px),
    linear-gradient(90deg,rgba(45,212,191,.09) 1px,transparent 1px);
  background-size:42px 42px;
  mask-image:radial-gradient(circle at 50% 40%,#000 20%,transparent 72%);
  animation:sshBootGrid 18s linear infinite
}
@keyframes sshBootGrid{from{transform:translate3d(0,0,0)}to{transform:translate3d(0,42px,0)}}
.ssh-boot-core{
  position:relative;z-index:1;width:min(380px,100%);
  display:flex;flex-direction:column;align-items:center;text-align:center;gap:10px
}
.ssh-boot-orbit{
  width:88px;height:88px;position:relative;margin-bottom:6px;
  display:grid;place-items:center
}
.ssh-boot-orbit-ring{
  position:absolute;inset:0;border-radius:50%;
  border:1.5px solid rgba(45,212,191,.22);
  border-top-color:#5eead4;border-right-color:rgba(94,234,212,.55);
  animation:sshBootSpin 1.15s linear infinite
}
.ssh-boot-orbit-ring.delay{
  inset:10px;border-top-color:transparent;border-left-color:#67e8f9;
  border-right-color:rgba(103,232,249,.2);border-bottom-color:rgba(103,232,249,.35);
  animation-duration:1.7s;animation-direction:reverse;opacity:.85
}
.ssh-boot-orbit-dot{
  width:10px;height:10px;border-radius:50%;background:#5eead4;
  box-shadow:0 0 16px rgba(94,234,212,.85);z-index:1
}
.ssh-boot-orbit-pulse{
  position:absolute;inset:22px;border-radius:50%;
  background:radial-gradient(circle,rgba(94,234,212,.28),transparent 70%);
  animation:sshBootPulse 1.6s ease-in-out infinite
}
@keyframes sshBootSpin{to{transform:rotate(360deg)}}
@keyframes sshBootPulse{0%,100%{transform:scale(.85);opacity:.55}50%{transform:scale(1.15);opacity:1}}
.ssh-boot-kicker{
  font-size:10px;font-weight:800;letter-spacing:.16em;text-transform:uppercase;color:var(--accent)
}
.ssh-boot-title{
  font-family:var(--font-display);font-size:20px;font-weight:800;letter-spacing:-.03em;
  color:var(--text-hi);line-height:1.2
}
.ssh-boot-target{
  display:inline-flex;align-items:center;gap:8px;max-width:100%;
  padding:7px 12px;border-radius:999px;
  background:rgba(0,0,0,.35);border:1px solid rgba(94,234,212,.18)
}
.ssh-boot-target-label{
  font-size:10px;font-weight:800;letter-spacing:.08em;color:#5eead4
}
.ssh-boot-target code{
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:12.5px;color:#cffff0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:42vw
}
.ssh-boot-steps{
  list-style:none;margin:8px 0 0;padding:0;width:100%;
  display:flex;flex-direction:column;gap:8px;text-align:left
}
.ssh-boot-step{
  display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:12px;
  background:rgba(255,255,255,.025);border:1px solid rgba(255,255,255,.06);
  color:var(--text-lo);transition:border-color .25s,background .25s,color .25s,transform .25s
}
.ssh-boot-step.is-on{
  color:var(--text-hi);border-color:rgba(45,212,191,.32);
  background:rgba(45,212,191,.08);transform:translateX(2px)
}
.ssh-boot-step.is-done{color:#99f6e4;border-color:rgba(52,211,153,.22);background:rgba(52,211,153,.06)}
.ssh-boot-step-mark{
  width:22px;height:22px;border-radius:50%;flex:none;
  display:inline-flex;align-items:center;justify-content:center;
  background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.1);font-size:10px
}
.ssh-boot-step.is-on .ssh-boot-step-mark{
  border-color:rgba(45,212,191,.45);box-shadow:0 0 0 3px rgba(45,212,191,.12)
}
.ssh-boot-step.is-done .ssh-boot-step-mark{
  background:rgba(52,211,153,.18);border-color:rgba(52,211,153,.4);color:#6ee7b7
}
.ssh-boot-step-dot{
  width:7px;height:7px;border-radius:50%;background:currentColor;opacity:.55
}
.ssh-boot-step.is-on .ssh-boot-step-dot{
  background:#5eead4;opacity:1;animation:sshBootPulse 1s ease-in-out infinite
}
.ssh-boot-step-txt{font-size:13px;font-weight:650;letter-spacing:.01em}
.ssh-boot-meter{
  width:100%;height:3px;margin-top:6px;border-radius:999px;overflow:hidden;
  background:rgba(255,255,255,.06)
}
.ssh-boot-meter i{
  display:block;height:100%;width:38%;border-radius:inherit;
  background:linear-gradient(90deg,transparent,#5eead4,transparent);
  animation:sshBootMeter 1.35s ease-in-out infinite
}
@keyframes sshBootMeter{from{transform:translateX(-120%)}to{transform:translateX(280%)}}
.ssh-boot-hint{margin:2px 0 0;font-size:12px;color:var(--text-lo);line-height:1.4}
.ssh-boot-enter{
  appearance:none;margin-top:4px;cursor:pointer;
  height:36px;padding:0 16px;border-radius:11px;
  border:1px solid rgba(45,212,191,.28);background:rgba(45,212,191,.1);
  color:#99f6e4;font:inherit;font-size:12.5px;font-weight:700;
  transition:background .15s,border-color .15s,color .15s
}
.ssh-boot-enter:hover{background:rgba(45,212,191,.18);border-color:rgba(45,212,191,.45);color:#ecfdf5}

.ssh-cmd{
  background:#0b1418;border-color:rgba(94,234,212,.16);color:#7ee7c5
}
.ssh-console-top,.ssh-console-bar,.ssh-cmd-row{flex:none}
@media (max-width:820px){
  .ssh-console-bar{grid-template-columns:1fr 1fr}
  .ssh-field-host{grid-column:1 / -1}
  .ssh-console-actions{grid-column:1 / -1;justify-content:stretch}
  .ssh-console-actions .gbtn{flex:1}
  .ssh-console{height:min(94vh,920px);max-height:min(94vh,920px)}
}
html[data-theme="light"] .ssh-console{
  background:
    radial-gradient(120% 80% at 0% 0%,rgba(13,148,136,.08),transparent 42%),
    rgba(255,255,255,.96);
  border-color:rgba(13,148,136,.2);
  box-shadow:0 24px 64px rgba(15,23,42,.14)
}
html[data-theme="light"] .ssh-stage{background:#0b1220}
html[data-theme="light"] .ssh-cmd{background:rgba(15,23,42,.04);color:#0f766e}

.thumb img{display:block}

/* 在线/离线状态标签 */
.status-tag{display:inline-flex;align-items:center;gap:7px;font-size:11.5px;font-weight:700;padding:4px 11px;border-radius:999px;letter-spacing:.02em;white-space:nowrap;line-height:1.2}
.status-tag .dot{width:7px;height:7px;border-radius:50%;flex:none}
.status-tag.is-online{background:rgba(52,211,153,.16);color:#6ee7b7;border:1px solid rgba(52,211,153,.4)}
.status-tag.is-online .dot{background:#34d399;box-shadow:0 0 0 3px rgba(52,211,153,.22),0 0 8px rgba(52,211,153,.55)}
.status-tag.is-offline{background:rgba(148,163,184,.12);color:#94a3b8;border:1px solid rgba(148,163,184,.35)}
.status-tag.is-offline .dot{background:#64748b}
html[data-theme="light"] .status-tag.is-online{background:rgba(16,185,129,.12);color:#047857;border-color:rgba(16,185,129,.35)}
html[data-theme="light"] .status-tag.is-offline{background:rgba(100,116,139,.1);color:#475569;border-color:rgba(100,116,139,.28)}
.th-sort{appearance:none;background:transparent;border:0;padding:0;margin:0;font:inherit;font-size:inherit;font-weight:700;letter-spacing:inherit;text-transform:inherit;color:inherit;cursor:pointer;display:inline-flex;align-items:center;gap:2px}
.th-sort:hover{color:var(--accent)}
.th-sort.on{color:var(--accent)}

.admin-main:has(.logs-page),.admin-main:has(.ota-page),.admin-main:has(.users-page),.admin-main:has(.devices-page),.admin-main:has(.records-page),.admin-main:has(.overview-page),.admin-main:has(.agora-page),.admin-main:has(.aws-page),.admin-main:has(.cloudsub-page){max-width:1360px}

/* ── Logs page: command studio ── */
.logs-page{display:flex;flex-direction:column;gap:12px}
.logs-hero{
  display:grid;grid-template-columns:minmax(0,1.15fr) minmax(240px,.85fr);gap:12px;align-items:center;
  padding:12px 14px;overflow:hidden;
}
.logs-hero::before{
  content:"";position:absolute;inset:auto -12% -40% auto;width:220px;height:220px;border-radius:50%;pointer-events:none;
  background:radial-gradient(circle,var(--glow1),transparent 68%);
}
.logs-kicker{font-size:10px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);margin-bottom:2px}
.logs-hero h1{
  font-family:var(--font-display);font-size:clamp(20px,2.2vw,26px);font-weight:700;letter-spacing:-.04em;line-height:1.15;
  background:var(--hero-title-grad);-webkit-background-clip:text;background-clip:text;color:transparent;
}
.logs-hero-sub{margin-top:4px;font-size:12px;color:var(--text-md);line-height:1.4;max-width:52em}
.logs-hero-meta{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px;align-items:center}
.logs-source-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;position:relative;z-index:1;align-items:stretch}
.logs-source-grid.trio{grid-template-columns:repeat(3,minmax(0,1fr))}
.logs-source{
  appearance:none;-webkit-appearance:none;
  display:grid;grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:auto auto;
  column-gap:10px;row-gap:2px;align-items:center;text-align:left;cursor:pointer;
  padding:8px 10px;border-radius:12px;border:1px solid var(--border);
  background:linear-gradient(180deg,rgba(255,255,255,.05),rgba(255,255,255,.01));
  color:inherit;font:inherit;min-height:0;transition:border-color var(--fast) var(--ease),background var(--fast),box-shadow var(--fast);
}
.logs-source:hover{border-color:var(--border-strong);background:rgba(255,255,255,.06)}
.logs-source.is-locked,.logs-source:disabled{opacity:.45;cursor:not-allowed;pointer-events:none}
.logs-source.on{border-color:var(--acc-soft-bd);box-shadow:var(--sh-glow);background:linear-gradient(180deg,var(--acc-soft),rgba(255,255,255,.02))}
.logs-source-ico{
  grid-row:1 / span 2;width:28px;height:28px;border-radius:8px;display:flex;align-items:center;justify-content:center;
  background:var(--acc-soft);color:var(--accent);font-size:12px;
}
.logs-source.is-device .logs-source-ico,.logs-source-ico.is-device{background:rgba(56,189,248,.12);color:var(--accent2)}
.logs-source .k{grid-column:2;grid-row:1;font-size:11px;font-weight:700;color:var(--text-md)}
.logs-source .v{grid-column:3;grid-row:1 / span 2;font-family:var(--font-display);font-size:20px;font-weight:800;letter-spacing:-.03em;line-height:1;color:var(--text-hi);max-width:100%;overflow-wrap:anywhere}
.logs-source .s{grid-column:2;grid-row:2;font-size:10px;color:var(--text-lo);line-height:1.3}

.logs-dock{
  display:flex;flex-wrap:wrap;gap:10px;align-items:center;padding:10px 12px;
}
.logs-search{position:relative;flex:1;min-width:min(220px,100%)}
.logs-search i{position:absolute;left:14px;top:50%;transform:translateY(-50%);color:var(--text-lo);pointer-events:none;font-size:13px}
.logs-dock input[type="search"],
.logs-search input[type="search"]{
  width:100%;min-width:0!important;height:42px;padding:0 14px 0 40px;border-radius:12px;
  background:var(--input-bg);border:1px solid var(--border);color:var(--text-hi);font:inherit;font-size:14px;
}

.logs-stream{display:flex;flex-direction:column;gap:22px}
.logs-day{display:flex;flex-direction:column;gap:10px}
.logs-day-h{
  display:flex;align-items:center;gap:12px;font-size:11px;font-weight:800;letter-spacing:.12em;
  text-transform:uppercase;color:var(--text-lo);
}
.logs-day-h::after{content:"";flex:1;height:1px;background:var(--border)}

.logs-card{
  display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:14px;align-items:center;
  padding:14px 16px;cursor:pointer;transition:transform var(--fast) var(--ease),border-color var(--base);
}
.logs-card:hover{transform:translateY(-2px);border-color:rgba(45,212,191,.35)}
.logs-card-mark{
  width:44px;height:44px;border-radius:14px;display:flex;align-items:center;justify-content:center;flex:none;
  background:var(--acc-soft);color:var(--accent);font-size:16px;
}
.logs-card.is-device .logs-card-mark{background:rgba(56,189,248,.12);color:var(--accent2)}
.logs-card-body{min-width:0}
.logs-card-code{
  appearance:none;background:none;border:0;padding:0;margin:0;cursor:pointer;
  font-family:var(--font-display);font-size:18px;font-weight:700;letter-spacing:-.02em;color:var(--text-hi);
  display:inline-flex;align-items:center;gap:8px;max-width:100%;
}
.logs-card-code:hover{color:var(--accent)}
.logs-card-code .fa-copy{font-size:11px;opacity:.45}
.logs-card-meta{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.logs-chip{
  display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:650;padding:3px 8px;border-radius:6px;
  background:rgba(45,212,191,.08);color:var(--accent);max-width:100%;
}
.logs-chip.mute{background:var(--fill-md);color:var(--text-md)}
.logs-chip.warn{background:rgba(251,191,36,.14);color:#fcd34d}
.logs-chip.night{background:rgba(96,165,250,.14);color:#93c5fd}
.logs-chip .clip{max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.logs-card-side{display:flex;flex-direction:column;align-items:flex-end;gap:10px;flex:none}
.logs-card-when{font-size:12px;color:var(--text-lo);font-variant-numeric:tabular-nums;text-align:right;line-height:1.35}
.logs-card-when b{display:block;color:var(--text-hi);font-weight:700;font-size:13px}
.logs-card .row-actions{justify-content:flex-end}
.logs-card-mark.has-thumb{padding:0;background:transparent;overflow:hidden}
.logs-card-mark.has-thumb .thumb{width:44px;height:44px;border:0;border-radius:14px}
.logs-card-mark.has-thumb .thumb img{width:100%;height:100%;object-fit:cover}
.logs-source.info{cursor:default}
.logs-source.info:hover{border-color:var(--border);background:linear-gradient(180deg,rgba(255,255,255,.05),rgba(255,255,255,.01))}
.logs-card-mark.has-thumb.rec-thumb,.logs-card-mark.has-thumb.rec-thumb .thumb{width:72px;height:44px;border-radius:12px}
.logs-card.on{border-color:var(--acc-soft-bd);box-shadow:var(--sh-glow)}
.logs-card.static{cursor:default}
.logs-card.static:hover{transform:none}
.gbtn.icon.btn-sm{width:32px;height:32px}
.logs-dock select{
  height:42px;padding:0 12px;border-radius:12px;background:var(--input-bg);border:1px solid var(--border);
  color:var(--text-hi);font:inherit;font-size:13px;min-width:140px;
}

.logs-empty{
  display:flex;flex-direction:column;align-items:center;gap:12px;padding:72px 24px;text-align:center;
}
.logs-empty i{font-size:42px;color:var(--accent);opacity:.7}
.logs-empty h2{font-family:var(--font-display);font-size:20px;font-weight:700;letter-spacing:-.02em}
.logs-empty p{font-size:13.5px;color:var(--text-md);max-width:36em;line-height:1.55}

.ota-studio{display:grid;grid-template-columns:1fr 1fr;gap:14px;align-items:stretch;overflow:visible}
.ota-panel-foot{margin-top:auto;padding-top:14px;display:flex;flex-direction:column;gap:12px}
.ota-panel-foot .progress{margin-top:0}
.ota-upload-bar{height:6px}
.ota-panel.is-upload:not(.is-app){padding:12px 14px}
.ota-panel.is-upload:not(.is-app) h3{margin-bottom:10px}
.ota-panel.is-upload:not(.is-app) .ota-drop{padding:10px 12px}
.ota-panel.is-upload:not(.is-app) .admin-form{
  margin-top:10px!important;
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:8px 10px;
}
.ota-panel.is-upload:not(.is-app) .admin-form .span2{grid-column:1 / -1}
.ota-studio.is-solo{grid-template-columns:1fr;max-width:none}
.ota-panel.is-app{padding:12px 14px}
.ota-panel.is-app h3{margin-bottom:10px}
.ota-panel.is-app .ota-drop{padding:10px 12px}
.ota-panel.is-app .admin-form{
  margin-top:10px!important;
  grid-template-columns:repeat(4,minmax(0,1fr)) minmax(200px,1.6fr);
  gap:8px 10px;
}
.ota-panel.is-app .admin-form .span2{grid-column:auto}
.ota-panel.is-app .row-actions{margin-top:10px!important}
@media (max-width:960px){
  .ota-panel.is-app .admin-form{grid-template-columns:1fr 1fr}
}
.ota-panel{padding:14px 16px;overflow:visible;position:relative;z-index:1;height:100%;display:flex;flex-direction:column}
.ota-panel .admin-form{grid-template-columns:1fr}
.ota-panel .admin-form .span2{grid-column:auto}
.ota-pick{position:relative}
.ota-pick-btn{
  appearance:none;-webkit-appearance:none;width:100%;height:40px;padding:0 12px;
  display:flex;align-items:center;gap:8px;text-align:left;cursor:pointer;
  border-radius:10px;border:1px solid var(--border);background:var(--input-bg);
  color:var(--text-hi);font:inherit;font-size:13px;
}
.ota-pick-btn:hover{border-color:var(--border-strong)}
.ota-pick.is-open .ota-pick-btn{border-color:var(--acc-soft-bd);box-shadow:var(--sh-glow)}
.ota-pick-txt{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ota-pick-pop{
  position:absolute;left:0;right:0;top:calc(100% + 6px);z-index:40;
  display:flex;flex-direction:column;max-height:300px;
  border-radius:12px;border:1px solid var(--border);
  background:rgba(13,17,23,.97);box-shadow:var(--sh-card);
}
.ota-pick-q{
  height:36px;margin:8px 8px 0;padding:0 10px;border-radius:8px;
  border:1px solid var(--border);background:var(--input-bg);color:var(--text-hi);font:inherit;font-size:13px;
}
.ota-pick-list{overflow:auto;padding:6px;max-height:240px}
.ota-pick-item{
  appearance:none;width:100%;display:flex;flex-direction:column;gap:2px;text-align:left;cursor:pointer;
  padding:9px 10px;border:0;border-radius:8px;background:transparent;color:inherit;font:inherit;
}
.ota-pick-item:hover{background:var(--fill-md)}
.ota-pick-item.on{background:var(--acc-soft);color:var(--accent)}
.ota-pick-item.is-off .ota-pick-item-t{opacity:.7}
.ota-pick-item-t{font-size:13px;font-weight:650;color:var(--text-hi)}
.ota-pick-item.on .ota-pick-item-t{color:var(--accent)}
.ota-pick-item-s{font-size:11px;color:var(--text-lo);line-height:1.35}
.ota-pick-empty{padding:16px 10px;text-align:center;color:var(--text-lo);font-size:12px}

.ota-panel h3{
  font-family:var(--font-display);font-size:15px;font-weight:700;letter-spacing:-.02em;
  margin-bottom:14px;display:flex;align-items:center;gap:10px;
}
.ota-panel h3 .logs-source-ico{width:30px;height:30px;border-radius:10px;font-size:13px}
.ota-drop{
  display:flex;align-items:center;gap:12px;width:100%;text-align:left;cursor:pointer;
  padding:14px 16px;border-radius:14px;border:1px dashed var(--border-strong);
  background:rgba(255,255,255,.03);color:inherit;font:inherit;
  transition:border-color var(--fast),background var(--fast);
}
.ota-drop:hover{border-color:var(--accent);background:var(--acc-soft)}
.ota-drop .logs-source-ico{flex:none}
.ota-drop .nm{font-weight:700;font-size:13.5px}
.ota-drop .hint{font-size:12px;color:var(--text-lo);margin-top:3px}
.ota-note{font-size:13px;color:var(--text-md);line-height:1.55}
.ota-latest{
  margin-top:14px;padding:12px 14px;border-radius:14px;border:1px solid var(--acc-soft-bd);
  background:linear-gradient(180deg,var(--acc-soft),transparent);
}
.ota-latest .v{font-family:var(--font-display);font-size:20px;font-weight:800;letter-spacing:-.03em;margin-top:2px}
.ota-latest .s{font-size:12px;color:var(--text-md);margin-top:4px;line-height:1.45}

.modal-mask.log-mask{padding:10px;align-items:stretch;justify-content:stretch;background:rgba(4,6,10,.72)}
.modal.log-view{width:100%;height:100%;max-width:none;display:flex;flex-direction:column;padding:0;border-radius:18px;overflow:hidden}
.log-head{
  display:flex;align-items:center;justify-content:space-between;gap:12px;flex:none;
  padding:14px 16px;border-bottom:1px solid var(--border);
  background:linear-gradient(180deg,rgba(255,255,255,.05),transparent);
}
.log-head-id{min-width:0}
.log-head h3{margin:0;font-family:var(--font-display);font-size:18px;letter-spacing:-.02em}
.log-head .log-path{font-size:12px;color:var(--text-lo);margin-top:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.log-body{display:grid;grid-template-columns:280px 1fr;gap:0;flex:1;min-height:0}
.log-files{overflow:auto;padding:12px 10px;border-right:1px solid var(--border);background:rgba(0,0,0,.18)}
.log-files-title{font-size:10.5px;font-weight:800;color:var(--text-lo);letter-spacing:.12em;text-transform:uppercase;padding:4px 8px 10px}
.log-file{display:flex;flex-direction:column;align-items:flex-start;gap:3px;width:100%;text-align:left;padding:10px 11px;border-radius:12px;border:1px solid transparent;background:transparent;color:var(--text-md);font:inherit;cursor:pointer;margin-bottom:4px}
.log-file .name{font-size:12.5px;font-weight:650;word-break:break-all;display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.log-file .sz{font-size:11px;color:var(--text-lo)}
.log-now{font-style:normal;font-size:10px;font-weight:800;padding:1px 6px;border-radius:999px;background:var(--acc-soft);color:var(--accent);letter-spacing:.02em}
.log-file:hover{background:var(--fill-md)}
.log-file.on{background:var(--acc-soft);border-color:var(--acc-soft-bd);color:var(--accent)}
.log-main{display:flex;flex-direction:column;min-width:0;min-height:0;padding:12px 14px 14px}
.log-toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:8px}
.log-toolbar input[type="search"]{height:38px;padding:0 12px;border-radius:10px;background:var(--input-bg);border:1px solid var(--border);color:var(--text-hi);font:inherit;font-size:13px}
.log-meta{font-size:11.5px;margin-bottom:8px}
.log-pre{
  flex:1;min-height:0;overflow:auto;margin:0;padding:16px 18px;border-radius:14px;border:1px solid var(--border);
  background:
    linear-gradient(180deg,rgba(45,212,191,.06),transparent 48px),
    rgba(0,0,0,.42);
  color:#d7e3f4;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.55;white-space:pre;
}
.log-pre.wrap{white-space:pre-wrap;word-break:break-word}
.log-loading{flex:1;display:flex;align-items:center;justify-content:center}
button.linkish{appearance:none;background:none;border:0;padding:0;margin:0;font:inherit;color:var(--accent);cursor:pointer;text-align:left;max-width:360px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
button.linkish:hover{text-decoration:underline}
html[data-theme="light"] .log-pre{background:linear-gradient(180deg,rgba(14,165,233,.08),transparent 48px),#0f172a;color:#e2e8f0}
html[data-theme="light"] .logs-hero h1{background:none;-webkit-background-clip:unset;background-clip:unset;color:var(--text-hi)}
@media (max-width:960px){
  .logs-hero,.logs-source-grid,.logs-source-grid.trio,.ota-studio{grid-template-columns:1fr}
  .logs-card{grid-template-columns:auto minmax(0,1fr);gap:12px}
  .logs-card-side{grid-column:2;flex-direction:row;align-items:center;justify-content:space-between;width:100%}
  .logs-card-when{text-align:left}
}
@media (max-width:860px){
  .log-body{grid-template-columns:1fr}
  .log-files{max-height:140px;border-right:none;border-bottom:1px solid var(--border)}
}

/* admin login inherits console split login-shell from ../styles.css */
body:has(.login-shell){overflow:auto}
body:has(.login-shell) #app{min-height:100vh}

/* OTA multi-select batch delete */
.ota-page .logs-card{grid-template-columns:auto auto minmax(0,1fr) auto}
.ota-check{display:inline-flex;align-items:center;gap:8px;cursor:pointer;user-select:none;flex:none;align-self:center}
.ota-check input{width:16px;height:16px;accent-color:var(--accent,#22d3ee);cursor:pointer}
.ota-check.dock{font-size:12px;color:var(--text-lo);padding:0 4px}
.logs-card.is-checked{border-color:rgba(45,212,191,.55);box-shadow:0 0 0 1px rgba(45,212,191,.25)}
.ota-batch{display:inline-flex;align-items:center;gap:10px;flex-wrap:wrap;margin-left:4px}
@media (max-width:720px){
  .ota-page .logs-card{grid-template-columns:auto auto minmax(0,1fr);gap:12px}
}

/* Logs multi-select (reuse ota-check) */
.logs-page .logs-card{grid-template-columns:auto auto minmax(0,1fr) auto}
@media (max-width:720px){
  .logs-page .logs-card{grid-template-columns:auto auto minmax(0,1fr);gap:12px}
}


/* ── Agora studio (compact) ── */
.agora-page{display:flex;flex-direction:column;gap:14px;width:100%;max-width:none}
.cloudsub-page .agora-page{width:100%;max-width:none}
.agora-head{
  display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap;
  padding:4px 2px 2px;
}
.agora-kicker{
  font-size:10px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;
  color:var(--accent);opacity:.9;margin-bottom:4px;
}
.agora-title-row{display:flex;align-items:center;flex-wrap:wrap;gap:8px}
.agora-title-row h1{
  margin:0;font-family:var(--font-display);font-size:clamp(22px,2.4vw,28px);font-weight:800;
  letter-spacing:-.03em;line-height:1.1;color:var(--text-hi);
}
.agora-pill{
  display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:999px;
  font-size:10.5px;font-weight:750;letter-spacing:.02em;
  border:1px solid var(--border);background:rgba(255,255,255,.03);color:var(--text-md);
}
.agora-pill.muted{color:var(--text-lo);font-weight:650}
.agora-pill-ok{border-color:rgba(52,211,153,.35);color:#6ee7b7;background:rgba(52,211,153,.08)}
.agora-pill-warn{border-color:rgba(251,191,36,.35);color:#fcd34d;background:rgba(251,191,36,.08)}
.agora-pill-err{border-color:rgba(248,113,113,.4);color:#fca5a5;background:rgba(248,113,113,.08)}
.agora-head-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.agora-select{
  height:34px;min-width:160px;max-width:240px;padding:0 12px;border-radius:10px;
  background:var(--input-bg);border:1px solid var(--border);color:var(--text-hi);
  font:inherit;font-size:12.5px;font-weight:650;
}
.agora-icon-btn{width:34px!important;padding:0!important;justify-content:center}
.agora-fresh{font-size:11px;color:var(--text-lo);font-variant-numeric:tabular-nums}

.agora-quota{
  padding:14px 16px 12px;border-radius:16px;border:1px solid var(--border);
  background:
    radial-gradient(120% 80% at 100% 0%,rgba(45,212,191,.08),transparent 55%),
    linear-gradient(180deg,rgba(255,255,255,.035),rgba(255,255,255,.012));
}
.agora-quota-tools{
  display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;margin-bottom:12px;
}
.agora-quota-tools .spacer{flex:1;min-width:8px}
.agora-quota-tools .agora-select{max-width:min(100%,220px)}
.agora-quota-tools .apick{position:relative;z-index:5;flex:0 1 auto;min-width:min(100%,240px);max-width:320px}
.apick-btn{
  appearance:none;-webkit-appearance:none;width:100%;display:flex;align-items:center;gap:10px;
  height:40px;padding:0 12px 0 10px;border-radius:12px;cursor:pointer;
  border:1px solid var(--border);
  background:linear-gradient(180deg,rgba(255,255,255,.06),rgba(255,255,255,.02));
  color:var(--text-hi);font:inherit;text-align:left;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.04);
  transition:border-color .15s,box-shadow .15s,background .15s;
}
.apick-btn:hover{border-color:var(--acc-soft-bd);box-shadow:0 0 0 3px rgba(45,212,191,.08)}
.apick.open .apick-btn{
  border-color:var(--accent);
  box-shadow:0 0 0 3px rgba(45,212,191,.14), inset 0 1px 0 rgba(255,255,255,.05);
}
.apick-ico{
  width:28px;height:28px;border-radius:9px;flex:none;
  display:inline-flex;align-items:center;justify-content:center;
  background:rgba(45,212,191,.12);color:var(--accent);font-size:12px;
}
.apick-text{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1}
.apick-k{font-size:9px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-lo);line-height:1}
.apick-v{font-size:13px;font-weight:750;color:var(--text-hi);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.2}
.apick-chev{font-size:11px;color:var(--text-lo);transition:transform .18s ease;flex:none}
.apick.open .apick-chev{transform:rotate(180deg);color:var(--accent)}
.apick-menu{
  position:absolute;top:calc(100% + 8px);left:0;right:0;min-width:260px;
  padding:8px;border-radius:14px;border:1px solid var(--border);
  background:rgba(12,16,24,.96);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);
  box-shadow:0 18px 48px rgba(0,0,0,.55), 0 0 0 1px rgba(255,255,255,.04) inset;
  animation:apickIn .16s ease;
  max-height:min(52vh,340px);overflow:auto;z-index:40;
}
@keyframes apickIn{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.apick-menu-cap{
  padding:6px 10px 8px;font-size:10px;font-weight:800;letter-spacing:.12em;
  text-transform:uppercase;color:var(--text-lo);
}
.apick-opt{
  appearance:none;width:100%;display:flex;align-items:center;gap:10px;
  padding:10px 12px;border:0;border-radius:10px;background:transparent;
  color:var(--text-md);font:inherit;text-align:left;cursor:pointer;
  transition:background .12s,color .12s;
}
.apick-opt:hover{background:rgba(255,255,255,.05);color:var(--text-hi)}
.apick-opt.on{background:var(--acc-soft);color:var(--accent)}
.apick-opt-main{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}
.apick-opt-title{font-size:13px;font-weight:750;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.apick-opt-sub{font-size:10.5px;color:var(--text-lo);font-family:var(--font-display);opacity:.85;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.apick-opt.on .apick-opt-sub{color:rgba(45,212,191,.75)}
.apick-check{font-size:12px;flex:none}
html[data-theme="light"] .apick-menu{background:rgba(255,255,255,.97);box-shadow:0 16px 40px rgba(15,23,42,.14)}
html[data-theme="light"] .apick-btn{background:linear-gradient(180deg,#fff,rgba(255,255,255,.85))}
.agora-quota-nums{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
.agora-q .k{display:block;font-size:10px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-lo)}
.agora-q .v{display:block;margin-top:4px;font-family:var(--font-display);font-size:clamp(20px,2.2vw,26px);font-weight:800;letter-spacing:-.035em;line-height:1.05;color:var(--text-hi)}
.agora-q .u{display:block;margin-top:3px;font-size:11px;color:var(--text-lo)}
.agora-q.accent .v{color:var(--accent)}
.agora-bar-track{
  margin-top:12px;height:6px;border-radius:999px;background:rgba(255,255,255,.07);overflow:hidden;
}
.agora-bar-track>i{
  display:block;height:100%;border-radius:inherit;
  background:linear-gradient(90deg,var(--accent),#5eead4);
  box-shadow:0 0 12px rgba(45,212,191,.35);
  transition:width .45s cubic-bezier(.2,.8,.2,1);
}
.agora-bar-track[data-risk="warn"]>i{background:linear-gradient(90deg,#F59E0B,#FBBF24);box-shadow:0 0 12px rgba(245,158,11,.3)}
.agora-bar-track[data-risk="critical"]>i,.agora-bar-track[data-risk="exhausted"]>i{
  background:linear-gradient(90deg,#EF4444,#F87171);box-shadow:0 0 12px rgba(239,68,68,.3)
}
.agora-footnote{margin:10px 0 0;font-size:11px;line-height:1.45;color:var(--text-lo);opacity:.85}

.agora-grid{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(260px,.85fr);gap:14px;align-items:stretch}
.agora-card{
  padding:16px 16px 14px;border-radius:16px;margin:0;
  background:linear-gradient(180deg,rgba(255,255,255,.03),rgba(255,255,255,.01));
  display:flex;flex-direction:column;min-height:100%;box-sizing:border-box;
}
.agora-grid > .agora-card{height:100%}
.agora-card-head{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  margin-bottom:12px;min-height:32px;flex:none;
}
.agora-card-head h2{margin:0;font-size:13px;font-weight:800;letter-spacing:.04em;color:var(--text-hi)}
.agora-card-tools{display:flex;align-items:center;flex-wrap:wrap;gap:8px;justify-content:flex-end}
.agora-count{
  min-width:22px;height:22px;padding:0 7px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;
  font-size:11px;font-weight:800;background:var(--acc-soft);color:var(--accent);border:1px solid var(--acc-soft-bd);
}
.agora-series{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px}
.agora-series-item{
  display:inline-flex;align-items:baseline;gap:6px;padding:6px 10px;border-radius:10px;
  border:1px solid var(--border);background:rgba(0,0,0,.16);
}
.agora-series-item i{width:7px;height:7px;border-radius:50%;align-self:center;flex:none}
.agora-series-item .n{font-size:11px;font-weight:700;color:var(--text-lo)}
.agora-series-item b{font-family:var(--font-display);font-size:13px;font-weight:800;letter-spacing:-.02em;color:var(--text-hi)}
.agora-series-item em{font-style:normal;font-size:10px;color:var(--text-lo)}
.agora-chart-wrap{margin-top:2px}
.agora-chart-svg{width:100%;height:210px;display:block}
.agora-chart-grid{stroke:rgba(255,255,255,.06);stroke-width:1}
.agora-chart-axis{fill:var(--text-lo);font-size:10px;font-weight:600}
.agora-card-foot{display:flex;justify-content:flex-end;margin-top:auto;padding-top:8px}
.agora-cost-card > .agora-link{margin-top:auto;align-self:flex-start;padding-top:8px}
.agora-cost-card > .agora-footnote{margin-top:10px}
.agora-link{
  appearance:none;border:0;background:transparent;cursor:pointer;padding:4px 0;
  font:inherit;font-size:11.5px;font-weight:700;color:var(--accent);opacity:.9;
}
.agora-link:hover{opacity:1;text-decoration:underline}
.agora-daily-table{margin-top:8px;max-height:220px;overflow:auto;border-radius:12px;border:1px solid var(--border)}

.agora-cost-card .agora-due{margin-bottom:14px}
.agora-due .k{display:block;font-size:10px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-lo)}
.agora-due .v{display:block;margin-top:6px;font-family:var(--font-display);font-size:34px;font-weight:800;letter-spacing:-.04em;color:var(--accent);line-height:1}
.agora-due .u{display:block;margin-top:6px;font-size:12px;color:var(--text-md)}
.agora-cost-split{
  display:grid;grid-template-columns:1fr 1fr;gap:10px;padding:10px 0 12px;
  border-top:1px solid var(--border);border-bottom:1px solid var(--border);margin-bottom:10px;
}
.agora-cost-split .k{display:block;font-size:10px;font-weight:750;letter-spacing:.06em;text-transform:uppercase;color:var(--text-lo)}
.agora-cost-split .v{display:block;margin-top:4px;font-family:var(--font-display);font-size:18px;font-weight:800;letter-spacing:-.02em}
.agora-rate-list{list-style:none;margin:0 0 8px;padding:0;display:flex;flex-direction:column;gap:6px}
.agora-rate-list li{display:grid;grid-template-columns:1fr auto auto;gap:10px;align-items:center;font-size:12px}
.agora-rate-list .m{color:var(--text-lo);font-variant-numeric:tabular-nums}
.agora-rate-list .c{font-weight:800;font-variant-numeric:tabular-nums;min-width:3.2em;text-align:right}
.agora-leg{display:inline-flex;align-items:center;gap:6px;font-weight:700;color:var(--text-md)}
.agora-leg i{width:8px;height:8px;border-radius:2px;display:inline-block;flex:none}
.agora-rate-detail{margin:8px 0;border-radius:12px;border:1px solid var(--border);overflow:auto;max-height:240px}
.agora-table-wrap{overflow:auto;border-radius:12px;border:1px solid var(--border);max-height:min(42vh,360px)}
.agora-proj-table tr{cursor:pointer}
.agora-proj-table tr.is-active-row td{background:var(--acc-soft)}
.agora-trunc{max-width:140px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.agora-dot-on,.agora-dot-off{
  display:inline-flex;align-items:center;gap:6px;font-size:11.5px;font-weight:700;
}
.agora-dot-on::before,.agora-dot-off::before{
  content:"";width:7px;height:7px;border-radius:50%;
}
.agora-dot-on{color:#6ee7b7}.agora-dot-on::before{background:#34d399;box-shadow:0 0 0 3px rgba(52,211,153,.18)}
.agora-dot-off{color:var(--text-lo)}.agora-dot-off::before{background:rgba(255,255,255,.25)}

html[data-theme="light"] .agora-quota{
  background:radial-gradient(120% 80% at 100% 0%,rgba(14,165,233,.08),transparent 55%),
    linear-gradient(180deg,rgba(255,255,255,.7),rgba(255,255,255,.4));
}
html[data-theme="light"] .agora-series-item{background:rgba(15,23,42,.03)}
html[data-theme="light"] .agora-chart-grid{stroke:rgba(15,23,42,.08)}

@media (max-width:960px){
  .agora-grid{grid-template-columns:1fr}
  .agora-quota-nums{grid-template-columns:1fr 1fr}
  .agora-q:last-child{grid-column:1/-1}
}
@media (max-width:560px){
  .agora-quota-nums{grid-template-columns:1fr}
  .agora-q:last-child{grid-column:auto}
  .agora-chart-svg{height:170px}
  .agora-due .v{font-size:28px}
}

/* 远程模块：筛选收进卡片内，不单独占一行玻璃条 */
.remote-panel-head{
  display:flex;justify-content:space-between;align-items:flex-start;gap:12px;flex-wrap:wrap;
}
.remote-panel-head-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.remote-panel-filter{margin-top:12px}
.remote-panel-filter .logs-search{width:100%}
