@charset "UTF-8";
/* ==========================================================================
   OneBase 后台主题层（theme.css）
   --------------------------------------------------------------------------
   设计原则
     · 纯覆盖层：不改 Bootstrap / AdminLTE / amazeui 任何核心文件，全部靠后置覆盖
     · 令牌驱动：所有颜色走 CSS 变量，切主题只换变量，规则完全复用
     · 加载位置：必须在所有 CSS 之后（layout/bottom.html 末尾），否则会被压回去
     · 优先级：靠「选择器权重提升」而非 !important，仅在必须时才用 !important

   两套配色
     [data-theme="light"]  清爽商务风 —— 白侧栏 + 浅灰底 + 蓝色主色
     [data-theme="dark"]   深色侧栏风 —— 深靛蓝侧栏 + 浅色内容区

   回滚：删除本文件的 <link> 即可完全恢复原样（本文件不改动任何既有文件）
   ========================================================================== */

/* ==========================================================================
   1. 设计令牌
   ========================================================================== */

/* 令牌挂载点：light 作为基准定义在 :root，dark 用 data-theme 覆盖。
   为什么不用 :root 之外的写法：:root 永远命中且权重 (0,1,0)，
   若把 light/dark 都写成 [data-theme=...]（同为 0,1,0 但顺序在后会赢），
   反而要小心先后顺序；这里让 dark 走 html/body[data-theme]（权重 0,1,1），
   天然压过 :root，不用依赖书写顺序。

   data-theme 由 top.html 在 <head> 里写到 <html>（避免首屏闪烁），
   body 上还有一份服务端渲染的兜底。 */
:root {
    /* 品牌主色 */
    --ob-primary:        #2563eb;
    --ob-primary-hover:  #1d4ed8;
    --ob-primary-soft:   #eff6ff;
    --ob-primary-border: #bfdbfe;

    /* 文字 */
    --ob-text:      #1e293b;
    --ob-text-sub:  #475569;
    --ob-text-mute: #94a3b8;

    /* 背景与描边 */
    --ob-bg:         #f1f5f9;
    --ob-surface:    #ffffff;
    --ob-surface-2:  #f8fafc;
    --ob-border:     #e2e8f0;
    --ob-border-2:   #cbd5e1;

    /* 侧边栏 */
    --ob-side-bg:          #ffffff;
    --ob-side-border:      #e2e8f0;
    --ob-side-text:        #475569;
    --ob-side-icon:        #94a3b8;
    --ob-side-hover-bg:    #f1f5f9;
    --ob-side-hover-text:  #1e293b;
    --ob-side-active-bg:   #eff6ff;
    --ob-side-active-text: #2563eb;
    --ob-side-accent:      #2563eb;
    --ob-side-sub-bg:      #f8fafc;
    --ob-side-head:        #94a3b8;

    /* 顶栏 */
    --ob-header-bg:     #ffffff;
    --ob-header-text:   #1e293b;
    --ob-header-border: #e2e8f0;

    /* 状态色 */
    --ob-success: #16a34a;
    --ob-danger:  #dc2626;
    --ob-warning: #d97706;
    --ob-info:    #0891b2;

    /* 阴影与圆角 */
    --ob-shadow-sm: 0 1px 2px rgba(15, 23, 42, .06);
    --ob-shadow:    0 1px 3px rgba(15, 23, 42, .08), 0 1px 2px rgba(15, 23, 42, .04);
    --ob-shadow-md: 0 4px 12px rgba(15, 23, 42, .08);
    --ob-radius:    8px;
    --ob-radius-sm: 6px;
}

/* 深色侧栏（方案 B）——权重 0,1,1，稳压 :root 的 light 基准，不依赖书写顺序 */
html[data-theme="dark"],
body[data-theme="dark"] {
    --ob-primary:        #6366f1;
    --ob-primary-hover:  #4f46e5;
    --ob-primary-soft:   #eef2ff;
    --ob-primary-border: #c7d2fe;

    --ob-text:      #1e293b;
    --ob-text-sub:  #475569;
    --ob-text-mute: #94a3b8;

    --ob-bg:         #f1f5f9;
    --ob-surface:    #ffffff;
    --ob-surface-2:  #f8fafc;
    --ob-border:     #e2e8f0;
    --ob-border-2:   #cbd5e1;

    /* 深色侧栏 */
    --ob-side-bg:          #1e1b4b;
    --ob-side-border:      #312e81;
    --ob-side-text:        #c7d2fe;
    --ob-side-icon:        #818cf8;
    --ob-side-hover-bg:    #312e81;
    --ob-side-hover-text:  #ffffff;
    /* 深色侧栏：用半透明白做淡底，避免整块实心紫把菜单切得很碎 */
    --ob-side-active-bg:   rgba(255, 255, 255, .10);
    --ob-side-active-text: #ffffff;
    --ob-side-accent:      #818cf8;
    --ob-side-sub-bg:      #1a1744;
    --ob-side-head:        #818cf8;

    --ob-header-bg:     #ffffff;
    --ob-header-text:   #1e293b;
    --ob-header-border: #e2e8f0;

    --ob-success: #16a34a;
    --ob-danger:  #dc2626;
    --ob-warning: #d97706;
    --ob-info:    #0891b2;

    --ob-shadow-sm: 0 1px 2px rgba(15, 23, 42, .06);
    --ob-shadow:    0 1px 3px rgba(15, 23, 42, .08), 0 1px 2px rgba(15, 23, 42, .04);
    --ob-shadow-md: 0 4px 12px rgba(15, 23, 42, .08);
    --ob-radius:    8px;
    --ob-radius-sm: 6px;
}

/* ==========================================================================
   2. 全局排版 / 自托管字体 / 滚动条
   ========================================================================== */

/* --------------------------------------------------------------------------
   自托管字体：Noto Sans SC（思源黑体）子集
   --------------------------------------------------------------------------
   为什么自托管而不是只用系统字体：
     实测本机（macOS）没有安装「苹方 PingFang SC」，中文一路回退到
     Hiragino Sans GB（冬青黑体，2007 年设计），观感明显偏旧；不同管理员
     的操作系统不同，字体也会跟着变。自托管后所有人看到的是同一套字体。

   子集化说明：
     原字体每个字重约 1.14MB（已按 CJK 区段预切）。
     用 pyftsubset 按「后台实际用到的字符集」再裁一次：
       模板静态文案 + 数据库动态汉字 + ASCII + 常用中文标点 = 4022 字符
     单字重降到约 540KB，两个字重共约 1.1MB。
     如需重新生成，见 _deploy/08-字体子集化说明.md

   字重映射：
     只带 400 与 500 两个文件；600 由浏览器用 500 合成加粗。
     这样省掉一个 700 字重（约 570KB），视觉上足够。
   -------------------------------------------------------------------------- */
@font-face {
    font-family: "Noto Sans SC";
    font-style: normal;
    font-weight: 400;
    font-display: swap;
    src: url("../fonts/noto-sans-sc/noto-sans-sc-400.woff2") format("woff2");
}
@font-face {
    font-family: "Noto Sans SC";
    font-style: normal;
    font-weight: 500 600;          /* 600 复用 500，避免额外下载一个字重 */
    font-display: swap;
    src: url("../fonts/noto-sans-sc/noto-sans-sc-500.woff2") format("woff2");
}

body {
    /* 顺序要点：
       1) 图标字体（Font Awesome / iconfont）必须排在前面，
          否则私有区字符会被中文字体截走，图标变方块
       2) 自托管中文字体紧随其后，保证跨平台一致
       3) 系统字体兜底：覆盖字体里没有的装饰符号（箭头、圈号、几何图形），
          本机实测缺 59 个这类符号，交给系统符号字体渲染 */
    font-family: "FontAwesome", "iconfont",
                 "Noto Sans SC",
                 -apple-system, BlinkMacSystemFont, "Segoe UI",
                 "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei",
                 "Apple Color Emoji", "Segoe UI Emoji",
                 "Helvetica Neue", Arial, sans-serif;
    font-size: 14px;
    color: var(--ob-text);
    background-color: var(--ob-bg);
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    /* 中文排版：行高放宽让密集内容更透气。
       刻意不加 letter-spacing —— 汉字本身全宽等距，额外字距反而显松散。 */
    line-height: 1.6;
}

