Repository navigation
Console records: a hover card on every record reference (compact related rows, relation columns, lookup chips) shows the target's declared highlightFields without navigating #27604
Description
epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff
Filed from the record-page epic #26676 as a sub-issue (the maintainer, 2026-10-29, looking at Twenty's inline relation expand: 「他的相关表字段点击下拉箭头可以展开」; the seat recommended a stateless hover card over an inline accordion and the maintainer answered 「同意」). It adds one face to a referenced record — a glance — without a drill-down; it is not part of the v4 anatomy (#27524) and flies on its own.
Source (main 273137d227)
- A referenced record has three faces today: the compact related row (name + one chip, Record page v4: the related column becomes a stack of same-shaped panels — chevron beside the title, hover-only handle and actions on the right (⋯ holds hide only), empty panels folded, the timeline as a panel that can be promoted to a column, one right-panel icon in the header, no crumb row, the drawer sized by its own width #27524 item 11), the row in the enlarged tab's table, and the drill-down record one level down (console record drawer v2: the bar is ↑ ↓ · ⤢ · ✕ (no object name, no counter); a related row or a lookup opens its record in place with a trail, ← / Esc go back one level; ⤢ carries the trail into the page; on the record page a related row opens a drawer over the page #26679). Looking at a referenced record's key fields means drilling down and coming back.
- Twenty expands a relation chip inline into a field list (stateful; it stretches the card and pushes the panels below). Linear, GitHub and Attio show a hover card on a reference instead.
- The record header's highlights and the list's highlights both read the object's declared
highlightFields(max 6, the name field excluded).
Target
- One hover card for every record reference: hovering the name in a compact related row, a relation cell in a list / the enlarged tab's table, or a lookup chip in the details column shows, after ~400 ms, a card with the target's icon + name (a link that opens it the way a click would) and its declared
highlightFieldsminus the name (max 6), in the target object's own field renderers (chips, currency, dates). Keyboard: focusing the reference and pressing Space shows the same card; Esc hides it. - Stateless: no expand state, no stretching of the host; the card floats (popover), dismisses on mouse-out / blur; one card at a time.
- Data: one request per shown card, cached per record for the page's life; never prefetched for every row (a list of 200 rows must not fire 200 requests).
- Scope: console only, every object; the card's content comes from metadata (
highlightFields), nothing authored per object; ⛔packages/spec/**, no new key. Objects whosehighlightFieldsresolve to nothing show the name and the object label only.
File surface
ui/packages/plugin-detail/src/RelatedCardStack.tsx / relatedListCompact.ts (the row's reference), the lookup / relation field renderers in ui/packages/components/src/** (one shared RecordHoverCard component beside the existing lookup popover), the list / grid relation cells in ui/packages/plugin-list / plugin-grid, i18n (the object label fallback), tests beside, changeset.
Acceptance
- Tests: the card shows the declared highlights minus the name for a lead, a contact (no status field — nothing invented) and a product; a reference with no highlights shows name + object label; one request per card, none on row render; keyboard Space / Esc; the card never changes the host's layout.
- Screenshots on HotCRM: the card over a related row in the split pane, over a relation cell in the 任务 tab's table, and over a lookup chip in the details column, on a never-merged evidence branch.
- The epic seat verifies in the console preview before ACCEPT (maintainer: 「车队开发完后你审核效果」).
Activity