+
+
+
+
{% if form.errors %}
-
+
+
+ {% trans "Two-Factor Auth" %}
+{% trans "Enter your authentication code to continue" %}
+
- {% bootstrap_form_errors form %}
+
-{% endblock content %}
+{% endblock %}
{% block script %}
-{% endblock script%}
+{% endblock script %}
diff --git a/accounts/templates/login.html b/accounts/templates/login.html
index 28e67690..a17a7e3c 100644
--- a/accounts/templates/login.html
+++ b/accounts/templates/login.html
@@ -2,7 +2,6 @@
{% load i18n %}
{% load static %}
-
{% block title %}{% trans "WebVirtCloud" %} - {% trans "Sign In" %}{% endblock title %}
{% block style %}
@@ -10,27 +9,59 @@
{% endblock style %}
{% block content %}
-
+
+
{% endif %}
- {% bootstrap_form_errors form type='non_fields' %}
-
-
-
- WebVirtCloud
--
+
+
+
+
+
{% if form.errors %}
-
+
+
+ WebVirtCloud
+{% trans "Virtualization Management Console" %}
+
-
- {% trans "Incorrect username or password." %}
+ {% csrf_token %}
-
{% endblock %}
@@ -38,18 +69,31 @@
{% block script %}
-{% endblock script%}
+{% endblock script %}
diff --git a/accounts/templates/logout.html b/accounts/templates/logout.html
index eb3b9176..8e271dbf 100644
--- a/accounts/templates/logout.html
+++ b/accounts/templates/logout.html
@@ -1,17 +1,42 @@
{% extends "base.html" %}
{% load i18n %}
-{% block title %}
- {% trans "WebVirtCloud" %} - {% trans "Sign Out"%}
-{% endblock %}
+{% load static %}
+
+{% block title %}{% trans "WebVirtCloud" %} - {% trans "Signed Out" %}{% endblock title %}
+
+{% block style %}
+
+{% endblock style %}
+
{% block content %}
-
+
+
{% endif %}
- {% trans "Incorrect username or password." %}
{% trans "Sign In" %}
- - - -
-
+
+
+ {% csrf_token %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
- WebVirtCloud
-
-
-
{% trans "Successful log out" %}
+
+
{% endblock %}
+
+{% block script %}
+
+{% endblock script %}
diff --git a/static/css/signin.css b/static/css/signin.css
index d47add7c..92b340dd 100644
--- a/static/css/signin.css
+++ b/static/css/signin.css
@@ -1,81 +1,326 @@
-/* body {
- background: rgba(203,203,203,1)
-} */
-.login-box {
- margin-top: 25%;
- display: block;
- align-content: center;
+/*
+ * WebVirtCloud Modern Authentication Stylesheet
+ * Responsive, dark-themed, glassmorphic layout for KVM / Libvirt cloud console
+ */
+
+/* ==========================================================================
+ Page Layout & Ambient Background
+ ========================================================================== */
+
+body:has(.signin-wrapper),
+body.signin-page {
+ min-height: 100vh;
+ margin: 0;
+ padding: 0 !important;
+ background-color: #090d16;
+ background-image:
+ radial-gradient(ellipse 80% 50% at 50% -20%, rgba(37, 99, 235, 0.22) 0%, transparent 60%),
+ radial-gradient(circle at 10% 90%, rgba(14, 165, 233, 0.08) 0%, transparent 40%),
+ radial-gradient(circle at 90% 90%, rgba(99, 102, 241, 0.08) 0%, transparent 40%),
+ radial-gradient(circle at 50% 50%, rgba(15, 23, 42, 0.5) 0%, transparent 100%);
+ background-attachment: fixed;
+ display: flex;
align-items: center;
- box-shadow: 0px 0px 20px black;
- border-radius: 5px;
- padding-top: 5%;
- padding-bottom: 1%;
-}
-h1 {
- color:#212529;
-}
-h2 {
- color:#212529;
+ justify-content: center;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
+ color: #e2e8f0;
}
-.form-signin {
- max-width: 330px;
- padding: 15px;
- margin: 50px auto;
+/* Neutralize base.html container wrapper for signin pages */
+body:has(.signin-wrapper) > .container,
+body.signin-page > .container {
+ max-width: 100% !important;
+ width: 100%;
+ min-height: 100vh;
+ padding: 2rem 1rem !important;
+ margin: 0 !important;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
}
-.form-signin .form-signin-heading,
-.form-signin .checkbox {
- margin-bottom: 10px;
+body:has(.signin-wrapper) > .container > .row,
+body.signin-page > .container > .row {
+ display: none !important;
+}
+
+/* ==========================================================================
+ Sign In Card Component
+ ========================================================================== */
+
+.signin-wrapper {
+ width: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.signin-card {
+ width: 100%;
+ max-width: 440px;
+ background: rgba(17, 24, 39, 0.88);
+ backdrop-filter: blur(20px);
+ -webkit-backdrop-filter: blur(20px);
+ border: 1px solid rgba(255, 255, 255, 0.08);
+ border-radius: 20px;
+ padding: 2.75rem 2.25rem 2rem;
+ box-shadow:
+ 0 25px 50px -12px rgba(0, 0, 0, 0.65),
+ 0 0 0 1px rgba(255, 255, 255, 0.04),
+ 0 0 45px -5px rgba(37, 99, 235, 0.15);
+ animation: signinCardEnter 0.35s ease-out;
+}
+
+@keyframes signinCardEnter {
+ from {
+ opacity: 0;
+ transform: translateY(12px) scale(0.98);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0) scale(1);
+ }
+}
+
+/* ==========================================================================
+ Brand & Logo Section
+ ========================================================================== */
+
+.signin-brand {
text-align: center;
+ margin-bottom: 2rem;
}
-.form-signin .checkbox {
- font-weight: normal;
+.signin-logo-badge {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 64px;
+ height: 64px;
+ border-radius: 18px;
+ background: linear-gradient(135deg, #2563eb 0%, #3b82f6 50%, #6366f1 100%);
+ color: #ffffff;
+ font-size: 1.85rem;
+ box-shadow:
+ 0 10px 25px -4px rgba(37, 99, 235, 0.5),
+ inset 0 1px 1px rgba(255, 255, 255, 0.35);
+ margin-bottom: 1.15rem;
+ transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
}
-.form-signin .form-control {
+.signin-logo-badge:hover {
+ transform: translateY(-2px) scale(1.05);
+}
+
+.signin-title {
+ font-size: 1.65rem;
+ font-weight: 700;
+ letter-spacing: -0.025em;
+ color: #f8fafc;
+ margin-bottom: 0.35rem;
+}
+
+.signin-subtitle {
+ font-size: 0.875rem;
+ color: #94a3b8;
+ margin-bottom: 0;
+ font-weight: 400;
+}
+
+/* ==========================================================================
+ Input Groups & Form Controls
+ ========================================================================== */
+
+.signin-field-label {
+ font-size: 0.8125rem;
+ font-weight: 500;
+ color: #cbd5e1;
+ margin-bottom: 0.45rem;
+ display: flex;
+ align-items: center;
+}
+
+.signin-input-group {
position: relative;
- font-size: 16px;
- height: auto;
- padding: 10px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
+ border-radius: 12px;
+ background: rgba(30, 41, 59, 0.55);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ transition: all 0.2s ease;
+ display: flex;
+ align-items: stretch;
+ overflow: hidden;
}
-.form-signin .form-control:focus {
- z-index: 2;
+.signin-input-group:focus-within {
+ border-color: #3b82f6;
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.25);
+ background: rgba(30, 41, 59, 0.85);
}
-.form-signin input[type="text"] {
- margin-bottom: 10px;
- border-radius: 5px;
+.signin-input-icon {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0 0.875rem;
+ color: #64748b;
+ font-size: 1.1rem;
+ transition: color 0.2s ease;
}
-.form-signin input[type="password"] {
- margin-bottom: 10px;
- border-radius: 5px;
+.signin-input-group:focus-within .signin-input-icon {
+ color: #3b82f6;
}
-.btn-success {
- border-width: 2px;
- border-style: solid;
-}
-.btn-success:hover {
- border-width: 2px;
- border-style: solid;
+.signin-input {
+ flex: 1;
+ background: transparent !important;
+ border: none !important;
+ color: #f8fafc !important;
+ padding: 0.75rem 0.875rem 0.75rem 0;
+ font-size: 0.95rem;
+ outline: none !important;
+ box-shadow: none !important;
}
-.logout {
- margin: 100px auto;
- text-align: center;
+.signin-input::placeholder {
+ color: #64748b;
+ opacity: 1;
}
-h1 {
- text-align: center;
+.signin-toggle-pwd {
+ background: transparent;
+ border: none;
+ color: #64748b;
+ padding: 0 0.875rem;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ transition: color 0.2s ease;
}
-a:hover {
+.signin-toggle-pwd:hover,
+.signin-toggle-pwd:focus {
+ color: #94a3b8;
+ outline: none;
+}
+
+.signin-link {
+ color: #60a5fa;
text-decoration: none;
+ transition: color 0.2s ease;
+}
+
+.signin-link:hover {
+ color: #93c5fd;
+ text-decoration: underline;
+}
+
+/* ==========================================================================
+ Submit Button
+ ========================================================================== */
+
+.btn-signin-submit {
+ width: 100%;
+ padding: 0.8rem 1.5rem;
+ font-size: 0.95rem;
+ font-weight: 600;
+ letter-spacing: 0.01em;
+ border-radius: 12px;
+ color: #ffffff;
+ background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%);
+ border: 1px solid rgba(255, 255, 255, 0.15);
+ box-shadow:
+ 0 4px 14px rgba(37, 99, 235, 0.4),
+ inset 0 1px 0 rgba(255, 255, 255, 0.2);
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+}
+
+.btn-signin-submit:hover:not(:disabled) {
+ background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);
+ box-shadow:
+ 0 6px 20px rgba(37, 99, 235, 0.55),
+ inset 0 1px 0 rgba(255, 255, 255, 0.25);
+ transform: translateY(-1px);
+ color: #ffffff;
+}
+
+.btn-signin-submit:active:not(:disabled) {
+ transform: translateY(0);
+ box-shadow: 0 2px 8px rgba(37, 99, 235, 0.35);
+}
+
+.btn-signin-submit:disabled {
+ opacity: 0.75;
+ cursor: not-allowed;
+}
+
+/* ==========================================================================
+ Alerts & Notifications
+ ========================================================================== */
+
+.signin-alert {
+ background: rgba(239, 68, 68, 0.12);
+ border: 1px solid rgba(239, 68, 68, 0.3);
+ color: #fca5a5;
+ border-radius: 12px;
+ padding: 0.75rem 1rem;
+ font-size: 0.875rem;
+ display: flex;
+ align-items: center;
+ gap: 0.65rem;
+ margin-bottom: 1.5rem;
+ animation: signinShakeX 0.4s ease-in-out;
+}
+
+@keyframes signinShakeX {
+ 0%, 100% { transform: translateX(0); }
+ 20%, 60% { transform: translateX(-4px); }
+ 40%, 80% { transform: translateX(4px); }
+}
+
+/* ==========================================================================
+ Footer & Status Indicator
+ ========================================================================== */
+
+.signin-footer {
+ margin-top: 1.75rem;
+ padding-top: 1.25rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.08);
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ font-size: 0.75rem;
+ color: #64748b;
+}
+
+.pulse-indicator {
+ display: inline-block;
+ width: 7px;
+ height: 7px;
+ border-radius: 50%;
+ background: #10b981;
+ box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.7);
+ animation: pulseGreen 2s infinite;
+ margin-right: 0.45rem;
+}
+
+@keyframes pulseGreen {
+ 0% {
+ transform: scale(0.95);
+ box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.7);
+ }
+ 70% {
+ transform: scale(1);
+ box-shadow: 0 0 0 6px rgba(16, 185, 129, 0);
+ }
+ 100% {
+ transform: scale(0.95);
+ box-shadow: 0 0 0 0 rgba(16, 185, 129, 0);
+ }
}
+
+
+
+
+
+
+
+
+ {% trans "Signed Out" %}
+{% trans "You have been successfully signed out." %}
+