/* 细滚动条（Webkit） */
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
    background: #cbd5e1;
    border: 3px solid transparent;
    border-radius: 8px;
    background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover { background: #94a3b8; background-clip: content-box; }

a { color: var(--ob-primary); }
a:hover, a:focus { color: var(--ob-primary-hover); }

/* ==========================================================================
   3. 左侧导航栏
   ========================================================================== */

.main-sidebar,
.left-side {
    background-color: var(--ob-side-bg) !important;
    border-right: 1px solid var(--ob-side-border);
    box-shadow: none !important;
}

/* 用户信息面板 */
.main-sidebar .user-panel {
    padding: 16px 12px;
    border-bottom: 1px solid var(--ob-side-border);
    margin-bottom: 0;
}
.main-sidebar .user-panel > .image > img {
    border: 2px solid rgba(255, 255, 255, .18);
    box-shadow: var(--ob-shadow-sm);
}
.main-sidebar .user-panel > .info > p {
    font-weight: 600;
    font-size: 13px;
    color: var(--ob-side-active-text);
}
.main-sidebar .user-panel > .info {
    color: var(--ob-side-icon);
    font-size: 12px;
    line-height: 1.5;
}

/* 菜单容器 */
.sidebar-menu {
    padding: 8px 0;
}
.sidebar-menu > li {
    margin: 2px 8px;
}

/* 一级菜单项 */
.sidebar-menu > li > a {
    border-left: 0 !important;
    border-radius: var(--ob-radius-sm);
    color: var(--ob-side-text);
    font-size: 14px;
    padding: 10px 12px;
    transition: background-color .15s ease, color .15s ease;
}
/* 干掉 Bootstrap 2 的默认焦点轮廓：a:focus{outline:5px auto -webkit-focus-ring-color}
   不处理的话，点过的菜单会一直挂着一圈青色外框，看起来像"选中没取消" */
.sidebar-menu a,
.sidebar-menu a:hover,
.sidebar-menu a:focus,
.sidebar-menu a:active,
.main-header .navbar a:focus,
.main-header .sidebar-btn:focus {
    outline: none !important;
    box-shadow: none !important;
}
.sidebar-menu > li > a > .fa,
.sidebar-menu > li > a > .glyphicon,
.sidebar-menu > li > a > .ion {
    color: var(--ob-side-icon);
    font-size: 15px;
    margin-right: 6px;
    width: 20px;
    text-align: center;
    transition: color .15s ease;
}

/* 悬停 */
.sidebar-menu > li:hover > a,
.sidebar-menu > li:focus > a {
    background: var(--ob-side-hover-bg) !important;
    color: var(--ob-side-hover-text) !important;
}
.sidebar-menu > li:hover > a > .fa,
.sidebar-menu > li:hover > a > .glyphicon,
.sidebar-menu > li:hover > a > .ion {
    color: var(--ob-side-hover-text);
}

/* 激活项
   注意：OneBase 只给叶子菜单加了 .active，父级什么都不加。
   父级高亮由 js/theme.js 补 .menu-active 类。
   （.menu-open 是 AdminLTE 自己加在 <ul> 上的，语义不同，这里不掺和）

   视觉上刻意做得克制：淡底 + 左侧细竖条，不用整块实心填充。
   原因是「当前页」应该一眼可辨但不抢戏，实心块会把侧栏切得很碎。 */
.sidebar-menu > li.active > a,
.sidebar-menu > li.menu-active > a {
    background: var(--ob-side-active-bg) !important;
    color: var(--ob-side-active-text) !important;
    font-weight: 600;
}
.sidebar-menu > li.active > a > .fa,
.sidebar-menu > li.active > a > .glyphicon,
.sidebar-menu > li.active > a > .ion,
.sidebar-menu > li.menu-active > a > .fa {
    color: var(--ob-side-active-text);
}
/* 父级展开路径：左侧 3px 竖条 */
.sidebar-menu > li.menu-active > a {
    box-shadow: inset 3px 0 0 0 var(--ob-side-accent) !important;
}

/* 分组标题 */
.sidebar-menu > li.header {
    color: var(--ob-side-head);
    background: transparent;
    font-size: 11px;
    letter-spacing: .06em;
    padding: 14px 20px 6px;
    text-transform: uppercase;
}

/* 展开箭头 */
.sidebar-menu .treeview-menu > li > a {
    color: var(--ob-side-icon);
    padding: 8px 10px 8px 34px;
    font-size: 13px;
    border-radius: var(--ob-radius-sm);
    transition: background-color .15s ease, color .15s ease;
}
.sidebar-menu .treeview-menu {
    background: var(--ob-side-sub-bg) !important;
    border-radius: var(--ob-radius-sm);
    margin: 2px 0 4px;
    padding: 4px 0;
}
/* 二级菜单左侧指示线 */
.sidebar-menu .treeview-menu > li > a::before {
    content: "";
    position: absolute;
    left: 20px;
    top: 50%;
    width: 4px;
    height: 4px;
    margin-top: -2px;
    border-radius: 50%;
    background: currentColor;
    opacity: .45;
}
.sidebar-menu .treeview-menu > li > a { position: relative; }
.sidebar-menu .treeview-menu > li > a:hover {
    background: var(--ob-side-hover-bg) !important;
    color: var(--ob-side-hover-text) !important;
}
.sidebar-menu .treeview-menu > li.active > a {
    background: var(--ob-side-active-bg) !important;
    color: var(--ob-side-active-text) !important;
    font-weight: 600;
}
.sidebar-menu .treeview-menu > li.active > a::before { opacity: 1; }

/* ==========================================================================
   4. 顶部栏
   ========================================================================== */

.main-header .navbar,
.main-header .logo {
    background-color: var(--ob-header-bg) !important;
    color: var(--ob-header-text) !important;
    border-bottom: 1px solid var(--ob-header-border) !important;
    box-shadow: none !important;
}

/* Logo */
.main-header .logo {
    font-weight: 700;
    letter-spacing: .02em;
    border-right: 1px solid var(--ob-header-border) !important;
    height: 50px;
    line-height: 50px;
}
.main-header .logo:hover { background-color: var(--ob-surface-2) !important; }
.main-header .logo .logo-mini b,
.main-header .logo .logo-lg b { color: var(--ob-primary); }

/* 顶部导航链接 */
.main-header .navbar .nav > li > a {
    color: var(--ob-text-sub) !important;
    transition: background-color .15s ease, color .15s ease;
}
.main-header .navbar .nav > li > a:hover,
.main-header .navbar .nav > li > a:focus,
.main-header .navbar .nav > li.open > a {
    background-color: var(--ob-surface-2) !important;
    color: var(--ob-primary) !important;
}

/* 侧栏折叠按钮 */
.main-header .sidebar-toggle {
    color: var(--ob-text-sub) !important;
}
.main-header .sidebar-toggle:hover {
    background-color: var(--ob-surface-2) !important;
    color: var(--ob-primary) !important;
}
.main-header .sidebar-toggle::before { color: inherit; }

/* 快捷入口按钮 */
.main-header .navbar .sidebar-btn {
    color: var(--ob-text-sub);
    border-radius: var(--ob-radius-sm);
    margin: 8px 2px;
    padding: 6px 12px;
    display: inline-block;
    transition: background-color .15s ease, color .15s ease;
}
.main-header .navbar .sidebar-btn:hover {
    background-color: var(--ob-surface-2);
    color: var(--ob-primary);
}

/* 下拉菜单 */
.main-header .navbar .dropdown-menu {
    border: 1px solid var(--ob-border);
    border-radius: var(--ob-radius);
    box-shadow: var(--ob-shadow-md);
    padding: 6px;
}
.main-header .navbar .dropdown-menu > li > a {
    border-radius: var(--ob-radius-sm);
    color: var(--ob-text-sub);
    padding: 8px 12px;
}
.main-header .navbar .dropdown-menu > li > a:hover {
    background-color: var(--ob-primary-soft);
    color: var(--ob-primary);
}

/* ==========================================================================
   5. 内容区与面包屑
   ========================================================================== */

.content-wrapper {
    background-color: var(--ob-bg) !important;
}

/* 内容区标题（页头） */
.content-header {
    padding: 4px 0 14px !important;
    margin-bottom: 14px !important;
}
.content-header > h1 {
    font-size: 20px;
    font-weight: 600;
    color: var(--ob-text);
    letter-spacing: -.01em;
}
.content-header > h1 > small {
    color: var(--ob-text-mute);
    font-size: 13px;
    margin-left: 8px;
}

/* 面包屑 */
.content-header .breadcrumb,
.breadcrumb {
    background: transparent !important;
    font-size: 12px;
    padding: 4px 0 !important;
    top: auto !important;
    float: right;
    position: static !important;
    right: auto !important;
}
.breadcrumb > li > a { color: var(--ob-text-mute); }
.breadcrumb > li > a:hover { color: var(--ob-primary); }
.breadcrumb > .active { color: var(--ob-text-sub); }
.breadcrumb > li + li::before {
    color: var(--ob-border-2) !important;
    content: "/ " !important;
}

/* ==========================================================================
   6. 卡片（AdminLTE .box）—— 视觉核心
   ========================================================================== */

.content .box,
.box {
    background: var(--ob-surface);
    border: 1px solid var(--ob-border) !important;
    border-top: 1px solid var(--ob-border) !important;
    border-radius: var(--ob-radius);
    box-shadow: var(--ob-shadow-sm);
    margin-bottom: 18px;
    overflow: hidden;
}

.box-header {
    background: var(--ob-surface);
    border-bottom: 1px solid var(--ob-border);
    padding: 14px 18px;
    color: var(--ob-text);
    min-height: 0;
}
.box-header.with-border { border-bottom: 1px solid var(--ob-border); }
.box-header > .box-title,
.box-header .box-title {
    font-size: 15px;
    font-weight: 600;
    color: var(--ob-text);
    line-height: 1.6;
    padding: 0;
}
.box-body { padding: 18px; background: var(--ob-surface); }
.box-footer {
    background: var(--ob-surface-2);
    border-top: 1px solid var(--ob-border);
    padding: 12px 18px;
    border-radius: 0 0 var(--ob-radius) var(--ob-radius);
}

/* ==========================================================================
   6.5 列表页筛选工具栏
   --------------------------------------------------------------------------
   原始模板把每个筛选项塞进 .col-md-1（宽度只有 8.33%），
   中文选项「回复类型」「请选择」需要约 90px，装不下就被裁掉半个字。
   这里把筛选行改成 flex 自动排版，并给控件一个合理的最小宽度，
   无论模板里写的是 col-md-1 还是别的宽度都不会再被切。
   ========================================================================== */

.box-header .row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px;
    margin-left: 0;
    margin-right: 0;
}

