Search

Search bills, members, committees and pages...

Connect

A prompt to send bills, votes and hearings to Slack, Discord or Google Drive.

SDG
Send bills, votes and hearings where your team already works.

On the site it lives at /home. Open it on the canvas, where it can be sized, coloured and rearranged with the rest.

Installation

pnpm dlx shadcn@latest add @44gov/connect

Or copy the source into your project and update the import paths to match it.

components/cards/connect.tsx
"use client" import Link from "next/link" import * as F from "@/lib/fixtures"import { CardFrame } from "@/components/card-frame"import { Avatar, AvatarFallback, AvatarGroup, AvatarImage } from "@govblock/ui/components/avatar"import { Button } from "@govblock/ui/components/button"import { CardContent } from "@govblock/ui/components/card"import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia } from "@govblock/ui/components/empty" // Connect — shadcn's "No Team Members" empty state, pointed at the places a// team already works: Slack, Discord, Google Drive.//// The marks are in their own colours. They were grayscale, which item 13 fixed// on the agents surfaces and missed here — a grayscale logo is a service nobody// recognises at a glance, and recognising it at a glance is the whole job.//// Padding on the image and not on the Avatar, which is the lesson the small// connection marks cost three attempts: the Avatar root is a flex row, and a// padded root with a size-full child pushes the mark out from under itself.// object-contain because two of the three logos are not square and the default// object-cover crops them.export function ConnectCard() {  return (    <CardFrame id="connect">      <CardContent>        <Empty className="border border-dashed">          <EmptyHeader>            <EmptyMedia>              <AvatarGroup>                {F.connect.services.map((s) => (                  <Avatar key={s.name} size="lg" className="bg-white">                    <AvatarImage src={s.src} alt={s.name} className="object-contain p-1.5" />                    <AvatarFallback>{s.name[0]}</AvatarFallback>                  </Avatar>                ))}              </AvatarGroup>            </EmptyMedia>            {/* No title: the marks and the sentence say it (Brendan, 2026-09-05). */}            <EmptyDescription>{F.connect.description}</EmptyDescription>          </EmptyHeader>          <EmptyContent>            <Button size="sm" render={<Link href="/connectors" />} nativeButton={false}>              Connect            </Button>          </EmptyContent>        </Empty>      </CardContent>    </CardFrame>  )} 

Usage

import { ConnectCard } from "@/components/cards/connect"
<ConnectCard />

Composition

The parts the block is built from, in the order they appear.

ConnectCard├── CardContent└── Empty

Data

The block reads no route of its own. What it shows comes from the page that holds it.

API Reference

ConnectCard takes no props. It reads the jurisdiction and year from the page.