/* .grid__actions__>span{
    font-size: 12px !important;
    display:inline-block !important;
    padding:0 !important;
    margin-right:5px;
} */
.btn-style{
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    padding: 0 .35rem !important;
    margin: 0 .12rem .12rem 0;
    font-size: 11px;
    height: 1.55rem;
    min-height: 1.55rem;
    line-height: 1 !important;
    box-sizing: border-box;
    vertical-align: middle;
}
.btn-style i,
.btn-style .feather {
    line-height: 1 !important;
    display: inline-flex !important;
    align-items: center !important;
}
/* 操作列：可换行收窄（旧版 120px 锁死 / max-content 撑半屏均禁止） */
/* 固定列已从「复制三张表」改为单表格 + position:sticky，
   原先的 .table-wrap.table-fixed-right 选择器已无对应节点，换成 [data-fix="right"] */
.table-collapse .custom-data-table td.grid__actions__,
.table-collapse .custom-data-table th.grid__actions__,
.dcat-box .tables-container-sticky td[data-fix="right"],
.dcat-box .tables-container-sticky th[data-fix="right"] {
    width: auto !important;
    min-width: 0 !important;
    max-width: min(32vw, 320px) !important;
    box-sizing: border-box !important;
}

/* ========== Grid 固定列：单表格 + position:sticky（对齐 antd Table 的做法） ==========

   Dcat 原实现把表格渲染成三张独立 <table>（主表/左固定/右固定），三张表对不齐
   只能靠 JS 逐行同步行高，那是「写 style → 读 offsetHeight → 再写 style」的强制
   同步布局，每行触发一次整文档重排。实测会员列表一次导航因此多花 800ms。

   现在只渲染一张表（见 resources/views/admin/grid/fixed-table.blade.php），
   需要固定的列打 data-fix="left|right"，由下面的 sticky 规则完成固定。
   左右偏移量由 admin-grid-sticky.js 读一次表头写成 CSS 变量（O(列数)，与行数无关）。

   背景色说明：sticky 单元格必须不透明，否则横滑时下层内容会透出来。
   三档：中间列白 → 固定列默认稍深（#f2f5f9，介于白与悬停色）→ 行悬停/选中整行最深 #e8eef5。 */

.tables-container-sticky th[data-fix],
.tables-container-sticky td[data-fix] {
    position: sticky;
    z-index: 2;
    /* 固定列默认：白与选中色中间 */
    background-color: #f2f5f9 !important;
}

/* 表头本身可能同时吸顶，层级要压过普通固定列 */
.tables-container-sticky thead th[data-fix] {
    z-index: 4;
}

/* 左右偏移：变量由 JS 量一次表头写在容器上；最多支持 4 列，够用且不产生 JS 逐行写样式 */
.tables-container-sticky [data-fix="left"][data-fix-index="0"]  { left: 0; }
.tables-container-sticky [data-fix="left"][data-fix-index="1"]  { left: var(--fix-left-1, 0px); }
.tables-container-sticky [data-fix="left"][data-fix-index="2"]  { left: var(--fix-left-2, 0px); }
.tables-container-sticky [data-fix="left"][data-fix-index="3"]  { left: var(--fix-left-3, 0px); }
.tables-container-sticky [data-fix="right"][data-fix-index="0"] { right: 0; }
.tables-container-sticky [data-fix="right"][data-fix-index="1"] { right: var(--fix-right-1, 0px); }
.tables-container-sticky [data-fix="right"][data-fix-index="2"] { right: var(--fix-right-2, 0px); }
.tables-container-sticky [data-fix="right"][data-fix-index="3"] { right: var(--fix-right-3, 0px); }

/* 中间列 / 行：统一白底；悬停加深到选中色 */
.tables-container-sticky tbody tr,
.tables-container-sticky thead tr,
.tables-container-sticky .table-striped tbody tr:nth-child(even) {
    background-color: #fff;
}
.tables-container-sticky tbody tr:hover,
.tables-container-sticky tbody tr.active {
    background-color: #e8eef5;
}
/* 悬停/选中：固定列与中间列同为最深色 */
.tables-container-sticky tbody tr:hover th[data-fix],
.tables-container-sticky tbody tr:hover td[data-fix],
.tables-container-sticky tbody tr.active th[data-fix],
.tables-container-sticky tbody tr.active td[data-fix] {
    background-color: #e8eef5 !important;
}

/* 固定列边缘分隔：始终可见（不依赖横向滚动）。用 ::after/::before 画竖线+阴影，
   避免被后面「表头吸顶」的 box-shadow: 0 1px 0 盖掉。 */
