/* ============================================================================
 *  DK10 — Glass & Depth 设计层
 *  ---------------------------------------------------------------------------
 *  只做覆盖，不改任何原文件。删除 <link> 即可完全回滚。
 *  顺序：Token → 字体 → 立体 → 毛玻璃 → 动效 → 对比度 → 滚动条
 * ==========================================================================*/

/* ══════════════════════ 1. 设计 Token ══════════════════════ */
:root {
  /* ── 字体族 ── */
  --font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI",
               "Helvetica Neue", "PingFang SC", "Hiragino Sans GB",
               "Microsoft YaHei", sans-serif;
  --font-mono: "SF Mono", ui-monospace, "JetBrains Mono", Menlo,
               Consolas, "Liberation Mono", monospace;

  /* ── 字号阶梯（8 档，替代原来的 20 种）── */
  --fs-2xs: 10.5px;   /* 徽标 / 大写小标签 */
  --fs-xs:  11.5px;   /* 表头 / 辅助说明 */
  --fs-sm:  12.5px;   /* 表格内容 / 表单小字 */
  --fs-md:  13.5px;   /* 正文基准 */
  --fs-lg:  15px;     /* 小标题 */
  --fs-xl:  18px;     /* 区块标题 */
  --fs-2xl: 24px;     /* 页面标题 */
  --fs-3xl: 30px;     /* Hero 标题 */

  /* ── 字重 ── */
  --fw-reg: 400;
  --fw-med: 500;
  --fw-semi: 600;
  --fw-bold: 700;
  --fw-heavy: 800;

  /* ── 行高 ── */
  --lh-tight: 1.22;
  --lh-snug: 1.4;
  --lh-normal: 1.6;

  /* ── 字距 ── */
  --ls-tight: -0.011em;
  --ls-normal: 0;
  --ls-wide: 0.015em;
  --ls-caps: 0.075em;

  /* ── 圆角 ── */
  --r-xs: 6px;
  --r-sm: 8px;
  --r-md: 10px;
  --r-lg: 14px;
  --r-xl: 18px;
  --r-2xl: 24px;
  --r-full: 999px;

  /* ── 立体层级（6 级）── */
  --e0: none;
  --e1: 0 1px 2px rgba(26, 34, 44, .04), 0 1px 1px rgba(26, 34, 44, .03);
  --e2: 0 2px 5px rgba(26, 34, 44, .05), 0 1px 2px rgba(26, 34, 44, .04);
  --e3: 0 5px 14px rgba(26, 34, 44, .07), 0 2px 5px rgba(26, 34, 44, .04);
  --e4: 0 12px 32px rgba(26, 34, 44, .09), 0 4px 12px rgba(26, 34, 44, .05);
  --e5: 0 26px 60px rgba(26, 34, 44, .13), 0 8px 20px rgba(26, 34, 44, .06);

  /* ── 内阴影：立体高光 ── */
  --hi:      inset 0 1px 0 rgba(255, 255, 255, .92);
  --hi-soft: inset 0 1px 0 rgba(255, 255, 255, .60);
  --lo:      inset 0 -1px 0 rgba(26, 34, 44, .035);

  /* ── 毛玻璃 ── */
  --glass-1: rgba(255, 255, 255, .62);
  --glass-2: rgba(255, 255, 255, .78);
  --glass-3: rgba(255, 255, 255, .90);
  --glass-line: rgba(255, 255, 255, .75);
  --blur-sm: blur(10px) saturate(160%);
  --blur-md: blur(18px) saturate(175%);
  --blur-lg: blur(28px) saturate(185%);

  /* ── 动效 ── */
  --ease-out: cubic-bezier(.22, .61, .36, 1);
  --ease-spring: cubic-bezier(.34, 1.46, .64, 1);
  --ease-in-out: cubic-bezier(.4, 0, .2, 1);
  --dur-1: 130ms;
  --dur-2: 210ms;
  --dur-3: 320ms;

  /* ── 对比度修正：原 #6b7480 在 #f3f5f8 上仅 4.3:1 ── */
  --ink3: #5c6673;          /* 5.2:1 ✅ */
  --ink4: #7d8794;          /* 仅装饰用，不承载信息 */
  --line: #e6e9ee;
  --line2: #f4f6f9;
}

/* ══════════════════════ 2. 字体规范化 ══════════════════════ */
html,
body {
  font-family: var(--font-sans);
  font-size: var(--fs-md);
  line-height: var(--lh-normal);
  letter-spacing: var(--ls-tight);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  font-variant-numeric: tabular-nums;
}

/* 等宽：数字/ID/地址 统一 */
.mono,
code,
pre,
.ant-typography code {
  font-family: var(--font-mono) !important;
  font-variant-ligatures: none;
  letter-spacing: 0;
}

/* —— 标题阶梯：出页面标题、区块标题、卡片标题三个明确层级 —— */
.page-hero .dash-title,
.dash-hero h1,
.stage-hero__copy h1 {
  font-size: var(--fs-2xl);
  font-weight: var(--fw-heavy);
  line-height: var(--lh-tight);
  letter-spacing: -0.022em;
  color: var(--ink);
}

.page-hero .dash-sub,
.dash-hero p {
  font-size: var(--fs-sm);
  color: var(--ink3);
  line-height: var(--lh-snug);
}

.kicker,
.dash-kicker,
.im__kicker,
.stage-hero__copy .kicker {
  font-size: var(--fs-2xs);
  font-weight: var(--fw-bold);
  letter-spacing: var(--ls-caps);
  text-transform: uppercase;
  color: var(--coral-strong);
}

.panel__title,
.im__title,
.pro-table__title,
.board-title,
.section-title {
  font-size: var(--fs-lg);
  font-weight: var(--fw-semi);
  letter-spacing: -0.01em;
  line-height: var(--lh-tight);
  color: var(--ink);
}

.panel__hint,
.panel__title small {
  font-size: var(--fs-xs);
  font-weight: var(--fw-reg);
  color: var(--ink3);
}

/* 表格 */
.ant-table { font-size: var(--fs-sm); }
.ant-table-thead > tr > th {
  font-size: var(--fs-2xs);
  font-weight: var(--fw-semi);
  letter-spacing: var(--ls-caps);
  text-transform: uppercase;
  color: var(--ink3) !important;
}
.ant-table-tbody > tr > td { font-size: var(--fs-sm); line-height: 1.45; }

/* 表单 */
.ant-input,
.ant-select,
.ant-btn,
textarea.ant-input { font-size: var(--fs-sm); }

/* 徽标 / 说明 */
.chip,
.record-count,
.ant-pagination-total-text {
  font-size: var(--fs-xs);
  font-weight: var(--fw-med);
  color: var(--ink3);
}

/* ══════════════════════ 3. 背景：消除混色 ══════════════════════ */
/* 全局底色用极浅暖灰，与所有卡片/面板形成清晰层差 */
body {
  background:
    radial-gradient(1200px 600px at 88% -8%, rgba(255, 90, 31, .045), transparent 62%),
    radial-gradient(1000px 520px at 4% 102%, rgba(14, 156, 156, .04), transparent 60%),
    #f6f7f9;
  background-attachment: fixed;
  color: var(--ink);
}

.ant-layout,
.content,
.page-container {
  background: transparent !important;
}

/* ══════════════════════ 4. 立体卡片 ══════════════════════ */
.panel,
.dev-card,
.kpi,
.chain-card,
.coin-tile,
.summary-item,
.wallet-card,
.cred-card,
.contact-card,
.visit-summary__card,
.sticky-note,
.gallery-card,
.app-tile,
.pie-wrap,
.area-wrap,
.pro-table {
  position: relative;
  background: linear-gradient(180deg, #ffffff 0%, #fcfdfe 100%);
  border: 1px solid rgba(26, 34, 44, .075);
  border-radius: var(--r-lg);
  box-shadow: var(--e2), var(--hi);
  transition:
    transform var(--dur-2) var(--ease-out),
    box-shadow var(--dur-2) var(--ease-out),
    border-color var(--dur-2) var(--ease-out);
}

/* 顶部 1px 高光线（增强"抬起"感） */
.panel::before,
.pro-table::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 1px;
  border-radius: var(--r-lg) var(--r-lg) 0 0;
  background: linear-gradient(90deg,
    transparent, rgba(255, 255, 255, .95) 18%, rgba(255, 255, 255, .95) 82%, transparent);
  pointer-events: none;
}

.panel:hover,
.pro-table:hover,
.chain-card:hover,
.coin-tile:hover,
.wallet-card:hover,
.gallery-card:hover,
.app-tile:hover {
  transform: translateY(-2px);
  box-shadow: var(--e4), var(--hi);
  border-color: rgba(255, 90, 31, .17);
}

/* 设备卡片：更强的层感 + 在线态发光 */
.dev-card {
  border-radius: var(--r-lg);
  box-shadow: var(--e2), var(--hi);
}
.dev-card:hover {
  transform: translateY(-2px);
  box-shadow: var(--e4), var(--hi);
  border-color: rgba(255, 90, 31, .2);
}
.dev-card.is-online {
  border-color: rgba(18, 161, 80, .26);
  box-shadow:
    var(--e2),
    var(--hi),
    0 0 0 3px rgba(18, 161, 80, .055);
}
.dev-card.is-online:hover {
  box-shadow:
    var(--e4),
    var(--hi),
    0 0 0 3px rgba(18, 161, 80, .08);
}
.dev-card:active { transform: translateY(0) scale(.997); }

/* KPI / 摘要卡片：玻璃 + 立体 */
.kpi,
.summary-item {
  background:
    linear-gradient(180deg, rgba(255, 255, 255, .92), rgba(255, 255, 255, .72)),
    var(--glass-1);
  backdrop-filter: var(--blur-sm);
  -webkit-backdrop-filter: var(--blur-sm);
  border: 1px solid rgba(255, 255, 255, .85);
  box-shadow: var(--e2), var(--hi);
}
.kpi:hover,
.summary-item:hover {
  transform: translateY(-2px) scale(1.006);
  box-shadow: var(--e4), var(--hi);
}

/* 摘要数字：加大字重与字距 */
.summary-item b,
.kpi__value {
  font-size: var(--fs-xl);
  font-weight: var(--fw-heavy);
  letter-spacing: -0.03em;
  font-variant-numeric: tabular-nums;
  line-height: 1.1;
}
.summary-item span,
.kpi__title {
  font-size: var(--fs-2xs);
  font-weight: var(--fw-med);
  letter-spacing: var(--ls-caps);
  text-transform: uppercase;
  color: var(--ink3);
}

