Files
MeWeb/src/MeWeb.App/Views/MainView.axaml
T
thepraandClaude Opus 5.5 50eaf7d0b3
Build / Desktop, server and tools (push) Successful in 1m15s
Release / Every platform, the server, the release (push) Successful in 10m44s
"me-web?" 0.14.1: the glow around the path is round again
- The soft glow around each step of the path from your device to the internet was cut off straight at the edge of
  the path. It now fades out evenly all the way round, and so does the pulse while a step is being checked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 02:10:54 +02:00

608 lines
37 KiB
XML

<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:MeWeb.App.ViewModels"
xmlns:v="using:MeWeb.App.Views"
xmlns:s="using:MeWeb.App.Services"
xmlns:sys="using:System"
x:Class="MeWeb.App.Views.MainView"
x:DataType="vm:MainViewModel"
FlowDirection="{Binding Flow}"
Background="{StaticResource GroundBrush}">
<UserControl.Resources>
<DataTemplate x:Key="CardTemplate" x:DataType="vm:CardViewModel">
<Border Classes="card" Classes.pending="{Binding ShowRunning}"
Classes.good="{Binding IsGood}" Classes.caution="{Binding IsCaution}"
Classes.bad="{Binding IsBad}" Classes.unknown="{Binding IsUnknown}" Classes.info="{Binding IsInfo}">
<Grid>
<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>
<StackPanel Spacing="8" IsVisible="{Binding ShowRunning}">
<Border Classes="skeleton" />
<Border Classes="skeleton short" />
</StackPanel>
<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}" />
<v:CopyField Text="{Binding CopyText}" CopyId="{Binding CopyAutomationId}" IsVisible="{Binding ShowCopy}" />
<Button Classes="link" IsVisible="{Binding ShowSource}"
AutomationProperties.AutomationId="{Binding AutomationId}"
Command="{Binding OpenCommand}">
<TextBlock Text="{Binding Source}" TextWrapping="Wrap" />
</Button>
<TextBlock Classes="small" Text="{Binding Source}" IsVisible="{Binding ShowNote}" Margin="0,2" />
<Button Classes="link" IsVisible="{Binding ShowPlainLink}"
AutomationProperties.AutomationId="{Binding AutomationId}"
Command="{Binding OpenCommand}">
<TextBlock Text="{Binding Value}" TextWrapping="Wrap" />
</Button>
</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 Classes="sweep" IsVisible="{Binding ShowRunning}" />
</Grid>
</Border>
</DataTemplate>
</UserControl.Resources>
<Grid>
<DockPanel>
<Grid DockPanel.Dock="Top" ColumnDefinitions="*,Auto,Auto" Margin="20,14,20,6">
<Viewbox Grid.Column="0" StretchDirection="DownOnly" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0,0,10,0">
<TextBlock Classes="title" Text="{s:Tr AppName}" />
</Viewbox>
<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>
<StackPanel DockPanel.Dock="Bottom" Spacing="4" Margin="16,6,16,10" HorizontalAlignment="Center">
<WrapPanel ItemSpacing="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}" />
</WrapPanel>
<TextBlock Classes="small" Text="{Binding VersionFormatted}" HorizontalAlignment="Center" />
</StackPanel>
<Grid>
<ScrollViewer x:Name="Scroller" HorizontalScrollBarVisibility="Disabled">
<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>
<StackPanel x:Name="Story" Spacing="20" MaxWidth="600" Margin="8,0" IsVisible="{Binding !HasResults}">
<Border x:Name="WishCard" Classes="story">
<StackPanel>
<Border Classes="scene">
<Grid FlowDirection="LeftToRight">
<Viewbox Stretch="Uniform">
<v:IntroScene x:Name="WishScene" Step="0" />
</Viewbox>
<Border Classes="storyMark">
<Path Classes="icon" Data="{StaticResource IconImages}" />
</Border>
</Grid>
</Border>
<StackPanel Spacing="10" Margin="20,14,20,22">
<TextBlock Classes="hero" Text="{s:Tr IntroWishTitle}" />
<TextBlock Classes="lead" Text="{s:Tr IntroWishBody}" />
</StackPanel>
</StackPanel>
</Border>
<Border x:Name="WayCard" Classes="story">
<StackPanel>
<Border Classes="scene">
<Grid FlowDirection="LeftToRight">
<Viewbox Stretch="Uniform">
<v:IntroScene x:Name="WayScene" Step="1" />
</Viewbox>
<Border Classes="storyMark">
<Path Classes="icon" Data="{StaticResource IconHouse}" />
</Border>
</Grid>
</Border>
<StackPanel Spacing="10" Margin="20,14,20,22">
<TextBlock Classes="hero" Text="{s:Tr IntroWayTitle}" />
<TextBlock Classes="lead" Text="{s:Tr IntroWayBody}" />
</StackPanel>
</StackPanel>
</Border>
<Border x:Name="CheckCard" Classes="story final">
<StackPanel>
<Border Classes="scene">
<Viewbox Stretch="Uniform">
<v:IntroScene x:Name="CheckScene" Step="2" />
</Viewbox>
</Border>
<StackPanel Spacing="12" Margin="20,14,20,24">
<TextBlock Classes="hero" Text="{s:Tr StartQuestion}" />
<TextBlock Classes="lead" Text="{s:Tr IntroWayHope}" />
<TextBlock Classes="lead strong" Text="{s:Tr StartBody}" />
<Border Classes="statusChip" HorizontalAlignment="Center" Margin="0,4,0,0">
<StackPanel Orientation="Horizontal" Spacing="8">
<Grid Width="10" Height="10" VerticalAlignment="Center">
<Ellipse Fill="{StaticResource GoodBrush}" IsVisible="{Binding ShowOnline}" />
<Ellipse Fill="{StaticResource CautionBrush}" IsVisible="{Binding ShowCaptive}" />
<Ellipse Fill="{StaticResource BadBrush}" IsVisible="{Binding ShowOffline}" />
<Ellipse Fill="{StaticResource TextSoftBrush}" IsVisible="{Binding ShowChecking}" />
</Grid>
<TextBlock Classes="chip" Text="{Binding StatusFormatted}" />
</StackPanel>
</Border>
<Button Classes="primary" Content="{s:Tr StartYes}" Margin="0,4,0,0"
AutomationProperties.AutomationId="main-check"
Command="{Binding CheckCommand}" />
<Button Classes="quiet" Content="{s:Tr StartNo}" HorizontalAlignment="Center"
AutomationProperties.AutomationId="main-leave"
Command="{Binding LeaveCommand}" />
<TextBlock Classes="small" Text="{s:Tr StartPromise}" TextAlignment="Center" MaxWidth="460" HorizontalAlignment="Center" />
</StackPanel>
</StackPanel>
</Border>
<TextBlock Classes="section" Text="{s:Tr StartUsesTitle}" HorizontalAlignment="Center" Margin="8,8,8,0" />
<WrapPanel HorizontalAlignment="Center" ItemSpacing="10" LineSpacing="10">
<Border Classes="useChip">
<Grid ColumnDefinitions="Auto,*">
<Viewbox Width="20" Height="20" VerticalAlignment="Center"><Path Classes="icon" Data="{StaticResource IconImages}" /></Viewbox>
<TextBlock Grid.Column="1" Text="{s:Tr UseFiles}" />
</Grid>
</Border>
<Border Classes="useChip">
<Grid ColumnDefinitions="Auto,*">
<Viewbox Width="20" Height="20" VerticalAlignment="Center"><Path Classes="icon" Data="{StaticResource IconGlobe}" /></Viewbox>
<TextBlock Grid.Column="1" Text="{s:Tr UseWebsite}" />
</Grid>
</Border>
<Border Classes="useChip">
<Grid ColumnDefinitions="Auto,*">
<Viewbox Width="20" Height="20" VerticalAlignment="Center"><Path Classes="icon" Data="{StaticResource IconHouse}" /></Viewbox>
<TextBlock Grid.Column="1" Text="{s:Tr UseRemoteAccess}" />
</Grid>
</Border>
<Border Classes="useChip">
<Grid ColumnDefinitions="Auto,*">
<Viewbox Width="20" Height="20" VerticalAlignment="Center"><Path Classes="icon" Data="{StaticResource IconGamepad2}" /></Viewbox>
<TextBlock Grid.Column="1" Text="{s:Tr UseGameServer}" />
</Grid>
</Border>
<Border Classes="useChip">
<Grid ColumnDefinitions="Auto,*">
<Viewbox Width="20" Height="20" VerticalAlignment="Center"><Path Classes="icon" Data="{StaticResource IconRss}" /></Viewbox>
<TextBlock Grid.Column="1" Text="{s:Tr UseFediverse}" />
</Grid>
</Border>
<Border Classes="useChip">
<Grid ColumnDefinitions="Auto,*">
<Viewbox Width="20" Height="20" VerticalAlignment="Center"><Path Classes="icon" Data="{StaticResource IconMail}" /></Viewbox>
<TextBlock Grid.Column="1" Text="{s:Tr UseMail}" />
</Grid>
</Border>
</WrapPanel>
</StackPanel>
<StackPanel Spacing="6" IsVisible="{Binding HasResults}">
<TextBlock Classes="section" Text="{s:Tr PathTitle}" HorizontalAlignment="Center" />
<ItemsControl ItemsSource="{Binding Path}" MaxWidth="580" Margin="16,8,16,0" ClipToBounds="False">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:PathNodeViewModel">
<StackPanel>
<Grid MinHeight="62" Margin="45,0" IsVisible="{Binding ShowConnector}">
<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}" />
<Path Classes="packets" Data="{StaticResource WireToEnd}" IsVisible="{Binding WireToEnd}"
Classes.flowing="{Binding IsRunning}" />
<Path Classes="packets" Data="{StaticResource WireToStart}" IsVisible="{Binding WireToStart}"
Classes.flowing="{Binding IsRunning}" />
<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>
</Grid>
<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="aura" Margin="-18"
Classes.good="{Binding IsGood}" Classes.caution="{Binding IsCaution}"
Classes.bad="{Binding IsBad}" />
<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}" />
<Ellipse Classes="gloss" Margin="5" />
<Path Classes="spinner" Data="{StaticResource ArtNodeOrbit}" IsVisible="{Binding IsRunning}" />
<Ellipse Classes="burst" Width="90" Height="90"
Classes.good="{Binding IsGood}" Classes.caution="{Binding IsCaution}"
Classes.bad="{Binding IsBad}" />
<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}" />
</StackPanel>
</Grid>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
<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.pending="{Binding IsPending}"
Classes.good="{Binding IsGood}" Classes.caution="{Binding IsCaution}"
Classes.bad="{Binding IsBad}" Classes.unknown="{Binding IsUnknown}">
<Grid>
<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>
<StackPanel Spacing="8" IsVisible="{Binding IsPending}">
<Border Classes="skeleton" />
<Border Classes="skeleton short" />
</StackPanel>
<TextBlock Classes="summary" Text="{Binding Reason}" IsVisible="{Binding ShowReason}" />
<TextBlock Classes="body" FontSize="14" Foreground="{StaticResource TextSoftBrush}" Text="{Binding Advice}" IsVisible="{Binding ShowAdvice}" />
</StackPanel>
<Border Classes="sweep" IsVisible="{Binding IsPending}" />
</Grid>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
<StackPanel Spacing="4" IsVisible="{Binding HasResults}">
<TextBlock Classes="section" Text="{s:Tr ResultsTitle}" HorizontalAlignment="Center" />
<ItemsControl x:Name="Groups" ItemsSource="{Binding Path}">
<ItemsControl.ItemTemplate>
<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>
</Grid>
<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>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
<Border Classes="consent" IsVisible="{Binding ShowShareOffer}" MaxWidth="760">
<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>
<Border Classes="consent preparing" IsVisible="{Binding ShowSharePreparing}" MaxWidth="760">
<StackPanel Spacing="12">
<TextBlock Classes="section" Margin="0" Text="{s:Tr ShareOfferTitle}" />
<TextBlock Classes="body" Text="{s:Tr SharePreparing}" />
<ProgressBar Classes="thin" IsIndeterminate="True" />
<Button Classes="primary" Content="{s:Tr ShareOpen}" IsEnabled="False" Opacity="0.55"
AutomationProperties.AutomationId="share-open-waiting" />
</StackPanel>
</Border>
<TextBlock Classes="body" TextAlignment="Center" HorizontalAlignment="Center" MaxWidth="700"
Text="{Binding ShareResult}" IsVisible="{Binding ShowShareResult}" />
<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>
<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>
<Expander Classes="explain" Header="{s:Tr ElsewhereTitle}" MaxWidth="600" Margin="8,10,8,0"
HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch"
AutomationProperties.AutomationId="main-elsewhere">
<StackPanel Spacing="12" 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>
</Expander>
</StackPanel>
</ScrollViewer>
<Grid VerticalAlignment="Top" IsVisible="{Binding !HasResults}">
<Border x:Name="Shade" Classes="bubbles" Opacity="0" IsHitTestVisible="False" />
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,8,0,0">
<Button x:Name="WishBubble" Classes="bubble" Opacity="0" IsHitTestVisible="False" Click="OnBubble"
AutomationProperties.AutomationId="story-wish"
AutomationProperties.Name="{s:Tr IntroWishTitle}"
ToolTip.Tip="{s:Tr IntroWishTitle}">
<Path Classes="icon" Data="{StaticResource IconImages}" />
</Button>
<Rectangle x:Name="BubbleLink" Classes="bubbleLink" Opacity="0" />
<Button x:Name="WayBubble" Classes="bubble" Opacity="0" IsHitTestVisible="False" Click="OnBubble"
AutomationProperties.AutomationId="story-way"
AutomationProperties.Name="{s:Tr IntroWayTitle}"
ToolTip.Tip="{s:Tr IntroWayTitle}">
<Path Classes="icon" Data="{StaticResource IconHouse}" />
</Button>
</StackPanel>
</Grid>
</Grid>
</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}" />
<Grid ColumnDefinitions="Auto,*" RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto">
<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" />
<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" />
<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}" />
</Grid>
<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">
<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>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
<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}" />
<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>
<TextBlock Classes="small" Text="{Binding MapFormatted}" />
<TextBlock Classes="small" Text="{Binding RegistryFormatted}" IsVisible="{Binding RegistryFormatted, Converter={x:Static StringConverters.IsNotNullOrEmpty}}" />
<TextBlock Classes="small" Text="{s:Tr DataCredits}" />
<TextBlock Classes="small" Text="{s:Tr IconsCredit}" />
</StackPanel>
</ScrollViewer>
</Border>
</Border>
<Border Classes="farewell" IsVisible="{Binding Leaving}">
<TextBlock Classes="hero" Text="{s:Tr Goodbye}" VerticalAlignment="Center" Margin="32,0" />
</Border>
<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>
</Grid>
</UserControl>