.tables-container-sticky [data-fix="left"][data-fix-edge],
.tables-container-sticky [data-fix="right"][data-fix-edge] {
    overflow: visible !important;
}
.tables-container-sticky [data-fix="left"][data-fix-edge]::after {
    content: '';
    position: absolute;
    top: 0;
    right: -1px;
    bottom: 0;
    width: 10px;
    pointer-events: none;
    z-index: 3;
    background: linear-gradient(to right, #b8c0d4 0, #b8c0d4 1px, rgba(15, 23, 42, 0.16) 1px, transparent 100%);
}
.tables-container-sticky [data-fix="right"][data-fix-edge]::before {
    content: '';
    position: absolute;
    top: 0;
    left: -1px;
    bottom: 0;
    width: 10px;
    pointer-events: none;
    z-index: 3;
    transform: translateX(-100%);
    background: linear-gradient(to left, #b8c0d4 0, #b8c0d4 1px, rgba(15, 23, 42, 0.16) 1px, transparent 100%);
}
/* 横向还能再滚时，加深阴影 */
.tables-container-sticky.has-fix-shadow-left [data-fix="left"][data-fix-edge]::after {
    width: 14px;
    background: linear-gradient(to right, #9aa6c0 0, #9aa6c0 1px, rgba(15, 23, 42, 0.22) 1px, transparent 100%);
}
.tables-container-sticky.has-fix-shadow-right [data-fix="right"][data-fix-edge]::before {
    width: 14px;
    background: linear-gradient(to left, #9aa6c0 0, #9aa6c0 1px, rgba(15, 23, 42, 0.22) 1px, transparent 100%);
}
.dark-mode .tables-container-sticky [data-fix="left"][data-fix-edge]::after {
    background: linear-gradient(to right, #6a6a8a 0, #6a6a8a 1px, rgba(0, 0, 0, 0.45) 1px, transparent 100%);
}
.dark-mode .tables-container-sticky [data-fix="right"][data-fix-edge]::before {
    background: linear-gradient(to left, #6a6a8a 0, #6a6a8a 1px, rgba(0, 0, 0, 0.45) 1px, transparent 100%);
}

.dark-mode .tables-container-sticky tbody tr,
.dark-mode .tables-container-sticky thead tr,
.dark-mode .tables-container-sticky .table-striped tbody tr:nth-child(even) {
    background-color: #2c2c43;
}
.dark-mode .tables-container-sticky th[data-fix],
.dark-mode .tables-container-sticky td[data-fix] {
    background-color: #32324b !important;
}
.dark-mode .tables-container-sticky tbody tr:hover,
.dark-mode .tables-container-sticky tbody tr.active {
    background-color: #3a3a57;
}
.dark-mode .tables-container-sticky tbody tr:hover th[data-fix],
.dark-mode .tables-container-sticky tbody tr:hover td[data-fix],
.dark-mode .tables-container-sticky tbody tr.active th[data-fix],
.dark-mode .tables-container-sticky tbody tr.active td[data-fix] {
    background-color: #3a3a57 !important;
}

/* ========== 会员列表「联系信息」列的行内编辑弹层 ==========
   原先内联在 user-contact-info.blade.php 的 @once 块里，但 Column::view() 每行
   都是一次顶层渲染、@once 记录会被 flush，导致同一份样式被逐行重复输出。挪到这里只加载一份。 */
.user-contact-info__item { line-height: 1.9; white-space: nowrap; }
.user-contact-info__label { color: #8a8f99; display: inline-block; min-width: 56px; }
.user-contact-editable[data-editinline="popover"] { border-bottom: dashed 1px #4c8bf5; color: #3478e5; display: inline-block; }
.dark-mode .user-contact-editable[data-editinline="popover"] { color: #8db7ff; border-color: #8db7ff; }
.user-contact-ie-popover { position: fixed !important; top: 28vh !important; left: 50% !important; transform: translateX(-50%) !important; z-index: 1060; min-width: 280px; }
.user-contact-ie-popover .ie-input { min-width: 240px; }

/* ========== 列表骨架屏：pjax 等待期间让「在加载」可见 ========== */
.admin-grid-skeleton {
    position: relative;
}
.admin-grid-skeleton > * {
    opacity: .45;
    transition: opacity .12s ease;
}
.admin-grid-skeleton::after {
    content: '';
    position: absolute;
    inset: 0;
    z-index: 10;
    cursor: progress;
    background-image: linear-gradient(90deg, rgba(0, 0, 0, .045) 25%, rgba(0, 0, 0, .075) 37%, rgba(0, 0, 0, .045) 63%);
    background-size: 400% 100%;
    animation: admin-grid-skeleton-sweep 1.2s ease-in-out infinite;
}
@keyframes admin-grid-skeleton-sweep {
    0%   { background-position: 100% 50%; }
    100% { background-position: 0 50%; }
}
@media (prefers-reduced-motion: reduce) {
    .admin-grid-skeleton::after { animation: none; }
}

/* ========== 后台内容区：去掉列表/表单四周灰边距 ========== */
/* Dcat 默认 .content-wrapper 左右 35px 即侧栏旁灰带 */
.app-content .content-wrapper {
    padding-left: 0 !important;
    padding-right: 0 !important;
}
.app-content .content-body {
    padding: 0 !important;
    margin: 0 !important;
}
.app-content .content-body > .row {
    margin-left: 0 !important;
    margin-right: 0 !important;
}
.app-content .content-body > .row > [class*="col-"] {
    padding-left: 0 !important;
    padding-right: 0 !important;
}
.app-content .content-body .dcat-box,
.app-content .content-body .card {
    margin-bottom: 0 !important;
    border-radius: 0 !important;
}

/* ========== 后台 Grid 列表：顶底固定 + 上下压缩 ========== */
/* :has() 让列表首屏无需等 JS 加类即可固定底部分页 */
html.admin-grid-sticky-on,
html:has(.content-body .dcat-box table.custom-data-table),
html.admin-grid-sticky-on body,
html:has(.content-body .dcat-box table.custom-data-table) body,
body.admin-grid-sticky,
body:has(.content-body .dcat-box table.custom-data-table) {
    overflow: hidden !important;
    height: 100% !important;
    max-height: 100% !important;
}
body.admin-grid-sticky .wrapper,
body:has(.content-body .dcat-box table.custom-data-table) .wrapper,
body.admin-grid-sticky .app-content.content,
body:has(.content-body .dcat-box table.custom-data-table) .app-content.content,
body.admin-grid-sticky .app-content,
body:has(.content-body .dcat-box table.custom-data-table) .app-content {
    overflow: hidden !important;
    height: 100% !important;
    max-height: 100% !important;
}
body.admin-grid-sticky .main-footer,
body:has(.content-body .dcat-box table.custom-data-table) .main-footer {
    display: none !important;
}
body.admin-grid-sticky .btn.scroll-top,
body:has(.content-body .dcat-box table.custom-data-table) .btn.scroll-top {
    bottom: 12px !important;
}
/*
 * Dcat 默认 .navbar-fixed-top .content-wrapper{padding-top:6.4rem} 远大于实际顶栏，
 * 会在顶栏与「余额宝记录」标题之间露出灰/白横带。列表页改为：顶距=实测顶栏高，padding-top=0。
 */
body.admin-grid-sticky .app-content.content,
body:has(.content-body .dcat-box table.custom-data-table) .app-content.content,
body.admin-grid-sticky .app-content,
body:has(.content-body .dcat-box table.custom-data-table) .app-content {
    padding-top: 0 !important;
    margin-top: 0 !important;
}
body.admin-grid-sticky .header-navbar-shadow,
body:has(.content-body .dcat-box table.custom-data-table) .header-navbar-shadow {
    display: none !important;
}
/* 列表页顶栏：实心白底，去掉渐变拖出的透明「假高度」 */
body.admin-grid-sticky .header-navbar,
body:has(.content-body .dcat-box table.custom-data-table) .header-navbar {
    background: #fff !important;
    background-image: none !important;
    box-shadow: 0 1px 0 #ececf0 !important;
    padding-bottom: 0 !important;
    margin-bottom: 0 !important;
}
body.admin-grid-sticky .content-wrapper,
body:has(.content-body .dcat-box table.custom-data-table) .content-wrapper,
body.navbar-fixed-top.admin-grid-sticky .content-wrapper,
body.navbar-fixed-top:has(.content-body .dcat-box table.custom-data-table) .content-wrapper {
    min-height: 0 !important;
    height: var(--admin-grid-body-h, calc(100vh - var(--admin-navbar-h, 60px))) !important;
    max-height: var(--admin-grid-body-h, calc(100vh - var(--admin-navbar-h, 60px))) !important;
    overflow: hidden !important;
    display: flex !important;
    flex-direction: column !important;
    /* 覆盖 Dcat padding-top:6.4rem / 7rem，避免顶栏下灰带 */
    padding: 0 !important;
    margin-top: var(--admin-navbar-h, 60px) !important;
    margin-bottom: 0 !important;
    top: 0 !important;
}
/* 顶部：标题 + 面包屑（贴住顶栏下沿；白底避免被看成灰带空隙） */
body.admin-grid-sticky .content-header,
body:has(.content-body .dcat-box table.custom-data-table) .content-header {
    flex: 0 0 auto !important;
    padding: 0.1rem 0.5rem !important;
    margin: 0 !important;
    background: #fff !important;
    border-bottom: 1px solid #ececf0;
    z-index: 40;
}
body.admin-grid-sticky .content-header .content-header,
body:has(.content-body .dcat-box table.custom-data-table) .content-header .content-header,
body.admin-grid-sticky .content-header .breadcrumbs-top,
body:has(.content-body .dcat-box table.custom-data-table) .content-header .breadcrumbs-top {
    margin: 0 !important;
    padding: 0 !important;
}
body.admin-grid-sticky .content-header h1,
body:has(.content-body .dcat-box table.custom-data-table) .content-header h1 {
    font-size: 1.05rem !important;
    line-height: 1.25 !important;
    margin: 0 !important;
    padding: 0 !important;
}
body.admin-grid-sticky .content-header h1 small,
body:has(.content-body .dcat-box table.custom-data-table) .content-header h1 small {
    font-size: 0.75rem !important;
}
body.admin-grid-sticky .content-header .breadcrumb,
body:has(.content-body .dcat-box table.custom-data-table) .content-header .breadcrumb {
    margin: 0 !important;
    padding: 0 !important;
    font-size: 0.75rem !important;
}
body.admin-grid-sticky .content-body,
body:has(.content-body .dcat-box table.custom-data-table) .content-body {
    flex: 1 1 auto !important;
    min-height: 0 !important;
    overflow: hidden !important;
    display: flex !important;
    flex-direction: column !important;
    padding: 0 !important;
    margin: 0 !important;
}
body.admin-grid-sticky .content-body > .row,
body:has(.content-body .dcat-box table.custom-data-table) .content-body > .row {
    flex: 1 1 auto !important;
    min-height: 0 !important;
    margin: 0 !important;
    display: flex !important;
}
body.admin-grid-sticky .content-body > .row > [class*="col-"],
body:has(.content-body .dcat-box table.custom-data-table) .content-body > .row > [class*="col-"] {
    flex: 1 1 auto !important;
    min-height: 0 !important;
    max-width: 100% !important;
    display: flex !important;
    flex-direction: column !important;
    padding-left: 0 !important;
    padding-right: 0 !important;
}
body.admin-grid-sticky .content-body .dcat-box,
body:has(.content-body .dcat-box table.custom-data-table) .content-body .dcat-box {
    flex: 1 1 auto !important;
    min-height: 0 !important;
    display: flex !important;
    flex-direction: column !important;
    margin-bottom: 0 !important;
    box-shadow: none !important;
}
/* 工具栏压缩 */
body.admin-grid-sticky .custom-data-table-header,
body:has(.content-body .dcat-box table.custom-data-table) .custom-data-table-header {
    flex: 0 0 auto !important;
    padding: 0.15rem 0.25rem !important;
    margin: 0 !important;
    background: #fff;
    z-index: 35;
    border-bottom: 1px solid #f0f0f0;
}
/* 列表顶栏：刷新/筛选/列选择/新增 等文字与图标在框内居中 */
body.admin-grid-sticky .custom-data-table-header .btn,
body:has(.content-body .dcat-box table.custom-data-table) .custom-data-table-header .btn,
body.admin-grid-sticky .custom-data-table-header .btn-group > .btn,
body:has(.content-body .dcat-box table.custom-data-table) .custom-data-table-header .btn-group > .btn,
.custom-data-table-header .btn,
.custom-data-table-header .btn-group > .btn,
.custom-data-table-header .dropdown-toggle {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    gap: 0.2rem !important;
    padding: 0.2rem 0.45rem !important;
    font-size: 12px !important;
    line-height: 1.2 !important;
    min-height: 28px !important;
    height: auto !important;
    box-sizing: border-box !important;
    vertical-align: middle !important;
}
body.admin-grid-sticky .custom-data-table-header .btn i,
body:has(.content-body .dcat-box table.custom-data-table) .custom-data-table-header .btn i,
body.admin-grid-sticky .custom-data-table-header .btn .feather,
body:has(.content-body .dcat-box table.custom-data-table) .custom-data-table-header .btn .feather,
.custom-data-table-header .btn i,
.custom-data-table-header .btn .feather,
.custom-data-table-header .btn svg {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    line-height: 1 !important;
    margin: 0 !important;
    vertical-align: middle !important;
    position: relative !important;
    top: 0 !important;
}
.custom-data-table-header a.btn > .btn {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    margin: 0 !important;
    border: 0 !important;
    background: transparent !important;
    box-shadow: none !important;
    padding: 0 !important;
    min-height: 0 !important;
    line-height: inherit !important;
    font-size: inherit !important;
    color: inherit !important;
}
body.admin-grid-sticky .custom-data-table-header .quick-search,
body:has(.content-body .dcat-box table.custom-data-table) .custom-data-table-header .quick-search,
body.admin-grid-sticky .custom-data-table-header input.form-control,
body:has(.content-body .dcat-box table.custom-data-table) .custom-data-table-header input.form-control {
    height: 28px !important;
    min-height: 28px !important;
    padding-top: 0.15rem !important;
    padding-bottom: 0.15rem !important;
    font-size: 12px !important;
}
body.admin-grid-sticky .filter-box,
body:has(.content-body .dcat-box table.custom-data-table) .filter-box {
    flex: 0 0 auto !important;
    margin-bottom: 0.25rem !important;
}
body.admin-grid-sticky .filter-box .card-body,
body:has(.content-body .dcat-box table.custom-data-table) .filter-box .card-body,
body.admin-grid-sticky .filter-box .box-body,
body:has(.content-body .dcat-box table.custom-data-table) .filter-box .box-body {
    padding: 0.4rem 0.6rem !important;
}
/* 中间：父层/固定列禁止竖滚，仅 table-main 一条竖条 */
body.admin-grid-sticky .dcat-box > .table-responsive.table-wrapper,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box > .table-responsive.table-wrapper,
body.admin-grid-sticky .dcat-box > .table-responsive,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box > .table-responsive {
    flex: 1 1 auto !important;
    min-height: 0 !important;
    overflow: hidden !important;
    overflow-x: hidden !important;
    overflow-y: hidden !important;
    margin: 0 !important;
    scrollbar-width: none !important;
}
body.admin-grid-sticky .dcat-box > .table-responsive.table-wrapper::-webkit-scrollbar,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box > .table-responsive.table-wrapper::-webkit-scrollbar,
body.admin-grid-sticky .dcat-box > .table-responsive::-webkit-scrollbar,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box > .table-responsive::-webkit-scrollbar {
    width: 0 !important;
    height: 0 !important;
    display: none !important;
}
body.admin-grid-sticky .dcat-box .tables-container,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .tables-container {
    height: 100% !important;
    min-height: 0 !important;
    /* Dcat FixColumns 注入的 margin-top:12px 会把 table-main 整体下移 12px，
       使其底部横滚条落到 table-responsive(overflow:hidden) 的裁切线之外、被底栏盖住。
       归零后横滚条回到裁切区内、与底栏齐平可见。 */
    margin-top: 0 !important;
    overflow: hidden !important;
    overflow-x: hidden !important;
    overflow-y: hidden !important;
    scrollbar-width: none !important;
}
body.admin-grid-sticky .dcat-box .tables-container::-webkit-scrollbar,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .tables-container::-webkit-scrollbar {
    width: 0 !important;
    height: 0 !important;
    display: none !important;
}
body.admin-grid-sticky .dcat-box .table-wrap.table-main,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .table-wrap.table-main {
    height: 100% !important;
    max-height: none !important;
    overflow: auto !important;
    overflow-x: auto !important;
    overflow-y: auto !important;
    scrollbar-gutter: stable;
    scrollbar-width: auto !important;
}
/* 主表按内容撑开：列一次展不全时底栏出现横滑 */
body.admin-grid-sticky .dcat-box .table-wrap.table-main > table.custom-data-table,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .table-wrap.table-main > table.custom-data-table {
    width: max-content !important;
    min-width: 100% !important;
    table-layout: auto !important;
}
body.admin-grid-sticky .dcat-box .table-wrap.table-main th:not(.grid__actions__),
body.admin-grid-sticky .dcat-box .table-wrap.table-main td:not(.grid__actions__),
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .table-wrap.table-main th:not(.grid__actions__),
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .table-wrap.table-main td:not(.grid__actions__) {
    white-space: nowrap !important;
}
/* 环境版本：覆盖主表 nowrap，列宽约为原上限的 3/5，优先在 · 处折行 */
body.admin-grid-sticky .dcat-box .table-wrap.table-main td:has(.pj-env-versions),
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .table-wrap.table-main td:has(.pj-env-versions) {
    white-space: normal !important;
    word-break: break-word !important;
    overflow-wrap: anywhere !important;
    max-width: min(24vw, 13rem) !important;
    min-width: 8rem !important;
    vertical-align: top !important;
}
.dcat-box .pj-env-versions {
    max-width: 100%;
    white-space: normal;
    word-break: break-word;
    overflow-wrap: anywhere;
    line-height: 1.35;
}
/* 时间列：创建/更新合并展示，允许换行 */
body.admin-grid-sticky .dcat-box .table-wrap.table-main td:has(.pj-time-col),
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .table-wrap.table-main td:has(.pj-time-col) {
    white-space: normal !important;
    vertical-align: top !important;
}
.dcat-box .pj-time-col {
    white-space: normal;
    line-height: 1.35;
    min-width: 9.5rem;
}
.dcat-box .pj-time-col .text-muted {
    font-size: 12px;
}
/* 域名列：A / CNAME 合并展示，允许换行 */
body.admin-grid-sticky .dcat-box .table-wrap.table-main td:has(.pj-domain-col),
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .table-wrap.table-main td:has(.pj-domain-col) {
    white-space: normal !important;
    word-break: break-word !important;
    overflow-wrap: anywhere !important;
    vertical-align: top !important;
    max-width: min(28vw, 16rem) !important;
    min-width: 8rem !important;
}
.dcat-box .pj-domain-col {
    max-width: 100%;
    white-space: normal;
    word-break: break-all;
    overflow-wrap: anywhere;
    line-height: 1.55;
}
.dcat-box .pj-domain-col .text-muted {
    font-size: 12px;
}
body.admin-grid-sticky .dcat-box .table-wrap.table-main::-webkit-scrollbar,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .table-wrap.table-main::-webkit-scrollbar {
    width: 12px !important;
    height: 12px !important;
    display: block !important;
}
/* 显式横轨：隐藏原生横条；显式竖轨：隐藏原生竖条（竖条改到操作列右侧自定义轨）。 */
body.admin-grid-sticky .dcat-box.has-admin-grid-hscroll:not(.has-admin-grid-vscroll) .table-wrap.table-main::-webkit-scrollbar,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box.has-admin-grid-hscroll:not(.has-admin-grid-vscroll) .table-wrap.table-main::-webkit-scrollbar {
    width: 12px !important;
    height: 0 !important;
}
body.admin-grid-sticky .dcat-box.has-admin-grid-vscroll:not(.has-admin-grid-hscroll) .table-wrap.table-main::-webkit-scrollbar,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box.has-admin-grid-vscroll:not(.has-admin-grid-hscroll) .table-wrap.table-main::-webkit-scrollbar {
    width: 0 !important;
    height: 12px !important;
}
body.admin-grid-sticky .dcat-box.has-admin-grid-hscroll.has-admin-grid-vscroll .table-wrap.table-main::-webkit-scrollbar,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box.has-admin-grid-hscroll.has-admin-grid-vscroll .table-wrap.table-main::-webkit-scrollbar {
    width: 0 !important;
    height: 0 !important;
}
body.admin-grid-sticky .dcat-box.has-admin-grid-hscroll.has-admin-grid-vscroll .table-wrap.table-main,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box.has-admin-grid-hscroll.has-admin-grid-vscroll .table-wrap.table-main {
    scrollbar-width: none !important;
}
/* 始终可见的底部横滑轨：铺满 dcat-box（含右固定操作列下方），不因固定列预留内缩。 */
body.admin-grid-sticky .dcat-box > .admin-grid-hscroll,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box > .admin-grid-hscroll {
    position: relative;
    flex: 0 0 16px;
    width: 100% !important;
    max-width: none !important;
    height: 16px;
    min-height: 16px;
    margin: 0 !important;
    margin-left: 0 !important;
    margin-right: 0 !important;
    padding: 2px 3px;
    overflow: hidden;
    background: #e5e7eb;
    border-top: 1px solid #d1d5db;
    border-bottom: 1px solid #d1d5db;
    box-sizing: border-box;
    cursor: ew-resize;
    z-index: 60;
    touch-action: none;
}
body.admin-grid-sticky .dcat-box > .admin-grid-hscroll > .admin-grid-hscroll-thumb,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box > .admin-grid-hscroll > .admin-grid-hscroll-thumb {
    display: block;
    height: 10px;
    min-width: 48px;
    border-radius: 5px;
    background: #7c8798;
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.12);
    cursor: grab;
    will-change: transform;
}
body.admin-grid-sticky .dcat-box > .admin-grid-hscroll > .admin-grid-hscroll-thumb:active,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box > .admin-grid-hscroll > .admin-grid-hscroll-thumb:active {
    cursor: grabbing;
    background: #596579;
}
/* 操作列右侧自定义竖轨（在固定操作列之后 / 最外沿） */
body.admin-grid-sticky .dcat-box .tables-container,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .tables-container {
    position: relative;
}
body.admin-grid-sticky .dcat-box .tables-container > .admin-grid-vscroll,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .tables-container > .admin-grid-vscroll {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    width: 12px;
    z-index: 40;
    margin: 0;
    padding: 2px 1px;
    overflow: hidden;
    background: #e5e7eb;
    border-left: 1px solid #d1d5db;
    box-sizing: border-box;
    cursor: ns-resize;
    touch-action: none;
}
body.admin-grid-sticky .dcat-box .tables-container > .admin-grid-vscroll > .admin-grid-vscroll-thumb,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .tables-container > .admin-grid-vscroll > .admin-grid-vscroll-thumb {
    display: block;
    width: 10px;
    min-height: 32px;
    margin: 0 auto;
    border-radius: 5px;
    background: #7c8798;
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.12);
    cursor: grab;
    will-change: transform;
}
body.admin-grid-sticky .dcat-box .tables-container > .admin-grid-vscroll > .admin-grid-vscroll-thumb:active,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .tables-container > .admin-grid-vscroll > .admin-grid-vscroll-thumb:active {
    cursor: grabbing;
    background: #596579;
}
/* 表格区域拖拽横滑中 */
body.admin-grid-panning,
body.admin-grid-panning * {
    cursor: grabbing !important;
    user-select: none !important;
}
.table-wrap.admin-grid-panning {
    cursor: grabbing !important;
}
/* 有竖滚时右固定层避开竖条，横条不被挡住 */
body.admin-grid-sticky .dcat-box .tables-container:has(.table-main)::after,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .tables-container:has(.table-main)::after {
    content: none;
}
/* 无自定义轨时为原生横条让位；有全宽轨时贴底，避免进度条被截在固定列前 */
body.admin-grid-sticky .dcat-box .table-wrap.table-fixed-right,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .table-wrap.table-fixed-right {
    bottom: 12px;
}
body.admin-grid-sticky .dcat-box.has-admin-grid-hscroll .table-wrap.table-fixed-right,
body.admin-grid-sticky .dcat-box.has-admin-grid-hscroll .table-wrap.table-fixed-left,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box.has-admin-grid-hscroll .table-wrap.table-fixed-right,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box.has-admin-grid-hscroll .table-wrap.table-fixed-left {
    bottom: 0 !important;
}
body.admin-grid-sticky .dcat-box .table-wrap.table-fixed,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .table-wrap.table-fixed {
    height: 100% !important;
    max-height: none !important;
    /* 横向仍藏滚条；纵向 hidden 防双滚，单元格内容靠行高容纳勿裁切 */
    overflow-x: hidden !important;
    overflow-y: hidden !important;
    scrollbar-width: none !important;
}
body.admin-grid-sticky .dcat-box .table-wrap.table-fixed::-webkit-scrollbar,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .table-wrap.table-fixed::-webkit-scrollbar {
    width: 0 !important;
    height: 0 !important;
    display: none !important;
}
/* 无 table-wrap 的列表：table-responsive 自身作为唯一滚动层 */
body.admin-grid-sticky .dcat-box > .table-responsive:not(:has(.table-wrap)),
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box > .table-responsive:not(:has(.table-wrap)) {
    overflow: auto !important;
    overflow-x: auto !important;
    overflow-y: auto !important;
    scrollbar-width: auto !important;
}
body.admin-grid-sticky .dcat-box > .table-responsive:not(:has(.table-wrap))::-webkit-scrollbar,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box > .table-responsive:not(:has(.table-wrap))::-webkit-scrollbar {
    width: auto !important;
    height: auto !important;
    display: block !important;
}
/* 表头吸顶 */
body.admin-grid-sticky .dcat-box .table-wrap.table-main thead th,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .table-wrap.table-main thead th,
body.admin-grid-sticky .dcat-box > .table-responsive:not(:has(.table-wrap)) thead th,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box > .table-responsive:not(:has(.table-wrap)) thead th {
    position: sticky !important;
    top: 0 !important;
    z-index: 5;
    background: #fff !important;
    box-shadow: 0 1px 0 #e5e5e5;
    padding-top: 0.35rem !important;
    padding-bottom: 0.35rem !important;
    font-size: 12px !important;
    white-space: nowrap;
}
body.admin-grid-sticky .dcat-box .table-wrap.table-fixed thead th,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .table-wrap.table-fixed thead th {
    z-index: 6;
    position: sticky !important;
    top: 0 !important;
    background: #fff !important;
}
/* 底部分页固定（压缩，始终可见） */
body.admin-grid-sticky .dcat-box > .box-footer,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box > .box-footer {
    flex: 0 0 auto !important;
    padding: 0.25rem 0.5rem !important;
    margin: 0 !important;
    background: #fff;
    border-top: 1px solid #ececf0;
    z-index: 50;
    position: relative;
}
body.admin-grid-sticky .dcat-box > .box-footer .pagination,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box > .box-footer .pagination {
    margin: 0 !important;
}
body.admin-grid-sticky .dcat-box > .box-footer .pagination > li > a,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box > .box-footer .pagination > li > a,
body.admin-grid-sticky .dcat-box > .box-footer .pagination > li > span,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box > .box-footer .pagination > li > span {
    padding: 0.2rem 0.55rem !important;
    font-size: 12px !important;
    line-height: 1.2 !important;
}
body.admin-grid-sticky .dcat-box > .box-footer .d-flex,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box > .box-footer .d-flex,
body.admin-grid-sticky .dcat-box > .box-footer .clearfix,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box > .box-footer .clearfix {
    min-height: 0 !important;
}
body.admin-grid-sticky .dcat-box tbody td,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box tbody td {
    padding-top: 0.3rem !important;
    padding-bottom: 0.3rem !important;
    font-size: 12px !important;
}

/* ========== 表单编辑页：底栏提交始终可见并居中 ========== */
.content-body form .box-footer,
.form-content .box-footer {
    display: block !important;
    visibility: visible !important;
    overflow: visible !important;
    clear: both !important;
    min-height: 56px !important;
    padding: 12px 16px !important;
    margin: 0 !important;
    background: #fff !important;
    border-top: 1px solid #ececf0 !important;
    position: sticky !important;
    bottom: 0 !important;
    z-index: 40 !important;
}
.content-body form .box-footer::after,
.form-content .box-footer::after {
    content: "";
    display: table;
    clear: both;
}
.content-body form .box-footer > .col-md-2,
.content-body form .box-footer > [class*="col-md-"][style*="display: none"] {
    display: none !important;
}
.content-body form .box-footer > [class*="col-md-"],
.form-content .box-footer > [class*="col-md-"] {
    float: none !important;
    width: 100% !important;
    max-width: 100% !important;
    display: flex !important;
    flex-wrap: wrap !important;
    align-items: center !important;
    justify-content: center !important;
    gap: 8px !important;
    padding: 0 !important;
}
.content-body form .box-footer .btn-group,
.form-content .box-footer .btn-group {
    float: none !important;
    display: inline-flex !important;
    margin: 0 !important;
}
.content-body form .box-footer .btn,
.form-content .box-footer .btn {
    display: inline-flex !important;
    visibility: visible !important;
    opacity: 1 !important;
}

/* ========== Grid 左右固定列（Dcat fixColumns）紧凑 ========== */
.dcat-box .tables-container {
    position: relative;
}
/* 主表预留左右固定栏：
   - Dcat 实页 table-main 常为 position:static → 用 margin 让出左右固定层
   - 绝对定位（测试夹具等）由 JS 再写 left/right */
.dcat-box .tables-container:has(.table-fixed-right) .table-wrap.table-main,
.dcat-box .tables-container:has(.table-fixed-left) .table-wrap.table-main {
    margin-left: var(--admin-grid-fixed-left-w, 0px) !important;
    margin-right: var(--admin-grid-fixed-right-reserve, var(--admin-grid-fixed-right-w, 0px)) !important;
    width: auto !important;
    max-width: 100% !important;
    box-sizing: border-box !important;
}
/* Dcat table-collapse 默认给主表 padding-left:5px，会在左固定与 UID 间留缝 */
.dcat-box .tables-container:has(.table-fixed-left) .table-wrap.table-main > table.custom-data-table {
    padding-left: 0 !important;
}
.dcat-box .table-wrap.table-fixed-left {
    z-index: 20;
    width: max-content !important;
    max-width: none !important;
    box-shadow: 3px 0 6px -4px rgba(0, 0, 0, 0.14);
}
.dcat-box .table-wrap.table-fixed-right {
    z-index: 20;
    box-shadow: -3px 0 6px -4px rgba(0, 0, 0, 0.14);
    /* 只设上限（约 4 钮一行）；精确宽度由 JS important 写入 */
    max-width: min(32vw, 320px) !important;
    overflow: visible !important;
}
.dcat-box .table-wrap.table-fixed-left table {
    background: #fff;
    width: max-content !important;
    min-width: 0 !important;
    table-layout: auto !important;
}
.dcat-box .table-wrap.table-fixed-right table {
    background: #fff;
    width: 100% !important;
    min-width: 0 !important;
    max-width: 100% !important;
    table-layout: fixed !important;
    overflow: visible !important;
}
.dcat-box .table-wrap.table-fixed-left th,
.dcat-box .table-wrap.table-fixed-left td,
.dcat-box .table-wrap.table-fixed-right th,
.dcat-box .table-wrap.table-fixed-right td {
    background: #fff !important;
}
/* 左：勾选 + ID 尽量瘦（vs-checkbox 默认偏宽） */
.dcat-box .table-wrap.table-fixed-left th,
.dcat-box .table-wrap.table-fixed-left td {
    padding: 0.28rem 0.25rem !important;
    white-space: nowrap !important;
    vertical-align: middle !important;
}
/* 仅约束左固定层勾选列；主表左缘由 JS display:none，勿再写 34px 以免与 margin-left 叠出空隙 */
.dcat-box .table-wrap.table-fixed-left th:first-child,
.dcat-box .table-wrap.table-fixed-left td:first-child {
    width: 34px !important;
    min-width: 34px !important;
    max-width: 38px !important;
    padding-left: 0.35rem !important;
    padding-right: 0 !important;
    box-sizing: border-box !important;
}
.dcat-box .table-wrap.table-fixed-left th:first-child .vs-checkbox-con,
.dcat-box .table-wrap.table-fixed-left td:first-child .vs-checkbox-con {
    margin: 0 !important;
    padding: 0 !important;
    min-width: 0 !important;
    width: auto !important;
    transform: scale(0.85);
    transform-origin: center center;
}
.dcat-box .table-wrap.table-fixed-left th:last-child,
.dcat-box .table-wrap.table-fixed-left td:last-child {
    /* 会员 UID 等 6 位标识；勿用过窄的 ID 型 40–52px */
    width: 5rem !important;
    min-width: 4.5rem !important;
    max-width: 5.5rem !important;
    padding-left: 0.15rem !important;
    padding-right: 0.15rem !important;
    text-align: center;
}
.dcat-box .table-wrap.table-fixed-left th:last-child .grid-column-header,
.dcat-box .table-wrap.table-main th .grid-column-header {
    margin: 0 !important;
}
/* 右：加宽操作列 + 按钮换行；行高由 JS 写 height（tr 的 min-height 无效） */
.dcat-box .table-wrap.table-fixed-right th,
.dcat-box .table-wrap.table-fixed-right td {
    padding: 0.35rem 0.3rem !important;
    vertical-align: top !important;
    white-space: normal !important;
    word-break: break-word !important;
    overflow-wrap: anywhere !important;
    overflow: visible !important;
}
.dcat-box .table-wrap.table-fixed-right .grid__actions__,
.dcat-box td.grid__actions__,
.dcat-box th.grid__actions__ {
    /* 保持 table-cell：勿对 td 用 display:flex，否则行高失真 */
    display: table-cell !important;
    padding: 0.35rem 0.3rem !important;
    white-space: normal !important;
    line-height: 1.35;
    vertical-align: top !important;
    /* 最小随内容（单删除可收窄）；最大约图2（4 钮一行），多按钮自然折行 */
    min-width: 0 !important;
    max-width: min(32vw, 320px) !important;
    min-height: 3.25rem !important;
    overflow: visible !important;
}
/*
 * 外层 a / shared-lazy-modal 只负责占位换行（排除本身就是 .btn 的节点）。
 * 旧规则把 >span/>a 锁成 1.55rem + inline-flex，套一层弹窗按钮或残留 <br> 时会整列重叠。
 */
.dcat-box .table-wrap.table-fixed-right .grid__actions__ > a:not(.btn),
.dcat-box .grid__actions__ > a:not(.btn),
.dcat-box .table-wrap.table-fixed-right .grid__actions__ > span:not(.btn),
.dcat-box .grid__actions__ > span:not(.btn) {
    display: inline-block !important;
    height: auto !important;
    max-height: none !important;
    line-height: normal !important;
    padding: 0 !important;
    margin: 0 0.12rem 0.18rem 0 !important;
    vertical-align: top !important;
    white-space: nowrap !important;
    box-sizing: border-box !important;
}
/* 真正的按钮外观（含外层包装内的 .btn） */
.dcat-box .table-wrap.table-fixed-right .btn-style,
.dcat-box .grid__actions__ .btn-style,
.dcat-box .table-wrap.table-fixed-right .grid__actions__ .btn,
.dcat-box .grid__actions__ .btn,
.dcat-box .table-wrap.table-fixed-right .btn.btn-xs,
.dcat-box .grid__actions__ .btn.btn-xs {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    padding: 0 0.36rem !important;
    margin: 0 !important;
    height: 1.55rem !important;
    min-height: 1.55rem !important;
    line-height: 1 !important;
    font-size: 11px !important;
    white-space: nowrap !important;
    vertical-align: middle !important;
    box-sizing: border-box !important;
}
.dcat-box .grid__actions__ .shared-lazy-modal {
    cursor: pointer;
}
.dcat-box .project-actions-line2,
.dcat-box .project-actions-line2-right {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.1rem 0.12rem;
    white-space: normal;
    margin-top: 0.12rem;
    max-width: 100%;
    width: 100%;
    flex-basis: 100%;
}
.dcat-box .table-wrap.table-fixed-right .custom-switch,
.dcat-box .grid__actions__ .custom-switch {
    margin: 0 0.12rem 0 0 !important;
    transform: scale(0.86);
    transform-origin: left center;
    vertical-align: middle;
}
body.admin-grid-sticky .dcat-box .table-wrap.table-fixed-left,
body.admin-grid-sticky .dcat-box .table-wrap.table-fixed-right,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .table-wrap.table-fixed-left,
body:has(.content-body .dcat-box table.custom-data-table) .dcat-box .table-wrap.table-fixed-right {
    z-index: 25;
}

/* 有右固定操作列时：隐藏主表操作列，避免横滑出现双「操作」 */
.dcat-box:has(.table-wrap.table-fixed-right) .table-wrap.table-main th.grid__actions__,
.dcat-box:has(.table-wrap.table-fixed-right) .table-wrap.table-main td.grid__actions__ {
    width: 0 !important;
    min-width: 0 !important;
    max-width: 0 !important;
    padding: 0 !important;
    border: none !important;
    overflow: hidden !important;
    visibility: hidden;
    pointer-events: none;
}
/* 左固定勾选/ID：列数不固定（有无行选框），由 admin-grid-sticky.js hideDuplicatedMainEdgeColumns 压主表对应列 */

/* CNAME 弹窗：可滚动内容区 + 底栏可见（避免 flex+min-height:0 把懒加载表单压成空白） */
.modal.project-cname-modal .modal-dialog {
    max-height: calc(100vh - 2.5rem);
    margin: 1.25rem auto;
}
.modal.project-cname-modal .modal-content {
    max-height: calc(100vh - 2.5rem);
    display: flex;
    flex-direction: column;
    overflow: hidden;
}
.modal.project-cname-modal .modal-header {
    display: flex;
    align-items: center;
    flex-wrap: nowrap;
}
.modal.project-cname-modal .modal-header .modal-title {
    flex: 1 1 auto;
    margin-right: 0.5rem;
}
.modal.project-cname-modal .modal-header .project-cname-open-log,
.modal.project-a-record-modal .modal-header .project-a-record-open-log {
    flex: 0 0 auto;
    margin-right: 0.35rem;
    padding: 0.15rem 0.55rem;
    line-height: 1.4;
}
.modal.project-a-record-modal .modal-header .modal-title {
    flex: 1 1 auto;
    margin-right: 0.5rem;
}
.modal.project-cname-modal .modal-body {
    flex: 1 1 auto;
    min-height: 280px;
    max-height: calc(100vh - 8rem);
    overflow-x: hidden;
    overflow-y: auto !important;
    -webkit-overflow-scrolling: touch;
}
.modal.project-cname-modal form.project-cname-form {
    display: block;
    margin-bottom: 0;
    max-height: none;
    overflow: visible;
}
.modal.project-cname-modal form.project-cname-form > .box-body {
    overflow: visible;
}
.modal.project-cname-modal form.project-cname-form > .box-footer,
.modal.project-cname-modal form.project-cname-form > .form-footer {
    position: sticky;
    bottom: 0;
    z-index: 10;
    background: #fff;
    border-top: 1px solid #e4e7ed;
    box-shadow: 0 -4px 10px rgba(0, 0, 0, 0.04);
    margin-bottom: 0 !important;
    padding-top: 0.75rem;
    padding-bottom: 0.75rem;
}
.modal.project-cname-modal .project-cname-domain-list-wrap {
    max-height: 240px;
    overflow-x: auto;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
}
.modal.project-cname-modal .project-cname-domain-list-wrap > table {
    margin-bottom: 0;
    border-collapse: separate;
    border-spacing: 0;
}
.modal.project-cname-modal .project-cname-domain-list-wrap thead th {
    position: sticky;
    top: 0;
    z-index: 2;
    background: #f8f9fa;
    box-shadow: inset 0 -1px 0 #dee2e6;
}

/* A 记录弹窗：与 CNAME 同款可滚动 + sticky 底栏（含进度条） */
.modal.project-a-record-modal .modal-dialog {
    max-height: calc(100vh - 2.5rem);
    margin: 1.25rem auto;
}
.modal.project-a-record-modal .modal-content {
    max-height: calc(100vh - 2.5rem);
    display: flex;
    flex-direction: column;
    overflow: hidden;
}
.modal.project-a-record-modal .modal-header {
    display: flex;
    align-items: center;
    flex-wrap: nowrap;
}
.modal.project-a-record-modal .modal-body {
    flex: 1 1 auto;
    min-height: 280px;
    max-height: calc(100vh - 8rem);
    overflow-x: hidden;
    overflow-y: auto !important;
    -webkit-overflow-scrolling: touch;
}
.modal.project-a-record-modal form.project-a-record-form {
    display: block;
    margin-bottom: 0;
    max-height: none;
    overflow: visible;
}
.modal.project-a-record-modal form.project-a-record-form > .box-body {
    overflow: visible;
}
.modal.project-a-record-modal form.project-a-record-form > .box-footer,
.modal.project-a-record-modal form.project-a-record-form > .form-footer {
    position: sticky;
    bottom: 0;
    z-index: 12;
    background: #fff;
    border-top: 1px solid #e4e7ed;
    box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.03);
    margin-bottom: 0 !important;
    padding-top: 0.75rem;
    padding-bottom: 0.75rem;
}
.modal.project-a-record-modal .project-a-record-progress-dock {
    position: sticky;
    bottom: 3.4rem;
    z-index: 11;
    background: #fff;
    border-top: 1px solid #e4e7ed;
    box-shadow: 0 -4px 10px rgba(0, 0, 0, 0.04);
    margin: 0.75rem -0.25rem 0;
    padding: 0.65rem 0.75rem 0.35rem;
}
.modal.project-a-record-modal .project-a-record-progress-status {
    font-size: 12px;
    color: #606266;
    margin-bottom: 0.35rem;
}
.modal.project-a-record-modal .project-a-record-progress-dock .cname-task-progress {
    height: 18px;
    margin-bottom: 0;
}
.modal.project-a-record-modal .project-a-record-domain-list-wrap {
    max-height: 240px;
    overflow-x: auto;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
}
.modal.project-a-record-modal .project-a-record-domain-list-wrap > table {
    margin-bottom: 0;
    border-collapse: separate;
    border-spacing: 0;
}
.modal.project-a-record-modal .project-a-record-domain-list-wrap thead th {
    position: sticky;
    top: 0;
    z-index: 2;
    background: #f8f9fa;
    box-shadow: inset 0 -1px 0 #dee2e6;
}

/* CNAME 任务日志消息盒（宝塔风格） */
.cname-task-log-box {
    display: flex;
    flex-direction: column;
    height: 100%;
    min-height: 420px;
    background: #1e1e1e;
    color: #ddd;
    font-family: Consolas, "Courier New", monospace;
    font-size: 12px;
}
.cname-task-log-head {
    flex: 0 0 auto;
    padding: 10px 12px 8px;
    background: #2a2a2a;
    border-bottom: 1px solid #3a3a3a;
}
.cname-task-log-status {
    font-weight: 600;
    color: #f0f0f0;
    margin-bottom: 8px;
    max-height: 4.5em;
    overflow-x: hidden;
    overflow-y: auto;
    word-break: break-all;
    line-height: 1.4;
}
.cname-task-log-foot-text {
    flex: 1 1 auto;
    min-width: 0;
    margin-right: 8px;
}
.cname-task-log-copy {
    flex: 0 0 auto;
    padding: 0.1rem 0.45rem;
    line-height: 1.35;
    color: #ddd;
    border-color: #666;
}
.cname-task-log-copy:hover,
.cname-task-log-copy:focus {
    color: #fff;
    border-color: #aaa;
    background: rgba(255, 255, 255, 0.08);
}
.cname-task-stages {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 4px;
    margin-bottom: 8px;
    line-height: 1.4;
}
.cname-stage-item {
    color: #888;
    padding: 1px 6px;
    border-radius: 3px;
}
.cname-stage-item.is-done {
    color: #8bc34a;
}
.cname-stage-item.is-current {
    color: #fff;
    background: #0d6efd;
}
.cname-stage-item.is-failed {
    color: #fff;
    background: #dc3545;
}
.cname-stage-sep {
    color: #555;
    margin: 0 2px;
}
.cname-task-progress {
    height: 14px;
    margin-bottom: 0;
    background: #333;
}
.cname-task-progress .progress-bar {
    font-size: 10px;
    line-height: 14px;
}
.cname-task-log-body {
    flex: 1 1 auto;
    min-height: 280px;
    max-height: 360px;
    overflow-y: auto;
    padding: 8px 12px;
    background: #111;
}
.cname-log-line {
    display: flex;
    gap: 10px;
    padding: 2px 0;
    white-space: pre-wrap;
    word-break: break-all;
}
.cname-log-ts {
    flex: 0 0 64px;
    color: #666;
}
.cname-log-line.level-info .cname-log-text { color: #c5c5c5; }
.cname-log-line.level-success .cname-log-text { color: #20c997; }
.cname-log-line.level-warn .cname-log-text { color: #ffc107; }
.cname-log-line.level-error .cname-log-text { color: #ff6b6b; }
.cname-task-log-foot {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    padding: 8px 12px;
    border-top: 1px solid #3a3a3a;
    background: #2a2a2a;
    color: #aaa !important;
}

/* 安装管理：软件版本列吃满单元格，备注列留合理宽度，避免中间大块空白 */
.dcat-box .custom-data-table td .sv-versions-cell {
    width: 100%;
    max-width: 100%;
}
.dcat-box .custom-data-table td .sv-soft-table {
    width: 100%;
    border-collapse: collapse;
}
/* 嵌套软件行：清晰横线分界（行里面的行） */
.dcat-box .custom-data-table td .sv-soft-table thead th {
    border-bottom: 1px solid #d0d5dd;
    padding-bottom: 4px !important;
}
.dcat-box .custom-data-table td .sv-soft-table tbody tr td {
    border-bottom: 1px solid #e4e7ec;
    padding-top: 6px !important;
    padding-bottom: 6px !important;
    vertical-align: top;
}
.dcat-box .custom-data-table td .sv-soft-table tbody tr:last-child td {
    border-bottom: none;
}
.dcat-box .custom-data-table td .sv-soft-table td:nth-child(1),
.dcat-box .custom-data-table td .sv-soft-table th:nth-child(1),
.dcat-box .custom-data-table td .sv-soft-table td:nth-child(2),
.dcat-box .custom-data-table td .sv-soft-table th:nth-child(2),
.dcat-box .custom-data-table td .sv-soft-table td:nth-child(3),
.dcat-box .custom-data-table td .sv-soft-table th:nth-child(3) {
    width: 1%;
    white-space: nowrap;
}
.dcat-box .custom-data-table td .sv-soft-table .sv-ops {
    max-width: 100%;
}

/* 站点管理：本地备注嵌套行 */
.dcat-box .custom-data-table td .bt-local-remarks-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 12px;
    line-height: 1.35;
}
.dcat-box .custom-data-table td .bt-local-remarks-table tr td {
    border-bottom: 1px solid #e4e7ec;
    padding: 4px 6px 4px 0;
    vertical-align: top;
}
.dcat-box .custom-data-table td .bt-local-remarks-table tr:last-child td {
    border-bottom: none;
}
.dcat-box .custom-data-table td .bt-local-remarks-table .bt-lr-label {
    width: 1%;
    white-space: nowrap;
    color: #666;
    padding-right: 8px;
}
.dcat-box .custom-data-table td .bt-local-remarks-table .bt-lr-value {
    word-break: break-all;
}

/* ========== 全后台：顶栏/树工具/筛选按钮文字图标框内居中 ========== */
.content-body .grid-refresh,
.content-body .filter-btn,
.content-body .btn.btn-mini,
.content-header .btn.btn-sm,
.tree-box .btn.btn-sm,
.tree-box .btn.btn-outline-primary {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    vertical-align: middle !important;
    box-sizing: border-box !important;
}
.content-body .grid-refresh i,
.content-body .filter-btn i,
.content-body .btn.btn-mini i,
.content-header .btn.btn-sm i,
.tree-box .btn.btn-sm i {
    display: inline-flex !important;
    align-items: center !important;
    line-height: 1 !important;
    margin: 0 !important;
    vertical-align: middle !important;
}

/* ========== 顶栏：后台任务进度 ========== */
.baota-op-navbar-wrap {
    margin-right: 0.25rem;
}
.baota-op-navbar-wrap .nav-link {
    position: relative;
    padding: 0.5rem 0.75rem;
}
.baota-op-navbar-wrap .baota-op-navbar-badge {
    position: absolute;
    top: 2px;
    right: 2px;
    font-size: 10px;
    min-width: 16px;
    height: 16px;
    line-height: 16px;
    padding: 0 4px;
}
.baota-op-navbar-menu {
    min-width: 320px;
    max-width: 380px;
}
.baota-op-navbar-item {
    display: block;
    padding: 10px 14px;
    border-bottom: 1px solid rgba(0, 0, 0, 0.06);
    color: inherit;
    text-decoration: none !important;
}
.baota-op-navbar-item:hover {
    background: rgba(0, 0, 0, 0.03);
}
.baota-op-navbar-item-title {
    font-size: 13px;
    margin-bottom: 2px;
}
.baota-op-navbar-item-meta,
.baota-op-navbar-item-stage,
.baota-op-navbar-item-msg {
    font-size: 12px;
    line-height: 1.4;
}
.baota-op-navbar-item-msg {
    margin-top: 2px;
    max-height: 2.8em;
    overflow: hidden;
    text-overflow: ellipsis;
}
.baota-op-navbar-progress {
    height: 4px;
    margin-top: 6px;
    margin-bottom: 0;
}