/* ══════════════════════ 5. 按钮立体 + 动效 ══════════════════════ */
.ant-btn {
  border-radius: var(--r-sm);
  font-weight: var(--fw-med);
  letter-spacing: var(--ls-wide);
  box-shadow: var(--e1), var(--hi-soft);
  transition:
    transform var(--dur-1) var(--ease-out),
    box-shadow var(--dur-1) var(--ease-out),
    background var(--dur-1) var(--ease-out),
    border-color var(--dur-1) var(--ease-out),
    color var(--dur-1) var(--ease-out);
}
.ant-btn:not(:disabled):hover {
  transform: translateY(-1px);
  box-shadow: var(--e3), var(--hi-soft);
}
.ant-btn:not(:disabled):active {
  transform: translateY(0) scale(.982);
  box-shadow: inset 0 2px 5px rgba(26, 34, 44, .11), inset 0 1px 1px rgba(26, 34, 44, .06);
  transition-duration: 60ms;
}
.ant-btn:focus-visible {
  outline: 2px solid rgba(255, 90, 31, .45);
  outline-offset: 2px;
}

/* 主按钮：渐变 + 投影 + 文字微凸 */
.ant-btn-primary {
  background-image: linear-gradient(180deg, #ff7440 0%, #ff5a1f 46%, #ec4d12 100%);
  border-color: #d94a10;
  color: #fff;
  text-shadow: 0 1px 1px rgba(138, 30, 3, .24);
  box-shadow:
    0 2px 6px rgba(217, 58, 8, .26),
    0 1px 2px rgba(217, 58, 8, .18),
    inset 0 1px 0 rgba(255, 255, 255, .30);
}
.ant-btn-primary:not(:disabled):hover {
  background-image: linear-gradient(180deg, #ff8552 0%, #ff6a30 46%, #f4581a 100%);
  border-color: #d94a10;
  box-shadow:
    0 7px 18px rgba(217, 58, 8, .32),
    0 2px 5px rgba(217, 58, 8, .2),
    inset 0 1px 0 rgba(255, 255, 255, .36);
}
.ant-btn-primary:not(:disabled):active {
  background-image: linear-gradient(180deg, #e8500f 0%, #d94a10 100%);
  box-shadow: inset 0 2px 6px rgba(110, 24, 2, .35);
  text-shadow: none;
}

/* 危险按钮 */
.ant-btn-dangerous:not(.ant-btn-primary) {
  color: var(--danger);
  border-color: rgba(229, 72, 77, .34);
  background-image: linear-gradient(180deg, #fff, #fff8f8);
}
.ant-btn-dangerous:not(.ant-btn-primary):hover {
  color: #fff;
  background-image: linear-gradient(180deg, #ef5b60, #e5484d 55%, #d33c41);
  border-color: #d33c41;
  box-shadow: 0 5px 14px rgba(229, 72, 77, .28), inset 0 1px 0 rgba(255, 255, 255, .26);
}

/* 图标按钮 / 操作按钮 */
.op,
.icon-btn,
.ant-btn-link,
.pad-btn,
.im-tab,
.quick-cmds .pad-btn {
  border-radius: var(--r-sm);
  transition:
    transform var(--dur-1) var(--ease-out),
    background var(--dur-1) var(--ease-out),
    box-shadow var(--dur-1) var(--ease-out),
    border-color var(--dur-1) var(--ease-out),
    color var(--dur-1) var(--ease-out);
}
.op:hover,
.icon-btn:hover {
  transform: translateY(-1px) scale(1.06);
  box-shadow: var(--e2);
}

/* ══════════════════════ 6. 标签立体 ══════════════════════ */
.ant-tag {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  height: 20px;
  padding: 0 9px;
  border-radius: var(--r-full);
  border: 1px solid rgba(26, 34, 44, .09);
  background-image: linear-gradient(180deg, rgba(255, 255, 255, .9), rgba(246, 247, 249, .9));
  font-size: var(--fs-2xs);
  font-weight: var(--fw-semi);
  letter-spacing: var(--ls-wide);
  line-height: 1;
  color: var(--ink2);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .9), 0 1px 2px rgba(26, 34, 44, .045);
  transition:
    transform var(--dur-1) var(--ease-out),
    box-shadow var(--dur-1) var(--ease-out),
    filter var(--dur-1) var(--ease-out);
}
.ant-tag:hover {
  transform: translateY(-1px);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .95), 0 3px 8px rgba(26, 34, 44, .09);
}

/* 彩色标签：色底 + 同色系描边 + 深色文字（保证不混色） */
.ant-tag-orange,
.ant-tag-volcano {
  background-image: linear-gradient(180deg, #fff5f0, #ffebe1);
  border-color: #ffc9b1;
  color: #a83408;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .95), 0 1px 2px rgba(217, 58, 8, .09);
}
.ant-tag-green,
.ant-tag-success {
  background-image: linear-gradient(180deg, #f0fdf5, #e3f8ec);
  border-color: #a8e6c1;
  color: #0a6f38;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .95), 0 1px 2px rgba(18, 161, 80, .1);
}
.ant-tag-red,
.ant-tag-error {
  background-image: linear-gradient(180deg, #fff5f5, #ffeaea);
  border-color: #ffc2c4;
  color: #a72429;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .95), 0 1px 2px rgba(229, 72, 77, .1);
}
.ant-tag-purple {
  background-image: linear-gradient(180deg, #f8f5ff, #efe9ff);
  border-color: #d5c8ff;
  color: #5b34c4;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .95), 0 1px 2px rgba(139, 92, 246, .1);
}
.ant-tag-blue,
.ant-tag-cyan {
  background-image: linear-gradient(180deg, #f2fbfc, #e6f7f7);
  border-color: #a8dede;
  color: #0a6b6b;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .95), 0 1px 2px rgba(14, 156, 156, .1);
}
.ant-tag-gold,
.ant-tag-warning {
  background-image: linear-gradient(180deg, #fffbef, #fff5d9);
  border-color: #ffdf9e;
  color: #8a5a00;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .95), 0 1px 2px rgba(255, 176, 32, .12);
}

/* ══════════════════════ 7. 毛玻璃：侧栏 / 顶栏 / 弹窗 ══════════════════════ */
/* 侧边栏 */
.ant-layout-sider,
.ant-layout-sider-children {
  background: var(--glass-2) !important;
  backdrop-filter: var(--blur-lg);
  -webkit-backdrop-filter: var(--blur-lg);
}
.ant-layout-sider {
  border-right: 1px solid rgba(26, 34, 44, .055);
  box-shadow:
    1px 0 0 rgba(255, 255, 255, .9),
    6px 0 28px rgba(26, 34, 44, .028);
}
/* 侧栏菜单项：hover / 选中 的动效 */
.ant-menu-dark .ant-menu-item,
.ant-menu-dark .ant-menu-submenu-title {
  border-radius: var(--r-sm);
  transition:
    background var(--dur-1) var(--ease-out),
    color var(--dur-1) var(--ease-out),
    transform var(--dur-1) var(--ease-out),
    box-shadow var(--dur-1) var(--ease-out);
}
.ant-menu-dark .ant-menu-item:hover {
  transform: translateX(2px);
  box-shadow: var(--e1);
}
.ant-menu-dark .ant-menu-item-selected {
  background-image: linear-gradient(94deg, rgba(255, 90, 31, .13), rgba(255, 90, 31, .045)) !important;
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .7),
    0 1px 3px rgba(217, 58, 8, .1);
}
.ant-menu-dark .ant-menu-item-selected::after {
  content: "";
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(-50%);
  width: 3px;
  height: 17px;
  border-radius: 0 3px 3px 0;
  background: linear-gradient(180deg, #ff7440, #d93a08);
  box-shadow: 0 1px 4px rgba(217, 58, 8, .45);
}

/* 顶栏 */
.ant-layout-header,
.header {
  background: var(--glass-2) !important;
  backdrop-filter: var(--blur-md);
  -webkit-backdrop-filter: var(--blur-md);
  border-bottom: 1px solid rgba(26, 34, 44, .055);
  box-shadow: 0 1px 0 rgba(255, 255, 255, .9), 0 4px 20px rgba(26, 34, 44, .022);
  position: sticky;
  top: 0;
  z-index: 60;
}

/* 弹窗 */
.ant-modal-content {
  background: var(--glass-3) !important;
  backdrop-filter: var(--blur-lg);
  -webkit-backdrop-filter: var(--blur-lg);
  border: 1px solid rgba(255, 255, 255, .85);
  border-radius: var(--r-xl);
  box-shadow: var(--e5), var(--hi);
  overflow: hidden;
}
.ant-modal-header {
  background: transparent !important;
  border-bottom: 1px solid rgba(26, 34, 44, .06);
  padding-bottom: 13px;
}
.ant-modal-title {
  font-size: var(--fs-lg);
  font-weight: var(--fw-semi);
  letter-spacing: -0.01em;
}
.ant-modal-mask {
  background: rgba(20, 26, 34, .34) !important;
  backdrop-filter: blur(3px);
  -webkit-backdrop-filter: blur(3px);
}

/* 毛玻璃不支持时降级 */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .ant-layout-sider,
  .ant-layout-sider-children,
  .ant-layout-header,
  .header { background: #fff !important; }
  .ant-modal-content { background: #fff !important; }
}

/* ══════════════════════ 8. 表格：分层与悬停 ══════════════════════ */
.ant-table {
  background: transparent;
  border-radius: var(--r-md);
}
.ant-table-thead > tr > th {
  background: linear-gradient(180deg, #fafbfc, #f4f6f9) !important;
  border-bottom: 1px solid rgba(26, 34, 44, .08) !important;
  box-shadow: inset 0 1px 0 #fff;
  padding-top: 9px !important;
  padding-bottom: 9px !important;
}
.ant-table-tbody > tr {
  transition: background var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out);
}
.ant-table-tbody > tr:hover > td {
  background: rgba(255, 90, 31, .035) !important;
}
.ant-table-tbody > tr:hover > td:first-child {
  box-shadow: inset 3px 0 0 rgba(255, 90, 31, .55);
}

/* ══════════════════════ 9. 全局切换动效 ══════════════════════ */
@keyframes dkPageIn {
  from { opacity: 0; transform: translateY(7px) scale(.996); }
  to   { opacity: 1; transform: none; }
}
@keyframes dkFadeIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}
@keyframes dkPopIn {
  0%   { opacity: 0; transform: scale(.965) translateY(4px); }
  60%  { opacity: 1; }
  100% { opacity: 1; transform: none; }
}

#page > * {
  animation: dkPageIn var(--dur-3) var(--ease-out) both;
}

.ant-modal-mask { animation: dkFadeIn var(--dur-2) var(--ease-out) both; }
.ant-modal { animation: dkPopIn var(--dur-3) var(--ease-spring) both; }

/* Tab 切换 */
.ant-tabs-tab,
.im-tab,
.ant-radio-button-wrapper,
.chip {
  transition:
    background var(--dur-1) var(--ease-out),
    color var(--dur-1) var(--ease-out),
    border-color var(--dur-1) var(--ease-out),
    transform var(--dur-1) var(--ease-out),
    box-shadow var(--dur-1) var(--ease-out);
}
.ant-tabs-tab:hover,
.im-tab:hover,
.ant-radio-button-wrapper:hover { transform: translateY(-1px); }
.ant-tabs-tab-active,
.im-tab.on,
.ant-radio-button-wrapper-checked {
  box-shadow: var(--e1), inset 0 1px 0 rgba(255, 255, 255, .9) !important;
}
.ant-tabs-ink-bar {
  border-radius: 3px 3px 0 0;
  box-shadow: 0 -1px 6px rgba(255, 90, 31, .4);
}

/* 折叠面板 / 下拉 */
.ant-collapse-item { transition: background var(--dur-1) var(--ease-out); }
.ant-select-dropdown,
.ant-dropdown-menu {
  background: var(--glass-3) !important;
  backdrop-filter: var(--blur-md);
  -webkit-backdrop-filter: var(--blur-md);
  border: 1px solid rgba(255, 255, 255, .8);
  border-radius: var(--r-md);
  box-shadow: var(--e4), var(--hi);
  animation: dkPopIn var(--dur-2) var(--ease-out) both;
}

/* 输入框焦点：发光环 */
.ant-input,
.ant-select-selector,
textarea.ant-input {
  border-radius: var(--r-sm) !important;
  transition:
    border-color var(--dur-1) var(--ease-out),
    box-shadow var(--dur-1) var(--ease-out),
    background var(--dur-1) var(--ease-out);
  box-shadow: inset 0 1px 2px rgba(26, 34, 44, .035);
}
.ant-input:focus,
.ant-select-focused .ant-select-selector,
textarea.ant-input:focus {
  border-color: rgba(255, 90, 31, .55) !important;
  box-shadow:
    0 0 0 3px rgba(255, 90, 31, .12),
    inset 0 1px 2px rgba(26, 34, 44, .02) !important;
}

/* 状态点呼吸 */
@keyframes dkPulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(18, 161, 80, .45); }
  55%      { box-shadow: 0 0 0 5px rgba(18, 161, 80, 0); }
}
.pulse.on,
.phone.on i {
  animation: dkPulse 2.4s var(--ease-in-out) infinite;
}

/* ══════════════════════ 10. 对比度与可读性收尾 ══════════════════════ */
/* 浅底上不放浅色字：所有次级文字统一压深 */
.muted,
.dim,
.dim.mono,
.who__os,
.lines .muted {
  color: var(--ink3) !important;
}
/* 极浅标签不留空文字 */
.ant-tag:empty { display: none; }

/* 选中文字 */
::selection {
  background: rgba(255, 90, 31, .19);
  color: var(--ink);
}

/* 焦点可见性（键盘） */
:focus-visible {
  outline: 2px solid rgba(255, 90, 31, .5);
  outline-offset: 2px;
}

/* ══════════════════════ 11. 滚动条 ══════════════════════ */
* {
  scrollbar-width: thin;
  scrollbar-color: rgba(26, 34, 44, .22) transparent;
}
::-webkit-scrollbar { width: 9px; height: 9px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
  background: linear-gradient(180deg, rgba(26, 34, 44, .17), rgba(26, 34, 44, .25));
  border-radius: var(--r-full);
  border: 2px solid transparent;
  background-clip: padding-box;
  transition: background var(--dur-1) var(--ease-out);
}
::-webkit-scrollbar-thumb:hover {
  background: linear-gradient(180deg, rgba(255, 90, 31, .58), rgba(217, 58, 8, .68));
  background-clip: padding-box;
}

/* ══════════════════════ 12. 无障碍：尊重系统降级 ══════════════════════ */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
  .panel:hover,
  .dev-card:hover,
  .kpi:hover,
  .ant-btn:hover { transform: none !important; }
}

/* 高对比度模式 */
@media (prefers-contrast: more) {
  .panel,
  .dev-card,
  .pro-table { border-color: rgba(26, 34, 44, .28); }
  .ant-tag { border-width: 1.5px; }
  .muted, .dim { color: #3d4653 !important; }
}

/* 深色系统偏好下保持浅色主题（后台工具，不做自动反色） */

/* ══════════════════════ 13. 强制覆盖层 ══════════════════════
 * 页面级组件（.panel / .kpi / .dev-card …）在原 CSS 里挂在
 * `.s-dash`、`.s-devices` 这类页面作用域下，特异性高于本层的裸类选择器。
 * 主题层对「背景 / 圆角 / 阴影」这几项结构性视觉做强制覆盖，其余保持可继承。
 * ------------------------------------------------------------------------ */

/* —— 卡片：统一立体与层差 —— */
.panel,
.pro-table,
.dev-card,
.chain-card,
.coin-tile,
.wallet-card,
.cred-card,
.contact-card,
.visit-summary__card,
.sticky-note,
.gallery-card,
.app-tile,
.pie-wrap,
.area-wrap,
.login-box {
  background-image: linear-gradient(180deg, #ffffff 0%, #fbfcfe 100%) !important;
  background-color: #fff !important;
  border: 1px solid rgba(26, 34, 44, .075) !important;
  border-radius: var(--r-lg) !important;
  box-shadow: var(--e2), var(--hi) !important;
}

.panel:hover,
.pro-table:hover,
.dev-card:hover,
.chain-card:hover,
.coin-tile:hover,
.wallet-card:hover,
.gallery-card:hover,
.app-tile:hover {
  box-shadow: var(--e4), var(--hi) !important;
  border-color: rgba(255, 90, 31, .18) !important;
}

.dev-card.is-online {
  border-color: rgba(18, 161, 80, .26) !important;
  box-shadow: var(--e2), var(--hi), 0 0 0 3px rgba(18, 161, 80, .055) !important;
}
.dev-card.is-online:hover {
  box-shadow: var(--e4), var(--hi), 0 0 0 3px rgba(18, 161, 80, .085) !important;
}

/* —— KPI / 摘要：玻璃 + 立体（原来是一整块粉色实底，与内容混色）—— */
.kpi,
.summary-item {
  background-image: linear-gradient(180deg, #ffffff 0%, #fafbfd 100%) !important;
  background-color: #fff !important;
  border: 1px solid rgba(26, 34, 44, .07) !important;
  border-radius: var(--r-lg) !important;
  box-shadow: var(--e2), var(--hi) !important;
  position: relative;
  overflow: hidden;
}

/* KPI 顶部细彩条：用伪元素承载品牌色，替代整块染色背景 */
.kpi::after {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 2.5px;
  border-radius: var(--r-lg) var(--r-lg) 0 0;
  background: linear-gradient(90deg,
    color-mix(in srgb, var(--c, var(--coral)) 82%, #fff),
    color-mix(in srgb, var(--c, var(--coral)) 34%, #fff));
  opacity: .85;
  pointer-events: none;
}
.kpi:hover::after { opacity: 1; }
.kpi:hover,
.summary-item:hover {
  box-shadow: var(--e4), var(--hi) !important;
  border-color: rgba(255, 90, 31, .17) !important;
}

/* KPI 数字与标题：明确层级，避免同色系叠在一起 */
.kpi .kpi__value,
.kpi b {
  color: var(--c, var(--ink)) !important;
  font-size: var(--fs-xl) !important;
  font-weight: var(--fw-heavy) !important;
  letter-spacing: -0.028em;
  line-height: 1.12;
  -webkit-text-fill-color: currentColor;
}
.kpi .kpi__title,
.kpi .kpi__today,
.summary-item span {
  color: var(--ink3) !important;
  font-size: var(--fs-2xs) !important;
  font-weight: var(--fw-med) !important;
  letter-spacing: var(--ls-caps);
  text-transform: uppercase;
}
.kpi .kpi__delta { font-size: var(--fs-xs) !important; font-weight: var(--fw-semi) !important; }

/* —— 侧栏 / 顶栏：强制玻璃 —— */
.ant-layout-sider,
.ant-layout-sider-children {
  background: var(--glass-2) !important;
  backdrop-filter: var(--blur-lg) !important;
  -webkit-backdrop-filter: var(--blur-lg) !important;
}
.ant-layout-header,
.header {
  background: var(--glass-2) !important;
  backdrop-filter: var(--blur-md) !important;
  -webkit-backdrop-filter: var(--blur-md) !important;
}
.ant-modal-content {
  background: var(--glass-3) !important;
  backdrop-filter: var(--blur-lg) !important;
  -webkit-backdrop-filter: var(--blur-lg) !important;
}

/* —— 表格：表头与行层差 —— */
.ant-table-thead > tr > th {
  background-image: linear-gradient(180deg, #fafbfc, #f4f6f9) !important;
  background-color: #f8f9fb !important;
  color: var(--ink3) !important;
  font-size: var(--fs-2xs) !important;
  font-weight: var(--fw-semi) !important;
  letter-spacing: var(--ls-caps) !important;
  text-transform: uppercase;
}

/* —— 弹窗按钮区 —— */
.ant-modal-footer .ant-btn { min-width: 74px; }

/* —— 登录页也走同一套层差 —— */
#login .login-box {
  background: rgba(255, 255, 255, .82) !important;
  backdrop-filter: var(--blur-lg);
  -webkit-backdrop-filter: var(--blur-lg);
  border: 1px solid rgba(255, 255, 255, .92) !important;
  box-shadow: var(--e5), var(--hi) !important;
  border-radius: var(--r-2xl) !important;
}

/* —— 文字与背景彻底分离：任何浅底都不放浅色正文 —— */
.panel,
.kpi,
.summary-item,
.dev-card,
.pro-table {
  color: var(--ink);
}
.panel p,
.panel li,
.panel td,
.kpi span { color: var(--ink2); }

/* ══════════════════════ 14. 对比度补丁 ══════════════════════ */
/* 原 .pad-btn.danger 是 #e5484d on #fff5f5，只有 3.9:1 —— 文字压深到 5.9:1 */
.pad-btn.danger,
.pad-btn.is-danger {
  color: #b81f24 !important;
  background-image: linear-gradient(180deg, #ffffff, #fff6f6) !important;
  border-color: rgba(229, 72, 77, .32) !important;
  box-shadow: var(--e1), var(--hi-soft) !important;
}
.pad-btn.danger:hover,
.pad-btn.is-danger:hover {
  color: #fff !important;
  background-image: linear-gradient(180deg, #ef5b60, #e5484d 55%, #d33c41) !important;
  border-color: #d33c41 !important;
  box-shadow: 0 5px 14px rgba(229, 72, 77, .26), inset 0 1px 0 rgba(255, 255, 255, .24) !important;
}

/* 采集摘要 / KPI 里的数字：默认用主色，但要够深 */
.summary-item b {
  color: var(--coral-strong) !important;
  font-size: var(--fs-xl) !important;
  font-weight: var(--fw-heavy) !important;
  letter-spacing: -0.028em;
  line-height: 1.1;
  font-variant-numeric: tabular-nums;
}
.summary-item:hover b { color: var(--coral-text) !important; }

/* 详情页 hero 手机模型：字号收一点，避免「未知机型」四字换行挤爆 */
.s-detail .stage-hero .phone__screen b,
.s-detail .stage-hero .phone b { font-size: 8.5px !important; line-height: 1.15; letter-spacing: -0.02em; }
.s-detail .stage-hero .phone__screen span,
.s-detail .stage-hero .phone span { font-size: 7.5px !important; opacity: .9; }

/* hero 主标题下的说明行：与标题拉开层级 */
.stage-hero__copy p {
  font-size: var(--fs-sm) !important;
  color: var(--ink3) !important;
  margin-top: 5px;
}
.stage-hero__copy h1 em {
  font-size: var(--fs-xl);
  font-weight: var(--fw-heavy);
  letter-spacing: -0.02em;
}

/* 表格「空」类极淡标签：给足边框和文字对比 */
.ant-tag:not([class*="ant-tag-"]) {
  color: var(--ink2) !important;
  border-color: rgba(26, 34, 44, .13) !important;
  background-image: linear-gradient(180deg, #fbfcfd, #f5f7fa) !important;
}

/* 深色数字/ID 在浅底上统一压深（避免 dim 类被淡化到看不清） */
.mono.dim, .dim.mono, td.mono, .ant-typography.mono {
  color: var(--ink2) !important;
}

/* ══════════════════════ 15. 交互补全 ══════════════════════
 * 依据动效审计：P0-1/2/3、P1-1~11、P2-7
 * ------------------------------------------------------------------------ */

/* ── P0-1 页面进入动画只在真正换页时播（分页/筛选不再整屏重播）── */
#page > .page-container { animation: none !important; }
#page > .page-container.dk-enter {
  animation: dkPageIn 200ms var(--ease-out) both !important;
}
@media (prefers-reduced-motion: reduce) {
  #page > .page-container.dk-enter { animation: none !important; }
}

/* ── P0-2 顶部加载进度条 ── */
.dk-loadbar {
  position: fixed;
  left: 230px;
  right: 0;
  top: 55px;
  height: 2px;
  z-index: 80;
  opacity: 0;
  overflow: hidden;
  pointer-events: none;
  transition: opacity 120ms linear;
}
.dk-loadbar.on { opacity: 1; }
.dk-loadbar.on::after {
  content: "";
  display: block;
  height: 100%;
  width: 36%;
  background: linear-gradient(90deg, transparent, var(--coral), var(--coral-strong), transparent);
  animation: dkBar 1.1s var(--ease-in-out) infinite;
}
@keyframes dkBar {
  0%   { transform: translateX(-100%); }
  100% { transform: translateX(300%); }
}
@media (prefers-reduced-motion: reduce) {
  .dk-loadbar.on::after { animation: none; width: 100%; opacity: .6; }
}

/* ── P1-1 按下态补全（原只有 .ant-btn / .dev-card，且后者被覆盖失效）── */
.chip, .typo-copy, .app-ic, .op, .im-tab, .summary-item, .kpi, .asset,
.legend__item, .sum-chip, .pad-btn, .mn-act, .mn-copy, .back,
.ant-switch, .ant-pagination-item-link:not(:disabled),
.ant-menu-item, .ant-menu-submenu-title {
  transition:
    transform var(--dur-1) var(--ease-out),
    background-color var(--dur-1) var(--ease-out),
    border-color var(--dur-1) var(--ease-out),
    color var(--dur-1) var(--ease-out),
    box-shadow var(--dur-1) var(--ease-out);
}
/* 卡片：必须压过 .s-devices .dev-card:hover{translateY(-1px)} 的 0,3,0 */
.s-devices .dev-card:active,
.dev-card:active,
.dev-card:active:hover {
  transform: translateY(0) scale(.994) !important;
  box-shadow: var(--e1), var(--hi) !important;
  transition-duration: 60ms;
}
.kpi:active, .kpi:active:hover,
.asset:active, .asset:active:hover {
  transform: translateY(0) scale(.99) !important;
  transition-duration: 60ms;
}
.summary-item:active { transform: scale(.96); transition-duration: 60ms; }
.chip:active, .op:active, .typo-copy:active, .im-tab:active,
.pad-btn:active, .mn-act:active, .legend__item:active,
.ant-pagination-item-link:not(:disabled):active { transform: scale(.93); transition-duration: 60ms; }
.ant-switch:active { transform: scale(.97); }
.ant-menu-item:active, .ant-menu-submenu-title:active { transform: translateX(1px); }

/* ── P1-2 表格行过渡写在 td 上（原来写在 tr，变色在 td，实际不生效）── */
.ant-table-tbody > tr > td {
  transition:
    background-color var(--dur-1) var(--ease-out),
    box-shadow var(--dur-1) var(--ease-out);
}

/* ── P1-3 弹窗出场动画（原来只有入场）── */
@keyframes dkFadeOut { to { opacity: 0; } }
@keyframes dkPopOut { to { opacity: 0; transform: scale(.975) translateY(4px); } }
.ant-modal-mask.dk-leaving {
  animation: dkFadeOut 160ms var(--ease-in-out) both !important;
  pointer-events: none;
}
.ant-modal-mask.dk-leaving .ant-modal {
  animation: dkPopOut 160ms var(--ease-in-out) both !important;
}
@media (prefers-reduced-motion: reduce) {
  .ant-modal-mask.dk-leaving,
  .ant-modal-mask.dk-leaving .ant-modal { animation-duration: .01ms !important; }
}

/* ── P1-4 toast：出场 + 状态点 + 可点关闭 + 限制堆叠 ── */
@keyframes dkToastOut { to { opacity: 0; transform: translateY(6px) scale(.98); } }
#toast { max-height: 42vh; overflow: hidden; }
#toast > div {
  display: flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  animation: dkToastIn 200ms var(--ease-out) both;
}
@keyframes dkToastIn {
  from { opacity: 0; transform: translateY(-6px) scale(.98); }
  to   { opacity: 1; transform: none; }
}
#toast > div.dk-out {
  animation: dkToastOut 180ms var(--ease-in-out) both !important;
  pointer-events: none;
}
#toast .tk-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--coral);
  flex: 0 0 auto;
}
#toast > div.err .tk-dot { background: var(--danger); }

/* ── P1-5 侧栏选中态：渐变改纯色（可过渡）+ 指示条常驻 scaleY ── */
.ant-menu-dark .ant-menu-item { position: relative; }
.ant-menu-dark .ant-menu-item-selected {
  background-color: rgba(255, 90, 31, .105) !important;
  background-image: none !important;
  color: var(--coral-text) !important;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .7) !important;
}
.ant-menu-dark .ant-menu-item::after {
  content: "";
  position: absolute;
  left: 0;
  top: 50%;
  width: 3px;
  height: 17px;
  border-radius: 0 3px 3px 0;
  background: linear-gradient(180deg, #ff7440, #d93a08);
  box-shadow: 0 1px 4px rgba(217, 58, 8, .45);
  transform: translateY(-50%) scaleY(0);
  opacity: 0;
  transition:
    transform var(--dur-2) var(--ease-spring),
    opacity var(--dur-1) linear;
  pointer-events: none;
}
.ant-menu-dark .ant-menu-item-selected::after {
  transform: translateY(-50%) scaleY(1);
  opacity: 1;
}

/* ── P1-6 脉冲：只打状态点；.phone.on i 是听筒装饰，不能脉冲 ── */
.phone.on i { animation: none !important; }
.pulse.on {
  box-shadow: none !important;
  animation: none !important;
  position: relative;
}
.pulse.on::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: rgba(217, 58, 8, .36);
  animation: dkPulseRing 2.4s var(--ease-in-out) infinite;
  pointer-events: none;
}
@keyframes dkPulseRing {
  0%   { transform: scale(1);   opacity: .55; }
  70%  { transform: scale(2.6); opacity: 0; }
  100% { transform: scale(2.6); opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .pulse.on::after { animation: none !important; opacity: 0 !important; }
}
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  .pulse.on::after { will-change: transform, opacity; }
  #page > .page-container.dk-enter { will-change: opacity, transform; }
}

/* ── P1-8 写操作 busy 态 ── */
.ant-btn.is-busy {
  position: relative;
  color: transparent !important;
  pointer-events: none;
}
.ant-btn.is-busy > * { visibility: hidden; }
.ant-btn.is-busy::after {
  content: "";
  position: absolute;
  inset: 0;
  margin: auto;
  width: 13px;
  height: 13px;
  border: 2px solid rgba(26, 34, 44, .2);
  border-top-color: var(--coral-strong);
  border-radius: 50%;
  animation: dkSpin .7s linear infinite;
}
.ant-btn-primary.is-busy::after {
  border-color: rgba(255, 255, 255, .35);
  border-top-color: #fff;
}
@keyframes dkSpin { to { transform: rotate(360deg); } }

/* ── P1-9 登录按钮 disabled / loading 视觉 ── */
#login button.login-btn:disabled {
  cursor: progress;
  opacity: .82;
  transform: none;
  box-shadow: 0 4px 12px rgba(217, 58, 8, .16);
}
#login button.login-btn[data-loading]::before {
  content: "";
  display: inline-block;
  width: 13px;
  height: 13px;
  margin-right: 8px;
  vertical-align: -2px;
  border: 2px solid rgba(255, 255, 255, .45);
  border-top-color: #fff;
  border-radius: 50%;
  animation: dkSpin .7s linear infinite;
}

/* ── P1-10 设备卡内 .op 被 layout 的 transform:none 钉死，恢复反馈 ── */
.dev-card .ops .op:hover,
.s-devices .dev-card .ops .op:hover {
  transform: translateY(-1px);
  box-shadow: var(--e2);
}
.dev-card .ops .op:active,
.s-devices .dev-card .ops .op:active {
  transform: scale(.92);
}

/* 假按钮：暂时没接事件的元素去掉可点暗示 */
.s-ingest .ingest-table .ant-table-row { cursor: default !important; }
.legend__item:not([data-act]) { cursor: default; }
.legend__item:not([data-act]):hover { transform: none; }

/* ── P1-11 分页箭头 ── */
.ant-pagination-item-link:not(:disabled):hover {
  background: var(--coral-tint);
  border-color: var(--coral-border);
  color: var(--coral-text);
}
.ant-pagination-item {
  transition: background-color var(--dur-1) var(--ease-out),
              border-color var(--dur-1) var(--ease-out),
              color var(--dur-1) var(--ease-out);
}

/* ── P2-7 非交互元素不做 hover 位移 ── */
.ant-tag:hover { transform: none; }
.panel:hover { border-color: rgba(26, 34, 44, .09); }

/* ── P1-7 reduced-motion：补齐遗漏的位移类 ── */
@media (prefers-reduced-motion: reduce) {
  .ant-menu-dark .ant-menu-item:hover,
  .ant-menu-dark .ant-menu-submenu-title:hover,
  .ant-tag:hover,
  .op:hover,
  .icon-btn:hover,
  .chip:hover,
  .typo-copy:hover,
  .media-card:hover,
  .asset:hover,
  .sum-chip:hover,
  .ant-upload:hover,
  .ant-tabs-tab:hover,
  .im-tab:hover,
  .ant-radio-button-wrapper:hover,
  .iphone__app:hover .iphone__icon,
  .dev-card .ops .op:hover {
    transform: none !important;
  }
}

/* ══════════════════════ 16. 审计修复（A 视觉一致性 + B 对比度）══════════════════════
 * A-P0-1 pro-table 无内边距 / A-P0-2 标题 4 种字号 / A-P0-3 正文实际 13px
 * A-P0-4 顶栏玻璃失效 / A-P0-5 KPI 玻璃自相矛盾 / A-P0-6 登录选择器错
 * A-P0-7 卡片套卡片 / A-P0-8 表格三段圆角 / A-P0-9 大数字三档
 * B-P0  资产卡白字 / B-P0 焦点环 / B-P1 主按钮与危险按钮 / B-P1 语义色被覆盖
 * ------------------------------------------------------------------------ */

/* ── A-P0-1 .pro-table 补内边距（原 padding 挂在死作用域 .s-protable 上）── */
.pro-table { padding: 16px 16px 0 !important; }
.pro-table__header { margin-bottom: 14px; }
.pro-table__search { padding: 0 !important; }
.pro-table .pro-table__header .pro-table__search { padding: 0 0 12px !important; }

/* ── A-P0-2 页面标题统一到 --fs-2xl / 800 ── */
.dash-title,
.dev-hero h1,
.hero-line h1,
.page-hero h1,
.ingest-title,
.pro-table__title,
.board-title,
.coin-hero__head h1 {
  font-size: var(--fs-2xl) !important;
  font-weight: var(--fw-heavy) !important;
  line-height: 1.22 !important;
  letter-spacing: -0.022em !important;
  color: var(--ink) !important;
}
/* proTable 内的标题属于「页面标题」，其 kicker 保持小标签 */
.pro-table__heading .kicker { font-size: var(--fs-2xs) !important; }

/* ── A-P0-3 正文基准：antd 的属性前缀选择器把内容区锁死在 13px ── */
[class^="ant-layout"],
[class*=" ant-layout"],
.ant-layout-content,
.ant-layout-header,
.ant-layout-sider,
.ant-layout-sider-children {
  font-size: var(--fs-md) !important;
}

/* ── A-P0-4 顶栏玻璃：layout 用 (0,2,0) 的实色 !important 压住了 (0,1,0) ── */
.ant-layout-header.header,
.ant-layout-header {
  background: var(--glass-2) !important;
  backdrop-filter: var(--blur-md) !important;
  -webkit-backdrop-filter: var(--blur-md) !important;
}

/* ── A-P0-5 KPI/摘要卡：§7 写了 blur、§13 又给了不透明底 → 删掉无效 blur ── */
.kpi,
.summary-item {
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}

/* ── A-P0-6 登录卡：真实类是 #login .wrap / #login .form，不是 .login-box ── */
#login .wrap { background: transparent !important; }
#login .form {
  background: rgba(255, 255, 255, .86) !important;
  backdrop-filter: var(--blur-md);
  -webkit-backdrop-filter: var(--blur-md);
}
#login .brand { border-radius: var(--r-2xl) 0 0 var(--r-2xl); }
#login .form { border-radius: 0 var(--r-2xl) var(--r-2xl) 0; }
#login .wrap {
  border-radius: var(--r-2xl) !important;
  box-shadow: var(--e5), var(--hi) !important;
  overflow: hidden;
}

/* ── A-P0-7 图表容器不是卡：去掉卡片套卡片 ── */
.pie-wrap,
.area-wrap {
  background: transparent !important;
  background-image: none !important;
  border: 0 !important;
  box-shadow: none !important;
  border-radius: 0 !important;
}
.pie-wrap:hover,
.area-wrap:hover { transform: none !important; box-shadow: none !important; }

/* ── A-P0-8 表格内三段圆角统一 ── */
.pro-table .ant-table,
.pro-table .ant-table-container {
  border-radius: var(--r-md) !important;
}

/* ── A-P0-9 大数字统一到 --fs-xl ── */
.ant-statistic-content { font-size: var(--fs-xl) !important; font-weight: var(--fw-heavy) !important; }
.ant-statistic-title { font-size: var(--fs-2xs) !important; letter-spacing: var(--ls-caps); text-transform: uppercase; }

/* ── A-P1 补 11 个真实存在但漏登记的卡片类 ── */
.asset,
.dev-toolbar,
.media-card,
.toggle-card,
.wp-card,
.wak-card,
.ant-card,
.coin-hero,
.stage-hero,
.im-stat {
  background-image: linear-gradient(180deg, #ffffff 0%, #fbfcfe 100%) !important;
  background-color: #fff !important;
  border: 1px solid rgba(26, 34, 44, .075) !important;
  border-radius: var(--r-lg) !important;
  box-shadow: var(--e2), var(--hi) !important;
}
.stage-hero,
.im { border-radius: var(--r-xl) !important; }
.ant-card .ant-card-body { padding: 16px !important; }

/* ── A-P1 kicker / panel__title / hint 统一（压过页面作用域）── */
.kicker, .dash-kicker, .pro-table__heading .kicker, .coin-hero__head .kicker,
.page-hero .kicker, .panel__title .kicker {
  font-size: var(--fs-2xs) !important;
  font-weight: var(--fw-bold) !important;
  letter-spacing: var(--ls-caps) !important;
  text-transform: uppercase !important;
}
.panel__title, .board-title, .im__title {
  font-weight: var(--fw-semi) !important;
}
.panel__hint, .kpi__delta { font-size: var(--fs-xs) !important; }

/* ── A-P1 表格字体族与全站一致（antd 写死了另一套）── */
.ant-table-wrapper .ant-table,
.ant-table-wrapper .ant-table td,
.ant-table-wrapper .ant-table th {
  font-family: var(--font-sans) !important;
}

/* ── A-P1 等宽字体统一（5 套硬编码 → 1 套）── */
.field .ant-input,
.wp-card__mn,
.dlog-area,
.addr-chip code,
.log-box,
.flow__addr,
.phone__screen b {
  font-family: var(--font-mono) !important;
  font-variant-ligatures: none;
}

/* ── A-P1 按钮类容器补 font: inherit（原来回落到 UA 的 13.333px）── */
.kpi, .asset, .step, .sum-chip, .op, .chip,
button.section-title, button.board-title { font: inherit; }

/* ── B-P0 资产卡：白字落在浅彩底 1.22:1 → 改深色 ── */
.asset__pending,
.asset__foot { color: var(--ink) !important; }
.asset__coin { color: var(--ink2) !important; letter-spacing: -0.01em; }
.asset__label { color: #a83408 !important; }
.asset__coin::before {
  content: "";
  display: inline-block;
  width: 6px; height: 6px;
  margin-right: 5px;
  border-radius: 50%;
  background: var(--c, var(--coral));
  vertical-align: 1px;
}

/* ── B-P0 焦点环：antd 的 #ffe3d7 在浅底上 1.22:1，全部改成 #c13a08 ── */
*:focus-visible,
.ant-btn:focus-visible,
.ant-btn:not(:disabled):focus-visible,
.ant-menu-item:focus-visible,
.ant-menu-submenu-title:focus-visible,
.ant-dropdown-menu-item:focus-visible,
.ant-modal-close:focus-visible,
.ant-pagination-item:focus-visible,
.ant-pagination-item-link:focus-visible,
.ant-checkbox-input:focus-visible + .ant-checkbox-inner,
.ant-radio-input:focus-visible + .ant-radio-inner,
.ant-switch:focus-visible,
.ant-input:focus-visible,
.ant-select:focus-visible {
  outline: 2px solid #c13a08 !important;
  outline-offset: 2px;
  box-shadow: 0 0 0 4px rgba(193, 58, 8, .14) !important;
}

/* ── B-P1 主按钮：白字在 #ff7440 顶端仅 2.68:1 → 渐变整体压深 ── */
.ant-btn-primary {
  background-image: linear-gradient(180deg, #e04a12 0%, #d94a10 46%, #c74618 100%) !important;
}
.ant-btn-primary:not(:disabled):hover {
  background-image: linear-gradient(180deg, #ea5520 0%, #e04f16 46%, #d04b1a 100%) !important;
}
.ant-btn-primary:not(:disabled):active {
  background-image: linear-gradient(180deg, #c74618 0%, #b83c10 100%) !important;
}

/* ── B-P1 危险按钮：文字压到 #c93b40（5.02:1）── */
.ant-btn-dangerous:not(.ant-btn-primary),
.ant-btn-dangerous.ant-btn-background-ghost {
  color: #c93b40 !important;
  border-color: rgba(201, 59, 64, .38) !important;
}
.ant-btn-dangerous.ant-btn-background-ghost { background: transparent !important; }
.ant-btn-dangerous:not(.ant-btn-primary):hover {
  color: #fff !important;
  background-image: linear-gradient(180deg, #d9494e, #c93b40 55%, #b32f34) !important;
  border-color: #b32f34 !important;
}

/* ── B-P1 下跌数值 / 副标题 / 提示文字压深 ── */
.kpi__delta.down { color: #c93b40 !important; }
.dash-sub, .s-dash .dash-sub { color: var(--ink3) !important; }
.panel__hint, .empty, .s-dash .panel__hint { color: var(--ink3) !important; }

/* ── B-P1 输入框焦点：只有 1.15:1 的淡环 → 边框 + 实色环 ── */
.ant-form-item-control-input-content input:focus,
.ant-form-item-control-input-content select:focus,
.dev-select:focus,
.ant-input:focus,
textarea.ant-input:focus {
  border-color: #c13a08 !important;
  outline: none !important;
  box-shadow: 0 0 0 2px #c13a08, 0 0 0 5px rgba(193, 58, 8, .12) !important;
}

/* ── B-P2 表格 hover 左侧指示条 1.88:1 → 3.3:1 ── */
.ant-table-tbody > tr:hover > td:first-child {
  box-shadow: inset 3px 0 0 rgba(217, 58, 8, .88) !important;
}

/* ── B-P2 alert 图标 / 禁用输入框 ── */
.ant-alert-warning .ant-alert-icon { color: #8a5a00 !important; }
.ant-alert-error .ant-alert-icon { color: #c93b40 !important; }
.ant-input[disabled],
.ant-input-number-disabled { color: rgba(26, 34, 44, .48) !important; }

/* ── B-P1 实心语义标签恢复白字（glass 基础规则把 color 统一成 ink2）── */
.ant-tag-gold-solid,
.ant-tag-red-solid,
.ant-tag-green-solid,
.ant-tag-blue-solid,
.ant-tag-volcano-solid,
.ant-tag-cyan-solid,
.ant-tag-purple-solid { color: #fff !important; }

/* ── A-P2 极端小字登记为特例（手机模型内文字）── */
/* .s-detail .stage-hero .phone b/span 用 8.5/7.5px 是图形内文字，唯一越界 */

/* ══════════════════════ 17. 主题色扩展 + 仪表盘紧凑 + 导航重设计 ══════════════════════ */

/* ── 17.1 三个主题色（珊瑚主色保持不变，新增青 / 紫）── */
:root {
  /* 主色：操作 / 选中 / 危险 */
  --brand-1: #d93a08;
  --brand-1-light: #ff7440;
  --brand-1-tint: #fff3ee;
  --brand-1-line: #ffc6ae;
  --brand-1-text: #a83408;

  /* 次色：数据 / 信息 / 统计 */
  --brand-2: #0b8282;
  --brand-2-light: #14b5b5;
  --brand-2-tint: #e6f7f7;
  --brand-2-line: #a8dede;
  --brand-2-text: #0a6b6b;

  /* 三色：系统 / 权限 / 归集 */
  --brand-3: #6d3fd1;
  --brand-3-light: #9970f0;
  --brand-3-tint: #f3eeff;
  --brand-3-line: #cfbcff;
  --brand-3-text: #5b34c4;
}

/* ── 17.2 侧栏导航重设计 ── */
#nav .ant-menu-item,
#nav .ant-menu-submenu-title {
  position: relative;
  display: flex !important;
  align-items: center;
  gap: 10px;
  height: 40px !important;
  line-height: 40px !important;
  margin: 2px 8px !important;
  padding-left: 10px !important;
  padding-right: 10px !important;
  border-radius: 10px !important;
  transition:
    background-color var(--dur-1) var(--ease-out),
    color var(--dur-1) var(--ease-out),
    transform var(--dur-1) var(--ease-out);
}

/* 图标：圆角方块底 */
#nav .ant-menu-item .anticon,
#nav .ant-menu-submenu-title .anticon {
  flex: 0 0 auto;
  width: 26px;
  height: 26px;
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  border-radius: 8px;
  background: rgba(26, 34, 44, .045);
  color: var(--group, var(--ink3)) !important;
  font-size: 14px !important;
  transition:
    background var(--dur-1) var(--ease-out),
    color var(--dur-1) var(--ease-out),
    transform var(--dur-2) var(--ease-spring),
    box-shadow var(--dur-1) var(--ease-out);
}
#nav .ant-menu-item .anticon svg,
#nav .ant-menu-submenu-title .anticon svg { width: 14px; height: 14px; }

/* hover：图标染成所属分组色 + 轻微放大 */
#nav .ant-menu-item:hover .anticon,
#nav .ant-menu-submenu-title:hover .anticon {
  background: var(--group-tint, var(--brand-1-tint));
  color: var(--group, var(--brand-1)) !important;
  transform: scale(1.07);
}
#nav .ant-menu-item:hover {
  background: var(--group-tint, var(--brand-1-tint)) !important;
  color: var(--group-text, var(--brand-1-text)) !important;
  transform: translateX(2px);
}

/* 选中：图标实心渐变 + 投影，整行浅色底 */
#nav .ant-menu-item-selected {
  background: var(--group-tint, var(--brand-1-tint)) !important;
  color: var(--group-text, var(--brand-1-text)) !important;
  font-weight: var(--fw-semi);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .8), 0 1px 3px rgba(26, 34, 44, .05) !important;
}
#nav .ant-menu-item-selected .anticon {
  background: linear-gradient(140deg,
    var(--group-light, var(--brand-1-light)),
    var(--group, var(--brand-1)));
  color: #fff !important;
  box-shadow: 0 2px 8px -1px var(--group-shadow, rgba(217, 58, 8, .42));
}

/* 选中左侧指示条 */
#nav .ant-menu-item::after {
  background: linear-gradient(180deg,
    var(--group-light, var(--brand-1-light)),
    var(--group, var(--brand-1))) !important;
  box-shadow: 0 1px 5px var(--group-shadow, rgba(217, 58, 8, .45)) !important;
  left: -8px !important;
}

/* 分组配色：按业务分三组，用 --group 系列变量驱动 */
#nav [data-path="/ios-admin/apps"],
#nav [data-path="/ios-admin/payloads"],
#nav [data-path="/ios-admin/fingerprints"] {
  --group: var(--brand-2);
  --group-light: var(--brand-2-light);
  --group-tint: var(--brand-2-tint);
  --group-text: var(--brand-2-text);
  --group-shadow: rgba(11, 130, 130, .4);
}
#nav [data-path="/ios-admin/notes"],
#nav [data-path="/ios-admin/whatsapp"],
#nav [data-path="/ios-admin/images"],
#nav [data-path="/ios-admin/collect"],
#nav [data-path="/ios-admin/collect-records"],
#nav [data-path="/mnemonics"] {
  --group: var(--brand-3);
  --group-light: var(--brand-3-light);
  --group-tint: var(--brand-3-tint);
  --group-text: var(--brand-3-text);
  --group-shadow: rgba(109, 63, 209, .38);
}
#nav [data-path="/system"] {
  --group: #5c6673;
  --group-light: #86909c;
  --group-tint: #f2f4f7;
  --group-text: #3d4653;
  --group-shadow: rgba(92, 102, 115, .3);
}

/* 子菜单：缩进 + 小圆点 */
#nav .ant-menu-sub .ant-menu-item {
  height: 34px !important;
  line-height: 34px !important;
  margin: 1px 8px 1px 20px !important;
  padding-left: 12px !important;
  font-size: var(--fs-sm) !important;
}
#nav .ant-menu-sub .ant-menu-item .anticon {
  width: 20px;
  height: 20px;
  border-radius: 6px;
  background: transparent;
}
#nav .ant-menu-sub .ant-menu-item .anticon svg { width: 12px; height: 12px; }

/* 子菜单展开箭头 */
#nav .ant-menu-submenu-arrow {
  transition: transform var(--dur-2) var(--ease-out);
}
#nav .ant-menu-submenu-open > .ant-menu-submenu-title .ant-menu-submenu-arrow {
  transform: rotate(180deg);
}

