diff --git a/src/dotnet/QuantEngine.Web/Client/Layout/AuthLayout.razor b/src/dotnet/QuantEngine.Web/Client/Layout/AuthLayout.razor
index 1314d79..45fe096 100644
--- a/src/dotnet/QuantEngine.Web/Client/Layout/AuthLayout.razor
+++ b/src/dotnet/QuantEngine.Web/Client/Layout/AuthLayout.razor
@@ -1,4 +1,12 @@
@inherits LayoutComponentBase
+@using QuantEngine.Web.Client.Theme
+@rendermode InteractiveWebAssembly
+
+
+
+
+
+
κ΄λ¦¬μ λμ보λ
diff --git a/src/dotnet/QuantEngine.Web/Client/Pages/Login.razor b/src/dotnet/QuantEngine.Web/Client/Pages/Login.razor
deleted file mode 100644
index f9ea825..0000000
--- a/src/dotnet/QuantEngine.Web/Client/Pages/Login.razor
+++ /dev/null
@@ -1,217 +0,0 @@
-@page "/login"
-@attribute [AllowAnonymous]
-@layout AuthLayout
-@inject AuthenticationStateProvider AuthStateProvider
-@inject NavigationManager NavigationManager
-@inject HttpClient Http
-
-
λ‘κ·ΈμΈ - QuantEngine
-
-
-
-
- Q
- QuantEngine
- μν΄μμ°ν¬νΈν΄λ¦¬μ€ ν¬μ κ΄λ¦¬ μμ€ν
-
-
-
-
-
-
-
- @if (!string.IsNullOrEmpty(ErrorMessage))
- {
- @ErrorMessage
- }
-
-
- @(IsSubmitting ? "μΈμ¦ μ€..." : "λ‘κ·ΈμΈ")
-
-
-
-
-
-
-
-@code {
- private string Username { get; set; } = string.Empty;
- private string Password { get; set; } = string.Empty;
- private string ErrorMessage { get; set; } = string.Empty;
- private bool IsSubmitting { get; set; } = false;
- private bool RememberUsername { get; set; } = true;
-
- protected override async Task OnInitializedAsync()
- {
- var customProvider = (CustomAuthenticationStateProvider)AuthStateProvider;
- var remembered = await customProvider.GetRememberedUsernameAsync();
- if (!string.IsNullOrWhiteSpace(remembered))
- {
- Username = remembered;
- RememberUsername = true;
- }
- }
-
- private sealed class LoginResponse
- {
- public bool Success { get; set; }
- public string? Username { get; set; }
- public string? Role { get; set; }
- public string? AccessToken { get; set; }
- public string? ExpiresAt { get; set; }
- }
-
- private async Task HandleLoginAsync()
- {
- ErrorMessage = string.Empty;
- if (string.IsNullOrWhiteSpace(Username) || string.IsNullOrWhiteSpace(Password))
- {
- ErrorMessage = "μμ΄λμ λΉλ°λ²νΈλ₯Ό λͺ¨λ μ
λ ₯ν΄ μ£ΌμΈμ.";
- return;
- }
-
- IsSubmitting = true;
-
- try
- {
- var response = await Http.PostAsJsonAsync("api/auth/login", new { Username, Password });
- if (response.IsSuccessStatusCode)
- {
- var auth = await response.Content.ReadFromJsonAsync
();
- if (auth is null || string.IsNullOrWhiteSpace(auth.AccessToken))
- {
- ErrorMessage = "λ‘κ·ΈμΈ μλ΅μ΄ μ ν¨νμ§ μμ΅λλ€.";
- return;
- }
-
- var customProvider = (CustomAuthenticationStateProvider)AuthStateProvider;
- await customProvider.MarkUserAsAuthenticatedAsync(auth.Username ?? Username, auth.AccessToken, auth.Role ?? "Admin", RememberUsername);
- NavigationManager.NavigateTo("/dashboard");
- }
- else
- {
- ErrorMessage = "μμ΄λ λλ λΉλ°λ²νΈκ° μ¬λ°λ₯΄μ§ μμ΅λλ€.";
- }
- }
- catch (Exception ex)
- {
- ErrorMessage = $"λ‘κ·ΈμΈ μ€ μ€λ₯κ° λ°μνμ΅λλ€: {ex.Message}";
- }
- finally
- {
- IsSubmitting = false;
- }
- }
-}
diff --git a/src/dotnet/QuantEngine.Web/Client/Pages/NotFound.razor b/src/dotnet/QuantEngine.Web/Client/Pages/NotFound.razor
index 917ada1..f72e0e1 100644
--- a/src/dotnet/QuantEngine.Web/Client/Pages/NotFound.razor
+++ b/src/dotnet/QuantEngine.Web/Client/Pages/NotFound.razor
@@ -1,5 +1,8 @@
ο»Ώ@page "/not-found"
@layout MainLayout
+
+NOTFOUND_RENDERING_ACTIVE
+
Not Found
Sorry, the content you are looking for does not exist.
\ No newline at end of file
diff --git a/src/dotnet/QuantEngine.Web/Client/Program.cs b/src/dotnet/QuantEngine.Web/Client/Program.cs
index 17c8629..a5b93e1 100644
--- a/src/dotnet/QuantEngine.Web/Client/Program.cs
+++ b/src/dotnet/QuantEngine.Web/Client/Program.cs
@@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Microsoft.AspNetCore.Components.Authorization;
using QuantEngine.Web.Client.Services;
using QuantEngine.Web.Client.Infrastructure;
+using MudBlazor.Services;
var builder = WebAssemblyHostBuilder.CreateDefault(args);
@@ -16,6 +17,9 @@ builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddScoped();
+// MudBlazor Services (CRITICAL: Required for Interactive WebAssembly)
+builder.Services.AddMudServices();
+
// HttpClient register (API-First standard)
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
diff --git a/src/dotnet/QuantEngine.Web/Client/QuantEngine.Web.Client.csproj b/src/dotnet/QuantEngine.Web/Client/QuantEngine.Web.Client.csproj
index be0cf34..50bdd44 100644
--- a/src/dotnet/QuantEngine.Web/Client/QuantEngine.Web.Client.csproj
+++ b/src/dotnet/QuantEngine.Web/Client/QuantEngine.Web.Client.csproj
@@ -14,8 +14,8 @@
-
-
+
+
diff --git a/src/dotnet/QuantEngine.Web/Components/App.razor b/src/dotnet/QuantEngine.Web/Components/App.razor
index b229e94..f600a15 100644
--- a/src/dotnet/QuantEngine.Web/Components/App.razor
+++ b/src/dotnet/QuantEngine.Web/Components/App.razor
@@ -1,7 +1,5 @@
@using System.Reflection
-@using QuantEngine.Web.Client.Theme
@using QuantEngine.Web.Client.Pages
-@using QuantEngine.Web.Client.Layout
@@ -10,58 +8,25 @@
-
+
-
-
-
+
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
-
-@code {
- private MudTheme _theme = AppTheme.LightTheme;
-
- private static readonly Assembly[] AdditionalAssemblies = new[]
- {
- typeof(Dashboard).Assembly,
- };
-
- protected override void OnInitialized()
- {
- _theme = AppTheme.LightTheme;
- }
-}