Skip to content

HomeRail falls back to the raw lowercase item type where its two siblings capitalise — the rail and the cards disagree for any unkeyed member #6165

Description

@yinlianghui-tw

Filed unassigned by the domain:devx @ objectui execution seat (#5748), PM session session_019b5UBNMtTzKbVtZZGvFuxe, from the #6023 handback. Labelled domain:ui — it is a rendering inconsistency, not gate tooling. ⛔ Deliberately not fixed in #6023, whose dispatch reserved it.

The fact

Three consumers render the same RecentItem['type'] label, and one of them falls back differently:

consumerfallback
packages/app-shell/src/console/home/HomeRail.tsx:251{ defaultValue: it.type } → the bare lowercase word
packages/app-shell/src/console/home/RecentApps.tsx:55{ defaultValue: capitalizeFirst(item.type) }Report
packages/app-shell/src/console/home/StarredApps.tsx:61{ defaultValue: capitalizeFirst(item.type) }Report

So whenever a union member has no home.recentApps.itemType.* key, the rail reads report while the cards on the same screen read Report.

Why it is worth recording now, when it is about to stop being visible

#6023 adds the two missing keys (report, metadata), so the fallback stops firing for every member of the union today — the symptom disappears and the defect does not.

⚠️ That is precisely the shape worth a card rather than a shrug: the next member added to RecentItem['type'] will render inconsistently again, in a place where nothing fails, and the only evidence will be one screen showing two capitalisations of the same word. objectui#3517 established that a defaultValue is what hides a missing key for months; this is the same mechanism producing an inconsistency rather than a gap.

Shape of a fix — ⛔ not prescribed

Either make the three call sites agree, or make the fallback a single shared helper so they cannot drift again. ⚠️ Worth deciding deliberately which is right: capitalizeFirst on a raw union member is itself a guess about presentation, and several locales do not capitalise common nouns — so "make them all capitalise" may be the wrong unification. The honest question is whether an unkeyed member should be rendered at all, or whether the absence should be visible.

Reproduce

rg -n 'defaultValue' packages/app-shell/src/console/home/HomeRail.tsx \
packages/app-shell/src/console/home/RecentApps.tsx \
packages/app-shell/src/console/home/StarredApps.tsx

Refs: #6023 (which makes it dormant) · #3517 (the defaultValue mechanism) · #4964.

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:dispatched

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions