/* ═══════════════════════════════════════════════════════════════════════════
   shadcn/ui 基础层 —— 全站最终视觉契约
   ---------------------------------------------------------------------------
   本文件取代原 app.css 末尾的 "Console foundation: Vue / Node / Halo inspired"
   基调层：把扁平、6px 圆角、零阴影、#2457d6 深蓝的 console 风格，统一到
   shadcn/ui 的设计语言（new-york 变体 + zinc 中性色 + 品牌蓝 primary）。

   加载顺序（两套 layout 均置于最后）：
     app.css → user-refined.css / pub.css / public-shell.css / admin-redesign.css
     → 本文件
   因此这里只负责「视觉令牌 + 组件几何」，不再改动任何布局尺寸与断点。

   设计对齐要点
     圆角   --radius 0.625rem；sm 6 / md 8 / lg 10 / xl 14
     阴影   shadow-xs 用于控件，shadow-sm 用于卡片，shadow-lg 用于弹层
     焦点   focus-visible = 2px 背景色隔离环 + 50% ring（shadcn ring-offset）
     状态色 全部走 --sh-* 语义令牌，明暗两套，取代内联 hex 与属性选择器 hack
     字重   Nunito 仅提供 400/600/800；shadcn 的 font-medium 用 600 落地，
            避免浏览器合成字重导致中文发虚
   ═══════════════════════════════════════════════════════════════════════════ */

/* ═══ 1. 语义令牌 · 亮色 ═══════════════════════════════════════════════ */
:root {
    /* 基础表面（shadcn zinc 基准） */
    --background: #fafafa;
    --foreground: #09090b;
    --card: #ffffff;
    --card-foreground: #09090b;
    --popover: #ffffff;
    --popover-foreground: #09090b;

    --primary-foreground: #ffffff;
    --secondary: #f4f4f5;
    --secondary-foreground: #18181b;
    --muted: #f4f4f5;
    --muted-foreground: #71717a;

    --destructive: #dc2626;
    --destructive-foreground: #ffffff;

    --input: #e4e4e7;
    --ring: #2563eb;

    /* 圆角梯度 */
    --radius: .625rem;
    --sh-radius-sm: calc(var(--radius) - 4px);
    --sh-radius-md: calc(var(--radius) - 2px);
    --sh-radius-lg: var(--radius);
    --sh-radius-xl: calc(var(--radius) + 4px);

    /* 阴影梯度 */
    --sh-shadow-xs: 0 1px 2px 0 rgb(0 0 0 / .05);
    --sh-shadow-sm: 0 1px 3px 0 rgb(0 0 0 / .07), 0 1px 2px -1px rgb(0 0 0 / .07);
    --sh-shadow-md: 0 4px 6px -1px rgb(0 0 0 / .08), 0 2px 4px -2px rgb(0 0 0 / .06);
    --sh-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / .10), 0 4px 6px -4px rgb(0 0 0 / .08);
    --sh-ring-shadow: 0 0 0 2px var(--background), 0 0 0 4px color-mix(in srgb, var(--ring) 50%, transparent);

    /* 状态语义色（亮色：50 底 / 800 字 / 200 描边） */
    --sh-ok-bg: #f0fdf4;      --sh-ok-fg: #15803d;      --sh-ok-line: #bbf7d0;
    --sh-warn-bg: #fffbeb;    --sh-warn-fg: #b45309;    --sh-warn-line: #fde68a;
    --sh-danger-bg: #fef2f2;  --sh-danger-fg: #b91c1c;  --sh-danger-line: #fecaca;
    --sh-info-bg: #eff6ff;    --sh-info-fg: #1d4ed8;    --sh-info-line: #bfdbfe;
    --sh-neutral-bg: #f4f4f5; --sh-neutral-fg: #52525b; --sh-neutral-line: #e4e4e7;
    --sh-purple-bg: #faf5ff;  --sh-purple-fg: #7e22ce;  --sh-purple-line: #e9d5ff;
    --sh-orange-bg: #fff7ed;  --sh-orange-fg: #c2410c;  --sh-orange-line: #fed7aa;
    --sh-cyan-bg: #ecfeff;    --sh-cyan-fg: #0e7490;    --sh-cyan-line: #a5f3fc;
}

/* ═══ 2. 语义令牌 · 暗色 ═══════════════════════════════════════════════ */
:root[data-theme="dark"] {
    --background: #09090b;
    --foreground: #fafafa;
    --card: #18181b;
    --card-foreground: #fafafa;
    --popover: #18181b;
    --popover-foreground: #fafafa;

    --primary-foreground: #ffffff;
    --secondary: #27272a;
    --secondary-foreground: #fafafa;
    --muted: #27272a;
    --muted-foreground: #a1a1aa;

    --destructive: #ef4444;
    --destructive-foreground: #ffffff;

    --input: #3f3f46;
    --ring: #3b82f6;

    --sh-shadow-xs: 0 1px 2px 0 rgb(0 0 0 / .4);
    --sh-shadow-sm: 0 1px 3px 0 rgb(0 0 0 / .5), 0 1px 2px -1px rgb(0 0 0 / .4);
    --sh-shadow-md: 0 4px 6px -1px rgb(0 0 0 / .5), 0 2px 4px -2px rgb(0 0 0 / .4);
    --sh-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / .6), 0 4px 6px -4px rgb(0 0 0 / .5);

    --sh-ok-bg: rgb(34 197 94 / .16);      --sh-ok-fg: #86efac;      --sh-ok-line: rgb(34 197 94 / .32);
    --sh-warn-bg: rgb(245 158 11 / .16);   --sh-warn-fg: #fcd34d;    --sh-warn-line: rgb(245 158 11 / .32);
    --sh-danger-bg: rgb(239 68 68 / .16);  --sh-danger-fg: #fca5a5;  --sh-danger-line: rgb(239 68 68 / .32);
    --sh-info-bg: rgb(59 130 246 / .16);   --sh-info-fg: #93c5fd;    --sh-info-line: rgb(59 130 246 / .32);
    --sh-neutral-bg: #27272a;              --sh-neutral-fg: #a1a1aa; --sh-neutral-line: #3f3f46;
    --sh-purple-bg: rgb(168 85 247 / .16); --sh-purple-fg: #d8b4fe;  --sh-purple-line: rgb(168 85 247 / .32);
    --sh-orange-bg: rgb(249 115 22 / .16); --sh-orange-fg: #fdba74;  --sh-orange-line: rgb(249 115 22 / .32);
    --sh-cyan-bg: rgb(34 211 238 / .14);   --sh-cyan-fg: #67e8f9;    --sh-cyan-line: rgb(34 211 238 / .30);
}
@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) {
        --background: #09090b;
        --foreground: #fafafa;
        --card: #18181b;
        --card-foreground: #fafafa;
        --popover: #18181b;
        --popover-foreground: #fafafa;

        --primary-foreground: #ffffff;
        --secondary: #27272a;
        --secondary-foreground: #fafafa;
        --muted: #27272a;
        --muted-foreground: #a1a1aa;

        --destructive: #ef4444;
        --destructive-foreground: #ffffff;

        --input: #3f3f46;
        --ring: #3b82f6;

        --sh-shadow-xs: 0 1px 2px 0 rgb(0 0 0 / .4);
        --sh-shadow-sm: 0 1px 3px 0 rgb(0 0 0 / .5), 0 1px 2px -1px rgb(0 0 0 / .4);
        --sh-shadow-md: 0 4px 6px -1px rgb(0 0 0 / .5), 0 2px 4px -2px rgb(0 0 0 / .4);
        --sh-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / .6), 0 4px 6px -4px rgb(0 0 0 / .5);

        --sh-ok-bg: rgb(34 197 94 / .16);      --sh-ok-fg: #86efac;      --sh-ok-line: rgb(34 197 94 / .32);
        --sh-warn-bg: rgb(245 158 11 / .16);   --sh-warn-fg: #fcd34d;    --sh-warn-line: rgb(245 158 11 / .32);
        --sh-danger-bg: rgb(239 68 68 / .16);  --sh-danger-fg: #fca5a5;  --sh-danger-line: rgb(239 68 68 / .32);
        --sh-info-bg: rgb(59 130 246 / .16);   --sh-info-fg: #93c5fd;    --sh-info-line: rgb(59 130 246 / .32);
        --sh-neutral-bg: #27272a;              --sh-neutral-fg: #a1a1aa; --sh-neutral-line: #3f3f46;
        --sh-purple-bg: rgb(168 85 247 / .16); --sh-purple-fg: #d8b4fe;  --sh-purple-line: rgb(168 85 247 / .32);
        --sh-orange-bg: rgb(249 115 22 / .16); --sh-orange-fg: #fdba74;  --sh-orange-line: rgb(249 115 22 / .32);
        --sh-cyan-bg: rgb(34 211 238 / .14);   --sh-cyan-fg: #67e8f9;    --sh-cyan-line: rgb(34 211 238 / .30);
    }
}

