diff --git a/TaskTracker.Web/src/components/KanbanBoard.tsx b/TaskTracker.Web/src/components/KanbanBoard.tsx index add99ea..7cd6494 100644 --- a/TaskTracker.Web/src/components/KanbanBoard.tsx +++ b/TaskTracker.Web/src/components/KanbanBoard.tsx @@ -143,7 +143,7 @@ export default function KanbanBoard({ tasks, isLoading, onTaskClick }: KanbanBoa {activeTask ? ( -
+
{}} />
) : null} diff --git a/TaskTracker.Web/src/components/KanbanColumn.tsx b/TaskTracker.Web/src/components/KanbanColumn.tsx index fd0365d..b40d4ce 100644 --- a/TaskTracker.Web/src/components/KanbanColumn.tsx +++ b/TaskTracker.Web/src/components/KanbanColumn.tsx @@ -28,56 +28,56 @@ export default function KanbanColumn({ const taskIds = tasks.map((t) => t.id) return ( -
+
{/* Column header */} -
-
-

{label}

- +
+
+

+ {label} +

+ {tasks.length}
-
+
{/* Cards area */}
{tasks.map((task) => ( ))} + + {/* Empty state */} + {tasks.length === 0 && !showForm && ( +
+ No tasks +
+ )}
- {/* Add task form / button (Pending column only) */} + {/* Add task (Pending column only) */} {status === WorkTaskStatus.Pending && ( -
+
{showForm ? ( setShowForm(false)} /> ) : ( )}
diff --git a/TaskTracker.Web/src/components/TaskCard.tsx b/TaskTracker.Web/src/components/TaskCard.tsx index dcb414b..a40ed7b 100644 --- a/TaskTracker.Web/src/components/TaskCard.tsx +++ b/TaskTracker.Web/src/components/TaskCard.tsx @@ -1,6 +1,6 @@ import { useSortable } from '@dnd-kit/sortable' import { CSS } from '@dnd-kit/utilities' -import { CheckSquare, Clock } from 'lucide-react' +import { Clock } from 'lucide-react' import { WorkTaskStatus } from '../types/index.ts' import type { WorkTask } from '../types/index.ts' import { CATEGORY_COLORS } from '../lib/constants.ts' @@ -36,7 +36,7 @@ export default function TaskCard({ task, onClick }: TaskCardProps) { const style = { transform: CSS.Transform.toString(transform), transition, - opacity: isDragging ? 0.5 : 1, + opacity: isDragging ? 0.4 : 1, } const categoryColor = CATEGORY_COLORS[task.category ?? 'Unknown'] ?? CATEGORY_COLORS['Unknown'] @@ -48,14 +48,6 @@ export default function TaskCard({ task, onClick }: TaskCardProps) { ).length ?? 0 const totalSubTasks = task.subTasks?.length ?? 0 - let progressPercent: number | null = null - if (task.estimatedMinutes && task.startedAt) { - const start = new Date(task.startedAt).getTime() - const end = task.completedAt ? new Date(task.completedAt).getTime() : Date.now() - const elapsedMins = (end - start) / 60_000 - progressPercent = Math.min(100, (elapsedMins / task.estimatedMinutes) * 100) - } - return (
onClick(task.id)} className={` - relative rounded-lg cursor-grab active:cursor-grabbing - bg-[#1a1d27] hover:-translate-y-0.5 hover:shadow-lg hover:shadow-indigo-500/5 - transition-all duration-200 - ${isActive ? 'ring-1 ring-cyan-400/60 shadow-[0_0_12px_rgba(6,182,212,0.25)] animate-pulse-glow' : 'shadow-md shadow-black/20'} + card-glow rounded-xl cursor-grab active:cursor-grabbing + bg-[var(--color-surface)] border transition-all duration-200 + hover:-translate-y-0.5 + ${isActive + ? 'border-[var(--color-status-active)]/30 animate-pulse-glow' + : 'border-[var(--color-border)] hover:border-[var(--color-border-hover)]' + } + ${isDragging ? 'shadow-xl shadow-black/40' : ''} `} > - {/* Category left border */} -
+
+ {/* Title row */} +
+ {isActive && ( + + )} +

+ {task.title} +

+
-
- {/* Title */} -

- {task.title} -

+ {/* Meta row */} +
+ {task.category && ( + + + {task.category} + + )} - {/* Category badge */} - {task.category && ( - - {task.category} - - )} - - {/* Progress bar */} - {progressPercent !== null && ( -
-
-
- )} - - {/* Footer row */} -
-
- {elapsed && ( - - - {elapsed} - - )} -
+ {elapsed && ( + + + {elapsed} + + )} {totalSubTasks > 0 && ( - - - {completedSubTasks}/{totalSubTasks} + + {Array.from({ length: totalSubTasks }, (_, i) => ( + + ))} + {completedSubTasks}/{totalSubTasks} )}