feat(ui): Help overlay with Info/Donate tabs, fixed dimensions

Help button now shows a fixed-size two-tab overlay:

Info tab: app name + version, one-line description, thin separator,
  © 2026 Davide Grilli — MIT License, Built with .NET 10 · Avalonia 12 · NBitcoin.

Donate tab: dev address (plm1qdq3…) read-only display, free amount
  input, prepare-preview row, confirm-and-broadcast button.

Overlay dimensions are stable across tabs and between desktop/mobile:
- TabControl Height=320 (fixed, never resizes on tab switch)
- HorizontalAlignment=Stretch + MaxWidth=440 on the card (always fills
  available width; previously Center caused the card to shrink to content
  width, which differed between Info and Donate)
- Each tab content wrapped in ScrollViewer for safe overflow handling

New MainWindowViewModel.Donate.cs: PrepareDonate / ConfirmDonate /
ResetDonate (called on overlay close). Six-language Loc keys added for
all donate strings.
This commit is contained in:
2026-06-17 09:01:01 +02:00
parent b13b66160c
commit 96b6a7e291
+63 -48
View File
@@ -1373,71 +1373,86 @@
<Border Background="{DynamicResource OverlayCardBrush}" <Border Background="{DynamicResource OverlayCardBrush}"
BorderBrush="{DynamicResource BorderSubtleBrush}" BorderThickness="1" CornerRadius="8" BorderBrush="{DynamicResource BorderSubtleBrush}" BorderThickness="1" CornerRadius="8"
MaxWidth="440" Margin="16" MaxWidth="440" Margin="16"
HorizontalAlignment="Center" VerticalAlignment="Center"> HorizontalAlignment="Stretch" VerticalAlignment="Center">
<StackPanel Margin="24" Spacing="16"> <StackPanel Margin="24" Spacing="16">
<TextBlock Text="{Binding Loc[help.title]}" <TextBlock Text="{Binding Loc[help.title]}"
FontSize="18" FontWeight="Bold"/> FontSize="18" FontWeight="Bold"/>
<TabControl> <!-- Fixed height so the overlay never resizes when switching tabs. -->
<TabControl Height="320">
<!-- Tab: Info --> <!-- Tab: Info -->
<TabItem Header="{Binding Loc[help.tab.info]}"> <TabItem Header="{Binding Loc[help.tab.info]}">
<StackPanel Spacing="12" Margin="0,12,0,0"> <ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Spacing="4"> <StackPanel Spacing="12" Margin="0,12,0,0">
<TextBlock Text="Palladium Wallet" FontSize="16" FontWeight="Bold"/> <StackPanel Spacing="4">
<TextBlock Text="{Binding WindowTitle}" FontSize="12" <TextBlock Text="Palladium Wallet" FontSize="16" FontWeight="Bold"/>
Foreground="{DynamicResource TextSecondaryBrush}"/> <TextBlock Text="{Binding WindowTitle}" FontSize="12"
Foreground="{DynamicResource TextSecondaryBrush}"/>
</StackPanel>
<TextBlock Text="{Binding Loc[help.info]}" TextWrapping="Wrap"/>
<Border BorderBrush="{DynamicResource BorderSubtleBrush}"
BorderThickness="0,1,0,0" Margin="0,4,0,0"/>
<StackPanel Spacing="4">
<TextBlock Text="© 2026 Davide Grilli — MIT License"
FontSize="12"
Foreground="{DynamicResource TextSecondaryBrush}"/>
<TextBlock Text="Built with .NET 10 · Avalonia 12 · NBitcoin"
FontSize="11"
Foreground="{DynamicResource TextSecondaryBrush}"/>
</StackPanel>
</StackPanel> </StackPanel>
<TextBlock Text="{Binding Loc[help.info]}" TextWrapping="Wrap"/> </ScrollViewer>
</StackPanel>
</TabItem> </TabItem>
<!-- Tab: Donate --> <!-- Tab: Donate -->
<TabItem Header="{Binding Loc[help.tab.donate]}"> <TabItem Header="{Binding Loc[help.tab.donate]}">
<StackPanel Spacing="12" Margin="0,12,0,0"> <ScrollViewer VerticalScrollBarVisibility="Auto">
<TextBlock Text="{Binding Loc[donate.desc]}" TextWrapping="Wrap" <StackPanel Spacing="12" Margin="0,12,0,0">
Foreground="{DynamicResource TextSecondaryBrush}"/> <TextBlock Text="{Binding Loc[donate.desc]}" TextWrapping="Wrap"
<!-- Dev address (read-only) -->
<StackPanel Spacing="4">
<TextBlock Text="{Binding Loc[donate.dev.address]}" FontSize="11"
Foreground="{DynamicResource TextSecondaryBrush}"/> Foreground="{DynamicResource TextSecondaryBrush}"/>
<SelectableTextBlock Text="{x:Static vm:MainWindowViewModel.DevAddress}"
FontFamily="monospace" FontSize="11"
TextWrapping="Wrap"/>
</StackPanel>
<!-- Amount input --> <!-- Dev address (read-only) -->
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Text="{Binding Loc[donate.amount]}" FontSize="11" <TextBlock Text="{Binding Loc[donate.dev.address]}" FontSize="11"
Foreground="{DynamicResource TextSecondaryBrush}"/>
<Grid ColumnDefinitions="*,Auto">
<TextBox Grid.Column="0"
Text="{Binding DonateAmount}"
PlaceholderText="{Binding UnitLabel}"/>
<TextBlock Grid.Column="1" Text="{Binding UnitLabel}"
VerticalAlignment="Center" Margin="8,0,0,0"
Foreground="{DynamicResource TextSecondaryBrush}"/> Foreground="{DynamicResource TextSecondaryBrush}"/>
</Grid> <SelectableTextBlock Text="{x:Static vm:MainWindowViewModel.DevAddress}"
</StackPanel> FontFamily="monospace" FontSize="11"
TextWrapping="Wrap"/>
</StackPanel>
<!-- Preview --> <!-- Amount input -->
<SelectableTextBlock Text="{Binding DonatePreview}" <StackPanel Spacing="4">
IsVisible="{Binding DonatePreview, <TextBlock Text="{Binding Loc[donate.amount]}" FontSize="11"
Converter={x:Static StringConverters.IsNotNullOrEmpty}}" Foreground="{DynamicResource TextSecondaryBrush}"/>
FontFamily="monospace" FontSize="11" <Grid ColumnDefinitions="*,Auto">
TextWrapping="Wrap" <TextBox Grid.Column="0"
Foreground="{DynamicResource TextSecondaryBrush}"/> Text="{Binding DonateAmount}"
PlaceholderText="{Binding UnitLabel}"/>
<TextBlock Grid.Column="1" Text="{Binding UnitLabel}"
VerticalAlignment="Center" Margin="8,0,0,0"
Foreground="{DynamicResource TextSecondaryBrush}"/>
</Grid>
</StackPanel>
<!-- Buttons --> <!-- Preview -->
<StackPanel Orientation="Horizontal" Spacing="8" HorizontalAlignment="Right"> <SelectableTextBlock Text="{Binding DonatePreview}"
<Button Content="{Binding Loc[donate.confirm]}" IsVisible="{Binding DonatePreview,
Classes="accent" Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
IsEnabled="{Binding HasPendingDonate}" FontFamily="monospace" FontSize="11"
Command="{Binding ConfirmDonateCommand}"/> TextWrapping="Wrap"
<Button Content="{Binding Loc[donate.prepare]}" Foreground="{DynamicResource TextSecondaryBrush}"/>
Command="{Binding PrepareDonateCommand}"/>
<!-- Buttons -->
<StackPanel Orientation="Horizontal" Spacing="8" HorizontalAlignment="Right">
<Button Content="{Binding Loc[donate.confirm]}"
Classes="accent"
IsEnabled="{Binding HasPendingDonate}"
Command="{Binding ConfirmDonateCommand}"/>
<Button Content="{Binding Loc[donate.prepare]}"
Command="{Binding PrepareDonateCommand}"/>
</StackPanel>
</StackPanel> </StackPanel>
</StackPanel> </ScrollViewer>
</TabItem> </TabItem>
</TabControl> </TabControl>