diff --git a/README.md b/README.md index 3fed457..35934da 100644 --- a/README.md +++ b/README.md @@ -297,6 +297,7 @@ public class MyHandler : IActionHandler | AX Agent 설정창 오픈 안정화 | `ToggleSwitch`를 전역 리소스로 승격해 AX Agent 창 초기화 시 리소스 누락 예외를 방지하고, AX Agent 설정창에는 테마 사전만 안전 주입하도록 오픈 경로를 보강 | | 권한 순환/슬래시 스크롤 체감 보강 | `claw-code` 기준으로 권한 순환에서 고위험 `질문 없이 진행`을 기본 순환에서 분리하고, `/` 팝업 휠 스크롤 시 뷰포트 기준 선택 동기화를 추가해 스크롤 사용성을 개선 | | 권한 팝업 상세영역 단순화 | 권한 팝업의 `요약/예외/최근거부`를 개별 섹션에서 단일 `상세 정보` 섹션으로 통합해 기본 화면 밀도를 낮추고 핵심 모드 선택 흐름을 우선화 | +| 권한 팝업 밀도/정렬 미세조정 | 권한 행의 패딩·폰트·아이콘·체크마크 간격을 컴팩트하게 재정렬하고 요약 카드 타이포를 축소해 `claw-code` 스타일의 빠른 스캔 밀도를 강화 | | Slash palette 상태 분리 시작 | `ChatWindow`에 몰려 있던 slash 상태를 `SlashPaletteState`로 분리해 이후 Codex/Claude형 composer 개편 기반 마련 | | 런처 이미지 미리보기 추가 | `#` 클립보드 이미지 항목에서 `Shift+Enter`로 전용 미리보기 창을 열고, 줌·원본 해상도 확인·PNG/JPEG/BMP 저장·클립보드 복사를 지원 | | 검증 | `dotnet build` 경고 0 / 오류 0, `dotnet test` 436 passed / 0 failed | diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index f8a08db..349008d 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -3759,3 +3759,23 @@ else: - 초기 빌드에서 WPF 임시 산출물(`wpftmp/.g.cs`) 누락 이슈를 확인했고, `dotnet clean` 후 재빌드로 정상 복구. - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` 통과 (경고 0, 오류 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false --filter "ChatWindowSlashPolicyTests|OperationModePolicyTests|OperationModeReadinessTests"` 통과 (65 passed, 0 failed). + +## 2026-04-04 추가 진행 기록 (연속 실행 47차: 권한 팝업 밀도/정렬 미세조정) + +업데이트: 2026-04-04 16:58 (KST) + +### 1) 권한 행 컴팩트 정렬 +- 권한 모드 행의 레이아웃 값을 미세 조정: + - 행 패딩/마진 축소 + - 아이콘 크기/좌우 간격 축소 + - 체크마크 간격 축소 + - 제목/설명 폰트와 줄간격 축소 +- 목표: 한 화면에서 더 많은 권한 항목을 안정적으로 스캔 가능하도록 밀도 개선. + +### 2) 요약 카드 타이포 균형 조정 +- 상단 요약 카드의 제목/본문 폰트와 여백을 한 단계 축소해 본문 과점유를 줄임. +- 효과: 권한 팝업 첫 진입 시 핵심 모드 리스트 가시성 향상. + +### 3) 품질 게이트 +- `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` 통과 (경고 0, 오류 0). +- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false --filter "ChatWindowSlashPolicyTests|OperationModePolicyTests|OperationModeReadinessTests"` 통과 (65 passed, 0 failed). diff --git a/src/AxCopilot/Views/ChatWindow.xaml.cs b/src/AxCopilot/Views/ChatWindow.xaml.cs index 6ad52c2..7fdf574 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml.cs +++ b/src/AxCopilot/Views/ChatWindow.xaml.cs @@ -1664,7 +1664,7 @@ public partial class ChatWindow : Window { Background = Brushes.Transparent, CornerRadius = new CornerRadius(6), - Padding = new Thickness(7, 4, 7, 4), + Padding = new Thickness(8, 5, 8, 5), Cursor = Cursors.Hand, Focusable = true, Child = headerGrid, @@ -1722,8 +1722,8 @@ public partial class ChatWindow : Window : BrushFromHex("#C7D2FE"), BorderThickness = new Thickness(1), CornerRadius = new CornerRadius(8), - Padding = new Thickness(9, 7, 9, 7), - Margin = new Thickness(0, 0, 0, 5), + Padding = new Thickness(8, 6, 8, 6), + Margin = new Thickness(0, 0, 0, 4), Child = new StackPanel { Children = @@ -1731,7 +1731,7 @@ public partial class ChatWindow : Window new TextBlock { Text = $"현재 권한 모드 · {PermissionModeCatalog.ToDisplayLabel(summary.EffectiveMode)}", - FontSize = 11.5, + FontSize = 11, FontWeight = FontWeights.SemiBold, Foreground = string.Equals(summary.RiskLevel, "high", StringComparison.OrdinalIgnoreCase) ? BrushFromHex("#C2410C") @@ -1742,8 +1742,8 @@ public partial class ChatWindow : Window new TextBlock { Text = $"{summary.Description} 기본값 {PermissionModeCatalog.ToDisplayLabel(summary.DefaultMode)} · 예외 {summary.OverrideCount}개", - FontSize = 9.5, - Margin = new Thickness(0, 3, 0, 0), + FontSize = 9, + Margin = new Thickness(0, 2, 0, 0), Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, TextTrimming = TextTrimming.CharacterEllipsis, MaxWidth = 260, @@ -1935,8 +1935,8 @@ public partial class ChatWindow : Window BorderBrush = isActive ? BrushFromHex("#C7D2FE") : Brushes.Transparent, BorderThickness = new Thickness(1), CornerRadius = new CornerRadius(8), - Padding = new Thickness(9, 5, 9, 5), - Margin = new Thickness(0, 1.5, 0, 1.5), + Padding = new Thickness(8, 4, 8, 4), + Margin = new Thickness(0, 1, 0, 1), Cursor = Cursors.Hand, Focusable = true, }; @@ -1951,9 +1951,9 @@ public partial class ChatWindow : Window { Text = item.Icon, FontFamily = new FontFamily("Segoe MDL2 Assets"), - FontSize = 13, + FontSize = 12, Foreground = BrushFromHex(item.ColorHex), - Margin = new Thickness(2, 0, 9, 0), + Margin = new Thickness(1, 0, 8, 0), VerticalAlignment = VerticalAlignment.Center, }); @@ -1961,18 +1961,18 @@ public partial class ChatWindow : Window textStack.Children.Add(new TextBlock { Text = item.Title, - FontSize = 11, + FontSize = 10.5, FontWeight = FontWeights.SemiBold, Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.White, }); textStack.Children.Add(new TextBlock { Text = item.Description, - FontSize = 9.5, - Margin = new Thickness(0, 1.5, 0, 0), + FontSize = 9, + Margin = new Thickness(0, 1, 0, 0), Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, TextWrapping = TextWrapping.Wrap, - LineHeight = 13.5, + LineHeight = 13, MaxWidth = 230, }); Grid.SetColumn(textStack, 1); @@ -1982,11 +1982,11 @@ public partial class ChatWindow : Window { Text = isActive ? "\uE73E" : "", FontFamily = new FontFamily("Segoe MDL2 Assets"), - FontSize = 11.5, + FontSize = 11, FontWeight = FontWeights.Bold, Foreground = BrushFromHex("#2563EB"), VerticalAlignment = VerticalAlignment.Center, - Margin = new Thickness(10, 0, 1, 0), + Margin = new Thickness(8, 0, 1, 0), }; Grid.SetColumn(check, 2); row.Children.Add(check);