권한 팝업 밀도/정렬 미세조정: 핵심 모드 스캔 속도 개선
Some checks failed
Release Gate / gate (push) Has been cancelled

- 권한 행 패딩/마진, 아이콘/체크마크 간격, 제목/설명 타이포를 컴팩트하게 재정렬\n- 요약 카드 제목/본문 폰트 및 여백을 축소해 기본 화면에서 핵심 모드 가시성을 강화\n- claw-code 스타일의 빠른 스캔 밀도에 맞춰 권한 팝업 가독성/선택 동선을 보강\n- 문서 동기화: README.md, docs/DEVELOPMENT.md에 2026-04-04 16:58(KST) 이력 반영\n- 검증: dotnet build 경고0/오류0, dotnet test 필터 65 passed
This commit is contained in:
2026-04-04 16:47:05 +09:00
parent 5c2042847a
commit 90c2f15e96
3 changed files with 37 additions and 16 deletions

View File

@@ -297,6 +297,7 @@ public class MyHandler : IActionHandler
| AX Agent 설정창 오픈 안정화 | `ToggleSwitch`를 전역 리소스로 승격해 AX Agent 창 초기화 시 리소스 누락 예외를 방지하고, AX Agent 설정창에는 테마 사전만 안전 주입하도록 오픈 경로를 보강 | | AX Agent 설정창 오픈 안정화 | `ToggleSwitch`를 전역 리소스로 승격해 AX Agent 창 초기화 시 리소스 누락 예외를 방지하고, AX Agent 설정창에는 테마 사전만 안전 주입하도록 오픈 경로를 보강 |
| 권한 순환/슬래시 스크롤 체감 보강 | `claw-code` 기준으로 권한 순환에서 고위험 `질문 없이 진행`을 기본 순환에서 분리하고, `/` 팝업 휠 스크롤 시 뷰포트 기준 선택 동기화를 추가해 스크롤 사용성을 개선 | | 권한 순환/슬래시 스크롤 체감 보강 | `claw-code` 기준으로 권한 순환에서 고위험 `질문 없이 진행`을 기본 순환에서 분리하고, `/` 팝업 휠 스크롤 시 뷰포트 기준 선택 동기화를 추가해 스크롤 사용성을 개선 |
| 권한 팝업 상세영역 단순화 | 권한 팝업의 `요약/예외/최근거부`를 개별 섹션에서 단일 `상세 정보` 섹션으로 통합해 기본 화면 밀도를 낮추고 핵심 모드 선택 흐름을 우선화 | | 권한 팝업 상세영역 단순화 | 권한 팝업의 `요약/예외/최근거부`를 개별 섹션에서 단일 `상세 정보` 섹션으로 통합해 기본 화면 밀도를 낮추고 핵심 모드 선택 흐름을 우선화 |
| 권한 팝업 밀도/정렬 미세조정 | 권한 행의 패딩·폰트·아이콘·체크마크 간격을 컴팩트하게 재정렬하고 요약 카드 타이포를 축소해 `claw-code` 스타일의 빠른 스캔 밀도를 강화 |
| Slash palette 상태 분리 시작 | `ChatWindow`에 몰려 있던 slash 상태를 `SlashPaletteState`로 분리해 이후 Codex/Claude형 composer 개편 기반 마련 | | Slash palette 상태 분리 시작 | `ChatWindow`에 몰려 있던 slash 상태를 `SlashPaletteState`로 분리해 이후 Codex/Claude형 composer 개편 기반 마련 |
| 런처 이미지 미리보기 추가 | `#` 클립보드 이미지 항목에서 `Shift+Enter`로 전용 미리보기 창을 열고, 줌·원본 해상도 확인·PNG/JPEG/BMP 저장·클립보드 복사를 지원 | | 런처 이미지 미리보기 추가 | `#` 클립보드 이미지 항목에서 `Shift+Enter`로 전용 미리보기 창을 열고, 줌·원본 해상도 확인·PNG/JPEG/BMP 저장·클립보드 복사를 지원 |
| 검증 | `dotnet build` 경고 0 / 오류 0, `dotnet test` 436 passed / 0 failed | | 검증 | `dotnet build` 경고 0 / 오류 0, `dotnet test` 436 passed / 0 failed |

View File

@@ -3759,3 +3759,23 @@ else:
- 초기 빌드에서 WPF 임시 산출물(`wpftmp/.g.cs`) 누락 이슈를 확인했고, `dotnet clean` 후 재빌드로 정상 복구. - 초기 빌드에서 WPF 임시 산출물(`wpftmp/.g.cs`) 누락 이슈를 확인했고, `dotnet clean` 후 재빌드로 정상 복구.
- `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` 통과 (경고 0, 오류 0). - `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). - `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).

View File

