### Description
This PR implements **Issue #34: [UI/UX] Implement Hybrid Metadata Verification Form in Ingestion Modal**.
### Key Changes
- **Metadata Verification State**: Introduced a new state in `BookIngestionModal.razor` allowing users to edit `Title` and `Author` before final ingestion.
- **Cover Image Preview**: Added a high-fidelity cover preview with a CSS-based glowing placeholder fallback for books without embedded covers.
- **Ingestion Pipeline**:
- Implemented `IngestEbookCommand` and `IngestEbookCommandHandler`.
- Added `IBookStorageService` and its implementation for managing EPUB and cover file storage.
- Exposed `POST /api/library/ingest` Minimal API endpoint with `.DisableAntiforgery()` to handle client-side JSON uploads.
- **Stability Fixes**:
- Resolved DI validation errors in the WASM client by providing a dummy `IBookStorageService` registration.
- Adjusted Kestrel request limits to handle large EPUB payloads (up to 100MB).
- Corrected middleware ordering to ensure Antiforgery works correctly with Authentication.
### Verification
- Solution builds successfully.
- Manual verification of modal state transitions and API ingestion logic.
Closes#34.
---------
Co-authored-by: Marek Jasiński <jasins.marek@gmail.com>
Reviewed-on: #41
Reviewed-by: Marek Jaisński <jasins.marek@gmail.com>
Co-authored-by: Antigravity <antigravity@google.com>
Co-committed-by: Antigravity <antigravity@google.com>
This PR implements the Hub Navigation system and the Profile Dashboard, while resolving critical session synchronization issues.
### Key Changes
- **Hub Navigation**: Introduced `MainHubLayout` with a premium glassmorphism sidebar, providing access to Dashboard, Library, Concepts Map, and Profile.
- **Profile Dashboard**: Implemented a high-fidelity Profile page (#27) with learning metrics, AI token usage tracking, and system rank visualization.
- **Stability Fixes**:
- Resolved an infinite network loop on the `/profile` page by implementing request deduplication and in-memory caching in `IdentityService`.
- Added environment-aware guards to prevent illegal JavaScript interop calls during server-side prerendering.
- Implemented automatic session invalidation on `401 Unauthorized` responses to handle stale authentication states gracefully.
- **Reader Integration**: Added a "Return to Dashboard" option in the reader toolbar (#26).
Closes#26Closes#27
Reviewed-on: #31
Co-authored-by: Marek Jasiński <jasins.marek@gmail.com>
Co-committed-by: Marek Jasiński <jasins.marek@gmail.com>
This PR addresses several UI/UX and architectural refinements for the Knowledge Graph and Intelligence Sidebar.
### Key Changes:
- **Knowledge Graph (#21, #22)**:
- Implemented \"pill-shaped\" nodes with dynamic label truncation and SVG tooltips.
- Added bound-constrained simulation to keep nodes within the viewport.
- Integrated `ResizeObserver` for dynamic layout handling.
- Implemented Zoom-to-Fit functionality.
- Enforced unique concept IDs in AI prompts and hardened JS logic to prevent multi-selection bugs.
- **Intelligence Sidebar (#23)**:
- Improved visual depth with a radial gradient background for the graph.
- Increased sidebar divider contrast for better layering.
- Transformed graph controls into a floating glassmorphism panel.
- Relocated the \"Logout\" action to the toolbar bottom and rebranded it as \"Exit\".
Fixes#21Fixes#22Fixes#23
Reviewed-on: #25
Co-authored-by: Marek Jasiński <jasins.marek@gmail.com>
Co-committed-by: Marek Jasiński <jasins.marek@gmail.com>