@page "/login" @layout LoginLayout @* Login MUST stay anonymously reachable — otherwise the fallback authorization policy would lock operators out of the only way in (Admin-001). Static-rendered on purpose: the form POSTs to /auth/login while ASP.NET still owns an unstarted HTTP response. Calling SignInAsync from an interactive circuit would be too late. Uses LoginLayout (no side rail) so the page renders as a clean centred card. The card itself is the shared kit's — it owns the .login-wrap centring wrapper, the .panel shell, and the static form-POST (username/password/returnUrl). *@ @attribute [Microsoft.AspNetCore.Authorization.AllowAnonymous] @code { /// Error message surfaced by /auth/login after a failed bind. [SupplyParameterFromQuery] private string? Error { get; set; } /// Original protected URL the operator was bounced from; round-tripped to the endpoint. [SupplyParameterFromQuery] private string? ReturnUrl { get; set; } }