alexandremoraisdarosa commited on
Commit
cbd2955
·
verified ·
1 Parent(s): e42df1e

Em português, nas cores branca, preta e cinza. Cria e com todas as dependências implementadas. Rodando local. <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Gestão de Casos Penais - Juiz</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> <style> :root { --primary-color: #2c3e50; --secondary-color: #3498db; --accent-color: #e74c3c; --light-color: #ecf0f1; --dark-color: #2c3e50; } body { background-color: #f8f9fa; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } .sidebar { background: linear-gradient(180deg, var(--primary-color), #1a2530); color: white; height: 100vh; position: fixed; padding-top: 20px; } .main-content { margin-left: 250px; } .header { background: white; box-shadow: 0 2px 10px rgba(0,0,0,0.1); padding: 15px 30px; } .card-custom { border-radius: 10px; box-shadow: 0 4px 15px rgba(0,0,0,0.08); transition: transform 0.3s ease; border: none; margin-bottom: 20px; } .card-custom:hover { transform: translateY(-5px); box-shadow: 0 6px 20px rgba(0,0,0,0.15); } .status-badge { padding: 5px 12px; border-radius: 20px; font-size: 0.85em; font-weight: 500; } .status-em-andamento { background-color: #fff3cd; color: #856404; } .status-concluido { background-color: #d4edda; color: #155724; } .status-arquivado { background-color: #f8d7da; color: #721c24; } .status-aguardando { background-color: #cce7ff; color: #004085; } .priority-high { color: #e74c3c; } .priority-medium { color: #f39c12; } .priority-low { color: #27ae60; } .btn-custom { border-radius: 30px; padding: 8px 20px; font-weight: 500; } .table th { border-top: none; font-weight: 600; } .stat-card { text-align: center; padding: 20px; border-radius: 10px; color: white; } .stat-card i { font-size: 2.5rem; margin-bottom: 15px; } .chart-container { background: white; border-radius: 10px; padding: 20px; box-shadow: 0 4px 15px rgba(0,0,0,0.08); height: 300px; } .sidebar .nav-link { color: rgba(255,255,255,0.8); padding: 12px 20px; margin: 5px 15px; border-radius: 5px; transition: all 0.3s; } .sidebar .nav-link:hover, .sidebar .nav-link.active { background-color: rgba(255,255,255,0.1); color: white; } .sidebar .nav-link i { margin-right: 10px; width: 20px; text-align: center; } .section-title { border-bottom: 2px solid var(--secondary-color); padding-bottom: 10px; margin-bottom: 20px; color: var(--dark-color); } .practice-card { background: white; border-radius: 10px; padding: 20px; margin-bottom: 15px; box-shadow: 0 2px 10px rgba(0,0,0,0.05); border-left: 4px solid var(--secondary-color); } .practice-card h5 { color: var(--primary-color); } .notification-badge { position: absolute; top: 5px; right: 5px; background-color: var(--accent-color); color: white; border-radius: 50%; width: 20px; height: 20px; font-size: 0.7rem; display: flex; align-items: center; justify-content: center; } </style> </head> <body> <div class="container-fluid"> <div class="row"> <!-- Sidebar --> <nav class="col-md-3 col-lg-2 d-md-block sidebar collapse"> <div class="position-sticky pt-3"> <div class="text-center mb-4"> <h4><i class="fas fa-gavel me-2"></i>Sistema Penal</h4> <p class="text-muted small">Gestão Judicial</p> </div> <ul class="nav flex-column"> <li class="nav-item"> <a class="nav-link active" href="#dashboard"> <i class="fas fa-tachometer-alt"></i> Dashboard </a> </li> <li class="nav-item"> <a class="nav-link" href="#casos"> <i class="fas fa-balance-scale"></i> Casos Penais </a> </li> <li class="nav-item"> <a class="nav-link" href="#audiencias"> <i class="fas fa-calendar-alt"></i> Audiências </a> </li> <li class="nav-item"> <a class="nav-link" href="#praticas"> <i class="fas fa-lightbulb"></i> Melhores Práticas </a> </li> <li class="nav-item"> <a class="nav-link" href="#relatorios"> <i class="fas fa-chart-bar"></i> Relatórios </a> </li> </ul> </div> </nav> <!-- Main Content --> <main class="col-md-9 ms-sm-auto col-lg-10 px-md-4 main-content"> <!-- Header --> <div class="header d-flex justify-content-between align-items-center"> <h2 class="mb-0">Gestão de Casos Penais</h2> <div class="d-flex align-items-center"> <div class="position-relative me-4"> <i class="fas fa-bell fa-lg"></i> <span class="notification-badge">3</span> </div> <div> <span class="fw-bold">Juiz Carlos Silva</span><br> <small class="text-muted">Tribunal de Justiça</small> </div> </div> </div> <!-- Dashboard --> <section id="dashboard" class="my-4"> <h3 class="section-title">Dashboard</h3> <div class="row mb-4"> <div class="col-md-3"> <div class="stat-card" style="background: linear-gradient(135deg, #3498db, #1a5276);"> <i class="fas fa-balance-scale"></i> <h4 id="total-cases">0</h4> <p>Total de Casos</p> </div> </div> <div class="col-md-3"> <div class="stat-card" style="background: linear-gradient(135deg, #2ecc71, #27ae60);"> <i class="fas fa-check-circle"></i> <h4 id="completed-cases">0</h4> <p>Casos Concluídos</p> </div> </div> <div class="col-md-3"> <div class="stat-card" style="background: linear-gradient(135deg, #f39c12, #d35400);"> <i class="fas fa-clock"></i> <h4 id="pending-cases">0</h4> <p>Em Andamento</p> </div> </div> <div class="col-md-3"> <div class="stat-card" style="background: linear-gradient(135deg, #e74c3c, #c0392b);"> <i class="fas fa-calendar-alt"></i> <h4 id="today-hearings">0</h4> <p>Audiências Hoje</p> </div> </div> </div> <div class="row"> <div class="col-md-8"> <div class="chart-container"> <h5>Distribuição de Casos por Status</h5> <canvas id="casesChart"></canvas> </div> </div> <div class="col-md-4"> <div class="chart-container"> <h5>Prioridade dos Casos</h5> <canvas id="priorityChart"></canvas> </div> </div> </div> </section> <!-- Casos Penais --> <section id="casos" class="my-4"> <div class="d-flex justify-content-between align-items-center mb-3"> <h3 class="section-title">Casos Penais</h3> <button class="btn btn-primary btn-custom" data-bs-toggle="modal" data-bs-target="#addCaseModal"> <i class="fas fa-plus me-2"></i>Novo Caso </button> </div> <div class="row" id="cases-container"> <!-- Casos serão carregados aqui --> </div> </section> <!-- Audiências --> <section id="audiencias" class="my-4"> <div class="d-flex justify-content-between align-items-center mb-3"> <h3 class="section-title">Audiências</h3> <button class="btn btn-success btn-custom" data-bs-toggle="modal" data-bs-target="#addHearingModal"> <i class="fas fa-plus me-2"></i>Nova Audiência </button> </div> <div class="table-responsive"> <table class="table table-hover"> <thead> <tr> <th>Data/Hora</th> <th>Processo</th> <th>Partes</th> <th>Tipo</th> <th>Status</th> <th>Ações</th> </tr> </thead> <tbody id="hearings-table"> <!-- Audiências serão carregadas aqui --> </tbody> </table> </div> </section> <!-- Melhores Práticas --> <section id="praticas" class="my-4"> <h3 class="section-title">Melhores Práticas</h3> <div class="row"> <div class="col-md-6"> <div class="practice-card"> <h5><i class="fas fa-file-alt me-2"></i>Documentação Completa</h5> <p>Mantenha toda a documentação do processo organizada e atualizada. Isso facilita a tomada de decisões e evita atrasos.</p> </div> <div class="practice-card"> <h5><i class="fas fa-users me-2"></i>Comunicação Clara</h5> <p>Estabeleça canais de comunicação eficazes com promotores, defensores e demais partes envolvidas no processo.</p> </div> </div> <div class="col-md-6"> <div class="practice-card"> <h5><i class="fas fa-clock me-2"></i>Pontualidade</h5> <p>Cumpra rigorosamente os prazos processuais e horários das audiências para garantir a eficiência do sistema.</p> </div> <div class="practice-card"> <h5><i class="fas fa-search me-2"></i>Análise Detalhada</h5> <p>Analise cuidadosamente todas as provas e depoimentos antes de tomar decisões que impactam a vida das pessoas.</p> </div> </div> </div> </section> </main> </div> </div> <!-- Modal Adicionar Caso --> <div class="modal fade" id="addCaseModal" tabindex="-1"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Adicionar Novo Caso</h5> <button type="button" class="btn-close" data-bs-dismiss="modal"></button> </div> <div class="modal-body"> <form id="case-form"> <div class="mb-3"> <label for="case-number" class="form-label">Número do Processo</label> <input type="text" class="form-control" id="case-number" required> </div> <div class="mb-3"> <label for="case-title" class="form-label">Título do Caso</label> <input type="text" class="form-control" id="case-title" required> </div> <div class="mb-3"> <label for="case-description" class="form-label">Descrição</label> <textarea class="form-control" id="case-description" rows="3"></textarea> </div> <div class="mb-3"> <label for="case-priority" class="form-label">Prioridade</label> <select class="form-select" id="case-priority"> <option value="alta">Alta</option> <option value="media" selected>Média</option> <option value="baixa">Baixa</option> </select> </div> <div class="mb-3"> <label for="case-status" class="form-label">Status</label> <select class="form-select" id="case-status"> <option value="em-andamento" selected>Em Andamento</option> <option value="concluido">Concluído</option> <option value="arquivado">Arquivado</option> <option value="aguardando">Aguardando</option> </select> </div> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button> <button type="button" class="btn btn-primary" id="save-case-btn">Salvar Caso</button> </div> </div> </div> </div> <!-- Modal Adicionar Audiência --> <div class="modal fade" id="addHearingModal" tabindex="-1"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Agendar Nova Audiência</h5> <button type="button" class="btn-close" data-bs-dismiss="modal"></button> </div> <div class="modal-body"> <form id="hearing-form"> <div class="mb-3"> <label for="hearing-case" class="form-label">Processo</label> <select class="form-select" id="hearing-case" required> <option value="">Selecione um processo</option> <!-- Opções serão carregadas dinamicamente --> </select> </div> <div class="mb-3"> <label for="hearing-date" class="form-label">Data</label> <input type="date" class="form-control" id="hearing-date" required> </div> <div class="mb-3"> <label for="hearing-time" class="form-label">Hora</label> <input type="time" class="form-control" id="hearing-time" required> </div> <div class="mb-3"> <label for="hearing-type" class="form-label">Tipo de Audiência</label> <select class="form-select" id="hearing-type"> <option value="instrucao">Instrução Processual</option> <option value="julgamento">Julgamento</option> <option value="conciliacao">Conciliação</option> <option value="outras">Outras</option> </select> </div> <div class="mb-3"> <label for="hearing-parties" class="form-label">Partes Envolvidas</label> <input type="text" class="form-control" id="hearing-parties" placeholder="Promotor, Defensor, Réu..."> </div> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button> <button type="button" class="btn btn-success" id="save-hearing-btn">Agendar Audiência</button> </div> </div> </div> </div> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <script> // Dados iniciais let cases = JSON.parse(localStorage.getItem('cases')) || []; let hearings = JSON.parse(localStorage.getItem('hearings')) || []; // Função para salvar dados no localStorage function saveData() { localStorage.setItem('cases', JSON.stringify(cases)); localStorage.setItem('hearings', JSON.stringify(hearings)); renderData(); } // Função para gerar ID único function generateId() { return Date.now().toString(36) + Math.random().toString(36).substr(2); } // Função para formatar data function formatDate(dateString) { const options = { year: 'numeric', month: '2-digit', day: '2-digit' }; return new Date(dateString).toLocaleDateString('pt-BR', options); } // Função para renderizar casos function renderCases() { const container = document.getElementById('cases-container'); container.innerHTML = ''; cases.forEach(caseItem => { const caseElement = document.createElement('div'); caseElement.className = 'col-md-6 col-lg-4'; caseElement.innerHTML = ` <div class="card card-custom"> <div class="card-body"> <div class="d-flex justify-content-between align-items-start"> <h5 class="card-title">${caseItem.title} <i class="fas fa-circle"></i></span> </div> <p class="card-text text-muted small">${caseItem.number} ${caseItem.description || 'Sem descrição'}</p> <div class="d-flex justify-content-between align-items-center"> <span class="status-badge status-${caseItem.status.replace(' ', '-')}"> ${caseItem.status === 'em-andamento' ? 'Em Andamento' : caseItem.status === 'concluido' ? 'Concluído' : caseItem.status === 'arquivado' ? 'Arquivado' : 'Aguardando'} </span> <div> <button class="btn btn-sm btn-outline-primary me-1" onclick="editCase('${caseItem.id}')"> <i class="fas fa-trash"></i> </button> </div> </div> </div> </div> `; container.appendChild(caseElement); }); } // Função para renderizar audiências function renderHearings() { const tbody = document.getElementById('hearings-table'); tbody.innerHTML = ''; hearings.forEach(hearing => { const caseItem = cases.find(c => c.id === hearing.caseId); const row = document.createElement('tr'); row.innerHTML = ` <td>${formatDate(hearing.date)} ${hearing.time}</td> <td>${caseItem ? caseItem.number : 'Processo não encontrado'} ${hearing.parties || 'Não especificado'}</td> <td>${hearing.type === 'instrucao' ? 'Instrução Processual' : hearing.type === 'julgamento' ? 'Julgamento' : hearing.type === 'conciliacao' ? 'Conciliação' : 'Outras'} Agendada<i class="fas fa-edit"></i> </button> <button class="btn btn-sm btn-outline-danger" onclick="deleteHearing('${hearing.id}')"> `; tbody.appendChild(row); }); } // Função para atualizar estatísticas function updateStats() { document.getElementById('total-cases').textContent = cases.length; const completedCases = cases.filter(c => c.status === 'concluido').length; document.getElementById('completed-cases').textContent = completedCases; const pendingCases = cases.filter(c => c.status === 'em-andamento').length; document.getElementById('pending-cases').textContent = pendingCases; const today = new Date().toISOString().split('T')[0]; const todayHearings = hearings.filter(h => h.date === today).length; document.getElementById('today-hearings').textContent = todayHearings; } // Função para renderizar gráficos function renderCharts() { // Gráfico de status dos casos const statusCtx = document.getElementById('casesChart').getContext('2d'); new Chart(statusCtx, { type: 'doughnut', data: { labels: ['Em Andamento', 'Concluídos', 'Arquivados', 'Aguardando'], datasets: [{ data: [ cases.filter(c => c.status === 'em-andamento').length, cases.filter(c => c.status === 'concluido').length, cases.filter(c => c.status === 'arquivado').length, cases.filter(c => c.status === 'aguardando').length ], backgroundColor: ['#3498db', '#2ecc71', '#e74c3c', '#f39c12'] }] }, options: { responsive: true, maintainAspectRatio: false } }); // Gráfico de prioridade const priorityCtx = document.getElementById('priorityChart').getContext('2d'); new Chart(priorityCtx, { type: 'pie', data: { labels: ['Alta', 'Média', 'Baixa'], datasets: [{ data: [ cases.filter(c => c.priority === 'alta').length, cases.filter(c => c.priority === 'media').length, cases.filter(c => c.priority === 'baixa').length ], backgroundColor: ['#e74c3c', '#f39c12', '#27ae60'] }] }, options: { responsive: true, maintainAspectRatio: false } }); } // Função para popular select de casos function populateCaseSelect() { const select = document.getElementById('hearing-case'); select.innerHTML = ' Selecione um processo '; cases.forEach(caseItem => { const option = document.createElement('option'); option.value = caseItem.id; option.textContent = `${caseItem.number} - ${caseItem.title}`; select.appendChild(option); }); } // Função para renderizar todos os dados function renderData() { renderCases(); renderHearings(); updateStats(); renderCharts(); populateCaseSelect(); } // Event Listeners document.getElementById('save-case-btn').addEventListener('click', function() { const number = document.getElementById('case-number').value; const title = document.getElementById('case-title').value; const description = document.getElementById('case-description').value; const priority = document.getElementById('case-priority').value; const status = document.getElementById('case-status').value; if (number && title) { const newCase = { id: generateId(), number: number, title: title, description: description, priority: priority, status: status, createdAt: new Date().toISOString() }; cases.push(newCase); saveData(); // Limpar formulário document.getElementById('case-form').reset(); bootstrap.Modal.getInstance(document.getElementById('addCaseModal')).hide(); } }); document.getElementById('save-hearing-btn').addEventListener('click', function() { const caseId = document.getElementById('hearing-case').value; const date = document.getElementById('hearing-date').value; const time = document.getElementById('hearing-time').value; const type = document.getElementById('hearing-type').value; const parties = document.getElementById('hearing-parties').value; if (caseId && date && time) { const newHearing = { id: generateId(), caseId: caseId, date: date, time: time, type: type, parties: parties }; hearings.push(newHearing); saveData(); // Limpar formulário document.getElementById('hearing-form').reset(); bootstrap.Modal.getInstance(document.getElementById('addHearingModal')).hide(); } }); // Funções para editar e deletar (simplificadas) function editCase(id) { alert('Função de edição em desenvolvimento'); } function deleteCase(id) { if (confirm('Tem certeza que deseja excluir este caso?')) { cases = cases.filter(c => c.id !== id); hearings = hearings.filter(h => h.caseId !== id); saveData(); } } function editHearing(id) { alert('Função de edição em desenvolvimento'); } function deleteHearing(id) { if (confirm('Tem certeza que deseja excluir esta audiência?')) { hearings = hearings.filter(h => h.id !== id); saveData(); } } // Inicialização document.addEventListener('DOMContentLoaded', function() { // Adicionar dados de exemplo se não houver dados if (cases.length === 0) { cases = [ { id: generateId(), number: '0012345-67.2023.8.26.0001', title: 'Homicídio Qualificado', description: 'Crime de homicídio qualificado ocorrido em 15/03/2023', priority: 'alta', status: 'em-andamento', createdAt: new Date().toISOString() }, { id: generateId(), number: '0023456-78.2023.8.26.0002', title: 'Furto Qualificado', description: 'Furto em estabelecimento comercial', priority: 'media', status: 'aguardando', createdAt: new Date().toISOString() }, { id: generateId(), number: '0034567-89.2023.8.26.0003', title: 'Tráfico de Drogas', description: 'Organização criminosa envolvida em tráfico de entorpecentes', priority: 'alta', status: 'em-andamento', createdAt: new Date().toISOString() } ]; } if (hearings.length === 0) { hearings = [ { id: generateId(), caseId: cases[0].id, date: new Date(Date.now() + 86400000).toISOString().split('T')[0], time: '10:00', type: 'instrucao', parties: 'Promotor, Defensor Público' }, { id: generateId(), caseId: cases[2].id, date: new Date(Date.now() + 172800000).toISOString().split('T')[0], time: '14:30', type: 'julgamento', parties: 'Promotor, Defesa Técnica' } ]; } saveData(); }); </script> </body> </html> - Initial Deployment

Browse files
Files changed (2) hide show
  1. README.md +7 -5
  2. index.html +542 -19
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Testegestor
3
- emoji: 🏃
4
- colorFrom: gray
5
- colorTo: pink
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: testegestor
3
+ emoji: 🐳
4
+ colorFrom: green
5
+ colorTo: yellow
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,542 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="pt-BR">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Gestão de Casos Penais - Juiz</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9
+ <style>
10
+ @import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600;700&display=swap');
11
+
12
+ body {
13
+ font-family: 'Open Sans', sans-serif;
14
+ }
15
+
16
+ .status-badge {
17
+ padding: 0.25rem 0.75rem;
18
+ border-radius: 9999px;
19
+ font-size: 0.75rem;
20
+ font-weight: 600;
21
+ }
22
+
23
+ .status-em-andamento { background-color: #e5e7eb; color: #4b5563; }
24
+ .status-concluido { background-color: #d1d5db; color: #1f2937; }
25
+ .status-arquivado { background-color: #9ca3af; color: #111827; }
26
+ .status-aguardando { background-color: #f3f4f6; color: #6b7280; }
27
+
28
+ .priority-high { color: #ef4444; }
29
+ .priority-medium { color: #f59e0b; }
30
+ .priority-low { color: #10b981; }
31
+
32
+ .sidebar {
33
+ transition: all 0.3s ease;
34
+ }
35
+
36
+ .sidebar-link {
37
+ transition: all 0.2s ease;
38
+ }
39
+
40
+ .sidebar-link:hover, .sidebar-link.active {
41
+ background-color: rgba(255, 255, 255, 0.1);
42
+ }
43
+
44
+ .card-hover {
45
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
46
+ }
47
+
48
+ .card-hover:hover {
49
+ transform: translateY(-2px);
50
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
51
+ }
52
+
53
+ .stat-card {
54
+ transition: transform 0.2s ease;
55
+ }
56
+
57
+ .stat-card:hover {
58
+ transform: translateY(-3px);
59
+ }
60
+
61
+ .section-title {
62
+ position: relative;
63
+ padding-bottom: 0.5rem;
64
+ }
65
+
66
+ .section-title::after {
67
+ content: '';
68
+ position: absolute;
69
+ bottom: 0;
70
+ left: 0;
71
+ width: 3rem;
72
+ height: 2px;
73
+ background-color: #6b7280;
74
+ }
75
+
76
+ .practice-card {
77
+ border-left: 4px solid #6b7280;
78
+ }
79
+
80
+ /* Custom scrollbar */
81
+ ::-webkit-scrollbar {
82
+ width: 8px;
83
+ }
84
+
85
+ ::-webkit-scrollbar-track {
86
+ background: #f1f1f1;
87
+ }
88
+
89
+ ::-webkit-scrollbar-thumb {
90
+ background: #9ca3af;
91
+ border-radius: 4px;
92
+ }
93
+
94
+ ::-webkit-scrollbar-thumb:hover {
95
+ background: #6b7280;
96
+ }
97
+ </style>
98
+ </head>
99
+ <body class="bg-gray-100 text-gray-900">
100
+ <div class="flex h-screen overflow-hidden">
101
+ <!-- Sidebar -->
102
+ <div class="sidebar hidden md:flex md:flex-shrink-0">
103
+ <div class="flex flex-col w-64 bg-gray-900 text-white">
104
+ <div class="flex items-center justify-center h-16 px-4 border-b border-gray-800">
105
+ <div class="flex items-center">
106
+ <i class="fas fa-gavel text-xl mr-2 text-gray-300"></i>
107
+ <span class="text-xl font-semibold">Sistema Penal</span>
108
+ </div>
109
+ </div>
110
+ <div class="flex flex-col flex-grow px-4 py-4 overflow-y-auto">
111
+ <nav class="flex-1 space-y-2">
112
+ <a href="#dashboard" class="sidebar-link flex items-center px-4 py-3 rounded-lg text-gray-300 hover:text-white active">
113
+ <i class="fas fa-tachometer-alt mr-3"></i>
114
+ Dashboard
115
+ </a>
116
+ <a href="#casos" class="sidebar-link flex items-center px-4 py-3 rounded-lg text-gray-300 hover:text-white">
117
+ <i class="fas fa-balance-scale mr-3"></i>
118
+ Casos Penais
119
+ </a>
120
+ <a href="#audiencias" class="sidebar-link flex items-center px-4 py-3 rounded-lg text-gray-300 hover:text-white">
121
+ <i class="fas fa-calendar-alt mr-3"></i>
122
+ Audiências
123
+ </a>
124
+ <a href="#praticas" class="sidebar-link flex items-center px-4 py-3 rounded-lg text-gray-300 hover:text-white">
125
+ <i class="fas fa-lightbulb mr-3"></i>
126
+ Melhores Práticas
127
+ </a>
128
+ <a href="#relatorios" class="sidebar-link flex items-center px-4 py-3 rounded-lg text-gray-300 hover:text-white">
129
+ <i class="fas fa-chart-bar mr-3"></i>
130
+ Relatórios
131
+ </a>
132
+ </nav>
133
+ </div>
134
+ <div class="p-4 border-t border-gray-800">
135
+ <div class="flex items-center">
136
+ <div class="ml-3">
137
+ <p class="text-sm font-medium text-white">Juiz Carlos Silva</p>
138
+ <p class="text-xs text-gray-400">Tribunal de Justiça</p>
139
+ </div>
140
+ </div>
141
+ </div>
142
+ </div>
143
+ </div>
144
+
145
+ <!-- Main Content -->
146
+ <div class="flex-1 overflow-auto">
147
+ <!-- Header -->
148
+ <header class="bg-white shadow-sm">
149
+ <div class="flex items-center justify-between px-6 py-4">
150
+ <h1 class="text-2xl font-semibold text-gray-800">Gestão de Casos Penais</h1>
151
+ <div class="flex items-center space-x-4">
152
+ <div class="relative">
153
+ <button class="p-2 text-gray-600 hover:text-gray-900">
154
+ <i class="fas fa-bell"></i>
155
+ <span class="absolute top-0 right-0 w-5 h-5 bg-red-500 text-white text-xs rounded-full flex items-center justify-center">3</span>
156
+ </button>
157
+ </div>
158
+ <div class="flex items-center">
159
+ <div class="w-10 h-10 rounded-full bg-gray-300 flex items-center justify-center">
160
+ <i class="fas fa-user text-gray-600"></i>
161
+ </div>
162
+ </div>
163
+ </div>
164
+ </div>
165
+ </header>
166
+
167
+ <main class="p-6">
168
+ <!-- Dashboard Section -->
169
+ <section id="dashboard" class="mb-8">
170
+ <h2 class="section-title text-xl font-semibold mb-6">Dashboard</h2>
171
+
172
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
173
+ <div class="stat-card bg-white rounded-lg shadow p-6">
174
+ <div class="flex items-center">
175
+ <div class="p-3 rounded-full bg-gray-100 mr-4">
176
+ <i class="fas fa-balance-scale text-gray-600 text-xl"></i>
177
+ </div>
178
+ <div>
179
+ <p class="text-gray-500 text-sm">Total de Casos</p>
180
+ <h3 id="total-cases" class="text-2xl font-bold">0</h3>
181
+ </div>
182
+ </div>
183
+ </div>
184
+
185
+ <div class="stat-card bg-white rounded-lg shadow p-6">
186
+ <div class="flex items-center">
187
+ <div class="p-3 rounded-full bg-gray-100 mr-4">
188
+ <i class="fas fa-check-circle text-gray-600 text-xl"></i>
189
+ </div>
190
+ <div>
191
+ <p class="text-gray-500 text-sm">Casos Concluídos</p>
192
+ <h3 id="completed-cases" class="text-2xl font-bold">0</h3>
193
+ </div>
194
+ </div>
195
+ </div>
196
+
197
+ <div class="stat-card bg-white rounded-lg shadow p-6">
198
+ <div class="flex items-center">
199
+ <div class="p-3 rounded-full bg-gray-100 mr-4">
200
+ <i class="fas fa-clock text-gray-600 text-xl"></i>
201
+ </div>
202
+ <div>
203
+ <p class="text-gray-500 text-sm">Em Andamento</p>
204
+ <h3 id="pending-cases" class="text-2xl font-bold">0</h3>
205
+ </div>
206
+ </div>
207
+ </div>
208
+
209
+ <div class="stat-card bg-white rounded-lg shadow p-6">
210
+ <div class="flex items-center">
211
+ <div class="p-3 rounded-full bg-gray-100 mr-4">
212
+ <i class="fas fa-calendar-alt text-gray-600 text-xl"></i>
213
+ </div>
214
+ <div>
215
+ <p class="text-gray-500 text-sm">Audiências Hoje</p>
216
+ <h3 id="today-hearings" class="text-2xl font-bold">0</h3>
217
+ </div>
218
+ </div>
219
+ </div>
220
+ </div>
221
+
222
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8">
223
+ <div class="bg-white rounded-lg shadow p-6">
224
+ <h3 class="font-semibold text-gray-800 mb-4">Distribuição de Casos por Status</h3>
225
+ <div class="h-64">
226
+ <canvas id="casesChart"></canvas>
227
+ </div>
228
+ </div>
229
+
230
+ <div class="bg-white rounded-lg shadow p-6">
231
+ <h3 class="font-semibold text-gray-800 mb-4">Prioridade dos Casos</h3>
232
+ <div class="h-64">
233
+ <canvas id="priorityChart"></canvas>
234
+ </div>
235
+ </div>
236
+ </div>
237
+ </section>
238
+
239
+ <!-- Casos Penais Section -->
240
+ <section id="casos" class="mb-8">
241
+ <div class="flex justify-between items-center mb-6">
242
+ <h2 class="section-title text-xl font-semibold">Casos Penais</h2>
243
+ <button onclick="openAddCaseModal()" class="bg-gray-900 hover:bg-gray-800 text-white px-4 py-2 rounded-lg flex items-center">
244
+ <i class="fas fa-plus mr-2"></i> Novo Caso
245
+ </button>
246
+ </div>
247
+
248
+ <div id="cases-container" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
249
+ <!-- Cases will be loaded here -->
250
+ </div>
251
+ </section>
252
+
253
+ <!-- Audiências Section -->
254
+ <section id="audiencias" class="mb-8">
255
+ <div class="flex justify-between items-center mb-6">
256
+ <h2 class="section-title text-xl font-semibold">Audiências</h2>
257
+ <button onclick="openAddHearingModal()" class="bg-gray-900 hover:bg-gray-800 text-white px-4 py-2 rounded-lg flex items-center">
258
+ <i class="fas fa-plus mr-2"></i> Nova Audiência
259
+ </button>
260
+ </div>
261
+
262
+ <div class="bg-white rounded-lg shadow overflow-hidden">
263
+ <div class="overflow-x-auto">
264
+ <table class="min-w-full divide-y divide-gray-200">
265
+ <thead class="bg-gray-50">
266
+ <tr>
267
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Data/Hora</th>
268
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Processo</th>
269
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Partes</th>
270
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Tipo</th>
271
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Status</th>
272
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Ações</th>
273
+ </tr>
274
+ </thead>
275
+ <tbody id="hearings-table" class="bg-white divide-y divide-gray-200">
276
+ <!-- Hearings will be loaded here -->
277
+ </tbody>
278
+ </table>
279
+ </div>
280
+ </div>
281
+ </section>
282
+
283
+ <!-- Melhores Práticas Section -->
284
+ <section id="praticas" class="mb-8">
285
+ <h2 class="section-title text-xl font-semibold mb-6">Melhores Práticas</h2>
286
+
287
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
288
+ <div class="practice-card bg-white rounded-lg shadow p-6">
289
+ <div class="flex items-start">
290
+ <div class="flex-shrink-0 mt-1 mr-4">
291
+ <i class="fas fa-file-alt text-gray-600"></i>
292
+ </div>
293
+ <div>
294
+ <h3 class="font-semibold text-gray-800 mb-2">Documentação Completa</h3>
295
+ <p class="text-gray-600">Mantenha toda a documentação do processo organizada e atualizada. Isso facilita a tomada de decisões e evita atrasos.</p>
296
+ </div>
297
+ </div>
298
+ </div>
299
+
300
+ <div class="practice-card bg-white rounded-lg shadow p-6">
301
+ <div class="flex items-start">
302
+ <div class="flex-shrink-0 mt-1 mr-4">
303
+ <i class="fas fa-users text-gray-600"></i>
304
+ </div>
305
+ <div>
306
+ <h3 class="font-semibold text-gray-800 mb-2">Comunicação Clara</h3>
307
+ <p class="text-gray-600">Estabeleça canais de comunicação eficazes com promotores, defensores e demais partes envolvidas no processo.</p>
308
+ </div>
309
+ </div>
310
+ </div>
311
+
312
+ <div class="practice-card bg-white rounded-lg shadow p-6">
313
+ <div class="flex items-start">
314
+ <div class="flex-shrink-0 mt-1 mr-4">
315
+ <i class="fas fa-clock text-gray-600"></i>
316
+ </div>
317
+ <div>
318
+ <h3 class="font-semibold text-gray-800 mb-2">Pontualidade</h3>
319
+ <p class="text-gray-600">Cumpra rigorosamente os prazos processuais e horários das audiências para garantir a eficiência do sistema.</p>
320
+ </div>
321
+ </div>
322
+ </div>
323
+
324
+ <div class="practice-card bg-white rounded-lg shadow p-6">
325
+ <div class="flex items-start">
326
+ <div class="flex-shrink-0 mt-1 mr-4">
327
+ <i class="fas fa-search text-gray-600"></i>
328
+ </div>
329
+ <div>
330
+ <h3 class="font-semibold text-gray-800 mb-2">Análise Detalhada</h3>
331
+ <p class="text-gray-600">Analise cuidadosamente todas as provas e depoimentos antes de tomar decisões que impactam a vida das pessoas.</p>
332
+ </div>
333
+ </div>
334
+ </div>
335
+ </div>
336
+ </section>
337
+ </main>
338
+ </div>
339
+ </div>
340
+
341
+ <!-- Add Case Modal -->
342
+ <div id="addCaseModal" class="fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 hidden">
343
+ <div class="bg-white rounded-lg shadow-lg w-full max-w-md">
344
+ <div class="flex justify-between items-center border-b border-gray-200 px-6 py-4">
345
+ <h3 class="text-lg font-semibold text-gray-800">Adicionar Novo Caso</h3>
346
+ <button onclick="closeModal('addCaseModal')" class="text-gray-500 hover:text-gray-700">
347
+ <i class="fas fa-times"></i>
348
+ </button>
349
+ </div>
350
+ <div class="p-6">
351
+ <form id="case-form">
352
+ <div class="mb-4">
353
+ <label for="case-number" class="block text-gray-700 text-sm font-medium mb-2">Número do Processo</label>
354
+ <input type="text" id="case-number" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500" required>
355
+ </div>
356
+ <div class="mb-4">
357
+ <label for="case-title" class="block text-gray-700 text-sm font-medium mb-2">Título do Caso</label>
358
+ <input type="text" id="case-title" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500" required>
359
+ </div>
360
+ <div class="mb-4">
361
+ <label for="case-description" class="block text-gray-700 text-sm font-medium mb-2">Descrição</label>
362
+ <textarea id="case-description" rows="3" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500"></textarea>
363
+ </div>
364
+ <div class="grid grid-cols-2 gap-4 mb-4">
365
+ <div>
366
+ <label for="case-priority" class="block text-gray-700 text-sm font-medium mb-2">Prioridade</label>
367
+ <select id="case-priority" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500">
368
+ <option value="alta">Alta</option>
369
+ <option value="media" selected>Média</option>
370
+ <option value="baixa">Baixa</option>
371
+ </select>
372
+ </div>
373
+ <div>
374
+ <label for="case-status" class="block text-gray-700 text-sm font-medium mb-2">Status</label>
375
+ <select id="case-status" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500">
376
+ <option value="em-andamento" selected>Em Andamento</option>
377
+ <option value="concluido">Concluído</option>
378
+ <option value="arquivado">Arquivado</option>
379
+ <option value="aguardando">Aguardando</option>
380
+ </select>
381
+ </div>
382
+ </div>
383
+ </form>
384
+ </div>
385
+ <div class="flex justify-end border-t border-gray-200 px-6 py-4 space-x-3">
386
+ <button onclick="closeModal('addCaseModal')" class="px-4 py-2 border border-gray-300 text-gray-700 rounded-lg hover:bg-gray-50">Cancelar</button>
387
+ <button onclick="saveCase()" class="px-4 py-2 bg-gray-900 text-white rounded-lg hover:bg-gray-800">Salvar Caso</button>
388
+ </div>
389
+ </div>
390
+ </div>
391
+
392
+ <!-- Add Hearing Modal -->
393
+ <div id="addHearingModal" class="fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 hidden">
394
+ <div class="bg-white rounded-lg shadow-lg w-full max-w-md">
395
+ <div class="flex justify-between items-center border-b border-gray-200 px-6 py-4">
396
+ <h3 class="text-lg font-semibold text-gray-800">Agendar Nova Audiência</h3>
397
+ <button onclick="closeModal('addHearingModal')" class="text-gray-500 hover:text-gray-700">
398
+ <i class="fas fa-times"></i>
399
+ </button>
400
+ </div>
401
+ <div class="p-6">
402
+ <form id="hearing-form">
403
+ <div class="mb-4">
404
+ <label for="hearing-case" class="block text-gray-700 text-sm font-medium mb-2">Processo</label>
405
+ <select id="hearing-case" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500" required>
406
+ <option value="">Selecione um processo</option>
407
+ <!-- Options will be loaded dynamically -->
408
+ </select>
409
+ </div>
410
+ <div class="grid grid-cols-2 gap-4 mb-4">
411
+ <div>
412
+ <label for="hearing-date" class="block text-gray-700 text-sm font-medium mb-2">Data</label>
413
+ <input type="date" id="hearing-date" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500" required>
414
+ </div>
415
+ <div>
416
+ <label for="hearing-time" class="block text-gray-700 text-sm font-medium mb-2">Hora</label>
417
+ <input type="time" id="hearing-time" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500" required>
418
+ </div>
419
+ </div>
420
+ <div class="mb-4">
421
+ <label for="hearing-type" class="block text-gray-700 text-sm font-medium mb-2">Tipo de Audiência</label>
422
+ <select id="hearing-type" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500">
423
+ <option value="instrucao">Instrução Processual</option>
424
+ <option value="julgamento">Julgamento</option>
425
+ <option value="conciliacao">Conciliação</option>
426
+ <option value="outras">Outras</option>
427
+ </select>
428
+ </div>
429
+ <div class="mb-4">
430
+ <label for="hearing-parties" class="block text-gray-700 text-sm font-medium mb-2">Partes Envolvidas</label>
431
+ <input type="text" id="hearing-parties" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500" placeholder="Promotor, Defensor, Réu...">
432
+ </div>
433
+ </form>
434
+ </div>
435
+ <div class="flex justify-end border-t border-gray-200 px-6 py-4 space-x-3">
436
+ <button onclick="closeModal('addHearingModal')" class="px-4 py-2 border border-gray-300 text-gray-700 rounded-lg hover:bg-gray-50">Cancelar</button>
437
+ <button onclick="saveHearing()" class="px-4 py-2 bg-gray-900 text-white rounded-lg hover:bg-gray-800">Agendar Audiência</button>
438
+ </div>
439
+ </div>
440
+ </div>
441
+
442
+ <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
443
+ <script>
444
+ // Dados iniciais
445
+ let cases = JSON.parse(localStorage.getItem('cases')) || [];
446
+ let hearings = JSON.parse(localStorage.getItem('hearings')) || [];
447
+
448
+ // Funções para abrir/fechar modais
449
+ function openAddCaseModal() {
450
+ document.getElementById('addCaseModal').classList.remove('hidden');
451
+ }
452
+
453
+ function openAddHearingModal() {
454
+ populateCaseSelect();
455
+ document.getElementById('addHearingModal').classList.remove('hidden');
456
+ }
457
+
458
+ function closeModal(modalId) {
459
+ document.getElementById(modalId).classList.add('hidden');
460
+ document.getElementById(modalId === 'addCaseModal' ? 'case-form' : 'hearing-form').reset();
461
+ }
462
+
463
+ // Função para salvar dados no localStorage
464
+ function saveData() {
465
+ localStorage.setItem('cases', JSON.stringify(cases));
466
+ localStorage.setItem('hearings', JSON.stringify(hearings));
467
+ renderData();
468
+ }
469
+
470
+ // Função para gerar ID único
471
+ function generateId() {
472
+ return Date.now().toString(36) + Math.random().toString(36).substr(2);
473
+ }
474
+
475
+ // Função para formatar data
476
+ function formatDate(dateString) {
477
+ const date = new Date(dateString);
478
+ return date.toLocaleDateString('pt-BR', { day: '2-digit', month: '2-digit', year: 'numeric' });
479
+ }
480
+
481
+ // Função para formatar hora
482
+ function formatTime(timeString) {
483
+ return timeString.substring(0, 5); // Remove seconds if present
484
+ }
485
+
486
+ // Função para renderizar casos
487
+ function renderCases() {
488
+ const container = document.getElementById('cases-container');
489
+ container.innerHTML = '';
490
+
491
+ cases.forEach(caseItem => {
492
+ const priorityClass = caseItem.priority === 'alta' ? 'priority-high' :
493
+ caseItem.priority === 'media' ? 'priority-medium' : 'priority-low';
494
+
495
+ const statusText = caseItem.status === 'em-andamento' ? 'Em Andamento' :
496
+ caseItem.status === 'concluido' ? 'Concluído' :
497
+ caseItem.status === 'arquivado' ? 'Arquivado' : 'Aguardando';
498
+
499
+ const caseElement = document.createElement('div');
500
+ caseElement.className = 'card-hover bg-white rounded-lg shadow overflow-hidden flex flex-col';
501
+ caseElement.innerHTML = `
502
+ <div class="p-6 flex-grow">
503
+ <div class="flex justify-between items-start mb-2">
504
+ <h3 class="font-semibold text-gray-800">${caseItem.title}</h3>
505
+ <div class="flex items-center">
506
+ <span class="${priorityClass} text-xs font-semibold mr-1">${caseItem.priority.toUpperCase()}</span>
507
+ <i class="fas fa-circle text-xs ${priorityClass}"></i>
508
+ </div>
509
+ </div>
510
+ <p class="text-sm text-gray-500 mb-4">${caseItem.number}</p>
511
+ <p class="text-gray-600 text-sm mb-4">${caseItem.description || 'Sem descrição'}</p>
512
+ <div class="flex justify-between items-center">
513
+ <span class="status-badge status-${caseItem.status}">${statusText}</span>
514
+ <div class="flex space-x-2">
515
+ <button onclick="editCase('${caseItem.id}')" class="text-gray-500 hover:text-gray-700">
516
+ <i class="fas fa-edit"></i>
517
+ </button>
518
+ <button onclick="deleteCase('${caseItem.id}')" class="text-gray-500 hover:text-red-500">
519
+ <i class="fas fa-trash"></i>
520
+ </button>
521
+ </div>
522
+ </div>
523
+ </div>
524
+ `;
525
+ container.appendChild(caseElement);
526
+ });
527
+ }
528
+
529
+ // Função para renderizar audiências
530
+ function renderHearings() {
531
+ const tbody = document.getElementById('hearings-table');
532
+ tbody.innerHTML = '';
533
+
534
+ hearings.forEach(hearing => {
535
+ const caseItem = cases.find(c => c.id === hearing.caseId);
536
+ const hearingType = hearing.type === 'instrucao' ? 'Instrução Processual' :
537
+ hearing.type === 'julgamento' ? 'Julgamento' :
538
+ hearing.type === 'conciliacao' ? 'Conciliação' : 'Outras';
539
+
540
+ const status = 'Agendada'; // You
541
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=alexandremoraisdarosa/testegestor" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
542
+ </html>