Activity feeds

A chronological stream of who did what. The kit ships one component, FeedItem — avatar, header, optional supporting block, connector; the feed list is yours.

Demo

Change the props and copy the result. Size, connector, and unseen are real props; the snippet emits the whole object.

size
Supporting item
import { FeedItem } from "@/components/application/activity-feed/activity-feed"; const item = { "id": "demo", "user": { "name": "Olivia Rhye", "href": "#", "avatarUrl": "https://www.untitledui.com/images/avatars/olivia-rhye?fm=webp&q=80" }, "date": "2 mins ago", "action": { "content": "Commented in", "target": "Marketing site redesign", "href": "#" }, "message": "“Lorem ipsum dolor sit amet, consectetur adipiscing elit. Tincidunt nunc ipsum tempor purus vitae id.”" }; <FeedItem {...item} connector />

The row takes an object, not children

Everything in a row comes from a FeedItemType fixture spread onto the component. There is no children slot, so the copied snippet carries the object with it.

Contextual demo

The kit ships the row, never the list. The feed loop and its connector rule need a whole screen, so they have one.

Two of the three divider treatments are the kit’s

connector on and off are real props. The horizontal rule is application markup, because the sheet’s container carries a Divider axis the kit has no counterpart for.

The family

One component. The feed itself is yours to assemble; see Contextual demo above.

The components in this family, with their descriptions and import paths
ComponentDescriptionImport from
FeedItemOne feed row: an avatar with optional status, a header of name, time, and action, an optional supporting block, and the connector down to the next row.@/​components/​application/​activity-feed/​activity-feed

Built from

Five kit pieces make up a row. Four have their own docs page.

Component
Where it’s used here
AvatarThe portrait and its online status dot, sized by the size prop.
ButtonThe action target, as color="link-color" size="sm" rendered as an anchor.
BadgeEach entry in labels, at size sm.
FileIconThe attachment icon, from @untitledui/file-icons.

The variant space

All 16 rows the Figma sheet draws: four supporting items, connector on and off, at both sizes. Every cell is live.

size sm
None, connector on
None, connector off
File, connector on
File, connector off
Labels, connector on
Labels, connector off
Text, connector on
Text, connector off
size md
None, connector on
None, connector off
File, connector on
File, connector off
Labels, connector on
Labels, connector off
Text, connector on
Text, connector off

Size moves the avatar and nothing else

Measured in the browser: 32px at sm and 40px at md, with identical row heights, text sizes, gaps, and padding. The sheet does the same, with its sm and md symbols the same height to the pixel, so this is the kit tracking the design rather than a size system that stops halfway.

States

The row has no states. What responds are the links inside it, the avatar’s status dot, and the unseen marker.

Unseen: the 10px success dot, top right
Avatar status: online
Links: hover and focus the name and the target