Ticoliro commited on
Commit
3bed6c5
·
verified ·
1 Parent(s): c4af3e7

Add 3 files

Browse files
Files changed (3) hide show
  1. README.md +6 -4
  2. index.html +1093 -19
  3. prompts.txt +1 -0
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Formulario
3
- emoji: 🐨
4
- colorFrom: yellow
5
  colorTo: red
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: formulario
3
+ emoji: 🐳
4
+ colorFrom: blue
5
  colorTo: red
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,1093 @@
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>Formulário de Vaga</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js"></script>
9
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
10
+ <style>
11
+ .remove-btn {
12
+ color: #ef4444;
13
+ cursor: pointer;
14
+ font-weight: bold;
15
+ font-size: 1.2em;
16
+ }
17
+ .error-message {
18
+ color: #ef4444;
19
+ font-size: 0.875rem;
20
+ margin-top: 0.25rem;
21
+ }
22
+ .form-section {
23
+ display: none;
24
+ }
25
+ .form-section.active {
26
+ display: block;
27
+ }
28
+ select[multiple] {
29
+ height: 150px;
30
+ }
31
+ .animate-pulse {
32
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
33
+ }
34
+ @keyframes pulse {
35
+ 0%, 100% {
36
+ opacity: 1;
37
+ }
38
+ 50% {
39
+ opacity: 0.5;
40
+ }
41
+ }
42
+ .optional {
43
+ color: #6b7280;
44
+ font-style: italic;
45
+ font-size: 0.875rem;
46
+ }
47
+ </style>
48
+ </head>
49
+ <body class="bg-gray-50 min-h-screen">
50
+ <div class="container mx-auto px-4 py-8 max-w-4xl">
51
+ <!-- Header with important notices -->
52
+ <div class="bg-blue-50 border-l-4 border-blue-500 p-4 mb-6 rounded">
53
+ <div class="flex items-start">
54
+ <div class="flex-shrink-0">
55
+ <i class="fas fa-bullhorn text-blue-500 text-xl mr-3 mt-1"></i>
56
+ </div>
57
+ <div>
58
+ <p class="font-bold text-blue-800"><i class="fas fa-exclamation-circle mr-1"></i> Este formulário garante que sua vaga seja divulgada com rapidez e visibilidade.</p>
59
+ <p class="text-blue-700 mt-1"><i class="fas fa-exclamation-triangle mr-1"></i> Vagas sem esse envio podem demorar mais para irem ao ar.</p>
60
+ </div>
61
+ </div>
62
+ </div>
63
+
64
+ <!-- Progress tracker -->
65
+ <div class="flex mb-8 overflow-x-auto">
66
+ <div class="flex space-x-4">
67
+ <div class="flex items-center">
68
+ <div class="w-8 h-8 rounded-full bg-green-500 flex items-center justify-center text-white font-bold">1</div>
69
+ <div class="ml-2 text-sm font-medium text-gray-700">Dados Básicos</div>
70
+ </div>
71
+ <div class="flex items-center">
72
+ <div class="w-8 h-8 rounded-full bg-blue-500 flex items-center justify-center text-white font-bold">2</div>
73
+ <div class="ml-2 text-sm font-medium text-gray-700">Impulsionamento</div>
74
+ </div>
75
+ </div>
76
+ </div>
77
+
78
+ <!-- Tip box -->
79
+ <div class="bg-blue-100 border-l-4 border-blue-500 p-4 mb-6 rounded">
80
+ <div class="flex items-start">
81
+ <div class="flex-shrink-0">
82
+ <i class="fas fa-lightbulb text-blue-500 text-xl mr-3 mt-1"></i>
83
+ </div>
84
+ <div>
85
+ <p class="text-blue-800">Essa etapa ajuda o marketing a entender melhor como divulgar sua vaga.</p>
86
+ </div>
87
+ </div>
88
+ </div>
89
+
90
+ <form id="vagaForm" class="bg-white shadow-md rounded-lg p-6">
91
+ <!-- Section 1 - Job Data -->
92
+ <section id="sessao1" class="form-section active">
93
+ <h2 class="text-2xl font-bold text-blue-700 border-b border-blue-200 pb-3 mb-6 flex items-center">
94
+ <i class="fas fa-file-alt mr-2"></i> Sessão 1 - Dados da Vaga
95
+ </h2>
96
+
97
+ <!-- Analyst Info -->
98
+ <div class="mb-4">
99
+ <label class="block text-gray-700 font-medium mb-2" for="analista">
100
+ Nome do analista <span class="text-red-500">*</span>
101
+ <span class="text-blue-500 cursor-help ml-1" title="Insira o nome completo do analista responsável">
102
+ <i class="fas fa-info-circle"></i>
103
+ </span>
104
+ </label>
105
+ <input id="analista" name="analista" type="text" required
106
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
107
+ </div>
108
+
109
+ <!-- WhatsApp -->
110
+ <div class="mb-4">
111
+ <label class="block text-gray-700 font-medium mb-2" for="whatsapp">
112
+ WhatsApp <span class="text-red-500">*</span>
113
+ <span class="text-blue-500 cursor-help ml-1" title="Insira o número de WhatsApp com DDD">
114
+ <i class="fas fa-info-circle"></i>
115
+ </span>
116
+ </label>
117
+ <input id="whatsapp" name="whatsapp" type="tel" required
118
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
119
+ </div>
120
+
121
+ <!-- Logo Disclosure -->
122
+ <div id="avisoLogo" class="hidden bg-yellow-50 border-l-4 border-yellow-400 p-4 mb-4 rounded">
123
+ <div class="flex items-start">
124
+ <div class="flex-shrink-0">
125
+ <i class="fas fa-info-circle text-yellow-500 text-xl mr-3 mt-1"></i>
126
+ </div>
127
+ <div>
128
+ <p class="text-yellow-800">Para melhor divulgação, envie o logo em formato vetorial (AI, SVG ou EPS). Caso não tenha, podemos usar versão JPG/PNG.</p>
129
+ </div>
130
+ </div>
131
+ </div>
132
+
133
+ <div class="mb-4">
134
+ <label class="block text-gray-700 font-medium mb-2" for="divulgaLogo">
135
+ Pode divulgar a logo? <span class="text-red-500">*</span>
136
+ <span class="text-blue-500 cursor-help ml-1" title="Selecione se a logo da empresa pode ser divulgada">
137
+ <i class="fas fa-info-circle"></i>
138
+ </span>
139
+ </label>
140
+ <select id="divulgaLogo" required
141
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
142
+ <option value="">Selecione</option>
143
+ <option value="Sim">Sim</option>
144
+ <option value="N&atilde;o">Não</option>
145
+ </select>
146
+ </div>
147
+
148
+ <!-- Company Name (conditional) -->
149
+ <div id="nomeEmpresaContainer" class="hidden mb-4">
150
+ <label class="block text-gray-700 font-medium mb-2" for="empresa">
151
+ Nome da empresa <span class="text-red-500">*</span>
152
+ <span class="text-blue-500 cursor-help ml-1" title="Insira o nome da empresa">
153
+ <i class="fas fa-info-circle"></i>
154
+ </span>
155
+ </label>
156
+ <input id="empresa" name="empresa" type="text"
157
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
158
+ </div>
159
+
160
+ <!-- Production Job -->
161
+ <div class="mb-4">
162
+ <label class="block text-gray-700 font-medium mb-2" for="producao">
163
+ É produção? <span class="text-red-500">*</span>
164
+ <span class="text-blue-500 cursor-help ml-1" title="Selecione se a vaga é para produção">
165
+ <i class="fas fa-info-circle"></i>
166
+ </span>
167
+ </label>
168
+ <select id="producao" required
169
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
170
+ <option value="">Selecione</option>
171
+ <option value="Sim">Sim</option>
172
+ <option value="N&atilde;o">Não</option>
173
+ </select>
174
+ </div>
175
+
176
+ <!-- Marketing Warning (conditional) -->
177
+ <div id="avisoMarketing" class="hidden bg-red-50 border-l-4 border-red-400 p-4 mb-4 rounded">
178
+ <div class="flex items-start">
179
+ <div class="flex-shrink-0">
180
+ <i class="fas fa-exclamation-triangle text-red-500 text-xl mr-3 mt-1"></i>
181
+ </div>
182
+ <div>
183
+ <p class="text-red-800">O marketing NÃO está permitido divulgar vagas de produção sem logo.</p>
184
+ </div>
185
+ </div>
186
+ </div>
187
+
188
+ <!-- In-person Attendance -->
189
+ <div class="mb-4">
190
+ <label class="block text-gray-700 font-medium mb-2" for="presencial">
191
+ Comparecimento presencial? <span class="text-red-500">*</span>
192
+ </label>
193
+ <select id="presencial" required
194
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
195
+ <option value="">Selecione</option>
196
+ <option value="RHBrasil">RHBrasil</option>
197
+ <option value="Outro">Outro lugar</option>
198
+ </select>
199
+ </div>
200
+
201
+ <!-- Other Location (conditional) -->
202
+ <div id="outroLugar" class="hidden mb-4">
203
+ <label class="block text-gray-700 font-medium mb-2" for="local">
204
+ Local para comparecer (Google Maps link) <span class="text-red-500">*</span>
205
+ </label>
206
+ <input id="local" name="local" type="url" placeholder="https://goo.gl/maps/xyz123"
207
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
208
+ </div>
209
+
210
+ <!-- Event Type (conditional) -->
211
+ <div id="eventoContainer" class="hidden mb-4">
212
+ <label class="block text-gray-700 font-medium mb-2" for="evento">
213
+ É evento/feirão/mutirão?
214
+ </label>
215
+ <select id="evento" name="evento"
216
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
217
+ <option value="N&atilde;o">Não</option>
218
+ <option value="Feir&atilde;o">Feirão</option>
219
+ <option value="Mutir&atilde;o">Mutirão</option>
220
+ </select>
221
+ </div>
222
+
223
+ <!-- Job Title -->
224
+ <div class="mb-4">
225
+ <label class="block text-gray-700 font-medium mb-2" for="cargo">
226
+ Nome do cargo <span class="text-red-500">*</span>
227
+ </label>
228
+ <input id="cargo" name="cargo" type="text" required
229
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
230
+ </div>
231
+
232
+ <!-- Defined Date -->
233
+ <div class="mb-4">
234
+ <label class="block text-gray-700 font-medium mb-2" for="temDataDefinida">
235
+ Tem data definida? <span class="text-red-500">*</span>
236
+ <span class="text-blue-500 cursor-help ml-1" title="Se não tiver data definida, o padrão será de Segunda à Sexta">
237
+ <i class="fas fa-info-circle"></i>
238
+ </span>
239
+ </label>
240
+ <select id="temDataDefinida" required
241
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
242
+ <option value="">Selecione</option>
243
+ <option value="Sim">Sim</option>
244
+ <option value="Não">Não</option>
245
+ </select>
246
+ </div>
247
+
248
+ <!-- Date Selection (conditional) -->
249
+ <div id="datasContainer" class="hidden mb-4">
250
+ <div class="tipo-container flex space-x-4 mb-4">
251
+ <label class="inline-flex items-center">
252
+ <input type="radio" name="tipoData" value="unico" checked class="form-radio text-blue-600">
253
+ <span class="ml-2">Data única</span>
254
+ </label>
255
+ <label class="inline-flex items-center">
256
+ <input type="radio" name="tipoData" value="intervalo" class="form-radio text-blue-600">
257
+ <span class="ml-2">Intervalo</span>
258
+ </label>
259
+ </div>
260
+
261
+ <!-- Single Date -->
262
+ <div id="dataUnica">
263
+ <div id="datasUnicas">
264
+ <div class="campo-data flex items-center mb-2">
265
+ <label class="mr-2">Data:</label>
266
+ <input type="date" name="datas[]" required
267
+ class="px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
268
+ <span class="remove-btn ml-2" onclick="removerData(this)"><i class="fas fa-times"></i></span>
269
+ </div>
270
+ </div>
271
+ <button type="button" onclick="adicionarData()"
272
+ class="mt-2 px-4 py-2 bg-blue-100 text-blue-700 rounded-md hover:bg-blue-200 transition">
273
+ <i class="fas fa-plus mr-1"></i> Adicionar data
274
+ </button>
275
+ </div>
276
+
277
+ <!-- Date Range -->
278
+ <div id="dataIntervalo" class="hidden">
279
+ <div class="campo-intervalo grid grid-cols-5 gap-2 items-center mb-2">
280
+ <label>De</label>
281
+ <input type="date" name="dataInicio[]" required
282
+ class="col-span-2 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
283
+ <label>até</label>
284
+ <input type="date" name="dataFim[]" required
285
+ class="col-span-2 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
286
+ <span class="remove-btn ml-2" onclick="removerIntervalo(this)"><i class="fas fa-times"></i></span>
287
+ </div>
288
+ <button type="button" onclick="adicionarIntervalo()"
289
+ class="mt-2 px-4 py-2 bg-blue-100 text-blue-700 rounded-md hover:bg-blue-200 transition">
290
+ <i class="fas fa-plus mr-1"></i> Adicionar intervalo
291
+ </button>
292
+ </div>
293
+ </div>
294
+
295
+ <!-- Defined Time -->
296
+ <div class="mb-4">
297
+ <label class="block text-gray-700 font-medium mb-2" for="temHorarioDefinido">
298
+ Tem horário definido? <span class="text-red-500">*</span>
299
+ <span class="text-blue-500 cursor-help ml-1" title="Se não tiver horário definido, o padrão será das 7:30 às 17:00">
300
+ <i class="fas fa-info-circle"></i>
301
+ </span>
302
+ </label>
303
+ <select id="temHorarioDefinido" required
304
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
305
+ <option value="">Selecione</option>
306
+ <option value="Sim">Sim</option>
307
+ <option value="Não">Não</option>
308
+ </select>
309
+ </div>
310
+
311
+ <!-- Time Selection (conditional) -->
312
+ <div id="horariosContainer" class="hidden mb-4">
313
+ <div class="tipo-container flex space-x-4 mb-4">
314
+ <label class="inline-flex items-center">
315
+ <input type="radio" name="tipoHorario" value="unico" checked class="form-radio text-blue-600">
316
+ <span class="ml-2">Horário único</span>
317
+ </label>
318
+ <label class="inline-flex items-center">
319
+ <input type="radio" name="tipoHorario" value="intervalo" class="form-radio text-blue-600">
320
+ <span class="ml-2">Intervalo</span>
321
+ </label>
322
+ </div>
323
+
324
+ <!-- Single Time -->
325
+ <div id="horarioUnico">
326
+ <div class="campo-horario flex items-center mb-2">
327
+ <label class="mr-2">Horário:</label>
328
+ <input type="time" name="horarios[]" required
329
+ class="px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
330
+ <span class="remove-btn ml-2" onclick="removerHorario(this)"><i class="fas fa-times"></i></span>
331
+ </div>
332
+ <button type="button" onclick="adicionarHorario()"
333
+ class="mt-2 px-4 py-2 bg-blue-100 text-blue-700 rounded-md hover:bg-blue-200 transition">
334
+ <i class="fas fa-plus mr-1"></i> Adicionar horário
335
+ </button>
336
+ </div>
337
+
338
+ <!-- Time Range -->
339
+ <div id="horarioIntervalo" class="hidden">
340
+ <div class="campo-intervalo grid grid-cols-5 gap-2 items-center mb-2">
341
+ <label>Das</label>
342
+ <input type="time" name="horaInicio" required
343
+ class="col-span-2 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
344
+ <label>às</label>
345
+ <input type="time" name="horaFim" required
346
+ class="col-span-2 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
347
+ </div>
348
+ </div>
349
+ </div>
350
+
351
+ <!-- Number of Positions -->
352
+ <div class="mb-4">
353
+ <label class="block text-gray-700 font-medium mb-2" for="vagas">
354
+ Quantas vagas <span class="text-red-500">*</span>
355
+ </label>
356
+ <input id="vagas" name="vagas" type="number" required placeholder="Ex: 1, 3, 10 ou 400"
357
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
358
+ </div>
359
+
360
+ <!-- Benefits -->
361
+ <div class="mb-4">
362
+ <label class="block text-gray-700 font-medium mb-2" for="beneficios">
363
+ Benefícios <span class="optional">(Opcional)</span>
364
+ </label>
365
+ <textarea id="beneficios" name="beneficios" rows="3"
366
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"></textarea>
367
+ </div>
368
+
369
+ <!-- Requirements -->
370
+ <div class="mb-4">
371
+ <label class="block text-gray-700 font-medium mb-2" for="requisitos">
372
+ Requisitos <span class="optional">(Opcional)</span>
373
+ </label>
374
+ <textarea id="requisitos" name="requisitos" rows="3"
375
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"></textarea>
376
+ </div>
377
+
378
+ <!-- Shifts -->
379
+ <div class="mb-4">
380
+ <label class="block text-gray-700 font-medium mb-2" for="turnos">
381
+ Turnos <span class="optional">(Opcional)</span>
382
+ </label>
383
+ <input id="turnos" name="turnos" type="text"
384
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
385
+ </div>
386
+
387
+ <!-- Joinville -->
388
+ <div class="mb-4">
389
+ <label class="block text-gray-700 font-medium mb-2" for="joinville">
390
+ É para Joinville? <span class="text-red-500">*</span>
391
+ </label>
392
+ <select id="joinville" required
393
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
394
+ <option value="">Selecione</option>
395
+ <option value="Sim">Sim</option>
396
+ <option value="N&atilde;o">Não</option>
397
+ </select>
398
+ </div>
399
+
400
+ <!-- Other City (conditional) -->
401
+ <div id="cidadeOutras" class="hidden mb-4">
402
+ <label class="block text-gray-700 font-medium mb-2" for="outraCidade">
403
+ Qual cidade? <span class="text-red-500">*</span>
404
+ </label>
405
+ <input id="outraCidade" name="outraCidade" type="text" required
406
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
407
+ </div>
408
+
409
+ <!-- Additional Notes -->
410
+ <div class="mb-4">
411
+ <label class="block text-gray-700 font-medium mb-2" for="notas">
412
+ Notas adicionais (algo que só você sabe e ajuda muito?) <span class="optional">(Opcional)</span>
413
+ </label>
414
+ <textarea id="notas" name="notas" rows="3"
415
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"></textarea>
416
+ </div>
417
+
418
+ <!-- Boost -->
419
+ <div class="mb-6">
420
+ <label class="block text-gray-700 font-medium mb-2" for="impulsionar">
421
+ É para impulsionar? <span class="text-red-500">*</span>
422
+ </label>
423
+ <select id="impulsionar" required
424
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
425
+ <option value="Não">Não</option>
426
+ <option value="Sim">Sim</option>
427
+ </select>
428
+ </div>
429
+
430
+ <!-- Boost Warning (conditional) -->
431
+ <div id="avisoImpulsionamento" class="hidden bg-yellow-50 border-l-4 border-yellow-400 p-4 mb-6 rounded">
432
+ <div class="flex items-start">
433
+ <div class="flex-shrink-0">
434
+ <i class="fas fa-exclamation-triangle text-yellow-500 text-xl mr-3 mt-1"></i>
435
+ </div>
436
+ <div>
437
+ <p class="text-yellow-800">Não recomendamos o impulsionamento para comparecer em menos de 4 dias</p>
438
+ </div>
439
+ </div>
440
+ </div>
441
+
442
+ <!-- Navigation Buttons -->
443
+ <div class="flex justify-between mt-8">
444
+ <button type="button" class="px-6 py-3 bg-green-600 text-white font-medium rounded-md hover:bg-green-700 transition flex items-center"
445
+ onclick="salvarPDF()" id="btnFinalizar">
446
+ <i class="fas fa-check-circle mr-2"></i> Finalizar e Salvar como PDF
447
+ </button>
448
+ <button type="button" class="px-6 py-3 bg-blue-600 text-white font-medium rounded-md hover:bg-blue-700 transition flex items-center"
449
+ onclick="validarSessao(1)" id="btnContinuar" style="display: none;">
450
+ Continuar para Impulsionamento <i class="fas fa-arrow-right ml-2"></i>
451
+ </button>
452
+ </div>
453
+ </section>
454
+
455
+ <!-- Section 2 - Boost -->
456
+ <section id="sessao2" class="form-section">
457
+ <h2 class="text-2xl font-bold text-blue-700 border-b border-blue-200 pb-3 mb-6 flex items-center">
458
+ <i class="fas fa-rocket mr-2"></i> Sessão 2 - Impulsionamento
459
+ </h2>
460
+
461
+ <!-- Boost Warning -->
462
+ <div id="avisoImpulsionamento4dias" class="bg-yellow-50 border-l-4 border-yellow-400 p-4 mb-6 rounded">
463
+ <div class="flex items-start">
464
+ <div class="flex-shrink-0">
465
+ <i class="fas fa-exclamation-triangle text-yellow-500 text-xl mr-3 mt-1"></i>
466
+ </div>
467
+ <div>
468
+ <p class="text-yellow-800">Não recomendamos o impulsionamento para comparecer em menos de 4 dias</p>
469
+ </div>
470
+ </div>
471
+ </div>
472
+
473
+ <!-- Gender -->
474
+ <div class="mb-4">
475
+ <label class="block text-gray-700 font-medium mb-2" for="genero">
476
+ Gênero <span class="text-red-500">*</span>
477
+ </label>
478
+ <select id="genero" name="genero" required
479
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
480
+ <option value="Ambos" selected>Ambos</option>
481
+ <option value="Masculino">Masculino</option>
482
+ <option value="Feminino">Feminino</option>
483
+ </select>
484
+ </div>
485
+
486
+ <!-- Age Range -->
487
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4 mb-4">
488
+ <div>
489
+ <label class="block text-gray-700 font-medium mb-2" for="idadeMinima">
490
+ Idade mínima <span class="text-red-500">*</span>
491
+ </label>
492
+ <input id="idadeMinima" name="idadeMinima" type="number" value="18" required min="18" max="100"
493
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
494
+ </div>
495
+ <div>
496
+ <label class="block text-gray-700 font-medium mb-2" for="idadeMaxima">
497
+ Idade máxima <span class="text-red-500">*</span>
498
+ </label>
499
+ <input id="idadeMaxima" name="idadeMaxima" type="number" value="55" required min="18" max="100"
500
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
501
+ </div>
502
+ </div>
503
+
504
+ <!-- Boost Days -->
505
+ <div class="mb-4">
506
+ <label class="block text-gray-700 font-medium mb-2" for="dias">
507
+ Quantos dias de impulsionamento? <span class="text-red-500">*</span>
508
+ </label>
509
+ <input id="dias" name="dias" type="number" value="4" required min="1"
510
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
511
+ </div>
512
+
513
+ <!-- Daily Budget -->
514
+ <div class="mb-4">
515
+ <label class="block text-gray-700 font-medium mb-2" for="orcamento">
516
+ Qual orçamento sugerido por dia? <span class="text-red-500">*</span>
517
+ </label>
518
+ <input id="orcamento" name="orcamento" type="text" value="R$50,00" required
519
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
520
+ </div>
521
+
522
+ <!-- Neighborhoods -->
523
+ <div id="bairrosJoinvilleContainer" class="mb-6">
524
+ <label class="block text-gray-700 font-medium mb-2" for="bairros">
525
+ Quais bairros? <span class="text-red-500">*</span>
526
+ </label>
527
+
528
+ <div class="bairros-container bg-white border border-gray-300 rounded-md overflow-hidden">
529
+ <div class="bairros-search p-2 border-b border-gray-300">
530
+ <input type="text" placeholder="Buscar bairro..." id="bairroSearch"
531
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
532
+ </div>
533
+ <div class="bairros-list p-2">
534
+ <select multiple="multiple" name="bairros" required
535
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
536
+ <option value="toda">Toda Joinville</option>
537
+ <optgroup label="CentroNorte">
538
+ <option value="Centro">Centro</option>
539
+ <option value="Bom Retiro">Bom Retiro</option>
540
+ <option value="Pirabeiraba/Centro">Pirabeiraba/Centro</option>
541
+ <option value="América">América</option>
542
+ <option value="Atiradores">Atiradores</option>
543
+ <option value="Costa e Silva">Costa e Silva</option>
544
+ <option value="Dona Francisca">Dona Francisca</option>
545
+ <option value="Glória">Glória</option>
546
+ <option value="Jardim Paraíso">Jardim Paraíso</option>
547
+ <option value="Jardim Sofia">Jardim Sofia</option>
548
+ <option value="Rio Bonito">Rio Bonito</option>
549
+ <option value="Saguaçu">Saguaçu</option>
550
+ <option value="Santo Antônio">Santo Antônio</option>
551
+ <option value="Santa Catarina">Santa Catarina</option>
552
+ <option value="Zona Industrial Norte">Zona Industrial Norte</option>
553
+ </optgroup>
554
+ <optgroup label="Zona Leste">
555
+ <option value="Aventureiro">Aventureiro</option>
556
+ <option value="Boa Vista">Boa Vista</option>
557
+ <option value="Comasa">Comasa</option>
558
+ <option value="Espinheiros">Espinheiros</option>
559
+ <option value="Iriri&uacute;">Iririú</option>
560
+ <option value="Jardim Iriri&uacute;">Jardim Iririú</option>
561
+ <option value="Vila Cubat&atilde;o">Vila Cubatão</option>
562
+ <option value="Zona Industrial Tupy">Zona Industrial Tupy</option>
563
+ </optgroup>
564
+ <optgroup label="Zona Sul">
565
+ <option value="Adhemar Garcia">Adhemar Garcia</option>
566
+ <option value="Anita Garibaldi">Anita Garibaldi</option>
567
+ <option value="Boehmerwald">Boehmerwald</option>
568
+ <option value="Bucarein">Bucarein</option>
569
+ <option value="F&aacute;tima">Fátima</option>
570
+ <option value="Floresta">Floresta</option>
571
+ <option value="Guanabara">Guanabara</option>
572
+ <option value="Itaum">Itaum</option>
573
+ <option value="Itinga">Itinga</option>
574
+ <option value="Jarivatuba">Jarivatuba</option>
575
+ <option value="Jo&atilde;o Costa">João Costa</option>
576
+ <option value="Paranaguamirim">Paranaguamirim</option>
577
+ <option value="Parque Guarani">Parque Guarani</option>
578
+ <option value="Petr&oacute;polis">Petrópolis</option>
579
+ <option value="Profipo">Profipo</option>
580
+ </optgroup>
581
+ <optgroup label="Zona Oeste">
582
+ <option value="Morro do Meio">Morro do Meio</option>
583
+ <option value="Nova Bras&iacute;lia">Nova Brasília</option>
584
+ <option value="S&atilde;o Marcos">São Marcos</option>
585
+ <option value="Ulysses Guimar&atilde;es">Ulysses Guimarães</option>
586
+ <option value="Vila Nova">Vila Nova</option>
587
+ </optgroup>
588
+ </select>
589
+ </div>
590
+ </div>
591
+ </div>
592
+
593
+ <!-- Other Neighborhoods -->
594
+ <div id="outrosBairrosContainer" class="hidden mb-6">
595
+ <label class="block text-gray-700 font-medium mb-2" for="outrosBairros">
596
+ Quais bairros? <span class="text-red-500">*</span>
597
+ </label>
598
+ <input id="outrosBairros" name="outrosBairros" type="text"
599
+ class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
600
+ </div>
601
+
602
+ <!-- Navigation Buttons -->
603
+ <div class="flex justify-between mt-8">
604
+ <button type="button" class="px-6 py-3 bg-gray-600 text-white font-medium rounded-md hover:bg-gray-700 transition flex items-center"
605
+ onclick="voltarSessao(1)">
606
+ <i class="fas fa-arrow-left mr-2"></i> Voltar
607
+ </button>
608
+ <button type="button" class="px-6 py-3 bg-green-600 text-white font-medium rounded-md hover:bg-green-700 transition flex items-center"
609
+ onclick="salvarPDF()">
610
+ <i class="fas fa-check-circle mr-2"></i> Finalizar e Salvar como PDF
611
+ </button>
612
+ </div>
613
+ </section>
614
+
615
+ <!-- Error Messages -->
616
+ <div id="errorMessages" class="hidden bg-red-50 border-l-4 border-red-500 p-4 mb-6 rounded">
617
+ <div class="flex items-start">
618
+ <div class="flex-shrink-0">
619
+ <i class="fas fa-exclamation-circle text-red-500 text-xl mr-3 mt-1"></i>
620
+ </div>
621
+ <div>
622
+ <p class="font-bold text-red-800">Por favor, corrija os seguintes erros:</p>
623
+ <ul id="errorList" class="list-disc pl-5 mt-2 text-red-700"></ul>
624
+ </div>
625
+ </div>
626
+ </div>
627
+ </form>
628
+ </div>
629
+
630
+ <script>
631
+ // Initialize form on load
632
+ document.addEventListener('DOMContentLoaded', function() {
633
+ // Set up all conditional fields
634
+ setupConditionalFields();
635
+
636
+ // Set up validation for age fields
637
+ setupAgeValidation();
638
+
639
+ // Set up date validation
640
+ setupDateValidation();
641
+ });
642
+
643
+ // Show/hide conditional fields
644
+ function setupConditionalFields() {
645
+ // Logo disclosure
646
+ document.getElementById('divulgaLogo').addEventListener('change', function() {
647
+ const avisoLogo = document.getElementById('avisoLogo');
648
+ const nomeEmpresaContainer = document.getElementById('nomeEmpresaContainer');
649
+
650
+ if (this.value === 'Sim') {
651
+ avisoLogo.classList.remove('hidden');
652
+ nomeEmpresaContainer.classList.add('hidden');
653
+ document.getElementById('empresa').removeAttribute('required');
654
+ } else if (this.value === 'N&atilde;o') {
655
+ avisoLogo.classList.add('hidden');
656
+ nomeEmpresaContainer.classList.remove('hidden');
657
+ document.getElementById('empresa').setAttribute('required', 'required');
658
+ } else {
659
+ avisoLogo.classList.add('hidden');
660
+ nomeEmpresaContainer.classList.add('hidden');
661
+ document.getElementById('empresa').removeAttribute('required');
662
+ }
663
+
664
+ // Check marketing warning
665
+ checkMarketingWarning();
666
+ });
667
+
668
+ // Production job
669
+ document.getElementById('producao').addEventListener('change', function() {
670
+ checkMarketingWarning();
671
+ });
672
+
673
+ // In-person attendance
674
+ document.getElementById('presencial').addEventListener('change', function() {
675
+ const outroLugar = document.getElementById('outroLugar');
676
+ const eventoContainer = document.getElementById('eventoContainer');
677
+
678
+ if (this.value === 'Outro') {
679
+ outroLugar.classList.remove('hidden');
680
+ eventoContainer.classList.remove('hidden');
681
+ document.getElementById('local').setAttribute('required', 'required');
682
+ } else {
683
+ outroLugar.classList.add('hidden');
684
+ eventoContainer.classList.add('hidden');
685
+ document.getElementById('local').removeAttribute('required');
686
+ }
687
+ });
688
+
689
+ // Defined date
690
+ document.getElementById('temDataDefinida').addEventListener('change', function() {
691
+ const datasContainer = document.getElementById('datasContainer');
692
+ if (this.value === 'Sim') {
693
+ datasContainer.classList.remove('hidden');
694
+ } else {
695
+ datasContainer.classList.add('hidden');
696
+ }
697
+ });
698
+
699
+ // Defined time
700
+ document.getElementById('temHorarioDefinido').addEventListener('change', function() {
701
+ const horariosContainer = document.getElementById('horariosContainer');
702
+ if (this.value === 'Sim') {
703
+ horariosContainer.classList.remove('hidden');
704
+ } else {
705
+ horariosContainer.classList.add('hidden');
706
+ }
707
+ });
708
+
709
+ // Joinville
710
+ document.getElementById('joinville').addEventListener('change', function() {
711
+ const cidadeOutras = document.getElementById('cidadeOutras');
712
+ const bairrosJoinvilleContainer = document.getElementById('bairrosJoinvilleContainer');
713
+ const outrosBairrosContainer = document.getElementById('outrosBairrosContainer');
714
+
715
+ if (this.value === 'N&atilde;o') {
716
+ cidadeOutras.classList.remove('hidden');
717
+ bairrosJoinvilleContainer.classList.add('hidden');
718
+ outrosBairrosContainer.classList.remove('hidden');
719
+ document.getElementById('outraCidade').setAttribute('required', 'required');
720
+ document.getElementById('outrosBairros').setAttribute('required', 'required');
721
+ document.querySelector('select[name="bairros"]').removeAttribute('required');
722
+ } else {
723
+ cidadeOutras.classList.add('hidden');
724
+ bairrosJoinvilleContainer.classList.remove('hidden');
725
+ outrosBairrosContainer.classList.add('hidden');
726
+ document.getElementById('outraCidade').removeAttribute('required');
727
+ document.getElementById('outrosBairros').removeAttribute('required');
728
+ document.querySelector('select[name="bairros"]').setAttribute('required', 'required');
729
+ }
730
+ });
731
+
732
+ // Boost
733
+ document.getElementById('impulsionar').addEventListener('change', function() {
734
+ const avisoImpulsionamento = document.getElementById('avisoImpulsionamento');
735
+ const btnContinuar = document.getElementById('btnContinuar');
736
+
737
+ if (this.value === 'Sim') {
738
+ avisoImpulsionamento.classList.remove('hidden');
739
+ btnContinuar.style.display = 'flex';
740
+ } else {
741
+ avisoImpulsionamento.classList.add('hidden');
742
+ btnContinuar.style.display = 'none';
743
+ }
744
+ });
745
+
746
+ // Toggle between date types
747
+ document.querySelectorAll('input[name="tipoData"]').forEach(radio => {
748
+ radio.addEventListener('change', function() {
749
+ const dataUnica = document.getElementById('dataUnica');
750
+ const dataIntervalo = document.getElementById('dataIntervalo');
751
+
752
+ if (this.value === 'unico') {
753
+ dataUnica.classList.remove('hidden');
754
+ dataIntervalo.classList.add('hidden');
755
+ } else {
756
+ dataUnica.classList.add('hidden');
757
+ dataIntervalo.classList.remove('hidden');
758
+ }
759
+ });
760
+ });
761
+
762
+ // Toggle between time types
763
+ document.querySelectorAll('input[name="tipoHorario"]').forEach(radio => {
764
+ radio.addEventListener('change', function() {
765
+ const horarioUnico = document.getElementById('horarioUnico');
766
+ const horarioIntervalo = document.getElementById('horarioIntervalo');
767
+
768
+ if (this.value === 'unico') {
769
+ horarioUnico.classList.remove('hidden');
770
+ horarioIntervalo.classList.add('hidden');
771
+ } else {
772
+ horarioUnico.classList.add('hidden');
773
+ horarioIntervalo.classList.remove('hidden');
774
+ }
775
+ });
776
+ });
777
+ }
778
+
779
+ // Check marketing warning condition
780
+ function checkMarketingWarning() {
781
+ const avisoMarketing = document.getElementById('avisoMarketing');
782
+ const divulgaLogo = document.getElementById('divulgaLogo').value;
783
+ const producao = document.getElementById('producao').value;
784
+
785
+ if (divulgaLogo === 'N&atilde;o' && producao === 'Sim') {
786
+ avisoMarketing.classList.remove('hidden');
787
+ } else {
788
+ avisoMarketing.classList.add('hidden');
789
+ }
790
+ }
791
+
792
+ // Set up age validation
793
+ function setupAgeValidation() {
794
+ const idadeMinima = document.getElementById('idadeMinima');
795
+ const idadeMaxima = document.getElementById('idadeMaxima');
796
+
797
+ idadeMinima.addEventListener('change', function() {
798
+ if (parseInt(this.value) < 18) {
799
+ this.value = 18;
800
+ }
801
+ if (parseInt(this.value) > parseInt(idadeMaxima.value)) {
802
+ idadeMaxima.value = this.value;
803
+ }
804
+ });
805
+
806
+ idadeMaxima.addEventListener('change', function() {
807
+ if (parseInt(this.value) < parseInt(idadeMinima.value)) {
808
+ this.value = idadeMinima.value;
809
+ }
810
+ if (parseInt(this.value) > 100) {
811
+ this.value = 100;
812
+ }
813
+ });
814
+ }
815
+
816
+ // Set up date validation
817
+ function setupDateValidation() {
818
+ const today = new Date();
819
+ today.setHours(0, 0, 0, 0);
820
+
821
+ // Validate single dates
822
+ document.addEventListener('change', function(e) {
823
+ if (e.target && e.target.name === 'datas[]') {
824
+ const selectedDate = new Date(e.target.value);
825
+ if (selectedDate < today) {
826
+ alert('Não é possível selecionar datas passadas');
827
+ e.target.value = '';
828
+ }
829
+ }
830
+
831
+ // Validate date ranges
832
+ if (e.target && (e.target.name === 'dataInicio[]' || e.target.name === 'dataFim[]')) {
833
+ const parent = e.target.closest('.campo-intervalo');
834
+ if (parent) {
835
+ const inicio = new Date(parent.querySelector('input[name="dataInicio[]"]').value);
836
+ const fim = new Date(parent.querySelector('input[name="dataFim[]"]').value);
837
+
838
+ if (inicio && fim && inicio > fim) {
839
+ alert('A data de início não pode ser depois da data de fim');
840
+ e.target.value = '';
841
+ }
842
+
843
+ if (inicio && inicio < today) {
844
+ alert('Não é possível selecionar datas passadas');
845
+ parent.querySelector('input[name="dataInicio[]"]').value = '';
846
+ }
847
+
848
+ if (fim && fim < today) {
849
+ alert('Não é possível selecionar datas passadas');
850
+ parent.querySelector('input[name="dataFim[]"]').value = '';
851
+ }
852
+ }
853
+ }
854
+ });
855
+ }
856
+
857
+ // Add/remove date fields
858
+ function adicionarData() {
859
+ const container = document.getElementById('datasUnicas');
860
+ const newField = document.createElement('div');
861
+ newField.className = 'campo-data flex items-center mb-2';
862
+ newField.innerHTML = `
863
+ <label class="mr-2">Data:</label>
864
+ <input type="date" name="datas[]" required
865
+ class="px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
866
+ <span class="remove-btn ml-2" onclick="removerData(this)"><i class="fas fa-times"></i></span>
867
+ `;
868
+ container.appendChild(newField);
869
+ }
870
+
871
+ function removerData(element) {
872
+ element.parentElement.remove();
873
+ }
874
+
875
+ // Add/remove date range fields
876
+ function adicionarIntervalo() {
877
+ const container = document.getElementById('dataIntervalo');
878
+ const newField = document.createElement('div');
879
+ newField.className = 'campo-intervalo grid grid-cols-5 gap-2 items-center mb-2';
880
+ newField.innerHTML = `
881
+ <label>De</label>
882
+ <input type="date" name="dataInicio[]" required
883
+ class="col-span-2 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
884
+ <label>até</label>
885
+ <input type="date" name="dataFim[]" required
886
+ class="col-span-2 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
887
+ <span class="remove-btn ml-2" onclick="removerIntervalo(this)"><i class="fas fa-times"></i></span>
888
+ `;
889
+ container.insertBefore(newField, container.lastElementChild);
890
+ }
891
+
892
+ function removerIntervalo(element) {
893
+ element.parentElement.remove();
894
+ }
895
+
896
+ // Add/remove time fields
897
+ function adicionarHorario() {
898
+ const container = document.getElementById('horarioUnico');
899
+ const newField = document.createElement('div');
900
+ newField.className = 'campo-horario flex items-center mb-2';
901
+ newField.innerHTML = `
902
+ <label class="mr-2">Horário:</label>
903
+ <input type="time" name="horarios[]" required
904
+ class="px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
905
+ <span class="remove-btn ml-2" onclick="removerHorario(this)"><i class="fas fa-times"></i></span>
906
+ `;
907
+ container.insertBefore(newField, container.lastElementChild);
908
+ }
909
+
910
+ function removerHorario(element) {
911
+ element.parentElement.remove();
912
+ }
913
+
914
+ // Form navigation
915
+ function validarSessao(sessaoAtual) {
916
+ // Simple validation - in a real app you would validate all required fields
917
+ const errorMessages = document.getElementById('errorMessages');
918
+ const errorList = document.getElementById('errorList');
919
+
920
+ errorMessages.classList.add('hidden');
921
+ errorList.innerHTML = '';
922
+
923
+ // Check if all required fields are filled
924
+ let isValid = true;
925
+ const requiredFields = document.querySelectorAll(`#sessao${sessaoAtual} [required]`);
926
+
927
+ requiredFields.forEach(field => {
928
+ if (!field.value.trim()) {
929
+ isValid = false;
930
+ const fieldName = field.previousElementSibling ? field.previousElementSibling.textContent.trim() : 'Campo obrigatório';
931
+ const errorItem = document.createElement('li');
932
+ errorItem.textContent = `${fieldName} não preenchido`;
933
+ errorList.appendChild(errorItem);
934
+
935
+ // Highlight the field
936
+ field.classList.add('border-red-500');
937
+ field.addEventListener('input', function() {
938
+ if (this.value.trim()) {
939
+ this.classList.remove('border-red-500');
940
+ }
941
+ });
942
+ }
943
+ });
944
+
945
+ // Special validation for age range
946
+ const idadeMinima = parseInt(document.getElementById('idadeMinima').value);
947
+ const idadeMaxima = parseInt(document.getElementById('idadeMaxima').value);
948
+ if (idadeMinima > idadeMaxima) {
949
+ isValid = false;
950
+ const errorItem = document.createElement('li');
951
+ errorItem.textContent = 'Idade mínima não pode ser maior que idade máxima';
952
+ errorList.appendChild(errorItem);
953
+ }
954
+
955
+ if (!isValid) {
956
+ errorMessages.classList.remove('hidden');
957
+ return;
958
+ }
959
+
960
+ // If validation passes, go to next section
961
+ if (sessaoAtual === 1) {
962
+ document.getElementById('sessao1').classList.remove('active');
963
+ document.getElementById('sessao2').classList.add('active');
964
+
965
+ // Check if we should show the boost warning for dates < 4 days
966
+ checkBoostDateWarning();
967
+ }
968
+ }
969
+
970
+ // Check if we should show boost date warning
971
+ function checkBoostDateWarning() {
972
+ const temDataDefinida = document.getElementById('temDataDefinida').value;
973
+ const avisoImpulsionamento4dias = document.getElementById('avisoImpulsionamento4dias');
974
+
975
+ if (temDataDefinida === 'Sim') {
976
+ // Check if any date is within 4 days
977
+ const today = new Date();
978
+ today.setHours(0, 0, 0, 0);
979
+
980
+ // Check single dates
981
+ const datas = document.querySelectorAll('input[name="datas[]"]');
982
+ let showWarning = false;
983
+
984
+ datas.forEach(dateInput => {
985
+ if (dateInput.value) {
986
+ const selectedDate = new Date(dateInput.value);
987
+ const diffTime = selectedDate - today;
988
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
989
+
990
+ if (diffDays < 4) {
991
+ showWarning = true;
992
+ }
993
+ }
994
+ });
995
+
996
+ // Check date ranges
997
+ const intervalos = document.querySelectorAll('.campo-intervalo');
998
+ intervalos.forEach(intervalo => {
999
+ const inicio = new Date(intervalo.querySelector('input[name="dataInicio[]"]').value);
1000
+ const fim = new Date(intervalo.querySelector('input[name="dataFim[]"]').value);
1001
+
1002
+ if (inicio) {
1003
+ const diffTime = inicio - today;
1004
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
1005
+
1006
+ if (diffDays < 4) {
1007
+ showWarning = true;
1008
+ }
1009
+ }
1010
+ });
1011
+
1012
+ if (showWarning) {
1013
+ avisoImpulsionamento4dias.classList.remove('hidden');
1014
+ } else {
1015
+ avisoImpulsionamento4dias.classList.add('hidden');
1016
+ }
1017
+ } else {
1018
+ avisoImpulsionamento4dias.classList.add('hidden');
1019
+ }
1020
+ }
1021
+
1022
+ function voltarSessao(sessao) {
1023
+ document.getElementById('sessao1').classList.remove('active');
1024
+ document.getElementById('sessao2').classList.remove('active');
1025
+
1026
+ if (sessao === 1) {
1027
+ document.getElementById('sessao1').classList.add('active');
1028
+ }
1029
+ }
1030
+
1031
+ // Save as PDF
1032
+ function salvarPDF() {
1033
+ const element = document.getElementById('vagaForm');
1034
+ const opt = {
1035
+ margin: 10,
1036
+ filename: 'formulario_vaga.pdf',
1037
+ image: { type: 'jpeg', quality: 0.98 },
1038
+ html2canvas: { scale: 2 },
1039
+ jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' }
1040
+ };
1041
+
1042
+ // Show loading state
1043
+ const saveBtn = document.querySelector('button[onclick="salvarPDF()"]');
1044
+ const originalText = saveBtn.innerHTML;
1045
+ saveBtn.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i> Gerando PDF...';
1046
+ saveBtn.disabled = true;
1047
+
1048
+ // Generate PDF
1049
+ html2pdf().set(opt).from(element).save().then(() => {
1050
+ // Restore button state
1051
+ saveBtn.innerHTML = originalText;
1052
+ saveBtn.disabled = false;
1053
+
1054
+ // Show success message
1055
+ const successMsg = document.createElement('div');
1056
+ successMsg.className = 'bg-green-50 border-l-4 border-green-500 p-4 mb-6 rounded animate-pulse';
1057
+ successMsg.innerHTML = `
1058
+ <div class="flex items-start">
1059
+ <div class="flex-shrink-0">
1060
+ <i class="fas fa-check-circle text-green-500 text-xl mr-3 mt-1"></i>
1061
+ </div>
1062
+ <div>
1063
+ <p class="font-bold text-green-800">Formulário salvo com sucesso!</p>
1064
+ <p class="text-green-700 mt-1">O arquivo PDF foi baixado para o seu dispositivo.</p>
1065
+ </div>
1066
+ </div>
1067
+ `;
1068
+ element.parentNode.insertBefore(successMsg, element.nextSibling);
1069
+
1070
+ // Remove message after 5 seconds
1071
+ setTimeout(() => {
1072
+ successMsg.remove();
1073
+ }, 5000);
1074
+ });
1075
+ }
1076
+
1077
+ // Neighborhood search
1078
+ document.getElementById('bairroSearch').addEventListener('input', function() {
1079
+ const searchTerm = this.value.toLowerCase();
1080
+ const options = document.querySelectorAll('select[name="bairros"] option');
1081
+
1082
+ options.forEach(option => {
1083
+ const text = option.textContent.toLowerCase();
1084
+ if (text.includes(searchTerm) || searchTerm === '') {
1085
+ option.style.display = '';
1086
+ } else {
1087
+ option.style.display = 'none';
1088
+ }
1089
+ });
1090
+ });
1091
+ </script>
1092
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Ticoliro/formulario" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
1093
+ </html>
prompts.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ aplique essas condiçoes nesse html GustavoNeneve: @workspace poderia me explicar as codiçoes para cada pergunta aparecer, cada avisto, quais perguntas são obrigatorias, quais não são, quais não são quando tiver perguntas não aparecem esse tipo de coisa Workspace: Coletando informações do workspaceVou explicar as principais condições e dependências do formulário: ### Campos Sempre Obrigatórios ```javascript const camposObrigatorios = { 'analista': 'Nome do analista', 'whatsapp': 'WhatsApp', 'divulgaLogo': 'Pode divulgar logo', 'producao': 'É produção', 'cargo': 'Nome do cargo', 'vagas': 'Quantas vagas', 'joinville': 'É para Joinville', 'impulsionar': 'É para impulsionar' } ``` ### Campos Opcionais ```html <!-- Campos marcados com class="optional" --> <label>Benefícios:<span class="optional"></span></label> <label>Requisitos:<span class="optional"></span></label> <label>Turnos:<span class="optional"></span></label> <label>Notas adicionais:<span class="optional"></span></label> ``` ### Condições de Exibição 1. **Logo e Nome da Empresa** ```javascript // Se "Pode divulgar logo?" = "Sim" - Mostra campo "Nome da empresa" (obrigatório) - Mostra aviso sobre formato do logo ``` 2. **Aviso Marketing** ```javascript // Se "Pode divulgar logo?" = "Não" E "É produção?" = "Sim" - Mostra aviso "O marketing NÃO está permitido divulgar vagas de produção sem logo" ``` 3. **Local de Comparecimento** ```javascript // Se "Comparecimento presencial?" = "Outro" - Mostra campo para inserir link do Google Maps (obrigatório) ``` 4. **Datas** ```javascript // Se "Tem data definida?" = "Sim" - Mostra opções de "Data única" ou "Intervalo" - Se "Data única": permite adicionar múltiplas datas - Se "Intervalo": permite adicionar períodos com início e fim ``` 5. **Horários** ```javascript // Se "Tem horário definido?" = "Sim" - Mostra opções de "Horário único" ou "Intervalo" - Se "Horário único": permite adicionar múltiplos horários - Se "Intervalo": requer hora início e fim ``` 6. **Cidade e Bairros** ```javascript // Se "É para Joinville?" = "Sim" - Mostra seleção de bairros de Joinville (obrigatório) // Se "É para Joinville?" = "Não" - Mostra campo "Qual cidade?" (obrigatório) - Mostra campo "Quais bairros?" (obrigatório) ``` 7. **Impulsionamento** ```javascript // Se "É para impulsionar?" = "Sim" - Mostra seção 2 completa com campos adicionais: - Gênero (obrigatório) - Idade mínima/máxima (obrigatório) - Dias de impulsionamento (obrigatório) - Orçamento por dia (obrigatório) - Mostra aviso se data for menor que 4 dias ``` ### Validações Especiais 1. **Idade**: ```javascript - Idade mínima deve ser >= 18 - Idade máxima não pode ser menor que idade mínima ``` 2. **Datas**: ```javascript - Não podem ser datas passadas - Se tiver impulsionamento, mostra aviso para datas em menos de 4 dias ``` 3. **Campos de Bairros**: ```javascript - Para Joinville: deve selecionar ao menos um bairro - Para outras cidades: deve preencher campo de texto ``` Se precisar de detalhes específicos sobre alguma destas condições, posso explicar melhor.