2026-10-15 01:14:44 +02:00
|
|
|
<UserControl xmlns="https://github.com/avaloniaui"
|
|
|
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
|
|
|
xmlns:vm="using:MeWeb.App.ViewModels"
|
2026-10-15 22:49:40 +02:00
|
|
|
xmlns:v="using:MeWeb.App.Views"
|
2026-10-15 01:14:44 +02:00
|
|
|
xmlns:s="using:MeWeb.App.Services"
|
2026-10-15 09:10:37 +02:00
|
|
|
xmlns:sys="using:System"
|
2026-10-15 01:14:44 +02:00
|
|
|
x:Class="MeWeb.App.Views.MainView"
|
|
|
|
|
x:DataType="vm:MainViewModel"
|
|
|
|
|
FlowDirection="{Binding Flow}"
|
|
|
|
|
Background="{StaticResource GroundBrush}">
|
2026-10-15 08:08:37 +02:00
|
|
|
<UserControl.Resources>
|
|
|
|
|
<DataTemplate x:Key="CardTemplate" x:DataType="vm:CardViewModel">
|
|
|
|
|
<Border Classes="card"
|
|
|
|
|
Classes.good="{Binding IsGood}" Classes.caution="{Binding IsCaution}"
|
|
|
|
|
Classes.bad="{Binding IsBad}" Classes.unknown="{Binding IsUnknown}" Classes.info="{Binding IsInfo}">
|
|
|
|
|
<StackPanel Spacing="10">
|
|
|
|
|
<Grid ColumnDefinitions="Auto,*,Auto">
|
|
|
|
|
<Path Grid.Column="0" Classes="icon" Data="{Binding Icon}" VerticalAlignment="Center" />
|
|
|
|
|
<TextBlock Grid.Column="1" Classes="cardTitle" Text="{Binding Title}" />
|
|
|
|
|
<Border Grid.Column="2" Classes="chip">
|
|
|
|
|
<TextBlock Text="{Binding OutcomeFormatted}" />
|
|
|
|
|
</Border>
|
|
|
|
|
</Grid>
|
|
|
|
|
<ProgressBar Classes="thin" IsIndeterminate="True" IsVisible="{Binding ShowRunning}" />
|
|
|
|
|
<TextBlock Classes="summary" Text="{Binding Summary}" IsVisible="{Binding ShowSettled}" />
|
|
|
|
|
<ItemsControl ItemsSource="{Binding Facts}" IsVisible="{Binding ShowSettled}">
|
|
|
|
|
<ItemsControl.ItemTemplate>
|
|
|
|
|
<DataTemplate x:DataType="vm:FactViewModel">
|
|
|
|
|
<Grid ColumnDefinitions="2*,3*" Margin="0,3">
|
|
|
|
|
<TextBlock Grid.Column="0" Classes="factLabel" Text="{Binding Label}" />
|
|
|
|
|
<StackPanel Grid.Column="1">
|
|
|
|
|
<SelectableTextBlock Classes="factValue" Text="{Binding Value}" IsVisible="{Binding ShowValue}" />
|
2026-10-15 22:49:40 +02:00
|
|
|
<v:CopyField Text="{Binding CopyText}" CopyId="{Binding CopyAutomationId}" IsVisible="{Binding ShowCopy}" />
|
2026-10-15 11:11:24 +02:00
|
|
|
<Button Classes="link" IsVisible="{Binding ShowSource}"
|
2026-10-15 08:08:37 +02:00
|
|
|
AutomationProperties.AutomationId="{Binding AutomationId}"
|
2026-10-15 11:11:24 +02:00
|
|
|
Command="{Binding OpenCommand}">
|
|
|
|
|
<TextBlock Text="{Binding Source}" TextWrapping="Wrap" />
|
|
|
|
|
</Button>
|
2026-10-15 19:44:18 +02:00
|
|
|
<TextBlock Classes="small" Text="{Binding Source}" IsVisible="{Binding ShowNote}" Margin="0,2" />
|
2026-10-15 11:11:24 +02:00
|
|
|
<Button Classes="link" IsVisible="{Binding ShowPlainLink}"
|
2026-10-15 08:08:37 +02:00
|
|
|
AutomationProperties.AutomationId="{Binding AutomationId}"
|
2026-10-15 11:11:24 +02:00
|
|
|
Command="{Binding OpenCommand}">
|
|
|
|
|
<TextBlock Text="{Binding Value}" TextWrapping="Wrap" />
|
|
|
|
|
</Button>
|
2026-10-15 08:08:37 +02:00
|
|
|
</StackPanel>
|
|
|
|
|
</Grid>
|
|
|
|
|
</DataTemplate>
|
|
|
|
|
</ItemsControl.ItemTemplate>
|
|
|
|
|
</ItemsControl>
|
|
|
|
|
<Expander Classes="explain" Header="{s:Tr WhatIsThis}" IsExpanded="{Binding IsExpanded}"
|
|
|
|
|
AutomationProperties.AutomationId="{Binding ExplainAutomationId}">
|
|
|
|
|
<TextBlock Classes="body" FontSize="14" Text="{Binding Explain}" />
|
|
|
|
|
</Expander>
|
|
|
|
|
</StackPanel>
|
|
|
|
|
</Border>
|
|
|
|
|
</DataTemplate>
|
|
|
|
|
</UserControl.Resources>
|
|
|
|
|
|
2026-10-15 04:39:03 +02:00
|
|
|
<Grid>
|
|
|
|
|
<DockPanel>
|
|
|
|
|
<Grid DockPanel.Dock="Top" ColumnDefinitions="*,Auto,Auto" Margin="20,14,20,6">
|
2026-10-15 22:49:40 +02:00
|
|
|
<TextBlock Grid.Column="0" Classes="title" Text="{s:Tr AppName}" VerticalAlignment="Center" />
|
2026-10-15 04:39:03 +02:00
|
|
|
<Button Grid.Column="1" Classes="round" Margin="0,0,10,0" VerticalAlignment="Center"
|
|
|
|
|
AutomationProperties.AutomationId="main-contacts"
|
|
|
|
|
AutomationProperties.Name="{s:Tr Contacts}"
|
|
|
|
|
ToolTip.Tip="{s:Tr Contacts}"
|
|
|
|
|
Command="{Binding ToggleContactsCommand}">
|
|
|
|
|
<Path Classes="icon" Data="{StaticResource IconInfo}" />
|
|
|
|
|
</Button>
|
|
|
|
|
<ComboBox Grid.Column="2" MinWidth="150" MaxWidth="220" VerticalAlignment="Center"
|
|
|
|
|
AutomationProperties.AutomationId="main-language"
|
|
|
|
|
AutomationProperties.Name="{s:Tr Language}"
|
|
|
|
|
ItemsSource="{Binding Languages}"
|
|
|
|
|
SelectedItem="{Binding SelectedLanguage}">
|
|
|
|
|
<ComboBox.ItemTemplate>
|
|
|
|
|
<DataTemplate x:DataType="s:Language">
|
|
|
|
|
<TextBlock Text="{Binding Name}" />
|
|
|
|
|
</DataTemplate>
|
|
|
|
|
</ComboBox.ItemTemplate>
|
|
|
|
|
</ComboBox>
|
|
|
|
|
</Grid>
|
2026-10-15 01:14:44 +02:00
|
|
|
|
2026-10-15 04:39:03 +02:00
|
|
|
<StackPanel DockPanel.Dock="Bottom" Spacing="4" Margin="16,6,16,10" HorizontalAlignment="Center">
|
|
|
|
|
<StackPanel Orientation="Horizontal" Spacing="8" HorizontalAlignment="Center" IsVisible="{Binding ShowDraftNotice}">
|
|
|
|
|
<TextBlock Classes="small" Text="{s:Tr DraftNotice}" VerticalAlignment="Center" />
|
|
|
|
|
<Button Classes="link" Content="{s:Tr SuggestCorrection}"
|
|
|
|
|
AutomationProperties.AutomationId="main-suggest-correction"
|
|
|
|
|
Command="{Binding OpenCorrectionsCommand}" />
|
|
|
|
|
</StackPanel>
|
|
|
|
|
<TextBlock Classes="small" Text="{Binding VersionFormatted}" HorizontalAlignment="Center" />
|
2026-10-15 01:14:44 +02:00
|
|
|
</StackPanel>
|
|
|
|
|
|
2026-10-15 08:08:37 +02:00
|
|
|
<ScrollViewer x:Name="Scroller" HorizontalScrollBarVisibility="Disabled">
|
2026-10-15 04:39:03 +02:00
|
|
|
<StackPanel Spacing="26" Margin="8,4,8,24">
|
|
|
|
|
<Border Classes="banner" IsVisible="{Binding ShowUpdate}">
|
|
|
|
|
<StackPanel Orientation="Horizontal" Spacing="12">
|
|
|
|
|
<TextBlock Classes="body" Text="{Binding UpdateFormatted}" VerticalAlignment="Center" />
|
|
|
|
|
<Button Classes="quiet" Content="{s:Tr UpdateOpen}"
|
|
|
|
|
AutomationProperties.AutomationId="main-update"
|
|
|
|
|
Command="{Binding OpenDownloadsCommand}" />
|
|
|
|
|
</StackPanel>
|
|
|
|
|
</Border>
|
|
|
|
|
|
2026-10-15 08:08:37 +02:00
|
|
|
<StackPanel Spacing="16" HorizontalAlignment="Center" MaxWidth="600" Margin="8,6,8,0" IsVisible="{Binding !HasResults}">
|
2026-10-15 04:39:03 +02:00
|
|
|
<Grid Width="120" Height="120" HorizontalAlignment="Center">
|
|
|
|
|
<Ellipse Classes="pulse" Width="120" Height="120" IsVisible="{Binding ShowChecking}" />
|
|
|
|
|
<Ellipse Width="96" Height="96" Fill="{StaticResource SurfaceRaisedBrush}" Stroke="{StaticResource LineBrush}" StrokeThickness="2" />
|
|
|
|
|
<Ellipse Width="54" Height="54" Fill="{StaticResource GoodBrush}" IsVisible="{Binding ShowOnline}" />
|
|
|
|
|
<Ellipse Width="54" Height="54" Fill="{StaticResource CautionBrush}" IsVisible="{Binding ShowCaptive}" />
|
|
|
|
|
<Ellipse Width="54" Height="54" Fill="{StaticResource BadBrush}" IsVisible="{Binding ShowOffline}" />
|
|
|
|
|
<Ellipse Width="54" Height="54" Fill="{StaticResource TextSoftBrush}" Opacity="0.4" IsVisible="{Binding ShowChecking}" />
|
|
|
|
|
</Grid>
|
|
|
|
|
<TextBlock Classes="status" Text="{Binding StatusFormatted}" />
|
|
|
|
|
<TextBlock Classes="lead" Text="{s:Tr AppTagline}" />
|
|
|
|
|
<Button Classes="primary" Content="{Binding CheckFormatted}"
|
|
|
|
|
AutomationProperties.AutomationId="main-check"
|
|
|
|
|
Command="{Binding CheckCommand}" />
|
|
|
|
|
</StackPanel>
|
|
|
|
|
|
2026-10-15 08:08:37 +02:00
|
|
|
<StackPanel Spacing="6" IsVisible="{Binding HasResults}">
|
2026-10-15 04:39:03 +02:00
|
|
|
<TextBlock Classes="section" Text="{s:Tr PathTitle}" HorizontalAlignment="Center" />
|
2026-10-15 08:08:37 +02:00
|
|
|
<ItemsControl ItemsSource="{Binding Path}" MaxWidth="580" Margin="16,8,16,0">
|
2026-10-15 04:39:03 +02:00
|
|
|
<ItemsControl.ItemTemplate>
|
|
|
|
|
<DataTemplate x:DataType="vm:PathNodeViewModel">
|
|
|
|
|
<StackPanel>
|
2026-10-15 09:10:37 +02:00
|
|
|
<Grid MinHeight="62" Margin="45,0" IsVisible="{Binding ShowConnector}">
|
2026-10-15 08:08:37 +02:00
|
|
|
<Path Classes="wire" Data="{StaticResource WireToEnd}" IsVisible="{Binding WireToEnd}"
|
|
|
|
|
Classes.flowing="{Binding IsRunning}" Classes.lit="{Binding IsLit}" />
|
|
|
|
|
<Path Classes="wire" Data="{StaticResource WireToStart}" IsVisible="{Binding WireToStart}"
|
|
|
|
|
Classes.flowing="{Binding IsRunning}" Classes.lit="{Binding IsLit}" />
|
2026-10-15 09:10:37 +02:00
|
|
|
<StackPanel Spacing="6" Margin="0,12" HorizontalAlignment="Center" VerticalAlignment="Center">
|
|
|
|
|
<Border Classes="linkTag" IsVisible="{Binding ShowLink}">
|
|
|
|
|
<StackPanel Orientation="Horizontal" Spacing="6">
|
|
|
|
|
<Viewbox Width="15" Height="15">
|
|
|
|
|
<Path Classes="icon" Data="{Binding LinkIcon}" />
|
|
|
|
|
</Viewbox>
|
|
|
|
|
<TextBlock Classes="linkLabel" Text="{Binding LinkLabel}" VerticalAlignment="Center" />
|
|
|
|
|
</StackPanel>
|
|
|
|
|
</Border>
|
|
|
|
|
<ItemsControl ItemsSource="{Binding Hops}" IsVisible="{Binding ShowHops}">
|
|
|
|
|
<ItemsControl.ItemsPanel>
|
|
|
|
|
<ItemsPanelTemplate>
|
|
|
|
|
<StackPanel Spacing="6" />
|
|
|
|
|
</ItemsPanelTemplate>
|
|
|
|
|
</ItemsControl.ItemsPanel>
|
|
|
|
|
<ItemsControl.ItemTemplate>
|
|
|
|
|
<DataTemplate x:DataType="sys:String">
|
|
|
|
|
<Border Classes="linkTag hop">
|
|
|
|
|
<StackPanel Orientation="Horizontal" Spacing="6">
|
|
|
|
|
<Viewbox Width="13" Height="13">
|
|
|
|
|
<Path Classes="icon" Data="{StaticResource IconRouter}" />
|
|
|
|
|
</Viewbox>
|
|
|
|
|
<TextBlock Classes="linkLabel" Text="{Binding}" VerticalAlignment="Center" />
|
|
|
|
|
</StackPanel>
|
|
|
|
|
</Border>
|
|
|
|
|
</DataTemplate>
|
|
|
|
|
</ItemsControl.ItemTemplate>
|
|
|
|
|
</ItemsControl>
|
|
|
|
|
</StackPanel>
|
2026-10-15 04:39:03 +02:00
|
|
|
</Grid>
|
2026-10-15 08:08:37 +02:00
|
|
|
<Grid ColumnDefinitions="Auto,*,Auto">
|
|
|
|
|
<Button Grid.Column="{Binding ArtColumn}" Classes="hop" Click="OnHop"
|
|
|
|
|
AutomationProperties.AutomationId="{Binding AutomationId}"
|
|
|
|
|
AutomationProperties.Name="{Binding Title}">
|
|
|
|
|
<Grid Width="90" Height="90" Classes="node" Classes.lit="{Binding IsLit}">
|
|
|
|
|
<Ellipse Classes="pulse" Width="90" Height="90" IsVisible="{Binding IsRunning}" />
|
|
|
|
|
<Ellipse Classes="disc" Width="90" Height="90"
|
|
|
|
|
Classes.good="{Binding IsGood}" Classes.caution="{Binding IsCaution}"
|
|
|
|
|
Classes.bad="{Binding IsBad}" Classes.unknown="{Binding IsUnknown}" />
|
|
|
|
|
<Viewbox Width="58" Height="58">
|
|
|
|
|
<Grid Classes="art" Width="48" Height="48" Classes.running="{Binding IsRunning}"
|
|
|
|
|
Classes.good="{Binding IsGood}" Classes.caution="{Binding IsCaution}"
|
|
|
|
|
Classes.bad="{Binding IsBad}" Classes.unknown="{Binding IsUnknown}">
|
|
|
|
|
<Path Classes="art" Data="{Binding ArtBase}" />
|
|
|
|
|
<Path Classes="art beat b1" Data="{Binding ArtBeat1}" />
|
|
|
|
|
<Path Classes="art beat b2" Data="{Binding ArtBeat2}" />
|
|
|
|
|
<Path Classes="art beat b3" Data="{Binding ArtBeat3}" />
|
|
|
|
|
<Path Classes="art beat spin" Data="{Binding ArtSpin}" />
|
|
|
|
|
</Grid>
|
|
|
|
|
</Viewbox>
|
|
|
|
|
</Grid>
|
|
|
|
|
</Button>
|
|
|
|
|
<StackPanel Grid.Column="1" Classes="hopText" Classes.lit="{Binding IsLit}" VerticalAlignment="Center" Margin="16,0" Spacing="4">
|
|
|
|
|
<TextBlock Classes="hopTitle" Text="{Binding Title}" TextAlignment="{Binding TextSide}" />
|
|
|
|
|
<TextBlock Classes="hopDetail" Text="{Binding DetailsFormatted}" TextAlignment="{Binding TextSide}" IsVisible="{Binding ShowDetails}" />
|
2026-10-15 04:39:03 +02:00
|
|
|
</StackPanel>
|
|
|
|
|
</Grid>
|
|
|
|
|
</StackPanel>
|
|
|
|
|
</DataTemplate>
|
|
|
|
|
</ItemsControl.ItemTemplate>
|
|
|
|
|
</ItemsControl>
|
|
|
|
|
</StackPanel>
|
|
|
|
|
|
2026-10-15 05:41:44 +02:00
|
|
|
<Border Classes="consent" IsVisible="{Binding AskReach}" MaxWidth="760">
|
|
|
|
|
<StackPanel Spacing="10">
|
|
|
|
|
<TextBlock Classes="section" Margin="0" Text="{s:Tr ReachAskTitle}" />
|
|
|
|
|
<TextBlock Classes="body" Text="{s:Tr ReachAskBody}" />
|
|
|
|
|
<TextBlock Classes="small" Text="{s:Tr ReachAskPorts}" IsVisible="{Binding CanOpenPorts}" />
|
|
|
|
|
<WrapPanel HorizontalAlignment="Right" ItemSpacing="10" LineSpacing="10">
|
|
|
|
|
<Button Classes="quiet" Content="{s:Tr ReachSkip}"
|
|
|
|
|
AutomationProperties.AutomationId="reach-skip"
|
|
|
|
|
Command="{Binding ReachSkipCommand}" />
|
|
|
|
|
<Button Classes="quiet" Content="{s:Tr ReachAsIs}"
|
|
|
|
|
AutomationProperties.AutomationId="reach-as-is"
|
|
|
|
|
Command="{Binding ReachAsIsCommand}" />
|
|
|
|
|
<Button Classes="primary small" Content="{s:Tr ReachOpenPorts}" IsVisible="{Binding CanOpenPorts}"
|
|
|
|
|
AutomationProperties.AutomationId="reach-open-ports"
|
|
|
|
|
Command="{Binding ReachOpenPortsCommand}" />
|
|
|
|
|
</WrapPanel>
|
|
|
|
|
</StackPanel>
|
|
|
|
|
</Border>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<StackPanel Spacing="8" IsVisible="{Binding HasResults}">
|
|
|
|
|
<TextBlock Classes="section" Text="{s:Tr UsesTitle}" HorizontalAlignment="Center" />
|
|
|
|
|
<ItemsControl ItemsSource="{Binding Uses}" HorizontalAlignment="Center">
|
|
|
|
|
<ItemsControl.ItemsPanel>
|
|
|
|
|
<ItemsPanelTemplate>
|
|
|
|
|
<WrapPanel ItemWidth="{Binding CardWidth}" HorizontalAlignment="Center" />
|
|
|
|
|
</ItemsPanelTemplate>
|
|
|
|
|
</ItemsControl.ItemsPanel>
|
|
|
|
|
<ItemsControl.ItemTemplate>
|
|
|
|
|
<DataTemplate x:DataType="vm:UseViewModel">
|
|
|
|
|
<Border Classes="card use" AutomationProperties.AutomationId="{Binding AutomationId}"
|
|
|
|
|
Classes.good="{Binding IsGood}" Classes.caution="{Binding IsCaution}"
|
|
|
|
|
Classes.bad="{Binding IsBad}" Classes.unknown="{Binding IsUnknown}">
|
|
|
|
|
<StackPanel Spacing="8">
|
|
|
|
|
<Grid ColumnDefinitions="Auto,*,Auto">
|
|
|
|
|
<Path Grid.Column="0" Classes="icon" Data="{Binding Icon}" VerticalAlignment="Center" />
|
|
|
|
|
<TextBlock Grid.Column="1" Classes="cardTitle" Text="{Binding Title}" />
|
|
|
|
|
<Border Grid.Column="2" Classes="chip">
|
|
|
|
|
<TextBlock Text="{Binding VerdictFormatted}" />
|
|
|
|
|
</Border>
|
|
|
|
|
</Grid>
|
|
|
|
|
<TextBlock Classes="summary" Text="{Binding Reason}" />
|
|
|
|
|
<TextBlock Classes="body" FontSize="14" Foreground="{StaticResource TextSoftBrush}" Text="{Binding Advice}" IsVisible="{Binding ShowAdvice}" />
|
|
|
|
|
</StackPanel>
|
|
|
|
|
</Border>
|
|
|
|
|
</DataTemplate>
|
|
|
|
|
</ItemsControl.ItemTemplate>
|
|
|
|
|
</ItemsControl>
|
|
|
|
|
</StackPanel>
|
2026-10-15 08:08:37 +02:00
|
|
|
<StackPanel Spacing="4" IsVisible="{Binding HasResults}">
|
2026-10-15 04:39:03 +02:00
|
|
|
<TextBlock Classes="section" Text="{s:Tr ResultsTitle}" HorizontalAlignment="Center" />
|
2026-10-15 08:08:37 +02:00
|
|
|
<ItemsControl x:Name="Groups" ItemsSource="{Binding Path}">
|
2026-10-15 04:39:03 +02:00
|
|
|
<ItemsControl.ItemTemplate>
|
2026-10-15 08:08:37 +02:00
|
|
|
<DataTemplate x:DataType="vm:PathNodeViewModel">
|
|
|
|
|
<StackPanel Spacing="2" Margin="0,16,0,0">
|
|
|
|
|
<Grid ColumnDefinitions="Auto,Auto,*" Margin="16,0">
|
|
|
|
|
<Grid Width="46" Height="46">
|
|
|
|
|
<Ellipse Classes="disc thin" Width="46" Height="46"
|
|
|
|
|
Classes.good="{Binding IsGood}" Classes.caution="{Binding IsCaution}"
|
|
|
|
|
Classes.bad="{Binding IsBad}" Classes.unknown="{Binding IsUnknown}" />
|
|
|
|
|
<Viewbox Width="30" Height="30">
|
|
|
|
|
<Grid Classes="art" Width="48" Height="48"
|
|
|
|
|
Classes.good="{Binding IsGood}" Classes.caution="{Binding IsCaution}"
|
|
|
|
|
Classes.bad="{Binding IsBad}" Classes.unknown="{Binding IsUnknown}">
|
|
|
|
|
<Path Classes="art" Data="{Binding ArtBase}" />
|
|
|
|
|
<Path Classes="art beat b1" Data="{Binding ArtBeat1}" />
|
|
|
|
|
<Path Classes="art beat b2" Data="{Binding ArtBeat2}" />
|
|
|
|
|
<Path Classes="art beat b3" Data="{Binding ArtBeat3}" />
|
|
|
|
|
<Path Classes="art beat spin" Data="{Binding ArtSpin}" />
|
|
|
|
|
</Grid>
|
|
|
|
|
</Viewbox>
|
2026-10-15 04:39:03 +02:00
|
|
|
</Grid>
|
2026-10-15 08:08:37 +02:00
|
|
|
<TextBlock Grid.Column="1" Classes="groupTitle" Text="{Binding Title}" VerticalAlignment="Center" Margin="12,0" />
|
|
|
|
|
<Rectangle Grid.Column="2" Classes="rule" VerticalAlignment="Center" />
|
|
|
|
|
</Grid>
|
|
|
|
|
<ItemsControl ItemsSource="{Binding Cards}" ItemTemplate="{StaticResource CardTemplate}" HorizontalAlignment="Center">
|
|
|
|
|
<ItemsControl.ItemsPanel>
|
|
|
|
|
<ItemsPanelTemplate>
|
|
|
|
|
<WrapPanel ItemWidth="{Binding $parent[UserControl].((vm:MainViewModel)DataContext).CardWidth}" HorizontalAlignment="Center" />
|
|
|
|
|
</ItemsPanelTemplate>
|
|
|
|
|
</ItemsControl.ItemsPanel>
|
|
|
|
|
</ItemsControl>
|
|
|
|
|
</StackPanel>
|
2026-10-15 04:39:03 +02:00
|
|
|
</DataTemplate>
|
|
|
|
|
</ItemsControl.ItemTemplate>
|
|
|
|
|
</ItemsControl>
|
|
|
|
|
</StackPanel>
|
2026-10-15 05:41:44 +02:00
|
|
|
|
2026-10-15 08:31:10 +02:00
|
|
|
<Border Classes="consent" IsVisible="{Binding ShowShareOffer}" MaxWidth="760">
|
2026-10-15 05:41:44 +02:00
|
|
|
<StackPanel Spacing="12">
|
|
|
|
|
<TextBlock Classes="section" Margin="0" Text="{s:Tr ShareOfferTitle}" />
|
|
|
|
|
<TextBlock Classes="body" Text="{s:Tr ShareOfferBody}" />
|
|
|
|
|
<Grid HorizontalAlignment="Center">
|
|
|
|
|
<Border Classes="halo" />
|
|
|
|
|
<Button Classes="primary" Content="{s:Tr ShareOpen}"
|
|
|
|
|
AutomationProperties.AutomationId="share-open"
|
|
|
|
|
Command="{Binding OpenShareCommand}" />
|
|
|
|
|
</Grid>
|
|
|
|
|
</StackPanel>
|
|
|
|
|
</Border>
|
|
|
|
|
<TextBlock Classes="body" TextAlignment="Center" HorizontalAlignment="Center" MaxWidth="700"
|
|
|
|
|
Text="{Binding ShareResult}" IsVisible="{Binding ShowShareResult}" />
|
2026-10-15 22:49:40 +02:00
|
|
|
<StackPanel Spacing="4" HorizontalAlignment="Center" MinWidth="240" MaxWidth="420" IsVisible="{Binding ShowSharedId}">
|
|
|
|
|
<TextBlock Classes="factLabel" Text="{s:Tr SubmissionCode}" />
|
|
|
|
|
<v:CopyField Text="{Binding SharedId}" CopyId="share-code-copy" />
|
|
|
|
|
</StackPanel>
|
2026-10-15 05:41:44 +02:00
|
|
|
|
2026-10-15 08:08:37 +02:00
|
|
|
<StackPanel Spacing="16" HorizontalAlignment="Center" MaxWidth="600" Margin="8,4,8,0" IsVisible="{Binding HasResults}">
|
|
|
|
|
<Grid ColumnDefinitions="Auto,*" HorizontalAlignment="Center">
|
|
|
|
|
<Grid Width="64" Height="64">
|
|
|
|
|
<Ellipse Classes="pulse" Width="64" Height="64" IsVisible="{Binding ShowChecking}" />
|
|
|
|
|
<Ellipse Width="52" Height="52" Fill="{StaticResource SurfaceRaisedBrush}" Stroke="{StaticResource LineBrush}" StrokeThickness="2" />
|
|
|
|
|
<Ellipse Width="28" Height="28" Fill="{StaticResource GoodBrush}" IsVisible="{Binding ShowOnline}" />
|
|
|
|
|
<Ellipse Width="28" Height="28" Fill="{StaticResource CautionBrush}" IsVisible="{Binding ShowCaptive}" />
|
|
|
|
|
<Ellipse Width="28" Height="28" Fill="{StaticResource BadBrush}" IsVisible="{Binding ShowOffline}" />
|
|
|
|
|
<Ellipse Width="28" Height="28" Fill="{StaticResource TextSoftBrush}" Opacity="0.4" IsVisible="{Binding ShowChecking}" />
|
|
|
|
|
</Grid>
|
|
|
|
|
<TextBlock Grid.Column="1" Classes="status" Text="{Binding StatusFormatted}" VerticalAlignment="Center" TextAlignment="Start" Margin="14,0,0,0" />
|
|
|
|
|
</Grid>
|
|
|
|
|
<Button Classes="primary" Content="{Binding CheckFormatted}"
|
|
|
|
|
AutomationProperties.AutomationId="main-check-again"
|
|
|
|
|
Command="{Binding CheckCommand}" />
|
|
|
|
|
</StackPanel>
|
|
|
|
|
|
2026-10-15 05:41:44 +02:00
|
|
|
<StackPanel Spacing="12" HorizontalAlignment="Center" Margin="8,10,8,0">
|
|
|
|
|
<TextBlock Classes="section" Text="{s:Tr ElsewhereTitle}" HorizontalAlignment="Center" />
|
|
|
|
|
<TextBlock Classes="small" Text="{s:Tr ElsewhereBody}" HorizontalAlignment="Center" TextAlignment="Center" MaxWidth="560" />
|
|
|
|
|
<WrapPanel HorizontalAlignment="Center" ItemSpacing="28" LineSpacing="16">
|
|
|
|
|
<StackPanel Spacing="8" Width="170">
|
|
|
|
|
<Border Classes="code">
|
|
|
|
|
<Path Data="{Binding AndroidCode}" Fill="{StaticResource GroundBrush}" Stretch="Uniform" />
|
|
|
|
|
</Border>
|
|
|
|
|
<TextBlock Classes="small" Text="{s:Tr ElsewhereAndroid}" TextAlignment="Center" />
|
|
|
|
|
</StackPanel>
|
|
|
|
|
<StackPanel Spacing="8" Width="170">
|
|
|
|
|
<Border Classes="code">
|
|
|
|
|
<Path Data="{Binding DownloadsCode}" Fill="{StaticResource GroundBrush}" Stretch="Uniform" />
|
|
|
|
|
</Border>
|
|
|
|
|
<TextBlock Classes="small" Text="{s:Tr ElsewhereAll}" TextAlignment="Center" />
|
|
|
|
|
</StackPanel>
|
|
|
|
|
</WrapPanel>
|
|
|
|
|
<StackPanel Orientation="Horizontal" Spacing="12" HorizontalAlignment="Center">
|
|
|
|
|
<Button Classes="quiet" Content="{s:Tr CopyLink}"
|
|
|
|
|
AutomationProperties.AutomationId="elsewhere-copy-link"
|
|
|
|
|
Command="{Binding CopyLinkCommand}" />
|
|
|
|
|
<TextBlock Classes="small" Text="{s:Tr LinkCopied}" VerticalAlignment="Center" IsVisible="{Binding LinkCopied}" />
|
|
|
|
|
</StackPanel>
|
|
|
|
|
</StackPanel>
|
2026-10-15 04:39:03 +02:00
|
|
|
</StackPanel>
|
|
|
|
|
</ScrollViewer>
|
|
|
|
|
</DockPanel>
|
|
|
|
|
|
|
|
|
|
<Border Classes="scrim" IsVisible="{Binding ShowContacts}">
|
|
|
|
|
<Border Classes="sheet">
|
|
|
|
|
<ScrollViewer HorizontalScrollBarVisibility="Disabled">
|
|
|
|
|
<StackPanel Spacing="14">
|
|
|
|
|
<Grid ColumnDefinitions="*,Auto">
|
|
|
|
|
<TextBlock Classes="section" Margin="0" Text="{s:Tr Contacts}" VerticalAlignment="Center" />
|
|
|
|
|
<Button Grid.Column="1" Classes="quiet" Content="{s:Tr Close}"
|
|
|
|
|
AutomationProperties.AutomationId="contacts-close"
|
|
|
|
|
Command="{Binding ToggleContactsCommand}" />
|
|
|
|
|
</Grid>
|
|
|
|
|
<TextBlock Classes="body" Text="{s:Tr ContactsIntro}" />
|
2026-10-15 22:49:40 +02:00
|
|
|
<Grid ColumnDefinitions="Auto,*" RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto">
|
2026-10-15 04:39:03 +02:00
|
|
|
<Path Grid.Row="0" Classes="icon" Data="{StaticResource IconServer}" VerticalAlignment="Top" Margin="0,0,12,12" />
|
|
|
|
|
<TextBlock Grid.Row="0" Grid.Column="1" Classes="body" Text="{s:Tr ContactServer}" Margin="0,0,0,12" />
|
|
|
|
|
<Path Grid.Row="1" Classes="icon" Data="{StaticResource IconRouter}" VerticalAlignment="Top" Margin="0,0,12,12" />
|
|
|
|
|
<TextBlock Grid.Row="1" Grid.Column="1" Classes="body" Text="{s:Tr ContactRouter}" Margin="0,0,0,12" />
|
|
|
|
|
<Path Grid.Row="2" Classes="icon" Data="{StaticResource IconRoute}" VerticalAlignment="Top" Margin="0,0,12,12" />
|
|
|
|
|
<TextBlock Grid.Row="2" Grid.Column="1" Classes="body" Text="{s:Tr ContactRoute}" Margin="0,0,0,12" />
|
|
|
|
|
<Path Grid.Row="3" Classes="icon" Data="{StaticResource IconGlobe}" VerticalAlignment="Top" Margin="0,0,12,12" />
|
|
|
|
|
<TextBlock Grid.Row="3" Grid.Column="1" Classes="body" Text="{s:Tr ContactDns}" Margin="0,0,0,12" />
|
2026-10-15 05:41:44 +02:00
|
|
|
<Path Grid.Row="4" Classes="icon" Data="{StaticResource IconRadioTower}" VerticalAlignment="Top" Margin="0,0,12,12" />
|
|
|
|
|
<TextBlock Grid.Row="4" Grid.Column="1" Classes="body" Text="{s:Tr ContactStun}" Margin="0,0,0,12" />
|
|
|
|
|
<Path Grid.Row="5" Classes="icon" Data="{StaticResource IconShare2}" VerticalAlignment="Top" Margin="0,0,12,12" />
|
|
|
|
|
<TextBlock Grid.Row="5" Grid.Column="1" Classes="body" Text="{s:Tr ContactShare}" Margin="0,0,0,12" />
|
|
|
|
|
<Path Grid.Row="6" Classes="icon" Data="{StaticResource IconMail}" VerticalAlignment="Top" Margin="0,0,12,12" />
|
|
|
|
|
<TextBlock Grid.Row="6" Grid.Column="1" Classes="body" Text="{s:Tr ContactMail}" Margin="0,0,0,12" />
|
|
|
|
|
<Path Grid.Row="7" Classes="icon" Data="{StaticResource IconGauge}" VerticalAlignment="Top" Margin="0,0,12,12" />
|
|
|
|
|
<TextBlock Grid.Row="7" Grid.Column="1" Classes="body" Text="{s:Tr ContactSpeed}" Margin="0,0,0,12" />
|
2026-10-15 22:49:40 +02:00
|
|
|
<Path Grid.Row="8" Classes="icon" Data="{StaticResource IconArrowUpRight}" VerticalAlignment="Top" Margin="0,0,12,0" />
|
|
|
|
|
<TextBlock Grid.Row="8" Grid.Column="1" Classes="body" Text="{s:Tr ContactLinks}" />
|
2026-10-15 04:39:03 +02:00
|
|
|
</Grid>
|
2026-10-15 05:41:44 +02:00
|
|
|
<StackPanel Spacing="6" IsVisible="{Binding ShowShared}">
|
|
|
|
|
<TextBlock Classes="body" FontWeight="SemiBold" Text="{s:Tr SharedTitle}" />
|
|
|
|
|
<ItemsControl ItemsSource="{Binding Shared}">
|
|
|
|
|
<ItemsControl.ItemTemplate>
|
|
|
|
|
<DataTemplate x:DataType="vm:SubmissionViewModel">
|
2026-10-15 22:49:40 +02:00
|
|
|
<StackPanel Spacing="4" Margin="0,4">
|
|
|
|
|
<v:CopyField Text="{Binding Id}" CopyId="{Binding CopyAutomationId}" HorizontalAlignment="Left" MinWidth="220" />
|
|
|
|
|
<StackPanel Orientation="Horizontal" Spacing="12">
|
|
|
|
|
<TextBlock Classes="small" Text="{Binding KeptFormatted}" VerticalAlignment="Center" />
|
|
|
|
|
<Button Classes="link" Content="{s:Tr SubmissionDelete}"
|
|
|
|
|
AutomationProperties.AutomationId="{Binding AutomationId}"
|
|
|
|
|
Command="{Binding DeleteCommand}" />
|
|
|
|
|
<TextBlock Classes="small" Text="{s:Tr SubmissionDeleteFailed}" IsVisible="{Binding Failed}" VerticalAlignment="Center" />
|
|
|
|
|
</StackPanel>
|
2026-10-15 05:41:44 +02:00
|
|
|
</StackPanel>
|
|
|
|
|
</DataTemplate>
|
|
|
|
|
</ItemsControl.ItemTemplate>
|
|
|
|
|
</ItemsControl>
|
|
|
|
|
</StackPanel>
|
2026-10-15 04:39:03 +02:00
|
|
|
<TextBlock Classes="body" Text="{s:Tr PrivacyLine}" />
|
|
|
|
|
<StackPanel Orientation="Horizontal" Spacing="12">
|
|
|
|
|
<Button Classes="quiet" Content="{s:Tr ClearHistory}"
|
|
|
|
|
AutomationProperties.AutomationId="contacts-clear-history"
|
|
|
|
|
Command="{Binding ClearHistoryCommand}" />
|
|
|
|
|
<TextBlock Classes="small" Text="{s:Tr HistoryCleared}" VerticalAlignment="Center" IsVisible="{Binding HistoryCleared}" />
|
|
|
|
|
</StackPanel>
|
|
|
|
|
<TextBlock Classes="small" Text="{s:Tr AboutLine}" />
|
2026-10-15 05:41:44 +02:00
|
|
|
<StackPanel Orientation="Horizontal" Spacing="16">
|
|
|
|
|
<Button Classes="link" Content="{s:Tr SourceCode}"
|
|
|
|
|
AutomationProperties.AutomationId="contacts-source"
|
|
|
|
|
Command="{Binding OpenSourceCommand}" />
|
|
|
|
|
<Button Classes="link" Content="{s:Tr PrivacyPage}"
|
|
|
|
|
AutomationProperties.AutomationId="contacts-privacy"
|
|
|
|
|
Command="{Binding OpenPrivacyCommand}" />
|
|
|
|
|
</StackPanel>
|
2026-10-15 04:39:03 +02:00
|
|
|
<TextBlock Classes="small" Text="{Binding MapFormatted}" />
|
2026-10-15 11:11:24 +02:00
|
|
|
<TextBlock Classes="small" Text="{s:Tr DataCredits}" />
|
2026-10-15 04:39:03 +02:00
|
|
|
<TextBlock Classes="small" Text="{s:Tr IconsCredit}" />
|
|
|
|
|
</StackPanel>
|
|
|
|
|
</ScrollViewer>
|
|
|
|
|
</Border>
|
|
|
|
|
</Border>
|
2026-10-15 05:41:44 +02:00
|
|
|
|
|
|
|
|
<Border Classes="scrim" IsVisible="{Binding ShowShareSheet}">
|
|
|
|
|
<Border Classes="sheet">
|
|
|
|
|
<ScrollViewer HorizontalScrollBarVisibility="Disabled">
|
|
|
|
|
<StackPanel Spacing="12">
|
|
|
|
|
<TextBlock Classes="section" Margin="0" Text="{s:Tr ShareTitle}" />
|
|
|
|
|
<TextBlock Classes="body" Text="{s:Tr ShareWho}" />
|
|
|
|
|
<TextBlock Classes="body" Text="{s:Tr ShareWhy}" />
|
|
|
|
|
<TextBlock Classes="body" Text="{s:Tr ShareKeep}" />
|
|
|
|
|
<TextBlock Classes="small" Text="{s:Tr ShareExact}" />
|
|
|
|
|
<TextBox Classes="payload" Text="{Binding SharePreview}" IsReadOnly="True" AcceptsReturn="True"
|
|
|
|
|
AutomationProperties.AutomationId="share-preview" />
|
|
|
|
|
<WrapPanel HorizontalAlignment="Right" ItemSpacing="10" LineSpacing="10">
|
|
|
|
|
<Button Classes="quiet" Content="{s:Tr Cancel}"
|
|
|
|
|
AutomationProperties.AutomationId="share-cancel"
|
|
|
|
|
Command="{Binding CloseShareCommand}" />
|
|
|
|
|
<Button Classes="primary small" Content="{s:Tr ShareSend}"
|
|
|
|
|
AutomationProperties.AutomationId="share-send"
|
|
|
|
|
Command="{Binding SendCommand}" />
|
|
|
|
|
</WrapPanel>
|
|
|
|
|
</StackPanel>
|
|
|
|
|
</ScrollViewer>
|
|
|
|
|
</Border>
|
|
|
|
|
</Border>
|
2026-10-15 04:39:03 +02:00
|
|
|
</Grid>
|
2026-10-15 01:14:44 +02:00
|
|
|
</UserControl>
|