- 권한 행 패딩/마진, 아이콘/체크마크 간격, 제목/설명 타이포를 컴팩트하게 재정렬\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:
@@ -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 |
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user