/* ============================================================
   糖哥盯盘数据库 — 交易所级设计系统
   单色冷调 · 纯黑画布 · 唯一色彩来自行情涨跌
   ============================================================ */

:root {
  /* ---- 全站字号缩放(糖哥 2026-09-02:用户反馈「网站字体太小」)----
     实测线上:字号**完全不随屏幕变化**(1280 到 2560 每个值一模一样),
     49% 的文字小于 12px、中位数 12px、最小 8px —— 在现代 Web 上确实偏小
     (主流正文 14~16px)。糖哥在大屏上开发,所以一直没觉出来。

     做法:全站 `font-size: Npx` 统一改成 `calc(Npx * var(--sv-font-scale))`。
     · 纯机械替换,scale=1 时与改造前**逐像素相同**,出问题把这一个值调回 1 即可全量回退;
     · 只缩放字号,不动 padding/margin/宽高 —— 布局骨架保持原样;
     · 行高站内 281 处是无单位倍数、只有 10 处写死 px,所以行高自动跟着字号走。
     分档取值与「版心三档」同形态:窄屏少放(本来就挤)、大屏多放。
     ⚠️ 用户可在「图表设置 → 界面字号」里覆盖它,那条走 :root 内联样式,优先级更高。 */
  --sv-font-scale: 1.08;

  color-scheme: dark;
  /* ---- Surfaces (true-black exchange canvas) ---- */
  --bg-core: #000000;
  --bg-panel: #08090c;
  --bg-tertiary: #101217;
  --bg-elevated: #16181f;
  --bg-card: rgba(16, 18, 23, 0.72);
  --bg-glass: rgba(8, 9, 12, 0.72);
  --header-bg: rgba(0, 0, 0, 0.66);
  --grid-line: rgba(255, 255, 255, 0.035);
  --hair-stroke: rgba(255, 255, 255, 0.09);
  --screen-bg: linear-gradient(180deg, rgba(20, 22, 28, 0.9), rgba(8, 9, 12, 0.9));

  /* ---- Monochrome accent (white is the brand) ---- */
  --accent: #f4f5f7;
  --accent-contrast: #1c2530; /* accent 底上的文字色:暗色主题浅底配深字 */
  --accent-soft: rgba(255, 255, 255, 0.07);
  --accent-line: rgba(255, 255, 255, 0.16);
  /* one cold interactive tint, used in tiny doses */
  --ice: #6ea8fe;
  --ice-soft: rgba(110, 168, 254, 0.12);

  /* ---- Market data colors (the only real color) ----
     以「原始绿/红」为色源,--up/--down 只是语义映射。
     默认(西方/国际惯例)绿涨红跌;东亚模式 :root[data-cc="east"] 把映射对调成红涨绿跌。
     主题只需改 --rise-green / --fall-red 的色值,下游 var(--up)/var(--down) 全部零改动。 */
  --rise-green: #2ebd85;
  --rise-green-soft: rgba(46, 189, 133, 0.12);
  --fall-red: #f6465d;
  --fall-red-soft: rgba(246, 70, 93, 0.12);
  --up: var(--rise-green);
  --up-soft: var(--rise-green-soft);
  --down: var(--fall-red);
  --down-soft: var(--fall-red-soft);
  --warn: #f0b90b;
  --warn-soft: rgba(240, 185, 11, 0.12);

  /* ---- Text ---- */
  --text-main: #f4f5f7;
  --text-secondary: #b0b4bd;
  --text-muted: #71757f;
  --text-disabled: #40434b;

  /* 这四个变量此前从未定义,却被 40 处 var(--x, rgba(255,255,255,.0x)) 引用 —— 一直在吃
     写死的白色回退值。深色下碰巧看着对,浅色下白色叠白底全部隐形:边框看不见(糖哥
     2026-08-09 报策略卡片没边框)、hover 没反馈、凹陷块与背景融成一片。
     深色一律取各处最常用的原回退值,保证深色零变化;浅色给对应的深色调。 */
  --bg-sunken: rgba(255, 255, 255, 0.05);
  --bg-hover: rgba(255, 255, 255, 0.05);
  --surface-soft: rgba(255, 255, 255, 0.04);

  /* ---- Lines ---- */
  --line: rgba(255, 255, 255, 0.08);
  --line-soft: rgba(255, 255, 255, 0.07);
  --line-strong: rgba(255, 255, 255, 0.15);

  /* ---- Shadows ---- */
  --shadow-soft: 0 8px 40px rgba(0, 0, 0, 0.6);
  --shadow-lift: 0 20px 60px rgba(0, 0, 0, 0.7);

  /* ---- Type ---- */
  --font-display: 'Archivo', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  --font-body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  --font-mono: 'JetBrains Mono', 'SF Mono', 'Space Mono', Monaco, monospace;

  /* ---- Radius (sharp / institutional) ---- */
  --radius-sm: 2px;
  --radius-md: 4px;
  --radius-lg: 6px;
  --radius-xl: 10px;

  /* ---- Motion ---- */
  --transition-fast: 120ms cubic-bezier(0.4, 0, 0.2, 1);
  --transition-normal: 200ms cubic-bezier(0.4, 0, 0.2, 1);
  --transition-slow: 320ms cubic-bezier(0.16, 1, 0.3, 1);

  /* ---- Legacy aliases (keep older pages from breaking) ---- */
  --accent-cyan: var(--accent);
  --accent-cyan-soft: var(--accent-soft);
  --accent-blue: var(--ice);
  --accent-ice: var(--ice);
  --accent-mint: var(--up);
  --accent-violet: var(--ice);
  --accent-silver: var(--text-secondary);
  --accent-purple: var(--ice);
  --accent-purple-soft: var(--ice-soft);
  --accent-pink: var(--text-secondary);
  --accent-green: var(--up);
  --accent-red: var(--down);
  --warn-amber: var(--warn);
  --up-green: var(--up);
  --down-red: var(--down);
  --bg-primary: var(--bg-core);
  --bg-secondary: var(--bg-panel);
  --border-soft: var(--line-soft);
  --border-strong: var(--line-strong);
  --border-medium: var(--line-strong);
  --text-primary: var(--text-main);
  --accent-yellow: var(--warn);
  --font-sans: var(--font-body);

  /* ---- 版心宽度(糖哥 2026-08-24:「网站要自适应屏幕的分辨率,让网站在每个用户的屏幕上显得协调」)----
     此前每个页面各写各的上限:1080/1280/1300/1320/1400/900 六种并存,页面之间一跳一变宽,
     而且全部是死数 —— 1920 屏两边各空 300px,2560 屏各空 620px,内容缩在中间一条。
     改成一套变量,按屏幕分档放宽:留白始终保持在 7%~10% 这个看着舒服的比例,
     内容也不至于无限拉长(一行扫太宽同样难读),所以最宽收在 2160。
     只调宽度,不动字号 —— 全站 8600 处写死 px、零 rem,缩放字号会当场把布局撕开。
     --read-max 是纯阅读版心(文库/条款正文),它跟着放宽只会让人更难读,所以单独一档。 */
  --page-max: 1320px;
  --page-narrow: 1320px;
  --page-gut: 32px;
  --read-max: 900px;
}

/* 三档版心,按"这一页是拿来干什么的"分,而不是一刀切:
   --page-max   数据密集页(行情表/信号/数据/推文/快讯):屏幕越宽越有用,一屏能多看几行几列。
   --page-narrow 营销与说明页(首页/定价/合作/下载):卡片和标题有它舒服的尺寸,
                 跟着屏幕一路拉宽只会把每张卡撑空、把标题拉散,所以只轻微跟一点。
   --read-max   纯阅读正文(文库/条款):一行超过约 90 个字就开始难读,收得最紧。 */
@media (min-width: 1600px) { :root { --page-max: 1460px; --page-narrow: 1380px; --page-gut: 40px; --read-max: 940px; } }
@media (min-width: 1920px) { :root { --page-max: 1640px; --page-narrow: 1440px; --page-gut: 48px; --read-max: 980px; } }
@media (min-width: 2400px) { :root { --page-max: 1880px; --page-narrow: 1520px; --page-gut: 56px; --read-max: 1020px; } }
@media (min-width: 3000px) { :root { --page-max: 2160px; --page-narrow: 1600px; --page-gut: 64px; --read-max: 1060px; } }

