Checklist

Pro

The onboarding panel: a card that tracks a short list of setup tasks and their progress. The bar and the 3-of-6 read-out derive from value and total, and the bar turns green the moment every step is done.

Finish setting up your workspace

A few quick steps to get the most out of Koala.

2 of 6 complete33%
  • Create your account
    You're in. Welcome to Koala.
    Completed
  • Invite your team
    Add teammates to collaborate on projects together.
    Completed
  • Connect a repository
    Link your Git provider to sync changes automatically.
    In progress
  • Install the CLI
    Ship straight from your terminal with npx koalaui-cli.
    Not started
  • Set up billing
    Add a payment method to move to production.
    Not started
  • Deploy your first project
    Push to main and watch it go live in seconds.
    Not started

Installation#

# One-time setup (tokens + lib helpers)npx koalaui-cli@latest init# Activate your Pro license (once per machine)npx koalaui-cli@latest login <key># Add this component (its dependencies come along)npx koalaui-cli@latest add checklist

Usage#

This example is part of Koala UI Pro

The preview is yours to explore. Its code comes with a Pro license, paid once and used in every project.

Have a license? Unlock it here

Anatomy#

import {  Checklist,  ChecklistHeader,  ChecklistTitle,  ChecklistDescription,  ChecklistProgress,  ChecklistItems,  ChecklistItem,  ChecklistItemContent,  ChecklistItemTitle,  ChecklistItemDescription,  ChecklistItemAction,} from "@/components/ui/checklist"<Checklist>  <ChecklistHeader>    <ChecklistTitle />    <ChecklistDescription />    <ChecklistProgress />  </ChecklistHeader>  <ChecklistItems>    <ChecklistItem>      <ChecklistItemContent>        <ChecklistItemTitle />        <ChecklistItemDescription />      </ChecklistItemContent>      <ChecklistItemAction />    </ChecklistItem>  </ChecklistItems></Checklist>

Item states#

Every ChecklistItem carries a status, drawn by the one task mark every task list in the kit shares: 16px, centred on the title's first line. A complete row fills it with ink and a tick and de-emphasizes the title; active marks the one recommended next step with an ink ring half filled, started but not done, and the primary action; the row stays flat, so the button is what draws the eye. todo rows wait quietly with an empty ring and an outline action.

Getting started

1 of 3 complete33%
  • Create your account
    You're all set.
    Completed
  • Invite your team
    Add teammates to collaborate.
    In progress
  • Set up billing
    Add a payment method to go live.
    Not started

Progress & completion#

Pass value (completed count) and total to the root; ChecklistProgress derives the bar, the “X of Y” label and the percentage itself. When every step is done the bar eases from ink to success-green and the label swaps to All steps complete.

In progress

2 of 4 complete50%
  • Create your account
    Completed
  • Invite your team
    Completed
  • Connect a repository
    In progress
  • Deploy your project
    Not started

All done

All steps complete100%
  • Create your account
    Completed
  • Invite your team
    Completed
  • Connect a repository
    Completed
  • Deploy your project
    Completed

Density#

Like Card and Dialog, the Checklist reads the density context (or a density prop). Density tunes the card and row padding only, and it is compact unless set. The indicator footprint is fixed at both densities, so the left rail lines up identically.

Comfortable

1 of 2 complete50%
  • Install the CLI
    Completed
  • Connect a repo
    In progress

Compact

1 of 2 complete50%
  • Install the CLI
    Completed
  • Connect a repo
    In progress

Tasks the reader ticks#

Give a ChecklistItem checked and onCheckedChange (or defaultChecked to let it keep its own state) and it becomes a task list: the indicator turns into the task mark, a real checkbox drawn like the small Checkbox only round, 16px and centred on the title's first line, with a tick in the colour of the surface beneath. It is named by the item's title, the whole row is its hit area, and a ticked title is struck through as it mutes. Leave value and total off the root and the Checklist counts its own items, so the bar follows every tick with no wiring. A row's ChecklistItemAction stays its own target above the hit area.

Team tasks

Housekeeping for this week and next.

0 of 0 complete0%
  • Rotate the on-call schedule
    Ana Torres, due Friday
  • Archive tickets older than 90 days
    Marc Vidal, due Monday
  • Review the refund macro
    Lucia Ramos, due Tuesday