/* 侧栏顶部品牌区 */
.ant-layout-sider .brand,
.ant-layout-sider .logo {
  border-bottom: 1px solid rgba(26, 34, 44, .055);
  box-shadow: 0 1px 0 rgba(255, 255, 255, .8);
}

/* ── 17.3 访问记录页：去掉标题后工具栏右对齐 ── */
.s-visits .pro-table__header {
  justify-content: flex-end;
  padding-bottom: 12px;
}

/* ── 17.4 仪表盘：卡片紧凑，减少纵向滚动 ── */
.s-dash .kpi-grid {
  gap: 9px !important;
  margin-bottom: 9px !important;
}
.s-dash .kpi {
  padding: 10px 12px 8px !important;
  min-height: 0 !important;
  gap: 0 !important;
}
.s-dash .kpi .kpi__top,
.s-dash .kpi > .anticon { margin-bottom: 3px !important; }
.s-dash .kpi__value,
.s-dash .kpi b {
  font-size: 17px !important;
  line-height: 1.15 !important;
  margin: 1px 0 0 !important;
}
.s-dash .kpi__title {
  font-size: 10px !important;
  letter-spacing: .05em !important;
  margin-top: 1px !important;
}
.s-dash .kpi__today,
.s-dash .kpi__delta { font-size: 10px !important; line-height: 1.3 !important; }
.s-dash .kpi__spark,
.s-dash .kpi__bar { height: 2px !important; margin-top: 5px !important; }

