201 lines
8.9 KiB
PHP
201 lines
8.9 KiB
PHP
<!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>Reset Password - {{ config('app.name', 'Pencatatan Obat') }}</title>
|
|
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.1/font/bootstrap-icons.css" rel="stylesheet">
|
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
|
|
|
|
<style>
|
|
* { font-family: 'Inter', sans-serif; }
|
|
|
|
body {
|
|
min-height: 100vh;
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
display: flex; align-items: center; justify-content: center; padding: 20px;
|
|
}
|
|
|
|
.card-container { width: 100%; max-width: 440px; }
|
|
|
|
.card-custom {
|
|
background: rgba(255, 255, 255, 0.95);
|
|
backdrop-filter: blur(20px); border-radius: 24px;
|
|
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
|
|
padding: 48px 40px;
|
|
border: 1px solid rgba(255, 255, 255, 0.2);
|
|
animation: fadeInUp 0.6s ease-out;
|
|
}
|
|
|
|
.card-header-area { text-align: center; margin-bottom: 28px; }
|
|
|
|
.card-icon {
|
|
width: 72px; height: 72px;
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
border-radius: 20px; display: flex; align-items: center; justify-content: center;
|
|
margin: 0 auto 20px;
|
|
box-shadow: 0 10px 30px rgba(102, 126, 234, 0.4);
|
|
}
|
|
|
|
.card-icon i { font-size: 32px; color: white; }
|
|
.card-header-area h1 { font-size: 1.5rem; font-weight: 700; color: #1a1a2e; margin-bottom: 8px; }
|
|
.card-header-area p { color: #6b7280; font-size: 0.9rem; margin: 0; }
|
|
|
|
.form-floating { margin-bottom: 20px; }
|
|
|
|
.form-floating > .form-control {
|
|
height: 56px; padding: 16px 16px 16px 48px;
|
|
border: 2px solid #e5e7eb; border-radius: 14px;
|
|
font-size: 0.95rem; transition: all 0.3s ease; background-color: #f9fafb;
|
|
}
|
|
|
|
.form-floating > .form-control:focus {
|
|
border-color: #667eea;
|
|
box-shadow: 0 0 0 4px rgba(102, 126, 234, 0.15);
|
|
background-color: #fff;
|
|
}
|
|
|
|
.form-floating > label { padding-left: 48px; color: #9ca3af; }
|
|
|
|
.form-floating > .form-control:focus ~ label,
|
|
.form-floating > .form-control:not(:placeholder-shown) ~ label {
|
|
color: #667eea;
|
|
transform: scale(0.85) translateY(-0.75rem) translateX(0.15rem);
|
|
}
|
|
|
|
.input-icon {
|
|
position: absolute; left: 16px; top: 50%;
|
|
transform: translateY(-50%); color: #9ca3af;
|
|
font-size: 1.2rem; z-index: 5; transition: color 0.3s ease;
|
|
}
|
|
|
|
.form-floating:focus-within .input-icon { color: #667eea; }
|
|
|
|
.password-toggle {
|
|
position: absolute; right: 16px; top: 50%;
|
|
transform: translateY(-50%); background: none; border: none;
|
|
color: #9ca3af; cursor: pointer; z-index: 5; padding: 4px;
|
|
transition: color 0.3s ease;
|
|
}
|
|
.password-toggle:hover { color: #667eea; }
|
|
|
|
.btn-submit {
|
|
width: 100%; height: 52px;
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
border: none; border-radius: 14px; color: white;
|
|
font-weight: 600; font-size: 1rem;
|
|
transition: all 0.3s ease;
|
|
box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);
|
|
}
|
|
|
|
.btn-submit:hover {
|
|
transform: translateY(-2px);
|
|
box-shadow: 0 8px 25px rgba(102, 126, 234, 0.5);
|
|
background: linear-gradient(135deg, #5a6fd6 0%, #6a4190 100%);
|
|
color: white;
|
|
}
|
|
|
|
.alert { border-radius: 12px; border: none; font-size: 0.9rem; padding: 14px 16px; margin-bottom: 24px; }
|
|
.alert-danger { background-color: #fee2e2; color: #991b1b; }
|
|
.is-invalid { border-color: #ef4444 !important; }
|
|
.invalid-feedback { font-size: 0.85rem; margin-top: 6px; }
|
|
|
|
.bg-shapes { position: fixed; width: 100%; height: 100%; top: 0; left: 0; overflow: hidden; z-index: -1; }
|
|
.bg-shapes span { position: absolute; display: block; background: rgba(255,255,255,0.1); border-radius: 50%; animation: float 8s infinite ease-in-out; }
|
|
.bg-shapes span:nth-child(1) { width: 80px; height: 80px; top: 20%; left: 10%; }
|
|
.bg-shapes span:nth-child(2) { width: 120px; height: 120px; top: 60%; right: 10%; animation-delay: 2s; }
|
|
.bg-shapes span:nth-child(3) { width: 60px; height: 60px; bottom: 20%; left: 20%; animation-delay: 4s; }
|
|
|
|
@keyframes fadeInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } }
|
|
@keyframes float { 0%, 100% { transform: translateY(0) rotate(0deg); } 50% { transform: translateY(-20px) rotate(10deg); } }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="bg-shapes"><span></span><span></span><span></span></div>
|
|
|
|
<div class="card-container">
|
|
<div class="card-custom">
|
|
<div class="card-header-area">
|
|
<div class="card-icon">
|
|
<i class="bi bi-shield-lock"></i>
|
|
</div>
|
|
<h1>Reset Password</h1>
|
|
<p>Masukkan password baru Anda</p>
|
|
</div>
|
|
|
|
@if ($errors->any())
|
|
<div class="alert alert-danger">
|
|
<i class="bi bi-exclamation-circle me-2"></i>
|
|
@foreach ($errors->all() as $error)
|
|
{{ $error }}
|
|
@endforeach
|
|
</div>
|
|
@endif
|
|
|
|
<form method="POST" action="{{ route('password.store') }}">
|
|
@csrf
|
|
<input type="hidden" name="token" value="{{ $request->route('token') }}">
|
|
|
|
<!-- Email -->
|
|
<div class="form-floating position-relative">
|
|
<i class="bi bi-envelope input-icon"></i>
|
|
<input type="email"
|
|
class="form-control @error('email') is-invalid @enderror"
|
|
id="email" name="email"
|
|
value="{{ old('email', $request->email) }}"
|
|
placeholder="Email" required autofocus>
|
|
<label for="email">Email</label>
|
|
</div>
|
|
|
|
<!-- Password -->
|
|
<div class="form-floating position-relative">
|
|
<i class="bi bi-lock input-icon"></i>
|
|
<input type="password"
|
|
class="form-control @error('password') is-invalid @enderror"
|
|
id="password" name="password"
|
|
placeholder="Password Baru" required>
|
|
<label for="password">Password Baru</label>
|
|
<button type="button" class="password-toggle" onclick="togglePassword('password', 'toggleIcon1')">
|
|
<i class="bi bi-eye" id="toggleIcon1"></i>
|
|
</button>
|
|
</div>
|
|
|
|
<!-- Confirm Password -->
|
|
<div class="form-floating position-relative">
|
|
<i class="bi bi-lock-fill input-icon"></i>
|
|
<input type="password"
|
|
class="form-control"
|
|
id="password_confirmation" name="password_confirmation"
|
|
placeholder="Konfirmasi Password" required>
|
|
<label for="password_confirmation">Konfirmasi Password</label>
|
|
<button type="button" class="password-toggle" onclick="togglePassword('password_confirmation', 'toggleIcon2')">
|
|
<i class="bi bi-eye" id="toggleIcon2"></i>
|
|
</button>
|
|
</div>
|
|
|
|
<button type="submit" class="btn btn-submit">
|
|
<i class="bi bi-check-lg me-2"></i>Reset Password
|
|
</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
function togglePassword(inputId, iconId) {
|
|
const input = document.getElementById(inputId);
|
|
const icon = document.getElementById(iconId);
|
|
if (input.type === 'password') {
|
|
input.type = 'text';
|
|
icon.classList.replace('bi-eye', 'bi-eye-slash');
|
|
} else {
|
|
input.type = 'password';
|
|
icon.classList.replace('bi-eye-slash', 'bi-eye');
|
|
}
|
|
}
|
|
</script>
|
|
</body>
|
|
</html>
|