Installation
Theme
Mode

Data display

List

The workhorse task view — rows grouped into collapsible sections, with subtasks, sortable and re-orderable columns, drag-to-reorder, inline rename and a quick-add on every group. Drag a row to another group to re-assign it; drag a column header to rearrange.

$npx shadcn@latest add @orbit/list

Overview

Live — drag a row to reorder or drop it on another group, click a column header to sort or drag it to rearrange, click a task name to rename, expand a subtask, or use + Add task.

Group by8 tasks
To do3
API rate limiting
MRMaya
Onboarding email series
JLJon
Quarterly roadmap draft
PKPriya
In progress2
Ship onboarding flow v22
SCSam
Rebuild empty states
MRMaya
Checklist nudge
SCSam
Design system audit1
SCSam
In review2
Marketing site refresh
JLJon
Billing webhook retries
PKPriya
Done1
Fix auth token refresh
DWDana

Everything is direct

No dialogs, no edit modes — the list edits in place. Drag, click, type; each change commits immediately and the groups recount.

Grouped & collapsible
Rows sit under collapsible group headers with a colour and count. Switch the grouping — status, priority or assignee — from the toolbar control.
Drag, nest & regroup
Reorder within a group, drop a row onto another to nest it as a subtask (pull right at the bottom edge to indent), drag a subtask out to promote it, or drop on a group header to re-assign its field.
Subtasks
A parent row discloses indented children on a guide line, each with its own checkbox, fields and inline rename. One level deep, on purpose.
Sort & reorder columns
Click a column header to sort ascending, descending or off; drag a header sideways to rearrange the columns.
Inline field editing
Click a name to rename it, or a priority, progress or due-date cell to change it from a popover — every edit commits in place, no modal.
Quick add
Every group ends with “+ Add task”. Type a name and press Enter to drop a new row straight into that group, then keep going.

Regroup and compress

Group by any field — status, priority or assignee — switch to a compact row height, or hide the quick-add. Drag still re-assigns by whatever the grouping is. Each instance is live.

Grouped by priority — defaultGroupBy="priority"
Group by8 tasks
Urgent1
API rate limiting
MRMaya
High3
Ship onboarding flow v22
SCSam
Billing webhook retries
PKPriya
Fix auth token refresh
DWDana
Medium3
Onboarding email series
JLJon
Design system audit1
SCSam
Marketing site refresh
JLJon
Low1
Quarterly roadmap draft
PKPriya
Grouped by assignee · compact — defaultGroupBy="assignee" density="compact"
Group by8 tasks
Sam Chen2
Ship onboarding flow v22
SCSam
Design system audit1
SCSam
Maya Rivera1
API rate limiting
MRMaya
Jon Lake2
Onboarding email series
JLJon
Marketing site refresh
JLJon
Priya Kapoor2
Quarterly roadmap draft
PKPriya
Billing webhook retries
PKPriya
Dana Wu1
Fix auth token refresh
DWDana

Column config

columns selects and orders the meta columns (assignee · priority · progress · due); quickAdd={false} drops the add row for read-heavy views. Column order stays draggable either way.

defaultColumns={["priority", "due"]} · quickAdd={false}
Group by8 tasks
To do3
API rate limiting
Onboarding email series
Quarterly roadmap draft
In progress2
Ship onboarding flow v22
Design system audit1
In review2
Marketing site refresh
Billing webhook retries
Done1
Fix auth token refresh

Controlled

Pass items + onItemsChange to own the tree — every reorder, nest, regroup, rename, toggle and quick-add reports the full updated structure, ready to persist. onItemClick fires when a row's background is clicked.

Group by8 tasks
To do3
API rate limiting
MRMaya
Onboarding email series
JLJon
Quarterly roadmap draft
PKPriya
In progress2
Ship onboarding flow v22
SCSam
Design system audit1
SCSam
In review2
Marketing site refresh
JLJon
Billing webhook retries
PKPriya
Done1
Fix auth token refresh
DWDana

onItemsChange fired 0 times · 8 top-level tasks · click a row background to fire onItemClick

Props

PropTypeDefaultDescription
items / defaultItemsListItem[]Controlled / uncontrolled task tree: { id, name, status?, done?, assignee?, priority?, due?, progress?, children? }. Subtasks are one level deep.
onItemsChange(items: ListItem[]) => voidFires with the full updated tree on reorder, nest, denest, regroup, rename, checkbox toggle, cell edit and quick-add.
peopleListPerson[][]Assignable directory: { id, name, color? }. Drives avatars, the assignee column and assignee grouping.
groupBy / defaultGroupBy"none" | "status" | "priority" | "assignee""status"Controlled / uncontrolled grouping; the toolbar menu switches it. Also settable via onGroupByChange.
columns / defaultColumnsListColumnKey[]["assignee", "priority", "progress", "due"]Meta-column set and order. Header drag reorders; onColumnsChange reports the new order.
density"comfortable" | "compact""comfortable"Row height 40px or 34px (group headers and quick-add compress to match).
quickAddbooleantrueShow the “+ Add task” row at the end of every group.
onItemClick(item: ListItem) => voidA row's background was clicked (controls inside stop propagation).
defaultExpandedIdsstring[]Parent ids whose subtasks start expanded.
…restHTMLAttributesForwarded to the root <div>, including ref.

Usage

Do

Group by the field you triage on

If the team works status-first, group by status so dragging a row down the list moves it through the workflow.

Don’t

Carry a dozen columns

A list is for scanning. Keep three or four meta columns; push the rest into the row's detail Drawer.

Do

Let sort and manual coexist

Manual drag order is the default; a column sort overrides it for a look, and the next drag returns to manual.

Don’t

Nest more than one level

Subtasks are one level deep on purpose. For arbitrary hierarchy reach for the Tree instead.

Keyboard & accessibility

Checkboxes, disclosure chevrons, sortable headers, editable cells and task names are real focusable controls with the 3px themed focus ring — Enter activates each (rename, sort, popover). Escape closes an edit, quick-add or popover; the cell popovers and group-by menu build on Base UI for focus and dismiss handling.

Drag rowReorder / move to another group
Drag row → right edgeNest under the row above (x-offset indent)
Drag sub → left edgeDenest — promote out of the parent
Drag headerRearrange the columns
Click headerSort asc → desc → off
Click nameRename in place
Click ▸Expand or collapse subtasks
EnterCommit an edit or quick-add
EscCancel the edit, quick-add or popover