File size: 5,882 Bytes
4b63522
a9dd227
 
 
 
fc21e5c
a9dd227
 
4b63522
a9dd227
 
 
6c153c2
 
 
 
 
a9dd227
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4b63522
a9dd227
4b63522
a9dd227
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
{% extends "base.html" %}
{% block title %}Login – Resume Ranker API{% endblock %}

{% block extra_head %}
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="{{ url_for('static', filename='css/login.css') }}">
{% endblock %}

{% block content %}
<header class="container sticky-header">
  <div class="logo">ResumeRanker<span style="color:var(--accent)">.API</span></div>
  <nav class="nav-links" id="navLinks">
    <a href="{{ url_for('auth.landing') }}">Home</a>
    <a href="{{ url_for('auth.landing') }}#how">How it works</a>
    <a href="{{ url_for('auth.landing') }}#demo">Live Demo</a>
    <a href="{{ url_for('auth.landing') }}#docs">Docs</a>
    <a href="{{ url_for('auth.landing') }}#pricing">Pricing</a>
  </nav>
  <button class="theme-toggle" id="themeToggle" aria-label="Toggle dark mode">πŸŒ™</button>
  <button class="hamburger" id="hamburger" aria-label="Open menu">
    <span></span><span></span><span></span>
  </button>
</header>

<main class="login-container">
  <div class="login-card">
    <div class="login-header">
      <h1 class="login-title">Welcome back</h1>
      <p class="login-subtitle">Sign in to your ResumeRanker account</p>
    </div>

    {% if error %}
    <div class="error-message">{{ error }}</div>
    {% endif %}

    {% if success %}
    <div class="success-message">{{ success }}</div>
    {% endif %}

    <form method="POST">
      <div class="form-group">
        <label for="email" class="form-label">Email address</label>
        <input type="email" id="email" name="email" class="form-input" placeholder="Enter your email" required>
      </div>

      <div class="form-group">
        <label for="password" class="form-label">Password</label>
        <input type="password" id="password" name="password" class="form-input" placeholder="Enter your password" required>
      </div>

      <div class="form-row">
        <div class="checkbox-group">
          <input type="checkbox" id="remember" name="remember">
          <label for="remember">Remember me</label>
        </div>
        <a href="#" class="forgot-link">Forgot password?</a>
      </div>

      <button type="submit" class="login-btn">Sign in</button>
    </form>

    <div class="divider">
      <span>or continue with</span>
    </div>

    <button class="social-btn" onclick="signInWithGoogle()">
      <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
        <path d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"/>
        <path d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"/>
        <path d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"/>
        <path d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"/>
      </svg>
      Continue with Google
    </button>

    <button class="social-btn" onclick="signInWithGitHub()">
      <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
        <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
      </svg>
      Continue with GitHub
    </button>

    <div class="verification-link">
      Didn't get the verification email?
      <a href="{{ url_for('auth.resend_verification') }}">Resend it</a>
    </div>

    <div class="signup-link">
      Don't have an account? <a href="{{ url_for('auth.register') }}">Register</a>
    </div>
  </div>
</main>
{% endblock %}

{% block extra_scripts %}
<script>
  // Light/Dark mode toggle
  const themeToggle = document.getElementById('themeToggle');
  const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
  function setTheme(theme) {
    document.documentElement.setAttribute('data-theme', theme);
    localStorage.setItem('theme', theme);
    themeToggle.textContent = theme === 'dark' ? 'β˜€οΈ' : 'πŸŒ™';
  }
  const savedTheme = localStorage.getItem('theme');
  setTheme(savedTheme || (prefersDark ? 'dark' : 'light'));
  themeToggle.onclick = () => {
    const current = document.documentElement.getAttribute('data-theme');
    setTheme(current === 'dark' ? 'light' : 'dark');
  };

  // Hamburger menu toggle
  const hamburger = document.getElementById('hamburger');
  const navLinks = document.getElementById('navLinks');
  hamburger.onclick = function() {
    navLinks.classList.toggle('open');
    hamburger.classList.toggle('open');
  };
  
  // Close menu when clicking a link (on mobile)
  Array.from(navLinks.getElementsByTagName('a')).forEach(link => {
    link.onclick = () => {
      if (window.innerWidth <= 900) {
        navLinks.classList.remove('open');
        hamburger.classList.remove('open');
      }
    };
  });

  // Social login functions
  function signInWithGoogle() {
    // Implement Google OAuth
    console.log('Google sign-in clicked');
  }

  function signInWithGitHub() {
    // Implement GitHub OAuth
    console.log('GitHub sign-in clicked');
  }
</script>
{% endblock %}