Auto commit: 2026-03-12T15:34:32.901Z

This commit is contained in:
Flatlogic Bot 2026-03-12 15:34:32 +00:00
parent 33a9c38573
commit 1829bd8f53
11 changed files with 361 additions and 42 deletions

View File

@ -76,7 +76,7 @@ ROOT_URLCONF = 'config.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'DIRS': [BASE_DIR / 'core' / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [

View File

@ -0,0 +1,63 @@
{% extends "base.html" %}
{% block content %}
<div class="auth-page d-flex align-items-center justify-content-center min-vh-100 position-relative overflow-hidden">
<!-- Decorative 3D-like shapes -->
<div class="shape shape-sphere top-left"></div>
<div class="shape shape-cube bottom-right"></div>
<div class="container py-5 z-1">
<div class="row justify-content-center">
<div class="col-md-5 col-lg-4">
<div class="card glass-card border-0 text-center p-4 p-md-5">
<!-- Admin specific title -->
<h2 class="mb-4 fw-bold text-dark">
{% if site_header %}{{ site_header }}{% else %}Admin Login{% endif %}
</h2>
{% if form.errors and not form.non_field_errors %}
<p class="errornote text-danger small mb-3">
{% if form.errors.items|length == 1 %}Please correct the error below.{% else %}Please correct the errors below.{% endif %}
</p>
{% endif %}
{% if form.non_field_errors %}
{% for error in form.non_field_errors %}
<p class="errornote text-danger small mb-3">{{ error }}</p>
{% endfor %}
{% endif %}
{% if user.is_authenticated %}
<p class="errornote text-danger small mb-3">
You are authenticated as {{ username }}, but are not authorized to access this page. Would you like to login to a different account?
</p>
{% endif %}
<form method="post" id="login-form" class="auth-form text-start">
{% csrf_token %}
<div class="form-row mb-3">
{{ form.username.errors }}
<label for="id_username" class="form-label text-muted small fw-bold text-uppercase">{{ form.username.label }}</label>
{{ form.username }}
</div>
<div class="form-row mb-3">
{{ form.password.errors }}
<label for="id_password" class="form-label text-muted small fw-bold text-uppercase">{{ form.password.label }}</label>
{{ form.password }}
<input type="hidden" name="next" value="{{ next }}">
</div>
<div class="submit-row mt-4">
<button type="submit" class="btn btn-dark w-100 py-3 btn-glass fw-bold shadow-sm">Log In</button>
</div>
</form>
<div class="mt-4 pt-3 border-top">
<p class="mb-0 text-muted small"><a href="{% url 'home' %}" class="fw-bold text-secondary text-decoration-none">&larr; Back to Site</a></p>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -1,23 +1,40 @@
{% extends "base.html" %}
{% block content %}
<div class="container py-5">
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card shadow-sm border-0">
<div class="card-body p-4 p-md-5">
<h2 class="mb-4 text-center">Log In</h2>
<form method="post">
<div class="auth-page d-flex align-items-center justify-content-center min-vh-100 position-relative overflow-hidden">
<!-- Decorative 3D-like shapes -->
<div class="shape shape-sphere top-left"></div>
<div class="shape shape-cube bottom-right"></div>
<div class="container py-5 z-1">
<div class="row justify-content-center">
<div class="col-md-5 col-lg-4">
<div class="card glass-card border-0 text-center p-4 p-md-5">
<h2 class="mb-4 fw-bold text-dark">Welcome Back</h2>
<form method="post" class="auth-form text-start">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-primary w-100 py-2 mt-3">Log In</button>
{% for field in form %}
<div class="mb-3">
<label for="{{ field.id_for_label }}" class="form-label text-muted small fw-bold text-uppercase">{{ field.label }}</label>
{{ field }}
{% if field.help_text %}
<div class="form-text small text-muted">{{ field.help_text }}</div>
{% endif %}
{% for error in field.errors %}
<div class="text-danger small mt-1">{{ error }}</div>
{% endfor %}
</div>
{% endfor %}
<button type="submit" class="btn btn-primary w-100 py-3 mt-4 btn-glass fw-bold shadow-sm">Log In</button>
</form>
<div class="mt-4 text-center">
<p>Don't have an account? <a href="{% url 'signup' %}">Sign up here</a></p>
<div class="mt-4 pt-3 border-top">
<p class="mb-0 text-muted small">New here? <a href="{% url 'signup' %}" class="fw-bold text-primary text-decoration-none">Create an account</a></p>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% endblock %}