/* 取消这些栅格列的固定百分比宽度，改由内容撑开 */
.box-header .row > [class*="col-"] {
    width: auto !important;
    max-width: none;
    float: none;
    padding-left: 0;
    padding-right: 0;
    flex: 0 0 auto;
}

/* Bootstrap 的 .row 带 clearfix 伪元素，在 flex 容器里会变成多余的 flex item */
.box-header .row::before,
.box-header .row::after {
    display: none !important;
}

/* 最后一个含搜索输入框的列占满剩余空间 */
.box-header .row > [class*="col-"]:last-child {
    flex: 1 1 320px;
    min-width: 0;
}

.box-header .box-tools,
.box-header .search-form {
    width: 100%;
    float: none !important;
    position: static !important;
}

/* 搜索输入框组：占满所在列 */
.box-header .search-form .input-group {
    display: flex;
    width: 100%;
    max-width: none;
}

/* 筛选下拉：给足最小宽度，不再截断文字 */
.box-header .search-form select.form-control {
    width: auto;
    min-width: 118px;
    flex: 0 0 auto;
    padding-right: 22px;      /* 给右侧原生下拉箭头留位 */
    text-overflow: ellipsis;
}

/* 筛选文本输入框：占满剩余空间 */
.box-header .search-form input.form-control {
    flex: 1 1 auto;
    width: auto !important;
    min-width: 140px;
}

/* 筛选按钮 */
.box-header .search-form .input-group-btn {
    flex: 0 0 auto;
    width: auto;
    white-space: nowrap;
}

/* 没有 .input-group 包裹的裸控件（部分页面直接写 select） */
.box-header .search-form > select.form-control,
.box-header .search-form > input.form-control {
    min-width: 118px;
    width: auto;
}

/* ==========================================================================
   7. 表格
   ========================================================================== */

.table {
    background: var(--ob-surface);
    margin-bottom: 0;
    color: var(--ob-text);
    /* 长内容列优先获得宽度：避免「问题 / 回答 / 描述」被挤成逐字竖排 */
    table-layout: auto;
}
.table > thead > tr > th,
.table > tbody > tr > td {
    word-break: normal;
    overflow-wrap: break-word;
    word-wrap: break-word;
    white-space: normal;
}

/* --------------------------------------------------------------------------
   列宽策略（解决「问题列逐字竖排」，同时避免过度横向滚动）
   --------------------------------------------------------------------------
   背景：没有任何宽度约束时，浏览器会把长文本列压到几十像素 → 逐字竖排。
   但反过来把 min-width 设太大（曾用过 1500px）同样有害：
   12 列的表格实际只需约 1030px 就能排下，强制 1500px 只会凭空产生横向滚动条，
   右侧列被推出可视区 —— 用户看到的就是「显示不全」。

   所以按列数分档，只保证「够用」：
     少量列 → 不设限，随内容自适应
     中等列 → 880px，避免中文被压扁
     多列   → 1120px，覆盖 12 列的最坏情况（实测约 1030px）
   真正超过视口宽度的表格，才依赖 .table-responsive 横向滚动。
   -------------------------------------------------------------------------- */
.table { min-width: 0; }
.table-responsive > .table { min-width: 0; }
.table:has(> thead > tr > th:nth-last-child(7))  { min-width: 880px; }
.table:has(> thead > tr > th:nth-last-child(10)) { min-width: 1120px; }

/* 极短字段一律不换行，把宽度让给长内容列 */
.table > tbody > tr > td:first-child,          /* ID */
.table > tbody > tr > td.text-center,
.table > tbody > tr > td:last-child,           /* 操作 */
.table > tbody > tr > td.nowrap {
    white-space: nowrap;
}
.table > thead > tr > th {
    background: var(--ob-surface-2);
    border-bottom: 1px solid var(--ob-border) !important;
    color: var(--ob-text-sub);
    font-size: 13px;
    font-weight: 600;
    padding: 12px 14px;
    white-space: nowrap;
    vertical-align: middle;
}
.table > tbody > tr > td {
    border-top: 1px solid var(--ob-border) !important;
    padding: 12px 14px;
    vertical-align: top;
    color: var(--ob-text);
    line-height: 1.7;
}
.table > tbody > tr:hover > td,
.table-hover > tbody > tr:hover > td {
    background-color: var(--ob-primary-soft) !important;
}

