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-panel

Notes

  • 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 buttonVariants with the motion press render — the composite-safe path from tool.
  • Monochrome rule: fail is the one hue; every status also reads by icon shape and announces as text (“typecheck failed”). running is the shared Spinner.
  • No CI-provider coupling: rows are composition, onMerge comes off the MergeButton (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.