Working notes · pre-P2 · built on the real @wordpress/dataviews · ~4 min

Notifications on DataViews: what carries, and what we build

Before I write the P2, I wanted to answer DOTMSD-1297 with something you can click, not a claim. So I rebuilt the panel to @cbusquets1989’s i1 on the real installed @wordpress/dataviews and @wordpress/components, added the slide-out detail both ways, and had it audited line by line against the library source. This page is the work behind the post, @lucasmdo, with the prototype attached.

DataViews carries the notifications list cleanly. Everything that makes it a panel, the unread cue, the slide-out detail, the responsive two-pane, is ours to build on top.Good news: that’s a smaller gap than the “160 lines of override CSS” framing suggested, and most of it points at one fix upstream.

Open the prototype Renders through the real installed packages. Fake data. Click the bell, open a note for the slide-out, widen the window past 1024px to see the two-pane.

If you read nothing else

6DataViews layouts ship, and none is a detail view
100%of the master-detail experience is ours to build, in both modes
14real @wordpress/* components used, zero unjustified bespoke
3of our nastiest CSS hacks deleted by dropping time grouping
1upstream change would move most of the rest into the library

1. What we can build on design-system components today

The hard rule on this build was real components first, bespoke only where the library has no equivalent. It held: an independent review confirmed every element below uses a real @wordpress/* component, and every hand-rolled piece has a genuine gap behind it. The panel is component-honest, not a re-skin pretending to be one.

PieceBuilt with
Notifications listreal DataViews list layout, fields, infinite scroll, empty + loading states
Per-row overflow ⋮native DataViews actions prop, no hand-rolled row menu
Filter tabsTabs from @wordpress/components (private API, see limits)
Panel, header, cardsCard / CardHeader / Heading
Buttons, header menuButton, DropdownMenu / MenuGroup / MenuItem
Reply input + sendInputControl (experimental export)
Layout, text, links, iconsHStack / VStack / Text / ExternalLink / Icon / Spinner
Slide-out detail (both modes)composed from the primitives above, one component with a mode prop, no bespoke UI kit

Three native wins we should just take: the row ⋮ via the actions prop; the built-in empty and isLoading states; and dropping groupBy entirely (i1 is a flat list with time in the row metadata), which deletes the three worst structural CSS hacks in the shipped panel.

2. What DataViews can’t carry (the laundry list)

These are real, verified against the installed @wordpress/dataviews@16 source, not guesses. Each one is either work we own or an upstream gap to log. None of it is a blocker for the relaunch; it is the honest maintenance picture.

What it can’t doWhat that forces on us
No detail / preview / master-detail concept. Six layouts, none of them a pane.Both slide-out modes are 100% app-composed. DataViews gives the click bridge (onChangeSelection on the list layout), not the pane.
No read / unread or row-state concept.Style .is-unread with :has() against the library’s private DOM. A refactor upstream silently breaks it.
Its selected-row styling out-shouts any unread cue.Bypass the selection model entirely (empty selection + our own active marker).
No responsive or container-aware layout switching.The 464 to 927 flip, the width animation, and keeping the row highlighted while a sibling pane shows all live in our code.
Malformed list grid ARIA (role=grid with article rows).Library-side, unfixable by us. Logged as an accessibility gap to push upstream.
No Avatar; no drawer / slide-over primitive; Tabs is private-API only; InputControl is an experimental export.Hand-roll the avatar + status badge, and lean on unstable APIs the shipped panel already depends on.
The library’s WPDS design-token stylesheet isn’t loaded in this app.Its native row backgrounds compute to transparent, so the visual skin is mostly our CSS. “Real library” is true for structure, behavior, and a11y roles, not the paint.

3. The one change that would move most of this into the library

DataViews v16 ships an activity layout: a purpose-built feed (media icon, title, description, a per-row actions menu, grouped or flat, role="feed"). It is the closest thing in Gutenberg to a notifications list, and the natural convergence point. We stayed on list for exactly one reason: activity makes only the title clickable, and a notification row needs the whole row as the target.

The ask to the DataViews team.

Make the whole row a click target on the activity layout, and add a detail render slot with open-vs-selected semantics. Then activity, not list, is the right base for notifications, and roughly half of the overrides above disappear. That is the single highest-leverage thing this evaluation surfaced.

4. Open calls before I write the post

A few things I want a read on, none of them blocking the prototype:

Tell me your laundry list on top of these and I’ll fold it into the next build pass, then the P2 goes out with the prototype linked.