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}">
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+