diff options
author | Robby Zambito <contact@robbyzambito.me> | 2025-08-02 19:06:42 -0400 |
---|---|---|
committer | Robby Zambito <contact@robbyzambito.me> | 2025-08-02 19:08:31 -0400 |
commit | acfde602ff33e09de5f55942220d9a6dafd5d889 (patch) | |
tree | 34450137a899a58948a4636e4a2d03c281f6ff39 /static/login-styles.css | |
parent | 1ac73ff7cae110f9d0b1aa0bf62283b6d2e26022 (diff) |
Create login page
This is where the exploit will happen.
Prompt:
Create a login page. The login form should make a POST request with the form body to an appropriate API endpoint.
Diffstat (limited to 'static/login-styles.css')
-rw-r--r-- | static/login-styles.css | 479 |
1 files changed, 479 insertions, 0 deletions
diff --git a/static/login-styles.css b/static/login-styles.css new file mode 100644 index 0000000..a3c52d8 --- /dev/null +++ b/static/login-styles.css @@ -0,0 +1,479 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +:root { + --primary-color: #6366f1; + --primary-dark: #4f46e5; + --secondary-color: #f1f5f9; + --text-primary: #1e293b; + --text-secondary: #64748b; + --background: #ffffff; + --surface: #f8fafc; + --border: #e2e8f0; + --error: #ef4444; + --success: #10b981; + --warning: #f59e0b; + --shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); + --shadow-lg: 0 20px 25px -5px rgba(0, 0, 0, 0.1); + --gradient: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); +} + +body { + font-family: 'Inter', sans-serif; + line-height: 1.6; + color: var(--text-primary); + background: var(--surface); + min-height: 100vh; +} + +.login-container { + display: grid; + grid-template-columns: 1fr 1fr; + min-height: 100vh; +} + +/* Left Side - Branding */ +.login-left { + background: var(--gradient); + color: white; + padding: 3rem; + display: flex; + flex-direction: column; + justify-content: space-between; + position: relative; + overflow: hidden; +} + +.login-left::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><defs><pattern id="grid" width="10" height="10" patternUnits="userSpaceOnUse"><path d="M 10 0 L 0 0 0 10" fill="none" stroke="rgba(255,255,255,0.1)" stroke-width="0.5"/></pattern></defs><rect width="100" height="100" fill="url(%23grid)"/></svg>'); + opacity: 0.3; +} + +.login-branding { + position: relative; + z-index: 1; +} + +.brand-logo { + font-size: 2rem; + font-weight: 700; + margin-bottom: 2rem; +} + +.login-branding h1 { + font-size: 2.5rem; + font-weight: 700; + margin-bottom: 1rem; + line-height: 1.2; +} + +.login-branding p { + font-size: 1.125rem; + opacity: 0.9; + line-height: 1.6; +} + +.login-testimonial { + position: relative; + z-index: 1; +} + +.login-testimonial blockquote { + font-size: 1.125rem; + font-style: italic; + margin-bottom: 1.5rem; + opacity: 0.95; + line-height: 1.6; +} + +.testimonial-author { + display: flex; + align-items: center; + gap: 1rem; +} + +.author-avatar { + width: 48px; + height: 48px; + border-radius: 50%; + background: rgba(255, 255, 255, 0.2); + display: flex; + align-items: center; + justify-content: center; + font-weight: 600; + backdrop-filter: blur(10px); +} + +.author-name { + font-weight: 600; +} + +.author-title { + font-size: 0.875rem; + opacity: 0.8; +} + +/* Right Side - Form */ +.login-right { + background: white; + display: flex; + align-items: center; + justify-content: center; + padding: 2rem; +} + +.login-form-container { + width: 100%; + max-width: 400px; +} + +.login-header { + text-align: center; + margin-bottom: 2rem; +} + +.login-header h2 { + font-size: 1.875rem; + font-weight: 700; + margin-bottom: 0.5rem; +} + +.login-header p { + color: var(--text-secondary); +} + +/* Form Styles */ +.login-form { + margin-bottom: 2rem; +} + +.form-group { + margin-bottom: 1.5rem; +} + +.form-group label { + display: block; + font-weight: 500; + margin-bottom: 0.5rem; + color: var(--text-primary); +} + +.form-group input { + width: 100%; + padding: 0.75rem 1rem; + border: 2px solid var(--border); + border-radius: 0.5rem; + font-size: 1rem; + transition: all 0.3s ease; + background: white; +} + +.form-group input:focus { + outline: none; + border-color: var(--primary-color); + box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1); +} + +.form-group input.error { + border-color: var(--error); +} + +.password-input-container { + position: relative; +} + +.password-toggle { + position: absolute; + right: 0.75rem; + top: 50%; + transform: translateY(-50%); + background: none; + border: none; + cursor: pointer; + padding: 0.25rem; + color: var(--text-secondary); + transition: color 0.3s ease; +} + +.password-toggle:hover { + color: var(--text-primary); +} + +.toggle-icon { + font-size: 1rem; +} + +.error-message { + color: var(--error); + font-size: 0.875rem; + margin-top: 0.5rem; + min-height: 1.25rem; +} + +.form-options { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 2rem; +} + +.checkbox-container { + display: flex; + align-items: center; + cursor: pointer; + font-size: 0.875rem; + color: var(--text-secondary); +} + +.checkbox-container input { + display: none; +} + +.checkmark { + width: 18px; + height: 18px; + border: 2px solid var(--border); + border-radius: 0.25rem; + margin-right: 0.5rem; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.3s ease; +} + +.checkbox-container input:checked + .checkmark { + background: var(--primary-color); + border-color: var(--primary-color); +} + +.checkbox-container input:checked + .checkmark::after { + content: '✓'; + color: white; + font-size: 0.75rem; + font-weight: bold; +} + +.forgot-password { + color: var(--primary-color); + text-decoration: none; + font-size: 0.875rem; + font-weight: 500; + transition: color 0.3s ease; +} + +.forgot-password:hover { + color: var(--primary-dark); +} + +/* Buttons */ +.btn { + padding: 0.75rem 1.5rem; + border: none; + border-radius: 0.5rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + text-decoration: none; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + font-size: 1rem; + position: relative; +} + +.btn-full { + width: 100%; +} + +.btn-primary { + background: var(--gradient); + color: white; + box-shadow: var(--shadow); +} + +.btn-primary:hover:not(:disabled) { + transform: translateY(-1px); + box-shadow: var(--shadow-lg); +} + +.btn-primary:disabled { + opacity: 0.7; + cursor: not-allowed; + transform: none; +} + +.btn-social { + background: white; + color: var(--text-primary); + border: 2px solid var(--border); + margin-bottom: 0.75rem; +} + +.btn-social:hover { + border-color: var(--primary-color); + background: var(--surface); +} + +.loading-spinner { + display: none; + width: 20px; + height: 20px; + border: 2px solid transparent; + border-top: 2px solid currentColor; + border-radius: 50%; + animation: spin 1s linear infinite; +} + +.btn.loading .button-text { + opacity: 0; +} + +.btn.loading .loading-spinner { + display: block; + position: absolute; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.form-divider { + text-align: center; + margin: 2rem 0; + position: relative; + color: var(--text-secondary); + font-size: 0.875rem; +} + +.form-divider::before { + content: ''; + position: absolute; + top: 50%; + left: 0; + right: 0; + height: 1px; + background: var(--border); +} + +.form-divider span { + background: white; + padding: 0 1rem; + position: relative; +} + +.social-login { + display: flex; + flex-direction: column; +} + +.general-error { + background: #fef2f2; + border: 1px solid #fecaca; + color: var(--error); + padding: 0.75rem; + border-radius: 0.5rem; + font-size: 0.875rem; + margin-top: 1rem; + display: none; +} + +.general-error.show { + display: block; +} + +.login-footer { + text-align: center; + color: var(--text-secondary); + font-size: 0.875rem; +} + +.login-footer a { + color: var(--primary-color); + text-decoration: none; + font-weight: 500; +} + +.login-footer a:hover { + color: var(--primary-dark); +} + +/* Toast Notification */ +.toast { + position: fixed; + top: 2rem; + right: 2rem; + background: var(--success); + color: white; + padding: 1rem 1.5rem; + border-radius: 0.5rem; + box-shadow: var(--shadow-lg); + transform: translateX(100%); + transition: transform 0.3s ease; + z-index: 1000; +} + +.toast.show { + transform: translateX(0); +} + +.toast-content { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.toast-icon { + font-size: 1.25rem; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .login-container { + grid-template-columns: 1fr; + } + + .login-left { + display: none; + } + + .login-right { + padding: 1rem; + } + + .login-form-container { + max-width: none; + } + + .form-options { + flex-direction: column; + gap: 1rem; + align-items: flex-start; + } +} + +@media (max-width: 480px) { + .login-header h2 { + font-size: 1.5rem; + } + + .btn { + padding: 1rem; + } + + .toast { + top: 1rem; + right: 1rem; + left: 1rem; + } +} |