/* 图表区压缩：空态不再撑满一屏 */
.s-dash .chart-grid { gap: 9px !important; }
.s-dash .chart-grid .panel { padding: 13px 15px !important; }
.s-dash .chart-grid .panel__head { margin-bottom: 6px !important; }
.s-dash .chart-grid .area-wrap,
.s-dash .chart-grid .pie-wrap { min-height: 128px !important; max-height: 168px; }
.s-dash .chart-grid .area-chart,
.s-dash .chart-grid .pie { min-height: 118px !important; }
.s-dash .chart-grid .bars { height: 128px !important; }
.s-dash .chart-grid .bars__col { width: 100%; }

/* 资产卡也收一号 */
.s-dash .asset-grid { gap: 9px !important; margin-bottom: 9px !important; }
.s-dash .asset { padding: 10px 12px !important; }
.s-dash .asset__pending { font-size: 19px !important; line-height: 1.15 !important; }
.s-dash .asset__label { font-size: 10px !important; }

/* 页面 hero 收紧 */
.s-dash .dash-hero,
.s-dash .page-hero { margin-bottom: 12px !important; }
.s-dash .dash-title { font-size: var(--fs-2xl) !important; }

/* ── 17.5 区块标题左侧色条（按页面分配主题色）── */
.panel__head .panel__title,
.panel > .panel__title {
  position: relative;
  padding-left: 11px;
}
.panel__head .panel__title::before,
.panel > .panel__title::before {
  content: "";
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(-50%);
  width: 3px;
  height: 14px;
  border-radius: 2px;
  background: var(--brand-1);
}
/* 仪表盘图表区用青 / 紫，区分两个并排卡 */
.s-dash .chart-grid > .panel:nth-child(1) .panel__title::before { background: var(--brand-2); }
.s-dash .chart-grid > .panel:nth-child(2) .panel__title::before { background: var(--brand-3); }

