Auto commit: 2026-03-12T15:34:32.901Z
This commit is contained in:
parent
33a9c38573
commit
1829bd8f53
Binary file not shown.
@ -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': [
|
||||
|
||||
63
core/templates/admin/login.html
Normal file
63
core/templates/admin/login.html
Normal 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">← Back to Site</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@ -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 %}
|
||||
@ -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 %}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
BIN
staticfiles/pasted-20260312-075015-5bfcde5a.png
Normal file
BIN
staticfiles/pasted-20260312-075015-5bfcde5a.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 248 KiB |
BIN
staticfiles/pasted-20260312-075439-a7d6936f.png
Normal file
BIN
staticfiles/pasted-20260312-075439-a7d6936f.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 248 KiB |
BIN
staticfiles/pasted-20260312-080648-eac18161.png
Normal file
BIN
staticfiles/pasted-20260312-080648-eac18161.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 481 KiB |
BIN
staticfiles/vm-shot-2026-03-12T07-54-30-697Z.jpg
Normal file
BIN
staticfiles/vm-shot-2026-03-12T07-54-30-697Z.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 34 KiB |
Loading…
x
Reference in New Issue
Block a user