/* ============================================================
   app.css — 对齐原站视觉（截图基准）
   侧边栏深色 #1e293b 系 / 品牌绿 #22c55e / 卡片白底圆角
   ============================================================ */
:root {
  --sb-bg: #1e293b;
  --sb-bg-deep: #172033;
  --sb-active: #22c55e;
  --sb-text: #cbd5e1;
  --brand: #22c55e;
  --brand-dark: #16a34a;
  --page-bg: #f1f5f9;
  --card-bg: #ffffff;
  --line: #e2e8f0;
  --txt: #334155;
  --txt-dim: #64748b;
}

* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; height: 100%; }
body {
  font-family: 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', sans-serif;
  background: var(--page-bg); color: var(--txt); font-size: 14px;
}

/* ---------- 登录页 ---------- */
.login-wrap {
  min-height: 100vh; display: flex; align-items: center; justify-content: center;
  background: linear-gradient(135deg, #172033 0%, #1e293b 60%, #14532d 100%);
}
.login-card {
  width: 380px; background: #fff; border-radius: 12px; padding: 40px 36px;
  box-shadow: 0 20px 50px rgba(0,0,0,.35); text-align: center;
}
.login-logo {
  width: 56px; height: 56px; margin: 0 auto 14px; border-radius: 14px;
  background: var(--brand); color: #fff; font-size: 28px;
  display: flex; align-items: center; justify-content: center;
}
.login-card h1 { font-size: 20px; margin: 0 0 26px; color: #1e293b; }
.login-btn { width: 100%; margin-top: 4px; background: var(--brand); border-color: var(--brand); }
.login-btn:hover, .login-btn:focus { background: var(--brand-dark); border-color: var(--brand-dark); }

/* ---------- 布局 ---------- */
.main-wrapper { height: 100vh; overflow: hidden; }
.layout-aside {
  background: var(--sb-bg); display: flex; flex-direction: column;
  transition: width .2s; overflow: hidden; height: 100%;
}
.layout-aside.collapsed { width: 64px !important; }
.aside-logo {
  height: 58px; display: flex; align-items: center; gap: 10px; padding: 0 18px;
  color: #fff; font-size: 17px; font-weight: 600; letter-spacing: .5px;
  background: var(--sb-bg-deep); white-space: nowrap;
}
.aside-logo i { font-size: 20px; color: var(--brand); }
.sidebar-menu { flex: 1; border-right: 0 !important; overflow-y: auto; }
.sidebar-menu .el-menu-item {
  height: 48px; line-height: 48px; color: var(--sb-text) !important; margin: 2px 8px;
  border-radius: 6px;
}
.sidebar-menu .el-menu-item i { color: inherit; margin-right: 8px; }
.sidebar-menu .el-menu-item:hover { background: rgba(255,255,255,.06) !important; color: #fff !important; }
.sidebar-menu .el-menu-item.is-active {
  background: var(--sb-active) !important; color: #fff !important;
  box-shadow: 0 2px 8px rgba(34,197,94,.35);
}
.sidebar-menu .logout-item { margin-top: 8px; border-top: 1px solid rgba(255,255,255,.08); }
/* 扩展工具分组 */
.sidebar-menu .extra-group > .el-sub-menu__title {
  color: var(--sb-text) !important; height: 46px; line-height: 46px; margin: 2px 8px; border-radius: 6px;
}
.sidebar-menu .extra-group > .el-sub-menu__title:hover { background: rgba(255,255,255,.06) !important; color: #fff !important; }
.sidebar-menu .extra-group .el-menu { background: rgba(0,0,0,.18) !important; }
.sidebar-menu .extra-group .el-menu-item { height: 42px; line-height: 42px; font-size: 13px; }
.aside-collapse-bar {
  height: 42px; display: flex; align-items: center; justify-content: center;
  color: var(--sb-text); cursor: pointer; border-top: 1px solid rgba(255,255,255,.06);
}
.aside-collapse-bar:hover { color: #fff; background: rgba(255,255,255,.04); }

.layout-main { padding: 0; background: var(--page-bg); display: flex; flex-direction: column; }
.topbar {
  height: 58px; background: #fff; border-bottom: 1px solid var(--line);
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 22px; flex-shrink: 0;
}
.topbar-title { font-size: 16px; font-weight: 600; color: #1e293b; }
.topbar-user { display: flex; align-items: center; gap: 8px; cursor: pointer; color: var(--txt); }
.main-content { padding: 18px 22px; overflow-y: auto; flex: 1; }

/* ---------- 通用卡片 ---------- */
.page-card {
  background: var(--card-bg); border-radius: 8px; padding: 16px 18px;
  box-shadow: 0 1px 3px rgba(15,23,42,.06); margin-bottom: 16px;
}
.card-head {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: 14px; font-weight: 600; color: #1e293b;
}
.card-head.plain { margin-bottom: 10px; }
.empty-hint { color: var(--txt-dim); text-align: center; padding: 26px 0; font-size: 13px; }

/* ---------- 数据面板 ---------- */
.dashboard-page { }
.dash-header { display: flex; align-items: flex-end; justify-content: space-between; margin-bottom: 14px; }
.dash-title { display: flex; gap: 12px; align-items: center; }
.dash-title > i {
  font-size: 30px; color: var(--brand); background: #dcfce7;
  width: 52px; height: 52px; border-radius: 12px;
  display: flex; align-items: center; justify-content: center;
}
.dash-title h1 { font-size: 21px; margin: 0; color: #0f172a; }
.dash-title p { margin: 3px 0 0; color: var(--txt-dim); font-size: 13px; }
.dash-meta { text-align: right; color: var(--txt-dim); font-size: 13px; }
.dash-meta strong { display: block; color: #0f172a; font-size: 15px; margin-top: 2px; }

.time-toolbar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.preset-group { display: flex; gap: 8px; flex-wrap: wrap; }
.range-picker { width: 360px; }

.kpi-grid {
  display: grid; grid-template-columns: repeat(6, 1fr); gap: 14px; margin-bottom: 4px;
}
.kpi-card { display: flex; align-items: center; gap: 12px; margin-bottom: 0; }
.kpi-icon {
  width: 44px; height: 44px; border-radius: 10px; color: #fff; font-size: 20px;
  display: flex; align-items: center; justify-content: center; flex-shrink: 0;
}
.kpi-val { font-size: 24px; font-weight: 700; color: #0f172a; line-height: 1.1; }
.kpi-label { color: var(--txt-dim); font-size: 12px; margin-top: 3px; }

/* ---------- 设备列表的错误详情（上游原文折叠展示） ---------- */
.dev-err-raw { margin-top: 6px; }
.dev-err-raw a { color: #409eff; text-decoration: none; }
.dev-err-raw a:hover { text-decoration: underline; }
.dev-err-raw-body {
  margin-top: 4px; padding: 6px 10px; background: #f8fafc;
  border: 1px solid #eef2f7; border-radius: 6px;
  color: #64748b; word-break: break-all; text-align: left; display: inline-block;
}

/* ---------- 设备配额区块（数据面板） ---------- */
.quota-card { margin-bottom: 4px; }
.quota-summary {
  display: grid; grid-template-columns: repeat(5, 1fr); gap: 12px;
  padding: 4px 0 12px;
}
.quota-stat {
  background: #f8fafc; border: 1px solid #eef2f7; border-radius: 8px;
  padding: 12px 8px; text-align: center;
}
.quota-val { font-size: 22px; font-weight: 700; color: #0f172a; line-height: 1.1; }
.quota-val.left { color: #16a34a; }
.quota-val.used { color: #2563eb; }
.quota-val.full { color: #dc2626; }
.quota-label { color: var(--txt-dim); font-size: 12px; margin-top: 4px; }
.quota-top-title {
  font-size: 13px; font-weight: 600; color: #334155;
  margin: 6px 0 8px; padding-left: 8px; border-left: 3px solid #2563eb;
}
.quota-table { width: 100%; }
.quota-empty { padding: 10px 0; }
@media (max-width: 1400px) { .quota-summary { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 900px) { .quota-summary { grid-template-columns: repeat(2, 1fr); } }

.chart-row { margin-bottom: 0; }
.chart-card { height: 100%; }
.chart-wrap { position: relative; width: 100%; }
.chart-wrap--line, .chart-wrap--bar { height: 300px; }
.chart-wrap--donut { height: 240px; }
.plat-legend { margin-top: 12px; }
.plat-item { display: flex; align-items: center; gap: 8px; padding: 4px 0; font-size: 13px; }
.plat-item i { width: 10px; height: 10px; border-radius: 3px; display: inline-block; }
.plat-item span { color: var(--txt-dim); flex: 1; }
.plat-item b { color: #0f172a; }

.mini-kpi-row { display: flex; gap: 22px; flex-wrap: wrap; margin-bottom: 12px; }
.mini-kpi .v { font-size: 20px; font-weight: 700; }
.mini-kpi .k { color: var(--txt-dim); font-size: 12px; }

/* ---------- 表格页通用 ---------- */
.page-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 14px; }
.page-head h1 { font-size: 19px; margin: 0; color: #0f172a; }
.filter-container { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 12px; }
.pager { margin-top: 14px; text-align: right; }
.row-between { display: flex; align-items: center; justify-content: space-between; }
.muted { color: var(--txt-dim); font-size: 12px; }
.mb { margin-bottom: 14px; }
.card-code { font-family: Consolas, Monaco, monospace; letter-spacing: .3px; }
code { background: #f1f5f9; padding: 1px 6px; border-radius: 4px; font-size: 12px; }

/* 滚动条 */
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 4px; }
::-webkit-scrollbar-track { background: transparent; }

/* 响应式 */
@media (max-width: 1400px) { .kpi-grid { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 900px) {
  .kpi-grid { grid-template-columns: repeat(2, 1fr); }
  .range-picker { width: 100%; }
}

/* ============================================================
   设备管理弹窗（会员维度，6 个 tab）+ 会员表格新增列
   按原后台截图还原：概览/登录/账号信息/绑定手机/设备列表/扫码授权
   ============================================================ */

/* ---- 通用小件 ---- */
.mono { font-family: ui-monospace, Consolas, "Courier New", monospace; }
.small { font-size: 12px; }
.mt { margin-top: 10px; }
.mb { margin-bottom: 10px; }
.ico { display: inline-block; font-style: normal; line-height: 1; }
.ico.big { font-size: 28px; color: #c0c4cc; }
.mini-btn { padding: 0 2px; margin-left: 2px; height: auto; vertical-align: middle; }
.copy-cell { cursor: pointer; border-bottom: 1px dashed #c0c4cc; }
.copy-cell:hover { color: var(--brand, #22c55e); border-bottom-color: var(--brand, #22c55e); }
.cell-copy { cursor: pointer; font-size: 11px; word-break: break-all; }
.cell-copy:hover { color: var(--brand, #22c55e); }
.raw {
  background: #f7f8fa; border: 1px solid #ebeef5; border-radius: 4px;
  padding: 10px; font-size: 11px; line-height: 1.5;
  max-height: 320px; overflow: auto; white-space: pre-wrap; word-break: break-all;
  font-family: ui-monospace, Consolas, monospace; margin: 0;
}

/* ---- 表格「绑定」列的多标签 ---- */
.plat-tag { margin-right: 3px; margin-bottom: 2px; }

/* ---- 弹窗骨架 ---- */
.dev-dialog .el-dialog__body { padding-top: 0; }

/* ★★★★★ 2026-10-15：「设备管理」弹窗切到高内容 tab 后，关闭按钮被推出视口
 *
 * ── 现象（需求方反馈）────────────────────────────────────────────────
 *   在设备管理弹窗里切到「账号信息」等长内容 tab 后，弹窗**关不掉**。
 *   表现为点「关闭」没反应；用户以为是自己"点太快了"。
 *
 * ── 根因（真实浏览器实测，非猜测）────────────────────────────────────
 *   实测 1600x1000 视口（innerHeight=905）：
 *     概览     -> dialog 高 644px，关闭按钮 bottom=669  → 在视口内 ✓
 *     账号信息 -> dialog 高 898px，关闭按钮 bottom=923  → 超出 905 ✗
 *   elementFromPoint(关闭按钮坐标) 返回 **null**（该点不可命中），
 *   所以点击落在视口外，v-model 从未被置 false —— 与"点太快"无关，
 *   也与遮罩泄漏无关（遮罩计数正常，页面中心未被遮挡）。
 *   ⚠ 注意：这与 verify-dialog-overlay-leak.js 里已证伪的"遮罩泄漏"是两个问题。
 *
 * ── 修法 ─────────────────────────────────────────────────────────────
 *   给弹窗一个**视口内的最大高度**，让 body 内部滚动、
 *   而 header/footer 始终留在视口里。
 *   top="5vh" ⇒ 上下各留 5vh，即 max-height: 90vh。
 *   这里再减去一点余量，避免贴边被裁。
 *
 *   用 vh 而不是写死 px：小屏笔记本（实测 905px 可视高）同样能关。
 *   ⚠ body 的滚动容器必须是 .el-dialog__body 本身（已设 overflow:auto），
 *     不要把 overflow 放到 .el-dialog 上，否则 footer 会跟着内容一起滚走。
 *
 * ★ 同时修掉**横向**溢出：弹窗写死 width="1180px"，
 *   而它是全站最宽的弹窗（次宽的是操作记录 820px）。
 *   视口宽度 < 1180px 时（实测 1024 窗口 → 994px 视口），
 *   关闭按钮被推到视口右侧之外，elementFromPoint 同样返回 null
 *   —— 与纵向是同一类"footer 够不着"的毛病。
 *   这里用 max-width 兜住：大屏仍是 1180px，窄屏自动收缩。
 */
.dev-dialog {
  max-height: 90vh;
  max-width: 96vw;
  display: flex;
  flex-direction: column;
  margin-bottom: 0;
  overflow: hidden;
}
.dev-dialog .el-dialog__header { flex: 0 0 auto; }
.dev-dialog .el-dialog__body {
  padding-top: 0;
  flex: 1 1 auto;
  overflow-y: auto;
  overflow-x: hidden;
}
.dev-dialog .el-dialog__footer { flex: 0 0 auto; }

/* ★★★★★ 2026-10-15（缺陷②）：「关闭后马上操作别的东西，点不动」
 *
 * ── 现象（需求方反馈）────────────────────────────────────────────────
 *   「不能正常关闭」/「有时候还是不能正常显示」。
 *   表现为：点了关闭之后再点页面上的别的东西，像是没反应。
 *
 * ── 根因（真实浏览器逐帧实测，非猜测）────────────────────────────────
 *   Element Plus 的 dialog 关闭动画由这两条 CSS 驱动
 *   （vendor/element-plus.css @132274）：
 *       .dialog-fade-leave-active            { animation: modal-fade-out  var(--el-transition-duration) }
 *       .dialog-fade-leave-active
 *         .el-overlay-dialog                 { animation: dialog-fade-out var(--el-transition-duration) }
 *   而 --el-transition-duration = 0.3s（vendor/element-plus.css 变量表）。
 *
 *   实测（1600x1000，点「关闭」后逐帧用 elementFromPoint 探测
 *         表格里 x=1360,y=462 处的「设备」按钮）：
 *       t=  0ms  命中=DIV.el-dialog__body   按钮可点=✗  弹窗 rect=45~635
 *       t= 70ms  命中=DIV.el-dialog__body   按钮可点=✗  弹窗 rect=41~631
 *       t=196ms  命中=DIV.el-dialog__body   按钮可点=✗  弹窗 rect=27~617
 *       t=291ms  命中=DIV.el-dialog__body   按钮可点=✗  弹窗 rect=25~615
 *       t=325ms  命中=SPAN.(按钮)           按钮可点=✓  ← 弹窗才真正消失
 *   ⇒ **关闭后约 300ms 内，弹窗实体仍然盖在页面上并吃掉所有点击。**
 *     用户手快时就会觉得「点了没反应 / 关不掉」。
 *
 * ── 为什么不能直接给 .el-overlay 加 pointer-events:none ──────────────
 *   那会让**正常打开**时的弹窗也点不动（弹窗本身也在 overlay 里），
 *   属于修一个坏一个。必须只在「正在离开」这个瞬间生效。
 *
 * ── 修法（实测校准后）────────────────────────────────────────────────
 *   ★ 关键实测：Transition 的 class 挂在 **.el-overlay 自己身上**，
 *     不是它的后代。关闭瞬间实测 DOM：
 *        <div class="el-overlay dialog-fade-leave-from dialog-fade-leave-active">
 *          <div class="el-overlay-dialog">
 *            <div class="el-dialog dev-dialog">...
 *     （实测 descChain: DIV.el-overlay > DIV.el-overlay-dialog > DIV.el-dialog）
 *     ⇒ 正确选择器是 `.el-overlay.dialog-fade-leave-active`。
 *       我最初写的 `.el-overlay:has(.dialog-fade-leave-active)` 永远匹配不到
 *       （class 不在后代上），已改正。实际起作用的一直是下面那条
 *       `.dialog-fade-leave-active`，实测 overlayPE 由 auto 变 none。
 *
 *   两条一起写：`.dialog-fade-leave-active` 覆盖「class 挂在自己身上」，
 *   `.el-overlay.dialog-fade-leave-active` 是更具体的形式；
 *   将来若 EP 改变挂载层级，两条里总有一条命中。
 *
 *   风险：两条都**只在离开动画进行中**生效，不触碰正常打开状态，
 *   也不影响弹窗内部交互（回归测试 verify-dialog-close-clicks-through.js
 *   用例4 专门验证弹窗内 tab 照常可点可切）。
 */
.dialog-fade-leave-active,
.el-overlay.dialog-fade-leave-active { pointer-events: none; }

.dev-tabs .el-tabs__header { margin-bottom: 14px; }
.dev-subtabs .el-tabs__header { margin-bottom: 10px; }

.dev-toolbar { display: flex; gap: 8px; margin-bottom: 14px; flex-wrap: wrap; }
.dev-toolbar.right { justify-content: flex-end; }
.dev-row { display: flex; align-items: center; gap: 8px; margin: 10px 0; flex-wrap: wrap; }

.dev-section-title {
  font-size: 13px; font-weight: 600; color: #303133;
  margin: 14px 0 10px; display: inline-flex; align-items: center; gap: 5px;
}
.dev-section-head {
  display: flex; align-items: center; justify-content: space-between;
  margin-top: 16px;
}
.dev-section-head .dev-section-title { margin-bottom: 6px; }

.dev-desc .el-descriptions__label { width: 92px; color: #909399; }
.dev-alert { margin: 10px 0; }

/* ---- 卡片 ---- */
.dev-card {
  border: 1px solid #ebeef5; border-radius: 6px;
  padding: 14px 16px; margin-bottom: 14px; background: #fff;
}
.dev-card-head {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: 6px;
}
.dev-card-head .dev-section-title { margin: 0; }

/* ---- 键值行 ---- */
.dev-kv {
  display: grid; grid-template-columns: 88px 1fr;
  gap: 8px 10px; align-items: center;
  font-size: 13px; margin: 10px 0;
}
.dev-kv .muted { font-size: 13px; }

/* ---- 账号信息 ---- */
.dev-account { display: flex; gap: 18px; align-items: flex-start; margin-top: 12px; }
.dev-avatar { flex: 0 0 76px; }
.dev-avatar img { width: 76px; height: 76px; border-radius: 50%; object-fit: cover; display: block; }
.dev-avatar-ph {
  width: 76px; height: 76px; border-radius: 50%; background: #f2f3f5;
  display: flex; align-items: center; justify-content: center;
  color: #c0c4cc; font-size: 12px;
}
.dev-account .dev-desc { flex: 1; }

/* ---- 账号状态行（对齐原站 ai-status-fields / ai-status-line） ---- */
.ai-status-fields {
  margin-top: 14px; padding-top: 12px; border-top: 1px dashed #e4e7ed;
  display: flex; flex-direction: column; gap: 8px;
}
.ai-status-line { display: flex; align-items: baseline; gap: 10px; font-size: 13px; }
.ai-status-label { flex: 0 0 76px; color: #909399; }
.ai-status-value { flex: 1; color: #303133; word-break: break-all; }

/* ---- VIP 四色卡 ---- */
.vip-grid {
  display: grid; grid-template-columns: repeat(2, 1fr);
  gap: 12px; margin-top: 12px;
}
.vip-card {
  border-radius: 6px; padding: 12px 14px;
  border-left: 4px solid #dcdfe6; background: #fafafa;
}
.vip-card .vip-name { font-size: 13px; color: #606266; margin-top: 6px; }
.vip-card .vip-state { font-size: 12px; color: #909399; margin-top: 3px; }
.vip-badge {
  display: inline-block; padding: 1px 8px; border-radius: 10px;
  font-size: 11px; line-height: 18px;
}
.vip-badge.on { background: #e1f3d8; color: #529b2e; }
.vip-badge.off { background: #f4f4f5; color: #909399; }
.vip-indigo { border-left-color: #6366f1; }
.vip-violet { border-left-color: #a855f7; }
.vip-sky    { border-left-color: #0ea5e9; }
.vip-green  { border-left-color: #22c55e; }

/* ---- 扫码授权拖拽区 ---- */
.qr-drop {
  border: 2px dashed #dcdfe6; border-radius: 8px;
  padding: 34px 16px; text-align: center; background: #fafbfc;
  transition: all .18s; margin-bottom: 14px; outline: none;
}
.qr-drop:hover, .qr-drop.over {
  border-color: var(--brand, #22c55e);
  background: #f0fdf4;
}
.qr-drop .qr-hint { color: #909399; font-size: 13px; margin: 10px 0 12px; }
.dev-qr { text-align: center; margin-top: 14px; }
.dev-qr img { width: 220px; height: 220px; object-fit: contain; border: 1px solid #ebeef5; border-radius: 6px; }

/* ---- 底部 API 日志 ---- */
.api-log {
  border: 1px solid #ebeef5; border-radius: 6px;
  margin-top: 16px; background: #fff; overflow: hidden;
}
.api-log-head {
  display: flex; align-items: center; gap: 8px;
  padding: 9px 14px; cursor: pointer; font-size: 13px;
  color: #606266; background: #fafafa; user-select: none;
}
.api-log-head:hover { background: #f5f7fa; }
.api-log-right { margin-left: auto; display: flex; align-items: center; gap: 10px; }
.api-log-body { max-height: 200px; overflow: auto; padding: 6px 14px 10px; border-top: 1px solid #f2f3f5; }
.api-log-line {
  display: flex; gap: 10px; align-items: baseline;
  font-size: 12px; padding: 3px 0; border-bottom: 1px dashed #f5f5f5;
}
.api-log-line.err { color: #f56c6c; }
.api-log-line.ok { color: #67c23a; }
.api-log-line .mono { color: #606266; }
.api-log-line.err .mono { color: #f56c6c; }

/* ================================================================
 * ★★★ 「设主设备」卡片（复刻原站 setMainDialog）
 * ================================================================ */
.login-section { border: 1px solid #ebeef5; border-radius: 6px; padding: 10px 12px; background: #fafafa; }
.login-section-title { font-size: 12px; color: #909399; margin-bottom: 6px; }

.row-line { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; }
.row-line:last-child { margin-bottom: 0; }
.row-lbl { font-size: 12px; color: #909399; }
.mono { font-family: Consolas, Monaco, monospace; }
.ellipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }

/* 一键设主进度框 */
.setmain-log { margin-top: 12px; border: 1px solid #ebeef5; border-radius: 6px; background: #fafafa; }
.setmain-log-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 6px 10px; border-bottom: 1px solid #ebeef5; font-size: 12px; color: #606266;
}
.setmain-log-body { max-height: 190px; overflow-y: auto; padding: 8px 10px; }
.setmain-log-line {
  display: flex; gap: 8px; align-items: baseline;
  font-size: 12px; padding: 2px 0; line-height: 1.5;
}
.setmain-log-line .muted { flex: 0 0 auto; }
.setmain-log-line.lv-info { color: #606266; }
.setmain-log-line.lv-success { color: #67c23a; }
.setmain-log-line.lv-warn { color: #e6a23c; }
.setmain-log-line.lv-error { color: #f56c6c; }
