Board

A Kanban / column board — records grouped into ordered columns where a drag is a field mutation (onCardMove). Composes the `sortable` primitive for all drag (pointer, keyboard, touch, cross-column, overlay ghost, announcements) and adds column headers with a live count + accent tone, WIP limits, collapse-to-rail, swimlanes, an inline card composer, and empty/loading states. Data-driven or composable, controlled or uncontrolled.

Betav0.3.0@garn/ui/board

Default

The composable path — `Board.Column` children each own their ordered `value`; cross-column moves fire both columns' onValueChange plus one onCardMove, with a hand-placed Board.Overlay.

To do, 2 cards
Audit color tokensDesign
Fix drag a11y on SafariBug
In progress, 2 cards
Ship board v1Feature
Review the metadata PRReview
Done, 1 card
Release 0.3 changesetRelease

Overview

Composable

The composable path — `Board.Column` children each own their ordered `value`; cross-column moves fire both columns' onValueChange plus one onCardMove, with a hand-placed Board.Overlay.

To do, 2 cards
Audit color tokensDesign
Fix drag a11y on SafariBug
In progress, 2 cards
Ship board v1Feature
Review the metadata PRReview
Done, 1 card
Release 0.3 changesetRelease

Data Driven

The data-driven path — `columns` + `items` + `renderCard`; the board maps the model onto the parts and applies each move atomically. `onCardAdd` turns on the inline composer.

To do, 3 cards
Audit color tokensDesign
Write the docs pageDocs
Prune dead examplesChore
In progress, 2 cards
Ship board v1Feature
Add swimlane recipeFeature
Review, 1 card
Review the metadata PRReview
Done, 1 card
Release 0.3 changesetRelease

Columns

Wip Limit

WIP limits — a column soft-warns (count amber → red, a danger ring) at and over its `limit`; 'In progress' starts over a limit of 2.

To do, 2 cards
Audit color tokensDesign
Write the docs pageDocs
In progress, 3 of 2 cards, over the limit
Ship board v1Feature
Review the metadata PRReview
Add swimlane recipeFeature
Done, 1 card
Release 0.3 changesetRelease

Collapsible

Collapse a column to a rail — the header rotates, keeps its count, and flips its toggle to expand ('Done' starts collapsed).

To do, 3 cards
Audit color tokensDesign
Write the docs pageDocs
Prune dead examplesChore
In progress, 2 cards
Ship board v1Feature
Add swimlane recipeFeature
Done, 2 cards

Cards

Card Handle

A rich card with an explicit grip (`Board.CardHandle`) — only the grip drags, so the card's own menu button stays clickable and semantic.

To do, 2 cards
Audit color tokensDesign
Fix drag a11y on SafariBug
In progress, 1 card
Ship board v1Feature

Grouping

Swimlanes

Swimlanes — horizontal bands crossing every column; cards move across columns AND lanes on one machine, cells keyed by Board.cellKey. Shared column headers sit once on top.

To do
In progress
Done
High priority
Fix drag a11y on SafariBug
Ship board v1Feature
Normal
Audit color tokensDesign
Prune dead examplesChore
Add swimlane recipeFeature
Release 0.3 changesetRelease

States

Loading

The loading state — skeleton columns while cards stream in.

Empty

An empty column still renders a labelled 'No cards' drop-zone.

To do, 1 card
Audit color tokensDesign
In progress, 0 cards
Done, 0 cards