mirror of
https://github.com/DorkSquadRR/DorkNet.git
synced 2026-10-26 07:28:45 -07:00
Add installer updater and server CLI
This commit is contained in:
+1215
-413
@@ -2,8 +2,8 @@
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
Title="DorkNet"
|
||||
Width="960" Height="700"
|
||||
MinWidth="720" MinHeight="540"
|
||||
Width="1080" Height="720"
|
||||
MinWidth="900" MinHeight="600"
|
||||
WindowStartupLocation="CenterScreen"
|
||||
Background="{StaticResource Bg}"
|
||||
TextElement.Foreground="{StaticResource Ink}"
|
||||
@@ -11,115 +11,507 @@
|
||||
TextOptions.TextFormattingMode="Ideal"
|
||||
TextOptions.TextRenderingMode="ClearType">
|
||||
|
||||
<!-- Soft radial-ish glow in the top-left corner of the window for
|
||||
atmosphere. WPF doesn't have a true radial gradient on Background
|
||||
without nested Border tricks, so we stack a linear-gradient
|
||||
overlay on top of the solid Bg. -->
|
||||
<Grid>
|
||||
<!-- Window background: a faint vignette in the top-left from the
|
||||
brand colour into the slate base. No multi-stop rainbow — a
|
||||
single warm corner anchored on near-neutral. -->
|
||||
<Grid.Background>
|
||||
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
|
||||
<GradientStop Color="#2A1E48" Offset="0" />
|
||||
<GradientStop Color="#16102A" Offset="0.6" />
|
||||
<GradientStop Color="#16102A" Offset="1" />
|
||||
</LinearGradientBrush>
|
||||
<RadialGradientBrush GradientOrigin="0,0" Center="0,0"
|
||||
RadiusX="0.9" RadiusY="1.1">
|
||||
<GradientStop Color="#1A1820" Offset="0" />
|
||||
<GradientStop Color="#0D0F14" Offset="0.8" />
|
||||
</RadialGradientBrush>
|
||||
</Grid.Background>
|
||||
|
||||
<Grid Margin="36,28">
|
||||
<!-- View slots — only one Visible at a time; code-behind toggles. -->
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<!-- ── Welcome screen ─────────────────────────────────────
|
||||
Only shown on truly first launch. After "Get started"
|
||||
the user enters the setup wizard; subsequent launches
|
||||
skip straight to Setup or HostView/JoinView. -->
|
||||
<StackPanel x:Name="WelcomeView" Visibility="Collapsed"
|
||||
VerticalAlignment="Center" HorizontalAlignment="Center"
|
||||
MaxWidth="520">
|
||||
<TextBlock Text="DorkNet"
|
||||
FontSize="72" FontWeight="Bold"
|
||||
Foreground="{StaticResource WordmarkBrush}"
|
||||
HorizontalAlignment="Center"
|
||||
FontFamily="Segoe UI Variable, Segoe UI" />
|
||||
<TextBlock Text="Play together on your own Rec Room server."
|
||||
Foreground="{StaticResource Ink}"
|
||||
FontSize="18"
|
||||
HorizontalAlignment="Center" Margin="0,8,0,32"
|
||||
TextAlignment="Center" />
|
||||
|
||||
<Border Style="{StaticResource Panel}"
|
||||
Background="{StaticResource CardBg}" Padding="28,24"
|
||||
Margin="0,0,0,28">
|
||||
<StackPanel>
|
||||
<StackPanel Orientation="Horizontal" Margin="0,0,0,14">
|
||||
<TextBlock Text="✨" FontSize="20" Margin="0,0,12,0" />
|
||||
<TextBlock Foreground="{StaticResource Ink}" FontSize="14"
|
||||
VerticalAlignment="Center" TextWrapping="Wrap"
|
||||
Text="Set up in about two minutes" />
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal" Margin="0,0,0,14">
|
||||
<TextBlock Text="💸" FontSize="20" Margin="0,0,12,0" />
|
||||
<TextBlock Foreground="{StaticResource Ink}" FontSize="14"
|
||||
VerticalAlignment="Center" TextWrapping="Wrap"
|
||||
Text="Host for free — no credit card, no subscription" />
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="🎮" FontSize="20" Margin="0,0,12,0" />
|
||||
<TextBlock Foreground="{StaticResource Ink}" FontSize="14"
|
||||
VerticalAlignment="Center" TextWrapping="Wrap"
|
||||
Text="Works with the regular Rec Room game — no rebuild needed" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<Button Style="{StaticResource PrimaryBtn}"
|
||||
Content="Get started →"
|
||||
Click="OnWelcomeContinue"
|
||||
HorizontalAlignment="Center"
|
||||
Padding="34,14" FontSize="15" />
|
||||
|
||||
<TextBlock Text="Not affiliated with Rec Room Inc. or Against Gravity."
|
||||
HorizontalAlignment="Center"
|
||||
Foreground="{StaticResource InkFaint}"
|
||||
FontSize="11" Margin="0,28,0,0" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- ── Setup wizard ────────────────────────────────────────
|
||||
Shown on first launch after Welcome. Walks through mode
|
||||
pick, install location, server config + Photon. Once
|
||||
the user finishes the last step, AppState.SetupComplete
|
||||
flips and future launches go straight to HostView /
|
||||
JoinView (which still hold the same fields for tweaks). -->
|
||||
<Grid x:Name="SetupView" Visibility="Collapsed">
|
||||
<!-- ── Sidebar ─────────────────────────────────────────────────
|
||||
Persistent in Host/Join/Settings views. Hidden via code-behind
|
||||
during Welcome/Setup so those screens can hero the brand. -->
|
||||
<Border x:Name="MainNav" Grid.Column="0"
|
||||
Width="232" Visibility="Collapsed"
|
||||
Background="{StaticResource BgDeeper}"
|
||||
BorderBrush="{StaticResource BorderSoft}"
|
||||
BorderThickness="0,0,1,0">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Grid Grid.Row="0" Margin="0,0,0,24">
|
||||
<!-- Brand mark: brand-coloured square with a small notch
|
||||
cut out, plus the wordmark in caps. Distinctive geometric
|
||||
mark — no rainbow gradient on the text. -->
|
||||
<Border Grid.Row="0" Padding="20,22,20,18"
|
||||
BorderBrush="{StaticResource BorderSoft}"
|
||||
BorderThickness="0,0,0,1">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="DorkNet" FontSize="22" FontWeight="Bold"
|
||||
Foreground="{StaticResource WordmarkBrush}" />
|
||||
<Border Style="{StaticResource StatusChip}" Margin="14,0,0,0"
|
||||
VerticalAlignment="Center">
|
||||
<TextBlock x:Name="SetupStepIndicator"
|
||||
Text="STEP 1" FontSize="10"
|
||||
FontWeight="Bold" Foreground="{StaticResource Brand}" />
|
||||
<Grid Width="28" Height="28" Margin="0,0,12,0">
|
||||
<Border Background="{StaticResource Brand}"
|
||||
CornerRadius="6" />
|
||||
<Path Fill="White"
|
||||
Data="M 8 8 L 14 8 L 14 14 L 20 14 L 20 20 L 8 20 Z"
|
||||
Width="28" Height="28" />
|
||||
</Grid>
|
||||
<StackPanel VerticalAlignment="Center">
|
||||
<TextBlock Text="DORKNET" FontSize="13"
|
||||
FontWeight="Bold"
|
||||
Foreground="{StaticResource Ink}">
|
||||
<TextBlock.Resources>
|
||||
<Style TargetType="TextBlock">
|
||||
<Setter Property="FontFamily" Value="Segoe UI Variable, Segoe UI" />
|
||||
</Style>
|
||||
</TextBlock.Resources>
|
||||
</TextBlock>
|
||||
<TextBlock Text="PRIVATE SERVER" FontSize="9"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{StaticResource InkFaint}"
|
||||
Margin="0,2,0,0" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- Nav rows — Host, Join, Settings. Each routes to the
|
||||
same handlers the legacy mode-switcher uses. Visual
|
||||
"active" state is set by the code-behind via IsChecked
|
||||
to match whichever view is showing. -->
|
||||
<StackPanel Grid.Row="1" Margin="12,16">
|
||||
<TextBlock Text="MODE" Style="{StaticResource FieldLabel}"
|
||||
Margin="6,0,0,8" />
|
||||
<RadioButton x:Name="NavHostBtn" Style="{StaticResource NavBtn}"
|
||||
AutomationProperties.AutomationId="NavHostBtn"
|
||||
GroupName="MainNav" Click="OnPickHost">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="18" Height="18"
|
||||
Stroke="{Binding Foreground, RelativeSource={RelativeSource AncestorType=RadioButton}}"
|
||||
StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
Data="M 2 4 L 16 4 L 16 8 L 2 8 Z M 2 10 L 16 10 L 16 14 L 2 14 Z M 4 6 L 5 6 M 4 12 L 5 12 M 13 6 L 14 6 M 13 12 L 14 12"
|
||||
VerticalAlignment="Center" Margin="2,0,12,0" />
|
||||
<TextBlock Text="Host a server" VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</RadioButton>
|
||||
<RadioButton x:Name="NavJoinBtn" Style="{StaticResource NavBtn}"
|
||||
AutomationProperties.AutomationId="NavJoinBtn"
|
||||
GroupName="MainNav" Click="OnPickJoin">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="18" Height="18"
|
||||
Stroke="{Binding Foreground, RelativeSource={RelativeSource AncestorType=RadioButton}}"
|
||||
StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 7 11 L 11 7 M 5 9 A 3 3 0 0 1 9 5 L 11 5 M 11 13 L 9 13 A 3 3 0 0 1 5 9 M 15 9 A 3 3 0 0 1 11 13 M 11 5 A 3 3 0 0 1 15 9"
|
||||
VerticalAlignment="Center" Margin="2,0,12,0" />
|
||||
<TextBlock Text="Join a friend" VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</RadioButton>
|
||||
|
||||
<TextBlock Text="SYSTEM" Style="{StaticResource FieldLabel}"
|
||||
Margin="6,20,0,8" />
|
||||
<RadioButton x:Name="NavSettingsBtn" Style="{StaticResource NavBtn}"
|
||||
AutomationProperties.AutomationId="NavSettingsBtn"
|
||||
GroupName="MainNav" Click="OnOpenSettings">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="18" Height="18"
|
||||
Stroke="{Binding Foreground, RelativeSource={RelativeSource AncestorType=RadioButton}}"
|
||||
StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
Data="M 9 2 L 10 4 L 12 3 L 12.5 5 L 14.5 5 L 14 7 L 16 8 L 14.5 9.5 L 15 11.5 L 13 11.5 L 12.5 13.5 L 10.5 13 L 9 14.5 L 7.5 13 L 5.5 13.5 L 5 11.5 L 3 11.5 L 3.5 9.5 L 2 8 L 4 7 L 3.5 5 L 5.5 5 L 6 3 L 8 4 Z M 9 6.5 A 1.5 1.5 0 1 0 9 9.5 A 1.5 1.5 0 1 0 9 6.5"
|
||||
VerticalAlignment="Center" Margin="2,0,12,0" />
|
||||
<TextBlock Text="Settings" VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</RadioButton>
|
||||
<Button x:Name="NavRerunSetupBtn"
|
||||
ToolTip="Re-run setup wizard"
|
||||
Click="OnRerunSetup"
|
||||
HorizontalContentAlignment="Stretch"
|
||||
Background="Transparent" BorderBrush="Transparent"
|
||||
BorderThickness="0" Padding="14,9"
|
||||
Cursor="Hand"
|
||||
Margin="0,0,0,2">
|
||||
<Button.Template>
|
||||
<ControlTemplate TargetType="Button">
|
||||
<Border x:Name="root" Background="{TemplateBinding Background}"
|
||||
CornerRadius="6" Padding="{TemplateBinding Padding}">
|
||||
<ContentPresenter HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Center" />
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="root" Property="Background" Value="{StaticResource BgElev}" />
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Button.Template>
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
|
||||
<Path Width="18" Height="18"
|
||||
Stroke="{StaticResource InkSoft}"
|
||||
StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 4 9 A 5 5 0 1 1 6 13 M 4 5 L 4 9 L 8 9"
|
||||
VerticalAlignment="Center" Margin="2,0,12,0" />
|
||||
<TextBlock Text="Re-run setup" VerticalAlignment="Center"
|
||||
Foreground="{StaticResource InkSoft}"
|
||||
FontSize="13" FontWeight="SemiBold" />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Footer: status indicator + version. Information
|
||||
density a real tool wears. -->
|
||||
<Border Grid.Row="2" Padding="20,16"
|
||||
BorderBrush="{StaticResource BorderSoft}"
|
||||
BorderThickness="0,1,0,0">
|
||||
<StackPanel>
|
||||
<StackPanel Orientation="Horizontal" Margin="0,0,0,6">
|
||||
<Ellipse x:Name="SidebarStatusDot" Width="8" Height="8"
|
||||
Fill="{StaticResource InkFaint}"
|
||||
VerticalAlignment="Center" Margin="0,0,8,0" />
|
||||
<TextBlock x:Name="SidebarStatusText"
|
||||
Text="Idle" FontSize="11"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{StaticResource InkSoft}"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
<TextBlock x:Name="SidebarVersionText"
|
||||
Text="DORKNET LAUNCHER · v0.1"
|
||||
FontSize="9" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource InkFaint}"
|
||||
FontFamily="Cascadia Mono, Consolas" />
|
||||
<!-- Update banner — only visible after the
|
||||
startup check finds a newer release. Clicking
|
||||
stages the download + spawns the swap script. -->
|
||||
<Border x:Name="UpdateBanner" Visibility="Collapsed"
|
||||
Background="{StaticResource BrandSoft}"
|
||||
BorderBrush="{StaticResource Brand}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="6"
|
||||
Padding="10,8"
|
||||
Margin="0,12,0,0">
|
||||
<StackPanel>
|
||||
<StackPanel Orientation="Horizontal" Margin="0,0,0,4">
|
||||
<Path Width="11" Height="11" Margin="0,0,6,0"
|
||||
Stroke="{StaticResource Brand}"
|
||||
StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 5.5 1 L 5.5 8 M 2 5 L 5.5 8 L 9 5 M 1.5 10 L 9.5 10"
|
||||
VerticalAlignment="Center" />
|
||||
<TextBlock x:Name="UpdateBannerTitle"
|
||||
Text="Update available"
|
||||
FontSize="11" FontWeight="Bold"
|
||||
Foreground="{StaticResource Brand}"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
<TextBlock x:Name="UpdateBannerVersionText"
|
||||
Text=""
|
||||
FontSize="10"
|
||||
Foreground="{StaticResource InkSoft}"
|
||||
FontFamily="Cascadia Mono, Consolas"
|
||||
Margin="0,0,0,6" />
|
||||
<Button x:Name="UpdateInstallBtn"
|
||||
Click="OnInstallUpdate"
|
||||
Content="Install & restart"
|
||||
Cursor="Hand"
|
||||
HorizontalContentAlignment="Center"
|
||||
Background="{StaticResource Brand}"
|
||||
Foreground="White"
|
||||
BorderBrush="{StaticResource Brand}"
|
||||
BorderThickness="1"
|
||||
Padding="0,6"
|
||||
FontSize="10"
|
||||
FontWeight="Bold">
|
||||
<Button.Template>
|
||||
<ControlTemplate TargetType="Button">
|
||||
<Border x:Name="root"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}"
|
||||
CornerRadius="4">
|
||||
<ContentPresenter HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
Margin="{TemplateBinding Padding}"
|
||||
TextElement.Foreground="{TemplateBinding Foreground}" />
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="root" Property="Background" Value="{StaticResource BrandHover}" />
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Button.Template>
|
||||
</Button>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto"
|
||||
Padding="0,0,8,0">
|
||||
<!-- ── Content area ───────────────────────────────────────────── -->
|
||||
<Grid Grid.Column="1">
|
||||
|
||||
<!-- ── Welcome screen ─────────────────────────────────────
|
||||
Sidebar hidden during this view. Hero treatment with
|
||||
bold geometry — no emoji marketing card. -->
|
||||
<Grid x:Name="WelcomeView" Visibility="Collapsed">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<StackPanel Grid.Row="0"
|
||||
VerticalAlignment="Center" HorizontalAlignment="Center"
|
||||
MaxWidth="640" Margin="48,0">
|
||||
|
||||
<!-- Geometric brand mark, oversized. -->
|
||||
<Grid Width="84" Height="84" HorizontalAlignment="Center"
|
||||
Margin="0,0,0,28">
|
||||
<Border Background="{StaticResource Brand}"
|
||||
CornerRadius="16"
|
||||
Effect="{StaticResource BtnShadow}" />
|
||||
<Path Fill="White"
|
||||
Data="M 24 24 L 42 24 L 42 42 L 60 42 L 60 60 L 24 60 Z"
|
||||
Width="84" Height="84" />
|
||||
</Grid>
|
||||
|
||||
<TextBlock Text="DORKNET"
|
||||
FontSize="64" FontWeight="Bold"
|
||||
Foreground="{StaticResource Ink}"
|
||||
HorizontalAlignment="Center"
|
||||
FontFamily="Segoe UI Variable, Segoe UI" />
|
||||
<TextBlock HorizontalAlignment="Center" Margin="0,4,0,0">
|
||||
<Run Text="A private server for"
|
||||
Foreground="{StaticResource InkSoft}" FontSize="16" />
|
||||
<Run Text=" Rec Room. "
|
||||
Foreground="{StaticResource Ink}" FontSize="16" FontWeight="SemiBold" />
|
||||
<Run Text="Hosted on your machine, played with your friends."
|
||||
Foreground="{StaticResource InkSoft}" FontSize="16" />
|
||||
</TextBlock>
|
||||
|
||||
<!-- Feature row — no marketing card, just three flat
|
||||
items with a small left rule. Reads like docs, not
|
||||
a hero card. -->
|
||||
<Grid Margin="0,44,0,40" HorizontalAlignment="Center">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="40" />
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="40" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<StackPanel Grid.Column="0" MaxWidth="180">
|
||||
<Border Width="3" Height="20" Background="{StaticResource Brand}"
|
||||
HorizontalAlignment="Left" Margin="0,0,0,10" />
|
||||
<TextBlock Text="2-MIN SETUP" FontSize="10" FontWeight="Bold"
|
||||
Foreground="{StaticResource Ink}"
|
||||
Margin="0,0,0,6" />
|
||||
<TextBlock Text="Auto-detects your install, downloads everything else."
|
||||
FontSize="12" Foreground="{StaticResource InkSoft}"
|
||||
TextWrapping="Wrap" LineHeight="18" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Grid.Column="2" MaxWidth="180">
|
||||
<Border Width="3" Height="20" Background="{StaticResource Brand}"
|
||||
HorizontalAlignment="Left" Margin="0,0,0,10" />
|
||||
<TextBlock Text="ZERO COST" FontSize="10" FontWeight="Bold"
|
||||
Foreground="{StaticResource Ink}"
|
||||
Margin="0,0,0,6" />
|
||||
<TextBlock Text="No subscription, no card. Tunnelto handles the public address."
|
||||
FontSize="12" Foreground="{StaticResource InkSoft}"
|
||||
TextWrapping="Wrap" LineHeight="18" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Grid.Column="4" MaxWidth="180">
|
||||
<Border Width="3" Height="20" Background="{StaticResource Brand}"
|
||||
HorizontalAlignment="Left" Margin="0,0,0,10" />
|
||||
<TextBlock Text="STOCK CLIENT" FontSize="10" FontWeight="Bold"
|
||||
Foreground="{StaticResource Ink}"
|
||||
Margin="0,0,0,6" />
|
||||
<TextBlock Text="Patches the official Rec Room install in place. No rebuild."
|
||||
FontSize="12" Foreground="{StaticResource InkSoft}"
|
||||
TextWrapping="Wrap" LineHeight="18" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
<Button Style="{StaticResource PrimaryBtn}"
|
||||
Click="OnWelcomeContinue"
|
||||
HorizontalAlignment="Center"
|
||||
Padding="40,14" FontSize="14" FontWeight="Bold">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="GET STARTED" VerticalAlignment="Center"
|
||||
Foreground="White" />
|
||||
<Path Width="14" Height="14" Margin="14,0,0,0"
|
||||
Stroke="White" StrokeThickness="1.8"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 2 7 L 12 7 M 8 3 L 12 7 L 8 11"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</StackPanel>
|
||||
|
||||
<TextBlock Grid.Row="1"
|
||||
Text="Not affiliated with Rec Room Inc. or Against Gravity. · AGPL-3.0"
|
||||
HorizontalAlignment="Center"
|
||||
Foreground="{StaticResource InkFaint}"
|
||||
FontSize="10" FontWeight="SemiBold"
|
||||
Margin="0,0,0,28" />
|
||||
</Grid>
|
||||
|
||||
<!-- ── Setup wizard ─────────────────────────────────────── -->
|
||||
<Grid x:Name="SetupView" Visibility="Collapsed">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Header bar: wordmark + step pill. Matches the
|
||||
in-product header used by Host/Join. -->
|
||||
<Border Grid.Row="0" Padding="40,26,40,18"
|
||||
BorderBrush="{StaticResource BorderSoft}"
|
||||
BorderThickness="0,0,0,1">
|
||||
<Grid>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Grid Width="22" Height="22" Margin="0,0,12,0">
|
||||
<Border Background="{StaticResource Brand}" CornerRadius="5" />
|
||||
<Path Fill="White"
|
||||
Data="M 6 6 L 11 6 L 11 11 L 16 11 L 16 16 L 6 16 Z"
|
||||
Width="22" Height="22" />
|
||||
</Grid>
|
||||
<TextBlock Text="DORKNET" FontSize="14"
|
||||
FontWeight="Bold"
|
||||
Foreground="{StaticResource Ink}"
|
||||
VerticalAlignment="Center" />
|
||||
<Border Background="{StaticResource BorderSoft}" Width="1"
|
||||
Margin="14,4,14,4" />
|
||||
<TextBlock Text="FIRST-RUN SETUP" FontSize="11"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{StaticResource InkSoft}"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
<Border Style="{StaticResource StatusChip}" HorizontalAlignment="Right"
|
||||
VerticalAlignment="Center">
|
||||
<TextBlock x:Name="SetupStepIndicator"
|
||||
Text="STEP 1 OF 5" FontSize="10"
|
||||
FontWeight="Bold"
|
||||
Foreground="{StaticResource Brand}" />
|
||||
</Border>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<!-- Stepper bar showing all five steps as a progress
|
||||
rail. The active dot pulses on the brand colour;
|
||||
completed segments fill. -->
|
||||
<Border Grid.Row="1" Padding="40,18,40,18">
|
||||
<Grid x:Name="SetupStepperGrid">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Border Grid.Column="0" x:Name="StepBar1"
|
||||
Height="3" Margin="0,0,4,0"
|
||||
Background="{StaticResource Brand}"
|
||||
CornerRadius="2"
|
||||
VerticalAlignment="Top" />
|
||||
<Border Grid.Column="1" x:Name="StepBar2"
|
||||
Height="3" Margin="4,0,4,0"
|
||||
Background="{StaticResource Border}"
|
||||
CornerRadius="2"
|
||||
VerticalAlignment="Top" />
|
||||
<Border Grid.Column="2" x:Name="StepBar3"
|
||||
Height="3" Margin="4,0,4,0"
|
||||
Background="{StaticResource Border}"
|
||||
CornerRadius="2"
|
||||
VerticalAlignment="Top" />
|
||||
<Border Grid.Column="3" x:Name="StepBar4"
|
||||
Height="3" Margin="4,0,4,0"
|
||||
Background="{StaticResource Border}"
|
||||
CornerRadius="2"
|
||||
VerticalAlignment="Top" />
|
||||
<Border Grid.Column="4" x:Name="StepBar5"
|
||||
Height="3" Margin="4,0,0,0"
|
||||
Background="{StaticResource Border}"
|
||||
CornerRadius="2"
|
||||
VerticalAlignment="Top" />
|
||||
|
||||
<StackPanel Grid.Column="0" Margin="0,12,0,0">
|
||||
<TextBlock Text="01" FontSize="11" FontWeight="Bold"
|
||||
Foreground="{StaticResource Brand}"
|
||||
FontFamily="Cascadia Mono, Consolas" />
|
||||
<TextBlock Text="Mode" FontSize="11"
|
||||
Foreground="{StaticResource InkSoft}"
|
||||
Margin="0,2,0,0" />
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Column="1" Margin="0,12,0,0">
|
||||
<TextBlock Text="02" FontSize="11" FontWeight="Bold"
|
||||
Foreground="{StaticResource InkFaint}"
|
||||
FontFamily="Cascadia Mono, Consolas" />
|
||||
<TextBlock Text="Install" FontSize="11"
|
||||
Foreground="{StaticResource InkFaint}"
|
||||
Margin="0,2,0,0" />
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Column="2" Margin="0,12,0,0">
|
||||
<TextBlock Text="03" FontSize="11" FontWeight="Bold"
|
||||
Foreground="{StaticResource InkFaint}"
|
||||
FontFamily="Cascadia Mono, Consolas" />
|
||||
<TextBlock Text="Server" FontSize="11"
|
||||
Foreground="{StaticResource InkFaint}"
|
||||
Margin="0,2,0,0" />
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Column="3" Margin="0,12,0,0">
|
||||
<TextBlock Text="04" FontSize="11" FontWeight="Bold"
|
||||
Foreground="{StaticResource InkFaint}"
|
||||
FontFamily="Cascadia Mono, Consolas" />
|
||||
<TextBlock Text="Photon" FontSize="11"
|
||||
Foreground="{StaticResource InkFaint}"
|
||||
Margin="0,2,0,0" />
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Column="4" Margin="0,12,0,0">
|
||||
<TextBlock Text="05" FontSize="11" FontWeight="Bold"
|
||||
Foreground="{StaticResource InkFaint}"
|
||||
FontFamily="Cascadia Mono, Consolas" />
|
||||
<TextBlock Text="Done" FontSize="11"
|
||||
Foreground="{StaticResource InkFaint}"
|
||||
Margin="0,2,0,0" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Auto"
|
||||
Padding="40,16,32,16">
|
||||
<Grid MaxWidth="780" HorizontalAlignment="Stretch">
|
||||
<!-- Setup step 1: Host or Join? -->
|
||||
<StackPanel x:Name="SetupStep1" Visibility="Visible">
|
||||
<TextBlock Text="What do you want to do?" FontSize="26"
|
||||
FontWeight="Bold" Margin="0,0,0,8" />
|
||||
<TextBlock Text="Pick a mode. You can change this later under Settings."
|
||||
Foreground="{StaticResource InkSoft}" FontSize="14"
|
||||
<TextBlock Text="What do you want to do?" FontSize="28"
|
||||
FontWeight="Bold" Margin="0,12,0,8" />
|
||||
<TextBlock Text="Pick a mode. You can switch later from the sidebar."
|
||||
Foreground="{StaticResource InkSoft}" FontSize="13"
|
||||
Margin="0,0,0,28" />
|
||||
|
||||
<Grid MaxWidth="780" HorizontalAlignment="Left">
|
||||
<Grid HorizontalAlignment="Stretch">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="20" />
|
||||
@@ -130,18 +522,30 @@
|
||||
Background="{StaticResource CardBgHost}"
|
||||
Click="OnSetupPickHost">
|
||||
<StackPanel>
|
||||
<Border CornerRadius="14" Width="56" Height="56"
|
||||
Background="#3D2B57" Margin="0,0,0,18"
|
||||
HorizontalAlignment="Left">
|
||||
<TextBlock Text="🛠" FontSize="32"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center" />
|
||||
</Border>
|
||||
<TextBlock Text="Host a server" FontSize="22"
|
||||
FontWeight="Bold" Margin="0,0,0,10" />
|
||||
<Grid Width="44" Height="44" Margin="0,0,0,18"
|
||||
HorizontalAlignment="Left">
|
||||
<Border Background="{StaticResource BgInset}"
|
||||
BorderBrush="{StaticResource Border}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="10" />
|
||||
<Path Width="44" Height="44"
|
||||
Stroke="{StaticResource Brand}"
|
||||
StrokeThickness="1.6"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
Data="M 14 16 L 30 16 L 30 20 L 14 20 Z M 14 22 L 30 22 L 30 26 L 14 26 Z M 14 28 L 30 28 L 30 32 L 14 32 Z M 17 18 L 18 18 M 17 24 L 18 24 M 17 30 L 18 30" />
|
||||
</Grid>
|
||||
<TextBlock Text="HOST" FontSize="11"
|
||||
FontWeight="Bold"
|
||||
Foreground="{StaticResource Brand}"
|
||||
Margin="0,0,0,6" />
|
||||
<TextBlock Text="Run a server" FontSize="22"
|
||||
FontWeight="Bold"
|
||||
Foreground="{StaticResource Ink}"
|
||||
Margin="0,0,0,10" />
|
||||
<TextBlock Foreground="{StaticResource InkSoft}"
|
||||
FontSize="13" TextWrapping="Wrap" LineHeight="20"
|
||||
Text="Run a server for you and your friends. The launcher handles the tunnel, gives you a shareable join code." />
|
||||
FontSize="12" TextWrapping="Wrap" LineHeight="20"
|
||||
Text="The launcher runs the server, opens a tunnel, and hands you a join code your friends can paste." />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
|
||||
@@ -149,18 +553,32 @@
|
||||
Background="{StaticResource CardBgJoin}"
|
||||
Click="OnSetupPickJoin">
|
||||
<StackPanel>
|
||||
<Border CornerRadius="14" Width="56" Height="56"
|
||||
Background="#1C3C4A" Margin="0,0,0,18"
|
||||
HorizontalAlignment="Left">
|
||||
<TextBlock Text="🎮" FontSize="32"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center" />
|
||||
</Border>
|
||||
<TextBlock Text="Join a friend" FontSize="22"
|
||||
FontWeight="Bold" Margin="0,0,0,10" />
|
||||
<Grid Width="44" Height="44" Margin="0,0,0,18"
|
||||
HorizontalAlignment="Left">
|
||||
<Border Background="{StaticResource BgInset}"
|
||||
BorderBrush="{StaticResource Border}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="10" />
|
||||
<Path Width="44" Height="44"
|
||||
Stroke="{StaticResource Teal}"
|
||||
StrokeThickness="1.6"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 18 26 L 26 18 M 14 22 A 6 6 0 0 1 22 14 L 24 14 M 24 30 L 22 30 A 6 6 0 0 1 14 22 M 32 22 A 6 6 0 0 1 24 30 M 24 14 A 6 6 0 0 1 32 22" />
|
||||
</Grid>
|
||||
<TextBlock Text="JOIN" FontSize="11"
|
||||
FontWeight="Bold"
|
||||
Foreground="{StaticResource Teal}"
|
||||
Margin="0,0,0,6" />
|
||||
<TextBlock Text="Use a code" FontSize="22"
|
||||
FontWeight="Bold"
|
||||
Foreground="{StaticResource Ink}"
|
||||
Margin="0,0,0,10" />
|
||||
<TextBlock Foreground="{StaticResource InkSoft}"
|
||||
FontSize="13" TextWrapping="Wrap" LineHeight="20"
|
||||
Text="You have a join code from someone. Paste it and the launcher fetches the matching patcher." />
|
||||
FontSize="12" TextWrapping="Wrap" LineHeight="20"
|
||||
Text="Paste a join code from a friend. The launcher fetches the matching patcher and points your client at their server." />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</Grid>
|
||||
@@ -168,115 +586,142 @@
|
||||
|
||||
<!-- Setup step 2: Rec Room install -->
|
||||
<StackPanel x:Name="SetupStep2" Visibility="Collapsed">
|
||||
<TextBlock Text="Where's Rec Room installed?" FontSize="26"
|
||||
FontWeight="Bold" Margin="0,0,0,8" />
|
||||
<TextBlock Text="The launcher needs to find your Rec Room install folder. Pick the *_Data folder inside the install (e.g. Recroom_Release_Data)."
|
||||
Foreground="{StaticResource InkSoft}" FontSize="14"
|
||||
TextWrapping="Wrap" Margin="0,0,0,24" />
|
||||
<TextBlock Text="Find your Rec Room install" FontSize="28"
|
||||
FontWeight="Bold" Margin="0,12,0,8" />
|
||||
<TextBlock TextWrapping="Wrap"
|
||||
Foreground="{StaticResource InkSoft}" FontSize="13"
|
||||
Margin="0,0,0,24"
|
||||
Text="Point the launcher at the *_Data folder inside your Rec Room install (e.g. Recroom_Release_Data). Auto-detection runs first; pick manually if it misses." />
|
||||
|
||||
<Border x:Name="SetupDetectedBanner" Visibility="Collapsed"
|
||||
Style="{StaticResource Panel}"
|
||||
Background="{StaticResource CardBgJoin}"
|
||||
Background="{StaticResource BgElev}"
|
||||
BorderBrush="{StaticResource Ok}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="8" Padding="18,14"
|
||||
Margin="0,0,0,16">
|
||||
<StackPanel>
|
||||
<StackPanel Orientation="Horizontal" Margin="0,0,0,8">
|
||||
<TextBlock Text="✓" FontSize="18"
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid Grid.Column="0" Width="22" Height="22"
|
||||
Margin="0,0,14,0" VerticalAlignment="Top">
|
||||
<Ellipse Fill="{StaticResource Ok}" />
|
||||
<Path Stroke="#0D0F14" StrokeThickness="2.2"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 6 11 L 9.5 14.5 L 16 7"
|
||||
Width="22" Height="22" />
|
||||
</Grid>
|
||||
<StackPanel Grid.Column="1">
|
||||
<TextBlock Text="DETECTED INSTALL" FontSize="10"
|
||||
FontWeight="Bold"
|
||||
Foreground="{StaticResource Ok}"
|
||||
Margin="0,0,10,0" />
|
||||
<TextBlock Text="We found a Rec Room install"
|
||||
FontSize="15" FontWeight="SemiBold"
|
||||
VerticalAlignment="Center" />
|
||||
Margin="0,0,0,4" />
|
||||
<TextBlock x:Name="SetupDetectedPath"
|
||||
Foreground="{StaticResource Ink}"
|
||||
FontSize="12"
|
||||
FontFamily="Cascadia Mono, Consolas"
|
||||
TextWrapping="Wrap" />
|
||||
</StackPanel>
|
||||
<TextBlock x:Name="SetupDetectedPath"
|
||||
Foreground="{StaticResource InkSoft}"
|
||||
FontSize="12"
|
||||
FontFamily="Cascadia Mono, Consolas"
|
||||
TextWrapping="Wrap" Margin="28,0,0,0" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="INSTALL FOLDER" />
|
||||
<DockPanel Margin="0,0,0,12">
|
||||
<Button DockPanel.Dock="Right" Style="{StaticResource Btn}"
|
||||
Content="Pick…" Click="OnPickRecRoom" Margin="8,0,0,0" />
|
||||
<Border Background="{StaticResource BgDeeper}"
|
||||
BorderBrush="{StaticResource BorderSoft}" BorderThickness="1"
|
||||
CornerRadius="10" Padding="12,10">
|
||||
Content="Browse…" Click="OnPickRecRoom" Margin="8,0,0,0" />
|
||||
<Border Background="{StaticResource BgInset}"
|
||||
BorderBrush="{StaticResource Border}" BorderThickness="1"
|
||||
CornerRadius="6" Padding="12,10">
|
||||
<TextBlock x:Name="SetupRecRoomPath"
|
||||
Text="(not picked)"
|
||||
Foreground="{StaticResource InkSoft}"
|
||||
TextTrimming="CharacterEllipsis" FontSize="13" />
|
||||
FontFamily="Cascadia Mono, Consolas"
|
||||
TextTrimming="CharacterEllipsis" FontSize="12" />
|
||||
</Border>
|
||||
</DockPanel>
|
||||
<TextBlock Foreground="{StaticResource InkFaint}" FontSize="11"
|
||||
TextWrapping="Wrap"
|
||||
Text="Don't have Rec Room installed yet? Grab it from the Rec Room website (or wherever you usually get it). DorkNet works with any official install." />
|
||||
TextWrapping="Wrap" LineHeight="18"
|
||||
Text="DorkNet works with any official Rec Room install. If you don't have one, grab the regular client first." />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Setup step 3 (HOST only): Server name + WHO CAN JOIN -->
|
||||
<StackPanel x:Name="SetupStep3" Visibility="Collapsed">
|
||||
<TextBlock Text="Set up your server" FontSize="26"
|
||||
FontWeight="Bold" Margin="0,0,0,8" />
|
||||
<TextBlock Text="Name your server so friends know what they're joining."
|
||||
Foreground="{StaticResource InkSoft}" FontSize="14"
|
||||
<TextBlock Text="Set up your server" FontSize="28"
|
||||
FontWeight="Bold" Margin="0,12,0,8" />
|
||||
<TextBlock Text="A name your friends will see, and how they reach you."
|
||||
Foreground="{StaticResource InkSoft}" FontSize="13"
|
||||
Margin="0,0,0,24" />
|
||||
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="SERVER NAME" />
|
||||
<TextBox x:Name="SetupServerName" Margin="0,0,0,20"
|
||||
<TextBox x:Name="SetupServerName" Margin="0,0,0,24"
|
||||
LostFocus="OnSetupServerNameChanged" />
|
||||
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="WHO CAN JOIN?" />
|
||||
<StackPanel Margin="0,0,0,16">
|
||||
<RadioButton x:Name="SetupHostInternet" GroupName="SetupHostingMode"
|
||||
Content="Friends anywhere (Tunnelto)"
|
||||
IsChecked="True" Margin="0,0,0,6"
|
||||
Checked="OnSetupHostingModeChanged"
|
||||
Foreground="{StaticResource Ink}" />
|
||||
Content="Friends anywhere · Tunnelto"
|
||||
IsChecked="True"
|
||||
Checked="OnSetupHostingModeChanged" />
|
||||
<RadioButton x:Name="SetupHostRemote" GroupName="SetupHostingMode"
|
||||
Content="Friends anywhere (Tunnelto wildcard base)"
|
||||
Margin="0,0,0,6"
|
||||
Checked="OnSetupHostingModeChanged"
|
||||
Foreground="{StaticResource Ink}" />
|
||||
Content="Friends anywhere · Tunnelto wildcard base"
|
||||
Checked="OnSetupHostingModeChanged" />
|
||||
<RadioButton x:Name="SetupHostLocal" GroupName="SetupHostingMode"
|
||||
Content="Same WiFi only (sslip.io)"
|
||||
Checked="OnSetupHostingModeChanged"
|
||||
Foreground="{StaticResource Ink}" />
|
||||
Content="Same WiFi only · sslip.io"
|
||||
Checked="OnSetupHostingModeChanged" />
|
||||
</StackPanel>
|
||||
<StackPanel x:Name="SetupRemoteWildcardSection" Visibility="Collapsed">
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="TUNNELTO BASE HOST" />
|
||||
<TextBox x:Name="SetupRemoteWildcardInput" Margin="0,0,0,8"
|
||||
FontFamily="Cascadia Mono, Consolas" FontSize="12"
|
||||
LostFocus="OnRemoteWildcardChanged"
|
||||
ToolTip="Service URLs become api.base, auth.base, etc." />
|
||||
<TextBlock Foreground="{StaticResource InkFaint}" FontSize="11"
|
||||
TextWrapping="Wrap" LineHeight="18"
|
||||
Text="Pick a base host whose provider routes wildcard subdomains to the same tunnel. The launcher derives api.base, auth.base, photon.base from it." />
|
||||
</StackPanel>
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="TUNNELTO BASE HOST" />
|
||||
<TextBox x:Name="SetupRemoteWildcardInput" Margin="0,0,0,12"
|
||||
LostFocus="OnRemoteWildcardChanged"
|
||||
ToolTip="Auto-generated. Service URLs become api.base, auth.base, etc." />
|
||||
<TextBlock Foreground="{StaticResource InkFaint}" FontSize="11"
|
||||
TextWrapping="Wrap"
|
||||
Text="Tunnelto mode works for friends anywhere. For subdomain support, use a base host whose provider routes wildcard subdomains to the same tunnel." />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Setup step 4 (HOST only): Photon AppIds -->
|
||||
<StackPanel x:Name="SetupStep4" Visibility="Collapsed">
|
||||
<TextBlock Text="Connect your Photon account" FontSize="26"
|
||||
FontWeight="Bold" Margin="0,0,0,8" />
|
||||
<TextBlock Text="Connect your Photon account" FontSize="28"
|
||||
FontWeight="Bold" Margin="0,12,0,8" />
|
||||
<TextBlock TextWrapping="Wrap"
|
||||
Foreground="{StaticResource InkSoft}" FontSize="14"
|
||||
Margin="0,0,0,24"
|
||||
Text="DorkNet needs your own Photon account (free, takes ~2 min) to handle in-room sync. Click the walkthrough below — it'll open the Photon website, tell you what to click, and bring you back here." />
|
||||
Foreground="{StaticResource InkSoft}" FontSize="13"
|
||||
Margin="0,0,0,20"
|
||||
Text="Photon Cloud handles in-room realtime sync. Free to register; DorkNet never ships one of its own. The walkthrough does the registration in 2 minutes." />
|
||||
|
||||
<Button Style="{StaticResource PrimaryBtn}"
|
||||
Content="Open setup walkthrough"
|
||||
Click="OnOpenPhotonWizard"
|
||||
HorizontalAlignment="Left" Margin="0,0,0,20" />
|
||||
HorizontalAlignment="Left" Margin="0,0,0,24">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="14" Height="14" Margin="0,0,10,0"
|
||||
Stroke="White" StrokeThickness="1.6"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
Data="M 4 3 L 10 3 L 10 9 M 10 3 L 5 8 M 8 8 L 8 11 L 2 11 L 2 5 L 5 5"
|
||||
VerticalAlignment="Center" />
|
||||
<TextBlock Text="OPEN WALKTHROUGH" FontWeight="Bold"
|
||||
Foreground="White" VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
|
||||
<Border Style="{StaticResource Panel}"
|
||||
Background="{StaticResource BgDeeper}"
|
||||
Margin="0,0,0,12">
|
||||
<Border Background="{StaticResource BgInset}"
|
||||
BorderBrush="{StaticResource BorderSoft}"
|
||||
BorderThickness="1" CornerRadius="8"
|
||||
Padding="18" Margin="0,0,0,12">
|
||||
<StackPanel>
|
||||
<TextBlock Foreground="{StaticResource InkSoft}" FontSize="12"
|
||||
Margin="0,0,0,8"
|
||||
Text="Already have AppIds? Paste them here." />
|
||||
Margin="0,0,0,14"
|
||||
Text="Already have AppIds? Paste them directly." />
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="REALTIME APPID" />
|
||||
<TextBox x:Name="SetupPhotonAppId" Margin="0,0,0,12"
|
||||
<TextBox x:Name="SetupPhotonAppId" Margin="0,0,0,14"
|
||||
FontFamily="Cascadia Mono, Consolas" FontSize="12"
|
||||
LostFocus="OnSetupPhotonChanged" />
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="VOICE APPID (OPTIONAL)" />
|
||||
<TextBox x:Name="SetupPhotonVoiceAppId" Margin="0,0,0,0"
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="VOICE APPID · OPTIONAL" />
|
||||
<TextBox x:Name="SetupPhotonVoiceAppId"
|
||||
FontFamily="Cascadia Mono, Consolas" FontSize="12"
|
||||
LostFocus="OnSetupPhotonChanged" />
|
||||
</StackPanel>
|
||||
@@ -286,27 +731,68 @@
|
||||
Text="Realtime AppId required before you can host." />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Setup done: short confirmation card -->
|
||||
<!-- Setup done -->
|
||||
<StackPanel x:Name="SetupStepDone" Visibility="Collapsed">
|
||||
<TextBlock Text="You're all set! 🎉" FontSize="26"
|
||||
<Grid Width="64" Height="64" Margin="0,12,0,24" HorizontalAlignment="Left">
|
||||
<Ellipse Fill="{StaticResource BrandSoft}" />
|
||||
<Path Stroke="{StaticResource Brand}" StrokeThickness="2.5"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 22 32 L 30 40 L 44 26"
|
||||
Width="64" Height="64" />
|
||||
</Grid>
|
||||
<TextBlock Text="You're ready to ship." FontSize="28"
|
||||
FontWeight="Bold" Margin="0,0,0,12" />
|
||||
<TextBlock TextWrapping="Wrap"
|
||||
Foreground="{StaticResource Ink}" FontSize="14"
|
||||
LineHeight="22"
|
||||
Text="Setup's done. Hit Finish to open the main view — everything you just configured is saved, so you can hit Start hosting straight away." />
|
||||
<TextBlock TextWrapping="Wrap" MaxWidth="520"
|
||||
HorizontalAlignment="Left"
|
||||
Foreground="{StaticResource InkSoft}" FontSize="13"
|
||||
LineHeight="20"
|
||||
Text="Setup is saved. Hit Finish to open the main view — your install, server name, and Photon AppIds are remembered for next launch." />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</ScrollViewer>
|
||||
|
||||
<!-- Footer nav -->
|
||||
<Grid Grid.Row="2" Margin="0,20,0,0">
|
||||
<Button x:Name="SetupBackBtn" HorizontalAlignment="Left"
|
||||
Style="{StaticResource GhostBtn}"
|
||||
Content="← Back" Click="OnSetupBack" Visibility="Collapsed" />
|
||||
<Button x:Name="SetupNextBtn" HorizontalAlignment="Right"
|
||||
Style="{StaticResource PrimaryBtn}"
|
||||
Content="Next →" Click="OnSetupNext" Visibility="Collapsed" />
|
||||
</Grid>
|
||||
<Border Grid.Row="3" Padding="40,16,40,20"
|
||||
BorderBrush="{StaticResource BorderSoft}"
|
||||
BorderThickness="0,1,0,0"
|
||||
Background="{StaticResource BgDeeper}">
|
||||
<Grid>
|
||||
<Button x:Name="SetupBackBtn" HorizontalAlignment="Left"
|
||||
Style="{StaticResource Btn}"
|
||||
Click="OnSetupBack" Visibility="Collapsed">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="14" Height="14" Margin="0,0,8,0"
|
||||
Stroke="{StaticResource Ink}" StrokeThickness="1.8"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 12 7 L 2 7 M 6 3 L 2 7 L 6 11"
|
||||
VerticalAlignment="Center" />
|
||||
<TextBlock Text="Back" VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
<Button x:Name="SetupNextBtn" HorizontalAlignment="Right"
|
||||
Style="{StaticResource PrimaryBtn}"
|
||||
Click="OnSetupNext" Visibility="Collapsed">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock x:Name="SetupNextLabel" Text="Next"
|
||||
VerticalAlignment="Center" Foreground="White"
|
||||
FontWeight="Bold" />
|
||||
<Path Width="14" Height="14" Margin="10,0,0,0"
|
||||
Stroke="White" StrokeThickness="1.8"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 2 7 L 12 7 M 8 3 L 12 7 L 8 11"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</Grid>
|
||||
</Border>
|
||||
</Grid>
|
||||
|
||||
<!-- ── Host view ──────────────────────────────────────────── -->
|
||||
@@ -316,98 +802,155 @@
|
||||
<RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Header bar with wordmark + view label + settings button -->
|
||||
<Grid Grid.Row="0" Margin="0,0,0,28">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="DorkNet" FontSize="22" FontWeight="Bold"
|
||||
Foreground="{StaticResource WordmarkBrush}" />
|
||||
<Border Style="{StaticResource StatusChip}" Margin="14,0,0,0"
|
||||
VerticalAlignment="Center">
|
||||
<TextBlock Text="HOST MODE" FontSize="10"
|
||||
FontWeight="Bold" Foreground="{StaticResource Brand}" />
|
||||
</Border>
|
||||
</StackPanel>
|
||||
<Button HorizontalAlignment="Right" Style="{StaticResource GhostBtn}"
|
||||
Content="Settings" Click="OnOpenSettings" />
|
||||
</Grid>
|
||||
<Border Grid.Row="0" Padding="32,22"
|
||||
BorderBrush="{StaticResource BorderSoft}"
|
||||
BorderThickness="0,0,0,1">
|
||||
<Grid>
|
||||
<StackPanel>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="HOST" FontSize="11" FontWeight="Bold"
|
||||
Foreground="{StaticResource Brand}"
|
||||
FontFamily="Cascadia Mono, Consolas"
|
||||
VerticalAlignment="Center" />
|
||||
<Border Background="{StaticResource Brand}" Width="14" Height="1"
|
||||
Margin="10,0,10,0" VerticalAlignment="Center" />
|
||||
<TextBlock Text="Run a private Rec Room server" FontSize="11"
|
||||
Foreground="{StaticResource InkSoft}" FontWeight="SemiBold"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
<TextBlock Text="Host a server" FontSize="22" FontWeight="Bold"
|
||||
Foreground="{StaticResource Ink}" Margin="0,4,0,0" />
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right"
|
||||
VerticalAlignment="Center">
|
||||
<CheckBox x:Name="HostScreenModeChk" Content="Screen mode"
|
||||
VerticalAlignment="Center" Margin="0,0,8,0"
|
||||
ToolTip="Launch in 2D desktop mode (+forcemode:screen) instead of VR."
|
||||
Checked="OnScreenModeChanged" Unchecked="OnScreenModeChanged" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto"
|
||||
Padding="0,0,8,0">
|
||||
Padding="32,24,24,24">
|
||||
<StackPanel>
|
||||
<!-- Setup panel -->
|
||||
<Border Style="{StaticResource Panel}" Margin="0,0,0,16">
|
||||
<!-- Server config panel -->
|
||||
<Border Style="{StaticResource Panel}" Margin="0,0,0,18">
|
||||
<StackPanel>
|
||||
<TextBlock Style="{StaticResource SectionTitle}" Text="Setup" />
|
||||
<Grid Margin="0,0,0,16">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="16" Height="16"
|
||||
Stroke="{StaticResource Brand}"
|
||||
StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
Data="M 2 4 L 14 4 L 14 7 L 2 7 Z M 2 9 L 14 9 L 14 12 L 2 12 Z M 4 5.5 L 5 5.5 M 4 10.5 L 5 10.5 M 11 5.5 L 12 5.5 M 11 10.5 L 12 10.5"
|
||||
VerticalAlignment="Center" Margin="0,0,10,0" />
|
||||
<TextBlock Text="Server" FontSize="14" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource Ink}"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="REC ROOM INSTALL" />
|
||||
<DockPanel Margin="0,0,0,16">
|
||||
<Button DockPanel.Dock="Right" Style="{StaticResource Btn}"
|
||||
Content="Pick…" Click="OnPickRecRoom" Margin="8,0,0,0" />
|
||||
<Border Background="{StaticResource BgDeeper}"
|
||||
BorderBrush="{StaticResource BorderSoft}" BorderThickness="1"
|
||||
CornerRadius="10" Padding="12,10">
|
||||
Content="Browse…" Click="OnPickRecRoom" Margin="8,0,0,0" />
|
||||
<Border Background="{StaticResource BgInset}"
|
||||
BorderBrush="{StaticResource Border}" BorderThickness="1"
|
||||
CornerRadius="6" Padding="12,10">
|
||||
<TextBlock x:Name="HostRecRoomPath"
|
||||
Text="(not picked)"
|
||||
Foreground="{StaticResource InkSoft}"
|
||||
TextTrimming="CharacterEllipsis" FontSize="13" />
|
||||
FontFamily="Cascadia Mono, Consolas"
|
||||
TextTrimming="CharacterEllipsis" FontSize="12" />
|
||||
</Border>
|
||||
</DockPanel>
|
||||
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="SERVER NAME (SHOWN TO JOINERS)" />
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="SERVER NAME · SHOWN TO JOINERS" />
|
||||
<TextBox x:Name="ServerNameInput" Margin="0,0,0,16"
|
||||
LostFocus="OnServerNameChanged" />
|
||||
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="REC ROOM VERSION TO HOST FOR" />
|
||||
<ComboBox x:Name="VersionSelect" Margin="0,0,0,16" />
|
||||
<ComboBox x:Name="VersionSelect" Margin="0,0,0,18" />
|
||||
|
||||
<Border Background="{StaticResource BorderSoft}" Height="1"
|
||||
Margin="0,4,0,16" />
|
||||
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="WHO CAN JOIN?" />
|
||||
<StackPanel>
|
||||
<RadioButton x:Name="HostModeInternet" GroupName="HostingMode"
|
||||
Content="Friends anywhere (Tunnelto)"
|
||||
Margin="0,0,0,6"
|
||||
IsChecked="True" Checked="OnHostingModeChanged"
|
||||
Foreground="{StaticResource Ink}" />
|
||||
Content="Friends anywhere · Tunnelto"
|
||||
IsChecked="True" Checked="OnHostingModeChanged" />
|
||||
<RadioButton x:Name="HostModeRemote" GroupName="HostingMode"
|
||||
Content="Tunnelto wildcard base"
|
||||
Margin="0,0,0,6" Checked="OnHostingModeChanged"
|
||||
Foreground="{StaticResource Ink}" />
|
||||
Checked="OnHostingModeChanged" />
|
||||
<RadioButton x:Name="HostModeLocal" GroupName="HostingMode"
|
||||
Content="Same WiFi only (sslip.io)"
|
||||
Checked="OnHostingModeChanged"
|
||||
Foreground="{StaticResource Ink}" />
|
||||
Content="Same WiFi only · sslip.io"
|
||||
Checked="OnHostingModeChanged" />
|
||||
</StackPanel>
|
||||
<StackPanel x:Name="HostRemoteWildcardSection" Visibility="Collapsed"
|
||||
Margin="0,16,0,0">
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="TUNNELTO BASE HOST" />
|
||||
<TextBox x:Name="RemoteWildcardInput"
|
||||
FontFamily="Cascadia Mono, Consolas" FontSize="12"
|
||||
LostFocus="OnRemoteWildcardChanged"
|
||||
ToolTip="Service URLs become api.base, auth.base, etc." />
|
||||
</StackPanel>
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="TUNNELTO BASE HOST" Margin="0,14,0,6" />
|
||||
<TextBox x:Name="RemoteWildcardInput" Margin="0,0,0,0"
|
||||
LostFocus="OnRemoteWildcardChanged"
|
||||
ToolTip="Auto-generated. Service URLs become api.base, auth.base, etc." />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- Photon panel -->
|
||||
<Border Style="{StaticResource Panel}" Margin="0,0,0,16">
|
||||
<!-- Photon config panel -->
|
||||
<Border Style="{StaticResource Panel}" Margin="0,0,0,18">
|
||||
<StackPanel>
|
||||
<Grid Margin="0,0,0,12">
|
||||
<TextBlock Style="{StaticResource SectionTitle}"
|
||||
Text="Photon AppIds" Margin="0" />
|
||||
<Grid Margin="0,0,0,16">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="16" Height="16"
|
||||
Stroke="{StaticResource Brand}"
|
||||
StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 8 1 L 12 7 L 8 7 L 8 15 L 4 9 L 8 9 Z"
|
||||
VerticalAlignment="Center" Margin="0,0,10,0" />
|
||||
<TextBlock Text="Photon Cloud" FontSize="14" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource Ink}"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
<Button HorizontalAlignment="Right" Style="{StaticResource Btn}"
|
||||
Content="Setup walkthrough" Click="OnOpenPhotonWizard"
|
||||
Padding="14,6" FontSize="12" />
|
||||
Click="OnOpenPhotonWizard"
|
||||
Padding="12,5" FontSize="11">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="11" Height="11" Margin="0,0,6,0"
|
||||
Stroke="{StaticResource Ink}" StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
Data="M 4 2 L 9 2 L 9 7 M 9 2 L 4 7"
|
||||
VerticalAlignment="Center" />
|
||||
<TextBlock Text="WALKTHROUGH" FontSize="11" FontWeight="SemiBold"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</Grid>
|
||||
<TextBlock Foreground="{StaticResource InkSoft}" FontSize="12"
|
||||
Margin="0,0,0,12" TextWrapping="Wrap">
|
||||
Photon Cloud powers in-room realtime sync. Free to register at
|
||||
Margin="0,0,0,16" TextWrapping="Wrap" LineHeight="18">
|
||||
Powers in-room realtime sync. Free at
|
||||
<Hyperlink NavigateUri="https://dashboard.photonengine.com"
|
||||
Foreground="{StaticResource Brand}"
|
||||
TextDecorations="None"
|
||||
RequestNavigate="OnNavigate">dashboard.photonengine.com</Hyperlink>;
|
||||
DorkNet never bundles one. First time? Click "Setup walkthrough" above.
|
||||
your AppIds stay local.
|
||||
</TextBlock>
|
||||
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="REALTIME APPID" />
|
||||
<TextBox x:Name="PhotonAppIdInput" Margin="0,0,0,12"
|
||||
<TextBox x:Name="PhotonAppIdInput" Margin="0,0,0,14"
|
||||
FontFamily="Cascadia Mono, Consolas" FontSize="12"
|
||||
LostFocus="OnPhotonChanged" />
|
||||
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="VOICE APPID (OPTIONAL)" />
|
||||
<TextBox x:Name="PhotonVoiceAppIdInput" Margin="0,0,0,12"
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="VOICE APPID · OPTIONAL" />
|
||||
<TextBox x:Name="PhotonVoiceAppIdInput" Margin="0,0,0,14"
|
||||
FontFamily="Cascadia Mono, Consolas" FontSize="12"
|
||||
LostFocus="OnPhotonChanged" />
|
||||
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="CLOUD REGION" />
|
||||
@@ -425,38 +968,94 @@
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- Action area -->
|
||||
<StackPanel Orientation="Horizontal" Margin="0,4,0,16">
|
||||
<Button x:Name="HostStartBtn" Style="{StaticResource PrimaryBtn}"
|
||||
Content="Start hosting" Click="OnHostStart" />
|
||||
<Button x:Name="HostStopBtn" Style="{StaticResource Btn}"
|
||||
Content="Stop" Click="OnHostStop"
|
||||
Margin="10,0,0,0" Visibility="Collapsed" />
|
||||
<Button x:Name="HostLaunchBtn" Style="{StaticResource TealBtn}"
|
||||
Content="Launch Rec Room" Click="OnLaunchRecRoom"
|
||||
Margin="10,0,0,0" Visibility="Collapsed" />
|
||||
<CheckBox x:Name="HostScreenModeChk" Content="Screen mode"
|
||||
VerticalAlignment="Center" Margin="14,0,0,0"
|
||||
Foreground="{StaticResource Ink}"
|
||||
ToolTip="Launch in 2D desktop mode (passes +forcemode:screen) instead of VR."
|
||||
Checked="OnScreenModeChanged" Unchecked="OnScreenModeChanged" />
|
||||
</StackPanel>
|
||||
<!-- Primary action row -->
|
||||
<Border Background="{StaticResource BgElev}"
|
||||
BorderBrush="{StaticResource Border}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="8" Padding="22"
|
||||
Margin="0,0,0,18">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Button x:Name="HostStartBtn" Style="{StaticResource PrimaryBtn}"
|
||||
Click="OnHostStart">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="11" Height="11" Margin="0,0,10,0"
|
||||
Fill="White"
|
||||
Data="M 0 0 L 11 5.5 L 0 11 Z"
|
||||
VerticalAlignment="Center" />
|
||||
<TextBlock Text="START HOSTING" FontWeight="Bold"
|
||||
Foreground="White" VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
<Button x:Name="HostStopBtn" Style="{StaticResource Btn}"
|
||||
Click="OnHostStop"
|
||||
Margin="10,0,0,0" Visibility="Collapsed">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Rectangle Width="10" Height="10" Margin="0,0,8,0"
|
||||
Fill="{StaticResource Danger}"
|
||||
VerticalAlignment="Center" />
|
||||
<TextBlock Text="STOP" FontWeight="Bold"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
<Button x:Name="HostLaunchBtn" Style="{StaticResource PlayBtn}"
|
||||
Click="OnLaunchRecRoom"
|
||||
Margin="10,0,0,0" Visibility="Collapsed">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="13" Height="13" Margin="0,0,12,0"
|
||||
Fill="White"
|
||||
Data="M 0 0 L 13 6.5 L 0 13 Z"
|
||||
VerticalAlignment="Center" />
|
||||
<TextBlock Text="LAUNCH REC ROOM" FontWeight="Bold"
|
||||
Foreground="White" VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
<Button x:Name="HostAdminBtn" Style="{StaticResource Btn}"
|
||||
Click="OnOpenAdminPanel"
|
||||
ToolTip="Open the server's admin web panel in your browser. First account on a fresh server becomes the admin automatically."
|
||||
Margin="10,0,0,0" Visibility="Collapsed">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="13" Height="13" Margin="0,0,10,0"
|
||||
Stroke="{StaticResource Ink}" StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 4 3 L 11 3 L 11 10 M 11 3 L 5 9 M 9 9 L 9 12 L 2 12 L 2 5 L 5 5"
|
||||
VerticalAlignment="Center" />
|
||||
<TextBlock Text="ADMIN PANEL" FontWeight="Bold"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- Progress steps — populated when the user hits
|
||||
"Start hosting". Hidden until then so the
|
||||
idle Host view stays clean. -->
|
||||
<!-- Progress steps panel -->
|
||||
<Border x:Name="HostStepsPanel" Style="{StaticResource Panel}"
|
||||
Margin="0,0,0,16" Visibility="Collapsed">
|
||||
Margin="0,0,0,18" Visibility="Collapsed">
|
||||
<StackPanel>
|
||||
<TextBlock Style="{StaticResource SectionTitle}" Text="Progress" />
|
||||
<StackPanel Orientation="Horizontal" Margin="0,0,0,16">
|
||||
<Path Width="16" Height="16"
|
||||
Stroke="{StaticResource Brand}"
|
||||
StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 2 8 L 6 12 L 14 4"
|
||||
VerticalAlignment="Center" Margin="0,0,10,0" />
|
||||
<TextBlock Text="Progress" FontSize="14" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource Ink}"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
<ItemsControl x:Name="HostStepsList"
|
||||
ItemTemplate="{StaticResource StepRowTemplate}" />
|
||||
<TextBlock x:Name="HostStatusText"
|
||||
Foreground="{StaticResource InkSoft}"
|
||||
TextWrapping="Wrap" FontSize="13"
|
||||
TextWrapping="Wrap" FontSize="12"
|
||||
LineHeight="18"
|
||||
Margin="0,4,0,0" />
|
||||
<StackPanel x:Name="HostRetryPanel" Visibility="Collapsed"
|
||||
Orientation="Horizontal" Margin="0,12,0,0">
|
||||
Orientation="Horizontal" Margin="0,16,0,0">
|
||||
<Button x:Name="HostRetryBtn" Style="{StaticResource PrimaryBtn}"
|
||||
Content="Retry" Click="OnHostRetry" />
|
||||
<Button Style="{StaticResource GhostBtn}"
|
||||
@@ -467,28 +1066,51 @@
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- Join code panel — appears once the host is up.
|
||||
QR encodes the same code text; friends can
|
||||
scan with a phone to grab it without typing. -->
|
||||
<!-- Join code "ticket" — visible once host is up.
|
||||
Designed as a distinct artefact: monospace
|
||||
join code, QR alongside, three share actions. -->
|
||||
<Border x:Name="JoinCodePanel" Visibility="Collapsed"
|
||||
Style="{StaticResource Panel}"
|
||||
Background="{StaticResource CardBgHost}">
|
||||
<StackPanel>
|
||||
<TextBlock Style="{StaticResource SectionTitle}"
|
||||
Text="🎉 Share this with friends" />
|
||||
|
||||
<Grid>
|
||||
Background="{StaticResource BgElev}"
|
||||
BorderBrush="{StaticResource Brand}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="8" Padding="0"
|
||||
Margin="0,0,0,18">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
<Border Grid.Row="0" Background="{StaticResource Brand}"
|
||||
Padding="22,12">
|
||||
<Grid>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="14" Height="14" Margin="0,0,10,0"
|
||||
Stroke="White" StrokeThickness="1.8"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
Data="M 3 4 L 11 4 L 11 12 L 3 12 Z M 1 6 L 1 14 L 9 14"
|
||||
VerticalAlignment="Center" />
|
||||
<TextBlock Text="SERVER LIVE · SHARE THIS WITH FRIENDS"
|
||||
FontSize="11" FontWeight="Bold"
|
||||
Foreground="White"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
<Ellipse HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||
Width="8" Height="8" Fill="White" />
|
||||
</Grid>
|
||||
</Border>
|
||||
<Grid Grid.Row="1" Margin="22">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Border Grid.Column="0" Background="White"
|
||||
CornerRadius="10" Padding="8"
|
||||
CornerRadius="6" Padding="8"
|
||||
VerticalAlignment="Top"
|
||||
Margin="0,0,16,0">
|
||||
Margin="0,0,22,0">
|
||||
<Image x:Name="JoinCodeQrImage"
|
||||
Width="180" Height="180"
|
||||
Width="172" Height="172"
|
||||
RenderOptions.BitmapScalingMode="NearestNeighbor"
|
||||
SnapsToDevicePixels="True"
|
||||
UseLayoutRounding="True" />
|
||||
@@ -497,34 +1119,55 @@
|
||||
<StackPanel Grid.Column="1">
|
||||
<TextBlock Style="{StaticResource FieldLabel}"
|
||||
Text="JOIN CODE" />
|
||||
<Border Background="{StaticResource BgDeeper}"
|
||||
<Border Background="{StaticResource BgInset}"
|
||||
BorderBrush="{StaticResource Border}" BorderThickness="1"
|
||||
CornerRadius="10" Padding="12,10">
|
||||
CornerRadius="6" Padding="12,10">
|
||||
<TextBox x:Name="JoinCodeText" IsReadOnly="True"
|
||||
FontFamily="Cascadia Mono, Consolas" FontSize="12"
|
||||
FontFamily="Cascadia Mono, Consolas" FontSize="11"
|
||||
Background="Transparent" BorderThickness="0"
|
||||
TextWrapping="Wrap" />
|
||||
</Border>
|
||||
|
||||
<WrapPanel Margin="0,12,0,0">
|
||||
<WrapPanel Margin="0,14,0,0">
|
||||
<Button Style="{StaticResource PrimaryBtn}"
|
||||
Content="Copy code" Click="OnCopyJoinCode" />
|
||||
Click="OnCopyJoinCode" Padding="16,8">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="12" Height="12" Margin="0,0,8,0"
|
||||
Stroke="White" StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
Data="M 3 2 L 9 2 L 9 8 L 3 8 Z M 1 4 L 1 10 L 7 10"
|
||||
VerticalAlignment="Center" />
|
||||
<TextBlock Text="COPY CODE" FontWeight="Bold"
|
||||
Foreground="White" VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
<Button Style="{StaticResource Btn}"
|
||||
Content="Copy as message"
|
||||
Click="OnCopyJoinCodeMessage"
|
||||
Margin="10,0,0,0" />
|
||||
Margin="8,0,0,0" Padding="14,7">
|
||||
<TextBlock Text="Copy as message" />
|
||||
</Button>
|
||||
<Button Style="{StaticResource Btn}"
|
||||
Content="Email to friend"
|
||||
Click="OnEmailJoinCode"
|
||||
Margin="10,0,0,0" />
|
||||
Margin="8,0,0,0" Padding="14,7">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="12" Height="9" Margin="0,0,8,0"
|
||||
Stroke="{StaticResource Ink}" StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
Data="M 1 1 L 11 1 L 11 8 L 1 8 Z M 1 1 L 6 5 L 11 1"
|
||||
VerticalAlignment="Center" />
|
||||
<TextBlock Text="Email" VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</WrapPanel>
|
||||
|
||||
<TextBlock Foreground="{StaticResource InkFaint}" FontSize="11"
|
||||
TextWrapping="Wrap" Margin="0,12,0,0"
|
||||
Text="Your friend opens DorkNet, picks "Join a friend", and pastes the code. The QR encodes the same text — handy for getting it onto a phone for forwarding." />
|
||||
TextWrapping="Wrap" Margin="0,14,0,0" LineHeight="18"
|
||||
Text="Friend opens DorkNet → Join a friend → pastes. QR encodes the same string for phone forwarding." />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
@@ -537,97 +1180,188 @@
|
||||
<RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Grid Grid.Row="0" Margin="0,0,0,28">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="DorkNet" FontSize="22" FontWeight="Bold"
|
||||
Foreground="{StaticResource WordmarkBrush}" />
|
||||
<Border Style="{StaticResource StatusChip}" Margin="14,0,0,0"
|
||||
VerticalAlignment="Center">
|
||||
<TextBlock Text="JOIN MODE" FontSize="10"
|
||||
FontWeight="Bold" Foreground="{StaticResource Teal}" />
|
||||
</Border>
|
||||
</StackPanel>
|
||||
<Button HorizontalAlignment="Right" Style="{StaticResource GhostBtn}"
|
||||
Content="Settings" Click="OnOpenSettings" />
|
||||
</Grid>
|
||||
<Border Grid.Row="0" Padding="32,22"
|
||||
BorderBrush="{StaticResource BorderSoft}"
|
||||
BorderThickness="0,0,0,1">
|
||||
<Grid>
|
||||
<StackPanel>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="JOIN" FontSize="11" FontWeight="Bold"
|
||||
Foreground="{StaticResource Teal}"
|
||||
FontFamily="Cascadia Mono, Consolas"
|
||||
VerticalAlignment="Center" />
|
||||
<Border Background="{StaticResource Teal}" Width="14" Height="1"
|
||||
Margin="10,0,10,0" VerticalAlignment="Center" />
|
||||
<TextBlock Text="Connect to a friend's private server" FontSize="11"
|
||||
Foreground="{StaticResource InkSoft}" FontWeight="SemiBold"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
<TextBlock Text="Join a friend" FontSize="22" FontWeight="Bold"
|
||||
Foreground="{StaticResource Ink}" Margin="0,4,0,0" />
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right"
|
||||
VerticalAlignment="Center">
|
||||
<CheckBox x:Name="JoinScreenModeChk" Content="Screen mode"
|
||||
VerticalAlignment="Center"
|
||||
ToolTip="Launch in 2D desktop mode (+forcemode:screen) instead of VR."
|
||||
Checked="OnScreenModeChanged" Unchecked="OnScreenModeChanged" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto"
|
||||
Padding="0,0,8,0">
|
||||
Padding="32,24,24,24">
|
||||
<StackPanel>
|
||||
<Border Style="{StaticResource Panel}" Margin="0,0,0,16">
|
||||
<Border Style="{StaticResource Panel}" Margin="0,0,0,18">
|
||||
<StackPanel>
|
||||
<TextBlock Style="{StaticResource SectionTitle}" Text="Join code" />
|
||||
<StackPanel Orientation="Horizontal" Margin="0,0,0,16">
|
||||
<Path Width="16" Height="16"
|
||||
Stroke="{StaticResource Teal}"
|
||||
StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 6 10 L 10 6 M 4 8 A 3 3 0 0 1 8 4 L 10 4 M 10 12 L 8 12 A 3 3 0 0 1 4 8 M 14 8 A 3 3 0 0 1 10 12 M 10 4 A 3 3 0 0 1 14 8"
|
||||
VerticalAlignment="Center" Margin="0,0,10,0" />
|
||||
<TextBlock Text="Join code" FontSize="14" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource Ink}"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
|
||||
<TextBlock Style="{StaticResource FieldLabel}"
|
||||
Text="PASTE THE JOIN CODE YOUR HOST SHARED" />
|
||||
Text="PASTE THE CODE YOUR HOST SHARED" />
|
||||
<TextBox x:Name="JoinCodeInput"
|
||||
AcceptsReturn="True" TextWrapping="Wrap"
|
||||
Height="80" VerticalContentAlignment="Top"
|
||||
FontFamily="Cascadia Mono, Consolas" FontSize="12"
|
||||
Height="92" VerticalContentAlignment="Top"
|
||||
FontFamily="Cascadia Mono, Consolas" FontSize="11"
|
||||
TextChanged="OnJoinCodeInputChanged" />
|
||||
<Button Style="{StaticResource Btn}"
|
||||
Content="Preview" Click="OnDecodeJoinCode"
|
||||
HorizontalAlignment="Left" Margin="0,10,0,0" />
|
||||
HorizontalAlignment="Left" Margin="0,12,0,0" />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<Border x:Name="JoinPreviewBorder" Visibility="Collapsed"
|
||||
Style="{StaticResource Panel}"
|
||||
Background="{StaticResource CardBgJoin}"
|
||||
Margin="0,0,0,16">
|
||||
Background="{StaticResource BgElev}"
|
||||
BorderBrush="{StaticResource Teal}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="8" Padding="22"
|
||||
Margin="0,0,0,18">
|
||||
<StackPanel>
|
||||
<TextBlock Style="{StaticResource SectionTitle}" Text="Server preview" />
|
||||
<StackPanel Orientation="Horizontal" Margin="0,0,0,12">
|
||||
<Path Width="16" Height="16"
|
||||
Stroke="{StaticResource Teal}"
|
||||
StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
Data="M 2 8 L 6 12 L 14 4"
|
||||
VerticalAlignment="Center" Margin="0,0,10,0" />
|
||||
<TextBlock Text="Server preview" FontSize="14" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource Ink}"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
<TextBlock x:Name="JoinPreviewText"
|
||||
Foreground="{StaticResource Ink}"
|
||||
TextWrapping="Wrap" FontSize="14" />
|
||||
TextWrapping="Wrap" FontSize="12"
|
||||
FontFamily="Cascadia Mono, Consolas"
|
||||
LineHeight="20" />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<Border Style="{StaticResource Panel}" Margin="0,0,0,16">
|
||||
<Border Style="{StaticResource Panel}" Margin="0,0,0,18">
|
||||
<StackPanel>
|
||||
<TextBlock Style="{StaticResource SectionTitle}" Text="Your Rec Room install" />
|
||||
<StackPanel Orientation="Horizontal" Margin="0,0,0,16">
|
||||
<Path Width="16" Height="16"
|
||||
Stroke="{StaticResource Teal}"
|
||||
StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
Data="M 2 5 L 6 5 L 8 7 L 14 7 L 14 13 L 2 13 Z"
|
||||
VerticalAlignment="Center" Margin="0,0,10,0" />
|
||||
<TextBlock Text="Rec Room install" FontSize="14" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource Ink}"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
<TextBlock Style="{StaticResource FieldLabel}" Text="LOCATION" />
|
||||
<DockPanel>
|
||||
<Button DockPanel.Dock="Right" Style="{StaticResource Btn}"
|
||||
Content="Pick…" Click="OnPickRecRoom" Margin="8,0,0,0" />
|
||||
<Border Background="{StaticResource BgDeeper}"
|
||||
BorderBrush="{StaticResource BorderSoft}" BorderThickness="1"
|
||||
CornerRadius="10" Padding="12,10">
|
||||
Content="Browse…" Click="OnPickRecRoom" Margin="8,0,0,0" />
|
||||
<Border Background="{StaticResource BgInset}"
|
||||
BorderBrush="{StaticResource Border}" BorderThickness="1"
|
||||
CornerRadius="6" Padding="12,10">
|
||||
<TextBlock x:Name="JoinRecRoomPath"
|
||||
Text="(not picked)"
|
||||
Foreground="{StaticResource InkSoft}"
|
||||
TextTrimming="CharacterEllipsis" FontSize="13" />
|
||||
FontFamily="Cascadia Mono, Consolas"
|
||||
TextTrimming="CharacterEllipsis" FontSize="12" />
|
||||
</Border>
|
||||
</DockPanel>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,4,0,16">
|
||||
<Button x:Name="JoinApplyBtn" Style="{StaticResource PrimaryBtn}"
|
||||
Content="Patch" Click="OnJoinApply"
|
||||
IsEnabled="False" />
|
||||
<Button x:Name="JoinLaunchBtn" Style="{StaticResource TealBtn}"
|
||||
Content="Launch Rec Room" Click="OnLaunchRecRoom"
|
||||
Margin="10,0,0,0" Visibility="Collapsed" />
|
||||
<CheckBox x:Name="JoinScreenModeChk" Content="Screen mode"
|
||||
VerticalAlignment="Center" Margin="14,0,0,0"
|
||||
Foreground="{StaticResource Ink}"
|
||||
ToolTip="Launch in 2D desktop mode (passes +forcemode:screen) instead of VR."
|
||||
Checked="OnScreenModeChanged" Unchecked="OnScreenModeChanged" />
|
||||
</StackPanel>
|
||||
<Border Background="{StaticResource BgElev}"
|
||||
BorderBrush="{StaticResource Border}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="8" Padding="22"
|
||||
Margin="0,0,0,18">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Button x:Name="JoinApplyBtn" Style="{StaticResource PrimaryBtn}"
|
||||
Click="OnJoinApply" IsEnabled="False">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="12" Height="12" Margin="0,0,10,0"
|
||||
Stroke="White" StrokeThickness="1.7"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 2 6 L 5 9 L 11 2"
|
||||
VerticalAlignment="Center" />
|
||||
<TextBlock Text="APPLY PATCH" FontWeight="Bold"
|
||||
Foreground="White" VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
<Button x:Name="JoinLaunchBtn" Style="{StaticResource PlayBtn}"
|
||||
Click="OnLaunchRecRoom"
|
||||
Margin="10,0,0,0" Visibility="Collapsed">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="13" Height="13" Margin="0,0,12,0"
|
||||
Fill="White"
|
||||
Data="M 0 0 L 13 6.5 L 0 13 Z"
|
||||
VerticalAlignment="Center" />
|
||||
<TextBlock Text="LAUNCH REC ROOM" FontWeight="Bold"
|
||||
Foreground="White" VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<Border x:Name="JoinStepsPanel" Style="{StaticResource Panel}"
|
||||
Visibility="Collapsed">
|
||||
<StackPanel>
|
||||
<TextBlock Style="{StaticResource SectionTitle}" Text="Progress" />
|
||||
<StackPanel Orientation="Horizontal" Margin="0,0,0,16">
|
||||
<Path Width="16" Height="16"
|
||||
Stroke="{StaticResource Teal}"
|
||||
StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 2 8 L 6 12 L 14 4"
|
||||
VerticalAlignment="Center" Margin="0,0,10,0" />
|
||||
<TextBlock Text="Progress" FontSize="14" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource Ink}"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
<ItemsControl x:Name="JoinStepsList"
|
||||
ItemTemplate="{StaticResource StepRowTemplate}" />
|
||||
<TextBlock x:Name="JoinStatusText"
|
||||
Foreground="{StaticResource InkSoft}"
|
||||
TextWrapping="Wrap" FontSize="13"
|
||||
TextWrapping="Wrap" FontSize="12"
|
||||
LineHeight="18"
|
||||
Margin="0,4,0,0" />
|
||||
<StackPanel x:Name="JoinRetryPanel" Visibility="Collapsed"
|
||||
Orientation="Horizontal" Margin="0,12,0,0">
|
||||
Orientation="Horizontal" Margin="0,16,0,0">
|
||||
<Button x:Name="JoinRetryBtn" Style="{StaticResource PrimaryBtn}"
|
||||
Content="Retry" Click="OnJoinRetry" />
|
||||
<Button Style="{StaticResource GhostBtn}"
|
||||
@@ -648,82 +1382,150 @@
|
||||
<RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Grid Grid.Row="0" Margin="0,0,0,28">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="DorkNet" FontSize="22" FontWeight="Bold"
|
||||
Foreground="{StaticResource WordmarkBrush}" />
|
||||
<Border Style="{StaticResource StatusChip}" Margin="14,0,0,0"
|
||||
VerticalAlignment="Center">
|
||||
<TextBlock Text="SETTINGS" FontSize="10"
|
||||
FontWeight="Bold" Foreground="{StaticResource Sunshine}" />
|
||||
<Border Grid.Row="0" Padding="32,22"
|
||||
BorderBrush="{StaticResource BorderSoft}"
|
||||
BorderThickness="0,0,0,1">
|
||||
<Grid>
|
||||
<StackPanel>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="SYSTEM" FontSize="11" FontWeight="Bold"
|
||||
Foreground="{StaticResource Sunshine}"
|
||||
FontFamily="Cascadia Mono, Consolas"
|
||||
VerticalAlignment="Center" />
|
||||
<Border Background="{StaticResource Sunshine}" Width="14" Height="1"
|
||||
Margin="10,0,10,0" VerticalAlignment="Center" />
|
||||
<TextBlock Text="Cache locations & advanced options" FontSize="11"
|
||||
Foreground="{StaticResource InkSoft}" FontWeight="SemiBold"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
<TextBlock Text="Settings" FontSize="22" FontWeight="Bold"
|
||||
Foreground="{StaticResource Ink}" Margin="0,4,0,0" />
|
||||
</StackPanel>
|
||||
<Button HorizontalAlignment="Right" Style="{StaticResource GhostBtn}"
|
||||
Click="OnBackFromSettings" VerticalAlignment="Center">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Path Width="12" Height="12" Margin="0,0,8,0"
|
||||
Stroke="{StaticResource InkSoft}" StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 11 6 L 1 6 M 5 2 L 1 6 L 5 10"
|
||||
VerticalAlignment="Center" />
|
||||
<TextBlock Text="Back" VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto"
|
||||
Padding="32,24,24,24">
|
||||
<StackPanel>
|
||||
<Border Style="{StaticResource Panel}" Margin="0,0,0,18">
|
||||
<StackPanel>
|
||||
<TextBlock Style="{StaticResource SectionTitle}" Text="Cache locations" />
|
||||
<Border Background="{StaticResource BgInset}"
|
||||
BorderBrush="{StaticResource BorderSoft}"
|
||||
BorderThickness="1" CornerRadius="6"
|
||||
Padding="14,12">
|
||||
<TextBlock x:Name="CachePathsText"
|
||||
Foreground="{StaticResource InkSoft}"
|
||||
FontSize="11" TextWrapping="Wrap"
|
||||
LineHeight="18"
|
||||
FontFamily="Cascadia Mono, Consolas" />
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<Border x:Name="LocalOverridesPanel" Visibility="Collapsed"
|
||||
Background="{StaticResource BgElev}"
|
||||
BorderBrush="{StaticResource Sunshine}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="8" Padding="22"
|
||||
Margin="0,0,0,18">
|
||||
<StackPanel>
|
||||
<StackPanel Orientation="Horizontal" Margin="0,0,0,12">
|
||||
<Path Width="16" Height="16"
|
||||
Stroke="{StaticResource Sunshine}"
|
||||
StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
StrokeLineJoin="Round"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Data="M 8 1 L 15 14 L 1 14 Z M 8 6 L 8 10 M 8 12 L 8 12.5"
|
||||
VerticalAlignment="Center" Margin="0,0,10,0" />
|
||||
<TextBlock Text="Dev overrides active" FontSize="14" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource Ink}"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
<TextBlock Foreground="{StaticResource InkSoft}" FontSize="12"
|
||||
Margin="0,0,0,10" TextWrapping="Wrap" LineHeight="18"
|
||||
Text="The launcher is reading from local paths instead of GitHub. Unset DORKNET_LOCAL_MANIFEST / DORKNET_LOCAL_RELEASES to return to normal mode." />
|
||||
<Border Background="{StaticResource BgInset}"
|
||||
BorderBrush="{StaticResource BorderSoft}"
|
||||
BorderThickness="1" CornerRadius="6"
|
||||
Padding="14,12">
|
||||
<TextBlock x:Name="LocalOverridesText"
|
||||
Foreground="{StaticResource Ink}"
|
||||
FontSize="11" TextWrapping="Wrap"
|
||||
LineHeight="18"
|
||||
FontFamily="Cascadia Mono, Consolas" />
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<Border Style="{StaticResource Panel}">
|
||||
<StackPanel>
|
||||
<TextBlock Style="{StaticResource SectionTitle}" Text="About" />
|
||||
<Grid Margin="0,0,0,8">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Grid.Column="0" Text="VERSION"
|
||||
FontSize="10" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource InkFaint}"
|
||||
Width="100" />
|
||||
<TextBlock Grid.Column="1" Text="v0.1"
|
||||
FontSize="12" Foreground="{StaticResource Ink}"
|
||||
FontFamily="Cascadia Mono, Consolas" />
|
||||
</Grid>
|
||||
<Grid Margin="0,0,0,8">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Grid.Column="0" Text="LICENSE"
|
||||
FontSize="10" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource InkFaint}"
|
||||
Width="100" />
|
||||
<TextBlock Grid.Column="1" Text="AGPL-3.0"
|
||||
FontSize="12" Foreground="{StaticResource Ink}"
|
||||
FontFamily="Cascadia Mono, Consolas" />
|
||||
</Grid>
|
||||
<Grid Margin="0,0,0,8">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Grid.Column="0" Text="SOURCE"
|
||||
FontSize="10" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource InkFaint}"
|
||||
Width="100" />
|
||||
<TextBlock Grid.Column="1" FontSize="12" FontFamily="Cascadia Mono, Consolas">
|
||||
<Hyperlink NavigateUri="https://github.com/DorkSquadRR/DorkNet"
|
||||
Foreground="{StaticResource Brand}"
|
||||
TextDecorations="None"
|
||||
RequestNavigate="OnNavigate">github.com/DorkSquadRR/DorkNet</Hyperlink>
|
||||
</TextBlock>
|
||||
</Grid>
|
||||
<TextBlock Foreground="{StaticResource InkFaint}" FontSize="10"
|
||||
Margin="0,12,0,0"
|
||||
Text="Not affiliated with Rec Room Inc. or Against Gravity." />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
<Button HorizontalAlignment="Right" Style="{StaticResource GhostBtn}"
|
||||
Content="← Back" Click="OnBackFromSettings" />
|
||||
</Grid>
|
||||
|
||||
<StackPanel Grid.Row="1">
|
||||
<Border Style="{StaticResource Panel}" Margin="0,0,0,16">
|
||||
<StackPanel>
|
||||
<TextBlock Style="{StaticResource SectionTitle}" Text="Switch mode" />
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Button Style="{StaticResource Btn}"
|
||||
Content="Host" Click="OnPickHost" />
|
||||
<Button Style="{StaticResource Btn}"
|
||||
Content="Join" Click="OnPickJoin"
|
||||
Margin="10,0,0,0" />
|
||||
<Button Style="{StaticResource GhostBtn}"
|
||||
Content="Re-run setup" Click="OnRerunSetup"
|
||||
Margin="10,0,0,0" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<Border Style="{StaticResource Panel}" Margin="0,0,0,16">
|
||||
<StackPanel>
|
||||
<TextBlock Style="{StaticResource SectionTitle}" Text="Cache locations" />
|
||||
<TextBlock x:Name="CachePathsText"
|
||||
Foreground="{StaticResource InkSoft}"
|
||||
FontSize="12" TextWrapping="Wrap"
|
||||
FontFamily="Cascadia Mono, Consolas" />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- Dev-mode overrides — visible only when at least one
|
||||
env var is set so end users never see it. -->
|
||||
<Border x:Name="LocalOverridesPanel" Visibility="Collapsed"
|
||||
Style="{StaticResource Panel}" Margin="0,0,0,16"
|
||||
Background="{StaticResource CardBgHost}">
|
||||
<StackPanel>
|
||||
<TextBlock Style="{StaticResource SectionTitle}"
|
||||
Text="🛠 Dev overrides active" />
|
||||
<TextBlock Foreground="{StaticResource InkSoft}" FontSize="12"
|
||||
Margin="0,-6,0,8" TextWrapping="Wrap"
|
||||
Text="The launcher is reading from local paths instead of GitHub. Unset DORKNET_LOCAL_MANIFEST / DORKNET_LOCAL_RELEASES to return to normal mode." />
|
||||
<TextBlock x:Name="LocalOverridesText"
|
||||
Foreground="{StaticResource Ink}"
|
||||
FontSize="12" TextWrapping="Wrap"
|
||||
FontFamily="Cascadia Mono, Consolas" />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<Border Style="{StaticResource Panel}">
|
||||
<StackPanel>
|
||||
<TextBlock Style="{StaticResource SectionTitle}" Text="About" />
|
||||
<TextBlock Foreground="{StaticResource InkSoft}" FontSize="13">
|
||||
DorkNet Launcher v0.1 ·
|
||||
<Hyperlink NavigateUri="https://github.com/DorkSquadRR/DorkNet"
|
||||
Foreground="{StaticResource Brand}"
|
||||
RequestNavigate="OnNavigate">github.com/DorkSquadRR/DorkNet</Hyperlink>
|
||||
· AGPL-3.0
|
||||
</TextBlock>
|
||||
<TextBlock Foreground="{StaticResource InkFaint}" FontSize="11"
|
||||
Margin="0,8,0,0">
|
||||
Not affiliated with Rec Room Inc. or Against Gravity.
|
||||
</TextBlock>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
|
||||
Reference in New Issue
Block a user