Skip to content
WingoUI
ComponentsTemplatesDocsPricingAI agentsBlogChangelog
Components
Buttons & Actions
ButtonButton GroupCopy ButtonDelete ButtonTheme ToggleToggleToggle Group
Inputs
Avatar UploadCalendarCheckboxColor PickerComboboxCron PickerCurrency InputDate PickerDate Range PickerDate Time PickerDuration PickerEmail InputFile UploadFilter BuilderInputInput GroupListboxMasked InputMention InputMonth PickerMulti SelectNumber InputOTP InputPassword InputPhone InputRadio GroupRatingSearch InputSegmented ControlSelectSignature PadSliderSwitchTag InputTextareaTime PickerTimezone Select
Forms
Address InputCSV ImportFieldForm WizardInline EditInvoice line itemsRich Text EditorSchema Builder
Navigation
Back To TopBounce SidebarBreadcrumbCommand MenuGlobal SearchGooey NavHook SidebarNav MenuNav TabsPaginationProximity SidebarScroll ProgressSidebarStepsTable Of ContentsTabsTopbarUser MenuWorkspace Switcher
Overlays
Alert DialogContext MenuDialogDrawerDropdown MenuFamily DrawerHover CardPopoverShare DialogSheetShortcuts DialogTooltipTour
Feedback
AlertBannerCookie ConsentEmoji ReactionEmpty StateNotification BellNotification CenterProgressRoute ProgressSetup ChecklistSkeletonSpinnerToast
Data Display
Approval FlowAvatarBadgeCalendar ViewCode BlockComment ThreadContact cardCountdownDescription ListDiff ViewerFile ListFile managerFolderGanttJSON ViewerKbdLog ViewerMarkdownPresenceSchedulerTagTimelineTree View
Tables & Lists
Audit LogData TableDeal PipelineEditable GridKanbanListMembers tablePermissions MatrixTableTask ListVirtual List
Charts & Stats
Animated CounterArea chartBar chartDonut chartFunnel chartGaugeGitHub ActivityHeatmap calendarLeaderboardLine chartRadar chartRadial barSparklineStat CardTrackerTrend badge
Layout
AccordionApp ShellCardCollapsibleDetail LayoutEntity HeaderPage HeaderScroll AreaSeparatorSettings LayoutSplit ViewToolbar
Media
Audio PlayerCarouselCSV ViewerDOCX EditorDOCX ViewerExcel ViewerFile SystemImage compareImage CropperImage LightboxLocation MapPDF ViewerPowerPoint ViewerQR CodeStep PlayerVideo Player
AI Kit
Agent Status CardChat MessageChat ThreadConversation ListFluid OrbGrid RevealMatrix OrbModel PickerPrompt InputReasoning IndicatorRule BuilderSuggestion ChipsTool Call TimelineUsage MeterVoice InputWorkflow Canvas
Text & Effects
Background PatternGravity LettersMarqueeText AnimateText Rotate
Mobile
Action SheetBottom Tab BarFABHaptic ButtonHero HeaderInstall PromptLarge Title HeaderNotification BannerOnboarding CarouselPicker WheelPull To RefreshSlide To ConfirmSticky CTA BarSwipe DeckSwipeable Tabs
Commerce
Cart drawerCategory pickerCheckout stepsCoupon inputFavorite buttonFilter panelListing cardListing gridOrder trackerPricePrice rangePricing tableProduct galleryQuantity stepperReviewsSeller card
Marketing Sections
App Download SectionBlog Cards SectionCTA SectionFAQ SectionFeature GridFeature ShowcaseHero SectionIntegrations SectionLogo CloudMarketing FooterMarketing HeaderMarketing SectionNewsletter SectionPricing SectionStats SectionSteps SectionTeam SectionTestimonials SectionTimeline SectionVideo Section
Blocks
Admin Dashboard PageAdmin ShellAI Chat PageAPI Keys PageAutomation Builder PageCheckout PageCRM Contact PageCRM Pipeline PageError PagesInbox PageInvoice PageKPI DashboardListing Detail PageLogin PageMarketplace Home PageMarketplace Search PageMarketplace ShellMobile App HomeOnboarding FlowPost Listing WizardPricing PageRegister PageSettings PageUsers Admin Page
Templates
About PageAcademy PageAccessibility PageAffiliate PageAI Product PageBlog PageBlog Post PageBug Bounty PageCareers PageChangelog PageCommunity PageCompare PageContact PageCustomer Story PageCustomers PageDemo Booking PageDevelopers PageDocs Home PageDownload PageEnterprise PageEvents PageExperts PageFAQ PageFeature PageGlossary PageHelp Article PageHelp Center PageImpact PageIntegration Detail PageIntegrations PageJob Detail PageLanding PageLaunch PageLegal PageManifesto PagePress PageProduct Tour PagePromo PageReferral PageResearch Report PageRoadmap PageROI Calculator PageSecurity PageSolutions PageStartups PageStatus PageSwitch PageTemplate Gallery PageWaitlist PageYear in Review Page
Hooks & Utilities
AI ChatChart kitCommerceDate utilsFile exportFile typesFiltersForm validationHapticsInvoicingMotion presetsNavigationNumber formatRelative timeRomanian locationsSpreadsheetText matchTonesUIProvideruseClipboarduseConsentuseControllableStateuseCooldownuseDebounceuseKeyboardInsetuseLocaleuseLongPressuseMediaControlsuseMediaQueryuseOverflowItemsusePersistedStateuseScrollEdgesuseScrollStateuseSelectionuseShortcutuseStickToBottom
GalleryTheme

