diff --git a/src/PSLauncher.App/Resources/Theme.xaml b/src/PSLauncher.App/Resources/Theme.xaml
index b1ef735..d6e0ce3 100644
--- a/src/PSLauncher.App/Resources/Theme.xaml
+++ b/src/PSLauncher.App/Resources/Theme.xaml
@@ -16,6 +16,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
@@ -28,172 +162,202 @@
Foreground="{StaticResource Brush.Text.Primary}"
VerticalAlignment="Center" />
+
+
+ VerticalAlignment="Center" />
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+ VerticalAlignment="Center" />
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ Background="#2A2A30" BorderThickness="0" />
diff --git a/src/PSLauncher.App/Views/MarkdownTheming.cs b/src/PSLauncher.App/Views/MarkdownTheming.cs
new file mode 100644
index 0000000..6b5e613
--- /dev/null
+++ b/src/PSLauncher.App/Views/MarkdownTheming.cs
@@ -0,0 +1,111 @@
+using System.Windows;
+using System.Windows.Documents;
+using System.Windows.Media;
+using Markdig;
+using Markdig.Wpf;
+
+namespace PSLauncher.App.Views;
+
+///
+/// Helper pour rendre un FlowDocument à partir de Markdown avec le thème sombre du launcher.
+/// Markdig.Wpf produit un FlowDocument dont le Background est blanc et le Foreground noir
+/// par défaut — on force ici les couleurs sur le document et tous ses éléments visuels.
+///
+internal static class MarkdownTheming
+{
+ public static FlowDocument BuildThemedDocument(string markdown)
+ {
+ var pipeline = new MarkdownPipelineBuilder().UseSupportedExtensions().Build();
+ FlowDocument doc;
+ try
+ {
+ doc = Markdig.Wpf.Markdown.ToFlowDocument(markdown, pipeline);
+ }
+ catch
+ {
+ doc = new FlowDocument(new Paragraph(new Run(markdown)));
+ }
+ ApplyDarkTheme(doc);
+ return doc;
+ }
+
+ public static void ApplyDarkTheme(FlowDocument doc)
+ {
+ var bg = (Brush)Application.Current.FindResource("Brush.Bg.Card");
+ var fg = (Brush)Application.Current.FindResource("Brush.Text.Primary");
+ var fgSecondary = (Brush)Application.Current.FindResource("Brush.Text.Secondary");
+ var border = (Brush)Application.Current.FindResource("Brush.Border");
+ var accent = (Brush)Application.Current.FindResource("Brush.Accent");
+
+ doc.Background = Brushes.Transparent;
+ doc.Foreground = fg;
+ doc.FontFamily = new FontFamily("Segoe UI");
+ doc.FontSize = 13;
+ doc.LineHeight = 20;
+ doc.PagePadding = new Thickness(0);
+
+ foreach (var block in doc.Blocks.ToList())
+ ApplyToBlock(block, fg, fgSecondary, border, accent, bg);
+ }
+
+ private static void ApplyToBlock(Block block, Brush fg, Brush fgSecondary, Brush border, Brush accent, Brush bg)
+ {
+ block.Foreground = fg;
+ block.Background = Brushes.Transparent;
+
+ switch (block)
+ {
+ case Paragraph p:
+ foreach (var inline in p.Inlines.ToList())
+ ApplyToInline(inline, fg, fgSecondary, accent);
+ break;
+
+ case Section s:
+ foreach (var b in s.Blocks.ToList())
+ ApplyToBlock(b, fg, fgSecondary, border, accent, bg);
+ break;
+
+ case List list:
+ foreach (var item in list.ListItems.ToList())
+ {
+ item.Foreground = fg;
+ foreach (var b in item.Blocks.ToList())
+ ApplyToBlock(b, fg, fgSecondary, border, accent, bg);
+ }
+ break;
+
+ case Table tbl:
+ foreach (var rg in tbl.RowGroups.ToList())
+ foreach (var row in rg.Rows.ToList())
+ foreach (var cell in row.Cells.ToList())
+ {
+ cell.Foreground = fg;
+ cell.BorderBrush = border;
+ foreach (var b in cell.Blocks.ToList())
+ ApplyToBlock(b, fg, fgSecondary, border, accent, bg);
+ }
+ break;
+
+ case BlockUIContainer:
+ // Contenu UI custom — laissé tel quel.
+ break;
+ }
+ }
+
+ private static void ApplyToInline(Inline inline, Brush fg, Brush fgSecondary, Brush accent)
+ {
+ inline.Foreground = fg;
+ switch (inline)
+ {
+ case Hyperlink h:
+ h.Foreground = accent;
+ foreach (var i in h.Inlines.ToList())
+ ApplyToInline(i, accent, fgSecondary, accent);
+ break;
+ case Span s:
+ foreach (var i in s.Inlines.ToList())
+ ApplyToInline(i, fg, fgSecondary, accent);
+ break;
+ }
+ }
+}
diff --git a/src/PSLauncher.App/Views/ReleaseNotesViewerDialog.xaml.cs b/src/PSLauncher.App/Views/ReleaseNotesViewerDialog.xaml.cs
index 774e80c..41ddcaa 100644
--- a/src/PSLauncher.App/Views/ReleaseNotesViewerDialog.xaml.cs
+++ b/src/PSLauncher.App/Views/ReleaseNotesViewerDialog.xaml.cs
@@ -1,7 +1,4 @@
using System.Windows;
-using System.Windows.Documents;
-using Markdig;
-using Markdig.Wpf;
namespace PSLauncher.App.Views;
@@ -11,21 +8,10 @@ public partial class ReleaseNotesViewerDialog : Window
{
InitializeComponent();
- var pipeline = new MarkdownPipelineBuilder().UseSupportedExtensions().Build();
- FlowDocument doc;
- try
- {
- doc = Markdig.Wpf.Markdown.ToFlowDocument(releaseNotesMarkdown, pipeline);
- }
- catch
- {
- doc = new FlowDocument(new Paragraph(new Run(releaseNotesMarkdown)));
- }
-
DataContext = new
{
Title = $"Notes de version — v{version}",
- ReleaseNotesDocument = doc
+ ReleaseNotesDocument = MarkdownTheming.BuildThemedDocument(releaseNotesMarkdown)
};
}
diff --git a/src/PSLauncher.App/Views/UpdateAvailableDialog.xaml.cs b/src/PSLauncher.App/Views/UpdateAvailableDialog.xaml.cs
index 35b19d2..30b7ac5 100644
--- a/src/PSLauncher.App/Views/UpdateAvailableDialog.xaml.cs
+++ b/src/PSLauncher.App/Views/UpdateAvailableDialog.xaml.cs
@@ -1,7 +1,4 @@
using System.Windows;
-using System.Windows.Documents;
-using Markdig;
-using Markdig.Wpf;
using PSLauncher.Models;
namespace PSLauncher.App.Views;
@@ -12,24 +9,11 @@ public partial class UpdateAvailableDialog : Window
{
InitializeComponent();
- var pipeline = new MarkdownPipelineBuilder()
- .UseSupportedExtensions()
- .Build();
- FlowDocument doc;
- try
- {
- doc = Markdig.Wpf.Markdown.ToFlowDocument(releaseNotesMarkdown, pipeline);
- }
- catch
- {
- doc = new FlowDocument(new Paragraph(new Run(releaseNotesMarkdown)));
- }
-
DataContext = new
{
Title = $"Proserve v{version.Version} disponible",
Subtitle = $"Date de release : {version.ReleasedAt.ToLocalTime():dd MMMM yyyy} • {FormatSize(version.Download.SizeBytes)}",
- ReleaseNotesDocument = doc
+ ReleaseNotesDocument = MarkdownTheming.BuildThemedDocument(releaseNotesMarkdown)
};
}