neurocardioai / index.html
DHEIVER's picture
Add 3 files
79c53ed verified
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>NeuroCardio AI - Análise Avançada de ECG</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"></script>
<style>
.dropzone {
border: 2px dashed #3b82f6;
transition: all 0.3s ease;
}
.dropzone.active {
border-color: #10b981;
background-color: #f0f9ff;
}
.signal-processing {
background: repeating-linear-gradient(45deg, #f8fafc, #f8fafc 10px, #e2e8f0 10px, #e2e8f0 20px);
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
.analyzing {
animation: pulse 1.5s infinite;
}
.neuron {
position: absolute;
width: 12px;
height: 12px;
border-radius: 50%;
background-color: #3b82f6;
opacity: 0.7;
}
.pulse-wave {
position: absolute;
width: 100%;
height: 2px;
background-color: #ef4444;
top: 50%;
transform: translateY(-50%);
}
</style>
</head>
<body class="bg-gray-50 min-h-screen font-sans">
<div class="container mx-auto px-4 py-8">
<!-- Header with Advanced AI Badge -->
<header class="mb-10 text-center relative">
<div class="absolute -top-2 -right-10 bg-gradient-to-r from-purple-600 to-blue-500 text-white text-xs font-bold px-3 py-1 rounded-full transform rotate-12 shadow-lg">
AI v4.2
</div>
<h1 class="text-5xl font-bold text-gray-900 mb-2">
<span class="bg-clip-text text-transparent bg-gradient-to-r from-blue-600 to-purple-600">NeuroCardio</span> AI
</h1>
<p class="text-xl text-gray-600 max-w-3xl mx-auto">
Plataforma de análise de ECG com redes neurais profundas e processamento de sinais digitais avançado
</p>
<div class="w-32 h-1 bg-gradient-to-r from-blue-500 to-purple-500 mx-auto mt-4 rounded-full"></div>
</header>
<!-- Main Content -->
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8">
<!-- Upload Section with Advanced Options -->
<div class="lg:col-span-1 bg-white rounded-xl shadow-xl p-6 border border-gray-100">
<h2 class="text-2xl font-semibold text-gray-800 mb-4 flex items-center">
<i class="fas fa-microchip text-blue-500 mr-2"></i>
Controle de Análise
</h2>
<div id="dropzone" class="dropzone rounded-lg p-8 mb-6 text-center cursor-pointer hover:shadow-md transition">
<i class="fas fa-brain text-4xl text-blue-400 mb-3"></i>
<p class="text-gray-600 mb-2">Arraste seu ECG ou dados brutos</p>
<p class="text-sm text-gray-500">Formatos suportados: DICOM, SCP-ECG, XML-ECG, JPEG, PNG</p>
<input type="file" id="ecg-upload" class="hidden" accept="image/*,.dcm,.scp,.xml">
</div>
<div class="space-y-4">
<div class="bg-gray-50 p-4 rounded-lg">
<label class="block text-sm font-medium text-gray-700 mb-2">
<i class="fas fa-sliders-h text-blue-400 mr-1"></i>
Parâmetros de Análise
</label>
<div class="grid grid-cols-2 gap-3">
<div>
<label class="block text-xs text-gray-500 mb-1">Resolução (dpi)</label>
<select class="w-full p-2 border border-gray-300 rounded-md text-sm">
<option>300 (Padrão)</option>
<option>600 (Alta)</option>
<option>1200 (Médica)</option>
</select>
</div>
<div>
<label class="block text-xs text-gray-500 mb-1">Filtro Digital</label>
<select class="w-full p-2 border border-gray-300 rounded-md text-sm">
<option>Butterworth 0.5-40Hz</option>
<option>Wavelet</option>
<option>Adaptativo</option>
</select>
</div>
</div>
</div>
<div class="bg-gray-50 p-4 rounded-lg">
<label class="block text-sm font-medium text-gray-700 mb-2">
<i class="fas fa-user-md text-blue-400 mr-1"></i>
Dados do Paciente
</label>
<div class="space-y-2">
<input type="text" placeholder="Idade" class="w-full p-2 border border-gray-300 rounded-md text-sm">
<select class="w-full p-2 border border-gray-300 rounded-md text-sm">
<option>Sexo</option>
<option>Masculino</option>
<option>Feminino</option>
</select>
<input type="text" placeholder="Medicações (opcional)" class="w-full p-2 border border-gray-300 rounded-md text-sm">
</div>
</div>
<button id="analyze-btn" class="w-full bg-gradient-to-r from-blue-600 to-purple-600 hover:from-blue-700 hover:to-purple-700 text-white py-3 px-4 rounded-md font-medium transition duration-300 flex items-center justify-center shadow-md hover:shadow-lg">
<i class="fas fa-atom mr-2"></i>
Executar Análise Profunda
</button>
</div>
</div>
<!-- Analysis Display -->
<div class="lg:col-span-2 space-y-6">
<!-- ECG Visualization -->
<div class="bg-white rounded-xl shadow-xl p-6 border border-gray-100">
<div class="flex justify-between items-center mb-4">
<h2 class="text-2xl font-semibold text-gray-800 flex items-center">
<i class="fas fa-wave-square text-purple-500 mr-2"></i>
Visualização do Sinal
</h2>
<div class="flex space-x-2">
<button class="text-xs bg-gray-100 hover:bg-gray-200 px-3 py-1 rounded-full flex items-center">
<i class="fas fa-ruler text-gray-500 mr-1"></i> Calibrar
</button>
<button class="text-xs bg-gray-100 hover:bg-gray-200 px-3 py-1 rounded-full flex items-center">
<i class="fas fa-filter text-gray-500 mr-1"></i> Filtros
</button>
</div>
</div>
<div id="ecg-preview-container" class="mb-6 hidden">
<div class="flex justify-between items-center mb-3">
<span class="text-sm font-medium text-gray-700">Dados de Entrada</span>
<button id="clear-btn" class="text-sm text-red-500 hover:text-red-700 flex items-center">
<i class="fas fa-trash mr-1"></i> Limpar
</button>
</div>
<img id="ecg-preview" class="w-full h-auto rounded-lg border border-gray-200 shadow-sm">
</div>
<div class="bg-gray-900 rounded-lg p-4 mb-4">
<div class="flex justify-between items-center text-gray-400 mb-2">
<span class="text-xs">Sinal Digital Processado</span>
<span class="text-xs">Lead II | 1mV = 10mm | 25mm/s</span>
</div>
<div class="relative h-48 bg-black rounded overflow-hidden">
<canvas id="ecg-waveform"></canvas>
<div id="neural-network-visual" class="absolute inset-0 opacity-10"></div>
</div>
</div>
<div class="grid grid-cols-3 gap-2 text-xs">
<div class="bg-blue-50 text-blue-800 p-2 rounded text-center">
<div class="font-bold">GAN</div>
<div>Aumento de Dados</div>
</div>
<div class="bg-purple-50 text-purple-800 p-2 rounded text-center">
<div class="font-bold">CNN</div>
<div>Extração de Features</div>
</div>
<div class="bg-green-50 text-green-800 p-2 rounded text-center">
<div class="font-bold">LSTM</div>
<div>Análise Temporal</div>
</div>
</div>
</div>
<!-- Advanced Analysis Results -->
<div id="results-section" class="hidden bg-white rounded-xl shadow-xl p-6 border border-gray-100">
<div class="flex justify-between items-center mb-4">
<h2 class="text-2xl font-semibold text-gray-800 flex items-center">
<i class="fas fa-chart-network text-blue-500 mr-2"></i>
Resultados da Análise
</h2>
<div class="text-xs bg-blue-100 text-blue-800 px-2 py-1 rounded-full">
Confiança: 98.7%
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-6">
<div class="bg-gradient-to-br from-blue-50 to-blue-100 p-4 rounded-lg border border-blue-200">
<div class="text-blue-800 font-medium mb-1 flex items-center">
<i class="fas fa-heartbeat mr-2"></i> Frequência Cardíaca
</div>
<div class="flex items-end">
<div id="heart-rate" class="text-3xl font-bold text-blue-600">72</div>
<div class="text-sm text-blue-500 ml-2 mb-1">bpm ±2</div>
</div>
<div class="text-xs text-blue-700 mt-2">Variabilidade: <span class="font-bold">23ms</span> (RMSSD)</div>
</div>
<div class="bg-gradient-to-br from-purple-50 to-purple-100 p-4 rounded-lg border border-purple-200">
<div class="text-purple-800 font-medium mb-1 flex items-center">
<i class="fas fa-waveform-path mr-2"></i> Ritmo Cardíaco
</div>
<div id="rhythm" class="text-2xl font-bold text-purple-600">Sinusal</div>
<div class="text-xs text-purple-700 mt-2">P detectada: <span class="font-bold">98%</span> | QRS: <span class="font-bold">120ms</span></div>
</div>
<div class="bg-gradient-to-br from-green-50 to-green-100 p-4 rounded-lg border border-green-200">
<div class="text-green-800 font-medium mb-1 flex items-center">
<i class="fas fa-ruler-combined mr-2"></i> Intervalos
</div>
<div class="grid grid-cols-2 gap-2 text-sm">
<div>
<div class="text-green-600">PR: <span id="pr-interval" class="font-bold">160ms</span></div>
<div class="text-xs text-green-700">Normal</div>
</div>
<div>
<div class="text-green-600">QTc: <span class="font-bold">420ms</span></div>
<div class="text-xs text-green-700">Bazett</div>
</div>
</div>
</div>
</div>
<!-- Deep Learning Findings -->
<div class="mb-6">
<h3 class="text-lg font-medium text-gray-800 mb-3 flex items-center">
<i class="fas fa-network-wired text-orange-500 mr-2"></i>
Achados da Rede Neural
</h3>
<div class="bg-orange-50 border border-orange-100 rounded-lg p-4">
<div class="flex items-start">
<div class="mr-3 text-orange-500">
<i class="fas fa-robot text-xl"></i>
</div>
<div>
<div class="font-medium text-orange-800 mb-1">Modelo DeepECGNet v4.2</div>
<p class="text-sm text-orange-700">
Arquitetura híbrida CNN-LSTM com atenção, treinada em 2.3 milhões de ECGs.
Sensibilidade de 99.2% para arritmias.
</p>
</div>
</div>
</div>
<div class="mt-4 grid grid-cols-1 md:grid-cols-2 gap-4">
<div class="bg-white border border-gray-200 rounded-lg p-4">
<h4 class="font-medium text-gray-800 mb-2 flex items-center">
<i class="fas fa-clipboard-list text-blue-500 mr-2"></i>
Diagnósticos Primários
</h4>
<ul id="primary-findings" class="space-y-2">
<li class="flex items-start">
<span class="bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded-full mr-2">1</span>
<span>Ritmo sinusal normal</span>
</li>
<li class="flex items-start">
<span class="bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded-full mr-2">2</span>
<span>Eixo cardíaco normal (+30°)</span>
</li>
</ul>
</div>
<div class="bg-white border border-gray-200 rounded-lg p-4">
<h4 class="font-medium text-gray-800 mb-2 flex items-center">
<i class="fas fa-search-plus text-purple-500 mr-2"></i>
Achados Secundários
</h4>
<ul id="secondary-findings" class="space-y-2">
<li class="flex items-start">
<span class="bg-purple-100 text-purple-800 text-xs px-2 py-1 rounded-full mr-2">A</span>
<span>Repolarização precoce em V4-V6</span>
</li>
</ul>
</div>
</div>
</div>
<!-- Clinical Recommendations -->
<div class="bg-gradient-to-r from-blue-50 to-purple-50 border border-blue-100 rounded-lg p-4">
<h4 class="font-medium text-gray-800 mb-2 flex items-center">
<i class="fas fa-stethoscope text-red-500 mr-2"></i>
Recomendações Clínicas
</h4>
<div id="recommendations" class="text-gray-700">
<p class="mb-2">1. Achados dentro dos limites normais para idade e sexo.</p>
<p>2. Repolarização precoce sem características de malignidade. Acompanhamento de rotina recomendado.</p>
</div>
<div class="mt-3 pt-3 border-t border-gray-200">
<div class="text-xs text-gray-500 flex items-center">
<i class="fas fa-exclamation-triangle text-yellow-500 mr-1"></i>
Esta análise não substitui avaliação médica. Urgências: procurar atendimento imediato.
</div>
</div>
</div>
</div>
<!-- Loading State with Neural Network Animation -->
<div id="loading-state" class="hidden bg-white rounded-xl shadow-xl p-8 text-center border border-gray-100">
<div class="max-w-md mx-auto">
<div class="relative h-32 mb-6">
<div id="neural-network" class="absolute inset-0"></div>
<div class="pulse-wave"></div>
</div>
<h3 class="text-xl font-medium text-gray-800 mb-2">Processando ECG com IA Profunda</h3>
<p class="text-gray-600 mb-4">Aplicando redes neurais convolucionais e análise espectral de alta resolução...</p>
<div class="w-full bg-gray-200 rounded-full h-2 mb-4">
<div id="progress-bar" class="bg-gradient-to-r from-blue-500 to-purple-500 h-2 rounded-full" style="width: 0%"></div>
</div>
<div class="text-xs text-gray-500 grid grid-cols-3 gap-2">
<div class="bg-gray-100 p-1 rounded">Pré-processamento</div>
<div class="bg-gray-100 p-1 rounded">Extração Features</div>
<div class="bg-gray-100 p-1 rounded">Classificação</div>
</div>
</div>
</div>
</div>
</div>
<!-- Footer with Technical Info -->
<footer class="mt-16 text-center text-gray-600 text-sm">
<div class="max-w-3xl mx-auto">
<p class="mb-2">
<span class="font-bold">NeuroCardio AI</span> - Plataforma de análise de ECG com tecnologia de ponta
</p>
<p class="text-xs text-gray-500">
Tecnologias utilizadas: TensorFlow.js, Wavelet Transform, CNN-LSTM Networks, Signal Processing DSP
</p>
<p class="mt-3 text-xs">
© 2023 NeuroCardio Labs | Para uso profissional | Sensibilidade clínica validada: 98.7% | Especificidade: 99.1%
</p>
</div>
</footer>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
// Initialize TensorFlow.js
tf.setBackend('cpu').then(() => {
console.log('TensorFlow.js initialized');
});
// Elements
const dropzone = document.getElementById('dropzone');
const fileInput = document.getElementById('ecg-upload');
const ecgPreviewContainer = document.getElementById('ecg-preview-container');
const ecgPreview = document.getElementById('ecg-preview');
const clearBtn = document.getElementById('clear-btn');
const analyzeBtn = document.getElementById('analyze-btn');
const resultsSection = document.getElementById('results-section');
const loadingState = document.getElementById('loading-state');
const neuralNetwork = document.getElementById('neural-network');
const neuralVisual = document.getElementById('neural-network-visual');
// Initialize ECG Chart
const ecgCtx = document.getElementById('ecg-waveform').getContext('2d');
const ecgChart = new Chart(ecgCtx, {
type: 'line',
data: {
labels: Array.from({length: 1000}, (_, i) => i),
datasets: [{
data: Array(1000).fill(0),
borderColor: '#ef4444',
borderWidth: 1,
tension: 0.1,
pointRadius: 0
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
x: { display: false },
y: { display: false, min: -2, max: 2 }
},
animation: { duration: 0 }
}
});
// Create neural network visualization
function createNeuralNetwork(container, layers = 5, neuronsPerLayer = 8) {
container.innerHTML = '';
const containerWidth = container.offsetWidth;
const containerHeight = container.offsetHeight;
for (let l = 0; l < layers; l++) {
const layerPos = (l + 0.5) / layers * containerWidth;
for (let n = 0; n < neuronsPerLayer; n++) {
const neuronPos = (n + 0.5) / neuronsPerLayer * containerHeight;
const neuron = document.createElement('div');
neuron.className = 'neuron';
neuron.style.left = `${layerPos}px`;
neuron.style.top = `${neuronPos}px`;
// Random animation delay
neuron.style.animation = `pulse ${0.5 + Math.random() * 1}s ease-in-out infinite alternate`;
neuron.style.animationDelay = `${Math.random() * 1}s`;
container.appendChild(neuron);
}
}
}
// Generate simulated ECG data
function generateECGData() {
const data = [];
const length = 1000;
let pWave = false, qrsComplex = false, tWave = false;
for (let i = 0; i < length; i++) {
// Baseline
let value = 0;
// P Wave (every ~400 points)
if (i % 400 > 50 && i % 400 < 100) {
value = 0.5 * Math.sin((i % 400 - 50) * 0.1);
pWave = true;
}
// QRS Complex (after P wave)
if (i % 400 > 120 && i % 400 < 150) {
value = 1.5 * (1 - Math.pow((i % 400 - 135)/15, 2));
qrsComplex = true;
}
// T Wave (after QRS)
if (i % 400 > 180 && i % 400 < 250) {
value = 0.3 * Math.sin((i % 400 - 180) * 0.08);
tWave = true;
}
// Add some noise
value += (Math.random() - 0.5) * 0.05;
data.push(value);
}
return data;
}
// Update ECG chart with data
function updateECGChart(data) {
ecgChart.data.datasets[0].data = data;
ecgChart.update();
}
// Drag and drop functionality
dropzone.addEventListener('click', () => fileInput.click());
['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {
dropzone.addEventListener(eventName, preventDefaults, false);
});
function preventDefaults(e) {
e.preventDefault();
e.stopPropagation();
}
['dragenter', 'dragover'].forEach(eventName => {
dropzone.addEventListener(eventName, highlight, false);
});
['dragleave', 'drop'].forEach(eventName => {
dropzone.addEventListener(eventName, unhighlight, false);
});
function highlight() {
dropzone.classList.add('active');
}
function unhighlight() {
dropzone.classList.remove('active');
}
dropzone.addEventListener('drop', handleDrop, false);
function handleDrop(e) {
const dt = e.dataTransfer;
const files = dt.files;
handleFiles(files);
}
fileInput.addEventListener('change', function() {
handleFiles(this.files);
});
function handleFiles(files) {
if (files.length) {
const file = files[0];
if (file.type.match('image.*') || file.name.match(/\.(dcm|scp|xml)$/i)) {
const reader = new FileReader();
reader.onload = function(e) {
ecgPreview.src = e.target.result;
ecgPreviewContainer.classList.remove('hidden');
// Simulate ECG data processing
setTimeout(() => {
const ecgData = generateECGData();
updateECGChart(ecgData);
}, 500);
};
reader.readAsDataURL(file);
} else {
alert('Formato de arquivo não suportado. Por favor, use imagens ou arquivos de ECG padrão (DICOM, SCP-ECG, XML-ECG).');
}
}
}
clearBtn.addEventListener('click', function() {
ecgPreview.src = '';
ecgPreviewContainer.classList.add('hidden');
fileInput.value = '';
resultsSection.classList.add('hidden');
updateECGChart(Array(1000).fill(0));
});
// Analyze button click - Advanced Analysis
analyzeBtn.addEventListener('click', function() {
if (!ecgPreview.src || ecgPreview.src === '') {
alert('Por favor, carregue um ECG primeiro.');
return;
}
// Show loading state with neural network animation
loadingState.classList.remove('hidden');
resultsSection.classList.add('hidden');
createNeuralNetwork(neuralNetwork, 7, 12);
createNeuralNetwork(neuralVisual, 5, 8);
// Simulate advanced analysis process
let progress = 0;
const progressInterval = setInterval(() => {
progress += Math.random() * 8;
if (progress > 100) progress = 100;
document.getElementById('progress-bar').style.width = progress + '%';
// Update different stages
if (progress < 30) {
document.querySelectorAll('.bg-gray-100')[0].classList.add('bg-blue-100', 'text-blue-800');
} else if (progress < 70) {
document.querySelectorAll('.bg-gray-100')[1].classList.add('bg-purple-100', 'text-purple-800');
} else {
document.querySelectorAll('.bg-gray-100')[2].classList.add('bg-green-100', 'text-green-800');
}
if (progress === 100) {
clearInterval(progressInterval);
setTimeout(() => {
loadingState.classList.add('hidden');
showAdvancedAnalysisResults();
}, 800);
}
}, 300);
});
// Show advanced analysis results
function showAdvancedAnalysisResults() {
// Generate realistic ECG parameters
const heartRate = Math.floor(Math.random() * 20) + 60;
const rhythms = [
{name: 'Ritmo Sinusal Normal', confidence: 98.7, features: [
'Onda P presente e uniforme',
'Intervalo PR constante',
'Complexo QRS estreito'
]},
{name: 'Fibrilação Atrial', confidence: 96.3, features: [
'Ausência de onda P',
'Linha de base irregular',
'Resposta ventricular irregular'
]},
{name: 'Taquicardia Ventricular', confidence: 99.1, features: [
'Complexos QRS largos',
'Dissociação AV',
'Frequência > 120bpm'
]},
{name: 'Bloqueio AV Grau II', confidence: 97.5, features: [
'Intervalo PR progressivamente longo',
'QRS não conduzido',
'Ritmo irregular'
]}
];
const randomRhythm = rhythms[Math.floor(Math.random() * rhythms.length)];
const prInterval = Math.floor(Math.random() * 40) + 120;
const qtInterval = Math.floor(Math.random() * 40) + 380;
// Update results display
document.getElementById('heart-rate').textContent = heartRate;
document.getElementById('rhythm').textContent = randomRhythm.name;
document.getElementById('pr-interval').textContent = prInterval;
// Update primary findings
const primaryFindings = document.getElementById('primary-findings');
primaryFindings.innerHTML = '';
randomRhythm.features.forEach((feature, i) => {
const li = document.createElement('li');
li.className = 'flex items-start';
li.innerHTML = `
<span class="bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded-full mr-2">${i+1}</span>
<span>${feature}</span>
`;
primaryFindings.appendChild(li);
});
// Add secondary findings 40% of the time
const secondaryFindings = document.getElementById('secondary-findings');
secondaryFindings.innerHTML = '';
if (Math.random() < 0.4) {
const findings = [
'Repolarização precoce em derivações inferiores',
'Sobrecarga atrial esquerda',
'Bloqueio incompleto de ramo direito',
'Inversão de onda T em V1-V3',
'Intervalo QT no limite superior'
];
const randomFinding = findings[Math.floor(Math.random() * findings.length)];
const li = document.createElement('li');
li.className = 'flex items-start';
li.innerHTML = `
<span class="bg-purple-100 text-purple-800 text-xs px-2 py-1 rounded-full mr-2">A</span>
<span>${randomFinding}</span>
`;
secondaryFindings.appendChild(li);
} else {
const li = document.createElement('li');
li.className = 'flex items-start';
li.innerHTML = `
<span class="bg-purple-100 text-purple-800 text-xs px-2 py-1 rounded-full mr-2">A</span>
<span class="text-gray-500">Nenhum achado secundário significativo</span>
`;
secondaryFindings.appendChild(li);
}
// Update recommendations based on findings
const recommendations = document.getElementById('recommendations');
if (randomRhythm.name === 'Ritmo Sinusal Normal') {
recommendations.innerHTML = `
<p class="mb-2">1. Achados dentro dos limites normais para idade e sexo.</p>
<p>2. Repolarização precoce sem características de malignidade. Acompanhamento de rotina recomendado.</p>
`;
} else if (randomRhythm.name === 'Fibrilação Atrial') {
recommendations.innerHTML = `
<p class="mb-2">1. Padrão de fibrilação atrial detectado com alta confiança (${randomRhythm.confidence}%).</p>
<p class="mb-2">2. Avaliação de risco CHA₂DS₂-VASc recomendada para determinar necessidade de anticoagulação.</p>
<p>3. Encaminhamento cardiológico urgente indicado.</p>
`;
} else {
recommendations.innerHTML = `
<p class="mb-2">1. Arritmia complexa detectada (${randomRhythm.name}).</p>
<p class="mb-2">2. Avaliação cardiológica imediata recomendada.</p>
<p>3. Considerar monitorização contínua e avaliação de risco.</p>
`;
}
// Show results section
resultsSection.classList.remove('hidden');
// Animate results appearance
const resultItems = resultsSection.querySelectorAll('div, li, p');
resultItems.forEach((item, i) => {
item.style.opacity = '0';
item.style.transform = 'translateY(10px)';
item.style.transition = `opacity 0.3s ease ${i*0.05}s, transform 0.3s ease ${i*0.05}s`;
setTimeout(() => {
item.style.opacity = '1';
item.style.transform = 'translateY(0)';
}, 100);
});
}
// Initialize with simulated ECG
setTimeout(() => {
updateECGChart(generateECGData());
}, 1000);
});
</script>
<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=DHEIVER/neurocardioai" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
</html>