Skip to content

Inbox

X-12 · Composites

All elements · Inbox on the Composites page

Last checked 2026-10-22 · Awaiting approval · Accessibility tests

Copies the bun run a11y:approve command for Inbox.

Inbox

X-12WCAG 2.2 AA · Passed

A Search (X-02) with its own treatment: every result set is a canned search, and there is no filter rail. The app bar tabs (Active · Completed · Delegated) are the canned searches. Saved searches reuse the same two panes: a task list on the left and the selected task on the right. Pagination or Load more sits under the list. Saved searches are a menu button in the toolbar; the .qf-saved-views chip row stays in the markup but is hidden.

The right pane has two presentations. Which one shows is a user setting, not a control on the page: Open inbox tasks as in the identity menu, beside the theme, sets .qf-inbox[data-view]. Task view is task-centric. Its header is the task (process, step, status and the object it is on) on a tinted band, with the task’s facts under it: Due, Received, Assigned to, Working user and Last action. The v2 API edits none of those facts, so they are read-only; the header’s buttons are the state changes it does allow, Put on hold and Put back. The body groups the rest into cards: Instructions, the object (its fields and initiating document) and the object’s notes. The footer completes the task with an outcome, the default one filled and one with a note in More, or offers Work task while the task waits in a queue. Object view is how the product works today: the object is the header, then its fields and its activity tabs (Active Task · Documents · Notes · Timeline · Workflow · Related) opened on Active Task, where the task is worked through Instructions, Completion Options, Note and Submit.

Everything a task shows comes from the v2 task (status, dueDate and daysOverUnder, startDate, assigneeId, workingUserId, processName, lastAction, instructions, initiatingDocumentVSId, availableCompleteTaskActions) or from a lookup it names: user and group labels, the object’s label and fields, and the object’s notes, which have a subject and a date but no author. The API has no priority, sender, unread state, step position or delegation, so the Inbox shows none. List rows carry only list data: the task name, process and object type, due state and status.

The Inbox is the two-pane case of the rule that every result resolves to an object: selecting a task in the left list shows that task’s .qf-object[data-presentation="pane"] on the right, and the row it came from carries aria-selected="true" (aria-current="true" is styled the same way, for two-pane views whose list is not a listbox). The right pane is not a bespoke reader: it is the ObjectDisplay block with the Inbox’s own sections composed into its __body. A view that is not two-pane opens the same object as a window instead — see ObjectDisplay.

The full-screen page is inbox.html, inside the app shell and styled by css/classic/composites/inbox.css. The specimens below are copied from inbox.html by bun scripts/design-pages/build-composite-pages.mjs — edit that file, not this one; --check fails when they drift.

Axis Values
.qf-search.qf-inbox two-pane Search: toolbar across the top, task list and footer on the left, detail on the right; no filter rail
__tasks · __task scrolling list pane (.qf-list[data-divided][data-interactive], listbox) and one task row; aria-selected (or aria-current) marks the task whose object the right pane is showing
__due[data-state] overdue · due-soon (none: muted)
__saved · __saved-label · __saved-chevron saved-searches menu button, soft with the search name while one is applied: labelled (icon only below a 36rem toolbar)
[data-view] task · object: which detail pane shows, from the user’s Open inbox tasks as setting ([data-inbox-view] items in the identity menu)
__detail[data-view] the right pane, one per view: .qf-object[data-presentation="pane"] placed in the grid, holding .qf-object__header, __heading, __body and __footer; __eyebrow above the label names what the pane is (Task · process, or the object type)
__facts · __fact Task view: the task’s read-only facts in a band under the header; the header’s own buttons are the state changes (Put on hold · Put back), the footer the outcomes or Work task
__group[data-tone] · __document · __notes Task view: a card in the sunken body (info: the instructions); the initiating-document row inside the object card; the object’s notes, subject and date
__activities · __active-task Object view: the object’s activity tabs, and the Active Task panel (__active-head, __task-name, __ask, __active-actions)
Task view: canned search (Active), a task you are working
Object view: the same task, its object open on the Active Task tab
Task view: saved search (Finance team), a queue task not started, with Load more

Guidance

When to use

  • Use it as the home for the user's workflow tasks: a task list on the left and the selected task on the right.
  • Use it when result sets are canned searches (Active, Completed, Delegated) chosen from the app bar tabs, plus saved searches.
  • Use task view when users work task by task: instructions, the object, its notes and an outcome to complete.
  • Use object view when users work from the object: its fields and activity tabs, with the task under Active Task.

When to consider something else

  • Use Search when users need free filtering with a filter rail or other result views. See Search.
  • Use the NotificationCenter for events the user only needs to read. See NotificationCenter.
  • Use a DataGrid when users process many tasks in bulk by column rather than one at a time. See DataGrid.
  • Use OverlaySystem windows when users need several tasks or objects open side by side. See OverlaySystem.

