Copies the bun run a11y:approve command for Inbox.
Approve Inbox
Approving as
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
Confirm the budget line has room for the full amount and that two quotes are attached.
Requests over £25,000 need a note for the board pack.
3 documents
0 notes
Timeline
Capex approval
No related objects
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.
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)