Uh oh!
There was an error while loading. Please reload this page.
fix(schema-catalog): grid 示例的列数键 cols → columns —— 3/4 列示例不再静默渲染成 2 列 (#4001) - #4008
Conversation
…#4001) `GridSchema` 声明的键是 `columns`,`grid` 渲染器也只读 `schema.columns`, 注册的 designer `inputs` 同样只有 `columns` / `smColumns` / `mdColumns` / `lgColumns` / `xlColumns`。`cols` 从未被 spec / 类型 / 注册表声明过,`core` `react` `types` 里也没有任何归一化 —— 13 个 catalog 示例写成 `cols`,值被整个 丢弃:`baseCols` 落到字面默认值 `2`,且 mobile-first 降级因为门禁是 `typeof schema.columns === 'number'` 而根本不触发,于是在所有断点上都是死板 2 列。要 3/4 列的示例在 docs 站(含 production 构建)渲染成 2 列。 按 AGENTS.md #0.1 改生产者,不给渲染器加 `schema.columns ?? schema.cols` 之类的别名兼容 —— 宽容的 consumer 会把错拼法固化成第二套事实契约。 新增 `grid-columns-key.test.tsx` 同族防回潮钉(数据面 + 渲染面): catalog 全量禁止 grid 节点出现 `cols`;13 个示例各自仍声明其应有列数(否则 删键也能让禁令变空转);并按新的正确值钉住 5 个抽样示例的响应式 class ramp。 Co-authored-by: Claude <noreply@anthropic.com>
The latest updates on your projects. Learn more about Vercel for GitHub. |
yinlianghui
commented
Aug 9, 2026
更正正文里一段已过期的说明(#4004 已落 main)开工时的 BASE 是 这不是纯文字冲突问题,是语义交叉,所以没有只靠 CI 的 merge commit 蒙过去:已把 新测试文件通过 #4004 的门禁(包括其 5b 节「测试工程必须读到 build 配置漏掉的每个测试文件」),无需申报 debt。合入后复跑:
顺带说明: 仍是 draft,不挂 auto-merge,等 PM 验收。 Generated by Claude Code |
yinlianghui
commented
Aug 10, 2026
PM 验收(session_01GTRjn8xBqp75dk7kFupVRt):通过,转 ready 并挂 auto-merge。#4001 落地 —— 13 个 catalog grid 示例 核验记录(head
out-of-scope 三条(教学面仍教 Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#4001
问题
GridSchema声明的列数键是columns(packages/types/src/layout.ts),grid渲染器只读schema.columns(packages/components/src/renderers/layout/grid.tsx:50-103),注册的 designerinputs也只有columns/smColumns/mdColumns/lgColumns/xlColumns/gap/className。cols从未被 spec、类型或注册表声明,core/react/types里也没有任何把它归一到columns的处理(已git grep核实:packages/*/src内除 Tailwind 的grid-cols-*字面量外无一处读cols)。13 个 catalog 示例把列数写成
cols,于是值被整个丢弃:baseCols落到字面默认2,而且 mobile-first 降级的门禁是typeof schema.columns === 'number',连降级也不触发 —— 在所有断点上都是死板 2 列,production 构建同样如此。修法(契约优先)
改生产者:13 个 JSON 的
cols→columns。没有给渲染器加schema.columns ?? schema.cols之类的别名兼容 —— 按 AGENTS.md #0.1,宽容的 consumer 会把错拼法固化成第二套事实契约,而cols从来不是契约的一部分。命中清单(13 个,每个文件一行改动,均在 grid 节点上)
已用脚本逐个核验:每个文件恰好一处
cols键、且落在type: "grid"节点上、改后仍为数字。report/report-header-with-kpis.jsontheme/semantic-color-palette.jsoncomponents-layout-page/full-dashboard.jsoncomponents-data-display-statistic/metrics-grid.jsoncomponents-layout-page/page-with-header.jsonforms/payment-form.jsoncomponents-data-display-statistic/sales-dashboard.jsonauth/signup.jsoncomponents-complex-resizable/complex-layout.jsoncomponents-basic-div/grid-layout.jsontheme/theme-aware-ui-elements.jsonplugin-view/form-view-mode.jsonforms/contact-form.json渲染变化(是修好,不是回归)
实测(经真 SchemaRenderer):
columns: 4→grid grid-cols-1 sm:grid-cols-2 md:grid-cols-4 gap-4(原grid grid-cols-2 gap-4)columns: 3→grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4(原grid grid-cols-2 gap-4)columns: 2→grid grid-cols-1 sm:grid-cols-2 md:grid-cols-2 gap-4(原grid grid-cols-2 gap-4)一处需要向 issue 正文更正:正文把那 7 个「要 2 列」的示例记为「碰巧和默认值一致、渲染无变化」。实测并非如此 ——
columns: 2会触发 mobile-first 降级,base 断点从 2 列变成 1 列(sm起才回到 2 列)。所以 13 个示例的渲染全部变化:6 个在md及以上从 2 列变成正确的 3/4 列,7 个只在 base(手机)断点从 2 列变成 1 列。后者正是渲染器写明的窄屏可读性意图,不是回归。防回潮钉
新增
examples/schema-catalog/test/grid-columns-key.test.tsx(数据面 + 渲染面,与 #3972 / #3987 的 manifest 钉同族版位),钉三件事:type: "grid"节点都不得出现cols键,失败时报出示例 id 与值。第 14 个cols进不来。className/ 非默认gap透传),值按上表的新正确值。抽样含components-basic-div/grid-layout——content/docs/components/basic/div.mdx让作者照抄的迁移范本。注意钉的范围刻意只针对
cols这一个键,没有做 grid 节点的键白名单:type: "grid"被两个 tier 共用 —— 布局 grid 的columns是数字,而fields-grid/*的字段网格columns是列定义数组(带name/label/readonly),白名单会误伤后者。反向验证(方向先书面预判,再跑变异,变异未提交)
变异 A —— 把
metrics-grid.json的columns改回cols。预判:三条翻红(禁令列出 offender、declares columns: 3因declared变空、渲染钉收到旧的错值)。实跑与预判一致:第三条尤其值得记:渲染钉在变异下复现了 issue 实测的那个缺陷值,说明它钉的是真渲染而不是恒真式。
变异 B —— 把
report-header-with-kpis的期望值改回修复前的grid grid-cols-2 gap-4。预判:该条单独翻红。实跑一致(Expected: "grid grid-cols-2 gap-4"/Received: "grid grid-cols-1 sm:grid-cols-2 md:grid-cols-4 gap-4"),证明钉里写的是新正确值。过程中踩到的一个坑,如实记录:变异 A 的还原用了
git checkout --,而当时改动尚未 commit,于是它把文件还原到了 HEAD(即未修复态),连带污染了变异 B 那一跑的输出(B 的日志里同时出现 metrics-grid 的三条红)。已重新施加修复、复跑全绿后才 commit;后续变异都在 commit 之后做。B 自身的预判判据(那一条 pin 的 Expected/Received)不受影响。写钉时测出的一处渲染器事实
grid渲染器的 Tailwind 覆盖读的是classNameprop,而把schema.className灌进这个 prop 的是SchemaRenderer(SchemaRenderer.tsx:479-523两种拼法都设)。所以渲染钉走真 SchemaRenderer,而不是ComponentRegistry.get('grid')直渲 —— 后者会静默丢掉作者写的className,钉就看不见它了。这是先按直渲写、被full-dashboard/semantic-color-palette两条翻红纠正后的结论,注释已写进测试文件。验证
pnpm exec vitest run examples/schema-catalog --maxWorkers=2→ 5 files / 1113 passed(含新钉 20 条)pnpm exec vitest run packages/components --maxWorkers=2→ 109 files / 929 passedpnpm exec turbo run type-check --concurrency=2→ 78/78 successfulnode scripts/check-control-bytes.mjs→ OK(3911 files);并对改动文件自查了门禁扫不到的控制字节区间,cleanpnpm --filter @object-ui/example-schema-catalog lint→ 0 errors(2 条既有 warning 在我未碰的文件里)changeset:无。
node scripts/check-changeset-presence.mjs判定No source of a released package changed in this range, so no changeset is owed.——@object-ui/example-schema-catalog是private、且在.changeset/config.json的ignore组里;本 PR 只动 examples 数据与测试,按 AGENTS.md「纯 bug 修复不需要 changeset」处理。测试面的一个既有缺口(未动):
examples/schema-catalog/tsconfig.json的exclude含test,所以本包的type-check覆盖不到任何测试文件(含本 PR 新增的)。这正是在飞 #3968 的面,按边界不碰;新文件的类型另行用一次性tsc --noEmit --ignoreConfig ...单独核过,exit 0。边界
未碰
grid.tsx(不加别名)、未碰div.tsx与 #3965 / #4003 的 div 词表面(components-basic-div/grid-layout.json的根节点本就是grid,只改了键)、未碰 #3968 的 tsconfig 面、未碰content/docs/releases/。另有两类超范围发现(同一缺陷类、不同文件,未在本 PR 修、未立单,已回传 PM 定夺):
skills/objectui/rules/protocol.md与skills/objectui/guides/mobile.md、apps/site/app/components/ReactVsObjectUI.tsx仍在教cols,且 AGENTS.md #5 自身的例子也写作cols。Generated by Claude Code