added on local at 2026-07-01 13:48:08
| 1 | <!-- Reset-password (token redemption) page. Reached via the link in | |
| 2 | the email sent by /forgot_password.cgi. Marketing nav header is | |
| 3 | rendered by webstls_marketing.html. --> | |
| 4 | <div class="auth-shell"> | |
| 5 | <aside class="auth-side"> | |
| 6 | <div class="auth-side-glow"></div> | |
| 7 | <div class="auth-side-content"> | |
| 8 | <div class="hero-pill" style="margin-bottom:18px"><span class="dot"></span> Account recovery</div> | |
| 9 | <div class="auth-quote"> | |
| 10 | "Pick a long, unique password — or paste one from your password manager. We will never ask you to rotate this unless you tell us to." | |
| 11 | </div> | |
| 12 | <div class="auth-quote-attr">— WebSTLs platform</div> | |
| 13 | </div> | |
| 14 | </aside> | |
| 15 | ||
| 16 | <main class="auth-main"> | |
| 17 | <div style="display:flex;justify-content:flex-end"> | |
| 18 | <a href="/login.cgi" class="text-sm text-secondary">Back to <span class="text-brand fw-600">sign in</span></a> | |
| 19 | </div> | |
| 20 | ||
| 21 | <div class="auth-form-wrap"> | |
| 22 | ||
| 23 | [if:$token_ok] | |
| 24 | <h1 class="auth-title">Set a new password</h1> | |
| 25 | <p class="auth-sub">Pick something at least 8 characters — longer is better. Save it in your password manager before you submit.</p> | |
| 26 | ||
| 27 | [if:$has_error] | |
| 28 | <div class="banner danger" style="margin-bottom:18px"> | |
| 29 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg> | |
| 30 | <div class="text-xs">$error_msg</div> | |
| 31 | </div> | |
| 32 | [/if] | |
| 33 | ||
| 34 | <form method="POST" action="/reset_password.cgi" autocomplete="off"> | |
| 35 | <input type="hidden" name="t" value="$token"> | |
| 36 | <div class="form-group"> | |
| 37 | <label class="form-label">New password</label> | |
| 38 | <input class="input" type="password" name="password" placeholder="At least 8 characters" autocomplete="new-password" minlength="8" required autofocus> | |
| 39 | </div> | |
| 40 | <div class="form-group"> | |
| 41 | <label class="form-label">Confirm new password</label> | |
| 42 | <input class="input" type="password" name="password_confirm" placeholder="Re-enter the same password" autocomplete="new-password" minlength="8" required> | |
| 43 | </div> | |
| 44 | <button type="submit" class="btn btn-primary btn-block btn-lg">Save new password</button> | |
| 45 | </form> | |
| 46 | ||
| 47 | <div class="auth-foot"> | |
| 48 | After saving, you will be signed out of every device and asked to sign in again with the new password. | |
| 49 | </div> | |
| 50 | [/if] | |
| 51 | ||
| 52 | [if:!$token_ok] | |
| 53 | <h1 class="auth-title">Link unavailable</h1> | |
| 54 | <p class="auth-sub">We could not use that reset link.</p> | |
| 55 | ||
| 56 | <div class="banner danger" style="margin:18px 0"> | |
| 57 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg> | |
| 58 | <div class="text-xs">$error_msg</div> | |
| 59 | </div> | |
| 60 | ||
| 61 | <a href="/forgot_password.cgi" class="btn btn-primary btn-block btn-lg">Request a new reset link</a> | |
| 62 | ||
| 63 | <div class="auth-foot" style="margin-top:14px"> | |
| 64 | Reset links are single-use and expire 60 minutes after they are issued. If you copied the link from an old email, request a fresh one above. | |
| 65 | </div> | |
| 66 | [/if] | |
| 67 | ||
| 68 | </div> | |
| 69 | ||
| 70 | <div class="text-center text-xs text-dim">Reset links expire in 60 minutes · single-use · audit logged</div> | |
| 71 | </main> | |
| 72 | </div> | |
| 73 | ||
| 74 | <footer class="site-foot"> | |
| 75 | <div class="foot-grid"> | |
| 76 | <div class="foot-col"> | |
| 77 | <div class="flex items-center gap-3 mb-2"><div class="brand-mark" style="width:32px;height:32px;font-size:15px">W<span style="color:#a78bfa">S</span></div><div class="brand-text"><span class="brand-name">AffSoft</span></div></div> | |
| 78 | <p class="text-sm text-secondary" style="max-width:340px">The operating system for growth teams.</p> | |
| 79 | </div> | |
| 80 | <div class="foot-col"><h5>Platform</h5><ul><li><a href="features.cgi">Features</a></li><li><a href="tour.cgi">Tour</a></li><li><a href="why.cgi">Why AffSoft</a></li><li><a href="pricing.cgi">Pricing</a></li><li><a href="faq.cgi">FAQ</a></li></ul></div> | |
| 81 | <div class="foot-col"><h5>Company</h5><ul><li><a href="about.cgi">About</a></li><li><a href="contact.cgi">Contact</a></li></ul></div> | |
| 82 | <div class="foot-col"><h5>Legal & Trust</h5><ul><li><a href="privacy.cgi">Privacy</a></li><li><a href="terms.cgi">Terms of Service</a></li></ul></div> | |
| 83 | </div> | |
| 84 | <div class="foot-bottom"><span>© 2026 AffSoft All rights reserved.</span><span>Made for creators who treat this like a business.</span></div> | |
| 85 | </footer> |