scaffold initial project structure and global design system
This commit is contained in:
@@ -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; }
|
||||
}
|
||||
Reference in New Issue
Block a user