30 KiB
30 KiB
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)
제안했던 순서대로 완료했다. 주요 산출물:
- 토큰/테마(§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(시스템 테마 판별). - 설정 계약 + 설정창(§F) —
AppConfig신규 속성 40여 개,SettingsWindow를 좌측 카테고리 내비게이션 + 검색 + 섹션 구조로 재구성(글꼴·밀도·알림·접근성·단축키·실험적·자막·예약·프록시). Ctrl+S 저장, 취소 폐기 확인, 기본값 복원, JSON 내보내기/가져오기, 검증 힌트. - 다운로드 관리자(§E) — 카드 VM 확장(속도/ETA/총크기/재시도/세그먼트맵/우선순위/최종파일명),
필터 탭·검색·정렬, 전체 일시정지/재개(엔진 취소+파트 보존 이어받기), CSV 내보내기, 중복 확인,
ToastNotifier·DownloadScheduler(예약 창 게이트), 페이지 다운로드 PauseAll. - 라이브러리·탭(§D·§I) — 라이브러리 팝업(검색·정렬·재생·삭제·폴더·빈 상태), 탭 잠금·사용자 색· 그룹 이름 변경/접기·번호 배지·드래그 삽입 표시기·볼륨 팝업, 아카이브 팝업(검색·복구·비움), 작업공간 표시/전환, 재생목록 셔플·반복·M3U 내보내기, 즐겨찾기 편집·폴더·HTML 내보내기, 기록 날짜 묶음·개별 삭제, 노트 검색·저장.
- 접근성·인터랙션(§G·§H·§J) — AutomationProperties 30여 개·LiveSetting·TabIndex·AccessText·
ToolTipService·커스텀 AutomationPeer,
docs/ACCESSIBILITY.md신규, 휠 클릭 새 탭(JS auxclick)· XButton 탐색·F12 개발자 도구·Esc 팝업 일괄 닫기·영역 캡처·프로필 전환, 상태바 통합 진행률· 클립보드 제안·서버 상태·알림 센터·온보딩·오류 배너,CrashReportDialog.