diff --git a/DeepDrftCli/DeepDrftCli.csproj b/DeepDrftCli/DeepDrftCli.csproj
index d429aee..1ca1e16 100644
--- a/DeepDrftCli/DeepDrftCli.csproj
+++ b/DeepDrftCli/DeepDrftCli.csproj
@@ -2,21 +2,21 @@
Exe
- net9.0
+ net10.0
enable
enable
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/DeepDrftContent.Services/DeepDrftContent.Services.csproj b/DeepDrftContent.Services/DeepDrftContent.Services.csproj
index 187de63..e132d96 100644
--- a/DeepDrftContent.Services/DeepDrftContent.Services.csproj
+++ b/DeepDrftContent.Services/DeepDrftContent.Services.csproj
@@ -1,7 +1,7 @@
- net9.0
+ net10.0
enable
enable
diff --git a/DeepDrftContent/DeepDrftContent.csproj b/DeepDrftContent/DeepDrftContent.csproj
index e24ad01..732f465 100644
--- a/DeepDrftContent/DeepDrftContent.csproj
+++ b/DeepDrftContent/DeepDrftContent.csproj
@@ -1,13 +1,13 @@
- net9.0
+ net10.0
enable
enable
-
+
diff --git a/DeepDrftModels/DeepDrftModels.csproj b/DeepDrftModels/DeepDrftModels.csproj
index a8fcc32..cb70a35 100644
--- a/DeepDrftModels/DeepDrftModels.csproj
+++ b/DeepDrftModels/DeepDrftModels.csproj
@@ -1,7 +1,7 @@
- net9.0
+ net10.0
enable
enable
diff --git a/DeepDrftTests/DeepDrftTests.csproj b/DeepDrftTests/DeepDrftTests.csproj
index 66756b5..91d257c 100644
--- a/DeepDrftTests/DeepDrftTests.csproj
+++ b/DeepDrftTests/DeepDrftTests.csproj
@@ -1,7 +1,7 @@
- net9.0
+ net10.0
latest
enable
enable
@@ -9,11 +9,17 @@
-
-
-
-
-
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
diff --git a/DeepDrftWeb.Client/Common/DDIcons.cs b/DeepDrftWeb.Client/Common/DDIcons.cs
new file mode 100644
index 0000000..b5ffbda
--- /dev/null
+++ b/DeepDrftWeb.Client/Common/DDIcons.cs
@@ -0,0 +1,28 @@
+namespace DeepDrftWeb.Client.Common;
+
+public static class DDIcons
+{
+ ///
+ /// Charleston gas lamp lantern - uses currentColor for theming
+ ///
+ ///
+ /// Charleston gas lamp lantern - uses currentColor for theming
+ ///
+ public const string GasLamp = """
+
+ """;
+
+ ///
+ /// Charleston gas lamp with lit flame - for dark mode
+ ///
+ public const string GasLampLit = """
+
+ """;
+}
\ No newline at end of file
diff --git a/DeepDrftWeb.Client/Common/DarkModeSettings.cs b/DeepDrftWeb.Client/Common/DarkModeSettings.cs
new file mode 100644
index 0000000..4c0c0d1
--- /dev/null
+++ b/DeepDrftWeb.Client/Common/DarkModeSettings.cs
@@ -0,0 +1,20 @@
+using Microsoft.AspNetCore.Components;
+
+namespace DeepDrftWeb.Client.Common;
+
+public class DarkModeSettings()
+{
+ // public EventCallback IsDarkModeChanged { get; set; }
+
+ [PersistentState]
+ public bool IsDarkMode
+ {
+ get;
+ set
+ {
+ if (value == field) return;
+ field = value;
+ // IsDarkModeChanged.InvokeAsync(value);
+ }
+ } = false;
+}
\ No newline at end of file
diff --git a/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor.cs b/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor.cs
index b59e73f..cb025ec 100644
--- a/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor.cs
+++ b/DeepDrftWeb.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor.cs
@@ -8,7 +8,7 @@ namespace DeepDrftWeb.Client.Controls.AudioPlayerBar;
public partial class AudioPlayerBar : ComponentBase, IAsyncDisposable
{
[CascadingParameter] public required IStreamingPlayerService PlayerService { get; set; }
- [Inject] private IBrowserViewportService BrowserViewportService { get; set; } = default!;
+ [Inject] public required IBrowserViewportService BrowserViewportService { get; set; }
private bool _isMinimized = true;
private bool _isSeeking = false;
diff --git a/DeepDrftWeb.Client/DeepDrftWeb.Client.csproj b/DeepDrftWeb.Client/DeepDrftWeb.Client.csproj
index 06b458c..2dde35f 100644
--- a/DeepDrftWeb.Client/DeepDrftWeb.Client.csproj
+++ b/DeepDrftWeb.Client/DeepDrftWeb.Client.csproj
@@ -1,7 +1,7 @@
- net9.0
+ net10.0
enable
enable
true
@@ -9,10 +9,11 @@
-
+
-
-
+
+
+
diff --git a/DeepDrftWeb.Client/Layout/DeepDrftMenu.razor b/DeepDrftWeb.Client/Layout/DeepDrftMenu.razor
new file mode 100644
index 0000000..93381fb
--- /dev/null
+++ b/DeepDrftWeb.Client/Layout/DeepDrftMenu.razor
@@ -0,0 +1,118 @@
+@using DeepDrftWeb.Client.Controls
+@using DeepDrftWeb.Client.Services
+
+
+
+ @if (_isDesktop)
+ {
+
+
+
+
+
+
+
+ Deep DRFT
+
+
+
+
+
+
+
+ @foreach (PageRoute thePage in Pages.AllPages)
+ {
+ @thePage.Name
+ }
+
+
+ }
+ else
+ {
+
+
+
+
+
+
+
+
+
+ Deep DRFT
+
+
+
+ @foreach (PageRoute route in Pages.AllPages)
+ {
+
+
+
+
+ @route.Name
+
+
+
+ }
+
+
+
+
+ }
+
+
+
+
+
+
+
+@code {
+ [Inject] public required IBrowserViewportService BrowserViewportService { get; set; }
+ [Inject] public required DarkModeCookieService DarkModeCookieService { get; set; }
+ [Parameter] public int Elevation { get; set; }
+ [Parameter] public required bool IsDarkMode { get; set; }
+ [Parameter] public required EventCallback IsDarkModeChanged { get; set; }
+
+ private bool _isDesktop = true;
+ private Guid _viewportSubscriptionId;
+
+ protected override async Task OnInitializedAsync()
+ {
+ IsDarkMode = DarkModeCookieService.GetDarkModeAsync();
+ await IsDarkModeChanged.InvokeAsync(IsDarkMode);
+ }
+
+ protected override async Task OnAfterRenderAsync(bool firstRender)
+ {
+ if (firstRender)
+ {
+ var breakpoint = await BrowserViewportService.GetCurrentBreakpointAsync();
+ _isDesktop = breakpoint >= Breakpoint.Sm;
+
+ _viewportSubscriptionId = Guid.NewGuid();
+ await BrowserViewportService.SubscribeAsync(
+ _viewportSubscriptionId,
+ args =>
+ {
+ _isDesktop = args.Breakpoint >= Breakpoint.Sm;
+ InvokeAsync(StateHasChanged);
+ },
+ new ResizeOptions { NotifyOnBreakpointOnly = true },
+ fireImmediately: true);
+
+ StateHasChanged();
+ }
+ }
+
+ private string DarkLightModeButtonIcon => IsDarkMode switch
+ {
+ true => DDIcons.GasLampLit,
+ false => DDIcons.GasLamp,
+ };
+
+ private async Task DarkModeToggle()
+ {
+ IsDarkMode = !IsDarkMode;
+ await DarkModeCookieService.SetDarkModeAsync(IsDarkMode);
+ await IsDarkModeChanged.InvokeAsync(IsDarkMode);
+ }
+}
diff --git a/DeepDrftWeb.Client/Layout/MainLayout.razor b/DeepDrftWeb.Client/Layout/MainLayout.razor
index 79ec3fc..d9fd6b7 100644
--- a/DeepDrftWeb.Client/Layout/MainLayout.razor
+++ b/DeepDrftWeb.Client/Layout/MainLayout.razor
@@ -1,6 +1,10 @@
@using DeepDrftWeb.Client.Controls
@using DeepDrftWeb.Client.Controls.AudioPlayerBar
+@using DeepDrftWeb.Client.Services
+@using DeepDrftWeb.Client.Common
+@using Microsoft.AspNetCore.Components
@inherits LayoutComponentBase
+@implements IDisposable
@@ -9,14 +13,7 @@
-
-
-
-
-
-
-
-
+
@Body
@@ -35,12 +32,31 @@
@code {
- private bool _drawerOpen = true;
+ private const string DarkModeKey = "darkMode";
private bool _isDarkMode = true;
+ private PersistingComponentStateSubscription _persistingSubscription;
+
+ [Inject] public required PersistentComponentState PersistentState { get; set; }
+ [Inject] public required DarkModeSettings DarkModeSettings { get; set; }
protected override void OnInitialized()
{
base.OnInitialized();
+
+ // Restore persisted dark mode state (from server prerender)
+ if (PersistentState.TryTakeFromJson(DarkModeKey, out var restored))
+ {
+ _isDarkMode = restored;
+ DarkModeSettings.IsDarkMode = restored;
+ }
+ else
+ {
+ _isDarkMode = DarkModeSettings.IsDarkMode;
+ }
+
+ // Register to persist state when prerendering completes
+ _persistingSubscription = PersistentState.RegisterOnPersisting(PersistDarkMode);
+
_themeManager = new ThemeManagerTheme
{
Theme =
@@ -59,23 +75,23 @@
},
H2 = new H2Typography()
{
- FontFamily = new[] {"EB Garamond", "serif"}
+ FontFamily = new[] {"Cormorant", "serif"}
},
H3 = new H3Typography()
{
- FontFamily = new[] {"EB Garamond", "serif"}
+ FontFamily = new[] {"Cormorant", "serif"}
},
H4 = new H4Typography()
{
- FontFamily = new[] {"EB Garamond", "serif"}
+ FontFamily = new[] {"Cormorant", "serif"}
},
H5 = new H5Typography()
{
- FontFamily = new[] {"EB Garamond", "serif"}
+ FontFamily = new[] {"Cormorant", "serif"}
},
H6 = new H6Typography()
{
- FontFamily = new[] {"EB Garamond", "serif"}
+ FontFamily = new[] {"Cormorant", "serif"}
},
Button = new ButtonTypography()
{
@@ -87,16 +103,6 @@
StateHasChanged();
}
-
- private void DrawerToggle()
- {
- _drawerOpen = !_drawerOpen;
- }
-
- private void DarkModeToggle()
- {
- _isDarkMode = !_isDarkMode;
- }
private ThemeManagerTheme _themeManager;
public bool _themeManagerOpen = false;
@@ -113,31 +119,31 @@
}
// Charleston in the Day - Light Theme
- // Inspired by Charleston's historic architecture: white stucco, black wrought iron gates, elegant accents
+ // Inspired by Charleston's historic architecture: wrought iron, bronze, Atlantic coast
private readonly PaletteLight _lightPalette = new()
{
- Primary = "#1C1C1C", // Wrought iron black - strong, elegant
- Secondary = "#B8848C", // Dusty rose - elegant accent
- Tertiary = "#C9A962", // Antique gold - replaces brown
+ Primary = "#1A1A1A", // Wrought iron black
+ Secondary = "#B8623D", // Burnished copper - warm orange bronze
+ Tertiary = "#2A7B8C", // Atlantic turquoise
Info = "#2196F3", // MudBlazor default blue (semantic)
Success = "#4CAF50", // MudBlazor default green (semantic)
Warning = "#FF9800", // MudBlazor default amber (semantic)
Error = "#F44336", // MudBlazor default red (semantic)
- Black = "#1C1C1C", // Wrought iron black
+ Black = "#1A1A1A", // Wrought iron black
White = "#FDFBF7", // Cream white (stucco)
Surface = "#FDFBF7", // Cream stucco surface
Background = "#F5F2EC", // Warm linen background
- AppbarText = "#FDFBF7", // Cream text on dark appbar (FIX)
- AppbarBackground = "#1C1C1C", // Solid wrought iron appbar
+ AppbarText = "#FDFBF7", // Cream text on dark appbar
+ AppbarBackground = "#1A1A1A", // Solid wrought iron appbar
DrawerBackground = "#F5F2EC", // Linen drawer
- TextPrimary = "#1C1C1C", // Wrought iron text
+ TextPrimary = "#1A1A1A", // Wrought iron text
TextSecondary = "#4A4A4A", // Softer iron text
- GrayLight = "rgba(28,28,28,0.08)", // Light iron tint
- GrayLighter = "rgba(28,28,28,0.04)", // Very light iron tint
- GrayDefault = "rgba(28,28,28,0.15)", // Medium iron tint
- GrayDark = "rgba(28,28,28,0.25)", // Darker iron tint
- Divider = "rgba(28,28,28,0.12)", // Subtle divider lines
- TableLines = "rgba(28,28,28,0.12)", // Table borders
+ GrayLight = "rgba(26,26,26,0.08)", // Light iron tint
+ GrayLighter = "rgba(26,26,26,0.04)", // Very light iron tint
+ GrayDefault = "rgba(26,26,26,0.15)", // Medium iron tint
+ GrayDark = "rgba(26,26,26,0.25)", // Darker iron tint
+ Divider = "rgba(26,26,26,0.12)", // Subtle divider lines
+ TableLines = "rgba(26,26,26,0.12)", // Table borders
};
// Lowcountry Summer Nights - Dark Theme
@@ -178,14 +184,19 @@
OverlayDark = "rgba(255,255,255,0.08)", // Light overlay
};
- public string DarkLightModeButtonIcon => _isDarkMode switch
- {
- true => Icons.Material.Rounded.AutoMode,
- false => Icons.Material.Outlined.DarkMode,
- };
-
// Theme wrapper class for CSS targeting
private string ThemeWrapperClass => _isDarkMode ? "deepdrft-theme-dark" : "deepdrft-theme-light";
+
+ private Task PersistDarkMode()
+ {
+ PersistentState.PersistAsJson(DarkModeKey, _isDarkMode);
+ return Task.CompletedTask;
+ }
+
+ public void Dispose()
+ {
+ _persistingSubscription.Dispose();
+ }
}
diff --git a/DeepDrftWeb.Client/Layout/NavMenu.razor b/DeepDrftWeb.Client/Layout/NavMenu.razor
index 830a1ea..46c1e58 100644
--- a/DeepDrftWeb.Client/Layout/NavMenu.razor
+++ b/DeepDrftWeb.Client/Layout/NavMenu.razor
@@ -1,7 +1,5 @@
@using DeepDrftWeb.Client.Controls
-Home
-Track Gallery
diff --git a/DeepDrftWeb.Client/Layout/Pages.cs b/DeepDrftWeb.Client/Layout/Pages.cs
new file mode 100644
index 0000000..81f2a5d
--- /dev/null
+++ b/DeepDrftWeb.Client/Layout/Pages.cs
@@ -0,0 +1,24 @@
+using MudBlazor;
+
+namespace DeepDrftWeb.Client.Layout;
+
+public class PageRoute
+{
+ public string Name { get; set; } = string.Empty;
+ public string Route { get; set; } = string.Empty;
+ public string? Icon { get; set; } = null;
+}
+
+public static class Pages
+{
+ public static readonly List MenuPages =
+ [
+ new() { Name = "Track Gallery", Route = "/tracks", Icon = Icons.Material.Filled.LibraryMusic }
+ ];
+
+ public static readonly List AllPages =
+ new List
+ {
+ new() { Name = "Home", Route = "/", Icon = Icons.Material.Filled.Home }
+ }.Concat(MenuPages).ToList();
+}
\ No newline at end of file
diff --git a/DeepDrftWeb.Client/Pages/Home.razor b/DeepDrftWeb.Client/Pages/Home.razor
index aa3fb4f..ebbbe92 100644
--- a/DeepDrftWeb.Client/Pages/Home.razor
+++ b/DeepDrftWeb.Client/Pages/Home.razor
@@ -1,6 +1,6 @@
@page "/"
-DeepDrft - Electronic Music Collective
+Deep DRFT- Electronic Music Collective
@@ -11,17 +11,17 @@
- DEEPDRFT
+ DEEP DRFT
-
ELECTRONIC MUSIC COLLECTIVE
-
- Live electronic music from Charleston, SC featuring house, techno, trance, and IDM crafted with synthesizers and grooveboxes
+ Live electronic music from Charleston, South Carolina
-
@@ -46,8 +47,8 @@
@* About Section *@
-
-
+
+
The Collective
@@ -65,8 +66,8 @@
-
-
+
+
Our Sound
@@ -96,11 +97,11 @@
-
-
+
High-Quality Streaming
@@ -111,9 +112,9 @@
-
Live Sessions
@@ -126,11 +127,10 @@
-
-
+
+
Video Content
@@ -143,8 +143,8 @@
-
+ Class="mb-3 deepdrft-icon-large deepdrft-text-quinary" />
+
Growing Archive
@@ -158,8 +158,8 @@
@* Location & Connect Section *@
-
-
+
+
Charleston, SC
@@ -175,8 +175,8 @@
-
-
+
+
Connect With Us
diff --git a/DeepDrftWeb.Client/Services/DarkModeCookieService.cs b/DeepDrftWeb.Client/Services/DarkModeCookieService.cs
new file mode 100644
index 0000000..191dd15
--- /dev/null
+++ b/DeepDrftWeb.Client/Services/DarkModeCookieService.cs
@@ -0,0 +1,25 @@
+using DeepDrftWeb.Client.Common;
+using Microsoft.JSInterop;
+
+namespace DeepDrftWeb.Client.Services;
+
+public class DarkModeCookieService(DarkModeSettings darkModeSetting, IJSRuntime js) : DarkModeServiceBase
+{
+ private const int EXPIRY_DAYS = 365;
+
+ public bool GetDarkModeAsync()
+ {
+ return darkModeSetting.IsDarkMode;
+ // var value = await js.InvokeAsync("eval",
+ // $"document.cookie.split('; ').find(c => c.startsWith('{COOKIE_NAME}='))?.split('=')[1]");
+ // return value == "true";
+ }
+
+ public async ValueTask SetDarkModeAsync(bool isDarkMode)
+ {
+ var expires = DateTime.UtcNow.AddDays(EXPIRY_DAYS).ToString("R");
+ await js.InvokeVoidAsync("eval",
+ $"document.cookie = '{COOKIE_NAME}={isDarkMode.ToString().ToLower()}; expires={expires}; path=/; SameSite=Lax'");
+ darkModeSetting.IsDarkMode = isDarkMode;
+ }
+}
\ No newline at end of file
diff --git a/DeepDrftWeb.Client/Services/DarkModeServiceBase.cs b/DeepDrftWeb.Client/Services/DarkModeServiceBase.cs
new file mode 100644
index 0000000..848f34e
--- /dev/null
+++ b/DeepDrftWeb.Client/Services/DarkModeServiceBase.cs
@@ -0,0 +1,6 @@
+namespace DeepDrftWeb.Client.Services;
+
+public abstract class DarkModeServiceBase
+{
+ protected const string COOKIE_NAME = "darkMode";
+}
\ No newline at end of file
diff --git a/DeepDrftWeb.Client/Startup.cs b/DeepDrftWeb.Client/Startup.cs
index 919c212..9b91bac 100644
--- a/DeepDrftWeb.Client/Startup.cs
+++ b/DeepDrftWeb.Client/Startup.cs
@@ -1,6 +1,8 @@
using DeepDrftWeb.Client.Clients;
+using DeepDrftWeb.Client.Common;
using DeepDrftWeb.Client.Services;
using DeepDrftWeb.Client.ViewModels;
+using Microsoft.AspNetCore.Http;
namespace DeepDrftWeb.Client;
@@ -8,6 +10,10 @@ public static class Startup
{
public static void ConfigureDomainServices(IServiceCollection services)
{
+ // Theme Support
+ services.AddScoped();
+ services.AddScoped();
+
// Track Client
services.AddScoped();
services.AddScoped();
@@ -29,6 +35,5 @@ public static class Startup
});
services.AddScoped();
services.AddScoped();
- // AudioPlaybackEngine removed - functionality merged into AudioPlayerService
}
}
\ No newline at end of file
diff --git a/DeepDrftWeb.Client/_Imports.razor b/DeepDrftWeb.Client/_Imports.razor
index de75392..3371bf6 100644
--- a/DeepDrftWeb.Client/_Imports.razor
+++ b/DeepDrftWeb.Client/_Imports.razor
@@ -9,3 +9,4 @@
@using MudBlazor
@using MudBlazor.Services
@using MudBlazor.ThemeManager
+@using DeepDrftWeb.Client.Common
\ No newline at end of file
diff --git a/DeepDrftWeb.Services/DeepDrftWeb.Services.csproj b/DeepDrftWeb.Services/DeepDrftWeb.Services.csproj
index e42b03c..c923130 100644
--- a/DeepDrftWeb.Services/DeepDrftWeb.Services.csproj
+++ b/DeepDrftWeb.Services/DeepDrftWeb.Services.csproj
@@ -1,15 +1,15 @@
- net9.0
+ net10.0
enable
enable
-
-
-
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/DeepDrftWeb/Components/App.razor b/DeepDrftWeb/Components/App.razor
index 5c3e058..7ed2d2a 100644
--- a/DeepDrftWeb/Components/App.razor
+++ b/DeepDrftWeb/Components/App.razor
@@ -1,4 +1,5 @@
-
+@using DeepDrftWeb.Services
+
@@ -8,7 +9,7 @@
-
+
@@ -20,12 +21,23 @@
-
-
-
-
+
+
-
+
+@code {
+
+ [Inject] public required DarkModeService DarkModeService { get; set; }
+
+ protected override void OnInitialized()
+ {
+ base.OnInitialized();
+ DarkModeService.CheckDarkMode();
+ }
+
+}
diff --git a/DeepDrftWeb/DeepDrftWeb.csproj b/DeepDrftWeb/DeepDrftWeb.csproj
index 5db3bc0..8db9af4 100644
--- a/DeepDrftWeb/DeepDrftWeb.csproj
+++ b/DeepDrftWeb/DeepDrftWeb.csproj
@@ -1,32 +1,32 @@
- net9.0
+ net10.0
enable
enable
-
-
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/DeepDrftWeb/Program.cs b/DeepDrftWeb/Program.cs
index 43a1bfa..0379e0c 100644
--- a/DeepDrftWeb/Program.cs
+++ b/DeepDrftWeb/Program.cs
@@ -1,5 +1,4 @@
using DeepDrftWeb;
-using DeepDrftWeb.Client.Services;
using MudBlazor.Services;
using DeepDrftWeb.Components;
using Microsoft.AspNetCore.HttpOverrides;
@@ -10,17 +9,17 @@ var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMudServices();
// Add AudioInteropService for both server and client rendering
-builder.Services.AddScoped();
+// builder.Services.AddScoped();
var baseUrl = builder.GetKestrelUrl();
var contentApiUrl = builder.Configuration["ApiUrls:ContentApi"] ?? throw new Exception("Content API URL is not configured");
-Startup.ConfigureDomainServices(builder);
-
DeepDrftWeb.Client.Startup.ConfigureApiHttpClient(builder.Services, baseUrl);
DeepDrftWeb.Client.Startup.ConfigureDomainServices(builder.Services);
DeepDrftWeb.Client.Startup.ConfigureContentServices(builder.Services, contentApiUrl);
+Startup.ConfigureDomainServices(builder);
+
builder.Services.AddControllers();
// Add services to the container.
diff --git a/DeepDrftWeb/Services/DarkModeService.cs b/DeepDrftWeb/Services/DarkModeService.cs
new file mode 100644
index 0000000..e90b38f
--- /dev/null
+++ b/DeepDrftWeb/Services/DarkModeService.cs
@@ -0,0 +1,22 @@
+using DeepDrftWeb.Client.Common;
+using DeepDrftWeb.Client.Services;
+
+namespace DeepDrftWeb.Services;
+
+public class DarkModeService(DarkModeSettings darkModeSettings, IHttpContextAccessor httpAccessor) : DarkModeServiceBase
+{
+ public void CheckDarkMode()
+ {
+ // get
+ // {
+ bool isDarkMode = false; // Default to light mode
+ var context = httpAccessor.HttpContext;
+ if (context?.Request.Cookies.TryGetValue(COOKIE_NAME, out var dark) == true)
+ {
+ isDarkMode = dark == "true";
+ }
+ darkModeSettings.IsDarkMode = isDarkMode;
+ // return isDarkMode;
+ // }
+ }
+}
\ No newline at end of file
diff --git a/DeepDrftWeb/Startup.cs b/DeepDrftWeb/Startup.cs
index 1466d7e..20b8649 100644
--- a/DeepDrftWeb/Startup.cs
+++ b/DeepDrftWeb/Startup.cs
@@ -1,4 +1,4 @@
-using DeepDrftWeb.Services.Data;
+using DeepDrftWeb.Services.Data;
using DeepDrftWeb.Services.Repositories;
using DeepDrftWeb.Services;
using Microsoft.EntityFrameworkCore;
@@ -13,9 +13,16 @@ public static class Startup
builder.Services.AddDbContext(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("DefaultConnection")));
+ // Add Server Prerendering Theming Support
+ // DarkModeSettings is registered in DeepDrftWeb.Client.Startup.ConfigureDomainServices
+ builder.Services
+ .AddHttpContextAccessor()
+ .AddScoped();
+
// Add Track services
- builder.Services.AddScoped();
- builder.Services.AddScoped();
+ builder.Services
+ .AddScoped()
+ .AddScoped();
}
public static string GetKestrelUrl(this WebApplicationBuilder builder)
diff --git a/DeepDrftWeb/wwwroot/styles/deepdrft-styles.css b/DeepDrftWeb/wwwroot/styles/deepdrft-styles.css
index fd6ed87..4257d95 100644
--- a/DeepDrftWeb/wwwroot/styles/deepdrft-styles.css
+++ b/DeepDrftWeb/wwwroot/styles/deepdrft-styles.css
@@ -4,16 +4,16 @@
/* Color Variables - Charleston in the Day (Light Mode Default) */
:root {
- /* Charleston Theme Colors */
- --deepdrft-primary: #1C1C1C; /* Wrought iron black */
- --deepdrft-secondary: #B8848C; /* Dusty rose - elegant accent */
- --deepdrft-tertiary: #C9A962; /* Antique gold - replaces brown */
- --deepdrft-accent: #7D9B8C; /* Sage green */
+ /* Charleston Theme Colors - Elegant Ironwork & Lowcountry */
+ --deepdrft-primary: #1A1A1A; /* Wrought iron black */
+ --deepdrft-secondary: #B8623D; /* Burnished copper - warm orange bronze */
+ --deepdrft-tertiary: #2A7B8C; /* Atlantic turquoise */
+ --deepdrft-accent: #2A7B8C; /* Atlantic turquoise */
/* Extended Palette - Light Theme (Charleston) */
- --deepdrft-quaternary: #7D9B8C; /* Sage green */
- --deepdrft-quinary: #6B7D8A; /* Slate blue */
- --deepdrft-senary: #C4967A; /* Warm terracotta */
+ --deepdrft-quaternary: #D4A556; /* Lamplight orange/yellow */
+ --deepdrft-quinary: #3D5A47; /* Swampy elegant green */
+ --deepdrft-senary: #6B4C6A; /* Sunset purple */
--deepdrft-septenary: #8A7A96; /* Soft plum */
/* Surface Colors */
@@ -32,17 +32,19 @@
--deepdrft-theme-septenary: var(--deepdrft-septenary);
/* Charleston-specific accent colors */
- --charleston-iron: #1C1C1C;
+ --charleston-iron: #1A1A1A;
--charleston-iron-soft: #4A4A4A;
--charleston-cream: #FDFBF7;
- --charleston-rose: #B8848C;
- --charleston-gold: #C9A962;
- --charleston-sage: #7D9B8C;
+ --charleston-bronze: #B8623D;
+ --charleston-turquoise: #2A7B8C;
+ --charleston-lamplight: #D4A556;
+ --charleston-swamp: #3D5A47;
+ --charleston-sunset: #6B4C6A;
/* Font Hierarchy - DRY font definitions */
- /* Upscale steakhouse aesthetic - refined, modern luxury */
+ /* Upscale Charleston aesthetic - tall decorative ironwork elegance */
--deepdrft-font-largest-headers: "Bodoni Moda", serif; /* h1, hero text - high-fashion editorial */
- --deepdrft-font-headers: "EB Garamond", serif; /* h2-h6 - elegant serif headers */
+ --deepdrft-font-headers: "Cormorant", serif; /* h2-h6 - elegant readable serif */
--deepdrft-font-body: "DM Sans", sans-serif; /* body, buttons, UI - clean modern */
}
@@ -111,13 +113,13 @@
.deepdrft-theme-light .deepdrft-gradient-soft-primary {
background: linear-gradient(45deg,
color-mix(in srgb, var(--charleston-iron) 4%, transparent) 0%,
- color-mix(in srgb, var(--charleston-rose) 6%, transparent) 100%);
+ color-mix(in srgb, var(--charleston-bronze) 6%, transparent) 100%);
}
.deepdrft-theme-light .mud-paper.deepdrft-gradient-soft-secondary,
.deepdrft-theme-light .deepdrft-gradient-soft-secondary {
background: linear-gradient(45deg,
- color-mix(in srgb, var(--charleston-gold) 6%, transparent) 0%,
+ color-mix(in srgb, var(--charleston-lamplight) 6%, transparent) 0%,
color-mix(in srgb, var(--charleston-iron) 4%, transparent) 100%);
}
@@ -125,13 +127,13 @@
.deepdrft-theme-light .deepdrft-gradient-soft-accent {
background: linear-gradient(135deg,
color-mix(in srgb, var(--charleston-iron) 3%, transparent) 0%,
- color-mix(in srgb, var(--charleston-gold) 5%, transparent) 100%);
+ color-mix(in srgb, var(--charleston-lamplight) 5%, transparent) 100%);
}
.deepdrft-theme-light .mud-paper.deepdrft-gradient-soft-tertiary,
.deepdrft-theme-light .deepdrft-gradient-soft-tertiary {
background: linear-gradient(135deg,
- color-mix(in srgb, var(--charleston-rose) 5%, transparent) 0%,
+ color-mix(in srgb, var(--charleston-bronze) 5%, transparent) 0%,
color-mix(in srgb, var(--charleston-iron) 3%, transparent) 100%);
}
@@ -139,7 +141,7 @@
.deepdrft-theme-light .deepdrft-gradient-features {
background: linear-gradient(to right,
color-mix(in srgb, var(--charleston-iron) 2%, transparent) 0%,
- color-mix(in srgb, var(--charleston-rose) 3%, transparent) 100%);
+ color-mix(in srgb, var(--charleston-bronze) 3%, transparent) 100%);
}
/* Lowcountry Gradient Overrides (Dark Mode) */
@@ -204,17 +206,13 @@ h1, .deepdrft-text-hero, .deepdrft-heading-primary {
text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
}
-.deepdrft-text-hero {
- font-size: clamp(2rem, 8vw, 4rem);
-}
-
/* Hero Section Theme-Aware Text Colors */
/* Light mode (cream background): dark text */
.deepdrft-theme-light .deepdrft-hero-container .deepdrft-hero-title {
color: var(--charleston-iron);
}
.deepdrft-theme-light .deepdrft-hero-container .deepdrft-hero-subtitle {
- color: var(--charleston-rose);
+ color: var(--charleston-bronze);
}
.deepdrft-theme-light .deepdrft-hero-container .deepdrft-hero-description {
color: var(--charleston-iron-soft);
@@ -351,6 +349,18 @@ body, p, span, div,
border-top: 4px solid var(--deepdrft-theme-tertiary);
}
+.deepdrft-border-top-quaternary {
+ border-top: 4px solid var(--deepdrft-theme-quaternary);
+}
+
+.deepdrft-border-top-quinary {
+ border-top: 4px solid var(--deepdrft-theme-quinary);
+}
+
+.deepdrft-border-top-senary {
+ border-top: 4px solid var(--deepdrft-theme-senary);
+}
+
/* Buttons */
.deepdrft-button-primary {
color: var(--deepdrft-theme-primary);
@@ -382,7 +392,7 @@ body, p, span, div,
.deepdrft-theme-light .mud-card.deepdrft-card-pink-tint,
.deepdrft-theme-light .mud-paper.deepdrft-card-pink-tint {
- background: color-mix(in srgb, var(--charleston-rose) 10%, transparent);
+ background: color-mix(in srgb, var(--charleston-bronze) 10%, transparent);
}
.deepdrft-theme-dark .mud-card.deepdrft-card-pink-tint,
.deepdrft-theme-dark .mud-paper.deepdrft-card-pink-tint {
@@ -400,7 +410,7 @@ body, p, span, div,
.deepdrft-theme-light .mud-card.deepdrft-card-lavender-tint,
.deepdrft-theme-light .mud-paper.deepdrft-card-lavender-tint {
- background: color-mix(in srgb, var(--charleston-sage) 10%, transparent);
+ background: color-mix(in srgb, var(--charleston-swamp) 10%, transparent);
}
.deepdrft-theme-dark .mud-card.deepdrft-card-lavender-tint,
.deepdrft-theme-dark .mud-paper.deepdrft-card-lavender-tint {
@@ -419,7 +429,7 @@ body, p, span, div,
.deepdrft-theme-light .mud-card.deepdrft-card-secondary-tint,
.deepdrft-theme-light .mud-paper.deepdrft-card-secondary-tint {
- background: color-mix(in srgb, var(--charleston-rose) 8%, transparent);
+ background: color-mix(in srgb, var(--charleston-bronze) 8%, transparent);
}
.deepdrft-theme-dark .mud-card.deepdrft-card-secondary-tint,
.deepdrft-theme-dark .mud-paper.deepdrft-card-secondary-tint {
@@ -428,7 +438,7 @@ body, p, span, div,
.deepdrft-theme-light .mud-card.deepdrft-card-tertiary-tint,
.deepdrft-theme-light .mud-paper.deepdrft-card-tertiary-tint {
- background: color-mix(in srgb, var(--charleston-gold) 8%, transparent);
+ background: color-mix(in srgb, var(--charleston-lamplight) 8%, transparent);
}
.deepdrft-theme-dark .mud-card.deepdrft-card-tertiary-tint,
.deepdrft-theme-dark .mud-paper.deepdrft-card-tertiary-tint {
@@ -483,7 +493,7 @@ body, p, span, div,
.deepdrft-hero-text-container {
max-width: 600px;
- margin: 0 auto;
+ /*margin: 0 auto;*/
}
/* Feature Cards Layout */
@@ -606,27 +616,27 @@ body, p, span, div,
box-shadow: inset 0 0 20px rgba(28,28,28,0.03);
}
-/* Gold Accent */
-.charleston-gold-accent {
- border-bottom: 2px solid var(--charleston-gold, #C9A962);
+/* Lamplight Accent */
+.charleston-lamplight-accent {
+ border-bottom: 2px solid var(--charleston-lamplight, #D4A556);
}
-.charleston-gold-border {
- border: 1px solid var(--charleston-gold, #C9A962);
+.charleston-lamplight-border {
+ border: 1px solid var(--charleston-lamplight, #D4A556);
}
-/* Rose Accent */
-.charleston-rose-accent {
- border-bottom: 2px solid var(--charleston-rose, #B8848C);
+/* Bronze Accent */
+.charleston-bronze-accent {
+ border-bottom: 2px solid var(--charleston-bronze, #B8623D);
}
-.charleston-rose-border {
- border: 1px solid var(--charleston-rose, #B8848C);
+.charleston-bronze-border {
+ border: 1px solid var(--charleston-bronze, #B8623D);
}
/* Garden Card (subtle green tint) */
.charleston-garden-tint {
- background: color-mix(in srgb, var(--charleston-sage) 8%, transparent);
+ background: color-mix(in srgb, var(--charleston-swamp) 8%, transparent);
}
/* Iron Gate Pattern Overlay */
diff --git a/global.json b/global.json
index e69d70f..9a523dc 100644
--- a/global.json
+++ b/global.json
@@ -1,7 +1,7 @@
{
"sdk": {
- "version": "10.0.100",
+ "version": "10.0.0",
"rollForward": "latestMajor",
- "allowPrerelease": true
+ "allowPrerelease": false
}
}
\ No newline at end of file