초기 커밋.

This commit is contained in:
2026-06-06 00:08:05 +09:00
parent 65655a272c
commit 4b1b334c74
17 changed files with 1236 additions and 0 deletions

103
App.xaml Normal file
View File

@@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Application
x:Class="TornadoAce_GSShop.App"
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:local="using:TornadoAce_GSShop"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
<!-- Other merged dictionaries here -->
</ResourceDictionary.MergedDictionaries>
<SolidColorBrush x:Key="AppCanvasBrush" Color="#F4F6F8" />
<SolidColorBrush x:Key="AppSurfaceBrush" Color="#FBFCFD" />
<SolidColorBrush x:Key="AppSurfaceElevatedBrush" Color="#FFFFFF" />
<SolidColorBrush x:Key="AppSurfaceSubtleBrush" Color="#EEF3F7" />
<SolidColorBrush x:Key="AppLineBrush" Color="#D7DEE7" />
<SolidColorBrush x:Key="AppTextBrush" Color="#18212F" />
<SolidColorBrush x:Key="AppTextSecondaryBrush" Color="#596579" />
<SolidColorBrush x:Key="AppTextMutedBrush" Color="#7B8798" />
<SolidColorBrush x:Key="AppAccentBrush" Color="#2563EB" />
<SolidColorBrush x:Key="AppAccentSoftBrush" Color="#E6EEFF" />
<SolidColorBrush x:Key="AppMintBrush" Color="#00A884" />
<SolidColorBrush x:Key="AppMintSoftBrush" Color="#DFF8F1" />
<SolidColorBrush x:Key="AppCoralBrush" Color="#F05A4F" />
<SolidColorBrush x:Key="AppCoralSoftBrush" Color="#FFE8E5" />
<SolidColorBrush x:Key="AppAmberBrush" Color="#B7791F" />
<SolidColorBrush x:Key="AppAmberSoftBrush" Color="#FFF3D8" />
<SolidColorBrush x:Key="AppInkBrush" Color="#111827" />
<Style x:Key="HeroTitleTextStyle" TargetType="TextBlock">
<Setter Property="FontFamily" Value="Segoe UI Variable Display" />
<Setter Property="FontSize" Value="30" />
<Setter Property="FontWeight" Value="SemiBold" />
<Setter Property="Foreground" Value="{StaticResource AppTextBrush}" />
<Setter Property="TextWrapping" Value="WrapWholeWords" />
</Style>
<Style x:Key="SectionTitleTextStyle" TargetType="TextBlock">
<Setter Property="FontFamily" Value="Segoe UI Variable Display" />
<Setter Property="FontSize" Value="18" />
<Setter Property="FontWeight" Value="SemiBold" />
<Setter Property="Foreground" Value="{StaticResource AppTextBrush}" />
<Setter Property="TextWrapping" Value="WrapWholeWords" />
</Style>
<Style x:Key="MetricTextStyle" TargetType="TextBlock">
<Setter Property="FontFamily" Value="Segoe UI Variable Display" />
<Setter Property="FontSize" Value="26" />
<Setter Property="FontWeight" Value="SemiBold" />
<Setter Property="Foreground" Value="{StaticResource AppTextBrush}" />
</Style>
<Style x:Key="LabelTextStyle" TargetType="TextBlock">
<Setter Property="FontSize" Value="12" />
<Setter Property="Foreground" Value="{StaticResource AppTextMutedBrush}" />
<Setter Property="TextWrapping" Value="WrapWholeWords" />
</Style>
<Style x:Key="BodyTextStyle" TargetType="TextBlock">
<Setter Property="FontSize" Value="14" />
<Setter Property="Foreground" Value="{StaticResource AppTextSecondaryBrush}" />
<Setter Property="TextWrapping" Value="WrapWholeWords" />
</Style>
<Style x:Key="MonoTextStyle" TargetType="TextBlock">
<Setter Property="FontFamily" Value="Cascadia Mono" />
<Setter Property="FontSize" Value="12" />
<Setter Property="Foreground" Value="{StaticResource AppTextMutedBrush}" />
</Style>
<Style x:Key="PanelBorderStyle" TargetType="Border">
<Setter Property="Background" Value="{StaticResource AppSurfaceElevatedBrush}" />
<Setter Property="BorderBrush" Value="{StaticResource AppLineBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="8" />
</Style>
<Style x:Key="PrimaryActionButtonStyle"
TargetType="Button"
BasedOn="{StaticResource DefaultButtonStyle}">
<Setter Property="Background" Value="{StaticResource AppInkBrush}" />
<Setter Property="Foreground" Value="White" />
<Setter Property="CornerRadius" Value="8" />
<Setter Property="Padding" Value="14,9" />
<Setter Property="FontWeight" Value="SemiBold" />
</Style>
<Style x:Key="QuietButtonStyle"
TargetType="Button"
BasedOn="{StaticResource DefaultButtonStyle}">
<Setter Property="Background" Value="{StaticResource AppSurfaceSubtleBrush}" />
<Setter Property="Foreground" Value="{StaticResource AppTextBrush}" />
<Setter Property="BorderBrush" Value="{StaticResource AppLineBrush}" />
<Setter Property="CornerRadius" Value="8" />
<Setter Property="Padding" Value="12,8" />
</Style>
</ResourceDictionary>
</Application.Resources>
</Application>

