JSFiddle - React, Tailwind, and code Playground
by gilbertomg
HTML
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kanban Board</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.10.0/font/bootstrap-icons.min.css" rel="stylesheet">
</head>
<body>
<div class="container-fluid py-4">
<div class="kanban-board">
<div class="kanban-header">
<h2><i class="bi bi-kanban-fill me-2"></i>Kanban Board</h2>
<p class="mb-0 opacity-75">Arraste e solte os cards para organizar suas tarefas</p>
</div>
<div class="row g-0" id="kanbanBoard">
<!-- TODO Column -->
<div class="col-lg-2-5 col-md-4 col-sm-6">
<div class="kanban-column" data-status="todo">
<div class="column-header todo-header">
<i class="bi bi-exclamation-circle me-2"></i>TO DO
<span class="badge bg-light text-dark ms-2">3</span>
</div>
<div class="column-content" id="todo-column">
<!-- Items serão inseridos aqui -->
</div>
<div class="add-item-btn" onclick="openAddModal('todo')">
<i class="bi bi-plus-circle me-2"></i>Adicionar Item
</div>
</div>
</div>
<!-- BACKLOG Column -->
<div class="col-lg-2-5 col-md-4 col-sm-6">
<div class="kanban-column" data-status="backlog">
<div class="column-header backlog-header">
<i class="bi bi-list-ul me-2"></i>BACKLOG
...
CSS
body {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.kanban-board {
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10px);
border-radius: 20px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.kanban-header {
background: linear-gradient(45deg, #667eea, #764ba2);
color: white;
border-radius: 20px 20px 0 0;
padding: 1.5rem;
text-align: center;
}
.kanban-column {
background: #f8f9fa;
border-radius: 15px;
min-height: 500px;
margin: 0.5rem;
border: 2px solid #e9ecef;
transition: all 0.3s ease;
}
.kanban-column.drag-over {
border-color: #667eea;
background: rgba(102, 126, 234, 0.1);
transform: scale(1.02);
}
.column-header {
padding: 1rem;
font-weight: 600;
text-align: center;
border-radius: 15px 15px 0 0;
color: white;
position: relative;
overflow: hidden;
}
.column-header::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
transition: left 0.5s;
}
.column-header:hover::before {
left: 100%;
}
.todo-header { background: linear-gradient(45deg, #dc3545, #c82333); }
.backlog-header { background: linear-gradient(45deg, #6c757d, #5a6268); }
...
JavaScript
let itemIdCounter = 9;
// Dados iniciais do Kanban
const initialData = [
{ id: 1, title: "Criar página de login", description: "Desenvolver interface de autenticação", status: "todo", priority: "high" },
{ id: 2, title: "Configurar banco de dados", description: "Setup inicial do MongoDB", status: "todo", priority: "medium" },
{ id: 3, title: "Documentar API", description: "Criar documentação completa", status: "todo", priority: "low" },
{ id: 4, title: "Análise de requisitos", description: "Levantar requisitos do cliente", status: "backlog", priority: "medium" },
{ id: 5, title: "Planejamento sprint", description: "Definir metas da sprint", status: "backlog", priority: "low" },
{ id: 6, title: "Desenvolvimento módulo usuarios", description: "Implementar CRUD de usuários", status: "development", priority: "high" },
{ id: 7, title: "Code review Pull Request #45", description: "Revisar código da feature de relatórios", status: "review", priority: "medium" },
{ id: 8, title: "Deploy em produção", description: "Versão 1.2.0 já testada", status: "done", priority: "high" },
{ id: 9, title: "Configurar CI/CD", description: "Pipeline automatizado configurado", status: "done", priority: "medium" }
];
// Inicializar o Kanban
function initKanban() {
initialData.forEach(item => {
createItemElement(item);
});
updateColumnCounts();
logEvent('INFO', 'Dados iniciais carregados');
}
// Criar elemento do item
function createItemElement(item) {
const itemElement = document.createElement('div');
itemElement.className = `kanban-item ${item.status}`;
itemElement.draggable = true;
itemElement.dataset.id = item.id;
itemElement.dataset.status =...