View File

@ -1,23 +1,41 @@
{% extends "base.html" %}
{% block content %}
<div class="container py-5">
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card shadow-sm border-0">
<div class="card-body p-4 p-md-5">
<h2 class="mb-4 text-center">Sign Up</h2>
<form method="post">
<div class="auth-page d-flex align-items-center justify-content-center min-vh-100 position-relative overflow-hidden">
<!-- Decorative 3D-like shapes -->
<div class="shape shape-cylinder top-right"></div>
<div class="shape shape-sphere bottom-left"></div>
<div class="container py-5 z-1">
<div class="row justify-content-center">
<div class="col-md-6 col-lg-5">
<div class="card glass-card border-0 text-center p-4 p-md-5">
<h2 class="mb-4 fw-bold text-dark">Join Us</h2>
<p class="text-muted small mb-4">Start your journey today and explore the possibilities.</p>
<form method="post" class="auth-form text-start">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-primary w-100 py-2 mt-3">Create Account</button>
{% for field in form %}
<div class="mb-3">
<label for="{{ field.id_for_label }}" class="form-label text-muted small fw-bold text-uppercase">{{ field.label }}</label>
{{ field }}
{% if field.help_text %}
<div class="form-text small text-muted">{{ field.help_text|safe }}</div>
{% endif %}
{% for error in field.errors %}
<div class="text-danger small mt-1">{{ error }}</div>
{% endfor %}
</div>
{% endfor %}
<button type="submit" class="btn btn-primary w-100 py-3 mt-4 btn-glass fw-bold shadow-sm">Sign Up</button>
</form>
<div class="mt-4 text-center">
<p>Already have an account? <a href="{% url 'login' %}">Log in here</a></p>
<div class="mt-4 pt-3 border-top">
<p class="mb-0 text-muted small">Already registered? <a href="{% url 'login' %}" class="fw-bold text-primary text-decoration-none">Log in</a></p>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% endblock %}

View File

