@charset "UTF-8";
/* ==========================================================================
   DApp 加密钱包风 · 后台风格层
   --------------------------------------------------------------------------
   加载顺序（必须在 bootstrap.min.css 之后）：
     bootstrap.min.css → macos.css → bs5-overwind.css → dapp.css
   本文件只负责视觉，不改动任何 DOM 结构 / 不依赖任何 JS 插件。

   风格四要素：
     1. 76px 极窄纯图标栏（hover 出 tooltip）
     2. 28px 大圆角白外壳，底色带两团径向渐变光晕
     3. 高饱和渐变主卡 + 卡片内嵌微图表（纯 SVG / CSS，无图表库）
     4. 统一 11~28px 圆角体系，弱化阴影，靠 1px 描边 + 留白分层
   ========================================================================== */

/* ============ 1. 设计令牌 ============ */
:root{
  --bg:#f2f3f7;
  --shell:#ffffff;
  --ink-1:#14161c;
  --ink-2:#6b7080;
  --ink-3:#a0a6b4;
  --line:#ececf1;
  --line-2:#e2e4ec;

  --brand:#5b5bd6;   --brand-soft:#eeecff;
  --brand-2:#8b5cf6;
  --mint:#10c8a0;    --mint-soft:#e4fbf5;
  --coral:#ff6b6b;   --coral-soft:#ffecec;
  --amber:#ffb020;   --amber-soft:#fff4e0;
  --sky:#3aa0ff;     --sky-soft:#e8f3ff;
  --pink:#ff5fa2;

  /* 兼容令牌：新增后台页（订单/举报/存储体检/工具箱/运营数据/兑换码/优惠券/
     备份/迁移/登录日志）大量使用 var(--card) / var(--bg-soft) / var(--accent)，
     这三个此前从未定义过 → 一律走了无效值。这里统一补上并挂到既有令牌上，
     主题层只需覆盖 --shell / --brand，这三个自动跟随。 */
  --card:var(--shell,#ffffff);
  --bg-soft:#f6f7f9;
  --accent:var(--brand,#5b5bd6);

  --r-xl:28px; --r-lg:22px; --r-md:18px; --r-sm:14px; --r-xs:11px;
  --font-sans:-apple-system,BlinkMacSystemFont,"SF Pro SC","PingFang SC",
              "Segoe UI","Microsoft YaHei",Inter,Roboto,"Helvetica Neue",Arial,sans-serif;
  --font-num:"SF Mono",ui-monospace,"JetBrains Mono",Menlo,Consolas,monospace;
}

/* ============ 2. 页面底色与滚动条 ============ */
body.dapp-body{
  background:
    radial-gradient(1100px 620px at 12% -8%, #e9e6ff 0%, rgba(233,230,255,0) 62%),
    radial-gradient(900px 560px at 100% 0%, #e3f6ff 0%, rgba(227,246,255,0) 58%),
    var(--bg);
  color:var(--ink-1);
  font-family:var(--font-sans);
  font-size:14px; line-height:1.5;
  -webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;
}
body.dapp-body ::-webkit-scrollbar{width:10px;height:10px}
body.dapp-body ::-webkit-scrollbar-thumb{
  background:#d9dbe4; border:3px solid transparent; border-radius:99px; background-clip:content-box;
}
body.dapp-body ::-webkit-scrollbar-thumb:hover{
  background:#c3c6d2; background-clip:content-box; border:3px solid transparent;
}

/* ============ 3. 布局骨架 ============ */
.dapp-app{
  max-width:1520px; margin:0 auto; padding:16px;
  display:flex; gap:14px; height:100vh; height:100dvh;
}
.dapp-rail{
  width:76px; flex:0 0 76px; background:var(--shell);
  border:1px solid var(--line); border-radius:26px;
  display:flex; flex-direction:column; align-items:center;
  padding:16px 0 14px; gap:6px;
}
.dapp-shell{
  flex:1; min-width:0; background:var(--shell);
  border:1px solid var(--line); border-radius:var(--r-xl);
  display:flex; flex-direction:column; overflow:hidden;
}
.dapp-main{flex:1; min-height:0; overflow-y:auto; padding:0 30px 34px}

/* ============ 4. 极窄图标栏 ============ */
.dapp-logo{
  width:42px; height:42px; border-radius:13px; margin-bottom:12px;
  background:linear-gradient(135deg,var(--brand),var(--brand-2));
  display:grid; place-items:center; color:#fff; font-size:17px;
  box-shadow:0 6px 16px rgba(91,91,214,.32); text-decoration:none;
}
.dapp-logo:hover{color:#fff}
.dapp-rail-btn{
  position:relative; width:46px; height:46px; border-radius:14px; border:0;
  background:transparent; color:var(--ink-3); font-size:17px;
  display:grid; place-items:center; cursor:pointer; text-decoration:none;
  transition:background .18s ease, color .18s ease;
}
.dapp-rail-btn:hover{background:#f4f5f9;color:var(--ink-1)}
.dapp-rail-btn.active{background:var(--brand-soft);color:var(--brand)}
.dapp-rail-btn.active::before{
  content:""; position:absolute; left:-16px; top:50%; transform:translateY(-50%);
  width:3px; height:22px; border-radius:0 3px 3px 0; background:var(--brand);
}
/* 侧栏角标：安全管理待人工复核数量 */
.dapp-rail-badge{
  position:absolute; top:5px; right:5px; min-width:16px; height:16px; padding:0 4px;
  border-radius:8px; background:var(--coral); color:#fff;
  font-size:10px; font-weight:700; line-height:16px; text-align:center;
  box-shadow:0 0 0 2px #fff; pointer-events:none;
}
.dapp-rail-btn[data-tip]:hover::after{
  content:attr(data-tip); position:absolute; left:56px; top:50%; transform:translateY(-50%);
  background:#14161c; color:#fff; font-size:12px; padding:5px 9px; border-radius:8px;
  white-space:nowrap; z-index:300; pointer-events:none;
}
.dapp-rail-dot{
  position:absolute; top:9px; right:9px; width:7px; height:7px; border-radius:50%;
  background:var(--coral); border:2px solid #fff;
}
.dapp-rail-foot{margin-top:auto;display:flex;flex-direction:column;gap:6px;align-items:center}

/* ============ 5. 顶栏 ============ */
.dapp-topbar{
  position:sticky; top:0; z-index:20;
  background:rgba(255,255,255,.82);
  backdrop-filter:saturate(180%) blur(20px);
  -webkit-backdrop-filter:saturate(180%) blur(20px);
  padding:22px 30px 16px; display:flex; align-items:center; gap:16px; flex-wrap:wrap;
}
.dapp-greet{margin-right:auto} /* 吸收左侧剩余空间，把搜索框/图标/头像推到顶栏最右 */
.dapp-greet h1{margin:0;font-size:22px;font-weight:700;letter-spacing:-.3px}
.dapp-greet p{margin:2px 0 0;font-size:12.5px;color:var(--ink-2)}
.dapp-search{
  width:280px; height:42px; background:#f4f5f9;
  border:1px solid transparent; border-radius:13px;
  display:flex; align-items:center; gap:9px; padding:0 13px; transition:.18s;
}
.dapp-search:focus-within{background:#fff;border-color:var(--line-2);box-shadow:0 0 0 4px rgba(91,91,214,.10)}
.dapp-search input{border:0;background:transparent;outline:0;width:100%;font-size:13.5px;color:var(--ink-1)}
.dapp-search input::placeholder{color:var(--ink-3)}
.dapp-icon-btn{
  width:42px;height:42px;border-radius:13px;border:1px solid var(--line);
  background:#fff;color:var(--ink-2);display:grid;place-items:center;font-size:15px;
  cursor:pointer;transition:.18s;flex:0 0 auto;position:relative;text-decoration:none;
}
.dapp-icon-btn:hover{border-color:var(--line-2);background:#fafbfd;color:var(--ink-1)}
.dapp-icon-btn .dot{
  position:absolute;top:8px;right:9px;width:8px;height:8px;border-radius:50%;
  background:var(--coral);border:2px solid #fff;
}
.dapp-btn-primary{
  height:42px;padding:0 18px;border:0;border-radius:13px;color:#fff;font-weight:600;font-size:13.5px;
  background:linear-gradient(135deg,var(--brand),var(--brand-2));
  display:inline-flex;align-items:center;gap:8px;cursor:pointer;text-decoration:none;
  box-shadow:0 6px 16px rgba(91,91,214,.28); transition:.18s;
}
.dapp-btn-primary:hover{transform:translateY(-1px);box-shadow:0 9px 22px rgba(91,91,214,.34);color:#fff}
.dapp-avatar{
  position:relative; overflow:hidden;
  width:42px;height:42px;border-radius:14px;flex:0 0 auto;
  background:linear-gradient(135deg,#ffb020,#ff6b6b 60%,#ff5fa2);
  display:grid;place-items:center;color:#fff;font-weight:700;font-size:14px;text-decoration:none;
  box-shadow:0 5px 14px rgba(255,107,107,.30);
}
/* 管理员复用前台头像：图片绝对定位铺满，加载失败 remove 后露出首字渐变底 */
.dapp-avatar img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
/* 顶栏账号下拉（替代原 mc-topbar 下拉） */
.dapp-menu{
  min-width:190px;border:1px solid var(--line);border-radius:var(--r-sm);
  box-shadow:0 14px 36px rgba(20,22,28,.14);padding:6px;
}
.dapp-menu .dropdown-item{
  border-radius:10px;font-size:13.5px;padding:9px 11px;color:var(--ink-1);
  display:flex;align-items:center;gap:9px;
}
.dapp-menu .dropdown-item:hover{background:#f5f6fa}
.dapp-menu .dropdown-item i{width:16px;text-align:center;color:var(--ink-2)}

/* ============ 6. 卡片与标题 ============ */
.dapp-card{
  background:#fff;border:1px solid var(--line);border-radius:var(--r-lg);
  padding:18px;transition:transform .2s ease, border-color .2s ease;
}
.dapp-card-hover:hover{transform:translateY(-2px);border-color:var(--line-2)}
.dapp-sec{
  display:flex;align-items:center;justify-content:space-between;margin:26px 0 12px;gap:12px;
}
.dapp-sec h2{margin:0;font-size:16px;font-weight:700;letter-spacing:-.2px}
.dapp-sec .sub{font-size:12px;color:var(--ink-3);margin-top:1px}
.dapp-tile{width:38px;height:38px;border-radius:12px;display:grid;place-items:center;font-size:15px;flex:0 0 auto}
.dapp-kpi-label{font-size:12.5px;color:var(--ink-2);margin:0;display:flex;align-items:center;gap:7px}
.dapp-kpi-num{font-size:26px;font-weight:750;letter-spacing:-.7px;font-family:var(--font-num);line-height:1.1}
.dapp-kpi-num small{font-size:13px;font-weight:600;color:var(--ink-3);margin-left:4px;letter-spacing:0}
.dapp-delta{font-size:12px;font-weight:650;display:inline-flex;align-items:center;gap:4px;margin-top:8px}
.dapp-up{color:var(--mint)} .dapp-down{color:var(--coral)}

/* ============ 7. 主卡（钱包感渐变 + 光斑） ============ */
.dapp-hero{
  position:relative;overflow:hidden;border-radius:var(--r-lg);padding:22px;
  color:#fff;background:linear-gradient(135deg,#5b5bd6 0%,#7c5cf0 48%,#a78bfa 100%);
  box-shadow:0 14px 34px rgba(91,91,214,.28);
  display:flex;align-items:center;gap:24px;flex-wrap:wrap;
}
.dapp-hero::before,.dapp-hero::after{
  content:"";position:absolute;border-radius:50%;filter:blur(46px);opacity:.55;pointer-events:none;
}
.dapp-hero::before{width:230px;height:230px;background:#ff5fa2;top:-90px;right:-30px}
.dapp-hero::after{width:190px;height:190px;background:#22d3ee;bottom:-100px;right:120px;opacity:.38}
.dapp-hero>*{position:relative;z-index:2}
.dapp-hero-dark{background:linear-gradient(135deg,#14161c,#2a2d3a);box-shadow:0 14px 34px rgba(20,22,28,.26)}
.dapp-hero .h-label{font-size:12.5px;opacity:.88;margin:0 0 8px;letter-spacing:.2px}
.dapp-hero .h-num{font-size:38px;font-weight:800;letter-spacing:-1.4px;font-family:var(--font-num);line-height:1}
.dapp-hero .h-num span{font-size:15px;font-weight:600;opacity:.85;margin-left:6px;letter-spacing:0}
.dapp-hero .h-sub{font-size:12.5px;opacity:.82;margin:10px 0 0}
.dapp-hero .h-mini{display:flex;gap:8px;margin-top:16px;flex-wrap:wrap}
.dapp-chip-w{
  background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.24);
  border-radius:10px;padding:5px 10px;font-size:11.5px;backdrop-filter:blur(6px);
  display:inline-flex;align-items:center;gap:6px;
}
.dapp-chip-w-solid{background:rgba(255,255,255,.10)}

/* 环形进度 */
.dapp-ring{width:116px;height:116px;flex:0 0 auto;position:relative;margin-left:auto}
.dapp-ring svg{transform:rotate(-90deg)}
.dapp-ring .ring-txt{position:absolute;inset:0;display:grid;place-items:center;text-align:center}
.dapp-ring .ring-txt b{display:block;font-size:21px;font-weight:750;letter-spacing:-.5px;font-family:var(--font-num)}
.dapp-ring .ring-txt i{font-style:normal;font-size:11px;opacity:.85}

/* ============ 8. 微图表 ============ */
.dapp-spark{display:block;width:100%;height:38px;margin-top:12px}
.dapp-bars{display:flex;align-items:flex-end;gap:5px;height:44px;margin-top:14px}
.dapp-bars i{flex:1;border-radius:5px 5px 3px 3px;background:var(--brand-soft);display:block;transition:opacity .25s ease}
.dapp-bars i.hi{background:linear-gradient(180deg,var(--brand),var(--brand-2))}
.dapp-bars i:hover{opacity:.75}

/* ============ 9. 分类胶囊 ============ */
.dapp-chips{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px}
.dapp-chip{
  border:1px solid var(--line);background:#fff;border-radius:99px;
  padding:7px 14px;font-size:12.5px;color:var(--ink-2);cursor:pointer;transition:.16s;
  display:inline-flex;align-items:center;gap:6px;
}
.dapp-chip:hover{border-color:var(--line-2);color:var(--ink-1)}
.dapp-chip.on{background:#14161c;border-color:#14161c;color:#fff;font-weight:600}
.dapp-chip .n{background:#f0f1f6;border-radius:99px;padding:1px 7px;font-size:11px;font-family:var(--font-num)}
.dapp-chip.on .n{background:rgba(255,255,255,.18);color:#fff}

/* ============ 10. 文件列表 ============ */
.dapp-tbl-head,.dapp-file-row{
  display:grid;grid-template-columns:1fr 120px 130px 90px 84px;gap:12px;align-items:center;padding:11px 14px;
}
.dapp-tbl-head{
  font-size:11.5px;color:var(--ink-3);letter-spacing:.3px;padding-bottom:10px;
  border-bottom:1px solid var(--line);
}
.dapp-file-row{border-radius:var(--r-sm);transition:background .16s;cursor:pointer}
.dapp-file-row+.dapp-file-row{margin-top:2px}
.dapp-file-row:hover{background:#f7f8fb}
.dapp-f-main{display:flex;align-items:center;gap:12px;min-width:0}
.dapp-f-ico{width:40px;height:40px;border-radius:13px;display:grid;place-items:center;font-size:15px;flex:0 0 auto}
.dapp-f-name{font-size:13.5px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}
.dapp-f-meta{font-size:11.5px;color:var(--ink-3);margin-top:2px;font-family:var(--font-num);display:block}
.dapp-muted{color:var(--ink-2);font-size:12.5px;font-family:var(--font-num)}
.dapp-bar-mini{height:6px;border-radius:99px;background:#f0f1f6;overflow:hidden;width:74px;display:block}
.dapp-bar-mini i{display:block;height:100%;border-radius:99px;background:linear-gradient(90deg,var(--sky),#7cc4ff)}
.dapp-row-act{display:flex;gap:5px;justify-content:flex-end;opacity:0;transition:.16s}
.dapp-file-row:hover .dapp-row-act{opacity:1}
.dapp-mini-btn{
  width:30px;height:30px;border-radius:9px;border:1px solid var(--line);background:#fff;
  color:var(--ink-2);display:grid;place-items:center;font-size:12px;cursor:pointer;transition:.16s;
}
.dapp-mini-btn:hover{background:#14161c;border-color:#14161c;color:#fff}

/* ============ 11. 上传任务 / 分布 / 动态 ============ */
.dapp-task{display:flex;flex-direction:column;gap:14px}
.dapp-task-item .t-top{display:flex;align-items:center;gap:10px;margin-bottom:7px}
.dapp-task-item .t-ico{width:32px;height:32px;border-radius:10px;display:grid;place-items:center;font-size:13px;flex:0 0 auto}
.dapp-task-item .t-name{font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}
.dapp-task-item .t-pct{font-size:11.5px;color:var(--ink-2);font-family:var(--font-num);flex:0 0 auto}
.dapp-tbar{height:7px;border-radius:99px;background:#f0f1f6;overflow:hidden}
.dapp-tbar>i{display:block;height:100%;border-radius:99px;transition:width .5s ease}

.dapp-stack{display:flex;height:12px;border-radius:99px;overflow:hidden;background:#f0f1f6;margin:4px 0 16px}
.dapp-legend{display:flex;flex-direction:column;gap:11px}
.dapp-legend-row{display:flex;align-items:center;gap:9px;font-size:12.5px}
.dapp-legend-row .sq{width:9px;height:9px;border-radius:3px;flex:0 0 auto}
.dapp-legend-row .lg-name{flex:1;color:var(--ink-2)}
.dapp-legend-row .lg-val{font-family:var(--font-num);font-weight:650;color:var(--ink-1)}

.dapp-feed{display:flex;flex-direction:column;gap:2px}
.dapp-feed-item{display:flex;gap:11px;padding:9px 0;align-items:flex-start}
.dapp-feed-dot{width:30px;height:30px;border-radius:10px;display:grid;place-items:center;font-size:12px;flex:0 0 auto}
.dapp-feed-txt{font-size:12.5px;color:var(--ink-2);line-height:1.45}
.dapp-feed-txt b{color:var(--ink-1);font-weight:650}
.dapp-feed-txt em{font-style:normal;color:var(--ink-3);font-size:11.5px;margin-left:6px;font-family:var(--font-num)}

/* ============ 12. 网格 ============ */
.dapp-g-main{display:grid;grid-template-columns:minmax(0,1.62fr) minmax(300px,1fr);gap:16px;align-items:start}
.dapp-g-3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;margin-top:16px}
.dapp-g-2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;margin-top:16px}
.dapp-col{display:flex;flex-direction:column;gap:16px}
.dapp-foot-note{text-align:center;color:var(--ink-3);font-size:12px;padding:26px 0 6px}

/* ============ 12.5 后台页面容器 + 旧容器映射 ============
   工作台之外的历史页面（文件/用户/设置）仍使用 mc-* 旧容器与 BS3 表单结构。
   这里统一把它们映射到 DApp 卡片观感，避免逐个页面重写 HTML。 */
.dapp-page{width:100%}
.dapp-main>.dapp-page{padding-top:2px}

/* container：外壳已经给了左右内边距，这里清零，避免双重缩进 */
.dapp-page>.container,
.dapp-page>.container-fluid,
.dapp-page .container{margin:0;padding-left:0;padding-right:0;max-width:100%}

/* mc-* 旧卡片 -> DApp 白卡 */
.dapp-page .mc-card,
.dapp-page .mc-table-card{
  background:#fff;border:1px solid var(--line);border-radius:var(--r-lg);
  box-shadow:none;padding:16px;margin-bottom:14px;
}
/* mc-toolbar-card 的包裹层已被移除（搜索表单会被 bootstrap-table 搬进表格卡），
   样式由下方 .fixed-table-toolbar 接管 */
.dapp-page .mc-card:last-child,
.dapp-page .mc-table-card:last-child{margin-bottom:0}

/* 设置页：.panel 内直接跟表单，补内边距 */
.dapp-page .panel{margin-bottom:14px}
.dapp-page .panel:last-child{margin-bottom:0}
.dapp-page .panel>form,
.dapp-page .panel>.form-horizontal,
.dapp-page .panel>.list-group{padding:16px}
.dapp-page .panel>.table{margin-bottom:0}

/* form-horizontal：BS5 已移除该布局，这里补回「标签右对齐 + 控件左对齐」 */
.dapp-page .form-horizontal>.mb-3,
.dapp-page .form-horizontal>.form-group{
  display:flex;flex-wrap:wrap;align-items:flex-start;margin-bottom:15px;
}
.dapp-page .form-horizontal>.mb-3>label,
.dapp-page .form-horizontal>.form-group>label{
  flex:0 0 auto;width:152px;padding:7px 14px 0 0;margin-bottom:0;
  text-align:right;font-size:13px;font-weight:600;color:var(--ink-1);line-height:1.6;
}
.dapp-page .form-horizontal>.mb-3>div,
.dapp-page .form-horizontal>.form-group>div{flex:1 1 260px;min-width:0;max-width:660px}
/* 表单内「保存设置」按钮的尺寸与水平对齐：
   BS5 button 自带 4px 垂直内边距，与输入框 8px 略有差异，
   这里把按钮与上方输入框 flush 起来，并缩窄为自适应宽度。 */
.dapp-page .form-horizontal>.mb-3>div .btn,
.dapp-page .form-horizontal>.form-group>div .btn{padding:.42rem 1.15rem;font-size:13.5px;font-weight:600;line-height:1.4}
.dapp-page .form-horizontal>.mb-3>div .btn+.btn{margin-left:8px}
.dapp-page .form-horizontal .help-block,
.dapp-page .form-horizontal font[color="green"]{
  display:block;font-size:11.5px;color:var(--ink-3);margin-top:6px;line-height:1.6;
}
.dapp-page .form-horizontal input[type="checkbox"],
.dapp-page .form-horizontal input[type="radio"]{width:15px;height:15px;accent-color:var(--brand)}

/* 工具栏（form-inline 在 BS5 已移除） */
.dapp-page #searchToolbar,
.dapp-page .form-inline{
  display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end;
}
/* 搜索/重置/批量操作 合为一组，整体换行、内部不拆 */
.dapp-page .dapp-tb-actions{display:flex;gap:8px;align-items:center;white-space:nowrap;flex:0 0 auto}
/* BS5 的 .dropdown-toggle 自带 ::after 箭头；bootstrap-table 还会向列筛选/分页按钮注入 <span class="caret">，
   两者叠加会渲染出双箭头 → 一律隐藏 span，箭头统一由 BS5 ::after 提供 */
.dapp-page .caret{display:none}
.dapp-page .dropdown-toggle::after{margin-left:6px;vertical-align:.18em}
/* 后台链接统一去下划线（BS5.3 默认 a 带 underline）+ 挂 body 下的下拉菜单项 */
.dapp-page a{text-decoration:none}
.dapp-page a:hover{text-decoration:none}
.dropdown-menu a{text-decoration:none}
/* 注意：本项目 bootstrap 为定制版，.mb-3{margin-bottom:1rem!important} 带 important，
   这里的清除必须同样加 important 才能生效（曾因此让搜索卡片内部凭空多 16px 空白） */
.dapp-page #searchToolbar>.mb-3,
.dapp-page .form-inline>.mb-3{margin-bottom:0!important}
.dapp-page #searchToolbar>label,
.dapp-page .form-inline>label{font-size:12px;color:var(--ink-2);margin-right:6px;align-self:center}

/* 表格内的超小按钮：BS5 移除了 .btn-xs */
.dapp-page .btn-xs{padding:.2rem .55rem;font-size:11.5px;border-radius:8px;line-height:1.5}
.dapp-page .table .btn-xs{padding:.15rem .5rem}

/* 模态框 */
.dapp-page .modal-content{border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:0 30px 70px rgba(20,22,28,.22)}
.dapp-page .modal-header{border-bottom:1px solid var(--line);padding:15px 18px}
.dapp-page .modal-title{font-size:15px;font-weight:700}
.dapp-page .modal-body{padding:18px}
.dapp-page .modal-footer{border-top:1px solid var(--line);padding:13px 18px}
.dapp-page .modal-header .close{
  background:none;border:0;font-size:22px;line-height:1;color:var(--ink-3);
  padding:0;margin-left:auto;cursor:pointer;
}
.dapp-page .modal-header .close:hover{color:var(--ink-1)}

/* 设置页子导航 */
.dapp-subnav{
  display:flex;gap:6px;flex-wrap:wrap;background:var(--shell,#fff);border:1px solid var(--line);
  border-radius:var(--r-md);padding:6px;margin-bottom:14px;
}
.dapp-subnav a{
  padding:8px 14px;border-radius:11px;font-size:13px;font-weight:550;
  color:var(--ink-2);text-decoration:none;transition:.16s;display:inline-flex;align-items:center;gap:7px;
}
.dapp-subnav a:hover{background:var(--bg-soft,#f4f5f9);color:var(--ink-1)}
.dapp-subnav a.on{background:var(--ink-1,#14161c);color:var(--shell,#fff);font-weight:600}
.dapp-subnav a i{font-size:12.5px}

/* 子导航角标（订单待支付 / 举报待处理等未处理计数） */
.dapp-subnav-badge{
  display:inline-block; min-width:16px; height:16px; padding:0 5px; margin-left:2px;
  border-radius:8px; background:var(--coral); color:#fff;
  font-size:10px; font-weight:700; line-height:16px; text-align:center;
}
.dapp-subnav a.on .dapp-subnav-badge{background:rgba(255,255,255,.30)}

/* ============ 13. 其它后台页在白外壳内的适配 ============ */
/* 页面标题（文件管理 / 用户管理 / 设置 等复用） */
.dapp-page-head{margin:4px 0 16px}
.dapp-page-head h1{margin:0;font-size:20px;font-weight:700;letter-spacing:-.3px}
.dapp-page-head p{margin:3px 0 0;font-size:12.5px;color:var(--ink-2)}

/* 旧容器 mc-admin-main / container：去掉顶部偏移与多余左右padding */
.dapp-main .mc-admin-main{padding-top:0;padding-bottom:0}
.dapp-main>.container,
.dapp-main>.container-fluid{padding-left:0;padding-right:0;max-width:100%}

/* 面板/卡片统一圆角（覆盖 macos.css 的 6~12px） */
.dapp-main .card{border:1px solid var(--line);border-radius:var(--r-md);box-shadow:none}
.dapp-main .card-header{
  background:#fff;border-bottom:1px solid var(--line);
  border-radius:var(--r-md) var(--r-md) 0 0!important;font-weight:650;padding:13px 16px;
}
.dapp-main .card-body{padding:16px}

/* set.php / set_stor.php 的卡片是 .card-header + .card-body 兄弟结构（无 .card 包裹），
   必须分别补齐白卡外观，否则只有头部有样式、主体是裸的 */
.dapp-page .card-header{
  background:#fff;border:1px solid var(--line);border-bottom:none;
  border-radius:var(--r-md) var(--r-md) 0 0!important;
  font-weight:650;padding:13px 16px;margin-bottom:0;
}
.dapp-page .card-body{
  background:#fff;border:1px solid var(--line);border-top:none;
  border-radius:0 0 var(--r-md) var(--r-md);padding:16px;
}
/* header + body + footer 三段结构（set_stor.php 存储卡 / set.php 信息卡）：
   body 让出下圆角，footer 接管 */
.dapp-page .card-body:has(+.card-footer){border-radius:0;border-bottom:none}
.dapp-page .card-footer{
  background:#fafbfd;border:1px solid var(--line);border-top:none;
  border-radius:0 0 var(--r-md) var(--r-md);padding:13px 16px;margin-bottom:14px;
  font-size:12.5px;color:var(--ink-2);line-height:1.7;
}
.dapp-page .panel>.card-footer:last-child{margin-bottom:0}
/* 折叠面板（set_stor.php 存储配置）：header 自成卡头，展开区补下边框与圆角 */
.dapp-page .card-header+.collapse>.card-body,
.dapp-page .card-header+.collapsing>.card-body{
  border-radius:0 0 var(--r-md) var(--r-md);margin-bottom:14px;
}
.dapp-page .panel>.card-header:has(+.collapse:not(.show)){border-radius:var(--r-md)!important}
.dapp-page .card-title{font-size:14.5px;font-weight:700;margin:0;line-height:1.4;display:flex;align-items:center;flex-wrap:wrap;gap:2px 6px}
.dapp-page .card-title a{color:var(--ink);text-decoration:none;display:flex;align-items:center;gap:8px}
.dapp-page .card-title a:hover{color:var(--brand)}
/* 折叠箭头只挂在 collapse 触发链接上，避免误伤 header 内的普通按钮（如「开通地址」） */
.dapp-page .card-title a[data-bs-toggle]::after{
  content:"\f078";font-family:"Font Awesome 6 Free";font-weight:900;
  font-size:11px;margin-left:auto;color:var(--ink-3);transition:transform .18s;
}
.dapp-page .card-title a[data-bs-toggle].collapsed::after{transform:rotate(-90deg)}
/* header 内右侧小按钮（开通地址等）：去箭头、保持小尺寸并与标题垂直居中 */
.dapp-page .card-title .btn{margin-left:10px;flex:0 0 auto}
.dapp-page .card-title .float-end{margin-left:auto;flex:0 0 auto}

/* 嵌套在表单里的栅格行（set_stor.php 的协议+域名拼接等）：
   BS5 gutter 负边距会把行撑出卡片边界造成错位，这里收紧 gutter 并给缝隙 */
.dapp-page .form-horizontal .row{
  --bs-gutter-x:12px;--bs-gutter-y:8px;
  margin-left:0;margin-right:0;row-gap:8px;align-items:center;
}
/* 保存按钮行（offset-sm-3 col-sm-9）：flex 布局下 offset 类失效，补回标签列缩进 */
.dapp-page .form-horizontal>.mb-3>div[class*="offset-"]{margin-left:152px}
/* 非直接子级的 label（#cloud_stor 内嵌套 mb-3）也对齐到与直接子级一致的样式
   仅桌面生效（与移动端断点保持一致）：标签统一左对齐 */
@media (min-width:768px){
  .dapp-page .form-horizontal .mb-3>label.col-sm-3{
    text-align:left;padding-top:7px;font-size:13px;font-weight:600;color:var(--ink-1);
  }
}
@media (max-width:767.98px){
  .dapp-page .form-horizontal>.mb-3>div[class*="offset-"]{margin-left:0}
}

/* ============ layer 弹窗皮肤（全局） ============
   layer 的 DOM 直接挂在 body 下，不在 .dapp-page 内，因此这里不带作用域前缀。
   后台、前台共用，统一为 DApp 圆角白卡风。 */
.layui-layer{
  border-radius:18px!important;overflow:hidden;
  border:1px solid #ececf2!important;
  box-shadow:0 30px 70px rgba(20,22,28,.22)!important;
}
.layui-layer-title{
  background:#fff!important;color:#14161c!important;
  height:50px!important;line-height:50px!important;
  padding:0 18px!important;font-size:14.5px!important;font-weight:650;
  border-bottom:1px solid #ececf2!important;letter-spacing:-.2px;
}
.layui-layer-setwin{top:14px!important;right:14px!important}
.layui-layer-setwin .layui-layer-close1,
.layui-layer-setwin .layui-layer-close{
  background-image:none!important;width:22px!important;height:22px!important;
  border-radius:8px;position:relative;cursor:pointer;
}
.layui-layer-setwin .layui-layer-close1::after,
.layui-layer-setwin .layui-layer-close::after{
  content:"\2715";position:absolute;inset:0;display:grid;place-items:center;
  font-size:12px;color:#9aa0ad;
}
.layui-layer-setwin .layui-layer-close1:hover::after,
.layui-layer-setwin .layui-layer-close:hover::after{color:#14161c;background:#f4f5f9;border-radius:8px}
.layui-layer-setwin .layui-layer-max{background-image:none!important;position:relative}
.layui-layer-setwin .layui-layer-max::before{
  content:"\26F6";position:absolute;inset:0;display:grid;place-items:center;
  font-size:12px;color:#9aa0ad;font-family:sans-serif;
}
.layui-layer-setwin .layui-layer-min{background-image:none!important;position:relative}
.layui-layer-setwin .layui-layer-min::before{
  content:"\2500";position:absolute;inset:0;display:grid;place-items:center;
  font-size:12px;color:#9aa0ad;
}
.layui-layer-setwin .layui-layer-max:hover::before,
.layui-layer-setwin .layui-layer-min:hover::before{color:#14161c}
.layui-layer-btn{
  padding:12px 18px!important;border-top:1px solid #ececf2;background:#fafbfd;
}
.layui-layer-btn a{
  border-radius:10px!important;font-weight:600;font-size:13px!important;
  height:auto!important;line-height:1.5!important;padding:8px 18px!important;
  border:1px solid #ececf2!important;background:#fff!important;color:#5e6470!important;
}
.layui-layer-btn .layui-layer-btn0{
  background:#5b5bd6!important;border-color:#5b5bd6!important;color:#fff!important;
}
.layui-layer-btn .layui-layer-btn0:hover{background:#4c4cc4!important}
.layui-layer-content{color:#3c4250;font-size:13.5px}
/* iframe 内容区（type:2）不要多余 padding */
.layui-layer-iframe .layui-layer-content{overflow:hidden}
/* layer 提示条（msg） */
.layui-layer-msg{border-radius:12px!important;border:none!important;box-shadow:0 12px 34px rgba(20,22,28,.18)!important}
/* BS3 遗留：.hide 在 BS5 已移除，旧页面大量用它做条件显隐 */
.hide{display:none!important}
.dapp-main .btn{border-radius:11px;font-size:13.5px}
.dapp-main .btn-sm{border-radius:9px}
.dapp-main .form-control,.dapp-main .form-select{
  border-color:var(--line-2);border-radius:11px;font-size:13.5px;padding:.5rem .75rem;
  background-color:#fff;
}
/* 强制覆盖 BS5 默认蓝框：用更具体的选择器 + !important 兜底，
   防止浏览器原生 focus outline 与 BS5 的 :focus 蓝色 box-shadow 同时出现 */
.dapp-main .form-control:focus,.dapp-main .form-select:focus,
.dapp-main .form-control:focus-visible,.dapp-main .form-select:focus-visible{
  border-color:var(--brand)!important;
  box-shadow:0 0 0 4px rgba(91,91,214,.12)!important;
  outline:0!important;
}
.dapp-main .input-group-text{border-color:var(--line-2);background:#fafbfd;font-size:13px}

/* select 自定义箭头（替换浏览器原生 appearance），
   options 的蓝底高亮需靠 appearance:none 关掉 native UI */
.dapp-main .form-select,
.dapp-main select.form-control{
  -webkit-appearance:none;-moz-appearance:none;appearance:none;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'><path fill='%23141620' d='M1.5 2.2a.75.75 0 0 1 1.06 0L6 5.63l3.44-3.44a.75.75 0 1 1 1.06 1.06L6.53 6.2a1.5 1.5 0 0 1-2.12 0L1.5 3.27a.75.75 0 0 1 0-1.06Z'/></svg>");
  background-repeat:no-repeat;background-position:right .9rem center;background-size:11px 7px;
  padding-right:2.1rem;
}
.dapp-main .form-select::-ms-expand{display:none}
/* select 展开后的选项列表：原生弹层无法完全定制，先做基础配色兜底（旧引擎生效） */
.dapp-main select option{background:#fff;color:#2a2f3a}
.dapp-main select option:checked{background:var(--brand-soft);color:var(--brand)}
/* Chromium 135+ 可定制 select：select 与 ::picker(select) 必须同时 opt-in base-select，
   否则弹层仍按原生渲染；不支持的引擎走上面的兜底，@supports 保证不破坏原生 UI */
@supports selector(::picker(select)){
  .dapp-main select.form-control:not([multiple]):not([size]),
  .dapp-main .form-select:not([multiple]):not([size]),
  .dapp-main select.form-control:not([multiple]):not([size])::picker(select),
  .dapp-main .form-select:not([multiple]):not([size])::picker(select){
    appearance:base-select;
  }
  /* base-select 把 select 渲染为 inline-flex，这里拉回块级满宽，避免布局塌缩 */
  .dapp-main select.form-control:not([multiple]):not([size]),
  .dapp-main .form-select:not([multiple]):not([size]){
    display:inline-flex;width:100%;align-items:center;
  }
  .dapp-main select.form-control::picker-icon,
  .dapp-main .form-select::picker-icon{display:none}
  .dapp-main select.form-control::picker(select),
  .dapp-main .form-select::picker(select){
    background:#fff;border:1px solid var(--line-2);border-radius:12px;
    padding:6px;margin-top:6px;box-shadow:0 12px 34px rgba(20,22,28,.14);
  }
  .dapp-main select option{
    padding:8px 12px;border-radius:8px;font-size:13.5px;color:var(--ink-1);
    transition:background .12s;
  }
  .dapp-main select option:hover,
  .dapp-main select option:focus{background:#f4f5f9;color:var(--ink-1)}
  .dapp-main select option:checked{background:var(--brand-soft);color:var(--brand);font-weight:600}
  /* 选中态勾选图标：Chromium 各版本伪元素命名不同（::check-icon / ::checkmark），
     必须拆成两条独立规则——合并的选择器列表里有一个无效名会整条失效 */
  .dapp-main select option::check-icon{display:none!important}
  .dapp-main select option::checkmark{display:none!important}
}
.dapp-main .alert{border-radius:var(--r-sm);border-width:1px;font-size:13px}

/* bootstrap-table：贴合白外壳 */
.dapp-main .bootstrap-table .fixed-table-container{border-radius:var(--r-md);border-color:var(--line);overflow:hidden}
/* 工具栏：搜索表单占满左侧，右侧 列筛选/卡片视图/全屏 按钮组与筛选行底对齐 */
.dapp-main .bootstrap-table .fixed-table-toolbar{
  display:flex;flex-wrap:wrap;align-items:flex-start;gap:12px;padding:0 0 16px;
}
/* bootstrap-table 1.21.4 的 initToolbar 会把 toolbar 元素 append 进 .bs-bars 内部
   （sprintf('<div class="bs-bars %s-%s">', pull, align).appendTo($toolbar).append(toolbar)），
   form/#searchToolbar 不是 .fixed-table-toolbar 的直接子元素（历史教训：写在
   >.form-inline/>#searchToolbar 上的样式永远落空）。
   工具栏整体处于表格大卡（.mc-table-card）内部 → 这里不再自带白卡片，
   避免卡片套卡片的双层框，直接裸放融入外层卡；bootstrap-table.css 给
   .bs-bars/.columns 的 10px 上下 margin 一并清零 */
.dapp-main .bootstrap-table .fixed-table-toolbar>.bs-bars{
  flex:1 1 0;min-width:0;margin:0;
}
/* 右侧按钮组：贴工具栏底线（align-self:flex-end 底边 = .bs-bars 底边 = 筛选控件行底），
   两侧按钮等高 → 顶部自然对齐；不依赖行高/label 有无，筛选行换行后依然成立。
   无自定义 toolbar 的页面（安全日志）没有 .bs-bars，~ 条件保持按钮原位不悬空 */
.dapp-main .bootstrap-table .fixed-table-toolbar>.columns{flex:0 0 auto;margin:0;margin-left:auto}
.dapp-main .bootstrap-table .fixed-table-toolbar>.bs-bars~.columns{align-self:flex-end}
.dapp-main .bootstrap-table .fixed-table-toolbar .search input,
.dapp-main .bootstrap-table .fixed-table-toolbar .columns button{
  border-radius:11px;border-color:var(--line-2);font-size:13px;
}
/* 右侧按钮默认是 BS btn-secondary（灰底白字），浅色主题里太重且压过白卡片 → 统一白底描边次要钮 */
.dapp-main .bootstrap-table .fixed-table-toolbar .columns button{
  background-color:#fff;color:var(--ink-2);
}
.dapp-main .bootstrap-table .fixed-table-toolbar .columns button:hover,
.dapp-main .bootstrap-table .fixed-table-toolbar .columns button:focus{
  background-color:#f4f5f9;color:var(--ink-1);border-color:var(--line-2);
}
/* 右侧按钮组：.columns 容器自带 BS5 btn-group（拼连接、首尾圆角归零），
   与上面的统一圆角打架造成圆角忽有忽无 → 解除拼接，改成等距独立圆角钮 */
.dapp-main .bootstrap-table .fixed-table-toolbar .columns>.btn,
.dapp-main .bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn{
  margin-left:0;border-radius:11px !important;
}
.dapp-main .bootstrap-table .fixed-table-toolbar .columns,
.dapp-main .bootstrap-table .fixed-table-toolbar .columns .btn-group{gap:6px}
/* 图标与文字/箭头间距统一 */
.dapp-main .bootstrap-table .fixed-table-toolbar .columns .btn>i{margin-right:0;margin-left:0}
.dapp-main .bootstrap-table .fixed-table-toolbar .columns .dropdown-toggle::after{margin-left:6px}
/* 表格内表头与首尾行圆角与外壳对齐 */
.dapp-main .bootstrap-table .table{border-radius:0;margin-bottom:0;overflow:hidden}
.dapp-main .bootstrap-table .table thead th:first-child{border-top-left-radius:var(--r-md)}
.dapp-main .bootstrap-table .table thead th:last-child{border-top-right-radius:var(--r-md)}
.dapp-main .bootstrap-table .table tbody tr:last-child>td:first-child{border-bottom-left-radius:var(--r-md)}
.dapp-main .bootstrap-table .table tbody tr:last-child>td:last-child{border-bottom-right-radius:var(--r-md)}
/* 表头：与仪表盘 dapp-tbl-head 同款（无底色、浅灰小字、仅一条下边线） */
.dapp-main .table thead th{
  background:transparent;color:var(--ink-3);font-size:11.5px;font-weight:550;
  letter-spacing:.3px;border-bottom:1px solid var(--line);white-space:nowrap;
  padding:10px 14px;
}
/* bootstrap-table 的表头由 .th-inner 控制内边距，th 本身清零避免双重 */
.dapp-main .bootstrap-table .table thead th{padding:0}
.dapp-main .bootstrap-table .th-inner{
  padding:10px 14px;font-size:11.5px;font-weight:550;color:var(--ink-3);
  letter-spacing:.3px;line-height:1.4;
}
/* 行：无分隔线、舒展内边距，悬浮出现圆角浅灰底（同 dapp-file-row） */
.dapp-main .table>tbody>tr>*{
  vertical-align:middle;font-size:13.5px;border-bottom:0;padding:11px 14px;
}
.dapp-main .table>tbody>tr:hover>*{background:#f7f8fb}
.dapp-main .table>tbody>tr:hover>td:first-child{border-radius:var(--r-sm) 0 0 var(--r-sm)}
.dapp-main .table>tbody>tr:hover>td:last-child{border-radius:0 var(--r-sm) var(--r-sm) 0}
/* 文档类 bordered 网格表（set.php API 文档）：保留完整网格，不走管理列表皮肤 */
.dapp-main .table.table-bordered>thead>tr>th{
  background:#fafbfd;color:var(--ink-2);font-size:12px;font-weight:650;letter-spacing:.2px;
  border:1px solid var(--line-2);padding:.5rem .75rem;
}
.dapp-main .table.table-bordered>tbody>tr>*{
  border:1px solid var(--line-2);padding:.5rem .75rem;
}
.dapp-main .table.table-bordered>tbody>tr:hover>td:first-child,
.dapp-main .table.table-bordered>tbody>tr:hover>td:last-child{border-radius:0}
.dapp-main .pagination .page-link{border-radius:9px;margin:0 2px;font-size:13px;border-color:var(--line)}
.dapp-main .pagination .active .page-link{background:var(--brand);border-color:var(--brand)}
.dapp-main .mc-table-card>.bootstrap-table{margin-bottom:0}

/* ============ 12.8 管理列表（对齐仪表盘「最近文件」） ============
   复用 10 节的 dapp-f-ico / dapp-f-name / dapp-f-meta / dapp-bar-mini / dapp-mini-btn，
   这里只补 bootstrap-table 与手写表格里用到的容器与变体。 */
.dapp-f-cell{display:flex;align-items:center;gap:12px;min-width:0;max-width:420px}
.dapp-f-txt{min-width:0;flex:1}
.dapp-f-cell .dapp-f-name{display:block;max-width:100%}
.dapp-f-cell .dapp-f-name>a{color:var(--ink-1);text-decoration:none}
.dapp-f-cell .dapp-f-name>a:hover{color:var(--brand)}
.dapp-f-prev{font-size:11px;color:var(--brand);text-decoration:none;margin-left:8px;white-space:nowrap}
.dapp-f-prev:hover{text-decoration:underline;color:var(--brand)}
.dapp-f-meta a{color:inherit;text-decoration:none}
.dapp-f-meta a:hover{color:var(--brand)}
.dapp-avatar-sm{width:40px;height:40px;border-radius:13px;object-fit:cover;flex:0 0 auto;background:#f0f1f6}
.dapp-mono{font-family:var(--font-num);font-size:12.5px;color:var(--ink-2)}
a.dapp-mono{text-decoration:none}
a.dapp-mono:hover{color:var(--brand)}
.dapp-dl{display:flex;align-items:center;gap:10px}
.dapp-dl-num{font-size:12.5px;font-weight:650;font-family:var(--font-num);color:var(--ink-2);min-width:28px}
/* 操作按钮常驻显示（管理列表需要可见性；仪表盘 .dapp-row-act 仍为悬浮显现，互不影响） */
.dapp-act-row{display:flex;gap:6px;align-items:center;justify-content:flex-end}
.dapp-pill{
  display:inline-flex;align-items:center;border-radius:99px;padding:3px 10px;
  font-size:11.5px;font-weight:600;line-height:1.5;text-decoration:none;white-space:nowrap;
}
a.dapp-pill:hover{filter:brightness(.96)}

/* ============ 13.5 BS3 兼容垫片 ============
   迁移到 Bootstrap 5 后，以下 BS3 类名已被官方移除。
   它们不会报错，只会「静默失效」（布局悄悄错位），所以在这里补回等价实现，
   免得把每个历史页面都翻一遍。新写的页面请直接用 BS5 类名。 */
.dapp-main .center-block{margin-left:auto;margin-right:auto;float:none}
.dapp-main .text-right{text-align:right!important}
.dapp-main .text-left{text-align:left!important}
.dapp-main .btn-block{display:block;width:100%}
.dapp-main .control-label{padding-top:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}
.dapp-main .input-group>.input-group-btn{display:flex;flex-wrap:wrap}
.dapp-main .input-group-btn>.btn{border-radius:0 var(--r-xs) var(--r-xs) 0}
.dapp-main .input-group-btn:first-child>.btn{border-radius:var(--r-xs) 0 0 var(--r-xs)}
.dapp-main .well{background:#fafbfd;border:1px solid var(--line);border-radius:var(--r-md);padding:16px}
.dapp-main .panel{background:#fff;border:1px solid var(--line);border-radius:var(--r-md)}
.dapp-main .panel-heading{padding:12px 16px;border-bottom:1px solid var(--line);font-weight:650;border-radius:var(--r-md) var(--r-md) 0 0}
.dapp-main .panel-body{padding:16px}
.dapp-main .panel-footer{padding:12px 16px;border-top:1px solid var(--line);background:#fafbfd;border-radius:0 0 var(--r-md) var(--r-md)}
.sr-only{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0,0,0,0);white-space:nowrap;border:0;
}
@media (max-width:575.98px){
  .hidden-xs{display:none!important}
}

/* ============ 14. 响应式 ============ */
@media (max-width:1199.98px){
  .dapp-g-main{grid-template-columns:1fr}
  .dapp-tbl-head,.dapp-file-row{grid-template-columns:1fr 108px 118px 80px}
  .dapp-tbl-head span:nth-child(5),.dapp-file-row .dapp-row-act{display:none}
}
@media (max-width:991.98px){
  .dapp-app{height:auto;flex-direction:column;padding:12px 12px 96px}
  .dapp-rail{
    position:fixed;left:10px;right:10px;bottom:10px;width:auto;flex:none;height:64px;
    flex-direction:row;justify-content:space-around;border-radius:20px;padding:0 8px;z-index:1050;
    box-shadow:0 10px 30px rgba(20,22,28,.14);
  }
  .dapp-logo{display:none}
  /* 底部导航：foot 里的安全管理（带待复核徽标）/前台首页/退出登录在窄屏同样需要入口，
     此前整块 display:none 会导致手机上无法退出登录、看不到待复核提醒 */
  .dapp-rail-foot{
    display:flex;flex-direction:row;align-items:center;gap:0;
    margin-top:0;padding-top:0;border-top:0;
  }
  .dapp-rail-btn.active::before{display:none}
  .dapp-rail-btn[data-tip]:hover::after{display:none}
  /* 8 个入口平分底栏宽度，避免 390px 级别屏幕横向溢出 */
  .dapp-rail-btn{width:auto;flex:1 1 0;min-width:0}
  .dapp-shell{border-radius:22px}
  .dapp-topbar{padding:18px 20px 14px}
  .dapp-main{padding:0 20px 26px}
  .dapp-search{width:100%;order:9;margin-left:0}
}
@media (max-width:767.98px){
  .dapp-g-3,.dapp-g-2{grid-template-columns:1fr 1fr}
  .dapp-hero{flex-direction:column;align-items:flex-start}
  .dapp-ring{margin-left:0;align-self:flex-start}
  /* 后台表单：标签改为上下堆叠，避免窄屏挤压 */
  .dapp-page .form-horizontal>.mb-3>label,
  .dapp-page .form-horizontal>.form-group>label,
  .dapp-page .form-horizontal .mb-3>label.col-sm-3,
  .dapp-page .form-horizontal .form-group>label.col-sm-3{
    width:100%;text-align:left;padding:0 0 6px;
    font-size:13px;font-weight:600;color:var(--ink-1);
  }
  .dapp-page .form-horizontal>.mb-3>div,
  .dapp-page .form-horizontal>.form-group>div{max-width:100%}
  /* 设置子导航：横向滚动 */
  .dapp-subnav{flex-wrap:nowrap;overflow-x:auto;padding:5px}
  .dapp-subnav a{white-space:nowrap}
  .dapp-tbl-head{display:none}
  .dapp-file-row{
    grid-template-columns:1fr 84px;gap:8px;padding:12px 10px;
    border:1px solid var(--line);margin-bottom:8px;
  }
  .dapp-file-row>span:nth-child(3),.dapp-file-row>span:nth-child(4){display:none}
  .dapp-row-act{opacity:1}
}
@media (max-width:575.98px){
  .dapp-g-3,.dapp-g-2{grid-template-columns:1fr}
  .dapp-hero .h-num{font-size:31px}
  .dapp-greet h1{font-size:19px}
  .dapp-card{padding:15px}
}
/* ============ 14. 安全管理页组件（admin/security.php） ============ */
/* 说明：复用 dapp-card / dapp-tile / dapp-kpi 体系，与检测记录页保持一致；
   仅补充本页特有的表单行、通道选择卡、阈值分数带、环境状态与底部保存条。
   约束：配置保存走 ajax.php?act=set（无白名单，整个 form 会被序列化写入配置表），
        因此非配置类控件（搜索、筛选、统计）必须置于 form 之外。 */

/* --- 14.1 顶部安全总览 --- */
.sec-overview{display:grid;grid-template-columns:repeat(auto-fit,minmax(195px,1fr));gap:12px;margin-bottom:14px}
.sec-ov{
  background:#fff;border:1px solid var(--line);border-radius:var(--r-lg);
  padding:14px 15px;display:flex;align-items:center;gap:12px;min-width:0;
}
.sec-ov-body{min-width:0;flex:1}
.sec-ov-label{font-size:12.5px;color:var(--ink-2);margin:0 0 3px}
.sec-ov-num{
  font-size:22px;font-weight:750;letter-spacing:-.6px;line-height:1.15;
  font-family:var(--font-num);color:var(--ink-1);
}
.sec-ov-sub{font-size:11.5px;color:var(--ink-3);margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* --- 14.2 分区标题 --- */
.sec-group{display:flex;align-items:center;gap:9px;margin:22px 0 12px}
.sec-group::before{
  content:'';width:3px;height:15px;border-radius:2px;flex:0 0 auto;
  background:linear-gradient(180deg,var(--brand),var(--brand-2));
}
.sec-group .t{font-size:14px;font-weight:700;color:var(--ink-1);letter-spacing:-.2px}
.sec-group .s{font-size:12px;color:var(--ink-3);font-weight:400}
.sec-group .line{flex:1;height:1px;background:var(--line);margin-left:2px}

/* --- 14.3 表单行与提示文字 --- */
.dapp-page .form-horizontal>.mb-3{padding:11px 0;border-bottom:1px dashed var(--line)}
.dapp-page .form-horizontal>.mb-3:last-child{border-bottom:0}
.dapp-page .form-horizontal .control-label{color:var(--ink-1);font-size:13px}
.sec-tip{
  display:flex;gap:6px;align-items:flex-start;
  margin-top:7px;font-size:12px;line-height:1.7;color:var(--ink-2);
}
.sec-tip>i{flex:0 0 auto;margin-top:4px;font-size:11px;color:var(--ink-3)}
.sec-tip code{
  font-family:var(--font-num);font-size:11.5px;background:#f4f5f9;
  border:1px solid var(--line);border-radius:5px;padding:1px 5px;color:var(--ink-1);
}
.sec-tip.warn{color:#b7791f}
.sec-tip.warn>i{color:var(--amber)}

/* --- 14.3b 安全模块卡头：图标 + 主标题 + 副标题说明 --- */
.sec-page .card-header{display:flex;align-items:center;gap:10px}
.sec-page .card-header .card-title{display:flex;align-items:center;gap:9px;margin:0}
.sec-page .card-header .card-title>i{
  width:30px;height:30px;border-radius:9px;flex:0 0 auto;
  display:inline-flex;align-items:center;justify-content:center;font-size:13px;
  background:var(--brand-soft);color:var(--brand);
}
.sec-page .card-header .card-sub{
  margin-left:auto;font-size:12px;color:var(--ink-3);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
@media (max-width:600px){.sec-page .card-header .card-sub{display:none}}

/* --- 14.4 检测通道选择卡 --- */
.sec-channels{display:grid;grid-template-columns:repeat(auto-fit,minmax(168px,1fr));gap:10px}
.sec-channel{
  position:relative;display:block;margin:0;padding:13px 14px 13px 40px;
  border:1.5px solid var(--line-2);border-radius:var(--r-sm);
  background:#fff;cursor:pointer;transition:.16s;
}
.sec-channel input{position:absolute;left:14px;top:16px;margin:0}
.sec-channel:hover{border-color:#c9cdda;background:#fafbfd}
.sec-channel.on{border-color:var(--brand);background:var(--brand-soft)}
.sec-channel .ct{display:flex;align-items:center;gap:6px;font-size:13.5px;font-weight:650;color:var(--ink-1)}
.sec-channel .cs{font-size:11.5px;color:var(--ink-3);margin-top:4px;line-height:1.55}
.sec-channel .rec{
  display:inline-block;margin-left:auto;font-size:10.5px;font-weight:700;letter-spacing:.2px;
  color:var(--brand);background:#fff;border:1px solid var(--brand);border-radius:20px;padding:1px 6px;
}
.sec-channel-rec{
  display:flex;align-items:center;gap:6px;margin-top:9px;font-size:12px;color:var(--brand);font-weight:600;
}

/* --- 14.5 阈值分数带 --- */
.sec-band{
  position:relative;height:12px;border-radius:20px;overflow:hidden;
  background:var(--mint);margin:10px 0 6px;border:1px solid var(--line-2);
}
.sec-band>span{position:absolute;top:0;bottom:0}
.sec-band .b-review{background:var(--amber);opacity:.85}
.sec-band .b-block{background:var(--coral);opacity:.9}
.sec-band-legend{display:flex;gap:14px;flex-wrap:wrap;font-size:11.5px;color:var(--ink-2)}
.sec-band-legend i{
  display:inline-block;width:9px;height:9px;border-radius:3px;margin-right:5px;vertical-align:-1px;
}
.sec-band-ticks{position:relative;height:16px;font-size:10.5px;color:var(--ink-3);font-family:var(--font-num)}
.sec-band-ticks span{position:absolute;transform:translateX(-50%);white-space:nowrap}

/* --- 14.6 环境依赖状态 --- */
.sec-env{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px}
.sec-env-item{
  display:flex;align-items:center;gap:10px;padding:11px 13px;
  border:1px solid var(--line);border-radius:var(--r-sm);background:#fff;
}
.sec-env-item .ic{
  width:32px;height:32px;border-radius:10px;display:grid;place-items:center;font-size:13px;flex:0 0 auto;
}
.sec-env-item.ok .ic{background:var(--mint-soft);color:var(--mint)}
.sec-env-item.bad .ic{background:var(--coral-soft);color:var(--coral)}
.sec-env-item.warn .ic{background:var(--amber-soft);color:var(--amber)}
.sec-env-item .nm{font-size:13px;font-weight:600;color:var(--ink-1)}
.sec-env-item .ds{font-size:11.5px;color:var(--ink-3);margin-top:2px;line-height:1.5}
.sec-env-item .st{margin-left:auto;font-size:11.5px;font-weight:700;flex:0 0 auto}
.sec-env-item.ok .st{color:var(--mint)}
.sec-env-item.bad .st{color:var(--coral)}
.sec-env-item.warn .st{color:var(--amber)}

/* --- 14.7 底部保存条 --- */
.sec-savebar{
  position:sticky;bottom:0;z-index:5;margin-top:18px;
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  padding:12px 16px;background:rgba(255,255,255,.94);
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  border:1px solid var(--line);border-radius:var(--r-md);
  box-shadow:0 -4px 18px rgba(20,22,28,.05);
}
.sec-savebar .hint{font-size:12px;color:var(--ink-3);flex:1;min-width:120px}
.sec-savebar .btn{min-width:112px}

/* --- 14.8 状态徽章 --- */
.sec-badge{
  display:inline-flex;align-items:center;gap:4px;font-size:11.5px;font-weight:650;
  padding:2px 8px;border-radius:20px;line-height:1.7;
}
.sec-badge.on{background:var(--mint-soft);color:#0a9c7c}
.sec-badge.off{background:#f2f3f7;color:var(--ink-3)}
.sec-badge.warn{background:var(--amber-soft);color:#b7791f}
.sec-badge.err{background:var(--coral-soft);color:#e14b4b}

/* --- 14.9 词库工具条 --- */
.sec-tools{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:12px}
.sec-tools .sp{flex:1}
.sec-word-count{font-size:12px;color:var(--ink-2)}
.sec-word-count b{font-family:var(--font-num);color:var(--ink-1)}

@media (max-width:767.98px){
  .sec-overview{grid-template-columns:1fr 1fr;gap:10px}
  .sec-ov{flex-direction:column;align-items:flex-start;gap:8px;padding:12px}
  .sec-ov-num{font-size:19px}
  .sec-channels{grid-template-columns:1fr}
  .sec-savebar{padding:10px 12px}
  .sec-savebar .hint{display:none}
  .sec-savebar .btn{flex:1}
}
@media (max-width:575.98px){
  .sec-overview{grid-template-columns:1fr}
  .sec-ov{flex-direction:row;align-items:center}
}
@media (prefers-reduced-motion:reduce){
  .sec-channel,.sec-savebar{transition:none!important}
}
@media (prefers-reduced-motion:reduce){
  .dapp-card,.dapp-file-row,.dapp-btn-primary,.dapp-rail-btn{transition:none!important}
}

/* ============================================================
   15. 弹窗表单组件（.dapp-form）
   弹窗宽度有限，不再复用 .dapp-page 下的 .form-horizontal 152px
   标签栅格（BS3 遗留写法在弹窗里会被二次挤压）：
   - .f-row  ：横排行（右对齐 96px 短标签 + 自适应控件），用于长输入框
   - .f-grid ：两列网格（标签在上、控件在下），用于数字/下拉等短控件
   - .f-tip  ：灰色说明文字
   ============================================================ */
.dapp-page .dapp-form .f-row{display:flex;align-items:flex-start;margin-bottom:10px}
.dapp-page .dapp-form .f-row>label{
  flex:0 0 96px;width:96px;padding:6px 12px 0 0;margin:0;
  text-align:right;font-size:13px;font-weight:600;color:var(--ink-1);line-height:1.5;
}
.dapp-page .dapp-form .f-row .f-ctl{flex:1 1 auto;min-width:0}
.dapp-page .dapp-form .f-grid{
  display:grid;grid-template-columns:1fr 1fr;gap:10px 18px;
  margin-bottom:10px;align-items:start;
}
/* 弹窗空间有限：控件比整页表单略矮一号 */
.dapp-page .dapp-form .form-control{padding:.38rem .8rem;font-size:13.5px}
.dapp-page .dapp-form .f-grid .f-lab{
  display:block;margin:0 0 5px;font-size:12.5px;font-weight:600;color:var(--ink-2);line-height:1.4;
}
.dapp-page .dapp-form .f-grid .f-lab .req{color:#ee5a5a;margin-left:2px}
.dapp-page .dapp-form .f-tip{margin-top:4px;font-size:11.5px;color:var(--ink-3);line-height:1.55}
.dapp-page .dapp-form .f-grid .f-tip{margin-top:3px;font-size:11px}
.dapp-page .dapp-form .f-chkline{display:flex;align-items:center;gap:7px;margin:0 0 6px;font-size:13px;font-weight:400;color:var(--ink-1);cursor:pointer}
.dapp-page .dapp-form .f-chkline:last-child{margin-bottom:0}
.dapp-page .dapp-form .f-chkline input[type="checkbox"]{flex:0 0 auto;width:15px;height:15px;accent-color:var(--brand)}
@media (max-width:575.98px){
  .dapp-page .dapp-form .f-row{display:block;margin-bottom:12px}
  .dapp-page .dapp-form .f-row>label{width:auto;text-align:left;padding:0 0 6px}
  .dapp-page .dapp-form .f-grid{grid-template-columns:1fr;gap:12px}
}
