Phase 1.1-1.2: Enhance MainLayout & AuthLayout with MudBlazor
WBS-9.3 - NULL Policy CI Gate / NULL Policy Validation (push) Failing after 4s

Phase 1.1: MainLayout Improvements
 Responsive sidebar with mobile toggle (MudDrawer)
 Enhanced top navigation (AppBar with icons)
 Dark mode toggle with persistence
 User profile menu (MudMenu with logout)
 Improved theme switching

Features:
- MudThemeProvider integration for dark/light mode
- User avatar with initials
- Profile, Settings, and Logout options in dropdown menu
- Responsive navbar (hidden on mobile, visible on desktop)
- Drawer footer with version info
- Enhanced CSS with smooth transitions

Phase 1.2: AuthLayout Complete Redesign
 Two-panel layout (branding + auth content)
 Left panel with QuantEngine branding and features
 Right panel for login/register/password recovery
 Mobile responsive design
 Dark mode support with smooth transitions

Features:
- Hero branding panel with feature list
- Feature icons (CheckCircle animations)
- Responsive grid (left panel hidden on mobile)
- Dark mode theme toggle
- Footer with legal links
- Floating animation on logo
- Mobile header with theme toggle
- Accessibility support (prefers-reduced-motion)

Styling Enhancements:
- Modern gradient backgrounds
- Smooth transitions and animations
- Dark mode color schemes
- Responsive breakpoints
- Material Design principles

Files Modified:
- src/dotnet/QuantEngine.Web/Client/Layout/MainLayout.razor
- src/dotnet/QuantEngine.Web/Client/Layout/MainLayout.razor.css
- src/dotnet/QuantEngine.Web/Client/Layout/AuthLayout.razor
- src/dotnet/QuantEngine.Web/Client/Layout/AuthLayout.razor.css (new)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-05 16:13:22 +09:00
parent 98470ad184
commit 736addef70
4 changed files with 542 additions and 79 deletions
@@ -1,3 +1,98 @@
@inherits LayoutComponentBase
@inject MudThemeProvider MudThemeProvider
@Body
<MudThemeProvider @ref="mudThemeProvider" @bind-IsDarkMode="@isDarkMode" />
<div class="auth-container">
<!-- Left Panel - Branding -->
<MudHidden Breakpoint="Breakpoint.SmAndDown" Invert="true" Class="auth-left-panel">
<div class="auth-branding">
<div class="auth-logo">
<MudIcon Icon="@Icons.Material.Filled.AnalyticsFill" Size="Size.Large" />
</div>
<MudText Typo="Typo.h3" Class="auth-title">
QuantEngine
</MudText>
<MudText Typo="Typo.body1" Class="auth-subtitle">
퇴직 자산 포트폴리오 관리 시스템
</MudText>
<div class="auth-features mt-8">
<div class="auth-feature">
<MudIcon Icon="@Icons.Material.Filled.CheckCircle" />
<MudText Typo="Typo.body2">실시간 자산 모니터링</MudText>
</div>
<div class="auth-feature">
<MudIcon Icon="@Icons.Material.Filled.CheckCircle" />
<MudText Typo="Typo.body2">AI 기반 분석</MudText>
</div>
<div class="auth-feature">
<MudIcon Icon="@Icons.Material.Filled.CheckCircle" />
<MudText Typo="Typo.body2">종합 보고서</MudText>
</div>
</div>
</div>
<!-- Dark Mode Toggle -->
<div class="auth-theme-toggle">
<MudIconButton Icon="@(isDarkMode ? Icons.Material.Filled.Brightness4 : Icons.Material.Filled.Brightness7)"
Color="Color.Inherit"
OnClick="ToggleDarkMode"
Title="@(isDarkMode ? "라이트 모드" : "다크 모드")"
Size="Size.Large" />
</div>
</MudHidden>
<!-- Right Panel - Auth Content -->
<div class="auth-right-panel">
<!-- Mobile Header -->
<MudHidden Breakpoint="Breakpoint.MdAndUp" Invert="true">
<div class="auth-mobile-header">
<MudText Typo="Typo.h5" Class="d-flex align-center">
<MudIcon Icon="@Icons.Material.Filled.AnalyticsFill" Size="Size.Medium" Class="mr-2" />
QuantEngine
</MudText>
<MudIconButton Icon="@(isDarkMode ? Icons.Material.Filled.Brightness4 : Icons.Material.Filled.Brightness7)"
Color="Color.Inherit"
OnClick="ToggleDarkMode"
Title="@(isDarkMode ? "라이트 모드" : "다크 모드")" />
</div>
</MudHidden>
<!-- Content -->
<div class="auth-content">
@Body
</div>
<!-- Footer -->
<div class="auth-footer">
<MudText Typo="Typo.caption" Class="auth-footer-text">
© 2026 QuantEngine. 모든 권리 예약.
</MudText>
<div class="auth-footer-links">
<MudLink Href="/" Typo="Typo.caption">서비스 약관</MudLink>
<MudText Typo="Typo.caption">·</MudText>
<MudLink Href="/" Typo="Typo.caption">개인정보 처리방침</MudLink>
</div>
</div>
</div>
</div>
@code {
private MudThemeProvider mudThemeProvider = default!;
private bool isDarkMode = false;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
isDarkMode = await mudThemeProvider.GetDarkModeAsync() ?? false;
StateHasChanged();
}
}
private async Task ToggleDarkMode()
{
isDarkMode = !isDarkMode;
await mudThemeProvider.SetDarkModeAsync(isDarkMode);
}
}