Fluxo UIFluxo UIv0.4.93

Kanban Board

A fully-featured Kanban board component with drag-and-drop, customizable cards, column WIP limits, priority indicators, assignee avatars, collapsible columns, and search filtering.

Basic Usage

A standard Kanban board with drag-and-drop, card counts, search filtering, and collapsible columns.

Basic Kanban Board

Standard board with drag-and-drop, card count, search, and collapsible columns.

Backlog2
Design landing page mockup
Implement user authentication API
To Do2
Write unit tests for payment module
Set up CI/CD pipeline
In Progress3/3
Migrate database schema to v2
65%
Refactor notification service
Update API documentation
Review1
Fix responsive layout on mobile
90%
Done2
Implement dark mode toggle
100%
Security audit fixes
100%
import { KanbanBoard } from 'fluxo-ui';
import type { KanbanCardData, KanbanColumnData } from 'fluxo-ui';

const columns: KanbanColumnData[] = [
  { id: 'backlog', title: 'Backlog', color: '#94a3b8' },
  { id: 'todo', title: 'To Do', color: '#3b82f6' },
  { id: 'in-progress', title: 'In Progress', color: '#f59e0b', limit: 3 },
  { id: 'review', title: 'Review', color: '#8b5cf6' },
  { id: 'done', title: 'Done', color: '#10b981' },
];

const cards: KanbanCardData[] = [
  {
    id: '1',
    title: 'Design landing page mockup',
    columnId: 'backlog',
    order: 0,
    priority: 'medium',
    labels: [{ id: 'design', text: 'Design', color: '#8b5cf6' }],
    assignee: { id: 'a1', name: 'Alice Martin' },
  },
  // ...more cards
];

<KanbanBoard
  columns={columns}
  cards={cards}
  draggable
  showCardCount
  showColumnLimit
  showSearch
  allowCollapse
/>

Detailed Card View

Use cardSize="detailed" to show descriptions, progress bars, subtask counts, and stacked assignee avatars.

Detailed Card View

Cards with descriptions, progress bars, labels, subtask counts, and assignee stacking.

To Do1
DesignFrontend
Redesign dashboard with new brand guidelines
Update all dashboard components to match the new brand colors, typography, and spacing system.
30%
In Progress2/4
BackendPerformance
Optimize database queries for reports
Several report queries are taking >5s. Need to add proper indexes and optimize JOINs.
55%
SecurityBackend
Add two-factor authentication
Implement TOTP-based 2FA with QR code enrollment and backup codes.
40%
In Review1
Backend
Implement webhook retry mechanism
Add exponential backoff retry logic for failed webhook deliveries with configurable max attempts.
95%
<KanbanBoard
  columns={columns}
  cards={cards}
  cardSize="detailed"
  draggable
  showCardCount
  showColumnLimit
  allowCollapse
/>

// Card data for detailed view includes:
const card: KanbanCardData = {
  id: 'd1',
  title: 'Redesign dashboard',
  columnId: 'todo',
  order: 0,
  description: 'Update all components to match new brand.',
  priority: 'high',
  labels: [
    { id: 'design', text: 'Design', color: '#8b5cf6' },
    { id: 'frontend', text: 'Frontend', color: '#3b82f6' },
  ],
  assignees: [
    { id: 'a1', name: 'Alice Martin' },
    { id: 'a2', name: 'Bob Chen' },
  ],
  dueDate: new Date('2025-04-15'),
  progress: 30,
  subtaskCount: 12,
  subtaskCompleted: 4,
  commentCount: 8,
  attachmentCount: 3,
};

Compact Mode

Use cardSize="compact" for a minimal card display ideal for high-density boards.

Compact Mode

Minimal card display ideal for high-density boards with many items.

Open3
Fix login timeout issue
Update email templates
Add export to CSV feature
Active2
Review pull request #342
Deploy staging environment
Closed2
Update dependencies
Fix broken navigation links
<KanbanBoard
  columns={columns}
  cards={cards}
  cardSize="compact"
  draggable
  showCardCount
  columnWidth={240}
/>

WIP Limits

Set a limit on columns to enforce work-in-progress constraints. Columns that exceed their limit display a visual warning indicator.

WIP Limits

Set limit on columns to enforce work-in-progress constraints. Columns exceeding their limit display a visual warning.

