Files
AX-Copilot-Codex/src/AxCopilot/Views/ChatWindow.xaml
lacvet e8e701e4a1
Some checks failed
Release Gate / gate (push) Has been cancelled
UI 마감 튜닝: 권한 팝업 가독성·컴포저 밀도·점검 체크리스트 반영
- ChatWindow 권한 팝업의 섹션/행 패딩·폰트·줄간격을 미세 조정해 스캔 속도 개선
- 슬래시 팔레트 하단 안내에 PgUp/PgDn/Home/End 키 이동 정보를 반영
- 좌측 기본 카테고리 라벨을 주제 선택/작업 선택으로 통일
- 입력 상단 컴포저(모델/프리셋/인라인 설정) 간격을 컴팩트하게 재정돈
- docs/UI_UX_CHECKLIST.md에 최신 점검 결과(운영모드 필터 18건, 전체 테스트 436건) 기록
- README.md, docs/DEVELOPMENT.md 이력 및 업데이트 시각(2026-04-04 12:33 KST) 갱신
- 빌드 복구 메모: WPF 임시 생성물 꼬임 발생 시 obj/bin 정리 후 정상 재생성 확인
2026-04-04 12:34:34 +09:00

1745 lines
118 KiB
XML

<Window x:Class="AxCopilot.Views.ChatWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
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"
WindowStyle="None"
UseLayoutRounding="True"
SnapsToDevicePixels="True"
Background="{DynamicResource LauncherBackground}"
ResizeMode="CanResizeWithGrip"
WindowStartupLocation="CenterScreen"
ShowInTaskbar="True"
Icon="pack://application:,,,/Assets/icon.ico">
<WindowChrome.WindowChrome>
<WindowChrome CaptionHeight="48"
CornerRadius="0"
GlassFrameThickness="0"
ResizeBorderThickness="6"/>
</WindowChrome.WindowChrome>
<Window.Resources>
<!-- 사이드바 버튼 -->
<Style x:Key="GhostBtn" TargetType="Button">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Padding" Value="8,6"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="Bd" Background="{TemplateBinding Background}"
CornerRadius="8" Padding="{TemplateBinding Padding}"
Opacity="1">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd" Property="Background" Value="{DynamicResource ItemHoverBackground}"/>
<Setter TargetName="Bd" Property="Opacity" Value="0.85"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="0.35"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 탭 버튼 -->
<Style x:Key="TopTabBtn" TargetType="RadioButton">
<Setter Property="Foreground" Value="{DynamicResource SecondaryText}"/>
<Setter Property="FontSize" Value="13"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Padding" Value="18,6"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="RadioButton">
<Border x:Name="Bd" Background="Transparent"
CornerRadius="8" Padding="{TemplateBinding Padding}">
<ContentPresenter x:Name="Cp" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd" Property="Background" Value="{DynamicResource ItemHoverBackground}"/>
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
</Trigger>
<!-- IsChecked를 뒤에 두어 호버보다 선택 상태가 항상 우선 적용 -->
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="Bd" Property="Background" Value="{DynamicResource ItemSelectedBackground}"/>
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
<Setter Property="FontWeight" Value="Bold"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="0.3"/>
<Setter Property="Cursor" Value="Arrow"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 테두리 호버 버튼 (배경색 변경 없이 테두리만 표시) -->
<Style x:Key="OutlineHoverBtn" TargetType="Button">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Padding" Value="8,6,10,6"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="Bd" Background="Transparent"
BorderBrush="Transparent"
BorderThickness="0"
CornerRadius="8" Padding="{TemplateBinding Padding}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd" Property="Background" Value="{DynamicResource ItemHoverBackground}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="0.35"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 모든 드롭다운 메뉴는 코드-비하인드에서 커스텀 Popup으로 렌더링 -->
</Window.Resources>
<Border Background="{DynamicResource LauncherBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1">
<Grid>
<Grid.ColumnDefinitions>
<!-- 축소 아이콘 바 (사이드바 닫힘 시 표시) -->
<ColumnDefinition x:Name="IconBarColumn" Width="0"/>
<!-- 사이드바 (열림 시 표시) -->
<ColumnDefinition x:Name="SidebarColumn" Width="270" MinWidth="0"/>
<ColumnDefinition Width="*"/>
<!-- 미리보기 스플리터 -->
<ColumnDefinition x:Name="SplitterColumn" Width="0"/>
<!-- 미리보기 패널 (파일 생성 시 표시) -->
<ColumnDefinition x:Name="PreviewColumn" Width="0" MinWidth="0"/>
</Grid.ColumnDefinitions>
<!-- ══ 축소 아이콘 바 (사이드바 닫힘 시) ══ -->
<Border x:Name="IconBarPanel" Grid.Column="0"
Background="{DynamicResource ItemBackground}"
Visibility="Collapsed">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="54"/>
<RowDefinition Height="*"/>
<RowDefinition Height="54"/>
</Grid.RowDefinitions>
<!-- 상단 아이콘들 -->
<StackPanel Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Center">
<Button Style="{StaticResource GhostBtn}" Padding="10,8"
Click="BtnNewChat_Click" ToolTip="새 대화"
WindowChrome.IsHitTestVisibleInChrome="True">
<TextBlock Text="&#xE710;" FontFamily="Segoe MDL2 Assets" FontSize="15"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
</StackPanel>
<StackPanel Grid.Row="1" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="0,8,0,0">
<Button Style="{StaticResource GhostBtn}" Padding="10,8"
Click="BtnToggleSidebar_Click" ToolTip="검색"
WindowChrome.IsHitTestVisibleInChrome="True">
<TextBlock Text="&#xE721;" FontFamily="Segoe MDL2 Assets" FontSize="14"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
<Button Style="{StaticResource GhostBtn}" Padding="10,8"
Click="BtnCategoryDrop_Click" ToolTip="대화 주제"
WindowChrome.IsHitTestVisibleInChrome="True">
<TextBlock Text="&#xE8BD;" FontFamily="Segoe MDL2 Assets" FontSize="14"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
</StackPanel>
<!-- 하단: 사용자 이니셜 -->
<Button x:Name="BtnUserIconBar" Grid.Row="2" Style="{StaticResource GhostBtn}"
HorizontalAlignment="Center" VerticalAlignment="Center"
ToolTip="" Padding="0"
WindowChrome.IsHitTestVisibleInChrome="True">
<Border Width="32" Height="32" CornerRadius="16"
Background="{DynamicResource AccentColor}">
<TextBlock x:Name="UserInitialIconBar" Text="U" FontSize="13" FontWeight="Bold"
Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</Button>
</Grid>
</Border>
<!-- ══════════════════════════════════════════════════════ -->
<!-- 좌측: 사이드바 -->
<!-- ══════════════════════════════════════════════════════ -->
<Border x:Name="SidebarPanel" Grid.Column="1"
Background="{DynamicResource ItemBackground}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="52"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="50"/>
</Grid.RowDefinitions>
<!-- 헤더: 로고 + 새 대화 -->
<Grid Grid.Row="0" Margin="14,0">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<Border Background="{DynamicResource AccentColor}" CornerRadius="6"
Width="24" Height="24">
<TextBlock Text="&#xE8BD;" FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<TextBlock Text="AX Agent" FontSize="13.5" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}"
VerticalAlignment="Center" Margin="10,0,0,0"/>
</StackPanel>
<Button x:Name="BtnNewChat" Style="{StaticResource GhostBtn}"
HorizontalAlignment="Right" VerticalAlignment="Center"
Click="BtnNewChat_Click" ToolTip="새 대화 (Ctrl+N)"
WindowChrome.IsHitTestVisibleInChrome="True">
<TextBlock Text="&#xE710;" FontFamily="Segoe MDL2 Assets" FontSize="14"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
</Grid>
<!-- 검색 -->
<Border Grid.Row="1" Background="{DynamicResource HintBackground}"
CornerRadius="10" Margin="12,0,12,6" Padding="10,6">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="&#xE721;" FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
<TextBox x:Name="SearchBox" Background="Transparent" BorderThickness="0"
Foreground="{DynamicResource PrimaryText}"
CaretBrush="{DynamicResource AccentColor}" FontSize="11.5"
VerticalAlignment="Center" Margin="22,0,8,0"
TextChanged="SearchBox_TextChanged"/>
<Button x:Name="BtnConversationSort" Grid.Column="1"
Style="{StaticResource GhostBtn}"
Padding="8,3" MinWidth="54"
Margin="0,0,0,0"
VerticalAlignment="Center"
Click="BtnConversationSort_Click"
ToolTip="대화 정렬 기준 전환"
Visibility="Collapsed">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE8CB;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="0,0,5,0"/>
<TextBlock x:Name="ConversationSortLabel" Text="활동"
FontSize="11" FontWeight="SemiBold"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/>
</StackPanel>
</Button>
<Button x:Name="BtnRunningOnlyFilter" Grid.Column="2"
Style="{StaticResource GhostBtn}"
Padding="8,3" MinWidth="54"
Margin="6,0,0,0"
VerticalAlignment="Center"
Click="BtnRunningOnlyFilter_Click"
ToolTip="비활성"
Visibility="Collapsed"
IsEnabled="False">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE768;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="0,0,5,0"/>
<TextBlock x:Name="RunningOnlyFilterLabel" Text="진행"
FontSize="11" FontWeight="SemiBold"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/>
</StackPanel>
</Button>
</Grid>
</Border>
<!-- 카테고리 드롭다운: "모든 주제 ▼" -->
<Border Grid.Row="2" Margin="12,0,12,4">
<Button x:Name="BtnCategoryDrop" Style="{StaticResource GhostBtn}"
HorizontalAlignment="Stretch" Padding="10,5"
Click="BtnCategoryDrop_Click">
<Grid HorizontalAlignment="Stretch">
<StackPanel Orientation="Horizontal">
<TextBlock x:Name="CategoryIcon" Text="&#xE8BD;"
FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center" Margin="0,0,8,0"/>
<TextBlock x:Name="CategoryLabel" Text="모든 주제"
FontSize="11.5" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}"
VerticalAlignment="Center"/>
</StackPanel>
<TextBlock Text="&#xE70D;" FontFamily="Segoe MDL2 Assets" FontSize="9"
Foreground="{DynamicResource SecondaryText}"
HorizontalAlignment="Right" VerticalAlignment="Center"/>
</Grid>
</Button>
</Border>
<!-- 탭별 좌측 메뉴 -->
<Border Grid.Row="3" Margin="12,0,12,6"
Background="{DynamicResource HintBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
CornerRadius="10"
Padding="10,8">
<StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,0,4" Visibility="Collapsed">
<TextBlock x:Name="SidebarModeBadgeIcon" Text="&#xE8BD;"
FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center" Margin="0,0,6,0"/>
<TextBlock x:Name="SidebarModeBadgeTitle" Text="Chat 메뉴"
FontSize="11.5" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}"
VerticalAlignment="Center"/>
</StackPanel>
<StackPanel x:Name="SidebarChatMenu" Visibility="Visible">
<Border Cursor="Hand" Background="Transparent" CornerRadius="8"
Padding="8,5" Margin="0,0,0,3"
MouseLeftButtonUp="SidebarChatAll_MouseLeftButtonUp">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="&#xE8BD;" FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="{DynamicResource AccentColor}" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="주제 탐색"
Foreground="{DynamicResource PrimaryText}"
FontSize="11.5" Margin="8,0,0,0" VerticalAlignment="Center"/>
<TextBlock Grid.Column="2" Text="&#xE70D;" FontFamily="Segoe MDL2 Assets" FontSize="9"
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
</Grid>
</Border>
<Border x:Name="SidebarChatRunningRow" Cursor="Hand" Background="Transparent" CornerRadius="8"
Padding="8,5"
MouseLeftButtonUp="SidebarChatRunning_MouseLeftButtonUp"
Visibility="Collapsed">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="&#xE768;" FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="#22C55E" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="진행 중 대화만 보기"
Foreground="{DynamicResource PrimaryText}"
FontSize="11.5" Margin="8,0,0,0" VerticalAlignment="Center"/>
<TextBlock Grid.Column="2" x:Name="SidebarChatRunningState" Text="OFF"
Foreground="{DynamicResource SecondaryText}"
FontSize="11" VerticalAlignment="Center"/>
</Grid>
</Border>
</StackPanel>
<StackPanel x:Name="SidebarCoworkMenu" Visibility="Collapsed">
<Border Cursor="Hand" Background="Transparent" CornerRadius="8"
Padding="8,5" Margin="0,0,0,3"
MouseLeftButtonUp="SidebarCoworkCategory_MouseLeftButtonUp">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="&#xE8FD;" FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="#3B82F6" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="작업 유형 선택"
Foreground="{DynamicResource PrimaryText}"
FontSize="11.5" Margin="8,0,0,0" VerticalAlignment="Center"/>
<TextBlock Grid.Column="2" Text="&#xE70D;" FontFamily="Segoe MDL2 Assets" FontSize="9"
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
</Grid>
</Border>
</StackPanel>
<StackPanel x:Name="SidebarCodeMenu" Visibility="Collapsed">
<Border Cursor="Hand" Background="Transparent" CornerRadius="8"
Padding="8,5" Margin="0,0,0,3"
MouseLeftButtonUp="SidebarCodeCategory_MouseLeftButtonUp">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="&#xE943;" FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="#3B82F6" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="코드 작업 유형"
Foreground="{DynamicResource PrimaryText}"
FontSize="11.5" Margin="8,0,0,0" VerticalAlignment="Center"/>
<TextBlock Grid.Column="2" Text="&#xE70D;" FontFamily="Segoe MDL2 Assets" FontSize="9"
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
</Grid>
</Border>
</StackPanel>
</StackPanel>
</Border>
<!-- 대화 목록 -->
<ScrollViewer Grid.Row="4" VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled">
<StackPanel x:Name="ConversationPanel" Margin="8,0"/>
</ScrollViewer>
<!-- 하단: 삭제 -->
<Border Grid.Row="5" BorderBrush="{DynamicResource SeparatorColor}" BorderThickness="0,1,0,0"
Padding="0,4">
<Button x:Name="BtnDeleteAll" Style="{StaticResource GhostBtn}"
HorizontalAlignment="Center" VerticalAlignment="Center"
Click="BtnDeleteAll_Click">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE74D;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="#AA5555" VerticalAlignment="Center" Margin="0,0,6,0"/>
<TextBlock Text="전체 삭제" FontSize="11" Foreground="#AA5555"/>
</StackPanel>
</Button>
</Border>
<!-- 하단: 사용자 계정 -->
<Border Grid.Row="6" Margin="12,0,12,8">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Width="34" Height="34" CornerRadius="17"
Background="{DynamicResource AccentColor}" Margin="0,0,10,0">
<TextBlock x:Name="UserInitialSidebar" Text="U" FontSize="14" FontWeight="Bold"
Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<StackPanel Grid.Column="1" VerticalAlignment="Center">
<TextBlock x:Name="UserNameText" Text="" FontSize="12" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}"
TextTrimming="CharacterEllipsis"/>
<TextBlock x:Name="UserPcText" Text="" FontSize="10"
Foreground="{DynamicResource SecondaryText}"/>
</StackPanel>
<Button x:Name="BtnSidebarSettings"
Grid.Column="2"
Style="{StaticResource GhostBtn}"
Width="32" Height="32"
Margin="8,0,0,0"
VerticalAlignment="Center"
Click="BtnSettings_Click"
ToolTip="AX Agent 설정">
<TextBlock Text="&#xE713;"
FontFamily="Segoe MDL2 Assets"
FontSize="13"
Foreground="{DynamicResource SecondaryText}"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Button>
</Grid>
</Border>
</Grid>
</Border>
<!-- ══════════════════════════════════════════════════════ -->
<!-- 우측: 메시지 영역 -->
<!-- ══════════════════════════════════════════════════════ -->
<Grid Grid.Column="2">
<Grid.RowDefinitions>
<RowDefinition Height="48"/>
<RowDefinition Height="Auto"/> <!-- 서브 바: 제목 + 프리뷰 -->
<RowDefinition Height="Auto"/> <!-- 스티키 진행률 바 -->
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/> <!-- 입력 바 + Popup들 -->
<RowDefinition Height="Auto"/> <!-- 파일 탐색기 -->
<RowDefinition Height="Auto"/> <!-- 상태바 -->
</Grid.RowDefinitions>
<!-- ── 서브 바: 제목 + 프리뷰 버튼 (AX Agent 스타일) ── -->
<Border Grid.Row="1" Background="{DynamicResource LauncherBackground}"
BorderBrush="{DynamicResource SeparatorColor}" BorderThickness="0,0,0,1"
Padding="12,4,12,4">
<Grid>
<!-- 좌: 대화 제목 -->
<StackPanel Orientation="Vertical" HorizontalAlignment="Left" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<Grid VerticalAlignment="Center">
<TextBlock x:Name="ChatTitle" Text="" FontSize="13" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}"
VerticalAlignment="Center" TextTrimming="CharacterEllipsis"
MaxWidth="400" Cursor="Hand"
MouseLeftButtonDown="ChatTitle_MouseDown"
ToolTip="클릭하여 대화 이름 변경"/>
<TextBox x:Name="ChatTitleEdit" FontSize="13"
Foreground="{DynamicResource PrimaryText}"
Background="{DynamicResource HintBackground}"
CaretBrush="{DynamicResource AccentColor}"
BorderThickness="0" Padding="4,2"
MaxWidth="400" MinWidth="80"
Visibility="Collapsed"
LostFocus="ChatTitleEdit_LostFocus"
KeyDown="ChatTitleEdit_KeyDown"/>
</Grid>
<Border x:Name="ConversationStatusStrip" Visibility="Collapsed"
Margin="10,0,0,0" Padding="8,2"
CornerRadius="8"
Background="{DynamicResource HintBackground}"
BorderBrush="{DynamicResource BorderColor}" BorderThickness="1">
<TextBlock x:Name="ConversationStatusStripLabel" Text=""
FontSize="10" FontWeight="SemiBold"
Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center"/>
</Border>
</StackPanel>
<WrapPanel x:Name="ConversationQuickStrip" Visibility="Collapsed"
Margin="0,4,0,0">
<Button x:Name="BtnQuickRunningFilter" Style="{StaticResource GhostBtn}"
Padding="8,2" Margin="0,0,6,0"
Click="BtnQuickRunningFilter_Click"
Visibility="Collapsed"
IsEnabled="False">
<TextBlock x:Name="QuickRunningLabel" Text="진행"
FontSize="10" FontWeight="SemiBold"/>
</Button>
<Button x:Name="BtnQuickHotSort" Style="{StaticResource GhostBtn}"
Padding="8,2"
Click="BtnQuickHotSort_Click">
<TextBlock x:Name="QuickHotLabel" Text="활동"
FontSize="10" FontWeight="SemiBold"/>
</Button>
</WrapPanel>
</StackPanel>
<!-- 우: 프리뷰 토글 버튼 -->
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center">
<Button x:Name="BtnPreviewToggle" Style="{StaticResource GhostBtn}"
Click="BtnPreviewToggle_Click" ToolTip="미리보기 패널" Visibility="Collapsed"
Padding="8,4">
<StackPanel Orientation="Horizontal">
<Ellipse x:Name="PreviewDot" Width="6" Height="6" Fill="#22C55E"
Margin="0,0,5,0" VerticalAlignment="Center"/>
<TextBlock Text="미리보기" FontSize="12"
Foreground="{DynamicResource PrimaryText}"
VerticalAlignment="Center"/>
</StackPanel>
</Button>
</StackPanel>
</Grid>
</Border>
<!-- ── 에이전트 진행률 스티키 바 ── -->
<Border x:Name="AgentProgressBar" Grid.Row="2" Visibility="Collapsed"
Background="{DynamicResource HintBackground}"
BorderBrush="{DynamicResource SeparatorColor}" BorderThickness="0,0,0,1"
Padding="16,6,16,6">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<!-- 아이콘 -->
<TextBlock Grid.Column="0" x:Name="ProgressIcon"
Text="&#xE768;" FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center" Margin="0,0,8,0"/>
<!-- 단계 텍스트 -->
<TextBlock Grid.Column="1" x:Name="ProgressStepLabel"
Text="" FontSize="12"
Foreground="{DynamicResource PrimaryText}"
VerticalAlignment="Center" TextTrimming="CharacterEllipsis"
MaxWidth="300" Margin="0,0,12,0"/>
<!-- 프로그레스 바 -->
<Border Grid.Column="2" CornerRadius="3" Background="{DynamicResource ItemHoverBackground}"
Height="6" VerticalAlignment="Center" Margin="0,0,12,0">
<Border x:Name="ProgressFill" CornerRadius="3" HorizontalAlignment="Left"
Width="0" Background="{DynamicResource AccentColor}"/>
</Border>
<!-- 퍼센트 -->
<TextBlock Grid.Column="3" x:Name="ProgressPercent"
Text="0%" FontSize="11" FontWeight="SemiBold"
Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center" Margin="0,0,8,0" MinWidth="30" TextAlignment="Right"/>
<!-- 경과 시간 -->
<TextBlock Grid.Column="4" x:Name="ProgressElapsed"
Text="0:00" FontSize="10.5"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/>
</Grid>
</Border>
<!-- ── 상단 권한 알림 배너 ── -->
<Border x:Name="PermissionTopBanner"
Grid.Row="0" Grid.RowSpan="3"
Visibility="Collapsed"
Margin="16,94,16,0"
VerticalAlignment="Top"
Panel.ZIndex="20"
Background="{DynamicResource HintBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
CornerRadius="10"
Padding="10,8">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal">
<TextBlock x:Name="PermissionTopBannerIcon"
Text="&#xE7BA;"
FontFamily="Segoe MDL2 Assets"
FontSize="12"
Margin="0,0,8,0"
VerticalAlignment="Center"
Foreground="{DynamicResource AccentColor}"/>
<StackPanel>
<TextBlock x:Name="PermissionTopBannerTitle"
Text="현재 권한 모드"
FontSize="12"
FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}"/>
<TextBlock x:Name="PermissionTopBannerText"
Text=""
FontSize="11"
TextWrapping="Wrap"
MaxWidth="760"
Foreground="{DynamicResource SecondaryText}"/>
</StackPanel>
</StackPanel>
<Button x:Name="BtnPermissionTopBannerClose"
Grid.Column="1"
Style="{StaticResource GhostBtn}"
Padding="2"
Cursor="Hand"
Click="BtnPermissionTopBannerClose_Click"
ToolTip="닫기">
<TextBlock Text="&#xE711;"
FontFamily="Segoe MDL2 Assets"
FontSize="9"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
</Grid>
</Border>
<!-- ── 상단 바: 토글 | 탭(중앙) | 설정+닫기 ── -->
<Border Grid.Row="0" Background="{DynamicResource LauncherBackground}"
BorderBrush="{DynamicResource SeparatorColor}" BorderThickness="0,0,0,1">
<Grid>
<!-- 좌: 사이드바 토글 -->
<Button x:Name="BtnToggleSidebar" Style="{StaticResource GhostBtn}"
HorizontalAlignment="Left" VerticalAlignment="Center" Margin="8,0"
Click="BtnToggleSidebar_Click" ToolTip="사이드바 열기/닫기"
WindowChrome.IsHitTestVisibleInChrome="True">
<TextBlock x:Name="ToggleSidebarIcon" Text="&#xE76B;" FontFamily="Segoe MDL2 Assets" FontSize="18"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
<!-- 중앙: 탭 메뉴 -->
<Border HorizontalAlignment="Center" VerticalAlignment="Center"
Background="{DynamicResource HintBackground}"
CornerRadius="10" Padding="3"
WindowChrome.IsHitTestVisibleInChrome="True">
<StackPanel Orientation="Horizontal">
<RadioButton x:Name="TabChat" Content="Chat" Style="{StaticResource TopTabBtn}"
IsChecked="True" GroupName="TopTab"
Checked="TabChat_Checked"/>
<RadioButton x:Name="TabCowork" Content="Cowork" Style="{StaticResource TopTabBtn}"
GroupName="TopTab"
Checked="TabCowork_Checked"/>
<RadioButton x:Name="TabCode" Content="Code" Style="{StaticResource TopTabBtn}"
GroupName="TopTab"
Checked="TabCode_Checked"/>
</StackPanel>
</Border>
<!-- 우: 최소화 + 최대화 + 닫기 -->
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right"
VerticalAlignment="Center" Margin="0,0,4,0"
WindowChrome.IsHitTestVisibleInChrome="True">
<Button Style="{StaticResource GhostBtn}" Click="BtnMinimize_Click" ToolTip="최소화">
<TextBlock Text="&#xE921;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
<Button Style="{StaticResource GhostBtn}" Click="BtnMaximize_Click" ToolTip="최대화">
<TextBlock x:Name="MaximizeIcon" Text="&#xE739;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
<Button Style="{StaticResource GhostBtn}" Click="BtnClose_Click" ToolTip="닫기">
<TextBlock Text="&#xE711;" FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
</StackPanel>
</Grid>
</Border>
<!-- ── 메시지 내 검색 바 (Ctrl+F) ── -->
<Border x:Name="MessageSearchBar" Grid.Row="3" Visibility="Collapsed"
Panel.ZIndex="5" VerticalAlignment="Top"
Background="{DynamicResource HintBackground}"
BorderBrush="{DynamicResource SeparatorColor}" BorderThickness="0,0,0,1"
Padding="12,6" Margin="40,0,40,0" CornerRadius="0,0,10,10">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="&#xE721;" FontFamily="Segoe MDL2 Assets" FontSize="13"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="0,0,8,0"/>
<TextBox x:Name="SearchTextBox" Grid.Column="1"
FontSize="12.5" Padding="4,3"
Background="Transparent" Foreground="{DynamicResource PrimaryText}"
BorderThickness="0"
TextChanged="SearchTextBox_TextChanged"/>
<TextBlock x:Name="SearchResultCount" Grid.Column="2"
Text="" FontSize="11"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="8,0"/>
<Button Grid.Column="3" Style="{StaticResource GhostBtn}" Padding="4"
Click="SearchPrev_Click" ToolTip="이전 (Shift+Enter)">
<TextBlock Text="&#xE70E;" FontFamily="Segoe MDL2 Assets" FontSize="10"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
<Button Grid.Column="4" Style="{StaticResource GhostBtn}" Padding="4"
Click="SearchNext_Click" ToolTip="다음 (Enter)">
<TextBlock Text="&#xE70D;" FontFamily="Segoe MDL2 Assets" FontSize="10"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
<Button Grid.Column="5" Style="{StaticResource GhostBtn}" Padding="4"
Click="SearchClose_Click" ToolTip="닫기 (Esc)">
<TextBlock Text="&#xE711;" FontFamily="Segoe MDL2 Assets" FontSize="9"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
</Grid>
</Border>
<!-- ── 메시지 스크롤 ── -->
<ScrollViewer x:Name="MessageScroll" Grid.Row="3"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled"
Background="{DynamicResource LauncherBackground}">
<StackPanel x:Name="MessagePanel"
Margin="0,34,0,22"
HorizontalAlignment="Stretch">
<StackPanel.RenderTransform>
<TranslateTransform/>
</StackPanel.RenderTransform>
</StackPanel>
</ScrollViewer>
<!-- 빈 상태 -->
<StackPanel x:Name="EmptyState" Grid.Row="3"
HorizontalAlignment="Center" VerticalAlignment="Center"
MaxWidth="520">
<!-- 부유 AI 아이콘 -->
<Border x:Name="EmptyIcon" CornerRadius="24" Width="72" Height="72"
HorizontalAlignment="Center" Margin="0,0,0,20">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#4B5EFC" Offset="0"/>
<GradientStop Color="#8B6DFF" Offset="1"/>
</LinearGradientBrush>
</Border.Background>
<Border.RenderTransform>
<TranslateTransform x:Name="EmptyIconTranslate"/>
</Border.RenderTransform>
<Border.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard RepeatBehavior="Forever" AutoReverse="True">
<DoubleAnimation Storyboard.TargetName="EmptyIconTranslate"
Storyboard.TargetProperty="Y"
From="0" To="-6" Duration="0:0:1.8">
<DoubleAnimation.EasingFunction>
<SineEase EasingMode="EaseInOut"/>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Border.Triggers>
<TextBlock Text="&#xE8BD;" FontFamily="Segoe MDL2 Assets" FontSize="30"
Foreground="White"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<TextBlock x:Name="EmptyStateTitle" Text="작업 유형을 선택하세요" FontSize="18" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}" HorizontalAlignment="Center"/>
<TextBlock x:Name="EmptyStateDesc" Text="주제에 맞는 전문 프리셋이 자동 적용됩니다"
FontSize="12" Foreground="{DynamicResource SecondaryText}"
HorizontalAlignment="Center" Margin="0,8,0,24"/>
<!-- 대화 주제 버튼 (프리셋에서 동적 생성) -->
<WrapPanel x:Name="TopicButtonPanel" HorizontalAlignment="Center"
Margin="0,0,0,0"/>
</StackPanel>
<!-- ── 프롬프트 템플릿 팝업 ── -->
<Popup x:Name="TemplatePopup" Grid.Row="4"
PlacementTarget="{Binding ElementName=InputBorder}"
Placement="Top" StaysOpen="False"
AllowsTransparency="True" PopupAnimation="Fade">
<Border Background="{DynamicResource LauncherBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1" CornerRadius="10"
Padding="4" MinWidth="260" MaxWidth="400">
<StackPanel>
<TextBlock Text="프롬프트 템플릿" FontSize="12" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}"
Margin="10,8,10,6"/>
<ItemsControl x:Name="TemplateItems"/>
<TextBlock x:Name="TemplateEmptyHint"
Text="등록된 템플릿이 없습니다. 설정에서 추가하세요."
FontSize="11" Foreground="{DynamicResource SecondaryText}"
Margin="10,4,10,8" Visibility="Collapsed"/>
</StackPanel>
</Border>
</Popup>
<!-- ── 권한 선택 팝업 ── -->
<Popup x:Name="PermissionPopup" Grid.Row="4"
PlacementTarget="{Binding ElementName=BtnPermission}"
Placement="Top" StaysOpen="False"
AllowsTransparency="True" PopupAnimation="Fade">
<Border Background="{DynamicResource LauncherBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1" CornerRadius="16"
Padding="8" MinWidth="320">
<Border.Effect>
<DropShadowEffect BlurRadius="18" ShadowDepth="0" Opacity="0.14"/>
</Border.Effect>
<StackPanel x:Name="PermissionItems" Margin="2"/>
</Border>
</Popup>
<!-- ── 데이터 활용 수준 팝업 ── -->
<Popup x:Name="DataUsagePopup" Grid.Row="4"
PlacementTarget="{Binding ElementName=BtnDataUsage}"
Placement="Top" StaysOpen="False"
AllowsTransparency="True" PopupAnimation="Fade">
<Border Background="{DynamicResource LauncherBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1" CornerRadius="12"
Padding="6" MinWidth="280">
<StackPanel x:Name="DataUsageItems" Margin="2"/>
</Border>
</Popup>
<!-- ── 슬래시 명령어 팝업 ── -->
<Popup x:Name="SlashPopup" Grid.Row="4"
PlacementTarget="{Binding ElementName=InputBorder}"
Placement="Top" StaysOpen="False"
AllowsTransparency="True" PopupAnimation="Fade">
<Border Background="{DynamicResource LauncherBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1" CornerRadius="18"
Padding="0" MinWidth="620" MaxWidth="780"
PreviewMouseWheel="SlashPopup_PreviewMouseWheel">
<Border.Effect>
<DropShadowEffect BlurRadius="16" ShadowDepth="0" Opacity="0.16"/>
</Border.Effect>
<StackPanel>
<Border Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="0,0,0,1"
CornerRadius="18,18,0,0"
Padding="14,12,14,10">
<StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" Grid.Column="0">
<Border Background="{DynamicResource AccentColor}"
CornerRadius="8"
Padding="6,2"
Margin="0,0,8,0"
VerticalAlignment="Center">
<TextBlock Text="/"
FontSize="12"
FontWeight="SemiBold"
Foreground="White"/>
</Border>
<TextBlock x:Name="SlashPopupTitle"
Text="명령 및 스킬"
FontSize="13.5"
FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}"
VerticalAlignment="Center"/>
</StackPanel>
<Button Grid.Column="1"
x:Name="BtnSlashReset"
Click="BtnSlashReset_Click"
Style="{StaticResource GhostBtn}"
Padding="8,4"
Margin="0,0,6,0"
ToolTip="핀/최근 정리">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE74D;"
FontFamily="Segoe MDL2 Assets"
FontSize="10.5"
Foreground="{DynamicResource SecondaryText}"
Margin="0,0,4,0"/>
<TextBlock Text="정리"
FontSize="11.5"
Foreground="{DynamicResource SecondaryText}"/>
</StackPanel>
</Button>
<Button Grid.Column="2"
x:Name="BtnSlashToggleGroups"
Click="BtnSlashToggleGroups_Click"
Style="{StaticResource GhostBtn}"
Padding="8,4"
ToolTip="명령/스킬 그룹 전체 접기 또는 펼치기">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE70D;"
FontFamily="Segoe MDL2 Assets"
FontSize="10.5"
Foreground="{DynamicResource SecondaryText}"
Margin="0,0,4,0"/>
<TextBlock x:Name="SlashToggleGroupsLabel"
Text="전체 접기"
FontSize="11.5"
Foreground="{DynamicResource SecondaryText}"/>
</StackPanel>
</Button>
</Grid>
<TextBlock x:Name="SlashPopupHint"
Text="방향키나 마우스 휠로 이동하고 Enter로 바로 실행합니다"
FontSize="11.5"
Foreground="{DynamicResource SecondaryText}"
Margin="0,6,0,0"/>
</StackPanel>
</Border>
<ScrollViewer x:Name="SlashScrollViewer"
MaxHeight="420"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled"
CanContentScroll="False"
PanningMode="VerticalOnly"
PreviewMouseWheel="SlashPopup_PreviewMouseWheel"
Padding="10,10,10,8">
<ItemsControl x:Name="SlashItems"/>
</ScrollViewer>
<TextBlock x:Name="SlashPopupFooter"
Margin="14,0,14,12"
Text="Enter 실행 · ↑↓ 이동 · 휠 스크롤 · Esc 닫기"
FontSize="10.5"
Foreground="{DynamicResource SecondaryText}"/>
</StackPanel>
</Border>
</Popup>
<!-- ── 폴더 선택 팝업 ── -->
<Popup x:Name="FolderMenuPopup" Grid.Row="4"
PlacementTarget="{Binding ElementName=FolderPathLabel}"
Placement="Top" StaysOpen="False"
AllowsTransparency="True" PopupAnimation="Fade">
<Border Background="{DynamicResource LauncherBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1" CornerRadius="12"
Padding="6" MinWidth="300" MaxWidth="460">
<StackPanel x:Name="FolderMenuItems" Margin="2"/>
</Border>
</Popup>
<!-- ── 토스트 알림 ── -->
<Border x:Name="ToastBorder" Grid.Row="3" Visibility="Collapsed"
Panel.ZIndex="20"
HorizontalAlignment="Center" VerticalAlignment="Bottom"
Margin="0,0,0,16"
Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource BorderColor}" BorderThickness="1"
CornerRadius="20"
Padding="16,8,16,8" Opacity="0"
IsHitTestVisible="False">
<StackPanel Orientation="Horizontal">
<TextBlock x:Name="ToastIcon" Text="&#xE73E;" FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="{DynamicResource AccentColor}" VerticalAlignment="Center" Margin="0,0,6,0"/>
<TextBlock x:Name="ToastText" Text="" FontSize="12"
Foreground="{DynamicResource PrimaryText}" VerticalAlignment="Center"/>
</StackPanel>
</Border>
<!-- ── 입력 바 ── -->
<Border Grid.Row="4" Margin="48,0,48,20">
<StackPanel>
<Border x:Name="DraftPreviewCard"
Visibility="Collapsed"
Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
CornerRadius="18"
Padding="12,10,12,10"
Margin="0,0,0,10">
<Border.Effect>
<DropShadowEffect BlurRadius="14" ShadowDepth="0" Opacity="0.06"/>
</Border.Effect>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<TextBlock Text="후속 요청"
FontSize="10.5"
Foreground="{DynamicResource SecondaryText}"/>
<TextBlock x:Name="DraftPreviewText"
FontSize="12.5"
Foreground="{DynamicResource PrimaryText}"
Margin="0,4,0,0"
TextTrimming="CharacterEllipsis"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Top">
<Button x:Name="BtnDraftEnqueue"
Style="{StaticResource GhostBtn}"
Padding="6,4"
Margin="0,0,4,0"
Click="BtnDraftEnqueue_Click"
ToolTip="대기열에 추가">
<TextBlock Text="&#xE710;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
<Button x:Name="BtnDraftEdit"
Style="{StaticResource GhostBtn}"
Padding="6,4"
Margin="0,0,4,0"
Click="BtnDraftEdit_Click"
ToolTip="메시지 편집">
<TextBlock Text="&#xE70F;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
<Button x:Name="BtnDraftClear"
Style="{StaticResource GhostBtn}"
Padding="6,4"
Click="BtnDraftClear_Click"
ToolTip="대기열 끄기">
<TextBlock Text="&#xE711;" FontFamily="Segoe MDL2 Assets" FontSize="10"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
</StackPanel>
</Grid>
</Border>
<!-- 무지개 글로우 + 입력 영역 (겹침 레이아웃) -->
<Grid>
<!-- 무지개 글로우 외부 테두리 (메시지 전송 시 애니메이션) -->
<StackPanel x:Name="DraftQueuePanel"
Visibility="Collapsed"
Margin="0,0,0,10"/>
<Border x:Name="InputGlowBorder" CornerRadius="26" Opacity="0"
Margin="-3" IsHitTestVisible="False">
<Border.BorderBrush>
<LinearGradientBrush x:Name="RainbowBrush" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#FF6B6B" Offset="0.0"/>
<GradientStop Color="#FECA57" Offset="0.17"/>
<GradientStop Color="#48DBFB" Offset="0.33"/>
<GradientStop Color="#FF9FF3" Offset="0.5"/>
<GradientStop Color="#54A0FF" Offset="0.67"/>
<GradientStop Color="#5F27CD" Offset="0.83"/>
<GradientStop Color="#FF6B6B" Offset="1.0"/>
</LinearGradientBrush>
</Border.BorderBrush>
<Border.BorderThickness>
<Thickness>3</Thickness>
</Border.BorderThickness>
<Border.Effect>
<BlurEffect Radius="6"/>
</Border.Effect>
</Border>
<!-- 실제 입력 영역 -->
<Border x:Name="InputBorder"
Background="{DynamicResource ItemBackground}"
CornerRadius="24" Padding="7"
BorderBrush="{DynamicResource BorderColor}" BorderThickness="1">
<Border.Effect>
<DropShadowEffect BlurRadius="18" ShadowDepth="0" Opacity="0.08"/>
</Border.Effect>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- Row 0: 모델 셀렉터 + 템플릿 버튼 -->
<Grid Grid.Row="0" Margin="6,1,6,2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Button x:Name="BtnModelSelector"
Style="{StaticResource OutlineHoverBtn}"
Grid.Column="0"
HorizontalAlignment="Left"
Margin="0"
MinHeight="28"
Padding="10,3"
Click="BtnModelSelector_Click"
ToolTip="모델/추론 빠른 설정"
WindowChrome.IsHitTestVisibleInChrome="True">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xEA86;" FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="0,0,5,0"/>
<TextBlock x:Name="ModelLabel" FontSize="12.5"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/>
<TextBlock Text="&#xE70D;" FontFamily="Segoe MDL2 Assets" FontSize="9"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="4,1,0,0"/>
</StackPanel>
</Button>
<Button x:Name="BtnTemplateSelector"
Style="{StaticResource OutlineHoverBtn}"
Grid.Column="2"
HorizontalAlignment="Right"
Margin="0"
MinHeight="28"
MinWidth="64"
Padding="8,3"
Click="BtnTemplateSelector_Click"
ToolTip="프롬프트 템플릿"
WindowChrome.IsHitTestVisibleInChrome="True">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE8A5;" FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="0,0,5,0"/>
<TextBlock Text="프리셋" FontSize="12"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/>
<TextBlock Text="&#xE70D;" FontFamily="Segoe MDL2 Assets" FontSize="8"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="4,1,0,0"/>
</StackPanel>
</Button>
</Grid>
<!-- Row 1: 통합 설정 패널 -->
<Border x:Name="InlineSettingsPanel"
Grid.Row="1"
Margin="8,3,8,4"
Padding="10,9,10,8"
CornerRadius="12"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
Background="{DynamicResource SecondaryBackground}"
Visibility="Collapsed">
<StackPanel>
<Grid Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
Text="채팅 설정"
FontSize="12"
FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}"
VerticalAlignment="Center"/>
<TextBlock Grid.Column="1"
x:Name="InlineSettingsHintText"
Margin="8,0,0,0"
Text="모델/권한 핵심 옵션"
FontSize="11"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/>
<Button Grid.Column="2"
x:Name="BtnInlineSettingsClose"
Style="{StaticResource GhostBtn}"
Padding="6,3"
Click="BtnInlineSettingsClose_Click"
ToolTip="설정 패널 닫기">
<TextBlock Text="&#xE711;"
FontFamily="Segoe MDL2 Assets"
FontSize="10"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
</Grid>
<Grid Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
Text="서비스"
Margin="0,0,8,0"
VerticalAlignment="Center"
FontSize="11"
Foreground="{DynamicResource SecondaryText}"/>
<ComboBox Grid.Column="1"
x:Name="CmbInlineService"
MinWidth="130"
Height="28"
SelectionChanged="CmbInlineService_SelectionChanged"/>
<TextBlock Grid.Column="2"
Text="모델"
Margin="12,0,8,0"
VerticalAlignment="Center"
FontSize="11"
Foreground="{DynamicResource SecondaryText}"/>
<ComboBox Grid.Column="3"
x:Name="CmbInlineModel"
Height="28"
SelectionChanged="CmbInlineModel_SelectionChanged"/>
</Grid>
<WrapPanel x:Name="InlineSettingsQuickActions">
<Button x:Name="BtnInlineFastMode"
Style="{StaticResource OutlineHoverBtn}"
Margin="0,0,6,6"
Padding="10,5"
Click="BtnInlineFastMode_Click"/>
<Button x:Name="BtnInlineReasoning"
Style="{StaticResource OutlineHoverBtn}"
Margin="0,0,6,6"
Padding="10,5"
Click="BtnInlineReasoning_Click"/>
<Button x:Name="BtnInlinePlanMode"
Style="{StaticResource OutlineHoverBtn}"
Margin="0,0,6,6"
Padding="10,5"
Click="BtnInlinePlanMode_Click"/>
<Button x:Name="BtnInlinePermission"
Style="{StaticResource OutlineHoverBtn}"
Margin="0,0,6,6"
Padding="10,5"
Click="BtnInlinePermission_Click"/>
<Button x:Name="BtnInlineSkill"
Style="{StaticResource OutlineHoverBtn}"
Margin="0,0,6,6"
Padding="10,5"
Click="BtnInlineSkill_Click"
Visibility="Collapsed"/>
<Button x:Name="BtnInlineCommandBrowser"
Style="{StaticResource OutlineHoverBtn}"
Margin="0,0,6,6"
Padding="10,5"
Click="BtnInlineCommandBrowser_Click"
Visibility="Collapsed"/>
<Button x:Name="BtnInlineMcp"
Style="{StaticResource OutlineHoverBtn}"
Margin="0,0,6,6"
Padding="10,5"
Click="BtnInlineMcp_Click"
Visibility="Collapsed"/>
</WrapPanel>
</StackPanel>
</Border>
<!-- Row 2: 첨부 파일 목록 -->
<ItemsControl x:Name="AttachedFilesPanel" Grid.Row="2"
Margin="8,0,8,2" Visibility="Collapsed">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<!-- 입력 영역 (Row 3) -->
<Grid Grid.Row="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid Grid.Column="0">
<TextBox x:Name="InputBox"
FontSize="14" FontFamily="Segoe UI, Malgun Gothic"
Foreground="{DynamicResource PrimaryText}"
Background="Transparent"
CaretBrush="{DynamicResource AccentColor}"
BorderThickness="0" Padding="14,10"
VerticalContentAlignment="Top"
AcceptsReturn="True"
PreviewKeyDown="InputBox_PreviewKeyDown"
TextChanged="InputBox_TextChanged"
TextWrapping="Wrap"
MinHeight="40" MaxHeight="160"
VerticalScrollBarVisibility="Auto"/>
<!-- 워터마크 (프롬프트 카드 안내문구) -->
<TextBlock x:Name="InputWatermark"
FontSize="14" FontFamily="Segoe UI, Malgun Gothic"
Foreground="{DynamicResource SecondaryText}"
Padding="14,10" IsHitTestVisible="False"
TextWrapping="Wrap" Opacity="0.7"
Visibility="Collapsed"/>
<!-- 슬래시 명령어 칩 (명령 선택 후 표시) -->
<Border x:Name="SlashCommandChip"
HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="10,7,0,0" Visibility="Collapsed"
CornerRadius="7" Padding="8,3,4,3"
Background="{DynamicResource ItemHoverBackground}"
IsHitTestVisible="True">
<StackPanel Orientation="Horizontal">
<TextBlock x:Name="SlashChipText"
FontSize="12.5" FontWeight="SemiBold"
Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center"/>
<Border x:Name="SlashChipClose" Cursor="Hand"
Padding="4,0,2,0" Margin="2,0,0,0"
VerticalAlignment="Center">
<TextBlock Text="&#xE711;"
FontFamily="Segoe MDL2 Assets"
FontSize="8" Foreground="{DynamicResource AccentColor}"/>
</Border>
</StackPanel>
</Border>
</Grid>
<!-- 파일 첨부 -->
<Button x:Name="BtnAttach" Style="{StaticResource GhostBtn}" Grid.Column="1"
Width="36" Height="36" Margin="0,0,2,0" VerticalAlignment="Bottom"
Click="BtnAttach_Click" ToolTip="파일 첨부"
WindowChrome.IsHitTestVisibleInChrome="True"
AllowDrop="True">
<TextBlock Text="&#xE723;" FontFamily="Segoe MDL2 Assets" FontSize="14"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
<!-- 내보내기 -->
<Button Style="{StaticResource GhostBtn}" Grid.Column="2"
Width="36" Height="36" Margin="0,0,2,0" VerticalAlignment="Bottom"
Click="BtnExport_Click" ToolTip="대화 내보내기"
WindowChrome.IsHitTestVisibleInChrome="True">
<TextBlock Text="&#xEDE1;" FontFamily="Segoe MDL2 Assets" FontSize="14"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
<!-- 일시정지 -->
<Border x:Name="BtnPause" Grid.Column="3"
Width="32" Height="32" Margin="0,0,2,0"
CornerRadius="8" Cursor="Hand"
Background="{DynamicResource ItemHoverBackground}" Visibility="Collapsed"
VerticalAlignment="Bottom"
MouseLeftButtonUp="BtnPause_Click"
ToolTip="일시정지 / 재개">
<TextBlock x:Name="PauseIcon" Text="&#xE769;"
FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="{DynamicResource AccentColor}"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<!-- 중지/전송 -->
<Button x:Name="BtnStop" Grid.Column="3"
Width="40" Height="40" Margin="4,0,4,0"
Cursor="Hand" Click="BtnStop_Click"
VerticalAlignment="Bottom" Visibility="Collapsed"
WindowChrome.IsHitTestVisibleInChrome="True">
<Button.Template>
<ControlTemplate TargetType="Button">
<Border Background="#DC2626" CornerRadius="20">
<TextBlock Text="&#xE71A;" FontFamily="Segoe MDL2 Assets"
FontSize="13" Foreground="White"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Button.Template>
</Button>
<Button x:Name="BtnSend" Grid.Column="4"
Width="40" Height="40" Margin="4,0,4,0"
Cursor="Hand" Click="BtnSend_Click"
VerticalAlignment="Bottom">
<Button.Template>
<ControlTemplate TargetType="Button">
<Border x:Name="Bd" Background="{DynamicResource AccentColor}"
CornerRadius="20">
<TextBlock Text="&#xE724;" FontFamily="Segoe MDL2 Assets"
FontSize="13" Foreground="White"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd" Property="Opacity" Value="0.85"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="Bd" Property="Opacity" Value="0.3"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
</Button>
</Grid>
</Grid>
</Border>
</Grid> <!-- 글로우 + 입력 Grid 닫기 -->
<!-- ── 폴더 바 + 권한 메뉴 (입력 하단, Cowork/Code 탭 전용) ── -->
<Border x:Name="FolderBar" Visibility="Collapsed"
Margin="4,4,4,0" MinHeight="34">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/> <!-- 0: 폴더 아이콘 -->
<ColumnDefinition Width="*"/> <!-- 1: 폴더 경로 -->
<ColumnDefinition Width="Auto"/> <!-- 2: 폴더 해제 X -->
<ColumnDefinition Width="Auto"/> <!-- 3: 구분선 -->
<ColumnDefinition Width="Auto"/> <!-- 4: 포맷/디자인 -->
<ColumnDefinition Width="Auto"/> <!-- 5: 구분선 -->
<ColumnDefinition Width="Auto"/> <!-- 6: 데이터 활용 -->
<ColumnDefinition Width="Auto"/> <!-- 7: 구분선 -->
<ColumnDefinition Width="Auto"/> <!-- 8: 권한 -->
</Grid.ColumnDefinitions>
<!-- 폴더 아이콘 -->
<TextBlock Grid.Column="0" Text="&#xED25;" FontFamily="Segoe MDL2 Assets" FontSize="14"
Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center" Margin="6,0,4,0"/>
<!-- 폴더 경로 (클릭 시 최근 폴더 메뉴) -->
<TextBlock x:Name="FolderPathLabel" Grid.Column="1"
Text="폴더를 선택하세요" FontSize="13"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" TextTrimming="CharacterEllipsis"
Cursor="Hand" MouseLeftButtonUp="FolderPathLabel_Click"
ToolTip="클릭하여 폴더 변경"/>
<!-- 폴더 해제 -->
<Button Grid.Column="2" Style="{StaticResource GhostBtn}"
Padding="6,4" Click="BtnFolderClear_Click" ToolTip="폴더 연결 해제">
<TextBlock Text="&#xE711;" FontFamily="Segoe MDL2 Assets" FontSize="10"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
<!-- 구분선 -->
<Border Grid.Column="3" Width="1" Height="18" Margin="4,0"
Background="{DynamicResource SeparatorColor}"/>
<!-- 포맷/디자인 드롭다운 (Cowork 전용, 코드비하인드에서 동적 생성) -->
<StackPanel x:Name="MoodIconPanel" Grid.Column="4" Orientation="Horizontal"
VerticalAlignment="Center"/>
<!-- 구분선 (포맷/디자인 뒤) -->
<Border x:Name="FormatMoodSeparator" Grid.Column="5" Width="1" Height="18" Margin="4,0"
Background="{DynamicResource SeparatorColor}" Visibility="Collapsed"/>
<!-- 데이터 활용 메뉴 -->
<Border x:Name="BtnDataUsage" Grid.Column="6" Cursor="Hand"
Background="Transparent" Padding="6,4"
MouseLeftButtonUp="BtnDataUsage_Click"
ToolTip="폴더 데이터 활용 수준">
<StackPanel Orientation="Horizontal">
<TextBlock x:Name="DataUsageIcon" Text="&#xE9F5;" FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="0,0,4,0"/>
<TextBlock x:Name="DataUsageLabel" Text="활용하지 않음" FontSize="12"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/>
</StackPanel>
</Border>
<!-- 구분선 -->
<Border Grid.Column="7" Width="1" Height="18" Margin="4,0"
Background="{DynamicResource SeparatorColor}"/>
<!-- 권한 메뉴 -->
<Button x:Name="BtnPermission" Grid.Column="8" Style="{StaticResource GhostBtn}"
Padding="6,4" Click="BtnPermission_Click" ToolTip="파일 접근 권한">
<StackPanel Orientation="Horizontal">
<TextBlock x:Name="PermissionIcon" Text="&#xE8D7;" FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="0,0,4,0"/>
<TextBlock x:Name="PermissionLabel" Text="활용하지 않음" FontSize="12"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/>
</StackPanel>
</Button>
</Grid>
</Border>
<!-- 포맷 선택 팝업 -->
<Popup x:Name="FormatMenuPopup" PlacementTarget="{Binding ElementName=BtnFormatMenu}"
Placement="Top" StaysOpen="False"
AllowsTransparency="True" PopupAnimation="Fade">
<Border Background="{DynamicResource LauncherBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1" CornerRadius="12"
Padding="6" MinWidth="200">
<StackPanel x:Name="FormatMenuItems" Margin="2"/>
</Border>
</Popup>
<!-- 디자인 선택 팝업 -->
<Popup x:Name="MoodMenuPopup" PlacementTarget="{Binding ElementName=BtnMoodMenu}"
Placement="Top" StaysOpen="False"
AllowsTransparency="True" PopupAnimation="Fade">
<Border Background="{DynamicResource LauncherBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1" CornerRadius="12"
Padding="6" MinWidth="380" MaxHeight="480">
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
<StackPanel x:Name="MoodMenuItems" Margin="2"/>
</ScrollViewer>
</Border>
</Popup>
</StackPanel>
</Border>
<!-- ── 파일 탐색기 패널 ── -->
<Border x:Name="FileBrowserPanel" Grid.Row="5" Visibility="Collapsed"
Background="{DynamicResource LauncherBackground}"
BorderBrush="{DynamicResource SeparatorColor}" BorderThickness="0,1,0,0"
MaxHeight="220">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- 툴바 -->
<Border Grid.Row="0" Background="{DynamicResource HintBackground}" Padding="8,4">
<Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock Text="&#xED25;" FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center" Margin="0,0,6,0"/>
<TextBlock x:Name="FileBrowserTitle" Text="파일 탐색기"
FontSize="11.5" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}"
VerticalAlignment="Center"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<Button Style="{StaticResource GhostBtn}" Padding="3"
Click="BtnFileBrowserRefresh_Click" ToolTip="새로고침" Cursor="Hand">
<TextBlock Text="&#xE72C;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
<Button Style="{StaticResource GhostBtn}" Padding="3"
Click="BtnFileBrowserOpenFolder_Click" ToolTip="탐색기에서 열기" Cursor="Hand">
<TextBlock Text="&#xE8A7;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
<Button Style="{StaticResource GhostBtn}" Padding="3"
Click="BtnFileBrowserClose_Click" ToolTip="닫기" Cursor="Hand">
<TextBlock Text="&#xE70D;" FontFamily="Segoe MDL2 Assets" FontSize="9"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
</StackPanel>
</Grid>
</Border>
<!-- 트리뷰 -->
<TreeView x:Name="FileTreeView" Grid.Row="1"
Background="Transparent" BorderThickness="0"
Foreground="{DynamicResource PrimaryText}"
FontSize="11.5" Padding="4,2"/>
</Grid>
</Border>
<!-- ── 하단 상태바 (AX Agent 스타일) ── -->
<Border Grid.Row="6" Background="{DynamicResource LauncherBackground}"
BorderBrush="{DynamicResource SeparatorColor}" BorderThickness="0,1,0,0"
Padding="12,4,12,4" Height="28">
<Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left"
VerticalAlignment="Center">
<!-- 상태 아이콘 (다이아몬드 + 애니메이션) -->
<TextBlock x:Name="StatusDiamond" Text="◆" FontSize="10"
Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center" Margin="0,0,6,0"
RenderTransformOrigin="0.5,0.5">
<TextBlock.RenderTransform>
<RotateTransform x:Name="StatusDiamondRotate" Angle="0"/>
</TextBlock.RenderTransform>
</TextBlock>
<TextBlock x:Name="StatusLabel" Text="대기 중" FontSize="11"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right"
VerticalAlignment="Center">
<Border x:Name="RuntimeActivityBadge" Visibility="Collapsed"
CornerRadius="4" Padding="5,2" Margin="0,0,8,0"
Background="{DynamicResource HintBackground}" ToolTip="현재 실행 중인 작업"
Cursor="Hand"
MouseLeftButtonUp="RuntimeTaskSummary_Click">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE945;" FontFamily="Segoe MDL2 Assets" FontSize="10"
Foreground="{DynamicResource AccentColor}" VerticalAlignment="Center" Margin="0,0,4,0"/>
<TextBlock x:Name="RuntimeActivityLabel" Text="실행 중 0"
FontSize="10" Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center"/>
</StackPanel>
</Border>
<TextBlock x:Name="LastCompletedLabel" Text=""
FontSize="10"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="0,0,8,0"
MaxWidth="220" TextTrimming="CharacterEllipsis"
Visibility="Collapsed"
Cursor="Hand"
MouseLeftButtonUp="RuntimeTaskSummary_Click"/>
<Button x:Name="BtnToggleExecutionLog" Style="{StaticResource GhostBtn}"
Padding="6,2" Margin="0,0,8,0"
Click="BtnToggleExecutionLog_Click"
ToolTip="실행 로그 표시/숨기기">
<StackPanel Orientation="Horizontal">
<TextBlock x:Name="ExecutionLogIcon" Text="&#xE7C1;"
FontFamily="Segoe MDL2 Assets" FontSize="10"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="0,0,4,0"/>
<TextBlock x:Name="ExecutionLogLabel" Text="실행 로그 0"
FontSize="10"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/>
</StackPanel>
</Button>
<Border x:Name="SubAgentIndicator" Visibility="Collapsed"
CornerRadius="4" Padding="5,2" Margin="0,0,8,0"
Background="{DynamicResource HintBackground}" ToolTip="실행 중인 서브에이전트">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE945;" FontFamily="Segoe MDL2 Assets" FontSize="10"
Foreground="{DynamicResource AccentColor}" VerticalAlignment="Center" Margin="0,0,4,0"/>
<TextBlock x:Name="SubAgentIndicatorLabel" Text="서브에이전트 0"
FontSize="10" Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center"/>
</StackPanel>
</Border>
<!-- 워크플로우 분석기 열기 버튼 (개발자 모드) -->
<Border x:Name="BtnShowAnalyzer" Visibility="Collapsed"
CornerRadius="4" Padding="5,2" Margin="0,0,8,0"
Background="{DynamicResource HintBackground}" Cursor="Hand" ToolTip="워크플로우 분석기"
MouseLeftButtonUp="BtnShowAnalyzer_Click">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE9D9;" FontFamily="Segoe MDL2 Assets" FontSize="10"
Foreground="{DynamicResource AccentColor}" VerticalAlignment="Center" Margin="0,0,4,0"/>
<TextBlock Text="분석기" FontSize="10" Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center"/>
</StackPanel>
</Border>
<TextBlock x:Name="StatusElapsed" Text="" FontSize="10"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="0,0,12,0"/>
<TextBlock x:Name="StatusTokens" Text="" FontSize="10"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/>
</StackPanel>
</Grid>
</Border>
</Grid>
<!-- ══ 미리보기 스플리터 (Column 3) ══ -->
<GridSplitter x:Name="PreviewSplitter" Grid.Column="3" Width="5"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Background="Transparent" Cursor="SizeWE" Visibility="Collapsed"
ShowsPreview="True"/>
<!-- ══ 문서 미리보기 패널 (Column 4) ══ -->
<!--
WebView2 에어스페이스 문제 해결:
탭 바와 WebView2 콘텐츠를 DockPanel으로 분리.
DockPanel.Dock="Top"인 탭 바는 별도 WPF 레이어로 렌더링되어
WebView2 HWND에 가려지지 않음.
-->
<Border x:Name="PreviewPanel" Grid.Column="4" Visibility="Collapsed"
Background="{DynamicResource LauncherBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1,0,0,0">
<DockPanel LastChildFill="True">
<!-- 탭 바 + 도구 버튼 (DockPanel.Top — WebView2 위에 독립 레이어) -->
<Border DockPanel.Dock="Top" Background="{DynamicResource HintBackground}"
BorderBrush="{DynamicResource BorderColor}" BorderThickness="0,0,0,1"
Padding="0" Panel.ZIndex="10" Focusable="True"
PreviewMouseDown="PreviewTabBar_PreviewMouseDown">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ScrollViewer Grid.Column="0" HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Disabled" CanContentScroll="True">
<StackPanel x:Name="PreviewTabPanel" Orientation="Horizontal"/>
</ScrollViewer>
<StackPanel Grid.Column="1" Orientation="Horizontal" Margin="4,0">
<Button x:Name="BtnOpenExternal" Style="{StaticResource GhostBtn}" Padding="6"
Click="BtnOpenExternal_Click" ToolTip="외부 프로그램으로 열기" Cursor="Hand">
<TextBlock Text="&#xE8A7;" FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="{DynamicResource SecondaryText}" IsHitTestVisible="False"/>
</Button>
<Button Style="{StaticResource GhostBtn}" Padding="6"
Click="BtnClosePreview_Click" ToolTip="미리보기 닫기" Cursor="Hand">
<TextBlock Text="&#xE711;" FontFamily="Segoe MDL2 Assets" FontSize="10"
Foreground="{DynamicResource SecondaryText}" IsHitTestVisible="False"/>
</Button>
</StackPanel>
</Grid>
</Border>
<!-- 미리보기 콘텐츠 영역 (DockPanel.Fill — WebView2는 여기에만 존재) -->
<Grid ClipToBounds="True">
<wv2:WebView2 x:Name="PreviewWebView" Visibility="Collapsed"/>
<ScrollViewer x:Name="PreviewTextScroll" Visibility="Collapsed"
VerticalScrollBarVisibility="Auto" Padding="12,8">
<TextBlock x:Name="PreviewTextBlock" TextWrapping="Wrap"
FontFamily="Consolas" FontSize="12"
Foreground="{DynamicResource PrimaryText}"/>
</ScrollViewer>
<DataGrid x:Name="PreviewDataGrid" Visibility="Collapsed"
AutoGenerateColumns="True" IsReadOnly="True"
HeadersVisibility="Column" GridLinesVisibility="All"
Background="Transparent" Foreground="{DynamicResource PrimaryText}"
BorderThickness="0" CanUserAddRows="False"
RowBackground="{DynamicResource HintBackground}" AlternatingRowBackground="{DynamicResource ItemHoverBackground}"
ColumnHeaderHeight="30" RowHeight="28" FontSize="11.5"/>
<TextBlock x:Name="PreviewEmpty" Text="미리보기할 파일이 없습니다"
HorizontalAlignment="Center" VerticalAlignment="Center"
FontSize="12" Foreground="{DynamicResource SecondaryText}"
Visibility="Collapsed"/>
</Grid>
</DockPanel>
</Border>
<!-- 리사이즈 그립 -->
<Thumb x:Name="ResizeGrip" Grid.Column="2"
Width="14" Height="14"
HorizontalAlignment="Right" VerticalAlignment="Bottom"
Cursor="SizeNWSE" Opacity="0.3"
DragDelta="ResizeGrip_DragDelta">
<Thumb.Template>
<ControlTemplate>
<TextBlock Text="&#xE740;" FontFamily="Segoe MDL2 Assets" FontSize="10"
Foreground="{DynamicResource SecondaryText}"/>
</ControlTemplate>
</Thumb.Template>
</Thumb>
</Grid>
</Border>
</Window>