Spaces:
Runtime error
Runtime error
| {% extends "base.html" %} | |
| {% block title %}Login - Outline VPN{% endblock %} | |
| {% block extra_css %} | |
| <style> | |
| .password-toggle { | |
| cursor: pointer; | |
| position: absolute; | |
| right: 10px; | |
| top: 50%; | |
| transform: translateY(-50%); | |
| } | |
| </style> | |
| {% endblock %} | |
| {% block content %} | |
| <div class="row justify-content-center"> | |
| <div class="col-md-6 col-lg-4"> | |
| <div class="card"> | |
| <div class="card-body"> | |
| <h2 class="card-title text-center mb-4">Login</h2> | |
| <form id="login-form" method="POST" action="{{ url_for('login') }}"> | |
| <div class="mb-3"> | |
| <label for="email" class="form-label">Email address</label> | |
| <input type="email" class="form-control" id="email" name="email" required> | |
| </div> | |
| <div class="mb-3 position-relative"> | |
| <label for="password" class="form-label">Password</label> | |
| <input type="password" class="form-control" id="password" name="password" required> | |
| <i class="bi bi-eye password-toggle" onclick="togglePassword('password')"></i> | |
| </div> | |
| <div class="mb-3 form-check"> | |
| <input type="checkbox" class="form-check-input" id="remember-me" name="remember_me"> | |
| <label class="form-check-label" for="remember-me">Remember me</label> | |
| </div> | |
| <div class="d-grid gap-2"> | |
| <button type="submit" class="btn btn-primary">Sign In</button> | |
| <a href="{{ url_for('forgot_password') }}" class="btn btn-link">Forgot Password?</a> | |
| </div> | |
| </form> | |
| <div class="text-center mt-3"> | |
| <p>Don't have an account? <a href="{{ url_for('signup') }}">Sign up</a></p> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| {% endblock %} | |
| {% block extra_js %} | |
| <script src="{{ url_for('static', filename='js/auth.js') }}"></script> | |
| <script> | |
| function togglePassword(inputId) { | |
| const input = document.getElementById(inputId); | |
| const icon = input.nextElementSibling; | |
| if (input.type === 'password') { | |
| input.type = 'text'; | |
| icon.classList.replace('bi-eye', 'bi-eye-slash'); | |
| } else { | |
| input.type = 'password'; | |
| icon.classList.replace('bi-eye-slash', 'bi-eye'); | |
| } | |
| } | |
| </script> | |
| {% endblock %} | |