To Do2
Feature: User Profiles
Feature: Notifications
Development3/2
Bug: Login redirect
Feature: Export CSV
Feature: Dark Mode
QA3/2
Bug: Date formatting
Feature: File Upload
Feature: Webhooks
Done1
Feature: Search
100%
const columns: KanbanColumnData[] = [
  { id: 'todo', title: 'To Do', color: '#3b82f6' },
  { id: 'dev', title: 'Development', color: '#f59e0b', limit: 2 },
  { id: 'qa', title: 'QA', color: '#8b5cf6', limit: 2 },
  { id: 'done', title: 'Done', color: '#10b981' },
];

<KanbanBoard
  columns={columns}
  cards={cards}
  draggable
  showCardCount
  showColumnLimit
/>

Collapsible Columns

Enable allowCollapse to add collapse/expand toggles in column headers. Collapsed columns shrink to a narrow strip with a vertically rotated title. Set collapsed: true on a column for an initially collapsed state. Click a collapsed column to expand it.

Collapsible Columns

Click the collapse button in the column header to collapse a column. The 'Code Review' column starts collapsed. Collapsed columns display a rotated vertical title and remaining columns fill the available space. Click a collapsed column to expand it.

Backlog2
Design landing page mockup
Implement user auth API
To Do2
Set up CI/CD pipeline
Write unit tests for auth
In Progress2
Build dashboard layout
API rate limiting
Code Review1
Done2
Database migration script
Setup logging infrastructure
import { KanbanBoard } from 'fluxo-ui';
import type { KanbanColumnData, KanbanCardData, KanbanColumnId } from 'fluxo-ui';

const columns: KanbanColumnData[] = [
  { id: 'backlog', title: 'Backlog', color: '#94a3b8' },
  { id: 'todo', title: 'To Do', color: '#3b82f6' },
  { id: 'in-progress', title: 'In Progress', color: '#f59e0b' },
  { id: 'review', title: 'Code Review', color: '#8b5cf6', collapsed: true },
  { id: 'done', title: 'Done', color: '#10b981' },
];

// Set collapsed: true on a column to have it collapsed by default.
// Enable allowCollapse to show collapse/expand toggle in column headers.
// Collapsed columns shrink to ~40px with a vertically rotated title.
// Click on a collapsed column to expand it.

<KanbanBoard
  columns={columns}
  cards={cards}
  allowCollapse
  showCardCount
  onColumnCollapse={(columnId, collapsed) => {
    console.log(columnId, collapsed ? 'collapsed' : 'expanded');
  }}
/>

Blocked Cards

Set blocked: true on a card to visually indicate it is blocked. Combine with color for a colored left border.

Blocked Cards

Set blocked: true on a card to visually indicate it is blocked. Combine with color to add a colored left border.

To Do2
Frontend
Upgrade React to v19
Testing
Write E2E test suite
In Progress3
Security
Implement SSO integration
Blocked: Waiting for IdP credentials from the security team.
Mobile
Mobile app push notifications
Backend
Build search microservice
60%
Done0
const cards: KanbanCardData[] = [
  {
    id: 'b1',
    title: 'Implement SSO integration',
    columnId: 'in-progress',
    order: 0,
    priority: 'high',
    blocked: true,
    color: '#ef4444',
    description: 'Blocked: Waiting for IdP credentials.',
  },
  {
    id: 'b2',
    title: 'Mobile push notifications',
    columnId: 'in-progress',
    order: 1,
    priority: 'medium',
    blocked: true,
  },
  // non-blocked cards...
];

<KanbanBoard
  columns={columns}
  cards={cards}
  cardSize="detailed"
  draggable
  showCardCount
/>

Locked Columns

Set locked: true on a column to prevent all interactions including drag-and-drop, editing, and adding cards.

Locked Columns

Set locked: true on a column to prevent drag-and-drop and hide add/delete controls. Ideal for archival or read-only columns.

New2
Design new onboarding flow
Add payment gateway integration
Active2
Implement real-time chat
Setup monitoring alerts
Archived2
Legacy API migration
Old dashboard redesign
const columns: KanbanColumnData[] = [
  { id: 'new', title: 'New', color: '#3b82f6' },
  { id: 'active', title: 'Active', color: '#f59e0b' },
  { id: 'archived', title: 'Archived', color: '#94a3b8', locked: true },
];

<KanbanBoard
  columns={columns}
  cards={cards}
  draggable
  allowAddCard
  showCardCount
/>

Vertical Layout

Use layout="vertical" to stack columns vertically instead of horizontally. Useful for priority triage boards or narrow containers.

Vertical Layout

