Jordan Burke uploaded 3 images to Easter Series
12m agoPriya Nair changed status toCompleted
2h agoMarcus Webb commented on Welcome Video Script
5h agoAlex Rodriguez changed status toNew member
9h agoSamantha Cho changed status toNeeds review
1d agoTyler Brooks created project VBS 2025
1d agoLeah Monroe uploaded the final cut of Baptism Highlight Reel
2d agoDerek Hines completed Sermon Slide Deck — April 27
2d agonpx shadcn@latest add https://sdk-components.thesqd.com/r/activity-feed-showcase.jsonimport { ActivityFeed, type ActivityFeedItem } from "@/components/blocks/activity-feed";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"]}
/>
);
}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)Jordan Burke uploaded 3 images to Easter Series
12m agoPriya Nair changed status toCompleted
2h agoMarcus Webb commented on Welcome Video Script
5h agoAlex Rodriguez changed status toNew member
9h agoSamantha Cho changed status toNeeds review
1d agoTyler Brooks created project VBS 2025
1d agoLeah Monroe uploaded the final cut of Baptism Highlight Reel
2d agoDerek Hines completed Sermon Slide Deck — April 27
2d agoJordan Burke uploaded 3 images to Easter Series
12m agoPriya Nair changed status toCompleted
2h agoMarcus Webb commented on Welcome Video Script
5h agoAlex Rodriguez changed status toNew member
9h agoSamantha Cho changed status toNeeds review
1d agoTyler Brooks created project VBS 2025
1d agoLeah Monroe uploaded the final cut of Baptism Highlight Reel
2d agoDerek Hines completed Sermon Slide Deck — April 27
2d agoJordan Burke uploaded 3 images to Easter Series
12m agoPriya Nair changed status toCompleted
2h agoMarcus Webb commented on Welcome Video Script
5h agoAlex Rodriguez changed status toNew member
9h agoSamantha Cho changed status toNeeds review
1d agoTyler Brooks created project VBS 2025
1d agoLeah Monroe uploaded the final cut of Baptism Highlight Reel
2d agoDerek Hines completed Sermon Slide Deck — April 27
2d agoJordan Burke uploaded 3 images to Easter Series
12m agoPriya Nair changed status toCompleted
2h agoMarcus Webb commented on Welcome Video Script
5h agoAlex Rodriguez changed status toNew member
9h agoSamantha Cho changed status toNeeds review
1d agoTyler Brooks created project VBS 2025
1d agoLeah Monroe uploaded the final cut of Baptism Highlight Reel
2d agoDerek Hines completed Sermon Slide Deck — April 27
2d agoJordan Burke uploaded 3 images to Easter Series
12m agoPriya Nair changed status toCompleted
2h agoMarcus Webb commented on Welcome Video Script
5h agoAlex Rodriguez changed status toNew member
9h agoSamantha Cho changed status toNeeds review
1d agoTyler Brooks created project VBS 2025
1d agoLeah Monroe uploaded the final cut of Baptism Highlight Reel
2d agoDerek Hines completed Sermon Slide Deck — April 27
2d agoCourtney booked a haircut with Barber Mike
New Bookings·Jun 25, 2026·8:44 PM
Smith rescheduled a haircut with Barber
Rescheduled·Jun 25, 2026·5:44 PM
John Doe registered as a new barber
New barber registrations·Jun 25, 2026·2:44 PM
Barber Tom has updated his availability for the week.
Shift reminder·Jun 25, 2026·12:44 PM
Lisa Brown rated Barber Jason 5 stars
New Review·Jun 25, 2026·8:44 AM
Sarah Johnson booked a Beard Trim with Barber Alex
New Bookings·Jun 24, 2026·10:44 PM
David Miller scheduled a Fade Cut with Barber Chris
New Bookings·Jun 24, 2026·10:44 PM
ActivityFeed
| Prop | Type | Default | Description |
|---|---|---|---|
items | ActivityFeedItem[] | — | Array of activity items to display, most-recent rendered first within each group. |
title | string | 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. |
fullHeight | boolean | true | Stretch the Card wrapper to fill its parent's height so feeds in a grid row equalize. Pass `false` to hug content. |
description | string | "Recent team activity and updates" | Card header description shown below the title. |
headerAction | ReactNode | — | Right-aligned node rendered next to the title (typically a "View all →" link button). Replaces the auto search/filter controls in the CardAction slot. |
card | boolean | true | Wrap 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. |
showSearch | boolean | false | Show the search input above the list. |
searchPlaceholder | string | "Search activity…" | Placeholder for the search input. |
showFilter | boolean | false | Show the type filter. In `activity` variant renders a multi-select Select; in `notifications` renders single-select tab pills. Requires `filterTypes`. |
filterTypes | ActivityType[] | — | 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. |
markAllAsReadLabel | string | "Mark all as read" | Label for the mark-all action. |
groupBy | "day" | "none" | "day" | When "day", items are bucketed under "Today" / "Yesterday" / date headers. |
showRelativeTime | boolean | true | Show "2h ago" style labels. On hover a Tooltip shows the absolute timestamp. |
emptyState | ReactNode | — | Custom empty-state element rendered when items is empty. |
className | string | — | Override or extend the wrapper classes. |
ActivityFeedItem
| Prop | Type | Default | Description |
|---|---|---|---|
id | string | — | Unique identifier used as the React key. |
user | ActivityFeedUser | — | Who performed the action. |
action | string | — | Action verb or phrase, e.g. "uploaded". |
target | string | — | Optional target name rendered after the action. |
timestamp | string | Date | — | ISO date string or Date object. |
icon | ReactNode | — | Optional leading icon that replaces the avatar. |
type | string | — | Free-form type tag matched against filterTypes. |
unread | boolean | — | Notifications variant — marks the item as unread (leading dot + tonal row). |
category | string | — | Notifications variant — small source label rendered before the date. |
ActivityFeedUser
| Prop | Type | Default | Description |
|---|---|---|---|
name | string | — | Full display name shown as bold text. |
initials | string | — | Fallback initials if avatar is absent. Auto-computed from name if omitted. |
avatar | string | — | Image URL for the user avatar. |