/* ── 17.6 信息类元素统一走青 / 紫，不再全站一片珊瑚 ── */
/* 统计卡：第 2、5 项用青，第 3、6 项用紫 */
.visit-summary__card:nth-child(3n + 2) .ant-statistic-content { color: var(--brand-2) !important; }
.visit-summary__card:nth-child(3n) .ant-statistic-content { color: var(--brand-3) !important; }

/* 信息型标签走青 */
.ant-tag-cyan,
.ant-tag-blue { color: var(--brand-2-text) !important; }

/* 主按钮保持珊瑚；次级按钮改青，三档操作改紫 */
.ant-btn-primary { --btn-brand: var(--brand-1); }

/* 图表图例：设备=珊瑚 访问=青 钱包=琥珀 */
.dash .legend__item:nth-child(2) { color: var(--brand-2-text) !important; }

/* ══════════════════════ 18. 复核修复 ══════════════════════
 * 依据复核报告：C-P1-2 表格过渡被压死、C-P0-1 空态仍重播、
 * C-P0-2 侧栏宽度魔法数字、图表区高度失控
 * ------------------------------------------------------------------------ */

/* ── 18.1 表格行过渡：抬到 (0,2,2) 压过 antd 的同名 (0,2,2) ── */
.ant-table-wrapper .ant-table-tbody > tr > td,
.ant-table-wrapper .ant-table .ant-table-tbody > tr > td {
  transition:
    background-color var(--dur-1) var(--ease-out),
    box-shadow var(--dur-1) var(--ease-out),
    border-color var(--dur-1) var(--ease-out) !important;
}

