X-11 · Composites · App components
All elements · ObjectDisplay on the Composites page
Last checked 2026-10-22 · Awaiting approval · Accessibility tests
Approve ObjectDisplay
Approving as
Display-definition parsing, tabbed property groups and click-to-edit values. The header shows icon, label, type and actions; each tab is a grid of properties whose values become Fields on click. LabeledObject and LabeledUser chips resolve labels automatically.
Every result resolves to an object. Clicking a result in any view of
Search opens this block; only the presentation
changes, and data-presentation is the axis that says which. A two-pane view (the
Inbox, and Search’s own two-pane view) shows it in place
in the right pane, data-presentation="pane", beside the list it was selected from. Every
other view — table, cards, list, tree — opens it as an OS-style window:
dialog.qf-overlay[data-window] inside the view’s [data-window-area], launched
by [data-ds-open-window] and dragged, snapped and docked by the
OverlaySystem window layer. In that
presentation the window frame carries the object’s icon and title, so the block drops its own and keeps
a compact meta strip; the secondary header actions collapse into an overflow menu and the body scrolls
on its own inside the frame.
The specimen below is copied from
object.html, which shows it inside the app
shell, by bun scripts/design-pages/build-composite-pages.mjs — edit that file, not this
one; --check fails when they drift.
| Axis | Values |
|---|---|
.qf-object · __header · __icon · __label ·
__meta · __actions
|
header |
.qf-properties · .qf-property[data-span=full] · __label ·
__value[data-empty]
|
property grid; hover reveals the edit pencil |
.qf-labeled |
LabeledObject / LabeledUser chip |
data-presentation |
pane — framed, in place, filling the right pane of a two-pane view ·
window — inside dialog.qf-overlay[data-window], which carries the
icon and title instead. Absent: the bare block, laid out by whatever holds it.
|
__heading · __body · __footer ·
__overflow
|
title column (label + meta), the scrolling region, a pinned action bar, and the menu button the icon-only header actions collapse into in the window presentation |
Guidance
When to use
- Use it whenever a result resolves to an object and users need its header, actions and properties.
-
Use
data-presentation="pane"in the right pane of a two-pane view, such as the Inbox or Search two-pane. -
Use
data-presentation="window"when the object opens from a table, list, gallery, kanban or tree as an OverlaySystem window. - Use tabbed property groups when an object has more properties than fit one screen, such as Details, Assessment, Documents and Tasks.
- Use click-to-edit values when users mostly read properties and change one at a time.
When to consider something else
- Use the Form composite when users create a record or edit many fields at once. See Form.
- Use a Card for a short summary of an object in a grid or board. See Card.
- Use DocumentViewer when the object is a file and its content matters more than its properties. See DocumentViewer.
- Use the Inbox detail pane when the object is shown through the task being worked on it. See Inbox.
Usability
-
Show the object's icon, label and type in the header, with its key ID and date in
__meta. -
Keep one primary action (such as Approve) in
__actionsand move secondary icon actions into__overflowin the window presentation. -
Show empty values as muted text such as
Unassignedwithdata-empty, not a blank. -
Use
.qf-labeledchips for linked users and objects so their labels resolve automatically. - Use
data-span="full"for long values such as descriptions.
- Do not repeat the icon and title inside a window; the window frame carries them.
- Do not put more than a few tabs in the body; group properties instead.
- Do not show the edit pencil only on hover; show it on keyboard focus too.
Accessibility
Keyboard
| Keys | Action |
|---|---|
| Tab | Moves through header actions, the tab list, then each property value in the active tab. |
| Arrow Left / Arrow Right | In the tab list, moves to and selects the previous or next tab; Home and End go to the first and last. |
| Enter | On a property value, the binding must turn it into its Field for editing; Escape must cancel and Enter or blur must save. |
| Enter or Space | On More actions, opens the overflow menu; Arrow keys move between items and Escape closes it. |
Roles and names
-
Tabs use
role="tablist",role="tab"witharia-selectedandaria-controls, androle="tabpanel"; hidden panels carryhidden. -
Property values are
<span class="qf-property__value" tabindex="0">; the binding must give each onerole="button"and a name such asEdit Claimant, Jane Doe, or render a real button. -
Property labels and values should be related, for example as a
<dl>or witharia-labelledby, so the label is read with the value. -
In pane presentation the object is an
<article>labeled by its<h2 class="qf-object__label">, as in the Inbox; the binding should do the same in every presentation. -
The overflow button is icon-only with
aria-label="More actions",aria-haspopup="menu"andaria-expanded.
Focus
- Entering edit mode moves focus into the Field; saving or cancelling returns focus to the value.
- In a window, focus starts on the window's first control; Escape closes the window and returns to the result that opened it.
- In a pane, selecting a new result does not move focus into the pane.
Other requirements
-
The hover pencil (
:hover::after) has no focus equivalent in the CSS; show it on:focus-visibletoo so keyboard users see the value is editable. - Status values are chips with text, not color alone (1.4.1).
- The property grid must reflow to one column at 320 CSS pixels (1.4.10).
-
Avatars show initials; the
.qf-labeled__textbeside them carries the full name (1.1.1).
Test your implementation too. This guidance covers the element as specified here. How a screen composes it (labels, order, announcements) still needs its own keyboard and screen reader check.
Accessibility tests
Passed the gate (run 358b316 on 2026-10-22): no finding in any theme. Awaiting a person’s approval of the checklist below.
| Area | Automated | A person checks |
|---|---|---|
| General | Passed | Color is never the only cue, text alternatives say the same thing as the graphic, and the element reads the same in the light and the dark theme. |
| Zoom | Passed | At 200% zoom, at 320 CSS pixels wide and with the WCAG text-spacing overrides, nothing is lost, clipped or overlapping. |
| Keyboard | Passed | Every row of the Keyboard table works, focus is always visible and never trapped, and the tab order follows the reading order. (4 rows) |
| Screen reader | Passed | With NVDA or JAWS on Windows and VoiceOver on macOS, names, roles and states are announced as Roles and names says, and changes are announced once. (5 items) |
Approving. When the checklist passes on the checked run, record it with
bun run a11y:approve -- object --by "Your name" and commit
a11y/approvals.json with the rebuilt pages.
All test status
Package
Consumers link one stylesheet, css/classic/index.css, which includes every element. The
files below are where this element is defined.
| Source |
css/classic/composites/data.csscss/classic/composites/feedback.csscss/classic/composites/inbox.css
|
|---|---|
| Specimens also use | Avatar · Box · Button · Card · Chip · Control · EmptyState · Field · Icon · Menu · Overlay · Table · Tabs · Text · Toggle · Toolbar |
| Sprites | sprites/icons.svg |
| React | Not yet available: the React binding has not started. |
Latest updates
No recorded changes yet.