fix(example-showcase): project-detail 的 tab token 改用声明的 value (#5776) - #6598
Merged
Conversation
`page:tabs` 的 `items[]` 上,稳定的 `?tab=` URL token 只有一个拼法:`value` —— 既是 `PageTabsProps.items[]` 声明的键(#5775 补上),也是 objectui tabs renderer 唯一读的键(`containers.tsx`:非空字符串 `it.value` 才作数,否则按 下标派生)。这两个 tab 写的是 `key`,两侧都不认识:schema 是 strip 模式,parse 把它剥掉;renderer 回落到 `tab-<i>`。页面看起来正常,深链回不到原来那个 tab, 而作者拿到的是成功回执 —— ADR-0078 的教科书形状。#5068 的 `component-props-unknown-key` 闸门对这一处正好报了 2 条。 只改两行键名,零 spec / 零 objectui 改动:声明与 renderer 早已在 `value` 上一致, 错的是语料。 新增 `test/project-detail-tabs.test.ts` 同时钉形状与语义:token 写在声明的 `value` 下、能过 `PageTabsProps` 的 parse 且不被剥掉(这正是 `key` 与 `value` 的全部差别)、showcase 语料里任何 tab item 都不再出现 `key`/`id`/`name`/ `tabKey`/`slug` 这些近似拼法、token 语义且互不相同(下标派生值不具备的性质)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
qq9340100
marked this pull request as ready for review
August 8, 2026 07:22
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #5776
做了什么
examples/app-showcase/src/ui/pages/project-detail.page.ts的page:tabs上,两个 tab 的稳定?tab=URL token 写成了key:。这个拼法两侧都不认识:PageTabsProps.items[](packages/spec/src/ui/component.zod.ts)声明的是label/icon/visibleWhen/value/count/children—— 没有key。schema 是 strip 模式,parse 直接把它剥掉。packages/components/src/renderers/layout/containers.tsx)只认非空字符串的it.value,否则按下标派生 token。所以两个 tab 的 token 一直是下标派生值,深链回不到原来那个 tab,而作者拿到的是成功回执 —— ADR-0078 的教科书形状。
零 spec 改动、零 objectui 改动:声明与 renderer 早就在
value上一致(声明由 #5775 / PR #6281 补齐),错的只是这份语料 —— 修在生产者侧,不在消费者侧加别名(Prime Directive #12)。前提复核(origin/main
a36db28b7)key:project-detail.page.ts:43/:59(行号未漂移)items[].value与count已声明component.zod.ts的PageTabsProps.items[]里都在,注释直接点名「Declared for #5776」value、不读keycontainers.tsx只有it.value一处读;全文件搜不到任何.key读取page-walk.ts既走regions[].components[]也走slots.*,本页是kind: 'slotted'逆向验证(方向先判后跑:预期 before 红 / after 绿)
#5068 闸门 ——
os validate实跑,showcase 全量语料:page:tabs相关key:)`key` is not a prop `page:tabs` declaresvalue:)两份输出逐行 diff 只有那 2 行的删除,没有任何新增诊断。直接调
validateComponentProps对 28 个 showcase page 复量,结论一致(4 → 2;剩下 2 条属别的单,见下)。新增的钉子测试 —— 把
key:改回去,4 条断言全红,而且红的方式本身就是证据:第二条的
[ undefined, undefined ]正是 strip 模式的实证:key过不了 parse,token 根本到不了消费者。i18n:预期不动,实测不动。
value是 URL token 不是 label,而_tabs那个翻译槽喂的是对象筛选预设 tab(interfaceConfig.userFilters.tabs),跟page:tabs的 items 不是一个载体。pnpm check:i18n-coverage→OK (12 config(s), 660 baselined untranslated string(s), none new)。闸门台账
#5068没有独立的违例基线文件 —— 清单是 warning 期的实跑输出(上表即是),本 PR 把其中 2 条销账,无文件可改。一处如实记录:
packages/lint/src/validate-component-props.ts的模块头写着「距离 error 升级还差 #5728 与两处页面改写(page:card.visible;#5776 的 tabkey)」。那两处现在都已落地(前者 #6513,后者本 PR),这句话已经过期 —— 但把它改对需要跨全部 example 语料重新盘一遍剩余违例,超出本单一行修复的范围,故未在本 PR 内改写,留给 error 升级那一单连同新清单一起写。测试
pnpm --filter @objectstack/example-showcase test→ 15 files / 154 tests 全绿(含新增 4 条)pnpm --filter @objectstack/example-showcase typecheck→ 通过pnpm --filter @objectstack/example-showcase validate→✓ Validation passedpnpm check:i18n-coverage→ OK, none newnode scripts/check-nul-bytes.mjs→ OK(6162 个文件,无裸控制字节)eslint两个改动文件 → 无输出changeset
@objectstack/example-showcase是private: true的示例包,不在.changeset/config.json的 fixed 组里,本 PR 不发布任何包 —— 因此打skip-changeset,不写 changeset(与同类的 #6513 一致)。顺手发现(未在本 PR 内修)
同一轮闸门实跑里,showcase 还剩 2 条违例:
element:button的action.params形状之争已由 #5777 跟踪;另一条properties.actionName(src/ui/pages/index.ts:82的 "Create Task" 按钮)此前无单,已另开 #6597 —— renderer 的handleClick开头就是if (!action ...) return;,只写actionName的按钮点了没反应,与本单同一形状。Generated by Claude Code