Stack columns vertically instead of horizontally. Useful for priority triage or narrow containers.

High Priority3
Fix critical security vulnerability
Resolve production database deadlock
Patch API rate limiting bypass
Medium Priority2
Improve search result relevance
Add caching layer for reports
Low Priority2
Refactor CSS to design tokens
Update copyright footer text
<KanbanBoard
  columns={columns}
  cards={cards}
  layout="vertical"
  draggable
  showCardCount
  allowCollapse
/>

Sticky Column Headers

Enable stickyColumnHeaders with maxColumnHeight to keep headers visible while scrolling through cards.

Sticky Column Headers

Enable stickyColumnHeaders with maxColumnHeight to keep column headers visible while scrolling through cards.

Backlog2
Design landing page mockup
Implement user authentication API
To Do2
Write unit tests for payment module
Set up CI/CD pipeline
In Progress3
Migrate database schema to v2
65%
Refactor notification service
Update API documentation
Review1
Fix responsive layout on mobile
90%
Done2
Implement dark mode toggle
100%
Security audit fixes
100%
<KanbanBoard
  columns={columns}
  cards={cards}
  draggable
  showCardCount
  stickyColumnHeaders
  maxColumnHeight={300}
/>

Custom Card Template

Use cardTemplate to render fully custom card content with any layout.

Custom Card Template

Use cardTemplate to render fully custom card content with any layout.

Open3
Fix login timeout issue
Update email templates
Add export to CSV feature
Active2
Review pull request #342
Deploy staging environment
Closed2
Update dependencies
Fix broken navigation links
<KanbanBoard
  columns={columns}
  cards={cards}
  draggable
  showCardCount
  columnWidth={260}
  cardTemplate={(card) => (
    <div className="flex items-center gap-3 p-2">
      <span
        className={cn('w-2 h-2 rounded-full shrink-0', {
          'bg-red-500': card.priority === 'high' || card.priority === 'critical',
          'bg-yellow-500': card.priority === 'medium',
          'bg-green-500': card.priority === 'low',
        })}
      />
      <span className="text-sm font-medium truncate">
        {card.title}
      </span>
    </div>
  )}
/>

Custom Column Header & Empty State

Use columnHeaderTemplate and emptyColumnTemplate for full control over column rendering.

Custom Column Header & Empty State

Use columnHeaderTemplate and emptyColumnTemplate for full control over column rendering.

Backlog2
Design landing page mockup
Implement user authentication API
To Do2
Write unit tests for payment module
Set up CI/CD pipeline
In Progress3
Migrate database schema to v2
65%
Refactor notification service
Update API documentation
Review1
Fix responsive layout on mobile
90%
Done2
Implement dark mode toggle
100%
Security audit fixes
100%
<KanbanBoard
  columns={columns}
  cards={cards}
  draggable
  columnHeaderTemplate={(column, cardCount) => (
    <div className="flex items-center gap-2 px-3 py-2">
      <span
        className="w-3 h-3 rounded-full"
        style={{ backgroundColor: column.color }}
      />
      <span className="text-sm font-semibold flex-1">
        {column.title}
      </span>
      <span className="text-xs px-2 py-0.5 rounded-full bg-gray-100">
        {cardCount}
      </span>
    </div>
  )}
  emptyColumnTemplate={(column) => (
    <div className="text-center py-8 text-sm text-gray-400 italic">
      No items in {column.title}
    </div>
  )}
/>

Custom Card Actions

Use cardActionsTemplate to add custom action buttons in the card footer area.

Custom Card Actions

Use cardActionsTemplate to add action buttons in the card footer area.

Open3
Fix login timeout issue
Update email templates
Add export to CSV feature
Active2
Review pull request #342
Deploy staging environment
Closed2
Update dependencies
Fix broken navigation links
<KanbanBoard
  columns={columns}
  cards={cards}
  draggable
  showCardCount
  cardActionsTemplate={(card, column) => (
    <div className="flex items-center gap-1">
      <button
        className="px-2 py-0.5 text-xs rounded hover:bg-gray-100"
        onClick={() => console.log('Edit:', card.title)}
      >
        Edit
      </button>
      <button
        className="px-2 py-0.5 text-xs rounded hover:bg-gray-100"
        onClick={() => console.log('Archive:', card.title)}
      >
        Archive
      </button>
    </div>
  )}
/>

Interactive Board

Full interactive demo with all CRUD operations: drag cards between columns, add/delete cards and columns, edit column titles, and reorder columns.

Interactive Board

