Rainytoken/docs/heatmap-plan.md
WaterRain 962d8f1215
feat(heatmap): 年份选择器 + 每周视图柱状图 + 对抗审查修复
- 修复 4 个 heatmap 提交的编译错误与对抗审查问题:浮层锚定与跨年日期、
  Crossfade 快照、时区口径统一(useUtc8)、万级格式化溢出、周视图周日对齐
- 新增年份选择器:自然年语义、默认今年、三种视图跟随、下拉菜单、
  图例固定不随热力图滚动、打开默认滚到最右、0 token 天可点击查看
- 每周视图改为离散柱状图:列=自然周,高度按 token 排名比例映射 2~7 格
  (不同量级周高度可区分),0 用量周显示 Level 0 空白格(整列 7 格全绘制)
- 选中周整列主题色描边强调,浮层日期跨年带年份前缀
- 文档 docs/heatmap-plan.md 补充年份选择器/图例与滚动/柱状图章节
2026-08-06 22:33:25 +00:00

124 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Token 活动热力图 — 设计方案
> 参考实现:`reference/react-activity-calendar`(grubersjoe/react-activity-calendar,MIT)
> 该库为 React/SVG Web 组件,本项目用 Jetpack Compose Canvas 重新实现,仅参考其布局逻辑和数据结构。
---
## 一、入口与数据源
- 主页新增一个入口,点击进入独立的 Token 活动热力图页面
- **只统计 OCGO 服务的数据**,不涉及 CCGO / Codex / Ollama
## 二、页面布局
- 标题左对齐:「Token 活动」
- 标题右侧视图切换:每日 / 每周 / 累计
- 选中项:主要文字颜色 + 中等字重
- 未选中项:弱文字颜色
- 不使用大号按钮背景或明显的 Tab 胶囊样式
## 三、每日视图(默认)
- GitHub Contribution Calendar 结构:
- 53 列 × 7 行
- 每列代表一周,每行代表星期中的一天
- 越靠右越接近当前日期
- 按所选自然年显示:今年 = 1月1日 ~ 今天;往年 = 1月1日 ~ 12月31日(完整自然年,取代早期「最近滚动 365 天」窗口,详见「十一、年份选择器」)
- 格子参数:
- 尺寸 10~12dp
- 间距 3dp
- 圆角 3dp
- 月份标签:12sp,底部显示
- 不显示左侧星期标签
> 注:2026-08 起已改为**年份选择器(自然年)**取代固定滚动 365 天窗口,详见「十一、年份选择器」。
## 四、颜色等级
- 6 级:Level 0(空白)+ Level 1~5(逐渐加深的粉色)
- 使用项目现有配色(Color.kt 中的粉色系)
- **映射方案:分位数法**
- 收集所有非零日 Token 数,排序,计算分位阈值
- Level 0:token = 0(空白)
- Level 1:0 ~ 25% 分位
- Level 2:25% ~ 50% 分位
- Level 3:50% ~ 75% 分位
- Level 4:75% ~ 95% 分位
- Level 5:95% 以上
- 颜色会随数据变化是预期行为(与 GitHub 热力图一致)
## 五、每周视图
- 与每日视图**共用同一 7 行 × 约 53 列网格尺寸**(列数按所选自然年浮动 52~54),切换视图时布局保持一致
- 语义为**离散柱状图**:横轴 = 自然周,每一列 = 一周,纵向高度 = 该周 Token 用量
- 每列从底部向上填充格子,用量越多填充越高;**整列 7 格全部绘制**:底部 barHeight 格 = 该周等级颜色(柱),其余格 = Level 0 浅色(空白格不隐藏,网格完整),最大高度 = 7 格满柱
- **高度映射**:非零周按 token 去重排序的排名比例映射 2~7 格(height = 2 + rankIndex×5/(uniqueCount-1),排名不同高度必不同,如 3.7亿 → 2 格、10.7亿 → 7 格;唯一非零值时满柱 7 格)
- 填充格使用该周的等级颜色(6 级粉色分位,与图例"少→多"一致)
- 列内格子**不表示周日~周六**(与每日视图的日期语义解耦)
- 周列与日视图一致按周日对齐;第一列 = 该年 1月1日 所在周(可能含去年 12 月空位),最后一列 = 结束日所在周(今年 = 今天所在周,往年可能跨到次年 1 月初)
- 点击:每周视图列内任意格子可点击查看该周浮层("X月X日-X月X日 使用了X token"),含 0 用量周(显示"使用了0token");**选中周整列加主题色描边强调**(再次点击或点击其他周取消)
## 六、累计视图
- 和每日视图同样的小格子风格
- 53 列 × 7 行
- 每个格子的颜色代表从起始日到该日的累计 Token 总量
- 同样用分位数法映射到 6 级
## 七、格子交互
- 点击格子显示浮层,内容为日期和当天使用的 Token 数
- 浮层格式示例:
```
7月9日 使用了1.9亿token
7月10日 使用了1124.5万token
7月11日 使用了11.2万token
7月12日 使用了16783token
```
(Token 数按数量级自然中文读法显示)
- 再次点击或点击外部关闭浮层
- 不需要"查看详情"按钮
- 热力格支持键盘聚焦,提供日期与 Token 数的无障碍描述
## 八、视图切换动画
- 切换视图使用约 150ms 的淡入淡出
- 不要明显的滑动或弹跳动画
## 九、Token 定义
- 热力图中的「使用 token」= `inputTokens + cacheReadTokens + reasoningTokens + outputTokens`
- `inputTokens`:未命中缓存的输入 token
- `cacheReadTokens`:命中缓存的输入 token
- `reasoningTokens`:推理 token(思维链 CoT)
- `outputTokens`:输出 token
- 不包含 `cacheWrite5mTokens` 和 `cacheWrite1hTokens`(缓存写入 token)
## 十、Token 数显示格式
- 按数量级自然转换为中文读法:
- 亿级:1.9亿
- 千万级:1124.5万
- 万级:11.2万
- 万以下:原始数字(如 16783)
## 十一、年份选择器(2026-08 新增)
- 标题「Token 活动」右侧为年份下拉选择器(「2026 ▾」),点击弹出年份列表
- 语义:按**自然年**查看
- 今年:1月1日 ~ 今天(默认选中年份)
- 往年:1月1日 ~ 12月31日(完整自然年)
- 取代原先固定「最近滚动 365 天」窗口
- 可选年份范围:最早有数据的年份 ~ 今年
- 三种视图(每日/每周/累计)均跟随所选年份,分位数按所选年份独立计算(颜色随年份数据变化是预期行为)
- 周视图按自然年时列数浮动(52~54 列,闰年且 1月1日 为周六时可达 54 列):
- 第一列为该年 1月1日 所在周(可能含去年 12 月空位)
- 最后一列为结束日所在周(今年=今天所在周;往年可能跨到次年 1 月初)
- 浮层日期:日期所在年份与今年不同时前缀加年份(如「2024年7月9日 使用了1.9亿token」)
## 十二、图例与滚动(2026-08 新增)
- 底部「少 → 多」颜色图例固定显示,不随热力图横向滚动
- 页面打开 / 切换视图 / 切换年份时,热力图横向滚动自动定位到最右(最新数据)
- 0 token 的天可以点击查看浮层(显示「7月9日 使用了0token」);每周视图 0 用量周显示 1 格 Level 0 浅色格、同样可点击(柱状图语义,见「五、每周视图」)