docs(creator): 라이브 오디오 후속 보정을 기록한다
This commit is contained in:
@@ -119,6 +119,148 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### Phase 9: 라이브/오디오 탭 마지막 아이템 잘림 수정
|
||||||
|
|
||||||
|
- [x] **Task 9.1: ViewPager 높이 계산 회귀 테스트 추가**
|
||||||
|
- 수정:
|
||||||
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt`
|
||||||
|
- 작업:
|
||||||
|
- `ViewPager2` 자체 bottom padding이 있는 상태에서 현재 page 측정 높이만 layout height로 적용하면 하단 컨텐츠가 padding 영역만큼 잘릴 수 있음을 테스트로 고정한다.
|
||||||
|
- `updateViewPagerHeight()`가 측정된 page 높이에 `ViewPager2` vertical padding을 포함해 layout height를 계산하는지 검증한다.
|
||||||
|
- 검증 명령:
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"`
|
||||||
|
- 기대 결과:
|
||||||
|
- 구현 전에는 padding 포함 계산이 없어 RED 실패한다.
|
||||||
|
- 검증 기록:
|
||||||
|
- 2026-06-19: `CreatorChannelActivitySourceTest`에 `ViewPager2` 자체 vertical padding을 height 계산에 포함해야 한다는 회귀 테스트를 추가했다. 구현 전 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` 실행은 sandbox의 `~/.gradle` lock 접근 제한으로 실패했고, 권한 승인 후 재실행 결과 신규 테스트가 `CreatorChannelActivitySourceTest.kt:391`에서 실패해 RED를 확인했다.
|
||||||
|
|
||||||
|
- [x] **Task 9.2: ViewPager 높이 계산 보정**
|
||||||
|
- 수정:
|
||||||
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
|
||||||
|
- 작업:
|
||||||
|
- `currentPage.measuredHeight`에 `binding.viewPager.paddingTop + binding.viewPager.paddingBottom`을 더한 값을 `ViewPager2` layout height로 적용한다.
|
||||||
|
- 기존 `NestedScrollView` 소유 스크롤, sticky tabbar, 라이브/오디오 pagination 구조는 변경하지 않는다.
|
||||||
|
- 검증 명령:
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"`
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Live*"`
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.*"`
|
||||||
|
- `./gradlew :app:compileDebugKotlin`
|
||||||
|
- `./gradlew :app:ktlintCheck`
|
||||||
|
- 기대 결과:
|
||||||
|
- 라이브/오디오 탭의 마지막 아이템이 `ViewPager2` bottom padding만큼 잘리지 않도록 height 계산이 보정되고 관련 테스트가 PASS한다.
|
||||||
|
- 검증 기록:
|
||||||
|
- 2026-06-19: 원인 확인 결과, `setupOwnerFabInsets()`가 `ViewPager2` 자체에 96dp bottom padding을 적용하지만 `updateViewPagerHeight()`는 현재 page의 `measuredHeight`만 layout height로 반영하고 있었다. 이 때문에 `ViewPager2` 내부 표시 영역이 padding만큼 줄어 마지막 item이 1개뿐이어도 하단이 잘릴 수 있었다.
|
||||||
|
- 2026-06-19: `updateViewPagerHeight()`에서 `currentPage.measuredHeight + binding.viewPager.paddingTop + binding.viewPager.paddingBottom`을 target height로 적용하도록 보정했다. 보정 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` 실행 결과 `BUILD SUCCESSFUL in 22s`로 통과했다.
|
||||||
|
- 2026-06-19: 추가 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Live*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.*"`, `./gradlew :app:compileDebugKotlin`이 모두 `BUILD SUCCESSFUL`로 통과했다. 최초 sandbox 실행은 `~/.gradle` wrapper lock 접근 제한으로 실패해 권한 승인 후 재실행했다.
|
||||||
|
|
||||||
|
- [x] **Task 9.3: 라이브/오디오 empty 문구 위치 회귀 테스트 추가**
|
||||||
|
- 수정:
|
||||||
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveFragmentLayoutTest.kt`
|
||||||
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/CreatorChannelAudioFragmentLayoutTest.kt`
|
||||||
|
- 작업:
|
||||||
|
- 라이브/오디오 empty container가 스크롤 전 화면에서 보이도록 상단 기준 여백 배치를 사용하는지 테스트로 고정한다.
|
||||||
|
- empty container가 과도하게 낮은 중앙 배치가 되지 않도록 `FrameLayout` center gravity 의존을 제거하는지 검증한다.
|
||||||
|
- 검증 명령:
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.CreatorChannelLiveFragmentLayoutTest"`
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioFragmentLayoutTest"`
|
||||||
|
- 기대 결과:
|
||||||
|
- 구현 전에는 empty 문구 상단 배치 정책이 없어 RED 실패한다.
|
||||||
|
- 검증 기록:
|
||||||
|
- 2026-06-19: 라이브/오디오 empty 문구가 상단 가시 영역에 배치되어야 한다는 레이아웃 테스트를 추가했다. 구현 전 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.CreatorChannelLiveFragmentLayoutTest"`는 `CreatorChannelLiveFragmentLayoutTest.kt:85`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioFragmentLayoutTest"`는 `CreatorChannelAudioFragmentLayoutTest.kt:76`에서 실패해 RED를 확인했다.
|
||||||
|
|
||||||
|
- [x] **Task 9.4: 라이브/오디오 empty 문구 상단 가시 영역 배치**
|
||||||
|
- 수정:
|
||||||
|
- `app/src/main/res/layout/fragment_creator_channel_live.xml`
|
||||||
|
- `app/src/main/res/layout/fragment_creator_channel_audio.xml`
|
||||||
|
- 작업:
|
||||||
|
- empty container를 상단 constraint 기준으로 두고, 안내 문구는 컨테이너 상단에서 적절한 margin을 둔 위치에 배치한다.
|
||||||
|
- 기존 empty minHeight 전달 구조는 유지해 짧은 탭에서도 sticky scroll range가 부족하지 않게 한다.
|
||||||
|
- 검증 명령:
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.CreatorChannelLiveFragmentLayoutTest"`
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioFragmentLayoutTest"`
|
||||||
|
- `./gradlew :app:mergeDebugResources`
|
||||||
|
- `./gradlew :app:compileDebugKotlin`
|
||||||
|
- `./gradlew :app:ktlintCheck`
|
||||||
|
- 기대 결과:
|
||||||
|
- 라이브/오디오 empty 문구가 스크롤 없이 보이는 상단 가시 영역에 배치되고 레이아웃/컴파일/린트 검증이 PASS한다.
|
||||||
|
- 검증 기록:
|
||||||
|
- 2026-06-19: 원인 확인 결과, empty 상태는 컨텐츠가 없어도 Activity가 전달한 viewport `minimumHeight`를 가진 컨테이너 중앙에 문구를 배치하고 있었다. 탭 컨텐츠가 화면 아래에서 시작하거나 sticky 보정 전후 타이밍에서는 이 중앙 위치가 화면 하단 밖으로 밀려 스크롤 전 문구가 보이지 않을 수 있었다.
|
||||||
|
- 2026-06-19: `fragment_creator_channel_live.xml`, `fragment_creator_channel_audio.xml`의 empty container 중앙 gravity 의존을 제거하고, container 상단 기준 `spacing_48` top padding과 문구 `top|center_horizontal` 배치로 보정했다. 오디오 empty container의 parent bottom constraint도 제거해 낮은 중앙 배치를 만들지 않도록 했다.
|
||||||
|
- 2026-06-19: 보정 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.CreatorChannelLiveFragmentLayoutTest"`와 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioFragmentLayoutTest"`가 모두 `BUILD SUCCESSFUL`로 통과했다.
|
||||||
|
- 2026-06-19: 후속 수정 전체 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Live*" --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.*"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`가 모두 `BUILD SUCCESSFUL`로 통과했다. `ktlintCheck`에서는 기존 `.editorconfig`의 `disabled_rules` deprecation 경고가 계속 출력됐다.
|
||||||
|
|
||||||
|
- [x] **Task 9.5: empty 상태 스크롤 이동 원인 회귀 테스트 추가**
|
||||||
|
- 수정:
|
||||||
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveFragmentLayoutTest.kt`
|
||||||
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/CreatorChannelAudioFragmentLayoutTest.kt`
|
||||||
|
- 작업:
|
||||||
|
- 라이브/오디오 empty 상태가 Activity viewport `minimumHeight` 보정에 의존하지 않는지 테스트로 고정한다.
|
||||||
|
- empty 상태에서 문구 표시만을 위해 추가 스크롤 영역을 만들지 않도록 `layoutCreatorChannel*Empty.minimumHeight` 적용이 제거됐는지 검증한다.
|
||||||
|
- 검증 명령:
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.CreatorChannelLiveFragmentLayoutTest"`
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioFragmentLayoutTest"`
|
||||||
|
- 기대 결과:
|
||||||
|
- 구현 전에는 empty minHeight 적용 코드가 남아 RED 실패한다.
|
||||||
|
- 검증 기록:
|
||||||
|
- 2026-06-19: empty 상태가 `minimumHeight` 보정에 의존하지 않아야 한다는 테스트로 라이브/오디오 Fragment layout test를 갱신했다. production 보정 전 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.CreatorChannelLiveFragmentLayoutTest"`는 `CreatorChannelLiveFragmentLayoutTest.kt:74`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioFragmentLayoutTest"`는 `CreatorChannelAudioFragmentLayoutTest.kt:145`에서 실패해 RED를 확인했다. 병렬 실행 중 Kotlin daemon incremental cache 경합 로그가 출력됐으나 실패 원인은 신규 테스트 assertion이었다.
|
||||||
|
|
||||||
|
- [x] **Task 9.6: empty 상태 minHeight 보정 제거**
|
||||||
|
- 수정:
|
||||||
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveFragment.kt`
|
||||||
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/CreatorChannelAudioFragment.kt`
|
||||||
|
- 작업:
|
||||||
|
- empty container에 Activity viewport height를 minimumHeight로 적용하지 않는다.
|
||||||
|
- `onCreatorChannel*ViewportHeightChanged()` API는 Activity 호출 계약 유지를 위해 남기되 empty layout 높이를 변경하지 않도록 한다.
|
||||||
|
- 기존 content/list height 보정과 마지막 item 잘림 보정은 유지한다.
|
||||||
|
- 검증 명령:
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.CreatorChannelLiveFragmentLayoutTest"`
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioFragmentLayoutTest"`
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Live*" --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.*"`
|
||||||
|
- `./gradlew :app:compileDebugKotlin`
|
||||||
|
- `./gradlew :app:ktlintCheck`
|
||||||
|
- 기대 결과:
|
||||||
|
- empty 상태에서 문구 자체를 위한 추가 scroll range가 없어지고, 기존 라이브/오디오 탭 회귀 테스트가 PASS한다.
|
||||||
|
- 검증 기록:
|
||||||
|
- 2026-06-19: 원인 확인 결과, 라이브/오디오 empty 문구가 Fragment 컨텐츠 내부에 있고 `layoutCreatorChannel*Empty.minimumHeight`가 Activity viewport 높이로 설정되어 empty 상태에서도 추가 scroll range가 만들어졌다. 따라서 스크롤 시 문구가 컨텐츠와 함께 움직였다.
|
||||||
|
- 2026-06-19: `CreatorChannelLiveFragment`, `CreatorChannelAudioFragment`에서 `emptyMinHeight` 상태, `applyEmptyMinHeight()`, empty bind 시 minimumHeight 적용을 제거했다. Activity가 호출하는 `onCreatorChannel*ViewportHeightChanged(minHeight)`는 기존 호출 계약 유지를 위해 no-op으로 남겼다.
|
||||||
|
- 2026-06-19: 보정 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.CreatorChannelLiveFragmentLayoutTest"`는 `BUILD SUCCESSFUL in 47s`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioFragmentLayoutTest"`는 `BUILD SUCCESSFUL in 9s`로 통과했다.
|
||||||
|
- 2026-06-19: 후속 회귀 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Live*" --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.*"`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`가 모두 `BUILD SUCCESSFUL`로 통과했다. `ktlintCheck`에서는 기존 `.editorconfig`의 `disabled_rules` deprecation 경고가 계속 출력됐다.
|
||||||
|
|
||||||
|
- [x] **Task 9.7: 오디오 소장률 카운트 색상 회귀 테스트 추가**
|
||||||
|
- Figma:
|
||||||
|
- `290:9029`
|
||||||
|
- 수정:
|
||||||
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/CreatorChannelAudioFragmentLayoutTest.kt`
|
||||||
|
- 작업:
|
||||||
|
- 소장률 카드 오른쪽 `구매한 콘텐츠 수/전체 유료 콘텐츠 수` 중 구매한 수는 기본 white, `/전체 유료 콘텐츠 수`는 gray 계열 span으로 표시하는 계약을 테스트로 고정한다.
|
||||||
|
- 검증 명령:
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioFragmentLayoutTest"`
|
||||||
|
- 기대 결과:
|
||||||
|
- 구현 전에는 오른쪽 count 부분 색상 span이 없어 RED 실패한다.
|
||||||
|
- 검증 기록:
|
||||||
|
- 2026-06-19: Figma `290:9029`를 확인해 오른쪽 count에서 구매한 콘텐츠 수는 white, `/전체 유료 콘텐츠 수`는 gray로 분리되어야 함을 확인했다. `CreatorChannelAudioFragmentLayoutTest`에 count span 계약을 추가했고, production 보정 전 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioFragmentLayoutTest"` 실행 결과 `CreatorChannelAudioFragmentLayoutTest.kt:172`에서 실패해 RED를 확인했다.
|
||||||
|
|
||||||
|
- [x] **Task 9.8: 오디오 소장률 카운트 부분 색상 적용**
|
||||||
|
- 수정:
|
||||||
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/CreatorChannelAudioFragment.kt`
|
||||||
|
- 작업:
|
||||||
|
- `tvCreatorChannelAudioRateCount`에 표시하는 문자열을 `SpannableString`으로 변환한다.
|
||||||
|
- 구매한 콘텐츠 수는 TextView 기본 white를 유지하고, `/전체 유료 콘텐츠 수` 범위에 `R.color.gray_500` `ForegroundColorSpan`을 적용한다.
|
||||||
|
- 기존 소장률 퍼센트 `soda_400` highlight는 유지한다.
|
||||||
|
- 검증 명령:
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioFragmentLayoutTest"`
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.*"`
|
||||||
|
- `./gradlew :app:compileDebugKotlin`
|
||||||
|
- `./gradlew :app:ktlintCheck`
|
||||||
|
- 기대 결과:
|
||||||
|
- Figma `290:9029`와 같이 소장률 오른쪽 카운트의 구매 수와 전체 유료 수 색상이 분리되고 관련 검증이 PASS한다.
|
||||||
|
- 검증 기록:
|
||||||
|
- 2026-06-19: `CreatorChannelAudioFragment.bindRate()`에서 `tvCreatorChannelAudioRateCount` 표시 문자열을 `SpannableString`으로 변환하고, 구매한 콘텐츠 수 이후 범위(`/전체 유료 콘텐츠 수`)에 `R.color.gray_500` `ForegroundColorSpan`을 적용했다. 구매한 콘텐츠 수는 TextView 기본 white를 유지한다.
|
||||||
|
- 2026-06-19: 보정 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.CreatorChannelAudioFragmentLayoutTest"` 실행 결과 `BUILD SUCCESSFUL in 25s`로 통과했다.
|
||||||
|
- 2026-06-19: 후속 회귀 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.audio.*"`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`가 모두 `BUILD SUCCESSFUL`로 통과했다. `ktlintCheck`에서는 기존 `.editorconfig`의 `disabled_rules` deprecation 경고가 계속 출력됐다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### Phase 1: 기존 구조 확인과 작업 경계 고정
|
### Phase 1: 기존 구조 확인과 작업 경계 고정
|
||||||
|
|
||||||
- [x] **Task 1.1: 크리에이터 채널 탭 구조와 본인 판정 경로 확인**
|
- [x] **Task 1.1: 크리에이터 채널 탭 구조와 본인 판정 경로 확인**
|
||||||
|
|||||||
@@ -12,6 +12,10 @@
|
|||||||
- 목록이 길어질 수 있으므로 `CreatorChannelLiveTabResponse.hasNext == true`일 때 다음 페이지를 자동 로딩해야 한다.
|
- 목록이 길어질 수 있으므로 `CreatorChannelLiveTabResponse.hasNext == true`일 때 다음 페이지를 자동 로딩해야 한다.
|
||||||
- 정렬 label은 앱 다국어 정책에 맞춰 문자열 리소스로 관리해야 한다.
|
- 정렬 label은 앱 다국어 정책에 맞춰 문자열 리소스로 관리해야 한다.
|
||||||
- Sort-bar의 정렬 메뉴 표시 방식은 Figma 컨텍스트 메뉴와 BottomSheet 중 선택이 필요하며, 모바일 UX 흐름에 맞는 기준이 필요하다.
|
- Sort-bar의 정렬 메뉴 표시 방식은 Figma 컨텍스트 메뉴와 BottomSheet 중 선택이 필요하며, 모바일 UX 흐름에 맞는 기준이 필요하다.
|
||||||
|
- 2026-06-19 후속 수정: `라이브`/`오디오` 탭에서 아이템이 1개뿐이어도 마지막 아이템 하단이 잘려 보인다. 탭 컨텐츠가 `ViewPager2` 내부에서 측정 높이보다 작게 표시되지 않도록 보정해야 한다.
|
||||||
|
- 2026-06-19 후속 수정: 오디오 콘텐츠가 없는 empty 상태의 안내 문구가 화면 아래쪽에 배치되어 스크롤 전에는 보이지 않는다. `라이브` 탭 empty 상태도 함께 확인해 empty 문구가 스크롤 없이 보이도록 배치해야 한다.
|
||||||
|
- 2026-06-19 후속 수정: empty 문구가 스크롤 없이 보이도록 상단 배치한 뒤에도, empty 상태에서 스크롤 시 문구가 컨텐츠와 함께 움직인다. empty 상태는 불필요한 내부 스크롤 영역을 만들지 않아야 한다.
|
||||||
|
- 2026-06-19 후속 수정: Figma `290:9029` 기준 소장률 카드 오른쪽 카운트는 구매한 콘텐츠 수와 전체 유료 콘텐츠 수의 색상이 달라야 한다.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -26,6 +30,10 @@
|
|||||||
- 응답의 `hasNext`가 `true`이면 현재 `page + 1` 페이지를 추가 로딩한다.
|
- 응답의 `hasNext`가 `true`이면 현재 `page + 1` 페이지를 추가 로딩한다.
|
||||||
- 정렬 label과 상태 문구는 다국어 문자열 리소스로 관리한다.
|
- 정렬 label과 상태 문구는 다국어 문자열 리소스로 관리한다.
|
||||||
- 로그인 사용자가 해당 크리에이터 본인이면 라이브 탭 하단에 고정된 `라이브 시작하기` 버튼을 표시한다.
|
- 로그인 사용자가 해당 크리에이터 본인이면 라이브 탭 하단에 고정된 `라이브 시작하기` 버튼을 표시한다.
|
||||||
|
- `라이브`/`오디오` 탭의 컨텐츠가 1개 또는 여러 개일 때 모두 마지막 아이템이 잘리지 않고 완전히 표시된다.
|
||||||
|
- `라이브`/`오디오` 탭의 empty 문구는 탭 선택 직후 스크롤 없이 화면 안에서 확인할 수 있다.
|
||||||
|
- `라이브`/`오디오` 탭 empty 상태에서는 문구 표시를 위해 별도 scroll range를 만들지 않는다.
|
||||||
|
- 오디오 소장률 카드에서 구매한 콘텐츠 수는 white, `/전체 유료 콘텐츠 수`는 gray 계열로 표시한다.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -260,6 +268,10 @@ Sort-bar는 라이브 다시듣기 총 개수와 현재 정렬 상태를 표시
|
|||||||
- 본인 채널의 `라이브 시작하기` 버튼은 Figma `665:19359`처럼 하단 고정 CTA로 표시하고, 목록 컨텐츠 위를 덮지 않도록 스크롤 하단 여백을 확보한다.
|
- 본인 채널의 `라이브 시작하기` 버튼은 Figma `665:19359`처럼 하단 고정 CTA로 표시하고, 목록 컨텐츠 위를 덮지 않도록 스크롤 하단 여백을 확보한다.
|
||||||
- 전체 empty 상태는 Figma `290:8959`처럼 Sort-bar와 리스트 없이 중앙 안내 문구를 표시한다.
|
- 전체 empty 상태는 Figma `290:8959`처럼 Sort-bar와 리스트 없이 중앙 안내 문구를 표시한다.
|
||||||
- 다국어 문자열 길이 증가 시 title, 정렬 label, 상태 문구가 겹치지 않도록 말줄임 또는 최소 폭 정책을 적용한다.
|
- 다국어 문자열 길이 증가 시 title, 정렬 label, 상태 문구가 겹치지 않도록 말줄임 또는 최소 폭 정책을 적용한다.
|
||||||
|
- `ViewPager2` 하단 padding 또는 고정 CTA/FAB 여백이 탭 컨텐츠의 실제 표시 영역을 줄여 마지막 아이템을 가리지 않아야 한다.
|
||||||
|
- empty 상태의 안내 문구는 전체 빈 공간의 과도하게 낮은 중앙이 아니라, 탭 컨텐츠 진입 직후 사용자가 볼 수 있는 상단 영역에 배치한다.
|
||||||
|
- empty 상태의 안내 문구는 컨텐츠 높이 보정을 위한 `minimumHeight`에 의존하지 않는다.
|
||||||
|
- 소장률 카드 오른쪽 카운트는 Figma `290:9029`처럼 부분 색상 span을 적용한다.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user