Activity feed

Chronological list of team events with avatars, action verbs, and relative timestamps.

Fri, Oct 30
JB

Jordan Burke uploaded 3 images to Easter Series

PN

Priya Nair changed status toCompleted

MW

Marcus Webb commented on Welcome Video Script

AR

Alex Rodriguez changed status toNew member

Thu, Oct 29
SC

Samantha Cho changed status toNeeds review

TB

Tyler Brooks created project VBS 2025

Wed, Oct 28
LM

Leah Monroe uploaded the final cut of Baptism Highlight Reel

DH

Derek Hines completed Sermon Slide Deck — April 27

Installation
$Terminal
npx shadcn@latest add https://sdk-components.thesqd.com/r/activity-feed-showcase.json
Usage
Import ActivityFeed and pass an array of items.
TSImport
import { ActivityFeed, type ActivityFeedItem } from "@/components/blocks/activity-feed";
TSExample
import { ActivityFeed } from "@/components/blocks/activity-feed";

const items = [
  {
    id: "1",
    user: { name: "Jordan Burke" },
    action: "uploaded 3 images to",
    target: "Easter Series",
    timestamp: new Date().toISOString(),
    type: "upload",
  },
];

export function Example() {
  return (
    <ActivityFeed
      items={items}
      groupBy="day"
      showRelativeTime
      showSearch
      showFilter
      filterTypes={["upload", "comment", "join", "complete"]}
    />
  );
}
Composition
Anatomy of the ActivityFeed component.
ActivityFeed                              (main component)
├── title?                                (string | null — default "Activity Feed"; null hides header)
├── description?                          (string — default "Recent team activity and updates")
├── card?                                 (boolean — default true; false renders bare list)
├── variant?="activity" | "notifications" (default "activity"; "notifications" switches to notification-center layout)
├── showSearch?                           (boolean — show search input. Default false)
├── searchPlaceholder?                    (string — search input placeholder)
├── showFilter?                           (boolean — show type filter. Default false; requires filterTypes)
├── filterTypes?                          (ActivityType[] — options for the type filter)
├── onMarkAllAsRead?                      (notifications variant — renders a "Mark all as read" action when provided)
├── markAllAsReadLabel?                   (string — default "Mark all as read")
├── items                                 (ActivityFeedItem[])
│   ├── id                                (string — unique key)
│   ├── user                              (ActivityFeedUser)
│   │   ├── name                          (string — display name)
│   │   ├── initials?                     (string — fallback if no avatar)
│   │   └── avatar?                       (string — image URL)
│   ├── action                            (string — verb, e.g. "uploaded")
│   ├── target?                           (string — optional object, e.g. project name)
│   ├── timestamp                         (ISO string | Date)
│   ├── icon?                             (ReactNode — overrides avatar with a lucide icon)
│   └── type?                             (string — used by filterTypes)
├── groupBy="day" | "none"                (default: "day")
├── showRelativeTime                      (boolean, default: true — "2h ago" or absolute)
├── emptyState?                           (ReactNode — replaces the default Empty component)
└── className?                            (string)
Default
Items grouped by day with relative timestamps, avatar initials, search, and type filter.
Fri, Oct 30
JB

Jordan Burke uploaded 3 images to Easter Series

PN

Priya Nair changed status toCompleted

MW

Marcus Webb commented on Welcome Video Script

AR

Alex Rodriguez changed status toNew member

Thu, Oct 29
SC

Samantha Cho changed status toNeeds review

TB

Tyler Brooks created project VBS 2025

Wed, Oct 28
LM

Leah Monroe uploaded the final cut of Baptism Highlight Reel

DH

Derek Hines completed Sermon Slide Deck — April 27

With icons
Pass an icon per item to replace avatars with action-specific lucide icons. Includes search and type filter.
Fri, Oct 30

Jordan Burke uploaded 3 images to Easter Series

Priya Nair changed status toCompleted

Marcus Webb commented on Welcome Video Script

Alex Rodriguez changed status toNew member

Thu, Oct 29

Samantha Cho changed status toNeeds review

Tyler Brooks created project VBS 2025

Wed, Oct 28

Leah Monroe uploaded the final cut of Baptism Highlight Reel

Derek Hines completed Sermon Slide Deck — April 27

Compact
Set card={false} and groupBy="none" for a flat bare list — useful in sidebars or narrow panels.
JB

Jordan Burke uploaded 3 images to Easter Series

PN

Priya Nair changed status toCompleted

MW

Marcus Webb commented on Welcome Video Script

AR

Alex Rodriguez changed status toNew member

SC

Samantha Cho changed status toNeeds review

TB

Tyler Brooks created project VBS 2025

LM

Leah Monroe uploaded the final cut of Baptism Highlight Reel

DH

Derek Hines completed Sermon Slide Deck — April 27

Empty state
Renders the default Empty component when items is an empty array.

No activity yet

Events will appear here as your team takes action.

Hide search & filter
Defaults for `showSearch` and `showFilter` are both `false` — omit them (or set false) for a header-only feed.
Activity Feed
No search, no filter — header-only.
Fri, Oct 30
JB

Jordan Burke uploaded 3 images to Easter Series

PN