@@ -1664,7 +1664,7 @@ public partial class ChatWindow : Window
{ {
Background = Brushes.Transparent, Background = Brushes.Transparent,
CornerRadius = new CornerRadius(6), CornerRadius = new CornerRadius(6),
Padding = new Thickness(7, 4, 7, 4), Padding = new Thickness(8, 5, 8, 5),
Cursor = Cursors.Hand, Cursor = Cursors.Hand,
Focusable = true, Focusable = true,
Child = headerGrid, Child = headerGrid,
@@ -1722,8 +1722,8 @@ public partial class ChatWindow : Window
: BrushFromHex("#C7D2FE"), : BrushFromHex("#C7D2FE"),
BorderThickness = new Thickness(1), BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(8), CornerRadius = new CornerRadius(8),
Padding = new Thickness(9, 7, 9, 7), Padding = new Thickness(8, 6, 8, 6),
Margin = new Thickness(0, 0, 0, 5), Margin = new Thickness(0, 0, 0, 4),
Child = new StackPanel Child = new StackPanel
{ {
Children = Children =
@@ -1731,7 +1731,7 @@ public partial class ChatWindow : Window
new TextBlock new TextBlock
{ {
Text = $"현재 권한 모드 · {PermissionModeCatalog.ToDisplayLabel(summary.EffectiveMode)}", Text = $"현재 권한 모드 · {PermissionModeCatalog.ToDisplayLabel(summary.EffectiveMode)}",
FontSize = 11.5, FontSize = 11,
FontWeight = FontWeights.SemiBold, FontWeight = FontWeights.SemiBold,
Foreground = string.Equals(summary.RiskLevel, "high", StringComparison.OrdinalIgnoreCase) Foreground = string.Equals(summary.RiskLevel, "high", StringComparison.OrdinalIgnoreCase)
? BrushFromHex("#C2410C") ? BrushFromHex("#C2410C")
@@ -1742,8 +1742,8 @@ public partial class ChatWindow : Window
new TextBlock new TextBlock
{ {
Text = $"{summary.Description} 기본값 {PermissionModeCatalog.ToDisplayLabel(summary.DefaultMode)} · 예외 {summary.OverrideCount}개", Text = $"{summary.Description} 기본값 {PermissionModeCatalog.ToDisplayLabel(summary.DefaultMode)} · 예외 {summary.OverrideCount}개",
FontSize = 9.5, FontSize = 9,
Margin = new Thickness(0, 3, 0, 0), Margin = new Thickness(0, 2, 0, 0),
Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray,
TextTrimming = TextTrimming.CharacterEllipsis, TextTrimming = TextTrimming.CharacterEllipsis,
MaxWidth = 260, MaxWidth = 260,
@@ -1935,8 +1935,8 @@ public partial class ChatWindow : Window
BorderBrush = isActive ? BrushFromHex("#C7D2FE") : Brushes.Transparent, BorderBrush = isActive ? BrushFromHex("#C7D2FE") : Brushes.Transparent,
BorderThickness = new Thickness(1), BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(8), CornerRadius = new CornerRadius(8),
Padding = new Thickness(9, 5, 9, 5), Padding = new Thickness(8, 4, 8, 4),
Margin = new Thickness(0, 1.5, 0, 1.5), Margin = new Thickness(0, 1, 0, 1),
Cursor = Cursors.Hand, Cursor = Cursors.Hand,
Focusable = true, Focusable = true,
}; };
@@ -1951,9 +1951,9 @@ public partial class ChatWindow : Window
{ {
Text = item.Icon, Text = item.Icon,
FontFamily = new FontFamily("Segoe MDL2 Assets"), FontFamily = new FontFamily("Segoe MDL2 Assets"),
FontSize = 13, FontSize = 12,
Foreground = BrushFromHex(item.ColorHex), Foreground = BrushFromHex(item.ColorHex),
Margin = new Thickness(2, 0, 9, 0), Margin = new Thickness(1, 0, 8, 0),
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center,
}); });
@@ -1961,18 +1961,18 @@ public partial class ChatWindow : Window
textStack.Children.Add(new TextBlock textStack.Children.Add(new TextBlock
{ {
Text = item.Title, Text = item.Title,
FontSize = 11, FontSize = 10.5,
FontWeight = FontWeights.SemiBold, FontWeight = FontWeights.SemiBold,
Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.White, Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.White,
}); });
textStack.Children.Add(new TextBlock textStack.Children.Add(new TextBlock
{ {
Text = item.Description, Text = item.Description,
FontSize = 9.5, FontSize = 9,
Margin = new Thickness(0, 1.5, 0, 0), Margin = new Thickness(0, 1, 0, 0),
Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray,
TextWrapping = TextWrapping.Wrap, TextWrapping = TextWrapping.Wrap,
LineHeight = 13.5, LineHeight = 13,
MaxWidth = 230, MaxWidth = 230,
}); });
Grid.SetColumn(textStack, 1); Grid.SetColumn(textStack, 1);
@@ -1982,11 +1982,11 @@ public partial class ChatWindow : Window
{ {
Text = isActive ? "\uE73E" : "", Text = isActive ? "\uE73E" : "",
FontFamily = new FontFamily("Segoe MDL2 Assets"), FontFamily = new FontFamily("Segoe MDL2 Assets"),
FontSize = 11.5, FontSize = 11,
FontWeight = FontWeights.Bold, FontWeight = FontWeights.Bold,
Foreground = BrushFromHex("#2563EB"), Foreground = BrushFromHex("#2563EB"),
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center,
Margin = new Thickness(10, 0, 1, 0), Margin = new Thickness(8, 0, 1, 0),
}; };
Grid.SetColumn(check, 2); Grid.SetColumn(check, 2);
row.Children.Add(check); row.Children.Add(check);