Full interactive demo: drag cards, add/delete cards and columns, edit column titles, reorder columns.

Backlog2
Design landing page mockup
Implement user authentication API
To Do2
Write unit tests for payment module
Set up CI/CD pipeline
In Progress3/3
Migrate database schema to v2
65%
Refactor notification service
Update API documentation
Review1
Fix responsive layout on mobile
90%
Done2
Implement dark mode toggle
100%
Security audit fixes
100%
const [cards, setCards] = useState<KanbanCardData[]>(initialCards);
const [columns, setColumns] = useState<KanbanColumnData[]>(initialColumns);

<KanbanBoard
  columns={columns}
  cards={cards}
  draggable
  columnDraggable
  allowAddCard
  allowAddColumn
  allowDeleteCard
  allowDeleteColumn
  allowEditColumn
  allowCollapse
  showCardCount
  showColumnLimit
  showSearch
  onCardMove={(e) => {
    setCards(prev => {
      const without = prev.filter(c => c.id !== e.cardId);
      const target = without
        .filter(c => c.columnId === e.toColumnId)
        .sort((a, b) => a.order - b.order);
      const others = without.filter(c => c.columnId !== e.toColumnId);
      const moved = { ...e.card, columnId: e.toColumnId, order: e.toIndex };
      target.splice(e.toIndex, 0, moved);
      return [...others, ...target.map((c, i) => ({ ...c, order: i }))];
    });
  }}
  onCardReorder={(e) => {
    setCards(prev => {
      const other = prev.filter(c => c.columnId !== e.columnId);
      return [...other, ...e.cards.map((c, i) => ({ ...c, order: i }))];
    });
  }}
  onCardCreate={(e) => {
    setCards(prev => [...prev, {
      id: `new-${Date.now()}`,
      title: e.title,
      columnId: e.columnId,
      order: prev.filter(c => c.columnId === e.columnId).length,
    }]);
  }}
  onCardDelete={(e) => setCards(prev => prev.filter(c => c.id !== e.card.id))}
  onColumnCreate={(e) => setColumns(prev => [...prev, { id: `col-${Date.now()}`, title: e.title }])}
  onColumnDelete={(e) => {
    setColumns(prev => prev.filter(c => c.id !== e.column.id));
    setCards(prev => prev.filter(c => c.columnId !== e.column.id));
  }}
  onColumnUpdate={(e) => setColumns(prev =>
    prev.map(c => c.id === e.column.id ? { ...c, [e.field]: e.value } : c)
  )}
  onColumnReorder={(e) => setColumns(e.columns)}
/>

Import

import { KanbanBoard } from 'fluxo-ui';

// Type imports
import type {
  KanbanBoardProps,
  KanbanCardData,
  KanbanCardId,
  KanbanColumnData,
  KanbanColumnId,
  KanbanCardMoveEvent,
  KanbanCardReorderEvent,
  KanbanCardClickEvent,
  KanbanCardCreateEvent,
  KanbanCardDeleteEvent,
  KanbanColumnCreateEvent,
  KanbanColumnDeleteEvent,
  KanbanColumnUpdateEvent,
  KanbanColumnReorderEvent,
  KanbanSearchFilter,
  KanbanLabel,
  KanbanAssignee,
  KanbanPriority,
  KanbanLayout,
  KanbanCardSize,
} from 'fluxo-ui';

KanbanBoard Props

columnsreq
KanbanColumnData[]

Array of column definitions with id, title, color, icon, limit, collapsed, locked.

cardsreq
KanbanCardData[]

Array of card data with id, title, columnId, order, priority, labels, assignees, etc.

layout
"horizontal" | "vertical""horizontal"

Board layout direction.

cardSize
"compact" | "default" | "detailed""default"

Card display density. Compact hides labels/progress, detailed shows descriptions.

className
string

Additional CSS class for the board container.

columnWidth
number | string

Fixed column width (px or CSS value).

columnMinHeight
number | string

Minimum column body height.

maxColumnHeight
number | string

Maximum column body scroll height.

draggable
booleantrue

Enable drag-and-drop for cards.

columnDraggable
booleanfalse

Enable drag-and-drop reordering of columns.

allowAddCard
booleanfalse

Show "Add card" button in each column footer.

allowAddColumn
booleanfalse

Show "Add Column" button at the end.

allowDeleteCard
booleanfalse

Show delete button on card hover.

allowDeleteColumn
booleanfalse

Show delete button in column headers.

allowEditColumn
booleanfalse