/* ═══ 3. 兼容层：历史令牌全部改为引用语义令牌 ═══════════════════════════
   页面与旧样式表仍使用 --text / --surface / --bg / --primary-bg 等历史命名，
   这里统一指向语义令牌，使「改一处令牌 = 全站生效」，无需改动 40+ 页面。
   --accent 保留历史语义（品牌蓝），不采用 shadcn 中 accent=浅灰悬停面的定义，
   因为全站 30 处 var(--accent) 均按品牌蓝使用。
   ═════════════════════════════════════════════════════════════════════ */
:root {
    scrollbar-gutter: stable;

    --primary: #2563eb;
    --primary-d: #1d4ed8;
    --primary-bg: #eff6ff;
    --primary-bg2: #dbeafe;
    --accent: var(--primary);
    --accent-h: var(--primary-d);

    --text: var(--foreground);
    --text2: #3f3f46;
    --text3: #52525b;
    --text4: var(--muted-foreground);

    --border: var(--sh-neutral-line);
    --border-light: #f4f4f5;
    --surface: var(--card);
    --bg: var(--background);

    --shell-shadow: var(--sh-shadow-xs);
    --shell-shadow-hover: var(--sh-shadow-sm);
}
:root[data-theme="dark"] {
    --primary: #3b82f6;
    --primary-d: #2563eb;
    --primary-bg: rgb(59 130 246 / .16);
    --primary-bg2: rgb(59 130 246 / .24);
    --text2: #e4e4e7;
    --text3: #d4d4d8;
    --border-light: #232326;
    color-scheme: dark;
}
@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) {
        --primary: #3b82f6;
        --primary-d: #2563eb;
        --primary-bg: rgb(59 130 246 / .16);
        --primary-bg2: rgb(59 130 246 / .24);
        --text2: #e4e4e7;
        --text3: #d4d4d8;
        --border-light: #232326;
        color-scheme: dark;
    }
}

/* 用户工作台 / 注册商 console 的私有令牌同样并入语义层 */
.portal-body {
    --portal-ink: var(--foreground);
    --portal-bg: var(--background);
    --portal-line: var(--border);
    --portal-accent: var(--primary);
    --portal-accent-dark: var(--primary-d);

    --customer-blue: var(--primary);
    --customer-blue-dark: var(--primary-d);
    --customer-blue-soft: var(--primary-bg);
    --customer-canvas: var(--background);
    --customer-surface: var(--card);
    --customer-line: var(--border);
    --customer-line-strong: var(--input);
    --customer-text: var(--foreground);
    --customer-muted: var(--muted-foreground);

    background: var(--background);
    color: var(--foreground);
}

/* ═══ 4. 基础原子 ═════════════════════════════════════════════════════ */
body { background: var(--background); color: var(--foreground); }
.portal-body .main-wrap,
.portal-body .page-body { background: var(--background); }
::selection { background: color-mix(in srgb, var(--primary) 20%, transparent); color: var(--foreground); }
html ::-webkit-scrollbar-thumb { background: color-mix(in srgb, var(--foreground) 12%, transparent); border-radius: 999px; }
html ::-webkit-scrollbar-thumb:hover { background: color-mix(in srgb, var(--foreground) 20%, transparent); }
html { scrollbar-color: color-mix(in srgb, var(--foreground) 12%, transparent) transparent; }
code:not(pre code), kbd {
    background: var(--muted); border-color: var(--border); color: var(--foreground);
    border-radius: var(--sh-radius-sm);
}

/* ═══ 5. 表面层：卡片 / 面板 / 工具条 / 表格容器 ═══════════════════════ */
.card, .stat-card, .adapter-card, .cfg-section, .toolbar, .table-card, .filter-bar,
.portal-body .card, .portal-body .stat-card, .portal-body .adapter-card,
.portal-body .cfg-section, .portal-body .toolbar, .portal-body .table-card,
.portal-body .dm-card, .portal-body .tk-card, .portal-body .uc-card, .portal-body .ord-card,
.bl-card, .dm-card, .tk-card, .uc-card, .ord-card,
.page-panel, .page-kpi, .page-soft-note, .db-hero-card, .db-panel, .db-wallet, .db-actions, .db-kpis,
.portal-body .page-panel, .portal-body .page-kpi, .portal-body .db-hero-card,
.portal-body .db-panel, .portal-body .db-wallet, .portal-body .db-actions, .portal-body .db-kpis {
    background: var(--card) !important;
    border: 1px solid var(--border) !important;
    border-radius: var(--sh-radius-xl) !important;
    box-shadow: var(--sh-shadow-xs) !important;
}
.card, .adapter-card, .cfg-section { padding: 16px; }
.card:hover, .stat-card:hover, .adapter-card:hover, .cfg-section:hover,
.ord-card:hover, .dm-card:hover, .tk-card:hover, .uc-card:hover {
    border-color: var(--border) !important;
    box-shadow: var(--sh-shadow-sm) !important;
    transform: none !important;
}
.card-hdr { border-bottom-color: var(--border); }
.card-hdr h3 { font-weight: 600; color: var(--card-foreground); }
.table-card { overflow: hidden; }
.table-card .table-hd {
    background: var(--card) !important;
    border-bottom: 1px solid var(--border) !important;
}
/* Dense 版式（page-panel / page-kpi）保留分隔带，仅换色 */
.portal-body .page-panel,
.portal-body .page-panel-hd { background: transparent !important; border: 0 !important; box-shadow: none !important; }
.portal-body .page-panel-hd { border-bottom: 1px solid var(--border) !important; border-radius: 0 !important; }
.portal-body .page-kpi,
.portal-body .page-kpi:first-child {
    background: transparent !important; border: 0 !important; box-shadow: none !important; border-radius: 0 !important;
    border-left: 1px solid var(--border) !important;
}
.portal-body .page-kpi:first-child { border-left: 0 !important; }
.portal-body .page-kpi-grid { border-bottom: 1px solid var(--border) !important; }
.portal-body .page-soft-note {
    background: var(--primary-bg) !important; border: 0 !important; border-radius: 0 !important;
    border-left: 3px solid var(--primary) !important; box-shadow: none !important;
}
.portal-body .page-hd { border-bottom-color: var(--border) !important; }
.portal-body .page-hd-l p { color: var(--muted-foreground); }
.page-hd .cnt {
    background: var(--muted); color: var(--muted-foreground);
    border-radius: var(--sh-radius-md); font-weight: 600;
}
.page-hd p, .page-hd-l p { color: var(--muted-foreground); }
.page-hd h1, .page-hd h2, .page-hdr-title { color: var(--foreground); }
.divider, hr { border-color: var(--border); }
.kv-list dt { color: var(--muted-foreground); }
.kv-list dd { color: var(--foreground); }

