Setup Checklist React component for Tailwind CSS v4
v1.0.0Added in 1.10.0
The dashboard Get started card: setup tasks with progress and actions, collapsible and dismissible, or a floating launcher.
The card shows each setup task with a check, a progress bar and an x of y count. Click a task to expand it (one at a time): its description and action buttons slide open, and the first task still to do starts open. With onCompletedChange wired, the round check is a checkbox: click it and the tick pops in, the bar fills and the next open task expands; with markOnAction the main action marks its task done. Optional tasks carry a tag and stay out of the count. Click the header to fold the list away and again to bring it back; the x dismisses the card. When every task is done a "You're all set" panel replaces the list and the card folds itself up after a few seconds. The floating variant is a pill in the corner with the count: it opens the list in a popover, or a bottom sheet on a phone. Keyboard: Tab reaches each task, ArrowUp / ArrowDown / Home / End move between them, Enter or Space expands, Space toggles a focused check. On a phone the rows are 44px tall and the action buttons go full width.
Setup Checklist is a Pro React component in the React feedback components category, written in TypeScript for React 19 and Tailwind CSS v4. It installs as source with npx wingo-ui@latest add setup-checklist, together with Button, Popover, Progress, useControllableState, useMediaQuery and 3 more and the npm packages motion and lucide-react.
Add to a project
Requirements: React 19 and Tailwind CSS v4, in Next.js (App Router or Pages), Vite or React Router. Installation guide · Next.js setup · Vite setup
npx wingo-ui@latest add setup-checklistPro item: the CLI needs a Pro account. See plans
Usage
Import SetupChecklist from @/components/ui/setup-checklist.
import { useState } from "react"
import { CreditCard, Palette, UserPlus } from "lucide-react"
import { SetupChecklist, type SetupChecklistItem } from "@/components/ui/setup-checklist"
const items: SetupChecklistItem[] = [
{ id: "brand", title: "Add your logo", description: "It shows on invoices and the client portal.", icon: <Palette />, action: { label: "Upload logo", href: "/settings/brand" } },
{ id: "team", title: "Invite your team", description: "Teammates get their own login and permissions.", icon: <UserPlus />, action: { label: "Invite people", href: "/settings/team" } },
{ id: "billing", title: "Connect payments", description: "Get paid by card or bank transfer.", icon: <CreditCard />, action: { label: "Connect Stripe", href: "/settings/payments" } },
]
export function DashboardSetup() {
const [completed, setCompleted] = useState<string[]>(["brand"])
return <SetupChecklist items={items} completed={completed} onCompletedChange={setCompleted} onDismiss={() => console.log("hide for good")} />
}Props
items*SetupChecklistItem[]The tasks: { id, title, description?, icon?, done?, action?: { label, onClick?, href? }, secondaryAction?, optional?, disabled? }. An item's done fixes its state from your data and wins over completed.
completedstring[]Ids of the finished tasks, when you control them.
defaultCompletedstring[]Finished task ids to start with, uncontrolled. Default: none.
onCompletedChange(completed: string[]) => voidCalled with the new list of finished ids. Wiring it turns each check into a checkbox people can toggle; without it the checks only show state.
activestring | nullThe expanded task's id, when you control it; null collapses every task.
defaultActivedefault""string | nullThe task expanded at first, uncontrolled; null starts with all collapsed. Left out: the first task not done.
onActiveChange(active: string | null) => voidCalled when a task expands or collapses.
titledefault"Get started"ReactNodeThe heading of the card and the launcher's text.
descriptiondefault"Finish setting up your workspace."ReactNodeOne line under the title.
progressLabeldefault"(done: number, total: number) => `${done} of ${total} done`"(done: number, total: number) => ReactNodeThe count next to the bar; a string result also names the bar for screen readers.
variantdefault"card""card" | "inline" | "floating"card is a raised panel for a dashboard; inline has no surface, for a sidebar or an existing card; floating is a pill pinned to the bottom corner (safe-area aware) that opens the list in a popover, or a bottom sheet below 768px.
tonedefault"neutral""neutral" | "brand" | "success" | "warning" | "danger" | "info"Color of the checks, the bar, the main action and the launcher. Brand is opt-in.
colordefault""stringAny CSS color; replaces the tone.
sizedefault"md""sm" | "md"md for a dashboard card; sm is denser, for a sidebar or a popover.
collapsibledefaulttruebooleanCard and inline: the header folds the list away and brings it back.
openbooleanCard and inline: whether the list shows; floating: whether the panel is open. Controlled.
defaultOpendefaulttruebooleanCard and inline: the list starts open. The floating panel always starts closed unless you control open.
onOpenChange(open: boolean) => voidCalled when the list folds or unfolds, or the floating panel opens or closes.
dismissibledefaulttruebooleanAn x in the header (and a Dismiss button in the done state) that hides the checklist.
onDismiss() => voidCalled when it is dismissed; store it so the card stays gone.
dismissLabeldefault"Dismiss"stringThe x button's accessible name and the done state's button text.
doneTitledefault"You're all set"ReactNodeThe heading of the done state that replaces the list.
doneDescriptiondefault"Every setup step is done."ReactNodeThe line under the done heading.
doneDelaydefault4000numberMilliseconds after everything is done before a collapsible card folds up; 0 keeps it open.
markOnActiondefaultfalsebooleanA click on a task's main action also marks it done (for actions that finish the task, like Connect).
optionalLabeldefault"Optional"stringThe tag on optional tasks.
completedLabeldefault"Completed"stringRead by screen readers after a finished task's title.
toggleLabeldefault"Show or hide steps"stringThe tooltip of the header toggle.
responsivedefaulttruebooleanFloating: below 768px the panel opens as a bottom sheet.
classNamesPartial<Record<"header" | "title" | "description" | "progress" | "list" | "item" | "check" | "action" | "done" | "launcher" | "panel", string>>Extra classes for the inner parts. launcher is the floating pill (swap fixed for absolute to pin it inside a container), panel the floating list.
classNamestringExtra classes for the root section. Other section props (id, aria-*, data-*) land on it too.
Parts
SetupChecklistItem
type{ id, title, description?, icon?, done?, action?, secondaryAction?, optional?, disabled? }: one task.
SetupChecklistAction
type{ label, onClick?, href? }: a task's button; with href it renders as a link.
SetupChecklistVariant
type"card" | "inline" | "floating".
SetupChecklistSize
type"sm" | "md".
SetupChecklistSlot
typeThe keys of classNames.
SetupChecklistTone
typeThe tone union from lib/tones.
SetupChecklistProps
typeThe props of SetupChecklist.
Examples
Floating launcher
A pill in the corner with the count; the list opens in a popover, or a bottom sheet on a phone.
All done
Check the last step: the done state replaces the list, then the card folds up after doneDelay.
Inline in a sidebar
variant="inline" and size="sm" under the navigation; optional steps stay out of the count.
Brand tone, done on action
tone="brand" with markOnAction, so each Connect checks its step off.
Driven by your data
Each item's done comes from the server; without onCompletedChange the checks only show state.
Dependencies
Files
- components/ui/setup-checklist.tsx
FAQ
Is the React Setup Checklist component free?
The preview, props and docs are free; copying the source needs a Pro plan. See plans.
How do I install Setup Checklist?
Run npx wingo-ui@latest add setup-checklist. It also adds the Wingo UI items it builds on (Button, Popover, Progress, useControllableState, useMediaQuery and 3 more) and the npm packages motion and lucide-react. With shadcn, add the @wingo-ui registry with your API key, then run npx shadcn@latest add @wingo-ui/setup-checklist.
How does Setup Checklist behave on phones?
Floating: below 768px the panel opens as a bottom sheet. The responsive prop controls this and is on by default.