Enable double-click to edit column title.

allowCollapse
booleanfalse

Show collapse/expand toggle in column headers.

showCardCount
booleanfalse

Display card count badge in column headers.

showColumnLimit
booleanfalse

Display WIP limit alongside card count.

showSearch
booleanfalse

Show search input above the board.

stickyColumnHeaders
booleanfalse

Make column headers sticky on scroll.

cardTemplate
(card, column) => ReactNode

Custom render function for card content.

columnHeaderTemplate
(column, count) => ReactNode

Custom render function for column headers.

columnFooterTemplate
(column, cards) => ReactNode

Custom render function for column footers.

emptyColumnTemplate
(column) => ReactNode

Custom render function for empty columns.

cardActionsTemplate
(card, column) => ReactNode

Custom actions rendered in card footer area.

onCardMove
(event: KanbanCardMoveEvent) => void

Called when a card is moved between columns.

onCardReorder
(event: KanbanCardReorderEvent) => void

Called when cards are reordered within a column.

onCardClick
(event: KanbanCardClickEvent) => void

Called when a card is clicked.

onCardDoubleClick
(event: KanbanCardClickEvent) => void

Called when a card is double-clicked.

onCardCreate
(event: KanbanCardCreateEvent) => void

Called when a new card is created via the add button.

onCardDelete
(event: KanbanCardDeleteEvent) => void

Called when a card delete button is clicked.

onColumnReorder
(event: KanbanColumnReorderEvent) => void

Called when columns are reordered via drag.

onColumnCreate
(event: KanbanColumnCreateEvent) => void

Called when a new column is created.

onColumnDelete
(event: KanbanColumnDeleteEvent) => void

Called when a column is deleted.

onColumnUpdate
(event: KanbanColumnUpdateEvent) => void

Called when a column title is edited.

onColumnCollapse
(columnId, collapsed) => void

Called when a column is collapsed or expanded.

onSearchChange
(filter: KanbanSearchFilter) => void

Called when the search input changes.

KanbanCardData Properties

idreq
string | number

Unique identifier for the card.

titlereq
string

Card title displayed prominently.

columnIdreq
string | number

ID of the column this card belongs to.

orderreq
number

Sort position within the column.

description
string

Card description shown in detailed view.

priority
"critical" | "high" | "medium" | "low" | "none"

Priority level with visual indicator.

labels
KanbanLabel[]

Color-coded labels shown on the card.

assignee
KanbanAssignee

Single assignee with name and optional avatar.

assignees
KanbanAssignee[]

Multiple assignees with stacked display.

dueDate
Date | string

Due date with overdue/soon indicators.

coverImage
string

Cover image URL shown in detailed mode.

progress
number

Completion percentage (0-100) shown as a progress bar.

subtaskCount
number

Total number of subtasks.

subtaskCompleted
number

Number of completed subtasks.

commentCount
number

Number of comments shown as a badge.

attachmentCount
number

Number of attachments shown as a badge.

blocked
booleanfalse

Mark the card as blocked with a visual overlay.

color
string

Left border color for the card.

KanbanColumnData Properties

idreq
string | number

Unique identifier for the column.

titlereq
string

Column header title.

color
string

Accent color for the column header indicator.

icon
ReactNode

Icon displayed next to the column title.

limit
number

Maximum number of cards (WIP limit). Visual warning when exceeded.

collapsed
booleanfalse

Initial collapsed state of the column.

locked
booleanfalse

Prevent all interactions (drag, edit, add, delete).

Features

Drag & Drop

Reorder cards within columns and drag cards between columns with smooth animations.

Column WIP Limits

Set work-in-progress limits per column with visual warnings when exceeded.

Priority & Labels

Visual priority indicators and customizable color-coded labels on cards.

Assignee Avatars

Show assignees with avatar images or auto-generated initials with overlap stacking.

Collapsible Columns

Collapse columns to save space with smooth transitions and vertical title display.

Search & Filter

Built-in search bar to filter cards across all columns by title or description.

Blocked Cards

Visually mark cards as blocked with a distinct overlay and optional color border.

Locked Columns

Lock columns to prevent drag-and-drop, editing, and adding cards.

Custom Templates

Full control over card, header, footer, empty state, and action rendering.

Multiple Layouts

Horizontal (default) and vertical board layouts for different use cases.

Card Sizes

Three built-in card sizes: compact, default, and detailed.

Accessibility

ARIA labels, keyboard navigation, focus-visible outlines, and semantic HTML.