Kode Isi File register.html
Kode Isi File register.html
Bantu buatkan kode isi file register.html.
FarmerSmartAI - Halaman Registrasi
Berikut kode lengkap untuk file register.html (halaman pendaftaran) FarmerSmartAI:
```html
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Daftar - FarmerSmartAI</title>
<style>
:root {
--primary: #2e7d32;
--primary-dark: #1b5e20;
--primary-light: #4caf50;
--secondary: #ff9800;
--accent: #8bc34a;
--light: #f5f5f5;
--dark: #333;
--gray: #757575;
--white: #ffffff;
--error: #f44336;
--success: #4caf50;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
body {
background: linear-gradient(135deg, var(--primary-light), var(--primary-dark));
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
color: var(--dark);
padding: 20px;
}
.register-container {
display: flex;
width: 90%;
max-width: 1100px;
background-color: var(--white);
border-radius: 15px;
overflow: hidden;
box-shadow: 0 15px 30px rgba(0, 0, 0, 0.2);
}
.register-left {
flex: 1;
background: linear-gradient(rgba(46, 125, 50, 0.8), rgba(27, 94, 32, 0.9)), url('https://images.unsplash.com/photo-1586771107445-d3ca888129ff?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80');
background-size: cover;
background-position: center;
color: var(--white);
padding: 50px;
display: flex;
flex-direction: column;
justify-content: center;
}
.register-right {
flex: 1.2;
padding: 50px;
display: flex;
flex-direction: column;
justify-content: center;
overflow-y: auto;
max-height: 90vh;
}
.logo {
display: flex;
align-items: center;
margin-bottom: 30px;
}
.logo-icon {
font-size: 2.5rem;
color: var(--primary);
margin-right: 15px;
}
.logo h1 {
color: var(--primary);
font-size: 1.8rem;
}
.welcome-text h2 {
font-size: 2rem;
margin-bottom: 10px;
color: var(--dark);
}
.welcome-text p {
color: var(--gray);
margin-bottom: 30px;
}
.register-form {
width: 100%;
}
.form-row {
display: flex;
gap: 20px;
margin-bottom: 20px;
}
.form-group {
flex: 1;
margin-bottom: 20px;
position: relative;
}
.form-group label {
display: block;
margin-bottom: 8px;
font-weight: 500;
color: var(--dark);
}
.input-with-icon {
position: relative;
}
.input-with-icon i {
position: absolute;
left: 15px;
top: 50%;
transform: translateY(-50%);
color: var(--gray);
}
.form-control {
width: 100%;
padding: 15px 15px 15px 45px;
border: 1px solid #ddd;
border-radius: 5px;
font-size: 1rem;
transition: border 0.3s, box-shadow 0.3s;
}
.form-control:focus {
border-color: var(--primary);
box-shadow: 0 0 0 2px rgba(46, 125, 50, 0.2);
outline: none;
}
.password-toggle {
position: absolute;
right: 15px;
top: 50%;
transform: translateY(-50%);
background: none;
border: none;
color: var(--gray);
cursor: pointer;
}
.form-options {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 25px;
}
.terms-agreement {
display: flex;
align-items: flex-start;
}
.terms-agreement input {
margin-right: 8px;
margin-top: 3px;
}
.terms-agreement label {
font-size: 0.9rem;
color: var(--gray);
}
.terms-agreement a {
color: var(--primary);
text-decoration: none;
}
.terms-agreement a:hover {
text-decoration: underline;
}
.btn-register {
width: 100%;
padding: 15px;
background-color: var(--primary);
color: white;
border: none;
border-radius: 5px;
font-size: 1rem;
font-weight: 600;
cursor: pointer;
transition: background 0.3s;
margin-bottom: 20px;
}
.btn-register:hover {
background-color: var(--primary-dark);
}
.btn-register:disabled {
background-color: #cccccc;
cursor: not-allowed;
}
.divider {
text-align: center;
margin: 20px 0;
position: relative;
color: var(--gray);
}
.divider::before {
content: '';
position: absolute;
top: 50%;
left: 0;
right: 0;
height: 1px;
background-color: #ddd;
}
.divider span {
background-color: var(--white);
padding: 0 15px;
}
.social-register {
display: flex;
gap: 15px;
margin-bottom: 25px;
}
.btn-social {
flex: 1;
padding: 12px;
border: 1px solid #ddd;
border-radius: 5px;
background-color: white;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: background 0.3s;
}
.btn-social:hover {
background-color: #f9f9f9;
}
.btn-social i {
margin-right: 8px;
font-size: 1.2rem;
}
.btn-google i {
color: #DB4437;
}
.btn-facebook i {
color: #4267B2;
}
.login-link {
text-align: center;
margin-top: 20px;
}
.login-link a {
color: var(--primary);
text-decoration: none;
font-weight: 500;
}
.login-link a:hover {
text-decoration: underline;
}
.back-to-home {
text-align: center;
margin-top: 15px;
}
.back-to-home a {
color: var(--gray);
text-decoration: none;
font-size: 0.9rem;
}
.back-to-home a:hover {
text-decoration: underline;
}
.app-features {
margin-top: 40px;
}
.feature-item {
display: flex;
align-items: center;
margin-bottom: 20px;
}
.feature-icon {
font-size: 1.5rem;
margin-right: 15px;
color: var(--accent);
}
.feature-text h4 {
margin-bottom: 5px;
font-size: 1.1rem;
}
.feature-text p {
font-size: 0.9rem;
color: rgba(255, 255, 255, 0.8);
}
/* Alert Messages */
.alert {
padding: 12px 15px;
border-radius: 5px;
margin-bottom: 20px;
display: none;
}
.alert-error {
background-color: #ffebee;
border: 1px solid var(--error);
color: var(--error);
}
.alert-success {
background-color: #e8f5e9;
border: 1px solid var(--success);
color: var(--success);
}
/* Progress Indicator */
.progress-indicator {
display: flex;
margin-bottom: 30px;
justify-content: space-between;
position: relative;
}
.progress-step {
display: flex;
flex-direction: column;
align-items: center;
z-index: 2;
}
.step-number {
width: 40px;
height: 40px;
border-radius: 50%;
background-color: #e0e0e0;
color: var(--gray);
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
margin-bottom: 8px;
transition: all 0.3s;
}
.step-number.active {
background-color: var(--primary);
color: white;
}
.step-label {
font-size: 0.8rem;
color: var(--gray);
text-align: center;
}
.step-label.active {
color: var(--primary);
font-weight: 500;
}
.progress-bar {
position: absolute;
top: 20px;
left: 0;
height: 2px;
background-color: #e0e0e0;
width: 100%;
z-index: 1;
}
.progress-fill {
height: 100%;
background-color: var(--primary);
width: 0%;
transition: width 0.3s;
}
/* Form Steps */
.form-step {
display: none;
}
.form-step.active {
display: block;
}
.step-buttons {
display: flex;
justify-content: space-between;
margin-top: 30px;
}
.btn-prev, .btn-next {
padding: 12px 25px;
border: 1px solid var(--primary);
border-radius: 5px;
background-color: white;
color: var(--primary);
font-weight: 600;
cursor: pointer;
transition: all 0.3s;
}
.btn-prev:hover {
background-color: #f5f5f5;
}
.btn-next {
background-color: var(--primary);
color: white;
}
.btn-next:hover {
background-color: var(--primary-dark);
}
/* Responsive Design */
@media (max-width: 768px) {
.register-container {
flex-direction: column;
max-width: 550px;
}
.register-left {
padding: 30px;
}
.register-right {
padding: 30px;
}
.form-row {
flex-direction: column;
gap: 0;
}
.social-register {
flex-direction: column;
}
}
@media (max-width: 480px) {
.register-left, .register-right {
padding: 25px;
}
.form-options {
flex-direction: column;
align-items: flex-start;
}
.step-buttons {
flex-direction: column;
gap: 10px;
}
.btn-prev, .btn-next {
width: 100%;
}
}
/* Password Strength Indicator */
.password-strength {
margin-top: 5px;
height: 5px;
border-radius: 5px;
background-color: #e0e0e0;
overflow: hidden;
}
.password-strength-bar {
height: 100%;
width: 0%;
transition: width 0.3s, background-color 0.3s;
}
.strength-weak {
background-color: var(--error);
width: 33%;
}
.strength-medium {
background-color: var(--secondary);
width: 66%;
}
.strength-strong {
background-color: var(--success);
width: 100%;
}
.password-strength-text {
font-size: 0.8rem;
margin-top: 5px;
color: var(--gray);
}
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
</head>
<body>
<div class="register-container">
<!-- Left Side: Branding and Features -->
<div class="register-left">
<div class="logo">
<i class="fas fa-seedling logo-icon"></i>
<h1>FarmerSmartAI</h1>
</div>
<div class="app-features">
<div class="feature-item">
<i class="fas fa-satellite-dish feature-icon"></i>
<div class="feature-text">
<h4>Monitoring Real-time</h4>
<p>Pantau kondisi lahan Anda secara real-time dengan sensor IoT</p>
</div>
</div>
<div class="feature-item">
<i class="fas fa-robot feature-icon"></i>
<div class="feature-text">
<h4>Analisis Berbasis AI</h4>
<p>Dapatkan rekomendasi cerdas untuk meningkatkan produktivitas</p>
</div>
</div>
<div class="feature-item">
<i class="fas fa-chart-line feature-icon"></i>
<div class="feature-text">
<h4>Prediksi Panen Akurat</h4>
<p>Perkirakan hasil panen dengan algoritma prediktif canggih</p>
</div>
</div>
</div>
</div>
<!-- Right Side: Registration Form -->
<div class="register-right">
<div class="welcome-text">
<h2>Daftar Akun Baru</h2>
<p>Bergabunglah dengan FarmerSmartAI untuk mengoptimalkan pertanian Anda</p>
</div>
<!-- Progress Indicator -->
<div class="progress-indicator">
<div class="progress-bar">
<div class="progress-fill" id="progressFill"></div>
</div>
<div class="progress-step">
<div class="step-number active" id="step1Number">1</div>
<div class="step-label active" id="step1Label">Data Diri</div>
</div>
<div class="progress-step">
<div class="step-number" id="step2Number">2</div>
<div class="step-label" id="step2Label">Data Pertanian</div>
</div>
<div class="progress-step">
<div class="step-number" id="step3Number">3</div>
<div class="step-label" id="step3Label">Konfirmasi</div>
</div>
</div>
<!-- Alert Messages -->
<div class="alert alert-error" id="errorAlert">
<i class="fas fa-exclamation-circle"></i> <span id="errorMessage">Terjadi kesalahan. Harap periksa data Anda.</span>
</div>
<div class="alert alert-success" id="successAlert">
<i class="fas fa-check-circle"></i> <span id="successMessage">Pendaftaran berhasil! Mengarahkan ke dashboard...</span>
</div>
<form class="register-form" id="registerForm">
<!-- Step 1: Personal Information -->
<div class="form-step active" id="step1">
<div class="form-row">
<div class="form-group">
<label for="firstName">Nama Depan</label>
<div class="input-with-icon">
<i class="fas fa-user"></i>
<input type="text" id="firstName" class="form-control" placeholder="Masukkan nama depan" required>
</div>
</div>
<div class="form-group">
<label for="lastName">Nama Belakang</label>
<div class="input-with-icon">
<i class="fas fa-user"></i>
<input type="text" id="lastName" class="form-control" placeholder="Masukkan nama belakang" required>
</div>
</div>
</div>
<div class="form-group">
<label for="email">Email</label>
<div class="input-with-icon">
<i class="fas fa-envelope"></i>
<input type="email" id="email" class="form-control" placeholder="Masukkan email Anda" required>
</div>
</div>
<div class="form-group">
<label for="phone">Nomor Telepon</label>
<div class="input-with-icon">
<i class="fas fa-phone"></i>
<input type="tel" id="phone" class="form-control" placeholder="Masukkan nomor telepon" required>
</div>
</div>
<div class="step-buttons">
<div></div> <!-- Empty div for spacing -->
<button type="button" class="btn-next" id="nextStep1">Lanjut</button>
</div>
</div>
<!-- Step 2: Farming Information -->
<div class="form-step" id="step2">
<div class="form-group">
<label for="farmName">Nama Lahan/Peternakan</label>
<div class="input-with-icon">
<i class="fas fa-tractor"></i>
<input type="text" id="farmName" class="form-control" placeholder="Masukkan nama lahan Anda" required>
</div>
</div>
<div class="form-group">
<label for="farmSize">Luas Lahan (hektar)</label>
<div class="input-with-icon">
<i class="fas fa-ruler-combined"></i>
<input type="number" id="farmSize" class="form-control" placeholder="Masukkan luas lahan" min="0.1" step="0.1" required>
</div>
</div>
<div class="form-group">
<label for="farmLocation">Lokasi Lahan</label>
<div class="input-with-icon">
<i class="fas fa-map-marker-alt"></i>
<input type="text" id="farmLocation" class="form-control" placeholder="Masukkan lokasi lahan" required>
</div>
</div>
<div class="form-group">
<label for="cropType">Jenis Tanaman/Ternak</label>
<div class="input-with-icon">
<i class="fas fa-leaf"></i>
<select id="cropType" class="form-control" required>
<option value="">Pilih jenis tanaman/ternak</option>
<option value="padi">Padi</option>
<option value="jagung">Jagung</option>
<option value="kedelai">Kedelai</option>
<option value="sayuran">Sayuran</option>
<option value="buah">Buah-buahan</option>
<option value="ternak">Ternak</option>
<option value="lainnya">Lainnya</option>
</select>
</div>
</div>
<div class="step-buttons">
<button type="button" class="btn-prev" id="prevStep2">Kembali</button>
<button type="button" class="btn-next" id="nextStep2">Lanjut</button>
</div>
</div>
<!-- Step 3: Account Setup -->
<div class="form-step" id="step3">
<div class="form-group">
<label for="password">Kata Sandi</label>
<div class="input-with-icon">
<i class="fas fa-lock"></i>
<input type="password" id="password" class="form-control" placeholder="Buat kata sandi" required>
<button type="button" class="password-toggle" id="togglePassword">
<i class="fas fa-eye"></i>
</button>
</div>
<div class="password-strength">
<div class="password-strength-bar" id="passwordStrengthBar"></div>
</div>
<div class="password-strength-text" id="passwordStrengthText">Kekuatan kata sandi</div>
</div>
<div class="form-group">
<label for="confirmPassword">Konfirmasi Kata Sandi</label>
<div class="input-with-icon">
<i class="fas fa-lock"></i>
<input type="password" id="confirmPassword" class="form-control" placeholder="Konfirmasi kata sandi" required>
<button type="button" class="password-toggle" id="toggleConfirmPassword">
<i class="fas fa-eye"></i>
</button>
</div>
<div id="passwordMatchMessage" class="password-strength-text"></div>
</div>
<div class="form-options">
<div class="terms-agreement">
<input type="checkbox" id="terms" required>
<label for="terms">Saya setuju dengan <a href="#">Syarat & Ketentuan</a> dan <a href="#">Kebijakan Privasi</a> FarmerSmartAI</label>
</div>
</div>
<div class="step-buttons">
<button type="button" class="btn-prev" id="prevStep3">Kembali</button>
<button type="submit" class="btn-register" id="submitRegister">Daftar</button>
</div>
</div>
</form>
<div class="login-link">
Sudah punya akun? <a href="login.html">Masuk di sini</a>
</div>
<div class="back-to-home">
<a href="index.html"><i class="fas fa-arrow-left"></i> Kembali ke halaman utama</a>
</div>
</div>
</div>
<script>
// Form steps management
let currentStep = 1;
const totalSteps = 3;
// Initialize progress bar
updateProgressBar();
// Step navigation
document.getElementById('nextStep1').addEventListener('click', function() {
if (validateStep1()) {
goToStep(2);
}
});
document.getElementById('prevStep2').addEventListener('click', function() {
goToStep(1);
});
document.getElementById('nextStep2').addEventListener('click', function() {
if (validateStep2()) {
goToStep(3);
}
});
document.getElementById('prevStep3').addEventListener('click', function() {
goToStep(2);
});
function goToStep(step) {
// Hide current step
document.getElementById(`step${currentStep}`).classList.remove('active');
document.getElementById(`step${currentStep}Number`).classList.remove('active');
document.getElementById(`step${currentStep}Label`).classList.remove('active');
// Show new step
document.getElementById(`step${step}`).classList.add('active');
document.getElementById(`step${step}Number`).classList.add('active');
document.getElementById(`step${step}Label`).classList.add('active');
currentStep = step;
updateProgressBar();
}
function updateProgressBar() {
const progress = ((currentStep - 1) / (totalSteps - 1)) * 100;
document.getElementById('progressFill').style.width = `${progress}%`;
}
// Form validation functions
function validateStep1() {
const firstName = document.getElementById('firstName').value;
const lastName = document.getElementById('lastName').value;
const email = document.getElementById('email').value;
const phone = document.getElementById('phone').value;
if (!firstName || !lastName || !email || !phone) {
showError('Harap isi semua field pada langkah ini');
return false;
}
// Simple email validation
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(email)) {
showError('Format email tidak valid');
return false;
}
// Simple phone validation
const phoneRegex = /^[0-9+\-\s()]{10,}$/;
if (!phoneRegex.test(phone)) {
showError('Format nomor telepon tidak valid');
return false;
}
return true;
}
function validateStep2() {
const farmName = document.getElementById('farmName').value;
const farmSize = document.getElementById('farmSize').value;
const farmLocation = document.getElementById('farmLocation').value;
const cropType = document.getElementById('cropType').value;
if (!farmName || !farmSize || !farmLocation || !cropType) {
showError('Harap isi semua field pada langkah ini');
return false;
}
if (parseFloat(farmSize) <= 0) {
showError('Luas lahan harus lebih dari 0');
return false;
}
return true;
}
// Password strength indicator
document.getElementById('password').addEventListener('input', function() {
checkPasswordStrength(this.value);
});
function checkPasswordStrength(password) {
const strengthBar = document.getElementById('passwordStrengthBar');
const strengthText = document.getElementById('passwordStrengthText');
// Reset
strengthBar.className = 'password-strength-bar';
strengthBar.style.width = '0%';
if (password.length === 0) {
strengthText.textContent = 'Kekuatan kata sandi';
return;
}
// Calculate strength
let strength = 0;
// Length check
if (password.length >= 8) strength += 1;
// Contains lowercase
if (/[a-z]/.test(password)) strength += 1;
// Contains uppercase
if (/[A-Z]/.test(password)) strength += 1;
// Contains numbers
if (/[0-9]/.test(password)) strength += 1;
// Contains special characters
if (/[^A-Za-z0-9]/.test(password)) strength += 1;
// Update UI based on strength
if (strength <= 2) {
strengthBar.classList.add('strength-weak');
strengthText.textContent = 'Kata sandi lemah';
strengthText.style.color = 'var(--error)';
} else if (strength <= 4) {
strengthBar.classList.add('strength-medium');
strengthText.textContent = 'Kata sandi cukup kuat';
strengthText.style.color = 'var(--secondary)';
} else {
strengthBar.classList.add('strength-strong');
strengthText.textContent = 'Kata sandi kuat';
strengthText.style.color = 'var(--success)';
}
}
// Password confirmation check
document.getElementById('confirmPassword').addEventListener('input', function() {
checkPasswordMatch();
});
function checkPasswordMatch() {
const password = document.getElementById('password').value;
const confirmPassword = document.getElementById('confirmPassword').value;
const messageElement = document.getElementById('passwordMatchMessage');
if (confirmPassword.length === 0) {
messageElement.textContent = '';
return;
}
if (password === confirmPassword) {
messageElement.textContent = 'Kata sandi cocok';
messageElement.style.color = 'var(--success)';
} else {
messageElement.textContent = 'Kata sandi tidak cocok';
messageElement.style.color = 'var(--error)';
}
}
// Toggle password visibility
document.getElementById('togglePassword').addEventListener('click', function() {
togglePasswordVisibility('password', this);
});
document.getElementById('toggleConfirmPassword').addEventListener('click', function() {
togglePasswordVisibility('confirmPassword', this);
});
function togglePasswordVisibility(fieldId, button) {
const passwordInput = document.getElementById(fieldId);
const icon = button.querySelector('i');
if (passwordInput.type === 'password') {
passwordInput.type = 'text';
icon.classList.remove('fa-eye');
icon.classList.add('fa-eye-slash');
} else {
passwordInput.type = 'password';
icon.classList.remove('fa-eye-slash');
icon.classList.add('fa-eye');
}
}
// Form submission handling
document.getElementById('registerForm').addEventListener('submit', function(e) {
e.preventDefault();
const password = document.getElementById('password').value;
const confirmPassword = document.getElementById('confirmPassword').value;
const terms = document.getElementById('terms').checked;
// Validate step 3
if (!password || !confirmPassword) {
showError('Harap isi semua field kata sandi');
return;
}
if (password !== confirmPassword) {
showError('Kata sandi tidak cocok');
return;
}
if (password.length < 8) {
showError('Kata sandi harus minimal 8 karakter');
return;
}
if (!terms) {
showError('Anda harus menyetujui Syarat & Ketentuan');
return;
}
// If all validations pass, submit the form
submitRegistration();
});
function submitRegistration() {
const errorAlert = document.getElementById('errorAlert');
const successAlert = document.getElementById('successAlert');
// Hide previous alerts
errorAlert.style.display = 'none';
successAlert.style.display = 'none';
// Show success message
successAlert.style.display = 'block';
// In a real application, this would be an API call to register the user
// For demo purposes, we'll simulate a successful registration
// Simulate API call delay
setTimeout(function() {
// Redirect to dashboard (in a real app, this would happen after successful registration)
window.location.href = 'farmer_smart_ai_dashboard.html';
}, 2000);
}
function showError(message) {
const errorAlert = document.getElementById('errorAlert');
const errorMessage = document.getElementById('errorMessage');
errorMessage.textContent = message;
errorAlert.style.display = 'block';
// Scroll to error message
errorAlert.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
</script>
</body>
</html>
```
Fitur Halaman Register.html:
1. Proses Pendaftaran Bertahap - 3 langkah pendaftaran yang terorganisir:
· Langkah 1: Data Diri (nama, email, telepon)
· Langkah 2: Data Pertanian (nama lahan, luas, lokasi, jenis tanaman)
· Langkah 3: Setup Akun (password, konfirmasi, persetujuan)
2. Indikator Progress - Visualisasi progress pendaftaran
3. Validasi Form Lengkap:
· Validasi email dan nomor telepon
· Indikator kekuatan password
· Pengecekan kecocokan password
· Validasi semua field wajib
4. Fitur Toggle Password - Tombol untuk menampilkan/menyembunyikan password
5. Persetujuan Syarat & Ketentuan - Checkbox wajib sebelum mendaftar
6. Desain Responsif - Tampilan optimal di semua perangkat
7. Pesan Error/Success - Notifikasi untuk feedback pengguna
8. Link ke Halaman Login - Tautan untuk pengguna yang sudah memiliki akun
9. Branding dan Fitur Aplikasi - Panel kiri yang menampilkan fitur unggulan FarmerSmartAI
File ini dapat disimpan sebagai register.html dan akan menjadi halaman pendaftaran yang user-friendly dan fungsional bagi calon pengguna FarmerSmartAI.
Bersambung ke: Kode Isi File field_monitoring.html
Comments
Post a Comment