From 9ac2c9182a19caf0c581c89fde4ea6c727ccf931 Mon Sep 17 00:00:00 2001 From: daniel-c-harvey Date: Fri, 12 Sep 2025 20:37:17 -0400 Subject: [PATCH] Player Client and Visual Enhancements - Redesigned audio player bar to be mobile-friendly - Added unloading for track switching (needs to be fixed) - Added IsLoading status so loading spinner isn't hanging around when it shouldn't be - Normalized styles with scoped files (will further reduce) - Layout Cleanup - EF fixes (migrations now function for deployment) - deploy script updates (new dedicated host) --- .../Controls/AudioPlayerBar.razor | 87 ------------ .../AudioPlayerBar/AudioPlayerBar.razor | 114 +++++++++++++++ .../AudioPlayerBar.razor.cs | 42 ++++-- .../AudioPlayerBar.razor.css | 24 ++-- .../AudioPlayerBar/AudioPlayerBar2.razor | 103 ++++++++++++++ .../AudioPlayerBar/AudioPlayerBar2.razor.cs | 93 +++++++++++++ .../AudioPlayerBar/AudioPlayerBar2.razor.css | 131 ++++++++++++++++++ .../AudioPlayerBar/PlayerControls.razor | 12 ++ .../AudioPlayerBar/PlayerControls.razor.cs | 16 +++ .../AudioPlayerBar/PlayerControls.razor.css | 8 ++ .../AudioPlayerBar/TimestampLabel.razor | 5 + .../AudioPlayerBar/TimestampLabel.razor.cs | 14 ++ .../AudioPlayerBar/TimestampLabel.razor.css | 12 ++ .../AudioPlayerBar/VolumeControls.razor | 10 ++ .../AudioPlayerBar/VolumeControls.razor.cs | 16 +++ .../AudioPlayerBar/VolumeControls.razor.css | 19 +++ DeepDrftWeb.Client/Layout/MainLayout.razor | 7 +- DeepDrftWeb.Client/Pages/TracksView.razor | 21 ++- DeepDrftWeb.Client/Pages/TracksView.razor.cs | 2 +- .../Services/AudioInteropService.cs | 5 + .../Services/AudioPlaybackEngine.cs | 75 +++++++++- DeepDrftWeb.Client/Services/IPlayerService.cs | 4 + DeepDrftWeb.Client/Services/PlayerService.cs | 20 ++- .../Data/DeepDrftContextFactory.cs | 15 ++ .../DeepDrftWeb.Services.csproj | 4 + DeepDrftWeb/DeepDrftWeb.csproj | 6 +- DeepDrftWeb/Interop/webaudio.ts | 48 +++---- DeepDrftWeb/tsconfig.json | 14 +- .../wwwroot/styles/deepdrft-styles.css | 1 + dch5-publish-cli.sh | 4 +- dch5-publish-deploy.sh | 10 +- 31 files changed, 763 insertions(+), 179 deletions(-) delete mode 100644 DeepDrftWeb.Client/Controls/AudioPlayerBar.razor create mode 100644 DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor rename DeepDrftWeb.Client/Controls/{ => AudioPlayerBar}/AudioPlayerBar.razor.cs (77%) rename DeepDrftWeb.Client/Controls/{ => AudioPlayerBar}/AudioPlayerBar.razor.css (86%) create mode 100644 DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar2.razor create mode 100644 DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar2.razor.cs create mode 100644 DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar2.razor.css create mode 100644 DeepDrftWeb.Client/Controls/AudioPlayerBar/PlayerControls.razor create mode 100644 DeepDrftWeb.Client/Controls/AudioPlayerBar/PlayerControls.razor.cs create mode 100644 DeepDrftWeb.Client/Controls/AudioPlayerBar/PlayerControls.razor.css create mode 100644 DeepDrftWeb.Client/Controls/AudioPlayerBar/TimestampLabel.razor create mode 100644 DeepDrftWeb.Client/Controls/AudioPlayerBar/TimestampLabel.razor.cs create mode 100644 DeepDrftWeb.Client/Controls/AudioPlayerBar/TimestampLabel.razor.css create mode 100644 DeepDrftWeb.Client/Controls/AudioPlayerBar/VolumeControls.razor create mode 100644 DeepDrftWeb.Client/Controls/AudioPlayerBar/VolumeControls.razor.cs create mode 100644 DeepDrftWeb.Client/Controls/AudioPlayerBar/VolumeControls.razor.css create mode 100644 DeepDrftWeb.Services/Data/DeepDrftContextFactory.cs diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar.razor b/DeepDrftWeb.Client/Controls/AudioPlayerBar.razor deleted file mode 100644 index a746318..0000000 --- a/DeepDrftWeb.Client/Controls/AudioPlayerBar.razor +++ /dev/null @@ -1,87 +0,0 @@ -@if (_isMinimized) -{ -
- -
-} -else -{ - @* Full-width outer container *@ -
- -
-
- - @* Controls section *@ -
-
- - @if (IsLoaded) - { - - } -
- -
- - @FormatTime(CurrentTime) / @(Duration.HasValue ? FormatTime(Duration.Value) : "--:--") - - @if (!IsLoaded) - { - - } -
-
- - @* Seek slider *@ - - - @* Volume section *@ -
- - -
-
- -
-
- - @if (!string.IsNullOrEmpty(ErrorMessage)) - { - - @ErrorMessage - - } -
-
-
- - @* Spacer div to maintain layout spacing *@ -
-} diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor b/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor new file mode 100644 index 0000000..9c0dafd --- /dev/null +++ b/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor @@ -0,0 +1,114 @@ +@if (_isMinimized) +{ +
+ +
+} +else +{ + @* Full-width outer container *@ +
+ +
+ @* Full Screen *@ +
+
+
+ + + @if (!IsLoaded) + { + + } +
+ +
+ + @* Seek slider *@ + + +
+ +
+
+ + @* Mobile *@ +
+
+
+ + + + + @if (!IsLoaded) + { + + } +
+ +
+ + @* Seek slider *@ + +
+ +
+ + +
+
+ + + + @if (!string.IsNullOrEmpty(ErrorMessage)) + { + + @ErrorMessage + + } + +
+
+ + @* Spacer div to maintain layout spacing *@ +
+} diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar.razor.cs b/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor.cs similarity index 77% rename from DeepDrftWeb.Client/Controls/AudioPlayerBar.razor.cs rename to DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor.cs index ff1688c..9877e40 100644 --- a/DeepDrftWeb.Client/Controls/AudioPlayerBar.razor.cs +++ b/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor.cs @@ -1,10 +1,8 @@ -using DeepDrftModels.Entities; -using DeepDrftWeb.Client.Clients; +using DeepDrftWeb.Client.Services; using Microsoft.AspNetCore.Components; -using DeepDrftWeb.Client.Services; using MudBlazor; -namespace DeepDrftWeb.Client.Controls; +namespace DeepDrftWeb.Client.Controls.AudioPlayerBar; public partial class AudioPlayerBar : ComponentBase { @@ -24,22 +22,18 @@ public partial class AudioPlayerBar : ComponentBase protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); - PlayerService.OnStateChanged += StateHasChanged; + PlayerService.OnTrackSelected += Expand; } - private string GetPlayIcon() + private async Task Expand() { - return IsPlaying ? Icons.Material.Filled.Pause : Icons.Material.Filled.PlayArrow; + if (_isMinimized) + { + _isMinimized = false; + StateHasChanged(); + } } - - private string GetVolumeIcon() - { - if (Volume == 0) return Icons.Material.Filled.VolumeOff; - if (Volume < 0.5) return Icons.Material.Filled.VolumeDown; - return Icons.Material.Filled.VolumeUp; - } - private static string FormatTime(double seconds) { var timeSpan = TimeSpan.FromSeconds(seconds); @@ -76,5 +70,23 @@ public partial class AudioPlayerBar : ComponentBase _isMinimized = !_isMinimized; StateHasChanged(); } + + private async Task Close() + { + if (PlayerService.IsLoaded) + { + await PlayerService.Unload(); + } + + if (!_isMinimized) + { + _isMinimized = true; + StateHasChanged(); + } + } + private string GetPlayIcon() + { + return IsPlaying ? Icons.Material.Filled.Pause : Icons.Material.Filled.PlayArrow; + } } \ No newline at end of file diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar.razor.css b/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor.css similarity index 86% rename from DeepDrftWeb.Client/Controls/AudioPlayerBar.razor.css rename to DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor.css index 36bf92e..a6737bf 100644 --- a/DeepDrftWeb.Client/Controls/AudioPlayerBar.razor.css +++ b/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor.css @@ -22,14 +22,15 @@ /* Player bar with rounded corners and semi-opaque background */ .deepdrft-audio-player-bar { position: relative; - background: rgba(var(--mud-palette-surface-rgb), 0.75); - backdrop-filter: blur(12px); - -webkit-backdrop-filter: blur(12px); + background: var(--deepdrft-theme-background-gray); + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); border-radius: 1rem; - border: 1px solid rgba(var(--mud-palette-divider-rgb), 0.9); - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); + border: 1px solid var(--deepdrft-theme-primary); + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4), + 0 2px 10px var(--deepdrft-theme-secondary); transition: all 0.3s ease; - color: var(--mud-palette-text-primary); + color: #ffffff; overflow: hidden; margin-bottom: 1rem; } @@ -54,13 +55,13 @@ justify-content: center; align-items: center; background: linear-gradient(135deg, - rgba(var(--mud-palette-primary-rgb), 0.95) 0%, - rgba(var(--mud-palette-secondary-rgb), 0.9) 50%, - rgba(var(--mud-palette-tertiary-rgb), 0.95) 100% + var(--deepdrft-theme-primary) 0%, + var(--deepdrft-theme-secondary) 50%, + var(--deepdrft-theme-tertiary) 100% ); backdrop-filter: blur(15px); - border: 2px solid rgba(var(--mud-palette-secondary-rgb), 0.7); - box-shadow: 0 4px 20px rgba(var(--mud-palette-primary-rgb), 0.6), + border: 2px solid var(--deepdrft-theme-secondary); + box-shadow: 0 4px 20px var(--deepdrft-theme-primary), 0 2px 10px rgba(0, 0, 0, 0.3); transition: all 0.3s ease; cursor: pointer; @@ -109,6 +110,7 @@ align-items: center; gap: 0.75rem; margin-top: 0.25rem; + justify-items: center; } .deepdrft-audio-volume-section { diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar2.razor b/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar2.razor new file mode 100644 index 0000000..e52e1f3 --- /dev/null +++ b/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar2.razor @@ -0,0 +1,103 @@ +@if (_isMinimized) +{ +
+ +
+} +else +{ +
+ +
+ + @* Desktop Layout *@ +
+
+
+ + +
+ +
+ +
+ +
+ +
+ +
+
+ + @* Mobile Layout *@ +
+
+
+ + @if (IsLoading) + { + + } +
+ + +
+ + +
+ + @* Control Buttons - positioned absolutely like original *@ +
+ + +
+
+
+ + @if (!string.IsNullOrEmpty(ErrorMessage)) + { + + @ErrorMessage + + } +
+ + @* Spacer to prevent content overlap *@ +
+} \ No newline at end of file diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar2.razor.cs b/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar2.razor.cs new file mode 100644 index 0000000..02cdd55 --- /dev/null +++ b/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar2.razor.cs @@ -0,0 +1,93 @@ +using DeepDrftWeb.Client.Services; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace DeepDrftWeb.Client.Controls.AudioPlayerBar; + +public partial class AudioPlayerBar2 : ComponentBase +{ + [CascadingParameter] public required IPlayerService PlayerService { get; set; } + [Parameter] public bool ShowLoadProgress { get; set; } = true; + private bool _isMinimized = true; + + private bool IsLoaded => PlayerService.IsLoaded; + private bool IsLoading => PlayerService.IsLoading; + private bool IsPlaying => PlayerService.IsPlaying; + private bool IsPaused => PlayerService.IsPaused; + private double CurrentTime => PlayerService.CurrentTime; + private double? Duration => PlayerService.Duration; + private double Volume => PlayerService.Volume; + private double LoadProgress => PlayerService.LoadProgress; + private string? ErrorMessage => PlayerService.ErrorMessage; + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + PlayerService.OnStateChanged += StateHasChanged; + PlayerService.OnTrackSelected += Expand; + } + + private async Task Expand() + { + if (_isMinimized) + { + _isMinimized = false; + StateHasChanged(); + } + } + private static string FormatTime(double seconds) + { + var timeSpan = TimeSpan.FromSeconds(seconds); + return timeSpan.ToString(timeSpan.TotalHours >= 1 ? @"h\:mm\:ss" : @"m\:ss"); + } + + private async Task TogglePlayPause() + { + await PlayerService.TogglePlayPause(); + } + + private async Task Stop() + { + await PlayerService.Stop(); + } + + private async Task OnSeek(double position) + { + await PlayerService.Seek(position); + } + + private async Task OnVolumeChange(double volume) + { + await PlayerService.SetVolume(volume); + } + + private void ClearError() + { + PlayerService.ClearError(); + } + + private void ToggleMinimized() + { + _isMinimized = !_isMinimized; + StateHasChanged(); + } + + private async Task Close() + { + if (PlayerService.IsLoaded) + { + await PlayerService.Unload(); + } + + if (!_isMinimized) + { + _isMinimized = true; + StateHasChanged(); + } + } + + private string GetPlayIcon() + { + return IsPlaying ? Icons.Material.Filled.Pause : Icons.Material.Filled.PlayArrow; + } +} \ No newline at end of file diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar2.razor.css b/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar2.razor.css new file mode 100644 index 0000000..c7da143 --- /dev/null +++ b/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar2.razor.css @@ -0,0 +1,131 @@ +/* Preserve key visual styles while simplifying layout */ + +/* Player outer container - fixed positioning */ +.player-outer-container { + position: fixed; + bottom: 0; + left: 0; + right: 0; + z-index: 1200; + padding: 0; + margin: 0; +} + +/* Player inner container */ +.player-inner-container { + padding: 1rem; + padding-bottom: 1.5rem; +} + +/* Custom backdrop blur container */ +.player-backdrop { + position: relative; + background: var(--deepdrft-theme-background-gray); + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + border-radius: 1rem; + border: 1px solid var(--deepdrft-theme-primary); + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4), + 0 2px 10px var(--deepdrft-theme-secondary); + color: #ffffff; + transition: all 0.3s ease; + overflow: hidden; + margin-bottom: 1rem; +} + +/* Control buttons positioning */ +.player-controls { + position: absolute; + top: 0.5rem; + right: 0.5rem; +} + +/* Minimized floating dock with gradient */ +.minimized-dock { + position: fixed; + bottom: 60px; + right: 60px; + z-index: 1300; + width: 60px; + height: 60px; + border-radius: 50%; + cursor: pointer; + background: linear-gradient(135deg, + var(--deepdrft-theme-primary) 0%, + var(--deepdrft-theme-secondary) 50%, + var(--deepdrft-theme-tertiary) 100% + ); + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + border: 2px solid var(--deepdrft-theme-secondary); + box-shadow: 0 4px 20px var(--deepdrft-theme-primary), + 0 2px 10px rgba(0, 0, 0, 0.3); + transition: all 0.3s ease; +} + +.minimized-dock:hover { + transform: scale(1.1); + box-shadow: 0 6px 25px rgba(var(--deepdrft-theme-primary), 0.8), + 0 3px 15px rgba(0, 0, 0, 0.4); +} + +/* Minimized button styles */ +.minimized-button { + border-radius: 50% !important; + background: transparent !important; + color: white !important; + transition: all 0.3s ease !important; + box-shadow: none !important; + border: none !important; + width: 48px !important; + height: 48px !important; +} + +/* Spacer to prevent content overlap */ +.player-spacer { + height: 140px; + width: 100%; + flex-shrink: 0; +} + +/* Essential layout adjustments only */ +.controls-left { + min-width: 200px; +} + +.seekbar-flex { + flex: 1; +} + +.volume-right { + /*min-width: 140px;*/ +} + +/* Mobile responsive adjustments */ +@media (max-width: 768px) { + .minimized-dock { + bottom: 15px; + right: 15px; + width: 56px; + height: 56px; + } + + .minimized-button { + width: 44px !important; + height: 44px !important; + } + + .player-inner-container { + padding: 0.75rem; + padding-bottom: 1.25rem; + } + + .player-backdrop { + border-radius: 1rem; + margin-bottom: 1.25rem; + } + + .player-spacer { + height: 160px; + } +} \ No newline at end of file diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar/PlayerControls.razor b/DeepDrftWeb.Client/Controls/AudioPlayerBar/PlayerControls.razor new file mode 100644 index 0000000..8c841ce --- /dev/null +++ b/DeepDrftWeb.Client/Controls/AudioPlayerBar/PlayerControls.razor @@ -0,0 +1,12 @@ +
+ + +
\ No newline at end of file diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar/PlayerControls.razor.cs b/DeepDrftWeb.Client/Controls/AudioPlayerBar/PlayerControls.razor.cs new file mode 100644 index 0000000..400d93b --- /dev/null +++ b/DeepDrftWeb.Client/Controls/AudioPlayerBar/PlayerControls.razor.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace DeepDrftWeb.Client.Controls.AudioPlayerBar; + +public partial class PlayerControls : ComponentBase +{ + [Parameter] public required bool IsPlaying { get; set; } + [Parameter] public required bool IsLoaded { get; set; } + [Parameter] public required EventCallback TogglePlayPause { get; set; } + [Parameter] public required EventCallback Stop { get; set; } + private string GetPlayIcon() + { + return IsPlaying ? Icons.Material.Filled.Pause : Icons.Material.Filled.PlayArrow; + } +} \ No newline at end of file diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar/PlayerControls.razor.css b/DeepDrftWeb.Client/Controls/AudioPlayerBar/PlayerControls.razor.css new file mode 100644 index 0000000..70a2300 --- /dev/null +++ b/DeepDrftWeb.Client/Controls/AudioPlayerBar/PlayerControls.razor.css @@ -0,0 +1,8 @@ +/* PlayerControls Component Styles */ + +/* Button spacing and alignment */ +.player-buttons { + display: flex; + align-items: center; + gap: 0.5rem; +} \ No newline at end of file diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar/TimestampLabel.razor b/DeepDrftWeb.Client/Controls/AudioPlayerBar/TimestampLabel.razor new file mode 100644 index 0000000..23e4fe8 --- /dev/null +++ b/DeepDrftWeb.Client/Controls/AudioPlayerBar/TimestampLabel.razor @@ -0,0 +1,5 @@ +
+ + @FormatTime(CurrentTime) / @(Duration.HasValue ? FormatTime(Duration.Value) : "--:--") + +
\ No newline at end of file diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar/TimestampLabel.razor.cs b/DeepDrftWeb.Client/Controls/AudioPlayerBar/TimestampLabel.razor.cs new file mode 100644 index 0000000..33beb10 --- /dev/null +++ b/DeepDrftWeb.Client/Controls/AudioPlayerBar/TimestampLabel.razor.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.Components; + +namespace DeepDrftWeb.Client.Controls.AudioPlayerBar; + +public partial class TimestampLabel : ComponentBase +{ + [Parameter] public required double CurrentTime { get; set; } + [Parameter] public required double? Duration { get; set; } + private static string FormatTime(double seconds) + { + var timeSpan = TimeSpan.FromSeconds(seconds); + return timeSpan.ToString(timeSpan.TotalHours >= 1 ? @"h\:mm\:ss" : @"m\:ss"); + } +} \ No newline at end of file diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar/TimestampLabel.razor.css b/DeepDrftWeb.Client/Controls/AudioPlayerBar/TimestampLabel.razor.css new file mode 100644 index 0000000..5c39ee9 --- /dev/null +++ b/DeepDrftWeb.Client/Controls/AudioPlayerBar/TimestampLabel.razor.css @@ -0,0 +1,12 @@ +/* TimestampLabel Component Styles */ + +/* Timestamp display */ +.timestamp-display { + min-width: 120px; + text-align: center; +} + +/* Time text styling */ +.time-text { + font-family: monospace; +} \ No newline at end of file diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar/VolumeControls.razor b/DeepDrftWeb.Client/Controls/AudioPlayerBar/VolumeControls.razor new file mode 100644 index 0000000..c2066d6 --- /dev/null +++ b/DeepDrftWeb.Client/Controls/AudioPlayerBar/VolumeControls.razor @@ -0,0 +1,10 @@ +
+ + +
\ No newline at end of file diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar/VolumeControls.razor.cs b/DeepDrftWeb.Client/Controls/AudioPlayerBar/VolumeControls.razor.cs new file mode 100644 index 0000000..2d8a588 --- /dev/null +++ b/DeepDrftWeb.Client/Controls/AudioPlayerBar/VolumeControls.razor.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace DeepDrftWeb.Client.Controls.AudioPlayerBar; + +public partial class VolumeControls : ComponentBase +{ + [Parameter] public required double Volume { get; set; } + [Parameter] public required EventCallback VolumeChanged { get; set; } + private string GetVolumeIcon() + { + if (Volume == 0) return Icons.Material.Filled.VolumeOff; + if (Volume < 0.5) return Icons.Material.Filled.VolumeDown; + return Icons.Material.Filled.VolumeUp; + } +} \ No newline at end of file diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar/VolumeControls.razor.css b/DeepDrftWeb.Client/Controls/AudioPlayerBar/VolumeControls.razor.css new file mode 100644 index 0000000..7c41b24 --- /dev/null +++ b/DeepDrftWeb.Client/Controls/AudioPlayerBar/VolumeControls.razor.css @@ -0,0 +1,19 @@ +/* VolumeControls Component Styles */ + +/* Volume control container */ +.volume-controls { + display: flex; + align-items: center; + gap: 0.25rem; + width: 140px; +} + +/* Volume icon styling */ +.volume-icon { + margin-right: 4px; +} + +/* Volume slider styling */ +.volume-slider { + width: 100px; +} \ No newline at end of file diff --git a/DeepDrftWeb.Client/Layout/MainLayout.razor b/DeepDrftWeb.Client/Layout/MainLayout.razor index ea6638e..1df49e9 100644 --- a/DeepDrftWeb.Client/Layout/MainLayout.razor +++ b/DeepDrftWeb.Client/Layout/MainLayout.razor @@ -1,4 +1,5 @@ @using DeepDrftWeb.Client.Controls +@using DeepDrftWeb.Client.Controls.AudioPlayerBar @inherits LayoutComponentBase @@ -7,8 +8,6 @@ - @* *@ - @* *@ @@ -16,13 +15,12 @@ - @* *@ @Body - + @@ -37,7 +35,6 @@ @code { private bool _drawerOpen = true; private bool _isDarkMode = true; - // private MudTheme? _theme = null; protected override void OnInitialized() { diff --git a/DeepDrftWeb.Client/Pages/TracksView.razor b/DeepDrftWeb.Client/Pages/TracksView.razor index 57278e1..5918767 100644 --- a/DeepDrftWeb.Client/Pages/TracksView.razor +++ b/DeepDrftWeb.Client/Pages/TracksView.razor @@ -1,5 +1,4 @@ @page "/tracks" -@rendermode @(new InteractiveAutoRenderMode(prerender: false)) @using DeepDrftWeb.Client.Controls @@ -20,21 +19,21 @@ SelectedChanged="@SetPage" BoundaryCount="2" MiddleCount="3"/> - -
- - Test Interactivity (@_clickCount) - - - Lifecycle Status: @_lifecycleStatus - -
} else {
- + + @foreach (var i in Enumerable.Range(0, 12)) + { + + + + } +