/* 表格容器横向滚动（列多时的正确降级方式，而不是把列压扁） */
.table-responsive {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}
.box-body:has(> .table),
.box-body:has(> table) {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}
/* 斑马纹淡化一点，避免和 hover 打架 */
.table-striped > tbody > tr:nth-of-type(odd) > td {
    background-color: var(--ob-surface-2);
}
.table-striped > tbody > tr:nth-of-type(odd):hover > td {
    background-color: var(--ob-primary-soft) !important;
}
/* 去掉竖边框，横向线条就够了 */
.table-bordered { border: 0 !important; }
.table-bordered > thead > tr > th,
.table-bordered > tbody > tr > td {
    border-left: 0 !important;
    border-right: 0 !important;
}
.table-bordered > thead > tr > th:first-child,
.table-bordered > tbody > tr > td:first-child { padding-left: 18px; }
.table-bordered > thead > tr > th:last-child,
.table-bordered > tbody > tr > td:last-child { padding-right: 18px; }

/* 空状态 */
.table .odd > td {
    color: var(--ob-text-mute);
    padding: 40px 14px !important;
}

/* ==========================================================================
   7.5 卡片式列表（文本量大的列表页，如翻牌列表）
   --------------------------------------------------------------------------
   为什么不用表格：翻牌列表有「问题 / 回答」这类大段文本，11 列塞进一屏
   必然把文本列压成逐字竖排。改成卡片后文本全宽可读，还能自然适配窄屏。

   信息层级（按视觉权重从高到低）：
     1. 价格 —— 右上角大号橙色，一眼可见
     2. 状态 —— 实心色块徽标，扫读最快
     3. 用户 → 艺人 —— 加粗姓名
     4. 问题 / 回答 —— 上下两行全宽显示（并排时每列太窄）
     5. 类型 / 时间 —— 灰色小字辅助信息
   ========================================================================== */

.ql { padding: 4px 2px; }

.ql-item {
    background: var(--ob-surface);
    border: 1px solid var(--ob-border);
    border-radius: var(--ob-radius);
    box-shadow: var(--ob-shadow-sm);
    padding: 0;
    margin-bottom: 14px;
    overflow: hidden;
    transition: box-shadow .18s ease, border-color .18s ease;
}
.ql-item:hover {
    box-shadow: var(--ob-shadow-md);
    border-color: var(--ob-border-2);
}

/* ---------- 顶部：用户→艺人（左） + 价格（右） ---------- */
.ql-top {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 14px;
    flex-wrap: wrap;
    padding: 14px 18px 10px;
}
.ql-who {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
    min-width: 0;
    font-size: 15px;
    font-weight: 600;
    color: var(--ob-text);
}
.ql-who .ql-arrow { color: var(--ob-text-mute); font-weight: 400; }
.ql-id {
    font-size: 11px;
    font-weight: 400;
    color: var(--ob-text-mute);
    background: var(--ob-surface-2);
    border: 1px solid var(--ob-border);
    border-radius: 4px;
    padding: 1px 6px;
}

/* 价格：视觉重心 */
.ql-price {
    flex: none;
    display: flex;
    align-items: baseline;
    gap: 2px;
    color: #e8590c;
    font-weight: 700;
    font-size: 26px;
    line-height: 1;
    letter-spacing: -.02em;
}
.ql-price .ql-price__sym { font-size: 15px; font-weight: 600; }
.ql-price .ql-price__unit { font-size: 12px; font-weight: 400; color: var(--ob-text-mute); margin-left: 3px; }

