From 4d3751f9fb732e7536de34b0cf48ec11ba8b4151 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Tue, 9 Jun 2026 23:54:10 +0900 Subject: [PATCH] Polish premium UI pass --- TornadoAce_CJOnStyle/App.xaml | 47 ++-- TornadoAce_CJOnStyle/App.xaml.cs | 41 +++- .../ViewModels/MainViewModel.cs | 48 ++--- TornadoAce_CJOnStyle/Views/MainPage.xaml | 203 +++++++++++++----- 4 files changed, 238 insertions(+), 101 deletions(-) diff --git a/TornadoAce_CJOnStyle/App.xaml b/TornadoAce_CJOnStyle/App.xaml index 4f551da..a44bafe 100644 --- a/TornadoAce_CJOnStyle/App.xaml +++ b/TornadoAce_CJOnStyle/App.xaml @@ -13,23 +13,29 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + @@ -59,22 +65,25 @@ diff --git a/TornadoAce_CJOnStyle/App.xaml.cs b/TornadoAce_CJOnStyle/App.xaml.cs index 7ffbbb8..05d71b6 100644 --- a/TornadoAce_CJOnStyle/App.xaml.cs +++ b/TornadoAce_CJOnStyle/App.xaml.cs @@ -2,6 +2,7 @@ using Microsoft.UI.Windowing; using System; using System.IO; using WinRT.Interop; +using Windows.UI; namespace TornadoAce_CJOnStyle { @@ -33,7 +34,7 @@ namespace TornadoAce_CJOnStyle Title = "TornadoAce CJ OnStyle CG Automation" }; - ApplyWindowIcon(window); + ApplyWindowChrome(window); if (window.Content is not Frame rootFrame) { @@ -46,14 +47,8 @@ namespace TornadoAce_CJOnStyle window.Activate(); } - private static void ApplyWindowIcon(Window targetWindow) + private static void ApplyWindowChrome(Window targetWindow) { - var iconPath = Path.Combine(AppContext.BaseDirectory, "Assets", "AppIcon.ico"); - if (!File.Exists(iconPath)) - { - return; - } - var windowHandle = WindowNative.GetWindowHandle(targetWindow); if (windowHandle == IntPtr.Zero) { @@ -61,7 +56,35 @@ namespace TornadoAce_CJOnStyle } var windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(windowHandle); - AppWindow.GetFromWindowId(windowId)?.SetIcon(iconPath); + var appWindow = AppWindow.GetFromWindowId(windowId); + if (appWindow is null) + { + return; + } + + var iconPath = Path.Combine(AppContext.BaseDirectory, "Assets", "AppIcon.ico"); + if (File.Exists(iconPath)) + { + appWindow.SetIcon(iconPath); + } + + ApplyTitleBarColors(appWindow.TitleBar); + } + + private static void ApplyTitleBarColors(AppWindowTitleBar titleBar) + { + titleBar.BackgroundColor = Color.FromArgb(255, 8, 7, 11); + titleBar.ForegroundColor = Color.FromArgb(255, 248, 245, 238); + titleBar.InactiveBackgroundColor = Color.FromArgb(255, 14, 11, 19); + titleBar.InactiveForegroundColor = Color.FromArgb(255, 155, 146, 168); + titleBar.ButtonBackgroundColor = Color.FromArgb(255, 8, 7, 11); + titleBar.ButtonForegroundColor = Color.FromArgb(255, 248, 245, 238); + titleBar.ButtonHoverBackgroundColor = Color.FromArgb(255, 33, 27, 41); + titleBar.ButtonHoverForegroundColor = Color.FromArgb(255, 248, 245, 238); + titleBar.ButtonPressedBackgroundColor = Color.FromArgb(255, 52, 41, 63); + titleBar.ButtonPressedForegroundColor = Color.FromArgb(255, 200, 255, 23); + titleBar.ButtonInactiveBackgroundColor = Color.FromArgb(255, 14, 11, 19); + titleBar.ButtonInactiveForegroundColor = Color.FromArgb(255, 155, 146, 168); } /// diff --git a/TornadoAce_CJOnStyle/ViewModels/MainViewModel.cs b/TornadoAce_CJOnStyle/ViewModels/MainViewModel.cs index 4ce5efa..0d554c1 100644 --- a/TornadoAce_CJOnStyle/ViewModels/MainViewModel.cs +++ b/TornadoAce_CJOnStyle/ViewModels/MainViewModel.cs @@ -275,19 +275,19 @@ namespace TornadoAce_CJOnStyle.ViewModels private void LoadStatusCards() { - StatusCards.Add(new StatusCardViewModel("큐시트 API", "12", "수신 대기", Symbol.Sync, Brush(0xFF45D6D1))); - StatusCards.Add(new StatusCardViewModel("Scene 매핑", "5", "템플릿 정의", Symbol.Map, Brush(0xFFB48CFF))); - StatusCards.Add(new StatusCardViewModel("자동 검수", "98.7%", "목표 99%+", Symbol.Accept, Brush(0xFFFFB547))); - StatusCards.Add(new StatusCardViewModel("Tornado", "Adapter", "Mock SDK 경계", Symbol.Repair, Brush(0xFF37D67A))); + StatusCards.Add(new StatusCardViewModel("큐시트 API", "12", "수신 대기", Symbol.Sync, Brush(0xFF5FD7D3))); + StatusCards.Add(new StatusCardViewModel("Scene 매핑", "5", "템플릿 정의", Symbol.Map, Brush(0xFFB58BFF))); + StatusCards.Add(new StatusCardViewModel("자동 검수", "98.7%", "목표 99%+", Symbol.Accept, Brush(0xFFD9B76E))); + StatusCards.Add(new StatusCardViewModel("Tornado", "Adapter", "Mock SDK 경계", Symbol.Repair, Brush(0xFFC8FF17))); } private void LoadPipelineSteps() { - PipelineSteps.Add(new PipelineStepViewModel("01", "큐시트/ERP 데이터 수신", "AI ON Studio / CJ OnStyle ERP", "PoC", 55, Brush(0xFF45D6D1))); - PipelineSteps.Add(new PipelineStepViewModel("02", "Data Field Mapping", "큐시트 필드 -> Tornado Scene 객체", "초안", 45, Brush(0xFFB48CFF))); - PipelineSteps.Add(new PipelineStepViewModel("03", "Scene 생성/갱신", "Tornado2 우선, Tornado3 adapter ready", "PoC", 55, Brush(0xFF37D67A))); - PipelineSteps.Add(new PipelineStepViewModel("04", "Scene Data API 추출", "Text/Image visible object snapshot", "PoC", 50, Brush(0xFFFFB547))); - PipelineSteps.Add(new PipelineStepViewModel("05", "자동 검수 피드백", "Text Diffing + LLM 중요도 판정", "초안", 40, Brush(0xFFFF5B61))); + PipelineSteps.Add(new PipelineStepViewModel("01", "큐시트/ERP 데이터 수신", "AI ON Studio / CJ OnStyle ERP", "PoC", 55, Brush(0xFF5FD7D3))); + PipelineSteps.Add(new PipelineStepViewModel("02", "Data Field Mapping", "큐시트 필드 -> Tornado Scene 객체", "초안", 45, Brush(0xFFB58BFF))); + PipelineSteps.Add(new PipelineStepViewModel("03", "Scene 생성/갱신", "Tornado2 우선, Tornado3 adapter ready", "PoC", 55, Brush(0xFFC8FF17))); + PipelineSteps.Add(new PipelineStepViewModel("04", "Scene Data API 추출", "Text/Image visible object snapshot", "PoC", 50, Brush(0xFFD9B76E))); + PipelineSteps.Add(new PipelineStepViewModel("05", "자동 검수 피드백", "Text Diffing + LLM 중요도 판정", "초안", 40, Brush(0xFFFF626E))); } private void LoadFieldMappings() @@ -320,10 +320,10 @@ namespace TornadoAce_CJOnStyle.ViewModels private void LoadEndpoints() { - Endpoints.Add(new IntegrationEndpointViewModel("큐시트 플랫폼", "GET /api/cuesheets/{broadcastDate}", "AI ON Studio", "Mock", Brush(0xFF45D6D1))); - Endpoints.Add(new IntegrationEndpointViewModel("ERP 편성", "GET /api/schedules/{programCode}", "CJ OnStyle ERP", "Mock", Brush(0xFF37D67A))); - Endpoints.Add(new IntegrationEndpointViewModel("Tornado Scene API", "POST /api/scenes/extract", "Tornado Adapter", "Mock", Brush(0xFF37D67A))); - Endpoints.Add(new IntegrationEndpointViewModel("LLM 검수", "POST /api/inspection/llm", "Internal LLM", "정책 확인", Brush(0xFFB48CFF))); + Endpoints.Add(new IntegrationEndpointViewModel("큐시트 플랫폼", "GET /api/cuesheets/{broadcastDate}", "AI ON Studio", "Mock", Brush(0xFF5FD7D3))); + Endpoints.Add(new IntegrationEndpointViewModel("ERP 편성", "GET /api/schedules/{programCode}", "CJ OnStyle ERP", "Mock", Brush(0xFFC8FF17))); + Endpoints.Add(new IntegrationEndpointViewModel("Tornado Scene API", "POST /api/scenes/extract", "Tornado Adapter", "Mock", Brush(0xFFC8FF17))); + Endpoints.Add(new IntegrationEndpointViewModel("LLM 검수", "POST /api/inspection/llm", "Internal LLM", "정책 확인", Brush(0xFFB58BFF))); } private void LoadTornadoAdapterChecks() @@ -342,18 +342,18 @@ namespace TornadoAce_CJOnStyle.ViewModels check.Name, check.Status, check.Evidence, - check.Status == "준비" ? Brush(0xFFFFB547) : Brush(0xFF37D67A))); + check.Status == "준비" ? Brush(0xFFD9B76E) : Brush(0xFFC8FF17))); } } private void LoadRequirementCoverage() { - RequirementCoverage.Add(new PocRequirementViewModel("RFP-01", "큐시트 API 연동", "PoC", "JSON Mock 수신", Brush(0xFF45D6D1))); - RequirementCoverage.Add(new PocRequirementViewModel("RFP-02", "ERP 편성 연동", "PoC", "편성 JSON 매칭", Brush(0xFF37D67A))); - RequirementCoverage.Add(new PocRequirementViewModel("RFP-03", "Data Field Mapping", "PoC", "Scene 스냅샷 생성", Brush(0xFF37D67A))); - RequirementCoverage.Add(new PocRequirementViewModel("RFP-04", "Tornado Scene API", "PoC", "Mock adapter 추출", Brush(0xFF37D67A))); - RequirementCoverage.Add(new PocRequirementViewModel("RFP-05", "관리자 매핑 기능", "PoC", "프로파일 검증", Brush(0xFF37D67A))); - RequirementCoverage.Add(new PocRequirementViewModel("RFP-06", "1·2단계 자동 검수", "PoC", "필드 상세 Diff + LLM 후보", Brush(0xFF45D6D1))); + RequirementCoverage.Add(new PocRequirementViewModel("RFP-01", "큐시트 API 연동", "PoC", "JSON Mock 수신", Brush(0xFF5FD7D3))); + RequirementCoverage.Add(new PocRequirementViewModel("RFP-02", "ERP 편성 연동", "PoC", "편성 JSON 매칭", Brush(0xFFC8FF17))); + RequirementCoverage.Add(new PocRequirementViewModel("RFP-03", "Data Field Mapping", "PoC", "Scene 스냅샷 생성", Brush(0xFFC8FF17))); + RequirementCoverage.Add(new PocRequirementViewModel("RFP-04", "Tornado Scene API", "PoC", "Mock adapter 추출", Brush(0xFFC8FF17))); + RequirementCoverage.Add(new PocRequirementViewModel("RFP-05", "관리자 매핑 기능", "PoC", "프로파일 검증", Brush(0xFFC8FF17))); + RequirementCoverage.Add(new PocRequirementViewModel("RFP-06", "1·2단계 자동 검수", "PoC", "필드 상세 Diff + LLM 후보", Brush(0xFF5FD7D3))); } private void LoadScheduleMatches() @@ -371,7 +371,7 @@ namespace TornadoAce_CJOnStyle.ViewModels schedule?.ProgramCode ?? "-", schedule is null ? "편성 미확인" : $"{schedule.MerchandiserName} / {schedule.ProductCategory}", isMatched ? "매칭" : "확인", - isMatched ? Brush(0xFF37D67A) : Brush(0xFFFFB547))); + isMatched ? Brush(0xFFC8FF17) : Brush(0xFFD9B76E))); } } @@ -471,9 +471,9 @@ namespace TornadoAce_CJOnStyle.ViewModels { return severity switch { - "High" => Brush(0xFFFF5B61), - "Medium" => Brush(0xFFFFB547), - _ => Brush(0xFF37D67A) + "High" => Brush(0xFFFF626E), + "Medium" => Brush(0xFFD9B76E), + _ => Brush(0xFFC8FF17) }; } diff --git a/TornadoAce_CJOnStyle/Views/MainPage.xaml b/TornadoAce_CJOnStyle/Views/MainPage.xaml index 5dae460..d6f40af 100644 --- a/TornadoAce_CJOnStyle/Views/MainPage.xaml +++ b/TornadoAce_CJOnStyle/Views/MainPage.xaml @@ -37,13 +37,33 @@ RequestedTheme="Dark" Visibility="{x:Bind ViewModel.MainShellVisibility, Mode=OneWay}"> - - - + + + + + + + + + + + + + + @@ -104,7 +124,19 @@ - + + + + + @@ -116,12 +148,22 @@ - + + + + + + + + + - + @@ -254,13 +305,15 @@ @@ -307,6 +360,8 @@ @@ -899,18 +954,18 @@ - - - + + + + + + + + + + + + + + + + @@ -958,11 +1038,14 @@ @@ -970,7 +1053,9 @@ MinHeight="44" Margin="0,4,0,0" HorizontalAlignment="Stretch" - Background="#341069" + Background="{StaticResource AccentVioletBrush}" + BorderBrush="#88C8FF17" + BorderThickness="1" Click="LoginButton_Click" CornerRadius="5" Foreground="White"> @@ -994,28 +1079,48 @@ Visibility="{x:Bind ViewModel.LaunchScreenVisibility, Mode=OneWay}"> - - + + + + + + + + + + + + +