/* ============================================================
   可选涨跌配色 — 红涨绿跌(仅在用户明确选择 east 后启用)
   只翻转 --up/--down 的语义映射,颜色仍取自当前主题的绿/红色源,
   因此明暗主题都自动适配。全站首次打开默认不加此属性→绿涨红跌。
   ============================================================ */
:root[data-cc="east"] {
  --up: var(--fall-red);
  --up-soft: var(--fall-red-soft);
  --down: var(--rise-green);
  --down-soft: var(--rise-green-soft);
}

/* ============================================================
   LIGHT THEME — 只覆盖基础令牌,别名(var(--x))自动跟随
   ============================================================ */
/* ---- 蓝黑主题(navy,旧版 AICoin 式深蓝黑;糖哥 2026-07-16 要求) ---- */
:root[data-theme="navy"] {
  color-scheme: dark;
  --bg-core: #0c1526;
  --bg-panel: #101c30;
  --bg-tertiary: #142034;
  --bg-elevated: #182741;
  --bg-card: rgba(16, 26, 44, 0.78);
  --bg-glass: rgba(10, 16, 30, 0.74);
  --header-bg: rgba(9, 14, 26, 0.7);
  --grid-line: rgba(110, 168, 254, 0.05);
  --hair-stroke: rgba(148, 178, 255, 0.13);
  --screen-bg: linear-gradient(180deg, rgba(20, 30, 52, 0.92), rgba(10, 16, 30, 0.92));
}