/* ═══ 6. 按钮 ═════════════════════════════════════════════════════════ */
.btn, .portal-body .btn,
.portal-body :is(button, a, input[type="submit"], input[type="button"])[class*="btn"] {
    min-height: 36px;
    padding: 7px 14px;
    border-radius: var(--sh-radius-md) !important;
    border: 1px solid transparent;
    font-size: 13px;
    font-weight: 600;
    letter-spacing: 0;
    box-shadow: none;
    filter: none !important;
    transition: background-color .15s, border-color .15s, color .15s, box-shadow .15s !important;
}
.btn:active,
.portal-body :is(button, a, input[type="submit"], input[type="button"])[class*="btn"]:active {
    transform: translateY(1px) !important;
}
.btn:focus-visible,
.portal-body :is(button, a, input[type="submit"], input[type="button"])[class*="btn"]:focus-visible,
.portal-body :is(button, a, input[type="submit"], input[type="button"])[class*="button"]:focus-visible {
    outline: none !important;
    box-shadow: var(--sh-ring-shadow) !important;
}
/* default：品牌蓝实心 + shadow-xs */
.btn-primary, .portal-body .btn-primary {
    background: var(--primary) !important;
    border-color: var(--primary) !important;
    color: var(--primary-foreground) !important;
    box-shadow: var(--sh-shadow-xs) !important;
}
.btn-primary:hover, .portal-body .btn-primary:hover {
    background: var(--primary-d) !important;
    border-color: var(--primary-d) !important;
}
/* outline：白底描边（shadcn secondary/outline） */
.btn-secondary, .portal-body .btn-secondary {
    background: var(--card) !important;
    border-color: var(--input) !important;
    color: var(--secondary-foreground) !important;
    box-shadow: var(--sh-shadow-xs) !important;
}
.btn-secondary:hover, .portal-body .btn-secondary:hover {
    background: var(--muted) !important;
    border-color: var(--input) !important;
    color: var(--foreground) !important;
}
/* ghost */
.btn-ghost, .portal-body .btn-ghost, .btn-link {
    background: transparent !important; border-color: transparent !important;
    color: var(--muted-foreground) !important; box-shadow: none !important;
}
.btn-ghost:hover, .portal-body .btn-ghost:hover {
    background: var(--muted) !important; color: var(--foreground) !important;
}
/* 语义按钮 */
.btn-success, .portal-body .btn-success { background: #16a34a !important; border-color: #16a34a !important; color: #fff !important; box-shadow: var(--sh-shadow-xs) !important; }
.btn-success:hover, .portal-body .btn-success:hover { background: #15803d !important; border-color: #15803d !important; }
.btn-warning, .portal-body .btn-warning { background: #d97706 !important; border-color: #d97706 !important; color: #fff !important; box-shadow: var(--sh-shadow-xs) !important; }
.btn-warning:hover, .portal-body .btn-warning:hover { background: #b45309 !important; border-color: #b45309 !important; }
.btn-danger, .portal-body .btn-danger, .btn.btn-danger { background: var(--destructive) !important; border-color: var(--destructive) !important; color: var(--destructive-foreground) !important; box-shadow: var(--sh-shadow-xs) !important; }
.btn-danger:hover, .portal-body .btn-danger:hover, .btn.btn-danger:hover { background: #b91c1c !important; border-color: #b91c1c !important; }
/* 尺寸 */
.btn-sm, .portal-body .btn-sm { min-height: 32px; padding: 5px 11px; font-size: 12.5px; border-radius: var(--sh-radius-sm) !important; }
.btn-xs, .portal-body .btn-xs { min-height: 26px; padding: 3px 9px; font-size: 11.5px; border-radius: var(--sh-radius-sm) !important; }
.btn-icon, .dn-icon-btn {
    border-radius: var(--sh-radius-md) !important;
    border-color: var(--border) !important;
    background: var(--card);
    color: var(--muted-foreground);
}
.btn-icon:hover, .dn-icon-btn:hover { background: var(--muted); color: var(--foreground); }
.btn:disabled, .btn[disabled], .portal-body .btn:disabled {
    opacity: .5 !important; cursor: not-allowed;
}
.btn-primary:disabled, .portal-body .btn-primary:disabled {
    background: var(--muted) !important; border-color: transparent !important; color: var(--muted-foreground) !important;
}
.portal-body .topbar-cta, .topbar-cta, .tb-icon, .topbar-user-btn {
    border-radius: var(--sh-radius-md) !important;
    border-color: var(--border) !important;
    background: var(--card) !important;
    color: var(--text2) !important;
    box-shadow: none !important;
    transform: none !important;
}
.portal-body .topbar-cta:hover, .topbar-cta:hover, .tb-icon:hover { background: var(--muted) !important; border-color: var(--border) !important; }
.portal-body .topbar-cta-primary, .topbar-cta-primary {
    background: var(--primary) !important; border-color: var(--primary) !important; color: var(--primary-foreground) !important;
}
.portal-body .topbar-cta-primary:hover, .topbar-cta-primary:hover {
    background: var(--primary-d) !important; border-color: var(--primary-d) !important; color: var(--primary-foreground) !important;
}
.portal-body .topbar-user-btn { background: transparent !important; border-color: transparent !important; }
.portal-body .topbar-user-btn:hover { background: var(--muted) !important; border-color: transparent !important; }
.portal-body .topbar-user-btn:focus-visible { outline: none !important; box-shadow: var(--sh-ring-shadow) !important; }

/* ═══ 7. 表单控件 ═════════════════════════════════════════════════════ */
.input, .select, textarea,
.portal-body .input, .portal-body .select, .portal-body textarea {
    border: 1px solid var(--input) !important;
    border-radius: var(--sh-radius-md) !important;
    background: var(--card) !important;
    color: var(--foreground) !important;
    box-shadow: none !important;
}
.input:focus, .select:focus, textarea:focus,
.portal-body .input:focus, .portal-body .select:focus, .portal-body textarea:focus {
    outline: none !important;
    border-color: var(--ring) !important;
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--ring) 18%, transparent) !important;
}
.input::placeholder, .select::placeholder, textarea::placeholder { color: var(--muted-foreground); }
.input:disabled, .select:disabled, textarea:disabled {
    background: var(--muted) !important; color: var(--muted-foreground) !important; cursor: not-allowed;
}
.form-label, .form-group label, label { color: var(--text2); }
.form-hint { color: var(--muted-foreground); }
input[type="checkbox"], input[type="radio"] { accent-color: var(--primary); }
/* 开关 */
.dn-switch { background: var(--input); border-radius: 999px; }
.dn-switch.on { background: var(--primary); }
.dn-switch-knob { background: var(--card); box-shadow: var(--sh-shadow-xs); }

/* ═══ 8. 徽章 / 标签 / chip ════════════════════════════════════════════ */
.badge, .chip, .stag {
    display: inline-flex; align-items: center; gap: 4px;
    padding: 2px 8px;
    border-radius: var(--sh-radius-sm) !important;
    font-size: 11px; font-weight: 600; line-height: 1.45;
    white-space: nowrap; vertical-align: middle;
    background: var(--sh-neutral-bg); color: var(--sh-neutral-fg);
    border: 1px solid var(--sh-neutral-line);
}
.badge i, .stag i { font-size: 9px; }
.badge-success, .stag-green, .dn-chip-ok   { background: var(--sh-ok-bg) !important;     color: var(--sh-ok-fg) !important;     border-color: var(--sh-ok-line) !important; }
.badge-warning, .stag-yellow, .dn-chip-warn { background: var(--sh-warn-bg) !important; color: var(--sh-warn-fg) !important;   border-color: var(--sh-warn-line) !important; }
.badge-danger, .stag-red, .dn-chip-err     { background: var(--sh-danger-bg) !important; color: var(--sh-danger-fg) !important; border-color: var(--sh-danger-line) !important; }
.badge-info, .stag-blue, .dn-chip-info     { background: var(--sh-info-bg) !important;   color: var(--sh-info-fg) !important;   border-color: var(--sh-info-line) !important; }
.badge-purple, .stag-purple                 { background: var(--sh-purple-bg) !important; color: var(--sh-purple-fg) !important; border-color: var(--sh-purple-line) !important; }
.badge-orange, .stag-orange                 { background: var(--sh-orange-bg) !important; color: var(--sh-orange-fg) !important; border-color: var(--sh-orange-line) !important; }
.badge-cyan, .dn-chip-info                  { background: var(--sh-cyan-bg) !important;   color: var(--sh-cyan-fg) !important;   border-color: var(--sh-cyan-line) !important; }
.badge-mute, .stag-gray, .dn-chip-mute      { background: var(--sh-neutral-bg) !important; color: var(--sh-neutral-fg) !important; border-color: var(--sh-neutral-line) !important; }
.dn-chip { border-radius: var(--sh-radius-sm); font-weight: 600; }
.stag:not(:has(i))::before { opacity: .85; }
.sb-badge, .tb-badge, .nav-badge {
    background: var(--primary) !important; color: var(--primary-foreground) !important;
    border-color: var(--card) !important; border-radius: 999px;
    font-weight: 600;
}

/* ═══ 9. 表格 ═════════════════════════════════════════════════════════ */
table th, .dn-table th, .dm-table th, .ord-table th, .bl-table th,
.portal-body .table-wrap th, .portal-body .tk-desk th {
    background: var(--muted) !important;
    color: var(--muted-foreground) !important;
    font-size: 11px !important;
    font-weight: 600 !important;
    letter-spacing: 0 !important;
    text-transform: none !important;
    border-bottom: 1px solid var(--border) !important;
}
table td, .dn-table td, .dm-table td, .ord-table td, .bl-table td,
.portal-body .table-wrap td, .portal-body .tk-desk td {
    color: var(--foreground);
    border-bottom-color: var(--border) !important;
}
.dn-table tr:hover td, .portal-body .dm-table tbody tr:hover td,
.portal-body .ord-table tbody tr:hover td, .portal-body .tk-desk tbody tr:hover td,
.admin-body .table-compact tbody tr:hover, tbody tr:hover td {
    background: color-mix(in srgb, var(--muted) 65%, transparent) !important;
}
.table.table-sticky thead th { background: var(--muted) !important; box-shadow: 0 1px 0 var(--border) !important; }
.table-wrap::after { background: linear-gradient(to right, transparent, color-mix(in srgb, var(--foreground) 10%, transparent)); }
.table-wrap td .actions, .table-wrap td > div[style*="flex"] { row-gap: 6px; }

/* ═══ 10. 标签页 / 筛选条 ═════════════════════════════════════════════ */
.dm-tab, .ord-tab, .bl-tab, .user-tab, .admin-tab, .stab, .wi-tab, .wh-tab {
    border-radius: var(--sh-radius-md) !important;
    font-weight: 600;
}
.dm-tab.on, .ord-tab-active, .user-tab.active, .admin-tab.active, .dm-tab.active {
    background: var(--card) !important;
    border-color: transparent !important;
    color: var(--foreground) !important;
    box-shadow: var(--sh-shadow-xs) !important;
}
.dm-tab:hover, .ord-tab:hover, .user-tab:hover { background: var(--muted) !important; border-color: transparent !important; }
/* fpills：shadcn Tabs —— muted 容器 + 卡面滑块 */
.fpills, .dn-tabs, .admin-body .fpills {
    background: var(--muted) !important;
    border: 1px solid transparent !important;
    border-radius: var(--sh-radius-lg) !important;
    padding: 3px !important;
    gap: 3px !important;
}
.fpills a, .fpills button, .dn-tab, .admin-body .fpills a, .admin-body .fpills button {
    border-radius: var(--sh-radius-md) !important;
    border: 1px solid transparent !important;
    color: var(--muted-foreground);
    font-weight: 600;
}
.fpills a.active, .fpills button.active, .dn-tab.active {
    background: var(--card) !important;
    color: var(--foreground) !important;
    border-color: transparent !important;
    box-shadow: var(--sh-shadow-xs) !important;
}
.fpills a:not(.active):hover, .fpills button:not(.active):hover { color: var(--foreground) !important; background: color-mix(in srgb, var(--card) 55%, transparent) !important; }

/* ═══ 11. 分页 ════════════════════════════════════════════════════════ */
.pagination a, .pagination span {
    border-radius: var(--sh-radius-md) !important;
    border-color: var(--border) !important;
    background: var(--card);
    color: var(--muted-foreground);
    font-weight: 600;
}
.pagination a:hover { background: var(--muted); color: var(--foreground); }
.pagination span.current, .portal-body .pagination span.current {
    background: var(--primary) !important; border-color: var(--primary) !important; color: var(--primary-foreground) !important;
}

/* ═══ 12. 弹层：对话框 / 确认框 / 下拉 / 命令面板 ══════════════════════ */
.modal, .uicf-mask { background: rgb(0 0 0 / .5) !important; -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px); }
.modal-box, .uicf-box, .cm-box, .user-drop, .notif-drop {
    background: var(--popover) !important;
    color: var(--popover-foreground);
    border: 1px solid var(--border) !important;
    border-radius: var(--sh-radius-xl) !important;
    box-shadow: var(--sh-shadow-lg) !important;
}
.modal-title { color: var(--foreground); font-weight: 600; }
.uicf-text { color: var(--foreground); }
.uicf-btn {
    border-radius: var(--sh-radius-md) !important;
    border-color: var(--input) !important;
    background: var(--card) !important;
    color: var(--secondary-foreground) !important;
    font-weight: 600;
    box-shadow: var(--sh-shadow-xs);
}
.uicf-btn:hover { background: var(--muted) !important; }
.uicf-btn:focus-visible { outline: none; box-shadow: var(--sh-ring-shadow); }
.uicf-ok { background: var(--primary) !important; border-color: var(--primary) !important; color: var(--primary-foreground) !important; }
.uicf-ok:hover { background: var(--primary-d) !important; }
.uicf-ok.uicf-danger { background: var(--destructive) !important; border-color: var(--destructive) !important; }
.uicf-ok.uicf-danger:hover { background: #b91c1c !important; }
.portal-body .user-drop { border-color: var(--border) !important; }
.portal-body .user-drop a:hover { background: var(--muted) !important; color: var(--foreground) !important; }
.portal-body .user-drop .drop-divider { background: var(--border) !important; }

/* ═══ 13. 提示条 / Toast / 骨架屏 / 空状态 ════════════════════════════ */
.alert-warning, .alert-info, .alert-success, .alert-error {
    border-radius: var(--sh-radius-lg) !important;
    box-shadow: none !important;
}
.alert-warning { background: var(--sh-warn-bg) !important;   border: 1px solid var(--sh-warn-line) !important;   border-left: 3px solid #f59e0b !important; color: var(--sh-warn-fg) !important; }
.alert-info    { background: var(--sh-info-bg) !important;   border: 1px solid var(--sh-info-line) !important;   border-left: 3px solid var(--primary) !important; color: var(--sh-info-fg) !important; }
.alert-success { background: var(--sh-ok-bg) !important;     border: 1px solid var(--sh-ok-line) !important;     border-left: 3px solid #16a34a !important; color: var(--sh-ok-fg) !important; }
.alert-error   { background: var(--sh-danger-bg) !important; border: 1px solid var(--sh-danger-line) !important; border-left: 3px solid var(--destructive) !important; color: var(--sh-danger-fg) !important; }
.dn-info-banner {
    background: var(--sh-info-bg) !important; border: 1px solid var(--sh-info-line) !important;
    border-radius: var(--sh-radius-lg) !important; color: var(--sh-info-fg) !important;
}
.dn-info-banner .dn-banner-close { color: var(--sh-info-fg) !important; }
.ts-toast {
    background: var(--popover) !important; color: var(--popover-foreground) !important;
    border: 1px solid var(--border) !important; border-radius: var(--sh-radius-lg) !important;
    box-shadow: var(--sh-shadow-lg) !important;
}
.ts-toast-success { border-color: var(--sh-ok-line) !important; }
.ts-toast-error { border-color: var(--sh-danger-line) !important; }
.sk { background: linear-gradient(90deg, var(--muted) 0%, var(--secondary) 50%, var(--muted) 100%) !important; background-size: 200% 100% !important; }
.empty-state > i:first-child, .empty-block > i:first-child { background: var(--muted); border-color: var(--border); color: var(--muted-foreground); }
.empty-state .es-icon { background: var(--primary-bg); border-color: color-mix(in srgb, var(--primary) 20%, transparent); }
.empty-state h4, .empty-block .empty-title { color: var(--foreground); font-weight: 600; }
.empty-state p, .empty-state .es-tip, .empty-block .empty-desc { color: var(--muted-foreground); }
.dn-loading-pill { background: var(--muted); border-color: var(--border); border-radius: var(--sh-radius-lg); color: var(--text2); }

/* ═══ 14. 侧边栏 / 顶栏 ═══════════════════════════════════════════════ */
.sidebar, .portal-body .sidebar, .sb-logo, .portal-body .sb-logo, .sb-user, .portal-body .sb-user {
    background: var(--card) !important;
    border-color: var(--border) !important;
}
.sidebar { border-right: 1px solid var(--border) !important; box-shadow: none !important; }
.sb-logo { border-bottom: 1px solid var(--border) !important; }
.portal-body .sb-logo-textmark, .sb-logo-textmark, .portal-body .topbar-title { color: var(--foreground) !important; }
.sb-logo-mark, .portal-body .sb-logo-mark { background: var(--primary) !important; border-radius: var(--sh-radius-md); box-shadow: none !important; }
.sb-group-label, .portal-body .sb-group-label { color: var(--muted-foreground) !important; font-weight: 600; }
.sb-link, .portal-body .sb-link, .sb-link i, .portal-body .sb-link i { color: var(--text3); }
.sb-link {
    position: relative;
    border-radius: var(--sh-radius-md) !important;
    font-weight: 600;
    transform: none !important;
    box-shadow: none !important;
}
.sb-link:hover, .portal-body .sb-link:hover {
    background: var(--muted) !important; color: var(--foreground) !important;
    border-color: transparent !important; box-shadow: none !important; transform: none !important;
}
.sb-link:hover i, .portal-body .sb-link:hover i { color: var(--text3) !important; }
.sb-link.active, .portal-body .sb-link.active {
    background: var(--muted) !important;
    color: var(--foreground) !important;
    border-color: transparent !important;
    box-shadow: none !important;
    font-weight: 600 !important;
}
.sb-link.active i, .portal-body .sb-link.active i { color: var(--primary) !important; }
.sb-link.active::before { display: block !important; }
.sb-link.active::before {
    content: ''; position: absolute; left: 0; top: 50%; transform: translateY(-50%);
    width: 3px; height: 18px; border-radius: 0 3px 3px 0; background: var(--primary);
}
.portal-body .sb-link { position: relative; }
.sb-user-inner, .portal-body .sb-user-inner, .portal-body .sb-user-inner:hover {
    background: transparent !important; border-color: transparent !important; box-shadow: none !important;
    border-radius: var(--sh-radius-md) !important;
}
.portal-body .sb-user-inner:hover { background: var(--muted) !important; }
.main-wrap, .portal-body .main-wrap { background: var(--background) !important; }
.topbar, .portal-body .topbar {
    background: color-mix(in srgb, var(--card) 88%, transparent) !important;
    border-bottom: 1px solid var(--border) !important;
    box-shadow: none !important;
}
.portal-body .topbar-title-eyebrow, .topbar-title-eyebrow, .portal-body .topbar-subtitle { color: var(--muted-foreground); }
.mobile-tabbar, .mob-tabbar { background: var(--card) !important; border-color: var(--border) !important; }
.announce {
    background: var(--sh-info-bg) !important; border: 1px solid var(--sh-info-line) !important;
    border-radius: var(--sh-radius-lg) !important; color: var(--sh-info-fg) !important; box-shadow: none !important;
}

/* ═══ 15. 公共站壳层 ══════════════════════════════════════════════════ */
.pub-nav, .auth-nav {
    background: color-mix(in srgb, var(--card) 92%, transparent) !important;
    border-bottom: 1px solid var(--border) !important;
    -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px);
}
.nav-logo { color: var(--foreground) !important; }
.nav-link {
    border-radius: var(--sh-radius-md) !important;
    color: var(--text2) !important;
    font-weight: 600;
}
.nav-link:hover, .nav-item:hover > .nav-link, .nav-link.active {
    background: var(--muted) !important;
    color: var(--foreground) !important;
    box-shadow: none !important;
}
.nav-actions > .nav-btn-login { background: transparent !important; color: var(--text2) !important; }
.nav-actions > .nav-btn-login:hover { background: var(--muted) !important; color: var(--foreground) !important; }
.nav-actions > .nav-btn-reg, .nav-btn-console,
.pub-nav .nav-actions > .nav-btn-reg, .pub-nav .nav-btn-console {
    background: var(--primary) !important;
    border-color: var(--primary) !important;
    color: var(--primary-foreground) !important;
    border-radius: var(--sh-radius-md) !important;
    box-shadow: var(--sh-shadow-xs) !important;
}
.nav-actions > .nav-btn-reg:hover, .nav-btn-console:hover,
.pub-nav .nav-actions > .nav-btn-reg:hover, .pub-nav .nav-btn-console:hover {
    background: var(--primary-d) !important; border-color: var(--primary-d) !important; color: var(--primary-foreground) !important;
}
.nav-icon-btn, .nav-user-link, .nav-hamburger { border-radius: var(--sh-radius-md) !important; }
.nav-icon-btn:hover, .nav-hamburger:hover { background: var(--muted) !important; color: var(--foreground) !important; }
.nav-dropdown, .drawer {
    background: var(--popover) !important; border: 1px solid var(--border) !important;
    border-radius: var(--sh-radius-xl) !important; box-shadow: var(--sh-shadow-lg) !important;
}
.nav-dropdown a:hover, .drawer-link:hover { background: var(--muted) !important; color: var(--foreground) !important; }
.public-maintenance-notice {
    background: var(--sh-warn-bg) !important; border-bottom: 1px solid var(--sh-warn-line) !important; color: var(--sh-warn-fg) !important;
}
.public-maintenance-notice .maintenance-state, .public-maintenance-notice .maintenance-copy { color: var(--sh-warn-fg) !important; }
.site-footer, .pub-footer { border-top-color: var(--border) !important; background: var(--card); }
.portal-body .user-drop a:hover, .portal-body .user-drop .drop-link:hover { background: var(--muted) !important; }

/* ═══ 16. shadcn 原语（.ui-*）— 新代码请直接使用这一层 ═══════════════
   与 shadcn/ui 组件 API 对应：Button / Card / Badge / Alert / Input /
   Label / Separator / Skeleton / Table / Dialog / Tabs
   ═════════════════════════════════════════════════════════════════════ */

/* Button：变体 default|secondary|outline|ghost|destructive|link，尺寸 sm|default|lg|icon */
.ui-btn {
    display: inline-flex; align-items: center; justify-content: center; gap: 6px;
    height: 36px; padding: 0 16px;
    border: 1px solid transparent; border-radius: var(--sh-radius-md);
    font-family: inherit; font-size: 13px; font-weight: 600; line-height: 1;
    white-space: nowrap; cursor: pointer; text-decoration: none;
    background: var(--primary); color: var(--primary-foreground);
    box-shadow: var(--sh-shadow-xs);
    transition: background-color .15s, border-color .15s, color .15s, box-shadow .15s;
}
.ui-btn:hover { background: var(--primary-d); }
.ui-btn:focus-visible { outline: none; box-shadow: var(--sh-ring-shadow); }
.ui-btn[disabled], .ui-btn[aria-disabled="true"] { opacity: .5; pointer-events: none; }
.ui-btn--secondary { background: var(--secondary); color: var(--secondary-foreground); border-color: transparent; box-shadow: none; }
.ui-btn--secondary:hover { background: color-mix(in srgb, var(--secondary) 78%, var(--foreground)); }
.ui-btn--outline { background: var(--card); color: var(--foreground); border-color: var(--input); box-shadow: var(--sh-shadow-xs); }
.ui-btn--outline:hover { background: var(--muted); }
.ui-btn--ghost { background: transparent; color: var(--foreground); box-shadow: none; }
.ui-btn--ghost:hover { background: var(--muted); }
.ui-btn--destructive { background: var(--destructive); color: var(--destructive-foreground); }
.ui-btn--destructive:hover { background: #b91c1c; }
.ui-btn--link { background: transparent; color: var(--primary); box-shadow: none; height: auto; padding: 0; }
.ui-btn--link:hover { text-decoration: underline; background: transparent; }
.ui-btn--sm { height: 32px; padding: 0 12px; font-size: 12.5px; border-radius: var(--sh-radius-sm); }
.ui-btn--lg { height: 40px; padding: 0 20px; font-size: 14px; }
.ui-btn--icon { width: 36px; padding: 0; }
.ui-btn--sm.ui-btn--icon { width: 32px; }

/* Card */
.ui-card { background: var(--card); color: var(--card-foreground); border: 1px solid var(--border); border-radius: var(--sh-radius-xl); box-shadow: var(--sh-shadow-xs); }
.ui-card__header { padding: 18px 20px 0; display: flex; flex-direction: column; gap: 5px; }
.ui-card__title { font-size: 15px; font-weight: 600; letter-spacing: -.01em; display: flex; align-items: center; gap: 8px; }
.ui-card__desc { font-size: 12.5px; color: var(--muted-foreground); line-height: 1.6; }
.ui-card__action { margin-left: auto; }
.ui-card__body { padding: 18px 20px; }
.ui-card__footer { padding: 0 20px 18px; display: flex; align-items: center; gap: 8px; }
.ui-card__header + .ui-card__body { padding-top: 14px; }
@media (max-width: 640px) { .ui-card__header { padding: 14px 14px 0; } .ui-card__body { padding: 14px; } .ui-card__footer { padding: 0 14px 14px; } }

/* Badge */
.ui-badge {
    display: inline-flex; align-items: center; gap: 4px;
    padding: 2px 8px; border-radius: var(--sh-radius-sm);
    font-size: 11px; font-weight: 600; line-height: 1.45; white-space: nowrap;
    background: var(--sh-neutral-bg); color: var(--sh-neutral-fg); border: 1px solid var(--sh-neutral-line);
}
.ui-badge--ok     { background: var(--sh-ok-bg);     color: var(--sh-ok-fg);     border-color: var(--sh-ok-line); }
.ui-badge--warn   { background: var(--sh-warn-bg);   color: var(--sh-warn-fg);   border-color: var(--sh-warn-line); }
.ui-badge--danger { background: var(--sh-danger-bg); color: var(--sh-danger-fg); border-color: var(--sh-danger-line); }
.ui-badge--info   { background: var(--sh-info-bg);   color: var(--sh-info-fg);   border-color: var(--sh-info-line); }
.ui-badge--purple { background: var(--sh-purple-bg); color: var(--sh-purple-fg); border-color: var(--sh-purple-line); }
.ui-badge--orange { background: var(--sh-orange-bg); color: var(--sh-orange-fg); border-color: var(--sh-orange-line); }
.ui-badge--cyan   { background: var(--sh-cyan-bg);   color: var(--sh-cyan-fg);   border-color: var(--sh-cyan-line); }
.ui-badge--solid  { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); }

/* Alert */
.ui-alert { display: flex; align-items: flex-start; gap: 10px; padding: 13px 15px; border: 1px solid var(--border); border-left-width: 3px; border-radius: var(--sh-radius-lg); font-size: 13px; line-height: 1.65; background: var(--card); color: var(--foreground); }
.ui-alert__icon { flex: 0 0 auto; margin-top: 2px; }
.ui-alert__title { font-weight: 600; margin-bottom: 2px; }
.ui-alert--info    { background: var(--sh-info-bg);   border-color: var(--sh-info-line);   border-left-color: var(--primary); color: var(--sh-info-fg); }
.ui-alert--ok      { background: var(--sh-ok-bg);     border-color: var(--sh-ok-line);     border-left-color: #16a34a; color: var(--sh-ok-fg); }
.ui-alert--warn    { background: var(--sh-warn-bg);   border-color: var(--sh-warn-line);   border-left-color: #f59e0b; color: var(--sh-warn-fg); }
.ui-alert--danger  { background: var(--sh-danger-bg); border-color: var(--sh-danger-line); border-left-color: var(--destructive); color: var(--sh-danger-fg); }

/* Input / Label / Hint */
.ui-input, .ui-select, .ui-textarea {
    width: 100%; height: 36px; padding: 0 12px;
    border: 1px solid var(--input); border-radius: var(--sh-radius-md);
    background: var(--card); color: var(--foreground);
    font-family: inherit; font-size: 13px; outline: none;
    transition: border-color .15s, box-shadow .15s;
}
.ui-textarea { height: auto; min-height: 84px; padding: 9px 12px; line-height: 1.6; resize: vertical; }
.ui-input:focus, .ui-select:focus, .ui-textarea:focus {
    border-color: var(--ring); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ring) 18%, transparent);
}
.ui-input::placeholder, .ui-textarea::placeholder { color: var(--muted-foreground); }
.ui-label { display: block; font-size: 13px; font-weight: 600; color: var(--text2); margin-bottom: 6px; }
.ui-hint  { font-size: 11.5px; color: var(--muted-foreground); margin-top: 5px; line-height: 1.5; }
.ui-field { margin-bottom: 16px; }

/* Separator / Skeleton */
.ui-separator { height: 1px; width: 100%; background: var(--border); border: 0; margin: 16px 0; }
.ui-separator--v { width: 1px; height: auto; align-self: stretch; margin: 0 12px; }
.ui-skeleton { background: var(--muted); border-radius: var(--sh-radius-md); animation: uiPulse 1.6s cubic-bezier(.4,0,.6,1) infinite; }
@keyframes uiPulse { 0%, 100% { opacity: 1; } 50% { opacity: .5; } }

/* Table */
.ui-table-wrap { width: 100%; overflow-x: auto; border: 1px solid var(--border); border-radius: var(--sh-radius-xl); background: var(--card); box-shadow: var(--sh-shadow-xs); }
.ui-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.ui-table th { padding: 10px 14px; text-align: left; font-size: 11px; font-weight: 600; color: var(--muted-foreground); background: var(--muted); border-bottom: 1px solid var(--border); white-space: nowrap; }
.ui-table td { padding: 13px 14px; border-bottom: 1px solid var(--border); vertical-align: middle; }
.ui-table tr:last-child td { border-bottom: 0; }
.ui-table tbody tr:hover td { background: color-mix(in srgb, var(--muted) 65%, transparent); }

/* Dialog */
.ui-dialog-mask { position: fixed; inset: 0; z-index: 900; display: flex; align-items: center; justify-content: center; padding: 20px; background: rgb(0 0 0 / .5); }
.ui-dialog { width: 100%; max-width: 480px; max-height: 90vh; overflow-y: auto; padding: 22px; background: var(--popover); color: var(--popover-foreground); border: 1px solid var(--border); border-radius: var(--sh-radius-xl); box-shadow: var(--sh-shadow-lg); }
.ui-dialog__title { font-size: 16px; font-weight: 600; margin-bottom: 6px; }
.ui-dialog__desc { font-size: 13px; color: var(--muted-foreground); line-height: 1.65; margin-bottom: 18px; }
.ui-dialog__footer { display: flex; justify-content: flex-end; gap: 8px; }

/* Tabs */
.ui-tabs { display: inline-flex; padding: 3px; gap: 3px; background: var(--muted); border-radius: var(--sh-radius-lg); }
.ui-tab { display: inline-flex; align-items: center; gap: 6px; height: 30px; padding: 0 12px; border: 1px solid transparent; border-radius: var(--sh-radius-md); background: transparent; color: var(--muted-foreground); font: inherit; font-size: 12.5px; font-weight: 600; cursor: pointer; text-decoration: none; white-space: nowrap; transition: background-color .15s, color .15s, box-shadow .15s; }
.ui-tab:hover { color: var(--foreground); }
.ui-tab[aria-selected="true"], .ui-tab.is-active { background: var(--card); color: var(--foreground); box-shadow: var(--sh-shadow-xs); }
.ui-tab:focus-visible { outline: none; box-shadow: var(--sh-ring-shadow); }

/* Support / 补充原语细节 */
.ui-card__icon { color: var(--primary); font-size: 14px; }
.ui-empty { color: var(--muted-foreground); }
.modal-body { color: var(--foreground); font-size: 13.5px; line-height: 1.7; }
.modal-footer { margin-top: 18px; display: flex; gap: 8px; justify-content: flex-end; }
.modal-box--sm { max-width: 400px; }
.modal-box--lg { max-width: 760px; }
.ui-stat { display: flex; align-items: center; gap: 12px; padding: 14px 16px; }
.ui-stat__icon { width: 40px; height: 40px; flex-shrink: 0; display: flex; align-items: center; justify-content: center; border-radius: var(--sh-radius-lg); background: var(--muted); color: var(--muted-foreground); font-size: 16px; }
.ui-stat__icon--primary { background: var(--primary-bg); color: var(--primary); }
.ui-stat__icon--ok      { background: var(--sh-ok-bg);     color: var(--sh-ok-fg); }
.ui-stat__icon--warn    { background: var(--sh-warn-bg);   color: var(--sh-warn-fg); }
.ui-stat__icon--danger  { background: var(--sh-danger-bg); color: var(--sh-danger-fg); }
.ui-stat__body { min-width: 0; }
.ui-stat__value { font-size: 20px; font-weight: 800; letter-spacing: -.02em; color: var(--foreground); font-variant-numeric: tabular-nums; }
.ui-stat__label { font-size: 11.5px; color: var(--muted-foreground); }
.ui-stat__sub { font-size: 10.5px; color: var(--muted-foreground); margin-top: 1px; }

/* ═══ 17. 后台 console 对齐 ════════════════════════════════════════════
   admin-redesign.css 本身就是 shadcn 血统（hsl(240 5.9% 10%) 近黑主色、
   hsl(240 10% 3.9%) zinc 中性色、--sh-sm 阴影），这里只做两件事：
     ① 把 --ar-* / --as-* 并入语义令牌，让后台与前台的令牌同源；
     ② 主色从「近黑」改为品牌蓝，使后台 / 用户工作台 / 公共站视觉一致。
   后台的布局契约（侧栏宽度、断点、表格密度）原样保留。
   ═════════════════════════════════════════════════════════════════════ */
.admin-body {
    --ar-ink: var(--foreground);
    --ar-muted: var(--muted-foreground);
    --ar-line: var(--border);
    --ar-bg: var(--background);
    --ar-panel: var(--card);
    --ar-blue: var(--primary);
    --ar-blue-dark: var(--primary-d);
    --as-bg: var(--background);   --as-line: var(--border);
    --as-ink: var(--foreground);  --as-muted: var(--muted-foreground);
    --as-accent: var(--primary);
    --sh-sm: var(--sh-shadow-xs);
    background: var(--background) !important;
    color: var(--foreground) !important;
}
.admin-body :is(.card, .adapter-card, .cfg-section, .table-card, .stat-card, .dash-stat, .toolbar) {
    background: var(--card) !important;
    border: 1px solid var(--border) !important;
    border-radius: var(--sh-radius-xl) !important;
    box-shadow: var(--sh-shadow-xs) !important;
}
.admin-body .table-card .table-hd {
    background: var(--card) !important;
    border-bottom: 1px solid var(--border) !important;
}
.admin-body .toolbar { border-radius: var(--sh-radius-xl) !important; }
.admin-body .btn { border-radius: var(--sh-radius-md) !important; font-weight: 600 !important; box-shadow: none !important; }
.admin-body :is(.btn, .act-btn, .btn-icon, .pager a) {
    min-height: 36px !important; border-radius: var(--sh-radius-md) !important;
    font-size: 13px !important; font-weight: 600 !important; box-shadow: none !important;
}
.admin-body .btn:not(.btn-secondary):not(.btn-danger):not(.btn-ghost):not(.btn-sm.btn-danger) {
    background: var(--primary) !important; border-color: var(--primary) !important; color: var(--primary-foreground) !important;
}
.admin-body .btn:not(.btn-secondary):not(.btn-danger):not(.btn-ghost):not(.btn-sm.btn-danger):hover {
    background: var(--primary-d) !important; border-color: var(--primary-d) !important;
}
.admin-body .btn-secondary { background: var(--card) !important; color: var(--foreground) !important; border-color: var(--input) !important; }
.admin-body .btn-secondary:hover { background: var(--muted) !important; }
.admin-body .btn-danger { background: var(--destructive) !important; border-color: var(--destructive) !important; }
.admin-body .btn-danger:hover { background: #b91c1c !important; border-color: #b91c1c !important; }
.admin-body .btn-success { background: #16a34a !important; border-color: #16a34a !important; }
.admin-body .btn-ghost { background: transparent !important; border-color: transparent !important; color: var(--muted-foreground) !important; }
.admin-body .btn:focus-visible,
.admin-body :is(.act-btn, .btn-icon, .pager a):focus-visible { outline: none !important; box-shadow: var(--sh-ring-shadow) !important; }
.admin-body :is(.input, .select, input:not([type=checkbox]):not([type=radio]), select, textarea) {
    min-height: 36px;
    border: 1px solid var(--input) !important;
    border-radius: var(--sh-radius-md) !important;
    background: var(--card) !important;
    color: var(--foreground) !important;
    box-shadow: none !important;
}
.admin-body :is(.input, .select, input:not([type=checkbox]):not([type=radio]), select, textarea):focus {
    border-color: var(--ring) !important;
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--ring) 18%, transparent) !important;
}
.admin-body table th {
    height: 40px !important; padding: 10px 13px !important;
    background: var(--muted) !important; color: var(--muted-foreground) !important;
    border-bottom: 1px solid var(--border) !important;
}
.admin-body table td { color: var(--foreground) !important; border-bottom-color: var(--border) !important; }
.admin-body table tbody tr:hover td { background: color-mix(in srgb, var(--muted) 65%, transparent) !important; }
.admin-body [class*="badge"] { border-radius: var(--sh-radius-sm) !important; font-weight: 600 !important; }
.admin-body .fpills {
    background: var(--muted) !important;
    border: 1px solid transparent !important;
    border-radius: var(--sh-radius-lg) !important;
}
.admin-body :is(.fpills a, .fpills button, .admin-tab) { border-radius: var(--sh-radius-md) !important; }
.admin-body :is(.fpills a.active, .fpills button.active, .admin-tab.active) {
    background: var(--card) !important; color: var(--foreground) !important;
    border-color: transparent !important; box-shadow: var(--sh-shadow-xs) !important;
}
.admin-body .sidebar { background: var(--card) !important; border-right: 1px solid var(--border) !important; box-shadow: none !important; }
.admin-body .sb-logo { background: var(--card) !important; border-bottom-color: var(--border) !important; }
.admin-body .sb-logo-textmark { color: var(--foreground) !important; }
.admin-body .sb-logo-mark { background: var(--primary) !important; border-radius: var(--sh-radius-md) !important; }
.admin-body .sb-group-label { color: var(--muted-foreground) !important; }
.admin-body .sb-link { border-radius: var(--sh-radius-md) !important; color: var(--text3) !important; font-weight: 600 !important; }
.admin-body .sb-link i { color: var(--text4) !important; }
.admin-body .sb-link:hover { background: var(--muted) !important; color: var(--foreground) !important; }
.admin-body .sb-link:hover i { color: var(--text3) !important; }
.admin-body .sb-link.active {
    background: var(--muted) !important; color: var(--foreground) !important;
    box-shadow: inset 3px 0 0 var(--primary) !important;
}
.admin-body .sb-link.active i { color: var(--primary) !important; }
.admin-body .sb-badge { background: var(--primary) !important; color: var(--primary-foreground) !important; }
.admin-body .topbar { border-bottom: 1px solid var(--border) !important; }
.admin-body .page-hd { border-bottom-color: var(--border) !important; }
.admin-body .page-hd .cnt { background: var(--muted) !important; color: var(--muted-foreground) !important; }
.admin-body .admin-modal-panel, .admin-body .dm-modal-box, .admin-body .md-box {
    background: var(--popover) !important; border: 1px solid var(--border) !important;
    border-radius: var(--sh-radius-xl) !important; box-shadow: var(--sh-shadow-lg) !important;
}

/* ═══ 18. 组件收敛与交互统一 ════════════════════════════════════════════
   本节是最后一层收敛：不改 HTML，只用语义令牌把历史组件的描边、背景、圆角与
   交互状态收拢到 shadcn 视觉契约。

   ⚠ 权威加载顺序（决定谁覆盖谁）：
     form-controls → pub → public-shell → shadcn → $pageHeadExtra → 页面内联 <style>
   即下列位置在 shadcn.css 之后，本节规则对它们无效，必须直改源文件：
     · assets/search.css   搜索页筛选面板（由 pages/search.php 的 $pageHeadExtra 注入）
     · assets/auth.css     登录/注册/找回/验证（同上）
     · assets/whois.css    WHOIS 页（同上）
     · 各页 echo 出来的内联 <style>（如 pages/home.php、pages/prices.php）
   判据：要改的类若定义在上述文件中，改 shadcn.css 无效。                    */

/* ── 18.1 键盘焦点可见性 ──
   此前全站只有部分输入框有 focus 态，链接与按钮完全没有，键盘导航时无法定位。 */
a:focus-visible,
button:focus-visible,
[role="button"]:focus-visible,
summary:focus-visible,
[tabindex]:focus-visible {
    outline: 2px solid var(--ring);
    outline-offset: 2px;
}
select:focus-visible, textarea:focus-visible { outline-color: var(--ring); }

/* ── 18.2 搜索页筛选面板与筛选控件 ──
   见 assets/search.css 末尾同名段落。search.css 在本文件之后加载，
   规则写在这里会被它覆盖（已实测：.tld-act 仍是 28px/3px/#c8d0dc）。 */

/* ── 18.3 选中文字统一品牌色 ── */
::selection { background: var(--primary-bg); color: var(--primary-d); }