/* ---------- 状态 + 类型（一行元信息） ---------- */
.ql-meta {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
    padding: 0 18px 12px;
    border-bottom: 1px solid var(--ob-border);
}
/* 状态徽标：实心色块，最醒目 */
.ql-badge {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    font-size: 12px;
    font-weight: 600;
    line-height: 22px;
    padding: 0 11px;
    border-radius: 999px;
    color: #fff;
    white-space: nowrap;
}
.ql-badge--wait   { background: #3b82f6; }   /* 等待回复 */
.ql-badge--ok     { background: #10b981; }   /* 已回复 */
.ql-badge--refund { background: #ef4444; }   /* 已退款 / 拒绝 / 违规 */
.ql-badge--review { background: #f59e0b; }   /* 待审核 */

/* 类型标签：描边风格，弱于状态 */
.ql-tag {
    display: inline-block;
    font-size: 12px;
    line-height: 22px;
    padding: 0 10px;
    border-radius: 6px;
    border: 1px solid var(--ob-border-2);
    background: var(--ob-surface-2);
    color: var(--ob-text-sub);
    white-space: nowrap;
}
/* 时间：靠右、带图标 */
.ql-time {
    margin-left: auto;
    font-size: 12px;
    color: var(--ob-text-mute);
    white-space: nowrap;
}
.ql-time i { margin-right: 5px; }

/* ---------- 问题 / 回答：上下两行，全宽 ---------- */
.ql-sec { padding: 12px 18px; }
.ql-sec + .ql-sec { border-top: 1px dashed var(--ob-border); }

.ql-sec__label {
    display: flex;
    align-items: center;
    gap: 6px;
    font-size: 12px;
    font-weight: 600;
    color: var(--ob-text-sub);
    margin-bottom: 7px;
}
/* 左侧色条区分问题 / 回答 */
.ql-sec__label::before {
    content: "";
    width: 3px;
    height: 13px;
    border-radius: 2px;
    background: var(--ob-border-2);
}
.ql-sec--q .ql-sec__label::before { background: #6366f1; }
.ql-sec--a .ql-sec__label::before { background: #10b981; }

.ql-sec__text {
    font-size: 13.5px;
    line-height: 1.85;
    color: var(--ob-text);
    word-break: break-word;
    overflow-wrap: anywhere;
    white-space: pre-wrap;
}
/* 长文本限高，内部滚动，避免单条卡片过高 */
.ql-sec__text { max-height: 260px; overflow-y: auto; }
.ql-sec__text--empty { color: var(--ob-text-mute); font-style: italic; }

/* ---------- 底部操作区 ---------- */
.ql-foot {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 10px;
    padding: 10px 18px;
    background: var(--ob-surface-2);
    border-top: 1px solid var(--ob-border);
}
.ql-foot__note {
    font-size: 12px;
    color: var(--ob-text-mute);
}
/* 徽标与标签里的小图标 */
.ql-tag i { margin-right: 4px; opacity: .7; }
.ql-badge i { font-size: 11px; }

/* 空状态 */
.ql-empty {
    padding: 60px 20px;
    text-align: center;
    color: var(--ob-text-mute);
    font-size: 13px;
}

/* ==========================================================================
   7.8 通用组件（全站统一的设计语言）
   --------------------------------------------------------------------------
   目标：让所有页面共享同一套视觉规范 —— 徽标、标签、表格细节、
   表单排版、金额/时间样式、空状态。页面只需套用类名即可，
   不要求每个页面都重写结构（结构差异大的才单独改模板）。

   徽标配色语义（与翻牌列表保持一致）：
     蓝=进行中/普通   绿=成功/正常   红=失败/无效
     橙=待办/警告     灰=已停用/中性
   ========================================================================== */

/* ---------- 状态徽标 ---------- */
.ob-badge {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    font-size: 12px;
    font-weight: 600;
    line-height: 22px;
    padding: 0 10px;
    border-radius: 999px;
    white-space: nowrap;
    border: 1px solid transparent;
}
.ob-badge i { font-size: 11px; }

.ob-badge--primary { background: #3b82f6; color: #fff; }
.ob-badge--success { background: #10b981; color: #fff; }
.ob-badge--danger  { background: #ef4444; color: #fff; }
.ob-badge--warning { background: #f59e0b; color: #fff; }
.ob-badge--muted   { background: #94a3b8; color: #fff; }

/* 浅色描边款（用于次要状态，避免整页都是实心色块） */
.ob-badge--soft-primary { background: #eff6ff; color: #2563eb; border-color: #bfdbfe; }
.ob-badge--soft-success { background: #ecfdf5; color: #059669; border-color: #a7f3d0; }
.ob-badge--soft-danger  { background: #fef2f2; color: #dc2626; border-color: #fecaca; }
.ob-badge--soft-warning { background: #fffbeb; color: #b45309; border-color: #fde68a; }
.ob-badge--soft-muted   { background: var(--ob-surface-2); color: var(--ob-text-sub); border-color: var(--ob-border); }

/* ---------- 普通标签 ---------- */
.ob-tag {
    display: inline-block;
    font-size: 12px;
    line-height: 22px;
    padding: 0 9px;
    border-radius: 6px;
    border: 1px solid var(--ob-border-2);
    background: var(--ob-surface-2);
    color: var(--ob-text-sub);
    white-space: nowrap;
}
.ob-tag i { margin-right: 4px; opacity: .7; }

/* ---------- 表格内的强化样式 ---------- */
/* 表格里的 ID 用小号等宽灰字，不抢视线 */
.table .ob-cell-id {
    font-size: 12px;
    color: var(--ob-text-mute);
    font-variant-numeric: tabular-nums;
}
/* 金额：加粗 + 等宽数字，便于纵向对比 */
.table .ob-cell-money {
    font-weight: 600;
    color: #e8590c;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}
/* 时间：等宽数字 + 灰字 + 不换行 */
.table .ob-cell-time {
    font-size: 12.5px;
    color: var(--ob-text-sub);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}
/* 主标题字段（昵称、标题等）加粗一点 */
.table .ob-cell-title { font-weight: 600; color: var(--ob-text); }
/* 次要说明 */
.table .ob-cell-sub { font-size: 12px; color: var(--ob-text-mute); }
/* 头像是圆角小图，统一尺寸 */
.table .ob-avatar {
    width: 32px; height: 32px;
    border-radius: 50%;
    object-fit: cover;
    border: 1px solid var(--ob-border);
    background: var(--ob-surface-2);
}

/* ---------- 表格里的操作按钮组 ---------- */
.table .ob-actions {
    display: flex;
    align-items: center;
    gap: 6px;
    justify-content: center;
    white-space: nowrap;
}
.table .ob-actions .btn { padding: 3px 9px; font-size: 12px; }

/* 自动生效：OneBase 的操作列统一是 <td class="… text-center"><ob_link><a class="btn">…
   <ob_link> 是自定义标签（浏览器按 inline 处理），这里统一成小号按钮 + 等间距，
   不必逐页给 td 加 ob-actions 类 */
.table > tbody > tr > td > ob_link {
    display: inline-block;
    vertical-align: middle;
}
.table > tbody > tr > td > ob_link + ob_link { margin-left: 5px; }
.table > tbody > tr > td > ob_link > .btn {
    padding: 3px 10px;
    font-size: 12px;
    line-height: 1.6;
    border-radius: 5px;
}
.table > tbody > tr > td > ob_link > .btn > i { margin-right: 3px; }

/* --------------------------------------------------------------------------
   操作按钮的语义配色
   --------------------------------------------------------------------------
   问题：模板里所有操作按钮都是裸 .btn，全部继承主题主色（蓝），
   于是一行里「编辑 / 删除」长得一模一样，分不出主次，危险操作也没有警示。

   做法：给按钮加语义类，按角色分色 ——
     .ob-act            次要操作（查看/导出/切换状态…）→ 中性描边
     .ob-act--edit      编辑类 → 淡蓝
     .ob-act--danger    删除/清空等破坏性操作 → 淡红
   类名由脚本按 action 名自动写入模板（见文末说明）。

   注意：这里只作用于表格操作列（ob_link 内），
   不会影响工具条上的「新增」「搜索」等主操作按钮。
   -------------------------------------------------------------------------- */
.table > tbody > tr > td > ob_link > .btn.ob-act,
.ob-actions .btn.ob-act {
    background: var(--ob-surface) !important;
    border: 1px solid var(--ob-border-2) !important;
    color: var(--ob-text-sub) !important;
}
.table > tbody > tr > td > ob_link > .btn.ob-act:hover,
.ob-actions .btn.ob-act:hover {
    background: var(--ob-surface-2) !important;
    border-color: var(--ob-border-2) !important;
    color: var(--ob-text) !important;
}

/* 编辑类：淡蓝 */
.table > tbody > tr > td > ob_link > .btn.ob-act--edit,
.ob-actions .btn.ob-act--edit {
    background: #eff6ff !important;
    border: 1px solid #bfdbfe !important;
    color: #2563eb !important;
}
.table > tbody > tr > td > ob_link > .btn.ob-act--edit:hover,
.ob-actions .btn.ob-act--edit:hover {
    background: #dbeafe !important;
    border-color: #93c5fd !important;
    color: #1d4ed8 !important;
}

/* 破坏性操作：淡红（不用实心红，避免整页过于刺眼） */
.table > tbody > tr > td > ob_link > .btn.ob-act--danger,
.ob-actions .btn.ob-act--danger {
    background: #fef2f2 !important;
    border: 1px solid #fecaca !important;
    color: #dc2626 !important;
}
.table > tbody > tr > td > ob_link > .btn.ob-act--danger:hover,
.ob-actions .btn.ob-act--danger:hover {
    background: #fee2e2 !important;
    border-color: #fca5a5 !important;
    color: #b91c1c !important;
}

/* ---------- 表单页排版 ---------- */
/* 卡片式表单区块 */
.ob-form-section {
    background: var(--ob-surface);
    border: 1px solid var(--ob-border);
    border-radius: var(--ob-radius);
    box-shadow: var(--ob-shadow-sm);
    margin-bottom: 18px;
    overflow: hidden;
}
.ob-form-section__head {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 13px 20px;
    border-bottom: 1px solid var(--ob-border);
    font-size: 14px;
    font-weight: 600;
    color: var(--ob-text);
}
.ob-form-section__head i { color: var(--ob-primary); }
.ob-form-section__body { padding: 20px 20px 6px; }

/* 表单行：标签右对齐、控件占满，工整对齐
   注意：模板用的是 Bootstrap 栅格（label col-sm-2 + control col-sm-10），
   这里只做垂直节奏与对齐微调，不改宽度体系，避免破坏既有布局 */
.form-horizontal .form-group { margin-bottom: 16px; }
.form-horizontal .control-label {
    padding-top: 8px;
    font-weight: 500;
    color: var(--ob-text-sub);
}
/* 必填星号 */
.ob-required::after {
    content: " *";
    color: var(--ob-danger);
    font-weight: 700;
}
/* 表单里的说明文字 */
.ob-help {
    font-size: 12px;
    color: var(--ob-text-mute);
    margin-top: 5px;
    line-height: 1.5;
}

/* --------------------------------------------------------------------------
   自动生效：OneBase 表单页的统一结构是
     form_single > .box > .box-body > .row > .col-md-6 > .form-group
       <label>标题</label>
       <span class="">（辅助说明）</span>
       <input class="form-control">
   这里不逐页改模板，只用 CSS 把垂直节奏理顺：
   标签与说明收紧成一组，再与输入框留出间距。
   -------------------------------------------------------------------------- */
.form_single .form-group { margin-bottom: 20px; }
.form_single .form-group > label {
    display: block;
    margin-bottom: 2px;
    font-size: 13px;
    font-weight: 600;
    color: var(--ob-text);
}
/* 标签后的「（说明）」小字：弱化并紧贴标签 */
.form_single .form-group > label + span {
    display: block;
    margin-bottom: 7px;
    font-size: 12px;
    font-weight: 400;
    color: var(--ob-text-mute);
    line-height: 1.5;
}
/* 说明文字里常见的红色星号（必填提示）保持醒目 */
.form_single .form-group > label + span font[color="red"],
.form_single .form-group > label + span .text-red { color: var(--ob-danger); }
/* 表单控件与下方说明的间距 */
.form_single .form-group > .form-control + span { margin-top: 5px; }
/* 上传控件区域留白 */
.form_single .form-group .uploader,
.form_single .form-group .webuploader-container { margin-top: 2px; }

/* 表单底部操作条（吸底，长表单不用滚到底找按钮） */
.ob-form-actions {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 14px 20px;
    background: var(--ob-surface-2);
    border-top: 1px solid var(--ob-border);
    border-radius: 0 0 var(--ob-radius) var(--ob-radius);
}

/* ---------- 空状态 ---------- */
.ob-empty {
    padding: 56px 20px;
    text-align: center;
    color: var(--ob-text-mute);
    font-size: 13px;
}
.ob-empty i {
    display: block;
    font-size: 34px;
    margin-bottom: 12px;
    opacity: .45;
}
/* 空行兜底：OneBase 多个列表页用 <tr class="odd"><td colspan=N> 输出「暂无数据」，
   这里直接把它样式化成空状态，不必逐页改模板 */
.table > tbody > tr.odd > td[colspan] {
    padding: 52px 20px !important;
    text-align: center;
    color: var(--ob-text-mute);
    font-size: 13px;
    background: var(--ob-surface);
}

/* ---------- 自动生效的细节增强（无需改模板） ---------- */
/* 表格里的小图片（头像字段）自动变圆形头像 */
.table > tbody > tr > td > img {
    width: 32px;
    height: 32px;
    border-radius: 50%;
    object-fit: cover;
    border: 1px solid var(--ob-border);
    background: var(--ob-surface-2);
    vertical-align: middle;
}
/* 已有 admin-list-img-size 类的图片改为 40x40 圆角（商品图等） */
.table .admin-list-img-size {
    width: 40px !important;
    height: 40px !important;
    max-height: 40px !important;
    border-radius: var(--ob-radius-sm);
    object-fit: cover;
}
/* 数字统一等宽，便于纵向对齐比较 */
.table { font-variant-numeric: tabular-nums; }

/* 数据行更紧凑一点，长表格一屏看更多 */
.table > tbody > tr > td { padding-top: 10px; padding-bottom: 10px; }
.table > thead > tr > th { padding-top: 11px; padding-bottom: 11px; }

/* 卡片内直接放筛选表单的页面（search-form 不在 box-header 里的情况） */
.box > form > .row,
.box-body > form > .row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px;
}

/* ---------- 页面小标题（用于非卡片场景） ---------- */
.ob-title {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 15px;
    font-weight: 600;
    color: var(--ob-text);
    margin-bottom: 12px;
}
.ob-title i { color: var(--ob-primary); }

/* ==========================================================================
   8. 按钮
   ========================================================================== */

/* --------------------------------------------------------------------------
   按钮统一：先「归零」再按角色上色
   --------------------------------------------------------------------------
   后台同时加载了 Bootstrap 2 皮肤、Bootstrap 3、AdminLTE、amazeui 四套样式，
   它们对 .btn 各有定义（渐变、内阴影、文字阴影、不同圆角）。
   只覆盖颜色就会出现「有的按钮带渐变/阴影、有的没有」，看起来不统一。
   所以先把这些附加效果全部抹平，保证所有按钮都是「纯色 + 细边框 + 同圆角」。
   -------------------------------------------------------------------------- */
.content .btn,
.skin-blue .content .btn,
.skin-black .content .btn,
.skin-purple .content .btn,
.skin-green .content .btn,
.skin-red .content .btn,
.skin-yellow .content .btn {
    background-image: none !important;
    box-shadow: none !important;
    -webkit-box-shadow: none !important;
    text-shadow: none !important;
    filter: none !important;
}

/* 注意：这里刻意【只写 .content .btn】，不加 .skin-blue 等皮肤前缀
   ------------------------------------------------------------------
   theme.css 在 <head> 加载（必须早加载，否则整站会先渲染框架默认样式再切换，
   每页都闪一下）。而 ob_skin.css / AdminLTE.min.css / amazeui.min.css 在
   bottom.html 里加载 —— 文档顺序在我之后，同优先级时它们赢。
   ob_skin.css 的 `.skin-blue .content .btn { background:#3c8dbc }` 就是这样
   把按钮染成灰蓝色的。

   解法：基础规则用 !important（important 无视优先级，压过 ob_skin 的普通声明），
   但【权重保持最低的 0,2,0】—— 这样后面各变体（.btn-info / .box-header .btn /
   .ob-act--*）只要同权重且写在后面、或权重更高，就能自然覆盖它。

   反例（踩过的坑）：若基础规则写成 `.skin-blue .content .btn`（权重 0,3,0），
   它会反过来压住 `.box-header .btn`（0,2,0）和 `.ob-act`（0,2,5），
   导致「新增」按钮和行内操作按钮全部失效、退化成白色。 */
.content .btn {
    background: var(--ob-surface) !important;
    background-image: none !important;
    border: 1px solid var(--ob-border-2) !important;
    border-radius: var(--ob-radius-sm) !important;
    color: var(--ob-text-sub) !important;
    font-size: 13px;
    padding: 6px 14px;
    text-shadow: none !important;
    box-shadow: none !important;
    transition: background-color .15s ease, border-color .15s ease, color .15s ease;
}
.content .btn:hover,
.content .btn:focus {
    background: var(--ob-surface-2) !important;
    border-color: var(--ob-border-2) !important;
    color: var(--ob-text) !important;
}

/* 主色按钮 */
.content .btn-info,
.content .btn-primary {
    background: var(--ob-primary) !important;
    border-color: var(--ob-primary) !important;
    color: #fff !important;
}

/* --------------------------------------------------------------------------
   工具条主操作（新增 / 导出 / 备份…）→ 主色实心
   --------------------------------------------------------------------------
   判定依据是「位置」而非类名：列表页的工具条按钮都放在 .box-header 里，
   而数据行的操作按钮在 <td> 内。模板里两者都只写了裸 .btn，无法靠类名区分，
   所以用 .box-header .btn 统一上主色。
   这样「新增」与「搜索」都是同一套蓝色实心，视觉上一致且主次分明；
   数据行里的编辑/删除仍由 .ob-act--* 的高优先级规则覆盖，不受影响。
   -------------------------------------------------------------------------- */
.box-header .btn,
.box-footer .btn {
    background: var(--ob-primary) !important;
    border-color: var(--ob-primary) !important;
    color: #fff !important;
}
.box-header .btn:hover,
.box-header .btn:focus,
.box-footer .btn:hover,
.box-footer .btn:focus {
    background: var(--ob-primary-hover) !important;
    border-color: var(--ob-primary-hover) !important;
    color: #fff !important;
}
.content .btn-info:hover,
.content .btn-info:focus,
.content .btn-primary:hover,
.content .btn-primary:focus {
    background: var(--ob-primary-hover) !important;
    border-color: var(--ob-primary-hover) !important;
    color: #fff !important;
}

/* 危险 */
.content .btn-danger {
    background: var(--ob-danger) !important;
    border-color: var(--ob-danger) !important;
    color: #fff !important;
}
.content .btn-danger:hover,
.content .btn-danger:focus {
    background: #b91c1c !important;
    border-color: #b91c1c !important;
    color: #fff !important;
}

/* 成功 */
.content .btn-success {
    background: var(--ob-success) !important;
    border-color: var(--ob-success) !important;
    color: #fff !important;
}
.content .btn-success:hover,
.content .btn-success:focus {
    background: #15803d !important;
    border-color: #15803d !important;
    color: #fff !important;
}

/* 警告 */
.content .btn-warning {
    background: var(--ob-warning) !important;
    border-color: var(--ob-warning) !important;
    color: #fff !important;
}
.content .btn-warning:hover,
.content .btn-warning:focus {
    background: #b45309 !important;
    border-color: #b45309 !important;
    color: #fff !important;
}

/* 无边框按钮 */
.content .btn-frameless,
.skin-blue .content .btn-frameless,
.skin-black .content .btn-frameless {
    background: transparent !important;
    border-color: transparent !important;
    color: var(--ob-primary) !important;
    padding: 4px 6px;
}
.content .btn-frameless:hover {
    background: var(--ob-primary-soft) !important;
    color: var(--ob-primary-hover) !important;
}

/* 尺寸 */
.content .btn-xs { padding: 3px 9px; font-size: 12px; border-radius: 5px; }
.content .btn-sm { padding: 5px 12px; font-size: 13px; }
.content .btn-lg { padding: 9px 20px; font-size: 15px; }

/* ==========================================================================
   9. 表单
   ========================================================================== */

.form-control {
    border: 1px solid var(--ob-border-2);
    border-radius: var(--ob-radius-sm);
    box-shadow: none !important;
    color: var(--ob-text);
    font-size: 14px;
    height: 34px;
    padding: 5px 11px;
    transition: border-color .15s ease, box-shadow .15s ease;
    background-color: var(--ob-surface);
}
.form-control:focus,
.skin-blue .form-control:focus,
.skin-black .form-control:focus {
    border-color: var(--ob-primary) !important;
    box-shadow: 0 0 0 3px var(--ob-primary-soft) !important;
}
textarea.form-control { height: auto; }
.form-control::placeholder { color: var(--ob-text-mute); }

/* 输入框组 */
.input-group-addon {
    background: var(--ob-surface-2);
    border: 1px solid var(--ob-border-2);
    border-radius: var(--ob-radius-sm);
    color: var(--ob-text-sub);
    font-size: 13px;
}
.input-group .form-control:first-child { border-top-right-radius: 0; border-bottom-right-radius: 0; }
.input-group .form-control:last-child { border-top-left-radius: 0; border-bottom-left-radius: 0; }

/* 表单标签 */
.form-group > label,
.control-label { color: var(--ob-text-sub); font-weight: 500; }

/* 帮助文字 */
.help-block { color: var(--ob-text-mute); font-size: 12px; }

/* 复选框美化（保留原生行为，仅调色） */
input[type="checkbox"], input[type="radio"] { accent-color: var(--ob-primary); }

/* ==========================================================================
   10. 分页
   ========================================================================== */

.pagination > li > a,
.pagination > li > span {
    background: var(--ob-surface);
    border: 1px solid var(--ob-border) !important;
    color: var(--ob-text-sub);
    border-radius: var(--ob-radius-sm) !important;
    margin: 0 2px;
    padding: 6px 12px;
    font-size: 13px;
    transition: background-color .15s ease, color .15s ease, border-color .15s ease;
}
.pagination > li > a:hover,
.pagination > li > span:hover {
    background: var(--ob-primary-soft);
    border-color: var(--ob-primary-border) !important;
    color: var(--ob-primary);
}
/* 压过后台原来的 #777 !important */
.pagination > .active > a,
.pagination > .active > a:hover,
.pagination > .active > a:focus,
.pagination > .active > span,
.pagination > .active > span:hover,
.pagination > .active > span:focus {
    background-color: var(--ob-primary) !important;
    border-color: var(--ob-primary) !important;
    color: #fff !important;
}
.pagination > .disabled > a,
.pagination > .disabled > span {
    color: var(--ob-text-mute) !important;
    background: var(--ob-surface-2) !important;
}

/* ==========================================================================
   11. 标签页 / 徽标 / 提示
   ========================================================================== */

.nav-tabs-custom {
    border-radius: var(--ob-radius);
    box-shadow: var(--ob-shadow-sm);
    background: var(--ob-surface);
}
.nav-tabs-custom > .nav-tabs > li.active {
    border-top-color: var(--ob-primary) !important;
}
.nav-tabs-custom > .nav-tabs > li > a { color: var(--ob-text-sub); }
.nav-tabs-custom > .nav-tabs > li.active > a { color: var(--ob-text); font-weight: 600; }

.nav-tabs { border-bottom: 1px solid var(--ob-border); }
.nav-tabs > li > a {
    border-radius: var(--ob-radius-sm) var(--ob-radius-sm) 0 0;
    color: var(--ob-text-sub);
    border-color: transparent;
}
.nav-tabs > li > a:hover { background: var(--ob-surface-2); border-color: transparent; }
.nav-tabs > li.active > a,
.nav-tabs > li.active > a:hover,
.nav-tabs > li.active > a:focus {
    color: var(--ob-primary);
    border-color: var(--ob-border) var(--ob-border) transparent;
    font-weight: 600;
}

.label {
    border-radius: 999px;
    font-size: 11px;
    font-weight: 600;
    padding: 3px 9px;
    letter-spacing: .01em;
}
.label-success { background-color: var(--ob-success) !important; }
.label-danger  { background-color: var(--ob-danger)  !important; }
.label-warning { background-color: var(--ob-warning) !important; }
.label-info    { background-color: var(--ob-info)    !important; }
.label-default { background-color: #64748b !important; }

.alert {
    border-radius: var(--ob-radius);
    border-width: 1px;
    box-shadow: none;
}

/* 文字状态色（保持可读对比） */
.text-green { color: var(--ob-success) !important; }
.text-red   { color: var(--ob-danger)  !important; }
.text-muted { color: var(--ob-text-mute) !important; }

/* ==========================================================================
   12. 页脚
   ========================================================================== */

.main-footer {
    background: var(--ob-surface) !important;
    border-top: 1px solid var(--ob-border) !important;
    color: var(--ob-text-mute);
    font-size: 12px;
    padding: 14px 20px;
}
.main-footer strong { color: var(--ob-text-sub); font-weight: 600; }

/* ==========================================================================
   13. 仪表盘指标卡（首页 / 月报）
   ========================================================================== */

.info-box {
    background: var(--ob-surface);
    border: 1px solid var(--ob-border) !important;
    border-radius: var(--ob-radius);
    box-shadow: var(--ob-shadow-sm) !important;
    min-height: 90px;
    transition: box-shadow .18s ease, transform .18s ease;
}
.info-box:hover {
    box-shadow: var(--ob-shadow-md) !important;
    transform: translateY(-1px);
}
.info-box-icon {
    border-radius: var(--ob-radius) 0 0 var(--ob-radius) !important;
    font-size: 30px;
    line-height: 90px;
    height: 90px;
    width: 86px;
}
/* 用柔和底色 + 主色图标，替代原来的高饱和色块 */
.info-box-icon.bg-aqua,
.info-box-icon.bg-blue,
.info-box-icon.bg-light-blue {
    background: #eff6ff !important; color: #2563eb !important;
}
.info-box-icon.bg-green,
.info-box-icon.bg-olive {
    background: #f0fdf4 !important; color: #16a34a !important;
}
.info-box-icon.bg-yellow,
.info-box-icon.bg-orange {
    background: #fffbeb !important; color: #d97706 !important;
}
.info-box-icon.bg-red,
.info-box-icon.bg-maroon {
    background: #fef2f2 !important; color: #dc2626 !important;
}
.info-box-icon.bg-purple,
.info-box-icon.bg-navy {
    background: #f5f3ff !important; color: #7c3aed !important;
}
.info-box-content { padding: 10px 14px; margin-left: 86px; }
.info-box-text {
    color: var(--ob-text-sub);
    font-size: 13px;
    font-weight: 500;
    text-transform: none;
    white-space: normal;
}
.info-box-number {
    color: var(--ob-text);
    font-size: 20px;
    font-weight: 700;
    letter-spacing: -.02em;
}
.info-box-number small { color: var(--ob-text-mute); font-weight: 400; }

/* ==========================================================================
   14. 其他常用元素
   ========================================================================== */

/* 分隔线 */
hr { border-color: var(--ob-border); }

/* 代码 */
code {
    background: var(--ob-surface-2);
    border: 1px solid var(--ob-border);
    border-radius: 4px;
    color: #be185d;
    padding: 1px 5px;
}

/* 模态框 */
.modal-content {
    border: 0;
    border-radius: var(--ob-radius);
    box-shadow: 0 20px 40px rgba(15, 23, 42, .18);
}
.modal-header { border-bottom: 1px solid var(--ob-border); padding: 16px 20px; }
.modal-body { padding: 20px; }
.modal-footer { border-top: 1px solid var(--ob-border); padding: 14px 20px; }

/* remodal */
.remodal {
    border-radius: var(--ob-radius);
    box-shadow: 0 20px 40px rgba(15, 23, 42, .18);
}

/* 下拉选择器 */
.dropdown-menu {
    border: 1px solid var(--ob-border);
    border-radius: var(--ob-radius);
    box-shadow: var(--ob-shadow-md);
}
.dropdown-menu > li > a { border-radius: var(--ob-radius-sm); color: var(--ob-text-sub); }
.dropdown-menu > li > a:hover { background: var(--ob-primary-soft); color: var(--ob-primary); }

/* select2 对齐主题 */
.select2-container--default .select2-selection--single,
.select2-container--default .select2-selection--multiple {
    border: 1px solid var(--ob-border-2);
    border-radius: var(--ob-radius-sm);
}
.select2-container--default.select2-container--focus .select2-selection--single,
.select2-container--default .select2-selection--single:focus {
    border-color: var(--ob-primary);
}

/* 图标选择器 */
.js-icon-list li { border-color: var(--ob-border); border-radius: var(--ob-radius-sm); }
.js-icon-list li:hover { background: var(--ob-primary-soft); border-color: var(--ob-primary-border); }

/* 搜索输入框（onebase.css 单独定义过，这里对齐主题） */
.search-input {
    border: 1px solid var(--ob-border-2) !important;
    border-radius: var(--ob-radius-sm) !important;
    box-shadow: none !important;
    color: var(--ob-text) !important;
}
.search-input:focus {
    border-color: var(--ob-primary) !important;
    box-shadow: 0 0 0 3px var(--ob-primary-soft) !important;
}

/* 树形结构 */
.admin-node-label { color: var(--ob-text-sub); }

/* ==========================================================================
   15. 登录页（独立页面，不走 layout.html，但同样 include 了 top/bottom，
       因此 theme.css 与思源字体已自动生效）
   ========================================================================== */

/* 背景：深色渐变兜底（canvas 粒子动画叠在其上）。
   原样式是纯黑 + 半透明卡片，观感偏旧；这里换成与侧边栏同色系的深蓝渐变。 */
.admin-login-body-background {
    background: linear-gradient(135deg, #1e1b4b 0%, #0f172a 55%, #111827 100%) !important;
    min-height: 100vh;
}
/* canvas 固定铺满，避免随滚动错位 */
.login-page > canvas {
    position: fixed;
    inset: 0;
    z-index: 0;
    pointer-events: none;
}

/* 卡片 */
.admin-login-box {
    background: var(--ob-surface);
    border-radius: 16px;
    box-shadow: 0 24px 60px rgba(2, 6, 23, .45), 0 2px 8px rgba(2, 6, 23, .2);
    opacity: 1 !important;
    padding: 0;
    width: 400px;
    margin-left: -200px;
    top: 9%;
    z-index: 2;
    overflow: hidden;
}

/* 品牌区 */
.ob-login__brand {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    padding: 30px 26px 6px;
}
.ob-login__mark {
    width: 42px; height: 42px;
    border-radius: 12px;
    display: flex; align-items: center; justify-content: center;
    background: linear-gradient(135deg, #6366f1, #4f46e5);
    color: #fff;
    font-size: 19px;
    box-shadow: 0 6px 16px rgba(99, 102, 241, .35);
}
.ob-login__title {
    font-size: 21px;
    font-weight: 700;
    color: var(--ob-text);
    letter-spacing: .02em;
}
.ob-login__sub {
    text-align: center;
    font-size: 13px;
    color: var(--ob-text-mute);
    padding: 8px 26px 22px;
    margin: 0;
}

/* 表单主体 */
.admin-login-box .login-box-body {
    padding: 0 30px 28px;
}
.admin-login-form .form-group {
    margin-bottom: 14px;
    position: relative;
}
/* 输入框前置图标：放进控件内部，替代原来靠右的 feedback 图标 */
.ob-login__field { position: relative; }
.ob-login__field > i {
    position: absolute;
    left: 13px; top: 50%;
    transform: translateY(-50%);
    color: var(--ob-text-mute);
    font-size: 14px;
    pointer-events: none;
}
.ob-login__field .form-control {
    height: 44px;
    padding-left: 38px;
    font-size: 14px;
    border-radius: 9px;
    border: 1px solid var(--ob-border-2);
    background: var(--ob-surface-2);
}
.ob-login__field .form-control:focus {
    background: var(--ob-surface);
    border-color: var(--ob-primary);
    box-shadow: 0 0 0 3px rgba(99, 102, 241, .15) !important;
}

/* 验证码：图片整行显示，下方一行放「换一张」+ 输入框
   注意：captcha_src() 生成的图片是 320×80，卡片只有 400px 宽，
   所以不能用「图片 + 输入框」左右并排（会被压扁或裁掉字符）。
   改为图片占满整行、按原比例缩放。 */
.ob-login__captcha {
    margin-bottom: 12px;
}
.ob-login__captcha-img {
    display: block;
    width: 100%;
    height: 62px;              /* 320×80 等比缩放后的高度 */
    border-radius: 9px;
    border: 1px solid var(--ob-border);
    cursor: pointer;
    object-fit: contain;       /* 完整显示，不裁切字符 */
    background: var(--ob-surface-2);
}
/* 验证码输入行：输入框 + 换一张按钮 */
.ob-login__captcha-row {
    display: flex;
    gap: 10px;
    align-items: stretch;
    margin-bottom: 16px;
}
.ob-login__captcha-row .ob-login__field { flex: 1 1 auto; min-width: 0; }
/* 兼容模板里原有的类名 */
.admin-login-captcha-img {
    border-radius: 9px;
    cursor: pointer;
    border: 1px solid var(--ob-border);
    background: var(--ob-surface-2);
}

/* 登录按钮 */
.admin-login-box .login-submit-button {
    height: 46px;
    border: 0;
    border-radius: 9px;
    background: linear-gradient(135deg, #6366f1, #4f46e5) !important;
    color: #fff !important;
    font-size: 15px;
    font-weight: 600;
    letter-spacing: .16em;
    box-shadow: 0 8px 20px rgba(99, 102, 241, .3);
    transition: box-shadow .18s ease, transform .18s ease, opacity .18s ease;
}
.admin-login-box .login-submit-button:hover,
.admin-login-box .login-submit-button:focus {
    opacity: .94;
    box-shadow: 0 10px 24px rgba(99, 102, 241, .4);
}
.admin-login-box .login-submit-button:active { transform: translateY(1px); }

/* 「换一张」按钮：低调的次要按钮 */
.ob-login__refresh {
    flex: 0 0 auto;
    height: 44px;
    padding: 0 14px;
    border-radius: 9px;
    border: 1px solid var(--ob-border-2);
    background: var(--ob-surface);
    color: var(--ob-text-sub);
    font-size: 13px;
    white-space: nowrap;
    cursor: pointer;
    transition: background-color .15s ease, color .15s ease;
}
.ob-login__refresh:hover {
    background: var(--ob-surface-2);
    color: var(--ob-primary);
    border-color: var(--ob-primary-border);
}

/* 底部版权 */
.ob-login__foot {
    text-align: center;
    font-size: 12px;
    color: var(--ob-text-mute);
    padding: 0 26px 22px;
}

/* 窄屏适配 */
@media (max-width: 460px) {
    .admin-login-box {
        width: 92%;
        left: 4%;
        margin-left: 0;
        top: 6%;
    }
    /* 窄屏：验证码输入行改成上下排列，避免输入框被挤窄 */
    .ob-login__captcha-row { flex-wrap: wrap; }
    .ob-login__captcha-row .ob-login__refresh { flex: 1 1 100%; }
    .admin-login-box .login-box-body { padding: 0 20px 22px; }
}

/* ==========================================================================
   16. 月报同步横幅（配合 report_monthly.html 的自定义配色）
   ========================================================================== */

/* 让横幅里的按钮沿用主题按钮规范（保留横幅自身的红/绿语义按钮） */
.content .alert .btn { box-shadow: none; }
