import { useState } from 'react'; import { motion, AnimatePresence } from 'motion/react'; import { MoreVertical, Plus, Calendar, MessageSquare } from 'lucide-react'; import { Avatar } from './Avatar'; import { Badge } from './Badge'; export interface KanbanTask { id: string; title: string; description?: string; priority: 'low' | 'medium' | 'high'; assignee?: { name: string; avatar?: string }; dueDate?: string; comments?: number; tags?: string[]; } export interface KanbanColumn { id: string; title: string; color?: string; // e.g. 'primary', 'warning', 'success' taskIds: string[]; } export interface KanbanBoardConfig { columns: KanbanColumn[]; tasks: Record; } export interface KanbanProps { config: KanbanBoardConfig; onTaskMove?: (taskId: string, sourceColId: string, destColId: string) => void; onTaskClick?: (task: KanbanTask) => void; className?: string; } export function Kanban({ config, onTaskMove, onTaskClick, className = '' }: KanbanProps) { const [boardConfig, setBoardConfig] = useState(config); // Basic drag and drop state simulation const [draggedTaskId, setDraggedTaskId] = useState(null); const handleDragStart = (e: React.DragEvent, taskId: string) => { setDraggedTaskId(taskId); e.dataTransfer.effectAllowed = "move"; }; const handleDrop = (e: React.DragEvent, colId: string) => { e.preventDefault(); if (!draggedTaskId) return; // Find source col const sourceCol = boardConfig.columns.find(c => c.taskIds.includes(draggedTaskId)); if (!sourceCol || sourceCol.id === colId) { setDraggedTaskId(null); return; } // Move task logic const newConfig = { ...boardConfig }; const newSourceCol = newConfig.columns.find(c => c.id === sourceCol.id); const newDestCol = newConfig.columns.find(c => c.id === colId); if (newSourceCol && newDestCol) { newSourceCol.taskIds = newSourceCol.taskIds.filter(id => id !== draggedTaskId); newDestCol.taskIds.push(draggedTaskId); setBoardConfig(newConfig); if (onTaskMove) { onTaskMove(draggedTaskId, sourceCol.id, colId); } } setDraggedTaskId(null); }; const getPriorityColor = (p: string) => { if (p === 'high') return 'error'; if (p === 'medium') return 'warning'; return 'info'; }; return (
{boardConfig.columns.map((col) => (
e.preventDefault()} onDrop={(e) => handleDrop(e, col.id)} > {/* Column Header */}

{col.title}

{col.taskIds.length}
{/* Tasks Container */}
{col.taskIds.map((taskId) => { const task = boardConfig.tasks[taskId]; if (!task) return null; return ( handleDragStart(e, task.id)} onClick={() => onTaskClick?.(task)} className="bg-surface border border-border/50 hover:border-primary/50 rounded-xl p-4 shadow-lg hover:shadow-xl cursor-grab active:cursor-grabbing transition-all group" >
{task.priority} {task.tags?.map(tag => ( {tag} ))}

{task.title}

{task.description && (

{task.description}

)}
{task.dueDate && ( {task.dueDate} )} {task.comments !== undefined && ( {task.comments} )}
{task.assignee && ( )}
); })}
))}
); }