| | <!DOCTYPE html> |
| | <html lang="en"> |
| | <head> |
| | <meta charset="UTF-8" /> |
| | <title>Login – TrueWrite Scan</title> |
| | <script src="https://cdn.tailwindcss.com"></script> |
| | </head> |
| | <body class="bg-slate-950 text-white min-h-screen flex items-center justify-center"> |
| | <div class="max-w-md w-full mx-4 bg-slate-900/70 border border-slate-800 rounded-2xl p-6 shadow-xl"> |
| | <h1 class="text-2xl font-bold mb-1">Welcome back</h1> |
| | <p class="text-xs text-slate-400 mb-4">Login to continue using TrueWrite Scan.</p> |
| |
|
| | <form id="loginForm" class="space-y-4"> |
| | <div> |
| | <label class="block text-xs mb-1">Email</label> |
| | <input id="email" type="email" required |
| | class="w-full px-3 py-2 rounded-lg bg-slate-950 border border-slate-700 text-sm focus:outline-none focus:ring-2 focus:ring-indigo-500" /> |
| | </div> |
| | <div> |
| | <label class="block text-xs mb-1">Password</label> |
| | <input id="password" type="password" required |
| | class="w-full px-3 py-2 rounded-lg bg-slate-950 border border-slate-700 text-sm focus:outline-none focus:ring-2 focus:ring-indigo-500" /> |
| | </div> |
| | <p id="loginError" class="text-xs text-red-400 h-4"></p> |
| | <button type="submit" |
| | class="w-full py-2 rounded-lg bg-indigo-500 hover:bg-indigo-600 text-sm font-semibold"> |
| | Login |
| | </button> |
| | </form> |
| |
|
| | <p class="mt-4 text-xs text-slate-400 text-center"> |
| | New to TrueWrite Scan? |
| | <a href="signup.html" class="text-indigo-300 underline underline-offset-2">Create account</a> |
| | </p> |
| | </div> |
| |
|
| | <script> |
| | const BACKEND_URL = "https://gopalkrushnamahapatra-truewrite-scan-backend.hf.space"; |
| | |
| | const form = document.getElementById("loginForm"); |
| | const err = document.getElementById("loginError"); |
| | |
| | form.addEventListener("submit", async (e) => { |
| | e.preventDefault(); |
| | err.textContent = ""; |
| | |
| | const email = document.getElementById("email").value.trim(); |
| | const password = document.getElementById("password").value; |
| | |
| | try { |
| | const res = await fetch(`${BACKEND_URL}/api/login`, { |
| | method: "POST", |
| | headers: { "Content-Type": "application/json" }, |
| | body: JSON.stringify({ email, password }) |
| | }); |
| | |
| | const data = await res.json(); |
| | if (!res.ok) { |
| | err.textContent = data.detail || "Login failed"; |
| | return; |
| | } |
| | |
| | localStorage.setItem("truewriteToken", data.token); |
| | localStorage.setItem("truewriteUser", JSON.stringify({ |
| | name: data.name, |
| | email: data.email |
| | })); |
| | |
| | window.location.href = "dashboard.html"; |
| | } catch (e2) { |
| | err.textContent = "Server error. Is backend running?"; |
| | } |
| | }); |
| | </script> |
| | </body> |
| | </html> |
| |
|