Priya Nair changed status toCompleted

MW

Marcus Webb commented on Welcome Video Script

AR

Alex Rodriguez changed status toNew member

Thu, Oct 29
SC

Samantha Cho changed status toNeeds review

TB

Tyler Brooks created project VBS 2025

Wed, Oct 28
LM

Leah Monroe uploaded the final cut of Baptism Highlight Reel

DH

Derek Hines completed Sermon Slide Deck — April 27

Card section wrapper
Same dashboard treatment as the data-grid `card-section` variant: wrap a `card={false}` ActivityFeed in an outer `<Card>` with a `<SectionHeader>` title + right-aligned "View all →" action.
Recent activity
Fri, Oct 30
JB

Jordan Burke uploaded 3 images to Easter Series

PN

Priya Nair changed status toCompleted

MW

Marcus Webb commented on Welcome Video Script

AR

Alex Rodriguez changed status toNew member

Thu, Oct 29
SC

Samantha Cho changed status toNeeds review

TB

Tyler Brooks created project VBS 2025

Wed, Oct 28
LM

Leah Monroe uploaded the final cut of Baptism Highlight Reel

DH

Derek Hines completed Sermon Slide Deck — April 27

Notification center
Pass `variant="notifications"` to switch to the notification-center layout: bold body text, category/timestamp sub-row, per-item unread dot, status dot overlaid on the avatar, single-select tab pills for `filterTypes`, and an optional `onMarkAllAsRead` action.
Notifications
Fri, Oct 30
C

Courtney booked a haircut with Barber Mike

New BookingsOct 30, 20262:50 PM

S

Smith rescheduled a haircut with Barber

RescheduledOct 30, 202611:50 AM

JD

John Doe registered as a new barber

New barber registrationsOct 30, 20268:50 AM

Barber Tom has updated his availability for the week.

Shift reminderOct 30, 20266:50 AM

LB

Lisa Brown rated Barber Jason 5 stars

New ReviewOct 30, 20262:50 AM

Thu, Oct 29
SJ

Sarah Johnson booked a Beard Trim with Barber Alex

New BookingsOct 29, 20264:50 PM

DM

David Miller scheduled a Fade Cut with Barber Chris

New BookingsOct 29, 20264:50 PM

API Reference
Props for the ActivityFeed component and its item/user types.

ActivityFeed

PropTypeDefaultDescription
itemsActivityFeedItem[]—Array of activity items to display, most-recent rendered first within each group.
titlestring | null"Activity Feed"Card header title. Pass null to suppress the header entirely.
titleFont"heading" | "sans""sans"Title font face. `"heading"` renders the title in the Albra display face at the larger SectionHeader scale — used by the dashboard `card-section` pattern.
titleColor"default" | "violet""violet"Title color when `titleFont === "heading"`. `"violet"` applies Squad violet (#341756) in light mode. No effect on the default sans title.
fullHeightbooleantrueStretch the Card wrapper to fill its parent's height so feeds in a grid row equalize. Pass `false` to hug content.
descriptionstring"Recent team activity and updates"Card header description shown below the title.
headerActionReactNode—Right-aligned node rendered next to the title (typically a "View all →" link button). Replaces the auto search/filter controls in the CardAction slot.
cardbooleantrueWrap the feed in a Card shell. Pass false to render the bare list (useful when embedding in another card).
variant"activity" | "notifications""activity"Switch the layout. `notifications` renders a notification-center view: bold body, category/timestamp sub-row, per-item unread dot, single-select tab pills for `filterTypes`, optional "Mark all as read" action.
showSearchbooleanfalseShow the search input above the list.
searchPlaceholderstring"Search activity…"Placeholder for the search input.
showFilterbooleanfalseShow the type filter. In `activity` variant renders a multi-select Select; in `notifications` renders single-select tab pills. Requires `filterTypes`.
filterTypesActivityType[]—Options for the type filter. Items match via their optional `type` field.
onMarkAllAsRead() => void—Notifications variant — renders a "Mark all as read" action button when provided.
markAllAsReadLabelstring"Mark all as read"Label for the mark-all action.
groupBy"day" | "none""day"When "day", items are bucketed under "Today" / "Yesterday" / date headers.
showRelativeTimebooleantrueShow "2h ago" style labels. On hover a Tooltip shows the absolute timestamp.
emptyStateReactNode—Custom empty-state element rendered when items is empty.
classNamestring—Override or extend the wrapper classes.

ActivityFeedItem

PropTypeDefaultDescription
idstring—Unique identifier used as the React key.
userActivityFeedUser—Who performed the action.
actionstring—Action verb or phrase, e.g. "uploaded".
targetstring—Optional target name rendered after the action.
timestampstring | Date—ISO date string or Date object.
iconReactNode—Optional leading icon that replaces the avatar.
typestring—Free-form type tag matched against filterTypes.
unreadboolean—Notifications variant — marks the item as unread (leading dot + tonal row).
categorystring—Notifications variant — small source label rendered before the date.

ActivityFeedUser

PropTypeDefaultDescription
namestring—Full display name shown as bold text.
initialsstring—Fallback initials if avatar is absent. Auto-computed from name if omitted.
avatarstring—Image URL for the user avatar.