fix(report): group chart cards in the existing grid and stop remounting on scroll (BUG-616, BUG-617)

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-09 18:44:14 +08:00
co-authored by Cursor
parent 584a56bd81
commit 87daffe251
10 changed files with 449 additions and 66 deletions
+33 -1
View File
@@ -9426,7 +9426,7 @@
- 修复:引擎在每张 SVG 旁追加 `jyotish-chart` 围栏 JSON;阅读页只认围栏,zod 校验后用北印式菱形组件自绘。导出 `.md` 前剥掉围栏,保留 SVG 给外部阅读器。
- 验证:`tests/test_report_chart_block.py` 7 项(22 块围栏 == 22 个 `<svg>`,度数/星座/逆行与 core_chart 一致,且该文件在 `CORE_PYTEST_TARGETS`);`frontend/tests/report-chart-block.test.ts``frontend/tests/personal-report-markdown-view.test.tsx`(组件 SVG 有 `role="img"`,不含引擎 `viewBox="0 0 420 480"`,坏块显示「图盘数据无效」且无 `<script`)。全量 `npm test` 2975 tests / 2971 pass / 4 fail,失败 4 条均为 Docker Postgres fixture,与图盘无关。`tsc --noEmit` 0 错;`next build --webpack``/` 仍为 Static。
- 防复发:Markdown 阅读页继续 `skipHtml` / 禁止 `rehype-raw`;图盘文本只来自白名单映射。上述测试锁住围栏块数与渲染通路。
- 相关记录:`TASK-report-md-page-20260906.md``TASK-report-chart-render-20260909.md`
- 相关记录:`TASK-report-md-page-20260906.md``TASK-report-chart-render-20260909.md`、BUG-616、BUG-617
- 复发自:无(09-06 直渲回归,不是旧 BUG 编号复发)
- 修复版本:待发布
@@ -9525,3 +9525,35 @@
- 相关记录:BUG-612(同一次事故的空回答)、`TASK-consultation-daily-empty-answer-20260909.md`
- 复发自:无
- 修复版本:待发布
## BUG-616 | 报告页 22 张北印盘叠在同一位置
- 状态:resolved
- 首次发现:2026-09-09
- 最近更新:2026-09-09
- 影响面:`/personal-report` Markdown 阅读页、`personal-report-markdown-view.tsx``globals.css``report-chart-grid-rehype.ts`
- 用户现象:「Birth Chart / Vargas」里 D1 / D9 / Moon 三张盘叠在同一块;Vargas I 的 19 个 `####` 标题挤在左上角,19 张盘全部叠在一起,「Shodashvarga 星座总表」和后面的表也压在盘上。
- 触发条件:打开含 `jyotish-chart` 围栏的个人长报告详情页,宽于 720px 的桌面视口。
- 根因:BUG-607 用浮动 + `margin-left: -50%` 在扁平 Markdown 兄弟节点上凑两栏。负 margin 让每个 figure 的 margin box 宽度为 0,浮动算法认为它不占横向空间,连续多对标题+盘必然重叠。`renderToStaticMarkup` 只看 DOM,看不见布局,所以当时的 golden 全绿。
- 修复:删掉 `.personal-report-chart-*` 上的 float / 负 margin。rehype 插件把「`h4`D… / Moon Chart+ 可选一段说明 + `pre > code.language-jyotish-chart`」包进 `.personal-report-chart-card`,相邻卡片再包进既有的 `.personal-report-chart-grid`(单张加 `is-single`)。不放开 `skipHtml`,不引入 `rehype-raw`
- 验证:`frontend/tests/personal-report-markdown-view.test.tsx`:3 对连续标题+围栏(第 3 对夹一段 `p`)得到 1 个 grid / 3 张卡,卡内顺序为 `h4` →(`p`)→ `figure`,后面的普通 `h4` 不在卡内;单对带 `is-single`golden 22 张 `figure` 全在卡内;`globals.css` 中同时含 `personal-report-chart``float:` / `margin-left: -50%` 的规则为 0。
- 防复发:布局合同走 DOM 结构(grid/card 包裹)和 CSS 禁令,不只看「有没有 `<svg>`」。
- 相关记录:BUG-607、`TASK-report-chart-layout-fix-20260909.md`
- 复发自:无(BUG-607 的两栏浮动方案回归,不是「标题下没图」复发)
- 修复版本:待发布
## BUG-617 | 滚动报告时整篇 Markdown 卸载重建,页面卡顿
- 状态:resolved
- 首次发现:2026-09-09
- 最近更新:2026-09-09
- 影响面:`personal-report-markdown-view.tsx` 目录高亮与文章树
- 用户现象:长报告页(尤其 Vargas I 19 张盘揭开后)一滚动就明显卡,像整页在闪。
- 触发条件:打开含星盘围栏的长报告,滚动使目录高亮从一个 `h2`/`h3` 切到下一个。
- 根因:`activeId` 放在 `PersonalReportMarkdownView` 顶层,IntersectionObserver 每次切换都 `setActiveId``markdownComponents()` 每渲染新建一套 `h2`/`h3`/`h4`/`pre` 函数;React 按元素 type 引用比较,type 变了就卸载重建整棵子树。09-06 Markdown 直渲时已是这个结构,当时没有 SVG,代价没被感知;22 张盘进来后每次滚过一个标题就销毁再创建全部多边形和 `<text>`
- 修复:目录高亮下沉到 `ReportToc``PersonalReportMarkdownView` 不再持有滚动态。lead 与 `LazyMarkdownSection``renderMarkdown` 结果整树 `useMemo``LazyMarkdownSection` 本身 `memo()`
- 验证:源码合同:`renderMarkdown(` 只在 `useMemo` 内调用;`PersonalReportMarkdownView` 函数体没有 `useState`。本仓测试是 `renderToStaticMarkup`,数不了重渲染次数;真机条目写在 `docs/testing/report-chart-render-20260909.md` 第 7 节。
- 防复发:文章树不得订阅目录高亮 state。`components` 映射可以每次 `renderMarkdown` 新建(id 去重 cursor 需要),但调用点必须被 `useMemo` 包住。
- 相关记录:BUG-616、`TASK-report-md-page-20260906.md``TASK-report-chart-layout-fix-20260909.md`
- 复发自:无(09-06 直渲结构在星盘进入后才变成可感知卡顿)
- 修复版本:待发布