/* /public/css/base.css  全局扁平硬朗风格（圆角<=4px，无渐变，无阴影） */
:root{
  --c-bg:#f2f4f7; --c-panel:#ffffff; --c-line:#d5dae1; --c-line-dark:#b8c0cb;
  --c-text:#14171a; --c-text-2:#5b6470; --c-text-3:#8b949e;
  --c-primary:#1b6cf0; --c-primary-d:#1457c4; --c-ok:#12855b; --c-warn:#b8760a;
  --c-danger:#c0392b; --c-dark:#14171a; --c-side:#1b2028; --c-side-2:#252c36;
  --r:2px; --r-md:4px;
  --fs:14px; --fs-sm:12px; --fs-lg:16px; --fs-xl:20px;
  --sp:12px;
  /* ---------- 短名别名（admin.css / user.css / site.css 共用） ---------- */
  --bg:#f2f4f7; --bg2:#ffffff; --panel:#ffffff;
  --line:#d5dae1; --line2:#eceff3; --line-dark:#b8c0cb;
  --t1:#14171a; --t2:#5b6470; --t3:#8b949e;
  --ink:#14171a; --g:#8b949e; --gray:#8b949e; --muted:#8b949e;
  --pri:#1b6cf0; --pri-d:#1457c4; --primary:#1b6cf0;
  --ok:#12855b; --warn:#b8760a; --err:#c0392b; --danger:#c0392b;
  --radius:2px; --radius-md:4px;
  --mono:ui-monospace,Menlo,Consolas,"Courier New",monospace;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  font-size:var(--fs); line-height:1.6; color:var(--c-text); background:var(--c-bg);
  -webkit-font-smoothing:antialiased;
}
a{color:var(--c-primary); text-decoration:none}
a:hover{text-decoration:underline}
code,pre,kbd{font-family:ui-monospace,Menlo,Consolas,"Courier New",monospace}
pre{margin:0}
h1,h2,h3,h4{margin:0 0 10px; font-weight:600; line-height:1.35}
h1{font-size:22px} h2{font-size:18px} h3{font-size:16px} h4{font-size:14px}
p{margin:0 0 10px}
hr{border:0;border-top:1px solid var(--c-line);margin:14px 0}
::selection{background:#cfe1ff}

/* ---------- 图标 ---------- */
svg.ic,svg.ico{width:18px;height:18px;flex:none;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:square;stroke-linejoin:miter;vertical-align:-3px}
svg.ic.lg{width:22px;height:22px}
svg.ic.sm{width:14px;height:14px;stroke-width:2}
.ico.lg{width:22px;height:22px} .ico.sm{width:14px;height:14px;stroke-width:2}

/* ---------- 布局 ---------- */
.wrap{max-width:1180px;margin:0 auto;padding:0 14px}
.row{display:flex;gap:var(--sp);align-items:center}
.row.between{justify-content:space-between}
.row.wrap{flex-wrap:wrap}
.col{display:flex;flex-direction:column;gap:var(--sp)}
.grow{flex:1;min-width:0}
.grid{display:grid;gap:var(--sp)}
.g2{grid-template-columns:repeat(auto-fill,minmax(230px,1fr))}
.g3{grid-template-columns:repeat(auto-fill,minmax(180px,1fr))}
.g4{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}
.mt{margin-top:var(--sp)} .mb{margin-bottom:var(--sp)} .ml{margin-left:var(--sp)}
.muted{color:var(--c-text-2)} .dim{color:var(--c-text-3)}
.small{font-size:var(--fs-sm)} .big{font-size:var(--fs-lg)} .xbig{font-size:var(--fs-xl)}
.center{text-align:center} .right{text-align:right} .bold{font-weight:600}
.nowrap{white-space:nowrap} .break{word-break:break-all}
.hidden{display:none !important}

/* ---------- 卡片 ---------- */
.card{background:var(--c-panel);border:1px solid var(--c-line);border-radius:var(--r-md)}
.card>.hd{display:flex;align-items:center;gap:8px;justify-content:space-between;padding:10px 12px;border-bottom:1px solid var(--c-line);font-weight:600}
.card>.hd .ttl{display:flex;align-items:center;gap:6px}
.card>.bd{padding:12px}
.card>.ft{padding:10px 12px;border-top:1px solid var(--c-line);background:#fafbfc}
.card.flat{box-shadow:none}
.panel{border:1px solid var(--c-line);background:#fff;border-radius:var(--r-md)}
.kpi{border:1px solid var(--c-line);background:#fff;border-radius:var(--r-md);padding:12px}
.kpi .k{font-size:var(--fs-sm);color:var(--c-text-2)}
.kpi .v{font-size:24px;font-weight:600;margin-top:2px;letter-spacing:-.5px}
.kpi .s{font-size:var(--fs-sm);color:var(--c-text-3);margin-top:2px}

/* ---------- 按钮 ---------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  height:34px;padding:0 14px;font-size:var(--fs);font-family:inherit;
  background:#fff;color:var(--c-text);border:1px solid var(--c-line-dark);
  border-radius:var(--r);cursor:pointer;white-space:nowrap;user-select:none;
  transition:background .12s,border-color .12s;
}
.btn:hover{border-color:var(--c-text-3);background:#f7f8fa}
.btn:active{background:#eceff3}
.btn[disabled],.btn.disabled{opacity:.55;cursor:not-allowed}
.btn.primary{background:var(--c-primary);border-color:var(--c-primary);color:#fff}
.btn.primary:hover{background:var(--c-primary-d);border-color:var(--c-primary-d)}
.btn.dark{background:var(--c-dark);border-color:var(--c-dark);color:#fff}
.btn.dark:hover{background:#000}
.btn.danger{background:#fff;border-color:var(--c-danger);color:var(--c-danger)}
.btn.danger:hover{background:#fdf1f0}
.btn.danger.solid{background:var(--c-danger);border-color:var(--c-danger);color:#fff}
.btn.ghost{background:transparent;border-color:transparent;color:var(--c-text-2)}
.btn.ghost:hover{background:#eceff3;color:var(--c-text)}
.btn.sm{height:28px;padding:0 10px;font-size:var(--fs-sm)}
.btn.lg{height:42px;padding:0 20px;font-size:var(--fs-lg)}
.btn.block{width:100%}
.btn-group{display:inline-flex}
.btn-group .btn{border-radius:0;margin-left:-1px}
.btn-group .btn:first-child{border-radius:var(--r) 0 0 var(--r);margin-left:0}
.btn-group .btn:last-child{border-radius:0 var(--r) var(--r) 0}

/* ---------- 表单 ---------- */
.field{display:flex;flex-direction:column;gap:5px;margin-bottom:10px}
.field>label,.field>span.lb{font-size:var(--fs-sm);color:var(--c-text-2);font-weight:600}
.field .hint{font-size:var(--fs-sm);color:var(--c-text-3)}
.field .err{font-size:var(--fs-sm);color:var(--c-danger)}
input[type=text],input[type=password],input[type=email],input[type=number],input[type=tel],input[type=url],input[type=search],select,textarea{
  width:100%;height:34px;padding:0 10px;font-size:var(--fs);font-family:inherit;color:var(--c-text);
  background:#fff;border:1px solid var(--c-line-dark);border-radius:var(--r);outline:none;
}
textarea{height:auto;min-height:90px;padding:8px 10px;line-height:1.6;resize:vertical}
select{appearance:none;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235b6470' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;background-size:14px;padding-right:28px}
input:focus,select:focus,textarea:focus{border-color:var(--c-primary);box-shadow:0 0 0 2px rgba(27,108,240,.16)}
input.err,select.err,textarea.err{border-color:var(--c-danger)}
input[disabled],select[disabled],textarea[disabled]{background:#f2f4f7;color:var(--c-text-3)}
input[type=file]{width:100%;font-size:var(--fs-sm);padding:5px 8px;border:1px dashed var(--c-line-dark);border-radius:var(--r);background:#fafbfc;height:auto}
input[type=color]{width:44px;height:34px;padding:2px;border:1px solid var(--c-line-dark);border-radius:var(--r);background:#fff}
.input-group{display:flex}
.input-group input{border-radius:var(--r) 0 0 var(--r)}
.input-group .btn{border-radius:0 var(--r) var(--r) 0;margin-left:-1px;height:34px}
.form-grid{display:grid;gap:0 14px;grid-template-columns:repeat(auto-fill,minmax(238px,1fr))}
.form-grid .field.full{grid-column:1/-1}
.check{display:flex;align-items:flex-start;gap:8px;font-size:var(--fs);cursor:pointer;user-select:none;padding:2px 0}
.check input[type=checkbox],.check input[type=radio]{width:15px;height:15px;margin:3px 0 0;flex:none;accent-color:var(--c-primary)}
.check span{line-height:1.5}

/* 开关 */
.switch{display:inline-flex;align-items:center;gap:8px;cursor:pointer;user-select:none;font-size:var(--fs)}
.switch .track,.switch>i{display:inline-block;width:38px;height:20px;border:1px solid var(--c-line-dark);border-radius:var(--r);background:#e6e9ee;position:relative;transition:background .12s;flex:none}
.switch .track::after,.switch>i::after{content:"";position:absolute;top:2px;left:2px;width:14px;height:14px;background:#fff;border:1px solid var(--c-line-dark);border-radius:1px;transition:left .12s}
.switch input{position:absolute;opacity:0;width:0;height:0}
.switch input:checked+.track,.switch input:checked+i{background:var(--c-primary);border-color:var(--c-primary)}
.switch input:checked+.track::after,.switch input:checked+i::after{left:20px;border-color:var(--c-primary)}

/* ---------- 表格（.tb / .tbl / .mini-table 统一） ---------- */
.table-wrap,.tbl-wrap,.tblwrap{width:100%;overflow-x:auto;border:1px solid var(--c-line);border-radius:var(--r-md);background:#fff}
.ad-card .tbl-wrap,.ad-card .table-wrap{border:0;border-radius:0}
table.tb,table.tbl{width:100%;border-collapse:collapse;font-size:var(--fs)}
table.tb th,table.tbl th{background:#f4f6f9;text-align:left;padding:9px 10px;font-weight:600;color:var(--c-text-2);border-bottom:1px solid var(--c-line);white-space:nowrap}
table.tb td,table.tbl td{padding:9px 10px;border-bottom:1px solid #eceff3;vertical-align:middle}
table.tb tr:last-child td,table.tbl tr:last-child td{border-bottom:0}
table.tb tbody tr:hover,table.tbl tbody tr:hover{background:#f8fafc}
table.tb td.ops,table.tbl td.ops{white-space:nowrap}
table.tb .ck,table.tbl .ck{width:34px}
/* 迷你表格（用户端概览） */
table.mini-table{width:100%;border-collapse:collapse;font-size:var(--fs-sm)}
table.mini-table th{background:#f4f6f9;text-align:left;padding:6px 8px;font-weight:600;color:var(--c-text-2);border-bottom:1px solid var(--c-line);white-space:nowrap}
table.mini-table td{padding:6px 8px;border-bottom:1px solid #eceff3}
table.mini-table tr:last-child td{border-bottom:0}

/* ---------- 徽章 ---------- */
.badge{display:inline-flex;align-items:center;gap:4px;height:20px;padding:0 6px;font-size:var(--fs-sm);border:1px solid var(--c-line-dark);border-radius:var(--r);background:#fff;color:var(--c-text-2);white-space:nowrap}
.badge.ok{border-color:#8fd0b6;background:#eaf7f1;color:var(--c-ok)}
.badge.warn{border-color:#e6c88a;background:#fdf6e7;color:var(--c-warn)}
.badge.danger{border-color:#e5a79f;background:#fdf1f0;color:var(--c-danger)}
.badge.info{border-color:#a9c6f4;background:#eef4fe;color:var(--c-primary)}
.badge.dark{background:var(--c-dark);color:#fff;border-color:var(--c-dark)}
.dot{display:inline-block;width:7px;height:7px;border-radius:1px;background:var(--c-text-3)}
.dot.ok{background:var(--c-ok)} .dot.warn{background:var(--c-warn)} .dot.danger{background:var(--c-danger)}

/* ---------- 进度 ---------- */
.bar{height:8px;border:1px solid var(--c-line-dark);background:#eef1f5;border-radius:1px;overflow:hidden}
.bar>i{display:block;height:100%;background:var(--c-primary)}
.bar>i.warn{background:var(--c-warn)} .bar>i.danger{background:var(--c-danger)}

/* ---------- 标签页 ---------- */
.tabs{display:flex;border-bottom:1px solid var(--c-line);gap:2px;overflow-x:auto}
.tabs a,.tabs button{display:inline-flex;align-items:center;gap:6px;height:36px;padding:0 14px;border:1px solid transparent;border-bottom:0;background:transparent;color:var(--c-text-2);font-size:var(--fs);font-family:inherit;cursor:pointer;white-space:nowrap;border-radius:var(--r) var(--r) 0 0}
.tabs a:hover,.tabs button:hover{color:var(--c-text);background:#f4f6f9}
.tabs a.on,.tabs button.on{color:var(--c-text);background:#fff;border-color:var(--c-line);margin-bottom:-1px;font-weight:600}
.tabs.plain a{border:0}
.tabs.plain a.on{background:#fff;border:0;box-shadow:inset 0 -2px 0 var(--c-primary);margin-bottom:0}

/* ---------- 弹窗 ---------- */
.mask{position:fixed;inset:0;background:rgba(15,20,26,.5);display:flex;align-items:center;justify-content:center;z-index:800;padding:14px}
.modal{background:#fff;border:1px solid var(--c-line-dark);border-radius:var(--r-md);width:100%;max-width:520px;max-height:90vh;display:flex;flex-direction:column}
.modal.wide{max-width:820px}
.modal>.hd{display:flex;align-items:center;justify-content:space-between;padding:11px 14px;border-bottom:1px solid var(--c-line);font-weight:600}
.modal>.bd{padding:14px;overflow:auto}
.modal>.ft{display:flex;gap:8px;justify-content:flex-end;padding:11px 14px;border-top:1px solid var(--c-line);background:#fafbfc}
.x-btn{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:1px solid transparent;background:transparent;cursor:pointer;color:var(--c-text-2);border-radius:var(--r)}
.x-btn:hover{background:#eceff3;color:var(--c-text)}

/* ---------- 提示 ---------- */
#toast{position:fixed;top:14px;left:50%;transform:translateX(-50%);z-index:1200;display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none}
#toast .t{background:var(--c-dark);color:#fff;border-radius:var(--r);padding:8px 14px;font-size:var(--fs);max-width:90vw;word-break:break-all}
#toast .t.ok{background:#0f6b4a} #toast .t.err{background:#a52f22} #toast .t.warn{background:#8a5a06}
.alert{border:1px solid var(--c-line-dark);border-left-width:3px;border-radius:var(--r);padding:9px 12px;font-size:var(--fs);background:#f8fafc;margin-bottom:10px}
.alert.ok{border-color:#8fd0b6;border-left-color:var(--c-ok);background:#f0faf5}
.alert.warn{border-color:#e6c88a;border-left-color:var(--c-warn);background:#fdf9ef}
.alert.err{border-color:#e5a79f;border-left-color:var(--c-danger);background:#fdf3f2}
.alert.info{border-color:#a9c6f4;border-left-color:var(--c-primary);background:#f2f7ff}
.empty{padding:36px 14px;text-align:center;color:var(--c-text-3);font-size:var(--fs)}
.empty svg{width:32px;height:32px;stroke:var(--c-text-3);margin-bottom:8px}
.loading{padding:26px;text-align:center;color:var(--c-text-3)}

/* ---------- 分页 ---------- */
.pager{display:flex;gap:6px;align-items:center;justify-content:flex-end;padding:10px 0;flex-wrap:wrap}
.pager .pg{min-width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--c-line-dark);background:#fff;border-radius:var(--r);cursor:pointer;font-size:var(--fs-sm)}
.pager .pg.on{background:var(--c-dark);color:#fff;border-color:var(--c-dark)}
.pager .pg.dis{opacity:.5;cursor:not-allowed}

/* ---------- 顶部栏 ---------- */
.topbar{height:52px;background:#fff;border-bottom:1px solid var(--c-line);display:flex;align-items:center;position:sticky;top:0;z-index:100}
.topbar .brand{display:flex;align-items:center;gap:8px;font-weight:600;font-size:16px}
.topbar .brand .logo{width:26px;height:26px;background:var(--c-dark);color:#fff;display:flex;align-items:center;justify-content:center;border-radius:var(--r)}
.topbar nav{display:flex;gap:2px;margin-left:18px}
.topbar nav a{height:52px;display:inline-flex;align-items:center;padding:0 12px;color:var(--c-text-2);border-bottom:2px solid transparent}
.topbar nav a:hover{background:#f4f6f9;text-decoration:none;color:var(--c-text)}
.topbar nav a.on{color:var(--c-text);border-bottom-color:var(--c-primary);font-weight:600}

/* ---------- 底部导航（移动端） ---------- */
.bottom-nav{display:none;position:fixed;left:0;right:0;bottom:0;z-index:150;background:#fff;border-top:1px solid var(--c-line);padding-bottom:env(safe-area-inset-bottom)}
.bottom-nav .in{display:flex}
.bottom-nav a{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:7px 0 6px;color:var(--c-text-3);font-size:11px}
.bottom-nav a:hover{text-decoration:none}
.bottom-nav a.on{color:var(--c-primary)}
.bottom-nav a .badge{position:absolute;transform:translate(16px,-6px);height:15px;padding:0 4px;font-size:10px}
@media (max-width:860px){
  .bottom-nav{display:block}
  body.has-bottom{padding-bottom:64px}
  .topbar nav{display:none}
}

/* ---------- 侧边栏（后台） ---------- */
.layout{display:flex;min-height:100vh}
.side{width:200px;flex:none;background:var(--c-side);color:#c8cfd8;display:flex;flex-direction:column;position:sticky;top:0;height:100vh;overflow-y:auto}
.side .logo{display:flex;align-items:center;gap:8px;padding:14px 14px;color:#fff;font-weight:600;border-bottom:1px solid #333b46}
.side .logo .mark{width:26px;height:26px;background:#fff;color:var(--c-side);display:flex;align-items:center;justify-content:center;border-radius:var(--r);font-size:14px}
.side .grp{padding:12px 14px 4px;font-size:11px;color:#7d8794;letter-spacing:1px}
.side a.navi{display:flex;align-items:center;gap:9px;padding:9px 14px;color:#c8cfd8;font-size:var(--fs);border-left:2px solid transparent}
.side a.navi:hover{background:var(--c-side-2);color:#fff;text-decoration:none}
.side a.navi.on{background:var(--c-side-2);color:#fff;border-left-color:var(--c-primary);font-weight:600}
.side .foot{margin-top:auto;padding:10px 14px;border-top:1px solid #333b46;font-size:11px;color:#7d8794}
.main{flex:1;min-width:0;display:flex;flex-direction:column}
.main .hd{height:52px;background:#fff;border-bottom:1px solid var(--c-line);display:flex;align-items:center;gap:10px;padding:0 14px;position:sticky;top:0;z-index:90}
.main .body{padding:14px;flex:1}
@media (max-width:860px){
  .side{position:fixed;left:0;top:0;z-index:400;transform:translateX(-100%);transition:transform .16s}
  .side.open{transform:none}
  .menu-btn{display:inline-flex !important}
}
.menu-btn{display:none}

/* ---------- 步骤条（安装） ---------- */
.steps{display:flex;gap:0;border:1px solid var(--c-line);border-radius:var(--r-md);overflow:hidden;background:#fff;flex-wrap:wrap}
.steps .st{flex:1;min-width:120px;padding:10px 12px;border-right:1px solid var(--c-line);font-size:var(--fs-sm);color:var(--c-text-3);display:flex;gap:8px;align-items:center}
.steps .st:last-child{border-right:0}
.steps .st .n{width:20px;height:20px;border:1px solid currentColor;border-radius:var(--r);display:inline-flex;align-items:center;justify-content:center;font-size:11px;flex:none}
.steps .st.on{color:var(--c-primary);background:#f2f7ff;font-weight:600}
.steps .st.done{color:var(--c-ok)}

/* ---------- 文件管理器 ---------- */
.fm{display:flex;gap:12px;align-items:flex-start;flex-wrap:wrap}
.fm-side{width:220px;flex:none}
.fm-main{flex:1;min-width:280px}
@media (max-width:800px){ .fm-side{width:100%} }
.crumb{display:flex;flex-wrap:wrap;align-items:center;gap:4px;font-size:var(--fs-sm);padding:6px 0}
.crumb a,.crumb span.sep{color:var(--c-text-2)}
.crumb a:hover{color:var(--c-primary)}
.crumb .cur{color:var(--c-text);font-weight:600}
.frow{display:flex;align-items:center;gap:10px;padding:7px 10px;border-bottom:1px solid #eceff3;cursor:default}
.frow:last-child{border-bottom:0}
.frow:hover{background:#f8fafc}
.frow .nm{flex:1;min-width:0;display:flex;align-items:center;gap:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}
.frow .mt{color:var(--c-text-3);font-size:var(--fs-sm);width:150px;flex:none}
.frow .sz{color:var(--c-text-3);font-size:var(--fs-sm);width:80px;flex:none;text-align:right}
.frow .pm{color:var(--c-text-3);font-size:var(--fs-sm);width:74px;flex:none;text-align:right}
@media (max-width:700px){ .frow .mt,.frow .pm{display:none} }
.tree{font-size:var(--fs-sm);max-height:420px;overflow:auto}
.tree .tn{display:flex;align-items:center;gap:5px;padding:4px 6px;border-radius:var(--r);cursor:pointer;white-space:nowrap}
.tree .tn:hover{background:#f0f3f7}
.tree .tn.on{background:#eef4fe;color:var(--c-primary)}
.editor{width:100%;min-height:340px;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:13px;line-height:1.6;background:#fbfcfd;border:1px solid var(--c-line-dark);border-radius:var(--r);padding:10px;tab-size:2}
.upload-box{border:1px dashed var(--c-line-dark);border-radius:var(--r-md);padding:18px;text-align:center;background:#fafbfc;cursor:pointer}
.upload-box:hover{border-color:var(--c-primary);background:#f4f8ff}
.upload-box.dragover{border-color:var(--c-primary);background:#eef4fe}

/* ---------- 登录页 ---------- */
.auth-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px;background:#f2f4f7}
.auth-box{width:100%;max-width:400px;background:#fff;border:1px solid var(--c-line-dark);border-radius:var(--r-md);padding:22px}
.auth-box .brand{display:flex;align-items:center;gap:9px;justify-content:center;margin-bottom:16px;font-size:18px;font-weight:600}
.auth-box .brand .logo{width:30px;height:30px;background:var(--c-dark);color:#fff;display:flex;align-items:center;justify-content:center;border-radius:var(--r)}

/* ---------- 代码块 ---------- */
.code{background:#1b2028;color:#d7dee6;padding:12px;border-radius:var(--r);font-size:12.5px;line-height:1.65;overflow:auto;max-height:340px;white-space:pre-wrap;word-break:break-all}
.kv{display:flex;justify-content:space-between;gap:10px;padding:6px 0;border-bottom:1px dashed #e3e7ec;font-size:var(--fs)}
.kv:last-child{border-bottom:0}
.kv .k{color:var(--c-text-2)}
.kv .v{font-weight:600;text-align:right;word-break:break-all}

/* ---------- 协议滚动 ---------- */
.agree-box{height:150px;overflow:auto;border:1px solid var(--c-line);background:#fafbfc;border-radius:var(--r);padding:10px;font-size:var(--fs-sm);color:var(--c-text-2);white-space:pre-wrap}

/* ---------- 页面级钩子（<body> 上的命名空间，便于按页面覆盖） ---------- */
.page-site,.page-admin,.page-user{min-height:100%}

/* ---------- 状态色 ---------- */
.t-ok{color:var(--c-ok)} .t-warn{color:var(--c-warn)} .t-err{color:var(--c-danger)} .t-pri{color:var(--c-primary)}

/* ---------- 通用显隐（必须放在 base，全站三套页面都依赖） ----------
   原先 .hide 只写在 admin.css：前台与用户控制台点弹窗关闭按钮时
   classList.add('hide') 加了等于没加，遮罩不会消失（表现为“叉点了没反应”），
   用户端用来隐藏 <input type=file> 的 .hide 也失效，文件框直接露在页面上挡住旁边的按钮。 */
.hide{display:none !important}
[hidden]{display:none !important}

/* ---------- 面板切换（首页认证弹窗：登录 / 验证码登录 / 注册 / 找回密码） ----------
   site.js 靠 .pane.on 切换，原先 .pane 没有任何样式，
   四个表单会同时铺在弹窗里互相叠压，点哪个都可能落到别的表单上。 */
.pane{display:none}
.pane.on{display:block}

/* ---------- 输入框 + 按钮组合（模板用 .grp，此前只有 .input-group 生效） ---------- */
.grp{display:flex;align-items:stretch}
.grp input{border-radius:var(--r) 0 0 var(--r);min-width:0}
.grp .prefix,.grp .suffix{display:flex;align-items:center;padding:0 9px;height:34px;flex:none;
  background:#f4f6f9;border:1px solid var(--c-line-dark);color:var(--c-text-2);font-size:var(--fs-sm)}
.grp .prefix{border-right:0;border-radius:var(--r) 0 0 var(--r)}
.grp .suffix{border-left:0;border-radius:0 var(--r) var(--r) 0}
.grp .prefix+input{border-radius:0}
.grp input+.suffix{border-radius:0 var(--r) var(--r) 0}
.grp input:last-child{border-radius:0 var(--r) var(--r) 0}
.grp .btn{border-radius:0 var(--r) var(--r) 0;margin-left:-1px;height:34px;flex:none}
