Xzero UI
Pro library

Kanban boardPro

A kanban board where cards lift, tilt and spring into the slot that opens for them, with swimlanes and live WIP limits.

$ pnpm dlx shadcn@4.23.0 add @xzero-ui-pro/kanban-board
Live · keyboard ready

Use this for a team's issue or task board. Load columns, people and cards from your tracker, persist onCardsChange (it receives the full ordered list after every move or edit), and set limit on columns that need WIP limits.

When to use

When not to use

Installation

Register both Xzero UI namespaces in your project's components.json:

{
  "registries": {
    "@xzero-ui": "https://mcp.xzero.co.uk/r/{name}.json",
    "@xzero-ui-pro": "https://mcp.xzero.co.uk/r/pro/{name}.json"
  }
}
npx shadcn@4.23.0 add @xzero-ui-pro/kanban-board

Install xzero-foundation once, and import @/components/xzero/foundation.css in your app root. No Xzero token is used by this snapshot. For sample portraits, photos, fonts, or logos, download https://mcp.xzero.co.uk/install-assets.mjs and run node xzero-install-assets.mjs <receiving-project>.

Usage

import { KanbanBoard } from "@/components/xzero/blocks/kanban-board/kanban-board";

export function Sprint({ issues, team }) {
  const [cards, setCards] = useState(issues);
  return (
    <KanbanBoard
      title="Sprint 42"
      columns={[{ id: "todo", name: "To do" }, { id: "doing", name: "Doing", limit: 4 }, { id: "done", name: "Done" }]}
      people={team}
      cards={cards}
      onCardsChange={next => { setCards(next); saveOrder(next); }}
    />
  );
}

API reference

KanbanBoard

A kanban board with physical drag and drop. The lifted card follows the pointer from where you grabbed it and tilts with speed, a slot opens where it will land, the board scrolls at its edges, and the card springs into the slot on release. Group by assignee for swimlanes, with live WIP limits, quick add and a detail drawer.

PropTypeDefaultDescription
columnsKanbanColumn[]sample columnsColumns in order. Set limit on a column to warn when it holds more cards.
peopleKanbanPerson[]sample peopleAssignees, used for avatars, swimlanes and the assignee select.
cardsKanbanCard[]–Controlled cards in board order. Leave out for uncontrolled use.
defaultCardsKanbanCard[]sample cardsInitial cards when uncontrolled.
onCardsChange(cards: KanbanCard[]) => void–Called with the full ordered list after every move, edit, checklist toggle or new card.
defaultGroupBy"status" | "assignee""status"Start in columns only or in swimlanes by assignee.
currentUserstringfirst personPerson id that new cards are assigned to.
titlestring"Billing v2"Board title.
classNamestring–Extra class on the root.

Keyboard interactions

KeysAction
EnterOpens the focused card's details.
SpaceLifts the focused card; Space or Enter drops it.
Arrow up / downMoves a lifted card within its column.
Arrow left / rightMoves a lifted card to the neighbouring column.
Shift + arrow up / downMoves a lifted card to the neighbouring swimlane.
EscapeCancels a drag and returns the card, or closes the drawer.

Accessibility

Motion

Responsive behavior

Performance

Notes for AI

Guidance for AI tools

Blocks are complete, self-contained screens with sample data. Replace the sample data and connect the callbacks described above. Follow the declared prop types and do not invent props. Keep keyboard access, reduced motion support, and both light and dark themes intact when adapting it.

Full library index: https://ui.xzero.co.uk/llms.txt

Browse all components