| <!DOCTYPE html> |
| <html lang="pt-br"> |
| <head> |
| <meta charset="UTF-8" /> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"/> |
| <title>RMCr - Gestor de Prova Penal - Prof. AMR</title> |
| <script src="https://cdn.tailwindcss.com"></script> |
| <script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"></script> |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css" /> |
| <style> |
| [x-cloak] { display: none !important; } |
| .tab-active { border-bottom:3px solid #2563eb; color: #2563eb; font-weight: bold; } |
| .bg-conf-high { background-color: #dcfce7; border-left:4px solid #16a34a; } |
| .bg-conf-med { background-color: #fef9c3; border-left:4px solid #ca8a04; } |
| .bg-conf-low { background-color: #fee2e2; border-left:4px solid #dc2626; } |
| </style> |
| </head> |
| <body class="bg-gray-100 text-gray-800 font-sans min-h-screen" x-data="investigacaoApp()" x-init="init()"> |
|
|
| |
| <header class="bg-slate-900 text-white p-4 shadow-xl sticky top-0 z-50"> |
| <div class="container mx-auto flex justify-between items-center"> |
| <div> |
| <h1 class="text-xl font-bold tracking-tight"><i class="fa-solid fa-balance-scale mr-2"></i>RMCr - Gestor de Prova Penal - Prof. AMR</h1> |
| <p class="text-xs text-slate-400">Análise Atômica e Holística | Standard Probatório Penal</p> |
| </div> |
| <div class="flex space-x-2"> |
| <button @click="exportarDados()" class="bg-blue-600 hover:bg-blue-700 px-4 py-2 rounded text-sm font-bold transition"> |
| <i class="fa-solid fa-file-export mr-2"></i>Exportar JSON </button> |
| <button @click="limparDados()" class="bg-red-600 hover:bg-red-700 px-4 py-2 rounded text-sm font-bold transition" title="Limpar tudo"> |
| <i class="fa-solid fa-trash-can mr-1"></i>Limpar </button> |
| </div> |
| </div> |
| </header> |
|
|
| <main class="container mx-auto mt-6 p-4"> |
|
|
| |
| <nav class="flex border-b border-gray-300 overflow-x-auto mb-6 bg-white rounded-t-xl shadow-sm sticky top-[72px] z-40"> |
| <template x-for="tab in tabs"> |
| <button @click="activeTab = tab.id" |
| :class="activeTab === tab.id ? 'tab-active' : 'text-gray-500 hover:bg-gray-50'" |
| class="px-6 py-4 text-sm whitespace-nowrap transition-all duration-200 focus:outline-none flex items-center" |
| x-html="tab.icon + ' ' + tab.name"></button> |
| </template> |
| </nav> |
|
|
| |
| <div class="bg-white p-8 rounded-b-xl shadow-lg border border-gray-200 min-h-[70vh]"> |
|
|
| |
| <div x-show="activeTab === 'instrucoes'" x-cloak> |
| <div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8"> |
| <div class="bg-white border p-6 rounded-xl shadow-sm"> |
| <h3 class="text-gray-500 text-xs font-bold uppercase mb-2">Total de Provas</h3> |
| <p class="text-4xl font-black text-blue-700" x-text="dados.provas.length"></p> |
| </div> |
| <div class="bg-white border p-6 rounded-xl shadow-sm"> |
| <h3 class="text-gray-500 text-xs font-bold uppercase mb-2">Provas Válidas</h3> |
| <p class="text-4xl font-black text-green-600" x-text="dados.provas.filter(p => p.analise.valida === 'valida').length"></p> |
| </div> |
| <div class="bg-white border p-6 rounded-xl shadow-sm"> |
| <h3 class="text-gray-500 text-xs font-bold uppercase mb-2">Standard Alcançado</h3> |
| <p class="text-xl font-bold mt-2" :class="dados.holistica.standardSuperado ? 'text-green-600' : 'text-red-600'" |
| x-text="dados.holistica.standardSuperado ? 'SIM (Condenação Plausível)' : 'NÃO (Dúvida Razoável)'"></p> |
| </div> |
| </div> |
| <div class="bg-blue-50 p-6 rounded-xl border border-blue-100"> |
| <h2 class="text-xl font-bold text-blue-900 mb-4 italic">Guia Metodológico</h2> |
| <ul class="space-y-3 text-blue-800 text-sm"> |
| <li><i class="fa-solid fa-check-circle mr-2"></i><strong>Análise Atômica:</strong> Avalie cada átomo de prova isoladamente.</li> |
| <li><i class="fa-solid fa-check-circle mr-2"></i><strong>Análise Holística:</strong> Observe o mosaico de provas como um todo.</li> |
| <li><i class="fa-solid fa-check-circle mr-2"></i><strong>Standard Probatório:</strong> Apenas confirme se a hipótese acusatória é a única plausível.</li> |
| </ul> |
| </div> |
| </div> |
|
|
| |
| <div x-show="activeTab === 'capa'" x-cloak class="max-w-4xl mx-auto"> |
| <h2 class="text-2xl font-bold mb-6 text-slate-800 border-b pb-2">Informações do Caso</h2> |
| <div class="space-y-6"> |
| <div class="grid grid-cols-1 md:grid-cols-2 gap-4"> |
| <div> |
| <label class="block text-xs font-bold uppercase text-gray-500 mb-1">Nº do Processo</label> |
| <input type="text" x-model="dados.capa.numeroProcesso" class="w-full p-3 border rounded-lg focus:ring-2 focus:ring-blue-500 outline-none"> |
| </div> |
| <div> |
| <label class="block text-xs font-bold uppercase text-gray-500 mb-1">Órgão Julgador</label> |
| <input type="text" x-model="dados.capa.orgao" class="w-full p-3 border rounded-lg"> |
| </div> |
| </div> |
| <div> |
| <label class="block text-xs font-bold uppercase text-gray-500 mb-1">Fato Imputado</label> |
| <textarea x-model="dados.capa.fato" class="w-full p-3 border rounded-lg h-32"></textarea> |
| </div> |
| <div class="grid grid-cols-1 md:grid-cols-2 gap-6 mt-4"> |
| <div class="p-4 bg-red-50 rounded-xl border border-red-100"> |
| <h3 class="font-bold text-red-800 mb-2 underline">Hipótese Acusatória [HAc]</h3> |
| <textarea x-model="dados.capa.hipoteseAcusatoria" placeholder="Narrativa da acusação..." class="w-full p-3 border rounded-lg h-24 text-sm"></textarea> |
| </div> |
| <div class="p-4 bg-green-50 rounded-xl border border-green-100"> |
| <h3 class="font-bold text-green-800 mb-2 underline">Hipótese Defensiva [HDef]</h3> |
| <textarea x-model="dados.capa.hipoteseDefensiva" placeholder="Narrativa da defesa..." class="w-full p-3 border rounded-lg h-24 text-sm"></textarea> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div x-show="activeTab === 'inventario'" x-cloak> |
| <div class="flex justify-between items-center mb-6"> |
| <h2 class="text-2xl font-bold text-slate-800">Inventário de Provas</h2> |
| <button @click="addProva()" class="bg-blue-600 text-white px-6 py-2 rounded-lg font-bold hover:bg-blue-700 shadow-md transition">+ Adicionar Item</button> |
| </div> |
| <div class="overflow-x-auto"> |
| <table class="w-full text-left border-collapse bg-white"> |
| <thead class="bg-slate-50 text-slate-600 text-xs uppercase font-black"> |
| <tr> |
| <th class="p-4 border">ID</th> |
| <th class="p-4 border">Tipo</th> |
| <th class="p-4 border">Descrição</th> |
| <th class="p-4 border">Localização</th> |
| <th class="p-4 border w-20 text-center">Ações</th> |
| </tr> |
| </thead> |
| <tbody> |
| <template x-for="(prova, index) in dados.provas" :key="index"> |
| <tr class="hover:bg-blue-50 transition"> |
| <td class="p-4 border font-mono text-blue-700 font-bold" x-text="'P'+(index+1).toString().padStart(2,'0')"></td> |
| <td class="p-4 border"> |
| <select x-model="prova.tipo" class="w-full p-1 border rounded text-sm"> |
| <option>Testemunhal</option> |
| <option>Pericial</option> |
| <option>Documental Analógica</option> |
| <option>Documental Digital [Hash]</option> |
| <option>Reconhecimento de Pessoas</option> |
| <option>Confessional</option> |
| <option>Demonstrativa</option> |
| </select> |
| </td> |
| <td class="p-4 border"><input type="text" x-model="prova.descricao" class="w-full p-1 border-b focus:border-blue-500 outline-none" placeholder="Ex: Depoimento da vítima"></td> |
| <td class="p-4 border"><input type="text" x-model="prova.localizacao" class="w-full p-1 border-b focus:border-blue-500 outline-none text-gray-500" placeholder="Fls12 / Link nuvem"></td> |
| <td class="p-4 border text-center"> |
| <button @click="removeProva(index)" class="text-red-400 hover:text-red-700 transition"><i class="fa-solid fa-trash-can"></i></button> |
| </td> |
| </tr> |
| </template> |
| </tbody> |
| </table> |
| </div> |
| </div> |
|
|
| |
| <div x-show="activeTab === 'atomica'" x-cloak> |
| <h2 class="text-2xl font-bold mb-6">Análise Atômica <span class="text-gray-400 text-sm font-normal">(Valoração Individual)</span></h2> |
| <div class="grid grid-cols-1 gap-8"> |
| <template x-for="(prova, index) in dados.provas" :key="index"> |
| <div class="p-6 rounded-xl shadow-sm border transition-all duration-300" |
| :class="prova.analise.valida === 'invalida' ? 'opacity-60 bg-gray-200' : (prova.analise.credibilidade >=7 ? 'bg-conf-high' : (prova.analise.credibilidade >=4 ? 'bg-conf-med' : 'bg-conf-low'))"> |
| <div class="flex justify-between items-start mb-4 border-b border-black/10 pb-2"> |
| <div> |
| <span class="text-xs font-black uppercase text-slate-500" x-text="prova.tipo"></span> |
| <h3 class="text-lg font-bold text-slate-800" x-text="'P'+(index+1).toString().padStart(2,'0') + ': ' + prova.descricao"></h3> |
| </div> |
| <div class="text-right"> |
| <select x-model="prova.analise.valida" class="text-xs font-bold p-1 rounded border"> |
| <option value="valida">VÁLIDA</option> |
| <option value="invalida">INVÁLIDA/ILÍCITA</option> |
| </select> |
| </div> |
| </div> |
| <div class="grid grid-cols-1 md:grid-cols-4 gap-6"> |
| <div class="md:col-span-1 border-r border-black/5 pr-4"> |
| <label class="block text-xs font-bold mb-2">CREDIBILIDADE (0-10)</label> |
| <input type="range" min="0" max="10" x-model="prova.analise.credibilidade" class="w-full accent-blue-700"> |
| <div class="text-center font-black text-xl text-blue-900" x-text="prova.analise.credibilidade"></div> |
| </div> |
| <div class="md:col-span-3 grid grid-cols-3 gap-4"> |
| <div class="bg-white/50 p-2 rounded"> |
| <label class="block text-[10px] font-black uppercase mb-1">Rel. Materialidade</label> |
| <input type="number" min="0" max="10" x-model.number="prova.analise.relevancia.materialidade" class="w-full p-1 border rounded text-center font-bold"> |
| </div> |
| <div class="bg-white/50 p-2 rounded"> |
| <label class="block text-[10px] font-black uppercase mb-1">Rel. Autoria</label> |
| <input type="number" min="0" max="10" x-model.number="prova.analise.relevancia.autoria" class="w-full p-1 border rounded text-center font-bold"> |
| </div> |
| <div class="bg-white/50 p-2 rounded"> |
| <label class="block text-[10px] font-black uppercase mb-1">Rel. Subjetivo</label> |
| <input type="number" min="0" max="10" x-model.number="prova.analise.relevancia.subjetivo" class="w-full p-1 border rounded text-center font-bold"> |
| </div> |
| </div> |
| </div> |
| <div class="mt-4 grid grid-cols-1 md:grid-cols-2 gap-4"> |
| <div> |
| <label class="block text-xs font-bold text-gray-600 mb-1 italic">Anotações:</label> |
| <textarea x-model="prova.analise.anotacoes" class="w-full p-2 text-sm border rounded bg-white/80 h-20" placeholder="O que esta prova realmente confirma?"></textarea> |
| </div> |
| <div> |
| <label class="block text-xs font-bold text-red-700 mb-1 italic">Vulnerabilidades:</label> |
| <textarea x-model="prova.analise.vulnerabilidade" class="w-full p-2 text-sm border border-red-200 rounded bg-red-50/50 h-20" placeholder="Como a outra parte pode atacar esta prova?"></textarea> |
| </div> |
| </div> |
| </div> |
| </template> |
| </div> |
| </div> |
|
|
| |
| <div x-show="activeTab === 'holistica'" x-cloak> |
| <h2 class="text-2xl font-bold mb-6">Mosaico Probatório <span class="text-gray-400 text-sm font-normal">(Análise Conjunta)</span></h2> |
| <div class="mb-10 overflow-x-auto shadow-md rounded-lg"> |
| <table class="w-full text-left border-collapse"> |
| <thead class="bg-slate-800 text-white text-[10px] uppercase"> |
| <tr> |
| <th class="p-3">ID</th> |
| <th class="p-3 text-center">Cred.</th> |
| <th class="p-3 text-center">Mat.</th> |
| <th class="p-3 text-center">Aut.</th> |
| <th class="p-3 text-center">Subj.</th> |
| <th class="p-3">Força Epistêmica</th> |
| <th class="p-3">Risco de Refutação</th> |
| </tr> |
| </thead> |
| <tbody> |
| <template x-for="(prova, index) in dados.provas" :key="index"> |
| <tr class="text-xs border-b" :class="prova.analise.valida === 'invalida' ? 'bg-gray-100 line-through text-gray-400' : ''"> |
| <td class="p-3 font-bold" x-text="'P'+(index+1).toString().padStart(2,'0')"></td> |
| <td class="p-3 text-center font-bold" x-text="prova.analise.credibilidade"></td> |
| <td class="p-3 text-center" :class="prova.analise.relevancia.materialidade >7 ? 'text-green-600 font-bold' : ''" x-text="prova.analise.relevancia.materialidade"></td> |
| <td class="p-3 text-center" :class="prova.analise.relevancia.autoria >7 ? 'text-blue-600 font-bold' : ''" x-text="prova.analise.relevancia.autoria"></td> |
| <td class="p-3 text-center" :class="prova.analise.relevancia.subjetivo >7 ? 'text-purple-600 font-bold' : ''" x-text="prova.analise.relevancia.subjetivo"></td> |
| <td class="p-3 italic" x-text="prova.analise.anotacoes || '-'"></td> |
| <td class="p-3 text-red-500" x-text="prova.analise.vulnerabilidade || '-'"></td> |
| </tr> |
| </template> |
| </tbody> |
| </table> |
| </div> |
|
|
| |
| <div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8"> |
| <template x-for="varName in ['Materialidade', 'Autoria', 'Subjetivo']"> |
| <div class="p-4 bg-slate-50 border rounded-xl"> |
| <h4 class="text-xs font-black uppercase text-slate-500 mb-3" x-text="varName"></h4> |
| <div class="flex flex-wrap gap-2"> |
| <template x-for="(p, idx) in getProvasRelacionadas(varName)"> |
| <span class="bg-blue-600 text-white px-2 py-1 rounded text-[10px] font-bold" x-text="p"></span> |
| </template> |
| <span x-show="getProvasRelacionadas(varName).length ===0" class="text-red-500 text-xs italic">Sem provas suficientes</span> |
| </div> |
| </div> |
| </template> |
| </div> |
|
|
| |
| <div class="p-8 rounded-2xl border-2 shadow-inner" :class="dados.holistica.standardSuperado ? 'bg-green-50 border-green-200' : 'bg-red-50 border-red-200'"> |
| <h3 class="text-xl font-bold mb-4 flex items-center"> |
| <i class="fa-solid fa-gavel mr-3"></i> Conclusão sobre o Standard Probatório : Para Além da Dúvida Razoável: Mais de 85% </h3> |
| <div class="flex items-center mb-6"> |
| <input type="checkbox" id="checkStandard" x-model="dados.holistica.standardSuperado" class="w-8 h-8 rounded-lg text-green-600 cursor-pointer"> |
| <label for="checkStandard" class="ml-4 font-black text-lg cursor-pointer"> |
| O standard "Além da Dúvida Razoável" foi atingido? |
| </label> |
| </div> |
| <div> |
| <label class="block text-sm font-bold mb-2 uppercase">Síntese Justificada da Decisão:</label> |
| <textarea x-model="dados.holistica.justificativaStandard" placeholder="Exponha como o conjunto probatório confirma a tese escolhida e por que as dúvidas foram (ou não) superadas..." class="w-full p-4 border rounded-xl bg-white min-h-[150px] shadow-sm focus:ring-4 focus:ring-blue-100 outline-none"></textarea> |
| </div> |
| </div> |
| </div> |
|
|
| </div> |
| </main> |
|
|
| <footer class="container mx-auto mt-12 mb-8 p-6 text-center text-gray-400 border-t border-gray-200"> |
| <p class="text-xs">Sistema de Apoio à Análise Probatória Penal - RMCr2026 - www.profamr.app</p> |
| <p class="text-[10px] mt-1 font-mono uppercase tracking-widest">A ferramenta não substitui a valoração adequada do caso concreto, sob exclusiva responsabilidade do usuário.</p> |
| </footer> |
|
|
| <script> |
| function investigacaoApp() { |
| return { |
| activeTab: 'instrucoes', |
| tabs: [ |
| { id: 'instrucoes', name: 'Dashboard', icon: '<i class="fa-solid fa-chart-line mr-2"></i>' }, |
| { id: 'capa', name: 'Capa & Teses', icon: '<i class="fa-solid fa-folder-open mr-2"></i>' }, |
| { id: 'inventario', name: 'Inventário', icon: '<i class="fa-solid fa-list-check mr-2"></i>' }, |
| { id: 'atomica', name: 'Análise Atômica', icon: '<i class="fa-solid fa-microscope mr-2"></i>' }, |
| { id: 'holistica', name: 'Análise Holística', icon: '<i class="fa-solid fa-layer-group mr-2"></i>' } |
| ], |
| dados: { |
| capa: { numeroProcesso: '', orgao: '', fato: '', hipoteseAcusatoria: '', hipoteseDefensiva: '' }, |
| provas: [], |
| holistica: { justificativaStandard: '', standardSuperado: false } |
| }, |
| init() { |
| const saved = localStorage.getItem('invest_dedutiva_v3'); |
| if (saved) { |
| this.dados = JSON.parse(saved); |
| } |
| this.$watch('dados', val => localStorage.setItem('invest_dedutiva_v3', JSON.stringify(val))); |
| }, |
| addProva() { |
| this.dados.provas.push({ |
| tipo: 'Testemunhal', |
| descricao: '', |
| localizacao: '', |
| analise: { |
| valida: 'valida', |
| credibilidade:5, |
| relevancia: { materialidade:0, autoria:0, subjetivo:0 }, |
| anotacoes: '', |
| vulnerabilidade: '' |
| } |
| }); |
| }, |
| removeProva(index) { |
| if (confirm('Excluir esta prova removerá todas as análises ligadas a ela. Confirmar?')) { |
| this.dados.provas.splice(index,1); |
| } |
| }, |
| getProvasRelacionadas(campo) { |
| const key = campo === 'Materialidade' ? 'materialidade' : (campo === 'Autoria' ? 'autoria' : 'subjetivo'); |
| return this.dados.provas .filter(p => p.analise.valida === 'valida' && p.analise.relevancia[key] >=7) |
| .map((p, idx) => 'P' + (this.dados.provas.indexOf(p) +1).toString().padStart(2,'0')); |
| }, |
| exportarDados() { |
| const blob = new Blob([JSON.stringify(this.dados, null,2)], { type: "application/json" }); |
| const url = URL.createObjectURL(blob); |
| const link = document.createElement('a'); |
| link.href = url; |
| link.download = `RMCr_${this.dados.capa.numeroProcesso || 'ANALISE_JUDICIAL'}_2026.json`; |
| link.click(); |
| }, |
| limparDados() { |
| if (confirm('DESEJA APAGAR TUDO? Esta ação é irreversível e apagará todos os dados salvos localmente.')) { |
| localStorage.removeItem('invest_dedutiva_v3'); |
| window.location.reload(); |
| } |
| } |
| }; |
| } |
| </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-qwensite.hf.space/logo.svg" alt="qwensite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-qwensite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >QwenSite</a> - 🧬 <a href="https://enzostvs-qwensite.hf.space?remix=alexandremoraisdarosa/rmcr-gestor-prova-penal-v1-26b" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
| </html> |