alexandremoraisdarosa commited on
Commit
381e428
·
verified ·
1 Parent(s): 9ec5a8b

Add 3 files

Browse files
Files changed (3) hide show
  1. README.md +6 -4
  2. index.html +1045 -19
  3. prompts.txt +1 -0
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Mapeamento Argumentos
3
- emoji: 🏃
4
  colorFrom: gray
5
- colorTo: gray
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: mapeamento-argumentos
3
+ emoji: ⚛️
4
  colorFrom: gray
5
+ colorTo: green
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - QwenSite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,1045 @@
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>Mapeamento de Argumentos - Processo Penal</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <script src="https://unpkg.com/[email protected]"></script>
9
+ <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
10
+ <script>
11
+ tailwind.config = {
12
+ theme: {
13
+ extend: {
14
+ colors: {
15
+ primary: '#2563eb',
16
+ secondary: '#475569',
17
+ danger: '#dc2626',
18
+ success: '#16a34a',
19
+ info: '#0891b2',
20
+ warning: '#d97706',
21
+ slate: {
22
+ 50: '#f8fafc',
23
+ 100: '#f1f5f9',
24
+ 200: '#e2e8f0',
25
+ 300: '#cbd5e1',
26
+ 400: '#94a3b8',
27
+ 500: '#64748b',
28
+ 600: '#475569',
29
+ 700: '#334155',
30
+ 800: '#1e293b',
31
+ 900: '#0f172a',
32
+ },
33
+ gradient: {
34
+ start: '#1e3c72',
35
+ end: '#2a5298'
36
+ }
37
+ }
38
+ }
39
+ }
40
+ }
41
+ </script>
42
+ <style>
43
+ .fade-in {
44
+ animation: fadeIn 0.5s ease-in;
45
+ }
46
+
47
+ @keyframes fadeIn {
48
+ from { opacity: 0; transform: translateY(10px); }
49
+ to { opacity: 1; transform: translateY(0); }
50
+ }
51
+
52
+ .card-hover {
53
+ transition: all 0.3s ease;
54
+ }
55
+
56
+ .card-hover:hover {
57
+ transform: translateY(-5px);
58
+ box-shadow: 0 15px 35px rgba(0, 0, 0, 0.1) !important;
59
+ }
60
+
61
+ .badge {
62
+ font-size: 0.75rem;
63
+ padding: 0.25rem 0.5rem;
64
+ border-radius: 9999px;
65
+ font-weight: 600;
66
+ }
67
+
68
+ .timeline::before {
69
+ content: '';
70
+ position: absolute;
71
+ left: 20px;
72
+ top: 0;
73
+ bottom: 0;
74
+ width: 2px;
75
+ background-color: #e2e8f0;
76
+ }
77
+
78
+ .timeline-item::before {
79
+ content: '';
80
+ position: absolute;
81
+ left: 17px;
82
+ top: 8px;
83
+ width: 8px;
84
+ height: 8px;
85
+ border-radius: 50%;
86
+ background-color: #2563eb;
87
+ border: 2px solid white;
88
+ box-shadow: 0 0 0 2px #2563eb;
89
+ }
90
+
91
+ .draggable {
92
+ cursor: grab;
93
+ }
94
+
95
+ .draggable:active {
96
+ cursor: grabbing;
97
+ }
98
+
99
+ .dropzone {
100
+ min-height: 60px;
101
+ border: 2px dashed #cbd5e1;
102
+ border-radius: 0.5rem;
103
+ padding: 1rem;
104
+ margin-bottom: 1rem;
105
+ }
106
+
107
+ .dropzone-active {
108
+ border-color: #2563eb;
109
+ background-color: #eff6ff;
110
+ }
111
+
112
+ .print-only {
113
+ display: none;
114
+ }
115
+
116
+ @media print {
117
+ .no-print, .sidebar, .export-buttons {
118
+ display: none !important;
119
+ }
120
+
121
+ .print-only {
122
+ display: block !important;
123
+ }
124
+
125
+ .main-content {
126
+ grid-template-columns: 1fr !important;
127
+ }
128
+
129
+ body {
130
+ background: white !important;
131
+ }
132
+
133
+ .container {
134
+ box-shadow: none !important;
135
+ border-radius: 0 !important;
136
+ }
137
+ }
138
+ </style>
139
+ </head>
140
+ <body class="bg-gradient-to-br from-gradient-start to-gradient-end min-h-screen">
141
+ <div class="container max-w-7xl mx-auto bg-white shadow-2xl rounded-2xl overflow-hidden">
142
+ <!-- Cabeçalho -->
143
+ <header class="bg-slate-800 text-white p-8 text-center">
144
+ <h1 class="text-3xl md:text-4xl font-bold mb-2 flex items-center justify-center gap-3">
145
+ <i class="fas fa-balance-scale"></i>
146
+ Mapeamento de Argumentos - Processo Penal
147
+ </h1>
148
+ <p class="text-slate-300 text-sm md:text-base">
149
+ Ferramenta avançada para estruturação lógica de teses penais e processuais penais
150
+ </p>
151
+ </header>
152
+
153
+ <div class="main-content grid md:grid-cols-12 gap-0 min-h-[calc(100vh-180px)]">
154
+ <!-- Sidebar -->
155
+ <div class="sidebar col-span-3 bg-slate-50 p-6 border-r border-slate-200 overflow-y-auto h-[calc(100vh-140px)]">
156
+ <!-- Informações do Caso -->
157
+ <div class="form-section mb-8">
158
+ <h3 class="text-lg font-semibold text-slate-700 mb-4 flex items-center gap-2">
159
+ <i class="fas fa-folder-open text-primary"></i>
160
+ Informações do Caso
161
+ </h3>
162
+
163
+ <div class="space-y-4">
164
+ <div>
165
+ <label class="block text-xs font-semibold text-slate-600 mb-1">Tipo de Peça</label>
166
+ <select id="tipoPeca" class="w-full p-3 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent text-sm">
167
+ <option value="">Selecione...</option>
168
+ <option value="denuncia">Denúncia</option>
169
+ <option value="defesa">Defesa Prévia</option>
170
+ <option value="alegacoes">Alegações Finais</option>
171
+ <option value="recurso">Recurso</option>
172
+ <option value="habeas">Habeas Corpus</option>
173
+ <option value="parecer">Parecer</option>
174
+ </select>
175
+ </div>
176
+
177
+ <div>
178
+ <label class="block text-xs font-semibold text-slate-600 mb-1">Tipo Penal</label>
179
+ <input type="text" id="tipoPenal" class="w-full p-3 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent text-sm" placeholder="Ex: Art. 155, CP - Furto">
180
+ </div>
181
+
182
+ <div>
183
+ <label class="block text-xs font-semibold text-slate-600 mb-1">Réu/Investigado</label>
184
+ <input type="text" id="reu" class="w-full p-3 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent text-sm" placeholder="Nome do réu">
185
+ </div>
186
+
187
+ <div>
188
+ <label class="block text-xs font-semibold text-slate-600 mb-1">Comarca/Tribunal</label>
189
+ <input type="text" id="comarca" class="w-full p-3 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent text-sm" placeholder="Ex: 1ª Vara Criminal de São Paulo">
190
+ </div>
191
+ </div>
192
+ </div>
193
+
194
+ <!-- Tese Central -->
195
+ <div class="form-section mb-8">
196
+ <h3 class="text-lg font-semibold text-slate-700 mb-4 flex items-center gap-2">
197
+ <i class="fas fa-flask text-primary"></i>
198
+ Tese Central
199
+ </h3>
200
+
201
+ <div class="space-y-3">
202
+ <textarea id="teseCentral" class="w-full p-3 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent text-sm min-h-24" placeholder="Digite a tese central que será defendida..."></textarea>
203
+ <button onclick="adicionarTese()" class="w-full bg-primary hover:bg-blue-700 text-white font-semibold py-3 px-4 rounded-lg transition-colors flex items-center justify-center gap-2">
204
+ <i class="fas fa-plus"></i>
205
+ Atualizar Tese Central
206
+ </button>
207
+ </div>
208
+ </div>
209
+
210
+ <!-- Adicionar Argumento -->
211
+ <div class="form-section mb-8">
212
+ <h3 class="text-lg font-semibold text-slate-700 mb-4 flex items-center gap-2">
213
+ <i class="fas fa-book text-primary"></i>
214
+ Adicionar Argumento
215
+ </h3>
216
+
217
+ <div class="space-y-3">
218
+ <div>
219
+ <label class="block text-xs font-semibold text-slate-600 mb-1">Tipo de Argumento</label>
220
+ <select id="tipoArgumento" class="w-full p-3 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent text-sm">
221
+ <option value="normativo">Normativo</option>
222
+ <option value="jurisprudencial">Jurisprudencial</option>
223
+ <option value="doutrinario">Doutrinário</option>
224
+ <option value="teleologico">Teleol��gico</option>
225
+ <option value="sistematico">Sistemático</option>
226
+ <option value="historico">Histórico</option>
227
+ </select>
228
+ </div>
229
+
230
+ <div>
231
+ <label class="block text-xs font-semibold text-slate-600 mb-1">Título</label>
232
+ <input type="text" id="tituloArgumento" class="w-full p-3 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent text-sm" placeholder="Ex: Princípio da Insignificância">
233
+ </div>
234
+
235
+ <div>
236
+ <label class="block text-xs font-semibold text-slate-600 mb-1">Fundamento</label>
237
+ <textarea id="fundamentoArgumento" class="w-full p-3 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent text-sm min-h-16" placeholder="Descreva o fundamento do argumento..."></textarea>
238
+ </div>
239
+
240
+ <button onclick="adicionarArgumento()" class="w-full bg-primary hover:bg-blue-700 text-white font-semibold py-3 px-4 rounded-lg transition-colors flex items-center justify-center gap-2">
241
+ <i class="fas fa-plus"></i>
242
+ Adicionar Argumento
243
+ </button>
244
+ </div>
245
+ </div>
246
+
247
+ <!-- Contra-Argumento -->
248
+ <div class="form-section mb-8">
249
+ <h3 class="text-lg font-semibold text-slate-700 mb-4 flex items-center gap-2">
250
+ <i class="fas fa-exclamation-triangle text-primary"></i>
251
+ Contra-Argumento
252
+ </h3>
253
+
254
+ <div class="space-y-3">
255
+ <div>
256
+ <label class="block text-xs font-semibold text-slate-600 mb-1">Objeção</label>
257
+ <textarea id="contraArgumento" class="w-full p-3 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent text-sm min-h-16" placeholder="Digite o contra-argumento..."></textarea>
258
+ </div>
259
+
260
+ <div>
261
+ <label class="block text-xs font-semibold text-slate-600 mb-1">Refutação</label>
262
+ <textarea id="refutacao" class="w-full p-3 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent text-sm min-h-16" placeholder="Digite a refutação ao contra-argumento..."></textarea>
263
+ </div>
264
+
265
+ <button onclick="adicionarContraArgumento()" class="w-full bg-warning hover:bg-yellow-600 text-white font-semibold py-3 px-4 rounded-lg transition-colors flex items-center justify-center gap-2">
266
+ <i class="fas fa-plus"></i>
267
+ Adicionar Contra-Argumento
268
+ </button>
269
+ </div>
270
+ </div>
271
+
272
+ <!-- Precedente -->
273
+ <div class="form-section mb-8">
274
+ <h3 class="text-lg font-semibold text-slate-700 mb-4 flex items-center gap-2">
275
+ <i class="fas fa-gavel text-primary"></i>
276
+ Precedente
277
+ </h3>
278
+
279
+ <div class="space-y-3">
280
+ <div>
281
+ <label class="block text-xs font-semibold text-slate-600 mb-1">Tribunal</label>
282
+ <input type="text" id="tribunal" class="w-full p-3 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent text-sm" placeholder="Ex: STF, STJ, TJSP">
283
+ </div>
284
+
285
+ <div>
286
+ <label class="block text-xs font-semibold text-slate-600 mb-1">Número do Processo</label>
287
+ <input type="text" id="numeroProcesso" class="w-full p-3 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent text-sm" placeholder="Ex: HC 123.456">
288
+ </div>
289
+
290
+ <div>
291
+ <label class="block text-xs font-semibold text-slate-600 mb-1">Relator</label>
292
+ <input type="text" id="relator" class="w-full p-3 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent text-sm" placeholder="Ex: Min. Gilmar Mendes">
293
+ </div>
294
+
295
+ <div>
296
+ <label class="block text-xs font-semibold text-slate-600 mb-1">Data</label>
297
+ <input type="text" id="dataPrecedente" class="w-full p-3 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent text-sm" placeholder="Ex: 15/03/2024">
298
+ </div>
299
+
300
+ <div>
301
+ <label class="block text-xs font-semibold text-slate-600 mb-1">Ementa/Ratio Decidendi</label>
302
+ <textarea id="ementa" class="w-full p-3 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent text-sm min-h-16" placeholder="Resumo da decisão..."></textarea>
303
+ </div>
304
+
305
+ <button onclick="adicionarPrecedente()" class="w-full bg-primary hover:bg-blue-700 text-white font-semibold py-3 px-4 rounded-lg transition-colors flex items-center justify-center gap-2">
306
+ <i class="fas fa-plus"></i>
307
+ Adicionar Precedente
308
+ </button>
309
+ </div>
310
+ </div>
311
+
312
+ <!-- Exportar/Importar -->
313
+ <div class="export-buttons space-y-2">
314
+ <button onclick="exportarPDF()" class="w-full bg-info text-white hover:bg-cyan-600 font-semibold py-3 px-4 rounded-lg transition-colors flex items-center justify-center gap-2">
315
+ <i class="fas fa-file-pdf"></i>
316
+ Exportar PDF
317
+ </button>
318
+
319
+ <button onclick="exportarJSON()" class="w-full bg-success text-white hover:bg-green-600 font-semibold py-3 px-4 rounded-lg transition-colors flex items-center justify-center gap-2">
320
+ <i class="fas fa-file-export"></i>
321
+ Salvar JSON
322
+ </button>
323
+
324
+ <button onclick="importarJSON()" class="w-full bg-secondary text-white hover:bg-slate-600 font-semibold py-3 px-4 rounded-lg transition-colors flex items-center justify-center gap-2">
325
+ <i class="fas fa-file-import"></i>
326
+ Carregar JSON
327
+ </button>
328
+
329
+ <button onclick="limparTudo()" class="w-full bg-danger text-white hover:bg-red-700 font-semibold py-3 px-4 rounded-lg transition-colors flex items-center justify-center gap-2">
330
+ <i class="fas fa-trash"></i>
331
+ Limpar Tudo
332
+ </button>
333
+ </div>
334
+ </div>
335
+
336
+ <!-- Área de Saída -->
337
+ <div class="output-area col-span-9 p-8 bg-white overflow-y-auto h-[calc(100vh-140px)]">
338
+ <div id="outputArea" class="space-y-8"></div>
339
+
340
+ <div class="print-only text-center mt-12 text-sm text-slate-500">
341
+ Documento gerado em: <span id="dataGeracao"></span>
342
+ </div>
343
+ </div>
344
+ </div>
345
+ </div>
346
+
347
+ <!-- Para importação de JSON -->
348
+ <input type="file" id="fileInput" class="hidden" accept=".json">
349
+
350
+ <script>
351
+ let dados = {
352
+ id: 1,
353
+ tipoPeca: '',
354
+ tipoPenal: '',
355
+ reu: '',
356
+ comarca: '',
357
+ teseCentral: '',
358
+ argumentos: [],
359
+ contraArgumentos: [],
360
+ precedentes: []
361
+ };
362
+
363
+ // Adicionar Tese Central
364
+ window.adicionarTese = function() {
365
+ const tese = document.getElementById('teseCentral').value.trim();
366
+ if (!tese) {
367
+ alert('Por favor, insira uma tese central.');
368
+ return;
369
+ }
370
+
371
+ dados.teseCentral = tese;
372
+ dados.tipoPeca = document.getElementById('tipoPeca').value;
373
+ dados.tipoPenal = document.getElementById('tipoPenal').value;
374
+ dados.reu = document.getElementById('reu').value;
375
+ dados.comarca = document.getElementById('comarca').value;
376
+
377
+ renderizar();
378
+ showNotification('Tese central atualizada com sucesso!', 'success');
379
+ };
380
+
381
+ // Adicionar Argumento
382
+ window.adicionarArgumento = function() {
383
+ const tipo = document.getElementById('tipoArgumento').value;
384
+ const titulo = document.getElementById('tituloArgumento').value.trim();
385
+ const fundamento = document.getElementById('fundamentoArgumento').value.trim();
386
+
387
+ if (!titulo || !fundamento) {
388
+ showNotification('Preencha todos os campos do argumento', 'error');
389
+ return;
390
+ }
391
+
392
+ dados.argumentos.push({
393
+ id: Date.now(),
394
+ tipo: tipo,
395
+ titulo: titulo,
396
+ fundamento: fundamento
397
+ });
398
+
399
+ // Limpar formulário
400
+ document.getElementById('tituloArgumento').value = '';
401
+ document.getElementById('fundamentoArgumento').value = '';
402
+
403
+ renderizar();
404
+ showNotification('Argumento adicionado com sucesso!', 'success');
405
+ };
406
+
407
+ // Adicionar Contra-Argumento
408
+ window.adicionarContraArgumento = function() {
409
+ const contra = document.getElementById('contraArgumento').value.trim();
410
+ const refutacao = document.getElementById('refutacao').value.trim();
411
+
412
+ if (!contra || !refutacao) {
413
+ showNotification('Preencha tanto o contra-argumento quanto a refutação', 'error');
414
+ return;
415
+ }
416
+
417
+ dados.contraArgumentos.push({
418
+ id: Date.now(),
419
+ contraArgumento: contra,
420
+ refutacao: refutacao
421
+ });
422
+
423
+ document.getElementById('contraArgumento').value = '';
424
+ document.getElementById('refutacao').value = '';
425
+
426
+ renderizar();
427
+ showNotification('Contra-argumento adicionado com sucesso!', 'success');
428
+ };
429
+
430
+ // Adicionar Precedente
431
+ window.adicionarPrecedente = function() {
432
+ const tribunal = document.getElementById('tribunal').value.trim();
433
+ const numero = document.getElementById('numeroProcesso').value.trim();
434
+ const ementa = document.getElementById('ementa').value.trim();
435
+
436
+ if (!tribunal || !numero || !ementa) {
437
+ showNotification('Preencha pelo menos o tribunal, número do processo e ementa', 'error');
438
+ return;
439
+ }
440
+
441
+ dados.precedentes.push({
442
+ id: Date.now(),
443
+ tribunal: tribunal,
444
+ numero: numero,
445
+ relator: document.getElementById('relator').value,
446
+ data: document.getElementById('dataPrecedente').value,
447
+ ementa: ementa
448
+ });
449
+
450
+ document.getElementById('tribunal').value = '';
451
+ document.getElementById('numeroProcesso').value = '';
452
+ document.getElementById('relator').value = '';
453
+ document.getElementById('dataPrecedente').value = '';
454
+ document.getElementById('ementa').value = '';
455
+
456
+ renderizar();
457
+ showNotification('Precedente adicionado com sucesso!', 'success');
458
+ };
459
+
460
+ // Remover Argumento
461
+ window.removerArgumento = function(id) {
462
+ if (confirm('Tem certeza que deseja remover este argumento?')) {
463
+ dados.argumentos = dados.argumentos.filter(arg => arg.id !== id);
464
+ renderizar();
465
+ showNotification('Argumento removido com sucesso!', 'success');
466
+ }
467
+ };
468
+
469
+ // Remover Contra-Argumento
470
+ window.removerContraArgumento = function(id) {
471
+ if (confirm('Tem certeza que deseja remover este contra-argumento?')) {
472
+ dados.contraArgumentos = dados.contraArgumentos.filter(contra => contra.id !== id);
473
+ renderizar();
474
+ showNotification('Contra-argumento removido com sucesso!', 'success');
475
+ }
476
+ };
477
+
478
+ // Remover Precedente
479
+ window.removerPrecedente = function(id) {
480
+ if (confirm('Tem certeza que deseja remover este precedente?')) {
481
+ dados.precedentes = dados.precedentes.filter(prec => prec.id !== id);
482
+ renderizar();
483
+ showNotification('Precedente removido com sucesso!', 'success');
484
+ }
485
+ };
486
+
487
+ // Editar Argumento
488
+ window.editarArgumento = function(id) {
489
+ const argumento = dados.argumentos.find(arg => arg.id === id);
490
+ if (!argumento) return;
491
+
492
+ const novoTitulo = prompt('Editar título:', argumento.titulo);
493
+ if (novoTitulo === null) return;
494
+
495
+ const novaFundamentacao = prompt('Editar fundamentação:', argumento.fundamento);
496
+ if (novaFundamentacao === null) return;
497
+
498
+ argumento.titulo = novoTitulo;
499
+ argumento.fundamento = novaFundamentacao;
500
+
501
+ renderizar();
502
+ showNotification('Argumento atualizado com sucesso!', 'success');
503
+ };
504
+
505
+ // Exportar PDF
506
+ window.exportarPDF = function() {
507
+ // Atualizar data de geração
508
+ document.getElementById('dataGeracao').textContent = new Date().toLocaleDateString('pt-BR');
509
+
510
+ // Imprimir
511
+ window.print();
512
+ };
513
+
514
+ // Exportar JSON
515
+ window.exportarJSON = function() {
516
+ const dataStr = JSON.stringify(dados, null, 2);
517
+ const dataBlob = new Blob([dataStr], {type: 'application/json'});
518
+ const url = URL.createObjectURL(dataBlob);
519
+ const link = document.createElement('a');
520
+ link.href = url;
521
+ link.download = `mapeamento_argumentos_${new Date().toISOString().split('T')[0]}.json`;
522
+ link.click();
523
+
524
+ showNotification('Arquivo JSON salvo com sucesso!', 'success');
525
+ };
526
+
527
+ // Importar JSON
528
+ window.importarJSON = function() {
529
+ document.getElementById('fileInput').click();
530
+ };
531
+
532
+ // Limpar Tudo
533
+ window.limparTudo = function() {
534
+ if (confirm('Tem certeza que deseja limpar todos os dados? Esta ação não pode ser desfeita.')) {
535
+ dados = {
536
+ id: 1,
537
+ tipoPeca: '',
538
+ tipoPenal: '',
539
+ reu: '',
540
+ comarca: '',
541
+ teseCentral: '',
542
+ argumentos: [],
543
+ contraArgumentos: [],
544
+ precedentes: []
545
+ };
546
+
547
+ // Limpar todos os campos do formulário
548
+ document.getElementById('tipoPeca').value = '';
549
+ document.getElementById('tipoPenal').value = '';
550
+ document.getElementById('reu').value = '';
551
+ document.getElementById('comarca').value = '';
552
+ document.getElementById('teseCentral').value = '';
553
+ document.getElementById('tituloArgumento').value = '';
554
+ document.getElementById('fundamentoArgumento').value = '';
555
+ document.getElementById('contraArgumento').value = '';
556
+ document.getElementById('refutacao').value = '';
557
+ document.getElementById('tribunal').value = '';
558
+ document.getElementById('numeroProcesso').value = '';
559
+ document.getElementById('relator').value = '';
560
+ document.getElementById('dataPrecedente').value = '';
561
+ document.getElementById('ementa').value = '';
562
+
563
+ renderizar();
564
+ showNotification('Todos os dados foram limpos com sucesso!', 'success');
565
+ }
566
+ };
567
+
568
+ // Função para renderizar o conteúdo
569
+ function renderizar() {
570
+ const output = document.getElementById('outputArea');
571
+
572
+ // Se não houver dados, mostrar estado vazio
573
+ if (!dados.teseCentral && dados.argumentos.length === 0 &&
574
+ dados.contraArgumentos.length === 0 && dados.precedentes.length === 0) {
575
+ output.innerHTML = `
576
+ <div class="flex flex-col items-center justify-center py-20 text-center space-y-4">
577
+ <i class="fas fa-folder-open text-slate-300 text-6xl"></i>
578
+ <h3 class="text-xl font-semibold text-slate-500">Nenhum mapeamento criado</h3>
579
+ <p class="text-slate-400 max-w-md">Preencha os campos ao lado para começar a estruturar seus argumentos jurídicos</p>
580
+ <div class="flex flex-wrap justify-center gap-2 mt-4 text-xs text-slate-400">
581
+ <span class="bg-slate-100 px-3 py-1 rounded-full">Tese Central</span>
582
+ <span class="bg-slate-100 px-3 py-1 rounded-full">Argumentos</span>
583
+ <span class="bg-slate-100 px-3 py-1 rounded-full">Contra-argumentos</span>
584
+ <span class="bg-slate-100 px-3 py-1 rounded-full">Precedentes</span>
585
+ </div>
586
+ </div>
587
+ `;
588
+ return;
589
+ }
590
+
591
+ // Montar o conteúdo
592
+ let html = '';
593
+
594
+ // Informações do caso
595
+ if (dados.tipoPeca || dados.tipoPenal || dados.reu || dados.comarca) {
596
+ html += `
597
+ <div class="bg-slate-50 border-l-4 border-primary p-6 rounded-r-lg mb-8">
598
+ <h4 class="font-semibold text-slate-700 mb-3 flex items-center gap-2">
599
+ <i class="fas fa-folder-open text-primary"></i>
600
+ INFORMAÇÕES DO CASO
601
+ </h4>
602
+ <div class="grid md:grid-cols-2 gap-3 text-sm">
603
+ `;
604
+
605
+ if (dados.tipoPeca) {
606
+ html += `<div><span class="font-medium">Tipo de Peça:</span> ${getNomePeca(dados.tipoPeca)}</div>`;
607
+ }
608
+ if (dados.tipoPenal) {
609
+ html += `<div><span class="font-medium">Tipo Penal:</span> ${dados.tipoPenal}</div>`;
610
+ }
611
+ if (dados.reu) {
612
+ html += `<div><span class="font-medium">Réu/Investigado:</span> ${dados.reu}</div>`;
613
+ }
614
+ if (dados.comarca) {
615
+ html += `<div><span class="font-medium">Comarca/Tribunal:</span> ${dados.comarca}</div>`;
616
+ }
617
+
618
+ html += `
619
+ </div>
620
+ </div>
621
+ `;
622
+ }
623
+
624
+ // Tese Central
625
+ if (dados.teseCentral) {
626
+ html += `
627
+ <div class="bg-gradient-to-r from-danger to-red-600 text-white p-8 rounded-xl mb-8 card-hover fade-in">
628
+ <div class="flex items-start justify-between">
629
+ <div class="flex-1">
630
+ <h2 class="text-2xl font-bold mb-3 flex items-center gap-3">
631
+ <i class="fas fa-flask"></i>
632
+ TESE CENTRAL
633
+ </h2>
634
+ <p class="text-lg leading-relaxed">${dados.teseCentral}</p>
635
+ </div>
636
+ </div>
637
+ </div>
638
+ `;
639
+ }
640
+
641
+ // Argumentos
642
+ if (dados.argumentos.length > 0) {
643
+ html += `
644
+ <div class="mb-8">
645
+ <h3 class="text-2xl font-bold text-slate-700 mb-6 flex items-center gap-3">
646
+ <i class="fas fa-book-reader text-primary"></i>
647
+ ARGUMENTOS
648
+ </h3>
649
+ <div class="grid gap-4 md:grid-cols-2">
650
+ `;
651
+
652
+ dados.argumentos.forEach(arg => {
653
+ const badgeColor = getBadgeColor(arg.tipo);
654
+ html += `
655
+ <div class="bg-white border border-slate-200 rounded-lg p-5 shadow-sm card-hover group hover:shadow-md fade-in">
656
+ <div class="flex justify-between items-start mb-3">
657
+ <span class="badge ${badgeColor} flex items-center gap-1">
658
+ <i class="fas ${getIconForTipo(arg.tipo)} text-xs"></i>
659
+ ${arg.tipo.toUpperCase()}
660
+ </span>
661
+ <div class="flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity">
662
+ <button onclick="editarArgumento(${arg.id})" class="p-1 text-slate-500 hover:text-primary text-sm" title="Editar">
663
+ <i class="fas fa-edit"></i>
664
+ </button>
665
+ <button onclick="removerArgumento(${arg.id})" class="p-1 text-slate-500 hover:text-danger text-sm" title="Remover">
666
+ <i class="fas fa-trash"></i>
667
+ </button>
668
+ </div>
669
+ </div>
670
+ <h4 class="font-semibold text-slate-700 mb-2">${arg.titulo}</h4>
671
+ <p class="text-slate-600 text-sm leading-relaxed">${arg.fundamento}</p>
672
+ </div>
673
+ `;
674
+ });
675
+
676
+ html += `
677
+ </div>
678
+ </div>
679
+ `;
680
+ }
681
+
682
+ // Precedentes
683
+ if (dados.precedentes.length > 0) {
684
+ html += `
685
+ <div class="mb-8">
686
+ <h3 class="text-2xl font-bold text-slate-700 mb-6 flex items-center gap-3">
687
+ <i class="fas fa-gavel text-primary"></i>
688
+ PRECEDENTES JURISPRUDENCIAIS
689
+ </h3>
690
+ <div class="bg-white rounded-lg shadow overflow-hidden">
691
+ <table class="min-w-full divide-y divide-slate-200">
692
+ <thead class="bg-slate-50">
693
+ <tr>
694
+ <th class="px-6 py-3 text-left text-xs font-medium text-slate-500 uppercase tracking-wider">Tribunal / Processo</th>
695
+ <th class="px-6 py-3 text-left text-xs font-medium text-slate-500 uppercase tracking-wider">Relator / Data</th>
696
+ <th class="px-6 py-3 text-left text-xs font-medium text-slate-500 uppercase tracking-wider">Decisão</th>
697
+ <th class="px-6 py-3 text-left text-xs font-medium text-slate-500 uppercase tracking-wider">Ações</th>
698
+ </tr>
699
+ </thead>
700
+ <tbody class="bg-white divide-y divide-slate-200">
701
+ `;
702
+
703
+ dados.precedentes.forEach(prec => {
704
+ html += `
705
+ <tr class="hover:bg-slate-50 transition-colors">
706
+ <td class="px-6 py-4">
707
+ <div class="font-semibold text-slate-700">${prec.tribunal}</div>
708
+ <div class="text-sm text-slate-500">${prec.numero}</div>
709
+ </td>
710
+ <td class="px-6 py-4">
711
+ <div class="text-slate-700">${prec.relator}</div>
712
+ <div class="text-sm text-slate-500">${prec.data}</div>
713
+ </td>
714
+ <td class="px-6 py-4 text-sm text-slate-600">${prec.ementa}</td>
715
+ <td class="px-6 py-4 whitespace-nowrap">
716
+ <button onclick="removerPrecedente(${prec.id})" class="text-danger hover:text-red-700 transition-colors">
717
+ <i class="fas fa-trash"></i>
718
+ </button>
719
+ </td>
720
+ </tr>
721
+ `;
722
+ });
723
+
724
+ html += `
725
+ </tbody>
726
+ </table>
727
+ </div>
728
+ </div>
729
+ `;
730
+ }
731
+
732
+ // Contra-argumentos e Refutações
733
+ if (dados.contraArgumentos.length > 0) {
734
+ html += `
735
+ <div class="mb-8">
736
+ <h3 class="text-2xl font-bold text-slate-700 mb-6 flex items-center gap-3">
737
+ <i class="fas fa-balance-scale-right text-primary"></i>
738
+ CONTRA-ARGUMENTOS E REFUTAÇÕES
739
+ </h3>
740
+ <div class="space-y-6">
741
+ `;
742
+
743
+ dados.contraArgumentos.forEach(contra => {
744
+ html += `
745
+ <!-- Contra-argumento -->
746
+ <div class="bg-amber-50 border-l-4 border-amber-500 p-5 rounded-r-lg">
747
+ <div class="flex justify-between items-start mb-2">
748
+ <h4 class="font-semibold text-amber-800 flex items-center gap-2">
749
+ <i class="fas fa-exclamation-triangle"></i>
750
+ CONTRA-ARGUMENTO
751
+ </h4>
752
+ <button onclick="removerContraArgumento(${contra.id})" class="text-amber-500 hover:text-amber-700">
753
+ <i class="fas fa-trash"></i>
754
+ </button>
755
+ </div>
756
+ <p class="text-amber-700">${contra.contraArgumento}</p>
757
+ </div>
758
+
759
+ <!-- Refutação -->
760
+ <div class="bg-emerald-50 border-l-4 border-emerald-500 p-5 rounded-r-lg">
761
+ <h4 class="font-semibold text-emerald-800 flex items-center gap-2 mb-2">
762
+ <i class="fas fa-check-circle"></i>
763
+ REFUTAÇÃO
764
+ </h4>
765
+ <p class="text-emerald-700">${contra.refutacao}</p>
766
+ </div>
767
+ `;
768
+ });
769
+
770
+ html += `
771
+ </div>
772
+ </div>
773
+ `;
774
+ }
775
+
776
+ // Silogismo Jurídico
777
+ const argumentosNormativos = dados.argumentos.filter(a => a.tipo === 'normativo');
778
+ if (argumentosNormativos.length > 0 && dados.teseCentral) {
779
+ html += `
780
+ <div class="mb-8">
781
+ <h3 class="text-2xl font-bold text-slate-700 mb-6 flex items-center gap-3">
782
+ <i class="fas fa-atom text-primary"></i>
783
+ SILOGISMO JURÍDICO
784
+ </h3>
785
+ <div class="bg-slate-50 rounded-xl p-6 border border-slate-200">
786
+ <div class="grid md:grid-cols-12 gap-4">
787
+ `;
788
+
789
+ // Premissa Maior
790
+ html += `
791
+ <div class="md:col-span-4">
792
+ <div class="bg-white border-l-4 border-blue-500 p-4 rounded-lg h-full">
793
+ <h4 class="font-bold text-blue-700 mb-3 flex items-center gap-2">
794
+ <i class="fas fa-cube"></i>
795
+ PREMISSA MAIOR
796
+ <div class="ml-auto text-xs bg-blue-100 text-blue-700 px-2 py-1 rounded">
797
+ Norma
798
+ </div>
799
+ </h4>
800
+ `;
801
+
802
+ argumentosNormativos.forEach(arg => {
803
+ html += `<p class="text-sm mb-2 text-blue-700"><strong>${arg.titulo}:</strong> ${arg.fundamento}</p>`;
804
+ });
805
+
806
+ html += `
807
+ </div>
808
+ </div>
809
+ `;
810
+
811
+ // Premissa Menor
812
+ html += `
813
+ <div class="md:col-span-4 flex items-center justify-center">
814
+ <div class="text-4xl text-slate-400">
815
+ <i class="fas fa-arrow-right"></i>
816
+ </div>
817
+ </div>
818
+
819
+ <div class="md:col-span-4">
820
+ <div class="bg-white border-l-4 border-green-500 p-4 rounded-lg h-full">
821
+ <h4 class="font-bold text-green-700 mb-3 flex items-center gap-2">
822
+ <i class="fas fa-file-contract"></i>
823
+ PREMISSA MENOR
824
+ <div class="ml-auto text-xs bg-green-100 text-green-700 px-2 py-1 rounded">
825
+ Fato
826
+ </div>
827
+ </h4>
828
+ <p class="text-sm text-green-700">Aplicável ao caso concreto conforme a tese apresentada</p>
829
+ </div>
830
+ </div>
831
+
832
+ <div class="md:col-span-12 flex items-center justify-center mt-4">
833
+ <div class="text-4xl text-slate-400">
834
+ <i class="fas fa-long-arrow-alt-down"></i>
835
+ </div>
836
+ </div>
837
+
838
+ <div class="md:col-span-12">
839
+ <div class="bg-white border-l-4 border-purple-500 p-5 rounded-lg">
840
+ <h4 class="font-bold text-purple-700 mb-3 flex items-center gap-2">
841
+ <i class="fas fa-lightbulb"></i>
842
+ CONCLUSÃO
843
+ <div class="ml-auto text-xs bg-purple-100 text-purple-700 px-2 py-1 rounded">
844
+ Resultado
845
+ </div>
846
+ </h4>
847
+ <p class="text-lg font-semibold text-purple-700">${dados.teseCentral}</p>
848
+ </div>
849
+ </div>
850
+ `;
851
+
852
+ html += `
853
+ </div>
854
+ </div>
855
+ </div>
856
+ `;
857
+ }
858
+
859
+ // Mapa de Argumentos
860
+ if (dados.argumentos.length > 0) {
861
+ html += `
862
+ <div class="mb-8">
863
+ <h3 class="text-2xl font-bold text-slate-700 mb-6 flex items-center gap-3">
864
+ <i class="fas fa-sitemap text-primary"></i>
865
+ MAPA DE ARGUMENTOS
866
+ </h3>
867
+ <div class="bg-white rounded-xl p-6 border border-slate-200 relative">
868
+ <div class="timeline ml-7 space-y-12">
869
+ `;
870
+
871
+ // Agrupar argumentos por tipo
872
+ const tipos = ['normativo', 'jurisprudencial', 'doutrinario', 'teleologico', 'sistematico', 'historico'];
873
+ const nomesTipos = {
874
+ 'normativo': 'Normativo',
875
+ 'jurisprudencial': 'Jurisprudencial',
876
+ 'doutrinario': 'Doutrinário',
877
+ 'teleologico': 'Teleológico',
878
+ 'sistematico': 'Sistemático',
879
+ 'historico': 'Histórico'
880
+ };
881
+
882
+ tipos.forEach(tipo => {
883
+ const argsDoTipo = dados.argumentos.filter(arg => arg.tipo === tipo);
884
+ if (argsDoTipo.length > 0) {
885
+ html += `
886
+ <div class="timeline-item ml-6">
887
+ <div class="bg-white border-2 border-${getBadgeColor(tipo).split('-')[1]} rounded-lg p-4 hover:shadow-md transition-shadow">
888
+ <h4 class="font-bold text-${getBadgeColor(tipo).split('-')[1]}-700 flex items-center gap-2 mb-3">
889
+ <i class="fas ${getIconForTipo(tipo)}"></i>
890
+ ${nomesTipos[tipo]} (${argsDoTipo.length})
891
+ </h4>
892
+ <div class="space-y-2">
893
+ `;
894
+
895
+ argsDoTipo.forEach(arg => {
896
+ html += `<div class="text-sm text-slate-700 flex items-start gap-2"><i class="fas fa-dot-circle text-${getBadgeColor(tipo).split('-')[1]} text-xs mt-1.5"></i> ${arg.titulo}</div>`;
897
+ });
898
+
899
+ html += `
900
+ </div>
901
+ </div>
902
+ </div>
903
+ `;
904
+ }
905
+ });
906
+
907
+ html += `
908
+ </div>
909
+ </div>
910
+ </div>
911
+ `;
912
+ }
913
+
914
+ output.innerHTML = html;
915
+ }
916
+
917
+ // Função para obter o nome da peça
918
+ function getNomePeca(tipo) {
919
+ const nomes = {
920
+ 'denuncia': 'Denúncia',
921
+ 'defesa': 'Defesa Prévia',
922
+ 'alegacoes': 'Alegações Finais',
923
+ 'recurso': 'Recurso',
924
+ 'habeas': 'Habeas Corpus',
925
+ 'parecer': 'Parecer'
926
+ };
927
+ return nomes[tipo] || tipo;
928
+ }
929
+
930
+ // Função para obter a cor do badge
931
+ function getBadgeColor(tipo) {
932
+ const cores = {
933
+ 'normativo': 'bg-blue-100 text-blue-800 border border-blue-200',
934
+ 'jurisprudencial': 'bg-cyan-100 text-cyan-800 border border-cyan-200',
935
+ 'doutrinario': 'bg-purple-100 text-purple-800 border border-purple-200',
936
+ 'teleologico': 'bg-amber-100 text-amber-800 border border-amber-200',
937
+ 'sistematico': 'bg-pink-100 text-pink-800 border border-pink-200',
938
+ 'historico': 'bg-teal-100 text-teal-800 border border-teal-200'
939
+ };
940
+ return cores[tipo] || 'bg-gray-100 text-gray-800';
941
+ }
942
+
943
+ // Função para obter o ícone para o tipo de argumento
944
+ function getIconForTipo(tipo) {
945
+ const icones = {
946
+ 'normativo': 'fa-balance-scale',
947
+ 'jurisprudencial': 'fa-gavel',
948
+ 'doutrinario': 'fa-book',
949
+ 'teleologico': 'fa-bullseye',
950
+ 'sistematico': 'fa-project-diagram',
951
+ 'historico': 'fa-hourglass-half'
952
+ };
953
+ return icones[tipo] || 'fa-question';
954
+ }
955
+
956
+ // Função para exibir notificações
957
+ function showNotification(message, type = 'info') {
958
+ // Criar elemento de notificação
959
+ const notification = document.createElement('div');
960
+ notification.className = `fixed top-4 right-4 z-50 max-w-md rounded-lg shadow-lg px-4 py-3 text-white font-medium animate-fade-in-out transform transition-all duration-300 ${getNotificationColor(type)}`;
961
+ notification.style.transform = 'translateY(0px)';
962
+ notification.innerHTML = `
963
+ <div class="flex items-center justify-between">
964
+ <div class="flex items-center gap-3">
965
+ <i class="${getNotificationIcon(type)}"></i>
966
+ <span>${message}</span>
967
+ </div>
968
+ <button onclick="this.parentElement.parentElement.remove()" class="text-white opacity-70 hover:opacity-100">
969
+ <i class="fas fa-times"></i>
970
+ </button>
971
+ </div>
972
+ `;
973
+
974
+ document.body.appendChild(notification);
975
+
976
+ // Remover automaticamente após 5 segundos
977
+ setTimeout(() => {
978
+ notification.style.transform = 'translateY(-100px)';
979
+ setTimeout(() => {
980
+ notification.remove();
981
+ }, 300);
982
+ }, 5000);
983
+ }
984
+
985
+ // Função para obter a cor da notificação
986
+ function getNotificationColor(type) {
987
+ const colors = {
988
+ 'success': 'bg-green-500',
989
+ 'error': 'bg-red-500',
990
+ 'info': 'bg-blue-500',
991
+ 'warning': 'bg-amber-500'
992
+ };
993
+ return colors[type] || 'bg-blue-500';
994
+ }
995
+
996
+ // Função para obter o ícone da notificação
997
+ function getNotificationIcon(type) {
998
+ const icons = {
999
+ 'success': 'fas fa-check-circle',
1000
+ 'error': 'fas fa-exclamation-circle',
1001
+ 'info': 'fas fa-info-circle',
1002
+ 'warning': 'fas fa-exclamation-triangle'
1003
+ };
1004
+ return icons[type] || 'fas fa-info-circle';
1005
+ }
1006
+
1007
+ // Event listener para importação de JSON
1008
+ document.getElementById('fileInput').addEventListener('change', function(e) {
1009
+ const file = e.target.files[0];
1010
+ if (!file) return;
1011
+
1012
+ const reader = new FileReader();
1013
+ reader.onload = function(e) {
1014
+ try {
1015
+ const dadosImportados = JSON.parse(e.target.result);
1016
+
1017
+ // Validar estrutura básica
1018
+ if (!dadosImportados.hasOwnProperty('teseCentral')) {
1019
+ throw new Error('Arquivo com formato inválido');
1020
+ }
1021
+
1022
+ dados = dadosImportados;
1023
+
1024
+ // Preencher campos do formulário
1025
+ document.getElementById('tipoPeca').value = dados.tipoPeca || '';
1026
+ document.getElementById('tipoPenal').value = dados.tipoPenal || '';
1027
+ document.getElementById('reu').value = dados.reu || '';
1028
+ document.getElementById('comarca').value = dados.comarca || '';
1029
+ document.getElementById('teseCentral').value = dados.teseCentral || '';
1030
+
1031
+ renderizar();
1032
+ showNotification('Mapeamento carregado com sucesso!', 'success');
1033
+ } catch (error) {
1034
+ console.error(error);
1035
+ showNotification('Erro ao carregar arquivo. Verifique se é um JSON válido.', 'error');
1036
+ }
1037
+ };
1038
+ reader.readAsText(file);
1039
+ });
1040
+
1041
+ // Renderizar inicialmente
1042
+ renderizar();
1043
+ </script>
1044
+ <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/mapeamento-argumentos" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
1045
+ </html>
prompts.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ Em português. Crie e implemente o aplicativo de Mapeamento de Argumetnos com funções CRUD. <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Mapeamento de Argumentos - Processo Penal</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%); min-height: 100vh; padding: 20px; } .container { max-width: 1400px; margin: 0 auto; background: white; border-radius: 15px; box-shadow: 0 10px 40px rgba(0,0,0,0.3); overflow: hidden; } .header { background: linear-gradient(135deg, #2c3e50 0%, #34495e 100%); color: white; padding: 30px; text-align: center; } .header h1 { font-size: 28px; margin-bottom: 10px; } .header p { opacity: 0.9; font-size: 14px; } .main-content { display: grid; grid-template-columns: 350px 1fr; gap: 0; min-height: calc(100vh - 200px); } .sidebar { background: #f8f9fa; border-right: 2px solid #e0e0e0; padding: 25px; overflow-y: auto; } .form-section { margin-bottom: 25px; } .form-section h3 { color: #2c3e50; font-size: 16px; margin-bottom: 12px; padding-bottom: 8px; border-bottom: 2px solid #3498db; } label { display: block; margin-bottom: 6px; color: #555; font-weight: 600; font-size: 13px; } input[type="text"], textarea, select { width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 5px; font-size: 13px; margin-bottom: 12px; transition: border-color 0.3s; } input[type="text"]:focus, textarea:focus, select:focus { outline: none; border-color: #3498db; } textarea { resize: vertical; min-height: 80px; } button { width: 100%; padding: 12px; background: #3498db; color: white; border: none; border-radius: 5px; font-size: 14px; font-weight: 600; cursor: pointer; transition: background 0.3s; margin-bottom: 10px; } button:hover { background: #2980b9; } button.danger { background: #e74c3c; } button.danger:hover { background: #c0392b; } button.secondary { background: #95a5a6; } button.secondary:hover { background: #7f8c8d; } .output-area { padding: 30px; overflow-y: auto; } .map-container { background: white; } .tese-central { background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); color: white; padding: 25px; border-radius: 10px; margin-bottom: 30px; box-shadow: 0 4px 15px rgba(231, 76, 60, 0.3); } .tese-central h2 { font-size: 20px; margin-bottom: 12px; } .tese-central p { line-height: 1.6; font-size: 15px; } .section-block { margin-bottom: 30px; border-left: 4px solid #3498db; padding-left: 20px; } .section-block h3 { color: #2c3e50; font-size: 18px; margin-bottom: 15px; display: flex; align-items: center; gap: 10px; } .section-block .icon { width: 30px; height: 30px; background: #3498db; color: white; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 16px; } .argument-card { background: #f8f9fa; border: 1px solid #e0e0e0; border-radius: 8px; padding: 18px; margin-bottom: 15px; position: relative; transition: transform 0.2s, box-shadow 0.2s; } .argument-card:hover { transform: translateX(5px); box-shadow: 0 4px 12px rgba(0,0,0,0.1); } .argument-card h4 { color: #2c3e50; font-size: 15px; margin-bottom: 10px; display: flex; align-items: center; gap: 8px; } .argument-card p { color: #555; line-height: 1.6; font-size: 14px; } .argument-card .badge { display: inline-block; padding: 4px 10px; border-radius: 12px; font-size: 11px; font-weight: 600; margin-bottom: 8px; } .badge.normativo { background: #e8f5e9; color: #2e7d32; } .badge.jurisprudencial { background: #e3f2fd; color: #1565c0; } .badge.doutrinario { background: #f3e5f5; color: #6a1b9a; } .badge.teleologico { background: #fff3e0; color: #e65100; } .badge.sistematico { background: #fce4ec; color: #c2185b; } .badge.historico { background: #e0f2f1; color: #00695c; } .contra-argument { background: #fff3cd; border-left: 4px solid #ffc107; } .refutacao { background: #d4edda; border-left: 4px solid #28a745; } .precedente-table { width: 100%; border-collapse: collapse; margin-top: 15px; font-size: 13px; } .precedente-table th { background: #34495e; color: white; padding: 10px; text-align: left; font-weight: 600; } .precedente-table td { padding: 10px; border-bottom: 1px solid #e0e0e0; } .precedente-table tr:hover { background: #f8f9fa; } .fluxo-diagram { background: #f8f9fa; padding: 20px; border-radius: 8px; margin-top: 20px; text-align: center; } .fluxo-box { background: white; border: 2px solid #3498db; border-radius: 8px; padding: 15px; margin: 10px auto; max-width: 500px; position: relative; } .fluxo-arrow { font-size: 24px; color: #3498db; margin: 10px 0; } .empty-state { text-align: center; padding: 60px 20px; color: #95a5a6; } .empty-state svg { width: 120px; height: 120px; margin-bottom: 20px; opacity: 0.3; } .export-buttons { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 20px; } .tipo-penal-info { background: #ecf0f1; padding: 15px; border-radius: 8px; margin-bottom: 20px; } .tipo-penal-info h4 { color: #2c3e50; margin-bottom: 8px; font-size: 14px; } .tipo-penal-info p { color: #555; font-size: 13px; line-height: 1.5; } @media print { body { background: white; } .sidebar { display: none; } .main-content { grid-template-columns: 1fr; } } .btn-remove { background: #e74c3c; color: white; border: none; padding: 5px 10px; border-radius: 4px; cursor: pointer; font-size: 11px; float: right; } .btn-remove:hover { background: #c0392b; } .silogismo-box { background: #e8f5e9; border-left: 4px solid #4caf50; padding: 20px; border-radius: 8px; margin: 20px 0; } .silogismo-box h4 { color: #2e7d32; margin-bottom: 15px; } .silogismo-item { margin-bottom: 12px; } .silogismo-item strong { color: #1b5e20; display: block; margin-bottom: 5px; } @media (max-width: 1024px) { .main-content { grid-template-columns: 1fr; } .sidebar { border-right: none; border-bottom: 2px solid #e0e0e0; } } </style> </head> <body> <div class="container"> <div class="header"> <h1>⚖️ Mapeamento de Argumentos - Processo Penal</h1> <p>Ferramenta para estruturação lógica de teses penais e processuais penais</p> </div> <div class="main-content"> <div class="sidebar"> <div class="form-section"> <h3>📋 Informações do Caso</h3> <label>Tipo de Peça:</label> <select id="tipoPeca"> <option value="">Selecione...</option> <option value="denuncia">Denúncia</option> <option value="defesa">Defesa Prévia</option> <option value="alegacoes">Alegações Finais</option> <option value="recurso">Recurso</option> <option value="habeas">Habeas Corpus</option> <option value="parecer">Parecer</option> </select> <label>Tipo Penal:</label> <input type="text" id="tipoPenal" placeholder="Ex: Art. 155, CP - Furto"> <label>Réu/Investigado:</label> <input type="text" id="reu" placeholder="Nome do réu"> <label>Comarca/Tribunal:</label> <input type="text" id="comarca" placeholder="Ex: 1ª Vara Criminal de São Paulo"> </div> <div class="form-section"> <h3>🎯 Tese Central</h3> <textarea id="teseCentral" placeholder="Digite a tese central que será defendida..."></textarea> <button onclick="adicionarTese()">Adicionar Tese</button> </div> <div class="form-section"> <h3>📚 Adicionar Argumento</h3> <label>Tipo de Argumento:</label> <select id="tipoArgumento"> <option value="normativo">Normativo</option> <option value="jurisprudencial">Jurisprudencial</option> <option value="doutrinario">Doutrinário</option> <option value="teleologico">Teleológico</option> <option value="sistematico">Sistemático</option> <option value="historico">Histórico</option> </select> <label>Título:</label> <input type="text" id="tituloArgumento" placeholder="Ex: Princípio da Insignificância"> <label>Fundamento:</label> <textarea id="fundamentoArgumento" placeholder="Descreva o fundamento do argumento..."></textarea> <button onclick="adicionarArgumento()">Adicionar Argumento</button> </div> <div class="form-section"> <h3>⚠️ Contra-Argumento</h3> <label>Objeção:</label> <textarea id="contraArgumento" placeholder="Digite o contra-argumento..."></textarea> <label>Refutação:</label> <textarea id="refutacao" placeholder="Digite a refutação ao contra-argumento..."></textarea> <button onclick="adicionarContraArgumento()">Adicionar Contra-Argumento</button> </div> <div class="form-section"> <h3>📖 Precedente</h3> <label>Tribunal:</label> <input type="text" id="tribunal" placeholder="Ex: STF, STJ, TJSP"> <label>Número do Processo:</label> <input type="text" id="numeroProcesso" placeholder="Ex: HC 123.456"> <label>Relator:</label> <input type="text" id="relator" placeholder="Ex: Min. Gilmar Mendes"> <label>Data:</label> <input type="text" id="dataPrecedente" placeholder="Ex: 15/03/2024"> <label>Ementa/Ratio Decidendi:</label> <textarea id="ementa" placeholder="Resumo da decisão..."></textarea> <button onclick="adicionarPrecedente()">Adicionar Precedente</button> </div> <div class="export-buttons"> <button onclick="exportarPDF()">📄 Exportar PDF</button> <button onclick="exportarJSON()" class="secondary">💾 Salvar JSON</button> <button onclick="importarJSON()" class="secondary">📂 Carregar JSON</button> <button onclick="limparTudo()" class="danger">🗑️ Limpar Tudo</button> </div> </div> <div class="output-area" id="outputArea"> <div class="empty-state"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <path d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/> </svg> <h3>Nenhum mapeamento criado</h3> <p>Preencha os campos ao lado para começar a estruturar seus argumentos</p> </div> </div> </div> </div> <input type="file" id="fileInput" style="display: none;" accept=".json"> <script> let dados = { tipoPeca: '', tipoPenal: '', reu: '', comarca: '', teseCentral: '', argumentos: [], contraArgumentos: [], precedentes: [] }; function adicionarTese() { dados.teseCentral = document.getElementById('teseCentral').value; dados.tipoPeca = document.getElementById('tipoPeca').value; dados.tipoPenal = document.getElementById('tipoPenal').value; dados.reu = document.getElementById('reu').value; dados.comarca = document.getElementById('comarca').value; renderizar(); } function adicionarArgumento() { const tipo = document.getElementById('tipoArgumento').value; const titulo = document.getElementById('tituloArgumento').value; const fundamento = document.getElementById('fundamentoArgumento').value; if (!titulo || !fundamento) { alert('Preencha todos os campos do argumento'); return; } dados.argumentos.push({ tipo: tipo, titulo: titulo, fundamento: fundamento }); document.getElementById('tituloArgumento').value = ''; document.getElementById('fundamentoArgumento').value = ''; renderizar(); } function adicionarContraArgumento() { const contra = document.getElementById('contraArgumento').value; const refutacao = document.getElementById('refutacao').value; if (!contra || !refutacao) { alert('Preencha tanto o contra-argumento quanto a refutação'); return; } dados.contraArgumentos.push({ contraArgumento: contra, refutacao: refutacao }); document.getElementById('contraArgumento').value = ''; document.getElementById('refutacao').value = ''; renderizar(); } function adicionarPrecedente() { const tribunal = document.getElementById('tribunal').value; const numero = document.getElementById('numeroProcesso').value; const relator = document.getElementById('relator').value; const data = document.getElementById('dataPrecedente').value; const ementa = document.getElementById('ementa').value; if (!tribunal || !numero || !ementa) { alert('Preencha pelo menos o tribunal, número do processo e ementa'); return; } dados.precedentes.push({ tribunal: tribunal, numero: numero, relator: relator, data: data, ementa: ementa }); document.getElementById('tribunal').value = ''; document.getElementById('numeroProcesso').value = ''; document.getElementById('relator').value = ''; document.getElementById('dataPrecedente').value = ''; document.getElementById('ementa').value = ''; renderizar(); } function removerArgumento(index) { dados.argumentos.splice(index, 1); renderizar(); } function removerContraArgumento(index) { dados.contraArgumentos.splice(index, 1); renderizar(); } function removerPrecedente(index) { dados.precedentes.splice(index, 1); renderizar(); } function renderizar() { const output = document.getElementById('outputArea'); if (!dados.teseCentral && dados.argumentos.length === 0) { output.innerHTML = ` <div class="empty-state"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <path d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/> </svg> <h3>Nenhum mapeamento criado</h3> <p>Preencha os campos ao lado para começar a estruturar seus argumentos</p> </div> `; return; } let html = '<div class="map-container">'; // Informações do caso if (dados.tipoPeca || dados.tipoPenal || dados.reu || dados.comarca) { html += '<div class="tipo-penal-info">'; html += '<h4>📋 INFORMAÇÕES DO CASO</h4>'; if (dados.tipoPeca) html += `<p><strong>Tipo de Peça:</strong> ${getNomePeca(dados.tipoPeca)}</p>`; if (dados.tipoPenal) html += `<p><strong>Tipo Penal:</strong> ${dados.tipoPenal}</p>`; if (dados.reu) html += `<p><strong>Réu/Investigado:</strong> ${dados.reu}</p>`; if (dados.comarca) html += `<p><strong>Comarca/Tribunal:</strong> ${dados.comarca}</p>`; html += '</div>'; } // Tese Central if (dados.teseCentral) { html += ` <div class="tese-central"> <h2>🎯 TESE CENTRAL</h2> <p>${dados.teseCentral}</p> </div> `; } // Argumentos if (dados.argumentos.length > 0) { html += '<div class="section-block">'; html += '<h3><span class="icon">📚</span> ARGUMENTOS</h3>'; dados.argumentos.forEach((arg, index) => { html += ` <div class="argument-card"> <button class="btn-remove" onclick="removerArgumento(${index})">✕</button> <span class="badge ${arg.tipo}">${arg.tipo.toUpperCase()}</span> <h4>${arg.titulo}</h4> <p>${arg.fundamento}</p> </div> `; }); html += '</div>'; } // Precedentes if (dados.precedentes.length > 0) { html += '<div class="section-block">'; html += '<h3><span class="icon">📖</span> PRECEDENTES</h3>'; html += '<table class="precedente-table">'; html += '<thead><tr><th>Tribunal</th><th>Processo</th><th>Relator</th><th>Data</th><th>Ementa</th><th>Ação</th></tr></thead>'; html += '<tbody>'; dados.precedentes.forEach((prec, index) => { html += ` <tr> <td><strong>${prec.tribunal}</strong></td> <td>${prec.numero}</td> <td>${prec.relator}</td> <td>${prec.data}</td> <td>${prec.ementa}</td> <td><button class="btn-remove" onclick="removerPrecedente(${index})">✕</button></td> </tr> `; }); html += '</tbody></table>'; html += '</div>'; } // Contra-argumentos e Refutações if (dados.contraArgumentos.length > 0) { html += '<div class="section-block">'; html += '<h3><span class="icon">⚖️</span> CONTRA-ARGUMENTOS E REFUTAÇÕES</h3>'; dados.contraArgumentos.forEach((contra, index) => { html += ` <div class="argument-card contra-argument"> <button class="btn-remove" onclick="removerContraArgumento(${index})">✕</button> <h4>⚠️ Contra-Argumento</h4> <p>${contra.contraArgumento}</p> </div> <div class="argument-card refutacao"> <h4>✅ Refutação</h4> <p>${contra.refutacao}</p> </div> `; }); html += '</div>'; } // Silogismo Jurídico (se houver argumentos normativos) const argumentosNormativos = dados.argumentos.filter(a => a.tipo === 'normativo'); if (argumentosNormativos.length > 0 && dados.teseCentral) { html += '<div class="section-block">'; html += '<h3><span class="icon">🔍</span> SILOGISMO JURÍDICO</h3>'; html += '<div class="silogismo-box">'; html += '<h4>Estrutura Lógica</h4>'; html += '<div class="silogismo-item"><strong>PREMISSA MAIOR (Norma):</strong>'; argumentosNormativos.forEach(arg => { html += `<p>${arg.titulo}: ${arg.fundamento}</p>`; }); html += '</div>'; html += '<div class="silogismo-item"><strong>PREMISSA MENOR (Fato):</strong><p>Aplicável ao caso concreto conforme a tese apresentada</p></div>'; html += `<div class="silogismo-item"><strong>CONCLUSÃO:</strong><p>${dados.teseCentral}</p></div>`; html += '</div>'; html += '</div>'; } html += '</div>'; output.innerHTML = html; } function getNomePeca(tipo) { const nomes = { 'denuncia': 'Denúncia', 'defesa': 'Defesa Prévia', 'alegacoes': 'Alegações Finais', 'recurso': 'Recurso', 'habeas': 'Habeas Corpus', 'parecer': 'Parecer' }; return nomes[tipo] || tipo; } function exportarPDF() { window.print(); } function exportarJSON() { const dataStr = JSON.stringify(dados, null, 2); const dataBlob = new Blob([dataStr], {type: 'application/json'}); const url = URL.createObjectURL(dataBlob); const link = document.createElement('a'); link.href = url; link.download = 'mapeamento_argumentos.json'; link.click(); } function importarJSON() { document.getElementById('fileInput').click(); } document.getElementById('fileInput').addEventListener('change', function(e) { const file = e.target.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = function(e) { try { dados = JSON.parse(e.target.result); // Preencher campos document.getElementById('tipoPeca').value = dados.tipoPeca || ''; document.getElementById('tipoPenal').value = dados.tipoPenal || ''; document.getElementById('reu').value = dados.reu || ''; document.getElementById('comarca').value = dados.comarca || ''; document.getElementById('teseCentral').value = dados.teseCentral || ''; renderizar(); alert('Mapeamento carregado com sucesso!'); } catch (error) { alert('Erro ao carregar arquivo. Verifique se é um JSON válido.'); } }; reader.readAsText(file); }); function limparTudo() { if (confirm('Tem certeza que deseja limpar todos os dados?')) { dados = { tipoPeca: '', tipoPenal: '', reu: '', comarca: '', teseCentral: '', argumentos: [], contraArgumentos: [], precedentes: [] }; document.getElementById('tipoPeca').value = ''; document.getElementById('tipoPenal').value = ''; document.getElementById('reu').value = ''; document.getElementById('comarca').value = ''; document.getElementById('teseCentral').value = ''; renderizar(); } } // Renderizar inicialmente renderizar(); </script> </body> </html>