feat: add dark theme ui for login page

This commit is contained in:
2026-09-03 16:44:06 +07:00
parent f6203263e4
commit b513c58d8f
2 changed files with 265 additions and 148 deletions
+6 -148
View File
@@ -2,6 +2,7 @@
@import 'tailwindcss'; @import 'tailwindcss';
@import 'tw-animate-css'; @import 'tw-animate-css';
@import 'shadcn/tailwind.css'; @import 'shadcn/tailwind.css';
@import './styles/LoginPage.css';
@custom-variant dark (&:is(.dark *)); @custom-variant dark (&:is(.dark *));
@@ -67,6 +68,11 @@ body {
min-width: 320px; min-width: 320px;
min-height: 100vh; min-height: 100vh;
background: #fff; background: #fff;
color: var(--ink);
}
.dark body {
background: #090a0c;
color: #ededed;
} }
button, button,
input, input,
@@ -872,145 +878,6 @@ button {
color: #999; color: #999;
} }
.auth-page {
position: relative;
display: grid;
grid-template-rows: auto 1fr auto;
justify-items: center;
min-height: 100dvh;
padding: 32px 24px 24px;
background: radial-gradient(circle at 50% 38%, rgb(62 207 142 / 0.08), transparent 34%), linear-gradient(#fff, #fcfcfc);
}
.auth-theme-toggle {
position: absolute;
z-index: 1;
top: 28px;
right: 28px;
}
.auth-page::before {
position: fixed;
inset: 0;
z-index: 0;
pointer-events: none;
background-image: radial-gradient(#dcdcdc 0.65px, transparent 0.65px);
background-size: 16px 16px;
mask-image: linear-gradient(to bottom, transparent, black 24%, transparent 76%);
content: '';
}
.auth-brand {
position: relative;
z-index: 1;
display: inline-flex;
align-items: center;
gap: 8px;
font-size: 20px;
font-weight: 600;
letter-spacing: -0.6px;
}
.auth-brand-mark {
width: 26px;
height: 26px;
color: var(--primary-deep);
}
.auth-card {
position: relative;
z-index: 1;
align-self: center;
width: min(100%, 420px);
padding: 36px;
border: 1px solid var(--hairline);
border-radius: 12px;
background: rgb(255 255 255 / 0.96);
box-shadow:
0 18px 55px rgb(24 74 52 / 0.08),
0 2px 8px rgb(0 0 0 / 0.04);
animation: enter 500ms cubic-bezier(0.16, 1, 0.3, 1) both;
}
.auth-heading p {
margin: 0 0 12px;
font:
500 10px/1.4 'IBM Plex Mono',
monospace;
letter-spacing: 0.08em;
text-transform: uppercase;
color: #55816e;
}
.auth-heading h1 {
margin: 0;
font-size: 30px;
font-weight: 500;
line-height: 1.16;
letter-spacing: -1.2px;
}
.auth-heading > span {
display: block;
margin-top: 12px;
font-size: 19px;
line-height: 1.55;
color: #626262;
}
.auth-form {
display: grid;
gap: 20px;
margin-top: 30px;
}
.auth-field {
display: grid;
gap: 8px;
}
.auth-field label {
font-size: 13px;
font-weight: 500;
color: #353535;
}
.auth-error {
margin: -4px 0 0;
padding: 10px 12px;
border: 1px solid #efcaca;
border-radius: 6px;
font-size: 12px;
line-height: 1.45;
color: #9f2f2f;
background: #fff6f6;
}
.auth-submit {
display: inline-flex;
align-items: center;
justify-content: center;
width: 100%;
min-height: 42px;
padding: 8px 16px;
border: 1px solid #35c586;
border-radius: 6px;
font-size: 14px;
font-weight: 600;
color: var(--ink);
background: var(--primary);
box-shadow:
0 1px 2px rgb(0 0 0 / 0.08),
inset 0 1px rgb(255 255 255 / 0.2);
cursor: pointer;
}
.auth-submit:hover:not(:disabled) {
background: #36c487;
transform: translateY(-1px);
}
.auth-submit:active:not(:disabled) {
background: var(--primary-deep);
transform: translateY(1px);
}
.auth-submit:disabled {
cursor: wait;
opacity: 0.62;
}
.auth-footnote {
position: relative;
z-index: 1;
margin: 0;
font-size: 11px;
color: #858585;
}
.detail-main { .detail-main {
padding-top: 34px; padding-top: 34px;
} }
@@ -3125,15 +2992,6 @@ button {
.channel-dialog-footer button { .channel-dialog-footer button {
flex: 1; flex: 1;
} }
.auth-page {
padding: 24px 16px;
}
.auth-card {
padding: 28px 22px;
}
.auth-heading h1 {
font-size: 27px;
}
.dashboard-header-inner { .dashboard-header-inner {
height: 62px; height: 62px;
} }
+259
View File
@@ -0,0 +1,259 @@
.auth-page {
position: relative;
display: grid;
grid-template-rows: auto 1fr auto;
justify-items: center;
min-height: 100dvh;
padding: 32px 24px 24px;
background: radial-gradient(circle at 50% 38%, rgb(62 207 142 / 0.08), transparent 34%), linear-gradient(#fff, #fcfcfc);
transition:
background 0.25s ease,
color 0.25s ease;
}
.dark .auth-page {
background:
radial-gradient(ellipse 75% 55% at 50% 30%, rgba(62, 207, 142, 0.12), transparent 65%),
radial-gradient(ellipse 40% 30% at 50% 12%, rgba(36, 180, 126, 0.07), transparent 50%),
linear-gradient(180deg, #0c0e10 0%, #070809 100%);
}
.auth-theme-toggle {
position: absolute;
z-index: 1;
top: 28px;
right: 28px;
transition:
color 0.15s ease,
background 0.15s ease,
border-color 0.15s ease;
}
.dark .auth-theme-toggle {
color: #9ca3af;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
backdrop-filter: blur(8px);
}
.dark .auth-theme-toggle:hover:not(:disabled) {
color: #3ecf8e;
background: rgba(62, 207, 142, 0.1);
border-color: rgba(62, 207, 142, 0.25);
}
.auth-page::before {
position: fixed;
inset: 0;
z-index: 0;
pointer-events: none;
background-image: radial-gradient(#dcdcdc 0.65px, transparent 0.65px);
background-size: 16px 16px;
mask-image: linear-gradient(to bottom, transparent, black 24%, transparent 76%);
content: '';
}
.dark .auth-page::before {
background-image: radial-gradient(rgba(255, 255, 255, 0.07) 1px, transparent 1px);
background-size: 20px 20px;
mask-image: radial-gradient(ellipse 70% 60% at 50% 40%, black 25%, transparent 80%);
}
.auth-brand {
position: relative;
z-index: 1;
display: inline-flex;
align-items: center;
gap: 8px;
font-size: 20px;
font-weight: 600;
letter-spacing: -0.6px;
}
.dark .auth-brand {
color: #ffffff;
}
.auth-brand-mark {
width: 26px;
height: 26px;
color: var(--primary-deep);
}
.dark .auth-brand-mark {
color: #3ecf8e;
filter: drop-shadow(0 0 12px rgba(62, 207, 142, 0.45));
}
.auth-card {
position: relative;
z-index: 1;
align-self: center;
width: min(100%, 420px);
padding: 36px;
border: 1px solid var(--hairline);
border-radius: 12px;
background: rgb(255 255 255 / 0.96);
box-shadow:
0 18px 55px rgb(24 74 52 / 0.08),
0 2px 8px rgb(0 0 0 / 0.04);
animation: enter 500ms cubic-bezier(0.16, 1, 0.3, 1) both;
}
.dark .auth-card {
background: rgba(17, 19, 23, 0.82);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.08);
box-shadow:
0 0 0 1px rgba(255, 255, 255, 0.05),
0 24px 64px -12px rgba(0, 0, 0, 0.8),
0 0 45px -10px rgba(62, 207, 142, 0.08),
inset 0 1px 0 0 rgba(255, 255, 255, 0.06);
}
.auth-heading p {
margin: 0 0 12px;
font:
500 10px/1.4 'IBM Plex Mono',
monospace;
letter-spacing: 0.08em;
text-transform: uppercase;
color: #55816e;
}
.dark .auth-heading p {
color: #3ecf8e;
}
.auth-heading h1 {
margin: 0;
font-size: 30px;
font-weight: 500;
line-height: 1.16;
letter-spacing: -1.2px;
}
.dark .auth-heading h1 {
color: #f9fafb;
}
.auth-heading > span {
display: block;
margin-top: 12px;
font-size: 19px;
line-height: 1.55;
color: #626262;
}
.dark .auth-heading > span {
color: #9ca3af;
}
.auth-form {
display: grid;
gap: 20px;
margin-top: 30px;
}
.auth-field {
display: grid;
gap: 8px;
}
.auth-field label {
font-size: 13px;
font-weight: 500;
color: #353535;
}
.dark .auth-field label {
color: #d1d5db;
}
.dark .auth-field input {
background-color: rgba(11, 13, 15, 0.85);
border-color: rgba(255, 255, 255, 0.12);
color: #f9fafb;
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.4);
transition:
border-color 0.15s ease,
box-shadow 0.15s ease;
}
.dark .auth-field input:hover {
border-color: rgba(255, 255, 255, 0.24);
}
.dark .auth-field input:focus-visible {
border-color: #3ecf8e;
box-shadow:
0 0 0 3px rgba(62, 207, 142, 0.2),
inset 0 1px 2px rgba(0, 0, 0, 0.4);
}
.auth-error {
margin: -4px 0 0;
padding: 10px 12px;
border: 1px solid #efcaca;
border-radius: 6px;
font-size: 12px;
line-height: 1.45;
color: #9f2f2f;
background: #fff6f6;
}
.dark .auth-error {
background: rgba(239, 68, 68, 0.12);
border-color: rgba(239, 68, 68, 0.28);
color: #fca5a5;
}
.auth-submit {
display: inline-flex;
align-items: center;
justify-content: center;
width: 100%;
min-height: 42px;
padding: 8px 16px;
border: 1px solid #35c586;
border-radius: 6px;
font-size: 14px;
font-weight: 600;
color: var(--ink);
background: var(--primary);
box-shadow:
0 1px 2px rgb(0 0 0 / 0.08),
inset 0 1px rgb(255 255 255 / 0.2);
cursor: pointer;
}
.auth-submit:hover:not(:disabled) {
background: #36c487;
transform: translateY(-1px);
}
.auth-submit:active:not(:disabled) {
background: var(--primary-deep);
transform: translateY(1px);
}
.auth-submit:disabled {
cursor: wait;
opacity: 0.62;
}
.dark .auth-submit {
background: #3ecf8e;
border-color: #3ecf8e;
color: #090a0c;
font-weight: 600;
box-shadow:
0 1px 2px rgba(0, 0, 0, 0.3),
0 4px 14px rgba(62, 207, 142, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.35);
transition: all 0.15s ease;
}
.dark .auth-submit:hover:not(:disabled) {
background: #4ae09e;
border-color: #4ae09e;
box-shadow:
0 4px 20px rgba(62, 207, 142, 0.45),
inset 0 1px 0 rgba(255, 255, 255, 0.4);
transform: translateY(-1px);
}
.dark .auth-submit:active:not(:disabled) {
background: #24b47e;
transform: translateY(1px);
}
.auth-footnote {
position: relative;
z-index: 1;
margin: 0;
font-size: 11px;
color: #858585;
}
.dark .auth-footnote {
color: #6b7280;
}
@media (max-width: 440px) {
.auth-page {
padding: 24px 16px;
}
.auth-card {
padding: 28px 22px;
}
.auth-heading h1 {
font-size: 27px;
}
}