Installation
npx @hanzo/ui@latest add kanbanUsage
import { KanbanBoard } from "@/registry/default/ui/kanban"const [board, setBoard] = useState({
id: "board-1",
title: "Project Board",
columns: [
{
id: "todo",
title: "To Do",
cards: [
{
id: "card-1",
title: "Setup project",
description: "Initialize the project structure",
priority: "high",
assignee: "John Doe",
dueDate: "2024-12-31",
labels: [{ id: "bug", name: "Bug", color: "#ef4444" }],
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
}
],
limit: 5
},
{
id: "doing",
title: "In Progress",
cards: [],
},
{
id: "done",
title: "Done",
cards: [],
}
],
labels: [
{ id: "bug", name: "Bug", color: "#ef4444" },
{ id: "feature", name: "Feature", color: "#22c55e" },
{ id: "improvement", name: "Improvement", color: "#3b82f6" }
]
})
<KanbanBoard
board={board}
onUpdateBoard={setBoard}
className="h-screen"
/>Features
Drag and Drop
- Card Movement: Drag cards between columns
- Card Reordering: Reorder cards within columns
- Visual Feedback: Smooth animations and drag overlay
- Column Limits: Respect maximum card limits per column
Card Management
- Create Cards: Add new cards to any column
- Edit Cards: Update card details in-place
- Delete Cards: Remove cards with confirmation
- Card Actions: Dropdown menu for card operations
Card Properties
- Title & Description: Basic card information
- Priority Levels: Low, Medium, High, Urgent with color coding
- Labels: Custom colored labels for categorization
- Assignee: Assign cards to team members
- Due Dates: Set and display due dates
- Timestamps: Automatic creation and update timestamps
Search and Filtering
- Real-time Search: Filter cards by title, description, or labels
- Preserved State: Search doesn't affect board state
- Highlight Matches: Visual indication of search results
Responsive Design
- Mobile Friendly: Works on all screen sizes
- Horizontal Scroll: Columns scroll horizontally on smaller screens
- Touch Support: Full touch device support
Types
interface KanbanCard {
id: string
title: string
description?: string
labels?: KanbanLabel[]
priority?: "low" | "medium" | "high" | "urgent"
assignee?: string
dueDate?: string
createdAt: string
updatedAt: string
}
interface KanbanLabel {
id: string
name: string
color: string
}
interface KanbanColumn {
id: string
title: string
cards: KanbanCard[]
limit?: number
}
interface KanbanBoard {
id: string
title: string
columns: KanbanColumn[]
labels: KanbanLabel[]
}Props
KanbanBoard
| Prop | Type | Default | Description |
|---|---|---|---|
| board | KanbanBoard | - | The board data structure |
| onUpdateBoard | (board: KanbanBoard) => void | - | Callback when board state changes |
| className | string | - | Additional CSS classes |
Examples
Basic Kanban Board
Component kanban-basic not found in registry.
Kanban with Labels
Component kanban-labels not found in registry.
Project Management Board
Component kanban-project not found in registry.
Customization
Custom Priority Colors
// You can customize priority colors by extending the CSS
const priorityVariants = cva(
"inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-semibold",
{
variants: {
priority: {
low: "border-blue-200 bg-blue-50 text-blue-700",
medium: "border-yellow-200 bg-yellow-50 text-yellow-700",
high: "border-orange-200 bg-orange-50 text-orange-700",
urgent: "border-red-200 bg-red-50 text-red-700",
},
},
}
)Custom Card Template
You can create custom card templates by extending the KanbanCardComponent:
function CustomKanbanCard({ card, onEdit, onDelete }) {
return (
<Card className="mb-3 group hover:shadow-md transition-shadow">
{/* Your custom card layout */}
</Card>
)
}Column Limits
Set limits on the number of cards per column:
const column = {
id: "todo",
title: "To Do",
cards: [],
limit: 5, // Maximum 5 cards
}Integration Examples
With Local Storage
const useKanbanBoard = (boardId: string) => {
const [board, setBoard] = useState(() => {
const saved = localStorage.getItem(`kanban-${boardId}`)
return saved ? JSON.parse(saved) : defaultBoard
})
const updateBoard = useCallback(
(newBoard: KanbanBoard) => {
setBoard(newBoard)
localStorage.setItem(`kanban-${boardId}`, JSON.stringify(newBoard))
},
[boardId]
)
return { board, updateBoard }
}With API Integration
const useKanbanAPI = (boardId: string) => {
const [board, setBoard] = useState<KanbanBoard | null>(null)
const updateBoard = useCallback(
async (newBoard: KanbanBoard) => {
setBoard(newBoard)
try {
await fetch(`/api/boards/${boardId}`, {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(newBoard),
})
} catch (error) {
console.error("Failed to save board:", error)
}
},
[boardId]
)
return { board, updateBoard }
}Real-time Collaboration
const useRealtimeKanban = (boardId: string) => {
const [board, setBoard] = useState<KanbanBoard | null>(null)
useEffect(() => {
const socket = io()
socket.emit("join-board", boardId)
socket.on("board-updated", (updatedBoard: KanbanBoard) => {
setBoard(updatedBoard)
})
return () => {
socket.emit("leave-board", boardId)
socket.disconnect()
}
}, [boardId])
const updateBoard = useCallback(
(newBoard: KanbanBoard) => {
setBoard(newBoard)
socket.emit("update-board", { boardId, board: newBoard })
},
[boardId]
)
return { board, updateBoard }
}Accessibility
The Kanban board component includes comprehensive accessibility features:
- Keyboard Navigation: Full keyboard support for drag and drop
- Screen Reader Support: Proper ARIA labels and descriptions
- Focus Management: Logical focus order and visible focus indicators
- Semantic HTML: Proper heading hierarchy and landmarks
Performance
- Optimized Rendering: Efficient re-rendering with React.memo
- Large Datasets: Handles boards with hundreds of cards
- Smooth Animations: Hardware-accelerated animations
- Memory Efficient: Proper cleanup and garbage collection
Troubleshooting
Cards Not Dragging
Make sure you have installed all required @dnd-kit dependencies:
npm install @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilitiesStyling Issues
Ensure you have the required CSS classes in your Tailwind configuration and that all UI components are properly installed.
Performance Issues
For boards with many cards (100+), consider implementing virtualization or pagination for better performance.