Activity
ActivityFeed from packages/ui — the one audit feed all three dashboards render: the customer's company-security log and the bank's settings log as tables, and an admin detail panel's history as a compact list. Each dashboard passes only its per-type renderers.
Customer · company security
- ActivityFeed
Ten event types with icons and object links, a CFX staff actor (the eye marks it; the tooltip and sr-only text say why), a departed member who keeps their name, and sources from full to IP-only. Page 1 of 5, so Previous is disabled and Next is a link.
Bank · settings
The bank's user.* and workspace.* events, with what each acted on in the object column. The last page of two: Next is disabled and the readout counts from 9.
Admin · detail panel history
The compact list a side panel holds, at a side panel's width. Decisions read as their outcome; a payload hides behind Show details, and a row with none (the delete) offers no toggle.
Loading
Skeleton rows in the columns the loaded table will have, so the layout does not jump; the load is announced from a status region.
Empty states
Three different facts, told apart rather than collapsed into one line. Only the filtered miss has a way out of itself.
Failure
The entries are replaced by the error, announced as an alert. A retry is offered only where the feed can call one.
Narrow containers
Columns drop with the container, not the viewport: Source first, then Object, then Team member, each folding under the event rather than being lost.