Integrations

A list of connected services with their linked account, a connect toggle, and reconnect / coming-soon states.

Service
Account
Google Calendar logo
Google Calendar
Scheduling
jacob@churchmediasquad.com
Google Drive logo
Google Drive
Cloud storage
jacob@churchmediasquad.com
Google Photos logo
Google Photos
Media library
Not connected
Microsoft OneDrive logo
Microsoft OneDrive
Cloud storage
jacob@thesqd.onmicrosoft.com
Microsoft Teams logo
Microsoft Teams
Communication
Dropbox logo
Dropbox
Cloud storage
design@churchmediasquad.com
Slack logo
Slack
Communication
The Squad · #design
Installation
$Terminal
npx shadcn@latest add https://sdk-components.thesqd.com/r/integrations.json
Usage
Pass an `Integration[]`. A row with an `account` reads as connected; without one it reads as disconnected.
TSImport
import { Integrations } from "@/components/blocks/integrations";
TSExample
"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)
      }
    />
  );
}
Composition
Anatomy of the block and how each Integration maps onto an ItemList row.
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)
Default
Seven services, each with its brand mark from TheSVG, the account it's linked to, and a button that toggles the connection. Connection state is local to the block — click a row to see it flip.
Service
Account
Google Calendar logo
Google Calendar
Scheduling
jacob@churchmediasquad.com
Google Drive logo
Google Drive
Cloud storage
jacob@churchmediasquad.com
Google Photos logo
Google Photos
Media library
Not connected
Microsoft OneDrive logo
Microsoft OneDrive
Cloud storage
jacob@thesqd.onmicrosoft.com
Microsoft Teams logo
Microsoft Teams
Communication
Dropbox logo
Dropbox
Cloud storage
design@churchmediasquad.com
Slack logo
Slack
Communication
The Squad · #design
Nothing connected
Omit `account` on every entry and the list reads as a fresh workspace: a muted `Not connected` account cell and a `Connect` button on each row.
Service
Account
Google Calendar logo
Google Calendar
Scheduling
Not connected
Google Drive logo
Google Drive
Cloud storage
Not connected
Google Photos logo
Google Photos
Media library
Not connected
Microsoft OneDrive logo
Microsoft OneDrive
Cloud storage
Not connected
Microsoft Teams logo
Microsoft Teams
Communication
Not connected
Dropbox logo
Dropbox
Cloud storage
Not connected
Slack logo
Slack
Communication
Not connected
Reconnect and coming soon
`needsReconnect` keeps the account visible but swaps the action for an amber `Reconnect` — a warning, not a danger. `comingSoon` greys the mark and the name and disables the row's button. Every label shares one fixed track, so the column edge stays straight.
Service
Account
Google Drive logo
Google Drive
Cloud storage
jacob@churchmediasquad.com
Microsoft Teams logo
Microsoft Teams
Communication
Dropbox logo
Dropbox
Cloud storage
design@churchmediasquad.com
onToggle
`onToggle(integration, connected)` fires with the NEW state — start the provider's OAuth flow when it's `true`, revoke the token when it's `false`.
Service
Account
Google Calendar logo
Google Calendar
Scheduling
jacob@churchmediasquad.com
Google Drive logo
Google Drive
Cloud storage
jacob@churchmediasquad.com
Google Photos logo
Google Photos
Media library
Not connected
Microsoft OneDrive logo
Microsoft OneDrive
Cloud storage
jacob@thesqd.onmicrosoft.com
Microsoft Teams logo
Microsoft Teams
Communication
Dropbox logo
Dropbox
Cloud storage
design@churchmediasquad.com
Slack logo
Slack
Communication
The Squad · #design

onToggle

Connect or disconnect a service to see events land here.

Controlled, with a pending connect
For real OAuth pass `controlled`: the rows show exactly what `integrations` says, so a row never reads as connected before the provider has answered. Mark the row `pending` while the provider's tab is open — it reads `Connecting…` with a spinner and its button is disabled.
Service
Account
Google Calendar logo
Google Calendar
Scheduling
Not connected
Google Drive logo
Google Drive
Cloud storage
jacob@churchmediasquad.com
Google Photos logo
Google Photos
Media library
Not connected
Microsoft OneDrive logo
Microsoft OneDrive
Cloud storage
Not connected
API Reference
Props for the block plus the shape of a single service.

Integrations

PropTypeDefaultDescription
integrationsIntegration[]DEMO_INTEGRATIONSServices 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.
controlledbooleanfalseThe 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.
classNamestring—Passed through to the underlying `ItemList`.

Integration

PropTypeDefaultDescription
idstring—Stable row key.
namestring—Service name (row title).
categorystring—Muted subtitle, e.g. "Cloud storage".
slugstring—TheSVG icon slug — resolves to `…/thesvg@main/public/icons/{slug}/default.svg`.
accountstring—The linked account. Present = connected; omit for a disconnected service.
needsReconnectbooleanfalseThe link is live but its token expired — the action becomes an amber `Reconnect`.
comingSoonbooleanfalseNot shippable yet — the mark and name grey out and the action is a disabled `Coming soon`.
pendingbooleanfalseA connect is in flight — the account cell reads `Connecting…` beside a spinner and the action is disabled until you clear it. Pair with `controlled`.
infoReactNode—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.