perbaikan

perbaikan untuk responsive di mobile di fixkan lagi
This commit is contained in:
Ryan Maulana 2026-05-19 18:25:49 +07:00
parent 8711db9d6c
commit ae81d50a79
20 changed files with 7128 additions and 228 deletions

View File

@ -0,0 +1,575 @@
@extends('layouts.app')
@section('content')
<style>
@import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap');
* {
font-family: 'Plus Jakarta Sans', sans-serif;
box-sizing: border-box;
}
body {
background: #f1f5f9 !important;
margin: 0;
}
/* ─── HERO HEADER ─── */
.lap-hero {
background: linear-gradient(135deg, #064e3b 0%, #065f46 40%, #059669 100%);
padding: 2rem 2.5rem 2.2rem;
display: flex;
align-items: center;
gap: 1.1rem;
position: relative;
overflow: hidden;
}
.lap-hero::after {
content: '';
position: absolute;
right: -60px;
top: -60px;
width: 220px;
height: 220px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.05);
}
.lap-hero::before {
content: '';
position: absolute;
right: 80px;
bottom: -80px;
width: 180px;
height: 180px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.04);
}
.hero-icon {
width: 52px;
height: 52px;
background: rgba(255, 255, 255, 0.15);
border-radius: 14px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
border: 1px solid rgba(255, 255, 255, 0.2);
}
.hero-icon i {
font-size: 1.4rem;
color: #fff;
}
.hero-text h2 {
font-size: 1.4rem;
font-weight: 800;
color: #fff;
margin: 0 0 3px;
letter-spacing: -0.01em;
}
.hero-text p {
font-size: 0.82rem;
color: rgba(255, 255, 255, 0.7);
margin: 0;
}
/* ─── PAGE BODY ─── */
.page-body {
width: 100%;
padding: 2rem 2.5rem 3rem;
}
/* ─── STATS ROW ─── */
.stats-row {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 14px;
margin-bottom: 1.5rem;
}
.stat-card {
background: #fff;
border: 1px solid #e2e8f0;
border-radius: 16px;
padding: 1.4rem 1rem;
text-align: center;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.04);
transition: all 0.2s ease;
position: relative;
overflow: hidden;
}
.stat-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
}
.stat-card:nth-child(1)::before { background: #064e3b; }
.stat-card:nth-child(2)::before { background: #dc2626; }
.stat-card:nth-child(3)::before { background: #2563eb; }
.stat-card:nth-child(4)::before { background: #7c3aed; }
.stat-card:nth-child(5)::before { background: #d97706; }
.stat-card:hover {
transform: translateY(-3px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.09);
}
.stat-icon {
width: 38px;
height: 38px;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto 10px;
font-size: 1rem;
}
.stat-card:nth-child(1) .stat-icon { background: #d1fae5; color: #064e3b; }
.stat-card:nth-child(2) .stat-icon { background: #fee2e2; color: #dc2626; }
.stat-card:nth-child(3) .stat-icon { background: #dbeafe; color: #2563eb; }
.stat-card:nth-child(4) .stat-icon { background: #ede9fe; color: #7c3aed; }
.stat-card:nth-child(5) .stat-icon { background: #fef3c7; color: #d97706; }
.stat-value {
font-size: 1.6rem;
font-weight: 800;
line-height: 1.1;
margin-bottom: 5px;
}
.stat-card:nth-child(1) .stat-value { color: #064e3b; }
.stat-card:nth-child(2) .stat-value { color: #dc2626; }
.stat-card:nth-child(3) .stat-value { color: #2563eb; }
.stat-card:nth-child(4) .stat-value { color: #7c3aed; }
.stat-card:nth-child(5) .stat-value { color: #d97706; }
.stat-label {
font-size: 0.78rem;
color: #6b7280;
font-weight: 600;
margin: 0;
text-transform: uppercase;
letter-spacing: 0.05em;
}
/* ─── MAIN GRID ─── */
.main-grid {
display: grid;
grid-template-columns: 1fr 320px;
gap: 1.25rem;
}
/* ─── CARD ─── */
.info-card {
background: #fff;
border: 1px solid #e2e8f0;
border-radius: 16px;
overflow: hidden;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.04);
}
.card-header {
padding: 1rem 1.5rem;
background: #f8fafc;
border-bottom: 1px solid #e2e8f0;
display: flex;
align-items: center;
gap: 9px;
}
.card-header i { color: #064e3b; }
.card-header span {
font-size: 0.75rem;
font-weight: 800;
color: #374151;
text-transform: uppercase;
letter-spacing: 0.09em;
}
.card-body {
padding: 1.75rem;
}
/* ─── FORM AREA ─── */
.form-row-inline {
display: flex;
align-items: flex-end;
gap: 1rem;
margin-bottom: 1.25rem;
}
.field-wrap {
flex: 1;
min-width: 0;
}
.field-label {
display: flex;
align-items: center;
gap: 7px;
font-size: 0.82rem;
font-weight: 700;
color: #374151;
margin-bottom: 8px;
}
.field-label i {
color: #6b7280;
font-size: 0.78rem;
}
.field-select {
width: 100%;
padding: 0.75rem 2.5rem 0.75rem 1rem;
border: 1.5px solid #e5e7eb;
border-radius: 10px;
font-size: 0.92rem;
color: #0f172a;
background: #fff;
transition: all 0.2s;
outline: none;
font-family: 'Plus Jakarta Sans', sans-serif;
appearance: none;
-webkit-appearance: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23064e3b' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 1rem center;
cursor: pointer;
}
.field-select:hover { border-color: #94a3b8; }
.field-select:focus {
border-color: #064e3b;
box-shadow: 0 0 0 3px rgba(6, 78, 59, 0.12);
}
/* ─── CETAK BUTTON ─── */
.btn-cetak {
display: flex;
align-items: center;
justify-content: center;
gap: 9px;
width: 100%;
padding: 0.85rem 1.5rem;
border-radius: 10px;
border: none;
background: linear-gradient(135deg, #064e3b, #0d6e4f);
color: #fff;
font-size: 0.92rem;
font-weight: 700;
cursor: pointer;
transition: all 0.25s;
box-shadow: 0 4px 14px rgba(6, 78, 59, 0.3);
font-family: 'Plus Jakarta Sans', sans-serif;
}
.btn-cetak:hover {
transform: translateY(-2px);
box-shadow: 0 8px 22px rgba(6, 78, 59, 0.38);
}
.btn-cetak:active { transform: translateY(0); }
/* ─── INFO STRIP ─── */
.info-strip {
display: flex;
align-items: center;
gap: 10px;
background: #f0fdf4;
border: 1px solid #bbf7d0;
border-radius: 10px;
padding: 0.85rem 1rem;
margin-top: 1.25rem;
}
.info-strip i {
color: #064e3b;
flex-shrink: 0;
}
.info-strip p {
font-size: 0.8rem;
color: #166534;
margin: 0;
font-weight: 500;
line-height: 1.5;
}
/* ─── RINGKASAN KANAN ─── */
.ringkasan-list {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-direction: column;
gap: 10px;
}
.ringkasan-list li {
display: flex;
align-items: center;
gap: 10px;
font-size: 0.875rem;
color: #374151;
font-weight: 600;
padding: 0.65rem 0.85rem;
border-radius: 10px;
background: #f8fafc;
border: 1px solid #f1f5f9;
transition: all 0.15s;
}
.ringkasan-list li:hover {
background: #f0fdf4;
border-color: #bbf7d0;
}
.check-circle {
width: 24px;
height: 24px;
background: #d1fae5;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: #16a34a;
font-size: 0.7rem;
flex-shrink: 0;
}
.ringkasan-desc {
font-size: 0.8rem;
color: #64748b;
margin: 0 0 1rem;
line-height: 1.55;
}
/* ─── RESPONSIVE ─── */
@media (max-width: 1100px) {
.stats-row {
grid-template-columns: repeat(3, 1fr);
}
}
@media (max-width: 900px) {
.main-grid {
grid-template-columns: 1fr;
}
.stats-row {
grid-template-columns: repeat(3, 1fr);
}
.page-body {
padding: 1.5rem 1.25rem 2rem;
}
.lap-hero {
padding: 1.5rem 1.25rem;
}
}
@media (max-width: 640px) {
.stats-row {
grid-template-columns: repeat(2, 1fr);
}
.form-row-inline {
flex-direction: column;
align-items: stretch; /* ← FIX: was missing, caused right-align */
gap: 0.75rem;
}
.field-wrap {
width: 100%;
}
.field-select {
width: 100%;
}
.hero-text h2 {
font-size: 1.15rem;
}
.card-body {
padding: 1.25rem;
}
}
@media (max-width: 480px) {
.stats-row {
grid-template-columns: 1fr 1fr;
}
.stat-value {
font-size: 1.25rem;
}
.lap-hero {
padding: 1.25rem 1rem;
}
.page-body {
padding: 1rem 0.85rem 2rem;
}
}
</style>
{{-- ─── HERO ─── --}}
<div class="lap-hero">
<div class="hero-icon">
<i class="fas fa-chart-bar"></i>
</div>
<div class="hero-text">
<h2>Laporan Bulanan</h2>
<p>Ringkasan data iuran dan aktivitas penghuni per bulan</p>
</div>
</div>
<div class="page-body">
{{-- ─── STATS ─── --}}
<div class="stats-row">
<div class="stat-card">
<div class="stat-icon"><i class="fas fa-circle-check"></i></div>
<p class="stat-value">{{ $sukses }}</p>
<p class="stat-label">Sukses</p>
</div>
<div class="stat-card">
<div class="stat-icon"><i class="fas fa-circle-xmark"></i></div>
<p class="stat-value">{{ $gagal }}</p>
<p class="stat-label">Gagal</p>
</div>
<div class="stat-card">
<div class="stat-icon"><i class="fas fa-users"></i></div>
<p class="stat-value">{{ $totalPenghuni }}</p>
<p class="stat-label">Penghuni</p>
@if(Auth::user()->role !== 'admin')
<p style="font-size:0.7rem; color:#064e3b; margin-top:4px; font-weight:600;">RT Saya</p>
@endif
</div>
<div class="stat-card">
<div class="stat-icon"><i class="fas fa-house"></i></div>
<p class="stat-value">{{ $totalRumah }}</p>
<p class="stat-label">Rumah</p>
@if(Auth::user()->role !== 'admin')
<p style="font-size:0.7rem; color:#064e3b; margin-top:4px; font-weight:600;">RT Saya</p>
@endif
</div>
<div class="stat-card">
<div class="stat-icon"><i class="fas fa-money-bill-wave"></i></div>
<p class="stat-value" style="font-size:1.1rem;">Rp {{ number_format($totalIuran, 0, ',', '.') }}</p>
<p class="stat-label">Total Iuran</p>
</div>
</div>
{{-- ─── MAIN GRID ─── --}}
<div class="main-grid">
{{-- KIRI: FORM CETAK --}}
<div class="info-card">
<div class="card-header">
<i class="fas fa-print"></i>
<span>Cetak Laporan</span>
</div>
<div class="card-body">
<form action="{{ route('laporan.cetak') }}" method="GET">
<div class="form-row-inline">
<div class="field-wrap">
<label class="field-label">
<i class="fas fa-calendar"></i>
Pilih Bulan
</label>
<select name="bulan" class="field-select">
@foreach(['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'] as $i => $bln)
<option value="{{ $i + 1 }}" {{ (request('bulan') == $i + 1 || (!request('bulan') && $i + 1 == date('n'))) ? 'selected' : '' }}>
{{ $bln }}
</option>
@endforeach
</select>
</div>
<div class="field-wrap">
<label class="field-label">
<i class="fas fa-calendar-days"></i>
Tahun
</label>
<select name="tahun" class="field-select">
@for($y = date('Y'); $y >= date('Y') - 4; $y--)
<option value="{{ $y }}" {{ (request('tahun', date('Y')) == $y) ? 'selected' : '' }}>
{{ $y }}
</option>
@endfor
</select>
</div>
</div>
<button type="submit" class="btn-cetak">
<i class="fas fa-print"></i>
Cetak Laporan PDF
</button>
</form>
<div class="info-strip">
<i class="fas fa-circle-info"></i>
<p>Laporan akan dibuka dalam format PDF dan siap untuk dicetak atau disimpan.</p>
</div>
</div>
</div>
{{-- KANAN: RINGKASAN --}}
<div class="info-card">
<div class="card-header">
<i class="fas fa-list-check"></i>
<span>Isi Laporan</span>
</div>
<div class="card-body">
<p class="ringkasan-desc">
Laporan mencakup data lengkap periode yang dipilih:
</p>
<ul class="ringkasan-list">
<li>
<div class="check-circle"><i class="fas fa-check"></i></div>
Data Iuran Bulanan
</li>
<li>
<div class="check-circle"><i class="fas fa-check"></i></div>
Data Penghuni Aktif
</li>
<li>
<div class="check-circle"><i class="fas fa-check"></i></div>
Aktivitas Pembayaran
</li>
<li>
<div class="check-circle"><i class="fas fa-check"></i></div>
Rekap Rumah & Unit
</li>
<li>
<div class="check-circle"><i class="fas fa-check"></i></div>
Status Tunggakan
</li>
</ul>
</div>
</div>
</div>
</div>
@endsection

View File

@ -0,0 +1,348 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Lupa Password - Green View</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Plus Jakarta Sans', sans-serif;
height: 100vh;
overflow: hidden;
background: #0a3d1e;
}
.auth-wrapper {
display: flex;
height: 100vh;
}
/* ─── LEFT PANEL (Logo) ─── */
.auth-left {
width: 55%;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
overflow: hidden;
background: #ffffff;
}
.auth-left::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 60% 50% at 80% 110%, rgba(25,148,84,0.10) 0%, transparent 70%),
radial-gradient(ellipse 50% 40% at -10% -10%, rgba(16,110,54,0.08) 0%, transparent 70%);
pointer-events: none;
}
.auth-left .brand-tagline {
margin-top: 18px;
font-size: 13px;
font-weight: 600;
letter-spacing: 3px;
text-transform: uppercase;
color: #2d7a4f;
opacity: 0.7;
}
.auth-left img {
width: 68%;
max-width: 340px;
object-fit: contain;
position: relative;
filter: drop-shadow(0 12px 32px rgba(15,80,40,0.18));
animation: floatLogo 5s ease-in-out infinite;
}
@keyframes floatLogo {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
.deco-circle {
position: absolute;
border-radius: 50%;
border: 1.5px solid rgba(25,148,84,0.12);
pointer-events: none;
}
.deco-circle.c1 { width: 420px; height: 420px; bottom: -120px; right: -120px; }
.deco-circle.c2 { width: 260px; height: 260px; bottom: -60px; right: -60px; }
.deco-circle.c3 { width: 160px; height: 160px; top: 30px; left: 30px; }
/* ─── RIGHT PANEL (Form) ─── */
.auth-right {
width: 45%;
background: linear-gradient(145deg, #1a6e3a 0%, #2e9e58 45%, #1a8040 100%);
display: flex;
align-items: center;
justify-content: center;
padding: 48px 40px;
position: relative;
overflow: hidden;
}
.auth-right::before {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.035'/%3E%3C/svg%3E");
opacity: 0.5;
pointer-events: none;
}
.auth-right::after {
content: '';
position: absolute;
width: 340px; height: 340px;
background: radial-gradient(circle, rgba(255,255,255,0.07) 0%, transparent 70%);
bottom: -80px; right: -80px;
border-radius: 50%;
pointer-events: none;
}
.blob-top {
position: absolute;
width: 240px; height: 240px;
background: radial-gradient(circle, rgba(255,255,255,0.06) 0%, transparent 70%);
top: -60px; left: -60px;
border-radius: 50%;
pointer-events: none;
}
/* ─── CARD ─── */
.auth-card {
width: 100%;
max-width: 360px;
position: relative;
z-index: 1;
animation: slideUp 0.55s cubic-bezier(0.22, 1, 0.36, 1) both;
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(28px); }
to { opacity: 1; transform: translateY(0); }
}
/* ─── HEADER ─── */
.card-header-area {
text-align: center;
margin-bottom: 28px;
}
.card-header-area .badge-pill {
display: inline-block;
background: rgba(255,255,255,0.15);
backdrop-filter: blur(6px);
border: 1px solid rgba(255,255,255,0.25);
color: #fff;
font-size: 11px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
padding: 5px 14px;
border-radius: 99px;
margin-bottom: 14px;
}
.card-header-area h4 {
color: #ffffff;
font-size: 20px;
font-weight: 800;
margin-bottom: 8px;
}
.card-header-area p {
color: rgba(255,255,255,0.65);
font-size: 13px;
line-height: 1.5;
margin: 0;
}
/* ─── INFO BOX ─── */
.info-box {
background: rgba(255,255,255,0.12);
border: 1px solid rgba(255,255,255,0.2);
border-radius: 10px;
padding: 12px 14px;
color: rgba(255,255,255,0.85);
font-size: 12.5px;
text-align: center;
margin-bottom: 22px;
line-height: 1.5;
}
/* ─── ALERTS ─── */
.alert {
border-radius: 10px;
font-size: 13px;
padding: 10px 14px;
margin-bottom: 16px;
border: none;
text-align: center;
}
.alert-danger { background: rgba(220,53,69,0.85); color: #fff; }
.alert-success { background: rgba(25,135,84,0.85); color: #fff; }
.alert-info { background: rgba(13,110,253,0.75); color: #fff; }
/* ─── INPUT ─── */
.form-group {
margin-bottom: 18px;
}
.input-wrap {
position: relative;
}
.input-wrap .icon {
position: absolute;
left: 13px;
top: 50%;
transform: translateY(-50%);
font-size: 14px;
pointer-events: none;
}
.form-control {
width: 100%;
padding: 11px 12px 11px 38px;
border-radius: 10px;
border: 1.5px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.94);
color: #1a2e1a;
font-size: 14px;
font-family: inherit;
outline: none;
transition: border 0.2s, box-shadow 0.2s;
}
.form-control::placeholder { color: #aab7aa; }
.form-control:focus {
border-color: rgba(255,255,255,0.6);
box-shadow: 0 0 0 3px rgba(255,255,255,0.18);
background: #ffffff;
}
/* ─── BUTTON ─── */
.btn-submit {
width: 100%;
padding: 12px;
border-radius: 10px;
border: none;
background: #ffffff;
color: #1a6e3a;
font-size: 14.5px;
font-weight: 800;
font-family: inherit;
letter-spacing: 0.5px;
cursor: pointer;
transition: transform 0.15s, box-shadow 0.2s, background 0.2s;
box-shadow: 0 4px 18px rgba(0,0,0,0.15);
}
.btn-submit:hover {
background: #f0faf4;
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
.btn-submit:active { transform: translateY(0); }
/* ─── LINKS ─── */
.links-area {
text-align: center;
margin-top: 20px;
}
.links-area a {
color: rgba(255,255,255,0.75);
font-size: 12.5px;
text-decoration: none;
transition: color 0.15s;
}
.links-area a:hover { color: #fff; }
/* ─── RESPONSIVE ─── */
@media (max-width: 768px) {
.auth-left { display: none; }
.auth-right { width: 100%; }
}
</style>
</head>
<body>
<div class="auth-wrapper">
{{-- LEFT: Logo Panel --}}
<div class="auth-left">
<div class="deco-circle c1"></div>
<div class="deco-circle c2"></div>
<div class="deco-circle c3"></div>
<img src="{{ asset('tunggal.png') }}" alt="Green View Logo">
<span class="brand-tagline">Real Estate &bull; Bondowoso</span>
</div>
{{-- RIGHT: Form Panel --}}
<div class="auth-right">
<div class="blob-top"></div>
<div class="auth-card">
<div class="card-header-area">
<div class="badge-pill">🔑 Reset Password</div>
<h4>Lupa Password?</h4>
<p>Tenang, kami akan bantu.<br>Masukkan email akun Anda.</p>
</div>
<div class="info-box">
📧 Link reset password akan dikirim ke email Anda
</div>
@if(session('error'))
<div class="alert alert-danger">{{ session('error') }}</div>
@endif
@if(session('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif
@if(session('status'))
<div class="alert alert-info">{{ session('status') }}</div>
@endif
<form method="POST" action="{{ route('password.sendOtp') }}">
@csrf
<div class="form-group">
<div class="input-wrap">
<span class="icon">✉️</span>
<input type="email" name="email" class="form-control" placeholder="Masukkan email Anda" required>
</div>
</div>
<button type="submit" class="btn-submit">
Kirim Link Reset
</button>
</form>
<div class="links-area">
<a href="{{ route('login') }}"> Kembali ke Login</a>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,485 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Lupa Password - Green View</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html, body {
font-family: 'Plus Jakarta Sans', sans-serif;
min-height: 100%;
background: #0a3d1e;
overflow-x: hidden;
}
/* ─── WRAPPER ─── */
.auth-wrapper {
display: flex;
flex-direction: row;
min-height: 100vh;
}
/* ─── LEFT PANEL (Logo) ─── */
.auth-left {
width: 55%;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
overflow: hidden;
background: #ffffff;
}
.auth-left::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 60% 50% at 80% 110%, rgba(25,148,84,0.10) 0%, transparent 70%),
radial-gradient(ellipse 50% 40% at -10% -10%, rgba(16,110,54,0.08) 0%, transparent 70%);
pointer-events: none;
}
.auth-left .brand-tagline {
margin-top: 18px;
font-size: 13px;
font-weight: 600;
letter-spacing: 3px;
text-transform: uppercase;
color: #2d7a4f;
opacity: 0.7;
}
.auth-left img {
width: 68%;
max-width: 340px;
object-fit: contain;
position: relative;
filter: drop-shadow(0 12px 32px rgba(15,80,40,0.18));
animation: floatLogo 5s ease-in-out infinite;
}
@keyframes floatLogo {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
.deco-circle {
position: absolute;
border-radius: 50%;
border: 1.5px solid rgba(25,148,84,0.12);
pointer-events: none;
}
.deco-circle.c1 { width: 420px; height: 420px; bottom: -120px; right: -120px; }
.deco-circle.c2 { width: 260px; height: 260px; bottom: -60px; right: -60px; }
.deco-circle.c3 { width: 160px; height: 160px; top: 30px; left: 30px; }
/* ─── RIGHT PANEL (Form) ─── */
.auth-right {
width: 45%;
background: linear-gradient(145deg, #1a6e3a 0%, #2e9e58 45%, #1a8040 100%);
display: flex;
align-items: center;
justify-content: center;
padding: 48px 40px;
position: relative;
overflow: hidden;
}
.auth-right::before {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.035'/%3E%3C/svg%3E");
opacity: 0.5;
pointer-events: none;
}
.auth-right::after {
content: '';
position: absolute;
width: 340px; height: 340px;
background: radial-gradient(circle, rgba(255,255,255,0.07) 0%, transparent 70%);
bottom: -80px; right: -80px;
border-radius: 50%;
pointer-events: none;
}
.blob-top {
position: absolute;
width: 240px; height: 240px;
background: radial-gradient(circle, rgba(255,255,255,0.06) 0%, transparent 70%);
top: -60px; left: -60px;
border-radius: 50%;
pointer-events: none;
}
/* ─── CARD ─── */
.auth-card {
width: 100%;
max-width: 360px;
position: relative;
z-index: 1;
animation: slideUp 0.55s cubic-bezier(0.22, 1, 0.36, 1) both;
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(28px); }
to { opacity: 1; transform: translateY(0); }
}
/* ─── HEADER ─── */
.card-header-area {
text-align: center;
margin-bottom: 28px;
}
.card-header-area .badge-pill {
display: inline-block;
background: rgba(255,255,255,0.15);
backdrop-filter: blur(6px);
border: 1px solid rgba(255,255,255,0.25);
color: #fff;
font-size: 11px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
padding: 5px 14px;
border-radius: 99px;
margin-bottom: 14px;
}
.card-header-area h4 {
color: #ffffff;
font-size: 20px;
font-weight: 800;
margin-bottom: 8px;
}
.card-header-area p {
color: rgba(255,255,255,0.65);
font-size: 13px;
line-height: 1.5;
margin: 0;
}
/* ─── INFO BOX ─── */
.info-box {
background: rgba(255,255,255,0.12);
border: 1px solid rgba(255,255,255,0.2);
border-radius: 10px;
padding: 12px 14px;
color: rgba(255,255,255,0.85);
font-size: 12.5px;
text-align: center;
margin-bottom: 22px;
line-height: 1.5;
}
/* ─── ALERTS ─── */
.alert {
border-radius: 10px;
font-size: 13px;
padding: 10px 14px;
margin-bottom: 16px;
border: none;
text-align: center;
}
.alert-danger { background: rgba(220,53,69,0.85); color: #fff; }
.alert-success { background: rgba(25,135,84,0.85); color: #fff; }
.alert-info { background: rgba(13,110,253,0.75); color: #fff; }
/* ─── INPUT ─── */
.form-group {
margin-bottom: 18px;
}
.input-wrap {
position: relative;
}
.input-wrap .icon {
position: absolute;
left: 13px;
top: 50%;
transform: translateY(-50%);
font-size: 14px;
pointer-events: none;
}
.form-control {
width: 100%;
padding: 11px 12px 11px 38px;
border-radius: 10px;
border: 1.5px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.94);
color: #1a2e1a;
font-size: 16px; /* cegah auto-zoom iOS */
font-family: inherit;
outline: none;
transition: border 0.2s, box-shadow 0.2s;
-webkit-appearance: none;
appearance: none;
}
.form-control::placeholder { color: #aab7aa; }
.form-control:focus {
border-color: rgba(255,255,255,0.6);
box-shadow: 0 0 0 3px rgba(255,255,255,0.18);
background: #ffffff;
}
/* ─── BUTTON ─── */
.btn-submit {
width: 100%;
padding: 13px;
border-radius: 10px;
border: none;
background: #ffffff;
color: #1a6e3a;
font-size: 14.5px;
font-weight: 800;
font-family: inherit;
letter-spacing: 0.5px;
cursor: pointer;
transition: transform 0.15s, box-shadow 0.2s, background 0.2s;
box-shadow: 0 4px 18px rgba(0,0,0,0.15);
-webkit-tap-highlight-color: transparent;
}
.btn-submit:hover {
background: #f0faf4;
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
.btn-submit:active {
transform: translateY(0);
background: #e4f5ec;
}
/* ─── LINKS ─── */
.links-area {
text-align: center;
margin-top: 20px;
}
.links-area a {
color: rgba(255,255,255,0.75);
font-size: 12.5px;
text-decoration: none;
transition: color 0.15s;
}
.links-area a:hover { color: #fff; }
/* ─── RESPONSIVE: Tablet ─── */
@media screen and (min-width: 769px) and (max-width: 1024px) {
.auth-left { width: 40%; }
.auth-right { width: 60%; padding: 40px 28px; }
.auth-left img { width: 80%; }
}
/* ══════════════════════════════════════════
MOBILE 768px LAYOUT: atas-bawah
══════════════════════════════════════════ */
@media screen and (max-width: 768px) {
.auth-wrapper {
flex-direction: column !important;
min-height: 100vh;
}
/* ── Panel Atas: Logo ── */
.auth-left {
width: 100% !important;
height: auto !important;
min-height: unset !important;
padding: 44px 24px 36px !important;
flex-shrink: 0;
background: linear-gradient(160deg, #ffffff 60%, #f0faf5 100%) !important;
order: 0;
}
.auth-left img {
width: 50% !important;
max-width: 185px !important;
animation: none !important;
filter: drop-shadow(0 8px 20px rgba(15,80,40,0.14)) !important;
}
.auth-left .brand-tagline {
margin-top: 12px !important;
font-size: 10px !important;
letter-spacing: 2.5px !important;
}
.deco-circle.c1,
.deco-circle.c2 { display: none !important; }
.deco-circle.c3 { width: 90px !important; height: 90px !important; top: 12px !important; left: 12px !important; }
/* ── Panel Bawah: Form ── */
.auth-right {
width: 100% !important;
flex: 1 !important;
padding: 36px 24px 52px !important;
align-items: flex-start !important;
justify-content: center !important;
border-radius: 28px 28px 0 0 !important;
margin-top: -24px !important;
order: 1;
}
.auth-card {
max-width: 100% !important;
width: 100% !important;
}
.card-header-area {
margin-bottom: 20px !important;
}
.card-header-area .badge-pill {
font-size: 10px !important;
padding: 4px 12px !important;
}
.card-header-area h4 {
font-size: 18px !important;
}
.card-header-area p {
font-size: 12px !important;
}
.info-box {
font-size: 12px !important;
padding: 10px 12px !important;
margin-bottom: 18px !important;
}
.form-group {
margin-bottom: 14px !important;
}
.form-control {
padding: 13px 12px 13px 40px !important;
border-radius: 12px !important;
font-size: 16px !important;
}
.btn-submit {
padding: 14px !important;
font-size: 15px !important;
border-radius: 12px !important;
}
.links-area {
margin-top: 22px !important;
}
.links-area a {
font-size: 13px !important;
padding: 4px 0 !important;
display: inline-block !important;
}
}
/* ─── Small Mobile ≤ 390px ─── */
@media screen and (max-width: 390px) {
.auth-left { padding: 36px 16px 28px !important; }
.auth-left img { width: 46% !important; max-width: 160px !important; }
.auth-right { padding: 28px 20px 44px !important; }
}
/* ─── Landscape Mobile ─── */
@media screen and (max-width: 768px) and (orientation: landscape) {
.auth-left {
padding: 18px 24px 16px !important;
}
.auth-left img { width: 26% !important; max-width: 100px !important; }
.auth-left .brand-tagline { margin-top: 6px !important; font-size: 9px !important; }
.auth-right {
padding: 22px 24px 32px !important;
border-radius: 20px 20px 0 0 !important;
margin-top: -10px !important;
}
.card-header-area { margin-bottom: 14px !important; }
.form-group { margin-bottom: 10px !important; }
}
</style>
</head>
<body>
<div class="auth-wrapper">
{{-- TOP / LEFT: Logo Panel --}}
<div class="auth-left">
<div class="deco-circle c1"></div>
<div class="deco-circle c2"></div>
<div class="deco-circle c3"></div>
<img src="{{ asset('tunggal.png') }}" alt="Green View Logo">
<span class="brand-tagline">Real Estate &bull; Bondowoso</span>
</div>
{{-- BOTTOM / RIGHT: Form Panel --}}
<div class="auth-right">
<div class="blob-top"></div>
<div class="auth-card">
<div class="card-header-area">
<div class="badge-pill">🔑 Reset Password</div>
<h4>Lupa Password?</h4>
<p>Tenang, kami akan bantu.<br>Masukkan email akun Anda.</p>
</div>
<div class="info-box">
📧 Link reset password akan dikirim ke email Anda
</div>
@if(session('error'))
<div class="alert alert-danger">{{ session('error') }}</div>
@endif
@if(session('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif
@if(session('status'))
<div class="alert alert-info">{{ session('status') }}</div>
@endif
<form method="POST" action="{{ route('password.sendOtp') }}">
@csrf
<div class="form-group">
<div class="input-wrap">
<span class="icon">✉️</span>
<input type="email" name="email" class="form-control" placeholder="Masukkan email Anda" required autocomplete="email">
</div>
</div>
<button type="submit" class="btn-submit">
Kirim Link Reset
</button>
</form>
<div class="links-area">
<a href="{{ route('login') }}"> Kembali ke Login</a>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,520 @@
@extends('layouts.auth')
@section('content')
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html, body {
font-family: 'Plus Jakarta Sans', sans-serif;
min-height: 100%;
background: #0a3d1e;
overflow-x: hidden;
}
/* ─── WRAPPER ─── */
.auth-wrapper {
display: flex;
min-height: 100vh;
flex-direction: row; /* desktop: side by side */
}
/* ─── LEFT PANEL (Logo) ─── */
.auth-left {
width: 55%;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
overflow: hidden;
background: #ffffff;
}
.auth-left::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 60% 50% at 80% 110%, rgba(25,148,84,0.10) 0%, transparent 70%),
radial-gradient(ellipse 50% 40% at -10% -10%, rgba(16,110,54,0.08) 0%, transparent 70%);
pointer-events: none;
}
.auth-left .brand-tagline {
margin-top: 18px;
font-size: 13px;
font-weight: 600;
letter-spacing: 3px;
text-transform: uppercase;
color: #2d7a4f;
opacity: 0.7;
}
.auth-left img {
width: 68%;
max-width: 340px;
object-fit: contain;
position: relative;
filter: drop-shadow(0 12px 32px rgba(15,80,40,0.18));
animation: floatLogo 5s ease-in-out infinite;
}
@keyframes floatLogo {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
.deco-circle {
position: absolute;
border-radius: 50%;
border: 1.5px solid rgba(25,148,84,0.12);
pointer-events: none;
}
.deco-circle.c1 { width: 420px; height: 420px; bottom: -120px; right: -120px; }
.deco-circle.c2 { width: 260px; height: 260px; bottom: -60px; right: -60px; }
.deco-circle.c3 { width: 160px; height: 160px; top: 30px; left: 30px; }
/* ─── RIGHT PANEL (Form) ─── */
.auth-right {
width: 45%;
background: linear-gradient(145deg, #1a6e3a 0%, #2e9e58 45%, #1a8040 100%);
display: flex;
align-items: center;
justify-content: center;
padding: 48px 40px;
position: relative;
overflow: hidden;
}
.auth-right::before {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.035'/%3E%3C/svg%3E");
opacity: 0.5;
pointer-events: none;
}
.auth-right::after {
content: '';
position: absolute;
width: 340px; height: 340px;
background: radial-gradient(circle, rgba(255,255,255,0.07) 0%, transparent 70%);
bottom: -80px; right: -80px;
border-radius: 50%;
pointer-events: none;
}
.blob-top {
position: absolute;
width: 240px; height: 240px;
background: radial-gradient(circle, rgba(255,255,255,0.06) 0%, transparent 70%);
top: -60px; left: -60px;
border-radius: 50%;
pointer-events: none;
}
/* ─── CARD ─── */
.auth-card {
width: 100%;
max-width: 360px;
position: relative;
z-index: 1;
animation: slideUp 0.55s cubic-bezier(0.22, 1, 0.36, 1) both;
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(28px); }
to { opacity: 1; transform: translateY(0); }
}
/* ─── HEADER ─── */
.card-header-area {
text-align: center;
margin-bottom: 32px;
}
.card-header-area .badge-pill {
display: inline-block;
background: rgba(255,255,255,0.15);
backdrop-filter: blur(6px);
border: 1px solid rgba(255,255,255,0.25);
color: #fff;
font-size: 11px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
padding: 5px 14px;
border-radius: 99px;
margin-bottom: 14px;
}
.card-header-area h4 {
color: #ffffff;
font-size: 18px;
font-weight: 800;
line-height: 1.3;
margin-bottom: 6px;
}
.card-header-area p {
color: rgba(255,255,255,0.65);
font-size: 12.5px;
margin: 0;
}
/* ─── ALERTS ─── */
.alert {
border-radius: 10px;
font-size: 13px;
padding: 10px 14px;
margin-bottom: 16px;
border: none;
}
.alert-danger { background: rgba(220,53,69,0.85); color: #fff; }
.alert-success { background: rgba(25,135,84,0.85); color: #fff; }
/* ─── FORM GROUP ─── */
.form-group {
margin-bottom: 18px;
}
.form-group label {
display: block;
color: rgba(255,255,255,0.85);
font-size: 12.5px;
font-weight: 600;
margin-bottom: 7px;
letter-spacing: 0.4px;
}
.input-wrap {
position: relative;
}
.input-wrap .icon {
position: absolute;
left: 13px;
top: 50%;
transform: translateY(-50%);
color: rgba(0,0,0,0.3);
font-size: 15px;
pointer-events: none;
}
.form-control {
width: 100%;
padding: 11px 12px 11px 38px;
border-radius: 10px;
border: 1.5px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.94);
color: #1a2e1a;
font-size: 16px;
font-family: inherit;
outline: none;
transition: border 0.2s, box-shadow 0.2s;
-webkit-appearance: none;
appearance: none;
}
.form-control::placeholder { color: #aab7aa; }
.form-control:focus {
border-color: rgba(255,255,255,0.6);
box-shadow: 0 0 0 3px rgba(255,255,255,0.18);
background: #ffffff;
}
.toggle-eye {
position: absolute;
right: 12px;
top: 50%;
transform: translateY(-50%);
cursor: pointer;
color: #888;
font-size: 15px;
background: none;
border: none;
padding: 0;
line-height: 1;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
}
/* ─── LOGIN BUTTON ─── */
.btn-login {
width: 100%;
padding: 14px;
border-radius: 10px;
border: none;
background: #ffffff;
color: #1a6e3a;
font-size: 15px;
font-weight: 800;
font-family: inherit;
letter-spacing: 0.5px;
cursor: pointer;
transition: transform 0.15s, box-shadow 0.2s, background 0.2s;
box-shadow: 0 4px 18px rgba(0,0,0,0.15);
margin-top: 4px;
-webkit-tap-highlight-color: transparent;
}
.btn-login:hover {
background: #f0faf4;
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
.btn-login:active {
transform: translateY(0);
background: #e4f5ec;
}
/* ─── LINKS ─── */
.links-area {
text-align: center;
margin-top: 20px;
}
.links-area a {
color: rgba(255,255,255,0.75);
font-size: 12.5px;
text-decoration: none;
transition: color 0.15s;
}
.links-area a:hover { color: #fff; }
.links-area .divider {
color: rgba(255,255,255,0.35);
margin: 0 8px;
font-size: 11px;
}
/* ─── RESPONSIVE: Tablet ─── */
@media screen and (min-width: 769px) and (max-width: 1024px) {
.auth-left { width: 40%; }
.auth-right { width: 60%; padding: 40px 28px; }
.auth-left img { width: 80%; }
}
/* ══════════════════════════════════════════
MOBILE 768px LAYOUT: atas-bawah
══════════════════════════════════════════ */
@media screen and (max-width: 768px) {
/* Wrapper jadi kolom */
.auth-wrapper {
flex-direction: column !important;
min-height: 100vh;
}
/* ── Panel Atas: Logo ── */
.auth-left {
width: 100% !important;
height: auto !important;
min-height: unset !important;
padding: 44px 24px 36px !important;
flex-shrink: 0;
background: linear-gradient(160deg, #ffffff 60%, #f0faf5 100%) !important;
order: 0;
}
.auth-left img {
width: 52% !important;
max-width: 190px !important;
animation: none !important;
filter: drop-shadow(0 8px 20px rgba(15,80,40,0.14)) !important;
}
.auth-left .brand-tagline {
margin-top: 12px !important;
font-size: 10px !important;
letter-spacing: 2.5px !important;
}
/* Dekorasi: sembunyikan lingkaran besar */
.deco-circle.c1,
.deco-circle.c2 { display: none !important; }
.deco-circle.c3 { width: 90px !important; height: 90px !important; top: 12px !important; left: 12px !important; }
/* ── Panel Bawah: Form ── */
.auth-right {
width: 100% !important;
flex: 1 !important;
padding: 36px 24px 52px !important;
align-items: flex-start !important;
justify-content: center !important;
border-radius: 28px 28px 0 0 !important;
margin-top: -24px !important;
order: 1;
}
.auth-card {
max-width: 100% !important;
width: 100% !important;
}
.card-header-area {
margin-bottom: 24px !important;
}
.card-header-area .badge-pill {
font-size: 10px !important;
padding: 4px 12px !important;
}
.card-header-area h4 {
font-size: 17px !important;
}
.card-header-area p {
font-size: 12px !important;
}
.form-group {
margin-bottom: 15px !important;
}
.form-group label {
font-size: 12px !important;
}
.form-control {
padding: 13px 12px 13px 40px !important;
border-radius: 12px !important;
font-size: 16px !important; /* cegah zoom iOS */
}
.btn-login {
padding: 15px !important;
font-size: 15px !important;
border-radius: 12px !important;
margin-top: 8px !important;
}
.links-area {
display: flex !important;
flex-direction: column !important;
gap: 12px !important;
align-items: center !important;
margin-top: 22px !important;
}
.links-area a {
font-size: 13px !important;
padding: 4px 0 !important;
display: inline-block !important;
}
.links-area .divider { display: none !important; }
}
/* ─── Small Mobile ≤ 390px ─── */
@media screen and (max-width: 390px) {
.auth-left { padding: 36px 16px 28px !important; }
.auth-left img { width: 46% !important; max-width: 165px !important; }
.auth-right { padding: 28px 20px 44px !important; }
}
/* ─── Landscape Mobile ─── */
@media screen and (max-width: 768px) and (orientation: landscape) {
.auth-left {
padding: 20px 24px 18px !important;
}
.auth-left img { width: 28% !important; max-width: 110px !important; }
.auth-left .brand-tagline { margin-top: 8px !important; font-size: 9px !important; }
.auth-right {
padding: 24px 24px 32px !important;
border-radius: 20px 20px 0 0 !important;
margin-top: -12px !important;
}
.card-header-area { margin-bottom: 14px !important; }
.form-group { margin-bottom: 10px !important; }
}
</style>
<div class="auth-wrapper">
{{-- TOP / LEFT: Logo Panel --}}
<div class="auth-left">
<div class="deco-circle c1"></div>
<div class="deco-circle c2"></div>
<div class="deco-circle c3"></div>
<img src="{{ asset('tunggal.png') }}" alt="Green View Logo">
<span class="brand-tagline">Real Estate &bull; Bondowoso</span>
</div>
{{-- BOTTOM / RIGHT: Form Panel --}}
<div class="auth-right">
<div class="blob-top"></div>
<div class="auth-card">
<div class="card-header-area">
<div class="badge-pill">🏡 Real Estate</div>
<h4>PT Tunggal Griya Sakinah<br>(GREEN VIEW)</h4>
<p>Kab. Bondowoso, Jawa Timur</p>
</div>
@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.proses') }}">
@csrf
<div class="form-group">
<label>Username / Email</label>
<div class="input-wrap">
<span class="icon">👤</span>
<input type="text" name="login" class="form-control" placeholder="Masukkan username atau email" required autocomplete="username">
</div>
</div>
<div class="form-group">
<label>Password</label>
<div class="input-wrap">
<span class="icon">🔒</span>
<input type="password" name="password" id="password" class="form-control" placeholder="Masukkan password" required autocomplete="current-password">
<button type="button" class="toggle-eye" onclick="togglePassword()" aria-label="Tampilkan/sembunyikan password">👁</button>
</div>
</div>
<button type="submit" class="btn-login">
Login
</button>
</form>
<div class="links-area">
<a href="{{ route('register') }}">Belum punya akun? Register</a>
<span class="divider">|</span>
<a href="{{ route('password.forgot') }}">Lupa Password?</a>
</div>
</div>
</div>
</div>
<script>
function togglePassword() {
const p = document.getElementById("password");
p.type = p.type === "password" ? "text" : "password";
}
</script>
@endsection

View File

@ -0,0 +1,520 @@
@extends('layouts.auth')
@section('content')
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Plus Jakarta Sans', sans-serif;
min-height: 100vh;
background: #0a3d1e;
}
/* ─── WRAPPER ─── */
.auth-wrapper {
display: flex;
min-height: 100vh;
}
/* ─── LEFT PANEL (Logo) ─── */
.auth-left {
width: 55%;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
overflow: hidden;
background: #ffffff;
}
.auth-left::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 60% 50% at 80% 110%, rgba(25,148,84,0.10) 0%, transparent 70%),
radial-gradient(ellipse 50% 40% at -10% -10%, rgba(16,110,54,0.08) 0%, transparent 70%);
pointer-events: none;
}
.auth-left .brand-tagline {
margin-top: 18px;
font-size: 13px;
font-weight: 600;
letter-spacing: 3px;
text-transform: uppercase;
color: #2d7a4f;
opacity: 0.7;
}
.auth-left img {
width: 68%;
max-width: 340px;
object-fit: contain;
position: relative;
filter: drop-shadow(0 12px 32px rgba(15,80,40,0.18));
animation: floatLogo 5s ease-in-out infinite;
}
@keyframes floatLogo {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
.deco-circle {
position: absolute;
border-radius: 50%;
border: 1.5px solid rgba(25,148,84,0.12);
pointer-events: none;
}
.deco-circle.c1 { width: 420px; height: 420px; bottom: -120px; right: -120px; }
.deco-circle.c2 { width: 260px; height: 260px; bottom: -60px; right: -60px; }
.deco-circle.c3 { width: 160px; height: 160px; top: 30px; left: 30px; }
/* ─── RIGHT PANEL (Form) ─── */
.auth-right {
width: 45%;
background: linear-gradient(145deg, #1a6e3a 0%, #2e9e58 45%, #1a8040 100%);
display: flex;
align-items: center;
justify-content: center;
padding: 48px 40px;
position: relative;
overflow: hidden;
}
.auth-right::before {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.035'/%3E%3C/svg%3E");
opacity: 0.5;
pointer-events: none;
}
.auth-right::after {
content: '';
position: absolute;
width: 340px; height: 340px;
background: radial-gradient(circle, rgba(255,255,255,0.07) 0%, transparent 70%);
bottom: -80px; right: -80px;
border-radius: 50%;
pointer-events: none;
}
.blob-top {
position: absolute;
width: 240px; height: 240px;
background: radial-gradient(circle, rgba(255,255,255,0.06) 0%, transparent 70%);
top: -60px; left: -60px;
border-radius: 50%;
pointer-events: none;
}
/* ─── CARD ─── */
.auth-card {
width: 100%;
max-width: 360px;
position: relative;
z-index: 1;
animation: slideUp 0.55s cubic-bezier(0.22, 1, 0.36, 1) both;
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(28px); }
to { opacity: 1; transform: translateY(0); }
}
/* ─── HEADER ─── */
.card-header-area {
text-align: center;
margin-bottom: 32px;
}
.card-header-area .badge-pill {
display: inline-block;
background: rgba(255,255,255,0.15);
backdrop-filter: blur(6px);
border: 1px solid rgba(255,255,255,0.25);
color: #fff;
font-size: 11px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
padding: 5px 14px;
border-radius: 99px;
margin-bottom: 14px;
}
.card-header-area h4 {
color: #ffffff;
font-size: 18px;
font-weight: 800;
line-height: 1.3;
margin-bottom: 6px;
}
.card-header-area p {
color: rgba(255,255,255,0.65);
font-size: 12.5px;
margin: 0;
}
/* ─── ALERTS ─── */
.alert {
border-radius: 10px;
font-size: 13px;
padding: 10px 14px;
margin-bottom: 16px;
border: none;
}
.alert-danger { background: rgba(220,53,69,0.85); color: #fff; }
.alert-success { background: rgba(25,135,84,0.85); color: #fff; }
/* ─── FORM GROUP ─── */
.form-group {
margin-bottom: 18px;
}
.form-group label {
display: block;
color: rgba(255,255,255,0.85);
font-size: 12.5px;
font-weight: 600;
margin-bottom: 7px;
letter-spacing: 0.4px;
}
.input-wrap {
position: relative;
}
.input-wrap .icon {
position: absolute;
left: 13px;
top: 50%;
transform: translateY(-50%);
color: rgba(0,0,0,0.3);
font-size: 15px;
pointer-events: none;
}
.form-control {
width: 100%;
padding: 11px 12px 11px 38px;
border-radius: 10px;
border: 1.5px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.94);
color: #1a2e1a;
font-size: 16px; /* 16px mencegah auto-zoom iOS */
font-family: inherit;
outline: none;
transition: border 0.2s, box-shadow 0.2s;
-webkit-appearance: none;
appearance: none;
}
.form-control::placeholder { color: #aab7aa; }
.form-control:focus {
border-color: rgba(255,255,255,0.6);
box-shadow: 0 0 0 3px rgba(255,255,255,0.18);
background: #ffffff;
}
.toggle-eye {
position: absolute;
right: 12px;
top: 50%;
transform: translateY(-50%);
cursor: pointer;
color: #888;
font-size: 15px;
background: none;
border: none;
padding: 0;
line-height: 1;
/* area sentuh lebih besar di mobile */
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
}
/* ─── LOGIN BUTTON ─── */
.btn-login {
width: 100%;
padding: 14px;
border-radius: 10px;
border: none;
background: #ffffff;
color: #1a6e3a;
font-size: 15px;
font-weight: 800;
font-family: inherit;
letter-spacing: 0.5px;
cursor: pointer;
transition: transform 0.15s, box-shadow 0.2s, background 0.2s;
box-shadow: 0 4px 18px rgba(0,0,0,0.15);
margin-top: 4px;
-webkit-tap-highlight-color: transparent;
}
.btn-login:hover {
background: #f0faf4;
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
.btn-login:active {
transform: translateY(0);
background: #e4f5ec;
}
/* ─── LINKS ─── */
.links-area {
text-align: center;
margin-top: 20px;
}
.links-area a {
color: rgba(255,255,255,0.75);
font-size: 12.5px;
text-decoration: none;
transition: color 0.15s;
}
.links-area a:hover { color: #fff; }
.links-area .divider {
color: rgba(255,255,255,0.35);
margin: 0 8px;
font-size: 11px;
}
/* ─── RESPONSIVE: Tablet ─── */
@media (min-width: 769px) and (max-width: 1024px) {
.auth-left { width: 40%; }
.auth-right { width: 60%; padding: 40px 28px; }
.auth-left img { width: 80%; }
}
/* ─── RESPONSIVE: Mobile ─── */
@media (max-width: 768px) {
html, body { overflow-x: hidden; }
.auth-wrapper {
flex-direction: column;
min-height: 100vh;
}
/* ── Panel Kiri: banner logo di atas ── */
.auth-left {
width: 100%;
height: auto;
padding: 44px 24px 36px;
flex-shrink: 0;
/* gradient hijau tipis di background putih agar tidak terlalu polos */
background: linear-gradient(160deg, #ffffff 60%, #f0faf5 100%);
}
.auth-left img {
width: 48%;
max-width: 180px;
animation: none;
filter: drop-shadow(0 8px 20px rgba(15,80,40,0.14));
}
.auth-left .brand-tagline {
margin-top: 12px;
font-size: 10px;
letter-spacing: 2.5px;
}
/* Dekorasi lingkaran: sembunyikan yang besar, kecilkan yang kecil */
.deco-circle.c1,
.deco-circle.c2 { display: none; }
.deco-circle.c3 { width: 90px; height: 90px; top: 12px; left: 12px; }
/* ── Panel Kanan: form di bawah, mengisi sisa layar ── */
.auth-right {
width: 100%;
flex: 1;
padding: 36px 24px 52px;
/* align atas agar tidak ada ruang kosong aneh di HP pendek */
align-items: flex-start;
justify-content: center;
/* border-radius atas untuk efek "card naik" */
border-radius: 28px 28px 0 0;
/* tarik ke atas sedikit agar overlap logo */
margin-top: -20px;
}
.auth-card {
max-width: 100%;
width: 100%;
}
.card-header-area {
margin-bottom: 24px;
}
.card-header-area .badge-pill {
font-size: 10px;
padding: 4px 12px;
}
.card-header-area h4 {
font-size: 17px;
}
.card-header-area p {
font-size: 12px;
}
/* Form group sedikit lebih rapat */
.form-group {
margin-bottom: 15px;
}
.form-group label {
font-size: 12px;
}
/* Input lebih tinggi untuk kemudahan tap */
.form-control {
padding: 13px 12px 13px 40px;
border-radius: 12px;
}
/* Tombol login lebih besar */
.btn-login {
padding: 15px;
font-size: 15px;
border-radius: 12px;
margin-top: 8px;
}
/* Link login: tumpuk vertikal, jarak nyaman */
.links-area {
display: flex;
flex-direction: column;
gap: 12px;
align-items: center;
margin-top: 22px;
}
.links-area a {
font-size: 13px;
/* area sentuh lebih besar */
padding: 4px 0;
display: inline-block;
}
.links-area .divider { display: none; }
}
/* ─── RESPONSIVE: Small Mobile (≤ 390px) ─── */
@media (max-width: 390px) {
.auth-left { padding: 36px 16px 28px; }
.auth-left img { width: 44%; max-width: 160px; }
.auth-right { padding: 28px 20px 44px; }
}
/* ─── Landscape Mobile ─── */
@media (max-width: 768px) and (orientation: landscape) {
.auth-left {
padding: 24px 24px 20px;
}
.auth-left img { width: 30%; max-width: 120px; }
.auth-left .brand-tagline { margin-top: 8px; font-size: 9px; }
.auth-right {
padding: 24px 24px 32px;
border-radius: 20px 20px 0 0;
margin-top: -12px;
}
.card-header-area { margin-bottom: 16px; }
.form-group { margin-bottom: 12px; }
}
</style>
<div class="auth-wrapper">
{{-- LEFT: Logo Panel --}}
<div class="auth-left">
<div class="deco-circle c1"></div>
<div class="deco-circle c2"></div>
<div class="deco-circle c3"></div>
<img src="{{ asset('tunggal.png') }}" alt="Green View Logo">
<span class="brand-tagline">Real Estate &bull; Bondowoso</span>
</div>
{{-- RIGHT: Form Panel --}}
<div class="auth-right">
<div class="blob-top"></div>
<div class="auth-card">
<div class="card-header-area">
<div class="badge-pill">🏡 Real Estate</div>
<h4>PT Tunggal Griya Sakinah<br>(GREEN VIEW)</h4>
<p>Kab. Bondowoso, Jawa Timur</p>
</div>
@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.proses') }}">
@csrf
<div class="form-group">
<label>Username / Email</label>
<div class="input-wrap">
<span class="icon">👤</span>
<input type="text" name="login" class="form-control" placeholder="Masukkan username atau email" required autocomplete="username">
</div>
</div>
<div class="form-group">
<label>Password</label>
<div class="input-wrap">
<span class="icon">🔒</span>
<input type="password" name="password" id="password" class="form-control" placeholder="Masukkan password" required autocomplete="current-password">
<button type="button" class="toggle-eye" onclick="togglePassword()" aria-label="Tampilkan/sembunyikan password">👁</button>
</div>
</div>
<button type="submit" class="btn-login">
Login
</button>
</form>
<div class="links-area">
<a href="{{ route('register') }}">Belum punya akun? Register</a>
<span class="divider">|</span>
<a href="{{ route('password.forgot') }}">Lupa Password?</a>
</div>
</div>
</div>
</div>
<script>
function togglePassword() {
const p = document.getElementById("password");
p.type = p.type === "password" ? "text" : "password";
}
</script>
@endsection

View File

@ -0,0 +1,520 @@
@extends('layouts.auth')
@section('content')
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html, body {
font-family: 'Plus Jakarta Sans', sans-serif;
min-height: 100%;
background: #0a3d1e;
overflow-x: hidden;
}
/* ─── WRAPPER ─── */
.auth-wrapper {
display: flex;
min-height: 100vh;
flex-direction: row; /* desktop: side by side */
}
/* ─── LEFT PANEL (Logo) ─── */
.auth-left {
width: 55%;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
overflow: hidden;
background: #ffffff;
}
.auth-left::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 60% 50% at 80% 110%, rgba(25,148,84,0.10) 0%, transparent 70%),
radial-gradient(ellipse 50% 40% at -10% -10%, rgba(16,110,54,0.08) 0%, transparent 70%);
pointer-events: none;
}
.auth-left .brand-tagline {
margin-top: 18px;
font-size: 13px;
font-weight: 600;
letter-spacing: 3px;
text-transform: uppercase;
color: #2d7a4f;
opacity: 0.7;
}
.auth-left img {
width: 68%;
max-width: 340px;
object-fit: contain;
position: relative;
filter: drop-shadow(0 12px 32px rgba(15,80,40,0.18));
animation: floatLogo 5s ease-in-out infinite;
}
@keyframes floatLogo {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
.deco-circle {
position: absolute;
border-radius: 50%;
border: 1.5px solid rgba(25,148,84,0.12);
pointer-events: none;
}
.deco-circle.c1 { width: 420px; height: 420px; bottom: -120px; right: -120px; }
.deco-circle.c2 { width: 260px; height: 260px; bottom: -60px; right: -60px; }
.deco-circle.c3 { width: 160px; height: 160px; top: 30px; left: 30px; }
/* ─── RIGHT PANEL (Form) ─── */
.auth-right {
width: 45%;
background: linear-gradient(145deg, #1a6e3a 0%, #2e9e58 45%, #1a8040 100%);
display: flex;
align-items: center;
justify-content: center;
padding: 48px 40px;
position: relative;
overflow: hidden;
}
.auth-right::before {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.035'/%3E%3C/svg%3E");
opacity: 0.5;
pointer-events: none;
}
.auth-right::after {
content: '';
position: absolute;
width: 340px; height: 340px;
background: radial-gradient(circle, rgba(255,255,255,0.07) 0%, transparent 70%);
bottom: -80px; right: -80px;
border-radius: 50%;
pointer-events: none;
}
.blob-top {
position: absolute;
width: 240px; height: 240px;
background: radial-gradient(circle, rgba(255,255,255,0.06) 0%, transparent 70%);
top: -60px; left: -60px;
border-radius: 50%;
pointer-events: none;
}
/* ─── CARD ─── */
.auth-card {
width: 100%;
max-width: 360px;
position: relative;
z-index: 1;
animation: slideUp 0.55s cubic-bezier(0.22, 1, 0.36, 1) both;
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(28px); }
to { opacity: 1; transform: translateY(0); }
}
/* ─── HEADER ─── */
.card-header-area {
text-align: center;
margin-bottom: 32px;
}
.card-header-area .badge-pill {
display: inline-block;
background: rgba(255,255,255,0.15);
backdrop-filter: blur(6px);
border: 1px solid rgba(255,255,255,0.25);
color: #fff;
font-size: 11px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
padding: 5px 14px;
border-radius: 99px;
margin-bottom: 14px;
}
.card-header-area h4 {
color: #ffffff;
font-size: 18px;
font-weight: 800;
line-height: 1.3;
margin-bottom: 6px;
}
.card-header-area p {
color: rgba(255,255,255,0.65);
font-size: 12.5px;
margin: 0;
}
/* ─── ALERTS ─── */
.alert {
border-radius: 10px;
font-size: 13px;
padding: 10px 14px;
margin-bottom: 16px;
border: none;
}
.alert-danger { background: rgba(220,53,69,0.85); color: #fff; }
.alert-success { background: rgba(25,135,84,0.85); color: #fff; }
/* ─── FORM GROUP ─── */
.form-group {
margin-bottom: 18px;
}
.form-group label {
display: block;
color: rgba(255,255,255,0.85);
font-size: 12.5px;
font-weight: 600;
margin-bottom: 7px;
letter-spacing: 0.4px;
}
.input-wrap {
position: relative;
}
.input-wrap .icon {
position: absolute;
left: 13px;
top: 50%;
transform: translateY(-50%);
color: rgba(0,0,0,0.3);
font-size: 15px;
pointer-events: none;
}
.form-control {
width: 100%;
padding: 11px 12px 11px 38px;
border-radius: 10px;
border: 1.5px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.94);
color: #1a2e1a;
font-size: 16px;
font-family: inherit;
outline: none;
transition: border 0.2s, box-shadow 0.2s;
-webkit-appearance: none;
appearance: none;
}
.form-control::placeholder { color: #aab7aa; }
.form-control:focus {
border-color: rgba(255,255,255,0.6);
box-shadow: 0 0 0 3px rgba(255,255,255,0.18);
background: #ffffff;
}
.toggle-eye {
position: absolute;
right: 12px;
top: 50%;
transform: translateY(-50%);
cursor: pointer;
color: #888;
font-size: 15px;
background: none;
border: none;
padding: 0;
line-height: 1;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
}
/* ─── LOGIN BUTTON ─── */
.btn-login {
width: 100%;
padding: 14px;
border-radius: 10px;
border: none;
background: #ffffff;
color: #1a6e3a;
font-size: 15px;
font-weight: 800;
font-family: inherit;
letter-spacing: 0.5px;
cursor: pointer;
transition: transform 0.15s, box-shadow 0.2s, background 0.2s;
box-shadow: 0 4px 18px rgba(0,0,0,0.15);
margin-top: 4px;
-webkit-tap-highlight-color: transparent;
}
.btn-login:hover {
background: #f0faf4;
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
.btn-login:active {
transform: translateY(0);
background: #e4f5ec;
}
/* ─── LINKS ─── */
.links-area {
text-align: center;
margin-top: 20px;
}
.links-area a {
color: rgba(255,255,255,0.75);
font-size: 12.5px;
text-decoration: none;
transition: color 0.15s;
}
.links-area a:hover { color: #fff; }
.links-area .divider {
color: rgba(255,255,255,0.35);
margin: 0 8px;
font-size: 11px;
}
/* ─── RESPONSIVE: Tablet ─── */
@media screen and (min-width: 769px) and (max-width: 1024px) {
.auth-left { width: 40%; }
.auth-right { width: 60%; padding: 40px 28px; }
.auth-left img { width: 80%; }
}
/* ══════════════════════════════════════════
MOBILE 768px LAYOUT: atas-bawah
══════════════════════════════════════════ */
@media screen and (max-width: 768px) {
/* Wrapper jadi kolom */
.auth-wrapper {
flex-direction: column !important;
min-height: 100vh;
}
/* ── Panel Atas: Logo ── */
.auth-left {
width: 100% !important;
height: auto !important;
min-height: unset !important;
padding: 44px 24px 36px !important;
flex-shrink: 0;
background: linear-gradient(160deg, #ffffff 60%, #f0faf5 100%) !important;
order: 0;
}
.auth-left img {
width: 52% !important;
max-width: 190px !important;
animation: none !important;
filter: drop-shadow(0 8px 20px rgba(15,80,40,0.14)) !important;
}
.auth-left .brand-tagline {
margin-top: 12px !important;
font-size: 10px !important;
letter-spacing: 2.5px !important;
}
/* Dekorasi: sembunyikan lingkaran besar */
.deco-circle.c1,
.deco-circle.c2 { display: none !important; }
.deco-circle.c3 { width: 90px !important; height: 90px !important; top: 12px !important; left: 12px !important; }
/* ── Panel Bawah: Form ── */
.auth-right {
width: 100% !important;
flex: 1 !important;
padding: 36px 24px 52px !important;
align-items: flex-start !important;
justify-content: center !important;
border-radius: 28px 28px 0 0 !important;
margin-top: -24px !important;
order: 1;
}
.auth-card {
max-width: 100% !important;
width: 100% !important;
}
.card-header-area {
margin-bottom: 24px !important;
}
.card-header-area .badge-pill {
font-size: 10px !important;
padding: 4px 12px !important;
}
.card-header-area h4 {
font-size: 17px !important;
}
.card-header-area p {
font-size: 12px !important;
}
.form-group {
margin-bottom: 15px !important;
}
.form-group label {
font-size: 12px !important;
}
.form-control {
padding: 13px 12px 13px 40px !important;
border-radius: 12px !important;
font-size: 16px !important; /* cegah zoom iOS */
}
.btn-login {
padding: 15px !important;
font-size: 15px !important;
border-radius: 12px !important;
margin-top: 8px !important;
}
.links-area {
display: flex !important;
flex-direction: column !important;
gap: 12px !important;
align-items: center !important;
margin-top: 22px !important;
}
.links-area a {
font-size: 13px !important;
padding: 4px 0 !important;
display: inline-block !important;
}
.links-area .divider { display: none !important; }
}
/* ─── Small Mobile ≤ 390px ─── */
@media screen and (max-width: 390px) {
.auth-left { padding: 36px 16px 28px !important; }
.auth-left img { width: 46% !important; max-width: 165px !important; }
.auth-right { padding: 28px 20px 44px !important; }
}
/* ─── Landscape Mobile ─── */
@media screen and (max-width: 768px) and (orientation: landscape) {
.auth-left {
padding: 20px 24px 18px !important;
}
.auth-left img { width: 28% !important; max-width: 110px !important; }
.auth-left .brand-tagline { margin-top: 8px !important; font-size: 9px !important; }
.auth-right {
padding: 24px 24px 32px !important;
border-radius: 20px 20px 0 0 !important;
margin-top: -12px !important;
}
.card-header-area { margin-bottom: 14px !important; }
.form-group { margin-bottom: 10px !important; }
}
</style>
<div class="auth-wrapper">
{{-- TOP / LEFT: Logo Panel --}}
<div class="auth-left">
<div class="deco-circle c1"></div>
<div class="deco-circle c2"></div>
<div class="deco-circle c3"></div>
<img src="{{ asset('tunggal.png') }}" alt="Green View Logo">
<span class="brand-tagline">Real Estate &bull; Bondowoso</span>
</div>
{{-- BOTTOM / RIGHT: Form Panel --}}
<div class="auth-right">
<div class="blob-top"></div>
<div class="auth-card">
<div class="card-header-area">
<div class="badge-pill">🏡 Real Estate</div>
<h4>PT Tunggal Griya Sakinah<br>(GREEN VIEW)</h4>
<p>Kab. Bondowoso, Jawa Timur</p>
</div>
@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.proses') }}">
@csrf
<div class="form-group">
<label>Username / Email</label>
<div class="input-wrap">
<span class="icon">👤</span>
<input type="text" name="login" class="form-control" placeholder="Masukkan username atau email" required autocomplete="username">
</div>
</div>
<div class="form-group">
<label>Password</label>
<div class="input-wrap">
<span class="icon">🔒</span>
<input type="password" name="password" id="password" class="form-control" placeholder="Masukkan password" required autocomplete="current-password">
<button type="button" class="toggle-eye" onclick="togglePassword()" aria-label="Tampilkan/sembunyikan password">👁</button>
</div>
</div>
<button type="submit" class="btn-login">
Login
</button>
</form>
<div class="links-area">
<a href="{{ route('register') }}">Belum punya akun? Register</a>
<span class="divider">|</span>
<a href="{{ route('password.forgot') }}">Lupa Password?</a>
</div>
</div>
</div>
</div>
<script>
function togglePassword() {
const p = document.getElementById("password");
p.type = p.type === "password" ? "text" : "password";
}
</script>
@endsection

View File

@ -0,0 +1,353 @@
@extends('layouts.auth')
@section('content')
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Plus Jakarta Sans', sans-serif;
height: 100vh;
overflow: hidden;
background: #0a3d1e;
}
/* ─── WRAPPER ─── */
.auth-wrapper {
display: flex;
height: 100vh;
width: 100%;
}
/* ─── LEFT PANEL ─── */
.auth-left {
width: 55%;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
overflow: hidden;
background: #ffffff;
flex-shrink: 0;
}
.auth-left::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 60% 50% at 80% 110%, rgba(25,148,84,0.10) 0%, transparent 70%),
radial-gradient(ellipse 50% 40% at -10% -10%, rgba(16,110,54,0.08) 0%, transparent 70%);
pointer-events: none;
}
.brand-tagline {
margin-top: 18px;
font-size: 13px;
font-weight: 600;
letter-spacing: 3px;
text-transform: uppercase;
color: #2d7a4f;
opacity: 0.7;
position: relative;
z-index: 1;
}
.auth-left img {
width: 68%;
max-width: 340px;
object-fit: contain;
position: relative;
z-index: 1;
filter: drop-shadow(0 12px 32px rgba(15,80,40,0.18));
animation: floatLogo 5s ease-in-out infinite;
}
@keyframes floatLogo {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
.deco-circle {
position: absolute;
border-radius: 50%;
border: 1.5px solid rgba(25,148,84,0.12);
pointer-events: none;
}
.deco-circle.c1 { width: 420px; height: 420px; bottom: -120px; right: -120px; }
.deco-circle.c2 { width: 260px; height: 260px; bottom: -60px; right: -60px; }
.deco-circle.c3 { width: 160px; height: 160px; top: 30px; left: 30px; }
/* ─── RIGHT PANEL ─── */
/* Warna hijau disamakan persis dengan login (gambar 2) */
.auth-right {
width: 45%;
flex-shrink: 0;
background: linear-gradient(160deg, #3aaa5c 0%, #2e9e50 40%, #1f8a42 100%);
display: flex;
align-items: center;
justify-content: center;
padding: 48px 48px;
position: relative;
overflow: hidden;
}
/* noise texture */
.auth-right::before {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
opacity: 0.5;
pointer-events: none;
}
/* decorative blob bottom-right */
.auth-right::after {
content: '';
position: absolute;
width: 340px; height: 340px;
background: radial-gradient(circle, rgba(255,255,255,0.07) 0%, transparent 70%);
bottom: -80px; right: -80px;
border-radius: 50%;
pointer-events: none;
}
.blob-top {
position: absolute;
width: 240px; height: 240px;
background: radial-gradient(circle, rgba(255,255,255,0.06) 0%, transparent 70%);
top: -60px; left: -60px;
border-radius: 50%;
pointer-events: none;
}
/* ─── CARD ─── */
.auth-card {
width: 100%;
max-width: 360px;
position: relative;
z-index: 1;
animation: slideUp 0.55s cubic-bezier(0.22, 1, 0.36, 1) both;
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(28px); }
to { opacity: 1; transform: translateY(0); }
}
/* ─── HEADER ─── */
.card-header-area {
text-align: center;
margin-bottom: 32px;
}
.badge-pill {
display: inline-block;
background: rgba(255,255,255,0.18);
backdrop-filter: blur(6px);
border: 1px solid rgba(255,255,255,0.28);
color: #fff;
font-size: 11px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
padding: 5px 14px;
border-radius: 99px;
margin-bottom: 14px;
}
.card-header-area h4 {
color: #ffffff;
font-size: 20px;
font-weight: 800;
line-height: 1.3;
margin-bottom: 6px;
}
.card-header-area p {
color: rgba(255,255,255,0.70);
font-size: 12.5px;
margin: 0;
}
/* ─── ALERTS ─── */
.alert {
border-radius: 10px;
font-size: 13px;
padding: 10px 14px;
margin-bottom: 16px;
border: none;
}
.alert-danger { background: rgba(220,53,69,0.85); color: #fff; }
.alert-success { background: rgba(25,135,84,0.85); color: #fff; }
/* ─── FORM GROUP ─── */
.form-group {
margin-bottom: 18px;
width: 100%;
}
.form-group label {
display: block;
color: rgba(255,255,255,0.88);
font-size: 12.5px;
font-weight: 600;
margin-bottom: 7px;
letter-spacing: 0.4px;
}
.input-wrap {
position: relative;
width: 100%;
}
.input-wrap .icon {
position: absolute;
left: 13px;
top: 50%;
transform: translateY(-50%);
color: rgba(0,0,0,0.3);
font-size: 15px;
pointer-events: none;
z-index: 2;
}
.form-control {
display: block;
width: 100%;
padding: 11px 12px 11px 38px;
border-radius: 10px;
border: 1.5px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.94);
color: #1a2e1a;
font-size: 14px;
font-family: inherit;
outline: none;
transition: border 0.2s, box-shadow 0.2s;
}
.form-control::placeholder { color: #aab7aa; }
.form-control:focus {
border-color: rgba(255,255,255,0.6);
box-shadow: 0 0 0 3px rgba(255,255,255,0.18);
background: #ffffff;
}
/* ─── BUTTON ─── */
.btn-login {
display: block;
width: 100%;
padding: 12px;
border-radius: 10px;
border: none;
background: #ffffff;
color: #1a6e3a;
font-size: 14.5px;
font-weight: 800;
font-family: inherit;
letter-spacing: 0.5px;
cursor: pointer;
transition: transform 0.15s, box-shadow 0.2s, background 0.2s;
box-shadow: 0 4px 18px rgba(0,0,0,0.15);
margin-top: 4px;
}
.btn-login:hover {
background: #f0faf4;
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
.btn-login:active { transform: translateY(0); }
/* ─── LINKS ─── */
.links-area {
text-align: center;
margin-top: 20px;
}
.links-area a {
color: rgba(255,255,255,0.75);
font-size: 12.5px;
text-decoration: none;
transition: color 0.15s;
}
.links-area a:hover { color: #fff; }
/* ─── RESPONSIVE ─── */
@media (max-width: 768px) {
.auth-left { display: none; }
.auth-right { width: 100%; padding: 40px 28px; }
}
</style>
<div class="auth-wrapper">
{{-- LEFT: Logo Panel --}}
<div class="auth-left">
<div class="deco-circle c1"></div>
<div class="deco-circle c2"></div>
<div class="deco-circle c3"></div>
<img src="{{ asset('tunggal.png') }}" alt="Green View Logo">
<span class="brand-tagline">Real Estate &bull; Bondowoso</span>
</div>
{{-- RIGHT: Form Panel --}}
<div class="auth-right">
<div class="blob-top"></div>
<div class="auth-card">
<div class="card-header-area">
<div class="badge-pill">🔐 Verifikasi</div>
<h4>Verifikasi OTP</h4>
<p>Masukkan kode OTP yang dikirim ke email Anda</p>
</div>
@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('password.verifyOtp') }}">
@csrf
<div class="form-group">
<label>Kode OTP</label>
<div class="input-wrap">
<span class="icon">🔑</span>
<input
type="text"
name="otp"
class="form-control"
placeholder="Masukkan kode OTP"
required
maxlength="6"
autocomplete="one-time-code"
>
</div>
</div>
<button type="submit" class="btn-login">Verifikasi</button>
</form>
<div class="links-area">
<a href="{{ route('login') }}"> Kembali ke Login</a>
</div>
</div>
</div>
</div>
@endsection

View File

@ -0,0 +1,493 @@
@extends('layouts.auth')
@section('content')
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html, body {
font-family: 'Plus Jakarta Sans', sans-serif;
min-height: 100%;
background: #0a3d1e;
overflow-x: hidden;
}
/* ─── WRAPPER ─── */
.auth-wrapper {
display: flex;
flex-direction: row;
min-height: 100vh;
width: 100%;
}
/* ─── LEFT PANEL ─── */
.auth-left {
width: 55%;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
overflow: hidden;
background: #ffffff;
flex-shrink: 0;
}
.auth-left::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 60% 50% at 80% 110%, rgba(25,148,84,0.10) 0%, transparent 70%),
radial-gradient(ellipse 50% 40% at -10% -10%, rgba(16,110,54,0.08) 0%, transparent 70%);
pointer-events: none;
}
.brand-tagline {
margin-top: 18px;
font-size: 13px;
font-weight: 600;
letter-spacing: 3px;
text-transform: uppercase;
color: #2d7a4f;
opacity: 0.7;
position: relative;
z-index: 1;
}
.auth-left img {
width: 68%;
max-width: 340px;
object-fit: contain;
position: relative;
z-index: 1;
filter: drop-shadow(0 12px 32px rgba(15,80,40,0.18));
animation: floatLogo 5s ease-in-out infinite;
}
@keyframes floatLogo {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
.deco-circle {
position: absolute;
border-radius: 50%;
border: 1.5px solid rgba(25,148,84,0.12);
pointer-events: none;
}
.deco-circle.c1 { width: 420px; height: 420px; bottom: -120px; right: -120px; }
.deco-circle.c2 { width: 260px; height: 260px; bottom: -60px; right: -60px; }
.deco-circle.c3 { width: 160px; height: 160px; top: 30px; left: 30px; }
/* ─── RIGHT PANEL ─── */
.auth-right {
width: 45%;
flex-shrink: 0;
background: linear-gradient(160deg, #3aaa5c 0%, #2e9e50 40%, #1f8a42 100%);
display: flex;
align-items: center;
justify-content: center;
padding: 48px 48px;
position: relative;
overflow: hidden;
}
.auth-right::before {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
opacity: 0.5;
pointer-events: none;
}
.auth-right::after {
content: '';
position: absolute;
width: 340px; height: 340px;
background: radial-gradient(circle, rgba(255,255,255,0.07) 0%, transparent 70%);
bottom: -80px; right: -80px;
border-radius: 50%;
pointer-events: none;
}
.blob-top {
position: absolute;
width: 240px; height: 240px;
background: radial-gradient(circle, rgba(255,255,255,0.06) 0%, transparent 70%);
top: -60px; left: -60px;
border-radius: 50%;
pointer-events: none;
}
/* ─── CARD ─── */
.auth-card {
width: 100%;
max-width: 360px;
position: relative;
z-index: 1;
animation: slideUp 0.55s cubic-bezier(0.22, 1, 0.36, 1) both;
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(28px); }
to { opacity: 1; transform: translateY(0); }
}
/* ─── HEADER ─── */
.card-header-area {
text-align: center;
margin-bottom: 32px;
}
.badge-pill {
display: inline-block;
background: rgba(255,255,255,0.18);
backdrop-filter: blur(6px);
border: 1px solid rgba(255,255,255,0.28);
color: #fff;
font-size: 11px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
padding: 5px 14px;
border-radius: 99px;
margin-bottom: 14px;
}
.card-header-area h4 {
color: #ffffff;
font-size: 20px;
font-weight: 800;
line-height: 1.3;
margin-bottom: 6px;
}
.card-header-area p {
color: rgba(255,255,255,0.70);
font-size: 12.5px;
margin: 0;
}
/* ─── ALERTS ─── */
.alert {
border-radius: 10px;
font-size: 13px;
padding: 10px 14px;
margin-bottom: 16px;
border: none;
}
.alert-danger { background: rgba(220,53,69,0.85); color: #fff; }
.alert-success { background: rgba(25,135,84,0.85); color: #fff; }
/* ─── FORM GROUP ─── */
.form-group {
margin-bottom: 18px;
width: 100%;
}
.form-group label {
display: block;
color: rgba(255,255,255,0.88);
font-size: 12.5px;
font-weight: 600;
margin-bottom: 7px;
letter-spacing: 0.4px;
}
.input-wrap {
position: relative;
width: 100%;
}
.input-wrap .icon {
position: absolute;
left: 13px;
top: 50%;
transform: translateY(-50%);
color: rgba(0,0,0,0.3);
font-size: 15px;
pointer-events: none;
z-index: 2;
}
.form-control {
display: block;
width: 100%;
padding: 11px 12px 11px 38px;
border-radius: 10px;
border: 1.5px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.94);
color: #1a2e1a;
font-size: 16px; /* cegah auto-zoom iOS */
font-family: inherit;
outline: none;
transition: border 0.2s, box-shadow 0.2s;
-webkit-appearance: none;
appearance: none;
letter-spacing: 2px; /* biar kode OTP lebih mudah dibaca */
}
.form-control::placeholder {
color: #aab7aa;
letter-spacing: normal;
}
.form-control:focus {
border-color: rgba(255,255,255,0.6);
box-shadow: 0 0 0 3px rgba(255,255,255,0.18);
background: #ffffff;
}
/* ─── BUTTON ─── */
.btn-login {
display: block;
width: 100%;
padding: 13px;
border-radius: 10px;
border: none;
background: #ffffff;
color: #1a6e3a;
font-size: 14.5px;
font-weight: 800;
font-family: inherit;
letter-spacing: 0.5px;
cursor: pointer;
transition: transform 0.15s, box-shadow 0.2s, background 0.2s;
box-shadow: 0 4px 18px rgba(0,0,0,0.15);
margin-top: 4px;
-webkit-tap-highlight-color: transparent;
}
.btn-login:hover {
background: #f0faf4;
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
.btn-login:active {
transform: translateY(0);
background: #e4f5ec;
}
/* ─── LINKS ─── */
.links-area {
text-align: center;
margin-top: 20px;
}
.links-area a {
color: rgba(255,255,255,0.75);
font-size: 12.5px;
text-decoration: none;
transition: color 0.15s;
}
.links-area a:hover { color: #fff; }
/* ─── RESPONSIVE: Tablet ─── */
@media screen and (min-width: 769px) and (max-width: 1024px) {
.auth-left { width: 40%; }
.auth-right { width: 60%; padding: 40px 28px; }
.auth-left img { width: 80%; }
}
/* ══════════════════════════════════════════
MOBILE 768px LAYOUT: atas-bawah
══════════════════════════════════════════ */
@media screen and (max-width: 768px) {
.auth-wrapper {
flex-direction: column !important;
min-height: 100vh;
}
/* ── Panel Atas: Logo ── */
.auth-left {
width: 100% !important;
height: auto !important;
min-height: unset !important;
padding: 44px 24px 36px !important;
flex-shrink: 0;
background: linear-gradient(160deg, #ffffff 60%, #f0faf5 100%) !important;
order: 0;
}
.auth-left img {
width: 50% !important;
max-width: 185px !important;
animation: none !important;
filter: drop-shadow(0 8px 20px rgba(15,80,40,0.14)) !important;
}
.brand-tagline {
margin-top: 12px !important;
font-size: 10px !important;
letter-spacing: 2.5px !important;
}
.deco-circle.c1,
.deco-circle.c2 { display: none !important; }
.deco-circle.c3 { width: 90px !important; height: 90px !important; top: 12px !important; left: 12px !important; }
/* ── Panel Bawah: Form ── */
.auth-right {
width: 100% !important;
flex: 1 !important;
padding: 36px 24px 52px !important;
align-items: flex-start !important;
justify-content: center !important;
border-radius: 28px 28px 0 0 !important;
margin-top: -24px !important;
order: 1;
}
.auth-card {
max-width: 100% !important;
width: 100% !important;
}
.card-header-area {
margin-bottom: 24px !important;
}
.badge-pill {
font-size: 10px !important;
padding: 4px 12px !important;
}
.card-header-area h4 {
font-size: 18px !important;
}
.card-header-area p {
font-size: 12px !important;
}
.form-group {
margin-bottom: 15px !important;
}
.form-group label {
font-size: 12px !important;
}
.form-control {
padding: 13px 12px 13px 40px !important;
border-radius: 12px !important;
font-size: 16px !important;
}
.btn-login {
padding: 15px !important;
font-size: 15px !important;
border-radius: 12px !important;
margin-top: 8px !important;
}
.links-area {
margin-top: 22px !important;
}
.links-area a {
font-size: 13px !important;
padding: 4px 0 !important;
display: inline-block !important;
}
}
/* ─── Small Mobile ≤ 390px ─── */
@media screen and (max-width: 390px) {
.auth-left { padding: 36px 16px 28px !important; }
.auth-left img { width: 46% !important; max-width: 160px !important; }
.auth-right { padding: 28px 20px 44px !important; }
}
/* ─── Landscape Mobile ─── */
@media screen and (max-width: 768px) and (orientation: landscape) {
.auth-left {
padding: 18px 24px 16px !important;
}
.auth-left img { width: 26% !important; max-width: 100px !important; }
.brand-tagline { margin-top: 6px !important; font-size: 9px !important; }
.auth-right {
padding: 22px 24px 32px !important;
border-radius: 20px 20px 0 0 !important;
margin-top: -10px !important;
}
.card-header-area { margin-bottom: 16px !important; }
.form-group { margin-bottom: 10px !important; }
}
</style>
<div class="auth-wrapper">
{{-- TOP / LEFT: Logo Panel --}}
<div class="auth-left">
<div class="deco-circle c1"></div>
<div class="deco-circle c2"></div>
<div class="deco-circle c3"></div>
<img src="{{ asset('tunggal.png') }}" alt="Green View Logo">
<span class="brand-tagline">Real Estate &bull; Bondowoso</span>
</div>
{{-- BOTTOM / RIGHT: Form Panel --}}
<div class="auth-right">
<div class="blob-top"></div>
<div class="auth-card">
<div class="card-header-area">
<div class="badge-pill">🔐 Verifikasi</div>
<h4>Verifikasi OTP</h4>
<p>Masukkan kode OTP yang dikirim ke email Anda</p>
</div>
@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('password.verifyOtp') }}">
@csrf
<div class="form-group">
<label>Kode OTP</label>
<div class="input-wrap">
<span class="icon">🔑</span>
<input
type="text"
name="otp"
class="form-control"
placeholder="Masukkan kode OTP"
required
maxlength="6"
autocomplete="one-time-code"
inputmode="numeric"
pattern="[0-9]*"
>
</div>
</div>
<button type="submit" class="btn-login">Verifikasi</button>
</form>
<div class="links-area">
<a href="{{ route('login') }}"> Kembali ke Login</a>
</div>
</div>
</div>
</div>
@endsection

View File

@ -0,0 +1,372 @@
@extends('layouts.auth')
@section('content')
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Plus Jakarta Sans', sans-serif;
height: 100vh;
overflow: hidden;
background: #0a3d1e;
}
/* ─── WRAPPER ─── */
.auth-wrapper {
display: flex;
height: 100vh;
}
/* ─── LEFT PANEL (Logo) ─── */
.auth-left {
width: 55%;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
overflow: hidden;
background: #ffffff;
}
.auth-left::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 60% 50% at 80% 110%, rgba(25,148,84,0.10) 0%, transparent 70%),
radial-gradient(ellipse 50% 40% at -10% -10%, rgba(16,110,54,0.08) 0%, transparent 70%);
pointer-events: none;
}
.auth-left .brand-tagline {
margin-top: 18px;
font-size: 13px;
font-weight: 600;
letter-spacing: 3px;
text-transform: uppercase;
color: #2d7a4f;
opacity: 0.7;
}
.auth-left img {
width: 68%;
max-width: 340px;
object-fit: contain;
position: relative;
filter: drop-shadow(0 12px 32px rgba(15,80,40,0.18));
animation: floatLogo 5s ease-in-out infinite;
}
@keyframes floatLogo {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
.deco-circle {
position: absolute;
border-radius: 50%;
border: 1.5px solid rgba(25,148,84,0.12);
pointer-events: none;
}
.deco-circle.c1 { width: 420px; height: 420px; bottom: -120px; right: -120px; }
.deco-circle.c2 { width: 260px; height: 260px; bottom: -60px; right: -60px; }
.deco-circle.c3 { width: 160px; height: 160px; top: 30px; left: 30px; }
/* ─── RIGHT PANEL (Form) ─── */
.auth-right {
width: 45%;
background: linear-gradient(145deg, #1a6e3a 0%, #2e9e58 45%, #1a8040 100%);
display: flex;
align-items: center;
justify-content: center;
padding: 48px 40px;
position: relative;
overflow: hidden;
}
.auth-right::before {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.035'/%3E%3C/svg%3E");
opacity: 0.5;
pointer-events: none;
}
.auth-right::after {
content: '';
position: absolute;
width: 340px; height: 340px;
background: radial-gradient(circle, rgba(255,255,255,0.07) 0%, transparent 70%);
bottom: -80px; right: -80px;
border-radius: 50%;
pointer-events: none;
}
.blob-top {
position: absolute;
width: 240px; height: 240px;
background: radial-gradient(circle, rgba(255,255,255,0.06) 0%, transparent 70%);
top: -60px; left: -60px;
border-radius: 50%;
pointer-events: none;
}
/* ─── CARD ─── */
.auth-card {
width: 100%;
max-width: 360px;
position: relative;
z-index: 1;
animation: slideUp 0.55s cubic-bezier(0.22, 1, 0.36, 1) both;
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(28px); }
to { opacity: 1; transform: translateY(0); }
}
/* ─── HEADER ─── */
.card-header-area {
text-align: center;
margin-bottom: 26px;
}
.card-header-area .badge-pill {
display: inline-block;
background: rgba(255,255,255,0.15);
backdrop-filter: blur(6px);
border: 1px solid rgba(255,255,255,0.25);
color: #fff;
font-size: 11px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
padding: 5px 14px;
border-radius: 99px;
margin-bottom: 14px;
}
.card-header-area h4 {
color: #ffffff;
font-size: 18px;
font-weight: 800;
line-height: 1.3;
margin-bottom: 6px;
}
.card-header-area p {
color: rgba(255,255,255,0.65);
font-size: 12.5px;
margin: 0;
}
/* ─── ALERTS ─── */
.alert {
border-radius: 10px;
font-size: 13px;
padding: 10px 14px;
margin-bottom: 16px;
border: none;
}
.alert-danger { background: rgba(220,53,69,0.85); color: #fff; }
.alert-success { background: rgba(25,135,84,0.85); color: #fff; }
/* ─── FORM ─── */
.form-group {
margin-bottom: 14px;
}
.input-wrap {
position: relative;
}
.input-wrap .icon {
position: absolute;
left: 13px;
top: 50%;
transform: translateY(-50%);
font-size: 14px;
pointer-events: none;
}
.form-control {
width: 100%;
padding: 11px 12px 11px 38px;
border-radius: 10px;
border: 1.5px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.94);
color: #1a2e1a;
font-size: 14px;
font-family: inherit;
outline: none;
transition: border 0.2s, box-shadow 0.2s;
}
.form-control::placeholder { color: #aab7aa; }
.form-control:focus {
border-color: rgba(255,255,255,0.6);
box-shadow: 0 0 0 3px rgba(255,255,255,0.18);
background: #ffffff;
}
.toggle-eye {
position: absolute;
right: 12px;
top: 50%;
transform: translateY(-50%);
cursor: pointer;
color: #888;
font-size: 14px;
background: none;
border: none;
padding: 0;
line-height: 1;
}
/* ─── BUTTON ─── */
.btn-register {
width: 100%;
padding: 12px;
border-radius: 10px;
border: none;
background: #ffffff;
color: #1a6e3a;
font-size: 14.5px;
font-weight: 800;
font-family: inherit;
letter-spacing: 0.5px;
cursor: pointer;
transition: transform 0.15s, box-shadow 0.2s, background 0.2s;
box-shadow: 0 4px 18px rgba(0,0,0,0.15);
margin-top: 6px;
}
.btn-register:hover {
background: #f0faf4;
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
.btn-register:active { transform: translateY(0); }
/* ─── LINKS ─── */
.links-area {
text-align: center;
margin-top: 18px;
}
.links-area a {
color: rgba(255,255,255,0.75);
font-size: 12.5px;
text-decoration: none;
transition: color 0.15s;
}
.links-area a:hover { color: #fff; }
/* ─── RESPONSIVE ─── */
@media (max-width: 768px) {
.auth-left { display: none; }
.auth-right { width: 100%; }
}
</style>
<div class="auth-wrapper">
{{-- LEFT: Logo Panel --}}
<div class="auth-left">
<div class="deco-circle c1"></div>
<div class="deco-circle c2"></div>
<div class="deco-circle c3"></div>
<img src="{{ asset('tunggal.png') }}" alt="Green View Logo">
<span class="brand-tagline">Real Estate &bull; Bondowoso</span>
</div>
{{-- RIGHT: Form Panel --}}
<div class="auth-right">
<div class="blob-top"></div>
<div class="auth-card">
<div class="card-header-area">
<div class="badge-pill"> Daftar Akun</div>
<h4>PT Tunggal Griya Sakinah<br>(GREEN VIEW)</h4>
<p>Buat akun penghuni baru</p>
</div>
@if(session('error'))
<div class="alert alert-danger">{{ session('error') }}</div>
@endif
@if($errors->any())
<div class="alert alert-danger">
@foreach($errors->all() as $error)
<div>{{ $error }}</div>
@endforeach
</div>
@endif
@if(session('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif
<form method="POST" action="{{ route('register.proses') }}">
@csrf
<div class="form-group">
<div class="input-wrap">
<span class="icon">👤</span>
<input name="name" class="form-control" placeholder="Nama Lengkap" value="{{ old('name') }}" required>
</div>
</div>
<div class="form-group">
<div class="input-wrap">
<span class="icon">🪪</span>
<input name="username" class="form-control" placeholder="Username" value="{{ old('username') }}" required>
</div>
</div>
<div class="form-group">
<div class="input-wrap">
<span class="icon">✉️</span>
<input type="email" name="email" class="form-control" placeholder="Email" value="{{ old('email') }}" required>
</div>
</div>
<div class="form-group">
<div class="input-wrap">
<span class="icon">🔒</span>
<input type="password" name="password" id="password" class="form-control" placeholder="Password" required>
<button type="button" class="toggle-eye" onclick="togglePassword()">👁</button>
</div>
</div>
<button type="submit" class="btn-register">
Daftar Sekarang
</button>
</form>
<div class="links-area">
<a href="{{ route('login') }}">Sudah punya akun? Login di sini</a>
</div>
</div>
</div>
</div>
<script>
function togglePassword() {
const p = document.getElementById("password");
p.type = p.type === "password" ? "text" : "password";
}
</script>
@endsection

View File

@ -0,0 +1,510 @@
@extends('layouts.auth')
@section('content')
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html, body {
font-family: 'Plus Jakarta Sans', sans-serif;
min-height: 100%;
background: #0a3d1e;
overflow-x: hidden;
}
/* ─── WRAPPER ─── */
.auth-wrapper {
display: flex;
flex-direction: row;
min-height: 100vh;
}
/* ─── LEFT PANEL (Logo) ─── */
.auth-left {
width: 55%;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
overflow: hidden;
background: #ffffff;
}
.auth-left::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 60% 50% at 80% 110%, rgba(25,148,84,0.10) 0%, transparent 70%),
radial-gradient(ellipse 50% 40% at -10% -10%, rgba(16,110,54,0.08) 0%, transparent 70%);
pointer-events: none;
}
.auth-left .brand-tagline {
margin-top: 18px;
font-size: 13px;
font-weight: 600;
letter-spacing: 3px;
text-transform: uppercase;
color: #2d7a4f;
opacity: 0.7;
}
.auth-left img {
width: 68%;
max-width: 340px;
object-fit: contain;
position: relative;
filter: drop-shadow(0 12px 32px rgba(15,80,40,0.18));
animation: floatLogo 5s ease-in-out infinite;
}
@keyframes floatLogo {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
.deco-circle {
position: absolute;
border-radius: 50%;
border: 1.5px solid rgba(25,148,84,0.12);
pointer-events: none;
}
.deco-circle.c1 { width: 420px; height: 420px; bottom: -120px; right: -120px; }
.deco-circle.c2 { width: 260px; height: 260px; bottom: -60px; right: -60px; }
.deco-circle.c3 { width: 160px; height: 160px; top: 30px; left: 30px; }
/* ─── RIGHT PANEL (Form) ─── */
.auth-right {
width: 45%;
background: linear-gradient(145deg, #1a6e3a 0%, #2e9e58 45%, #1a8040 100%);
display: flex;
align-items: center;
justify-content: center;
padding: 48px 40px;
position: relative;
overflow: hidden;
}
.auth-right::before {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.035'/%3E%3C/svg%3E");
opacity: 0.5;
pointer-events: none;
}
.auth-right::after {
content: '';
position: absolute;
width: 340px; height: 340px;
background: radial-gradient(circle, rgba(255,255,255,0.07) 0%, transparent 70%);
bottom: -80px; right: -80px;
border-radius: 50%;
pointer-events: none;
}
.blob-top {
position: absolute;
width: 240px; height: 240px;
background: radial-gradient(circle, rgba(255,255,255,0.06) 0%, transparent 70%);
top: -60px; left: -60px;
border-radius: 50%;
pointer-events: none;
}
/* ─── CARD ─── */
.auth-card {
width: 100%;
max-width: 360px;
position: relative;
z-index: 1;
animation: slideUp 0.55s cubic-bezier(0.22, 1, 0.36, 1) both;
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(28px); }
to { opacity: 1; transform: translateY(0); }
}
/* ─── HEADER ─── */
.card-header-area {
text-align: center;
margin-bottom: 26px;
}
.card-header-area .badge-pill {
display: inline-block;
background: rgba(255,255,255,0.15);
backdrop-filter: blur(6px);
border: 1px solid rgba(255,255,255,0.25);
color: #fff;
font-size: 11px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
padding: 5px 14px;
border-radius: 99px;
margin-bottom: 14px;
}
.card-header-area h4 {
color: #ffffff;
font-size: 18px;
font-weight: 800;
line-height: 1.3;
margin-bottom: 6px;
}
.card-header-area p {
color: rgba(255,255,255,0.65);
font-size: 12.5px;
margin: 0;
}
/* ─── ALERTS ─── */
.alert {
border-radius: 10px;
font-size: 13px;
padding: 10px 14px;
margin-bottom: 16px;
border: none;
}
.alert-danger { background: rgba(220,53,69,0.85); color: #fff; }
.alert-success { background: rgba(25,135,84,0.85); color: #fff; }
/* ─── FORM ─── */
.form-group {
margin-bottom: 14px;
}
.input-wrap {
position: relative;
}
.input-wrap .icon {
position: absolute;
left: 13px;
top: 50%;
transform: translateY(-50%);
font-size: 14px;
pointer-events: none;
}
.form-control {
width: 100%;
padding: 11px 12px 11px 38px;
border-radius: 10px;
border: 1.5px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.94);
color: #1a2e1a;
font-size: 16px; /* 16px cegah auto-zoom iOS */
font-family: inherit;
outline: none;
transition: border 0.2s, box-shadow 0.2s;
-webkit-appearance: none;
appearance: none;
}
.form-control::placeholder { color: #aab7aa; }
.form-control:focus {
border-color: rgba(255,255,255,0.6);
box-shadow: 0 0 0 3px rgba(255,255,255,0.18);
background: #ffffff;
}
.toggle-eye {
position: absolute;
right: 12px;
top: 50%;
transform: translateY(-50%);
cursor: pointer;
color: #888;
font-size: 14px;
background: none;
border: none;
padding: 0;
line-height: 1;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
}
/* ─── BUTTON ─── */
.btn-register {
width: 100%;
padding: 13px;
border-radius: 10px;
border: none;
background: #ffffff;
color: #1a6e3a;
font-size: 14.5px;
font-weight: 800;
font-family: inherit;
letter-spacing: 0.5px;
cursor: pointer;
transition: transform 0.15s, box-shadow 0.2s, background 0.2s;
box-shadow: 0 4px 18px rgba(0,0,0,0.15);
margin-top: 6px;
-webkit-tap-highlight-color: transparent;
}
.btn-register:hover {
background: #f0faf4;
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
.btn-register:active {
transform: translateY(0);
background: #e4f5ec;
}
/* ─── LINKS ─── */
.links-area {
text-align: center;
margin-top: 18px;
}
.links-area a {
color: rgba(255,255,255,0.75);
font-size: 12.5px;
text-decoration: none;
transition: color 0.15s;
}
.links-area a:hover { color: #fff; }
/* ─── RESPONSIVE: Tablet ─── */
@media screen and (min-width: 769px) and (max-width: 1024px) {
.auth-left { width: 40%; }
.auth-right { width: 60%; padding: 40px 28px; }
.auth-left img { width: 80%; }
}
/* ══════════════════════════════════════════
MOBILE 768px LAYOUT: atas-bawah
══════════════════════════════════════════ */
@media screen and (max-width: 768px) {
.auth-wrapper {
flex-direction: column !important;
min-height: 100vh;
}
/* ── Panel Atas: Logo ── */
.auth-left {
width: 100% !important;
height: auto !important;
min-height: unset !important;
padding: 40px 24px 32px !important;
flex-shrink: 0;
background: linear-gradient(160deg, #ffffff 60%, #f0faf5 100%) !important;
order: 0;
}
.auth-left img {
width: 50% !important;
max-width: 185px !important;
animation: none !important;
filter: drop-shadow(0 8px 20px rgba(15,80,40,0.14)) !important;
}
.auth-left .brand-tagline {
margin-top: 12px !important;
font-size: 10px !important;
letter-spacing: 2.5px !important;
}
.deco-circle.c1,
.deco-circle.c2 { display: none !important; }
.deco-circle.c3 { width: 90px !important; height: 90px !important; top: 12px !important; left: 12px !important; }
/* ── Panel Bawah: Form ── */
.auth-right {
width: 100% !important;
flex: 1 !important;
padding: 32px 24px 48px !important;
align-items: flex-start !important;
justify-content: center !important;
border-radius: 28px 28px 0 0 !important;
margin-top: -24px !important;
order: 1;
}
.auth-card {
max-width: 100% !important;
width: 100% !important;
}
.card-header-area {
margin-bottom: 20px !important;
}
.card-header-area .badge-pill {
font-size: 10px !important;
padding: 4px 12px !important;
}
.card-header-area h4 {
font-size: 16px !important;
}
.card-header-area p {
font-size: 12px !important;
}
.form-group {
margin-bottom: 12px !important;
}
.form-control {
padding: 12px 12px 12px 40px !important;
border-radius: 12px !important;
font-size: 16px !important;
}
.btn-register {
padding: 14px !important;
font-size: 15px !important;
border-radius: 12px !important;
margin-top: 8px !important;
}
.links-area {
margin-top: 18px !important;
}
.links-area a {
font-size: 13px !important;
padding: 4px 0 !important;
display: inline-block !important;
}
}
/* ─── Small Mobile ≤ 390px ─── */
@media screen and (max-width: 390px) {
.auth-left { padding: 32px 16px 24px !important; }
.auth-left img { width: 46% !important; max-width: 160px !important; }
.auth-right { padding: 26px 20px 40px !important; }
}
/* ─── Landscape Mobile ─── */
@media screen and (max-width: 768px) and (orientation: landscape) {
.auth-left {
padding: 18px 24px 16px !important;
}
.auth-left img { width: 26% !important; max-width: 100px !important; }
.auth-left .brand-tagline { margin-top: 6px !important; font-size: 9px !important; }
.auth-right {
padding: 22px 24px 30px !important;
border-radius: 20px 20px 0 0 !important;
margin-top: -10px !important;
}
.card-header-area { margin-bottom: 12px !important; }
.form-group { margin-bottom: 9px !important; }
}
</style>
<div class="auth-wrapper">
{{-- TOP / LEFT: Logo Panel --}}
<div class="auth-left">
<div class="deco-circle c1"></div>
<div class="deco-circle c2"></div>
<div class="deco-circle c3"></div>
<img src="{{ asset('tunggal.png') }}" alt="Green View Logo">
<span class="brand-tagline">Real Estate &bull; Bondowoso</span>
</div>
{{-- BOTTOM / RIGHT: Form Panel --}}
<div class="auth-right">
<div class="blob-top"></div>
<div class="auth-card">
<div class="card-header-area">
<div class="badge-pill"> Daftar Akun</div>
<h4>PT Tunggal Griya Sakinah<br>(GREEN VIEW)</h4>
<p>Buat akun penghuni baru</p>
</div>
@if(session('error'))
<div class="alert alert-danger">{{ session('error') }}</div>
@endif
@if($errors->any())
<div class="alert alert-danger">
@foreach($errors->all() as $error)
<div>{{ $error }}</div>
@endforeach
</div>
@endif
@if(session('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif
<form method="POST" action="{{ route('register.proses') }}">
@csrf
<div class="form-group">
<div class="input-wrap">
<span class="icon">👤</span>
<input name="name" class="form-control" placeholder="Nama Lengkap" value="{{ old('name') }}" required>
</div>
</div>
<div class="form-group">
<div class="input-wrap">
<span class="icon">🪪</span>
<input name="username" class="form-control" placeholder="Username" value="{{ old('username') }}" required>
</div>
</div>
<div class="form-group">
<div class="input-wrap">
<span class="icon">✉️</span>
<input type="email" name="email" class="form-control" placeholder="Email" value="{{ old('email') }}" required>
</div>
</div>
<div class="form-group">
<div class="input-wrap">
<span class="icon">🔒</span>
<input type="password" name="password" id="password" class="form-control" placeholder="Password" required autocomplete="new-password">
<button type="button" class="toggle-eye" onclick="togglePassword()" aria-label="Tampilkan/sembunyikan password">👁</button>
</div>
</div>
<button type="submit" class="btn-register">
Daftar Sekarang
</button>
</form>
<div class="links-area">
<a href="{{ route('login') }}">Sudah punya akun? Login di sini</a>
</div>
</div>
</div>
</div>
<script>
function togglePassword() {
const p = document.getElementById("password");
p.type = p.type === "password" ? "text" : "password";
}
</script>
@endsection

View File

@ -0,0 +1,365 @@
@extends('layouts.auth')
@section('content')
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Plus Jakarta Sans', sans-serif;
height: 100vh;
overflow: hidden;
background: #0a3d1e;
}
.auth-wrapper {
display: flex;
height: 100vh;
}
/* ─── LEFT PANEL (Logo) ─── */
.auth-left {
width: 55%;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
overflow: hidden;
background: #ffffff;
}
.auth-left::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 60% 50% at 80% 110%, rgba(25,148,84,0.10) 0%, transparent 70%),
radial-gradient(ellipse 50% 40% at -10% -10%, rgba(16,110,54,0.08) 0%, transparent 70%);
pointer-events: none;
}
.auth-left .brand-tagline {
margin-top: 18px;
font-size: 13px;
font-weight: 600;
letter-spacing: 3px;
text-transform: uppercase;
color: #2d7a4f;
opacity: 0.7;
}
.auth-left img {
width: 68%;
max-width: 340px;
object-fit: contain;
position: relative;
filter: drop-shadow(0 12px 32px rgba(15,80,40,0.18));
animation: floatLogo 5s ease-in-out infinite;
}
@keyframes floatLogo {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
.deco-circle {
position: absolute;
border-radius: 50%;
border: 1.5px solid rgba(25,148,84,0.12);
pointer-events: none;
}
.deco-circle.c1 { width: 420px; height: 420px; bottom: -120px; right: -120px; }
.deco-circle.c2 { width: 260px; height: 260px; bottom: -60px; right: -60px; }
.deco-circle.c3 { width: 160px; height: 160px; top: 30px; left: 30px; }
/* ─── RIGHT PANEL (Form) ─── */
.auth-right {
width: 45%;
background: linear-gradient(145deg, #1a6e3a 0%, #2e9e58 45%, #1a8040 100%);
display: flex;
align-items: center;
justify-content: center;
padding: 48px 40px;
position: relative;
overflow: hidden;
}
.auth-right::before {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.035'/%3E%3C/svg%3E");
opacity: 0.5;
pointer-events: none;
}
.auth-right::after {
content: '';
position: absolute;
width: 340px; height: 340px;
background: radial-gradient(circle, rgba(255,255,255,0.07) 0%, transparent 70%);
bottom: -80px; right: -80px;
border-radius: 50%;
pointer-events: none;
}
.blob-top {
position: absolute;
width: 240px; height: 240px;
background: radial-gradient(circle, rgba(255,255,255,0.06) 0%, transparent 70%);
top: -60px; left: -60px;
border-radius: 50%;
pointer-events: none;
}
/* ─── CARD ─── */
.auth-card {
width: 100%;
max-width: 360px;
position: relative;
z-index: 1;
animation: slideUp 0.55s cubic-bezier(0.22, 1, 0.36, 1) both;
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(28px); }
to { opacity: 1; transform: translateY(0); }
}
/* ─── HEADER ─── */
.card-header-area {
text-align: center;
margin-bottom: 32px;
}
.card-header-area .badge-pill {
display: inline-block;
background: rgba(255,255,255,0.15);
backdrop-filter: blur(6px);
border: 1px solid rgba(255,255,255,0.25);
color: #fff;
font-size: 11px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
padding: 5px 14px;
border-radius: 99px;
margin-bottom: 14px;
}
.card-header-area h4 {
color: #ffffff;
font-size: 18px;
font-weight: 800;
line-height: 1.3;
margin-bottom: 6px;
}
.card-header-area p {
color: rgba(255,255,255,0.65);
font-size: 12.5px;
margin: 0;
}
/* ─── ALERTS ─── */
.alert {
border-radius: 10px;
font-size: 13px;
padding: 10px 14px;
margin-bottom: 16px;
border: none;
}
.alert-danger { background: rgba(220,53,69,0.85); color: #fff; }
.alert-success { background: rgba(25,135,84,0.85); color: #fff; }
/* ─── FORM GROUP ─── */
.form-group {
margin-bottom: 18px;
}
.form-group label {
display: block;
color: rgba(255,255,255,0.85);
font-size: 12.5px;
font-weight: 600;
margin-bottom: 7px;
letter-spacing: 0.4px;
}
.input-wrap {
position: relative;
}
.input-wrap .icon {
position: absolute;
left: 13px;
top: 50%;
transform: translateY(-50%);
color: rgba(0,0,0,0.3);
font-size: 15px;
pointer-events: none;
}
.form-control {
width: 100%;
padding: 11px 12px 11px 38px;
border-radius: 10px;
border: 1.5px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.94);
color: #1a2e1a;
font-size: 14px;
font-family: inherit;
outline: none;
transition: border 0.2s, box-shadow 0.2s;
}
.form-control::placeholder { color: #aab7aa; }
.form-control:focus {
border-color: rgba(255,255,255,0.6);
box-shadow: 0 0 0 3px rgba(255,255,255,0.18);
background: #ffffff;
}
.toggle-eye {
position: absolute;
right: 12px;
top: 50%;
transform: translateY(-50%);
cursor: pointer;
color: #888;
font-size: 15px;
background: none;
border: none;
padding: 0;
line-height: 1;
}
/* ─── SUBMIT BUTTON ─── */
.btn-login {
width: 100%;
padding: 12px;
border-radius: 10px;
border: none;
background: #ffffff;
color: #1a6e3a;
font-size: 14.5px;
font-weight: 800;
font-family: inherit;
letter-spacing: 0.5px;
cursor: pointer;
transition: transform 0.15s, box-shadow 0.2s, background 0.2s;
box-shadow: 0 4px 18px rgba(0,0,0,0.15);
margin-top: 4px;
}
.btn-login:hover {
background: #f0faf4;
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
.btn-login:active { transform: translateY(0); }
/* ─── BACK LINK ─── */
.links-area {
text-align: center;
margin-top: 20px;
}
.links-area a {
color: rgba(255,255,255,0.75);
font-size: 12.5px;
text-decoration: none;
transition: color 0.15s;
}
.links-area a:hover { color: #fff; }
/* ─── RESPONSIVE ─── */
@media (max-width: 768px) {
.auth-left { display: none; }
.auth-right { width: 100%; }
}
</style>
<div class="auth-wrapper">
{{-- LEFT: Logo Panel --}}
<div class="auth-left">
<div class="deco-circle c1"></div>
<div class="deco-circle c2"></div>
<div class="deco-circle c3"></div>
<img src="{{ asset('tunggal.png') }}" alt="Green View Logo">
<span class="brand-tagline">Real Estate &bull; Bondowoso</span>
</div>
{{-- RIGHT: Form Panel --}}
<div class="auth-right">
<div class="blob-top"></div>
<div class="auth-card">
<div class="card-header-area">
<div class="badge-pill">🏡 Real Estate</div>
<h4>PT Tunggal Griya Sakinah<br>(GREEN VIEW)</h4>
<p>Reset Password</p>
</div>
@if(session('error'))
<div class="alert alert-danger">{{ session('error') }}</div>
@endif
@if(session('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif
@if ($errors->any())
<div class="alert alert-danger">
{{ $errors->first() }}
</div>
@endif
<form method="POST" action="{{ route('password.update') }}">
@csrf
<div class="form-group">
<label>Password Baru</label>
<div class="input-wrap">
<span class="icon">🔒</span>
<input type="password" name="password" id="password" class="form-control"
placeholder="Masukkan password baru" required>
<button type="button" class="toggle-eye" onclick="togglePassword('password', this)">👁</button>
</div>
</div>
<div class="form-group">
<label>Konfirmasi Password</label>
<div class="input-wrap">
<span class="icon">🔒</span>
<input type="password" name="password_confirmation" id="password_confirmation"
class="form-control" placeholder="Ulangi password baru" required>
<button type="button" class="toggle-eye" onclick="togglePassword('password_confirmation', this)">👁</button>
</div>
</div>
<button type="submit" class="btn-login">
Reset Password
</button>
</form>
</div>
</div>
</div>
<script>
function togglePassword(id, btn) {
const input = document.getElementById(id);
input.type = input.type === 'password' ? 'text' : 'password';
}
</script>
@endsection

View File

@ -0,0 +1,514 @@
@extends('layouts.auth')
@section('content')
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html, body {
font-family: 'Plus Jakarta Sans', sans-serif;
min-height: 100%;
background: #0a3d1e;
overflow-x: hidden;
}
/* ─── WRAPPER ─── */
.auth-wrapper {
display: flex;
flex-direction: row;
min-height: 100vh;
}
/* ─── LEFT PANEL (Logo) ─── */
.auth-left {
width: 55%;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
overflow: hidden;
background: #ffffff;
}
.auth-left::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 60% 50% at 80% 110%, rgba(25,148,84,0.10) 0%, transparent 70%),
radial-gradient(ellipse 50% 40% at -10% -10%, rgba(16,110,54,0.08) 0%, transparent 70%);
pointer-events: none;
}
.auth-left .brand-tagline {
margin-top: 18px;
font-size: 13px;
font-weight: 600;
letter-spacing: 3px;
text-transform: uppercase;
color: #2d7a4f;
opacity: 0.7;
}
.auth-left img {
width: 68%;
max-width: 340px;
object-fit: contain;
position: relative;
filter: drop-shadow(0 12px 32px rgba(15,80,40,0.18));
animation: floatLogo 5s ease-in-out infinite;
}
@keyframes floatLogo {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
.deco-circle {
position: absolute;
border-radius: 50%;
border: 1.5px solid rgba(25,148,84,0.12);
pointer-events: none;
}
.deco-circle.c1 { width: 420px; height: 420px; bottom: -120px; right: -120px; }
.deco-circle.c2 { width: 260px; height: 260px; bottom: -60px; right: -60px; }
.deco-circle.c3 { width: 160px; height: 160px; top: 30px; left: 30px; }
/* ─── RIGHT PANEL (Form) ─── */
.auth-right {
width: 45%;
background: linear-gradient(145deg, #1a6e3a 0%, #2e9e58 45%, #1a8040 100%);
display: flex;
align-items: center;
justify-content: center;
padding: 48px 40px;
position: relative;
overflow: hidden;
}
.auth-right::before {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.035'/%3E%3C/svg%3E");
opacity: 0.5;
pointer-events: none;
}
.auth-right::after {
content: '';
position: absolute;
width: 340px; height: 340px;
background: radial-gradient(circle, rgba(255,255,255,0.07) 0%, transparent 70%);
bottom: -80px; right: -80px;
border-radius: 50%;
pointer-events: none;
}
.blob-top {
position: absolute;
width: 240px; height: 240px;
background: radial-gradient(circle, rgba(255,255,255,0.06) 0%, transparent 70%);
top: -60px; left: -60px;
border-radius: 50%;
pointer-events: none;
}
/* ─── CARD ─── */
.auth-card {
width: 100%;
max-width: 360px;
position: relative;
z-index: 1;
animation: slideUp 0.55s cubic-bezier(0.22, 1, 0.36, 1) both;
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(28px); }
to { opacity: 1; transform: translateY(0); }
}
/* ─── HEADER ─── */
.card-header-area {
text-align: center;
margin-bottom: 32px;
}
.card-header-area .badge-pill {
display: inline-block;
background: rgba(255,255,255,0.15);
backdrop-filter: blur(6px);
border: 1px solid rgba(255,255,255,0.25);
color: #fff;
font-size: 11px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
padding: 5px 14px;
border-radius: 99px;
margin-bottom: 14px;
}
.card-header-area h4 {
color: #ffffff;
font-size: 18px;
font-weight: 800;
line-height: 1.3;
margin-bottom: 6px;
}
.card-header-area p {
color: rgba(255,255,255,0.65);
font-size: 12.5px;
margin: 0;
}
/* ─── ALERTS ─── */
.alert {
border-radius: 10px;
font-size: 13px;
padding: 10px 14px;
margin-bottom: 16px;
border: none;
}
.alert-danger { background: rgba(220,53,69,0.85); color: #fff; }
.alert-success { background: rgba(25,135,84,0.85); color: #fff; }
/* ─── FORM GROUP ─── */
.form-group {
margin-bottom: 18px;
}
.form-group label {
display: block;
color: rgba(255,255,255,0.85);
font-size: 12.5px;
font-weight: 600;
margin-bottom: 7px;
letter-spacing: 0.4px;
}
.input-wrap {
position: relative;
}
.input-wrap .icon {
position: absolute;
left: 13px;
top: 50%;
transform: translateY(-50%);
color: rgba(0,0,0,0.3);
font-size: 15px;
pointer-events: none;
}
.form-control {
width: 100%;
padding: 11px 42px 11px 38px;
border-radius: 10px;
border: 1.5px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.94);
color: #1a2e1a;
font-size: 16px; /* cegah auto-zoom iOS */
font-family: inherit;
outline: none;
transition: border 0.2s, box-shadow 0.2s;
-webkit-appearance: none;
appearance: none;
}
.form-control::placeholder { color: #aab7aa; }
.form-control:focus {
border-color: rgba(255,255,255,0.6);
box-shadow: 0 0 0 3px rgba(255,255,255,0.18);
background: #ffffff;
}
.toggle-eye {
position: absolute;
right: 12px;
top: 50%;
transform: translateY(-50%);
cursor: pointer;
color: #888;
font-size: 15px;
background: none;
border: none;
padding: 0;
line-height: 1;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
-webkit-tap-highlight-color: transparent;
}
/* ─── SUBMIT BUTTON ─── */
.btn-login {
width: 100%;
padding: 13px;
border-radius: 10px;
border: none;
background: #ffffff;
color: #1a6e3a;
font-size: 14.5px;
font-weight: 800;
font-family: inherit;
letter-spacing: 0.5px;
cursor: pointer;
transition: transform 0.15s, box-shadow 0.2s, background 0.2s;
box-shadow: 0 4px 18px rgba(0,0,0,0.15);
margin-top: 4px;
-webkit-tap-highlight-color: transparent;
}
.btn-login:hover {
background: #f0faf4;
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
.btn-login:active {
transform: translateY(0);
background: #e4f5ec;
}
/* ─── BACK LINK ─── */
.links-area {
text-align: center;
margin-top: 20px;
}
.links-area a {
color: rgba(255,255,255,0.75);
font-size: 12.5px;
text-decoration: none;
transition: color 0.15s;
}
.links-area a:hover { color: #fff; }
/* ─── RESPONSIVE: Tablet ─── */
@media screen and (min-width: 769px) and (max-width: 1024px) {
.auth-left { width: 40%; }
.auth-right { width: 60%; padding: 40px 28px; }
.auth-left img { width: 80%; }
}
/* ══════════════════════════════════════════
MOBILE 768px LAYOUT: atas-bawah
══════════════════════════════════════════ */
@media screen and (max-width: 768px) {
.auth-wrapper {
flex-direction: column !important;
min-height: 100vh;
}
/* ── Panel Atas: Logo ── */
.auth-left {
width: 100% !important;
height: auto !important;
min-height: unset !important;
padding: 44px 24px 36px !important;
flex-shrink: 0;
background: linear-gradient(160deg, #ffffff 60%, #f0faf5 100%) !important;
order: 0;
}
.auth-left img {
width: 50% !important;
max-width: 185px !important;
animation: none !important;
filter: drop-shadow(0 8px 20px rgba(15,80,40,0.14)) !important;
}
.auth-left .brand-tagline {
margin-top: 12px !important;
font-size: 10px !important;
letter-spacing: 2.5px !important;
}
.deco-circle.c1,
.deco-circle.c2 { display: none !important; }
.deco-circle.c3 { width: 90px !important; height: 90px !important; top: 12px !important; left: 12px !important; }
/* ── Panel Bawah: Form ── */
.auth-right {
width: 100% !important;
flex: 1 !important;
padding: 36px 24px 52px !important;
align-items: flex-start !important;
justify-content: center !important;
border-radius: 28px 28px 0 0 !important;
margin-top: -24px !important;
order: 1;
}
.auth-card {
max-width: 100% !important;
width: 100% !important;
}
.card-header-area {
margin-bottom: 24px !important;
}
.card-header-area .badge-pill {
font-size: 10px !important;
padding: 4px 12px !important;
}
.card-header-area h4 {
font-size: 16px !important;
}
.card-header-area p {
font-size: 12px !important;
}
.form-group {
margin-bottom: 15px !important;
}
.form-group label {
font-size: 12px !important;
}
.form-control {
padding: 13px 42px 13px 40px !important;
border-radius: 12px !important;
font-size: 16px !important;
}
.btn-login {
padding: 15px !important;
font-size: 15px !important;
border-radius: 12px !important;
margin-top: 8px !important;
}
.links-area {
margin-top: 22px !important;
}
.links-area a {
font-size: 13px !important;
padding: 4px 0 !important;
display: inline-block !important;
}
}
/* ─── Small Mobile ≤ 390px ─── */
@media screen and (max-width: 390px) {
.auth-left { padding: 36px 16px 28px !important; }
.auth-left img { width: 46% !important; max-width: 160px !important; }
.auth-right { padding: 28px 20px 44px !important; }
}
/* ─── Landscape Mobile ─── */
@media screen and (max-width: 768px) and (orientation: landscape) {
.auth-left {
padding: 18px 24px 16px !important;
}
.auth-left img { width: 26% !important; max-width: 100px !important; }
.auth-left .brand-tagline { margin-top: 6px !important; font-size: 9px !important; }
.auth-right {
padding: 22px 24px 32px !important;
border-radius: 20px 20px 0 0 !important;
margin-top: -10px !important;
}
.card-header-area { margin-bottom: 16px !important; }
.form-group { margin-bottom: 10px !important; }
}
</style>
<div class="auth-wrapper">
{{-- TOP / LEFT: Logo Panel --}}
<div class="auth-left">
<div class="deco-circle c1"></div>
<div class="deco-circle c2"></div>
<div class="deco-circle c3"></div>
<img src="{{ asset('tunggal.png') }}" alt="Green View Logo">
<span class="brand-tagline">Real Estate &bull; Bondowoso</span>
</div>
{{-- BOTTOM / RIGHT: Form Panel --}}
<div class="auth-right">
<div class="blob-top"></div>
<div class="auth-card">
<div class="card-header-area">
<div class="badge-pill">🏡 Real Estate</div>
<h4>PT Tunggal Griya Sakinah<br>(GREEN VIEW)</h4>
<p>Reset Password</p>
</div>
@if(session('error'))
<div class="alert alert-danger">{{ session('error') }}</div>
@endif
@if(session('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif
@if ($errors->any())
<div class="alert alert-danger">
{{ $errors->first() }}
</div>
@endif
<form method="POST" action="{{ route('password.update') }}">
@csrf
<div class="form-group">
<label>Password Baru</label>
<div class="input-wrap">
<span class="icon">🔒</span>
<input type="password" name="password" id="password" class="form-control"
placeholder="Masukkan password baru" required autocomplete="new-password">
<button type="button" class="toggle-eye" onclick="togglePassword('password', this)" aria-label="Tampilkan/sembunyikan password">👁</button>
</div>
</div>
<div class="form-group">
<label>Konfirmasi Password</label>
<div class="input-wrap">
<span class="icon">🔒</span>
<input type="password" name="password_confirmation" id="password_confirmation"
class="form-control" placeholder="Ulangi password baru" required autocomplete="new-password">
<button type="button" class="toggle-eye" onclick="togglePassword('password_confirmation', this)" aria-label="Tampilkan/sembunyikan password">👁</button>
</div>
</div>
<button type="submit" class="btn-login">
Reset Password
</button>
</form>
<div class="links-area">
<a href="{{ route('login') }}"> Kembali ke Login</a>
</div>
</div>
</div>
</div>
<script>
function togglePassword(id, btn) {
const input = document.getElementById(id);
input.type = input.type === 'password' ? 'text' : 'password';
}
</script>
@endsection

View File

@ -0,0 +1,813 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>Green View</title>
<!-- Custom fonts for this template-->
<link href="{{ asset('/') }}sbadmin2/vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
<link
href="{{ asset('/') }}sbadmin2/https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"
rel="stylesheet">
<!-- Custom styles for this template-->
<link href="{{ asset('/') }}sbadmin2/css/sb-admin-2.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.datatables.net/1.13.6/css/dataTables.bootstrap4.min.css">
@stack('styles')
<style>
.navbar-nav .nav-link {
transition: 0.3s;
}
.navbar-nav .nav-link:hover {
color: #198754 !important;
transform: translateY(-2px);
}
.kavling-grid {
display: grid;
grid-template-columns: repeat(10, 1fr);
gap: 10px;
}
.kavling {
padding: 15px;
text-align: center;
border-radius: 8px;
font-weight: bold;
color: white;
text-decoration: none;
}
.kosong {
background: #28a745;
}
.kosong:hover {
background: #218838;
}
.terisi {
background: #dc3545;
cursor: not-allowed;
}
.disabled {
background: #ccc;
}
.kavling {
padding: 15px;
border-radius: 8px;
text-align: center;
font-weight: bold;
color: white;
cursor: pointer;
}
.kosong {
background: #28a745;
}
.kosong:hover {
background: #218838;
}
.terisi {
background: #dc3545;
cursor: not-allowed;
}
</style>
</head>
<body id="page-top" class="user-mode">
@stack('scripts')
@php
$isExpired = false;
if (auth()->check()) {
$penghuni = \App\Models\Penghuni::where('email', auth()->user()->email)->first();
if ($penghuni && $penghuni->status_huni == 'Kontrak' && $penghuni->tanggal_keluar) {
$isExpired = now()->gt(\Carbon\Carbon::parse($penghuni->tanggal_keluar));
}
}
@endphp
{{-- 🔔 NOTIFIKASI REALTIME --}}
@if(session('success'))
<div class="alert alert-success alert-dismissible fade show position-fixed"
style="top:20px; right:20px; z-index:9999; min-width:250px;">
{{ session('success') }}
<button type="button" class="close" data-dismiss="alert">&times;</button>
</div>
@endif
@if(session('error'))
<div class="alert alert-danger alert-dismissible fade show position-fixed"
style="top:20px; right:20px; z-index:9999; min-width:250px;">
{{ session('error') }}
<button type="button" class="close" data-dismiss="alert">&times;</button>
</div>
@endif
<!-- Page Wrapper -->
<div id="wrapper">
@if(auth()->check())
{{-- 🔥 ADMIN --}}
@if(auth()->user()->role == 'admin')
@include('components.sidebar')
@endif
{{-- 🔥 RT --}}
@if(auth()->user()->role == 'rt')
@include('components.sidebar_rt')
@endif
@endif
<!-- Content Wrapper -->
<div id="content-wrapper" class="d-flex flex-column">
<!-- Main Content -->
<div id="content">
<!-- Topbar -->
@if(auth()->check() && auth()->user()->role == 'user')
<nav class="navbar-pro fixed-top">
<div class="navbar-pro-inner">
{{-- ===== KIRI: LOGO + MENU ===== --}}
<div class="navbar-left">
{{-- LOGO --}}
<a class="navbar-pro-brand" href="{{ route('user.home') }}">
<div class="brand-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
<path d="M12 3C8 3 4 7 4 11c0 2.5 1.5 4.5 3 6h10c1.5-1.5 3-3.5 3-6 0-4-4-8-8-8z"
fill="rgba(255,255,255,0.25)" />
<path d="M7 19c0-2.8 2.2-5 5-7 2.8 2 5 4.2 5 7H7z" fill="white" />
<line x1="12" y1="12" x2="12" y2="7" stroke="white" stroke-width="1.5"
stroke-linecap="round" />
</svg>
</div>
<span class="brand-name">GREEN VIEW</span>
</a>
{{-- SEPARATOR --}}
<div class="brand-sep"></div>
{{-- MENU --}}
<ul class="navbar-pro-menu">
<li>
<a href="{{ route('user.home') }}"
class="pro-nav-link {{ request()->routeIs('user.home') ? 'active' : '' }}">
<i class="fas fa-home"></i>
<span>Beranda</span>
</a>
</li>
<li>
<a href="{{ route('user.rumah') }}"
class="pro-nav-link {{ request()->routeIs('user.rumah') ? 'active' : '' }}">
<i class="fas fa-building"></i>
<span>Rumah</span>
</a>
</li>
<li>
<a href="{{ route('user.iuran.index') }}"
class="pro-nav-link {{ request()->routeIs('user.iuran.*') ? 'active' : '' }}">
<i class="fas fa-wallet"></i>
<span>Iuran</span>
</a>
</li>
<li class="has-dropdown">
@if($isExpired)
<a class="pro-nav-link disabled-link" href="#"
onclick="alert('Kontrak Anda telah berakhir'); return false;">
<i class="fas fa-comments"></i>
<span>Pengaduan</span>
</a>
@else
<a class="pro-nav-link {{ request()->routeIs('user.layanan.*') ? 'active' : '' }}"
href="#">
<i class="fas fa-comments"></i>
<span>Pengaduan</span>
<i class="fas fa-chevron-down chevron-icon"></i>
</a>
<div class="pro-dropdown">
<a href="{{ route('user.layanan.create') }}" class="pro-dropdown-item">
<span class="drop-emoji">✍️</span>
<div>
<div class="drop-label">Buat Pengaduan</div>
<div class="drop-sub">Kirim laporan baru</div>
</div>
</a>
<a href="{{ route('user.layanan.status') }}" class="pro-dropdown-item">
<span class="drop-emoji">📊</span>
<div>
<div class="drop-label">Status Pengaduan</div>
<div class="drop-sub">Pantau laporan Anda</div>
</div>
</a>
</div>
@endif
</li>
</ul>
</div>
{{-- ===== KANAN: PROFIL + LOGOUT ===== --}}
<div class="navbar-right">
{{-- PROFILE --}}
<a href="{{ route('user.profil') }}" class="pro-profile">
<div class="pro-avatar-wrap">
<img src="{{ auth()->user()->photo
? asset('profile/' . auth()->user()->photo)
: 'https://i.pravatar.cc/50?img=3' }}" class="pro-avatar" alt="Avatar">
<span class="avatar-dot"></span>
</div>
<div class="pro-profile-info">
<span class="pro-name">{{ auth()->user()->name }}</span>
<span class="pro-role">Penghuni</span>
</div>
</a>
{{-- DIVIDER --}}
<div class="nav-divider"></div>
{{-- LOGOUT --}}
<form action="{{ route('logout') }}" method="POST">
@csrf
<button type="submit" class="pro-logout-btn" title="Logout">
<i class="fas fa-sign-out-alt"></i>
</button>
</form>
</div>
{{-- HAMBURGER MOBILE --}}
<button class="hamburger" id="hamburgerBtn" onclick="toggleMobileNav()">
<span></span><span></span><span></span>
</button>
</div>
{{-- MOBILE DRAWER --}}
<div class="mobile-drawer" id="mobileDrawer">
<a href="{{ route('user.home') }}"
class="mobile-item {{ request()->routeIs('user.home') ? 'active' : '' }}">
<i class="fas fa-home"></i> Beranda
</a>
<a href="{{ route('user.rumah') }}"
class="mobile-item {{ request()->routeIs('user.rumah') ? 'active' : '' }}">
<i class="fas fa-building"></i> Rumah
</a>
<a href="{{ route('user.iuran.index') }}"
class="mobile-item {{ request()->routeIs('user.iuran.*') ? 'active' : '' }}">
<i class="fas fa-wallet"></i> Iuran
</a>
@if(!$isExpired)
<a href="{{ route('user.layanan.create') }}" class="mobile-item">
<i class="fas fa-comments"></i> Buat Pengaduan
</a>
<a href="{{ route('user.layanan.status') }}" class="mobile-item">
<i class="fas fa-list"></i> Status Pengaduan
</a>
@endif
<div class="mobile-bottom-row">
<a href="{{ route('user.profil') }}" class="mobile-profile-pill">
<img src="{{ auth()->user()->photo
? asset('profile/' . auth()->user()->photo)
: 'https://i.pravatar.cc/50?img=3' }}" class="mobile-avatar">
<span>{{ auth()->user()->name }}</span>
</a>
<form action="{{ route('logout') }}" method="POST">
@csrf
<button type="submit" class="mobile-logout-btn">
<i class="fas fa-sign-out-alt"></i> Keluar
</button>
</form>
</div>
</div>
</nav>
@endif
<!-- End of Topbar -->
<!-- Begin Page Content -->
@yield('content')
<!-- /.container-fluid -->
</div>
<!-- End of Main Content -->
<!-- Footer -->
<x-footer />
<!-- End of Footer -->
</div>
<!-- End of Content Wrapper -->
</div>
<!-- End of Page Wrapper -->
<!-- Scroll to Top Button-->
<a class="scroll-to-top rounded" href="#page-top">
<i class="fas fa-angle-up"></i>
</a>
<!-- Logout Modal-->
<div class="modal fade" id="logoutModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"
aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Ready to Leave?</h5>
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">Select "Logout" below if you are ready to end your current session.</div>
<div class="modal-footer">
<button class="btn btn-secondary" type="button" data-dismiss="modal">Cancel</button>
<a class="btn btn-primary" href="login.html">Logout</a>
</div>
</div>
</div>
</div>
<!-- Bootstrap core JavaScript-->
<script src="{{ asset('/') }}sbadmin2/vendor/jquery/jquery.min.js"></script>
<script src="{{ asset('/') }}sbadmin2/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Core plugin JavaScript-->
<script src="{{ asset('/') }}sbadmin2/vendor/jquery-easing/jquery.easing.min.js"></script>
<!-- Custom scripts for all pages-->
<script src="{{ asset('/') }}sbadmin2/js/sb-admin-2.min.js"></script>
<script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<!-- DataTables JS (pastikan jQuery sudah ada sebelumnya) -->
<script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.13.6/js/dataTables.bootstrap4.min.js"></script>
@yield('scripts')
</body>
</html>
<style>
/* ======================================== */
/* 🌿 NAVBAR PRO — GREEN GRADIENT EDITION */
/* ======================================== */
.navbar-pro * { box-sizing: border-box; }
.navbar-pro ul { list-style: none; margin: 0; padding: 0; }
.navbar-pro a { text-decoration: none; }
.navbar-pro {
position: fixed;
top: 0; left: 0; right: 0;
z-index: 9999;
}
.navbar-pro::before {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(135deg,
#064e3b 0%, #065f46 20%, #047857 45%, #059669 70%, #10b981 100%
);
box-shadow:
0 4px 24px rgba(5,150,105,0.35),
0 1px 0 rgba(255,255,255,0.12) inset,
0 -1px 0 rgba(0,0,0,0.1) inset;
}
.navbar-pro::after {
content: '';
position: absolute;
bottom: 0; left: 0; right: 0;
height: 2px;
background: linear-gradient(90deg,
transparent 0%, rgba(255,255,255,0.4) 30%,
rgba(167,243,208,0.6) 50%, rgba(255,255,255,0.4) 70%, transparent 100%
);
}
.navbar-pro-inner {
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
height: 64px;
padding: 0 24px;
max-width: 1600px;
margin: 0 auto;
}
.navbar-left {
display: flex;
align-items: center;
gap: 6px;
}
.navbar-pro-brand {
display: flex;
align-items: center;
gap: 9px;
color: #fff !important;
font-family: 'Nunito', sans-serif;
font-weight: 900;
font-size: 15px;
letter-spacing: 1.8px;
text-transform: uppercase;
flex-shrink: 0;
transition: all 0.2s;
}
.navbar-pro-brand:hover { opacity: 0.9; transform: translateY(-1px); }
.brand-icon {
width: 36px; height: 36px;
background: rgba(255,255,255,0.2);
border: 1.5px solid rgba(255,255,255,0.35);
border-radius: 10px;
display: flex; align-items: center; justify-content: center;
backdrop-filter: blur(4px);
box-shadow: 0 2px 10px rgba(0,0,0,0.15), inset 0 1px 0 rgba(255,255,255,0.2);
flex-shrink: 0;
transition: 0.2s;
}
.navbar-pro-brand:hover .brand-icon { background: rgba(255,255,255,0.28); transform: rotate(-5deg) scale(1.05); }
.brand-name { color: #fff; text-shadow: 0 1px 3px rgba(0,0,0,0.2); }
.brand-sep {
width: 1px; height: 28px;
background: rgba(255,255,255,0.25);
margin: 0 10px;
flex-shrink: 0;
}
.navbar-pro-menu {
display: flex;
align-items: center;
gap: 2px;
}
.pro-nav-link {
display: flex;
align-items: center;
gap: 7px;
padding: 8px 15px;
border-radius: 10px;
color: rgba(255,255,255,0.82) !important;
font-size: 13.5px;
font-weight: 600;
font-family: 'Nunito', sans-serif;
transition: all 0.2s ease;
white-space: nowrap;
position: relative;
border: 1px solid transparent;
}
.pro-nav-link i:not(.chevron-icon) { font-size: 13px; opacity: 0.85; }
.pro-nav-link:hover {
background: rgba(255,255,255,0.15);
color: #ffffff !important;
border-color: rgba(255,255,255,0.2);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0,0,0,0.12);
}
.pro-nav-link.active {
background: rgba(255,255,255,0.22);
color: #ffffff !important;
border-color: rgba(255,255,255,0.3);
box-shadow: 0 4px 14px rgba(0,0,0,0.15), inset 0 1px 0 rgba(255,255,255,0.25);
text-shadow: 0 1px 2px rgba(0,0,0,0.1);
}
.chevron-icon {
font-size: 9px !important;
margin-left: 1px;
opacity: 0.7;
transition: transform 0.2s;
}
.has-dropdown:hover .chevron-icon { transform: rotate(180deg); opacity: 1; }
/* ── DROPDOWN FIX ── */
.has-dropdown {
position: relative;
}
.has-dropdown::after {
content: '';
position: absolute;
top: 100%;
left: 0;
right: 0;
height: 16px;
background: transparent;
z-index: 99;
}
.pro-dropdown {
position: absolute;
top: 100%;
left: 0;
background: #fff;
border: 1px solid rgba(5,150,105,0.15);
border-radius: 14px;
padding: 18px 8px 8px;
min-width: 230px;
box-shadow: 0 20px 50px rgba(0,0,0,0.15), 0 4px 15px rgba(5,150,105,0.1);
opacity: 0;
pointer-events: none;
visibility: hidden;
transition: opacity 0.2s ease, visibility 0.2s ease;
z-index: 100;
margin-top: 0;
}
.has-dropdown:hover .pro-dropdown {
opacity: 1;
pointer-events: auto;
visibility: visible;
}
.pro-dropdown::before {
content: '';
position: absolute;
top: 10px; left: 20px;
width: 12px; height: 12px;
background: #fff;
border: 1px solid rgba(5,150,105,0.15);
border-bottom: none; border-right: none;
transform: rotate(45deg);
}
.pro-dropdown-item {
display: flex;
align-items: center;
gap: 12px;
padding: 11px 13px;
border-radius: 10px;
color: #374151;
font-size: 13.5px;
font-family: 'Nunito', sans-serif;
transition: all 0.2s;
}
.pro-dropdown-item:hover {
background: linear-gradient(135deg, #ecfdf5, #d1fae5);
color: #065f46;
transform: translateX(3px);
}
.drop-emoji { font-size: 20px; flex-shrink: 0; }
.drop-label { font-weight: 700; font-size: 13.5px; color: #1f2937; }
.drop-sub { font-size: 11.5px; color: #6b7280; margin-top: 1px; }
.pro-dropdown-item:hover .drop-label { color: #065f46; }
/* ── KANAN ── */
.navbar-right {
display: flex;
align-items: center;
gap: 10px;
}
.nav-divider {
width: 1px; height: 30px;
background: rgba(255,255,255,0.25);
}
.pro-profile {
display: flex;
align-items: center;
gap: 10px;
padding: 5px 14px 5px 5px;
border-radius: 50px;
background: rgba(255,255,255,0.15);
border: 1.5px solid rgba(255,255,255,0.25);
transition: all 0.2s;
color: #fff !important;
backdrop-filter: blur(4px);
}
.pro-profile:hover {
background: rgba(255,255,255,0.25);
border-color: rgba(255,255,255,0.4);
transform: translateY(-1px);
box-shadow: 0 6px 18px rgba(0,0,0,0.15);
color: #fff !important;
}
.pro-avatar-wrap { position: relative; flex-shrink: 0; }
.pro-avatar {
width: 36px; height: 36px;
border-radius: 50%;
object-fit: cover;
display: block;
border: 2px solid rgba(255,255,255,0.5);
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
}
.avatar-dot {
position: absolute;
bottom: 1px; right: 1px;
width: 10px; height: 10px;
background: #fde047;
border-radius: 50%;
border: 2px solid rgba(6,95,70,0.8);
box-shadow: 0 0 6px rgba(253,224,71,0.6);
}
.pro-profile-info { display: flex; flex-direction: column; line-height: 1.2; }
.pro-name {
font-size: 13px; font-weight: 700; color: #fff;
font-family: 'Nunito', sans-serif;
max-width: 110px; overflow: hidden;
text-overflow: ellipsis; white-space: nowrap;
text-shadow: 0 1px 2px rgba(0,0,0,0.15);
}
.pro-role {
font-size: 10px; color: #a7f3d0;
font-weight: 700; text-transform: uppercase; letter-spacing: 0.8px;
}
.pro-logout-btn {
width: 38px; height: 38px;
border-radius: 10px;
border: 1.5px solid rgba(255,255,255,0.25);
background: rgba(255,255,255,0.12);
color: rgba(255,255,255,0.85);
cursor: pointer;
display: flex; align-items: center; justify-content: center;
font-size: 14px;
transition: all 0.2s;
backdrop-filter: blur(4px);
}
.pro-logout-btn:hover {
background: rgba(239,68,68,0.25);
border-color: rgba(252,165,165,0.5);
color: #fca5a5;
transform: scale(1.08);
box-shadow: 0 4px 14px rgba(239,68,68,0.3);
}
/* ── HAMBURGER ── */
.hamburger {
display: none;
flex-direction: column;
gap: 5px;
background: rgba(255,255,255,0.15);
border: 1px solid rgba(255,255,255,0.2);
border-radius: 8px;
cursor: pointer;
padding: 8px;
}
.hamburger span {
display: block;
width: 20px; height: 2px;
background: rgba(255,255,255,0.9);
border-radius: 2px;
transition: 0.3s;
}
/* ── MOBILE DRAWER ── */
.mobile-drawer {
display: none;
flex-direction: column;
gap: 3px;
padding: 10px 16px 16px;
position: relative;
background: linear-gradient(180deg, #047857, #065f46);
border-top: 1px solid rgba(255,255,255,0.1);
}
.mobile-drawer.open { display: flex; }
.mobile-item {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 14px;
border-radius: 10px;
color: rgba(255,255,255,0.82);
font-size: 14px;
font-family: 'Nunito', sans-serif;
font-weight: 600;
transition: all 0.2s;
border: 1px solid transparent;
}
.mobile-item i { width: 18px; text-align: center; color: #6ee7b7; }
.mobile-item:hover,
.mobile-item.active {
background: rgba(255,255,255,0.15);
color: #fff;
border-color: rgba(255,255,255,0.15);
}
.mobile-bottom-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 4px 4px;
margin-top: 8px;
border-top: 1px solid rgba(255,255,255,0.15);
gap: 10px;
}
.mobile-profile-pill {
display: flex;
align-items: center;
gap: 8px;
color: rgba(255,255,255,0.9);
font-size: 13px;
font-family: 'Nunito', sans-serif;
font-weight: 700;
}
.mobile-avatar {
width: 32px; height: 32px;
border-radius: 50%;
object-fit: cover;
border: 2px solid rgba(255,255,255,0.4);
}
.mobile-logout-btn {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 14px;
border-radius: 8px;
border: 1px solid rgba(252,165,165,0.4);
background: rgba(239,68,68,0.15);
color: #fca5a5;
font-size: 13px;
font-weight: 600;
font-family: 'Nunito', sans-serif;
cursor: pointer;
transition: 0.2s;
}
.mobile-logout-btn:hover { background: rgba(239,68,68,0.3); color: #fff; }
/* ── CONTENT OFFSET ── */
.user-mode #content { margin-top: 64px; }
@media (max-width: 768px) {
.user-mode #content { margin-top: 64px; }
}
@media (max-width: 992px) {
.navbar-pro-menu,
.navbar-right { display: none; }
.hamburger { display: flex; }
}
</style>
<script>
setTimeout(() => {
$('.alert').fadeOut('slow');
}, 3000);
</script>
<script>
// Dark Toggle
const toggle = document.getElementById("darkToggle");
if (toggle) {
toggle.addEventListener("click", () => {
document.body.classList.toggle("dark");
const isDark = document.body.classList.contains("dark");
localStorage.setItem("darkMode", isDark);
toggle.querySelector('.dark-icon').textContent = isDark ? '☀️' : '🌙';
});
if (localStorage.getItem("darkMode") === "true") {
document.body.classList.add("dark");
toggle.querySelector('.dark-icon').textContent = '☀️';
}
}
// Hamburger Mobile
function toggleMobileNav() {
const drawer = document.getElementById('mobileDrawer');
drawer.classList.toggle('open');
}
</script>

View File

@ -114,25 +114,11 @@
height: 3px;
}
.stat-card:nth-child(1)::before {
background: #064e3b;
}
.stat-card:nth-child(2)::before {
background: #dc2626;
}
.stat-card:nth-child(3)::before {
background: #2563eb;
}
.stat-card:nth-child(4)::before {
background: #7c3aed;
}
.stat-card:nth-child(5)::before {
background: #d97706;
}
.stat-card:nth-child(1)::before { background: #064e3b; }
.stat-card:nth-child(2)::before { background: #dc2626; }
.stat-card:nth-child(3)::before { background: #2563eb; }
.stat-card:nth-child(4)::before { background: #7c3aed; }
.stat-card:nth-child(5)::before { background: #d97706; }
.stat-card:hover {
transform: translateY(-3px);
@ -150,30 +136,11 @@
font-size: 1rem;
}
.stat-card:nth-child(1) .stat-icon {
background: #d1fae5;
color: #064e3b;
}
.stat-card:nth-child(2) .stat-icon {
background: #fee2e2;
color: #dc2626;
}
.stat-card:nth-child(3) .stat-icon {
background: #dbeafe;
color: #2563eb;
}
.stat-card:nth-child(4) .stat-icon {
background: #ede9fe;
color: #7c3aed;
}
.stat-card:nth-child(5) .stat-icon {
background: #fef3c7;
color: #d97706;
}
.stat-card:nth-child(1) .stat-icon { background: #d1fae5; color: #064e3b; }
.stat-card:nth-child(2) .stat-icon { background: #fee2e2; color: #dc2626; }
.stat-card:nth-child(3) .stat-icon { background: #dbeafe; color: #2563eb; }
.stat-card:nth-child(4) .stat-icon { background: #ede9fe; color: #7c3aed; }
.stat-card:nth-child(5) .stat-icon { background: #fef3c7; color: #d97706; }
.stat-value {
font-size: 1.6rem;
@ -182,25 +149,11 @@
margin-bottom: 5px;
}
.stat-card:nth-child(1) .stat-value {
color: #064e3b;
}
.stat-card:nth-child(2) .stat-value {
color: #dc2626;
}
.stat-card:nth-child(3) .stat-value {
color: #2563eb;
}
.stat-card:nth-child(4) .stat-value {
color: #7c3aed;
}
.stat-card:nth-child(5) .stat-value {
color: #d97706;
}
.stat-card:nth-child(1) .stat-value { color: #064e3b; }
.stat-card:nth-child(2) .stat-value { color: #dc2626; }
.stat-card:nth-child(3) .stat-value { color: #2563eb; }
.stat-card:nth-child(4) .stat-value { color: #7c3aed; }
.stat-card:nth-child(5) .stat-value { color: #d97706; }
.stat-label {
font-size: 0.78rem;
@ -236,9 +189,7 @@
gap: 9px;
}
.card-header i {
color: #064e3b;
}
.card-header i { color: #064e3b; }
.card-header span {
font-size: 0.75rem;
@ -262,6 +213,7 @@
.field-wrap {
flex: 1;
min-width: 0;
}
.field-label {
@ -298,9 +250,7 @@
cursor: pointer;
}
.field-select:hover {
border-color: #94a3b8;
}
.field-select:hover { border-color: #94a3b8; }
.field-select:focus {
border-color: #064e3b;
@ -332,9 +282,7 @@
box-shadow: 0 8px 22px rgba(6, 78, 59, 0.38);
}
.btn-cetak:active {
transform: translateY(0);
}
.btn-cetak:active { transform: translateY(0); }
/* ─── INFO STRIP ─── */
.info-strip {
@ -394,7 +342,6 @@
width: 24px;
height: 24px;
background: #d1fae5;
color: #064e3b;
border-radius: 50%;
display: flex;
align-items: center;
@ -443,9 +390,18 @@
.form-row-inline {
flex-direction: column;
align-items: stretch; /* ← FIX: was missing, caused right-align */
gap: 0.75rem;
}
.field-wrap {
width: 100%;
}
.field-select {
width: 100%;
}
.hero-text h2 {
font-size: 1.15rem;
}
@ -557,7 +513,8 @@
<select name="tahun" class="field-select">
@for($y = date('Y'); $y >= date('Y') - 4; $y--)
<option value="{{ $y }}" {{ (request('tahun', date('Y')) == $y) ? 'selected' : '' }}>
{{ $y }}</option>
{{ $y }}
</option>
@endfor
</select>
</div>

View File

@ -3,22 +3,24 @@
<head>
<meta charset="UTF-8">
<title>Lupa Password - Green View</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
html, body {
font-family: 'Plus Jakarta Sans', sans-serif;
height: 100vh;
overflow: hidden;
min-height: 100%;
background: #0a3d1e;
overflow-x: hidden;
}
/* ─── WRAPPER ─── */
.auth-wrapper {
display: flex;
height: 100vh;
flex-direction: row;
min-height: 100vh;
}
/* ─── LEFT PANEL (Logo) ─── */
@ -217,10 +219,12 @@
border: 1.5px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.94);
color: #1a2e1a;
font-size: 14px;
font-size: 16px; /* cegah auto-zoom iOS */
font-family: inherit;
outline: none;
transition: border 0.2s, box-shadow 0.2s;
-webkit-appearance: none;
appearance: none;
}
.form-control::placeholder { color: #aab7aa; }
@ -234,7 +238,7 @@
/* ─── BUTTON ─── */
.btn-submit {
width: 100%;
padding: 12px;
padding: 13px;
border-radius: 10px;
border: none;
background: #ffffff;
@ -246,6 +250,7 @@
cursor: pointer;
transition: transform 0.15s, box-shadow 0.2s, background 0.2s;
box-shadow: 0 4px 18px rgba(0,0,0,0.15);
-webkit-tap-highlight-color: transparent;
}
.btn-submit:hover {
@ -254,7 +259,10 @@
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
.btn-submit:active { transform: translateY(0); }
.btn-submit:active {
transform: translateY(0);
background: #e4f5ec;
}
/* ─── LINKS ─── */
.links-area {
@ -271,10 +279,139 @@
.links-area a:hover { color: #fff; }
/* ─── RESPONSIVE ─── */
@media (max-width: 768px) {
.auth-left { display: none; }
.auth-right { width: 100%; }
/* ─── RESPONSIVE: Tablet ─── */
@media screen and (min-width: 769px) and (max-width: 1024px) {
.auth-left { width: 40%; }
.auth-right { width: 60%; padding: 40px 28px; }
.auth-left img { width: 80%; }
}
/* ══════════════════════════════════════════
MOBILE 768px LAYOUT: atas-bawah
══════════════════════════════════════════ */
@media screen and (max-width: 768px) {
.auth-wrapper {
flex-direction: column !important;
min-height: 100vh;
}
/* ── Panel Atas: Logo ── */
.auth-left {
width: 100% !important;
height: auto !important;
min-height: unset !important;
padding: 44px 24px 36px !important;
flex-shrink: 0;
background: linear-gradient(160deg, #ffffff 60%, #f0faf5 100%) !important;
order: 0;
}
.auth-left img {
width: 50% !important;
max-width: 185px !important;
animation: none !important;
filter: drop-shadow(0 8px 20px rgba(15,80,40,0.14)) !important;
}
.auth-left .brand-tagline {
margin-top: 12px !important;
font-size: 10px !important;
letter-spacing: 2.5px !important;
}
.deco-circle.c1,
.deco-circle.c2 { display: none !important; }
.deco-circle.c3 { width: 90px !important; height: 90px !important; top: 12px !important; left: 12px !important; }
/* ── Panel Bawah: Form ── */
.auth-right {
width: 100% !important;
flex: 1 !important;
padding: 36px 24px 52px !important;
align-items: flex-start !important;
justify-content: center !important;
border-radius: 28px 28px 0 0 !important;
margin-top: -24px !important;
order: 1;
}
.auth-card {
max-width: 100% !important;
width: 100% !important;
}
.card-header-area {
margin-bottom: 20px !important;
}
.card-header-area .badge-pill {
font-size: 10px !important;
padding: 4px 12px !important;
}
.card-header-area h4 {
font-size: 18px !important;
}
.card-header-area p {
font-size: 12px !important;
}
.info-box {
font-size: 12px !important;
padding: 10px 12px !important;
margin-bottom: 18px !important;
}
.form-group {
margin-bottom: 14px !important;
}
.form-control {
padding: 13px 12px 13px 40px !important;
border-radius: 12px !important;
font-size: 16px !important;
}
.btn-submit {
padding: 14px !important;
font-size: 15px !important;
border-radius: 12px !important;
}
.links-area {
margin-top: 22px !important;
}
.links-area a {
font-size: 13px !important;
padding: 4px 0 !important;
display: inline-block !important;
}
}
/* ─── Small Mobile ≤ 390px ─── */
@media screen and (max-width: 390px) {
.auth-left { padding: 36px 16px 28px !important; }
.auth-left img { width: 46% !important; max-width: 160px !important; }
.auth-right { padding: 28px 20px 44px !important; }
}
/* ─── Landscape Mobile ─── */
@media screen and (max-width: 768px) and (orientation: landscape) {
.auth-left {
padding: 18px 24px 16px !important;
}
.auth-left img { width: 26% !important; max-width: 100px !important; }
.auth-left .brand-tagline { margin-top: 6px !important; font-size: 9px !important; }
.auth-right {
padding: 22px 24px 32px !important;
border-radius: 20px 20px 0 0 !important;
margin-top: -10px !important;
}
.card-header-area { margin-bottom: 14px !important; }
.form-group { margin-bottom: 10px !important; }
}
</style>
</head>
@ -283,7 +420,7 @@
<div class="auth-wrapper">
{{-- LEFT: Logo Panel --}}
{{-- TOP / LEFT: Logo Panel --}}
<div class="auth-left">
<div class="deco-circle c1"></div>
<div class="deco-circle c2"></div>
@ -292,7 +429,7 @@
<span class="brand-tagline">Real Estate &bull; Bondowoso</span>
</div>
{{-- RIGHT: Form Panel --}}
{{-- BOTTOM / RIGHT: Form Panel --}}
<div class="auth-right">
<div class="blob-top"></div>
@ -326,7 +463,7 @@
<div class="form-group">
<div class="input-wrap">
<span class="icon">✉️</span>
<input type="email" name="email" class="form-control" placeholder="Masukkan email Anda" required>
<input type="email" name="email" class="form-control" placeholder="Masukkan email Anda" required autocomplete="email">
</div>
</div>

View File

@ -4,19 +4,23 @@
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
html, body {
font-family: 'Plus Jakarta Sans', sans-serif;
min-height: 100vh;
min-height: 100%;
background: #0a3d1e;
overflow-x: hidden;
}
/* ─── WRAPPER ─── */
.auth-wrapper {
display: flex;
min-height: 100vh;
flex-direction: row; /* desktop: side by side */
}
/* ─── LEFT PANEL (Logo) ─── */
@ -210,7 +214,7 @@
border: 1.5px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.94);
color: #1a2e1a;
font-size: 16px; /* 16px mencegah auto-zoom iOS */
font-size: 16px;
font-family: inherit;
outline: none;
transition: border 0.2s, box-shadow 0.2s;
@ -238,7 +242,6 @@
border: none;
padding: 0;
line-height: 1;
/* area sentuh lebih besar di mobile */
width: 36px;
height: 36px;
display: flex;
@ -298,154 +301,151 @@
}
/* ─── RESPONSIVE: Tablet ─── */
@media (min-width: 769px) and (max-width: 1024px) {
@media screen and (min-width: 769px) and (max-width: 1024px) {
.auth-left { width: 40%; }
.auth-right { width: 60%; padding: 40px 28px; }
.auth-left img { width: 80%; }
}
/* ─── RESPONSIVE: Mobile ─── */
@media (max-width: 768px) {
html, body { overflow-x: hidden; }
/* ══════════════════════════════════════════
MOBILE 768px LAYOUT: atas-bawah
══════════════════════════════════════════ */
@media screen and (max-width: 768px) {
/* Wrapper jadi kolom */
.auth-wrapper {
flex-direction: column;
flex-direction: column !important;
min-height: 100vh;
}
/* ── Panel Kiri: banner logo di atas ── */
/* ── Panel Atas: Logo ── */
.auth-left {
width: 100%;
height: auto;
padding: 44px 24px 36px;
width: 100% !important;
height: auto !important;
min-height: unset !important;
padding: 44px 24px 36px !important;
flex-shrink: 0;
/* gradient hijau tipis di background putih agar tidak terlalu polos */
background: linear-gradient(160deg, #ffffff 60%, #f0faf5 100%);
background: linear-gradient(160deg, #ffffff 60%, #f0faf5 100%) !important;
order: 0;
}
.auth-left img {
width: 48%;
max-width: 180px;
animation: none;
filter: drop-shadow(0 8px 20px rgba(15,80,40,0.14));
width: 52% !important;
max-width: 190px !important;
animation: none !important;
filter: drop-shadow(0 8px 20px rgba(15,80,40,0.14)) !important;
}
.auth-left .brand-tagline {
margin-top: 12px;
font-size: 10px;
letter-spacing: 2.5px;
margin-top: 12px !important;
font-size: 10px !important;
letter-spacing: 2.5px !important;
}
/* Dekorasi lingkaran: sembunyikan yang besar, kecilkan yang kecil */
/* Dekorasi: sembunyikan lingkaran besar */
.deco-circle.c1,
.deco-circle.c2 { display: none; }
.deco-circle.c3 { width: 90px; height: 90px; top: 12px; left: 12px; }
.deco-circle.c2 { display: none !important; }
.deco-circle.c3 { width: 90px !important; height: 90px !important; top: 12px !important; left: 12px !important; }
/* ── Panel Kanan: form di bawah, mengisi sisa layar ── */
/* ── Panel Bawah: Form ── */
.auth-right {
width: 100%;
flex: 1;
padding: 36px 24px 52px;
/* align atas agar tidak ada ruang kosong aneh di HP pendek */
align-items: flex-start;
justify-content: center;
/* border-radius atas untuk efek "card naik" */
border-radius: 28px 28px 0 0;
/* tarik ke atas sedikit agar overlap logo */
margin-top: -20px;
width: 100% !important;
flex: 1 !important;
padding: 36px 24px 52px !important;
align-items: flex-start !important;
justify-content: center !important;
border-radius: 28px 28px 0 0 !important;
margin-top: -24px !important;
order: 1;
}
.auth-card {
max-width: 100%;
width: 100%;
max-width: 100% !important;
width: 100% !important;
}
.card-header-area {
margin-bottom: 24px;
margin-bottom: 24px !important;
}
.card-header-area .badge-pill {
font-size: 10px;
padding: 4px 12px;
font-size: 10px !important;
padding: 4px 12px !important;
}
.card-header-area h4 {
font-size: 17px;
font-size: 17px !important;
}
.card-header-area p {
font-size: 12px;
font-size: 12px !important;
}
/* Form group sedikit lebih rapat */
.form-group {
margin-bottom: 15px;
margin-bottom: 15px !important;
}
.form-group label {
font-size: 12px;
font-size: 12px !important;
}
/* Input lebih tinggi untuk kemudahan tap */
.form-control {
padding: 13px 12px 13px 40px;
border-radius: 12px;
padding: 13px 12px 13px 40px !important;
border-radius: 12px !important;
font-size: 16px !important; /* cegah zoom iOS */
}
/* Tombol login lebih besar */
.btn-login {
padding: 15px;
font-size: 15px;
border-radius: 12px;
margin-top: 8px;
padding: 15px !important;
font-size: 15px !important;
border-radius: 12px !important;
margin-top: 8px !important;
}
/* Link login: tumpuk vertikal, jarak nyaman */
.links-area {
display: flex;
flex-direction: column;
gap: 12px;
align-items: center;
margin-top: 22px;
display: flex !important;
flex-direction: column !important;
gap: 12px !important;
align-items: center !important;
margin-top: 22px !important;
}
.links-area a {
font-size: 13px;
/* area sentuh lebih besar */
padding: 4px 0;
display: inline-block;
font-size: 13px !important;
padding: 4px 0 !important;
display: inline-block !important;
}
.links-area .divider { display: none; }
.links-area .divider { display: none !important; }
}
/* ─── RESPONSIVE: Small Mobile (≤ 390px) ─── */
@media (max-width: 390px) {
.auth-left { padding: 36px 16px 28px; }
.auth-left img { width: 44%; max-width: 160px; }
.auth-right { padding: 28px 20px 44px; }
/* ─── Small Mobile ≤ 390px ─── */
@media screen and (max-width: 390px) {
.auth-left { padding: 36px 16px 28px !important; }
.auth-left img { width: 46% !important; max-width: 165px !important; }
.auth-right { padding: 28px 20px 44px !important; }
}
/* ─── Landscape Mobile ─── */
@media (max-width: 768px) and (orientation: landscape) {
@media screen and (max-width: 768px) and (orientation: landscape) {
.auth-left {
padding: 24px 24px 20px;
padding: 20px 24px 18px !important;
}
.auth-left img { width: 30%; max-width: 120px; }
.auth-left .brand-tagline { margin-top: 8px; font-size: 9px; }
.auth-left img { width: 28% !important; max-width: 110px !important; }
.auth-left .brand-tagline { margin-top: 8px !important; font-size: 9px !important; }
.auth-right {
padding: 24px 24px 32px;
border-radius: 20px 20px 0 0;
margin-top: -12px;
padding: 24px 24px 32px !important;
border-radius: 20px 20px 0 0 !important;
margin-top: -12px !important;
}
.card-header-area { margin-bottom: 16px; }
.form-group { margin-bottom: 12px; }
.card-header-area { margin-bottom: 14px !important; }
.form-group { margin-bottom: 10px !important; }
}
</style>
<div class="auth-wrapper">
{{-- LEFT: Logo Panel --}}
{{-- TOP / LEFT: Logo Panel --}}
<div class="auth-left">
<div class="deco-circle c1"></div>
<div class="deco-circle c2"></div>
@ -454,7 +454,7 @@
<span class="brand-tagline">Real Estate &bull; Bondowoso</span>
</div>
{{-- RIGHT: Form Panel --}}
{{-- BOTTOM / RIGHT: Form Panel --}}
<div class="auth-right">
<div class="blob-top"></div>

View File

@ -4,20 +4,23 @@
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
html, body {
font-family: 'Plus Jakarta Sans', sans-serif;
height: 100vh;
overflow: hidden;
min-height: 100%;
background: #0a3d1e;
overflow-x: hidden;
}
/* ─── WRAPPER ─── */
.auth-wrapper {
display: flex;
height: 100vh;
flex-direction: row;
min-height: 100vh;
width: 100%;
}
@ -82,7 +85,6 @@
.deco-circle.c3 { width: 160px; height: 160px; top: 30px; left: 30px; }
/* ─── RIGHT PANEL ─── */
/* Warna hijau disamakan persis dengan login (gambar 2) */
.auth-right {
width: 45%;
flex-shrink: 0;
@ -95,7 +97,6 @@
overflow: hidden;
}
/* noise texture */
.auth-right::before {
content: '';
position: absolute;
@ -105,7 +106,6 @@
pointer-events: none;
}
/* decorative blob bottom-right */
.auth-right::after {
content: '';
position: absolute;
@ -224,13 +224,19 @@
border: 1.5px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.94);
color: #1a2e1a;
font-size: 14px;
font-size: 16px; /* cegah auto-zoom iOS */
font-family: inherit;
outline: none;
transition: border 0.2s, box-shadow 0.2s;
-webkit-appearance: none;
appearance: none;
letter-spacing: 2px; /* biar kode OTP lebih mudah dibaca */
}
.form-control::placeholder { color: #aab7aa; }
.form-control::placeholder {
color: #aab7aa;
letter-spacing: normal;
}
.form-control:focus {
border-color: rgba(255,255,255,0.6);
@ -242,7 +248,7 @@
.btn-login {
display: block;
width: 100%;
padding: 12px;
padding: 13px;
border-radius: 10px;
border: none;
background: #ffffff;
@ -255,6 +261,7 @@
transition: transform 0.15s, box-shadow 0.2s, background 0.2s;
box-shadow: 0 4px 18px rgba(0,0,0,0.15);
margin-top: 4px;
-webkit-tap-highlight-color: transparent;
}
.btn-login:hover {
@ -263,7 +270,10 @@
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
.btn-login:active { transform: translateY(0); }
.btn-login:active {
transform: translateY(0);
background: #e4f5ec;
}
/* ─── LINKS ─── */
.links-area {
@ -280,16 +290,144 @@
.links-area a:hover { color: #fff; }
/* ─── RESPONSIVE ─── */
@media (max-width: 768px) {
.auth-left { display: none; }
.auth-right { width: 100%; padding: 40px 28px; }
/* ─── RESPONSIVE: Tablet ─── */
@media screen and (min-width: 769px) and (max-width: 1024px) {
.auth-left { width: 40%; }
.auth-right { width: 60%; padding: 40px 28px; }
.auth-left img { width: 80%; }
}
/* ══════════════════════════════════════════
MOBILE 768px LAYOUT: atas-bawah
══════════════════════════════════════════ */
@media screen and (max-width: 768px) {
.auth-wrapper {
flex-direction: column !important;
min-height: 100vh;
}
/* ── Panel Atas: Logo ── */
.auth-left {
width: 100% !important;
height: auto !important;
min-height: unset !important;
padding: 44px 24px 36px !important;
flex-shrink: 0;
background: linear-gradient(160deg, #ffffff 60%, #f0faf5 100%) !important;
order: 0;
}
.auth-left img {
width: 50% !important;
max-width: 185px !important;
animation: none !important;
filter: drop-shadow(0 8px 20px rgba(15,80,40,0.14)) !important;
}
.brand-tagline {
margin-top: 12px !important;
font-size: 10px !important;
letter-spacing: 2.5px !important;
}
.deco-circle.c1,
.deco-circle.c2 { display: none !important; }
.deco-circle.c3 { width: 90px !important; height: 90px !important; top: 12px !important; left: 12px !important; }
/* ── Panel Bawah: Form ── */
.auth-right {
width: 100% !important;
flex: 1 !important;
padding: 36px 24px 52px !important;
align-items: flex-start !important;
justify-content: center !important;
border-radius: 28px 28px 0 0 !important;
margin-top: -24px !important;
order: 1;
}
.auth-card {
max-width: 100% !important;
width: 100% !important;
}
.card-header-area {
margin-bottom: 24px !important;
}
.badge-pill {
font-size: 10px !important;
padding: 4px 12px !important;
}
.card-header-area h4 {
font-size: 18px !important;
}
.card-header-area p {
font-size: 12px !important;
}
.form-group {
margin-bottom: 15px !important;
}
.form-group label {
font-size: 12px !important;
}
.form-control {
padding: 13px 12px 13px 40px !important;
border-radius: 12px !important;
font-size: 16px !important;
}
.btn-login {
padding: 15px !important;
font-size: 15px !important;
border-radius: 12px !important;
margin-top: 8px !important;
}
.links-area {
margin-top: 22px !important;
}
.links-area a {
font-size: 13px !important;
padding: 4px 0 !important;
display: inline-block !important;
}
}
/* ─── Small Mobile ≤ 390px ─── */
@media screen and (max-width: 390px) {
.auth-left { padding: 36px 16px 28px !important; }
.auth-left img { width: 46% !important; max-width: 160px !important; }
.auth-right { padding: 28px 20px 44px !important; }
}
/* ─── Landscape Mobile ─── */
@media screen and (max-width: 768px) and (orientation: landscape) {
.auth-left {
padding: 18px 24px 16px !important;
}
.auth-left img { width: 26% !important; max-width: 100px !important; }
.brand-tagline { margin-top: 6px !important; font-size: 9px !important; }
.auth-right {
padding: 22px 24px 32px !important;
border-radius: 20px 20px 0 0 !important;
margin-top: -10px !important;
}
.card-header-area { margin-bottom: 16px !important; }
.form-group { margin-bottom: 10px !important; }
}
</style>
<div class="auth-wrapper">
{{-- LEFT: Logo Panel --}}
{{-- TOP / LEFT: Logo Panel --}}
<div class="auth-left">
<div class="deco-circle c1"></div>
<div class="deco-circle c2"></div>
@ -298,7 +436,7 @@
<span class="brand-tagline">Real Estate &bull; Bondowoso</span>
</div>
{{-- RIGHT: Form Panel --}}
{{-- BOTTOM / RIGHT: Form Panel --}}
<div class="auth-right">
<div class="blob-top"></div>
@ -333,6 +471,8 @@ class="form-control"
required
maxlength="6"
autocomplete="one-time-code"
inputmode="numeric"
pattern="[0-9]*"
>
</div>
</div>

View File

@ -4,20 +4,23 @@
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
html, body {
font-family: 'Plus Jakarta Sans', sans-serif;
height: 100vh;
overflow: hidden;
min-height: 100%;
background: #0a3d1e;
overflow-x: hidden;
}
/* ─── WRAPPER ─── */
.auth-wrapper {
display: flex;
height: 100vh;
flex-direction: row;
min-height: 100vh;
}
/* ─── LEFT PANEL (Logo) ─── */
@ -201,10 +204,12 @@
border: 1.5px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.94);
color: #1a2e1a;
font-size: 14px;
font-size: 16px; /* 16px cegah auto-zoom iOS */
font-family: inherit;
outline: none;
transition: border 0.2s, box-shadow 0.2s;
-webkit-appearance: none;
appearance: none;
}
.form-control::placeholder { color: #aab7aa; }
@ -227,12 +232,17 @@
border: none;
padding: 0;
line-height: 1;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
}
/* ─── BUTTON ─── */
.btn-register {
width: 100%;
padding: 12px;
padding: 13px;
border-radius: 10px;
border: none;
background: #ffffff;
@ -245,6 +255,7 @@
transition: transform 0.15s, box-shadow 0.2s, background 0.2s;
box-shadow: 0 4px 18px rgba(0,0,0,0.15);
margin-top: 6px;
-webkit-tap-highlight-color: transparent;
}
.btn-register:hover {
@ -253,7 +264,10 @@
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
.btn-register:active { transform: translateY(0); }
.btn-register:active {
transform: translateY(0);
background: #e4f5ec;
}
/* ─── LINKS ─── */
.links-area {
@ -270,16 +284,140 @@
.links-area a:hover { color: #fff; }
/* ─── RESPONSIVE ─── */
@media (max-width: 768px) {
.auth-left { display: none; }
.auth-right { width: 100%; }
/* ─── RESPONSIVE: Tablet ─── */
@media screen and (min-width: 769px) and (max-width: 1024px) {
.auth-left { width: 40%; }
.auth-right { width: 60%; padding: 40px 28px; }
.auth-left img { width: 80%; }
}
/* ══════════════════════════════════════════
MOBILE 768px LAYOUT: atas-bawah
══════════════════════════════════════════ */
@media screen and (max-width: 768px) {
.auth-wrapper {
flex-direction: column !important;
min-height: 100vh;
}
/* ── Panel Atas: Logo ── */
.auth-left {
width: 100% !important;
height: auto !important;
min-height: unset !important;
padding: 40px 24px 32px !important;
flex-shrink: 0;
background: linear-gradient(160deg, #ffffff 60%, #f0faf5 100%) !important;
order: 0;
}
.auth-left img {
width: 50% !important;
max-width: 185px !important;
animation: none !important;
filter: drop-shadow(0 8px 20px rgba(15,80,40,0.14)) !important;
}
.auth-left .brand-tagline {
margin-top: 12px !important;
font-size: 10px !important;
letter-spacing: 2.5px !important;
}
.deco-circle.c1,
.deco-circle.c2 { display: none !important; }
.deco-circle.c3 { width: 90px !important; height: 90px !important; top: 12px !important; left: 12px !important; }
/* ── Panel Bawah: Form ── */
.auth-right {
width: 100% !important;
flex: 1 !important;
padding: 32px 24px 48px !important;
align-items: flex-start !important;
justify-content: center !important;
border-radius: 28px 28px 0 0 !important;
margin-top: -24px !important;
order: 1;
}
.auth-card {
max-width: 100% !important;
width: 100% !important;
}
.card-header-area {
margin-bottom: 20px !important;
}
.card-header-area .badge-pill {
font-size: 10px !important;
padding: 4px 12px !important;
}
.card-header-area h4 {
font-size: 16px !important;
}
.card-header-area p {
font-size: 12px !important;
}
.form-group {
margin-bottom: 12px !important;
}
.form-control {
padding: 12px 12px 12px 40px !important;
border-radius: 12px !important;
font-size: 16px !important;
}
.btn-register {
padding: 14px !important;
font-size: 15px !important;
border-radius: 12px !important;
margin-top: 8px !important;
}
.links-area {
margin-top: 18px !important;
}
.links-area a {
font-size: 13px !important;
padding: 4px 0 !important;
display: inline-block !important;
}
}
/* ─── Small Mobile ≤ 390px ─── */
@media screen and (max-width: 390px) {
.auth-left { padding: 32px 16px 24px !important; }
.auth-left img { width: 46% !important; max-width: 160px !important; }
.auth-right { padding: 26px 20px 40px !important; }
}
/* ─── Landscape Mobile ─── */
@media screen and (max-width: 768px) and (orientation: landscape) {
.auth-left {
padding: 18px 24px 16px !important;
}
.auth-left img { width: 26% !important; max-width: 100px !important; }
.auth-left .brand-tagline { margin-top: 6px !important; font-size: 9px !important; }
.auth-right {
padding: 22px 24px 30px !important;
border-radius: 20px 20px 0 0 !important;
margin-top: -10px !important;
}
.card-header-area { margin-bottom: 12px !important; }
.form-group { margin-bottom: 9px !important; }
}
</style>
<div class="auth-wrapper">
{{-- LEFT: Logo Panel --}}
{{-- TOP / LEFT: Logo Panel --}}
<div class="auth-left">
<div class="deco-circle c1"></div>
<div class="deco-circle c2"></div>
@ -288,7 +426,7 @@
<span class="brand-tagline">Real Estate &bull; Bondowoso</span>
</div>
{{-- RIGHT: Form Panel --}}
{{-- BOTTOM / RIGHT: Form Panel --}}
<div class="auth-right">
<div class="blob-top"></div>
@ -343,8 +481,8 @@
<div class="form-group">
<div class="input-wrap">
<span class="icon">🔒</span>
<input type="password" name="password" id="password" class="form-control" placeholder="Password" required>
<button type="button" class="toggle-eye" onclick="togglePassword()">👁</button>
<input type="password" name="password" id="password" class="form-control" placeholder="Password" required autocomplete="new-password">
<button type="button" class="toggle-eye" onclick="togglePassword()" aria-label="Tampilkan/sembunyikan password">👁</button>
</div>
</div>

View File

@ -4,19 +4,23 @@
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
html, body {
font-family: 'Plus Jakarta Sans', sans-serif;
height: 100vh;
overflow: hidden;
min-height: 100%;
background: #0a3d1e;
overflow-x: hidden;
}
/* ─── WRAPPER ─── */
.auth-wrapper {
display: flex;
height: 100vh;
flex-direction: row;
min-height: 100vh;
}
/* ─── LEFT PANEL (Logo) ─── */
@ -205,15 +209,17 @@
.form-control {
width: 100%;
padding: 11px 12px 11px 38px;
padding: 11px 42px 11px 38px;
border-radius: 10px;
border: 1.5px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.94);
color: #1a2e1a;
font-size: 14px;
font-size: 16px; /* cegah auto-zoom iOS */
font-family: inherit;
outline: none;
transition: border 0.2s, box-shadow 0.2s;
-webkit-appearance: none;
appearance: none;
}
.form-control::placeholder { color: #aab7aa; }
@ -236,12 +242,18 @@
border: none;
padding: 0;
line-height: 1;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
-webkit-tap-highlight-color: transparent;
}
/* ─── SUBMIT BUTTON ─── */
.btn-login {
width: 100%;
padding: 12px;
padding: 13px;
border-radius: 10px;
border: none;
background: #ffffff;
@ -254,6 +266,7 @@
transition: transform 0.15s, box-shadow 0.2s, background 0.2s;
box-shadow: 0 4px 18px rgba(0,0,0,0.15);
margin-top: 4px;
-webkit-tap-highlight-color: transparent;
}
.btn-login:hover {
@ -262,7 +275,10 @@
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
.btn-login:active { transform: translateY(0); }
.btn-login:active {
transform: translateY(0);
background: #e4f5ec;
}
/* ─── BACK LINK ─── */
.links-area {
@ -279,16 +295,144 @@
.links-area a:hover { color: #fff; }
/* ─── RESPONSIVE ─── */
@media (max-width: 768px) {
.auth-left { display: none; }
.auth-right { width: 100%; }
/* ─── RESPONSIVE: Tablet ─── */
@media screen and (min-width: 769px) and (max-width: 1024px) {
.auth-left { width: 40%; }
.auth-right { width: 60%; padding: 40px 28px; }
.auth-left img { width: 80%; }
}
/* ══════════════════════════════════════════
MOBILE 768px LAYOUT: atas-bawah
══════════════════════════════════════════ */
@media screen and (max-width: 768px) {
.auth-wrapper {
flex-direction: column !important;
min-height: 100vh;
}
/* ── Panel Atas: Logo ── */
.auth-left {
width: 100% !important;
height: auto !important;
min-height: unset !important;
padding: 44px 24px 36px !important;
flex-shrink: 0;
background: linear-gradient(160deg, #ffffff 60%, #f0faf5 100%) !important;
order: 0;
}
.auth-left img {
width: 50% !important;
max-width: 185px !important;
animation: none !important;
filter: drop-shadow(0 8px 20px rgba(15,80,40,0.14)) !important;
}
.auth-left .brand-tagline {
margin-top: 12px !important;
font-size: 10px !important;
letter-spacing: 2.5px !important;
}
.deco-circle.c1,
.deco-circle.c2 { display: none !important; }
.deco-circle.c3 { width: 90px !important; height: 90px !important; top: 12px !important; left: 12px !important; }
/* ── Panel Bawah: Form ── */
.auth-right {
width: 100% !important;
flex: 1 !important;
padding: 36px 24px 52px !important;
align-items: flex-start !important;
justify-content: center !important;
border-radius: 28px 28px 0 0 !important;
margin-top: -24px !important;
order: 1;
}
.auth-card {
max-width: 100% !important;
width: 100% !important;
}
.card-header-area {
margin-bottom: 24px !important;
}
.card-header-area .badge-pill {
font-size: 10px !important;
padding: 4px 12px !important;
}
.card-header-area h4 {
font-size: 16px !important;
}
.card-header-area p {
font-size: 12px !important;
}
.form-group {
margin-bottom: 15px !important;
}
.form-group label {
font-size: 12px !important;
}
.form-control {
padding: 13px 42px 13px 40px !important;
border-radius: 12px !important;
font-size: 16px !important;
}
.btn-login {
padding: 15px !important;
font-size: 15px !important;
border-radius: 12px !important;
margin-top: 8px !important;
}
.links-area {
margin-top: 22px !important;
}
.links-area a {
font-size: 13px !important;
padding: 4px 0 !important;
display: inline-block !important;
}
}
/* ─── Small Mobile ≤ 390px ─── */
@media screen and (max-width: 390px) {
.auth-left { padding: 36px 16px 28px !important; }
.auth-left img { width: 46% !important; max-width: 160px !important; }
.auth-right { padding: 28px 20px 44px !important; }
}
/* ─── Landscape Mobile ─── */
@media screen and (max-width: 768px) and (orientation: landscape) {
.auth-left {
padding: 18px 24px 16px !important;
}
.auth-left img { width: 26% !important; max-width: 100px !important; }
.auth-left .brand-tagline { margin-top: 6px !important; font-size: 9px !important; }
.auth-right {
padding: 22px 24px 32px !important;
border-radius: 20px 20px 0 0 !important;
margin-top: -10px !important;
}
.card-header-area { margin-bottom: 16px !important; }
.form-group { margin-bottom: 10px !important; }
}
</style>
<div class="auth-wrapper">
{{-- LEFT: Logo Panel --}}
{{-- TOP / LEFT: Logo Panel --}}
<div class="auth-left">
<div class="deco-circle c1"></div>
<div class="deco-circle c2"></div>
@ -297,7 +441,7 @@
<span class="brand-tagline">Real Estate &bull; Bondowoso</span>
</div>
{{-- RIGHT: Form Panel --}}
{{-- BOTTOM / RIGHT: Form Panel --}}
<div class="auth-right">
<div class="blob-top"></div>
@ -331,8 +475,8 @@
<div class="input-wrap">
<span class="icon">🔒</span>
<input type="password" name="password" id="password" class="form-control"
placeholder="Masukkan password baru" required>
<button type="button" class="toggle-eye" onclick="togglePassword('password', this)">👁</button>
placeholder="Masukkan password baru" required autocomplete="new-password">
<button type="button" class="toggle-eye" onclick="togglePassword('password', this)" aria-label="Tampilkan/sembunyikan password">👁</button>
</div>
</div>
@ -341,8 +485,8 @@
<div class="input-wrap">
<span class="icon">🔒</span>
<input type="password" name="password_confirmation" id="password_confirmation"
class="form-control" placeholder="Ulangi password baru" required>
<button type="button" class="toggle-eye" onclick="togglePassword('password_confirmation', this)">👁</button>
class="form-control" placeholder="Ulangi password baru" required autocomplete="new-password">
<button type="button" class="toggle-eye" onclick="togglePassword('password_confirmation', this)" aria-label="Tampilkan/sembunyikan password">👁</button>
</div>
</div>
@ -350,6 +494,11 @@ class="form-control" placeholder="Ulangi password baru" required>
Reset Password
</button>
</form>
<div class="links-area">
<a href="{{ route('login') }}"> Kembali ke Login</a>
</div>
</div>
</div>

View File

@ -377,13 +377,6 @@ class="mobile-item {{ request()->routeIs('user.iuran.*') ? 'active' : '' }}">
@yield('scripts')
<div class="mobile-nav d-lg-none">
<a href="{{ route('user.home') }}"><i class="fas fa-home"></i></a>
<a href="{{ route('user.iuran.index') }}"><i class="fas fa-wallet"></i></a>
<a href="{{ route('user.layanan.create') }}"><i class="fas fa-plus"></i></a>
<a href="{{ route('user.layanan.status') }}"><i class="fas fa-list"></i></a>
</div>
</body>
</html>
@ -530,7 +523,6 @@ class="mobile-item {{ request()->routeIs('user.iuran.*') ? 'active' : '' }}">
position: relative;
}
/* Jembatan invisible menutup celah antara link dan dropdown */
.has-dropdown::after {
content: '';
position: absolute;
@ -795,7 +787,6 @@ class="mobile-item {{ request()->routeIs('user.iuran.*') ? 'active' : '' }}">
setTimeout(() => {
$('.alert').fadeOut('slow');
}, 3000);
</script>
<script>