|
<!DOCTYPE html> |
|
<html lang="pt-BR"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>Portal do Candidato - RHBrasil</title> |
|
<script src="https://cdn.tailwindcss.com"></script> |
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
|
<style> |
|
.gradient-bg { |
|
background: #0550c9; |
|
--tw-ring-color: #033a8c; |
|
} |
|
.input-focus:focus { |
|
box-shadow: 0 0 0 3px rgba(5, 80, 201, 255); |
|
} |
|
.shake { |
|
animation: shake 0.5s; |
|
} |
|
@keyframes shake { |
|
0%, 100% { transform: translateX(0); } |
|
10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); } |
|
20%, 40%, 60%, 80% { transform: translateX(5px); } |
|
} |
|
</style> |
|
</head> |
|
<body class="bg-gray-50 min-h-screen flex items-center justify-center p-4"> |
|
<div class="max-w-md w-full space-y-8 bg-[#0550c9] p-6 rounded-lg"> |
|
|
|
<div class="text-center"> |
|
<img src="https://raw.githubusercontent.com/GustavoNeneve/Cargos-e-Categorias/refs/heads/main/LOGO_RHBrasil.svg" alt="RHBrasil Logo" class="mx-auto h-12 w-auto hover:scale-105 transition-transform duration-200"> |
|
<h2 class="mt-6 text-3xl font-extrabold text-white"> |
|
Bem vind@ ao Portal do Candidato |
|
</h2> |
|
</div> |
|
|
|
|
|
<div class="bg-yellow-100 border-l-4 border-yellow-500 p-4 rounded"> |
|
<div class="flex"> |
|
<div class="flex-shrink-0"> |
|
<svg class="h-5 w-5 text-yellow-400" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor"> |
|
<path fill-rule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clip-rule="evenodd" /> |
|
</svg> |
|
</div> |
|
<div class="ml-3"> |
|
<p class="text-sm text-yellow-700"> |
|
Para você, candidato, a RHBrasil é totalmente gratuita. Se você, pessoa física, receber qualquer tipo de cobrança em nome da RHBrasil, cuidado! É golpe! Fique atento! |
|
</p> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<form id="loginForm" class="mt-8 space-y-6"> |
|
<div class="rounded-md shadow-sm space-y-4"> |
|
<div> |
|
<label for="cpf" class="block text-sm font-medium text-white">Seu CPF</label> |
|
<div class="mt-1 relative rounded-md shadow-sm"> |
|
<input id="cpf" name="cpf" type="text" required class="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 input-focus focus:outline-none focus:ring-[#0550c9] focus:border-[#0550c9] sm:text-sm" placeholder="000.000.000-00"> |
|
<div class="absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none"> |
|
<i class="fas fa-user text-gray-400"></i> |
|
</div> |
|
</div> |
|
<p class="mt-1 text-xs text-red-600 hidden" id="cpf-error">Esse campo é obrigatório!</p> |
|
</div> |
|
<div> |
|
<label for="password" class="block text-sm font-medium text-white">Sua senha</label> |
|
<div class="mt-1 relative rounded-md shadow-sm"> |
|
<input id="password" name="password" type="password" required class="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 input-focus focus:outline-none focus:ring-[#0550c9] focus:border-[#0550c9] sm:text-sm" placeholder="********"> |
|
<div class="absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none"> |
|
<i class="fas fa-lock text-gray-400"></i> |
|
</div> |
|
</div> |
|
<p class="mt-1 text-xs text-red-600 hidden" id="password-error">Esse campo é obrigatório!</p> |
|
</div> |
|
</div> |
|
|
|
<div class="flex items-center justify-between"> |
|
<div class="flex items-center"> |
|
<input id="remember-me" name="remember-me" type="checkbox" class="h-4 w-4 text-[#033a8c] focus:ring-[#033a8c] border-gray-300 rounded"> |
|
<label for="remember-me" class="ml-2 block text-sm text-white"> |
|
Lembrar senha |
|
</label> |
|
</div> |
|
|
|
<div class="text-sm"> |
|
<a href="#" id="forgotPassword" class="font-medium text-blue-300 hover:text-blue-200"> |
|
Esqueci minha senha |
|
</a> |
|
</div> |
|
</div> |
|
|
|
<div> |
|
<button type="submit" class="group relative w-full flex justify-center py-2 px-4 border border-transparent text-sm font-medium rounded-md text-white bg-blue-800 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition duration-150"> |
|
<span class="absolute left-0 inset-y-0 flex items-center pl-3"> |
|
<i class="fas fa-sign-in-alt text-white"></i> |
|
</span> |
|
Entrar |
|
</button> |
|
</div> |
|
</form> |
|
|
|
<div class="text-center text-sm"> |
|
<p class="text-gray-200"> |
|
Ainda não tem cadastro? |
|
<a href="https://www.rhbrasil.com.br/portaldocandidato/view/cadastro.php" class="font-medium text-blue-300 hover:text-blue-200 ml-1"> |
|
Clique aqui e cadastre seu currículo! |
|
</a> |
|
</p> |
|
</div> |
|
</div> |
|
|
|
|
|
<div id="forgotPasswordModal" class="fixed inset-0 bg-gray-600 bg-opacity-50 flex items-center justify-center hidden z-50 p-4"> |
|
<div class="bg-white rounded-lg shadow-xl max-w-md w-full p-6"> |
|
<div class="flex justify-between items-center mb-4"> |
|
<h3 class="text-lg font-medium text-gray-900">Redefinir senha</h3> |
|
<button id="closeModal" class="text-gray-400 hover:text-gray-500"> |
|
<i class="fas fa-times"></i> |
|
</button> |
|
</div> |
|
|
|
<div id="step1" class="space-y-4"> |
|
<p class="text-sm text-gray-500">Qual é o seu CPF?</p> |
|
<div> |
|
<input id="recoveryCpf" type="text" class="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 input-focus focus:outline-none focus:ring-[#0550c9] focus:border-[#0550c9] sm:text-sm" placeholder="000.000.000-00"> |
|
<p class="mt-1 text-xs text-red-600 hidden" id="recoveryCpf-error">Esse campo é obrigatório!</p> |
|
</div> |
|
|
|
<div class="flex justify-between pt-4"> |
|
<button id="backToLogin" type="button" class="inline-flex justify-center py-2 px-4 border border-gray-300 shadow-sm text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"> |
|
Voltar para o login |
|
</button> |
|
<button id="nextStep" type="button" class="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white gradient-bg hover:opacity-90 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[#0550c9]"> |
|
Continuar |
|
</button> |
|
</div> |
|
</div> |
|
|
|
<div id="step2" class="space-y-4 hidden"> |
|
<p class="text-sm text-gray-500">Escolha uma das opções para receber o código de redefinição de senha.</p> |
|
|
|
<div class="space-y-2"> |
|
<div class="flex items-center"> |
|
<input id="emailOption" name="recoveryMethod" type="radio" class="focus:ring-[#0550c9] h-4 w-4 text-[#0550c9] border-gray-300" checked> |
|
<label for="emailOption" class="ml-3 block text-sm font-medium text-gray-700"> |
|
E-mail |
|
</label> |
|
</div> |
|
<div class="flex items-center"> |
|
<input id="smsOption" name="recoveryMethod" type="radio" class="focus:ring-[#0550c9] h-4 w-4 text-[#0550c9] border-gray-300"> |
|
<label for="smsOption" class="ml-3 block text-sm font-medium text-gray-700"> |
|
SMS |
|
</label> |
|
</div> |
|
</div> |
|
|
|
<p class="text-xs text-gray-500">Caso você não tenha acesso a esse e-mail, contate o <span class="font-medium">suporte@rhbrasil.com.br</span> informando seu Nome Completo e CPF, que retornaremos o contato com você!</p> |
|
|
|
<div class="flex justify-between pt-4"> |
|
<button id="backToStep1" type="button" class="inline-flex justify-center py-2 px-4 border border-gray-300 shadow-sm text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"> |
|
Voltar |
|
</button> |
|
<button id="sendCode" type="button" class="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white gradient-bg hover:opacity-90 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[#0550c9]"> |
|
Enviar Código |
|
</button> |
|
</div> |
|
</div> |
|
|
|
<div id="step3" class="space-y-4 hidden"> |
|
<p class="text-sm text-gray-500">Informe o código enviado.</p> |
|
<div> |
|
<input id="verificationCode" type="text" class="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 input-focus focus:outline-none focus:ring-[#0550c9] focus:border-[#0550c9] sm:text-sm" placeholder="Código de 6 dígitos"> |
|
<p class="mt-1 text-xs text-red-600 hidden" id="code-error">Esse campo é obrigatório!</p> |
|
</div> |
|
|
|
<div class="flex justify-between pt-4"> |
|
<button id="backToStep2" type="button" class="inline-flex justify-center py-2 px-4 border border-gray-300 shadow-sm text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"> |
|
Voltar |
|
</button> |
|
<button id="confirmCode" type="button" class="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white gradient-bg hover:opacity-90 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[#0550c9]"> |
|
Confirmar Código |
|
</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<script> |
|
|
|
document.getElementById('loginForm').addEventListener('submit', function(e) { |
|
e.preventDefault(); |
|
let isValid = true; |
|
|
|
|
|
const cpf = document.getElementById('cpf'); |
|
const cpfError = document.getElementById('cpf-error'); |
|
if (!cpf.value.trim()) { |
|
cpf.classList.add('border-red-500'); |
|
cpfError.classList.remove('hidden'); |
|
isValid = false; |
|
} else { |
|
cpf.classList.remove('border-red-500'); |
|
cpfError.classList.add('hidden'); |
|
} |
|
|
|
|
|
const password = document.getElementById('password'); |
|
const passwordError = document.getElementById('password-error'); |
|
if (!password.value.trim()) { |
|
password.classList.add('border-red-500'); |
|
passwordError.classList.remove('hidden'); |
|
isValid = false; |
|
} else { |
|
password.classList.remove('border-red-500'); |
|
passwordError.classList.add('hidden'); |
|
} |
|
|
|
if (!isValid) { |
|
document.getElementById('loginForm').classList.add('shake'); |
|
setTimeout(() => { |
|
document.getElementById('loginForm').classList.remove('shake'); |
|
}, 500); |
|
return; |
|
} |
|
|
|
|
|
alert('Login realizado com sucesso!'); |
|
|
|
}); |
|
|
|
|
|
const forgotPasswordBtn = document.getElementById('forgotPassword'); |
|
const forgotPasswordModal = document.getElementById('forgotPasswordModal'); |
|
const closeModalBtn = document.getElementById('closeModal'); |
|
const backToLoginBtn = document.getElementById('backToLogin'); |
|
const nextStepBtn = document.getElementById('nextStep'); |
|
const backToStep1Btn = document.getElementById('backToStep1'); |
|
const sendCodeBtn = document.getElementById('sendCode'); |
|
const backToStep2Btn = document.getElementById('backToStep2'); |
|
const confirmCodeBtn = document.getElementById('confirmCode'); |
|
|
|
const step1 = document.getElementById('step1'); |
|
const step2 = document.getElementById('step2'); |
|
const step3 = document.getElementById('step3'); |
|
|
|
forgotPasswordBtn.addEventListener('click', function(e) { |
|
e.preventDefault(); |
|
forgotPasswordModal.classList.remove('hidden'); |
|
}); |
|
|
|
closeModalBtn.addEventListener('click', function() { |
|
forgotPasswordModal.classList.add('hidden'); |
|
resetModal(); |
|
}); |
|
|
|
backToLoginBtn.addEventListener('click', function() { |
|
forgotPasswordModal.classList.add('hidden'); |
|
resetModal(); |
|
}); |
|
|
|
nextStepBtn.addEventListener('click', function() { |
|
const recoveryCpf = document.getElementById('recoveryCpf'); |
|
const recoveryCpfError = document.getElementById('recoveryCpf-error'); |
|
|
|
if (!recoveryCpf.value.trim()) { |
|
recoveryCpf.classList.add('border-red-500'); |
|
recoveryCpfError.classList.remove('hidden'); |
|
return; |
|
} |
|
|
|
recoveryCpf.classList.remove('border-red-500'); |
|
recoveryCpfError.classList.add('hidden'); |
|
|
|
step1.classList.add('hidden'); |
|
step2.classList.remove('hidden'); |
|
}); |
|
|
|
backToStep1Btn.addEventListener('click', function() { |
|
step2.classList.add('hidden'); |
|
step1.classList.remove('hidden'); |
|
}); |
|
|
|
sendCodeBtn.addEventListener('click', function() { |
|
|
|
step2.classList.add('hidden'); |
|
step3.classList.remove('hidden'); |
|
}); |
|
|
|
backToStep2Btn.addEventListener('click', function() { |
|
step3.classList.add('hidden'); |
|
step2.classList.remove('hidden'); |
|
}); |
|
|
|
confirmCodeBtn.addEventListener('click', function() { |
|
const verificationCode = document.getElementById('verificationCode'); |
|
const codeError = document.getElementById('code-error'); |
|
|
|
if (!verificationCode.value.trim()) { |
|
verificationCode.classList.add('border-red-500'); |
|
codeError.classList.remove('hidden'); |
|
return; |
|
} |
|
|
|
verificationCode.classList.remove('border-red-500'); |
|
codeError.classList.add('hidden'); |
|
|
|
|
|
alert('Código verificado com sucesso! Um link para redefinição de senha foi enviado.'); |
|
forgotPasswordModal.classList.add('hidden'); |
|
resetModal(); |
|
}); |
|
|
|
function resetModal() { |
|
step1.classList.remove('hidden'); |
|
step2.classList.add('hidden'); |
|
step3.classList.add('hidden'); |
|
|
|
document.getElementById('recoveryCpf').value = ''; |
|
document.getElementById('verificationCode').value = ''; |
|
|
|
document.getElementById('recoveryCpf').classList.remove('border-red-500'); |
|
document.getElementById('recoveryCpf-error').classList.add('hidden'); |
|
document.getElementById('verificationCode').classList.remove('border-red-500'); |
|
document.getElementById('code-error').classList.add('hidden'); |
|
} |
|
|
|
|
|
document.getElementById('cpf').addEventListener('input', function(e) { |
|
let value = e.target.value.replace(/\D/g, ''); |
|
|
|
if (value.length > 3) { |
|
value = value.substring(0, 3) + '.' + value.substring(3); |
|
} |
|
if (value.length > 7) { |
|
value = value.substring(0, 7) + '.' + value.substring(7); |
|
} |
|
if (value.length > 11) { |
|
value = value.substring(0, 11) + '-' + value.substring(11); |
|
} |
|
if (value.length > 14) { |
|
value = value.substring(0, 14); |
|
} |
|
|
|
e.target.value = value; |
|
}); |
|
|
|
document.getElementById('recoveryCpf').addEventListener('input', function(e) { |
|
let value = e.target.value.replace(/\D/g, ''); |
|
|
|
if (value.length > 3) { |
|
value = value.substring(0, 3) + '.' + value.substring(3); |
|
} |
|
if (value.length > 7) { |
|
value = value.substring(0, 7) + '.' + value.substring(7); |
|
} |
|
if (value.length > 11) { |
|
value = value.substring(0, 11) + '-' + value.substring(11); |
|
} |
|
if (value.length > 14) { |
|
value = value.substring(0, 14); |
|
} |
|
|
|
e.target.value = value; |
|
}); |
|
</script> |
|
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-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/bendo" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
|
</html> |