Usability

Do
  • Keep list rows to list data: task name, process and object type, due state and status.
  • Show due state as text with an icon (2d overdue, Due today), using __due[data-state] for overdue and due-soon.
  • Let the user choose task or object view in the identity menu (Open inbox tasks as); do not add a switch on the page.
  • Put the task's state changes (Put on hold, Put back) in the header and its outcomes in the footer, with the default outcome filled.
  • Show Pagination or Load more under the list.
Don’t
  • Do not show data the v2 task API does not provide, such as priority, sender, delegation or step position.
  • Do not make the task facts (Due, Received, Assigned to, Working user, Last action) editable; they are read-only.
  • Do not let a saved search and an app bar tab look selected at the same time.
  • Do not show due state by color alone.

Accessibility

Keyboard

Inbox keyboard
Keys Action
Tab Moves from the toolbar (query, saved searches, refresh) into the task list as one tab stop, then the pagination, then the detail pane.
Arrow Down / Arrow Up In the task list, moves focus to the next or previous task; Home and End go to the first and last.
Enter or Space Selects the focused task and shows it in the right pane; the selected task keeps the list's tab stop.
Enter or Space On the saved searches button, opens its menu; Arrow keys move between searches and Escape closes it.
Arrow Left / Arrow Right On the app bar tabs, switches between Active, Completed and Delegated.

Roles and names

  • The task list is <ul role="listbox" aria-label="Active tasks"> with role="option" rows; aria-selected="true" marks the task in the right pane and roving tabindex follows it.
  • The detail is <article class="qf-object" data-presentation="pane" aria-labelledby> pointing at its <h2 class="qf-object__label">; body sections use <h3> headings.
  • The toolbar is role="toolbar" with an aria-label naming the search; the query is labeled Search tasks.
  • Saved searches are menuitemradio items with aria-checked.
  • Pagination is <nav class="qf-pagination" aria-label="Task pages">.

Focus

  • Selecting a task does not move focus into the detail pane; users Tab or use a landmark key to reach it.
  • After completing a task, move focus to the next task in the list and announce the result.
  • The header's Open task button has no behavior in the reference; if the binding opens a window from it, closing that window must return focus to the button.

Other requirements

  • Announce the selected task's title when the pane changes, or rely on the option's own name being read on selection (4.1.3).
  • Overdue and due-soon states carry text and an icon, so they are not color only (1.4.1).
  • The two panes must stack or reflow at 320 CSS pixels (1.4.10).
  • Task rows and footer buttons must meet 24 by 24 CSS pixels (2.5.8).

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

WCAG 2.2 AA · Passed

Passed the gate (run 358b316 on 2026-10-22): no finding in any theme. Awaiting a person’s approval of the checklist below.

Inbox test checklist
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. (5 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 -- inbox --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.

Inbox package
Source css/classic/composites/inbox-detail.css
css/classic/composites/inbox.css
Specimens also use Accordion · Avatar · Box · Button · ButtonGroup · Card · Chip · Control · EmptyState · Field · Icon · List · Menu · ObjectDisplay · Pagination · Search · Select · Table · Tabs · Text · Toolbar
Sprites sprites/icons.svg
React Not yet available: the React binding has not started.

Latest updates

Inbox latest updates
Date Version Breaking Description
2026-10-20 0.1 Yes Classic is the only skin: css/modern/ and js/skin.js are removed, so consumers link css/classic/index.css directly (no data-skin-sheet swap) and keep data-skin="classic" on <html> for scripts. The skin switch is gone from the site's app bar, the shell's identity menu and the Office review strip; theme stays. The per-skin composite pages are single pages: composites/shell.html, inbox.html, overlay-system.html and search.html replace the *.classic.html and *.modern.html pairs
2026-10-20 0.1 No Inbox: the toolbar is the search toolbar as the app has it: query (with Search on Enter) · bookmark · Filters · sort · spacer · export · auto-refresh (a switch) · task list width (Narrower · Wider · Reset). The Saved searches chips and menu are gone (saved searches live in the sidebar and the bookmark), classic skin
2026-09-30 0.1 No Inbox (both skins): the query field prefers 20rem and gives way first, so it takes the toolbar's room before the spacer does
2026-09-30 0.1 No Task view vs Object view is a user setting; task-centric header and grouped cards; only v2-backed task data (X-12)
2026-09-30 0.1 No Inbox (classic): two task presentations, Task view and Object view, switched per user from the toolbar (X-12)
2026-09-15 0.1 No Table, cards and list results; inbox two-pane composite (X-12)

All release notes