Activity feed
ProA team activity feed grouped by day, with filters, a live new updates pill, expandable diffs, and a mark all read sweep.
Live block · sample data
- A workspace or project activity page for a team product.
- A dashboard panel that shows what changed since someone last looked.
- Use audit-log for compliance history that needs search, export, and exact timestamps.
- Use notification-center for a personal inbox opened from a bell.
- Use changelog-feed for public release notes.
Installation
Pro source and install commands unlock with a Pro plan.
Usage
Use this for a workspace or project activity page. Load events from your activity API, stream new ones in through the items prop, and persist read state through onReadChange; new events in the preview are simulated.
example.tsx
import { ActivityFeed } from "@/components/arc/blocks/activity-feed/activity-feed"; export function ProjectActivity({ events, live }: { events: Activity[]; live: Activity[] }) { return <ActivityFeed items={events} incoming={live} onRead={ids => markRead(ids)} />;}ActivityFeed
A team activity feed grouped by day with sticky day headings, filters for people, type, and date range, expandable comments, diffs, deploy details, and photos, a live new updates pill, and a mark all read sweep.
PropTypeDefaultDescription
itemsActivity[]activitiesEvents, newest first: id, type, actor, action, target, project, day offset, time, unread, and an optional detail.incomingActivity[]incomingActivitiesEvents that arrive while the feed is open. They wait behind the pill. Pass [] to turn off the simulation.incomingIntervalnumber6000Milliseconds between simulated arrivals.todaystring"2026-09-24"ISO date the day offsets count back from.defaultRange"today" | "week" | "month""week"Initial date range.onRead(ids: string[]) => void–Called when events are marked read, one at a time or all at once.titlestring"Activity"Heading.classNamestring–Class on the root.- Tab
- Moves through filters, the pill, and each expandable event.
- EnterorSpace
- Expands or collapses an event and marks it read.
- Escape
- Closes the people filter and returns focus to its button.
- Each day is a labeled section with a heading; events are an ordered list.
- Expandable events are buttons with aria-expanded and aria-controls.
- Unread state is spoken as part of the event and shown with a dot and a wash, not color alone.
- Type filters are toggle buttons with aria-pressed; the people filter uses real checkboxes.
- A polite status region announces new updates shown and how many were marked read.
- New events queue behind a pill so the list never jumps while someone reads; showing them slides the list down and scrolls to the top.
- Mark all read sends a hairline down the list; each row lets go of its dot and wash exactly as the line passes it.
- Filtering fades rows out and closes the gaps on a spring.
- Details open with a height spring and a rotating chevron.
- Reduced motion removes the sweep delay, travel, and blur and keeps instant state changes.
- Type filters scroll sideways on narrow screens.
- Below 440px the time moves into the meta line under each event.
- Day headings stick with a translucent material while their events scroll under them.
- Filtering is memoized over the item list.
- The sweep uses CSS transition delays and one Web Animations API line, so it costs no React renders per row.
- Photos load through next/image at 96px.
Notes for AI
Give your coding assistant the Markdown reference instead of screenshots.
- Map your events to action and target so each row reads as one sentence.
- Push websocket events into incoming; the pill counts them and merges them on click.
- Keep details short: a comment, a small diff, a deploy summary, or up to four photos.
- Persist read state through onRead.
The full library index for assistants is at /llms.txt.










