feat: 新增热点穿透网状关系图 + 移动端优化

- 新增 /hot-map 热点穿透页:d3-force 力导向网状图展示题材-股票 M:N 关系
  - 股票节点面积/颜色按覆盖题材数分级,穿透核心股高亮
  - 图/核心股列表双视图切换,列表覆盖题材>2 公司降序展示
  - 悬停信息卡、缩放平移、点击跳转股票/题材详情
- 数据采样改为涨幅+热度双榜合并(各 Top50 去重=82 题材),修复覆盖数低估
  (有研新材覆盖数 2→10,核心股 66→1124 家)
- 移动端适配:触屏 tap 选中底部浮层、标签缩放阈值防重叠、自动 fit、紧凑图例
- 主页/题材列表增加热点穿透入口

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Sakurasan
2026-08-06 20:34:14 +08:00
co-authored by Claude
parent 45836f4a30
commit e28d1a2fd0
9 changed files with 1209 additions and 206 deletions
+17 -7
View File
@@ -13,6 +13,7 @@ import {
TrendingUp,
TrendingDown,
Flame,
Network,
} from "lucide-react";
export const Route = createFileRoute("/themes")({
@@ -62,13 +63,22 @@ function ThemesPage() {
</Link>
<h1 className="text-base font-semibold"></h1>
</div>
<button
onClick={() => refetch()}
className="text-muted-foreground hover:text-foreground transition-colors"
title="刷新"
>
<RefreshCw className={`h-4 w-4 ${isFetching ? "animate-spin" : ""}`} />
</button>
<div className="flex items-center gap-3">
<Link
to="/hot-map"
className="text-xs text-primary flex items-center gap-1 hover:opacity-80 transition-opacity"
>
<Network className="h-3.5 w-3.5" />
穿
</Link>
<button
onClick={() => refetch()}
className="text-muted-foreground hover:text-foreground transition-colors"
title="刷新"
>
<RefreshCw className={`h-4 w-4 ${isFetching ? "animate-spin" : ""}`} />
</button>
</div>
</div>
</header>