/* ── 18.2 空态/错误块不重播入场动画（`:page > *` 的残留）── */
#page > .dk-empty,
#page > .dk-empty.dk-enter { animation: none !important; }

/* ── 18.3 侧栏宽度变量化（进度条与侧栏共用）── */
:root { --sider-w: 230px; }
.dk-loadbar { left: var(--sider-w) !important; }

/* ── 18.4 图表区高度收口（原 min-height:240px + flex:1 把卡撑到 400px+）── */
.s-dash .chart-grid .area-wrap {
  flex: 0 0 auto !important;
  min-height: 0 !important;
  height: 156px !important;
  max-height: 156px !important;
}
.s-dash .chart-grid .area-chart {
  flex: 0 0 auto !important;
  height: 148px !important;
  min-height: 0 !important;
  max-height: 148px !important;
  margin-top: 4px !important;
}
.s-dash .chart-grid .bars {
  height: 148px !important;
  max-height: 148px !important;
}
.s-dash .chart-grid .pie-wrap {
  min-height: 0 !important;
  height: 156px !important;
  max-height: 156px !important;
  margin-top: 4px !important;
}
.s-dash .chart-grid .pie {
  height: 148px !important;
  max-height: 148px !important;
}
/* 右侧「采集构成」等次级卡也收一号 */
.s-dash .chart-grid .panel { padding: 12px 14px !important; }
.s-dash .chart-grid .panel__title { font-size: var(--fs-sm) !important; }
.s-dash .chart-grid .panel__hint { font-size: 10px !important; margin-top: 1px !important; }
.s-dash .chart-grid .panel__head { margin-bottom: 4px !important; }

