From e42546d82fcb4c8c3e9483058b6f70465c9678bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Jasi=C5=84ski?= Date: Wed, 27 May 2026 09:36:02 +0200 Subject: [PATCH 1/4] feat(ui): implement premium mobile-first reader layout with three-tab bottom navigation and assistant FAB --- .../Components/Organisms/ReaderCanvas.razor | 31 ++ .../Layout/MainHubLayout.razor | 50 ++- .../Layout/MainHubLayout.razor.css | 153 +++++++++ .../Layout/ReaderLayout.razor | 325 +++++++++++++----- .../Layout/ReaderLayout.razor.css | 282 +++++++++++++++ .../Pages/Dashboard.razor.css | 78 +++++ .../Services/IReaderInteractionService.cs | 2 + .../Services/ReaderInteractionService.cs | 6 + .../wwwroot/js/knowledgeGraph.js | 131 ++++++- 9 files changed, 947 insertions(+), 111 deletions(-) diff --git a/src/NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor b/src/NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor index 066e336..561ef90 100644 --- a/src/NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor +++ b/src/NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor @@ -13,6 +13,8 @@ @inject IReaderInteractionService InteractionService @inject ISyncService SyncService @inject AuthenticationStateProvider AuthStateProvider +@inject IQuizStateService QuizService +@inject IPlatformService PlatformService @inject ILogger Logger
@@ -53,6 +55,17 @@ BlockId="@_selectedBlockId" Coordinates="@_selectionCoords" FullPageContent="@GetFullPageContent()" /> + + @if (_isMobile) + { + + }
@code { @@ -68,17 +81,29 @@ private ElementReference _containerRef; private bool _isInteractive; private string? _currentActiveBlockId; + private bool _isMobile = false; protected override async Task OnInitializedAsync() { await Coordinator.ClearAsync(); ThemeService.OnThemeChanged += HandleUpdate; NavigationService.OnNavigationChanged += OnNavigationChanged; + QuizService.OnQuizUpdated += HandleUpdate; InteractionService.OnScrollToBlockRequested += HandleScrollRequested; InteractionService.OnHighlightBlockRequested += HandleHighlightRequested; InteractionService.OnTextSelected += HandleTextSelected; SyncService.OnProgressReceived += HandleSyncProgressReceived; + + var context = PlatformService.GetDeviceContext(); + if (context.IsSuccess) + { + _isMobile = context.Value.DeviceType switch + { + DeviceType.Phone or DeviceType.Tablet => true, + _ => false + }; + } } protected override async Task OnParametersSetAsync() @@ -286,10 +311,16 @@ private Task HandleUpdate() => InvokeAsync(StateHasChanged); + private async Task HandleAssistantFabClick() + { + await InteractionService.RequestAssistant(); + } + public void Dispose() { ThemeService.OnThemeChanged -= HandleUpdate; NavigationService.OnNavigationChanged -= OnNavigationChanged; + QuizService.OnQuizUpdated -= HandleUpdate; InteractionService.OnScrollToBlockRequested -= HandleScrollRequested; InteractionService.OnHighlightBlockRequested -= HandleHighlightRequested; diff --git a/src/NexusReader.UI.Shared/Layout/MainHubLayout.razor b/src/NexusReader.UI.Shared/Layout/MainHubLayout.razor index 70d012c..d64c15e 100644 --- a/src/NexusReader.UI.Shared/Layout/MainHubLayout.razor +++ b/src/NexusReader.UI.Shared/Layout/MainHubLayout.razor @@ -4,9 +4,31 @@ @using NexusReader.Application.Abstractions.Services @using NexusReader.UI.Shared.Services -
+
+ +
+ + +
+
+ @context.User.Identity?.Name?[0].ToString().ToUpper() +
+
+
+ + + @if (_isMobileMenuOpen) + { +
+ } +