LAUDO INTEGRADO

Pronto para gerar

Plataforma de Avaliação Integrada

Preencha os 9 blocos do protocolo: avaliador → avaliado → anamnese → antropometria → perímetros → ADM → testes especiais → relatórios externos.

A IA cruza 6 fontes de dados (composição corporal, perímetros, ADM, testes funcionais, força Kinology e corrida Aletheia) seguindo a lógica clínica do método ProRunner para produzir o laudo integrado completo.

1. Anamnese
2. Antropometria
3. Perímetros
4. ADM
5. Testes
6. Uploads
7. IA
8. Laudo
'; iframeDoc.open(); iframeDoc.write(fullHtml); iframeDoc.close(); $('preng-print-btn').addEventListener('click', function() { var iframe = $('preng-laudo-iframe'); iframe.contentWindow.focus(); iframe.contentWindow.print(); }); $('preng-copy-btn').addEventListener('click', function() { navigator.clipboard.writeText(window._prengLaudoHtml).then(function() { alert('HTML do laudo copiado'); }); }); $('preng-download-btn').addEventListener('click', downloadLaudo); $('preng-new-btn').addEventListener('click', function() { if (confirm('Limpar formulário e começar nova análise?')) { clearForm(); window._prengLaudoHtml = null; out.innerHTML = '

Pronto para nova análise

Edite os dados ao lado e gere um novo laudo.

'; } }); status.className = 'preng-status ready'; status.textContent = 'Laudo gerado'; }) .catch(function(err) { clearInterval(stepInterval); out.innerHTML = '
' + '
!
' + '

Erro ao gerar laudo

' + '

' + err.message + '

' + '

Verifique sua conexão e tente novamente.

