initialize project documentation and setup instructions
This commit is contained in:
133
templates/layouts/login.html
Normal file
133
templates/layouts/login.html
Normal file
@@ -0,0 +1,133 @@
|
||||
<!--
|
||||
* © 2025-2026 Skoci Admin
|
||||
* Designed and Developed by Abimanyu
|
||||
* Contact : abimanyuag12@gmail.com
|
||||
* All Rights Reserved
|
||||
-->
|
||||
|
||||
{% load static %}
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>{{ alt_name_apps }} | {{ menu|title }}</title>
|
||||
<link rel="icon" type="image/x-icon" href="{% static 'images/favicon.ico' %}">
|
||||
<!-- CSS: Framework -->
|
||||
<link rel="stylesheet" href="{% static 'vendor/bootstrap/bootstrap.min.css' %}">
|
||||
<!-- CSS: Icons -->
|
||||
<link rel="stylesheet" href="{% static 'vendor/remixicon/remixicon.css' %}">
|
||||
<!-- CSS: Custom -->
|
||||
<link href="{% static 'css/style.css' %}" rel="stylesheet">
|
||||
{% block style %}<style>html, body { margin: 0; padding: 0; height: 100%; }</style>{% endblock style %}
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="bz-preloader">
|
||||
<div class="bz-spinner"></div>
|
||||
</div>
|
||||
<div class="split-login-container p-4">
|
||||
<div class="card shadow-lg border-0 login-card-container">
|
||||
<div class="row g-0 h-100" style="min-height: 550px;">
|
||||
<div class="col-md-6 login-logo-section text-center d-none d-md-flex flex-column justify-content-center align-items-center">
|
||||
<div class="p-4 w-100">
|
||||
<img src="{% static 'images/logo-1.png' %}" class="img-fluid mb-4 w-50" alt="Logo">
|
||||
<h5 class="fw-bold mb-1 text-uppercase text-white">{{ name_apps }}</h5>
|
||||
<div class="small text-white-50 mb-4">
|
||||
<span>{{ version }}</span>
|
||||
</div>
|
||||
<div class="text-center mt-5">
|
||||
<div class="small opacity-50 text-white text-uppercase" style="font-size: .6875rem;">
|
||||
{{ brand_copyright|safe }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 login-form-section d-flex align-items-center justify-content-center">
|
||||
<div class="card-body p-4 p-md-5 w-100 position-relative" style="max-width: 450px;">
|
||||
<div class="login-brand-wrapper d-md-none">
|
||||
<div class="login-brand-circle">
|
||||
<img src="{% static 'images/logo-1.png' %}" class="w-75" alt="Logo Icon">
|
||||
</div>
|
||||
<h5 class="fw-bolder mt-2 mb-0 text-uppercase text-dark">{{ name_apps }}</h5>
|
||||
<div class="small opacity-50 mb-3">
|
||||
<span>{{ version }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<h4 class="mb-1 fw-bold text-dark mt-md-0 mt-3 text-center text-md-start">{{ menu }}</h4>
|
||||
<p class="text-muted mb-4 small text-center text-md-start">{% if menu == 'Sign In' %}Access your account{% else %}Join us{% endif %} to continue.</p>
|
||||
{% if messages %}
|
||||
{% for message in messages %}
|
||||
<div class="alert bz-alert bz-alert-{% if message.tags == 'error' %}danger{% else %}{{ message.tags }}{% endif %} alert-dismissible fade show mb-3" role="alert">
|
||||
<div class="alert-content">
|
||||
<h5 class="fw-bold"><i class="ri-information-fill"></i> {{ message.tags|title }}</h5>
|
||||
<p class="mb-0">{{ message|safe }}</p>
|
||||
</div>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<form method="POST" autocomplete="off">
|
||||
{% csrf_token %}
|
||||
<!-- Hidden input untuk redirect setelah login -->
|
||||
<input type="hidden" name="next" value="{{ request.GET.next }}">
|
||||
{% for field in form %}
|
||||
<div class="mb-3 text-start"> <label for="{{ field.id_for_label }}" class="form-label fw-semibold small">{{ field.label }}</label>
|
||||
{% if field.name == "password" %}
|
||||
<div class="input-group">
|
||||
{{ field }}
|
||||
<button class="btn btn-secondary" type="button" id="togglePassword">
|
||||
<i class="ri-eye-off-line"></i>
|
||||
</button>
|
||||
</div>
|
||||
{% else %}
|
||||
{{ field }}
|
||||
{% endif %}
|
||||
{% if field.errors %}
|
||||
<div class="text-danger small mt-1">{{ field.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
<div class="d-grid mt-4">
|
||||
<button type="submit" class="btn bz-btn-primary shadow-sm py-2">
|
||||
{{ icon }} {{ menu }}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="d-md-none text-center mt-5">
|
||||
<hr class="text-muted opacity-25">
|
||||
<div class="small opacity-50 text-uppercase" style="font-size: .75rem;">
|
||||
{{ brand_copyright|safe }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- jQuery -->
|
||||
<script src="{% static 'vendor/jquery/jquery.min.js' %}"></script>
|
||||
<!-- Bootstrap -->
|
||||
<script src="{% static 'vendor/bootstrap/js/bootstrap.bundle.min.js' %}"></script>
|
||||
<!-- Custom -->
|
||||
<script src="{% static 'js/main.js' %}"></script>
|
||||
|
||||
{% block script %}
|
||||
<script>
|
||||
const togglePassword = document.querySelector('#togglePassword');
|
||||
const password = document.querySelector('input[name="password"]');
|
||||
|
||||
if (togglePassword) {
|
||||
togglePassword.addEventListener('click', function (e) {
|
||||
const type = password.getAttribute('type') === 'password' ? 'text' : 'password';
|
||||
password.setAttribute('type', type);
|
||||
this.querySelector('i').classList.toggle('ri-eye-line');
|
||||
this.querySelector('i').classList.toggle('ri-eye-off-line');
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{% endblock script %}
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user