Files
MeWeb/src/MeWeb.App/Views/MainView.axaml
T
thepraandClaude Opus 5.5 340b2678ef
Build / Desktop, server and tools (push) Successful in 1m10s
Release / Every platform, the server, the release (push) Successful in 9m47s
"me-web?" 0.10.0: three cards that fold as you scroll, then a yes or a no
- The first screen is three cards you scroll through: what you could have (your family's photos at home, open from anywhere), how it works (a small computer that stays on, and an address of your own), and the question that matters: does your home have one?
- As you scroll down, the first two cards fold into two bubbles at the top. Tap a bubble to go back to its card.
- The last card ends with a choice: "Yes, let's find out" starts the check; "Not for me" says goodbye and closes the app.
- After your first check, the app opens on the last card, with the first two already folded.
- The swipe-through pages and the circling drawing are gone; the six things you could host stay listed under the cards.
- While a check runs, nothing is left empty: each thing you could host has its card from the start, with a "Checking" label and a moving shimmer, until its answer arrives. Checks still running look the same.
- The question, the two answers and the goodbye are in every language; translations other than English and Italian are still drafts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB
2026-10-16 09:53:10 +02:00

595 lines
36 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>
<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>
<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">
<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}" />
<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="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}" />
</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="{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>