' + '
'; status.className = 'preng-status'; status.textContent = 'Erro'; }) .then(function() { btn.disabled = false; btn.classList.remove('loading'); }); } function downloadLaudo() { if (!window._prengLaudoHtml) return; var nome = (window._prengLaudoNome || 'corredor').replace(/[^a-z0-9]/gi, '_'); var fullHtml = '' + '' + 'Laudo ProRunner — ' + nome + '' + '' + '' + window._prengLaudoHtml + ''; var blob = new Blob([fullHtml], { type: 'text/html' }); var a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = 'laudo-prorunner-' + nome + '.html'; a.click(); } // ============================================================ // ELEMENTOR FULL-WIDTH FIX — VERSÃO AGRESSIVA v2 // Ataca todos os containers pais com setProperty('!important') // ============================================================ function fixFullWidth() { var wrapper = document.getElementById('preng-root'); if (!wrapper) return; // Força reset no próprio wrapper wrapper.style.setProperty('width', '100vw', 'important'); wrapper.style.setProperty('max-width', '100vw', 'important'); wrapper.style.setProperty('margin-left', 'calc(50% - 50vw)', 'important'); wrapper.style.setProperty('margin-right', 'calc(50% - 50vw)', 'important'); // Sobe a árvore de pais e neutraliza limitações var parent = wrapper.parentElement; while (parent && parent !== document.body && parent !== document.documentElement) { parent.style.setProperty('max-width', '100%', 'important'); parent.style.setProperty('width', '100%', 'important'); parent.style.setProperty('padding-left', '0', 'important'); parent.style.setProperty('padding-right', '0', 'important'); parent.style.setProperty('margin-left', '0', 'important'); parent.style.setProperty('margin-right', '0', 'important'); // Se for container Elementor específico, neutraliza overflow e position if (parent.classList) { var cl = parent.className || ''; if (cl.indexOf('elementor') !== -1 || cl.indexOf('e-con') !== -1) { parent.style.setProperty('overflow', 'visible', 'important'); } } parent = parent.parentElement; } // Body e html sem padding document.body.style.setProperty('margin', '0', 'important'); document.body.style.setProperty('padding', '0', 'important'); document.body.style.setProperty('overflow-x', 'hidden', 'important'); } // Injeta CSS global de override com !important function injectGlobalOverride() { if (document.getElementById('preng-global-override')) return; var style = document.createElement('style'); style.id = 'preng-global-override'; style.textContent = [ '.elementor-widget-html,', '.elementor-widget-html .elementor-widget-container,', '.elementor-element-edit-mode .elementor-widget-html,', 'div[data-element_type="widget"][data-widget_type="html.default"],', 'div[data-element_type="widget"][data-widget_type="html.default"] > .elementor-widget-container {', ' max-width: 100% !important;', ' width: 100% !important;', ' padding: 0 !important;', ' margin: 0 !important;', ' overflow: visible !important;', '}', '.elementor-section, .elementor-container, .elementor-row, .elementor-column,', '.e-con, .e-con-inner, .e-parent {', ' max-width: 100% !important;', ' padding-left: 0 !important;', ' padding-right: 0 !important;', ' overflow: visible !important;', '}', 'body { overflow-x: hidden !important; }' ].join('\n'); document.head.appendChild(style); } // ============================================================ // INIT // ============================================================ function init() { if (!isConfigured()) $('preng-config-warning').classList.add('show'); if (isLoggedIn()) showApp(); else showLogin(); $('preng-data-aval').value = new Date().toISOString().split('T')[0]; $('preng-login-btn').addEventListener('click', doLogin); $('preng-password-input').addEventListener('keypress', function(e) { if (e.key === 'Enter') doLogin(); }); $('preng-logout-btn').addEventListener('click', function() { if (confirm('Encerrar sessão?')) { clearToken(); showLogin(); } }); setupUpload('preng-zone-aletheia', 'preng-file-aletheia', 'preng-filename-aletheia', 'aletheia'); setupUpload('preng-zone-kinology', 'preng-file-kinology', 'preng-filename-kinology', 'kinology'); setupUpload('preng-zone-polar', 'preng-file-polar', 'preng-filename-polar', 'polar'); // Sincronizar UI inicial do seletor de modalidade if (typeof prengToggleEsporteOutros === 'function') { prengToggleEsporteOutros(); } if (typeof prengToggleTornextTipo === 'function') { prengToggleTornextTipo(); } $('preng-btn-exemplo').addEventListener('click', loadExample); $('preng-btn-limpar').addEventListener('click', clearForm); $('preng-btn-gerar').addEventListener('click', gerarLaudo); bindCalculos(); bindToggles(); } // Handler dos toggles "Realizar este item" function bindToggles() { var rows = document.querySelectorAll('#preng-root .preng-toggle-row'); for (var i = 0; i < rows.length; i++) { (function(row) { row.addEventListener('click', function() { var key = row.getAttribute('data-toggle'); var isActive = row.classList.contains('active'); if (isActive) { row.classList.remove('active'); realizar[key] = false; } else { row.classList.add('active'); realizar[key] = true; } // Encontra o bloco de conteúdo correspondente var content = document.querySelector('#preng-root [data-content="' + key + '"]'); if (content) { if (realizar[key]) content.classList.remove('disabled'); else content.classList.add('disabled'); } }); })(rows[i]); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', function() { injectGlobalOverride(); init(); fixFullWidth(); }); } else { injectGlobalOverride(); init(); fixFullWidth(); } // Reaplica em vários momentos para vencer hidratação do Elementor setTimeout(fixFullWidth, 300); setTimeout(fixFullWidth, 800); setTimeout(fixFullWidth, 1500); setTimeout(fixFullWidth, 3000); // Observa mudanças de DOM (Elementor pode re-renderizar) if (typeof MutationObserver !== 'undefined') { var mo = new MutationObserver(function() { fixFullWidth(); }); if (document.body) { mo.observe(document.body, { childList: true, subtree: false, attributes: true, attributeFilter: ['style', 'class'] }); } } // Reaplica em resize de janela window.addEventListener('resize', fixFullWidth); })(); /* ============================================================ v7.1 — MARCADOR DE INTEGRIDADE Se esta linha executou, o HTML chegou COMPLETO ao navegador. Diagnóstico rápido no Console (F12): typeof window.PRENG_VERSION → "string" = script completo OK → "undefined" = HTML foi TRUNCADO ao colar (Elementor cortou) ============================================================ */ window.PRENG_VERSION = 'v7.1-async'; console.log('[ProRunner] Frontend ' + window.PRENG_VERSION + ' carregado COMPLETO ✓'); (function() { // Badge visual discreto de versão (só aparece se o JS rodou até o fim) try { var badge = document.createElement('div'); badge.textContent = window.PRENG_VERSION; badge.style.cssText = 'position:fixed;bottom:4px;right:8px;font-size:9px;color:rgba(255,255,255,0.25);font-family:monospace;z-index:99999;pointer-events:none;'; document.body.appendChild(badge); } catch (e) {} // Verificação de sanidade dos uploads: se algum listener não ligou, religa try { var checagens = [ ['preng-zone-aletheia', 'preng-file-aletheia', 'preng-filename-aletheia', 'aletheia'], ['preng-zone-kinology', 'preng-file-kinology', 'preng-filename-kinology', 'kinology'], ['preng-zone-polar', 'preng-file-polar', 'preng-filename-polar', 'polar'] ]; checagens.forEach(function(c) { var input = document.getElementById(c[1]); if (input && !input._prengBound) { input._prengBound = true; // listener redundante de segurança (idempotente — uploads[key] sobrescreve) input.addEventListener('change', function(e) { var file = e.target.files[0]; if (!file) return; if (window._prengUploads) { window._prengUploads[c[3]] = file; var zone = document.getElementById(c[0]); var fn = document.getElementById(c[2]); if (zone) zone.classList.add('has-file'); if (fn) fn.textContent = '✓ ' + file.name + ' (' + (file.size / 1024).toFixed(0) + ' KB)'; } }); } }); console.log('[ProRunner] Listeners de upload verificados ✓'); } catch (e) { console.error('[ProRunner] Falha na verificação de uploads:', e); } })();

Preencha e aplique-se para a Pós Nutrição Clinica Esportiva!

Preencha e aplique-se para a Pós em Neurociências da Reabilitação!

Preencha e aplique-se para a Pós em Ciências do Treinamento Físico e do Esporte!

Preencha e aplique-se para a Pós em Fisioterapia em Traumato-Ortopedia Clínica e Esportiva

Digite o e-mail no qual deseja receber seu acesso