First Commit

This commit is contained in:
marco
2026-09-01 09:22:30 -03:00
commit a43ae23eb4
407 changed files with 36138 additions and 0 deletions
+27
View File
@@ -0,0 +1,27 @@
<x-guest-layout>
<div class="mb-4 text-sm text-gray-600">
{{ __('This is a secure area of the application. Please confirm your password before continuing.') }}
</div>
<form method="POST" action="{{ route('password.confirm') }}">
@csrf
<!-- Password -->
<div>
<x-input-label for="password" :value="__('Password')" />
<x-text-input id="password" class="block mt-1 w-full"
type="password"
name="password"
required autocomplete="current-password" />
<x-input-error :messages="$errors->get('password')" class="mt-2" />
</div>
<div class="flex justify-end mt-4">
<x-primary-button>
{{ __('Confirm') }}
</x-primary-button>
</div>
</form>
</x-guest-layout>
+55
View File
@@ -0,0 +1,55 @@
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>Recuperar Senha - GPrompt</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.1/font/bootstrap-icons.css">
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap" rel="stylesheet">
<style>
body { font-family: 'Roboto', sans-serif; background-color: #f8f9fc; }
.forgot-container { min-height: 100vh; display: flex; align-items: center; justify-content: center; }
.forgot-card { border: none; box-shadow: 0 2px 15px rgba(0,0,0,0.1); border-radius: 10px; width: 100%; max-width: 400px; }
.forgot-header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 10px 10px 0 0; padding: 2rem; text-align: center; }
</style>
</head>
<body>
<div class="forgot-container d-flex flex-column">
<div class="forgot-card flex-grow-0">
<div class="forgot-header">
<i class="bi bi-key" style="font-size: 3rem;"></i>
<h2 class="mt-2">Recuperar Senha</h2>
<p>Informe seu e-mail para receber o link</p>
</div>
<div class="card-body p-4">
@if(session('status'))
<div class="alert alert-success">{{ session('status') }}</div>
@endif
@if(session('error'))
<div class="alert alert-danger">{{ session('error') }}</div>
@endif
<form method="POST" action="{{ route('password.email') }}">
@csrf
<div class="mb-3">
<label for="email" class="form-label">E-mail</label>
<input type="email" class="form-control" id="email" name="email" value="{{ old('email') }}" required autofocus autocomplete="email">
@error('email') <div class="text-danger small">{{ $message }}</div> @enderror
</div>
<button type="submit" class="btn btn-primary w-100">Enviar Link</button>
</form>
<div class="mt-3 text-center">
<a href="{{ route('login') }}"><i class="bi bi-arrow-left"></i> Voltar para login</a>
</div>
</div>
</div>
@include('components.app-footer')
</div>
@include('components.cookie-consent-banner')
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
+125
View File
@@ -0,0 +1,125 @@
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>Login - GPrompt</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.1/font/bootstrap-icons.css">
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap" rel="stylesheet">
<style>
body { font-family: 'Roboto', sans-serif; background-color: #f8f9fc; }
.login-container { min-height: 100vh; display: flex; align-items: center; justify-content: center; }
.login-card { border: none; box-shadow: 0 2px 15px rgba(0,0,0,0.1); border-radius: 10px; width: 100%; max-width: 400px; }
.login-header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 10px 10px 0 0; padding: 2rem; text-align: center; }
.password-toggle { cursor: pointer; position: absolute; right: 10px; top: 38px; }
.captcha-refresh { cursor: pointer; }
</style>
</head>
<body>
<div class="login-container d-flex flex-column">
<div class="login-card flex-grow-0">
<div class="login-header">
<i class="bi bi-cpu" style="font-size: 3rem;"></i>
<h2 class="mt-2">GPrompt</h2>
<p>Faça login para continuar</p>
</div>
<div class="card-body p-4">
@if(session('error'))
<div class="alert alert-danger">{{ session('error') }}</div>
@endif
@if(session('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif
<form method="POST" action="{{ route('login') }}">
@csrf
<div class="mb-3">
<label for="email" class="form-label">E-mail</label>
<input type="email" class="form-control" id="email" name="email" value="{{ old('email') }}" required autofocus autocomplete="username">
@error('email') <div class="text-danger small">{{ $message }}</div> @enderror
</div>
<div class="mb-3 position-relative">
<label for="password" class="form-label">Senha</label>
<input type="password" class="form-control" id="password" name="password" required autocomplete="current-password">
<i class="bi bi-eye-slash password-toggle" id="togglePassword"></i>
@error('password') <div class="text-danger small">{{ $message }}</div> @enderror
</div>
<div class="mb-3">
<label for="captcha" class="form-label">Captcha</label>
<div class="input-group">
<span class="input-group-text" id="captchaQuestion">Carregando...</span>
<input type="text" class="form-control" id="captcha" name="captcha" required maxlength="4">
<button type="button" class="btn btn-outline-secondary captcha-refresh" id="refreshCaptcha">
<i class="bi bi-arrow-clockwise"></i>
</button>
</div>
@error('captcha') <div class="text-danger small">{{ $message }}</div> @enderror
</div>
<div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="remember_me" name="remember">
<label class="form-check-label" for="remember_me">Lembrar de mim</label>
</div>
<button type="submit" class="btn btn-primary w-100">Entrar</button>
</form>
<div class="mt-3 text-center">
<a href="{{ route('password.request') }}">Esqueceu a senha?</a>
</div>
@if(Route::has('register'))
<div class="mt-3 text-center">
<span>Não tem conta? <a href="{{ route('register') }}">Cadastre-se</a></span>
</div>
@endif
</div>
</div>
@include('components.app-footer')
</div>
@include('components.cookie-consent-banner')
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script>
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function() {
initLogin();
});
} else {
initLogin();
}
function initLogin() {
const toggle = document.getElementById('togglePassword');
const input = document.getElementById('password');
if (toggle && input) {
toggle.addEventListener('click', function() {
const type = input.getAttribute('type') === 'password' ? 'text' : 'password';
input.setAttribute('type', type);
toggle.classList.toggle('bi-eye');
toggle.classList.toggle('bi-eye-slash');
});
}
function loadCaptcha() {
const question = document.getElementById('captchaQuestion');
fetch('{{ route('captcha.generate') }}')
.then(response => response.json())
.then(data => {
if (question) question.textContent = data.expression;
})
.catch(() => {
if (question) question.textContent = 'Erro ao carregar captcha.';
});
}
const refresh = document.getElementById('refreshCaptcha');
if (refresh) {
refresh.addEventListener('click', loadCaptcha);
}
loadCaptcha();
}
</script>
</body>
</html>
+138
View File
@@ -0,0 +1,138 @@
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>Cadastro - GPrompt</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.1/font/bootstrap-icons.css">
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap" rel="stylesheet">
<style>
body { font-family: 'Roboto', sans-serif; background-color: #f8f9fc; }
.register-container { min-height: 100vh; display: flex; align-items: center; justify-content: center; }
.register-card { border: none; box-shadow: 0 2px 15px rgba(0,0,0,0.1); border-radius: 10px; width: 100%; max-width: 400px; }
.register-header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 10px 10px 0 0; padding: 2rem; text-align: center; }
.password-toggle { cursor: pointer; position: absolute; right: 10px; top: 38px; }
</style>
</head>
<body>
<div class="register-container d-flex flex-column">
<div class="register-card flex-grow-0">
<div class="register-header">
<i class="bi bi-cpu" style="font-size: 3rem;"></i>
<h2 class="mt-2">Criar Conta</h2>
<p>Junte-se ao GPrompt</p>
</div>
<div class="card-body p-4">
@if(session('error'))
<div class="alert alert-danger">{{ session('error') }}</div>
@endif
<form method="POST" action="{{ route('register') }}">
@csrf
<div class="mb-3">
<label for="name" class="form-label">Nome</label>
<input type="text" class="form-control" id="name" name="name" value="{{ old('name') }}" required autofocus autocomplete="name">
@error('name') <div class="text-danger small">{{ $message }}</div> @enderror
</div>
<div class="mb-3">
<label for="email" class="form-label">E-mail</label>
<input type="email" class="form-control" id="email" name="email" value="{{ old('email') }}" required autocomplete="email">
@error('email') <div class="text-danger small">{{ $message }}</div> @enderror
</div>
<div class="mb-3 position-relative">
<label for="password" class="form-label">Senha</label>
<input type="password" class="form-control" id="password" name="password" required autocomplete="new-password">
<i class="bi bi-eye-slash password-toggle" id="togglePassword"></i>
@error('password') <div class="text-danger small">{{ $message }}</div> @enderror
</div>
<div class="mb-3 position-relative">
<label for="password_confirmation" class="form-label">Confirmar Senha</label>
<input type="password" class="form-control" id="password_confirmation" name="password_confirmation" required autocomplete="new-password">
<i class="bi bi-eye-slash password-toggle" id="toggleConfirmPassword"></i>
@error('password_confirmation') <div class="text-danger small">{{ $message }}</div> @enderror
</div>
<div class="mb-3">
<label for="captcha" class="form-label">Captcha</label>
<div class="input-group">
<span class="input-group-text" id="captchaQuestion">Carregando...</span>
<input type="text" class="form-control" id="captcha" name="captcha" required maxlength="4">
<button type="button" class="btn btn-outline-secondary captcha-refresh" id="refreshCaptcha">
<i class="bi bi-arrow-clockwise"></i>
</button>
</div>
@error('captcha') <div class="text-danger small">{{ $message }}</div> @enderror
</div>
<div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="terms_of_service" name="terms_of_service" required>
<label class="form-check-label" for="terms_of_service">
@lang('auth.accept_terms') <a href="{{ route('legal.document.show', 'terms-of-service') }}" target="_blank">@lang('legal_documents.terms_of_service')</a>
</label>
</div>
<div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="privacy_policy" name="privacy_policy" required>
<label class="form-check-label" for="privacy_policy">
@lang('auth.accept_privacy') <a href="{{ route('legal.document.show', 'privacy-policy') }}" target="_blank">@lang('legal_documents.privacy_policy')</a>
</label>
</div>
<div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="terms" name="terms" required>
<label class="form-check-label" for="terms">Conta sujeita a aprovação do SuperAdmin.</label>
</div>
<button type="submit" class="btn btn-primary w-100">Cadastrar</button>
</form>
<div class="mt-3 text-center">
<span>Já tem conta? <a href="{{ route('login') }}">Faça login</a></span>
</div>
</div>
</div>
@include('components.app-footer')
</div>
@include('components.cookie-consent-banner')
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script>
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function() {
initRegister();
});
} else {
initRegister();
}
function initRegister() {
const toggles = document.querySelectorAll('.password-toggle');
toggles.forEach(toggle => {
toggle.addEventListener('click', function() {
const input = this.previousElementSibling;
const type = input.getAttribute('type') === 'password' ? 'text' : 'password';
input.setAttribute('type', type);
this.classList.toggle('bi-eye');
this.classList.toggle('bi-eye-slash');
});
});
function loadCaptcha() {
const question = document.getElementById('captchaQuestion');
fetch('{{ route('captcha.generate') }}')
.then(response => response.json())
.then(data => {
if (question) question.textContent = data.expression;
})
.catch(() => {
if (question) question.textContent = 'Erro ao carregar captcha.';
});
}
const refresh = document.getElementById('refreshCaptcha');
if (refresh) {
refresh.addEventListener('click', loadCaptcha);
}
loadCaptcha();
}
</script>
</body>
</html>
+81
View File
@@ -0,0 +1,81 @@
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>Redefinir Senha - GPrompt</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.1/font/bootstrap-icons.css">
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap" rel="stylesheet">
<style>
body { font-family: 'Roboto', sans-serif; background-color: #f8f9fc; }
.reset-container { min-height: 100vh; display: flex; align-items: center; justify-content: center; }
.reset-card { border: none; box-shadow: 0 2px 15px rgba(0,0,0,0.1); border-radius: 10px; width: 100%; max-width: 400px; }
.reset-header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 10px 10px 0 0; padding: 2rem; text-align: center; }
.password-toggle { cursor: pointer; position: absolute; right: 10px; top: 38px; }
</style>
</head>
<body>
<div class="reset-container d-flex flex-column">
<div class="reset-card flex-grow-0">
<div class="reset-header">
<i class="bi bi-shield-lock" style="font-size: 3rem;"></i>
<h2 class="mt-2">Redefinir Senha</h2>
<p>Digite sua nova senha</p>
</div>
<div class="card-body p-4">
<form method="POST" action="{{ route('password.update') }}">
@csrf
<input type="hidden" name="token" value="{{ $token ?? request()->route('token') }}">
<div class="mb-3">
<label for="email" class="form-label">E-mail</label>
<input type="email" class="form-control" id="email" name="email" value="{{ old('email', $email ?? request()->email) }}" required autofocus autocomplete="email">
@error('email') <div class="text-danger small">{{ $message }}</div> @enderror
</div>
<div class="mb-3 position-relative">
<label for="password" class="form-label">Nova Senha</label>
<input type="password" class="form-control" id="password" name="password" required autocomplete="new-password">
<i class="bi bi-eye-slash password-toggle" id="togglePassword"></i>
@error('password') <div class="text-danger small">{{ $message }}</div> @enderror
</div>
<div class="mb-3 position-relative">
<label for="password_confirmation" class="form-label">Confirmar Nova Senha</label>
<input type="password" class="form-control" id="password_confirmation" name="password_confirmation" required autocomplete="new-password">
<i class="bi bi-eye-slash password-toggle" id="toggleConfirmPassword"></i>
</div>
<button type="submit" class="btn btn-primary w-100">Redefinir Senha</button>
</form>
</div>
</div>
@include('components.app-footer')
</div>
@include('components.cookie-consent-banner')
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script>
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function() {
initResetPassword();
});
} else {
initResetPassword();
}
function initResetPassword() {
const toggles = document.querySelectorAll('.password-toggle');
toggles.forEach(toggle => {
toggle.addEventListener('click', function() {
const input = this.previousElementSibling;
const type = input.getAttribute('type') === 'password' ? 'text' : 'password';
input.setAttribute('type', type);
this.classList.toggle('bi-eye');
this.classList.toggle('bi-eye-slash');
});
});
}
</script>
</body>
</html>
+31
View File
@@ -0,0 +1,31 @@
<x-guest-layout>
<div class="mb-4 text-sm text-gray-600">
{{ __('Thanks for signing up! Before getting started, could you verify your email address by clicking on the link we just emailed to you? If you didn\'t receive the email, we will gladly send you another.') }}
</div>
@if (session('status') == 'verification-link-sent')
<div class="mb-4 font-medium text-sm text-green-600">
{{ __('A new verification link has been sent to the email address you provided during registration.') }}
</div>
@endif
<div class="mt-4 flex items-center justify-between">
<form method="POST" action="{{ route('verification.send') }}">
@csrf
<div>
<x-primary-button>
{{ __('Resend Verification Email') }}
</x-primary-button>
</div>
</form>
<form method="POST" action="{{ route('logout') }}">
@csrf
<button type="submit" class="underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
{{ __('Log Out') }}
</button>
</form>
</div>
</x-guest-layout>