/* ============================================================
 * LXMall Admin UI — v1.13.0
 *
 * 后台设计系统扩展层。定位：admin.css（骨架 + 5 套主题）与
 * admin-polish.css（v1.9.1 卡片/表单/宽表）之上的「页面级构件」。
 *
 * 命名约定：统一 adm- 前缀，与历史 admin- / stat- / dash- 隔离；
 * 不覆写 Bootstrap 工具类（p-* / mb-* / text-*），保证旧模板零改动兼容。
 *
 * 颜色全部取自 admin.css 的 --admin-* 主题变量，5 套主题自动跟随。
 * ============================================================ */

:root {
    --adm-r-xs: 6px;
    --adm-r: 10px;
    --adm-r-lg: 14px;

    --adm-line: color-mix(in srgb, var(--ftm-border, #e3ebe9) 92%, #94a3b8);
    --adm-line-soft: color-mix(in srgb, var(--ftm-border, #e3ebe9) 60%, transparent);
    --adm-surface: #fff;
    --adm-surface-2: #f8fafb;
    --adm-surface-3: #f1f5f4;

    --adm-ink: #0f172a;
    --adm-ink-2: #475569;
    --adm-ink-3: #94a3b8;

    --adm-primary-soft: rgba(var(--admin-primary-rgb, 13, 148, 136), .09);
    --adm-primary-line: rgba(var(--admin-primary-rgb, 13, 148, 136), .26);

    --adm-ok: #16a34a;
    --adm-warn: #d97706;
    --adm-danger: #dc2626;
    --adm-info: #0284c7;

    --adm-shadow-xs: 0 1px 2px rgba(15, 23, 42, .05);
    --adm-shadow: 0 4px 14px rgba(15, 23, 42, .07);
    --adm-shadow-lg: 0 14px 38px rgba(15, 23, 42, .13);

    --adm-ease: cubic-bezier(.4, 0, .2, 1);
    --adm-sidebar-w: 240px;
}

/* ============================================================
 * 1. 页面头 adm-head
 *    替代各页零散的 「d-flex justify-content-between + h1.h5」
 * ============================================================ */
.adm-head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 14px 20px;
    flex-wrap: wrap;
    margin-bottom: 18px;
}
.adm-head-main { display: flex; align-items: center; gap: 12px; min-width: 0; }
.adm-head-ico {
    width: 42px;
    height: 42px;
    flex: 0 0 42px;
    border-radius: 12px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 1.16rem;
    color: var(--admin-primary);
    background: var(--adm-primary-soft);
    border: 1px solid var(--adm-primary-line);
}
.adm-head-ico img.type-ico { width: 22px; height: 22px; }
.adm-head-title {
    font-size: 1.12rem;
    font-weight: 750;
    letter-spacing: -.01em;
    color: var(--adm-ink);
    margin: 0;
    line-height: 1.3;
}
.adm-head-sub {
    margin: 3px 0 0;
    font-size: .78rem;
    color: var(--adm-ink-3);
    line-height: 1.5;
}
.adm-head-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* 面包屑 */
.adm-crumbs {
    display: flex;
    align-items: center;
    gap: 6px;
    flex-wrap: wrap;
    margin-bottom: 10px;
    font-size: .76rem;
    color: var(--adm-ink-3);
}
.adm-crumbs a { color: var(--adm-ink-2); }
.adm-crumbs a:hover { color: var(--admin-primary); }
.adm-crumbs .sep { opacity: .45; }
.adm-crumbs .cur { color: var(--adm-ink); font-weight: 600; }

/* ============================================================
 * 2. 卡片 adm-card（比 Bootstrap .card 更轻、描边更淡）
 * ============================================================ */
.adm-panel {
    background: var(--adm-surface);
    border: 1px solid var(--adm-line);
    border-radius: var(--adm-r-lg);
    box-shadow: var(--adm-shadow-xs);
    overflow: hidden;
}
.adm-panel + .adm-panel { margin-top: 16px; }
.adm-panel-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    flex-wrap: wrap;
    padding: 14px 18px;
    border-bottom: 1px solid var(--adm-line-soft);
    background: linear-gradient(180deg, #fff, var(--adm-surface-2));
}
.adm-panel-title {
    display: flex;
    align-items: center;
    gap: 7px;
    font-size: .9rem;
    font-weight: 700;
    color: var(--adm-ink);
    margin: 0;
}
.adm-panel-title i { color: var(--admin-primary); font-size: .95rem; }
.adm-panel-sub { font-size: .75rem; color: var(--adm-ink-3); font-weight: 400; }
.adm-panel-body { padding: 18px; }
.adm-panel-body.flush { padding: 0; }

/* ============================================================
 * 3. 工具条与筛选 adm-toolbar / adm-filter
 * ============================================================ */
.adm-toolbar {
    display: flex;
    align-items: center;
    gap: 9px;
    flex-wrap: wrap;
    padding: 12px 16px;
    background: var(--adm-surface);
    border: 1px solid var(--adm-line);
    border-radius: var(--adm-r-lg) var(--adm-r-lg) 0 0;
    border-bottom: 0;
}
.adm-toolbar.is-standalone { border-radius: var(--adm-r-lg); border-bottom: 1px solid var(--adm-line); margin-bottom: 14px; }
.adm-toolbar-search { position: relative; flex: 1 1 220px; max-width: 340px; }
.adm-toolbar-search i {
    position: absolute;
    left: 11px;
    top: 50%;
    transform: translateY(-50%);
    color: var(--adm-ink-3);
    font-size: .85rem;
    pointer-events: none;
}
.adm-toolbar-search input {
    padding-left: 31px;
    height: 34px;
    font-size: .82rem;
    border-radius: var(--adm-r-xs);
    border: 1px solid var(--adm-line);
    background: var(--adm-surface-2);
    width: 100%;
}
.adm-toolbar-search input:focus {
    background: #fff;
    border-color: var(--adm-primary-line);
    box-shadow: 0 0 0 3px var(--adm-primary-soft);
    outline: 0;
}
.adm-toolbar-spacer { margin-left: auto; }

/* 折叠筛选面板（details/summary，无 JS 亦可工作） */
.adm-filter {
    border: 1px solid var(--adm-line);
    border-top: 0;
    background: var(--adm-surface);
}
.adm-filter > summary {
    display: flex;
    align-items: center;
    gap: 7px;
    padding: 10px 18px;
    font-size: .78rem;
    font-weight: 600;
    color: var(--adm-ink-2);
    cursor: pointer;
    list-style: none;
    user-select: none;
    border-top: 1px dashed var(--adm-line-soft);
}
.adm-filter > summary::-webkit-details-marker { display: none; }
.adm-filter > summary::after {
    content: "\F282";
    font-family: bootstrap-icons;
    margin-left: auto;
    font-size: .7rem;
    color: var(--adm-ink-3);
    transition: transform .2s var(--adm-ease);
}
.adm-filter[open] > summary::after { transform: rotate(180deg); }
.adm-filter > summary:hover { color: var(--admin-primary); background: var(--adm-surface-2); }
.adm-filter-body {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(178px, 1fr));
    gap: 12px 16px;
    padding: 16px 18px 18px;
    border-top: 1px solid var(--adm-line-soft);
    background: var(--adm-surface-2);
}
.adm-filter-field { min-width: 0; }
.adm-filter-field > label {
    display: block;
    font-size: .72rem;
    font-weight: 600;
    color: var(--adm-ink-3);
    margin-bottom: 5px;
    letter-spacing: .01em;
}
.adm-filter-field .form-control,
.adm-filter-field .form-select { height: 34px; font-size: .82rem; }
.adm-filter-foot {
    grid-column: 1 / -1;
    display: flex;
    gap: 8px;
    align-items: center;
    padding-top: 4px;
}

/* 状态分栏 tab（订单 / 评价 / 售后等带计数的列表页头部） */
.adm-tabs {
    display: flex;
    align-items: center;
    gap: 3px;
    flex-wrap: wrap;
    padding: 0 16px;
    background: var(--adm-surface);
    border: 1px solid var(--adm-line);
    border-bottom: 0;
    overflow-x: auto;
    scrollbar-width: none;
}
.adm-tabs::-webkit-scrollbar { display: none; }
.adm-tab {
    position: relative;
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 11px 11px 10px;
    font-size: .82rem;
    font-weight: 600;
    color: var(--adm-ink-3);
    white-space: nowrap;
    border-bottom: 2px solid transparent;
    transition: color .15s var(--adm-ease), border-color .15s var(--adm-ease);
}
.adm-tab:hover { color: var(--adm-ink); }
.adm-tab.on { color: var(--admin-primary); border-bottom-color: var(--admin-primary); }
.adm-tab-num {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 18px;
    height: 17px;
    padding: 0 5px;
    border-radius: 999px;
    font-size: .68rem;
    font-weight: 700;
    background: var(--adm-surface-3);
    color: var(--adm-ink-3);
    font-variant-numeric: tabular-nums;
}
.adm-tab.on .adm-tab-num { background: var(--adm-primary-soft); color: var(--admin-primary-deep); }
.adm-tab-num.is-hot { background: #fef2f2; color: #b91c1c; }

/* 已选条件 chips */
.adm-chips { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; padding: 0 16px 11px; }
.adm-chips:empty { display: none; }
.adm-chip {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 3px 6px 3px 10px;
    border-radius: 999px;
    font-size: .74rem;
    font-weight: 600;
    color: var(--adm-ink-2);
    background: var(--adm-surface-3);
    border: 1px solid var(--adm-line);
    line-height: 1.6;
}
.adm-chip b { color: var(--adm-ink); font-weight: 700; }
.adm-chip a {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 15px;
    height: 15px;
    border-radius: 50%;
    color: var(--adm-ink-3);
    font-size: .6rem;
}
.adm-chip a:hover { background: rgba(220, 38, 38, .12); color: var(--adm-danger); }
.adm-chip-clear { font-size: .74rem; color: var(--adm-ink-3); padding: 2px 8px; }
.adm-chip-clear:hover { color: var(--adm-danger); }

/* ============================================================
 * 4. 数据表 adm-table
 * ============================================================ */
.adm-table-wrap { border: 1px solid var(--adm-line); border-top: 0; border-radius: 0 0 var(--adm-r-lg) var(--adm-r-lg); background: #fff; overflow: auto; }
.adm-table { width: 100%; margin: 0; border-collapse: separate; border-spacing: 0; font-size: .82rem; }
.adm-table thead th {
    position: sticky;
    top: 0;
    z-index: 2;
    padding: 10px 14px;
    font-size: .72rem;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--adm-ink-3);
    background: var(--adm-surface-2);
    border-bottom: 1px solid var(--adm-line);
    white-space: nowrap;
    text-align: left;
}
.adm-table tbody td {
    padding: 11px 14px;
    border-bottom: 1px solid var(--adm-line-soft);
    color: var(--adm-ink-2);
    vertical-align: middle;
}
.adm-table tbody tr:last-child td { border-bottom: 0; }
.adm-table tbody tr { transition: background .14s var(--adm-ease); }
.adm-table tbody tr:hover td { background: color-mix(in srgb, var(--adm-primary-soft) 55%, #fff); }
.adm-table tbody tr.is-picked td { background: var(--adm-primary-soft); }
.adm-table .col-num { text-align: right; font-variant-numeric: tabular-nums; }
.adm-table .col-act { text-align: right; white-space: nowrap; }
.adm-table .col-check { width: 40px; text-align: center; }
.adm-table strong, .adm-table b { color: var(--adm-ink); font-weight: 650; }
.adm-table .adm-cell-main { color: var(--adm-ink); font-weight: 600; }
.adm-table .adm-cell-sub { font-size: .72rem; color: var(--adm-ink-3); margin-top: 2px; }

/* 商品缩略图 */
.adm-thumb {
    width: 40px;
    height: 40px;
    border-radius: 8px;
    object-fit: cover;
    border: 1px solid var(--adm-line);
    background: var(--adm-surface-3);
    display: block;
}
.adm-thumb-ph {
    width: 40px;
    height: 40px;
    border-radius: 8px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: var(--adm-surface-3);
    border: 1px solid var(--adm-line);
    color: var(--adm-ink-3);
    font-size: .95rem;
}

/* 状态胶囊 */
.adm-pill {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 2px 9px;
    border-radius: 999px;
    font-size: .72rem;
    font-weight: 650;
    line-height: 1.7;
    white-space: nowrap;
    border: 1px solid transparent;
}
.adm-pill::before {
    content: "";
    width: 5px;
    height: 5px;
    border-radius: 50%;
    background: currentColor;
    flex: 0 0 5px;
}
.adm-pill.ok { color: #15803d; background: #f0fdf4; border-color: #bbf7d0; }
.adm-pill.wait { color: #b45309; background: #fffbeb; border-color: #fde68a; }
.adm-pill.info { color: #0369a1; background: #f0f9ff; border-color: #bae6fd; }
.adm-pill.err { color: #b91c1c; background: #fef2f2; border-color: #fecaca; }
.adm-pill.mute { color: #64748b; background: #f8fafc; border-color: #e2e8f0; }
.adm-pill.primary { color: var(--admin-primary-deep); background: var(--adm-primary-soft); border-color: var(--adm-primary-line); }

/* ============================================================
 * 5. 空态 adm-empty
 * ============================================================ */
.adm-empty { padding: 54px 24px; text-align: center; }
.adm-empty-ico {
    width: 62px;
    height: 62px;
    margin: 0 auto 14px;
    border-radius: 18px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.5rem;
    color: var(--admin-primary);
    background: var(--adm-primary-soft);
    border: 1px dashed var(--adm-primary-line);
}
.adm-empty h3 { font-size: .95rem; font-weight: 700; color: var(--adm-ink); margin: 0 0 6px; }
.adm-empty p { font-size: .8rem; color: var(--adm-ink-3); margin: 0 auto 16px; max-width: 380px; line-height: 1.7; }
.adm-empty-actions { display: flex; gap: 8px; justify-content: center; flex-wrap: wrap; }

/* 表格内联空态（保持表格结构） */
.adm-table td.adm-empty-cell { padding: 46px 20px; text-align: center; color: var(--adm-ink-3); font-size: .82rem; }
.adm-table td.adm-empty-cell i { display: block; font-size: 1.5rem; margin-bottom: 8px; opacity: .5; }

/* ============================================================
 * 6. 批量操作条 adm-batchbar
 * ============================================================ */
.adm-batchbar {
    position: fixed;
    left: 50%;
    bottom: 22px;
    z-index: 1055;
    transform: translate(-50%, 130%);
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 10px 14px 10px 18px;
    border-radius: 999px;
    background: #101828;
    color: #fff;
    box-shadow: 0 16px 40px rgba(15, 23, 42, .34);
    transition: transform .28s var(--adm-ease), opacity .2s var(--adm-ease);
    opacity: 0;
    pointer-events: none;
    max-width: calc(100vw - 32px);
}
.adm-batchbar.show { transform: translate(-50%, 0); opacity: 1; pointer-events: auto; }
.adm-batchbar-count { font-size: .8rem; font-weight: 650; white-space: nowrap; }
.adm-batchbar-count b { color: #5eead4; font-size: .95rem; }
.adm-batchbar-acts { display: flex; gap: 6px; flex-wrap: wrap; }
.adm-batchbar .btn { --bs-btn-padding-y: .22rem; --bs-btn-padding-x: .7rem; font-size: .76rem; border-radius: 999px; }
.adm-batchbar-close {
    width: 26px;
    height: 26px;
    border-radius: 50%;
    border: 0;
    background: rgba(255, 255, 255, .12);
    color: #fff;
    font-size: .72rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.adm-batchbar-close:hover { background: rgba(255, 255, 255, .22); }

/* ============================================================
 * 7. 表单分区 adm-section（替代长表单的一整块 card）
 * ============================================================ */
.adm-section {
    background: #fff;
    border: 1px solid var(--adm-line);
    border-radius: var(--adm-r-lg);
    box-shadow: var(--adm-shadow-xs);
    overflow: hidden;
}
.adm-section + .adm-section { margin-top: 16px; }
.adm-section-head {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 13px 18px;
    border-bottom: 1px solid var(--adm-line-soft);
    background: linear-gradient(180deg, #fff, var(--adm-surface-2));
}
.adm-section-num {
    width: 22px;
    height: 22px;
    flex: 0 0 22px;
    border-radius: 7px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: .7rem;
    font-weight: 700;
    color: #fff;
    background: linear-gradient(135deg, var(--admin-primary), var(--admin-primary-deep));
}
.adm-section-title { font-size: .875rem; font-weight: 700; color: var(--adm-ink); margin: 0; }
.adm-section-hint { font-size: .73rem; color: var(--adm-ink-3); margin-left: auto; text-align: right; }
.adm-section-body { padding: 18px; }
.adm-section-body.tight { padding: 14px 18px; }

/* 表单字段排版节奏 */
.adm-field { margin-bottom: 15px; }
.adm-field:last-child { margin-bottom: 0; }
.adm-field > label,
.adm-field > .form-label {
    display: block;
    font-size: .78rem;
    font-weight: 650;
    color: var(--adm-ink-2);
    margin-bottom: 5px;
}
.adm-field > label .req { color: var(--adm-danger); margin-left: 2px; }
.adm-field-help { font-size: .72rem; color: var(--adm-ink-3); margin-top: 4px; line-height: 1.6; }
.adm-grid-2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 16px; }
.adm-grid-3 { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0 16px; }

/* 粘性保存条沿用 admin-polish.css 的 .adm-savebar（v1.9.1），此处只补提示文字 */
.adm-savebar-note { font-size: .74rem; color: var(--adm-ink-3); margin-right: auto; }
.adm-savebar-note.is-dirty { color: var(--adm-warn); font-weight: 600; }

/* 右列发布控制台（沿用 admin-polish 的 sticky，仅统一观感） */
.adm-side-col { position: sticky; top: calc(var(--ftm-topbar-height, 54px) + var(--ftm-tabs-height, 46px) + 14px); }

/* ============================================================
 * 8. 仪表盘：待办 / KPI / 快捷入口
 * ============================================================ */
.adm-todo { display: grid; grid-template-columns: repeat(auto-fit, minmax(146px, 1fr)); gap: 11px; }
.adm-todo-item {
    position: relative;
    display: flex;
    flex-direction: column;
    gap: 3px;
    padding: 13px 14px;
    border-radius: 12px;
    border: 1px solid var(--adm-line);
    background: #fff;
    transition: transform .18s var(--adm-ease), box-shadow .18s var(--adm-ease), border-color .18s var(--adm-ease);
    overflow: hidden;
}
.adm-todo-item::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 3px;
    background: var(--adm-tone, var(--admin-primary));
    opacity: .85;
}
.adm-todo-item:hover {
    transform: translateY(-2px);
    box-shadow: var(--adm-shadow);
    border-color: var(--adm-primary-line);
}
.adm-todo-label {
    display: flex;
    align-items: center;
    gap: 5px;
    font-size: .74rem;
    color: var(--adm-ink-3);
    font-weight: 600;
}
.adm-todo-label i { color: var(--adm-tone, var(--admin-primary)); font-size: .82rem; }
.adm-todo-num {
    font-size: 1.42rem;
    font-weight: 780;
    line-height: 1.15;
    letter-spacing: -.02em;
    color: var(--adm-ink);
    font-variant-numeric: tabular-nums;
}
.adm-todo-num.is-zero { color: var(--adm-ink-3); font-weight: 600; }
.adm-todo-item.is-hot .adm-todo-num { color: var(--adm-danger); }
.adm-todo-go { font-size: .7rem; color: var(--adm-ink-3); display: inline-flex; align-items: center; gap: 3px; }
.adm-todo-item:hover .adm-todo-go { color: var(--admin-primary); }

/* KPI 卡（带趋势） */
.adm-kpi {
    display: flex;
    gap: 13px;
    padding: 16px;
    border-radius: var(--adm-r-lg);
    border: 1px solid var(--adm-line);
    background: #fff;
    box-shadow: var(--adm-shadow-xs);
    transition: transform .18s var(--adm-ease), box-shadow .18s var(--adm-ease);
    height: 100%;
}
.adm-kpi:hover { transform: translateY(-2px); box-shadow: var(--adm-shadow); }
.adm-kpi-ico {
    width: 42px;
    height: 42px;
    flex: 0 0 42px;
    border-radius: 12px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 1.1rem;
    color: var(--adm-tone, var(--admin-primary));
    background: color-mix(in srgb, var(--adm-tone, var(--admin-primary)) 11%, #fff);
    border: 1px solid color-mix(in srgb, var(--adm-tone, var(--admin-primary)) 22%, #fff);
}
.adm-kpi-body { min-width: 0; flex: 1; }
.adm-kpi-label { font-size: .74rem; color: var(--adm-ink-3); font-weight: 600; }
.adm-kpi-value {
    font-size: 1.5rem;
    font-weight: 780;
    letter-spacing: -.025em;
    color: var(--adm-ink);
    line-height: 1.18;
    font-variant-numeric: tabular-nums;
}
.adm-kpi-value small { font-size: .74rem; font-weight: 600; color: var(--adm-ink-3); margin-left: 3px; }
.adm-kpi-foot { display: flex; align-items: center; gap: 6px; margin-top: 4px; font-size: .72rem; color: var(--adm-ink-3); }
.adm-trend { display: inline-flex; align-items: center; gap: 2px; font-weight: 700; }
.adm-trend.up { color: var(--adm-ok); }
.adm-trend.down { color: var(--adm-danger); }
.adm-trend.flat { color: var(--adm-ink-3); }

/* 快捷入口 */
.adm-quick { display: grid; grid-template-columns: repeat(auto-fit, minmax(112px, 1fr)); gap: 10px; }
.adm-quick-a {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 7px;
    padding: 15px 8px;
    border-radius: 12px;
    border: 1px dashed var(--adm-line);
    background: var(--adm-surface-2);
    color: var(--adm-ink-2);
    font-size: .76rem;
    font-weight: 600;
    text-align: center;
    transition: all .18s var(--adm-ease);
}
.adm-quick-a i { font-size: 1.16rem; color: var(--admin-primary); }
.adm-quick-a:hover {
    border-style: solid;
    border-color: var(--adm-primary-line);
    background: var(--adm-primary-soft);
    color: var(--admin-primary-deep);
    transform: translateY(-2px);
}

/* 列表紧凑行（仪表盘「低库存 / 留言」等） */
.adm-list { margin: 0; padding: 0; list-style: none; }
.adm-list-row {
    display: flex;
    align-items: center;
    gap: 11px;
    padding: 11px 18px;
    border-bottom: 1px solid var(--adm-line-soft);
    transition: background .14s var(--adm-ease);
}
.adm-list-row:last-child { border-bottom: 0; }
.adm-list-row:hover { background: var(--adm-surface-2); }
.adm-list-main { min-width: 0; flex: 1; }
.adm-list-title {
    font-size: .82rem;
    font-weight: 600;
    color: var(--adm-ink);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.adm-list-sub { font-size: .72rem; color: var(--adm-ink-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.adm-list-side { flex: 0 0 auto; text-align: right; }

/* ============================================================
 * 9. 时间线 adm-timeline（订单详情 / 日志）
 * ============================================================ */
.adm-timeline { margin: 0; padding: 4px 0 0; list-style: none; position: relative; }
.adm-timeline::before {
    content: "";
    position: absolute;
    left: 8px;
    top: 10px;
    bottom: 8px;
    width: 2px;
    background: var(--adm-line);
    border-radius: 2px;
}
.adm-tl-item { position: relative; padding: 0 0 18px 30px; }
.adm-tl-item:last-child { padding-bottom: 0; }
.adm-tl-dot {
    position: absolute;
    left: 2px;
    top: 3px;
    width: 14px;
    height: 14px;
    border-radius: 50%;
    background: #fff;
    border: 2px solid var(--adm-line);
    box-shadow: 0 0 0 3px #fff;
}
.adm-tl-item.done .adm-tl-dot { border-color: var(--adm-ok); background: var(--adm-ok); }
.adm-tl-item.now .adm-tl-dot { border-color: var(--admin-primary); background: #fff; box-shadow: 0 0 0 3px var(--adm-primary-soft); }
.adm-tl-time { font-size: .71rem; color: var(--adm-ink-3); font-variant-numeric: tabular-nums; }
.adm-tl-title { font-size: .84rem; font-weight: 650; color: var(--adm-ink); line-height: 1.4; }
.adm-tl-desc { font-size: .76rem; color: var(--adm-ink-2); margin-top: 2px; line-height: 1.65; }

/* 物流轨迹节点（原 order/detail.html 内联样式，v1.13.0 收敛） */
.shipment-timeline { padding-left: 4px; }
.shipment-node { position: relative; padding: 0 0 14px 22px; border-left: 2px solid var(--adm-line); margin-left: 6px; }
.shipment-node:last-child { border-left-color: transparent; padding-bottom: 0; }
.shipment-dot {
    position: absolute;
    left: -7px;
    top: 2px;
    width: 12px;
    height: 12px;
    border-radius: 50%;
    background: var(--adm-ink-3);
    border: 2px solid #fff;
    box-shadow: 0 0 0 1px var(--adm-line);
}
.shipment-node:first-child .shipment-dot {
    background: var(--admin-primary);
    box-shadow: 0 0 0 1px var(--admin-primary);
}

/* ============================================================
 * 10. 命令面板 adm-palette（Ctrl/⌘ + K）
 * ============================================================ */
.adm-palette {
    position: fixed;
    inset: 0;
    z-index: 2000;
    display: none;
    align-items: flex-start;
    justify-content: center;
    padding: 12vh 16px 16px;
    background: rgba(15, 23, 42, .42);
    backdrop-filter: blur(3px);
    -webkit-backdrop-filter: blur(3px);
}
.adm-palette.show { display: flex; }
.adm-palette-box {
    width: 100%;
    max-width: 560px;
    border-radius: 16px;
    background: #fff;
    box-shadow: 0 28px 70px rgba(15, 23, 42, .34);
    overflow: hidden;
    animation: admPaletteIn .18s var(--adm-ease);
}
@keyframes admPaletteIn {
    from { opacity: 0; transform: translateY(-10px) scale(.985); }
    to { opacity: 1; transform: none; }
}
.adm-palette-input {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 14px 16px;
    border-bottom: 1px solid var(--adm-line);
}
.adm-palette-input i { color: var(--adm-ink-3); font-size: 1rem; }
.adm-palette-input input {
    border: 0;
    outline: 0;
    flex: 1;
    font-size: .92rem;
    color: var(--adm-ink);
    background: transparent;
}
.adm-palette-kbd {
    font-size: .66rem;
    padding: 1px 5px;
    border-radius: 4px;
    border: 1px solid var(--adm-line);
    background: var(--adm-surface-2);
    color: var(--adm-ink-3);
    font-family: ui-monospace, monospace;
}
.adm-palette-list { max-height: 46vh; overflow-y: auto; padding: 6px; }
.adm-palette-group {
    font-size: .68rem;
    font-weight: 700;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--adm-ink-3);
    padding: 9px 11px 5px;
}
.adm-palette-item {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 11px;
    border-radius: 8px;
    color: var(--adm-ink-2);
    font-size: .85rem;
    cursor: pointer;
}
.adm-palette-item i { color: var(--admin-primary); font-size: .92rem; width: 17px; text-align: center; }
.adm-palette-item .k { margin-left: auto; font-size: .7rem; color: var(--adm-ink-3); }
.adm-palette-item.active { background: var(--adm-primary-soft); color: var(--admin-primary-deep); }
.adm-palette-empty { padding: 30px 16px; text-align: center; color: var(--adm-ink-3); font-size: .82rem; }

/* ============================================================
 * 11. Toast / 回到顶部
 * ============================================================ */
.adm-toast-wrap {
    position: fixed;
    top: 16px;
    right: 16px;
    z-index: 2010;
    display: flex;
    flex-direction: column;
    gap: 8px;
    pointer-events: none;
}
.adm-toast {
    display: flex;
    align-items: center;
    gap: 8px;
    min-width: 190px;
    max-width: 380px;
    padding: 10px 14px;
    border-radius: 10px;
    background: #101828;
    color: #f8fafc;
    font-size: .82rem;
    box-shadow: 0 12px 32px rgba(15, 23, 42, .3);
    pointer-events: auto;
    animation: admToastIn .22s var(--adm-ease);
}
.adm-toast i { font-size: .95rem; flex: 0 0 auto; }
.adm-toast.ok i { color: #4ade80; }
.adm-toast.err i { color: #f87171; }
.adm-toast.warn i { color: #fbbf24; }
@keyframes admToastIn {
    from { opacity: 0; transform: translateX(14px); }
    to { opacity: 1; transform: none; }
}
.adm-toast.hide { opacity: 0; transform: translateX(14px); transition: all .22s var(--adm-ease); }

.adm-top {
    position: fixed;
    right: 22px;
    bottom: 24px;
    z-index: 1045;
    width: 38px;
    height: 38px;
    border-radius: 50%;
    border: 1px solid var(--adm-line);
    background: rgba(255, 255, 255, .95);
    color: var(--adm-ink-2);
    box-shadow: var(--adm-shadow);
    display: none;
    align-items: center;
    justify-content: center;
    backdrop-filter: blur(8px);
}
.adm-top.show { display: inline-flex; }
.adm-top:hover { color: var(--admin-primary); border-color: var(--adm-primary-line); }

/* ============================================================
 * 12. 侧边栏折叠态（>992px 时收成图标栏）
 * ============================================================ */
@media (min-width: 992px) {
    .admin-sidebar { transition: margin-left .26s var(--adm-ease), min-width .26s var(--adm-ease); }
    body.sidebar-collapsed .admin-sidebar { margin-left: calc(-1 * var(--adm-sidebar-w)); }
    body.sidebar-collapsed .admin-main { width: 100%; }
}
.adm-sidebar-toggle {
    width: 32px;
    height: 32px;
    border-radius: 8px;
    border: 1px solid var(--adm-line);
    background: #fff;
    color: var(--adm-ink-2);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: .9rem;
}
.adm-sidebar-toggle:hover { color: var(--admin-primary); border-color: var(--adm-primary-line); }

/* 侧栏品牌：图形标 + 双行文字 */
.sidebar-brand-mark {
    width: 30px;
    height: 30px;
    flex: 0 0 30px;
    border-radius: 9px;
    display: block;
}
.sidebar-brand-text { display: flex; flex-direction: column; min-width: 0; line-height: 1.25; }
.sidebar-brand-text b {
    font-size: .96rem;
    font-weight: 750;
    letter-spacing: -.01em;
    color: inherit;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.sidebar-brand-text small {
    font-size: .66rem;
    font-weight: 500;
    opacity: .58;
    letter-spacing: .02em;
}
body[data-admin-theme="light"] .sidebar-brand-mark { border: 1px solid var(--ftm-border); }

/* 侧栏分组标题升级为可折叠按钮（若模板使用） */
.sidebar-nav .nav-group.is-toggle { display: flex; align-items: center; gap: 6px; cursor: pointer; }
.sidebar-nav .nav-group.is-toggle::after {
    content: "\F282";
    font-family: bootstrap-icons;
    font-size: .6rem;
    margin-left: auto;
    transition: transform .2s var(--adm-ease);
    opacity: .7;
}
.sidebar-nav .nav-group.is-toggle.collapsed::after { transform: rotate(-90deg); }

/* ============================================================
 * 13. 兼容层：把旧模板常见的裸结构自动补齐观感
 *     目的：不改 60+ 个旧模板也能获得统一质感
 * ============================================================ */
/* 页首裸 h1.h5 + 右侧按钮组 → 自动获得页头间距 */
main.adm-main-pad > .d-flex:first-child > h1,
main.adm-main-pad > div > h1.h5 { letter-spacing: -.01em; }

/* 旧卡片的 card-header 白底统一（避免与 adm-card 观感断层） */
.card > .card-header.bg-white {
    background: linear-gradient(180deg, #fff, var(--adm-surface-2)) !important;
    border-bottom: 1px solid var(--adm-line-soft);
    padding: 13px 18px;
}

/* 旧表格统一圆角与 hover */
.table-responsive > .table:not(.adm-table) > thead > tr > th {
    font-size: .72rem;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--adm-ink-3);
    background: var(--adm-surface-2);
    border-bottom: 1px solid var(--adm-line);
    white-space: nowrap;
    vertical-align: middle;
}
.table-responsive > .table:not(.adm-table) tbody td { vertical-align: middle; font-size: .82rem; }

/* 空态行（旧模板的 colspan 提示） */
.table td.text-center.text-muted[colspan] { padding: 34px 16px !important; font-size: .82rem; }

/* 分页统一 */
.pagination { --bs-pagination-border-radius: 8px; }
.pagination .page-link { font-size: .8rem; color: var(--adm-ink-2); border-color: var(--adm-line); }
.pagination .page-item.active .page-link {
    background: var(--admin-primary);
    border-color: var(--admin-primary);
    color: #fff;
}

/* 徽标统一尺寸 */
.badge { font-weight: 650; letter-spacing: .01em; }

/* ============================================================
 * 14. 响应式
 * ============================================================ */
@media (max-width: 1199.98px) {
    .adm-todo { grid-template-columns: repeat(auto-fit, minmax(132px, 1fr)); }
    .adm-filter-body { grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); }
}

@media (max-width: 991.98px) {
    .adm-head { margin-bottom: 14px; }
    .adm-head-ico { width: 38px; height: 38px; flex-basis: 38px; font-size: 1.02rem; }
    .adm-head-title { font-size: 1.02rem; }
    .adm-side-col { position: static; }
    .adm-grid-2, .adm-grid-3 { grid-template-columns: 1fr; }
    .adm-toolbar { padding: 10px 13px; }
    .adm-toolbar-search { max-width: none; flex: 1 1 100%; }
    .adm-panel-body { padding: 15px; }
    .adm-section-body { padding: 15px; }
}

@media (max-width: 767.98px) {
    .adm-quick { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .adm-batchbar {
        left: 12px;
        right: 12px;
        bottom: 12px;
        transform: translateY(130%);
        max-width: none;
        border-radius: 14px;
        flex-wrap: wrap;
    }
    .adm-batchbar.show { transform: translateY(0); }
    .adm-savebar { flex-wrap: wrap; }
    .adm-savebar .btn { flex: 1 1 auto; }
    .adm-table thead th, .adm-table tbody td { padding: 9px 11px; }
    .adm-palette { padding-top: 8vh; }
    .adm-top { right: 14px; bottom: 78px; }
}

@media (max-width: 479.98px) {
    .adm-head-actions { width: 100%; }
    .adm-head-actions .btn { flex: 1 1 auto; }
    .adm-todo { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .adm-todo-num { font-size: 1.2rem; }
    .adm-kpi { padding: 13px; gap: 10px; }
    .adm-kpi-value { font-size: 1.24rem; }
}

/* ============================================================
 * 14.5 登录页（品牌化左右分栏）
 * ============================================================ */
.adm-login-body {
    margin: 0;
    min-height: 100vh;
    background: var(--adm-surface-2);
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;
}
.adm-login {
    display: grid;
    grid-template-columns: 1.06fr .94fr;
    min-height: 100vh;
}

/* 左侧品牌区 */
.adm-login-brand {
    position: relative;
    overflow: hidden;
    display: flex;
    flex-direction: column;
    padding: 54px 52px 40px;
    color: #fff;
    background:
        radial-gradient(720px 380px at 82% -6%, rgba(255, 255, 255, .16), transparent 62%),
        radial-gradient(560px 420px at -8% 104%, rgba(var(--admin-primary-rgb), .5), transparent 64%),
        linear-gradient(158deg, #0a2b28 0%, #0c3a33 44%, #07211f 100%);
}
.adm-login-brand::after {
    content: "";
    position: absolute;
    right: -120px;
    bottom: -140px;
    width: 420px;
    height: 420px;
    border-radius: 50%;
    border: 1px solid rgba(255, 255, 255, .1);
    box-shadow: 0 0 0 60px rgba(255, 255, 255, .035), 0 0 0 120px rgba(255, 255, 255, .02);
    pointer-events: none;
}
.adm-login-logo { display: flex; align-items: center; gap: 11px; position: relative; z-index: 1; }
.adm-login-logo img { width: 40px; height: 40px; border-radius: 11px; }
.adm-login-logo b { font-size: 1.16rem; font-weight: 750; letter-spacing: -.015em; }
.adm-login-logo small { display: block; font-size: .68rem; opacity: .6; letter-spacing: .1em; text-transform: uppercase; }
.adm-login-pitch { position: relative; z-index: 1; margin: auto 0; }
.adm-login-pitch h1 {
    font-size: 1.92rem;
    font-weight: 800;
    line-height: 1.32;
    letter-spacing: -.025em;
    margin: 0 0 14px;
}
.adm-login-pitch h1 em { font-style: normal; color: #5eead4; }
.adm-login-pitch > p { font-size: .88rem; line-height: 1.85; color: rgba(255, 255, 255, .72); margin: 0 0 26px; max-width: 420px; }
.adm-login-points { display: grid; gap: 13px; max-width: 430px; }
.adm-login-point { display: flex; gap: 11px; align-items: flex-start; }
.adm-login-point i {
    width: 30px;
    height: 30px;
    flex: 0 0 30px;
    border-radius: 9px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: .85rem;
    color: #5eead4;
    background: rgba(255, 255, 255, .1);
    border: 1px solid rgba(255, 255, 255, .14);
}
.adm-login-point b { display: block; font-size: .84rem; font-weight: 650; margin-bottom: 1px; }
.adm-login-point small { font-size: .76rem; color: rgba(255, 255, 255, .6); line-height: 1.6; }
.adm-login-brand-foot {
    position: relative;
    z-index: 1;
    font-size: .72rem;
    color: rgba(255, 255, 255, .42);
    display: flex;
    gap: 14px;
    flex-wrap: wrap;
}

/* 右侧表单区 */
.adm-login-main {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 40px 24px;
}
.adm-login-card { width: 100%; max-width: 372px; }
.adm-login-head { margin-bottom: 26px; }
.adm-login-head h2 { font-size: 1.32rem; font-weight: 780; letter-spacing: -.02em; color: var(--adm-ink); margin: 0 0 6px; }
.adm-login-head p { font-size: .82rem; color: var(--adm-ink-3); margin: 0; }
.adm-login-field { margin-bottom: 16px; }
.adm-login-field > label {
    display: block;
    font-size: .78rem;
    font-weight: 650;
    color: var(--adm-ink-2);
    margin-bottom: 6px;
}
.adm-login-input {
    display: flex;
    align-items: center;
    gap: 0;
    height: 46px;
    border: 1px solid var(--adm-line);
    border-radius: 11px;
    background: #fff;
    overflow: hidden;
    transition: border-color .16s var(--adm-ease), box-shadow .16s var(--adm-ease);
}
.adm-login-input:focus-within {
    border-color: var(--admin-primary);
    box-shadow: 0 0 0 3.5px var(--adm-primary-soft);
}
.adm-login-input > i {
    width: 44px;
    flex: 0 0 44px;
    text-align: center;
    color: var(--adm-ink-3);
    font-size: .95rem;
}
.adm-login-input input {
    flex: 1;
    border: 0;
    outline: 0;
    height: 100%;
    padding: 0 14px 0 0;
    font-size: .9rem;
    color: var(--adm-ink);
    background: transparent;
}
.adm-login-input input::placeholder { color: var(--adm-ink-3); }
.adm-login-eye {
    width: 40px;
    height: 100%;
    border: 0;
    background: transparent;
    color: var(--adm-ink-3);
    font-size: .88rem;
}
.adm-login-eye:hover { color: var(--admin-primary); }
.adm-login-submit {
    width: 100%;
    height: 46px;
    border: 0;
    border-radius: 11px;
    font-size: .92rem;
    font-weight: 700;
    letter-spacing: .02em;
    color: #fff;
    background: linear-gradient(135deg, var(--admin-primary), var(--admin-primary-deep));
    box-shadow: 0 8px 20px rgba(var(--admin-primary-rgb), .3);
    transition: transform .16s var(--adm-ease), box-shadow .16s var(--adm-ease), filter .16s var(--adm-ease);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 7px;
}
.adm-login-submit:hover { filter: brightness(1.06); box-shadow: 0 11px 26px rgba(var(--admin-primary-rgb), .38); transform: translateY(-1px); }
.adm-login-submit:active { transform: none; }
.adm-login-alert {
    display: flex;
    align-items: flex-start;
    gap: 7px;
    padding: 10px 13px;
    margin-bottom: 18px;
    border-radius: 9px;
    font-size: .8rem;
    line-height: 1.6;
    color: #b91c1c;
    background: #fef2f2;
    border: 1px solid #fecaca;
}
.adm-login-alert i { margin-top: 1px; flex: 0 0 auto; }
/* v1.36.0：用户菜单里的退出表单与原生 dropdown-item 视觉完全对齐 */
.adm-logout-form { margin: 0; }
.adm-logout-form .dropdown-item { width: 100%; text-align: left; }
/* v1.36.0：退出登录后的正向反馈，与错误提示同构、语义色为成功绿 */
.adm-login-notice {
    display: flex;
    align-items: flex-start;
    gap: 7px;
    padding: 10px 13px;
    margin-bottom: 18px;
    border-radius: 9px;
    font-size: .8rem;
    line-height: 1.6;
    color: #047857;
    background: #ecfdf5;
    border: 1px solid #a7f3d0;
}
.adm-login-notice i { margin-top: 1px; flex: 0 0 auto; }
.adm-login-demo {
    margin-top: 20px;
    padding: 11px 13px;
    border-radius: 9px;
    background: var(--adm-surface-2);
    border: 1px dashed var(--adm-line);
    font-size: .75rem;
    color: var(--adm-ink-3);
    line-height: 1.7;
}
.adm-login-demo code {
    color: var(--admin-primary-deep);
    background: var(--adm-primary-soft);
    padding: 1px 6px;
    border-radius: 4px;
    font-size: .75rem;
}
.adm-login-foot {
    margin-top: 26px;
    display: flex;
    gap: 16px;
    justify-content: center;
    font-size: .78rem;
    color: var(--adm-ink-3);
}
.adm-login-foot a { color: var(--adm-ink-2); }
.adm-login-foot a:hover { color: var(--admin-primary); }

@media (max-width: 991.98px) {
    .adm-login { grid-template-columns: 1fr; }
    .adm-login-brand { display: none; }
    .adm-login-main { padding: 48px 20px 32px; }
    .adm-login-card { max-width: 400px; }
}
@media (max-width: 479.98px) {
    .adm-login-main { padding: 32px 16px 24px; }
    .adm-login-head h2 { font-size: 1.18rem; }
}

/* ============================================================
 * 15. 打印（订单 / 发货单）
 * ============================================================ */
@media print {
    .admin-sidebar, .admin-topbar, .admin-tabs, .adm-batchbar,
    .adm-top, .adm-toast-wrap, .adm-savebar { display: none !important; }
    .admin-main { width: 100% !important; }
    .adm-panel { box-shadow: none; border-color: #cbd5e1; break-inside: avoid; }
    main { padding: 0 !important; }
}

/* ============================================================
 * 16. 页面级样式收敛（v1.13.0）
 *     原先分散在 5 个模板的 <style> 块，统一收到此处：
 *     后台任意页面切换主题时都能跟随，且不再各自维护一份。
 * ============================================================ */

/* 来自 chat/view.html */
.admin-chat-b{max-width:78%;margin-bottom:.7rem;padding:.55rem .75rem;border-radius:11px;line-height:1.55;white-space:pre-wrap;word-break:break-word;font-size:.84rem}
.admin-chat-b.user{background:#fff;border:1px solid var(--ftm-border,#e2e8f0);border-bottom-left-radius:3px;margin-right:auto}
.admin-chat-b.admin{background:var(--admin-primary,#0d9488);color:#fff;border-bottom-right-radius:3px;margin-left:auto}
.admin-chat-b.system{background:rgba(0,0,0,.05);color:#64748b;margin:0 auto;font-size:.75rem;text-align:center}
.admin-chat-meta{font-size:.66rem;opacity:.65;margin-bottom:.15rem}

/* 来自 media/index.html */
.media-drop{border:1px dashed #dbe2ea;border-radius:12px;padding:10px;min-height:200px;transition:.15s}
.media-drop.dragover{border-color:#0d9488;background:#f0fdfa}
.media-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px}
.media-item{position:relative;border:1px solid #e8ecf2;border-radius:10px;overflow:hidden;background:#fff;cursor:pointer;margin:0;transition:.15s}
.media-item:hover{border-color:#0d9488;box-shadow:0 8px 20px rgba(15,23,42,.08)}
.media-item img{width:100%;aspect-ratio:1/1;object-fit:cover;display:block;background:#f7f8fa}
.media-item .media-check{position:absolute;top:6px;left:6px;z-index:2;opacity:0;transition:.15s}
.media-item:hover .media-check,.media-item.selected .media-check{opacity:1}
.media-item.selected{border-color:#0d9488;box-shadow:0 0 0 2px rgba(13,148,136,.25)}
.media-meta{display:block;padding:6px 8px}
.media-meta b{display:block;font-size:.72rem;font-weight:600;color:#0f172a;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.media-meta small{font-size:.66rem;color:#94a3b8}
.media-edit,.media-copy{position:absolute;top:6px;width:24px;height:24px;border:0;border-radius:6px;background:rgba(255,255,255,.92);color:#0f172a;font-size:.72rem;opacity:0;transition:.15s}
.media-edit{right:34px}
.media-copy{right:6px}
.media-item:hover .media-edit,.media-item:hover .media-copy{opacity:1}

/* 来自 setting/index.html */
.layout-option { cursor: pointer; }
.layout-option-inner {
    display: block; height: 100%; padding: 12px 14px; border: 1px solid #e6e9f0;
    border-radius: 12px; background: #fff; transition: border-color .18s, box-shadow .18s, transform .18s;
}
.layout-option:hover .layout-option-inner { border-color: #a9b4ff; transform: translateY(-1px); }
.layout-option input:checked + .layout-option-inner {
    border-color: var(--bs-primary); box-shadow: 0 0 0 3px rgba(79,70,229,.12); background: #fafaff;
}
.layout-option input:focus-visible + .layout-option-inner { outline: 2px solid var(--bs-primary); outline-offset: 2px; }

/* 来自 setting/index.html */
.theme-option { cursor: pointer; }
.theme-option:has(input:checked) { border-color: var(--bs-primary); box-shadow: 0 0 0 1px var(--bs-primary) inset; }
.theme-swatch span { display: inline-block; width: 26px; height: 14px; border-radius: 3px; margin-right: 4px; border: 1px solid rgba(0,0,0,.08); }

/* 来自 template/index.html */
.adm-status { display: flex; align-items: center; gap: 18px; flex-wrap: wrap; padding: 14px 18px;
    background: #fff; border: 1px solid #e6e9f0; border-radius: 14px; box-shadow: 0 2px 10px rgba(17,24,39,.03); }
.adm-status-item { display: flex; flex-direction: column; gap: 3px; }
.adm-status-label { font-size: .72rem; color: #8792a6; letter-spacing: .03em; }
.adm-status-item b { font-size: .92rem; }
.adm-status-item code { font-size: .72rem; color: #4f46e5; background: #f3f4ff; padding: 1px 6px; border-radius: 5px; width: fit-content; }
.adm-status-x, .adm-status-eq { color: #b9c1d0; font-size: .9rem; }
.adm-combo { background: linear-gradient(120deg, #f7f8ff, #f4fbff); border: 1px solid #e3e8f5; border-radius: 14px; overflow: hidden; }
.adm-combo-head { padding: 13px 18px 0; }
.adm-combo-head b { font-size: .92rem; }
.adm-combo-head span { display: block; font-size: .78rem; color: #6b768c; margin-top: 3px; }
.adm-combo-form { display: flex; gap: 12px; align-items: flex-end; flex-wrap: wrap; padding: 14px 18px 18px; }
.adm-field { flex: 1 1 180px; min-width: 150px; }
.adm-field label { display: block; font-size: .74rem; font-weight: 600; color: #6b768c; margin-bottom: 5px; }
.adm-combo-go { height: 31px; white-space: nowrap; }
.adm-tabs .nav-link { font-size: .86rem; }
.tpl-card, .pal-card { height: 100%; background: #fff; border: 1px solid #e6e9f0; border-radius: 14px; overflow: hidden;
    box-shadow: 0 2px 10px rgba(17,24,39,.035); transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease; }
.tpl-card:hover, .pal-card:hover { transform: translateY(-3px); box-shadow: 0 14px 34px rgba(17,24,39,.1); }
.tpl-card.is-active, .pal-card.is-active { border-color: #22a06b; box-shadow: 0 0 0 2px rgba(34,160,107,.14), 0 8px 24px rgba(17,24,39,.06); }
.tpl-thumb { position: relative; aspect-ratio: 16 / 9; background: #f3f5fa; overflow: hidden; }
.tpl-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.tpl-thumb-empty { height: 100%; display: flex; align-items: center; justify-content: center; color: #b9c1d0; font-size: 2rem; }
.tpl-badge { position: absolute; top: 10px; right: 10px; font-size: .68rem; font-weight: 600; padding: 4px 9px; border-radius: 20px; color: #fff; }
.tpl-badge.ok { background: #16a34a; }
.tpl-badge.eye { top: 10px; left: 10px; right: auto; background: #d97706; }
.tpl-badge.dark { top: 10px; left: 10px; right: auto; background: #1e293b; letter-spacing: .08em; }
.tpl-tag { position: absolute; bottom: 10px; left: 10px; font-size: .68rem; padding: 4px 9px; border-radius: 6px;
    background: rgba(255,255,255,.92); color: #334155; font-weight: 600; backdrop-filter: blur(6px); }
.tpl-body { padding: 15px 16px 16px; }
.tpl-title { font-size: .94rem; line-height: 1.35; }
.tpl-key { font-size: .68rem; color: #5b6478; background: #f4f6fa; border: 1px solid #e9edf4; padding: 2px 6px; border-radius: 5px; white-space: nowrap; }
.tpl-desc { margin: 9px 0 0; font-size: .78rem; line-height: 1.65; color: #6b768c; min-height: 3.3em; }
.tpl-feature { margin-top: 9px; font-size: .74rem; color: #4f46e5; background: #f5f5ff; border-radius: 7px; padding: 6px 9px; }
.tpl-meta { display: flex; flex-wrap: wrap; gap: 6px 12px; margin-top: 11px; font-size: .72rem; color: #8792a6; }
.tpl-recommend { margin-top: 9px; font-size: .74rem; color: #6b768c; }
.tpl-recommend b { color: #334155; }
.tpl-actions { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: 14px; padding-top: 13px; border-top: 1px solid #eef1f6; }
.tpl-actions .btn { font-size: .76rem; padding: 5px 10px; }
.pal-thumb { position: relative; height: 118px; overflow: hidden; }
.pal-bar { height: 13px; }
.pal-body { height: 100%; padding: 13px 12px; display: flex; flex-direction: column; gap: 7px; }
.pal-dot { width: 14px; height: 14px; border-radius: 50%; }
.pal-line { display: block; height: 7px; border-radius: 4px; width: 68%; }
.pal-line.short { width: 40%; }
.pal-cards { display: flex; gap: 5px; margin-top: auto; }
.pal-cards span { flex: 1; height: 30px; border-radius: 6px; }
.pal-body-content { padding: 13px 14px 15px; }
.pal-swatches { display: flex; gap: 5px; margin-top: 10px; }
.pal-swatches span { width: 22px; height: 22px; border-radius: 6px; border: 1px solid rgba(0,0,0,.08); }
.adm-footnote { font-size: .78rem; color: #6b768c; background: #fff; border: 1px dashed #dfe4ee; border-radius: 10px; padding: 12px 16px; }
.adm-footnote code { color: #4f46e5; }
@media (max-width: 767.98px) {
    .adm-status { gap: 12px; }
    .adm-status-x, .adm-status-eq { display: none; }
    .adm-combo-form { gap: 10px; }
    .adm-combo-go { width: 100%; }
    .tpl-desc { min-height: 0; }
}

/* 来自 template/score.html */
.sc-kpis { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; }
.sc-kpi { background: #fff; border: 1px solid #e6e9f0; border-radius: 14px; padding: 16px 18px; display: flex; flex-direction: column; gap: 3px; }
.sc-kpi > span { font-size: .72rem; color: #8792a6; letter-spacing: .04em; }
.sc-kpi > b { font-size: 1.7rem; line-height: 1.15; }
.sc-kpi > small { font-size: .72rem; color: #98a1b3; }
.sc-kpi.ok { background: linear-gradient(140deg, #f0fdf4, #fff); border-color: #bbf7d0; }
.sc-kpi.ok > b { color: #16a34a; }
.sc-kpi.bad { background: linear-gradient(140deg, #fff1f2, #fff); border-color: #fecdd3; }
.sc-kpi.bad > b { color: #e11d48; }
.sc-layout { display: grid; grid-template-columns: minmax(0, 1.6fr) minmax(260px, 1fr); gap: 16px; align-items: start; }
.sc-card { border: 1px solid #e6e9f0; border-radius: 14px; overflow: hidden; box-shadow: 0 2px 10px rgba(17,24,39,.035); }
.sc-table { font-size: .82rem; }
.sc-table th { font-size: .72rem; letter-spacing: .04em; color: #8792a6; background: #fafbfd; border-bottom: 1px solid #edf0f5; white-space: nowrap; }
.sc-table td { vertical-align: middle; border-bottom: 1px solid #f0f2f7; }
.sc-table code { font-size: .68rem; color: #5b6478; background: #f4f6fa; padding: 2px 6px; border-radius: 5px; }
.sc-bar { display: inline-block; width: 76px; height: 6px; border-radius: 4px; background: #edf0f6; overflow: hidden; vertical-align: middle; }
.sc-bar i { display: block; height: 100%; background: linear-gradient(90deg, #4f46e5, #22d3ee); }
.sc-num { font-weight: 700; margin-left: 8px; font-variant-numeric: tabular-nums; }
.sc-grade { display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; border-radius: 8px; font-weight: 800; font-size: .78rem; }
.sc-grade.s { background: #dcfce7; color: #15803d; }
.sc-grade.a { background: #fef3c7; color: #b45309; }
.sc-rules { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px 18px; }
.sc-rules > div { display: flex; justify-content: space-between; gap: 10px; padding: 7px 0; border-bottom: 1px dashed #edf0f5; font-size: .8rem; }
.sc-rules span { color: #4f46e5; font-weight: 700; }
.sc-allok { display: flex; flex-direction: column; align-items: center; gap: 6px; text-align: center; padding: 12px 0; }
.sc-allok i { font-size: 2rem; color: #16a34a; }
.sc-allok b { font-size: .95rem; }
.sc-allok span { font-size: .76rem; color: #8792a6; }
.sc-pre { background: #0f172a; color: #e2e8f0; border-radius: 10px; padding: 12px 14px; font-size: .75rem; line-height: 1.7; overflow-x: auto; }
@media (max-width: 991.98px) { .sc-layout { grid-template-columns: 1fr; } }
@media (max-width: 767.98px) { .sc-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); } .sc-rules { grid-template-columns: 1fr; } }

/* ============================================================
 * v1.14.0 可视化装修台
 * 左侧设置面板 + 右侧 iframe 实时预览；不改任何模板文件
 * ============================================================ */
.vz-shell {
    display: grid;
    grid-template-columns: 348px minmax(0, 1fr);
    background: var(--adm-surface, #fff);
    border: 1px solid var(--adm-line, #e7eaf0);
    border-radius: var(--adm-r-lg, 16px);
    overflow: hidden;
    box-shadow: 0 1px 2px rgba(16, 19, 34, .04), 0 12px 32px rgba(16, 19, 34, .05);
    min-height: 640px;
    height: calc(100vh - 232px);
}

/* ---------- 左栏 ---------- */
.vz-side {
    display: flex;
    flex-direction: column;
    min-height: 0;
    border-right: 1px solid var(--adm-line, #e7eaf0);
    background: var(--adm-surface, #fff);
}
.vz-side-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 8px;
    padding: 14px 16px;
    border-bottom: 1px solid var(--adm-line, #eef1f6);
    background: var(--adm-surface-2, #fafbfd);
}
.vz-side-head b { font-size: .86rem; letter-spacing: -.01em; }
.vz-side-head span { font-size: .7rem; color: var(--adm-ink-3, #98a1b3); }

.vz-scroll {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 6px 0 14px;
    scrollbar-width: thin;
}

.vz-group { border-bottom: 1px solid var(--adm-line, #f0f2f7); }
.vz-group > summary {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 12px 16px;
    font-size: .81rem;
    font-weight: 650;
    color: var(--adm-ink, #111827);
    cursor: pointer;
    list-style: none;
    user-select: none;
}
.vz-group > summary::-webkit-details-marker { display: none; }
.vz-group > summary i { color: var(--adm-primary, #0d9488); font-size: .92rem; }
.vz-group > summary em {
    margin-left: auto;
    font-style: normal;
    font-size: .68rem;
    font-weight: 500;
    color: var(--adm-ink-3, #98a1b3);
}
.vz-group > summary::after {
    content: "\F282";
    font-family: "bootstrap-icons";
    font-size: .68rem;
    color: var(--adm-ink-3, #98a1b3);
    transition: transform .18s var(--adm-ease, ease);
}
.vz-group[open] > summary::after { transform: rotate(180deg); }
.vz-group > summary:hover { background: var(--adm-surface-2, #fafbfd); }

.vz-body { padding: 2px 16px 14px; }

.vz-row { margin-bottom: 13px; }
.vz-row:last-child { margin-bottom: 0; }
.vz-row > label {
    display: block;
    font-size: .74rem;
    font-weight: 600;
    color: var(--adm-ink-2, #4b5563);
    margin-bottom: 6px;
}

/* 颜色行 */
.vz-color { display: flex; align-items: center; gap: 7px; }
.vz-color input[type="color"] {
    flex: 0 0 auto;
    width: 34px;
    height: 34px;
    padding: 0;
    border: 1px solid var(--adm-line, #dfe3ea);
    border-radius: 9px;
    background: none;
    cursor: pointer;
}
.vz-color input[type="color"]::-webkit-color-swatch-wrapper { padding: 3px; }
.vz-color input[type="color"]::-webkit-color-swatch { border: 0; border-radius: 6px; }
.vz-color input[type="text"] {
    flex: 1 1 auto;
    min-width: 0;
    height: 34px;
    padding: 0 10px;
    border: 1px solid var(--adm-line, #dfe3ea);
    border-radius: 9px;
    font-size: .78rem;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    color: var(--adm-ink, #111827);
    background: var(--adm-surface, #fff);
}
.vz-color input[type="text"]:focus {
    outline: none;
    border-color: var(--adm-primary, #0d9488);
    box-shadow: 0 0 0 3px var(--adm-primary-soft, rgba(13, 148, 136, .12));
}
.vz-clear {
    flex: 0 0 auto;
    width: 30px;
    height: 34px;
    border: 1px solid var(--adm-line, #dfe3ea);
    border-radius: 9px;
    background: var(--adm-surface-2, #fafbfd);
    color: var(--adm-ink-3, #98a1b3);
    font-size: .78rem;
    line-height: 1;
    cursor: pointer;
    transition: .15s var(--adm-ease, ease);
}
.vz-clear:hover { color: var(--adm-ink, #111827); border-color: var(--adm-ink-3, #98a1b3); }

.vz-presets {
    display: flex;
    align-items: center;
    gap: 6px;
    margin-top: 12px;
    padding-top: 11px;
    border-top: 1px dashed var(--adm-line, #eef1f6);
}
.vz-presets > span { font-size: .7rem; color: var(--adm-ink-3, #98a1b3); margin-right: 2px; }
.vz-presets button {
    width: 22px;
    height: 22px;
    padding: 0;
    border: 1px solid rgba(17, 24, 39, .1);
    border-radius: 50%;
    background: none;
    cursor: pointer;
    overflow: hidden;
    transition: transform .15s var(--adm-ease, ease);
}
.vz-presets button i { display: block; width: 100%; height: 100%; }
.vz-presets button:hover { transform: scale(1.15); }

/* 滑块行 */
.vz-range { display: flex; align-items: center; gap: 10px; }
.vz-range input[type="range"] {
    flex: 1 1 auto;
    min-width: 0;
    height: 4px;
    border-radius: 3px;
    background: var(--adm-surface-3, #edf0f5);
    -webkit-appearance: none;
    appearance: none;
    outline: none;
}
.vz-range input[type="range"]::-webkit-slider-thumb {
    -webkit-appearance: none;
    width: 16px;
    height: 16px;
    border-radius: 50%;
    background: var(--adm-primary, #0d9488);
    border: 2px solid #fff;
    box-shadow: 0 1px 4px rgba(16, 19, 34, .25);
    cursor: pointer;
}
.vz-range input[type="range"]::-moz-range-thumb {
    width: 14px;
    height: 14px;
    border-radius: 50%;
    background: var(--adm-primary, #0d9488);
    border: 2px solid #fff;
    cursor: pointer;
}
.vz-range output {
    flex: 0 0 auto;
    min-width: 54px;
    text-align: right;
    font-size: .74rem;
    font-variant-numeric: tabular-nums;
    color: var(--adm-ink-2, #4b5563);
}

/* 下拉 */
.vz-body select {
    width: 100%;
    height: 34px;
    padding: 0 10px;
    border: 1px solid var(--adm-line, #dfe3ea);
    border-radius: 9px;
    font-size: .78rem;
    color: var(--adm-ink, #111827);
    background: var(--adm-surface, #fff);
}
.vz-body select:focus {
    outline: none;
    border-color: var(--adm-primary, #0d9488);
    box-shadow: 0 0 0 3px var(--adm-primary-soft, rgba(13, 148, 136, .12));
}

.vz-tip {
    display: flex;
    gap: 6px;
    margin: 10px 0 0;
    font-size: .7rem;
    line-height: 1.6;
    color: var(--adm-ink-3, #98a1b3);
}

/* 开关列表 */
/* v1.15.0：预览页面切换 / 选项组 / 板块组合 */
.vz-pager {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 5px 10px;
    border: 1px solid var(--adm-line, #e7eaf0);
    border-radius: 9px;
    background: var(--adm-surface-2, #f8fafc);
}
.vz-pager > i { color: var(--adm-ink-3, #94a3b8); font-size: .82rem; }
.vz-pager select {
    border: 0;
    background: transparent;
    font-size: .78rem;
    font-weight: 600;
    color: var(--adm-ink, #0f172a);
    padding: 2px 2px;
    outline: none;
    cursor: pointer;
    max-width: 120px;
}

.vz-choice { display: flex; gap: 5px; }
.vz-choice button {
    flex: 1;
    padding: 7px 4px;
    font-size: .74rem;
    font-weight: 600;
    border: 1px solid var(--adm-line, #e7eaf0);
    background: var(--adm-surface, #fff);
    color: var(--adm-ink-2, #475569);
    border-radius: 8px;
    cursor: pointer;
    transition: .15s var(--adm-ease, ease);
}
.vz-choice button:hover { border-color: var(--adm-primary, #0d9488); color: var(--adm-primary, #0d9488); }
.vz-choice button.is-on {
    background: var(--adm-primary, #0d9488);
    border-color: var(--adm-primary, #0d9488);
    color: #fff;
    box-shadow: 0 4px 10px rgba(13, 148, 136, .24);
}

.vz-presets button.vz-chip {
    width: auto;
    height: auto;
    padding: 5px 11px;
    font-size: .72rem;
    font-weight: 600;
    line-height: 1.4;
    border: 1px solid var(--adm-line, #e7eaf0);
    border-radius: 999px;
    background: var(--adm-surface, #fff);
    color: var(--adm-ink-2, #475569);
    cursor: pointer;
    transition: .15s var(--adm-ease, ease);
}
.vz-presets button.vz-chip:hover {
    transform: none;
    border-color: var(--adm-primary, #0d9488);
    color: var(--adm-primary, #0d9488);
    background: var(--adm-primary-soft, rgba(13, 148, 136, .07));
}
.vz-bpreset {
    flex-wrap: wrap;
    margin: 0 0 12px;
    padding-bottom: 12px;
    border-bottom: 1px dashed var(--adm-line, #e7eaf0);
}

.vz-blocks { display: flex; flex-direction: column; gap: 2px; }
.vz-switch {
    display: grid;
    grid-template-columns: 34px minmax(0, 1fr);
    grid-template-rows: auto auto;
    column-gap: 10px;
    align-items: center;
    padding: 8px 4px;
    margin: 0;
    border-radius: 9px;
    cursor: pointer;
    transition: background .15s var(--adm-ease, ease);
}
.vz-switch:hover { background: var(--adm-surface-2, #fafbfd); }
.vz-switch input { position: absolute; opacity: 0; pointer-events: none; }
.vz-switch::before {
    content: "";
    grid-row: 1 / span 2;
    width: 34px;
    height: 20px;
    border-radius: 999px;
    background: var(--adm-surface-3, #dfe3ea);
    background-image: radial-gradient(circle at 10px 10px, #fff 6px, transparent 6.5px);
    transition: .18s var(--adm-ease, ease);
}
.vz-switch:has(input:checked)::before,
.vz-switch.is-on::before {
    background-color: var(--adm-primary, #0d9488);
    background-image: radial-gradient(circle at 24px 10px, #fff 6px, transparent 6.5px);
}
.vz-switch span { font-size: .78rem; font-weight: 600; color: var(--adm-ink, #111827); }
.vz-switch small { font-size: .68rem; color: var(--adm-ink-3, #98a1b3); line-height: 1.4; }

.vz-note {
    display: flex;
    gap: 9px;
    margin: 14px 16px 0;
    padding: 11px 12px;
    border-radius: 11px;
    background: #fffbeb;
    border: 1px solid #fde68a;
}
.vz-note i { color: #b45309; font-size: .9rem; margin-top: 1px; }
.vz-note b { display: block; font-size: .75rem; color: #92400e; margin-bottom: 2px; }
.vz-note span { font-size: .7rem; line-height: 1.6; color: #a16207; }

/* 底部按钮 */
.vz-side-foot {
    flex: 0 0 auto;
    padding: 12px 16px 14px;
    border-top: 1px solid var(--adm-line, #eef1f6);
    background: var(--adm-surface-2, #fafbfd);
}

/* ---------- 右栏 ---------- */
.vz-stage {
    display: flex;
    flex-direction: column;
    min-width: 0;
    min-height: 0;
    background: var(--adm-surface-3, #f3f5f9);
}
.vz-bar {
    display: flex;
    align-items: center;
    gap: 12px;
    flex-wrap: wrap;
    padding: 10px 14px;
    border-bottom: 1px solid var(--adm-line, #e7eaf0);
    background: var(--adm-surface, #fff);
}
.vz-devices { display: inline-flex; gap: 2px; padding: 3px; border-radius: 10px; background: var(--adm-surface-3, #f1f4f8); }
.vz-devices button {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    height: 28px;
    padding: 0 11px;
    border: 0;
    border-radius: 8px;
    background: transparent;
    color: var(--adm-ink-2, #4b5563);
    font-size: .74rem;
    font-weight: 600;
    cursor: pointer;
    transition: .15s var(--adm-ease, ease);
}
.vz-devices button:hover { color: var(--adm-ink, #111827); }
.vz-devices button.is-on {
    background: var(--adm-surface, #fff);
    color: var(--adm-primary, #0d9488);
    box-shadow: 0 1px 3px rgba(16, 19, 34, .12);
}
.vz-devices button i { font-size: .86rem; }

.vz-url {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    min-width: 0;
    padding: 4px 10px;
    border-radius: 8px;
    background: var(--adm-surface-2, #f7f9fc);
    border: 1px solid var(--adm-line, #eef1f6);
    font-size: .72rem;
    color: var(--adm-ink-3, #8b95a7);
}
.vz-url span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.vz-dirty { display: inline-flex; align-items: center; gap: 4px; font-size: .7rem; color: #b45309; }
.vz-dirty i { font-size: .44rem; }

.vz-frame-wrap {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    justify-content: center;
    padding: 14px;
    overflow: hidden;
}
.vz-frame-wrap iframe {
    width: 100%;
    height: 100%;
    border: 0;
    border-radius: 12px;
    background: #fff;
    box-shadow: 0 2px 6px rgba(16, 19, 34, .06), 0 18px 44px rgba(16, 19, 34, .10);
    transition: width .22s var(--adm-ease, ease);
}
.vz-frame-wrap[data-device="tablet"] iframe { width: 834px; max-width: 100%; }
.vz-frame-wrap[data-device="mobile"] iframe { width: 390px; max-width: 100%; }

/* toast */
.vz-toast {
    position: fixed;
    left: 50%;
    bottom: 30px;
    transform: translate(-50%, 12px);
    z-index: 3000;
    padding: 10px 18px;
    border-radius: 10px;
    background: #111827;
    color: #fff;
    font-size: .8rem;
    box-shadow: 0 12px 30px rgba(2, 6, 23, .35);
    opacity: 0;
    transition: opacity .2s ease, transform .2s ease;
}
.vz-toast.is-on { opacity: 1; transform: translate(-50%, 0); }
.vz-toast.is-err { background: #b91c1c; }
.vz-toast.is-ok { background: #0f766e; }

@media (max-width: 1199.98px) {
    .vz-shell { grid-template-columns: 1fr; height: auto; min-height: 0; }
    .vz-side { border-right: 0; border-bottom: 1px solid var(--adm-line, #e7eaf0); }
    .vz-scroll { max-height: 420px; }
    .vz-side-foot { position: sticky; bottom: 0; }
    .vz-frame-wrap { height: 68vh; }
}
@media (max-width: 767.98px) {
    .vz-bar { gap: 8px; flex-wrap: wrap; }
    .vz-url { display: none; }
    .vz-pager { order: 3; flex: 1 1 100%; }
    .vz-pager select { max-width: none; flex: 1; }
    .vz-frame-wrap { padding: 8px; height: 62vh; }
}

/* ============================================================
 * v1.14.0 模板源码编辑器
 * ============================================================ */
.vc-shell {
    display: grid;
    grid-template-columns: 272px minmax(0, 1fr);
    background: var(--adm-surface, #fff);
    border: 1px solid var(--adm-line, #e7eaf0);
    border-radius: var(--adm-r-lg, 16px);
    overflow: hidden;
    box-shadow: 0 1px 2px rgba(16, 19, 34, .04), 0 12px 32px rgba(16, 19, 34, .05);
    height: calc(100vh - 232px);
    min-height: 560px;
}

/* ---------- 文件树 ---------- */
.vc-tree {
    display: flex;
    flex-direction: column;
    min-height: 0;
    border-right: 1px solid var(--adm-line, #e7eaf0);
    background: var(--adm-surface, #fff);
}
.vc-tree-head {
    flex: 0 0 auto;
    padding: 12px 14px;
    border-bottom: 1px solid var(--adm-line, #eef1f6);
    background: var(--adm-surface-2, #fafbfd);
}
.vc-tree-head label {
    display: block;
    font-size: .68rem;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--adm-ink-3, #98a1b3);
    margin-bottom: 6px;
}
.vc-tree-head select {
    width: 100%;
    height: 32px;
    padding: 0 8px;
    border: 1px solid var(--adm-line, #dfe3ea);
    border-radius: 8px;
    font-size: .78rem;
    color: var(--adm-ink, #111827);
    background: var(--adm-surface, #fff);
}
.vc-tree-body { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: 6px 8px 14px; scrollbar-width: thin; }

.vc-group > summary {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 7px 8px;
    border-radius: 7px;
    font-size: .76rem;
    font-weight: 650;
    color: var(--adm-ink-2, #4b5563);
    cursor: pointer;
    list-style: none;
    user-select: none;
}
.vc-group > summary::-webkit-details-marker { display: none; }
.vc-group > summary:hover { background: var(--adm-surface-2, #f7f9fc); }
.vc-group > summary i { color: var(--adm-primary, #0d9488); font-size: .82rem; }
.vc-group > summary em {
    margin-left: auto;
    font-style: normal;
    font-size: .68rem;
    color: var(--adm-ink-3, #98a1b3);
    font-variant-numeric: tabular-nums;
}
.vc-files { display: flex; flex-direction: column; gap: 1px; padding-left: 6px; margin-bottom: 4px; }
.vc-file {
    display: grid;
    grid-template-columns: 16px minmax(0, 1fr) auto;
    align-items: center;
    gap: 6px;
    width: 100%;
    padding: 6px 8px;
    border: 0;
    border-radius: 7px;
    background: transparent;
    text-align: left;
    font-size: .75rem;
    color: var(--adm-ink-2, #4b5563);
    cursor: pointer;
    transition: background .14s var(--adm-ease, ease), color .14s var(--adm-ease, ease);
}
.vc-file i { font-size: .78rem; color: var(--adm-ink-3, #98a1b3); }
.vc-file span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.vc-file small { font-size: .64rem; color: var(--adm-ink-3, #a3abbb); font-variant-numeric: tabular-nums; }
.vc-file:hover { background: var(--adm-surface-2, #f7f9fc); color: var(--adm-ink, #111827); }
.vc-file.is-on {
    background: var(--adm-primary-soft, rgba(13, 148, 136, .1));
    color: var(--adm-primary, #0d9488);
    font-weight: 600;
}
.vc-file.is-on i { color: var(--adm-primary, #0d9488); }

.vc-empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 8px;
    padding: 34px 12px;
    font-size: .76rem;
    color: var(--adm-ink-3, #98a1b3);
    text-align: center;
}
.vc-empty i { font-size: 1.3rem; }

/* ---------- 编辑区 ---------- */
.vc-main { display: flex; flex-direction: column; min-width: 0; min-height: 0; background: #0f172a; }

.vc-toolbar {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
    padding: 9px 12px;
    border-bottom: 1px solid #1e293b;
    background: #131c2e;
}
.vc-path {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    min-width: 0;
    font-size: .74rem;
    color: #94a3b8;
}
.vc-path i { color: #38bdf8; }
.vc-path span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.vc-path .vc-ro {
    font-style: normal;
    font-size: .64rem;
    padding: 1px 6px;
    border-radius: 999px;
    background: rgba(239, 68, 68, .16);
    color: #fca5a5;
    margin-left: 4px;
}
.vc-actions { display: flex; align-items: center; gap: 7px; margin-left: auto; }
.vc-actions .btn-light { background: #1e293b; border-color: #334155; color: #cbd5e1; }
.vc-actions .btn-light:hover { background: #273449; color: #fff; }
.vc-actions .btn-light:disabled { opacity: .45; }

.vc-findbar {
    display: flex;
    align-items: center;
    gap: 6px;
    flex-wrap: wrap;
    padding: 8px 12px;
    border-bottom: 1px solid #1e293b;
    background: #162034;
}
.vc-findbar input {
    height: 30px;
    padding: 0 9px;
    border: 1px solid #334155;
    border-radius: 7px;
    background: #0b1220;
    color: #e2e8f0;
    font-size: .76rem;
    min-width: 150px;
    flex: 1 1 150px;
}
.vc-findbar input:focus { outline: none; border-color: #0d9488; }
.vc-findbar .btn-light { background: #1e293b; border-color: #334155; color: #cbd5e1; }

.vc-editor {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    overflow: hidden;
    position: relative;
}
.vc-gutter {
    flex: 0 0 auto;
    width: 56px;
    margin: 0;
    padding: 12px 9px 40px 0;
    border: 0;
    background: #0b1220;
    color: #4b5c74;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
    font-size: 12.5px;
    line-height: 20.6px;
    text-align: right;
    overflow: hidden;
    user-select: none;
}
#vcCode {
    flex: 1 1 auto;
    min-width: 0;
    margin: 0;
    padding: 12px 16px 40px 12px;
    border: 0;
    outline: none;
    resize: none;
    background: #0f172a;
    color: #e2e8f0;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
    font-size: 12.5px;
    line-height: 20.6px;
    tab-size: 2;
    white-space: pre;
    overflow: auto;
    caret-color: #38bdf8;
}
#vcCode:disabled { background: #0f172a; color: #64748b; }
#vcCode::selection { background: rgba(56, 189, 248, .28); }

.vc-status {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
    padding: 7px 14px;
    border-top: 1px solid #1e293b;
    background: #131c2e;
    font-size: .7rem;
    color: #94a3b8;
}
.vc-hint { display: inline-flex; align-items: center; gap: 5px; }
.vc-hint kbd {
    padding: 1px 5px;
    border-radius: 4px;
    background: #1e293b;
    border: 1px solid #334155;
    color: #cbd5e1;
    font-size: .64rem;
    font-family: inherit;
}

@media (max-width: 991.98px) {
    .vc-shell { grid-template-columns: 1fr; height: auto; }
    .vc-tree { border-right: 0; border-bottom: 1px solid var(--adm-line, #e7eaf0); }
    .vc-tree-body { max-height: 240px; }
    .vc-editor { height: 58vh; }
    .vc-hint { display: none; }
}

/* ============================================================
 * v1.14.1 仪表盘降级提示
 * 统计项加载失败时使用，避免整页 500（见 Index::index 的 try/catch）
 * ============================================================ */
.adm-alert-warn {
    display: flex;
    gap: 11px;
    padding: 13px 16px;
    margin-bottom: 16px;
    border-radius: 12px;
    background: #fffbeb;
    border: 1px solid #fde68a;
    color: #92400e;
    font-size: .8rem;
    line-height: 1.7;
}
.adm-alert-warn > i {
    flex: 0 0 auto;
    margin-top: 2px;
    font-size: 1rem;
    color: #b45309;
}
.adm-alert-warn b { display: block; color: #78350f; font-size: .84rem; margin-bottom: 2px; }
.adm-alert-warn span { display: block; color: #a16207; }
.adm-alert-warn a { color: #92400e; text-decoration: underline; text-underline-offset: 2px; }
.adm-alert-warn code {
    display: block;
    margin-top: 6px;
    padding: 6px 9px;
    border-radius: 7px;
    background: rgba(180, 83, 9, .08);
    color: #7c2d12;
    font-size: .72rem;
    word-break: break-all;
}

/* ============================================================
 * v1.14.2 仪表盘重构（dash- 前缀）
 * 目标：把「一堆等重卡片」改成「有主次的指挥中心」
 *  - 顶部渐变问候条承担品牌感与主行动
 *  - 4 个 KPI 承担数字重心（大字号 + 环比）
 *  - 待办改成列表行，一屏能扫完 6 项
 * ============================================================ */
.dash-hero {
    position: relative;
    overflow: hidden;
    display: flex;
    align-items: center;
    gap: 24px;
    flex-wrap: wrap;
    padding: 26px 28px;
    margin-bottom: 16px;
    border-radius: 18px;
    background: linear-gradient(120deg, #0f766e 0%, #0d9488 42%, #0e7490 100%);
    color: #fff;
    box-shadow: 0 18px 40px rgba(13, 148, 136, .22);
}
.dash-hero-glow {
    position: absolute;
    right: -60px;
    top: -90px;
    width: 320px;
    height: 320px;
    border-radius: 50%;
    background: radial-gradient(circle, rgba(255, 255, 255, .22), transparent 68%);
    pointer-events: none;
}
.dash-hero-main { position: relative; flex: 1 1 340px; min-width: 0; }
.dash-hero-eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: .72rem;
    letter-spacing: .02em;
    color: rgba(255, 255, 255, .78);
}
.dash-hero-title {
    margin: 8px 0 8px;
    font-size: 1.62rem;
    line-height: 1.25;
    font-weight: 800;
    letter-spacing: -.03em;
    color: #fff;
}
.dash-hero-desc {
    margin: 0;
    font-size: .84rem;
    line-height: 1.7;
    color: rgba(255, 255, 255, .82);
}
.dash-hero-desc b { color: #fff; font-weight: 700; }

.dash-hero-actions { position: relative; display: flex; gap: 8px; flex-wrap: wrap; }
.dash-hbtn {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    height: 36px;
    padding: 0 14px;
    border-radius: 10px;
    font-size: .8rem;
    font-weight: 600;
    color: #e6fffb;
    background: rgba(255, 255, 255, .14);
    border: 1px solid rgba(255, 255, 255, .22);
    text-decoration: none;
    backdrop-filter: blur(4px);
    transition: .16s var(--adm-ease, ease);
}
.dash-hbtn:hover { background: rgba(255, 255, 255, .24); color: #fff; }
.dash-hbtn.is-primary {
    background: #fff;
    border-color: #fff;
    color: #0f766e;
    box-shadow: 0 6px 16px rgba(2, 6, 23, .18);
}
.dash-hbtn.is-primary:hover { background: #f0fdfa; color: #115e59; }

/* ---------- KPI ---------- */
.dash-kpis {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 14px;
    margin-bottom: 16px;
}
.dash-kpi {
    position: relative;
    overflow: hidden;
    padding: 17px 18px 15px;
    background: var(--adm-surface, #fff);
    border: 1px solid var(--adm-line, #e7eaf0);
    border-radius: 15px;
    box-shadow: 0 1px 2px rgba(16, 19, 34, .04), 0 8px 22px rgba(16, 19, 34, .045);
}
.dash-kpi::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 3px;
    background: var(--dash-tone, #0d9488);
}
.dash-kpi[data-tone="teal"]   { --dash-tone: #0d9488; --dash-soft: #ecfdf5; }
.dash-kpi[data-tone="blue"]   { --dash-tone: #0284c7; --dash-soft: #eff6ff; }
.dash-kpi[data-tone="violet"] { --dash-tone: #7c3aed; --dash-soft: #f5f3ff; }
.dash-kpi[data-tone="amber"]  { --dash-tone: #d97706; --dash-soft: #fffbeb; }

.dash-kpi-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; }
.dash-kpi-label { font-size: .76rem; font-weight: 600; color: var(--adm-ink-3, #8b95a7); }
.dash-kpi-ico {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    border-radius: 9px;
    background: var(--dash-soft, #f3f4f6);
    color: var(--dash-tone, #0d9488);
    font-size: .88rem;
}
.dash-kpi-value {
    margin: 10px 0 9px;
    font-size: 1.92rem;
    line-height: 1.05;
    font-weight: 800;
    letter-spacing: -.035em;
    color: var(--adm-ink, #111827);
    font-variant-numeric: tabular-nums;
}
.dash-kpi-value em {
    font-style: normal;
    font-size: .76rem;
    font-weight: 600;
    color: var(--adm-ink-3, #98a1b3);
    margin-left: 4px;
    letter-spacing: 0;
}
.dash-kpi-value i {
    font-style: normal;
    font-size: 1rem;
    font-weight: 700;
    color: var(--adm-ink-3, #98a1b3);
    margin-right: 2px;
    vertical-align: 6px;
}
.dash-kpi-foot { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
.dash-kpi-note { font-size: .7rem; color: var(--adm-ink-3, #a3abbb); }

.dash-trend {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    padding: 2px 7px;
    border-radius: 999px;
    font-size: .7rem;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
}
.dash-trend.is-up   { background: #ecfdf5; color: #047857; }
.dash-trend.is-down { background: #fef2f2; color: #b91c1c; }
.dash-trend.is-flat { background: var(--adm-surface-3, #f3f4f6); color: var(--adm-ink-3, #8b95a7); font-weight: 600; }
.dash-trend.is-warn { background: #fffbeb; color: #b45309; }

/* ---------- 两栏 ---------- */
.dash-grid-2 {
    display: grid;
    grid-template-columns: minmax(0, 1.32fr) minmax(0, 1fr);
    gap: 14px;
    margin-bottom: 16px;
    align-items: start;
}

/* ---------- 待办行 ---------- */
.dash-todo { display: flex; flex-direction: column; }
.dash-todo-row {
    display: grid;
    grid-template-columns: 34px minmax(0, 1fr) auto 14px;
    align-items: center;
    gap: 12px;
    padding: 11px 16px;
    border-bottom: 1px solid var(--adm-line, #f1f3f8);
    text-decoration: none;
    color: inherit;
    transition: background .14s var(--adm-ease, ease);
}
.dash-todo-row:last-child { border-bottom: 0; }
.dash-todo-row:hover { background: var(--adm-surface-2, #fafbfd); }
.dash-todo-ico {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 34px;
    height: 34px;
    border-radius: 10px;
    font-size: .92rem;
    background: var(--adm-surface-3, #f3f4f6);
    color: var(--adm-ink-2, #4b5563);
}
.dash-todo-row[data-tone="amber"]  .dash-todo-ico { background: #fffbeb; color: #b45309; }
.dash-todo-row[data-tone="slate"]  .dash-todo-ico { background: #f1f5f9; color: #475569; }
.dash-todo-row[data-tone="rose"]   .dash-todo-ico { background: #fff1f2; color: #be123c; }
.dash-todo-row[data-tone="teal"]   .dash-todo-ico { background: #ecfdf5; color: #0f766e; }
.dash-todo-row[data-tone="blue"]   .dash-todo-ico { background: #eff6ff; color: #1d4ed8; }
.dash-todo-row[data-tone="orange"] .dash-todo-ico { background: #fff7ed; color: #c2410c; }

.dash-todo-text { min-width: 0; }
.dash-todo-text b { display: block; font-size: .82rem; font-weight: 650; color: var(--adm-ink, #111827); }
.dash-todo-text small { display: block; font-size: .71rem; color: var(--adm-ink-3, #98a1b3); line-height: 1.5; }
.dash-todo-num {
    font-size: 1.12rem;
    font-weight: 800;
    letter-spacing: -.02em;
    color: var(--adm-ink-2, #6b7280);
    font-variant-numeric: tabular-nums;
}
.dash-todo-row.is-hot .dash-todo-num { color: #b91c1c; }
.dash-todo-arrow { color: var(--adm-ink-3, #c3c9d4); font-size: .72rem; }
.dash-todo-row:hover .dash-todo-arrow { color: var(--adm-primary, #0d9488); }

/* ---------- 快捷宫格 ---------- */
.dash-actions {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 8px;
}
.dash-action {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 6px;
    padding: 13px 6px;
    border-radius: 11px;
    background: var(--adm-surface-2, #fafbfd);
    border: 1px solid transparent;
    color: var(--adm-ink-2, #4b5563);
    text-decoration: none;
    font-size: .72rem;
    font-weight: 600;
    transition: .16s var(--adm-ease, ease);
}
.dash-action i { font-size: 1.06rem; color: var(--adm-primary, #0d9488); }
.dash-action:hover {
    background: #fff;
    border-color: var(--adm-line, #e7eaf0);
    color: var(--adm-ink, #111827);
    box-shadow: 0 6px 16px rgba(16, 19, 34, .07);
    transform: translateY(-1px);
}

.dash-assets {
    display: flex;
    flex-wrap: wrap;
    gap: 6px 16px;
    margin-top: 12px;
    padding-top: 12px;
    border-top: 1px dashed var(--adm-line, #eef1f6);
    font-size: .72rem;
    color: var(--adm-ink-3, #8b95a7);
}
.dash-assets b { color: var(--adm-ink, #111827); font-weight: 700; font-variant-numeric: tabular-nums; }

/* ---------- 图表 ---------- */
.dash-charts {
    display: grid;
    grid-template-columns: minmax(0, 1.85fr) minmax(0, 1fr);
    gap: 14px;
    margin-bottom: 16px;
}
.dash-chart-box { height: 230px; }
.dash-donut-box { height: 230px; display: flex; align-items: center; justify-content: center; }
.dash-bars-box { min-height: 180px; }

.dash-gateway {
    display: inline-block;
    padding: 2px 8px;
    border-radius: 6px;
    background: var(--adm-surface-3, #f3f4f6);
    font-size: .7rem;
    font-weight: 600;
    letter-spacing: .03em;
    text-transform: uppercase;
    color: var(--adm-ink-2, #4b5563);
}
.dash-clip {
    display: inline-block;
    max-width: 380px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    vertical-align: bottom;
}

@media (max-width: 1399.98px) {
    .dash-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 1199.98px) {
    .dash-grid-2, .dash-charts { grid-template-columns: 1fr; }
}
@media (max-width: 767.98px) {
    .dash-hero { padding: 20px; border-radius: 14px; }
    .dash-hero-title { font-size: 1.3rem; }
    .dash-kpis { grid-template-columns: 1fr; gap: 10px; }
    .dash-actions { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    .dash-todo-row { grid-template-columns: 30px minmax(0, 1fr) auto; gap: 10px; padding: 10px 12px; }
    .dash-todo-arrow { display: none; }
    .dash-chart-box, .dash-donut-box { height: 200px; }
}

/* ============================================================
 * v1.14.2 列表缩略图
 * 模板里早就用了 adm-thumb，但样式表里一直缺这一条 ——
 * 结果图片按原始尺寸把表格撑开，是列表「看着乱」的直接原因
 * ============================================================ */
.adm-thumb {
    display: block;
    width: 44px;
    height: 44px;
    border-radius: 9px;
    object-fit: cover;
    border: 1px solid var(--adm-line, #e7eaf0);
    background: #f7f9fc;
    transition: border-color .15s var(--adm-ease, ease), transform .15s var(--adm-ease, ease);
}
a:hover > .adm-thumb { border-color: var(--adm-primary, #0d9488); transform: scale(1.04); }

.adm-thumb-ph {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    border-radius: 9px;
    border: 1px dashed var(--adm-line, #dfe3ea);
    background: var(--adm-surface-2, #fafbfd);
    color: var(--adm-ink-3, #b6bdcb);
    font-size: .95rem;
}

/* ============================================================
 * v1.14.2 商品发布页（.prod-form 作用域）
 * 只做视觉层：不动 DOM 结构、不动任何 id，避免影响表单那套 JS
 * ============================================================ */
.prod-form .card {
    background: var(--adm-surface, #fff);
    border: 1px solid var(--adm-line, #e7eaf0);
    border-radius: 14px;
    box-shadow: 0 1px 2px rgba(16, 19, 34, .035);
    overflow: hidden;
}
.prod-form .card + .card { margin-top: 0; }

.prod-form .card-header {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 13px 18px;
    background: var(--adm-surface-2, #fafbfd) !important;
    border-bottom: 1px solid var(--adm-line, #eef1f6);
    font-size: .84rem;
    font-weight: 650;
    letter-spacing: -.01em;
    color: var(--adm-ink, #111827);
}
/* 左侧品牌色竖条：9 个卡片自动获得统一的视觉锚点，无需改 HTML */
.prod-form .card-header::before {
    content: "";
    flex: 0 0 auto;
    width: 3px;
    height: 15px;
    border-radius: 2px;
    background: var(--adm-primary, #0d9488);
}
.prod-form .card-header .btn { --bs-btn-padding-y: .18rem; font-size: .74rem; }

.prod-form .card-body { padding: 18px; }
.prod-form .card-body > .row { --bs-gutter-x: 14px; --bs-gutter-y: 14px; }

.prod-form .form-label {
    font-size: .76rem;
    font-weight: 600;
    color: var(--adm-ink-2, #4b5563);
    margin-bottom: 6px;
}
.prod-form .form-label .text-danger { font-weight: 400; margin-left: 2px; }

.prod-form .form-control,
.prod-form .form-select {
    min-height: 38px;
    padding: 6px 11px;
    border: 1px solid var(--adm-line, #dfe3ea);
    border-radius: 9px;
    font-size: .84rem;
    color: var(--adm-ink, #111827);
    background-color: #fff;
    transition: border-color .14s var(--adm-ease, ease), box-shadow .14s var(--adm-ease, ease);
}
.prod-form .form-control:focus,
.prod-form .form-select:focus {
    border-color: var(--adm-primary, #0d9488);
    box-shadow: 0 0 0 3px var(--adm-primary-soft, rgba(13, 148, 136, .12));
    outline: none;
}
.prod-form .form-control::placeholder { color: #b6bdcb; }
.prod-form .form-control-sm,
.prod-form .form-select-sm { min-height: 32px; font-size: .78rem; border-radius: 8px; }
.prod-form textarea.form-control { padding-top: 9px; line-height: 1.7; }
.prod-form .form-text { font-size: .71rem; color: var(--adm-ink-3, #98a1b3); line-height: 1.6; }
.prod-form .form-check-input { border-radius: 4px; }
.prod-form .form-check-input:checked {
    background-color: var(--adm-primary, #0d9488);
    border-color: var(--adm-primary, #0d9488);
}
.prod-form .form-check-label { font-size: .79rem; color: var(--adm-ink-2, #4b5563); }

/* 右列（发布设置）—— 内容不长时粘住，滚动左列时不必来回找保存按钮 */
.prod-form .col-xl-4 > .card:first-child { position: sticky; top: 10px; }

/* SKU 宽表 */
.prod-form .sku-table { font-size: .78rem; }
.prod-form .sku-table thead th {
    position: sticky;
    top: 0;
    z-index: 2;
    background: var(--adm-surface-2, #fafbfd);
    font-size: .7rem;
    font-weight: 650;
    letter-spacing: .02em;
    color: var(--adm-ink-3, #8b95a7);
    white-space: nowrap;
    border-bottom: 1px solid var(--adm-line, #e7eaf0);
}
.prod-form .sku-table tbody td { vertical-align: middle; padding: 6px 8px; }
.prod-form .sku-table .form-control { min-height: 32px; font-size: .78rem; padding: 4px 8px; }

/* 采集条 */
.prod-form ~ #collectorBar .card-body,
#collectorBar .card-body { padding: 14px 18px; }

@media (max-width: 1199.98px) {
    .prod-form .col-xl-4 > .card:first-child { position: static; }
}

/* ============================================================
 * v1.14.2 页面文案编辑（/admin/visual/strings）
 * ============================================================ */
.adm-alert-ok {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 11px 15px;
    margin-bottom: 14px;
    border-radius: 11px;
    background: #ecfdf5;
    border: 1px solid #a7f3d0;
    color: #065f46;
    font-size: .82rem;
}
.adm-alert-ok i { color: #047857; }

.str-table { font-size: .8rem; }
.str-table td { vertical-align: middle; padding: 8px 10px; }
.str-table .form-control { min-height: 34px; padding: 4px 9px; font-size: .8rem; border-radius: 8px; }
.str-key {
    font-size: .7rem;
    color: #5b6478;
    background: #f4f6fa;
    padding: 2px 6px;
    border-radius: 5px;
    word-break: break-all;
}
.str-flag { margin-left: 6px; font-size: .62rem; }

/* ============================================================
 * 12. v1.16.1 列表页体验升级：概览卡 / 分段筛选 / 密度切换 /
 *     商品与订单行信息层级 / 移动端表格卡片化
 * ============================================================ */

.adm-head-alert { color: var(--adm-warn); font-weight: 700; }

/* ---------- 运营概览卡 ---------- */
.adm-kpi {
    display: grid;
    grid-template-columns: repeat(6, minmax(0, 1fr));
    gap: 10px;
    margin: 4px 0 14px;
}
.adm-kpi-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
.adm-kpi-card {
    position: relative;
    display: flex;
    align-items: center;
    gap: 10px;
    min-width: 0;
    padding: 12px 13px;
    border: 1px solid var(--adm-line);
    border-radius: var(--adm-r);
    background: var(--adm-surface);
    color: var(--adm-ink);
    text-decoration: none;
    box-shadow: var(--adm-shadow-xs);
    transition: border-color .18s var(--adm-ease), transform .18s var(--adm-ease), box-shadow .18s var(--adm-ease), background .18s var(--adm-ease);
}
a.adm-kpi-card:hover { border-color: var(--adm-primary-line); transform: translateY(-2px); box-shadow: var(--adm-shadow); color: var(--adm-ink); }
.adm-kpi-card.on { border-color: var(--adm-primary-line); background: var(--adm-primary-soft); }
.adm-kpi-card.is-static { cursor: default; }
.adm-kpi-ico {
    flex: 0 0 34px;
    width: 34px;
    height: 34px;
    border-radius: 10px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: .92rem;
    background: var(--adm-surface-3);
    color: var(--adm-ink-2);
}
.adm-kpi-ico.all { background: var(--adm-primary-soft); color: var(--admin-primary-deep); }
.adm-kpi-ico.ok { background: #f0fdf4; color: #15803d; }
.adm-kpi-ico.warn { background: #fffbeb; color: #b45309; }
.adm-kpi-ico.err { background: #fef2f2; color: #b91c1c; }
.adm-kpi-ico.info { background: #f0f9ff; color: #0369a1; }
.adm-kpi-ico.mute { background: #f8fafc; color: #64748b; }
.adm-kpi-card > div { min-width: 0; }
.adm-kpi-card b {
    display: block;
    font-size: 1.18rem;
    font-weight: 750;
    line-height: 1.2;
    letter-spacing: -.02em;
    color: var(--adm-ink);
    font-variant-numeric: tabular-nums;
}
.adm-kpi-card b.adm-kpi-money { font-size: 1rem; }
.adm-kpi-label { display: block; margin-top: 2px; font-size: .7rem; color: var(--adm-ink-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.adm-kpi-arrow { margin-left: auto; align-self: flex-start; font-size: .68rem; color: var(--adm-ink-3); opacity: 0; transition: opacity .18s ease; }
a.adm-kpi-card:hover .adm-kpi-arrow { opacity: 1; }

/* ---------- 分段筛选 ---------- */
.adm-segtabs {
    display: flex;
    align-items: center;
    gap: 4px;
    padding: 4px;
    margin-bottom: 14px;
    border: 1px solid var(--adm-line);
    border-radius: var(--adm-r-lg);
    background: var(--adm-surface-2);
    overflow-x: auto;
    scrollbar-width: none;
}
.adm-segtabs::-webkit-scrollbar { display: none; }
.adm-segtab {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 7px 13px;
    border-radius: 9px;
    font-size: .8rem;
    font-weight: 600;
    color: var(--adm-ink-2);
    text-decoration: none;
    white-space: nowrap;
    transition: color .16s ease, background .16s ease, box-shadow .16s ease;
}
.adm-segtab i { font-size: .84rem; opacity: .8; }
.adm-segtab:hover { color: var(--adm-ink); background: var(--adm-surface); }
.adm-segtab.on { background: var(--adm-surface); color: var(--admin-primary-deep); box-shadow: var(--adm-shadow-xs); }
.adm-segtab.on i { opacity: 1; color: var(--admin-primary); }
.adm-segtab b {
    font-size: .68rem;
    font-weight: 700;
    padding: 1px 6px;
    border-radius: 999px;
    background: var(--adm-surface-3);
    color: var(--adm-ink-3);
    font-variant-numeric: tabular-nums;
}
.adm-segtab.on b { background: var(--adm-primary-soft); color: var(--admin-primary-deep); }
.adm-segtab b.is-hot { background: #fef2f2; color: #b91c1c; }
.adm-segtabs-sep { flex: 0 0 1px; width: 1px; height: 20px; margin: 0 5px; background: var(--adm-line); }

/* ---------- 表格密度切换 ---------- */
.adm-density { display: inline-flex; padding: 2px; border: 1px solid var(--adm-line); border-radius: 8px; background: var(--adm-surface-2); }
.adm-density button {
    width: 28px;
    height: 26px;
    border: 0;
    border-radius: 6px;
    background: transparent;
    color: var(--adm-ink-3);
    font-size: .8rem;
    cursor: pointer;
    transition: color .16s ease, background .16s ease;
}
.adm-density button:hover { color: var(--adm-ink); }
.adm-density button.on { background: var(--adm-surface); color: var(--admin-primary); box-shadow: var(--adm-shadow-xs); }
.adm-table-wrap.is-compact .adm-table tbody td { padding: 6px 12px; }
.adm-table-wrap.is-compact .adm-thumb, .adm-table-wrap.is-compact .adm-thumb-ph { width: 32px; height: 32px; }
.adm-table-wrap.is-compact .adm-prod-meta { display: none; }
.adm-table-wrap.is-compact .adm-stock-meter { display: none; }

/* ---------- 商品 / 订单行：信息层级 ---------- */
.adm-prod { display: flex; align-items: center; gap: 10px; min-width: 0; }
.adm-prod-media { flex: 0 0 auto; display: block; }
.adm-prod-main { min-width: 0; }
.adm-prod-name {
    display: block;
    max-width: 270px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: .84rem;
    font-weight: 650;
    line-height: 1.4;
    color: var(--adm-ink);
    text-decoration: none;
}
a.adm-prod-name:hover { color: var(--admin-primary); }
.adm-prod-name.is-text { color: var(--adm-ink); }
.adm-prod-meta { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: 4px; font-size: .7rem; color: var(--adm-ink-3); }
.adm-prod-meta > span { white-space: nowrap; }
.adm-mini-tag {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    padding: 1px 6px;
    border-radius: 5px;
    font-size: .66rem;
    font-weight: 700;
    line-height: 1.6;
    background: var(--adm-surface-3);
    color: var(--adm-ink-2);
}
.adm-mini-tag.hot { background: #fef2f2; color: #b91c1c; }
.adm-mini-tag.new { background: #f0fdf4; color: #15803d; }
.adm-mini-tag.rec { background: var(--adm-primary-soft); color: var(--admin-primary-deep); }
.adm-mini-tag.type { background: var(--adm-surface-2); border: 1px solid var(--adm-line); }
.adm-mini-tag.type img { width: 12px; height: 12px; opacity: .8; }
.adm-thumb-sm { width: 34px !important; height: 34px !important; font-size: .8rem; }
.adm-price-del { display: block; font-size: .7rem; color: var(--adm-ink-3); }
.adm-stock-num { font-weight: 700; color: var(--adm-ink); }
.adm-stock-num.is-low { color: var(--adm-warn); }
.adm-stock-num.is-zero { color: var(--adm-danger); }
.adm-stock-meter { display: block; width: 52px; height: 3px; margin: 5px 0 0 auto; border-radius: 3px; background: var(--adm-surface-3); position: relative; overflow: hidden; }
.adm-stock-meter::after { content: ""; position: absolute; left: 0; top: 0; bottom: 0; border-radius: 3px; }
.adm-stock-meter.ok::after { width: 85%; background: var(--adm-ok); }
.adm-stock-meter.low::after { width: 32%; background: var(--adm-warn); }
.adm-stock-meter.zero::after { width: 8%; background: var(--adm-danger); }
.adm-cell-time { color: var(--adm-ink-3); white-space: nowrap; }

.adm-orderno { display: inline-flex; align-items: center; gap: 5px; }
.adm-orderno .adm-cell-main { font-variant-numeric: tabular-nums; letter-spacing: .01em; }
.adm-copy {
    width: 22px;
    height: 22px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 0;
    border-radius: 5px;
    background: transparent;
    color: var(--adm-ink-3);
    font-size: .7rem;
    cursor: pointer;
    opacity: 0;
    transition: opacity .16s ease, background .16s ease, color .16s ease;
}
.adm-table tbody tr:hover .adm-copy { opacity: 1; }
.adm-copy:hover, .adm-copy.copied { background: var(--adm-primary-soft); color: var(--admin-primary-deep); opacity: 1; }

.adm-buyer { display: flex; align-items: center; gap: 8px; min-width: 0; }
.adm-buyer-av {
    flex: 0 0 30px;
    width: 30px;
    height: 30px;
    border-radius: 50%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: var(--adm-primary-soft);
    color: var(--admin-primary-deep);
    font-size: .76rem;
    font-weight: 750;
}
.adm-buyer-main { min-width: 0; display: flex; flex-direction: column; }
.adm-buyer-name { font-size: .8rem; font-weight: 600; color: var(--adm-ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.adm-buyer-mail { font-size: .68rem; color: var(--adm-ink-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.adm-amount { font-size: .9rem; font-weight: 750; color: var(--adm-ink); }
.adm-currency { display: block; font-size: .68rem; color: var(--adm-ink-3); }

/* 行内操作：主操作带文字，次操作图标化 */
.adm-actions { display: inline-flex; align-items: center; gap: 5px; justify-content: flex-end; }
.adm-act {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    height: 28px;
    padding: 0 9px;
    border: 1px solid var(--adm-line);
    border-radius: 7px;
    background: var(--adm-surface);
    color: var(--adm-ink-2);
    font-size: .75rem;
    font-weight: 600;
    line-height: 1;
    text-decoration: none;
    cursor: pointer;
    white-space: nowrap;
    transition: border-color .16s ease, color .16s ease, background .16s ease;
}
.adm-act i { font-size: .76rem; }
.adm-act:hover { border-color: var(--adm-primary-line); color: var(--admin-primary-deep); background: var(--adm-primary-soft); }
.adm-act.main { border-color: var(--adm-primary-line); color: var(--admin-primary-deep); background: var(--adm-primary-soft); }
.adm-act.danger:hover { border-color: #fecaca; background: #fef2f2; color: var(--adm-danger); }
.adm-act.success { border-color: #bbf7d0; background: #f0fdf4; color: #15803d; }
.adm-act.success:hover { background: #dcfce7; color: #15803d; border-color: #86efac; }

/* ---------- 分页 / 空态 ---------- */
.adm-pager { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-top: 14px; font-size: .78rem; color: var(--adm-ink-3); }
.adm-pager b { color: var(--adm-ink); font-weight: 700; }
.adm-table td.adm-empty-cell-full { padding: 0; border: 0; }
.adm-table td.adm-empty-cell-full .adm-empty { background: var(--adm-surface); }

/* ---------- 移动端表格卡片化 ---------- */
@media (max-width: 1199.98px) {
    .adm-kpi, .adm-kpi-5 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 767.98px) {
    .adm-kpi, .adm-kpi-5 { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
    .adm-kpi-card { padding: 10px; }
    .adm-kpi-ico { flex-basis: 30px; width: 30px; height: 30px; }
    .adm-kpi-card b { font-size: 1rem; }
    .adm-kpi-card b.adm-kpi-money { font-size: .88rem; }

    .adm-table.is-responsive thead { display: none; }
    .adm-table.is-responsive,
    .adm-table.is-responsive tbody,
    .adm-table.is-responsive tbody tr,
    .adm-table.is-responsive tbody td { display: block; width: 100%; }
    .adm-table.is-responsive tbody tr {
        display: grid;
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: 9px 12px;
        padding: 13px 14px;
        border-bottom: 1px solid var(--adm-line);
        transition: background .14s var(--adm-ease);
    }
    .adm-table.is-responsive tbody tr:last-child { border-bottom: 0; }
    .adm-table.is-responsive tbody tr:hover td,
    .adm-table.is-responsive tbody tr.is-picked td { background: transparent; }
    .adm-table.is-responsive tbody td { padding: 0; border: 0; min-width: 0; }
    .adm-table.is-responsive tbody td::before {
        content: attr(data-label);
        display: block;
        margin-bottom: 3px;
        font-size: .63rem;
        font-weight: 700;
        letter-spacing: .08em;
        text-transform: uppercase;
        color: var(--adm-ink-3);
    }
    .adm-table.is-responsive tbody td[data-label=""]::before { display: none; }
    .adm-table.is-responsive tbody td.cell-wide,
    .adm-table.is-responsive tbody td.col-act,
    .adm-table.is-responsive tbody td.adm-empty-cell-full { grid-column: 1 / -1; }
    .adm-table.is-responsive tbody td.col-check { grid-column: 1 / -1; }
    .adm-table.is-responsive tbody td.col-check input { width: 16px; height: 16px; }
    .adm-table.is-responsive tbody td.col-act .adm-actions { justify-content: flex-start; }
    .adm-table.is-responsive .adm-prod-name { max-width: 100%; }
    .adm-table.is-responsive .adm-copy { opacity: 1; }
    .adm-table.is-responsive .adm-stock-meter { margin-left: 0; }
    .adm-table.is-responsive .col-num { text-align: left; }
    .adm-pager { justify-content: center; }
}

/* v1.16.1：列表页各区块独立成卡后的衔接（原设计假设工具条与表格连成一张卡） */
.adm-filter.is-standalone {
    margin-bottom: 12px;
    border-top: 1px solid var(--adm-line);
    border-radius: var(--adm-r-lg);
    overflow: hidden;
}
.adm-filter.is-standalone > summary { border-top: 0; }
.adm-chips.is-standalone {
    padding: 10px 14px;
    margin-bottom: 12px;
    border: 1px solid var(--adm-line);
    border-radius: var(--adm-r);
    background: var(--adm-surface-2);
}
.adm-chips.is-standalone:empty { display: none; }
.adm-table-wrap.is-standalone {
    border-top: 1px solid var(--adm-line);
    border-radius: var(--adm-r-lg);
}

/* 移动端卡片行：选中/悬停反馈改在整行上（td 背景已透明） */
@media (max-width: 767.98px) {
    .adm-table.is-responsive tbody tr:hover { background: var(--adm-surface-2); }
    .adm-table.is-responsive tbody tr.is-picked { background: var(--adm-primary-soft); }
}

/* v1.18.0：SEO 描述多行文本与字符计数 */
.seo-count { margin-top: 4px; font-size: .7rem; color: var(--adm-ink-3); font-variant-numeric: tabular-nums; }
.seo-count.is-over { color: #b45309; }
textarea[data-seo-count] { resize: vertical; min-height: 68px; line-height: 1.6; }

/* v1.18.0：分类图标 / 图片选择器 */
.cat-icon-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(38px, 1fr));
    gap: 6px;
    max-height: 156px;
    overflow-y: auto;
    padding: 9px;
    border: 1px solid var(--adm-line);
    border-radius: 10px;
    background: var(--adm-surface-2);
}
.cat-icon-opt {
    height: 38px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 1px solid var(--adm-line);
    border-radius: 9px;
    background: var(--adm-surface);
    color: var(--adm-ink-2);
    font-size: 1.05rem;
    cursor: pointer;
    transition: border-color .16s ease, color .16s ease, background .16s ease, transform .16s ease;
}
.cat-icon-opt:hover { color: var(--admin-primary); border-color: var(--adm-primary-line); transform: translateY(-1px); }
.cat-icon-opt.on { color: var(--admin-primary-deep); border-color: var(--adm-primary-line); background: var(--adm-primary-soft); }
.cat-icon-clear { font-size: 1.2rem; color: var(--adm-ink-3); }
.cat-preview {
    display: flex; align-items: center; gap: 11px;
    margin-top: 12px; padding: 10px 12px;
    border: 1px dashed var(--adm-line); border-radius: 10px;
    background: var(--adm-surface-2);
}
.cat-preview-ph {
    flex: 0 0 40px; width: 40px; height: 40px;
    display: inline-flex; align-items: center; justify-content: center;
    border-radius: 10px; background: var(--adm-primary-soft);
    color: var(--admin-primary); font-size: 1.15rem; overflow: hidden;
}
.cat-preview-ph img { width: 100%; height: 100%; object-fit: cover; }
.cat-preview b { display: block; font-size: .78rem; color: var(--adm-ink); }
.cat-preview small { display: block; font-size: .68rem; color: var(--adm-ink-3); }
.adm-cat-thumb { width: 32px; height: 32px; object-fit: cover; border-radius: 8px; border: 1px solid var(--adm-line); }
.adm-cat-ico {
    display: inline-flex; align-items: center; justify-content: center;
    width: 32px; height: 32px; border-radius: 8px;
    background: var(--adm-primary-soft); color: var(--admin-primary); font-size: .9rem;
}
.adm-cat-ico.is-empty { background: var(--adm-surface-2); color: var(--adm-ink-3); }

/* v1.18.0：资讯标签 */
.adm-tag-suggest { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 10px; }
.adm-tag-chip {
    display: inline-flex; align-items: center; gap: 5px;
    padding: 3px 9px; border: 1px solid var(--adm-line); border-radius: 999px;
    background: var(--adm-surface); color: var(--adm-ink-2);
    font-size: .72rem; cursor: pointer;
    transition: border-color .16s ease, color .16s ease, background .16s ease;
}
.adm-tag-chip:hover { border-color: var(--adm-primary-line); color: var(--admin-primary); background: var(--adm-primary-soft); }
.adm-tag-chip small { font-size: .64rem; color: var(--adm-ink-3); }
.adm-tag-chip:disabled { opacity: .5; cursor: not-allowed; }
.adm-tag-mini {
    display: inline-block; margin: 1px 3px 1px 0; padding: 1px 7px;
    border-radius: 5px; background: var(--adm-primary-soft); color: var(--admin-primary-deep);
    font-size: .68rem; text-decoration: none;
}
.adm-tag-mini:hover { color: var(--admin-primary); text-decoration: underline; }

/* v1.18.0：AI 生成正文 / 详情面板 */
.ai-cp { border-color: var(--adm-primary-line); }
.ai-cp-head {
    display: flex; align-items: center; justify-content: space-between;
    padding: 10px 14px; border-bottom: 1px solid var(--adm-line);
    background: var(--adm-primary-soft); color: var(--admin-primary-deep);
    font-size: .84rem;
}
.ai-cp-head .btn-close { width: .6rem; height: .6rem; }
.ai-cp-body { padding: 14px; }
.ai-cp-actions { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin: 12px 0; }
.ai-cp-status { font-size: .74rem; color: var(--adm-ink-3); flex: 1 1 auto; min-width: 180px; }
.ai-cp-status.is-ok { color: #15803d; }
.ai-cp-status.is-warn { color: #b45309; }
.ai-cp-status.is-err { color: #b91c1c; }
.ai-cp-preview {
    display: none; max-height: 320px; overflow-y: auto;
    padding: 14px 16px; border: 1px solid var(--adm-line); border-radius: 10px;
    background: var(--adm-surface-2); font-size: .84rem; line-height: 1.75;
}
.ai-cp-preview:not(:empty) { display: block; }
.ai-cp-preview h2 { font-size: 1.02rem; margin: 12px 0 8px; }
.ai-cp-preview h3 { font-size: .92rem; margin: 10px 0 6px; }
.ai-cp-preview p { margin: 0 0 8px; }
.ai-cp-preview ul { margin: 0 0 10px; padding-left: 20px; }
.ai-cp-preview blockquote { border-left: 3px solid var(--adm-primary-line); padding-left: 12px; color: var(--adm-ink-3); }
.ai-cp-block { position: relative; padding: 8px 0 14px; border-bottom: 1px dashed var(--adm-line); }
.ai-cp-block:last-child { border-bottom: 0; padding-bottom: 0; }
.ai-cp-lang {
    display: inline-block; margin-bottom: 8px; padding: 1px 8px;
    border-radius: 999px; background: var(--adm-primary-soft);
    color: var(--admin-primary-deep); font-size: .66rem; font-weight: 700;
}
.ai-cp-err { color: #b91c1c; }
.ai-cp-foot { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 12px; }
.ai-cp-foot .text-muted { font-size: .7rem; }

/* v1.19.0：AI 多模型清单 */
.adm-model-table { min-width: 940px; }
.adm-model-table th { font-size: .7rem; font-weight: 700; white-space: nowrap; color: var(--adm-ink-3); }
.adm-model-table td { vertical-align: middle; }
.adm-model-table .form-control-sm,
.adm-model-table .form-select-sm { font-size: .74rem; }
.adm-model-table .btn-sm { padding: .2rem .42rem; font-size: .7rem; }

/* v1.19.0：会员等级图标 */
.adm-lv-ico {
    display: inline-flex; align-items: center; justify-content: center;
    width: 34px; height: 34px; border-radius: 10px;
    background: var(--adm-surface-2); font-size: 1rem; flex-shrink: 0;
}
.adm-lv-dot { display: inline-block; width: 7px; height: 7px; border-radius: 50%; margin-right: 5px; vertical-align: middle; }

/* v1.20.0：后台「前台登录方式」通道选择卡片（重写：定位容器 + 选中角标 + 等高） */
.adm-login-method {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 10px;
}
/* 每对 input+label 包一层定位容器：隐藏 radio 的绝对定位有了正确的包含块，
   焦点环 / 选中态不再受页面级定位影响；grid 也只有 3 个真实子项 */
.adm-lm-item { position: relative; display: block; min-width: 0; }
.adm-lm-input {
    position: absolute;
    top: 0; left: 0;
    width: 1px; height: 1px;
    margin: 0; padding: 0;
    border: 0;
    opacity: 0;
    pointer-events: none;
}
.adm-lm-card {
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 3px;
    height: 100%;
    box-sizing: border-box;
    padding: 13px 14px 12px;
    border: 1px solid var(--adm-line);
    border-radius: var(--adm-r);
    background: var(--adm-surface);
    color: var(--adm-ink-2);
    cursor: pointer;
    transition: border-color .18s var(--adm-ease), background .18s var(--adm-ease),
                box-shadow .18s var(--adm-ease), transform .18s var(--adm-ease);
}
.adm-lm-ico {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px; height: 32px;
    border-radius: 9px;
    background: var(--adm-surface-3);
    color: var(--adm-ink-3);
    font-size: 1rem;
    margin-bottom: 6px;
    transition: background .18s var(--adm-ease), color .18s var(--adm-ease);
}
.adm-lm-txt { display: flex; flex-direction: column; min-width: 0; }
.adm-lm-txt b { font-size: .8rem; font-weight: 700; color: var(--adm-ink); line-height: 1.4; }
.adm-lm-txt small { font-size: .68rem; color: var(--adm-ink-3); line-height: 1.5; margin-top: 1px; }
/* 选中角标：右上角实心圆勾，选中态一眼可见（不依赖颜色差异） */
.adm-lm-check {
    position: absolute;
    top: 9px; right: 9px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 18px; height: 18px;
    border-radius: 50%;
    background: var(--admin-primary);
    color: #fff;
    font-size: .7rem;
    line-height: 1;
    opacity: 0;
    transform: scale(.4);
    transition: opacity .18s var(--adm-ease), transform .18s var(--adm-ease);
}
.adm-lm-card:hover { border-color: var(--adm-primary-line); transform: translateY(-1px); box-shadow: var(--adm-shadow-xs); }
.adm-lm-input:checked + .adm-lm-card {
    border-color: var(--admin-primary);
    background: var(--adm-primary-soft);
    box-shadow: inset 0 0 0 1px var(--admin-primary);
    transform: none;
}
.adm-lm-input:checked + .adm-lm-card .adm-lm-ico {
    background: var(--admin-primary);
    color: #fff;
}
.adm-lm-input:checked + .adm-lm-card .adm-lm-txt b { color: var(--admin-primary-deep); }
.adm-lm-input:checked + .adm-lm-card .adm-lm-check { opacity: 1; transform: scale(1); }
.adm-lm-input:focus-visible + .adm-lm-card {
    outline: 2px solid var(--admin-primary);
    outline-offset: 2px;
}
.adm-lm-input:disabled + .adm-lm-card { opacity: .55; cursor: not-allowed; }
@media (max-width: 991.98px) {
    .adm-login-method { gap: 8px; }
}
@media (max-width: 767.98px) {
    .adm-login-method { grid-template-columns: 1fr; }
    .adm-lm-card { flex-direction: row; align-items: center; flex-wrap: wrap; gap: 4px 10px; padding: 11px 13px; }
    .adm-lm-ico { margin-bottom: 0; flex-shrink: 0; }
    .adm-lm-txt { flex: 1 1 auto; }
    .adm-lm-txt small { margin-top: 0; }
    .adm-lm-check { position: static; flex-shrink: 0; margin-left: auto; }
}


/* ============================================================
 * 16. v1.20.0 用户画像页（/admin/user/profile）
 * ============================================================ */

/* ---------- 基本档案头部 ---------- */
.adm-up-hero .flex-grow-1 { min-width: 0; }
.adm-up-avatar {
    flex: 0 0 56px;
    width: 56px;
    height: 56px;
    border-radius: 50%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 1.35rem;
    font-weight: 800;
    color: var(--admin-primary-deep);
    background: var(--adm-primary-soft);
    border: 2px solid #fff;
    box-shadow: var(--adm-shadow-xs);
}
.adm-up-meta {
    display: flex;
    flex-wrap: wrap;
    gap: 4px 22px;
    margin: 0;
}
.adm-up-meta > div { min-width: 110px; }
.adm-up-meta dt {
    font-size: .68rem;
    font-weight: 600;
    color: var(--adm-ink-3);
    margin-bottom: 1px;
}
.adm-up-meta dd {
    font-size: .8rem;
    color: var(--adm-ink);
    margin: 0;
    font-variant-numeric: tabular-nums;
}

/* ---------- 统计块 / 金额汇总 ---------- */
.adm-up-stat b {
    display: block;
    font-size: 1.3rem;
    font-weight: 750;
    line-height: 1.2;
    letter-spacing: -.02em;
    color: var(--adm-ink);
    font-variant-numeric: tabular-nums;
}
.adm-up-stat span { font-size: .72rem; color: var(--adm-ink-3); }
.adm-up-amounts {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    padding-top: 10px;
    border-top: 1px dashed var(--adm-line);
}
.adm-up-amount {
    display: inline-flex;
    align-items: baseline;
    gap: 6px;
    padding: 6px 12px;
    border: 1px solid var(--adm-line);
    border-radius: var(--adm-r);
    background: var(--adm-surface-3);
    font-variant-numeric: tabular-nums;
}
.adm-up-cur { font-size: .7rem; font-weight: 700; color: var(--adm-ink-3); }
.adm-up-amount b { font-size: 1rem; font-weight: 750; color: var(--adm-ink); }
.adm-up-amount small { font-size: .68rem; }
.adm-up-foot {
    display: flex;
    flex-wrap: wrap;
    gap: 4px 16px;
    margin-top: 12px;
    padding-top: 10px;
    border-top: 1px dashed var(--adm-line);
}

/* ---------- 横向占比条（状态分布 / 商品偏好） ---------- */
.adm-up-bar {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 6px 0;
}
.adm-up-bar-label {
    flex: 0 0 96px;
    width: 96px;
    font-size: .76rem;
    color: var(--adm-ink-2);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.adm-up-pref-label { flex-basis: 180px; width: 180px; font-weight: 600; }
.adm-up-bar-track {
    flex: 1 1 auto;
    height: 8px;
    border-radius: 99px;
    background: var(--adm-surface-3);
    overflow: hidden;
}
.adm-up-bar-fill {
    height: 100%;
    border-radius: 99px;
    transition: width .35s var(--adm-ease);
}
.adm-up-bar-num {
    flex: 0 0 auto;
    font-size: .74rem;
    font-weight: 600;
    color: var(--adm-ink-2);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/* ---------- 等级进度 ---------- */
.adm-up-lv-ico {
    flex: 0 0 42px;
    width: 42px;
    height: 42px;
    border-radius: 12px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 1.1rem;
    color: #fff;
}
.adm-up-progress-track {
    height: 8px;
    border-radius: 99px;
    background: var(--adm-surface-3);
    overflow: hidden;
}
.adm-up-progress-track > div {
    height: 100%;
    border-radius: 99px;
    background: linear-gradient(90deg, var(--admin-primary), var(--admin-primary-deep));
    transition: width .35s var(--adm-ease);
}

/* ---------- 标签芯片 / 时间线 / 提示 ---------- */
.adm-up-chip {
    display: inline-flex;
    align-items: center;
    gap: 2px;
    max-width: 100%;
    padding: 4px 10px;
    border: 1px solid var(--adm-line);
    border-radius: 99px;
    background: var(--adm-surface);
    font-size: .74rem;
    color: var(--adm-ink-2);
}
.adm-up-chip em { font-style: normal; font-size: .68rem; color: var(--adm-ink-3); margin-left: 2px; }
.adm-up-sec-title {
    font-size: .72rem;
    font-weight: 700;
    color: var(--adm-ink-3);
    margin: 14px 0 6px;
}
.adm-up-tl { list-style: none; padding: 0; margin: 0; }
.adm-up-tl > li { padding: 7px 0; border-bottom: 1px dashed var(--adm-line); }
.adm-up-tl > li:last-child { border-bottom: 0; }
.adm-up-tl-main {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: .8rem;
}
.adm-up-tl-main > b {
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    color: var(--adm-ink);
}
.adm-up-tl-sub {
    font-size: .76rem;
    color: var(--adm-ink-2);
    margin-top: 2px;
}
.adm-up-tl-time { font-size: .68rem; color: var(--adm-ink-3); margin-top: 2px; }
.adm-up-hint {
    display: flex;
    align-items: center;
    padding: 10px 12px;
    border-radius: var(--adm-r);
    background: var(--adm-surface-3);
    color: var(--adm-ink-3);
    font-size: .76rem;
}

/* ---------- 响应式 ---------- */
@media (max-width: 991.98px) {
    .adm-up-meta { gap: 4px 16px; }
    .adm-up-meta > div { min-width: 96px; }
    .adm-up-pref-label { flex-basis: 120px; width: 120px; }
}
@media (max-width: 767.98px) {
    .adm-up-avatar { flex-basis: 44px; width: 44px; height: 44px; font-size: 1.05rem; }
    .adm-up-bar { flex-wrap: wrap; gap: 6px; }
    .adm-up-bar-label, .adm-up-pref-label { flex: 1 1 100%; width: 100%; }
    .adm-up-bar-num { margin-left: auto; }
}


/* ============================================================
 * 17. v1.21.1 后台体验修复
 *     1) .nav / .nav-tabs 基础布局此前从未定义（无 Bootstrap），
 *        TAB 呈竖排挤在一起 —— 系统设置 / 多语言切换错位的根因
 *     2) 列表勾选列固定在左、操作列固定在右：表格超宽时始终可勾选可操作
 *     3) 商品名限宽省略，长名不再把表格撑出容器
 *     4) 紧凑勾选标签 .adm-mini-check（AI「覆盖已有正文」等）
 *     5) SKU 宽表「规格组合」列固定，横向滚动不丢上下文
 * ============================================================ */

/* ---------- 1. TAB 导航基础布局 ---------- */
.nav { display: flex; flex-wrap: nowrap; overflow-x: auto; padding-left: 0; margin: 0; list-style: none; }
.nav-item { flex: 0 0 auto; }
.nav-tabs {
    gap: 2px;
    align-items: flex-end;
    border-bottom: 1px solid var(--adm-line);
    scrollbar-width: thin;
}
.nav-tabs .nav-link {
    display: block;
    padding: 8px 14px;
    margin-bottom: -1px;
    border: 1px solid transparent;
    border-radius: 8px 8px 0 0;
    font-size: .84rem;
    font-weight: 550;
    color: var(--adm-ink-3);
    text-decoration: none;
    white-space: nowrap;
    background: transparent;
    transition: color .15s var(--adm-ease), background .15s var(--adm-ease);
}
.nav-tabs .nav-link:hover { color: var(--admin-primary-deep); background: var(--adm-primary-soft); }
.nav-tabs .nav-link.active {
    color: var(--admin-primary-deep);
    font-weight: 700;
    background: var(--adm-surface, #fff);
    border-color: var(--adm-line) var(--adm-line) var(--adm-surface, #fff);
}
.nav-tabs .nav-link .badge { margin-left: 4px; }
.card-header-tabs { margin-bottom: -1px; }
.nav-tabs::-webkit-scrollbar { height: 6px; }
.nav-tabs::-webkit-scrollbar-thumb { background: var(--adm-line); border-radius: 99px; }

/* ---------- 2. 勾选列 / 操作列固定 ---------- */
.adm-table .col-check {
    position: sticky;
    left: 0;
    z-index: 1;
    background: var(--adm-surface, #fff);
    border-right: 1px solid var(--adm-line-soft);
}
.adm-table thead th.col-check { z-index: 3; background: var(--adm-surface-2); }
.adm-table tbody tr:hover td.col-check { background: color-mix(in srgb, var(--adm-primary-soft) 55%, #fff); }
.adm-table tbody tr.is-picked td.col-check { background: var(--adm-primary-soft); }
.adm-table .col-act {
    position: sticky;
    right: 0;
    z-index: 1;
    background: var(--adm-surface, #fff);
    border-left: 1px solid var(--adm-line-soft);
}
.adm-table thead th.col-act { z-index: 3; background: var(--adm-surface-2); }
.adm-table tbody tr:hover td.col-act { background: color-mix(in srgb, var(--adm-primary-soft) 55%, #fff); }
.adm-table tbody tr.is-picked td.col-act { background: var(--adm-primary-soft); }
.adm-table .col-check .form-check-input { width: 15px; height: 15px; margin: 0; cursor: pointer; accent-color: var(--admin-primary); }

/* ---------- 3. 商品名限宽省略 ---------- */
.adm-table .cell-wide { max-width: 380px; }
.adm-prod-name { display: block; max-width: 320px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ---------- 4. 紧凑勾选标签 ---------- */
.adm-mini-check {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin: 0;
    font-size: .78rem;
    font-weight: 550;
    color: var(--adm-ink-2);
    cursor: pointer;
    white-space: nowrap;
}
.adm-mini-check .form-check-input {
    flex: 0 0 auto;
    width: 15px;
    height: 15px;
    margin: 0;
    cursor: pointer;
    accent-color: var(--admin-primary);
}

/* ---------- 5. SKU 宽表规格列固定 ---------- */
.sku-scroll { overflow-x: auto; }
.sku-table .col-spec {
    position: sticky;
    left: 0;
    z-index: 1;
    background: #fff;
    border-right: 1px solid var(--adm-line-soft);
    min-width: 170px;
}
.sku-table thead .col-spec { z-index: 2; background: var(--adm-surface-2); }

/* ---------- 移动端回退：卡片模式取消固定列与限宽 ---------- */
@media (max-width: 767.98px) {
    .adm-table.is-responsive .col-check,
    .adm-table.is-responsive .col-act { position: static; background: transparent; border: 0; }
    .adm-prod-name { max-width: 100%; }
    .adm-table .cell-wide { max-width: none; }
    .nav { flex-wrap: nowrap; }
}

/* SKU 表：数字列右对齐 + 启用/操作列收窄（该表是 .table 而非 .adm-table，需单独对齐） */
.sku-table .col-num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.sku-table .col-flag, .sku-table .col-act { text-align: center; white-space: nowrap; }
.sku-table .col-code { min-width: 130px; }


/* ============================================================
 * 18. v1.22.0 分段式语言切换 + 仪表盘美化
 * ============================================================ */

/* ---------- 分段式语言 TAB（商品/资讯/分类表单 · 无滚动条） ---------- */
.adm-lang-tabs {
    display: inline-flex;
    gap: 3px;
    padding: 3px;
    margin: 0 0 14px;
    list-style: none;
    border: 1px solid var(--adm-line);
    border-radius: 10px;
    background: var(--adm-surface-3, #f1f5f9);
    overflow: hidden;
}
.adm-lang-tabs .nav-item { flex: 0 0 auto; }
.adm-lang-tabs .nav-link {
    display: block;
    padding: 5px 20px;
    border: 0;
    border-radius: 7px;
    font-size: .8rem;
    font-weight: 650;
    line-height: 1.5;
    color: var(--adm-ink-3);
    background: transparent;
    text-decoration: none;
    white-space: nowrap;
    cursor: pointer;
    transition: color .15s var(--adm-ease), background .15s var(--adm-ease), box-shadow .15s var(--adm-ease);
}
.adm-lang-tabs .nav-link:hover { color: var(--admin-primary-deep); }
.adm-lang-tabs .nav-link.active {
    color: #fff;
    background: linear-gradient(135deg, var(--admin-primary), var(--admin-primary-deep));
    box-shadow: 0 2px 8px color-mix(in srgb, var(--admin-primary) 38%, transparent);
}
.adm-lang-tabs .nav-link:focus-visible {
    outline: 2px solid var(--admin-primary);
    outline-offset: 1px;
}

/* ---------- 仪表盘抛光（v1.22.1 重写：只做轻量增强，不再覆盖 v1.14.2 基础布局） ----------
 * v1.22.0 曾在此追加 ::before 顶条 / 数字脉冲 / min-height / gateway 徽标等覆盖，
 * 与基础样式的左侧色条、固定高度、徽标样式互相打架，造成错位与抖动 —— 全部撤掉。
 */
.dash-kpi { transition: box-shadow .2s var(--adm-ease, ease); }
.dash-kpi:hover { box-shadow: 0 10px 26px rgba(16, 19, 34, .09); }


/* ============================================================
 * 19. v1.22.1 仪表盘结构性对齐（修「不对称 / 错位」）
 *
 * 原布局问题：
 * - 4 张 KPI 卡的 foot 行数不同（有的带 note 有的没有）→ 卡片底部参差；
 * - .dash-grid-2 用 1.32fr : 1fr 且 align-items:start → 左右两栏宽度不等、
 *   高度也不齐，右栏底部留大片空白；
 * - .dash-charts 1.85fr : 1fr 视觉重心过于偏左。
 * 这里统一改为等高 + 对称栅格 + 内容贴底，属于布局修正而非装饰。
 * ============================================================ */
.dash-kpis { align-items: stretch; }
.dash-kpi { display: flex; flex-direction: column; }
.dash-kpi-head { flex: 0 0 auto; }
.dash-kpi-value { flex: 0 0 auto; }
.dash-kpi-foot { margin-top: auto; }

.dash-grid-2 {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    align-items: stretch;
}
.dash-grid-2 > .adm-panel { display: flex; flex-direction: column; }
.dash-grid-2 > .adm-panel > .adm-panel-body { flex: 1 1 auto; }
.dash-grid-2 .dash-assets { margin-top: auto; }

.dash-charts {
    grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);
    align-items: stretch;
}
.dash-charts > .adm-panel { display: flex; flex-direction: column; }
.dash-charts > .adm-panel > .adm-panel-body { flex: 1 1 auto; }

/* 待办行统一高度，数字与箭头垂直居中，消除逐行错位 */
.dash-todo-row { min-height: 58px; }
.dash-todo-num { display: inline-flex; align-items: center; justify-content: flex-end; min-width: 26px; }
.dash-todo-arrow { display: inline-flex; align-items: center; justify-content: center; }

@media (max-width: 1199.98px) {
    .dash-grid-2 > .adm-panel > .adm-panel-body,
    .dash-charts > .adm-panel > .adm-panel-body { flex: 0 1 auto; }
}

/* 栅格内的相邻面板不该继承 .adm-panel + .adm-panel 的 16px 下移（会错位） */
.dash-grid-2 > .adm-panel + .adm-panel,
.dash-charts > .adm-panel + .adm-panel { margin-top: 0; }


/* ============================================================
 * 20. v1.22.2 仪表盘：资产统计格 + 热门内容 TOP7
 * ============================================================ */

/* ---------- 资产统计：4 个等分小格，替代原来挤在一行的纯文本 ---------- */
.dash-assets {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 8px;
    margin-top: 12px;
    padding-top: 12px;
    border-top: 1px dashed var(--adm-line);
}
.dash-asset {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 2px;
    min-width: 0;
    padding: 9px 11px;
    border: 1px solid var(--adm-line);
    border-radius: 10px;
    background: var(--adm-surface-2, #fafbfd);
}
.dash-asset-ico {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    border-radius: 7px;
    background: var(--adm-primary-soft, rgba(13, 148, 136, .12));
    color: var(--admin-primary-deep);
    font-size: .72rem;
}
.dash-asset-label {
    font-size: .68rem;
    color: var(--adm-ink-3);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;
}
.dash-asset b {
    font-size: 1rem;
    font-weight: 750;
    color: var(--adm-ink);
    font-variant-numeric: tabular-nums;
    line-height: 1.2;
}
.dash-asset b small { font-size: .7rem; font-weight: 600; color: var(--adm-ink-3); }

/* ---------- 热门内容 TOP7：排名 + 卡片行 + 渐变条 ---------- */
.wmc-bars.is-ranked { gap: 5px; }
.wmc-bars.is-ranked .wmc-bar-row {
    gap: 8px;
    padding: 5px 8px;
    border-radius: 9px;
    background: var(--adm-surface-2, #fafbfd);
    transition: background .15s var(--adm-ease, ease);
}
.wmc-bars.is-ranked .wmc-bar-row:hover { background: var(--adm-primary-soft, rgba(13, 148, 136, .1)); }
.wmc-bar-rank {
    flex: 0 0 20px;
    width: 20px;
    height: 20px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 6px;
    background: var(--adm-surface-3, #f1f5f9);
    color: var(--adm-ink-3);
    font-size: .68rem;
    font-weight: 750;
    font-variant-numeric: tabular-nums;
}
.wmc-bar-rank.is-top { background: var(--admin-primary); color: #fff; }
.wmc-bars.is-ranked .wmc-bar-name {
    width: 40%;
    text-align: left;
    font-weight: 600;
    color: var(--adm-ink-2);
}
.wmc-bars.is-ranked .wmc-bar-track { height: 9px; border-radius: 99px; }
.wmc-bars.is-ranked .wmc-bar-fill { border-radius: 99px; }
.wmc-bars.is-ranked .wmc-bar-val {
    width: 46px;
    text-align: right;
    color: var(--adm-ink);
}
@media (max-width: 991.98px) {
    .dash-assets { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 575.98px) {
    .dash-assets { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; }
    .dash-asset { padding: 7px 9px; }
    .wmc-bars.is-ranked .wmc-bar-name { width: 36%; }
}


/* ============================================================
 * 21. v1.22.3 操作结果提示（成功 / 失败 / 警告）
 * ============================================================ */
.adm-toast.err { border-left: 3px solid #f87171; }
.adm-toast.warn { border-left: 3px solid #fbbf24; }
.adm-toast.ok { border-left: 3px solid #4ade80; }

/* 表单必填项未通过时给出可见的边框提示（配合 submit 拦截） */
.adm-form-invalid {
    border-color: #f87171 !important;
    box-shadow: 0 0 0 2px rgba(248, 113, 113, .18) !important;
}


/* ============================================================
 * 22. v1.22.3 角色权限表单
 * ============================================================ */
.adm-role-note {
    display: flex;
    align-items: flex-start;
    gap: 6px;
    margin-bottom: 14px;
    padding: 10px 14px;
    border: 1px solid color-mix(in srgb, var(--admin-primary) 24%, var(--adm-line));
    border-radius: 10px;
    background: color-mix(in srgb, var(--admin-primary) 6%, var(--adm-surface));
    color: var(--adm-ink-2);
    font-size: .78rem;
    line-height: 1.6;
}
.adm-role-note i { color: var(--admin-primary-deep); flex: 0 0 auto; margin-top: 2px; }
.adm-role-count {
    display: inline-block;
    margin-right: 8px;
    padding: 2px 8px;
    border-radius: 99px;
    background: var(--adm-primary-soft, rgba(13, 148, 136, .12));
    color: var(--admin-primary-deep);
    font-size: .7rem;
    font-weight: 750;
    font-variant-numeric: tabular-nums;
}
.adm-role-group {
    margin-bottom: 12px;
    padding: 12px 14px 14px;
    border: 1px solid var(--adm-line);
    border-radius: 10px;
    background: var(--adm-surface-2, #fafbfd);
}
.adm-role-group-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 10px;
    padding-bottom: 8px;
    border-bottom: 1px dashed var(--adm-line);
    font-size: .82rem;
    color: var(--adm-ink);
}
.adm-role-node {
    display: flex;
    align-items: flex-start;
    gap: 9px;
    height: 100%;
    padding: 9px 11px;
    border: 1px solid var(--adm-line);
    border-radius: 9px;
    background: var(--adm-surface, #fff);
    cursor: pointer;
    transition: border-color .15s var(--adm-ease), background .15s var(--adm-ease);
}
.adm-role-node:hover { border-color: var(--admin-primary); }
.adm-role-node:has(input:checked) {
    border-color: color-mix(in srgb, var(--admin-primary) 55%, var(--adm-line));
    background: var(--adm-primary-soft, rgba(13, 148, 136, .08));
}
.adm-role-node .form-check-input { flex: 0 0 auto; width: 15px; height: 15px; margin: 2px 0 0; accent-color: var(--admin-primary); }
.adm-role-node-txt { min-width: 0; line-height: 1.35; }
.adm-role-node-txt b { font-size: .78rem; font-weight: 650; color: var(--adm-ink); }
.adm-role-node-txt small { font-size: .66rem; margin-top: 1px; }


/* ============================================================
 * 23. v1.22.3 分类层级标记（后台）
 * ============================================================ */
.cat-lv-badge {
    display: inline-flex;
    align-items: center;
    flex: 0 0 auto;
    padding: 1px 7px;
    margin-right: 5px;
    border: 1px solid var(--adm-line);
    border-radius: 6px;
    background: var(--adm-surface-3, #f1f5f9);
    color: var(--adm-ink-2);
    font-size: .67rem;
    font-weight: 700;
    line-height: 1.5;
    white-space: nowrap;
    vertical-align: middle;
}
.cat-lv-badge.lv-1 { border-color: color-mix(in srgb, var(--admin-primary) 35%, var(--adm-line)); background: var(--adm-primary-soft); color: var(--admin-primary-deep); }
.cat-lv-badge.lv-2 { border-color: #c7d2fe; background: #eef2ff; color: #4338ca; }
.cat-lv-badge.lv-3 { border-color: #fed7aa; background: #fff7ed; color: #c2410c; }

.adm-lv-stats { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 14px; }
.adm-lv-stat {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 7px 12px;
    border: 1px solid var(--adm-line);
    border-radius: 10px;
    background: var(--adm-surface);
}
.adm-lv-stat .cat-lv-badge { margin-right: 0; }
.adm-lv-stat b { font-size: .95rem; font-variant-numeric: tabular-nums; color: var(--adm-ink); }
.adm-lv-stat small { font-size: .68rem; color: var(--adm-ink-3); }
.adm-lv-stat.is-total { background: var(--adm-surface-2); }

.adm-cat-name { display: flex; align-items: center; flex-wrap: wrap; gap: 2px; min-height: 26px; }
.adm-cat-branch { color: var(--adm-ink-3); margin-right: 2px; font-size: .8rem; }
.adm-cat-child {
    margin-left: 6px; padding: 0 6px;
    border-radius: 99px; background: var(--adm-surface-3);
    color: var(--adm-ink-3); font-size: .66rem; font-weight: 650;
}
.adm-cat-path { color: var(--adm-ink-3); font-size: .72rem; }
.adm-cat-row.lv-2 > td:first-child { border-left: 2px solid #c7d2fe; }
.adm-cat-row.lv-3 > td:first-child { border-left: 2px solid #fed7aa; }
.adm-cat-level-hint {
    margin-bottom: 14px; padding: 10px 13px;
    border: 1px solid color-mix(in srgb, var(--admin-primary) 22%, var(--adm-line));
    border-radius: 9px;
    background: color-mix(in srgb, var(--admin-primary) 5%, var(--adm-surface));
    font-size: .78rem; color: var(--adm-ink-2);
}
.adm-cat-level-hint > i { color: var(--admin-primary-deep); }

/* ============================================================
   24. 属性可选值 · 颜色选择器（v1.23.0）
   色值列 = 原生取色器 + hex 文本框 + 清除按钮；上方为常用色板工具条
   ============================================================ */
.adm-color-toolbar {
    display: flex; align-items: center; flex-wrap: wrap; gap: 9px 14px;
    padding: 10px 13px; margin-bottom: 12px;
    border: 1px solid var(--adm-line); border-radius: var(--adm-r);
    background: var(--adm-surface-2);
}
.adm-color-tb-label {
    display: inline-flex; align-items: center; gap: 6px;
    font-size: .76rem; font-weight: 700; color: var(--adm-ink-2); white-space: nowrap;
}
.adm-color-tb-label > i { color: var(--admin-primary-deep); font-size: .9rem; }
.adm-color-preset-list { display: flex; flex-wrap: wrap; gap: 5px; }
.adm-color-preset {
    width: 22px; height: 22px; padding: 0;
    border: 1px solid rgba(15, 23, 42, .18); border-radius: 6px;
    background: var(--adm-swatch, #cbd5e1);
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .38);
    cursor: pointer;
    transition: transform .16s var(--adm-ease), box-shadow .16s var(--adm-ease);
}
.adm-color-preset:hover { transform: scale(1.18); box-shadow: 0 0 0 3px var(--adm-primary-soft); }
.adm-color-preset:focus-visible { outline: 2px solid var(--admin-primary, #0d9488); outline-offset: 2px; }
.adm-color-tb-actions {
    display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-left: auto;
}
.adm-color-tb-hint { font-size: .71rem; color: var(--adm-ink-3); }

#valueTable th:nth-child(3) { white-space: nowrap; }
.adm-color-field { display: inline-flex; align-items: center; gap: 6px; width: 100%; }
.adm-color-swatch {
    flex: 0 0 34px; width: 34px; height: 31px; padding: 2px;
    border: 1px solid var(--adm-line); border-radius: 8px;
    background: var(--adm-surface); cursor: pointer;
}
.adm-color-swatch::-webkit-color-swatch-wrapper { padding: 0; }
.adm-color-swatch::-webkit-color-swatch { border: 0; border-radius: 5px; }
.adm-color-swatch::-moz-color-swatch { border: 0; border-radius: 5px; }
.adm-color-field.is-empty .adm-color-swatch { opacity: .4; }
.adm-color-hex {
    flex: 1 1 96px; width: auto; min-width: 84px;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: .78rem; text-transform: lowercase;
}
.adm-color-hex.is-invalid {
    border-color: var(--adm-danger);
    box-shadow: 0 0 0 2px rgba(220, 38, 38, .12);
}
.adm-color-clear {
    flex: 0 0 26px; width: 26px; height: 26px;
    display: grid; place-items: center; padding: 0;
    border: 1px solid var(--adm-line); border-radius: 7px;
    background: var(--adm-surface); color: var(--adm-ink-3);
    font-size: .85rem; line-height: 1; cursor: pointer;
    transition: color .15s var(--adm-ease), border-color .15s var(--adm-ease);
}
.adm-color-clear:hover {
    color: var(--adm-danger); border-color: var(--adm-danger); background: #fef2f2;
}
.adm-color-flash > td { animation: admColorFlash .65s var(--adm-ease); }
@keyframes admColorFlash {
    0%   { background: var(--adm-primary-soft); }
    100% { background: transparent; }
}

/* 属性列表页：可选值前的色点预览 */
.adm-color-dot {
    display: inline-block; width: 11px; height: 11px; margin-right: 4px;
    border: 1px solid rgba(15, 23, 42, .18); border-radius: 50%;
    vertical-align: -1px; box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .4);
}

@media (max-width: 720px) {
    .adm-color-tb-actions { margin-left: 0; }
    .adm-color-preset { width: 20px; height: 20px; }
}

/* ============================================================
 * 25. v1.26.2 表格复选框位置修复
 *
 * 兼容层 .form-check-input 沿用了 Bootstrap 的负缩进
 * （float:left; margin-left:-1.6em），该写法只成立在 .form-check 容器内。
 * 直接放进 <td>/<th> 时复选框会被推到单元格左侧之外，
 * 与相邻列重叠导致「勾选点不动」。这里复位为正常流。
 * ============================================================ */
.table > :not(caption) > * > * > .form-check-input,
.table td > .form-check-input,
.table th > .form-check-input {
    float: none;
    margin-left: 0;
    margin-top: 0;
    width: 16px;
    height: 16px;
    vertical-align: middle;
    cursor: pointer;
}

/* 批量选择单元格：整格可点，热区更大 */
.adm-check-cell {
    width: 46px;
    text-align: center;
}
.adm-check-cell > label {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 30px;
    margin: 0;
    cursor: pointer;
}

/* 可点击的复选框热区（表格首列通用）：整格可点，复选框居中且不偏移 */
.adm-pick {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 32px;
    margin: 0;
    cursor: pointer;
}
.adm-pick > input.form-check-input {
    float: none;
    margin: 0;
    width: 16px;
    height: 16px;
    cursor: pointer;
}

/* 选品 / 列表类固定布局表格：按容器宽度等分，杜绝超宽横向滚动 */
.adm-fit-table {
    table-layout: fixed;
    width: 100%;
    margin: 0;
}
.adm-fit-table > thead > tr > th,
.adm-fit-table > tbody > tr > td {
    overflow-wrap: anywhere;
    vertical-align: middle;
}

/* ============================================================
 * 26. v1.30.0 模板管理 · 场景化分组与卡片化视觉
 *    所有选择器以 .tx- 开头，仅在模板管理页生效，不污染其他后台页。
 * ============================================================ */
.tx-head-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* ---- 当前生效组合 ---- */
.tx-hero {
    position: relative; overflow: hidden; margin-bottom: 18px;
    padding: 20px 26px 24px; border-radius: 16px;
    background: linear-gradient(118deg, #101827 0%, #182a3a 52%, #123b3a 100%);
    color: #eef5f4; box-shadow: 0 18px 40px rgba(16, 24, 39, .16);
}
.tx-hero-glow {
    position: absolute; right: -8%; top: -60%; width: 46%; height: 220%;
    background: radial-gradient(circle, rgba(34, 197, 94, .20), transparent 62%);
    pointer-events: none;
}
.tx-hero-top {
    position: relative; display: flex; align-items: center; justify-content: space-between;
    gap: 14px; flex-wrap: wrap;
}
.tx-hero-kicker {
    display: inline-flex; align-items: center; gap: 8px; font-size: .72rem;
    font-weight: 700; letter-spacing: .12em; color: #7ee2b8;
}
.tx-hero-stats { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: .78rem; color: rgba(238, 245, 244, .72); }
.tx-hero-stats b { color: #fff; font-size: .95rem; }
.tx-hero-dot { width: 4px; height: 4px; border-radius: 50%; background: rgba(255, 255, 255, .35); }
.tx-score {
    display: inline-flex; align-items: center; gap: 6px; padding: 5px 11px;
    border-radius: 999px; font-size: .72rem; font-weight: 700;
    background: rgba(255, 255, 255, .10); border: 1px solid rgba(255, 255, 255, .16); color: #eef5f4;
}
.tx-score.ok { background: rgba(34, 197, 94, .18); border-color: rgba(34, 197, 94, .38); color: #a7f3d0; }
.tx-score.warn { background: rgba(239, 68, 68, .18); border-color: rgba(239, 68, 68, .38); color: #fecaca; }
.tx-score.eye { background: rgba(251, 191, 36, .16); border-color: rgba(251, 191, 36, .38); color: #fde68a; }
.tx-hero-grid {
    position: relative; display: grid; align-items: center; margin-top: 20px;
    grid-template-columns: minmax(0, 1fr) 24px minmax(0, 1fr) 24px minmax(0, 1.18fr); gap: 12px;
}
.tx-current {
    display: flex; flex-direction: column; gap: 5px; min-width: 0;
    padding: 14px 16px; border-radius: 12px;
    background: rgba(255, 255, 255, .07); border: 1px solid rgba(255, 255, 255, .13);
}
.tx-current-label { font-size: .72rem; color: rgba(238, 245, 244, .62); display: inline-flex; align-items: center; gap: 6px; }
.tx-current-title { font-size: 1.02rem; line-height: 1.4; overflow-wrap: anywhere; }
.tx-current code { width: fit-content; padding: 2px 8px; border-radius: 5px; font-size: .7rem; color: #a7f3d0; background: rgba(34, 197, 94, .14); }
.tx-current-note { font-size: .74rem; color: rgba(238, 245, 244, .62); line-height: 1.6; }
.tx-current-result { background: rgba(34, 197, 94, .12); border-color: rgba(34, 197, 94, .32); }
.tx-hero-x, .tx-hero-eq { display: flex; align-items: center; justify-content: center; color: rgba(255, 255, 255, .45); font-size: .85rem; }

/* ---- 场景快捷导航 ---- */
.tx-group-nav {
    position: sticky; top: 8px; z-index: 6; display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
    padding: 10px 12px; margin-bottom: 16px; border-radius: 12px;
    background: rgba(255, 255, 255, .94); border: 1px solid #e6eaf1;
    box-shadow: 0 6px 20px rgba(17, 24, 39, .06);
}
.tx-group-nav-label { display: inline-flex; align-items: center; gap: 7px; margin-right: 4px; font-size: .75rem; font-weight: 700; color: #64748b; }
.tx-group-chip {
    display: inline-flex; align-items: center; gap: 7px; padding: 6px 12px;
    border: 1px solid #e6eaf1; border-radius: 999px; background: #f8fafc;
    color: #334155; font-size: .76rem; text-decoration: none; transition: all .18s ease;
}
.tx-group-chip:hover, .tx-group-chip.on { background: #eef2ff; border-color: #a5b4fc; color: #4338ca; }
.tx-group-chip b { padding: 1px 6px; border-radius: 999px; background: #fff; border: 1px solid #e6eaf1; font-size: .68rem; color: #64748b; }
.tx-new { padding: 2px 6px; border-radius: 4px; background: #16a34a; color: #fff; font-size: .6rem; font-weight: 800; letter-spacing: .06em; }

/* ---- 组合预览台 ---- */
.tx-combo {
    margin-bottom: 18px; border: 1px solid #e3e8f5; border-radius: 14px; overflow: hidden;
    background: linear-gradient(120deg, #f7f8ff, #f2fbf8);
}
.tx-combo-head { display: flex; align-items: flex-start; gap: 12px; padding: 16px 18px 0; }
.tx-combo-ico { display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; flex: 0 0 34px; border-radius: 10px; background: #e0e7ff; color: #4338ca; font-size: 1rem; }
.tx-combo-head b { font-size: .92rem; }
.tx-combo-head p { margin: 4px 0 0; font-size: .76rem; color: #6b768c; line-height: 1.7; }
.tx-combo-form { display: flex; align-items: flex-end; gap: 12px; flex-wrap: wrap; padding: 14px 18px 18px; }
.tx-field { display: flex; flex-direction: column; gap: 5px; min-width: 180px; flex: 1 1 180px; }
.tx-field label { font-size: .72rem; font-weight: 700; color: #64748b; }
.tx-combo-go { height: 31px; white-space: nowrap; }

.tx-tabs { gap: 6px; }
.tx-tabs .nav-link { border-radius: 9px; font-size: .82rem; }
.tx-tip {
    display: flex; align-items: flex-start; gap: 10px; margin-bottom: 18px;
    padding: 12px 16px; border: 1px solid #e6eaf1; border-left: 3px solid #6366f1;
    border-radius: 10px; background: #fbfcff; font-size: .78rem; line-height: 1.8; color: #475569;
}
.tx-tip > i { color: #6366f1; margin-top: 3px; }
.tx-tip code { font-size: .72rem; }

/* ---- 分组与布局卡片 ---- */
.tx-group { scroll-margin-top: 72px; margin-bottom: 28px; }
.tx-group-head { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; padding-bottom: 12px; border-bottom: 1px solid #e9edf4; }
.tx-group-ico { display: inline-flex; align-items: center; justify-content: center; width: 38px; height: 38px; flex: 0 0 38px; border-radius: 11px; background: #eef2ff; color: #4338ca; font-size: 1.05rem; }
.tx-group-txt h2 { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: 0 0 3px; font-size: 1.02rem; font-weight: 800; }
.tx-group-txt p { margin: 0; font-size: .76rem; color: #64748b; }
.tx-count { padding: 2px 9px; border-radius: 999px; background: #f1f5f9; border: 1px solid #e2e8f0; font-size: .7rem; font-weight: 700; color: #64748b; }
.tx-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }

.tx-card, .tx-pal {
    display: flex; flex-direction: column; height: 100%; overflow: hidden;
    background: #fff; border: 1px solid #e6eaf1; border-radius: 14px;
    box-shadow: 0 3px 12px rgba(17, 24, 39, .04);
    transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease;
}
.tx-card:hover, .tx-pal:hover { transform: translateY(-4px); box-shadow: 0 16px 36px rgba(17, 24, 39, .12); }
.tx-card.is-active, .tx-pal.is-active { border-color: #22a06b; box-shadow: 0 0 0 2px rgba(34, 160, 107, .14), 0 10px 26px rgba(17, 24, 39, .07); }

.tx-thumb { position: relative; aspect-ratio: 16 / 9; background: #f1f5f9; overflow: hidden; border-bottom: 1px solid #eef1f6; }
.tx-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .35s ease; }
.tx-card:hover .tx-thumb img { transform: scale(1.045); }
.tx-thumb-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; height: 100%; color: #94a3b8; }
.tx-thumb-empty i { font-size: 2rem; }
.tx-thumb-empty span { font-size: .72rem; }
.tx-ribbon { position: absolute; left: 10px; bottom: 10px; padding: 4px 10px; border-radius: 6px; background: rgba(15, 23, 42, .78); color: #fff; font-size: .68rem; letter-spacing: .04em; }
.tx-state { position: absolute; top: 10px; right: 10px; display: inline-flex; align-items: center; gap: 5px; padding: 4px 10px; border-radius: 999px; font-size: .68rem; font-weight: 700; color: #fff; backdrop-filter: blur(4px); }
.tx-state.ok { background: rgba(22, 163, 74, .92); }
.tx-state.eye { background: rgba(217, 119, 6, .92); top: 40px; }
.tx-state.dark { background: rgba(15, 23, 42, .86); }
.tx-body, .tx-pal-body { display: flex; flex-direction: column; flex: 1; padding: 16px 16px 14px; }
.tx-title-row { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; }
.tx-title-row h3 { margin: 0; font-size: .94rem; font-weight: 800; line-height: 1.45; overflow-wrap: anywhere; }
.tx-title-row code { flex: 0 0 auto; padding: 2px 7px; border-radius: 5px; background: #f1f5f9; color: #6366f1; font-size: .68rem; }
.tx-desc { margin: 9px 0 12px; font-size: .76rem; line-height: 1.75; color: #64748b; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
.tx-feature { display: flex; align-items: center; gap: 6px; padding: 8px 10px; border-radius: 8px; background: #f8fafc; border: 1px dashed #dbe3ee; font-size: .72rem; color: #4338ca; }
.tx-meta { display: flex; flex-wrap: wrap; gap: 6px 12px; margin: 12px 0 0; font-size: .7rem; color: #64748b; }
.tx-meta span { display: inline-flex; align-items: center; gap: 5px; }
.tx-meta i { color: #94a3b8; }
.tx-warn { color: #d97706 !important; }
.tx-warn i { color: #d97706 !important; }
.tx-actions { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: auto; padding-top: 14px; border-top: 1px solid #eef1f6; }
.tx-actions .btn { font-size: .76rem; padding: 5px 10px; border-radius: 7px; }

/* ---- 配色卡片 ---- */
.tx-pal-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px; }
.tx-pal-thumb { position: relative; height: 128px; overflow: hidden; border-bottom: 1px solid #eef1f6; }
.tx-pal-bar { height: 22px; background: var(--p1); }
.tx-pal-canvas { display: flex; flex-direction: column; gap: 7px; height: calc(100% - 22px); padding: 12px; background: var(--p2); }
.tx-pal-dot { width: 20px; height: 20px; border-radius: 6px; background: var(--p1); }
.tx-pal-line { width: 78%; height: 5px; border-radius: 3px; background: var(--p3); opacity: .8; }
.tx-pal-line.short { width: 48%; opacity: .4; }
.tx-pal-cards { display: flex; gap: 5px; margin-top: auto; }
.tx-pal-cards span { flex: 1; height: 26px; border-radius: 5px; background: #fff; border: 1px solid rgba(0, 0, 0, .06); }
.tx-pal-cards span:nth-child(2) { background: var(--p3); opacity: .88; }
.tx-pal-body .tx-desc { -webkit-line-clamp: 2; }
.tx-swatches { display: flex; gap: 6px; margin: 2px 0 12px; }
.tx-swatches i { display: block; width: 26px; height: 16px; border-radius: 4px; border: 1px solid rgba(0, 0, 0, .08); }

.tx-footnote { display: flex; align-items: flex-start; gap: 10px; margin-top: 26px; padding: 14px 16px; border-radius: 10px; background: #f8fafc; border: 1px solid #e6eaf1; font-size: .76rem; line-height: 1.8; color: #64748b; }
.tx-footnote > i { color: #d97706; margin-top: 2px; }

@media (max-width: 1399px) {
    .tx-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .tx-pal-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 991px) {
    .tx-hero-grid { grid-template-columns: minmax(0, 1fr); }
    .tx-hero-x, .tx-hero-eq { display: none; }
    .tx-group-nav { position: static; }
    .tx-pal-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 767px) {
    .tx-grid, .tx-pal-grid { grid-template-columns: minmax(0, 1fr); }
    .tx-combo-go { width: 100%; }
    .tx-hero { padding: 18px; }
}

/* ============================================================
 * 27. v1.30.0 采集 / 选品页样式外置（原内联 <style> 移入设计系统）
 * ============================================================ */
/* v1.26.2 选品页：表格固定布局，避免超宽；勾选区域放大更易点 */
.sc-wrap{width:100%;max-width:100%;overflow:hidden}
.sc-table{table-layout:fixed;width:100%;margin:0}
.sc-table th,.sc-table td{vertical-align:middle;overflow-wrap:anywhere}
.sc-table .sc-c-pick{width:48px}
.sc-table .sc-c-img{width:70px}
.sc-table .sc-c-cat{width:120px}
.sc-table .sc-c-money{width:96px}
.sc-table .sc-c-stock{width:80px}
.sc-table .sc-c-act{width:64px}
.sc-table .sc-c-sku{width:130px}
.sc-table .sc-c-time{width:152px}
.sc-thumb{width:54px;height:54px;object-fit:cover;border-radius:8px;background:#f1f5f9;display:block}
.sc-name{font-weight:600;font-size:.85rem;line-height:1.35}
.sc-meta{font-size:.74rem;color:#7b8794;margin-top:2px}
.sc-tabs{display:flex;gap:.4rem;border-bottom:1px solid #e6ecea;margin-bottom:0}
.sc-tab{border:0;background:transparent;padding:.62rem .95rem;font-size:.85rem;font-weight:600;color:#64748b;border-bottom:2px solid transparent;cursor:pointer}
.sc-tab.active{color:var(--admin-primary-deep);border-bottom-color:var(--admin-primary)}
.sc-tab .badge{font-size:.68rem}
.sc-pager{display:flex;align-items:center;gap:.4rem}
.sc-empty{padding:2.2rem 1rem;text-align:center;color:#94a3b8;font-size:.85rem}
.sc-tag{display:inline-block;padding:.1rem .42rem;border-radius:.35rem;background:#eef4f3;color:#476a64;font-size:.7rem;margin-left:.25rem}
.sc-tag.warn{background:#fef3c7;color:#92400e}
.sc-cfg-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:.85rem}
.sc-cfg-grid .form-label{margin-bottom:.3rem;font-size:.78rem;color:#5b6b73;font-weight:600}
.sc-flag{display:flex;align-items:center;gap:.4rem;padding-top:1.55rem;font-size:.8rem;color:#4b5563}
.sc-flag input{width:15px;height:15px;margin:0}
@media (max-width:768px){
  .sc-table .sc-c-cat,.sc-table .sc-c-stock{display:none}
}

/* v1.27.0 万邦海外电商采集页 */
.ob-wrap{width:100%;max-width:100%;overflow:hidden}
.ob-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:.85rem}
.ob-grid .form-label{margin-bottom:.3rem;font-size:.78rem;color:#5b6b73;font-weight:600}
.ob-flag{display:flex;align-items:center;gap:.4rem;padding-top:1.55rem;font-size:.8rem;color:#4b5563}
.ob-flag input{width:15px;height:15px;margin:0}
.ob-tools{display:grid;grid-template-columns:1fr 1fr;gap:1rem}
.ob-tool{border:1px solid #e6ecea;border-radius:10px;padding:1rem;background:#fbfdfc}
.ob-tool h6{font-size:.88rem;font-weight:700;margin:0 0 .65rem;color:#2f4a45}
.ob-row{display:flex;gap:.5rem;align-items:center;flex-wrap:wrap}
.ob-row .form-control,.ob-row .form-select{min-width:0}
.ob-hint{font-size:.74rem;color:#8492a0;margin-top:.45rem;line-height:1.5}
.ob-tabs{display:flex;gap:.4rem;border-bottom:1px solid #e6ecea}
.ob-tab{border:0;background:transparent;padding:.62rem .95rem;font-size:.85rem;font-weight:600;color:#64748b;border-bottom:2px solid transparent;cursor:pointer}
.ob-tab.active{color:var(--admin-primary-deep);border-bottom-color:var(--admin-primary)}
.ob-bar{display:flex;gap:.5rem;align-items:center;flex-wrap:wrap;padding:.75rem 1rem;border-bottom:1px solid #eef2f1;background:#fff}
.ob-bar .form-select,.ob-bar .form-control{width:auto;min-width:130px;font-size:.82rem}
.ob-table{table-layout:fixed;width:100%;margin:0}
.ob-table th,.ob-table td{vertical-align:middle;overflow-wrap:anywhere}
.ob-table .ob-c-pick{width:46px}
.ob-table .ob-c-img{width:68px}
.ob-table .ob-c-money{width:100px}
.ob-table .ob-c-stock{width:78px}
.ob-table .ob-c-state{width:92px}
.ob-table .ob-c-act{width:70px}
.ob-thumb{width:52px;height:52px;object-fit:cover;border-radius:8px;background:#f1f5f9;display:block}
.ob-name{font-weight:600;font-size:.85rem;line-height:1.35;word-break:break-word}
.ob-meta{font-size:.73rem;color:#7b8794;margin-top:3px;word-break:break-all}
.ob-tag{display:inline-block;padding:.1rem .42rem;border-radius:.35rem;background:#eef4f3;color:#476a64;font-size:.7rem}
.ob-tag.ok{background:#dcfce7;color:#166534}
.ob-tag.warn{background:#fef3c7;color:#92400e}
.ob-empty{padding:2.2rem 1rem;text-align:center;color:#94a3b8;font-size:.85rem}
.ob-pager{display:flex;align-items:center;gap:.4rem;padding:.7rem 1rem}
.ob-mask{position:fixed;inset:0;background:rgba(15,23,42,.42);display:none;z-index:1050;align-items:center;justify-content:center;padding:1rem}
.ob-mask.show{display:flex}
.ob-modal{background:#fff;border-radius:14px;width:min(760px,100%);max-height:86vh;overflow:auto;box-shadow:0 20px 60px rgba(15,23,42,.22)}
.ob-modal-head{display:flex;justify-content:space-between;align-items:center;padding:1rem 1.2rem;border-bottom:1px solid #eef2f1}
.ob-modal-body{padding:1.2rem}
.ob-gallery{display:flex;gap:.5rem;flex-wrap:wrap;margin-bottom:.8rem}
.ob-gallery img{width:92px;height:92px;object-fit:cover;border-radius:8px;border:1px solid #e6ecea}
.ob-kv{display:grid;grid-template-columns:110px 1fr;gap:.35rem .7rem;font-size:.83rem;margin:.7rem 0}
.ob-kv b{color:#5b6b73;font-weight:600}
.ob-desc{font-size:.82rem;line-height:1.65;color:#334155;background:#f8faf9;border-radius:8px;padding:.8rem;max-height:230px;overflow:auto;white-space:pre-wrap}
.ob-toast{position:fixed;right:1.2rem;bottom:1.2rem;z-index:1100;background:#1f2937;color:#fff;padding:.7rem 1rem;border-radius:9px;font-size:.84rem;box-shadow:0 8px 24px rgba(0,0,0,.2);opacity:0;transform:translateY(8px);transition:.2s;pointer-events:none;max-width:420px}
.ob-toast.show{opacity:1;transform:translateY(0)}
.ob-toast.err{background:#b91c1c}
.ob-toast.ok{background:#15803d}
@media (max-width:900px){
  .ob-tools{grid-template-columns:1fr}
  .ob-table .ob-c-stock,.ob-table .ob-c-state{display:none}
}

/* ============================================================
 * 28. v1.31.0 模板管理增强（筛选 / 折叠 / 空状态）
 *    与可视化装修台「会员登录页」分组
 *    所有选择器以 .tx- / .vz-login- 开头，仅作用于对应后台页面
 * ============================================================ */
.tx-card[hidden],.tx-pal[hidden],.tx-group[hidden],.tx-filter-empty[hidden]{display:none!important}

.tx-filter{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  padding:11px 13px;margin:0 0 16px;
  background:#fff;border:1px solid #e6ecea;border-radius:12px;
  box-shadow:0 2px 10px rgba(15,23,42,.04)
}
.tx-filter-search{
  position:relative;display:flex;align-items:center;gap:8px;
  flex:1 1 260px;max-width:360px;min-width:220px;height:34px;padding:0 10px;
  border:1px solid #e2e9e7;border-radius:9px;background:#f8faf9;
  transition:border-color .18s ease,box-shadow .18s ease
}
.tx-filter-search:focus-within{border-color:var(--admin-primary);box-shadow:0 0 0 3px rgba(13,148,136,.12)}
.tx-filter-search>i{color:#94a3b8;font-size:.84rem}
.tx-filter-search input{border:0;outline:0;background:transparent;flex:1;min-width:0;font-size:.82rem;color:#334155}
.tx-filter-search input::placeholder{color:#a3b0ba}
.tx-filter-clear{border:0;background:transparent;color:#94a3b8;padding:2px 4px;line-height:1;cursor:pointer}
.tx-filter-clear:hover{color:#334155}
.tx-filter-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.tx-filter-chips button{
  border:1px solid #e2e9e7;background:#fff;color:#5b6b73;
  padding:5px 11px;border-radius:999px;font-size:.76rem;font-weight:600;
  cursor:pointer;white-space:nowrap;transition:all .18s ease
}
.tx-filter-chips button i{font-size:.72rem;margin-right:3px}
.tx-filter-chips button:hover{border-color:var(--admin-primary);color:var(--admin-primary-deep)}
.tx-filter-chips button.is-on{background:var(--admin-primary);border-color:var(--admin-primary);color:#fff;box-shadow:0 4px 10px rgba(13,148,136,.22)}
.tx-filter-count{font-size:.75rem;color:#7b8794;white-space:nowrap}

.tx-fold{
  margin-left:auto;flex:0 0 30px;width:30px;height:30px;
  display:inline-flex;align-items:center;justify-content:center;
  border:1px solid #e6eaf1;border-radius:8px;background:#fff;color:#64748b;
  cursor:pointer;transition:all .18s ease
}
.tx-fold:hover{border-color:var(--admin-primary);color:var(--admin-primary-deep);background:#f0f7f6}
.tx-group.is-collapsed .tx-grid{display:none}
.tx-group.is-collapsed .tx-group-head{margin-bottom:0;padding-bottom:10px}

.tx-filter-empty{
  display:flex;flex-direction:column;align-items:center;gap:6px;
  padding:26px 14px;margin:0 0 18px;border:1px dashed #dbe4e1;border-radius:12px;background:#fafcfb;text-align:center
}
.tx-filter-empty i{font-size:1.6rem;color:#9aa9b4}
.tx-filter-empty b{font-size:.88rem;color:#334155}
.tx-filter-empty span{font-size:.76rem;color:#7b8794}

.tx-thumb::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(180deg,transparent 58%,rgba(15,23,42,.20));
  opacity:0;transition:opacity .25s ease
}
.tx-card:hover .tx-thumb::after{opacity:1}

/* ---- 装修台：会员登录页分组 ---- */
.vz-login-group{border-left:3px solid var(--admin-primary)}
.vz-login-group>summary{color:var(--admin-primary-deep)}
.vz-login-jump{
  display:flex;align-items:flex-start;gap:9px;flex-wrap:wrap;
  padding:10px 11px;margin-bottom:13px;border:1px solid #dcece9;border-radius:9px;
  background:#f0f7f6;font-size:.76rem;line-height:1.65;color:#476a64
}
.vz-login-jump>i{color:var(--admin-primary);margin-top:2px}
.vz-login-jump>span{flex:1 1 200px}
.vz-login-jump a{font-weight:700;color:var(--admin-primary-deep)}
.vz-login-jump .btn{white-space:nowrap;font-size:.74rem;flex:0 0 auto}

@media (max-width:991px){
  .tx-filter-search{max-width:none;flex-basis:100%}
}
@media (max-width:640px){
  .tx-filter{padding:10px}
  .tx-filter-chips{flex-wrap:nowrap;overflow-x:auto;padding-bottom:2px}
  .tx-filter-count{width:100%}
  .tx-fold{flex-basis:28px;width:28px;height:28px}
}

/* ============================================================
 * 29. v1.34.0 通知模板 + 定时任务
 * ============================================================ */

/* ---------- 通用统计卡 ---------- */
.adm-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr));gap:12px;margin-bottom:16px}
.adm-stat{background:var(--adm-surface);border:1px solid var(--adm-line);border-radius:var(--adm-r-lg);padding:13px 15px;box-shadow:var(--adm-shadow-xs)}
.adm-stat b{display:block;font-size:1.45rem;font-weight:800;line-height:1.25;color:var(--adm-ink);letter-spacing:-.02em}
.adm-stat span{display:block;margin-top:2px;font-size:.74rem;color:var(--adm-ink-3)}
.adm-stat small{display:block;margin-top:6px;font-size:.7rem;color:var(--adm-ink-3)}
.adm-stat.is-ok b{color:var(--adm-ok)}
.adm-stat.is-warn b{color:var(--adm-warn)}
.adm-stat.is-danger b{color:var(--adm-danger)}
.adm-stat.is-primary b{color:var(--admin-primary,#0d9488)}

/* ---------- 筛选条 ---------- */
.adm-filter{display:flex;align-items:center;gap:10px;flex-wrap:wrap;background:var(--adm-surface);border:1px solid var(--adm-line);border-radius:var(--adm-r-lg);padding:10px 12px;margin-bottom:14px}
.adm-filter-search{position:relative;flex:1 1 240px;min-width:200px}
.adm-filter-search i{position:absolute;left:11px;top:50%;transform:translateY(-50%);color:var(--adm-ink-3);font-size:.85rem}
.adm-filter-search input{width:100%;height:34px;padding:0 30px 0 32px;border:1px solid var(--adm-line);border-radius:999px;background:var(--adm-surface-2);font-size:.8rem;color:var(--adm-ink);outline:0}
.adm-filter-search input:focus{border-color:var(--adm-primary-line);background:var(--adm-surface);box-shadow:0 0 0 3px var(--adm-primary-soft)}
.adm-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.adm-chip-btn{display:inline-flex;align-items:center;gap:5px;height:30px;padding:0 12px;border:1px solid var(--adm-line);border-radius:999px;background:var(--adm-surface);color:var(--adm-ink-2);font-size:.76rem;font-weight:600;text-decoration:none;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}
.adm-chip-btn:hover{background:var(--adm-surface-3);color:var(--adm-ink)}
.adm-chip-btn.is-on{background:var(--adm-primary-soft);border-color:var(--adm-primary-line);color:var(--admin-primary,#0d9488)}
.adm-chip-btn i{font-size:.8rem}
.adm-filter-count{margin-left:auto;font-size:.74rem;color:var(--adm-ink-3);white-space:nowrap}

/* ---------- 通知模板分组 ---------- */
.nt-group{background:var(--adm-surface);border:1px solid var(--adm-line);border-radius:var(--adm-r-lg);overflow:hidden;margin-bottom:14px;box-shadow:var(--adm-shadow-xs)}
.nt-group-head{display:flex;align-items:center;gap:11px;padding:12px 16px;background:var(--adm-surface-2);border-bottom:1px solid var(--adm-line)}
.nt-group-ico{flex:0 0 32px;width:32px;height:32px;border-radius:9px;display:grid;place-items:center;background:var(--adm-primary-soft);color:var(--admin-primary,#0d9488);font-size:.9rem}
.nt-group-head h2{margin:0;font-size:.9rem;font-weight:800;color:var(--adm-ink)}
.nt-group-head p{margin:1px 0 0;font-size:.72rem;color:var(--adm-ink-3)}
.nt-group-cnt{margin-left:auto;font-size:.72rem;font-weight:700;color:var(--adm-ink-3);background:var(--adm-surface);border:1px solid var(--adm-line);border-radius:999px;padding:2px 10px}

.nt-table{width:100%;border-collapse:collapse}
.nt-table th{padding:9px 14px;text-align:left;font-size:.7rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--adm-ink-3);background:var(--adm-surface);border-bottom:1px solid var(--adm-line-soft);white-space:nowrap}
.nt-table td{padding:11px 14px;border-bottom:1px solid var(--adm-line-soft);vertical-align:middle;font-size:.82rem;color:var(--adm-ink-2)}
.nt-table tr:last-child td{border-bottom:0}
.nt-table tbody tr:hover td{background:var(--adm-surface-2)}
.nt-name{display:block;font-weight:700;color:var(--adm-ink);line-height:1.35}
.nt-code{display:inline-block;margin-top:3px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.68rem;color:var(--adm-ink-3);background:var(--adm-surface-3);border-radius:5px;padding:1px 6px}
.nt-desc{display:block;margin-top:3px;font-size:.73rem;color:var(--adm-ink-3);line-height:1.5}

.nt-tag{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 9px;border-radius:999px;font-size:.68rem;font-weight:700;white-space:nowrap}
.nt-tag.mail{background:rgba(2,132,199,.1);color:#0369a1}
.nt-tag.sms{background:rgba(217,119,6,.12);color:#b45309}

.nt-langs{display:flex;gap:5px}
.nt-lang{display:inline-flex;align-items:center;gap:3px;height:22px;padding:0 8px;border-radius:6px;font-size:.66rem;font-weight:700;border:1px solid transparent}
.nt-lang.on{background:rgba(22,163,74,.1);color:#15803d;border-color:rgba(22,163,74,.2)}
.nt-lang.off{background:var(--adm-surface-3);color:var(--adm-ink-3);border-color:var(--adm-line)}
.nt-lang.off i{font-size:.62rem}

.nt-state{display:inline-flex;align-items:center;gap:6px;font-size:.74rem;font-weight:700}
.nt-state .dot{width:7px;height:7px;border-radius:50%;background:var(--adm-ink-3)}
.nt-state.on{color:#15803d}
.nt-state.on .dot{background:var(--adm-ok);box-shadow:0 0 0 3px rgba(22,163,74,.14)}
.nt-state.off{color:var(--adm-ink-3)}

.nt-acts{display:flex;align-items:center;justify-content:flex-end;gap:5px}
.nt-acts .btn{--bs-btn-padding-y:.2rem;--bs-btn-padding-x:.45rem;--bs-btn-font-size:.75rem}
.nt-acts form{margin:0}

.nt-empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:46px 20px;color:var(--adm-ink-3);text-align:center}
.nt-empty i{font-size:2rem;opacity:.5}
.nt-empty b{font-size:.9rem;color:var(--adm-ink-2)}

/* ---------- 通知模板编辑 ---------- */
.nt-edit{display:grid;grid-template-columns:minmax(0,1fr) 330px;gap:16px;align-items:start}
.nt-panel{background:var(--adm-surface);border:1px solid var(--adm-line);border-radius:var(--adm-r-lg);overflow:hidden;box-shadow:var(--adm-shadow-xs)}
.nt-panel + .nt-panel{margin-top:12px}
.nt-panel-head{display:flex;align-items:center;gap:8px;padding:10px 14px;background:var(--adm-surface-2);border-bottom:1px solid var(--adm-line);font-size:.8rem;font-weight:800;color:var(--adm-ink)}
.nt-panel-head i{color:var(--admin-primary,#0d9488)}
.nt-panel-head .nt-panel-hint{margin-left:auto;font-size:.7rem;font-weight:600;color:var(--adm-ink-3)}
.nt-panel-body{padding:14px}
.nt-side{position:sticky;top:12px}

.nt-vars{display:flex;flex-wrap:wrap;gap:6px}
.nt-var{display:inline-flex;align-items:center;gap:5px;padding:4px 8px;border:1px solid var(--adm-line);border-radius:7px;background:var(--adm-surface-2);font-size:.72rem;color:var(--adm-ink-2);cursor:pointer;transition:background .15s ease,border-color .15s ease,color .15s ease}
.nt-var:hover{background:var(--adm-primary-soft);border-color:var(--adm-primary-line);color:var(--admin-primary,#0d9488)}
.nt-var code{font-size:.68rem;background:transparent;padding:0;color:inherit;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
.nt-var small{font-size:.68rem;color:var(--adm-ink-3)}
.nt-var:hover small{color:inherit;opacity:.8}

.nt-live{background:var(--adm-surface-2);border:1px solid var(--adm-line-soft);border-radius:10px;padding:10px;max-height:330px;overflow:auto}
.nt-live-subject{font-size:.76rem;font-weight:700;color:var(--adm-ink);padding-bottom:7px;margin-bottom:8px;border-bottom:1px dashed var(--adm-line)}
.nt-live-body{background:var(--adm-surface);border:1px solid var(--adm-line-soft);border-radius:8px;padding:12px;font-size:.78rem;line-height:1.75;color:#334155;word-break:break-word}
.nt-live-body p{margin:0 0 8px}
.nt-live-body a{color:#0369a1}

.nt-count{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:6px;font-size:.7rem;color:var(--adm-ink-3)}
.nt-count b{color:var(--adm-ink-2)}
.nt-count.over b{color:var(--adm-danger)}

.nt-sib{display:flex;flex-direction:column;gap:6px}
.nt-sib-item{display:flex;align-items:center;gap:8px;padding:7px 9px;border:1px solid var(--adm-line);border-radius:8px;text-decoration:none;color:var(--adm-ink-2);font-size:.76rem;background:var(--adm-surface)}
.nt-sib-item:hover{background:var(--adm-surface-2);color:var(--adm-ink)}
.nt-sib-item.is-cur{border-color:var(--adm-primary-line);background:var(--adm-primary-soft);color:var(--admin-primary,#0d9488)}
.nt-sib-item .flag{margin-left:auto;font-size:.68rem;font-weight:700;color:var(--adm-ink-3)}

/* ---------- 通知模板预览 ---------- */
.nt-mail{max-width:660px;margin:0 auto;background:#e9eef4;border-radius:14px;padding:18px}
.nt-mail-card{background:#fff;border-radius:12px;overflow:hidden;box-shadow:0 8px 26px rgba(15,23,42,.1)}
.nt-mail-head{padding:13px 18px;background:#f8fafc;border-bottom:1px solid #e8edf3}
.nt-mail-subject{font-size:.88rem;font-weight:800;color:#0f172a;line-height:1.5;word-break:break-word}
.nt-mail-meta{margin-top:4px;font-size:.7rem;color:#94a3b8}
.nt-mail-body{padding:20px 22px;font-size:.84rem;line-height:1.8;color:#273244;word-break:break-word}
.nt-mail-body p{margin:0 0 10px}
.nt-mail-body a{color:#0369a1}
.nt-mail-foot{padding:11px 18px;border-top:1px dashed #e8edf3;font-size:.68rem;color:#94a3b8;background:#fbfcfe}
.nt-bubble{max-width:420px;margin:0 auto;padding:14px 16px;border-radius:16px 16px 16px 4px;background:#e8f3ff;color:#12304d;font-size:.84rem;line-height:1.7;word-break:break-word}
.nt-plain{white-space:pre-wrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.76rem;line-height:1.7;color:var(--adm-ink-2);background:var(--adm-surface-2);border:1px solid var(--adm-line-soft);border-radius:8px;padding:10px}

/* ---------- 定时任务 ---------- */
.ct-banner{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border:1px solid var(--adm-primary-line);background:var(--adm-primary-soft);border-radius:var(--adm-r-lg);margin-bottom:14px}
.ct-banner .ico{flex:0 0 34px;width:34px;height:34px;border-radius:10px;display:grid;place-items:center;background:var(--adm-surface);color:var(--admin-primary,#0d9488);font-size:.95rem}
.ct-banner b{display:block;font-size:.85rem;color:var(--adm-ink)}
.ct-banner p{margin:2px 0 0;font-size:.76rem;color:var(--adm-ink-2);line-height:1.6}
.ct-banner .ct-cmd{display:flex;align-items:center;gap:8px;margin-top:8px;flex-wrap:wrap}
.ct-banner code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.73rem;background:var(--adm-surface);border:1px solid var(--adm-primary-line);border-radius:6px;padding:4px 8px;color:var(--adm-ink);word-break:break-all}

.ct-cron{display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.74rem;font-weight:700;color:var(--adm-ink);background:var(--adm-surface-3);border:1px solid var(--adm-line);border-radius:6px;padding:2px 7px;white-space:nowrap}
.ct-human{display:block;margin-top:3px;font-size:.7rem;color:var(--adm-ink-3)}
.ct-status{display:inline-flex;align-items:center;gap:6px;font-size:.72rem;font-weight:700}
.ct-status .dot{width:7px;height:7px;border-radius:50%;background:var(--adm-ink-3)}
.ct-status.ok{color:#15803d}.ct-status.ok .dot{background:var(--adm-ok)}
.ct-status.fail{color:#b91c1c}.ct-status.fail .dot{background:var(--adm-danger)}
.ct-status.idle{color:var(--adm-ink-3)}
.ct-time{display:block;font-size:.75rem;color:var(--adm-ink-2);white-space:nowrap}
.ct-time small{display:block;font-size:.68rem;color:var(--adm-ink-3)}
.ct-acts{display:flex;align-items:center;justify-content:flex-end;gap:5px}
.ct-acts .btn{--bs-btn-padding-y:.2rem;--bs-btn-padding-x:.45rem;--bs-btn-font-size:.74rem}
.ct-acts form{margin:0}

.ct-log-table td{font-size:.78rem}
.ct-out{margin:0;max-height:220px;overflow:auto;white-space:pre-wrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.72rem;line-height:1.6;color:var(--adm-ink-2);background:var(--adm-surface-2);border:1px solid var(--adm-line-soft);border-radius:8px;padding:10px}
.ct-details summary{cursor:pointer;font-size:.72rem;color:var(--admin-primary,#0d9488);font-weight:700;list-style:none}
.ct-details summary::-webkit-details-marker{display:none}
.ct-details[open] summary{margin-bottom:6px}

@media (max-width:1100px){
  .nt-edit{grid-template-columns:1fr}
  .nt-side{position:static}
}
@media (max-width:767px){
  .adm-stats{grid-template-columns:repeat(2,minmax(0,1fr))}
  .adm-filter{padding:9px 10px}
  .adm-filter-count{margin-left:0;width:100%}
  .nt-table th:nth-child(3),.nt-table td:nth-child(3){display:none}
  .nt-group-head{padding:10px 12px}
  .nt-mail{padding:10px;border-radius:10px}
  .nt-mail-body{padding:15px}
}

/* v1.36.1：SMTP 预检 / 测试邮件的多行错误与排障建议 */
.lx-pre { white-space: pre-line; word-break: break-word; }
.lx-pre > div { margin-bottom: 3px; }