Feedback

Setup Checklist

Feedback

Setup Checklist React component for Tailwind CSS v4

Route ProgressSkeleton
Live props
State
defaultActive
defaultOpen
Content
title
description
dismissLabel
doneTitle
doneDescription
optionalLabel
completedLabel
toggleLabel
Appearance
variant
tone
color
size
Behavior
collapsible
dismissible
doneDelay4000ms
markOnAction
Layout
responsive
Code
import { SetupChecklist } from "@/components/ui/setup-checklist"

<SetupChecklist />
  1. Home
  2. Components
  3. Feedback
  4. Setup Checklist
Pro

Setup Checklist React component for Tailwind CSS v4

v1.0.0·Added 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-checklist

Pro 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.

  • completed
    string[]

    Ids of the finished tasks, when you control them.

  • defaultCompleted
    string[]

    Finished task ids to start with, uncontrolled. Default: none.

  • onCompletedChange
    (completed: string[]) => void

    Called 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.

  • active
    string | null

    The expanded task's id, when you control it; null collapses every task.

  • defaultActivedefault ""
    string | null

    The task expanded at first, uncontrolled; null starts with all collapsed. Left out: the first task not done.

  • onActiveChange
    (active: string | null) => void

    Called when a task expands or collapses.

  • titledefault "Get started"
    ReactNode

    The heading of the card and the launcher's text.

  • descriptiondefault "Finish setting up your workspace."
    ReactNode

    One line under the title.

  • progressLabeldefault "(done: number, total: number) => `${done} of ${total} done`"
    (done: number, total: number) => ReactNode

    The 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 ""
    string

    Any CSS color; replaces the tone.

  • sizedefault "md"
    "sm" | "md"

    md for a dashboard card; sm is denser, for a sidebar or a popover.

  • collapsibledefault true
    boolean

    Card and inline: the header folds the list away and brings it back.

  • open
    boolean

    Card and inline: whether the list shows; floating: whether the panel is open. Controlled.

  • defaultOpendefault true
    boolean

    Card and inline: the list starts open. The floating panel always starts closed unless you control open.

  • onOpenChange
    (open: boolean) => void

    Called when the list folds or unfolds, or the floating panel opens or closes.

  • dismissibledefault true
    boolean

    An x in the header (and a Dismiss button in the done state) that hides the checklist.

  • onDismiss
    () => void

    Called when it is dismissed; store it so the card stays gone.

  • dismissLabeldefault "Dismiss"
    string

    The x button's accessible name and the done state's button text.

  • doneTitledefault "You're all set"
    ReactNode

    The heading of the done state that replaces the list.

  • doneDescriptiondefault "Every setup step is done."
    ReactNode

    The line under the done heading.

  • doneDelaydefault 4000
    number

    Milliseconds after everything is done before a collapsible card folds up; 0 keeps it open.

  • markOnActiondefault false
    boolean

    A click on a task's main action also marks it done (for actions that finish the task, like Connect).

  • optionalLabeldefault "Optional"
    string

    The tag on optional tasks.

  • completedLabeldefault "Completed"
    string

    Read by screen readers after a finished task's title.

  • toggleLabeldefault "Show or hide steps"
    string

    The tooltip of the header toggle.

  • responsivedefault true
    boolean

    Floating: below 768px the panel opens as a bottom sheet.

  • classNames
    Partial<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.

  • className
    string

    Extra 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

    type

    The keys of classNames.

  • SetupChecklistTone

    type

    The tone union from lib/tones.

  • SetupChecklistProps

    type

    The 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

motionlucide-reactbuttonpopoverprogressuse-controllable-stateuse-media-querymotiontonesui-config

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.

See also

Onboarding FlowTourProgressStepsEmpty StateAdmin Dashboard Page

More React feedback components

SpinnerSkeletonRoute ProgressEmoji ReactionAlertToast
All 13 React feedback components
PreviousRoute ProgressNext Skeleton
2 of 5 done
  • Teammates get their own login, so you can see who sent what.

completed=["workspace","logo"]

When all is done: “You're all set”, “Every setup step is done.”, folds up after 4000ms