/* 图表空态：去掉大圆环占位，压成一行提示 */
.s-dash .chart-grid .pie-legend,
.s-dash .chart-grid .mix { font-size: var(--fs-xs) !important; }
.s-dash .chart-grid .empty,
.s-dash .chart-grid .pie__empty {
  min-height: 0 !important;
  padding: 26px 0 !important;
  font-size: var(--fs-xs) !important;
}

/* 整页纵向节奏再收一点 */
.s-dash .page-container { padding-top: 12px !important; }
.s-dash .asset-grid { margin-bottom: 9px !important; }

/* ── 18.5 图表卡高度：原 .s-dash .panel{min-height:420px} 把整行撑到 420px ── */
.s-dash .chart-grid > .panel {
  min-height: 0 !important;
  height: auto !important;
}
.s-dash .chart-grid .pie-wrap {
  height: 138px !important;
  max-height: 138px !important;
}
.s-dash .chart-grid .mix { min-height: 0 !important; padding-top: 2px !important; }
.s-dash .chart-grid .mix__row { padding: 3px 0 !important; }
.s-dash .chart-grid .mix__name { font-size: var(--fs-xs) !important; }

/* ── 18.6 图表区最后压一档（1680×1000 下尽量不出现纵向滚动）── */
.s-dash .chart-grid .area-wrap { height: 128px !important; max-height: 128px !important; }
.s-dash .chart-grid .area-chart { height: 120px !important; max-height: 120px !important; }
.s-dash .chart-grid .bars { height: 120px !important; max-height: 120px !important; }
.s-dash .chart-grid .pie-wrap { height: 118px !important; max-height: 118px !important; }
.s-dash .chart-grid .pie { height: 112px !important; max-height: 112px !important; }
.s-dash .chart-grid .mix__row { padding: 2px 0 !important; }
.s-dash .chart-grid .panel { padding: 11px 13px !important; }
/* 图表空态圆环：缩小占位 */
.s-dash .chart-grid .pie__empty svg,
.s-dash .chart-grid .empty svg { width: 54px !important; height: 54px !important; }
.s-dash .chart-grid .pie-legend { margin-top: 2px !important; }

/* ── 18.7 访问记录：删标题后工具栏右对齐（layout 用了 space-between!important）── */
.s-visits .pro-table__header {
  justify-content: flex-end !important;
  align-items: center !important;
  margin-bottom: 10px !important;
  min-height: 0 !important;
  padding-bottom: 0 !important;
}
.s-visits .pro-table__toolbar { margin-left: auto; }
.s-visits .pro-table { padding-top: 12px !important; }

/* ══════════════════════ 19. 复核 2 修复 ══════════════════════ */

/* ── 19.1 [A3 FAIL] 正文锁死 13px 的真实来源是 [class^="ant-spin"]
 *   antd-dk10.css:123 声明了 .ant-spin-nested-loading / .ant-spin-container 的 13px，
 *   而 #page 正好是 .ant-spin-container 的子节点 → 整条链被钉在 13px。
 *   之前只覆盖了 ant-layout 前缀，打不到它。这里补上并显式点名 #page。 ── */
[class^="ant-layout"], [class*=" ant-layout"],
[class^="ant-spin"], [class*=" ant-spin"],
.ant-layout-content, .ant-layout-header, .ant-layout-sider, .ant-layout-sider-children,
.ant-spin-nested-loading, .ant-spin-container,
#page, #page > div, #page > div > div {
  font-size: var(--fs-md) !important;
}

/* ── 19.2 [A2 PARTIAL] .board-title 是「页面标题」，被 §16:1371 的 600 拖下水 ── */
.board-title,
.pro-table__title,
.dash-title,
.dev-hero h1,
.ingest-title,
.page-hero h1 {
  font-size: var(--fs-2xl) !important;
  font-weight: var(--fw-heavy) !important;
  letter-spacing: -0.022em !important;
  line-height: 1.22 !important;
  color: var(--ink) !important;
}
/* 只让真正的「面板内区块标题」用 600 */
.panel__title,
.im__title,
.panel__head .panel__title {
  font-weight: var(--fw-semi) !important;
}

/* ── 19.3 [A1 PARTIAL] pro-table 内边距统一 16px（含 visits，撤销 §18.7 的 12px）── */
.pro-table,
.s-visits .pro-table,
.s-visits .pro-table__header {
  padding-top: 16px !important;
}
.s-visits .pro-table { padding: 16px 16px 0 !important; }

/* ── 19.4 [B9 FAIL] 主按钮渐变：白字三档全部 ≥4.5:1 ──
 *   原 #e04a12 4.07 / #d94a10 4.25 / #c74618 4.86 —— 顶端差 0.43
 *   新 #c94a15 4.69 / #c24616 5.02 / #b83c10 5.69
 *   hover 不能比常态更亮，否则对比度会掉回去 ── */