:root[data-theme="light"] {
  color-scheme: light;
  /* surfaces */
  --bg-core: #ffffff;
  --bg-panel: #f6f7f9;
  --bg-tertiary: #eceef2;
  --bg-elevated: #ffffff;
  --bg-card: rgba(255, 255, 255, 0.92);
  --bg-glass: rgba(255, 255, 255, 0.72);
  --header-bg: rgba(255, 255, 255, 0.75);

  /* brand becomes dark → primary buttons flip to dark-on-white automatically */
  --accent: #0f1115;
  --accent-contrast: #ffffff; /* 白天 accent 是深底,文字翻白 */
  --accent-soft: rgba(15, 17, 21, 0.05);
  --accent-line: rgba(15, 17, 21, 0.16);
  --ice: #2f6bff;
  --ice-soft: rgba(47, 107, 255, 0.12);

  /* market data — slightly deepened for contrast on white
     只改绿/红色源,--up/--down 的映射沿用 :root(东亚翻转逻辑照常生效) */
  --rise-green: #0ea86a;
  --rise-green-soft: rgba(14, 168, 106, 0.12);
  --fall-red: #e5384f;
  --fall-red-soft: rgba(229, 56, 79, 0.12);
  --warn: #c98a00;
  --warn-soft: rgba(201, 138, 0, 0.12);

  /* text */
  --text-main: #0f1115;
  --text-secondary: #485162;
  --text-muted: #8a93a3;
  --text-disabled: #b7bec9;

  /* surfaces(见深色块注释:补齐从未定义、一直吃白色回退的四个变量) */
  --bg-sunken: rgba(15, 17, 21, 0.035);
  --bg-hover: rgba(15, 17, 21, 0.04);
  --surface-soft: rgba(15, 17, 21, 0.03);

  /* lines */
  --line: rgba(15, 17, 21, 0.10);
  --line-soft: rgba(15, 17, 21, 0.09);
  --line-strong: rgba(15, 17, 21, 0.16);

  /* shadows */
  --shadow-soft: 0 8px 30px rgba(15, 23, 42, 0.10);
  --shadow-lift: 0 20px 50px rgba(15, 23, 42, 0.14);

  /* theme-aware helpers */
  --grid-line: rgba(15, 17, 21, 0.05);
  --hair-stroke: rgba(15, 17, 21, 0.12);
  --screen-bg: linear-gradient(180deg, #ffffff, #f4f6f8);
}

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html { transition: background-color 0.3s ease; }

html {
  scroll-behavior: smooth;
  background-color: var(--bg-core); /* 移动端过卷回弹时露出的也是主题底色,不再白/黑闪 */
  overscroll-behavior-y: none;      /* 禁止上下拖动的橡皮筋空白屏 */
}

body {
  font-family: var(--font-body);
  background-color: var(--bg-core);
  color: var(--text-main);
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  font-feature-settings: 'tnum' 1, 'cv01' 1;
  transition: background-color 0.3s ease, color 0.3s ease;
}

::selection {
  background: var(--text-main);
  color: var(--bg-core);
}

a { color: inherit; }

.container {
  width: 100%;
  max-width: var(--page-max);
  margin: 0 auto;
  padding: 0 var(--page-gut);
}

/* Tabular figures everywhere numbers live */
.mono, .price-cell, .change-cell, .volume-cell, .stat-value {
  font-variant-numeric: tabular-nums;
}

/* ============================================================
   Ticker tape (full-width live strip)
   ============================================================ */
.ticker-tape {
  position: relative;
  z-index: 90;
  border-bottom: 1px solid var(--line-soft);
  background: var(--bg-core);
  overflow: hidden;
  white-space: nowrap;
}

.ticker-track {
  display: inline-flex;
  align-items: center;
  gap: 40px;
  padding: 9px 0;
  animation: ticker-scroll 42s linear infinite;
  will-change: transform;
}

.ticker-tape:hover .ticker-track { animation-play-state: paused; }

.ticker-item {
  display: inline-flex;
  align-items: baseline;
  gap: 8px;
  font-family: var(--font-mono);
  font-size: calc(12px * var(--sv-font-scale, 1));
  letter-spacing: 0.02em;
}

.ticker-item .t-sym { color: var(--text-secondary); font-weight: 600; }
.ticker-item .t-px { color: var(--text-main); font-weight: 500; }
.ticker-item .t-chg.up { color: var(--up); }
.ticker-item .t-chg.down { color: var(--down); }

@keyframes ticker-scroll {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}

/* ============================================================
   Global Header
   ============================================================ */
.global-header,
.header {
  position: sticky;
  top: 0;
  z-index: 100;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: 28px;
  min-height: 64px;
  padding: 0 32px;
  border-bottom: 1px solid var(--line-soft);
  background: var(--header-bg);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
}

.header-left {
  display: flex;
  align-items: center;
  gap: 16px;
}

.brand,
.logo {
  display: inline-flex;
  align-items: center;
  gap: 11px;
  text-decoration: none;
  color: inherit;
}

.brand-mark,
.logo-mark {
  width: 34px;
  height: 34px;
  display: grid;
  place-items: center;
  border: 1px solid var(--line-strong);
  background: var(--text-main);
  border-radius: var(--radius-sm);
  font-family: var(--font-display);
  font-size: calc(14px * var(--sv-font-scale, 1));
  font-weight: 800;
  color: var(--bg-core);
  letter-spacing: -0.02em;
  overflow: hidden;
}

/* logo image variant */
img.brand-mark,
img.logo-mark {
  object-fit: cover;
  background: none;
  border-radius: 9px;
  padding: 0;
}

.brand strong,
.logo-text h1 {
  display: block;
  font-family: var(--font-display);
  font-size: calc(15px * var(--sv-font-scale, 1));
  font-weight: 700;
  letter-spacing: -0.01em;
  line-height: 1.15;
}

.brand span span,
.logo-tag {
  display: block;
  margin-top: 2px;
  color: var(--text-muted);
  font-family: var(--font-mono);
  font-size: calc(10px * var(--sv-font-scale, 1));
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

.nav-links,
.nav {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 2px;
  min-width: 0;
  /* 导航项在西语系里明显更宽(德语 Startseite/Mitgliedschaft、葡语 Assinatura…),
     内容会超过栅格分给它的列宽。原先 overflow 可见 + justify-content:center,
     超出部分向**两侧**溢出,左边直接压在 logo 上(实测 de 溢出 124px、pt 79px、en 73px)。
     导航是全站入口:既不能压 logo,也不能把首项裁掉。三层处理:
     ① justify-content 用 safe center —— 空间够就居中,不够则退化为靠左起排,
        首项永远从容器左边缘开始、不会被推到容器外(这是 center 溢出的根治点);
     ② 横向滚动作为回落,极窄时仍能划到后面的项;
     ③ 西语系再收紧内边距与字距(见下方 html[lang] 规则),多数情况下根本不必滚。 */
  justify-content: safe center;
  overflow-x: auto;
  overflow-y: hidden;
  scrollbar-width: none;                  /* Firefox:滚动条不占高度 */
  -ms-overflow-style: none;
}
.nav-links::-webkit-scrollbar,
.nav::-webkit-scrollbar { height: 0; }    /* WebKit:同上 */

.nav-links > *,
.nav > * { flex: 0 0 auto; }
/* 导航项一律不换行(糖哥 2026-09-02「有的文字被挤成竖条」)。
   flex:0 0 auto 只挡住"被压缩",挡不住"在自身宽度内换行":CJK 没有词边界,
   任何一处宽度不足都能逐字断行 —— 实测日语「戦略」「提携」被断成 3 行竖条。
   nowrap 之后放不下就由上面那条 overflow-x 横向滚,与西语系同一套回落。 */
.nav-links > *,
.nav > *,
.nav-links a,
.nav-link { white-space: nowrap; }

/* 西语系(en/de/pt/es/fr)词更长:收紧导航内边距与字距,把整排装回列宽内。
   中日韩字窄,保持原有宽松间距。html[lang] 由 i18n 引擎按 BCP-47 写入。 */
:is(html[lang|="de"], html[lang|="pt"], html[lang|="en"], html[lang|="es"], html[lang|="fr"]) :is(.nav-links, .nav) a,
:is(html[lang|="de"], html[lang|="pt"], html[lang|="en"], html[lang|="es"], html[lang|="fr"]) .nav-link {
  padding-left: 8px;
  padding-right: 8px;
  font-size: calc(12.5px * var(--sv-font-scale, 1));
  letter-spacing: -0.01em;
}

.nav-links a,
.nav-link {
  padding: 8px 13px;
  color: var(--text-secondary);
  font-size: calc(13px * var(--sv-font-scale, 1));
  font-weight: 500;
  border-radius: var(--radius-sm);
  text-decoration: none;
  transition: color var(--transition-fast), background var(--transition-fast);
}

.nav-links a:hover,
.nav-link:hover {
  color: var(--text-main);
  background: var(--accent-soft);
}

.nav-links a.active,
.nav-link.active {
  color: var(--text-main);
  background: var(--accent-soft);
  box-shadow: inset 0 -2px 0 var(--text-main);
}

.header-actions {
  display: flex;
  align-items: center;
  gap: 10px;
}

.primary-action,
.ghost-action {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-sm);
  padding: 0 18px;
  font-size: calc(13px * var(--sv-font-scale, 1));
  font-weight: 600;
  white-space: nowrap;
  text-decoration: none;
  cursor: pointer;
  transition: all var(--transition-fast);
}

.primary-action {
  border: 1px solid var(--text-main);
  background: var(--text-main);
  color: var(--bg-core);
}

.primary-action:hover {
  filter: brightness(1.12);
  transform: translateY(-1px);
}

.ghost-action {
  border: 1px solid var(--line-strong);
  background: transparent;
  color: var(--text-secondary);
}

.ghost-action:hover {
  border-color: var(--text-main);
  color: var(--text-main);
}

/* 登录态徽章(api.js renderAuthBadge):未登录=醒目「登录」召唤;已登录=绿点+用户名 */
.ghost-action.auth-off {
  border-color: var(--warn, #f0b90b);
  color: var(--warn, #f0b90b);
  font-weight: 700;
}
.ghost-action.auth-off:hover { background: color-mix(in srgb, var(--warn, #f0b90b) 14%, transparent); }
.ghost-action.auth-on {
  display: inline-flex; align-items: center; gap: 6px;
  max-width: 132px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: var(--text-main);
}
.ghost-action.auth-on .auth-dot {
  flex: 0 0 auto; width: 7px; height: 7px; border-radius: 50%;
  background: var(--up, #2ebd85); box-shadow: 0 0 6px var(--up, #2ebd85);
}

/* ============================================================
   Buttons
   ============================================================ */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 0 18px;
  min-height: 44px;
  font-size: calc(13px * var(--sv-font-scale, 1));
  font-weight: 600;
  border-radius: var(--radius-sm);
  border: 1px solid transparent;
  cursor: pointer;
  transition: all var(--transition-fast);
  font-family: var(--font-body);
  text-decoration: none;
  white-space: nowrap;
}

.btn svg { transition: transform var(--transition-fast); }

.btn-primary {
  background: var(--text-main);
  color: var(--bg-core);
  border-color: var(--text-main);
}

.btn-primary:hover {
  filter: brightness(1.12);
  transform: translateY(-2px);
  box-shadow: var(--shadow-soft);
}

.btn-primary:hover svg { transform: translateX(3px); }

.btn-secondary {
  background: transparent;
  color: var(--text-secondary);
  border-color: var(--line-strong);
}

.btn-secondary:hover {
  border-color: var(--text-main);
  color: var(--text-main);
}

.btn-outline {
  background: transparent;
  color: var(--text-main);
  border-color: var(--line-strong);
}

.btn-outline:hover {
  border-color: var(--text-main);
  background: var(--accent-soft);
}

.btn-large {
  padding: 0 26px;
  min-height: 50px;
  font-size: calc(15px * var(--sv-font-scale, 1));
}

.btn-small {
  padding: 0 12px;
  min-height: 32px;
  font-size: calc(12px * var(--sv-font-scale, 1));
}

/* ============================================================
   Section headers
   ============================================================ */
.section-header {
  text-align: center;
  margin-bottom: 56px;
}

.section-label {
  display: inline-block;
  font-family: var(--font-mono);
  font-size: calc(11px * var(--sv-font-scale, 1));
  font-weight: 600;
  color: var(--text-muted);
  letter-spacing: 0.24em;
  text-transform: uppercase;
  margin-bottom: 18px;
}

.section-label::before {
  content: '';
  display: inline-block;
  width: 22px;
  height: 1px;
  background: var(--line-strong);
  vertical-align: middle;
  margin-right: 10px;
}

.section-title {
  font-family: var(--font-display);
  font-size: clamp(30px, 4vw, 46px);
  font-weight: 800;
  letter-spacing: -0.03em;
  line-height: 1.05;
  margin-bottom: 16px;
}

.section-description {
  font-size: calc(16px * var(--sv-font-scale, 1));
  color: var(--text-secondary);
  max-width: 620px;
  margin: 0 auto;
  line-height: 1.7;
}

/* ============================================================
   Badges
   ============================================================ */
.badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 26px;
  padding: 0 9px;
  font-size: calc(11px * var(--sv-font-scale, 1));
  font-weight: 600;
  border-radius: var(--radius-sm);
  font-family: var(--font-mono);
  letter-spacing: 0.02em;
  white-space: nowrap;
  border: 1px solid var(--line-soft);
  color: var(--text-secondary);
  background: var(--accent-soft);
}

.badge.signal {
  border-color: var(--line-strong);
  background: transparent;
  color: var(--text-main);
}

.badge.mover {
  border-color: rgba(240, 185, 11, 0.3);
  background: var(--warn-soft);
  color: var(--warn);
}

.badge.risk-low {
  border-color: rgba(46, 189, 133, 0.3);
  background: var(--up-soft);
  color: var(--up);
}

.badge.risk-mid {
  border-color: rgba(240, 185, 11, 0.3);
  background: var(--warn-soft);
  color: var(--warn);
}

.badge.risk-high {
  border-color: rgba(246, 70, 93, 0.32);
  background: var(--down-soft);
  color: var(--down);
}

/* ============================================================
   Footer
   ============================================================ */
.footer {
  border-top: 1px solid var(--line-soft);
  background: var(--bg-core);
  padding: 72px 0 32px;
  margin-top: 120px;
}

.footer-grid {
  display: grid;
  grid-template-columns: 1.5fr 2fr;
  gap: 64px;
  margin-bottom: 56px;
}

.footer-brand .logo { margin-bottom: 20px; }

.footer-description {
  color: var(--text-muted);
  font-size: calc(14px * var(--sv-font-scale, 1));
  line-height: 1.7;
  max-width: 380px;
}

.footer-links {
  display: grid;
  /* 2026-08-29 加「成长机会」后是 5 栏。首页页脚容器只有 68% 宽(右半幅留给火箭图),
     5 栏排不进一行。先试过 auto-fit,但它的列数随容器宽度跳变 —— 同一份页脚在
     1440 屏是 3+2、在 2K 屏可能是 4+1,排版不可控,所以写死列数。
     2026-09-02 再加「社区」「捐赠支持」后共 8 栏:3 列会排成 3+3+2 的三行,
     末行空两格、整块往左堆,看着散。改 4 列 → 稳定的 4+4 两行。
     ⚠️ minmax(0,1fr) 不能省:1fr 的最小尺寸跟着内容走,长条目会把列撑破挤出容器
     (画线面板刚栽过同一个坑)。 */
  grid-template-columns: repeat(4, minmax(0, 1fr));
  row-gap: 36px;
  gap: 32px;
}

.footer-column h4 {
  font-family: var(--font-mono);
  font-size: calc(11px * var(--sv-font-scale, 1));
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  margin-bottom: 18px;
  color: var(--text-muted);
}

/* 捐赠按钮并进这条:它是 <button> 而非 <a>,不一起写就会带着浏览器默认的
   按钮边框/背景/字体杵在一列链接中间,一眼看出是"外来户"(糖哥「形态永不豁免」)。 */
.footer-column a,
.footer-column span,
.footer-column .footer-donate {
  display: block;
  color: var(--text-secondary);
  text-decoration: none;
  font-size: calc(14px * var(--sv-font-scale, 1));
  margin-bottom: 12px;
  transition: color var(--transition-fast);
}
.footer-column .footer-donate {
  padding: 0; border: 0; background: none; font-family: inherit;
  text-align: left; cursor: pointer; width: 100%;
}

.footer-column a:hover,
.footer-column .footer-donate:hover { color: var(--text-main); }
/* 链名:比币名小一号淡一档。⚠️ 它必须一直可见 —— BTC 那个是 BEP20 地址,
   转错链就是丢币,这个标记不是装饰。 */
/* 复制失败时就地摊开的地址:等宽、可换行、可拖选。只在兜底路径出现。 */
.footer-column .footer-donate-addr {
  display: block; margin: -6px 0 12px; font-size: calc(10px * var(--sv-font-scale, 1));
  font-family: var(--font-mono, monospace); color: var(--text-muted);
  word-break: break-all; user-select: all; line-height: 1.4;
}
.footer-column .footer-chain {
  font-style: normal; font-size: calc(10px * var(--sv-font-scale, 1)); opacity: .62; margin-left: 4px;
  padding: 0 4px; border-radius: 4px; border: 1px solid currentColor;
  white-space: nowrap;   /* 「USDT TRC20」在 1440/1600 会折成两行,链名和币名必须同排 */
}
.footer-column .footer-donate { white-space: nowrap; }

.footer-bottom {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding-top: 28px;
  border-top: 1px solid var(--line-soft);
  color: var(--text-muted);
  font-family: var(--font-mono);
  font-size: calc(12px * var(--sv-font-scale, 1));
  gap: 16px;
}

/* 版权靠左、其余成组靠右。原来是 space-between,两项时正好一左一右;
   2026-08-26 加了版本号变成三项,space-between 会把标语甩到正中间 ——
   改成「第一项吃掉剩余空间」,以后再加项也只会往右边那一组里排。 */
.footer-bottom > :first-child { margin-right: auto; }

.footer-tag {
  font-family: var(--font-mono);
  font-size: calc(11px * var(--sv-font-scale, 1));
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

/* 页脚版本号:值由 scripts/stamp-assets.mjs 从 package.json 自动注入,
   不要手写死 —— 发版改版本号的地方已经够多了。 */
.footer-version {
  font-family: var(--font-mono);
  font-size: calc(11px * var(--sv-font-scale, 1));
  letter-spacing: 0.06em;
  /* 比同排的 .footer-tag 亮一档:标语是氛围文字,版本号是要被看清的信息
     (深色下 --text-disabled 是 #40434b,压在页脚照片上几乎读不出来) */
  color: var(--text-muted);
}

.main-content {
  padding-top: 48px;
  padding-bottom: 48px;
}

/* ============================================================
   浮层卡片拖动(糖哥 2026-08-24)—— 见 js/sv-modal.js 的 SVDrag。
   把手就是卡片自己的标题栏:光标提示能拖,标题栏里的按钮/输入框保持正常光标。
   ============================================================ */
.sv-drag-handle { cursor: move; touch-action: none; }
.sv-drag-handle button,
.sv-drag-handle a,
.sv-drag-handle input,
.sv-drag-handle select { cursor: pointer; touch-action: auto; }
.sv-drag-handle input[type="text"],
.sv-drag-handle input[type="search"] { cursor: text; }
/* 拖动中:提一层阴影表示"这张浮起来了",并关掉文本选中,免得拖出一片蓝底 */
.sv-dragging { user-select: none; box-shadow: 0 30px 80px rgba(0, 0, 0, 0.55) !important; }
.sv-dragging * { user-select: none; }

/* ============================================================
   Focus visibility (a11y floor)
   ============================================================ */
:focus-visible {
  outline: 2px solid var(--ice);
  outline-offset: 2px;
}

/* ============================================================
   Responsive
   ============================================================ */
@media (max-width: 1024px) {
  .global-header,
  .header {
    grid-template-columns: auto auto;
    padding: 0 20px;
  }

  .nav-links,
  .nav {
    order: 3;
    grid-column: 1 / -1;
    justify-content: flex-start;
    overflow-x: auto;
    padding-bottom: 10px;
    -webkit-overflow-scrolling: touch;
  }

  .footer-links { grid-template-columns: repeat(2, 1fr); }
}

@media (max-width: 768px) {
  .container { padding: 0 18px; }

  .global-header,
  .header {
    min-height: 56px;
    padding: 8px 16px;
    gap: 12px;
  }

  .brand span span,
  .logo-tag { display: none; }

  .header-actions .ghost-action { display: none; }

  .footer { padding: 56px 0 28px; margin-top: 80px; }

  .footer-grid { grid-template-columns: 1fr; gap: 40px; }

  /* 窄屏收成 2 栏:3 栏在 375px 上每栏只剩 ~100px,栏目标题会折行 */
  .footer-links { grid-template-columns: repeat(2, 1fr); }

  .footer-bottom {
    flex-direction: column;
    gap: 10px;
    text-align: center;
  }
  /* 竖排时不需要那条「吃掉剩余空间」的规则 */
  .footer-bottom > :first-child { margin-right: 0; }
}

/* ============================================================
   主题 + 语言 切换控件(右上角,TradingView 风格)
   ============================================================ */
.header-controls { display: inline-flex; align-items: center; gap: 6px; }
.icon-btn {
  width: 44px; height: 44px; padding: 0 9px;
  display: inline-grid; place-items: center;
  border: 1px solid var(--line-strong); background: transparent; color: var(--text-secondary);
  border-radius: var(--radius-sm); cursor: pointer; transition: all var(--transition-fast);
}
.icon-btn:hover { color: var(--text-main); border-color: var(--text-main); }
.icon-btn svg { display: block; }
.lang-toggle { min-width: 44px; font-family: var(--font-mono); font-size: calc(12px * var(--sv-font-scale, 1)); font-weight: 700; }
.lang-toggle .lang-cur { line-height: 1; }
/* sun/moon swap by theme */
.theme-toggle .i-sun { display: none; }
.theme-toggle .i-moon { display: block; }
:root[data-theme="light"] .theme-toggle .i-sun { display: block; }
:root[data-theme="light"] .theme-toggle .i-moon { display: none; }

/* mobile hamburger */
.nav-toggle {
  display: none; width: 44px; height: 44px; place-items: center;
  border: 1px solid var(--line-strong); background: transparent; color: var(--text-secondary);
  border-radius: var(--radius-sm); cursor: pointer;
}
.nav-toggle:hover { color: var(--text-main); border-color: var(--text-main); }
.nav-toggle svg { display: block; }

@media (max-width: 768px) {
  .icon-btn { width: 44px; height: 44px; }
}

/* account link only appears inside the mobile dropdown */
.nav-account, .nav-download { display: none; }

/* ---- mobile top-nav: collapse into hamburger dropdown (in-flow wrap) ---- */
@media (max-width: 900px) {
  .global-header, .header {
    display: flex; flex-wrap: wrap; align-items: center;
    gap: 10px; min-height: 56px; padding: 8px 14px;
  }
  .global-header .header-left, .header .header-left { flex: 1 1 auto; min-width: 0; }
  .header-actions { gap: 8px; flex: 0 0 auto; }
  .nav-toggle { display: inline-grid; order: 3; }
  .header-actions .ghost-action, .header-actions .primary-action { display: none; } /* account/workbench move into menu */

  .nav-links, .nav {
    order: 3; flex-basis: 100%; width: 100%;
    flex-direction: column; align-items: stretch; gap: 2px;
    padding: 0; margin: 0;
    max-height: 0; overflow: hidden; opacity: 0; visibility: hidden;
    transition: max-height 0.28s ease, opacity 0.2s ease;
  }
  .global-header.nav-open .nav-links, .header.nav-open .nav {
    max-height: 80vh; overflow-y: auto; opacity: 1; visibility: visible;
    padding: 6px 0 12px; border-top: 1px solid var(--line-soft); margin-top: 4px;
  }
  .nav-links a, .nav-link {
    padding: 13px 10px; font-size: calc(15px * var(--sv-font-scale, 1)); border-radius: var(--radius-sm);
  }
  .nav-links a.active, .nav-link.active { box-shadow: none; background: var(--accent-soft); }
  .nav-account, .nav-download { display: block; }
  /* 「账户」钉在展开面板的底部(2026-08-31 糖哥「找不到入口」查出来的)。
     展开态是 max-height:80vh 的滚动容器,而导航项只会越加越多 —— 实测 iPhone 812 高屏上
     内容 692px、可视 649px,差 43px,**唯独最后一项「账户」被裁在外面**:
     用户展开菜单看到 12 项、面板底部又没有"还有更多"的提示,自然以为没有账户入口
     (而账户菜单里挂着修改密码、登录设备、邀请返佣、基金申请一整列)。
     调大 80vh 只能治这一次 —— 再加两项又不够,而且矮屏(SE 667px)本来就不够。
     钉住底部则与项数无关。背景必须不透明,否则滚动时下面的条目会透上来。 */
  .global-header.nav-open .nav-links .nav-account {
    position: sticky;
    bottom: 0;
    z-index: 1;
    background: var(--header-bg);
    border-top: 1px solid var(--line-soft);
  }
}

@media (max-width: 560px) {
  .brand strong { display: none; }        /* phones: logo-only brand to fit the bar */
  .global-header, .header { padding: 8px 12px; gap: 8px; }
  .header-actions { gap: 6px; }
}

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
    scroll-behavior: auto !important;
  }
}

/* ---- 演示数据标识(接线期) ---- */
.sv-demo-banner {
  position: fixed;
  left: 50%;
  bottom: 18px;
  transform: translateX(-50%);
  z-index: 2000;
  padding: 8px 18px;
  border-radius: 999px;
  font-size: calc(12px * var(--sv-font-scale, 1));
  letter-spacing: 0.04em;
  color: #f0b90b;
  background: rgba(240, 185, 11, 0.10);
  border: 1px solid rgba(240, 185, 11, 0.35);
  backdrop-filter: blur(6px);
  pointer-events: none;
}

/* ---- 统一弹窗组件(SVModal) ---- */
/* ⚠️ SVModal 必须压在所有页面级遮罩之上,这不是审美问题是安全问题:
   它承载真钱下单/托管的二次确认。原来 z-index:400 低于 strategy 的 .sg-mask(1000)、
   markets 的 .mk-mask(10001)、chart 的 .svc-mask 等,在这些弹窗里调 SVModal.confirm
   会被整个盖住——用户点「开启托管(真实资金)」屏幕毫无反应,反复点之后点空白处关掉外层弹窗,
   那个真钱确认框才突然冒出来,人已经不记得在确认什么。
   10050 高于全站所有页面遮罩,低于 toast(99999),改动前逐个核对过各页 z-index。 */
.svm2-mask {
  position: fixed; inset: 0; z-index: 10050; display: flex; align-items: center; justify-content: center;
  /* 遮罩全透明:弹窗开着也能看清背后的行情/K线(糖哥 2026-08-10 全站统一) */
  background: transparent; opacity: 0; transition: opacity .16s ease; padding: 20px;
  overflow-y: auto; overscroll-behavior: contain;
}
.svm2-mask.show { opacity: 1; }
.svm2-modal {
  width: min(420px, 100%); max-height: calc(100vh - 40px); max-height: calc(100dvh - 40px); border-radius: 14px; overflow: hidden;
  display: flex; flex-direction: column;
  background: var(--bg-panel, #141a24); border: 1px solid var(--line-strong, rgba(255,255,255,0.1));
  box-shadow: 0 24px 64px rgba(0,0,0,0.55); transform: translateY(8px); transition: transform .16s ease;
}
.svm2-mask.show .svm2-modal { transform: translateY(0); }
.svm2-head {
  display: flex; align-items: center; justify-content: space-between; padding: 13px 18px;
  font-size: calc(14.5px * var(--sv-font-scale, 1)); font-weight: 700; color: var(--text-main, #f4f5f7);
  border-bottom: 1px solid var(--line-strong, rgba(255,255,255,0.08));
}
.svm2-close { border: 1px solid transparent; background: none; color: var(--text-muted, #8a8f9c); font-size: calc(20px * var(--sv-font-scale, 1)); cursor: pointer; line-height: 1; border-radius: 7px; min-width: 44px; min-height: 44px; }
.svm2-close:hover, .svm2-close:focus-visible { color: var(--text-main, #f4f5f7); background: var(--accent-soft, rgba(255,255,255,.07)); border-color: var(--line-soft, rgba(255,255,255,.08)); outline: none; }
.svm2-body { padding: 16px 18px; display: flex; flex-direction: column; gap: 12px; overflow-y: auto; min-height: 0; }
.svm2-msg { font-size: calc(13.5px * var(--sv-font-scale, 1)); line-height: 1.7; color: var(--text-main, #f4f5f7); white-space: pre-line; }
.svm2-hint { font-size: calc(12px * var(--sv-font-scale, 1)); color: var(--text-muted, #8a8f9c); margin-top: -2px; }
.svm2-hint kbd, .svm2-hint { letter-spacing: .2px; }
.svm2-field { display: flex; flex-direction: column; gap: 6px; font-size: calc(12px * var(--sv-font-scale, 1)); color: var(--text-muted, #8a8f9c); }
.svm2-input {
  min-height: 44px; padding: 9px 11px; border-radius: 8px; font-size: calc(13.5px * var(--sv-font-scale, 1)); width: 100%;
  color: var(--text-main, #f4f5f7); background: var(--bg-elevated, rgba(0,0,0,0.25));
  border: 1px solid var(--line-strong, rgba(255,255,255,0.12));
}
.svm2-input:focus { outline: none; border-color: var(--accent, #f0b90b); }
/* 多行输入(SVModal.prompt 的 multiline):写一段话的场景,比如引用转发 */
.svm2-textarea { min-height: 96px; line-height: 1.6; resize: vertical; font-family: inherit; }
/* 编辑推文时,这个多行框上会挂 #话题/@ 的着色镜像(与发帖框同一套)。
   镜像是绝对定位垫在底下的,外层得给个定位上下文,否则它会跑到弹窗左上角。 */
.svm2-body .sq-hl-wrap { position: relative; display: block; }
.svm2-body .sq-hl-layer { border-radius: 8px; }
/* ---------- 预警中心(糖哥 2026-08-30,格式对标 AiCoin 的「添加预警」)----------
   宽一档(520px):比确认框多了标签行与一列参数,420px 会把「≥ 150 万美元」这种
   一行三件的行挤成两行。其余(遮罩透明/圆角/描边/输入框手感)全部沿用 svm2 基线,
   一眼看过去与站内其他弹窗是同一套东西。 */
.svm2-modal.svac-panel { width: min(520px, 100%); }
.svac-tabs { display: flex; flex-wrap: wrap; gap: 6px; padding-bottom: 4px; border-bottom: 1px solid var(--line-soft, rgba(255,255,255,.08)); }
.svac-tabs button {
  border: 1px solid transparent; background: transparent; cursor: pointer; border-radius: 8px;
  padding: 7px 12px; font-size: calc(13px * var(--sv-font-scale, 1)); font-weight: 600; color: var(--text-muted, #8a8f9c);
}
.svac-tabs button:hover { color: var(--text-main, #f4f5f7); background: var(--accent-soft, rgba(255,255,255,.06)); }
.svac-tabs button.on { color: var(--text-main, #f4f5f7); background: var(--bg-elevated, rgba(255,255,255,.07)); border-color: var(--line-strong, rgba(255,255,255,.12)); }
.svac-form { display: flex; flex-direction: column; gap: 12px; }
.svac-row { display: grid; grid-template-columns: 84px 1fr; align-items: center; gap: 10px; }
.svac-row > label { font-size: calc(12.5px * var(--sv-font-scale, 1)); color: var(--text-muted, #8a8f9c); }
/* 说明与提示各自占满右列(第 2 列),不跟标签抢那 84px */
.svac-row > .svac-note { grid-column: 2; font-size: calc(11.5px * var(--sv-font-scale, 1)); color: var(--text-muted, #8a8f9c); line-height: 1.5; }
.svac-inline { display: flex; align-items: center; gap: 8px; }
.svac-input {
  min-height: 40px; padding: 8px 11px; border-radius: 8px; font-size: calc(13.5px * var(--sv-font-scale, 1)); width: 100%;
  color: var(--text-main, #f4f5f7); background: var(--bg-elevated, rgba(0,0,0,.25));
  border: 1px solid var(--line-strong, rgba(255,255,255,.12));
}
.svac-input:focus { outline: none; border-color: var(--accent, #f0b90b); }
.svac-sel { max-width: 148px; }
/* 数字输入不铺满整行:后面还要跟单位(万美元 / % / USDT),铺满会把单位挤到边上去 */
.svac-inline .svac-input[type="number"] { max-width: 170px; }
.svac-inline input[type="datetime-local"], .svac-row > input[type="datetime-local"] { max-width: 240px; }
.svac-unit, .svac-ge { font-size: calc(12.5px * var(--sv-font-scale, 1)); color: var(--text-muted, #8a8f9c); white-space: nowrap; }
.svac-count { font-size: calc(11.5px * var(--sv-font-scale, 1)); color: var(--text-muted, #8a8f9c); white-space: nowrap; }
.svac-static { display: flex; align-items: center; gap: 8px; font-size: calc(13.5px * var(--sv-font-scale, 1)); color: var(--text-main, #f4f5f7); }
.svac-static span { font-size: calc(12px * var(--sv-font-scale, 1)); color: var(--text-muted, #8a8f9c); }
.svac-px { font-variant-numeric: tabular-nums; }
.svac-seg { display: inline-flex; flex-wrap: wrap; gap: 6px; }
.svac-seg button {
  border: 1px solid var(--line-strong, rgba(255,255,255,.12)); background: var(--bg-elevated, rgba(255,255,255,.04));
  color: var(--text-main, #f4f5f7); border-radius: 8px; padding: 7px 11px; font-size: calc(12.5px * var(--sv-font-scale, 1)); cursor: pointer;
}
.svac-seg button.on { border-color: var(--accent, #f0b90b); color: var(--accent, #f0b90b); background: rgba(240,185,11,.08); }
/* 账号还没绑定的通道:置灰但仍可点 —— 点了会说清去哪绑,而不是死在那里没反应 */
.svac-seg button.off { opacity: .45; }
.svac-checks { display: flex; flex-wrap: wrap; gap: 8px; }
.svac-check {
  display: inline-flex; align-items: center; gap: 6px; padding: 6px 10px; border-radius: 8px; cursor: pointer;
  font-size: calc(12.5px * var(--sv-font-scale, 1)); color: var(--text-main, #f4f5f7);
  background: var(--bg-elevated, rgba(255,255,255,.04)); border: 1px solid var(--line-strong, rgba(255,255,255,.12));
}
.svac-check:has(input:checked) { border-color: var(--accent, #f0b90b); color: var(--accent, #f0b90b); background: rgba(240,185,11,.08); }
.svac-hint { font-size: calc(11.5px * var(--sv-font-scale, 1)); line-height: 1.6; color: var(--text-muted, #8a8f9c); }
@media (max-width: 560px) {
  .svac-row { grid-template-columns: 1fr; gap: 6px; }
  .svac-row > .svac-note { grid-column: 1; }
}

.svm2-checks { display: flex; flex-wrap: wrap; gap: 8px; }
.svm2-check {
  display: inline-flex; align-items: center; gap: 5px; min-height: 44px; padding: 5px 10px; border-radius: 999px;
  font-size: calc(12.5px * var(--sv-font-scale, 1)); color: var(--text-main, #f4f5f7); cursor: pointer;
  background: var(--bg-elevated, rgba(255,255,255,0.04)); border: 1px solid var(--line-strong, rgba(255,255,255,0.1));
}
.svm2-check:has(input:checked) { border-color: var(--accent, #f0b90b); color: var(--accent, #f0b90b); background: rgba(240,185,11,0.08); }
.svm2-check input { accent-color: var(--accent, #f0b90b); }
.svm2-hint { font-size: calc(11.5px * var(--sv-font-scale, 1)); color: var(--text-muted, #8a8f9c); }
.svm2-err { padding: 8px 12px; border-radius: 8px; font-size: calc(12px * var(--sv-font-scale, 1)); color: #f6465d; background: rgba(246,70,93,0.08); border: 1px solid rgba(246,70,93,0.3); }
.svm2-actions { display: flex; justify-content: flex-end; gap: 10px; padding: 0 18px 16px; flex: none; flex-wrap: wrap; }
.svm2-btn {
  min-height: 44px; padding: 8px 20px; border-radius: 8px; font-size: calc(13px * var(--sv-font-scale, 1)); cursor: pointer; white-space: nowrap;
  color: var(--text-main, #f4f5f7); background: var(--bg-elevated, rgba(255,255,255,0.06)); border: 1px solid var(--line-strong, rgba(255,255,255,0.1));
}
/* 窄屏(360px)三按钮公告:收内距/字号,文字永不换行;放不下整体换行而非字换行 */
@media (max-width: 400px) {
  .svm2-actions { gap: 8px; padding: 0 14px 14px; }
  .svm2-btn { padding: 8px 13px; font-size: calc(12.5px * var(--sv-font-scale, 1)); }
}
.svm2-btn.primary { color: var(--accent-contrast, #1c2530); background: var(--accent, #f0b90b); border-color: var(--accent, #f0b90b); font-weight: 600; }
/* 危险按钮固定用红 #f6465d(即作者原本的 fallback)。本站中文习惯 跌=绿,
   --down / --down-red 都被定义成绿色,若引用它们删除按钮会变绿(看着像「安全/确认」),
   与破坏性动作相悖,故这里不跟行情色、直接钉死危险红。 */
.svm2-btn.danger { color: #fff; background: #f6465d; border-color: #f6465d; font-weight: 600; }
.svm2-btn:hover { filter: brightness(1.08); }
.svm2-btn:focus-visible { outline: 2px solid var(--accent, #f0b90b); outline-offset: 2px; }
.svm2-modal.announcement { width: min(560px, 100%); background: var(--bg-elevated, #16181f); border-color: var(--warn, #f0b90b); box-shadow: var(--shadow-lift, 0 28px 80px rgba(0,0,0,.42)); }
.svm2-modal.announcement .svm2-head { color: var(--text-main, #f4f5f7); background: var(--warn-soft, rgba(240,185,11,.12)); border-bottom-color: var(--line-strong, rgba(255,255,255,.15)); letter-spacing: .01em; }
.svm2-modal.announcement .svm2-body { padding: 20px; }
.svm2-modal.announcement .svm2-announcement-title { color: var(--text-main, #f4f5f7); font-size: calc(17px * var(--sv-font-scale, 1)); font-weight: 750; line-height: 1.45; overflow-wrap: anywhere; }
.svm2-modal.announcement .svm2-msg { color: var(--text-secondary, #b0b4bd); line-height: 1.8; }
.svm2-modal.announcement .svm2-close { color: var(--text-muted, #8a8f9c); }
@media (max-width: 640px) {
  .svm2-mask { align-items: flex-start; padding: max(12px, env(safe-area-inset-top)) 12px max(12px, env(safe-area-inset-bottom)); }
  .svm2-modal { max-height: calc(100vh - 24px); max-height: calc(100dvh - 24px); }
  .svm2-modal.announcement .svm2-body { padding: 16px; }
}

/* ---- 统一资产图标(美股品牌徽标/贵金属元素符号/回落首字母) ---- */
.asset-icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 32px; height: 32px; border-radius: 50%; flex-shrink: 0;
  font-size: calc(10px * var(--sv-font-scale, 1)); font-weight: 700; letter-spacing: 0.2px; color: #fff;
  background: #3b4453; text-transform: uppercase; user-select: none;
}
.asset-icon.asset-metal { font-size: calc(13px * var(--sv-font-scale, 1)); font-weight: 800; }
.asset-icon.asset-stock { font-size: calc(9px * var(--sv-font-scale, 1)); }

/* 限流提示条(2026-07-21;2026-08-24 重做位置与底色)。
   仅在 sv-modal.js 尚未加载时作回退用,正常走站内统一 toast(#svm2ToastHost)。

   原来钉在**页面顶部正中**、底色只有 14% 不透明度:正好盖住导航栏,
   底下的"图表/信号/策略"透过半透明黄底与提示文字叠成一片糊字(糖哥 2026-08-24 截图)。
   现在与站内 toast 同一形态 —— 右上、让开导航高度、底色不透明、允许换行不再硬撑一行。 */
.sv-rate-notice {
  position: fixed; top: 64px; right: 16px; z-index: 10055;
  max-width: min(360px, calc(100vw - 32px));
  padding: 10px 14px; border-radius: 8px; font-size: calc(13px * var(--sv-font-scale, 1)); line-height: 1.5; word-break: break-word;
  background: var(--bg-card, #1c2530); color: var(--text-primary, #eaecef);
  border: 1px solid var(--border, #2b3648); border-left: 3px solid var(--warn, #f0b90b);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
}
@media (max-width: 640px) {
  .sv-rate-notice { top: calc(env(safe-area-inset-top, 0px) + 56px); right: 8px; left: 8px; max-width: none; }
}
.sv-rate-notice[hidden] { display: none; }

/* 地域受限告知(糖哥 2026-08-17:不但要断,也要让用户知道错在哪)。
   用着用着被挡的人,手里的页面还在、接口却全 451,不说一句就只剩满屏"加载失败"。
   所以这层盖满全屏、不可点掉:此刻页面上任何数据都已经停止更新,让它继续可交互才是误导。
   ⚠️样式必须写在这里而不是 JS 里内联 —— 生产 CSP 会把 innerHTML 内联 style 整片废掉。 */
.sv-geo-block,
.sv-edge-block {
  position: fixed; inset: 0; z-index: 2147483000;
  display: flex; align-items: center; justify-content: center; padding: 24px;
  background: rgba(8, 10, 14, 0.82); backdrop-filter: blur(3px);
}
.sv-geo-card,
.sv-edge-card {
  width: 100%; max-width: 460px; border-radius: 14px; padding: 26px 24px;
  background: var(--bg-panel, #12151c); border: 1px solid var(--line-strong, rgba(255, 255, 255, 0.14));
  color: var(--text-main, #e8eaf0); box-shadow: 0 18px 50px rgba(0, 0, 0, 0.45);
}
.sv-geo-title,
.sv-edge-title { margin: 0 0 10px; font-size: calc(17px * var(--sv-font-scale, 1)); font-weight: 700; }
.sv-geo-text,
.sv-edge-text { margin: 0 0 10px; font-size: calc(13.5px * var(--sv-font-scale, 1)); line-height: 1.75; }
.sv-geo-sub,
.sv-edge-sub { margin: 0 0 8px; font-size: calc(12.5px * var(--sv-font-scale, 1)); line-height: 1.7; color: var(--text-secondary, #9aa0aa); }
.sv-geo-sub a { color: var(--warn, #f0b90b); }
.sv-geo-more {
  display: inline-block; margin-top: 8px; font-size: calc(12.5px * var(--sv-font-scale, 1)); font-weight: 600;
  color: var(--warn, #f0b90b); text-decoration: none;
}
.sv-geo-more:hover { text-decoration: underline; }

/* 边缘安全验证告知的自救清单与动作键(2026-08-23)。遮罩/卡片/标题沿用上面地域告知那套,
   这里只补它没有的两件:分条指引,和一个"重新验证"主动作(按 .primary-action 的视觉走)。 */
.sv-edge-list {
  margin: 0 0 16px; padding-left: 20px;
  font-size: calc(12.5px * var(--sv-font-scale, 1)); line-height: 1.85; color: var(--text-secondary, #9aa0aa);
}
.sv-edge-list li { margin-bottom: 4px; }
.sv-edge-list li:first-child { color: var(--text-main, #e8eaf0); font-weight: 600; }
.sv-edge-btn {
  min-height: 44px; width: 100%;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: var(--radius-sm, 8px); padding: 0 18px;
  font-size: calc(13px * var(--sv-font-scale, 1)); font-weight: 600; font-family: inherit;
  border: 1px solid var(--text-main, #e8eaf0);
  background: var(--text-main, #e8eaf0); color: var(--bg-core, #0b0e13);
  cursor: pointer; transition: all var(--transition-fast, 0.15s ease);
}
.sv-edge-btn:hover { filter: brightness(1.12); transform: translateY(-1px); }

/* ==== 全站提示音设置面板(糖哥 2026-08-04) ==== */
/* ===== 原生下拉的候选面板(全站一次钉死) =====
   select 的文字色跟主题走(深色主题=浅字),但 option 不显式配底色时,不遵循 color-scheme 的浏览器
   (Firefox / Safari / 部分 Chrome 环境)会用系统白面板渲染 —— 浅字落在白底上整列看不清。
   2026-08-14 多窗币种下拉报过一次只修了局部(.mw-sym-sel),2026-08-21 新建指标「复制现有」又被用户报;
   这里对全站 option/optgroup 统一钉在主题变量上,深浅主题下都可读;局部规则保留作更具体覆盖。 */
select option, select optgroup {
  background: var(--bg-elevated, #16181f);
  color: var(--text-main, #e8edf3);
}
select optgroup { font-weight: 600; color: var(--text-secondary, #c8d0da); }
select { color-scheme: inherit; }

.svs-panel {
  position: fixed; z-index: 10000; width: 268px; max-height: 78vh; overflow-y: auto;
  padding: 14px; border-radius: 10px;
  background: var(--bg-elevated, #16181f);
  border: 1px solid var(--line-strong, rgba(255,255,255,0.12));
  box-shadow: 0 10px 32px rgba(0,0,0,0.45);
  font-size: calc(12px * var(--sv-font-scale, 1)); color: var(--text-main, #f4f5f7);
}
.svs-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; }
.svs-head b { font-size: calc(13px * var(--sv-font-scale, 1)); }
.svs-sw { display: inline-flex; align-items: center; gap: 5px; cursor: pointer; font-size: calc(11px * var(--sv-font-scale, 1)); color: var(--text-muted, #8a8f9c); }
.svs-sw input { width: 13px; height: 13px; margin: 0; cursor: pointer; accent-color: var(--up, #2ebd85); }
.svs-note {
  margin-bottom: 10px; padding: 7px 9px; border-radius: 6px; line-height: 1.5; font-size: calc(11px * var(--sv-font-scale, 1));
  color: var(--warn, #f0b90b); background: rgba(240,185,11,0.10); border: 1px solid rgba(240,185,11,0.28);
}
/* 关闭态提示用中性灰,与「需要解锁」那条琥珀警告区分开 —— 关声音是用户的正常选择,不是异常 */
.svs-note-muted {
  color: var(--text-muted, #8a8f9c); background: rgba(138,143,156,0.10); border-color: rgba(138,143,156,0.24);
}
.svs-sec { margin: 12px 0 6px; font-size: calc(11px * var(--sv-font-scale, 1)); font-weight: 700; color: var(--text-muted, #8a8f9c); }
.svs-row { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.svs-row .svs-lb { flex: 0 0 auto; color: var(--text-muted, #8a8f9c); }
.svs-row input[type="range"] { flex: 1; min-width: 0; cursor: pointer; accent-color: var(--up, #2ebd85); }
.svs-row em { font-style: normal; color: var(--text-muted, #8a8f9c); font-variant-numeric: tabular-nums; }
.svs-row input[type="time"] {
  padding: 3px 6px; border-radius: 5px; font-size: calc(11px * var(--sv-font-scale, 1));
  background: var(--bg-tertiary, #101217); color: var(--text-main, #f4f5f7);
  border: 1px solid var(--line-strong, rgba(255,255,255,0.12));
}
.svs-tone { display: flex; align-items: center; gap: 8px; padding: 5px 0; }
.svs-tone-nm { flex: 0 0 84px; }
.svs-tone-ds { flex: 1; min-width: 0; font-size: calc(10.5px * var(--sv-font-scale, 1)); color: var(--text-muted, #8a8f9c); }
.svs-try {
  flex: 0 0 auto; padding: 3px 10px; font-size: calc(11px * var(--sv-font-scale, 1)); cursor: pointer; border-radius: 999px;
  background: transparent; color: var(--up, #2ebd85);
  border: 1px solid color-mix(in srgb, var(--up, #2ebd85) 45%, transparent);
}
.svs-try:hover { background: color-mix(in srgb, var(--up, #2ebd85) 14%, transparent); }
.svs-ev { display: flex; align-items: center; gap: 7px; padding: 4px 0; cursor: pointer; }
.svs-ev input { width: 13px; height: 13px; margin: 0; cursor: pointer; accent-color: var(--up, #2ebd85); }
.svs-ev span { flex: 1; min-width: 0; }
.svs-ev em { font-style: normal; font-size: calc(10px * var(--sv-font-scale, 1)); color: var(--text-muted, #8a8f9c); }
.svs-foot { margin-top: 10px; padding-top: 9px; font-size: calc(10.5px * var(--sv-font-scale, 1)); line-height: 1.5;
  color: var(--text-muted, #8a8f9c); border-top: 1px solid var(--line-soft, rgba(255,255,255,0.07)); }
/* 入口按钮开启态:小绿点提示正在生效 */
[data-sv-sound-btn].on { color: var(--up, #2ebd85); }
/* 未接线的事件行:置灰不可勾,与「接入中」标签配套 */
.svs-ev.off { opacity: .45; cursor: default; }
.svs-ev.off input { cursor: default; }
.svs-ev.off em { color: var(--warn, #f0b90b); }

/* ============ 价格异动提醒卡(2026-08-21,对标 AICoin 弹窗形态) ============ */
#svPaHost { position: fixed; right: 16px; bottom: 16px; z-index: 1400; width: 340px; max-width: calc(100vw - 24px);
  background: var(--bg-elevated, #16181f); border: 1px solid var(--border-strong, rgba(255,255,255,.14));
  border-radius: 10px; padding: 12px 14px; display: none; font-size: calc(13px * var(--sv-font-scale, 1)); color: var(--text-primary, #e8edf3); }
#svPaHost.on { display: block; }
.sv-pa.pa-up { border-left: 3px solid var(--up, #2ebd85); }
.sv-pa.pa-down { border-left: 3px solid var(--down, #f6465d); }
.pa-head { display: flex; align-items: center; gap: 8px; }
.pa-up .pa-arrow, .pa-up .pa-title { color: var(--up, #2ebd85); }
.pa-down .pa-arrow, .pa-down .pa-title { color: var(--down, #f6465d); }
.pa-title { font-weight: 600; font-size: calc(14px * var(--sv-font-scale, 1)); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pa-tools { display: flex; gap: 6px; }
.pa-btn { background: none; border: 0; color: var(--text-tertiary, #5c6673); cursor: pointer; font-size: calc(14px * var(--sv-font-scale, 1)); padding: 2px 4px; line-height: 1; }
.pa-btn:hover { color: var(--text-primary, #e8edf3); }
.pa-body { margin: 8px 0 0; line-height: 1.7; color: var(--text-secondary, #c8d0da); }
.pa-foot { display: flex; align-items: center; gap: 8px; margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--border, rgba(255,255,255,.08)); }
.pa-chip { font-size: calc(12px * var(--sv-font-scale, 1)); padding: 3px 10px; border-radius: 6px; border: 0; line-height: 1.5; }
.pa-up .pa-pct { color: var(--up, #2ebd85); background: var(--up-soft, rgba(46,189,133,.12)); }
.pa-down .pa-pct { color: var(--down, #f6465d); background: var(--down-soft, rgba(246,70,93,.12)); }
.pa-act { background: var(--bg-tertiary, #101217); color: var(--text-secondary, #c8d0da); cursor: pointer; }
.pa-act:hover { color: var(--text-primary, #e8edf3); background: var(--bg-sunken, rgba(255,255,255,.05)); }
.pa-act:disabled { opacity: .55; cursor: default; }
.pa-time { margin-left: auto; font-size: calc(12px * var(--sv-font-scale, 1)); color: var(--text-tertiary, #5c6673); }
.pa-pager { display: flex; justify-content: flex-end; align-items: center; gap: 8px; margin-top: 6px; }
.pa-pager.pa-hidden { display: none; }
.pa-idx { font-size: calc(12px * var(--sv-font-scale, 1)); color: var(--text-tertiary, #5c6673); }
.pa-settings { position: fixed; z-index: 1401; width: 240px; background: var(--bg-elevated, #16181f);
  border: 1px solid var(--border-strong, rgba(255,255,255,.14)); border-radius: 10px; padding: 12px 14px; }
.pa-set-title { font-size: calc(13px * var(--sv-font-scale, 1)); font-weight: 600; margin-bottom: 8px; color: var(--text-primary, #e8edf3); }
.pa-set-row { display: flex; align-items: center; gap: 8px; padding: 5px 0; font-size: calc(13px * var(--sv-font-scale, 1)); color: var(--text-secondary, #c8d0da); cursor: pointer; }
.pa-set-row input { accent-color: var(--up, #2ebd85); }
.pa-set-sound { margin-top: 8px; width: 100%; font-size: calc(12px * var(--sv-font-scale, 1)); padding: 6px 0; border-radius: 6px; border: 1px solid var(--border, rgba(255,255,255,.08));
  background: var(--bg-tertiary, #101217); color: var(--text-secondary, #c8d0da); cursor: pointer; }
.pa-set-sound:hover { color: var(--text-primary, #e8edf3); }
@media (max-width: 640px) { #svPaHost { right: 8px; bottom: 8px; width: calc(100vw - 16px); } }

/* 意见反馈入口(见 js/sv-feedback.js)。页脚结构各页不一,三种落点各给一套间距:
   .footer-bottom 里跟在版权行后面 / 简版页脚里另起一行 / 都没有时浮在右下角。 */
.svfb-entry {
  appearance: none;
  background: none;
  border: 0;
  padding: 0;
  font: inherit;
  font-size: calc(12px * var(--sv-font-scale, 1));
  color: var(--text-secondary, #8a8f9c);
  cursor: pointer;
  text-decoration: underline;
  text-underline-offset: 3px;
}
.svfb-entry:hover { color: var(--text-main, #eaecef); }
.svfb-entry-loose { display: inline-block; margin-top: 12px; }
/* 兜底浮标:宁可样式朴素,也不能有页面完全没有入口 */
.svfb-entry-float {
  position: fixed;
  right: 14px;
  bottom: 14px;
  z-index: 40;
  padding: 6px 12px;
  border-radius: 999px;
  text-decoration: none;
  background: var(--panel, #10151f);
  border: 1px solid var(--line-strong, rgba(255,255,255,.14));
}


/* 字号分档(接上面 --sv-font-scale 的说明)。写在文件末尾:
   媒体查询若写在 :root 主定义之前会被后面的主定义覆盖掉(站内踩过)。 */
@media (max-width: 1100px) { :root { --sv-font-scale: 1.04; } }
@media (min-width: 1600px) { :root { --sv-font-scale: 1.12; } }
@media (min-width: 2000px) { :root { --sv-font-scale: 1.16; } }
