feat: rebrand to MMD PDF, single corporate theme, and remove original text under an edit

- Services/PdfRedactText.cs: strip text whose origin falls inside a CoverAnnotation
  from the page content stream at save time, hooked into PdfBurn.DrawAnnotationsIntoDoc.
  Fixes edited values staying recoverable by text extraction.
- Themes/MMD.xaml replaces all thirteen themes; picker and accent strip removed; no dark mode.
- Rename KillerPDF -> MMD PDF across code, resources, packaging and locale strings; new icon.
- Remove the upstream author credit and the in-app install button.
This commit is contained in:
2026-08-27 07:37:09 +02:00
parent 532485a830
commit 6610acfa44
230 changed files with 9362 additions and 11508 deletions
+33 -171
View File
@@ -1,12 +1,12 @@
<Window x:Class="KillerPDF.MainWindow" Icon="pack://application:,,,/Resources/kp-icon.ico"
<Window x:Class="MmdPdf.MainWindow" Icon="pack://application:,,,/Resources/mmd-icon.ico"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:KillerPDF"
xmlns:ctrl="clr-namespace:KillerPDF.Controls"
xmlns:local="clr-namespace:MmdPdf"
xmlns:ctrl="clr-namespace:MmdPdf.Controls"
mc:Ignorable="d"
Title="KillerPDF" Height="700" Width="1000" MinHeight="480" MinWidth="620"
Title="MMD PDF" Height="700" Width="1000" MinHeight="480" MinWidth="620"
WindowStartupLocation="CenterScreen"
WindowStyle="None"
ResizeMode="CanResize"
@@ -339,13 +339,13 @@
</Setter.Value>
</Setter>
</Style>
<!-- Inset overlay close: the KillerNotes about-card geometry. Unlike the main
<!-- Inset overlay close: the MMD PDF about-card geometry. Unlike the main
caption close, its hover face rounds on all four corners. -->
<Style x:Key="DialogCloseButton" TargetType="Button" BasedOn="{StaticResource ChromeCloseButton}">
<Setter Property="Tag" Value="{DynamicResource SmallCornerRadius}"/>
</Style>
<!-- Shared close for the About and shortcuts cards (KillerScan is the family reference):
<!-- Shared close for the About and shortcuts cards (MMD PDF is the family reference):
a bare muted X that turns red on hover, no caption-style hover box. 98SE swaps the
glyph, font, metrics, and colors through the AboutClose* theme keys. -->
<Style x:Key="OverlayCloseButton" TargetType="Button">
@@ -507,7 +507,7 @@
</Style>
<!-- ============================================================
Family flyout standard (from KillerUI Controls.xaml): the rail's theme and language
Family flyout standard (from MmdPdfUI Controls.xaml): the rail's theme and language
flyouts are ContextMenus whose chrome comes ONLY from FlyoutCard + FlyoutGrain, with
PanelMenuItem stripping the MenuItem container for panel content. The grain tile's
ImageSource is wired in code beside the document grain brushes (Shell/ContextMenu.cs).
@@ -714,7 +714,7 @@
<ControlTemplate.Triggers>
<!-- SELECTION, not a gray wash. BgHover is #404040 in every theme, so
the menu was the one place in the product where "this is the one"
rendered in neutral gray - and KillerPDF is the app the others
rendered in neutral gray - and MmdPdf is the app the others
copy. Now the family's selected treatment: SelectionBg fill with
SelectionFg text. The gesture and chevron are recolored too, as
TextSecondary is unreadable on a saturated fill. -->
@@ -1139,7 +1139,7 @@
<RowDefinition Height="Auto"/> <!-- 1: toolbar -->
<RowDefinition Height="Auto"/> <!-- 2: document tab strip (collapses when no PDF is open) -->
<RowDefinition Height="*"/> <!-- 3: document content -->
<RowDefinition Height="24"/> <!-- 4: footer / status bar (KillerNotes exact) -->
<RowDefinition Height="24"/> <!-- 4: footer / status bar (MMD PDF exact) -->
</Grid.RowDefinitions>
<!-- Title bar -->
@@ -1165,24 +1165,24 @@
MouseWheel="LogoBar_MouseWheel"
MouseLeftButtonDown="LogoBar_MouseLeftButtonDown">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Margin="{DynamicResource TitleBarPadding}">
<Image Source="pack://application:,,,/Resources/kp-icon.png"
<Image Source="pack://application:,,,/Resources/mmd-icon.png"
Width="{DynamicResource TitleIconSize}" Height="{DynamicResource TitleIconSize}" Margin="{DynamicResource TitleIconMargin}" VerticalAlignment="Center"
RenderOptions.BitmapScalingMode="HighQuality">
<Image.Effect>
<DropShadowEffect Color="Black" BlurRadius="4" ShadowDepth="2" Direction="270" Opacity="{DynamicResource IconShadowOpacity}"/>
</Image.Effect>
</Image>
<TextBlock Text="KillerPDF" Visibility="{DynamicResource PlainTitleVisibility}"
<TextBlock Text="MMD PDF" Visibility="{DynamicResource PlainTitleVisibility}"
FontFamily="{DynamicResource ChromeFontFamily}" FontSize="11" FontWeight="Bold"
Foreground="{DynamicResource ChromeTextBrush}" VerticalAlignment="Center"/>
<Grid VerticalAlignment="Center" Visibility="{DynamicResource WordmarkVisibility}">
<!-- Soft drop shadow: a blurred, offset copy behind the crisp wordmark -->
<StackPanel Orientation="Horizontal" Margin="1,1,0,0" Opacity="{DynamicResource WordmarkShadowOpacity}">
<StackPanel.Effect><BlurEffect Radius="2"/></StackPanel.Effect>
<TextBlock><Run Text="Killer" FontFamily="{DynamicResource WordmarkFont}" FontSize="16.5" Foreground="#D8000000"/><Run Text="PDF" FontFamily="{DynamicResource WordmarkFontPdf}" FontWeight="Bold" FontSize="21.45" Foreground="#D8000000"/></TextBlock>
<TextBlock><Run Text="MMD " FontFamily="{DynamicResource WordmarkFont}" FontSize="16.5" Foreground="#D8000000"/><Run Text="PDF" FontFamily="{DynamicResource WordmarkFontPdf}" FontWeight="Bold" FontSize="21.45" Foreground="#D8000000"/></TextBlock>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock><Run Text="Killer" FontFamily="{DynamicResource WordmarkFont}" FontSize="16.5" Foreground="{DynamicResource TextBrush}"/><Run Text="PDF" FontFamily="{DynamicResource WordmarkFontPdf}" FontWeight="Bold" FontSize="21.45" Foreground="{DynamicResource AccentLogo}"/></TextBlock>
<TextBlock><Run Text="MMD " FontFamily="{DynamicResource WordmarkFont}" FontSize="16.5" Foreground="{DynamicResource TextBrush}"/><Run Text="PDF" FontFamily="{DynamicResource WordmarkFontPdf}" FontWeight="Bold" FontSize="21.45" Foreground="{DynamicResource AccentLogo}"/></TextBlock>
</StackPanel>
</Grid>
</StackPanel>
@@ -1405,7 +1405,7 @@
from. Measured on the running app: the card's canvas is BgCanvas #3a3a3a (lum 58) and
SurfaceBrush is #333333 (lum 51) - seven steps apart, so the 8px gutter read as the
same gray as the card and the whole thing looked like one flat field with a hairline
in it, shadow and all. KillerShell gets its lift from PaneBrush #3a3a3a on
in it, shadow and all. MMD PDF gets its lift from PaneBrush #3a3a3a on
BackgroundBrush #1c1c1c, thirty steps; this is the identical relationship, and it also
matches the sidebar and footer, which already paint BackgroundBrush. The sidebar and
the card both paint over this, so only the exposed gutter changes. -->
@@ -1418,10 +1418,10 @@
shrinks to 24px (the toggle strip width). -->
<ColumnDefinition x:Name="SidebarCol" Width="180" MinWidth="24" MaxWidth="234"/>
<!-- Was a 6px drag-handle column. The splitter has since moved INSIDE the sidebar
(SidebarSplitter, Grid.Column 0, right-aligned, ZIndex 50 - the KillerNotes
(SidebarSplitter, Grid.Column 0, right-aligned, ZIndex 50 - the MMD PDF
pattern), so nothing lives here any more and the 6px was pure dead space
between the rail and the document card. Killendar and KillerShell butt the
card straight against the rail; this made KillerPDF's rail read ~7px wider
between the rail and the document card. MMD PDF and MMD PDF butt the
card straight against the rail; this made MmdPdf's rail read ~7px wider
than the rest of the family. Kept as a zero column rather than deleted so
DocCol stays index 2 and every Grid.Column in this grid, plus
ApplySidebarSide, keeps working unchanged. -->
@@ -1521,7 +1521,7 @@
Foreground="{DynamicResource MutedTextBrush}"
Margin="2,0,0,0"/>
</DockPanel><!-- /PageControlsRow -->
<!-- Scrollable page list (virtualized). As in KillerShell, the opacity mask
<!-- Scrollable page list (virtualized). As in MMD PDF, the opacity mask
fades the list itself so the real themed sidebar and grain remain visible
behind it. SyncPageListEdgeFades drives the stops; 98SE makes the mask
fully opaque because that theme deliberately has no edge fades. -->
@@ -2086,138 +2086,11 @@
</ContextMenu>
</Button.ContextMenu>
</Button>
<Button x:Name="RailThemeBtn" Click="RailTheme_Click"
Cursor="Hand" FocusVisualStyle="{x:Null}"
ToolTip="{DynamicResource Str_Theme}"
Width="24" Height="24" Padding="0" Margin="0,0,0,6">
<Button.Template>
<ControlTemplate TargetType="Button">
<Border Background="Transparent">
<TextBlock Text="&#xE790;"
FontFamily="Segoe MDL2 Assets" FontSize="15"
HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock.Effect>
<DropShadowEffect Color="Black" BlurRadius="4" ShadowDepth="2" Direction="270" Opacity="{DynamicResource IconShadowOpacity}"/>
</TextBlock.Effect>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="{DynamicResource TextBrush}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=Button}}" Value="True">
<Setter Property="Foreground" Value="{DynamicResource PrimaryBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Border>
</ControlTemplate>
</Button.Template>
<Button.ContextMenu>
<ContextMenu x:Name="ThemeFlyout">
<!-- Family flyout standard: chrome ONLY from FlyoutCard/FlyoutGrain, grain LAST. -->
<ContextMenu.Template>
<ControlTemplate TargetType="ContextMenu">
<Border Style="{StaticResource FlyoutCard}">
<Grid>
<ItemsPresenter/>
<Border Style="{StaticResource FlyoutGrain}"/>
<Border Panel.ZIndex="1" IsHitTestVisible="False" CornerRadius="{DynamicResource FlyoutCornerRadius}" BorderBrush="{DynamicResource BevelLightBrush}" BorderThickness="{DynamicResource BevelLightThickness}"/>
<Border Panel.ZIndex="1" IsHitTestVisible="False" CornerRadius="{DynamicResource FlyoutCornerRadius}" BorderBrush="{DynamicResource BevelDarkBrush}" BorderThickness="{DynamicResource BevelDarkThickness}"/>
</Grid>
</Border>
</ControlTemplate>
</ContextMenu.Template>
<ContextMenu.ItemContainerStyle>
<Style TargetType="MenuItem" BasedOn="{StaticResource PanelMenuItem}"/>
</ContextMenu.ItemContainerStyle>
<!-- #199 (Ryokoxx's design): the accent picker is a vertical STRIP beside the
list, not rows inside it. The list is the same height on every theme, so
the bottom-pinned card never moves; the strip animates its WIDTH toward
the document side. Swatch colors are painted per family in code
(PopulateAccentStrip). -->
<Grid x:Name="ThemePickerLayout" Margin="12,10,3,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel x:Name="ThemeSubmenu" Width="120" Grid.Column="0">
<RadioButton x:Name="ThemeDarkRadio"
Content="{DynamicResource Str_Theme_Dark}"
GroupName="ThemeGroup"
Style="{StaticResource ThemeRadio}"
Checked="ThemeDarkRadio_Checked"/>
<!-- Each family's picker sits under its own theme. The rows animate their HEIGHT
(clipped), so when you switch, the old row shrinks while the new one grows by
the same amount: the picker slides to the selected theme and the total menu
height never changes. ROYGBIV order. -->
<RadioButton x:Name="ThemeLightRadio"
Content="{DynamicResource Str_Theme_Light}"
GroupName="ThemeGroup"
Style="{StaticResource ThemeRadio}"
Checked="ThemeLightRadio_Checked"/>
<RadioButton x:Name="ThemeHCRadio"
Content="{DynamicResource Str_Theme_Black}"
GroupName="ThemeGroup"
Style="{StaticResource ThemeRadio}"
Checked="ThemeHCRadio_Checked"/>
<RadioButton x:Name="Theme98SERadio" Content="{DynamicResource Str_Theme_98SE}" GroupName="ThemeGroup" Style="{StaticResource ThemeRadio}" Checked="Theme98SERadio_Checked"/>
<RadioButton x:Name="ThemeBloodRadio"
Content="{DynamicResource Str_Theme_Blood}"
GroupName="ThemeGroup"
Style="{StaticResource ThemeRadio}"
Checked="ThemeBloodRadio_Checked"/>
<RadioButton x:Name="ThemeGreedRadio"
Content="{DynamicResource Str_Theme_Greed}"
GroupName="ThemeGroup"
Style="{StaticResource ThemeRadio}"
Checked="ThemeGreedRadio_Checked"/>
<RadioButton x:Name="ThemeCyanoticRadio"
Content="{DynamicResource Str_Theme_Cyanotic}"
GroupName="ThemeGroup"
Style="{StaticResource ThemeRadio}"
Checked="ThemeCyanoticRadio_Checked"/>
<RadioButton x:Name="ThemeEctoplasmRadio" Content="{DynamicResource Str_Theme_Ectoplasm}" GroupName="ThemeGroup" Style="{StaticResource ThemeRadio}" Checked="ThemeEctoplasmRadio_Checked"/>
<RadioButton x:Name="ThemeDecayRadio" Content="{DynamicResource Str_Theme_Decay}" GroupName="ThemeGroup" Style="{StaticResource ThemeRadio}" Checked="ThemeDecayRadio_Checked"/>
<RadioButton x:Name="ThemeMalaiseRadio" Content="{DynamicResource Str_Theme_Malaise}" GroupName="ThemeGroup" Style="{StaticResource ThemeRadio}" Checked="ThemeMalaiseRadio_Checked"/>
<RadioButton x:Name="ThemeSepulchreRadio" Content="{DynamicResource Str_Theme_Sepulchre}" GroupName="ThemeGroup" Style="{StaticResource ThemeRadio}" Checked="ThemeSepulchreRadio_Checked"/>
<RadioButton x:Name="ThemeDeliriumRadio" Content="{DynamicResource Str_Theme_Delirium}" GroupName="ThemeGroup" Style="{StaticResource ThemeRadio}" Checked="ThemeDeliriumRadio_Checked"/>
<RadioButton x:Name="ThemeMourningRadio" Content="{DynamicResource Str_Theme_Mourning}" GroupName="ThemeGroup" Style="{StaticResource ThemeRadio}" Checked="ThemeMourningRadio_Checked"/>
</StackPanel>
<Grid x:Name="AccentStripHost" Grid.Column="1" Width="0" ClipToBounds="True">
<Border x:Name="AccentStripDivider" Width="1" HorizontalAlignment="Left" Margin="0,6"
Background="{DynamicResource MenuBorderBrush}"/>
<!-- Six equal rows stretched over the list's full height: the swatches
are tall pills, not dots, filling the vertical room the strip has.
Height="Auto" clears the AccentDot style's fixed 18 so the rows
size them; the 9px radius caps the 18px width into capsule ends
(98SE's 0 keeps them square). -->
<Grid x:Name="AccentStrip" Margin="7,6,2,6">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Border x:Name="AccentStripDot0" Grid.Row="0" Style="{StaticResource AccentDot}" Width="26" Height="Auto" VerticalAlignment="Stretch" Margin="0,0,0,8" MouseLeftButtonUp="AccentStripDot_Click"/>
<Border x:Name="AccentStripDot1" Grid.Row="1" Style="{StaticResource AccentDot}" Width="26" Height="Auto" VerticalAlignment="Stretch" Margin="0,0,0,8" MouseLeftButtonUp="AccentStripDot_Click"/>
<Border x:Name="AccentStripDot2" Grid.Row="2" Style="{StaticResource AccentDot}" Width="26" Height="Auto" VerticalAlignment="Stretch" Margin="0,0,0,8" MouseLeftButtonUp="AccentStripDot_Click"/>
<Border x:Name="AccentStripDot3" Grid.Row="3" Style="{StaticResource AccentDot}" Width="26" Height="Auto" VerticalAlignment="Stretch" Margin="0,0,0,8" MouseLeftButtonUp="AccentStripDot_Click"/>
<Border x:Name="AccentStripDot4" Grid.Row="4" Style="{StaticResource AccentDot}" Width="26" Height="Auto" VerticalAlignment="Stretch" Margin="0,0,0,8" MouseLeftButtonUp="AccentStripDot_Click"/>
<Border x:Name="AccentStripDot5" Grid.Row="5" Style="{StaticResource AccentDot}" Width="26" Height="Auto" VerticalAlignment="Stretch" Margin="0" MouseLeftButtonUp="AccentStripDot_Click"/>
</Grid>
</Grid>
</Grid>
</ContextMenu>
</Button.ContextMenu>
</Button>
</StackPanel>
</Grid>
</Border>
<!-- RESIZE GRIP - KillerShell's TreeResizeGrip, verbatim in shape and reasoning.
<!-- RESIZE GRIP - MMD PDF's TreeResizeGrip, verbatim in shape and reasoning.
A Thumb rather than a GridSplitter: a splitter resizes the two columns either side
of it, and this handle's neighbor is the 24px rail, which must never move. Driving
SidebarCol's width by hand lets the document column absorb the change instead, and
@@ -2241,7 +2114,7 @@
<Thumb.Template>
<ControlTemplate TargetType="Thumb">
<!-- Transparent, not empty: a Border with no Background is not hit-testable
and the grip would be unusable (KillerShell's note). -->
and the grip would be unusable (MMD PDF's note). -->
<Border Background="Transparent">
<Border x:Name="line" Width="1" HorizontalAlignment="Center"
Background="{DynamicResource CardBorderBrush}" Margin="0,12" Opacity="0"/>
@@ -2296,7 +2169,7 @@
line with no border, so there is no corner to join and a cap would draw a stray
rule across the gap. -->
<!-- Document pane: row 1 of the document column.
A lifted card, matching KillerShell's ResultsPane and the rest of the family:
A lifted card, matching MMD PDF's ResultsPane and the rest of the family:
RadCard corners, 1px pane border, PaneShadow cast DOWN over the footer, and an
8px inset on the outer side (ApplySidebarSide moves the inset to whichever side
the document is on). No bottom margin - a DropShadowEffect draws outside the
@@ -2326,7 +2199,7 @@
TWO HANDLES, not one. Whichever you grab is the pane you are sizing: the left handle
sits on A's inner edge, the right on B's. Both clamp against BOTH minimums, so
neither pane can be squeezed below MinPaneWidth from either side. Deliberately not
KillerShell's single PaneSplitV. -->
MMD PDF's single PaneSplitV. -->
<!-- RowSpan 2: each pane contains its own tab strip in its first row, so the panes have
to occupy the row a window-level tab band would use. The -1 top margin lives on the
card INSIDE the control, since it tucks the card under that pane's own strip. -->
@@ -2370,7 +2243,7 @@
painted over by it: root-grid children all default to 0 and ties break on declaration
order, and this is declared after MainContentGrid. Pushing the footer down rather than
lifting the content keeps the About overlay - declared later still - on top of both.
(Family rule; see KillerShell and Killendar.) -->
(Family rule; see MMD PDF and MMD PDF.) -->
<Border Grid.Row="4" x:Name="FooterBorder" Panel.ZIndex="-1"
Background="{DynamicResource BackgroundBrush}">
<Grid>
@@ -2406,17 +2279,6 @@
<Grid x:Name="PortableBadge" Grid.Column="0" Grid.ColumnSpan="3" Panel.ZIndex="3"
HorizontalAlignment="Left" VerticalAlignment="Center"
Visibility="Collapsed">
<Button x:Name="InstallBtn" Content="{DynamicResource Str_InstallBtn}"
Click="Install_Click" Style="{StaticResource OutlineButton}"
FontFamily="{DynamicResource UiFont}" FontSize="10"
Padding="8,1"
VerticalAlignment="Center">
<!-- The footer action is deliberately a plain rectangle even in themes
whose larger dialog controls use rounded corners. -->
<Button.Resources>
<CornerRadius x:Key="ControlCornerRadius">0</CornerRadius>
</Button.Resources>
</Button>
</Grid>
<Grid Grid.Column="2" HorizontalAlignment="Right" Margin="{DynamicResource FooterCellMargin}">
<Border IsHitTestVisible="False" BorderBrush="{DynamicResource FooterBevelDarkBrush}" BorderThickness="{DynamicResource FooterCellLightThickness}" Panel.ZIndex="2"/>
@@ -2435,7 +2297,7 @@
<Hyperlink NavigateUri="https://thekiller.net"
RequestNavigate="Hyperlink_RequestNavigate"
Foreground="{DynamicResource TextFooter}" TextDecorations="None">
<Run Text="Steve the Killer"/>
<Run Text="MMD Steel Group IT"/>
</Hyperlink>
</TextBlock>
</StackPanel>
@@ -2532,7 +2394,7 @@
<Border Grid.RowSpan="2" Panel.ZIndex="1" IsHitTestVisible="False" BorderBrush="{DynamicResource BevelLightBrush}" BorderThickness="{DynamicResource BevelLightThickness}"/>
<Border Grid.RowSpan="2" Panel.ZIndex="1" IsHitTestVisible="False" BorderBrush="{DynamicResource BevelDarkBrush}" BorderThickness="{DynamicResource BevelDarkThickness}"/>
<Border Grid.RowSpan="2" CornerRadius="{DynamicResource FlyoutCornerRadius}" IsHitTestVisible="False" Opacity="{DynamicResource GrainOpacity}" Background="{StaticResource GrainBrushShared}"/>
<!-- Modern close follows the KillerNotes shortcut card: it is anchored to the
<!-- Modern close follows the MMD PDF shortcut card: it is anchored to the
card itself, not pushed inward by the content padding. -->
<Button Grid.RowSpan="2" Click="ShortcutOverlayClose_Click"
HorizontalAlignment="Right" VerticalAlignment="Top"
@@ -2557,7 +2419,7 @@
CanContentScroll="False">
<StackPanel Margin="18,14,18,18">
<Grid Margin="0,0,0,12">
<!-- Family overlay title, KillerShell's SectionHeader recipe: Consolas 13
<!-- Family overlay title, MMD PDF's SectionHeader recipe: Consolas 13
SemiBold in PrimaryBrush. HeaderLineBrush was the rule color, dark on
dark and unreadable, and the shadow rasterized the text. -->
<TextBlock Text="{DynamicResource Str_KS_Title}"
@@ -2593,7 +2455,7 @@
<StackPanel x:Name="ShortcutKeyboardHost" Visibility="Collapsed"/>
<TextBlock HorizontalAlignment="Right" Margin="0,14,0,0" FontFamily="Consolas" FontSize="11">
<Hyperlink Click="OnlineHelp_Click" Foreground="{DynamicResource PrimaryBrush}"
ToolTip="https://killerpdf.net/help.html"><Run Text="{DynamicResource Str_KS_OnlineHelp}"/></Hyperlink>
ToolTip="https://baobab-ts.com/help.html"><Run Text="{DynamicResource Str_KS_OnlineHelp}"/></Hyperlink>
</TextBlock>
</StackPanel>
</ScrollViewer>
@@ -2630,7 +2492,7 @@
<Border Grid.Row="0" Height="{DynamicResource DialogTitleBarHeight}" Background="{DynamicResource DialogTitleBarBrush}"
Visibility="{DynamicResource AboutCaptionVisibility}">
<Grid Margin="5,0,2,0">
<TextBlock Text="KillerPDF" VerticalAlignment="Center" FontFamily="{DynamicResource ChromeFontFamily}"
<TextBlock Text="MMD PDF" VerticalAlignment="Center" FontFamily="{DynamicResource ChromeFontFamily}"
FontSize="11" FontWeight="Bold" Foreground="{DynamicResource ChromeTextBrush}"/>
<Button Click="AboutOverlayClose_Click" HorizontalAlignment="Right" VerticalAlignment="Center"
Width="{DynamicResource AboutCloseWidth}" Height="{DynamicResource AboutCloseHeight}"
@@ -2646,9 +2508,9 @@
</Border>
<Grid Grid.Row="1" Margin="18,10,18,18">
<StackPanel Margin="0">
<!-- Header: bloody KillerPDF icon to the left of the title + tagline.
<!-- Header: bloody MmdPdf icon to the left of the title + tagline.
A Grid (not a horizontal StackPanel) so the text column is bounded and the
tagline wraps to fill two lines (same pattern as KillerScan's About).
tagline wraps to fill two lines (same pattern as MMD PDF's About).
Width is pinned to the info panel below, so the card's width is still
determined by the SHA256 line - never by the tagline text. -->
<Grid Margin="0,4,0,14" Width="{Binding ActualWidth, ElementName=AboutInfoGrid}">
@@ -2656,7 +2518,7 @@
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Image Grid.Column="0" Source="pack://application:,,,/Resources/kp-icon.png"
<Image Grid.Column="0" Source="pack://application:,,,/Resources/mmd-icon.png"
Width="58" Height="58" Margin="0,0,15,0"
VerticalAlignment="Center"
RenderOptions.BitmapScalingMode="HighQuality">
@@ -2668,7 +2530,7 @@
<!-- Logo (populated in code-behind), with a soft layered shadow -->
<Grid Margin="0,0,0,4">
<!-- Shadow copy populated in code-behind (BuildAboutLogo) with the SAME
runs as the real wordmark. A static flat-size "KillerPDF" here sat
runs as the real wordmark. A static flat-size "MmdPdf" here sat
at different metrics than the two-run logo and read as a long smear
floating above the word instead of a shadow behind it. -->
<TextBlock x:Name="AboutLogoShadowBlock"
@@ -2819,7 +2681,7 @@
</StackPanel>
</Grid>
<!-- Modern close: anchored to the CARD's corner (root grid), not pushed inward by
the content padding - KillerScan's geometry, taken as the reference. -->
the content padding - MMD PDF's geometry, taken as the reference. -->
<Button Grid.RowSpan="2" Click="AboutOverlayClose_Click"
HorizontalAlignment="Right" VerticalAlignment="Top" Panel.ZIndex="7"
Width="{DynamicResource AboutCloseWidth}" Height="{DynamicResource AboutCloseHeight}"