scaffold initial project structure and global design system

This commit is contained in:
2026-08-22 12:00:38 +05:30
parent f995332312
commit b23a8b7edd
23 changed files with 5962 additions and 0 deletions
+638
View File
@@ -0,0 +1,638 @@
/* ============================================================
LoginPage.css — Guardian HomeCare Super Admin
============================================================ */
/* ── Root layout ── */
.login-root {
display: flex;
min-height: 100vh;
width: 100%;
position: relative;
overflow: hidden;
background: var(--dark-900);
}
/* ── Animated grid lines ── */
.grid-lines {
position: fixed;
inset: 0;
background-image:
linear-gradient(rgba(59,130,246,0.04) 1px, transparent 1px),
linear-gradient(90deg, rgba(59,130,246,0.04) 1px, transparent 1px);
background-size: 60px 60px;
pointer-events: none;
z-index: 0;
}
/* ── Floating orbs ── */
.orbs-container {
position: fixed;
inset: 0;
pointer-events: none;
z-index: 0;
overflow: hidden;
}
.orb {
position: absolute;
border-radius: 50%;
filter: blur(80px);
animation: orbFloat 8s ease-in-out infinite;
}
.orb-1 {
width: 500px; height: 500px;
background: radial-gradient(circle, rgba(59,130,246,0.18) 0%, transparent 70%);
top: -150px; left: -100px;
animation-delay: 0s;
}
.orb-2 {
width: 400px; height: 400px;
background: radial-gradient(circle, rgba(20,184,166,0.15) 0%, transparent 70%);
bottom: -100px; right: -80px;
animation-delay: -3s;
}
.orb-3 {
width: 300px; height: 300px;
background: radial-gradient(circle, rgba(99,102,241,0.12) 0%, transparent 70%);
top: 40%; left: 30%;
animation-delay: -5s;
}
.orb-4 {
width: 250px; height: 250px;
background: radial-gradient(circle, rgba(59,130,246,0.1) 0%, transparent 70%);
top: 20%; right: 20%;
animation-delay: -2s;
}
@keyframes orbFloat {
0%, 100% { transform: translateY(0px) scale(1); }
33% { transform: translateY(-20px) scale(1.03); }
66% { transform: translateY(15px) scale(0.97); }
}
/* ── Hero panel (left) ── */
.login-hero {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 60px 56px;
position: relative;
z-index: 2;
opacity: 0;
transform: translateX(-30px);
transition: opacity 0.7s ease, transform 0.7s ease;
}
.login-hero.mounted {
opacity: 1;
transform: translateX(0);
}
.hero-content {
display: flex;
flex-direction: column;
gap: 32px;
max-width: 520px;
}
/* Online badge */
.hero-badge {
display: inline-flex;
align-items: center;
gap: 8px;
background: rgba(20, 184, 166, 0.12);
border: 1px solid rgba(20, 184, 166, 0.3);
border-radius: var(--radius-full);
padding: 6px 16px;
font-size: 13px;
font-weight: 500;
color: var(--teal-400);
width: fit-content;
letter-spacing: 0.02em;
}
.badge-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--teal-400);
box-shadow: 0 0 8px var(--teal-400);
animation: pulse-dot 2s ease-in-out infinite;
}
@keyframes pulse-dot {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.6; transform: scale(0.85); }
}
/* Hero title */
.hero-title {
font-size: clamp(2.4rem, 4vw, 3.6rem);
font-weight: 800;
line-height: 1.1;
letter-spacing: -0.03em;
color: #fff;
}
.hero-title-accent {
background: linear-gradient(135deg, #3b82f6, #14b8a6);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.hero-subtitle {
font-size: 16px;
color: var(--gray-400);
line-height: 1.7;
max-width: 400px;
}
/* Stats */
.hero-stats {
display: flex;
gap: 16px;
}
.stat-card {
flex: 1;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.08);
border-radius: var(--radius-md);
padding: 18px 14px;
display: flex;
flex-direction: column;
gap: 4px;
transition: border-color 0.3s, background 0.3s;
}
.stat-card:hover {
background: rgba(59,130,246,0.08);
border-color: rgba(59,130,246,0.25);
}
.stat-value {
font-size: 22px;
font-weight: 700;
color: #fff;
letter-spacing: -0.02em;
}
.stat-label {
font-size: 12px;
color: var(--gray-500);
font-weight: 500;
}
/* Graphic */
.hero-graphic {
position: relative;
width: 180px;
height: 180px;
display: flex;
align-items: center;
justify-content: center;
}
.pulse-ring {
position: absolute;
border-radius: 50%;
border: 1px solid rgba(59,130,246,0.25);
animation: pulseRing 3s ease-in-out infinite;
}
.pulse-ring-1 { width: 90px; height: 90px; animation-delay: 0s; }
.pulse-ring-2 { width: 130px; height: 130px; animation-delay: 0.6s; }
.pulse-ring-3 { width: 170px; height: 170px; animation-delay: 1.2s; }
@keyframes pulseRing {
0% { opacity: 0.7; transform: scale(1); }
50% { opacity: 0.3; transform: scale(1.04); }
100% { opacity: 0.7; transform: scale(1); }
}
.hero-icon-center {
position: relative;
z-index: 1;
background: rgba(15, 32, 64, 0.8);
border: 1px solid rgba(59,130,246,0.3);
border-radius: 50%;
width: 80px; height: 80px;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 0 40px rgba(59,130,246,0.25);
}
/* Hero footer */
.hero-footer {
display: flex;
gap: 10px;
align-items: center;
font-size: 13px;
color: var(--gray-600);
}
/* ── Login panel (right) ── */
.login-panel {
width: 520px;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
padding: 40px 48px;
position: relative;
z-index: 2;
background: rgba(10, 22, 40, 0.7);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border-left: 1px solid rgba(255,255,255,0.06);
opacity: 0;
transform: translateX(30px);
transition: opacity 0.7s ease 0.15s, transform 0.7s ease 0.15s;
}
.login-panel.mounted {
opacity: 1;
transform: translateX(0);
}
/* ── Card ── */
.login-card {
width: 100%;
max-width: 420px;
display: flex;
flex-direction: column;
gap: 24px;
}
.login-card.shake {
animation: shake 0.55s cubic-bezier(.36,.07,.19,.97) both;
}
@keyframes shake {
10%, 90% { transform: translateX(-2px); }
20%, 80% { transform: translateX(4px); }
30%, 50%, 70% { transform: translateX(-6px); }
40%, 60% { transform: translateX(6px); }
}
/* Card header */
.card-header {
display: flex;
align-items: center;
gap: 16px;
}
.card-logo {
width: 56px; height: 56px;
background: rgba(59,130,246,0.1);
border: 1px solid rgba(59,130,246,0.25);
border-radius: var(--radius-md);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.card-title {
font-size: 26px;
font-weight: 800;
color: #fff;
letter-spacing: -0.02em;
}
.card-subtitle {
font-size: 13px;
color: var(--gray-500);
font-weight: 400;
margin-top: 2px;
}
/* Divider */
.card-divider {
display: flex;
align-items: center;
gap: 12px;
color: var(--gray-600);
font-size: 13px;
font-weight: 500;
}
.card-divider::before,
.card-divider::after {
content: '';
flex: 1;
height: 1px;
background: rgba(255,255,255,0.07);
}
/* Error banner */
.error-banner {
display: flex;
align-items: center;
gap: 8px;
background: rgba(239,68,68,0.1);
border: 1px solid rgba(239,68,68,0.25);
border-radius: var(--radius-sm);
padding: 11px 14px;
font-size: 14px;
color: #fca5a5;
animation: fadeSlideDown 0.3s ease;
}
@keyframes fadeSlideDown {
from { opacity: 0; transform: translateY(-8px); }
to { opacity: 1; transform: translateY(0); }
}
/* ── Form ── */
.login-form {
display: flex;
flex-direction: column;
gap: 18px;
}
.field-group {
display: flex;
flex-direction: column;
gap: 8px;
}
.field-label {
font-size: 13px;
font-weight: 600;
color: var(--gray-300);
letter-spacing: 0.01em;
}
.field-wrapper {
position: relative;
display: flex;
align-items: center;
}
.field-icon {
position: absolute;
left: 14px;
color: var(--gray-500);
display: flex;
align-items: center;
pointer-events: none;
transition: color 0.2s;
}
.field-wrapper:focus-within .field-icon {
color: var(--primary-400);
}
.field-input {
width: 100%;
height: 48px;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.1);
border-radius: var(--radius-md);
padding: 0 48px 0 46px;
font-size: 14px;
font-family: var(--font-primary);
color: #fff;
transition: border-color 0.25s, background 0.25s, box-shadow 0.25s;
outline: none;
}
.field-input::placeholder {
color: var(--gray-600);
}
.field-input:focus {
border-color: rgba(59,130,246,0.6);
background: rgba(59,130,246,0.06);
box-shadow: 0 0 0 3px rgba(59,130,246,0.12);
}
.field-input:hover:not(:focus) {
border-color: rgba(255,255,255,0.18);
background: rgba(255,255,255,0.06);
}
/* Password toggle */
.pwd-toggle {
position: absolute;
right: 14px;
background: none;
border: none;
cursor: pointer;
color: var(--gray-500);
display: flex;
align-items: center;
padding: 4px;
border-radius: 6px;
transition: color 0.2s, background 0.2s;
}
.pwd-toggle:hover {
color: var(--primary-400);
background: rgba(59,130,246,0.1);
}
/* Form options */
.form-options {
display: flex;
align-items: center;
justify-content: space-between;
}
.remember-label {
display: flex;
align-items: center;
gap: 8px;
cursor: pointer;
font-size: 13px;
color: var(--gray-400);
user-select: none;
}
.remember-check {
display: none;
}
.custom-check {
width: 18px;
height: 18px;
border: 1.5px solid rgba(255,255,255,0.2);
border-radius: 5px;
background: rgba(255,255,255,0.04);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
transition: border-color 0.2s, background 0.2s;
position: relative;
}
.remember-check:checked + .custom-check {
background: var(--primary-600);
border-color: var(--primary-500);
}
.remember-check:checked + .custom-check::after {
content: '';
display: block;
width: 5px;
height: 9px;
border: 2px solid #fff;
border-top: none;
border-left: none;
transform: rotate(45deg) translate(-1px, -1px);
}
.forgot-btn {
background: none;
border: none;
cursor: pointer;
font-size: 13px;
font-family: var(--font-primary);
color: var(--primary-400);
font-weight: 500;
padding: 0;
transition: color 0.2s;
}
.forgot-btn:hover {
color: var(--primary-300);
text-decoration: underline;
}
/* ── Login button ── */
.login-btn {
width: 100%;
height: 52px;
border: none;
border-radius: var(--radius-md);
cursor: pointer;
font-family: var(--font-primary);
font-size: 15px;
font-weight: 700;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 50%, #0d9488 100%);
background-size: 200% 200%;
background-position: 0% 50%;
box-shadow: 0 4px 24px rgba(37, 99, 235, 0.4);
transition: background-position 0.4s ease, box-shadow 0.3s, transform 0.2s, opacity 0.2s;
position: relative;
overflow: hidden;
letter-spacing: 0.01em;
}
.login-btn::before {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(255,255,255,0.1) 0%, transparent 60%);
opacity: 0;
transition: opacity 0.3s;
}
.login-btn:hover:not(:disabled)::before {
opacity: 1;
}
.login-btn:hover:not(:disabled) {
background-position: 100% 50%;
box-shadow: 0 8px 32px rgba(37, 99, 235, 0.55);
transform: translateY(-1px);
}
.login-btn:active:not(:disabled) {
transform: translateY(0);
box-shadow: 0 4px 16px rgba(37, 99, 235, 0.4);
}
.login-btn:disabled,
.login-btn.loading {
opacity: 0.8;
cursor: not-allowed;
transform: none;
}
/* Spinner */
.spinner {
display: inline-flex;
animation: spinRotate 0.8s linear infinite;
}
@keyframes spinRotate {
to { transform: rotate(360deg); }
}
/* ── Demo hint ── */
.demo-hint {
display: flex;
align-items: flex-start;
gap: 8px;
background: rgba(59,130,246,0.07);
border: 1px solid rgba(59,130,246,0.15);
border-radius: var(--radius-sm);
padding: 11px 14px;
font-size: 12.5px;
color: var(--gray-400);
line-height: 1.5;
}
.demo-hint .hint-icon { font-size: 14px; flex-shrink: 0; margin-top: 1px; }
.demo-hint strong { color: var(--primary-300); font-weight: 600; }
/* ── Security badge ── */
.security-badge {
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
font-size: 12px;
color: var(--gray-600);
font-weight: 500;
}
/* ══════════════════════════════════════════════
Responsive — tablet / mobile
══════════════════════════════════════════════ */
@media (max-width: 1024px) {
.login-hero { padding: 48px 40px; }
.hero-stats { flex-wrap: wrap; }
.stat-card { min-width: 120px; }
}
@media (max-width: 768px) {
.login-root { flex-direction: column; }
.login-hero {
padding: 40px 28px 32px;
min-height: auto;
border-left: none;
border-bottom: 1px solid rgba(255,255,255,0.06);
}
.hero-graphic { display: none; }
.hero-title { font-size: 2rem; }
.login-panel {
width: 100%;
min-height: auto;
padding: 36px 24px;
border-left: none;
background: transparent;
backdrop-filter: none;
}
.login-card { max-width: 100%; }
}
@media (max-width: 400px) {
.form-options { flex-direction: column; align-items: flex-start; gap: 10px; }
}