/* ===== 低空翼站 · vx 管控层共享样式（与门户 index.html 同设计语言） ===== */
:root{
  --bg:#f4f7f9; --surface:#ffffff; --surface-2:#f8fafb; --surface-3:#f1f5f8;
  --ink:#0d1c28; --ink-2:#3c5060; --mut:#748694; --faint:#9aa9b4;
  --line:#e6ecf1; --line-2:#dbe3e9;
  --blue:#1366d6; --blue-d:#0f52b4; --blue-s:#eaf2fe;
  --teal:#0ba89b; --teal-d:#088a80; --teal-s:#e3f6f3;
  --cyan:#43e4d6;
  --ok:#12a06d; --ok-s:#e4f5ee; --warn:#cf811f; --warn-s:#fbf2e2; --danger:#d6483b; --danger-s:#fbeae8; --violet:#6a4fc0; --violet-s:#efeafb;
  --night-0:#071420; --night-1:#0a1d30; --night-2:#0f2942; --night-line:rgba(150,190,228,.16); --night-mut:#8fb0c8;
  --r-sm:10px; --r:14px; --r-lg:20px; --r-xl:26px;
  --sh-1:0 1px 2px rgba(13,28,40,.05);
  --sh-2:0 1px 2px rgba(13,28,40,.04),0 12px 32px -14px rgba(13,28,40,.16);
  --sh-pop:0 28px 70px -24px rgba(7,21,33,.42);
  --sp:8px;
  --font:"Noto Sans SC","PingFang SC","Microsoft YaHei",system-ui,-apple-system,"Segoe UI",sans-serif;
  --mono:ui-monospace,"SFMono-Regular",Menlo,Consolas,"Liberation Mono",monospace;
}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--font);font-size:14px;line-height:1.65;-webkit-font-smoothing:antialiased}
h1,h2,h3,h4,h5{margin:0;font-weight:700;color:var(--ink)}
a{color:inherit;text-decoration:none}
button{font-family:inherit;cursor:pointer;border:0;background:none;color:inherit}
input,select,textarea{font-family:inherit;font-size:14px;color:var(--ink)}
.mut{color:var(--mut)}.faint{color:var(--faint)}.mono{font-family:var(--mono)}
.eyebrow{display:inline-flex;align-items:center;gap:8px;font-size:12px;font-weight:500;color:var(--mut);letter-spacing:.6px}
.eyebrow::before{content:"";width:14px;height:2px;background:var(--teal);border-radius:2px}

