feat(HEL-524): 板块轮动落地 B 五彩版,侧栏/品牌去独立底色

- 新增 5 档强度色 token(日/夜两套,含渐变填充与光晕 alpha),tokens.css
- 板块轮动卡片改为 heat-tier-1..5,固定阈值 <65/65-74/75-84/85-94/95+
  映射青/蓝/紫/橙/红,9 个日期列共用同一套映射,与涨跌无关
- 悬停/选中/追踪三态用 --tier-* 局部变量统一驱动,选中态(当次点击格)
  用渐变实色+2px 亮边+光晕,追踪态(其余同名格)保留档位底色+2px 描边
  +圆点标记,不新增业务状态;修复 hover 规则与 selected 同优先级导致
  悬停会覆盖选中/追踪样式的层叠顺序问题(:hover 增加 :not(.selected))
- 图例改为 5 档 + “颜色=强度档位,与涨跌无关” 说明,禁止对普通卡使用绿色
- 侧栏/品牌区去掉独立色块:.module-nav 融入页面 --canvas,
  品牌区与顶栏同层(--header-bg),收起侧栏整行透明;仅作用于
  非移动端且非「问天」路由,问天页面零改动
- 清理死代码:未生效的 .selected 旧规则与引用未定义变量的
  --rotation-heat 声明
- 更新 e2e 断言以匹配新 tier 类名;重新生成 architecture-inventory.json

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
总工
2026-09-10 21:10:14 +08:00
co-authored by Cursor multica-agent
parent 5385bad9ec
commit 4a90c32fcc
7 changed files with 265 additions and 95 deletions
+17 -3
View File
@@ -3,6 +3,16 @@ window.XiaobaiPageModules.register("rotation", ["rotationView"], {
enter: ["loadRotation"],
});
// HEL-524: 五档强度色固定映射,所有日期列共用同一套阈值 —— <65 青,65-74 蓝,75-84 紫,85-94 橙,95+ 红。
function rotationHeatTier(strengthValue) {
const value = clamp(number(strengthValue), 0, 100);
if (value >= 95) return 5;
if (value >= 85) return 4;
if (value >= 75) return 3;
if (value >= 65) return 2;
return 1;
}
async function loadRotationHistory(force = false) {
if (!state.dashboard || state.rotationLoading) return;
const key = `${elements.tradeDate.value}:9`;
@@ -87,10 +97,14 @@ function renderRotationHistory() {
<header><time>${escapeHtml(displayCompactDate(day.trade_date).slice(5))}</time><span>${(day.sectors || []).length} 个热点</span></header>
<div class="rotation-day-sectors">${(day.sectors || []).map((sector) => {
const strength = clamp(number(sector.strength), 0, 100);
const heatClass = strength >= 90 ? "heat-strong" : strength >= 70 ? "heat-warm" : "heat-mild";
const heatClass = `heat-tier-${rotationHeatTier(strength)}`;
const isTrackedName = Boolean(selected) && selected === sector.name;
const isCurrentCell = isTrackedName && day.trade_date === state.rotationSelectedDate;
const stateClass = isCurrentCell ? "selected current-cell" : isTrackedName ? "selected" : "";
return `
<button type="button" class="rotation-sector-chip ${heatClass} ${selected === sector.name ? "selected" : ""}" data-rotation-sector="${escapeHtml(sector.name)}" data-rotation-date="${escapeHtml(day.trade_date)}">
<span class="rotation-rank rank-${Math.min(number(sector.rank), 4)}">${number(sector.rank)}</span><strong>${escapeHtml(sector.name)}</strong><small><b>${number(sector.count)}</b> 家 · ${formatNumber(sector.strength, 0)}</small>
<button type="button" class="rotation-sector-chip ${heatClass} ${stateClass}" data-rotation-sector="${escapeHtml(sector.name)}" data-rotation-date="${escapeHtml(day.trade_date)}">
<span class="rotation-rank rank-${Math.min(number(sector.rank), 4)}">${number(sector.rank)}</span><strong>${escapeHtml(sector.name)}</strong><small><b>${number(sector.count)}</b> 家 · <b class="rotation-strength">${formatNumber(sector.strength, 0)}</b></small>
${isTrackedName && !isCurrentCell ? '<span class="rotation-track-dot" aria-hidden="true"></span>' : ""}
<span class="rotation-cell-tooltip">${escapeHtml(displayCompactDate(day.trade_date).slice(5))} · 第 ${number(sector.rank)} 名 · 涨停 ${number(sector.count)} 家 · 强度 ${formatNumber(sector.strength, 0)}</span>
</button>`;
}).join("")}</div>