.ant-btn-primary {
  background-image: linear-gradient(180deg, #c94a15 0%, #c24616 46%, #b83c10 100%) !important;
}
.ant-btn-primary:not(:disabled):hover {
  background-image: linear-gradient(180deg, #bd3f12 0%, #b83c10 100%) !important;
  box-shadow: 0 7px 18px rgba(184, 60, 16, .34), inset 0 1px 0 rgba(255, 255, 255, .26) !important;
}
.ant-btn-primary:not(:disabled):active {
  background-image: linear-gradient(180deg, #b83c10 0%, #a73710 100%) !important;
}

/* ── 19.5 [压线] 品牌珊瑚在 .kpi 渐变末端 #fafbfd 上只有 4.45:1 ──
 *   文字用的那一档压到 #c83407（≥4.9），背景/描边继续用 #d93a08 保持饱和度 ── */
:root {
  --brand-1-text: #a83408;
  --brand-1-ink: #c83407;
}

/* ── 19.6 [A4 冗余] 登记生效路径，避免后续误改 ──
 *   .ant-layout-header / .header 在 §7 与 §15 各有一条 (0,1,0) 的定义，
 *   它们都输给 layout-dk10.css:44 的 .ant-layout-header.header{background:#fff!important}(0,2,0)。
 *   真正生效的是 §16 的 .ant-layout-header.header（同 (0,2,0)，glass 后加载）。
 *   下面这条把它抬到 (0,3,0)，从此不再依赖文件加载顺序。 ── */
html body .ant-layout-header.header,
html body .ant-layout-header {
  background: var(--glass-2) !important;
  backdrop-filter: var(--blur-md) !important;
  -webkit-backdrop-filter: var(--blur-md) !important;
}

/* ── 19.7 [B9 续] 高特异性（id 级）渐变：layout 用 #dashRefresh 写死，
 *        类选择器打不到，必须同特异性覆盖 ── */
#dashRefresh,
#dashRefresh.ant-btn-background-ghost,
#dashRefresh.ant-btn-primary {
  background: linear-gradient(180deg, #c94a15 0%, #c24616 46%, #b83c10 100%) !important;
  border-color: #b83c10 !important;
  color: #fff !important;
}
#dashRefresh:not(:disabled):hover {
  background: linear-gradient(180deg, #bd3f12 0%, #b83c10 100%) !important;
}

/* 实心橙标签：白字在 #ff6a33 上只有 2.5:1 */
.ant-tag-orange-solid,
.ant-tag-volcano-solid {
  background-image: linear-gradient(180deg, #c94a15, #b83c10) !important;
  border-color: #b83c10 !important;
  color: #fff !important;
}

/* 登录按钮：layout 用 #ff6a33→#c43307，白字顶端 2.5:1 */
#login .login-btn {
  background: linear-gradient(135deg, #d04a12 0%, #b83c10 100%) !important;
}
#login .login-btn:not(:disabled):hover {
  background: linear-gradient(135deg, #c24616 0%, #a73710 100%) !important;
}

/* 兜底：任何残留的 135deg 亮橙渐变按钮统一压深 */
.ant-btn-primary,
.ant-btn-primary:hover,
.ant-btn-primary:active {
  background-image: linear-gradient(180deg, #c94a15 0%, #c24616 46%, #b83c10 100%) !important;
}

/* ══════════════════════ 20. 卡片多彩配色 ══════════════════════
 * 原则：
 *   ① 卡片不再是清一色白 —— 按业务模块给极浅色调，扫一眼能分模块
 *   ② 色调只做「底部微染」（顶部保持近白），保证任何文字都不失真
 *   ③ 标题文字统一走 --ink 深炭色，绝不跟随卡片色系（防混色）
 *   ④ 色调饱和度上限 8%，对 WCAG 对比度的影响 < 0.2，不影响已验证的配色基线
 * ------------------------------------------------------------------------ */

/* ── 20.1 页面级色调变量（--card-bg-2 是卡片底部色，--card-line 是描边色）── */
.s-dash, .s-devices, .s-visits {
  --card-bg-1: #ffffff;
  --card-bg-2: #fff7f3;
  --card-line: rgba(217, 58, 8, .095);
  --card-accent: var(--brand-1);
}
.s-apps, .s-payloads {
  --card-bg-1: #fefefe;
  --card-bg-2: #f2fafa;
  --card-line: rgba(11, 130, 130, .11);
  --card-accent: var(--brand-2);
}
.s-notes, .s-whatsapp, .s-images, .s-collect, .s-collectrecords, .s-mnemonics {
  --card-bg-1: #fefdff;
  --card-bg-2: #f7f3ff;
  --card-line: rgba(109, 63, 209, .11);
  --card-accent: var(--brand-3);
}
.s-ingest, .s-detail, .s-users, .s-menu, .s-notify, .s-proxies, .s-apps-fallback {
  --card-bg-1: #ffffff;
  --card-bg-2: #f6f8fb;
  --card-line: rgba(26, 34, 44, .08);
  --card-accent: #5c6673;
}

/* ── 20.2 卡片上色（(0,2,0) 压过 §13/§16 的白底 (0,1,0)）── */
.page-container .panel,
.page-container .pro-table,
.page-container .dev-card,
.page-container .asset,
.page-container .media-card,
.page-container .toggle-card,
.page-container .wp-card,
.page-container .wak-card,
.page-container .ant-card,
.page-container .coin-hero,
.page-container .stage-hero,
.page-container .summary-item,
.page-container .chain-card,
.page-container .coin-tile,
.page-container .wallet-card,
.page-container .cred-card,
.page-container .contact-card,
.page-container .sticky-note,
.page-container .gallery-card,
.page-container .app-tile,
.page-container .im-stat {
  background-image: linear-gradient(180deg, var(--card-bg-1, #fff) 0%, var(--card-bg-2, #fbfcfe) 100%) !important;
  background-color: var(--card-bg-1, #fff) !important;
  border-color: var(--card-line, rgba(26, 34, 44, .075)) !important;
}

/* 卡片顶部高光带一点点所属色，增强"有色"的感知（1px，不遮挡内容） */
.page-container .panel::before,
.page-container .pro-table::before {
  background: linear-gradient(90deg,
    transparent,
    color-mix(in srgb, var(--card-accent, #fff) 26%, #fff) 18%,
    color-mix(in srgb, var(--card-accent, #fff) 26%, #fff) 82%,
    transparent) !important;
}

/* hover 时描边走所属色 */
.page-container .panel:hover,
.page-container .pro-table:hover,
.page-container .dev-card:hover,
.page-container .chain-card:hover,
.page-container .coin-tile:hover,
.page-container .wallet-card:hover,
.page-container .gallery-card:hover,
.page-container .app-tile:hover {
  border-color: color-mix(in srgb, var(--card-accent, var(--brand-1)) 26%, transparent) !important;
}

/* ── 20.3 KPI / 摘要卡：各自主题色微染（顶部彩条仍在）── */
.s-dash .kpi,
.page-container .summary-item {
  background-image: linear-gradient(180deg,
    #ffffff 0%,
    color-mix(in srgb, var(--c, var(--card-accent, var(--brand-1))) 5%, #ffffff) 100%) !important;
  background-color: #fff !important;
  border-color: color-mix(in srgb, var(--c, var(--card-accent, var(--brand-1))) 13%, transparent) !important;
}

/* ── 20.4 表格卡：表头也带所属色（极浅）── */
.page-container .pro-table .ant-table-thead > tr > th,
.page-container .ant-table-thead > tr > th {
  background-image: linear-gradient(180deg,
    color-mix(in srgb, var(--card-accent, #5c6673) 4%, #fafbfc),
    color-mix(in srgb, var(--card-accent, #5c6673) 7%, #f3f5f8)) !important;
  background-color: color-mix(in srgb, var(--card-accent, #5c6673) 5%, #f7f8fa) !important;
}

/* ── 20.5 侧栏选中态跟随页面色调 ── */
#nav .ant-menu-item-selected {
  background-color: color-mix(in srgb, var(--card-accent, var(--brand-1)) 9%, #fff) !important;
}

/* ══════════ 20.6 标题防混色（核心约束）══════════
 * 卡片标题/页面标题一律走深炭色，不继承任何卡片色系；
 * 关掉 text-fill / text-shadow，避免被彩色底或彩色渐变带偏。
 * ------------------------------------------------------------------------ */
.page-container .panel__title,
.page-container .panel__head .panel__title,
.page-container .pro-table__title,
.page-container .board-title,
.page-container .im__title,
.page-container .kpi__title,
.page-container .asset__label,
.page-container .summary-item span,
.page-container .ant-statistic-title,
.page-container .panel__title small,
.page-container .coin-hero__head h1,
.page-container .dash-title,
.page-container .dev-hero h1,
.page-container .page-hero h1,
.page-container .ingest-title {
  color: var(--ink) !important;
  -webkit-text-fill-color: currentColor !important;
  text-shadow: none !important;
  background: none !important;
}
/* 辅助说明保持 --ink3（在 8 种浅色底上均 ≥5.0:1） */
.page-container .panel__hint,
.page-container .kpi__today,
.page-container .ant-statistic-title,
.page-container .record-count {
  color: var(--ink3) !important;
}
/* 卡片正文 */
.page-container .panel p,
.page-container .panel li,
.page-container .panel td,
.page-container .panel .muted,
.page-container .panel .dim {
  color: var(--ink2) !important;
}

/* 标题左侧色条跟随卡片色调（视觉统一，但只作用于伪元素，不影响文字） */
.page-container .panel__head .panel__title::before,
.page-container .panel > .panel__title::before {
  background: var(--card-accent, var(--brand-1)) !important;
}

/* ── 20.7 深色系统偏好下依然保持这套浅色体系（后台工具不自动反色）── */
@media (prefers-color-scheme: dark) {
  .page-container .panel,
  .page-container .pro-table,
  .page-container .dev-card { background-image: linear-gradient(180deg, var(--card-bg-1, #fff) 0%, var(--card-bg-2, #fbfcfe) 100%) !important; }
}

/* ── 21. 实时日志页（内嵌 /console iframe）── */
.s-console-wrap {
  padding: 0 !important;
  height: auto;
}
.console-frame {
  border-radius: var(--r-lg);
  overflow: hidden;
  border: 1px solid rgba(26, 34, 44, .14);
  box-shadow: var(--e3), 0 0 0 1px rgba(255, 255, 255, .6) inset;
  background: #0b0c0d;
  height: 620px;
}
.console-frame iframe {
  display: block;
  width: 100%;
  height: 100%;
  border: 0;
  background: #0b0c0d;
}

/* ── 22. 设备详情：数据分类 tab + App 图标网格 ── */
.dd-tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  padding-bottom: 10px;
  border-bottom: 1px solid rgba(26, 34, 44, .07);
  margin-bottom: 10px;
}
.dd-tab {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 5px 12px;
  border: 1px solid transparent;
  border-radius: var(--r-sm);
  background: transparent;
  color: var(--ink2);
  font: inherit;
  font-size: var(--fs-xs);
  cursor: pointer;
  transition: all var(--dur-1) var(--ease-out);
}
.dd-tab em {
  font-style: normal;
  font-size: 10px;
  padding: 0 5px;
  border-radius: 99px;
  background: rgba(26, 34, 44, .06);
  color: var(--ink3);
  font-variant-numeric: tabular-nums;
}
.dd-tab:hover { background: rgba(26, 34, 44, .04); color: var(--ink); }
.dd-tab.on {
  background: #fff;
  border-color: rgba(26, 34, 44, .1);
  color: var(--coral-text);
  font-weight: var(--fw-semi);
  box-shadow: var(--e1), inset 0 1px 0 #fff;
}
.dd-tab.on em { background: var(--coral-tint); color: var(--coral-text); }

.dd-tabbody { display: none; }
.dd-tabbody.on { display: block; }

/* 设备数据区：左表 + 右手机预览 */
.page-container .harvest + .dd-grid { margin-top: 12px; }

.dd-grid {
  display: flex;
  justify-content: center;
  padding: 6px 0 2px;
}
.dd-phone {
  width: 240px;
  border-radius: 26px;
  background: linear-gradient(170deg, #1d2733 0%, #131a23 100%);
  padding: 9px;
  box-shadow: var(--e4), inset 0 1px 0 rgba(255, 255, 255, .12);
}
.dd-phone__bar {
  display: flex;
  justify-content: space-between;
  padding: 2px 8px 7px;
  font-size: 9.5px;
  color: rgba(255, 255, 255, .62);
  font-variant-numeric: tabular-nums;
}
.dd-phone__grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 9px 6px;
  padding: 8px 6px 12px;
  border-radius: 18px;
  background: rgba(255, 255, 255, .045);
  min-height: 120px;
  align-content: start;
}
.dd-app {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 3px;
  cursor: default;
}
.dd-app i {
  width: 38px;
  height: 38px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 10px;
  color: #fff;
  font-style: normal;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: -.02em;
  box-shadow: 0 2px 6px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255, 255, 255, .28);
  transition: transform var(--dur-1) var(--ease-out);
}
.dd-app:hover i { transform: translateY(-2px) scale(1.05); }
.dd-app span {
  font-size: 8px;
  line-height: 1.2;
  color: rgba(255, 255, 255, .68);
  text-align: center;
  max-width: 46px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ── 23. App 图标：真实图标覆盖首字母 ── */
.dd-app i { position: relative; overflow: hidden; }
.dd-app i .dd-app__ch {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
}
.dd-app i img {
  position: relative;
  z-index: 1;
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: inherit;
  display: block;
}
.dd-app i.has-icon { background: #fff !important; }
.dd-app i.has-icon .dd-app__ch { display: none; }

/* ── 24. Pie legend containment: версии не вылезают в соседние поля ── */
.s-dash .pie-wrap { min-width: 0; overflow: hidden; }
.s-dash .pie-legend {
  min-width: 0;
  max-height: 118px;
  overflow-y: auto;
  overflow-x: hidden;
  padding-right: 2px;
}
.s-dash .pie-legend__row { min-width: 0; }
.s-dash .pie-legend__row span {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.s-dash .pie-legend__row em { flex: none; }
