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 =...