@ -1,4 +1,123 @@
/* Custom styles for the application */
body {
font-family: system-ui, -apple-system, sans-serif;
background-color: #f7f9fc;
}
/* Glassmorphism Auth Page Styles */
.auth-page {
background: linear-gradient(135deg, #f0f4ff 0%, #ffffff 100%);
overflow: hidden;
position: relative;
z-index: 1;
}
.glass-card {
background: rgba(255, 255, 255, 0.7) !important;
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.5) !important;
border-radius: 20px !important;
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.05) !important;
transition: transform 0.3s ease;
}
.glass-card:hover {
transform: translateY(-5px);
}
.btn-glass {
border-radius: 12px !important;
transition: all 0.3s ease !important;
text-transform: uppercase;
letter-spacing: 1px;
}
.btn-glass:hover {
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(13, 110, 253, 0.3) !important;
}
/* Form Styling */
.auth-form input[type="text"],
.auth-form input[type="password"],
.auth-form input[type="email"] {
border: 1px solid #e2e8f0;
border-radius: 10px;
padding: 12px 16px;
background-color: rgba(255,255,255,0.8);
transition: all 0.2s ease-in-out;
}
.auth-form input[type="text"]:focus,
.auth-form input[type="password"]:focus,
.auth-form input[type="email"]:focus {
background-color: #fff;
border-color: #0d6efd;
box-shadow: 0 0 0 4px rgba(13, 110, 253, 0.1);
outline: none;
}
.auth-form .form-label {
letter-spacing: 0.5px;
font-size: 0.75rem;
}
/* Decorative 3D Shapes using CSS */
.shape {
position: absolute;
z-index: 0;
opacity: 0.6;
animation: float 6s ease-in-out infinite;
}
.shape-sphere {
width: 250px;
height: 250px;
border-radius: 50%;
background: radial-gradient(circle at 30% 30%, #a8c0ff, #3f2b96);
filter: blur(4px);
opacity: 0.4;
}
.shape-cube {
width: 150px;
height: 150px;
background: linear-gradient(135deg, #fbc2eb 0%, #a6c1ee 100%);
border-radius: 20px;
transform: rotate(45deg);
filter: blur(3px);
opacity: 0.3;
}
.shape-cylinder {
width: 100px;
height: 300px;
border-radius: 50px;
background: linear-gradient(to right, #84fab0 0%, #8fd3f4 100%);
transform: rotate(30deg);
filter: blur(5px);
opacity: 0.3;
}
/* Positioning */
.top-left { top: -50px; left: -50px; animation-delay: 0s; }
.bottom-right { bottom: -50px; right: -50px; animation-delay: 2s; }
.top-right { top: 10%; right: -20px; animation-delay: 1s; }
.bottom-left { bottom: 10%; left: -30px; animation-delay: 3s; }
@keyframes float {
0% { transform: translateY(0px) rotate(0deg); }
50% { transform: translateY(-20px) rotate(10deg); }
100% { transform: translateY(0px) rotate(0deg); }
}
@keyframes float-rotate {
0% { transform: translateY(0px) rotate(45deg); }
50% { transform: translateY(-25px) rotate(55deg); }
100% { transform: translateY(0px) rotate(45deg); }
}
.shape-cube.bottom-right {
animation: float-rotate 8s ease-in-out infinite;
}

View File

@ -1,21 +1,123 @@
:root {
--bg-color-start: #6a11cb;
--bg-color-end: #2575fc;
--text-color: #ffffff;
--card-bg-color: rgba(255, 255, 255, 0.01);
--card-border-color: rgba(255, 255, 255, 0.1);
}
/* Custom styles for the application */
body {
margin: 0;
font-family: 'Inter', sans-serif;
background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end));
color: var(--text-color);
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
text-align: center;
font-family: system-ui, -apple-system, sans-serif;
background-color: #f7f9fc;
}
/* Glassmorphism Auth Page Styles */
.auth-page {
background: linear-gradient(135deg, #f0f4ff 0%, #ffffff 100%);
overflow: hidden;
position: relative;
z-index: 1;
}
.glass-card {
background: rgba(255, 255, 255, 0.7) !important;
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.5) !important;
border-radius: 20px !important;
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.05) !important;
transition: transform 0.3s ease;
}
.glass-card:hover {
transform: translateY(-5px);
}
.btn-glass {
border-radius: 12px !important;
transition: all 0.3s ease !important;
text-transform: uppercase;
letter-spacing: 1px;
}
.btn-glass:hover {
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(13, 110, 253, 0.3) !important;
}
/* Form Styling */
.auth-form input[type="text"],
.auth-form input[type="password"],
.auth-form input[type="email"] {
border: 1px solid #e2e8f0;
border-radius: 10px;
padding: 12px 16px;
background-color: rgba(255,255,255,0.8);
transition: all 0.2s ease-in-out;
}
.auth-form input[type="text"]:focus,
.auth-form input[type="password"]:focus,
.auth-form input[type="email"]:focus {
background-color: #fff;
border-color: #0d6efd;
box-shadow: 0 0 0 4px rgba(13, 110, 253, 0.1);
outline: none;
}
.auth-form .form-label {
letter-spacing: 0.5px;
font-size: 0.75rem;
}
/* Decorative 3D Shapes using CSS */
.shape {
position: absolute;
z-index: 0;
opacity: 0.6;
animation: float 6s ease-in-out infinite;
}
.shape-sphere {
width: 250px;
height: 250px;
border-radius: 50%;
background: radial-gradient(circle at 30% 30%, #a8c0ff, #3f2b96);
filter: blur(4px);
opacity: 0.4;
}
.shape-cube {
width: 150px;
height: 150px;
background: linear-gradient(135deg, #fbc2eb 0%, #a6c1ee 100%);
border-radius: 20px;
transform: rotate(45deg);
filter: blur(3px);
opacity: 0.3;
}
.shape-cylinder {
width: 100px;
height: 300px;
border-radius: 50px;
background: linear-gradient(to right, #84fab0 0%, #8fd3f4 100%);
transform: rotate(30deg);
filter: blur(5px);
opacity: 0.3;
}
/* Positioning */
.top-left { top: -50px; left: -50px; animation-delay: 0s; }
.bottom-right { bottom: -50px; right: -50px; animation-delay: 2s; }
.top-right { top: 10%; right: -20px; animation-delay: 1s; }
.bottom-left { bottom: 10%; left: -30px; animation-delay: 3s; }
@keyframes float {
0% { transform: translateY(0px) rotate(0deg); }
50% { transform: translateY(-20px) rotate(10deg); }
100% { transform: translateY(0px) rotate(0deg); }
}
@keyframes float-rotate {
0% { transform: translateY(0px) rotate(45deg); }
50% { transform: translateY(-25px) rotate(55deg); }
100% { transform: translateY(0px) rotate(45deg); }
}
.shape-cube.bottom-right {
animation: float-rotate 8s ease-in-out infinite;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 481 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB