1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1" /> 6 <title>Sign up â FastPaste</title> 7 <link rel="preconnect" href="https://fonts.googleapis.com"> 8 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 9 <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"> 10 <link rel="stylesheet" href="/styles.css" /> 11</head> 12<body> 13 <div id="site-header"></div> 14 15 <main class="container-narrow"> 16 <div class="card"> 17 <h1>Create your account</h1> 18 <p>Free forever, 5 pastes per week. Upgrade for unlimited any time.</p> 19 20 <div id="error" class="alert alert-error hidden"></div> 21 <div id="success" class="alert alert-success hidden"></div> 22 23 <form id="signup-form" autocomplete="on"> 24 <label for="email">Email</label> 25 <input type="email" id="email" name="email" autocomplete="email" required /> 26 27 <label for="password">Password</label> 28 <input type="password" id="password" name="new-password" autocomplete="new-password" minlength="8" required /> 29 <p class="muted" style="margin-top:-8px;margin-bottom:14px;">At least 8 characters</p> 30 31 <button type="submit" class="btn btn-primary btn-full" id="submit-btn">Create account</button> 32 </form> 33 34 <p class="muted center mt-16">Already have an account? <a href="/login.html">Log in</a></p> 35 </div> 36 </main> 37 38
38<script src="https://cdn.jsdelivr.net/npm/@supabase/supabase-js@2"></script>
38 39
39<script src="/config.js"></script>
39 40
40<script src="/app.js"></script>
40 41
41<script> 42 const errEl = document.getElementById('error'); 43 const okEl = document.getElementById('success'); 44 const btn = document.getElementById('submit-btn'); 45 46 function showErr(msg) { errEl.textContent = msg; errEl.classList.remove('hidden'); okEl.classList.add('hidden'); } 47 function showOk(msg) { okEl.textContent = msg; okEl.classList.remove('hidden'); errEl.classList.add('hidden'); } 48 49 (async () => { 50 const user = await FP.getUser(); 51 FP.renderHeader(user); 52 // If already logged in, send to dashboard 53 if (user) window.location.href = '/dashboard.html'; 54 })(); 55 56 document.getElementById('signup-form').addEventListener('submit', async (e) => { 57 e.preventDefault(); 58 errEl.classList.add('hidden'); okEl.classList.add('hidden'); 59 btn.disabled = true; btn.innerHTML = '<span class="spinner"></span>Creating account...'; 60 61 const email = document.getElementById('email').value.trim(); 62 const password = document.getElementById('password').value; 63 64 const { data, error } = await FP.supabase.auth.signUp({ 65 email, password, 66 options: { emailRedirectTo: window.location.origin + '/dashboard.html' } 67 }); 68 69 btn.disabled = false; btn.textContent = 'Create account'; 70 71 if (error) { showErr(error.message); return; } 72 73 // Supabase may require email confirmation depending on project settings. 74 if (data.user && !data.session) { 75 showOk('Check your email to confirm your account, then log in.'); 76 } else if (data.session) { 77 showOk('Account created! Redirecting...'); 78 setTimeout(() => window.location.href = '/dashboard.html', 600); 79 } else { 80 showOk('Account created. Please check your email.'); 81 } 82 }); 83 </script>
vendor: 1 bytes, line 83
83
84<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"5b83b05421fc4736817bbe865a4f04b8","r":1,"spa":2}' crossorigin="anonymous"></script>
84 85</body> 86</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.