Inside a Card#

variant="plain" drops the Checklist's own contour and outer padding, so it sits inside a Card (or any surface that already frames it) without a frame inside a frame. The Card's header carries the heading; the indicators line up with it, and the row pills bleed into the Card's padding the way List's plain rows do. ChecklistProgress can lead the header on its own.

Team tasks
Housekeeping for this week and next.
0 of 0 complete0%
  • Rotate the on-call schedule
    Ana Torres, due Friday
  • Archive tickets older than 90 days
    Marc Vidal, due Monday
  • Review the refund macro
    Lucia Ramos, due Tuesday

The task mark on its own#

ChecklistMark draws the same mark without the Checklist around it, for a task list something else lays out: the steps of an Accordion, a row that is already a button. An empty ring while the task waits, an ink ring half filled on the active step, the ink fill with a tick once it is complete: fill only ever means done. It centres itself on a text-sm first line, so put it in an items-start row. It is decoration, so the row says the state in words.

Send an email invite or share a link.

API reference#

Checklist

The root panel; owns the progress its parts read. Forwards all native <div> props. Every part accepts className, merged last.

PropTypeDefaultDescription
valuenumber-Completed tasks. Leave it out and the Checklist counts its complete rows. Clamped to total.
totalnumber-All tasks. Leave it out and the Checklist counts its rows.
variant"card" | "plain""card"The ring-edged panel, or no contour and outer padding, for a Checklist inside a Card.
density"comfortable" | "compact""compact"Card and row padding; the mark stays put. Falls back to the nearest DensityProvider.
asChildbooleanfalseRenders the panel onto its single child (Radix Slot).

ChecklistHeader

The block holding the title, description and progress. Forwards all native <div> props.

ChecklistTitle

The panel heading, an <h3>. Forwards all native <h3> props.

PropTypeDefaultDescription
asChildbooleanfalseRenders onto its single child, to change the heading level.

ChecklistDescription

The muted line under the title, a <p>. Forwards all native <p> props.

ChecklistProgress

The labelled role="progressbar" bar, read from the root. Its fill turns success at 100%. Forwards all native <div> props.

PropTypeDefaultDescription
labelReact.ReactNode"{value} of {total} complete"The leading label. The default swaps to "All steps complete" with a check when done.

ChecklistItems

The task list, a <ul>. Forwards all native <ul> props.

ChecklistItem

One task row, an <li> that draws its own mark and an sr-only status. Any of checked, defaultChecked or onCheckedChange makes it a row the reader ticks. Forwards native <li> props.

PropTypeDefaultDescription
status"todo" | "active" | "complete""todo"The task state. On a row the reader ticks, checked decides complete.
checkedboolean-Ticked, controlled. The mark becomes a Radix checkbox named by the title; the whole row toggles it.
defaultCheckedboolean-Ticked on first render, uncontrolled.
onCheckedChange(checked: boolean) => void-Called when the reader ticks or unticks the row.
Data attributeDescription
data-status"todo", "active" or "complete", as resolved.
data-state"checked" or "unchecked", on a row the reader ticks.

ChecklistItemContent

The title and description column; grows so the action rides the right edge. Forwards all native <div> props.

ChecklistItemTitle

The task name; mutes when complete and strikes through when ticked. Names the checkbox. Forwards all native <div> props.

ChecklistItemDescription

The muted line under the task name. Forwards all native <div> props.

ChecklistItemAction

The trailing slot for a Button; stays its own target on a row the reader ticks. Forwards all native <div> props.

ChecklistMark

The task mark alone, aria-hidden, for task lists the Checklist does not lay out; needs no Checklist. Forwards all native <span> props.

PropTypeDefaultDescription
status"todo" | "active" | "complete""todo"An empty ring, an ink ring half filled, or the ink fill with a tick.
Data attributeDescription
data-status"todo", "active" or "complete".
data-state"checked" when complete, else "unchecked".

FAQ#

From the root's value and total. ChecklistProgress derives the percentage, the 'X of Y complete' label and the aria-valuenow itself, so the header and the item statuses can't drift out of sync. Both counts are clamped, so a value greater than total (or a negative) can never overrun the bar or report over 100%.