Kanban Flow
Ready
Chat6 msgs
Build a drag-and-drop kanban board with project management features, sprint tracking, and real-time collaboration support.

2:14 PM

I'll build you a full Kanban board application with drag-and-drop columns, card management, sprint tracking, and a clean dashboard. Here's what I'm generating:

Files changed
src/app/page.tsx
src/components/Board.tsx
src/components/Column.tsx
src/components/Card.tsx
src/lib/store.ts
+12 more files

2:14 PM

Add a sprint planning view where I can assign story points to cards and see total capacity per sprint.

2:31 PM

Added sprint planning. I created a new `/sprints` route with a capacity bar, story point input on each card, and a velocity chart showing points completed per sprint. The Board component now accepts a `sprintId` prop to filter cards.

Files changed
src/app/sprints/page.tsx
src/components/SprintPlanner.tsx
src/components/VelocityChart.tsx
[modified] src/components/Card.tsx

2:32 PM

The card modal needs a description field with markdown support and an assignee picker.

3:05 PM

Done — the card modal now has a full markdown editor using `@uiw/react-md-editor` with preview toggle, and an assignee picker with avatar thumbnails. I also added a `members` array to the board state so you can manage team members from settings.

Files changed
[modified] src/components/CardModal.tsx
src/components/MarkdownEditor.tsx
src/components/AssigneePicker.tsx

3:06 PM

send · ⇧↵ newline
Explorer
Board.tsx
'use client';

import React, { useState } from 'react';
import { DndContext, DragEndEvent, closestCenter } from '@dnd-kit/core';
import Column from './Column';
import { useBoardStore } from '../../../lib/store';

interface BoardProps {
  sprintId?: string;
}

export default function Board({ sprintId }: BoardProps) {
  const { columns, moveCard } = useBoardStore();

  const handleDragEnd = (event: DragEndEvent) => {
    const { active, over } = event;
    if (!over || active.id === over.id) return;
    moveCard(String(active.id), String(over.id));
  };

  const filteredColumns = sprintId
    ? columns.filter((col) => col.sprintId === sprintId)
    : columns;

  return (
    <DndContext collisionDetection={closestCenter} onDragEnd={handleDragEnd}>
      <div className="flex gap-4 h-full overflow-x-auto p-6">
        {filteredColumns.map((column) => (
          <Column key={column.id} column={column} />
        ))}
        <button className="flex-shrink-0 w-64 h-12 rounded-xl border-2 border-dashed
          border-border text-muted-foreground hover:border-primary hover:text-primary
          text-sm font-medium transition-all duration-150">
          + Add column
        </button>
      </div>
    </DndContext>
  );
}
localhost:3000
Kanban Flow/ Sprint 12
DashboardBoardSprintsTeam
AK

Sprint 12 Board

Filter
+ Add Card
Backlog8
To Do5
In Progress3
Review2
Done11