Kanban Table
A Kanban board is a component that organizes work items into columns representing different stages of a workflow, such as "To Do," "In Progress," and "Done." Commonly used in project management tools, agile development platforms, and task tracking applications, the Kanban board provides a visual overview of work status and flow, helping teams identify bottlenecks and prioritize tasks.
This headless component renders a <div> with role="region" and an accessible label, defining a semantic boundary for the board. The consumer provides the column structure, card content, and any drag-and-drop or keyboard-based item movement as children.
Example
| To Do | In Progress | Done |
|---|
| Task 1 | Task 2 | Task 3 |
Show demo markup
<table class="kanban-table" aria-label="Kanban board"><thead class="kanban-table-head"><tr class="kanban-table-row"><th class="kanban-table-th">To Do</th><th class="kanban-table-th">In Progress</th><th class="kanban-table-th">Done</th></tr></thead><tbody class="kanban-table-body"><tr class="kanban-table-row"><td class="kanban-table-td">Task 1</td><td class="kanban-table-td">Task 2</td><td class="kanban-table-td">Task 3</td></tr></tbody></table>
Usage example
<script lang="ts">
import KanbanTable from "./KanbanTable.svelte";
import KanbanTableHead from "../KanbanTableHead/KanbanTableHead.svelte";
import KanbanTableBody from "../KanbanTableBody/KanbanTableBody.svelte";
import KanbanTableRow from "../KanbanTableRow/KanbanTableRow.svelte";
import KanbanTableTD from "../KanbanTableTD/KanbanTableTD.svelte";
import KanbanTableTD from "../KanbanTableTD/KanbanTableTD.svelte";
</script>
<KanbanTable label="Sprint 5 board" caption="Sprint 5">
<colgroup>
<KanbanTableTD span={1} />
<KanbanTableTD span={1} />
<KanbanTableTD span={1} />
</colgroup>
<KanbanTableHead>
<KanbanTableRow>
<th scope="col">To Do</th>
<th scope="col">In Progress</th>
<th scope="col">Done</th>
</KanbanTableRow>
</KanbanTableHead>
<KanbanTableBody>
<KanbanTableRow>
<KanbanTableTD label="Task A">Task A</KanbanTableTD>
<KanbanTableTD label="Task B">Task B</KanbanTableTD>
<KanbanTableTD label="Task C">Task C</KanbanTableTD>
</KanbanTableRow>
</KanbanTableBody>
</KanbanTable>
Show Svelte source
// In your Svelte component:
import KanbanTable from "lily-design-system-svelte-headless/components/KanbanTable/KanbanTable.svelte";
<KanbanTable label="Table">
<!-- thead, tbody, tfoot -->
</KanbanTable>
Usage
Sprint board with three workflow stages:
<KanbanTable label="Sprint 5 board">
<KanbanTableHead>
<KanbanTableRow>
<KanbanTableTD>To Do</KanbanTableTD>
<KanbanTableTD>In Progress</KanbanTableTD>
<KanbanTableTD>Done</KanbanTableTD>
</KanbanTableRow>
</KanbanTableHead>
<KanbanTableBody>
<KanbanTableRow>
<KanbanTableTD label="Fix login bug">Fix login bug</KanbanTableTD>
<KanbanTableTD label="Add dashboard">Add dashboard</KanbanTableTD>
<KanbanTableTD label="Setup CI/CD">Setup CI/CD</KanbanTableTD>
</KanbanTableRow>
</KanbanTableBody>
</KanbanTable>
Props
label: string (required) -- accessible name describing the board, applied via aria-label
children: slot (required) -- the board content including columns and cards
Keyboard Interactions
None built-in -- the consumer should implement keyboard interactions for moving items between columns and navigating within the board as appropriate.
ARIA
role="region" -- defines the Kanban board as a named landmark section
aria-label={label} -- provides an accessible name for the board region
When to Use
- Use for organising items by status in a board layout, such as project tasks (To Do, In Progress, Done).
- Use when teams need a visual overview of work status, flow, and bottlenecks.
- Use in project management tools, agile sprint boards, and task tracking applications.
- Use when items need to move between workflow stages.
When Not to Use
- Do not use for general tabular data -- use Table or DataTable instead.
- Do not use for timeline scheduling -- use GanttTable instead.
- Do not use for simple task lists without workflow stages -- use TaskList or CheckList instead.
Headless
This headless component provides a <div> with role="region" and aria-label for defining a named landmark for the Kanban board. The consumer provides all visual styling including column layout, card design, drag-and-drop interactions, and status color coding.
Styles
The consumer provides all CSS styling. The component renders with a .kanban-table class for targeting. No default styles are included — this is a fully headless component.
Testing
- Verify the component renders a
<table> element with class kanban-table
- Verify role="region"` -- defines the Kanban board as a named landmark section
- Verify aria-label={label}` -- provides an accessible name for the board region
- Verify pass-through attributes are applied
Advice
- Designers: Use distinct column backgrounds or headers to clearly separate workflow stages. Design cards with consistent layout showing title, assignee, and priority.
- Developers: Implement keyboard-based item movement between columns for accessibility. The consumer is responsible for drag-and-drop and column management.
Implementation Notes
- Renders a
<div> with role="region" to define a named landmark for the Kanban board
- Consumer provides column containers and item cards as children
- The region role with a label allows screen reader users to navigate directly to the board
- Accepts
...restProps for forwarding additional attributes to the container
- No internal state -- purely a structural wrapper
Composition
KanbanTable uses the Table composition pattern: KanbanTable contains KanbanTableHead, KanbanTableBody, and optionally KanbanTableFoot. Each section contains KanbanTableRow elements, which contain KanbanTableTD cells representing items in each workflow column. Use KanbanTableTD for column-level styling.
Related components
kanban-table-body — a kanban board table interactive grid tbody for organizing items by status <tbody>
kanban-table-foot — a kanban board table interactive grid tfoot for organizing items by status <tfoot>
kanban-table-head — a kanban board table interactive grid thead for organizing items by status <thead>
kanban-table-row — a kanban board table interactive grid row for organizing items by status <tr>
kanban-table-td — kanban board table interactive grid data cell for organizing items by status <td>
kanban-table-th — a kanban board table interactive grid header cell for organizing items by status <th>
table — a table with rows and columns <table>
References
- WAI-ARIA region role: https://www.w3.org/TR/wai-aria-1.2/#region
Canonical contract
Generated from this component's canonical metadata — the machine-checked source the implementations are held to.
Metadata
- Component: kanban-table
- PascalCase: KanbanTable
- Description: a kanban board table interactive grid for organizing items by status <table>
- Status: beta — implemented and unit-tested in all seven frameworks with an axe-clean demo page; not yet exercised in composed flows
- HTML tag: <table>
- CSS class: .kanban-table
- Interactive: no
ARIA
role="region" -- defines the Kanban board as a named landmark section aria-label={label} -- provides an accessible name for the board region
Keyboard
- No keyboard interactions — this is a passive element
Props
label: string (required) -- accessible name describing the board, applied via aria-label children: slot (required) -- the board content including columns and cards