Checks Panel
CI, deploys, and reviews as a pass/fail list on a raised card — failed logs one disclosure away, and a merge button that says what it will do (“Squash and merge”, not just “Merge”).
Checks
4 passed, 1 running
lint passed12s
typecheck passed41s
test passed1m 08s
motion-contract passed4s
e2e running
tsx
import {
ChecksPanel,
ChecksPanelFooter,
ChecksPanelItem,
MergeButton,
} from "@/registry/seam/ui/checks-panel"
export default function ChecksPanelDemo() {
return (
<ChecksPanel summary="4 passed, 1 running">
<ChecksPanelItem name="lint" status="pass" duration="12s" />
<ChecksPanelItem name="typecheck" status="pass" duration="41s" />
<ChecksPanelItem name="test" status="pass" duration="1m 08s" />
<ChecksPanelItem name="motion-contract" status="pass" duration="4s" />
<ChecksPanelItem name="e2e" status="running" />
<ChecksPanelFooter>
<MergeButton method="squash" disabled />
</ChecksPanelFooter>
</ChecksPanel>
)
}bunx --bun @seamui/cli@latest add checks-panelNotes
- Rows sit flat in the card (telemetry, not keys); a row with children becomes a disclosure exposing its log in a carved-in well. The trigger dogfoods
buttonVariantswith the motion press render — the composite-safe path fromtool. - Monochrome rule:
failis the one hue; every status also reads by icon shape and announces as text (“typecheck failed”).runningis the sharedSpinner. - No CI-provider coupling: rows are composition,
onMergecomes off theMergeButton(method:merge/squash/rebase). Disable it while checks are red — as the examples do.
Press feedback, reduced motion, and haptics follow the global policy — see Motion and Haptics.