# Project Architecture The IGP Fan Reference is structured as a modular .NET solution, separating concerns between data models, business logic, and UI components. ## Solution Structure - **IGP**: The main Blazor WebAssembly project. Contains pages, portals, and application-specific logic. - **Model**: Domain models and data structures. It is a shared library used by the Services and the main app. - `Model.BuildOrders`: Logic for build order sequences. - `Model.Entity`: Unit and building definitions. - `Model.Website`: Models for UI state and navigation. - **Services**: Contains the core business logic. - `Services.Immortal`: Game-specific logic (Economy, Timings, Unit stats). - `Services.Website`: Infrastructure services (Navigation, Storage, Search, Dialogs). - **Components**: A shared library for reusable Razor components used across different pages. - **TestAutomation**: E2E tests using Playwright to ensure feature stability. ## Dependency Injection Services are registered in `Program.cs` and injected into components using `@inject`. Most services are registered as `Scoped`, which in Blazor WASM behaves like a singleton for the duration of the user session. ## State Management - **Blazored.LocalStorage**: Used to persist user settings and data (e.g., custom build orders, preferences) across sessions. - **In-Memory Services**: Services like `StorageService` and `ImmortalSelectionService` maintain the active state during the application's runtime. ## UI & Layout The app uses **MudBlazor** for its component library, providing a consistent Material Design look and feel. - `App.razor`: The entry point for the Blazor app, handles routing and global portals. - `PageLayout.razor`: Defines the main layout, including the AppBar, Drawer (for mobile), and main content area. - **Portals**: Components like `EntityDialogPortal` are placed at the root level to allow global access to common dialogs via services.