Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014Ad9rqAB8pXXvyzh7f4X8v
6.1 KiB
6.1 KiB
TASK · 星盘页本命 / 月亮盘的行星表被挤进左栏(issue #102,2026-10-23)
基线
origin/staging:写本单时为9049b5e99。开工时以当时的origin/staging为准。- 执行方:Grok(Windows + Docker)。分支
codex/chart-table-span-20261023,只推这一个分支。 - BUG 编号:开工时运行
grep -oE "BUG-[0-9]+" docs/BUG_HISTORY.md | sort -t- -k2 -n | tail -1,从下一个号起(写本单时最大号是 BUG-1420)。
事故实证
- 现象:桌面宽度(≥1024px)下,星盘页选「本命」或「月亮」时,行星表只占左栏,和盘一样宽(约 466px)。宿主、pada、状态三列要横向拖动才看得到;右栏在参数卡下面空着。D2–D60、Bhava、行运的表都正常。
- 布局规则:
frontend/src/app/globals.css的桌面媒体段(@media (min-width: 1024px),符号.chart-page-planet-table-wrap, .chart-page-varga-table-block { grid-column: 1 / -1; })把这两个类名排成跨两栏的整行。 - 网格结构:
frontend/src/components/chart-page/chart-vedic-tab.tsx的VedicLayout网格下有三类直接子项:.chart-page-vedic-stage(盘)、.chart-page-params(参数卡)、{children}(表)。 - 出问题的地方:同文件
NatalTable在 #87(d2edf8b7a,「上升的状态格改成「/」」)里被外包了一层ChartSymbolHelp,渲染出来是<div class="chart-page-symbol-help">。网格的直接子项变成了这个 div,上面的跨栏规则匹配不上,表就被自动排进了左栏第二行。 - 为什么分盘没事:
ChartTypeBody里分盘外面多了一层.chart-page-varga-table-block,仍然命中跨栏规则。本命、月亮两处直接放NatalTable,所以出事。 - 违反的设计:
frontend/DESIGN.md写着「桌面(≥1024)盘面与参数表左右并排,行星表是跨两列的整行——它的列宽需要完整版心」。 - 为什么没拦住:#87 的进度记录(
docs/tasks/PROGRESS-chart-ascendant-slash-20261021.md)写明没跑全量npm test、没跑next build,也没登录后看页面;而且现有测试没有一条断言grid-column。
根因
跨栏规则是按「表格外层恰好是某个类名」写的,网格自己并不掌握「第三行是整行」这件事。所以任何人往表外面再包一层,布局就会悄悄坏掉。这一次是 #87 包了一层 ChartSymbolHelp,下一次可能是别的。
决策记录
- 产品 2026-10-22 把本问题提成 issue #102,2026-10-23 要求先规划。
- 按 AGENTS.md §5「修在根因上」,不采用「在跨栏规则里再补一个
.chart-page-symbol-help类名」这种对症补丁。改为让网格自己掌握结构:VedicLayout用一个固定的整行容器装children,跨栏规则只认这个容器。 - 不改表格的列数、列宽,不动 D1 的字节冻结。
硬红线
- 不改表格内容、列、列宽,也不改
ChartSymbolHelp的行为(「/」的说明气泡必须照常弹出,不能被裁掉)。 - 手机端不得回归 BUG-1083:390px 宽时页面
scrollWidth必须等于 390,表格只能在自己的盒子里横滚。 chart-varga-table.test.tsx的 D1 字节冻结、chart-page-mobile-width-20260929.test.ts的现有断言都要照常通过。若必须改,按「原值 / 新值 / 原因」三栏写。- 本单只修布局。组件库迁移 K3(#107)会整体改造这一页,本单不要提前换组件。
任务
T1 网格自己掌握整行
VedicLayout里把{children}包进一个固定容器,比如<div className="chart-page-vedic-tables">。这个容器永远是网格的第三个直接子项。globals.css桌面段的跨栏规则改为针对这个容器(grid-column: 1 / -1)。原来那两个类名如果别处不再需要跨栏,就从规则里删掉;删之前先按 AGENTS.md §7 第 8 条 grep 源码文本合同测试。- 容器加
min-width: 0,保证窄屏时表格只在自己的盒子里横滚。 ChartTypeBody里分盘、Bhava、行运的.chart-page-varga-table-block保持不变。它们现在落在新容器里面,不再负责跨栏。
验收:在 1024px、1280px 宽下,「本命」「月亮」「D9」「Bhava」「行运」五种盘型的表都占满整行,宿主、pada、状态三列不用横拖就看得到。
T2 回归测试
- 新增测试:分别渲染
ChartVedicTab的 D1、MOON、D9、BHAVA、TRANSIT,断言.chart-page-vedic-layout恰好有三个直接子项,并且第三个是.chart-page-vedic-tables。 - 在同一个测试文件里,断言
globals.css的桌面媒体段包含.chart-page-vedic-tables { grid-column: 1 / -1; }(或等价写法)。 - 以后谁再往表外包东西,这两条断言就会失败。
T3 文档
docs/BUG_HISTORY.md新增一条:回归来源 #87,根因写「跨栏按类名而非结构」,防复发写上面 T2 的两条断言。frontend/DESIGN.md星盘页一节补一句:「表格区由VedicLayout的整行容器承载,不靠表格自身类名跨栏。」CHANGELOG.md写一行。
开工前置命令
git fetch origin --prune
git worktree add -b codex/chart-table-span-20261023 .worktrees/chart-table-span-20261023 origin/staging
cd .worktrees/chart-table-span-20261023 && git status -sb
cd frontend && npm ci && ./node_modules/.bin/tsc --noEmit && npm run lint
./node_modules/.bin/tsx --test tests/chart-page-view.test.tsx tests/chart-varga-table.test.tsx tests/chart-page-mobile-width-20260929.test.ts # 记下基线
验收分工
- Grok 自跑:
tsc --noEmit;npm run lint;- 上面三个测试文件加新测试;
npm run build,记录/是否 Static 和首屏 gzip;- 在本机浏览器 1280px 和 390px 宽下各截一张本命盘页面的图,附在回报里。
- Claude 验收时跑:
- 前端全量
npm test,和基线逐条对比(#87 当时就是漏了这一步); - 复核截图。
- 前端全量
- 真机清单:
docs/testing/chart-table-span-20261023.md,写两步:宽屏看本命和月亮的表是不是整行;手机上页面不横向滚动。