AX Agent 메인 UI를 claw-code 축으로 전면 재배치
Some checks failed
Release Gate / gate (push) Has been cancelled

- ChatWindow 메인 레이아웃을 기존 카드형 AX 틀에서 벗어나 사이드바·본문·컴포저 중심의 더 평평한 claw-code 스타일로 재정렬

- 창 기본 크기, 사이드바 폭, 상단 탭 헤더, 검색 바, 빈 상태, 컴포저 외곽선과 입력축을 다시 조정해 메시지 축과 입력축이 같은 중심선을 공유하도록 변경

- 메시지 버블, compact pill, 이전 대화 로드 카드, planning 카드의 패딩·코너·메타 밀도를 낮춰 transcript 우선 시각 언어로 통일

- README와 docs/DEVELOPMENT.md에 2026-04-05 18:30 (KST) 기준 작업 이력 및 claw-code 대비 진척율 반영

- 검증: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ (경고 0 / 오류 0)
This commit is contained in:
2026-04-05 16:03:26 +09:00
parent ed1b8497c6
commit aa3de8a6fd
4 changed files with 148 additions and 150 deletions

View File

@@ -3,8 +3,8 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
Title="AX Copilot — AX Agent"
Width="1100" Height="760"
MinWidth="700" MinHeight="520"
Width="1180" Height="820"
MinWidth="780" MinHeight="560"
WindowStyle="None"
UseLayoutRounding="True"
SnapsToDevicePixels="True"
@@ -27,12 +27,12 @@
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Padding" Value="8,6"/>
<Setter Property="Padding" Value="8,5"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="Bd" Background="{TemplateBinding Background}"
CornerRadius="8" Padding="{TemplateBinding Padding}"
CornerRadius="6" Padding="{TemplateBinding Padding}"
Opacity="1">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
@@ -53,15 +53,15 @@
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Width" Value="40"/>
<Setter Property="Height" Value="40"/>
<Setter Property="Margin" Value="2,0,0,0"/>
<Setter Property="Width" Value="34"/>
<Setter Property="Height" Value="34"/>
<Setter Property="Margin" Value="1,0,0,0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="Bd"
Background="{TemplateBinding Background}"
CornerRadius="8"
CornerRadius="6"
Opacity="1"
RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
@@ -174,15 +174,15 @@
<!-- 탭 버튼 -->
<Style x:Key="TopTabBtn" TargetType="RadioButton">
<Setter Property="Foreground" Value="{DynamicResource SecondaryText}"/>
<Setter Property="FontSize" Value="11.5"/>
<Setter Property="FontSize" Value="11"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Padding" Value="14,4"/>
<Setter Property="Padding" Value="13,4"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="RadioButton">
<Border x:Name="Bd" Background="Transparent"
CornerRadius="6" Padding="{TemplateBinding Padding}">
CornerRadius="999" Padding="{TemplateBinding Padding}">
<ContentPresenter x:Name="Cp" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
@@ -406,7 +406,7 @@
<!-- 축소 아이콘 바 (사이드바 닫힘 시 표시) -->
<ColumnDefinition x:Name="IconBarColumn" Width="0"/>
<!-- 사이드바 (열림 시 표시) -->
<ColumnDefinition x:Name="SidebarColumn" Width="236" MinWidth="0"/>
<ColumnDefinition x:Name="SidebarColumn" Width="220" MinWidth="0"/>
<ColumnDefinition Width="*"/>
<!-- 미리보기 스플리터 -->
<ColumnDefinition x:Name="SplitterColumn" Width="0"/>
@@ -422,9 +422,9 @@
Visibility="Collapsed">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="44"/>
<RowDefinition Height="40"/>
<RowDefinition Height="*"/>
<RowDefinition Height="44"/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<!-- 상단 아이콘들 -->
@@ -472,38 +472,31 @@
<!-- 좌측: 사이드바 -->
<!-- ══════════════════════════════════════════════════════ -->
<Border x:Name="SidebarPanel" Grid.Column="1"
Background="{DynamicResource LauncherBackground}"
Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="0,0,1,0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="36"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="46"/>
<RowDefinition Height="42"/>
</Grid.RowDefinitions>
<!-- 헤더 -->
<Grid Grid.Row="0" Margin="10,0">
<Grid Grid.Row="0" Margin="12,0,12,0">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<Border Background="{DynamicResource HintBackground}" CornerRadius="5"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
Width="18" Height="18">
<TextBlock Text="&#xE8BD;" FontFamily="Segoe MDL2 Assets" FontSize="9.5"
Foreground="{DynamicResource AccentColor}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<TextBlock Text="AX Agent" FontSize="11.5" FontWeight="SemiBold"
<TextBlock Text="AX Agent" FontSize="11" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}"
VerticalAlignment="Center" Margin="7,0,0,0"/>
VerticalAlignment="Center"/>
</StackPanel>
</Grid>
<!-- 상단 액션 -->
<Grid Grid.Row="1" Margin="10,1,10,5">
<Grid Grid.Row="1" Margin="12,2,12,6">
<StackPanel>
<Border x:Name="SidebarNewChatTrigger"
Background="Transparent"
@@ -643,7 +636,7 @@
</Grid>
<!-- 상단 필터 드롭다운 -->
<Border Grid.Row="2" Margin="10,0,10,3">
<Border Grid.Row="2" Margin="12,0,12,4">
<Button x:Name="BtnCategoryDrop" Style="{StaticResource GhostBtn}"
HorizontalAlignment="Stretch" Padding="7,3.5"
Click="BtnCategoryDrop_Click">
@@ -666,7 +659,7 @@
</Border>
<!-- 탭별 좌측 메뉴 -->
<Border Grid.Row="3" Margin="10,0,10,5"
<Border Grid.Row="3" Margin="12,0,12,6"
Background="Transparent"
BorderBrush="Transparent"
BorderThickness="0"
@@ -837,13 +830,13 @@
<!-- ══════════════════════════════════════════════════════ -->
<Grid Grid.Column="2">
<Grid.RowDefinitions>
<RowDefinition Height="46"/>
<RowDefinition Height="42"/>
<RowDefinition Height="Auto"/> <!-- 서브 바: 제목 + 프리뷰 -->
<RowDefinition Height="Auto"/> <!-- 스티키 진행률 바 -->
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/> <!-- 입력 바 + Popup들 -->
<RowDefinition Height="Auto"/> <!-- 파일 탐색기 -->
<RowDefinition Height="Auto"/> <!-- 상태바 -->
<RowDefinition Height="30"/> <!-- 상태바 -->
</Grid.RowDefinitions>
<!-- ── 서브 바: 제목 + 프리뷰 버튼 (AX Agent 스타일) ── -->
@@ -1026,11 +1019,11 @@
<StackPanel Grid.Column="0"
Orientation="Horizontal"
VerticalAlignment="Center"
Margin="46,0,0,0"
Margin="42,0,0,0"
Visibility="Collapsed">
<TextBlock x:Name="CurrentTabTitle"
Text="AX Agent"
FontSize="13"
FontSize="12"
FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}"/>
</StackPanel>
@@ -1039,9 +1032,9 @@
HorizontalAlignment="Left" VerticalAlignment="Center" Margin="10,0,0,0"
Width="28"
Height="28"
Background="{DynamicResource HintBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
Background="Transparent"
BorderBrush="Transparent"
BorderThickness="0"
Cursor="Hand"
Click="BtnToggleSidebar_Click" ToolTip="사이드바 열기/닫기"
WindowChrome.IsHitTestVisibleInChrome="True">
@@ -1051,7 +1044,7 @@
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="7">
CornerRadius="6">
<Grid Width="28" Height="28">
<StackPanel HorizontalAlignment="Center"
VerticalAlignment="Center">
@@ -1094,8 +1087,10 @@
<!-- 중앙: 탭 메뉴 -->
<Border Grid.Column="1"
HorizontalAlignment="Center" VerticalAlignment="Center"
Background="{DynamicResource HintBackground}"
CornerRadius="9" Padding="2.5"
Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
CornerRadius="999" Padding="2"
WindowChrome.IsHitTestVisibleInChrome="True">
<StackPanel Orientation="Horizontal">
<RadioButton x:Name="TabChat" Content="Chat" Style="{StaticResource TopTabBtn}"
@@ -1113,7 +1108,7 @@
<!-- 우: 최소화 + 최대화 + 닫기 -->
<StackPanel Grid.Column="2"
Orientation="Horizontal" HorizontalAlignment="Right"
VerticalAlignment="Center" Margin="0,0,6,0"
VerticalAlignment="Center" Margin="0,0,4,0"
WindowChrome.IsHitTestVisibleInChrome="True">
<Button Style="{StaticResource TitleBarActionButton}" Click="BtnMinimize_Click" ToolTip="최소화">
<TextBlock Text="&#xE921;" FontFamily="Segoe MDL2 Assets" FontSize="12"
@@ -1134,9 +1129,9 @@
<!-- ── 메시지 내 검색 바 (Ctrl+F) ── -->
<Border x:Name="MessageSearchBar" Grid.Row="3" Visibility="Collapsed"
Panel.ZIndex="5" VerticalAlignment="Top"
Background="{DynamicResource HintBackground}"
Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource SeparatorColor}" BorderThickness="0,0,0,1"
Padding="12,6" Margin="40,0,40,0" CornerRadius="0,0,10,10">
Padding="10,5" Margin="28,0,28,0" CornerRadius="0,0,8,8">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
@@ -1181,10 +1176,10 @@
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled"
Background="{DynamicResource LauncherBackground}"
Padding="18,10,18,6">
Padding="24,12,24,8">
<StackPanel x:Name="MessagePanel"
Margin="0,0,0,12"
MaxWidth="880"
Margin="0,0,0,8"
MaxWidth="960"
HorizontalAlignment="Center">
<StackPanel.RenderTransform>
<TranslateTransform/>
@@ -1196,8 +1191,8 @@
<Grid x:Name="EmptyState" Grid.Row="3"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
MaxWidth="840"
Margin="18,8,18,8">
MaxWidth="960"
Margin="24,10,24,12">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="16"/>
@@ -1208,31 +1203,29 @@
HorizontalAlignment="Center"
VerticalAlignment="Top"
Margin="0,10,0,2">
<Border x:Name="EmptyIcon" CornerRadius="14" Width="44" Height="44"
HorizontalAlignment="Center" Margin="0,0,0,12"
Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1">
<TextBlock Text="&#xE8BD;" FontFamily="Segoe MDL2 Assets" FontSize="22"
<Border x:Name="EmptyIcon" CornerRadius="12" Width="36" Height="36"
HorizontalAlignment="Center" Margin="0,0,0,10"
Background="{DynamicResource HintBackground}">
<TextBlock Text="&#xE8BD;" FontFamily="Segoe MDL2 Assets" FontSize="18"
Foreground="{DynamicResource AccentColor}"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<TextBlock x:Name="EmptyStateTitle" Text="작업을 시작하세요" FontSize="18" FontWeight="SemiBold"
<TextBlock x:Name="EmptyStateTitle" Text="작업을 시작하세요" FontSize="16" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}" HorizontalAlignment="Center"/>
<TextBlock x:Name="EmptyStateDesc" Text="프롬프트를 입력하거나 아래 작업 유형을 선택하면 됩니다"
FontSize="11.5" Foreground="{DynamicResource SecondaryText}"
FontSize="11" Foreground="{DynamicResource SecondaryText}"
HorizontalAlignment="Center"
TextAlignment="Center"
Width="320"
Margin="0,6,0,0"/>
Width="340"
Margin="0,5,0,0"/>
</StackPanel>
<ScrollViewer x:Name="TopicPresetScrollViewer"
Grid.Row="2"
VerticalScrollBarVisibility="Disabled"
HorizontalScrollBarVisibility="Disabled"
MaxHeight="376"
MaxHeight="360"
Margin="0"
Padding="0,2,0,0">
<!-- 대화 주제 버튼 (프리셋에서 동적 생성) -->
@@ -1560,23 +1553,20 @@
<!-- ── 입력 바 ── -->
<Border x:Name="ComposerShell" Grid.Row="4"
Margin="18,0,18,14"
Margin="24,0,24,12"
Width="Auto"
MaxWidth="820"
MaxWidth="900"
HorizontalAlignment="Center"
VerticalAlignment="Bottom">
<StackPanel HorizontalAlignment="Stretch">
<Border x:Name="DraftPreviewCard"
Visibility="Collapsed"
Background="{DynamicResource LauncherBackground}"
Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
CornerRadius="12"
Padding="9,7,9,7"
Margin="0,0,0,5">
<Border.Effect>
<DropShadowEffect BlurRadius="10" ShadowDepth="0" Opacity="0.05"/>
</Border.Effect>
CornerRadius="10"
Padding="8,6,8,6"
Margin="0,0,0,4">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
@@ -1627,9 +1617,9 @@
<!-- 무지개 글로우 외부 테두리 (메시지 전송 시 애니메이션) -->
<StackPanel x:Name="DraftQueuePanel"
Visibility="Collapsed"
Margin="0,0,0,8"/>
Margin="0,0,0,6"/>
<Border x:Name="InputGlowBorder" CornerRadius="14" Opacity="0"
Margin="-3" IsHitTestVisible="False">
Margin="-1" IsHitTestVisible="False">
<Border.BorderBrush>
<LinearGradientBrush x:Name="RainbowBrush" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#FF6B6B" Offset="0.0"/>
@@ -1642,20 +1632,17 @@
</LinearGradientBrush>
</Border.BorderBrush>
<Border.BorderThickness>
<Thickness>3</Thickness>
<Thickness>1.5</Thickness>
</Border.BorderThickness>
<Border.Effect>
<BlurEffect Radius="6"/>
<BlurEffect Radius="2"/>
</Border.Effect>
</Border>
<!-- 실제 입력 영역 -->
<Border x:Name="InputBorder"
Background="{DynamicResource LauncherBackground}"
CornerRadius="9" Padding="4"
Background="{DynamicResource ItemBackground}"
CornerRadius="12" Padding="3"
BorderBrush="{DynamicResource BorderColor}" BorderThickness="1">
<Border.Effect>
<DropShadowEffect BlurRadius="10" ShadowDepth="0" Opacity="0.04"/>
</Border.Effect>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
@@ -1665,7 +1652,7 @@
</Grid.RowDefinitions>
<!-- Row 0: 모델 셀렉터 + 템플릿 버튼 -->
<Grid Grid.Row="0" Margin="1,0,1,2">
<Grid Grid.Row="0" Margin="3,1,3,2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
@@ -1677,7 +1664,7 @@
HorizontalAlignment="Left"
Margin="0"
MinHeight="24"
Padding="7,2"
Padding="6,2"
Click="BtnModelSelector_Click"
ToolTip="모델/추론 빠른 설정"
WindowChrome.IsHitTestVisibleInChrome="True">
@@ -1697,9 +1684,9 @@
</Button>
<Border x:Name="TokenUsageCard"
Grid.Column="2"
Margin="4,0,0,0"
Margin="6,0,0,0"
Padding="4,2"
CornerRadius="7"
CornerRadius="999"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
Background="{DynamicResource ItemBackground}"
@@ -1776,8 +1763,8 @@
HorizontalAlignment="Right"
Margin="0"
MinHeight="24"
MinWidth="58"
Padding="7,2"
MinWidth="56"
Padding="6,2"
Click="BtnTemplateSelector_Click"
ToolTip="프롬프트 템플릿"
WindowChrome.IsHitTestVisibleInChrome="True">
@@ -1954,7 +1941,7 @@
PreviewKeyDown="InputBox_PreviewKeyDown"
TextChanged="InputBox_TextChanged"
TextWrapping="Wrap"
MinHeight="36" MaxHeight="144"
MinHeight="40" MaxHeight="148"
VerticalScrollBarVisibility="Auto"/>
<!-- 워터마크 (프롬프트 카드 안내문구) -->
<TextBlock x:Name="InputWatermark"
@@ -1988,7 +1975,7 @@
<!-- 파일 첨부 -->
<Button x:Name="BtnAttach" Style="{StaticResource GhostBtn}" Grid.Column="1"
Width="32" Height="32" Margin="0,0,4,0" VerticalAlignment="Bottom"
Width="32" Height="32" Margin="0,0,6,0" VerticalAlignment="Bottom"
Click="BtnAttach_Click" ToolTip="파일 첨부"
WindowChrome.IsHitTestVisibleInChrome="True"
AllowDrop="True">
@@ -2008,8 +1995,8 @@
<!-- 일시정지 -->
<Border x:Name="BtnPause" Grid.Column="3"
Width="30" Height="30" Margin="0,0,4,0"
CornerRadius="8" Cursor="Hand"
Width="30" Height="30" Margin="0,0,6,0"
CornerRadius="10" Cursor="Hand"
Background="{DynamicResource ItemHoverBackground}" Visibility="Collapsed"
VerticalAlignment="Bottom"
MouseLeftButtonUp="BtnPause_Click"
@@ -2022,13 +2009,13 @@
<!-- 중지/전송 -->
<Button x:Name="BtnStop" Grid.Column="3"
Width="36" Height="36" Margin="4,0,4,0"
Width="36" Height="36" Margin="6,0,6,0"
Cursor="Hand" Click="BtnStop_Click"
VerticalAlignment="Bottom" Visibility="Collapsed"
WindowChrome.IsHitTestVisibleInChrome="True">
<Button.Template>
<ControlTemplate TargetType="Button">
<Border Background="#DC2626" CornerRadius="18">
<Border Background="#DC2626" CornerRadius="12">
<TextBlock Text="&#xE71A;" FontFamily="Segoe MDL2 Assets"
FontSize="13" Foreground="White"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
@@ -2037,13 +2024,13 @@
</Button.Template>
</Button>
<Button x:Name="BtnSend" Grid.Column="4"
Width="38" Height="38" Margin="8,0,4,0"
Width="38" Height="38" Margin="6,0,2,0"
Cursor="Hand" Click="BtnSend_Click"
VerticalAlignment="Bottom">
<Button.Template>
<ControlTemplate TargetType="Button">
<Border x:Name="Bd" Background="{DynamicResource AccentColor}"
CornerRadius="19">
CornerRadius="12">
<TextBlock Text="&#xE724;" FontFamily="Segoe MDL2 Assets"
FontSize="13" Foreground="White"
HorizontalAlignment="Center" VerticalAlignment="Center"/>