74
App.xaml.cs Normal file
View File

@@ -0,0 +1,74 @@
using Microsoft.UI.Windowing;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using System;
using Windows.Graphics;
using WinRT.Interop;
namespace TornadoAce_GSShop
{
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
public partial class App : Application
{
private Window? window;
/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
this.InitializeComponent();
}
/// <summary>
/// Invoked when the application is launched normally by the end user. Other entry points
/// will be used such as when the application is launched to open a specific file.
/// </summary>
/// <param name="e">Details about the launch request and process.</param>
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
window ??= new Window
{
Title = "TornadoAce GS Shop"
};
window.SystemBackdrop = new MicaBackdrop();
if (window.Content is not Frame rootFrame)
{
rootFrame = new Frame();
rootFrame.NavigationFailed += OnNavigationFailed;
window.Content = rootFrame;
}
_ = rootFrame.Navigate(typeof(MainPage), e.Arguments);
ConfigureWindow(window);
window.Activate();
}
private static void ConfigureWindow(Window targetWindow)
{
var windowHandle = WindowNative.GetWindowHandle(targetWindow);
if (windowHandle == IntPtr.Zero)
{
return;
}
var windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(windowHandle);
var appWindow = AppWindow.GetFromWindowId(windowId);
appWindow.Resize(new SizeInt32(1440, 900));
}
/// <summary>
/// Invoked when Navigation to a certain page fails
/// </summary>
/// <param name="sender">The Frame which failed navigation</param>
/// <param name="e">Details about the navigation failure</param>
void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
{
throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 637 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 B

BIN
Assets/StoreLogo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

4
Imports.cs Normal file
View File

@@ -0,0 +1,4 @@
global using TornadoAce_GSShop.Views;
global using Microsoft.UI.Xaml;
global using Microsoft.UI.Xaml.Controls;

51
Package.appxmanifest Normal file
View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap rescap">
<Identity
Name="a20f29f2-bfdb-4b01-9066-4df46dfad86c"
Publisher="CN=User Name"
Version="1.0.0.0" />
<mp:PhoneIdentity PhoneProductId="a20f29f2-bfdb-4b01-9066-4df46dfad86c" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
<Properties>
<DisplayName>TornadoAce_GSShop</DisplayName>
<PublisherDisplayName>User Name</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate"/>
</Resources>
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="$targetentrypoint$">
<uap:VisualElements
DisplayName="TornadoAce_GSShop"
Description="TornadoAce_GSShop"
BackgroundColor="transparent"
Square150x150Logo="Assets\Square150x150Logo.png"
Square44x44Logo="Assets\Square44x44Logo.png">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png" />
<uap:SplashScreen Image="Assets\SplashScreen.png" />
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
</Capabilities>
</Package>

View File

@@ -0,0 +1,10 @@
{
"profiles": {
"TornadoAce_GSShop (Package)": {
"commandName": "MsixPackage"
},
"TornadoAce_GSShop (Unpackaged)": {
"commandName": "Project"
}
}
}

76
TornadoAce_GSShop.csproj Normal file
View File

@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
<TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
<OutputType>WinExe</OutputType>
<!-- WinUI 3 -->
<UseWinUI>true</UseWinUI>
<WinUISDKReferences>false</WinUISDKReferences>
<EnableMsixTooling>true</EnableMsixTooling>
<!-- Project Options -->
<Nullable>enable</Nullable>
<LangVersion>latest</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>TornadoAce_GSShop</RootNamespace>
<!-- App Options -->
<UseRidGraph>true</UseRidGraph>
<Platforms>x64</Platforms>
<ApplicationManifest>app.manifest</ApplicationManifest>
<RuntimeIdentifiers>win-x64</RuntimeIdentifiers>
</PropertyGroup>
<PropertyGroup Condition="'$(RuntimeIdentifier)'==''">
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
<PropertyGroup Condition="Exists('Properties\PublishProfiles\win-$(Platform).pubxml')">
<PublishProfile>win-$(Platform).pubxml</PublishProfile>
</PropertyGroup>
<ItemGroup>
<Content Include="Assets\SplashScreen.scale-200.png" />
<Content Include="Assets\LockScreenLogo.scale-200.png" />
<Content Include="Assets\Square150x150Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" />
<Content Include="Assets\StoreLogo.png" />
<Content Include="Assets\Wide310x150Logo.scale-200.png" />
</ItemGroup>
<ItemGroup>
<None Remove="TornadoAce_GSShop.slnx" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.8.260209005" />
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.7705" />
<Manifest Include="$(ApplicationManifest)" />
</ItemGroup>
<!--
Defining the "Msix" ProjectCapability here allows the Single-project MSIX Packaging
Tools extension to be activated for this project even if the Windows App SDK Nuget
package has not yet been restored.
-->
<ItemGroup Condition="'$(DisableMsixProjectCapabilityAddedByProject)'!='true' and '$(EnableMsixTooling)'=='true'">
<ProjectCapability Include="Msix"/>
</ItemGroup>
<!--
Defining the "HasPackageAndPublishMenuAddedByProject" property here allows the Solution
Explorer "Package and Publish" context menu entry to be enabled for this project even if
the Windows App SDK Nuget package has not yet been restored.
-->
<PropertyGroup Condition="'$(DisableHasPackageAndPublishMenuAddedByProject)'!='true' and '$(EnableMsixTooling)'=='true'">
<HasPackageAndPublishMenu>true</HasPackageAndPublishMenu>
</PropertyGroup>
<PropertyGroup Label="Globals">
<WebView2EnableCsWinRTProjection>False</WebView2EnableCsWinRTProjection>
</PropertyGroup>
</Project>

9
TornadoAce_GSShop.slnx Normal file
View File

@@ -0,0 +1,9 @@
<Solution>
<Project Path="TornadoAce_GSShop.csproj">
<Deploy />
</Project>
<Properties Name="Visual Studio">
<!-- Support is provisionally available on Visual Studio 17.10 and later versions. -->
<Property Name="OpenWith" Value="17" />
</Properties>
</Solution>

525
Views/MainPage.xaml Normal file
View File

@@ -0,0 +1,525 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Page
x:Class="TornadoAce_GSShop.Views.MainPage"
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:local="using:TornadoAce_GSShop"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Background="{StaticResource AppCanvasBrush}"
Loaded="Page_Loaded"
mc:Ignorable="d">
<NavigationView
x:Name="MainNavigation"
AlwaysShowHeader="False"
Background="{StaticResource AppCanvasBrush}"
IsBackButtonVisible="Collapsed"
IsSettingsVisible="False"
OpenPaneLength="248"
PaneDisplayMode="Left"
RequestedTheme="Light">
<NavigationView.PaneHeader>
<Grid Margin="12,16,12,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="38" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border
Width="34"
Height="34"
Background="{StaticResource AppInkBrush}"
CornerRadius="8">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="15"
FontWeight="SemiBold"
Foreground="White"
Text="GS" />
</Border>
<StackPanel Grid.Column="1" Spacing="0">
<TextBlock
FontFamily="Segoe UI Variable Display"
FontSize="17"
FontWeight="SemiBold"
Foreground="{StaticResource AppTextBrush}"
Text="TornadoAce" />
<TextBlock
Style="{StaticResource LabelTextStyle}"
Text="GS Shop Control" />
</StackPanel>
</Grid>
</NavigationView.PaneHeader>
<NavigationView.MenuItems>
<NavigationViewItem Content="홈" IsSelected="True" Tag="home">
<NavigationViewItem.Icon>
<SymbolIcon Symbol="Home" />
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem Content="상품" Tag="products">
<NavigationViewItem.Icon>
<SymbolIcon Symbol="Library" />
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem Content="주문" Tag="orders">
<NavigationViewItem.Icon>
<SymbolIcon Symbol="Document" />
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem Content="고객" Tag="customers">
<NavigationViewItem.Icon>
<SymbolIcon Symbol="Contact" />
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem Content="편성" Tag="schedule">
<NavigationViewItem.Icon>
<SymbolIcon Symbol="Calendar" />
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem Content="설정" Tag="settings">
<NavigationViewItem.Icon>
<SymbolIcon Symbol="Setting" />
</NavigationViewItem.Icon>
</NavigationViewItem>
</NavigationView.MenuItems>
<NavigationView.PaneFooter>
<Border
Margin="12"
Padding="12"
Background="{StaticResource AppSurfaceBrush}"
BorderBrush="{StaticResource AppLineBrush}"
BorderThickness="1"
CornerRadius="8">
<StackPanel Spacing="8">
<TextBlock Style="{StaticResource LabelTextStyle}" Text="채널 상태" />
<StackPanel Orientation="Horizontal" Spacing="8">
<Ellipse
Width="9"
Height="9"
VerticalAlignment="Center"
Fill="{StaticResource AppMintBrush}" />
<TextBlock
FontSize="13"
FontWeight="SemiBold"
Foreground="{StaticResource AppTextBrush}"
Text="Live Preview" />
</StackPanel>
</StackPanel>
</Border>
</NavigationView.PaneFooter>
<Grid Padding="26" RowSpacing="20">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid ColumnSpacing="20">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel Spacing="6">
<TextBlock Style="{StaticResource HeroTitleTextStyle}" Text="GS Shop 운영 홈" />
<StackPanel Orientation="Horizontal" Spacing="8">
<TextBlock Style="{StaticResource BodyTextStyle}" Text="상품, 주문, 웹 미리보기를 한 화면에서 확인" />
<TextBlock Style="{StaticResource BodyTextStyle}" Text="·" />
<TextBlock x:Name="UpdatedTextBlock" Style="{StaticResource BodyTextStyle}" />
</StackPanel>
</StackPanel>
<StackPanel
Grid.Column="1"
Orientation="Horizontal"
Spacing="8"
VerticalAlignment="Top">
<Button Style="{StaticResource QuietButtonStyle}" ToolTipService.ToolTip="새로 고침">
<StackPanel Orientation="Horizontal" Spacing="8">
<SymbolIcon Symbol="Refresh" />
<TextBlock Text="동기화" />
</StackPanel>
</Button>
<Button Style="{StaticResource QuietButtonStyle}" ToolTipService.ToolTip="내보내기">
<StackPanel Orientation="Horizontal" Spacing="8">
<SymbolIcon Symbol="Download" />
<TextBlock Text="내보내기" />
</StackPanel>
</Button>
<Button Style="{StaticResource PrimaryActionButtonStyle}" ToolTipService.ToolTip="라이브 적용">
<StackPanel Orientation="Horizontal" Spacing="8">
<SymbolIcon Foreground="White" Symbol="Play" />
<TextBlock Foreground="White" Text="적용" />
</StackPanel>
</Button>
</StackPanel>
</Grid>
<Grid Grid.Row="1" ColumnSpacing="20">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="380" />
</Grid.ColumnDefinitions>
<Grid RowSpacing="16">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border Padding="16" Style="{StaticResource PanelBorderStyle}">
<StackPanel Spacing="10">
<TextBlock Style="{StaticResource LabelTextStyle}" Text="오늘 주문" />
<TextBlock Style="{StaticResource MetricTextStyle}" Text="1,284" />
<StackPanel Orientation="Horizontal" Spacing="6">
<Border
Padding="8,3"
Background="{StaticResource AppMintSoftBrush}"
CornerRadius="8">
<TextBlock
FontSize="12"
FontWeight="SemiBold"
Foreground="{StaticResource AppMintBrush}"
Text="+12.8%" />
</Border>
<TextBlock
VerticalAlignment="Center"
Style="{StaticResource LabelTextStyle}"
Text="전일 대비" />
</StackPanel>
</StackPanel>
</Border>
<Border
Grid.Column="1"
Padding="16"
Style="{StaticResource PanelBorderStyle}">
<StackPanel Spacing="10">
<TextBlock Style="{StaticResource LabelTextStyle}" Text="방송 상품" />
<TextBlock Style="{StaticResource MetricTextStyle}" Text="36" />
<ProgressBar
Height="5"
Foreground="{StaticResource AppAccentBrush}"
Maximum="100"
Value="68" />
<TextBlock Style="{StaticResource LabelTextStyle}" Text="68% 준비 완료" />
</StackPanel>
</Border>
<Border
Grid.Column="2"
Padding="16"
Style="{StaticResource PanelBorderStyle}">
<StackPanel Spacing="10">
<TextBlock Style="{StaticResource LabelTextStyle}" Text="승인 대기" />
<TextBlock Style="{StaticResource MetricTextStyle}" Text="7" />
<StackPanel Orientation="Horizontal" Spacing="6">
<Border
Padding="8,3"
Background="{StaticResource AppAmberSoftBrush}"
CornerRadius="8">
<TextBlock
FontSize="12"
FontWeight="SemiBold"
Foreground="{StaticResource AppAmberBrush}"
Text="검수" />
</Border>
<TextBlock
VerticalAlignment="Center"
Style="{StaticResource LabelTextStyle}"
Text="콘텐츠 확인" />
</StackPanel>
</StackPanel>
</Border>
<Border
Grid.Column="3"
Padding="16"
Style="{StaticResource PanelBorderStyle}">
<StackPanel Spacing="10">
<TextBlock Style="{StaticResource LabelTextStyle}" Text="알림" />
<TextBlock Style="{StaticResource MetricTextStyle}" Text="3" />
<StackPanel Orientation="Horizontal" Spacing="6">
<Border
Padding="8,3"
Background="{StaticResource AppCoralSoftBrush}"
CornerRadius="8">
<TextBlock
FontSize="12"
FontWeight="SemiBold"
Foreground="{StaticResource AppCoralBrush}"
Text="주의" />
</Border>
<TextBlock
VerticalAlignment="Center"
Style="{StaticResource LabelTextStyle}"
Text="가격 변경" />
</StackPanel>
</StackPanel>
</Border>
</Grid>
<Border Grid.Row="1" Style="{StaticResource PanelBorderStyle}">
<Grid RowSpacing="12">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Padding="16" ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" Spacing="8" VerticalAlignment="Center">
<Button
MinWidth="36"
Padding="0"
Style="{StaticResource QuietButtonStyle}"
ToolTipService.ToolTip="뒤로">
<SymbolIcon Symbol="Back" />
</Button>
<Button
MinWidth="36"
Padding="0"
Style="{StaticResource QuietButtonStyle}"
ToolTipService.ToolTip="앞으로">
<SymbolIcon Symbol="Forward" />
</Button>
</StackPanel>
<Border
Grid.Column="1"
Height="38"
Padding="12,0"
Background="{StaticResource AppSurfaceSubtleBrush}"
BorderBrush="{StaticResource AppLineBrush}"
BorderThickness="1"
CornerRadius="8">
<Grid ColumnSpacing="8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<SymbolIcon
VerticalAlignment="Center"
Foreground="{StaticResource AppTextMutedBrush}"
Symbol="Globe" />
<TextBlock
Grid.Column="1"
VerticalAlignment="Center"
Style="{StaticResource MonoTextStyle}"
Text="webview2://preview/gs-shop-home" />
</Grid>
</Border>
<StackPanel
Grid.Column="2"
Orientation="Horizontal"
Spacing="8">
<Button Style="{StaticResource QuietButtonStyle}" ToolTipService.ToolTip="미리보기 새로 고침">
<SymbolIcon Symbol="Refresh" />
</Button>
<Button Style="{StaticResource QuietButtonStyle}" ToolTipService.ToolTip="새 창">
<SymbolIcon Symbol="OpenPane" />
</Button>
</StackPanel>
</Grid>
<Grid
x:Name="PreviewHost"
Grid.Row="1"
Margin="16,0,16,16">
<Border
Background="#101620"
BorderBrush="#202B39"
BorderThickness="1"
CornerRadius="8" />
</Grid>
</Grid>
</Border>
</Grid>
<ScrollViewer
Grid.Column="1"
VerticalScrollBarVisibility="Auto"
VerticalScrollMode="Auto">
<StackPanel Spacing="16">
<Border Padding="16" Style="{StaticResource PanelBorderStyle}">
<StackPanel Spacing="14">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Style="{StaticResource SectionTitleTextStyle}" Text="운영 큐" />
<Border
Grid.Column="1"
Padding="8,4"
Background="{StaticResource AppAccentSoftBrush}"
CornerRadius="8">
<TextBlock
FontSize="12"
FontWeight="SemiBold"
Foreground="{StaticResource AppAccentBrush}"
Text="ON AIR" />
</Border>
</Grid>
<Grid RowSpacing="12">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid ColumnSpacing="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="32" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Border
Width="28"
Height="28"
Background="{StaticResource AppMintSoftBrush}"
CornerRadius="8">
<SymbolIcon
Foreground="{StaticResource AppMintBrush}"
Symbol="Accept" />
</Border>
<StackPanel Grid.Column="1" Spacing="2">
<TextBlock
FontWeight="SemiBold"
Foreground="{StaticResource AppTextBrush}"
Text="프라임 상품 카드" />
<TextBlock Style="{StaticResource LabelTextStyle}" Text="완료 · 14:20" />
</StackPanel>
<TextBlock
Grid.Column="2"
Style="{StaticResource MonoTextStyle}"
Text="A-01" />
</Grid>
<Grid Grid.Row="1" ColumnSpacing="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="32" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Border
Width="28"
Height="28"
Background="{StaticResource AppAccentSoftBrush}"
CornerRadius="8">
<SymbolIcon
Foreground="{StaticResource AppAccentBrush}"
Symbol="Play" />
</Border>
<StackPanel Grid.Column="1" Spacing="2">
<TextBlock
FontWeight="SemiBold"
Foreground="{StaticResource AppTextBrush}"
Text="라이브 상세 배너" />
<TextBlock Style="{StaticResource LabelTextStyle}" Text="진행 중 · 14:32" />
</StackPanel>
<TextBlock
Grid.Column="2"
Style="{StaticResource MonoTextStyle}"
Text="B-04" />
</Grid>
<Grid Grid.Row="2" ColumnSpacing="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="32" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Border
Width="28"
Height="28"
Background="{StaticResource AppAmberSoftBrush}"
CornerRadius="8">
<SymbolIcon
Foreground="{StaticResource AppAmberBrush}"
Symbol="Clock" />
</Border>
<StackPanel Grid.Column="1" Spacing="2">
<TextBlock
FontWeight="SemiBold"
Foreground="{StaticResource AppTextBrush}"
Text="가격 비교 모듈" />
<TextBlock Style="{StaticResource LabelTextStyle}" Text="대기 · 15:00" />
</StackPanel>
<TextBlock
Grid.Column="2"
Style="{StaticResource MonoTextStyle}"
Text="C-11" />
</Grid>
</Grid>
</StackPanel>
</Border>
<Border Padding="16" Style="{StaticResource PanelBorderStyle}">
<StackPanel Spacing="14">
<TextBlock Style="{StaticResource SectionTitleTextStyle}" Text="화면 옵션" />
<ComboBox
Header="미리보기 채널"
HorizontalAlignment="Stretch"
SelectedIndex="0">
<ComboBoxItem Content="메인 홈" />
<ComboBoxItem Content="상품 상세" />
<ComboBoxItem Content="주문 흐름" />
</ComboBox>
<ToggleSwitch
Header="라이브 톤"
IsOn="True"
OffContent="기본"
OnContent="활성" />
<StackPanel Spacing="6">
<TextBlock Style="{StaticResource LabelTextStyle}" Text="패널 밀도" />
<Slider
Maximum="100"
Minimum="0"
Value="64" />
</StackPanel>
</StackPanel>
</Border>
<Border Padding="16" Style="{StaticResource PanelBorderStyle}">
<StackPanel Spacing="14">
<TextBlock Style="{StaticResource SectionTitleTextStyle}" Text="출시 체크" />
<CheckBox Content="대표 이미지 확인" IsChecked="True" />
<CheckBox Content="가격/혜택 문구 확인" IsChecked="True" />
<CheckBox Content="모바일 미리보기 확인" />
<Button
HorizontalAlignment="Stretch"
Style="{StaticResource PrimaryActionButtonStyle}">
<StackPanel
HorizontalAlignment="Center"
Orientation="Horizontal"
Spacing="8">
<SymbolIcon Foreground="White" Symbol="Send" />
<TextBlock Foreground="White" Text="검수 요청" />
</StackPanel>
</Button>
</StackPanel>
</Border>
</StackPanel>
</ScrollViewer>
</Grid>
</Grid>
</NavigationView>
</Page>

360
Views/MainPage.xaml.cs Normal file
View File

@@ -0,0 +1,360 @@
namespace TornadoAce_GSShop.Views
{
public partial class MainPage : Page
{
private WebView2? previewWebView;
public MainPage()
{
this.InitializeComponent();
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
UpdatedTextBlock.Text = DateTime.Now.ToString("yyyy.MM.dd HH:mm");
previewWebView ??= new WebView2
{
Margin = new Thickness(1)
};
if (PreviewHost.Children.Count == 1)
{
PreviewHost.Children.Add(previewWebView);
}
previewWebView.NavigateToString(BuildPreviewHtml());
}
private static string BuildPreviewHtml() =>
"""
<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
:root {
color-scheme: light;
--ink: #111827;
--muted: #667085;
--line: #d8e0ea;
--blue: #2563eb;
--mint: #00a884;
--coral: #f05a4f;
--amber: #b7791f;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
min-height: 100vh;
font-family: "Segoe UI Variable", "Segoe UI", system-ui, sans-serif;
color: var(--ink);
background:
radial-gradient(circle at 16% 18%, rgba(37, 99, 235, .15), transparent 30%),
linear-gradient(135deg, #f7fafc 0%, #eef4f8 52%, #fbf2ef 100%);
}
.page {
min-height: 100vh;
padding: 42px;
display: grid;
grid-template-rows: auto 1fr auto;
gap: 28px;
}
header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20px;
}
.brand {
display: flex;
align-items: center;
gap: 14px;
}
.mark {
width: 46px;
height: 46px;
border-radius: 14px;
display: grid;
place-items: center;
color: white;
font-weight: 800;
background: #111827;
box-shadow: 0 18px 40px rgba(17, 24, 39, .18);
}
.brand h1 {
margin: 0;
font-size: 26px;
letter-spacing: 0;
}
.brand p {
margin: 2px 0 0;
color: var(--muted);
font-size: 14px;
}
.chip-row {
display: flex;
gap: 8px;
flex-wrap: wrap;
justify-content: flex-end;
}
.chip {
padding: 8px 12px;
border: 1px solid rgba(17, 24, 39, .08);
border-radius: 999px;
background: rgba(255, 255, 255, .78);
backdrop-filter: blur(18px);
color: var(--muted);
font-size: 13px;
font-weight: 650;
}
main {
display: grid;
grid-template-columns: minmax(0, 1fr) 310px;
gap: 24px;
align-items: stretch;
}
.hero {
min-height: 430px;
border: 1px solid rgba(17, 24, 39, .08);
border-radius: 24px;
padding: 34px;
background: rgba(255, 255, 255, .72);
backdrop-filter: blur(24px);
box-shadow: 0 24px 70px rgba(28, 38, 55, .14);
display: grid;
grid-template-rows: auto 1fr auto;
overflow: hidden;
position: relative;
}
.hero::after {
content: "";
position: absolute;
width: 320px;
height: 320px;
right: -110px;
bottom: -140px;
background: conic-gradient(from 40deg, rgba(37, 99, 235, .22), rgba(0, 168, 132, .22), rgba(240, 90, 79, .18), rgba(37, 99, 235, .22));
filter: blur(12px);
border-radius: 50%;
}
.eyebrow {
color: var(--blue);
font-size: 13px;
font-weight: 800;
text-transform: uppercase;
}
.hero h2 {
max-width: 720px;
margin: 12px 0 0;
font-size: 46px;
line-height: 1.04;
letter-spacing: 0;
}
.hero-copy {
max-width: 560px;
margin-top: 16px;
color: var(--muted);
font-size: 17px;
line-height: 1.6;
}
.tiles {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 14px;
align-self: end;
position: relative;
z-index: 1;
}
.tile {
min-height: 122px;
padding: 18px;
border-radius: 18px;
border: 1px solid rgba(17, 24, 39, .08);
background: rgba(255, 255, 255, .82);
}
.tile strong {
display: block;
font-size: 26px;
margin-bottom: 6px;
}
.tile span {
color: var(--muted);
font-size: 13px;
}
aside {
display: grid;
gap: 16px;
}
.panel {
border: 1px solid rgba(17, 24, 39, .08);
border-radius: 20px;
padding: 18px;
background: rgba(255, 255, 255, .76);
backdrop-filter: blur(24px);
box-shadow: 0 18px 44px rgba(28, 38, 55, .10);
}
.panel h3 {
margin: 0 0 14px;
font-size: 18px;
}
.list {
display: grid;
gap: 12px;
}
.row {
display: grid;
grid-template-columns: 10px 1fr auto;
gap: 12px;
align-items: center;
}
.dot {
width: 10px;
height: 10px;
border-radius: 50%;
background: var(--blue);
}
.dot.mint {
background: var(--mint);
}
.dot.coral {
background: var(--coral);
}
.row b {
display: block;
font-size: 14px;
}
.row small {
color: var(--muted);
}
.pill {
padding: 5px 9px;
border-radius: 999px;
background: #eef4ff;
color: var(--blue);
font-weight: 800;
font-size: 12px;
}
footer {
display: flex;
align-items: center;
justify-content: space-between;
color: var(--muted);
font-size: 13px;
}
@media (max-width: 860px) {
.page {
padding: 24px;
}
header,
footer {
align-items: flex-start;
flex-direction: column;
}
main,
.tiles {
grid-template-columns: 1fr;
}
.hero h2 {
font-size: 34px;
}
}
</style>
</head>
<body>
<div class="page">
<header>
<div class="brand">
<div class="mark">GS</div>
<div>
<h1>GS Shop Studio</h1>
<p>Live commerce workspace</p>
</div>
</div>
<div class="chip-row">
<div class="chip">WebView2</div>
<div class="chip">Preview</div>
<div class="chip">Ready</div>
</div>
</header>
<main>
<section class="hero">
<div>
<div class="eyebrow">Today at a glance</div>
<h2> </h2>
<p class="hero-copy"> , , .</p>
</div>
<div></div>
<div class="tiles">
<div class="tile"><strong>36</strong><span> </span></div>
<div class="tile"><strong>1.2K</strong><span> </span></div>
<div class="tile"><strong>98%</strong><span> </span></div>
</div>
</section>
<aside>
<section class="panel">
<h3> </h3>
<div class="list">
<div class="row"><i class="dot mint"></i><span><b> </b><small> </small></span><em class="pill">OK</em></div>
<div class="row"><i class="dot"></i><span><b> </b><small> </small></span><em class="pill">LIVE</em></div>
<div class="row"><i class="dot coral"></i><span><b> </b><small> </small></span><em class="pill">TODO</em></div>
</div>
</section>
<section class="panel">
<h3> </h3>
<div class="list">
<div class="row"><i class="dot"></i><span><b>14:40</b><small> </small></span><em class="pill">A-01</em></div>
<div class="row"><i class="dot mint"></i><span><b>15:00</b><small> </small></span><em class="pill">B-04</em></div>
</div>
</section>
</aside>
</main>
<footer>
<span>TornadoAce GS Shop</span>
<span>Rendered inside Microsoft Edge WebView2</span>
</footer>
</div>
</body>
</html>
""";
}
}

24
app.manifest Normal file
View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="TornadoAce_GSShop.app"/>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--The ID below informs the system that this application is compatible with OS features first introduced in Windows 8.
For more info see https://learn.microsoft.com/windows/win32/sysinfo/targeting-your-application-at-windows-8-1
It is also necessary to support features in unpackaged applications, for example the custom titlebar implementation.-->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<!-- The combination of below two tags have the following effect:
1) Per-Monitor for >= Windows 10 Anniversary Update
2) System < Windows 10 Anniversary Update
-->
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
</windowsSettings>
</application>
</assembly>