/* 按钮 */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:40px;padding:0 18px;border-radius:var(--r-sm);font-size:14px;font-weight:500;border:1px solid transparent;transition:.18s;white-space:nowrap;cursor:pointer}
.btn:active{transform:translateY(1px)}.btn:disabled{opacity:.5;cursor:not-allowed}
.btn-pri{background:var(--blue);color:#fff;box-shadow:0 6px 16px -8px rgba(19,102,214,.7)}.btn-pri:hover{background:var(--blue-d)}
.btn-teal{background:var(--teal);color:#fff}.btn-teal:hover{background:var(--teal-d)}
.btn-ghost{background:var(--surface);border-color:var(--line-2);color:var(--ink-2)}.btn-ghost:hover{border-color:var(--blue);color:var(--blue)}
.btn-soft{background:var(--blue-s);color:var(--blue-d);font-weight:500}
.btn-danger-soft{background:var(--danger-s);color:var(--danger)}
.btn-sm{height:32px;padding:0 13px;font-size:13px;border-radius:8px}
.btn-lg{height:48px;padding:0 26px;font-size:15.5px;border-radius:12px}
.btn-block{width:100%}

/* 标签 / 徽标 */
.tag{display:inline-flex;align-items:center;gap:5px;height:23px;padding:0 9px;border-radius:6px;font-size:11.5px;font-weight:500;background:var(--surface-3);color:var(--ink-2);border:1px solid var(--line)}
.tag.blue{background:var(--blue-s);color:var(--blue-d);border-color:#d2e3fc}
.tag.teal{background:var(--teal-s);color:var(--teal-d);border-color:#c3eae5}
.tag.ok{background:var(--ok-s);color:var(--ok);border-color:#c6e9d8}
.tag.warn{background:var(--warn-s);color:var(--warn);border-color:#f0dbb6}
.tag.danger{background:var(--danger-s);color:var(--danger);border-color:#f2c8c3}
.tag.violet{background:var(--violet-s);color:var(--violet);border-color:#ddd2f6}
.dot{width:7px;height:7px;border-radius:50%;display:inline-block}.dot.ok{background:var(--ok)}.dot.warn{background:var(--warn)}.dot.gray{background:var(--faint)}.dot.blue{background:var(--blue)}.dot.teal{background:var(--teal)}.dot.danger{background:var(--danger)}

/* 卡片 / 面板 */
.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--sh-1)}
.card-pad{padding:20px 22px}
.card-h{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px 22px;border-bottom:1px solid var(--line)}
.card-h h3{font-size:15px;font-weight:700;display:flex;align-items:center;gap:9px}
.card-h .sub{font-size:12px;color:var(--mut)}
.card-b{padding:20px 22px}
.grid{display:grid;gap:16px}.g2{grid-template-columns:repeat(2,1fr)}.g3{grid-template-columns:repeat(3,1fr)}.g4{grid-template-columns:repeat(4,1fr)}

/* 表单 */
.field{margin-bottom:16px}
.field label{display:block;font-size:13px;font-weight:500;color:var(--ink-2);margin-bottom:7px}
.field .hint{font-size:12px;color:var(--mut);margin-top:6px}
.input,.select,textarea.input{width:100%;height:42px;padding:0 13px;border:1px solid var(--line-2);border-radius:var(--r-sm);background:var(--surface);transition:.16s;outline:none}
textarea.input{height:auto;padding:11px 13px;resize:vertical;line-height:1.6}
.input:focus,.select:focus,textarea.input:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(19,102,214,.12)}
.input::placeholder{color:var(--faint)}
.seg{display:inline-flex;background:var(--surface-3);border:1px solid var(--line);border-radius:10px;padding:3px;gap:2px}
.seg button{height:32px;padding:0 15px;border-radius:7px;font-size:13px;color:var(--ink-2);font-weight:500}.seg button.on{background:#fff;color:var(--ink);box-shadow:var(--sh-1);font-weight:600}
.switch{position:relative;width:40px;height:23px;background:var(--line-2);border-radius:99px;transition:.18s;flex:0 0 auto;cursor:pointer}
.switch::after{content:"";position:absolute;top:2px;left:2px;width:19px;height:19px;border-radius:50%;background:#fff;box-shadow:var(--sh-1);transition:.18s}
.switch.on{background:var(--teal)}.switch.on::after{left:19px}
.rowline{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:13px 0;border-bottom:1px solid var(--line)}
.rowline:last-child{border-bottom:0}

/* 表格 */
.table-wrap{overflow-x:auto}
table.tbl{width:100%;border-collapse:collapse;font-size:13.5px}
.tbl th{text-align:left;font-weight:600;color:var(--mut);font-size:12.5px;padding:11px 14px;border-bottom:1px solid var(--line-2);white-space:nowrap;background:var(--surface-2)}
.tbl td{padding:13px 14px;border-bottom:1px solid var(--line);vertical-align:middle}
.tbl tbody tr:last-child td{border-bottom:0}
.tbl tbody tr{transition:background .12s}.tbl tbody tr:hover{background:var(--surface-2)}
.tbl .strong{font-weight:600;color:var(--ink)}
.check{width:17px;height:17px;border-radius:5px;border:1.5px solid var(--line-2);display:inline-block;vertical-align:middle;cursor:pointer}
.check.on{background:var(--blue);border-color:var(--blue)}

/* 控制台骨架 */
.console{display:grid;grid-template-columns:236px 1fr;min-height:100vh;background:var(--bg)}
.side{background:var(--night-1);color:#cfe0ee;position:sticky;top:0;height:100vh;overflow-y:auto;padding:18px 14px;display:flex;flex-direction:column}
.side .brand{display:flex;align-items:center;gap:10px;font-weight:800;font-size:16px;color:#fff;padding:6px 8px 16px;border-bottom:1px solid var(--night-line);margin-bottom:14px}
.side .brand .logo{width:34px;height:34px}
.side .brand small{display:block;font-size:10px;font-weight:500;color:var(--night-mut);letter-spacing:1.4px;margin-top:-2px}
.side .grp{font-size:11px;color:#6f8ea6;letter-spacing:1.2px;padding:14px 10px 6px}
.side a{display:flex;align-items:center;gap:11px;padding:9px 11px;border-radius:9px;font-size:13.5px;color:#bdd2e2;font-weight:500;margin-bottom:2px;position:relative;cursor:pointer}
.side a:hover{background:rgba(255,255,255,.06);color:#fff}
.side a.on{background:linear-gradient(90deg,rgba(67,228,214,.16),rgba(67,228,214,.04));color:#fff}
.side a.on::before{content:"";position:absolute;left:-14px;top:8px;bottom:8px;width:3px;border-radius:3px;background:var(--cyan)}
.side .rolecard{margin-top:auto;background:rgba(255,255,255,.05);border:1px solid var(--night-line);border-radius:12px;padding:12px;font-size:12px}
.side .rolecard b{color:#fff;font-size:13px;display:block}
.cmain{display:flex;flex-direction:column;min-width:0}
.ctop{height:64px;background:rgba(255,255,255,.86);backdrop-filter:blur(12px);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:14px;padding:0 26px;position:sticky;top:0;z-index:40}
.ctop .crumb{font-size:13px;color:var(--mut)}.ctop .crumb b{color:var(--ink);font-weight:600}
.ctop .sp{margin-left:auto;display:flex;align-items:center;gap:12px}
.ccontent{padding:26px;max-width:1180px;width:100%}
.ptitle{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin-bottom:20px;flex-wrap:wrap}
.ptitle h1{font-size:21px;font-weight:800}
.ptitle .desc{font-size:13px;color:var(--mut);margin-top:3px}

/* 统计 */
.stat{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:17px 18px;position:relative;overflow:hidden}
.stat .lab{font-size:12.5px;color:var(--mut);display:flex;align-items:center;gap:7px}
.stat .num{font-size:29px;font-weight:800;letter-spacing:-.5px;margin-top:7px;font-variant-numeric:tabular-nums}
.stat .delta{font-size:12px;margin-top:5px;font-weight:600}.delta.up{color:var(--ok)}.delta.down{color:var(--danger)}.delta.flat{color:var(--mut)}

/* 列表 / 空态 */
.list-card{border:1px solid var(--line);border-radius:var(--r);background:#fff;overflow:hidden}
.lc-item{display:flex;gap:16px;padding:18px 20px;border-bottom:1px solid var(--line);transition:.14s}
.lc-item:last-child{border-bottom:0}.lc-item:hover{background:var(--surface-2)}
.lc-item .tt{font-size:15px;font-weight:600;margin-bottom:5px}
.lc-item .ds{font-size:13px;color:var(--mut);margin-bottom:9px;line-height:1.6}
.lc-item .mt{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.empty{text-align:center;padding:54px 20px;color:var(--mut)}
.empty .ei{width:64px;height:64px;border-radius:18px;background:var(--surface-3);display:grid;place-items:center;margin:0 auto 16px;color:var(--faint)}
.chipfilter{display:inline-flex;gap:7px;flex-wrap:wrap}
.chipfilter button{height:32px;padding:0 14px;border-radius:99px;border:1px solid var(--line-2);background:#fff;font-size:12.5px;color:var(--ink-2)}
.chipfilter button.on{background:var(--ink);color:#fff;border-color:var(--ink)}

/* 弹窗 */
.modal-mask{position:fixed;inset:0;background:rgba(7,20,32,.5);backdrop-filter:blur(3px);z-index:100;display:none;align-items:flex-start;justify-content:center;padding:60px 20px;overflow-y:auto}
.modal-mask.show{display:flex;animation:fade .2s ease}
.modal{background:#fff;border-radius:var(--r-lg);box-shadow:var(--sh-pop);width:100%;max-width:760px;overflow:hidden}
@keyframes fade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}

/* Toast */
#toast{position:fixed;top:18px;left:50%;transform:translateX(-50%);z-index:200;display:flex;flex-direction:column;gap:8px;align-items:center}
.toast{background:var(--night-1);color:#fff;padding:10px 18px;border-radius:10px;font-size:13.5px;box-shadow:var(--sh-pop);animation:fade .2s ease;max-width:90vw}
.toast.ok{background:#0b8f86}.toast.err{background:#c2402f}

/* 公开页顶栏（注册/我的） */
.pubnav{position:sticky;top:0;z-index:50;background:rgba(244,247,249,.82);backdrop-filter:blur(14px);border-bottom:1px solid var(--line)}
.pubnav .in{max-width:1180px;margin:0 auto;height:60px;display:flex;align-items:center;gap:16px;padding:0 20px}
.brand{display:flex;align-items:center;gap:10px;font-weight:800;font-size:16px}
.brand .logo{width:32px;height:32px}
.navright{margin-left:auto;display:flex;align-items:center;gap:10px}

.authwrap{min-height:calc(100vh - 60px);display:grid;grid-template-columns:1fr 1fr;background:#fff}
.auth-aside{background:radial-gradient(700px 400px at 20% 0%,#16456f,transparent 60%),linear-gradient(160deg,var(--night-1),var(--night-0));color:#dceaf4;padding:56px 48px;display:flex;flex-direction:column;justify-content:space-between}
.auth-box{display:grid;place-items:center;padding:40px}
.auth-box .inner{width:100%;max-width:380px}

@media(max-width:920px){
  .g2,.g3,.g4{grid-template-columns:1fr}
  .console{grid-template-columns:1fr}.side{position:fixed;left:-260px;z-index:80;width:248px;transition:.25s}.side.open{left:0}
  .ccontent{padding:18px 16px}
  .authwrap{grid-template-columns:1fr}.auth-aside{display:none}
  .ptitle{flex-direction:column;align-items:flex-start;gap:12px}
  .pubnav .in{padding:0 14px;gap:10px}
}

/* ================================================================================
   [vxa2 · 管控台视觉升级 · 2026-10-23]  —— 删除本块（自本注释起至文件尾）即回滚
   --------------------------------------------------------------------------------
   背景：/vx-admin/vx-admin.js 引用了一批 vx.css 从未定义样式的组件类
   （.note-mini / .divider / .form-row / .modal-b / .stack / .chips / .x /
   select.select-sm），这些元素一直以浏览器默认样式渲染：无底色无圆角的裸文本提示条、
   默认灰色 <hr>、padding 为 0（内容贴弹窗边缘）的弹窗正文、不换行不间隙的账号标签、
   42px 全尺寸的 select-sm——是管控台内仅存的「旧视觉」痕迹。
   本块只做「补样式」，全部为新增规则：
     · 未修改本文件上方任何一条既有规则（未改任何既有令牌值与组件外观）；
     · 未新增/删除任何类名、文本、导航入口、操作入口或事件绑定（vx-admin.js 零改动）；
     · 作用域限定于管控台自身容器（.console / #modal / #loginGate / #toast），
       不会影响同样引用 vx.css 的门户 register / my / login / org-admin 页面
       （已实测核实：这些页面均不使用上述类，也没有 .console/#modal/#loginGate 结构）；
     · 设计语言取自 /app/wingstation-ui.css 的安全子集：柔和阴影、focus-visible
       可见环、prefers-reduced-motion 动效降级；配色与圆角沿用 vx.css 既有令牌，
       与管控台现有组件保持一致（既有卡片圆角/配色一律不动）；
     · 不含 !important（唯一例外是 prefers-reduced-motion 降级块，属规范允许）。
   涉及子页：站点配置、题库排序、题目库编辑（含题目编辑/新建/排序/图片/版本弹窗）、
            账号权限管理、分类文件夹/自定义角色（成员弹窗分隔线）。
   ================================================================================ */

/* ---- 1) 提示条 .note-mini（站点配置 / 题库排序 / 题目库编辑 / 题库各弹窗）---- */
.console .note-mini,
#modal .note-mini{display:block;font-size:12.5px;line-height:1.6;color:var(--ink-2);
  background:var(--surface-2);border:1px solid var(--line);border-radius:13px;
  padding:10px 14px;box-shadow:var(--sh-1)}
.console .note-mini.info,
#modal .note-mini.info{background:var(--blue-s);border-color:#d2e3fc;color:var(--blue-d)}
.console .note-mini.warn,
#modal .note-mini.warn{background:var(--warn-s);border-color:#f0dbb6;color:var(--warn)}

/* ---- 2) 弹窗分隔线 .divider（文件夹 / 角色成员弹窗内的 <hr class="divider">）---- */
.console .divider,
#modal .divider{border:0;border-top:1px solid var(--line);margin:16px 0}

/* ---- 3) 表单行 .form-row（题目编辑 / 新建 / 排序弹窗）---- */
.console .form-row,
#modal .form-row{margin-bottom:16px}
.console .form-row>label,
#modal .form-row>label{display:block;font-size:13px;font-weight:500;color:var(--ink-2);margin-bottom:7px}

/* ---- 4) 题库弹窗正文 .modal-b（此前无样式，padding:0 内容贴弹窗边缘）---- */
.console .modal-b,
#modal .modal-b{padding:20px 22px}

/* ---- 5) 账号权限管理：.stack / .chips / .x / select.select-sm（此前均无样式）---- */
.console .stack{display:flex;flex-direction:column;gap:8px;min-width:0}
.console .chips{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.console .chips .tag{flex:0 0 auto}
.console .chips .x{flex:0 0 auto;display:inline-grid;place-items:center;width:18px;height:18px;
  padding:0;border:0;border-radius:50%;background:transparent;color:var(--mut);
  font-size:13px;line-height:1;cursor:pointer;transition:background .16s,color .16s}
.console .chips .x:hover{background:var(--danger-s);color:var(--danger)}
.console select.select-sm{height:32px;padding:0 10px;font-size:12.5px;border-radius:8px}

/* ---- 6) 折叠区 summary 细节（题目库编辑解析折叠 / 采集器规则 / 供需对接审核）---- */
.console details>summary{cursor:pointer}
.console details>summary::-webkit-details-marker{color:var(--faint)}
.console details>summary::marker{color:var(--faint)}

/* ---- 7) focus-visible 可见环（键盘可达性；取 /app/ 基准同款 3px 浅蓝环）---- */
.console :is(button,a,input,select,textarea,summary,[tabindex]):focus-visible,
#modal :is(button,a,input,select,textarea,summary,[tabindex]):focus-visible,
#loginGate :is(button,a,input,select,textarea,summary,[tabindex]):focus-visible
{outline:3px solid #71b6f5;outline-offset:2px}

/* ---- 8) prefers-reduced-motion 动效降级（本块唯一允许的 !important 例外）---- */
@media (prefers-reduced-motion:reduce){
  .console *,.console *::before,.console *::after,
  #modal *,#modal *::before,#modal *::after,
  #loginGate *,#loginGate *::before,#loginGate *::after,
  #toast *,#toast *::before,#toast *::after
  {animation-duration:.01ms!important;animation-iteration-count:1!important;
   transition-duration:.01ms!important;scroll-behavior:auto!important}
}

/* [phase3f] 手机端概览统计卡：恢复紧凑双列
 * 现状：@media(max-width:920px) 把 .g2/.g3/.g4 一律压成 1fr，概览 5 张低信息卡各占整屏一块，
 *      一个数字占一整块，首屏有效信息极少。
 * 处理：只对「直接子元素含 .stat 的 grid」恢复双列并压缩内边距/字号；
 *      表单、列表、警告、复杂内容不受影响（它们不含直接 .stat 子元素，仍为单列/原样）。
 * 不改 JS、不改 HTML 结构、不删任何字段。 */
@media (max-width:920px){
  .grid:has(> .stat){grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
  .grid:has(> .stat) > .stat{padding:13px 14px;border-radius:14px}
  .grid:has(> .stat) .stat .lab{font-size:12px;gap:6px}
  .grid:has(> .stat) .stat .num{font-size:24px;margin-top:4px;letter-spacing:-.3px}
  .grid:has(> .stat) .stat .delta{font-size:11.5px;margin-top:3px}
}
