releases/docs/UI_USECASES.md

347 lines
30 KiB
Markdown

# UI 복잡 버전·스타일 유즈케이스 RED 스펙 (234건)
작성: 2026-08-17. TDD RED 단계 산출물이다.
"UI 복잡 버전"(complex UI version)이란 기존 T1~T3 데스크톱 UI 위에 사용자가 요구할 만한
고급 UI 기능 — 테마 시스템·타이포그래피 토큰·밀도/레이아웃 설정·탭 고급 관리·다운로드 관리자·
설정 창 정보구조·접근성·키보드/마우스 인터랙션·라이브러리 뷰·상태/알림 — 을 갖춘 버전을 뜻한다.
이 문서의 각 유즈케이스는 `VideoDownloader.Tests/E2E/UiUsecase*RedTests.cs` 의 테스트 1건과
1:1 로 대응된다. **2026-08-17 GREEN 구현 완료 — 234건 전부 통과한다.** 파일명의 `Red` 는
RED 스펙 단계의 산출물임을 나타낸다(이름 그대로 보존). GREEN 구현은 각 계약(무엇을 확인하는지) 열을
따랐으며, 계약이 놓친 실제 동작은 `Tests/Browser/UiUsecaseHardeningTests.cs`(35건) 와
`Tests/E2E/UiUsecaseLiveE2ETests.cs`(실창 4건 — 컨트롤 실존·라이브 테마 전환·일시정지/재개·
설정 검색·토스트 방해금지) 로 보강 검증한다. 계약의 종류:
- **리소스 토큰**: `Themes/Shared.xaml`·`Dark.xaml`·`Light.xaml` 의 `x:Key` 존재
- **XAML 요소**: `MainWindow.xaml`·`SettingsWindow.xaml` 의 이름/속성 존재
- **설정 계약**: `AppConfig` 속성 존재(리플렉션)
- **API 계약**: 형식·메서드 존재(리플렉션)
- **대비 계약**: WCAG 상대 휘도 대비율 계산(Dark/Light 실제 색값)
- **코드 계약**: 코드비하인드 문자열/식별자 존재
| 카탈로그 | 테스트 파일 | 건수 |
|---|---|---|
| §A 테마·색상·대비 | `UiUsecaseThemeRedTests.cs` | 30 |
| §B 타이포그래피·폰트 | `UiUsecaseTypographyRedTests.cs` | 22 |
| §C 레이아웃·밀도·창 상태 | `UiUsecaseLayoutRedTests.cs` | 26 |
| §D 탭 고급 관리 | `UiUsecaseTabsRedTests.cs` | 24 |
| §E 다운로드 관리자 | `UiUsecaseDownloadsRedTests.cs` | 30 |
| §F 설정 창 | `UiUsecaseSettingsRedTests.cs` | 20 |
| §G 접근성 | `UiUsecaseAccessibilityRedTests.cs` | 20 |
| §H 키보드·마우스 인터랙션 | `UiUsecaseInteractionRedTests.cs` | 20 |
| §I 라이브러리·재생목록·즐겨찾기·기록·노트 | `UiUsecaseLibraryRedTests.cs` | 22 |
| §J 상태 표시·알림·피드백 | `UiUsecaseStatusRedTests.cs` | 20 |
---
## §A 테마·색상·대비 (UC-T01~T30)
| ID | 사용자 유즈케이스 | 계약 |
|---|---|---|
| UC-T01 | OS 가 다크/라이트 모드를 바꾸면 앱도 자동으로 따라가고 싶다 | 설정창에 `system` 테마 옵션 |
| UC-T02 | 테마를 체크박스 하나가 아니라 다크/라이트/시스템/고대비 중에서 고르고 싶다 | 설정창 `ThemeModeBox` 콤보박스 |
| UC-T03 | 테마를 바꿀 때마다 앱이 재시작되지 않고 즉시 바뀌었으면 좋겠다 | 설정창에 "재시작" 문구 제거 |
| UC-T04 | 테마 전환 후에도 열려 있는 창의 리소스가 살아 있어야 한다 | `MainWindow.ApplyTheme` 라이브 적용 API |
| UC-T05 | 고대비 사용자도 테마를 쓸 수 있었으면 한다 | `Themes/HighContrast.xaml` 존재 |
| UC-T06 | 고대비 테마도 옵션에서 직접 선택하고 싶다 | 설정창 `highcontrast` 옵션 |
| UC-T07 | 강조색(보라)을 내 취향 색으로 바꾸고 싶다 | `AppConfig.AccentColor` 속성 |
| UC-T08 | 강조색을 바꾸면 재시작 없이 버튼·진행바에 즉시 반영되었으면 한다 | `App.ApplyAccent` API |
| UC-T09 | 강조색 프리셋(파랑·초록 등) 중 하나를 빠르게 고르고 싶다 | 다크 테마 `Accent.Blue` 프리셋 키 |
| UC-T10 | 사용자 강조색이 진행바에도 적용되어야 한다 | `Shared.xaml` 진행바 하드코딩 색(`#6366F1`) 제거 |
| UC-T11 | 대기 중 다운로드를 노란색 등 별도 상태색으로 구분해서 보고 싶다 | `MainWindow.xaml` 이 `PendingBrush` 사용 |
| UC-T12 | 내가 만든 테마 파일을 불러와 쓰고 싶다 | `AppConfig.CustomThemePath` 속성 |
| UC-T13 | 시스템 테마 값을 판별하는 로직이 앱에 있어야 자동 추종이 가능하다 | `ThemeResolver` 형식 존재 |
| UC-T14 | 흐린 보조 텍스트도 카드 위에서 충분히 읽히길 원한다 | 다크 `TextMuted`/`CardBg` 대비 ≥ 4.5:1 (현재 ~4.4:1) |
| UC-T15 | 카드에 마우스를 올렸을 때도 텍스트가 읽혀야 한다 | 다크 `TextMuted`/`CardBgHover` 대비 ≥ 4.5:1 (현재 ~4.0:1) |
| UC-T16 | 라이트 테마에서도 흐린 텍스트가 카드 위에서 읽혀야 한다 | 라이트 `TextMuted`/`CardBg` 대비 ≥ 4.5:1 (현재 ~4.2:1) |
| UC-T17 | 라이트 테마 유리판 배경 위 보조 텍스트도 읽혀야 한다 | 라이트 `TextMuted`/`GlassBg` 대비 ≥ 4.5:1 (현재 ~3.5:1) |
| UC-T18 | 강조색 텍스트(포맷 배지)도 본문처럼 또렷해야 한다 | 다크 `AccentBrush`/`CardBg` 대비 ≥ 4.5:1 (현재 ~4.4:1) |
| UC-T19 | 비활성화된 컨트롤의 텍스트 색이 명시적으로 있어야 한다 | 테마 `TextDisabled` 토큰 |
| UC-T20 | 텍스트 선택 영역 색을 테마로 관리하고 싶다 | 테마 `SelectionBrush` 토큰 |
| UC-T21 | 키보드 포커스 링 색이 테마 토큰으로 있어야 한다 | 테마 `FocusAdornerBrush` 토큰 |
| UC-T22 | 스크롤바 썸 색을 테마에서 바꾸고 싶다 | `Shared.xaml` `ScrollBarThumbBrush` 토큰 |
| UC-T23 | 툴팁에 그림자가 있어 콘텐츠 위에서 분리돼 보였으면 한다 | `Shared.xaml` `TooltipShadow` 토큰 |
| UC-T24 | 팝업(플라이아웃)에도 일관된 그림자가 필요하다 | `Shared.xaml` `PopupShadow` 토큰 |
| UC-T25 | 경고 상태용 색이 대기(Pending)와 구분되어 있어야 한다 | 테마 `WarningBrush` 토큰 |
| UC-T26 | 링크 텍스트 색이 테마에 정의되어 있어야 한다 | 테마 `LinkBrush` 토큰 |
| UC-T27 | 방문한 링크 색을 구분해서 보고 싶다 | 테마 `VisitedLinkBrush` 토큰 |
| UC-T28 | 정보성 안내 색(파랑 계열)이 필요하다 | 테마 `InfoBrush` 토큰 |
| UC-T29 | 강조색을 배경·텍스트 용도별로 분리해 관리하고 싶다 | 테마 `AccentTextBrush` 토큰 |
| UC-T30 | 테마 전환 시 창 테두리(타이틀바)도 즉시 따라가야 한다 | `MainWindow.UpdateTitleBarTheme` API |
## §B 타이포그래피·폰트 (UC-F01~F22)
| ID | 사용자 유즈케이스 | 계약 |
|---|---|---|
| UC-F01 | UI 기본 폰트를 내가 고르고 싶다 | `AppConfig.UiFontFamily` |
| UC-F02 | 폰트 크기를 키워서 읽기 편하게 하고 싶다 | `AppConfig.UiFontSize` |
| UC-F03 | 한국어 폴백 폰트를 직접 지정하고 싶다 | `AppConfig.UiFontKoreanFallback` |
| UC-F04 | 기본 폰트 크기가 토큰으로 관리되어 설정이 전체에 적용돼야 한다 | `Shared.xaml` `FontSize.Base` |
| UC-F05 | 보조 정보용 작은 폰트 크기 토큰이 필요하다 | `FontSize.Small` |
| UC-F06 | 제목용 큰 폰트 크기 토큰이 필요하다 | `FontSize.Large` |
| UC-F07 | 화면 제목용 초대형 토큰이 필요하다 | `FontSize.XLarge` |
| UC-F08 | 화면 제목(H1) 스타일이 일관되게 정의되어야 한다 | `Type.H1` |
| UC-F09 | 본문 스타일이 토큰으로 정의되어야 한다 | `Type.Body` |
| UC-F10 | 캡션(도움말 텍스트) 스타일이 필요하다 | `Type.Caption` |
| UC-F11 | 진행률·속도 숫자가 등폭 폰트로 흔들리지 않게 보고 싶다 | `Type.Mono` |
| UC-F12 | 한국어 가독성 폰트(Pretendard) 프리셋을 쓰고 싶다 | `UiFont` 정의에 Pretendard 포함 |
| UC-F13 | 설정창에 글꼴 섹션이 있어야 폰트를 바꿀 수 있다 | 설정창 "글꼴" 섹션 |
| UC-F14 | 폰트 바꾸기 전에 미리보기 텍스트로 확인하고 싶다 | 설정창 `FontPreviewText` |
| UC-F15 | 폰트 크기 프리셋을 콤보박스로 고르고 싶다 | 설정창 `FontSizeBox` |
| UC-F16 | 폰트 설정 변경이 즉시 적용되었으면 한다 | `App.ApplyFontSettings` API |
| UC-F17 | 리더 모드도 앱 폰트 설정을 따라야 한다 | ReaderMode 폰트 하드코딩 제거 |
| UC-F18 | 새 탭 다이얼도 앱 폰트 설정을 따라야 한다 | 코드비하인드 폰트 하드코딩 제거 |
| UC-F19 | 탭 제목 스타일이 공용 스타일로 관리되어야 한다 | `TabTitleStyle` |
| UC-F20 | 상태바 텍스트 스타일이 공용으로 관리되어야 한다 | `StatusTextStyle` |
| UC-F21 | 아이콘 크기도 토큰으로 관리하고 싶다 | `IconSize.Small` |
| UC-F22 | 본문 줄간격을 토큰으로 조절하고 싶다 | `Type.LineHeight` |
## §C 레이아웃·밀도·창 상태 (UC-L01~L26)
| ID | 사용자 유즈케이스 | 계약 |
|---|---|---|
| UC-L01 | 정보 밀도(컴팩트/보통/여유)를 고르고 싶다 | `AppConfig.UiDensity` |
| UC-L02 | 설정창에서 밀도를 바꿀 수 있어야 한다 | 설정창 "밀도" 항목 |
| UC-L03 | 작은 간격 토큰으로 여백이 일관되게 관리되어야 한다 | `Spacing.S` |
| UC-L04 | 중간 간격 토큰이 필요하다 | `Spacing.M` |
| UC-L05 | 큰 간격 토큰이 필요하다 | `Spacing.L` |
| UC-L06 | 카드 모서리 둥글기가 토큰으로 일관되어야 한다 | `CornerRadius.Card` |
| UC-L07 | 컴팩트 모드 상태가 앱 재시작 후에도 유지되었으면 한다 | `AppConfig.CompactMode` |
| UC-L08 | 툴바에 컴팩트 모드 토글 버튼이 있으면 빠르게 켜고 싶다 | `MainWindow` `CompactModeBtn` |
| UC-L09 | 세로 탭을 기본 레이아웃으로 쓰고 싶다 | `AppConfig.VerticalTabsDefault` |
| UC-L10 | 분할 화면 비율이 저장되어 재현되었으면 한다 | `AppConfig.SplitViewRatio` |
| UC-L11 | 앱을 껐다 켰을 때 창 위치·크기가 그대로였으면 한다 | `AppConfig.WindowBounds` |
| UC-L12 | 최대화 상태도 함께 복원되어야 한다 | `AppConfig.WindowMaximized` |
| UC-L13 | 고DPI 화면에서 레이아웃이 흐릿하지 않아야 한다 | `UseLayoutRounding` 설정 |
| UC-L14 | 텍스트·요소가 픽셀에 정렬되어 선명해야 한다 | `Shared.xaml` `SnapsToDevicePixels` |
| UC-L15 | 안 쓰는 상태바는 자동으로 숨기고 싶다 | `AppConfig.StatusBarAutoHide` |
| UC-L16 | 툴바 버튼 노출 여부를 직접 고르고 싶다 | `AppConfig.ToolbarButtons` |
| UC-L17 | 북마크바 표시 여부가 저장되었으면 한다 | `AppConfig.BookmarkBarVisible` |
| UC-L18 | 탭 스트립 위치(위/아래/왼쪽)를 고르고 싶다 | `AppConfig.TabStripPosition` |
| UC-L19 | 패널 폭을 실수로 바꿨을 때 더블클릭으로 기본 복원하고 싶다 | `MainWindow.ResetPanelWidth` |
| UC-L20 | 패널 최소 폭을 직접 정하고 싶다 | `AppConfig.RightPanelMinWidth` |
| UC-L21 | 움직임에 민감하므로 애니메이션을 줄이고 싶다 | `AppConfig.ReduceMotion` |
| UC-L22 | 빠른 전환 애니메이션 지속 시간이 토큰으로 관리되어야 한다 | `Duration.Fast` |
| UC-L23 | 일반 애니메이션 지속 시간 토큰이 필요하다 | `Duration.Normal` |
| UC-L24 | 컴팩트 모드 엣지 호버 반응 속도를 조절하고 싶다 | `AppConfig.EdgeRevealDelayMs` |
| UC-L25 | UI 전체 배율을 키워서 보고 싶다 | `AppConfig.UiScale` |
| UC-L26 | 전체화면 여부도 저장되었으면 한다 | `AppConfig.FullScreen` |
## §D 탭 고급 관리 (UC-B01~B24)
| ID | 사용자 유즈케이스 | 계약 |
|---|---|---|
| UC-B01 | 실수로 탭을 닫지 않도록 탭을 잠그고 싶다 | `TabItem.IsLocked` |
| UC-B02 | 탭마다 내가 지정한 색 표시를 달고 싶다 | `TabItem.CustomColor` |
| UC-B03 | 탭 그룹을 접어서 스트립을 정리하고 싶다 | `TabItem.IsGroupCollapsed` |
| UC-B04 | 탭 그룹 이름을 나중에 바꾸고 싶다 | 그룹 이름 변경 API(`RenameGroup`) |
| UC-B05 | 탭에 마우스를 올리면 미리보기(제목+URL+상태)가 보였으면 한다 | `TabPreview` 형식 |
| UC-B06 | 잠자기 탭이 시각적으로(zzz 등) 구분되었으면 한다 | 탭 템플릿 `IsSuspended` 반영 |
| UC-B07 | 탭이 많을 때 번호 배지로 위치를 파악하고 싶다 | `TabIndexBadge` 요소 |
| UC-B08 | 탭 드래그 중 삽입 위치 표시기가 보였으면 한다 | `TabInsertIndicator` 요소 |
| UC-B09 | 탭 여러 개를 한 번에 닫을 때 확인을 받았으면 한다 | `AppConfig.ConfirmCloseMultipleTabs` |
| UC-B10 | 탭 위에서 휠을 굴려 탭을 전환하고 싶다 | `AppConfig.TabWheelSwitch` |
| UC-B11 | 탭 최대 개수를 직접 정하고 싶다 | `AppConfig.MaxTabs` |
| UC-B12 | 세션 복원 시 탭을 잠자기 상태로만 복원해 빨리 뜨게 하고 싶다 | `AppConfig.RestoreTabsSuspended` |
| UC-B13 | 닫은 탭 아카이브를 전용 팝업에서 보고 싶다 | `ArchivePopup` 요소 |
| UC-B14 | 아카이브에서 원하는 탭을 검색해서 복구하고 싶다 | `ArchiveSearchBox` 요소 |
| UC-B15 | 아카이브를 한 번에 비우고 싶다 | `TabArchive.Clear()` |
| UC-B16 | 아카이브 항목을 클릭해 해당 탭을 다시 열고 싶다 | `TabArchive.Restore()` |
| UC-B17 | 탭 그룹 색 팔레트가 테마로 관리되어 일관되었으면 한다 | `GroupPalette` 토큰 |
| UC-B18 | 현재 작업공간 이름이 항상 보였으면 한다 | `WorkspaceIndicator` 요소 |
| UC-B19 | 작업공간 이름을 내가 짓고 싶다 | `AppConfig.WorkspaceNames` |
| UC-B20 | 작업공간을 클릭 한 번에 전환하고 싶다 | `WorkspaceSwitcher` 요소 |
| UC-B21 | 새 탭 버튼에서 최근 페이지·즐겨찾기로 바로 열고 싶다 | 새 탭 보조 메뉴(`NewTabMore_Click`) |
| UC-B22 | 긴 탭 제목을 두 줄로 보고 싶다 | `AppConfig.TabTitleMultiline` |
| UC-B23 | 탭에서 바로 볼륨 슬라이더를 조절하고 싶다 | `TabVolumePopup` 요소 |
| UC-B24 | 탭 그룹 전체를 즐겨찾기로 저장하고 싶다 | `MainWindow.BookmarkGroup()` |
## §E 다운로드 관리자 (UC-D01~D30)
| ID | 사용자 유즈케이스 | 계약 |
|---|---|---|
| UC-D01 | 다운로드 목록을 최신순·크기순 등으로 정렬하고 싶다 | `AppConfig.DownloadSortOrder` |
| UC-D02 | 진행 중/완료/실패 항목을 필터 탭으로 골라 보고 싶다 | `DownloadFilterTabs` 요소 |
| UC-D03 | 다운로드 목록 안에서 검색하고 싶다 | `DownloadSearchBox` 요소 |
| UC-D04 | 남은 시간(ETA)을 보고 언제 끝나는지 알고 싶다 | 카드 VM `RemainingText` |
| UC-D05 | 다운로드 카드에 현재 속도가 표시되었으면 한다 | 카드 VM `SpeedText` |
| UC-D06 | 진행 중인 다운로드를 한 번에 전부 일시정지하고 싶다 | `MainWindow.PauseAllDownloads()` |
| UC-D07 | 일시정지한 다운로드를 한 번에 전부 재개하고 싶다 | `MainWindow.ResumeAllDownloads()` |
| UC-D08 | 완료된 항목을 자동으로 목록에서 치우고 싶다 | `AppConfig.AutoClearCompleted` |
| UC-D09 | 몇 번 재시도했는지 카드에 표시되었으면 한다 | 카드 VM `RetryCount` |
| UC-D10 | 세그먼트 진행 상황을 막대 그리드로 시각적으로 보고 싶다 | 카드 VM `SegmentMap` |
| UC-D11 | 다운로드 완료를 토스트 알림으로 알고 싶다 | `ToastNotifier` 형식 |
| UC-D12 | 알림 소리를 켜고 끄고 싶다 | `AppConfig.NotifySound` |
| UC-D13 | 완료 시 다운로드 폴더가 자동으로 열렸으면 한다 | `AppConfig.OpenFolderOnComplete` |
| UC-D14 | 다운로드 카드를 우클릭해 메뉴(복사·삭제 등)를 쓰고 싶다 | `CardContextMenu` 요소 |
| UC-D15 | 카드를 펼쳐 출처 URL·포맷 등 상세 정보를 보고 싶다 | `CardDetailExpander` 요소 |
| UC-D16 | 패널 상단에 대기 현황 요약(예: 3 대기 · 1 실패)이 필요하다 | `QueueSummaryText` 요소 |
| UC-D17 | 속도 변화를 스파크라인으로 보고 싶다 | `SpeedSparkline` 요소 |
| UC-D18 | 전체 다운로드 속도 합계가 표시되었으면 한다 | `GlobalSpeedText` 요소 |
| UC-D19 | 파일 총 크기를 카드에서 미리 보고 싶다 | 카드 VM `TotalSizeText` |
| UC-D20 | 영상 자막도 함께 받고 언어를 지정하고 싶다 | 설정창 `SubtitleLangBox` |
| UC-D21 | 야간 등 지정 시간대에만 다운로드하게 예약하고 싶다 | `DownloadScheduler` 형식 |
| UC-D22 | 다운로드 속도 상한을 두고 싶다 | `AppConfig.MaxDownloadSpeedKbps` |
| UC-D23 | 다운로드 목록을 CSV 로 내보내 관리하고 싶다 | `MainWindow.ExportDownloads()` |
| UC-D24 | 중요한 항목을 먼저 받도록 우선순위를 정하고 싶다 | 카드 VM `Priority` |
| UC-D25 | 같은 영상을 또 받으려 할 때 중복 경고를 받고 싶다 | `MainWindow.ConfirmDuplicateDownload()` |
| UC-D26 | 충돌 회피 후 최종 저장 파일명이 카드에 표시되었으면 한다 | 카드 VM `FinalFileName` |
| UC-D27 | 오류 메시지를 버튼 한 번으로 복사해 공유하고 싶다 | `CopyErrorButton` 요소 |
| UC-D28 | 페이지 파일 다운로드도 전체 일시정지가 되었으면 한다 | `PageDownloadTracker.PauseAll()` |
| UC-D29 | 감지된 미디어 종류(HLS/DASH/MP4)를 배지로 보고 싶다 | `MediaKindBadge` 요소 |
| UC-D30 | 사이트별로 다운로드 항목이 묶여 보였으면 한다 | `SiteGroupHeader` 요소 |
## §F 설정 창 (UC-S01~S20)
| ID | 사용자 유즈케이스 | 계약 |
|---|---|---|
| UC-S01 | 설정 항목이 많아서 검색으로 찾고 싶다 | `SettingsSearchBox` |
| UC-S02 | 좌측 카테고리 내비게이션으로 섹션을 오가고 싶다 | `SettingsNavList` |
| UC-S03 | 재시작이 필요한 변경은 배너로 미리 알려줬으면 한다 | `RestartBanner` |
| UC-S04 | 설정을 기본값으로 한 번에 되돌리고 싶다 | `ResetDefaultsButton` |
| UC-S05 | 설정을 파일로 내보내 백업하고 싶다 | `ExportSettingsButton` |
| UC-S06 | 다른 기기에서 내보낸 설정을 가져오고 싶다 | `ImportSettingsButton` |
| UC-S07 | 고급 항목은 접어두고 기본만 보고 싶다 | `AdvancedSection` |
| UC-S08 | 확인 버튼 대신 Ctrl+S 로 저장하고 싶다 | 설정창 `Key.S` 처리 |
| UC-S09 | 취소할 때 변경 사항 폐기 확인을 받고 싶다 | `ConfirmDiscardChanges()` |
| UC-S10 | 설정창 크기·위치도 기억되었으면 한다 | `AppConfig.SettingsWindowBounds` |
| UC-S11 | 재시도 횟수를 UI 에서 바꾸고 싶다 | `RetriesBox` |
| UC-S12 | User-Agent 를 UI 에서 바꾸고 싶다 | `UserAgentBox` |
| UC-S13 | 프록시 서버를 설정하고 싶다 | `ProxyBox` |
| UC-S14 | UI 언어(한/영)를 바꾸고 싶다 | `LanguageBox` |
| UC-S15 | Windows 시작 시 자동 실행을 켜고 싶다 | `AutoStartBox` |
| UC-S16 | 닫기 버튼으로 트레이로 최소화하고 싶다 | `MinimizeToTrayBox` |
| UC-S17 | 알림 종류를 섹션에서 한곳에 모아 관리하고 싶다 | 설정창 "알림" 섹션 |
| UC-S18 | 실험적 기능을 명시적으로 켜고 싶다 | 설정창 "실험적" 섹션 |
| UC-S19 | 잘못된 값은 저장 전에 힌트로 알려줬으면 한다 | `ValidationHint` 요소 |
| UC-S20 | 앱 버전·저장소 정보를 설정에서 보고 싶다 | `VersionText` 요소 |
## §G 접근성 (UC-A01~A20)
| ID | 사용자 유즈케이스 | 계약 |
|---|---|---|
| UC-A01 | 화면 낭독기가 버튼 이름을 읽어줬으면 한다 | `AutomationProperties` 사용 |
| UC-A02 | 주요 컨트롤 15개 이상이 자동화 이름을 갖춰야 한다 | `AutomationProperties.Name` ≥ 15 |
| UC-A03 | 상태 변화(다운로드 완료 등)가 낭독기에 자동 전달되어야 한다 | `LiveSetting` 사용 |
| UC-A04 | Windows 고대비 모드를 켜면 앱도 반응했으면 한다 | `HighContrast` 감지 코드 |
| UC-A05 | 키보드 포커스가 어디 있는지 항상 보였으면 한다 | `FocusVisualStyle` 정의 |
| UC-A06 | Tab 키 순서가 논리적으로 지정되어야 한다 | `TabIndex` 사용 |
| UC-A07 | 툴팁 표시 시간 등 ToolTipService 설정이 필요하다 | `ToolTipService` 사용 |
| UC-A08 | 메뉴·버튼에 Alt 접근 키가 있었으면 한다 | `AccessText` 사용 |
| UC-A09 | 목록·탭 컨트롤에 맞춤 자동화 피어가 필요하다 | `AutomationPeer` 구현 |
| UC-A10 | 컨트롤에 추가 설명(HelpText)이 제공되어야 한다 | `AutomationProperties.HelpText` |
| UC-A11 | 색을 구분 못 해도 완료 상태를 아이콘으로 알고 싶다 | `SuccessIcon` 요소 |
| UC-A12 | 접근성 관련 설정을 한 섹션에서 관리하고 싶다 | 설정창 "접근성" 섹션 |
| UC-A13 | 저시력으로 UI 를 최대 200% 까지 키워서 쓰고 싶다 | `AppConfig.UiFontScale` |
| UC-A14 | 팝업 안에서도 키보드 방향키 탐색이 되어야 한다 | `KeyboardNavigation.TabNavigation` |
| UC-A15 | 영상 자막 표시 옵션이 필요하다 | `AppConfig.ShowCaptions` |
| UC-A16 | 애니메이션 감소 설정이 스타일에 반영되어야 한다 | `Shared.xaml` `ReduceMotion` 연동 |
| UC-A17 | 리더 모드 HTML 에 언어(lang=ko)가 선언되어야 낭독기가 한국어로 읽는다 | ReaderMode `lang=` 선언 |
| UC-A18 | 접근성 지원 범위를 문서로 확인하고 싶다 | `docs/ACCESSIBILITY.md` 존재 |
| UC-A19 | 라이트 테마에서 진행 트랙이 배경과 구별되어야 한다 | 라이트 `TrackBrush`/`PanelBg` 대비 ≥ 3:1 (현재 ~1.2:1) |
| UC-A20 | 버튼 테두리가 배경과 구별되어야 클릭 대상이 보인다 | 다크 `BorderBrush`/`CardBg` 대비 ≥ 3:1 (현재 ~1.4:1) |
## §H 키보드·마우스 인터랙션 (UC-K01~K20)
| ID | 사용자 유즈케이스 | 계약 |
|---|---|---|
| UC-K01 | 단축키 목록을 보고 설정하고 싶다 | 설정창 "단축키" 항목 |
| UC-K02 | 단축키를 내 키 배치에 맞게 바꾸고 싶다 | `AppConfig.Shortcuts` |
| UC-K03 | 단축키 충돌을 저장 전에 알려줬으면 한다 | `ShortcutManager` 형식 |
| UC-K04 | 단축키 전체 목록을 앱 안에서 조회하고 싶다 | `ShortcutHelpPopup` 요소 |
| UC-K05 | 마우스 우클릭+휠 등 제스처로 뒤로/앞으로 이동하고 싶다 | `MouseGesture`/`XButton` 처리 |
| UC-K06 | 링크를 휠 클릭해 새 탭으로 열고 싶다 | `MiddleButton` 처리 |
| UC-K07 | 주소를 붙여넣으면 자동으로 이동하게 하고 싶다 | `AppConfig.PasteAndGo` |
| UC-K08 | 주소창을 클릭하면 전체 선택되어 바로 덮어쓰고 싶다 | `AppConfig.FocusSelectsAddress` |
| UC-K09 | 팔레트에서 "모두 일시정지" 명령을 바로 쓰고 싶다 | "모두 일시정지" 명령 등록 |
| UC-K10 | Esc 한 번으로 열린 모든 팝업을 닫고 싶다 | `CloseAllPopups` 통일 처리 |
| UC-K11 | 다운로드 중 종료할 때 확인을 받고 싶다 | 종료 확인 다이얼로그 |
| UC-K12 | F12 로 개발자 도구를 열고 싶다 | `OpenDevTools` 처리 |
| UC-K13 | 프로필(세션)을 전환하며 쓰고 싶다 | "프로필 전환" 기능 |
| UC-K14 | 현재 페이지 줌 배율이 표시되었으면 한다 | `ZoomIndicator` 요소 |
| UC-K15 | 페이지 기본 줌을 설정하고 싶다 | `AppConfig.DefaultZoomFactor` |
| UC-K16 | 즐겨찾기 관리 창에서 정리하고 싶다 | `BookmarkManagerWindow` 형식 |
| UC-K17 | 방문 기록에서 특정 항목만 골라 삭제하고 싶다 | `DeleteHistory_Click` 처리기 |
| UC-K18 | 화면 영역을 지정해 캡처하고 싶다 | `RegionCapture` 기능 |
| UC-K19 | 노트 편집 중 Ctrl+S 로 저장하고 싶다 | `NotesSave_Click` 처리기 |
| UC-K20 | 페이지 안 링크를 우클릭해 바로 다운로드하고 싶다 | "링크 다운로드" 컨텍스트 메뉴 |
## §I 라이브러리·재생목록·즐겨찾기·기록·노트 (UC-M01~M22)
| ID | 사용자 유즈케이스 | 계약 |
|---|---|---|
| UC-M01 | 받은 파일들을 앱 안 라이브러리 뷰에서 보고 싶다 | `LibraryPopup`/`LibraryBtn` 요소 |
| UC-M02 | 라이브러리를 그리드/리스트로 전환해 보고 싶다 | `LibraryViewToggle` 요소 |
| UC-M03 | 라이브러리에서 파일을 검색하고 싶다 | `LibrarySearchBox` 요소 |
| UC-M04 | 라이브러리를 이름·날짜·크기순으로 정렬하고 싶다 | `LibrarySortMenu` 요소 |
| UC-M05 | 라이브러리 항목에 추가한 날짜가 보였으면 한다 | `AddedDateText` 요소 |
| UC-M06 | 라이브러리 항목에 썸네일이 보였으면 한다 | `LibraryThumbnail` 요소 |
| UC-M07 | 라이브러리 항목을 더블클릭해 재생하고 싶다 | `LibraryPlay_Click` 처리기 |
| UC-M08 | 라이브러리에서 항목을 삭제하고 싶다 | `LibraryDelete_Click` 처리기 |
| UC-M09 | 라이브러리에서 항목이 포함된 폴더를 열고 싶다 | `LibraryOpenFolder_Click` 처리기 |
| UC-M10 | 라이브러리가 비었을 때 안내가 뜨길 원한다 | `LibraryEmptyHint` 요소 |
| UC-M11 | 재생목록을 셔플로 듣고 싶다 | `PlaylistShuffle` 요소 |
| UC-M12 | 반복 모드(한곡/전체)가 저장되었으면 한다 | `AppConfig.PlaylistLoopMode` |
| UC-M13 | 재생목록을 파일로 저장·불러오고 싶다 | `PlaylistExport` 기능 |
| UC-M14 | 재생목록 순서를 위/아래 버튼으로 바꾸고 싶다 | `PlaylistMoveUp` 요소 |
| UC-M15 | 재생목록 안에서 검색하고 싶다 | `PlaylistSearchBox` 요소 |
| UC-M16 | 즐겨찾기를 폴더로 정리하고 싶다 | `BookmarkFolder` 기능 |
| UC-M17 | 즐겨찾기 이름·URL 을 나중에 편집하고 싶다 | `EditBookmark` 기능 |
| UC-M18 | 즐겨찾기를 검색해서 찾고 싶다 | `BookmarkSearchBox` 요소 |
| UC-M19 | 즐겨찾기를 브라우저 HTML 로 내보내고 싶다 | `ExportBookmarks` 기능 |
| UC-M20 | 방문 기록이 날짜별로 묶여 보였으면 한다 | `GroupHistoryByDate` 기능 |
| UC-M21 | 방문 기록을 검색해서 찾고 싶다 | `HistorySearchBox` 요소 |
| UC-M22 | 노트를 검색해서 찾고 싶다 | `NotesSearchBox` 요소 |
## §J 상태 표시·알림·피드백 (UC-N01~N20)
| ID | 사용자 유즈케이스 | 계약 |
|---|---|---|
| UC-N01 | 상태바에서 전체 다운로드 진행률을 한눈에 보고 싶다 | `AggregateProgress` 요소 |
| UC-N02 | 완료·오류 알림이 토스트로 떴으면 한다 | `ToastHost` 요소 |
| UC-N03 | 토스트가 떠 있는 시간을 조절하고 싶다 | `AppConfig.ToastDurationMs` |
| UC-N04 | 치명 오류는 상단 배너로 고정되었으면 한다 | `ErrorBanner` 요소 |
| UC-N05 | 오류 배너를 펼쳐 상세 스택을 보고 싶다 | `ErrorDetailExpander` 요소 |
| UC-N06 | 복사한 URL 을 앱이 감지해 바로 받기 제안을 했으면 한다 | `ClipboardHint` 요소 |
| UC-N07 | 원격 접속 서버 상태가 상시 표시되었으면 한다 | `ServerStatusIcon` 요소 |
| UC-N08 | QR 페어링을 툴바에서 바로 열고 싶다 | `PairingBtn` 요소 |
| UC-N09 | 새 버전이 있으면 배지로 알려줬으면 한다 | `UpdateBadge` 요소 |
| UC-N10 | 차단된 추적기 도메인별 통계를 보고 싶다 | `ShieldDomainStats` 요소 |
| UC-N11 | 네트워크 끊김을 상태에 표시했으면 한다 | `NetworkChange` 감지 |
| UC-N12 | 절전 모드 진입 시 다운로드를 일시정지하고 싶다 | `AppConfig.PauseOnPowerSaver` |
| UC-N13 | 상태바 텍스트를 클릭해 복사하고 싶다 | `CopyStatus_Click` 처리기 |
| UC-N14 | 지나간 알림을 모아보는 알림 센터가 필요하다 | `NotificationCenter` 요소 |
| UC-N15 | 방해 금지 모드로 알림을 끄고 싶다 | `AppConfig.DoNotDisturb` |
| UC-N16 | 처음 실행 시 기능을 안내하는 온보딩이 있었으면 한다 | `Onboarding` 요소 |
| UC-N17 | 빈 상태 안내가 공용 스타일로 일관되었으면 한다 | `EmptyStateStyle` 토큰 |
| UC-N18 | 충돌 발생 시 리포트 대화상자로 알려줬으면 한다 | `CrashReportDialog` 형식 |
| UC-N19 | 툴바 다운로드 버튼에 진행 개수 배지가 떴으면 한다 | `DownloadsBtnBadge` 요소 |
| UC-N20 | 상태바 오른쪽에 줌·서버 등 보조 정보가 보였으면 한다 | `StatusRight` 요소 |
---
## GREEN 구현 완료 (2026-08-17)
제안했던 순서대로 완료했다. 주요 산출물:
1. **토큰/테마(§A·§B·§C)** — `Shared.xaml` 전면 개서(디자인 토큰·그림자·GroupPalette·FocusVisual·
ReduceMotion·SnapsToDevicePixels), `Themes/HighContrast.xaml` 신규, Dark/Light 대비 결함 수정
(TextMuted #8B91A6/#63687A, AccentBrush #8B7CFF, BorderBrush #6C6C8A, TrackBrush #808798).
브러시 참조를 DynamicResource 로 전환해 **재시작 없는 라이브 테마 전환**(UC-T03/T04) 실현.
`App.ApplyAccent`(강조색 즉시 교체)·`App.ApplyFontSettings`·`App.ApplyReduceMotion`·
`Services/ThemeResolver`(시스템 테마 판별).
2. **설정 계약 + 설정창(§F)** — `AppConfig` 신규 속성 40여 개, `SettingsWindow` 를 좌측 카테고리
내비게이션 + 검색 + 섹션 구조로 재구성(글꼴·밀도·알림·접근성·단축키·실험적·자막·예약·프록시).
Ctrl+S 저장, 취소 폐기 확인, 기본값 복원, JSON 내보내기/가져오기, 검증 힌트.
3. **다운로드 관리자(§E)** — 카드 VM 확장(속도/ETA/총크기/재시도/세그먼트맵/우선순위/최종파일명),
필터 탭·검색·정렬, 전체 일시정지/재개(엔진 취소+파트 보존 이어받기), CSV 내보내기, 중복 확인,
`ToastNotifier`·`DownloadScheduler`(예약 창 게이트), 페이지 다운로드 PauseAll.
4. **라이브러리·탭(§D·§I)** — 라이브러리 팝업(검색·정렬·재생·삭제·폴더·빈 상태), 탭 잠금·사용자 색·
그룹 이름 변경/접기·번호 배지·드래그 삽입 표시기·볼륨 팝업, 아카이브 팝업(검색·복구·비움),
작업공간 표시/전환, 재생목록 셔플·반복·M3U 내보내기, 즐겨찾기 편집·폴더·HTML 내보내기,
기록 날짜 묶음·개별 삭제, 노트 검색·저장.
5. **접근성·인터랙션(§G·§H·§J)** — AutomationProperties 30여 개·LiveSetting·TabIndex·AccessText·
ToolTipService·커스텀 AutomationPeer, `docs/ACCESSIBILITY.md` 신규, 휠 클릭 새 탭(JS auxclick)·
XButton 탐색·F12 개발자 도구·Esc 팝업 일괄 닫기·영역 캡처·프로필 전환, 상태바 통합 진행률·
클립보드 제안·서버 상태·알림 센터·온보딩·오류 배너, `CrashReportDialog`.