/* Login screen — clean, no mock user hints */ const { useState: useStateLogin } = React; function LoginView() { const { login, toast } = useApp(); const [email, setEmail] = useStateLogin(""); const [password, setPassword] = useStateLogin(""); const [show, setShow] = useStateLogin(false); const [loading, setLoading] = useStateLogin(false); const [err, setErr] = useStateLogin(""); function submit(e) { e && e.preventDefault(); setErr(""); setLoading(true); setTimeout(() => { const found = USERS.find(u => u.email === email && u.password === password); if (found) { login(found); } else { setErr("Email atau password tidak cocok."); setLoading(false); } }, 700); } return (
{/* Left brand panel */}
ヤッパリ
やっぱり!
Yappari!
Client Dashboard

Kelola
mesin Anda.
Tanpa ribet.

Pantau status mesin, lihat tagihan, dan perpanjang kontrak langsung dari satu dashboard. Pembayaran aman lewat Xendit.

© 2026 Yappari! · PT. INDIE KREASI GROUP
{/* Right form */}
やっぱり!
Yappari!
Selamat datang

Masuk ke
akun Anda.

Belum punya akun?{" "} Hubungi tim Yappari untuk onboarding.

setEmail(e.target.value)} className="mt-1.5 w-full px-4 py-3 rounded-xl border border-stone-300 bg-white text-[#1A1A1A] focus:border-[#FF2D55] focus:ring-2 focus:ring-pink-100 outline-none transition" placeholder="you@email.com" required />
setPassword(e.target.value)} className="w-full px-4 py-3 pr-12 rounded-xl border border-stone-300 bg-white text-[#1A1A1A] focus:border-[#FF2D55] focus:ring-2 focus:ring-pink-100 outline-none transition" placeholder="••••••••" required />
{err && (
{err}
)}
); } window.LoginView = LoginView;