provas / index.html
alexandremoraisdarosa's picture
Update index.html
3bcb6a3 verified
<!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 Fixo -->
<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">
<!-- Navegação -->
<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>
<!-- Conteúdo das Abas -->
<div class="bg-white p-8 rounded-b-xl shadow-lg border border-gray-200 min-h-[70vh]">
<!-- Aba: Dashboard -->
<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>
<!-- Aba: Capa -->
<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>
<!-- Aba: Inventário -->
<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>
<!-- Aba: Análise Atômica -->
<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>
<!-- Aba: Análise Holística -->
<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>
<!-- Checklist da Análise -->
<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>
<!-- Decisão do Standard -->
<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>