Files
MeWeb/src/MeWeb.App/Views/MainView.axaml
T

607 lines
37 KiB
XML
Raw Normal View History

<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>