wip: Windows desktop app scaffold (WinUI 3/.NET 8) + NSIS installer + docs

Owner decision pending (STATE.md DC-100 tick): adopt/ship/park.
Preserved from fragile git stash to named branch 2026-08-23.
NOTE: requires a Windows build machine (WinUI XAML compiler + MSIX do not
cross-build on Linux) — see WINDOWS_APP_BUILD.md in this tree.
Secret-scanned clean 2026-08-23 (no keys/tokens/PEM in tree).
This commit is contained in:
Hermes
2026-08-22 23:50:34 -07:00
commit 86e4c9fc81
29 changed files with 4600 additions and 0 deletions
+96
View File
@@ -0,0 +1,96 @@
<ContentDialog
x:Class="DashCaddy.Desktop.SettingsDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="using:DashCaddy.Desktop.ViewModels"
mc:Ignorable="d"
Title="Settings"
PrimaryButtonText="Save"
CloseButtonText="Cancel"
DefaultButton="Primary"
Width="600">
<ScrollViewer VerticalScrollBarVisibility="Auto" MaxHeight="600">
<StackPanel Spacing="20" Margin="8">
<!-- Domain Settings -->
<Border Style="{StaticResource CardStyle}">
<StackPanel Spacing="12">
<TextBlock Text="Domain & Network" FontSize="16" FontWeight="SemiBold" />
<TextBox x:Name="DomainBox" Header="Base Domain" PlaceholderText="example.com (or 'local' for local-only)" Style="{StaticResource InputFieldStyle}" />
<TextBox x:Name="EmailBox" Header="Email (for Let's Encrypt)" PlaceholderText="admin@example.com" Style="{StaticResource InputFieldStyle}" />
</StackPanel>
</Border>
<!-- DNS Provider -->
<Border Style="{StaticResource CardStyle}">
<StackPanel Spacing="12">
<TextBlock Text="DNS Provider" FontSize="16" FontWeight="SemiBold" />
<ComboBox x:Name="DnsProviderCombo" Header="Provider" Style="{StaticResource ComboBoxStyle}" SelectionChanged="DnsProvider_SelectionChanged">
<ComboBoxItem Content="Technitium DNS (Local)" Tag="Technitium" IsSelected="True" />
<ComboBoxItem Content="CoreDNS (Local)" Tag="CoreDNS" />
<ComboBoxItem Content="Cloudflare" Tag="Cloudflare" />
<ComboBoxItem Content="AWS Route 53" Tag="Route53" />
<ComboBoxItem Content="Custom HTTP API" Tag="Custom" />
</ComboBox>
<!-- Technitium Settings -->
<StackPanel x:Name="TechnitiumPanel" Spacing="12" Visibility="Visible">
<TextBox x:Name="TechnitiumUrl" Header="Technitium API URL" PlaceholderText="http://localhost:5380/api" Style="{StaticResource InputFieldStyle}" />
<TextBox x:Name="TechnitiumApiKey" Header="API Key" PlaceholderText="Leave blank if no auth" Style="{StaticResource InputFieldStyle}" />
<TextBox x:Name="TechnitiumZone" Header="Zone" PlaceholderText="local" Style="{StaticResource InputFieldStyle}" />
</StackPanel>
<!-- CoreDNS Settings -->
<StackPanel x:Name="CoreDnsPanel" Spacing="12" Visibility="Collapsed">
<TextBox x:Name="CoreDnsApiUrl" Header="CoreDNS API URL (via DashCaddy)" PlaceholderText="http://localhost:3001/api/v1/dns" Style="{StaticResource InputFieldStyle}" />
<TextBox x:Name="CoreDnsZone" Header="Zone" PlaceholderText="local" Style="{StaticResource InputFieldStyle}" />
<TextBlock Text="CoreDNS is managed via DashCaddy API — no direct API needed" FontSize="12" Foreground="{ThemeResource SystemControlForegroundBaseMediumBrush}" />
</StackPanel>
<!-- Cloudflare Settings -->
<StackPanel x:Name="CloudflarePanel" Spacing="12" Visibility="Collapsed">
<TextBox x:Name="CloudflareApiToken" Header="API Token" PlaceholderText="Cloudflare API token with Zone:DNS:Edit" Style="{StaticResource InputFieldStyle}" />
<TextBox x:Name="CloudflareZoneId" Header="Zone ID" PlaceholderText="Get from Cloudflare dashboard" Style="{StaticResource InputFieldStyle}" />
</StackPanel>
<!-- Route53 Settings -->
<StackPanel x:Name="Route53Panel" Spacing="12" Visibility="Collapsed">
<TextBox x:Name="AwsAccessKey" Header="AWS Access Key" Style="{StaticResource InputFieldStyle}" />
<TextBox x:Name="AwsSecretKey" Header="AWS Secret Key" Style="{StaticResource InputFieldStyle}" />
<TextBox x:Name="AwsRegion" Header="Region" PlaceholderText="us-east-1" Style="{StaticResource InputFieldStyle}" />
<TextBox x:Name="Route53ZoneId" Header="Hosted Zone ID" PlaceholderText="Z123456789" Style="{StaticResource InputFieldStyle}" />
</StackPanel>
<!-- Custom Settings -->
<StackPanel x:Name="CustomPanel" Spacing="12" Visibility="Collapsed">
<TextBox x:Name="CustomDnsUrl" Header="Custom DNS API URL" PlaceholderText="http://your-dns-api:port/api" Style="{StaticResource InputFieldStyle}" />
<TextBox x:Name="CustomDnsKey" Header="API Key (optional)" Style="{StaticResource InputFieldStyle}" />
</StackPanel>
</StackPanel>
</Border>
<!-- Docker Settings -->
<Border Style="{StaticResource CardStyle}">
<StackPanel Spacing="12">
<TextBlock Text="Docker" FontSize="16" FontWeight="SemiBold" />
<TextBox x:Name="DockerDataBox" Header="Docker Data Root" PlaceholderText="E:/dockerdata" Style="{StaticResource InputFieldStyle}" />
<CheckBox x:Name="AutoStartCheck" Content="Start DashCaddy on login" IsChecked="True" />
<CheckBox x:Name="AutoUpdateCheck" Content="Auto-update Docker images" IsChecked="False" />
</StackPanel>
</Border>
<!-- Advanced -->
<Border Style="{StaticResource CardStyle}">
<StackPanel Spacing="12">
<TextBlock Text="Advanced" FontSize="16" FontWeight="SemiBold" />
<Button Content="Open Config Folder" Click="OpenConfigFolder_Click" />
<Button Content="View Logs" Click="ViewLogs_Click" />
<Button Content="Reset All Data (Dangerous)" Click="ResetData_Click" Style="{StaticResource AccentButtonStyle}" Background="{StaticResource ErrorBrush}" />
</StackPanel>
</Border>
</StackPanel>
</ScrollViewer>
</ContentDialog>