A list of connected services with their linked account, a connect toggle, and reconnect / coming-soon states.
npx shadcn@latest add https://sdk-components.thesqd.com/r/integrations.jsonimport { Integrations } from "@/components/blocks/integrations";"use client";
import { Integrations } from "@/components/blocks/integrations";
const integrations = [
{
id: "google-drive",
name: "Google Drive",
category: "Cloud storage",
slug: "google-drive",
// Present = connected; the row shows the account and a Disconnect button.
account: "jacob@churchmediasquad.com",
},
{
id: "slack",
name: "Slack",
category: "Communication",
slug: "slack",
},
];
export function Example() {
return (
<Integrations
integrations={integrations}
onToggle={(integration, connected) =>
console.log(integration.id, connected)
}
/>
);
}Integrations (single component — pass everything as props)
└── ItemList (card-per-row list, see /item-list)
└── row ← one Integration
├── icon — brand mark from TheSVG (`slug` → cdn.jsdelivr.net/gh/glincker/thesvg)
├── title — name
├── subtitle — category
├── account — linked account, or muted "Not connected"
└── action — Button, one fixed-width track so every label matches
outline "Connect" — no account linked
destructive "Disconnect" — linked and healthy
amber ghost "Reconnect" — needsReconnect
disabled "Coming soon" — comingSoon (row greys out)
disabled "Connecting…" — pending (spinner in the account cell)onToggle
Connect or disconnect a service to see events land here.
Integrations
| Prop | Type | Default | Description |
|---|---|---|---|
integrations | Integration[] | DEMO_INTEGRATIONS | Services to list. Defaults to the seven demo services (Google Calendar / Drive / Photos, OneDrive, Teams, Dropbox, Slack). |
onReconnect | (integration: Integration) => void | — | Fires when an expired link's amber `Reconnect` is pressed. The row clears its own warning either way. |
onToggle | (integration: Integration, connected: boolean) => void | — | Fires after a row is connected or disconnected. `connected` is the NEW state. |
controlled | boolean | false | The parent owns connection state: rows render `account`, `needsReconnect` and `pending` exactly as passed, and a press only fires `onToggle` / `onReconnect`. Use it for real OAuth — without it the block flips a row to connected (with a demo account) the moment Connect is pressed. |
className | string | — | Passed through to the underlying `ItemList`. |
Integration
| Prop | Type | Default | Description |
|---|---|---|---|
id | string | — | Stable row key. |
name | string | — | Service name (row title). |
category | string | — | Muted subtitle, e.g. "Cloud storage". |
slug | string | — | TheSVG icon slug — resolves to `…/thesvg@main/public/icons/{slug}/default.svg`. |
account | string | — | The linked account. Present = connected; omit for a disconnected service. |
needsReconnect | boolean | false | The link is live but its token expired — the action becomes an amber `Reconnect`. |
comingSoon | boolean | false | Not shippable yet — the mark and name grey out and the action is a disabled `Coming soon`. |
pending | boolean | false | A connect is in flight — the account cell reads `Connecting…` beside a spinner and the action is disabled until you clear it. Pair with `controlled`. |
info | ReactNode | — | What connecting it means (what it reads, writes, the access it needs). Drawn as a small duotone info mark after the name; the content opens in a hover card on hover or focus. |