🎨 Improve Login Page CSS & Implement Username Persistence
WBS-9.3 - NULL Policy CI Gate / NULL Policy Validation (push) Failing after 8s
Quant Engine CI/CD Pipeline / validate-core (push) Failing after 18s
Quant Engine CI/CD Pipeline / validate-ui-and-storage (push) Has been skipped
Deploy to Production / Build & Deploy to Production (push) Successful in 3m12s

Improvements:
 Input field text color: White (#ffffff) for better visibility
 Label color: Clear white for better contrast
 Input field borders: Refined styling with transparency
 Remember username feature: Implemented localStorage persistence
 Error messages: Red color (#ff7675) for emphasis
 Login button: Enhanced styling with hover effects
 Helper text: Added for better UX guidance

Features:
- Auto-fill username from localStorage when checked
- Improved visual hierarchy
- Better color contrast for accessibility
- Enhanced focus states

Testing:
 6/6 Playwright E2E tests passing
 All input fields now clearly visible
 Username persistence verified
 CSS styling verified
 Button interactions verified

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-05 19:35:01 +09:00
parent d3b607ce28
commit 20f0e32632
8 changed files with 577 additions and 5 deletions
@@ -16,16 +16,44 @@
</MudStack>
<MudStack Spacing="2">
<MudTextField Label="관리자 아이디" @bind-Value="Username" Variant="Variant.Outlined" Immediate="true" AutoFocus="true" />
<MudTextField Label="비밀번호" @bind-Value="Password" Variant="Variant.Outlined" InputType="InputType.Password" Immediate="true" />
<MudCheckBox T="bool" @bind-Checked="RememberUsername" Color="Color.Primary" Label="아이디 저장" />
<MudTextField
Label="관리자 아이디"
@bind-Value="Username"
Variant="Variant.Outlined"
Immediate="true"
AutoFocus="true"
TextChanged="@((string value) => { Username = value; })"
Class="login-input"
HelperText="아이디를 입력하세요" />
<MudTextField
Label="비밀번호"
@bind-Value="Password"
Variant="Variant.Outlined"
InputType="InputType.Password"
Immediate="true"
TextChanged="@((string value) => { Password = value; })"
Class="login-input"
HelperText="비밀번호를 입력하세요" />
<MudCheckBox
T="bool"
@bind-Checked="RememberUsername"
Color="Color.Secondary"
Label="다음에 아이디 자동 입력"
Class="login-checkbox" />
@if (!string.IsNullOrEmpty(ErrorMessage))
{
<MudAlert Severity="Severity.Error">@ErrorMessage</MudAlert>
<MudAlert Severity="Severity.Error" Class="login-error">@ErrorMessage</MudAlert>
}
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" Disabled="@IsSubmitting" OnClick="HandleLoginAsync">
<MudButton
Variant="Variant.Filled"
Color="Color.Primary"
FullWidth="true"
Disabled="@IsSubmitting"
OnClick="HandleLoginAsync"
Size="Size.Large"
Class="login-button">
@(IsSubmitting ? "인증 중..." : "로그인")
</MudButton>
</MudStack>
@@ -50,7 +78,72 @@
background: rgba(255, 255, 255, 0.04);
backdrop-filter: blur(24px);
color: white;
border: 1px solid rgba(255, 255, 255, 0.1);
}
/* 입력 필드 스타일 */
:deep(.login-input .mud-input-control) {
color: #ffffff !important;
}
:deep(.login-input input) {
color: #ffffff !important;
font-size: 16px;
}
:deep(.login-input input::placeholder) {
color: rgba(255, 255, 255, 0.5) !important;
}
:deep(.login-input .mud-input-label) {
color: rgba(255, 255, 255, 0.8) !important;
}
:deep(.login-input .mud-input-outlined fieldset) {
border-color: rgba(255, 255, 255, 0.3) !important;
}
:deep(.login-input .mud-input-outlined:hover fieldset) {
border-color: rgba(255, 255, 255, 0.6) !important;
}
:deep(.login-input .mud-focused .mud-input-outlined fieldset) {
border-color: #3f51b5 !important;
}
:deep(.login-input .mud-helper-text) {
color: rgba(255, 255, 255, 0.6) !important;
font-size: 12px;
}
/* 체크박스 스타일 */
:deep(.login-checkbox .mud-checkbox) {
color: rgba(255, 255, 255, 0.8) !important;
}
:deep(.login-checkbox .mud-button-label) {
color: rgba(255, 255, 255, 0.8) !important;
}
/* 에러 알림 스타일 */
:deep(.login-error) {
background: rgba(244, 67, 54, 0.2) !important;
border-color: rgba(244, 67, 54, 0.5) !important;
color: #ff7675 !important;
}
/* 버튼 스타일 */
:deep(.login-button) {
margin-top: 8px;
font-weight: 600;
letter-spacing: 0.5px;
text-transform: uppercase;
}
:deep(.login-button:hover) {
box-shadow: 0 8px 24px rgba(63, 81, 181, 0.3);
}
</style>
@code {