diff --git a/docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase9-carousel-badge-width-evidence/README.md b/docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase9-carousel-badge-width-evidence/README.md new file mode 100644 index 00000000..10f3f9dd --- /dev/null +++ b/docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase9-carousel-badge-width-evidence/README.md @@ -0,0 +1,9 @@ +# 페이지 배지 렌더링 증거 + +- `before-after.png`: 수정 전/후 48개 조합. 전체 앱 화면이 아닌 실제 `pageIndicator` 본문 추출 렌더링이다. +- `simulator-screen.png`: iOS 18.3 SE 3세대에서 실행한 임시 QA 앱 화면. +- `metrics.json`: 실제 iOS SwiftUI 측정값. 각 배지 너비 = 개별 텍스트 너비 합 + 간격 2pt + 패딩 12pt, 높이 = 한 줄 높이 + 패딩 8pt. +- 대상 제품 소스 SHA-256: `3dc39a2bcb081ed0013a8940f22537b79765353881e0f9468aae98f547bcde19`. +- 실제 앱의 FontModifier, Spacing, 색상 및 Pretendard/Noto Sans JP 폰트를 사용했다. +- 생성된 PNG를 UIKit 화면에 표시해 캡처했으며, 홈·콘텐츠 전체 화면 E2E 증거는 아니다. +- 임시 QA 앱·시뮬레이터·컴파일 캐시는 검증 종료 후 제거했고, 소유 경로와 시뮬레이터의 부재를 확인했다. diff --git a/docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase9-carousel-badge-width-evidence/before-after.png b/docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase9-carousel-badge-width-evidence/before-after.png new file mode 100644 index 00000000..57bac0ec Binary files /dev/null and b/docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase9-carousel-badge-width-evidence/before-after.png differ diff --git a/docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase9-carousel-badge-width-evidence/metrics.json b/docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase9-carousel-badge-width-evidence/metrics.json new file mode 100644 index 00000000..5c0689a7 --- /dev/null +++ b/docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase9-carousel-badge-width-evidence/metrics.json @@ -0,0 +1,1154 @@ +[ + { + "afterHeight" : 27.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 53.5, + "beforeHeight" : 27.5, + "beforeWidth" : 59.5, + "beforeWrapDetected" : false, + "case" : "ko_large_320_1_1", + "containerWidth" : 320, + "count" : 1, + "dynamicType" : "large", + "firstTextWidth" : 17, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 17, + "naturalHStackWidth" : 41.5, + "page" : 1, + "singleLineHeight" : 19.5, + "slashWidth" : 5.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 27.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 55.5, + "beforeHeight" : 27.5, + "beforeWidth" : 59.5, + "beforeWrapDetected" : false, + "case" : "ko_large_320_1_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "large", + "firstTextWidth" : 17, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 19, + "naturalHStackWidth" : 43.5, + "page" : 1, + "singleLineHeight" : 19.5, + "slashWidth" : 5.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 27.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 58, + "beforeHeight" : 27.5, + "beforeWidth" : 59.5, + "beforeWrapDetected" : false, + "case" : "ko_large_320_8_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "large", + "firstTextWidth" : 19.5, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 19, + "naturalHStackWidth" : 46, + "page" : 8, + "singleLineHeight" : 19.5, + "slashWidth" : 5.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 27.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 57.5, + "beforeHeight" : 27.5, + "beforeWidth" : 59.5, + "beforeWrapDetected" : false, + "case" : "ko_large_320_20_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "large", + "firstTextWidth" : 19, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 19, + "naturalHStackWidth" : 45.5, + "page" : 20, + "singleLineHeight" : 19.5, + "slashWidth" : 5.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 27.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 53.5, + "beforeHeight" : 27.5, + "beforeWidth" : 59.5, + "beforeWrapDetected" : false, + "case" : "ko_large_375_1_1", + "containerWidth" : 375, + "count" : 1, + "dynamicType" : "large", + "firstTextWidth" : 17, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 17, + "naturalHStackWidth" : 41.5, + "page" : 1, + "singleLineHeight" : 19.5, + "slashWidth" : 5.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 27.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 55.5, + "beforeHeight" : 27.5, + "beforeWidth" : 59.5, + "beforeWrapDetected" : false, + "case" : "ko_large_375_1_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "large", + "firstTextWidth" : 17, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 19, + "naturalHStackWidth" : 43.5, + "page" : 1, + "singleLineHeight" : 19.5, + "slashWidth" : 5.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 27.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 58, + "beforeHeight" : 27.5, + "beforeWidth" : 59.5, + "beforeWrapDetected" : false, + "case" : "ko_large_375_8_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "large", + "firstTextWidth" : 19.5, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 19, + "naturalHStackWidth" : 46, + "page" : 8, + "singleLineHeight" : 19.5, + "slashWidth" : 5.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 27.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 57.5, + "beforeHeight" : 27.5, + "beforeWidth" : 59.5, + "beforeWrapDetected" : false, + "case" : "ko_large_375_20_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "large", + "firstTextWidth" : 19, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 19, + "naturalHStackWidth" : 45.5, + "page" : 20, + "singleLineHeight" : 19.5, + "slashWidth" : 5.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 33.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 65.5, + "beforeHeight" : 58.5, + "beforeWidth" : 61.5, + "beforeWrapDetected" : true, + "case" : "ko_xxxLarge_320_1_1", + "containerWidth" : 320, + "count" : 1, + "dynamicType" : "xxxLarge", + "firstTextWidth" : 22, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 22, + "naturalHStackWidth" : 53.5, + "page" : 1, + "singleLineHeight" : 25.5, + "slashWidth" : 7.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 33.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 68.5, + "beforeHeight" : 58.5, + "beforeWidth" : 61.5, + "beforeWrapDetected" : true, + "case" : "ko_xxxLarge_320_1_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "xxxLarge", + "firstTextWidth" : 22, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 25, + "naturalHStackWidth" : 56.5, + "page" : 1, + "singleLineHeight" : 25.5, + "slashWidth" : 7.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 33.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 72, + "beforeHeight" : 58.5, + "beforeWidth" : 61.5, + "beforeWrapDetected" : true, + "case" : "ko_xxxLarge_320_8_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "xxxLarge", + "firstTextWidth" : 25.5, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 25, + "naturalHStackWidth" : 60, + "page" : 8, + "singleLineHeight" : 25.5, + "slashWidth" : 7.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 33.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 71.5, + "beforeHeight" : 58.5, + "beforeWidth" : 61.5, + "beforeWrapDetected" : true, + "case" : "ko_xxxLarge_320_20_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "xxxLarge", + "firstTextWidth" : 25, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 25, + "naturalHStackWidth" : 59.5, + "page" : 20, + "singleLineHeight" : 25.5, + "slashWidth" : 7.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 33.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 65.5, + "beforeHeight" : 58.5, + "beforeWidth" : 61.5, + "beforeWrapDetected" : true, + "case" : "ko_xxxLarge_375_1_1", + "containerWidth" : 375, + "count" : 1, + "dynamicType" : "xxxLarge", + "firstTextWidth" : 22, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 22, + "naturalHStackWidth" : 53.5, + "page" : 1, + "singleLineHeight" : 25.5, + "slashWidth" : 7.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 33.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 68.5, + "beforeHeight" : 58.5, + "beforeWidth" : 61.5, + "beforeWrapDetected" : true, + "case" : "ko_xxxLarge_375_1_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "xxxLarge", + "firstTextWidth" : 22, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 25, + "naturalHStackWidth" : 56.5, + "page" : 1, + "singleLineHeight" : 25.5, + "slashWidth" : 7.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 33.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 72, + "beforeHeight" : 58.5, + "beforeWidth" : 61.5, + "beforeWrapDetected" : true, + "case" : "ko_xxxLarge_375_8_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "xxxLarge", + "firstTextWidth" : 25.5, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 25, + "naturalHStackWidth" : 60, + "page" : 8, + "singleLineHeight" : 25.5, + "slashWidth" : 7.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 33.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 71.5, + "beforeHeight" : 58.5, + "beforeWidth" : 61.5, + "beforeWrapDetected" : true, + "case" : "ko_xxxLarge_375_20_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "xxxLarge", + "firstTextWidth" : 25, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 25, + "naturalHStackWidth" : 59.5, + "page" : 20, + "singleLineHeight" : 25.5, + "slashWidth" : 7.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 62, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 123.5, + "beforeHeight" : 115.5, + "beforeWidth" : 69.5, + "beforeWrapDetected" : true, + "case" : "ko_accessibility5_320_1_1", + "containerWidth" : 320, + "count" : 1, + "dynamicType" : "accessibility5", + "firstTextWidth" : 47, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 47, + "naturalHStackWidth" : 111.5, + "page" : 1, + "singleLineHeight" : 54, + "slashWidth" : 15.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 62, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 130, + "beforeHeight" : 115.5, + "beforeWidth" : 69.5, + "beforeWrapDetected" : true, + "case" : "ko_accessibility5_320_1_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "accessibility5", + "firstTextWidth" : 47, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 53.5, + "naturalHStackWidth" : 118, + "page" : 1, + "singleLineHeight" : 54, + "slashWidth" : 15.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 62, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 137.5, + "beforeHeight" : 115.5, + "beforeWidth" : 69.5, + "beforeWrapDetected" : true, + "case" : "ko_accessibility5_320_8_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "accessibility5", + "firstTextWidth" : 54.5, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 53.5, + "naturalHStackWidth" : 125.5, + "page" : 8, + "singleLineHeight" : 54, + "slashWidth" : 15.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 62, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 136.5, + "beforeHeight" : 115.5, + "beforeWidth" : 69.5, + "beforeWrapDetected" : true, + "case" : "ko_accessibility5_320_20_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "accessibility5", + "firstTextWidth" : 53.5, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 53.5, + "naturalHStackWidth" : 124.5, + "page" : 20, + "singleLineHeight" : 54, + "slashWidth" : 15.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 62, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 123.5, + "beforeHeight" : 115.5, + "beforeWidth" : 69.5, + "beforeWrapDetected" : true, + "case" : "ko_accessibility5_375_1_1", + "containerWidth" : 375, + "count" : 1, + "dynamicType" : "accessibility5", + "firstTextWidth" : 47, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 47, + "naturalHStackWidth" : 111.5, + "page" : 1, + "singleLineHeight" : 54, + "slashWidth" : 15.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 62, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 130, + "beforeHeight" : 115.5, + "beforeWidth" : 69.5, + "beforeWrapDetected" : true, + "case" : "ko_accessibility5_375_1_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "accessibility5", + "firstTextWidth" : 47, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 53.5, + "naturalHStackWidth" : 118, + "page" : 1, + "singleLineHeight" : 54, + "slashWidth" : 15.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 62, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 137.5, + "beforeHeight" : 115.5, + "beforeWidth" : 69.5, + "beforeWrapDetected" : true, + "case" : "ko_accessibility5_375_8_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "accessibility5", + "firstTextWidth" : 54.5, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 53.5, + "naturalHStackWidth" : 125.5, + "page" : 8, + "singleLineHeight" : 54, + "slashWidth" : 15.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 62, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 136.5, + "beforeHeight" : 115.5, + "beforeWidth" : 69.5, + "beforeWrapDetected" : true, + "case" : "ko_accessibility5_375_20_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "accessibility5", + "firstTextWidth" : 53.5, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "Pretendard-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 53.5, + "naturalHStackWidth" : 124.5, + "page" : 20, + "singleLineHeight" : 54, + "slashWidth" : 15.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 31.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 56.5, + "beforeHeight" : 31.5, + "beforeWidth" : 60.5, + "beforeWrapDetected" : false, + "case" : "ja_large_320_1_1", + "containerWidth" : 320, + "count" : 1, + "dynamicType" : "large", + "firstTextWidth" : 18, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 18, + "naturalHStackWidth" : 44.5, + "page" : 1, + "singleLineHeight" : 23.5, + "slashWidth" : 6.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 31.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 56.5, + "beforeHeight" : 31.5, + "beforeWidth" : 60.5, + "beforeWrapDetected" : false, + "case" : "ja_large_320_1_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "large", + "firstTextWidth" : 18, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 18, + "naturalHStackWidth" : 44.5, + "page" : 1, + "singleLineHeight" : 23.5, + "slashWidth" : 6.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 31.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 56.5, + "beforeHeight" : 31.5, + "beforeWidth" : 60.5, + "beforeWrapDetected" : false, + "case" : "ja_large_320_8_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "large", + "firstTextWidth" : 18, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 18, + "naturalHStackWidth" : 44.5, + "page" : 8, + "singleLineHeight" : 23.5, + "slashWidth" : 6.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 31.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 56.5, + "beforeHeight" : 31.5, + "beforeWidth" : 60.5, + "beforeWrapDetected" : false, + "case" : "ja_large_320_20_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "large", + "firstTextWidth" : 18, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 18, + "naturalHStackWidth" : 44.5, + "page" : 20, + "singleLineHeight" : 23.5, + "slashWidth" : 6.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 31.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 56.5, + "beforeHeight" : 31.5, + "beforeWidth" : 60.5, + "beforeWrapDetected" : false, + "case" : "ja_large_375_1_1", + "containerWidth" : 375, + "count" : 1, + "dynamicType" : "large", + "firstTextWidth" : 18, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 18, + "naturalHStackWidth" : 44.5, + "page" : 1, + "singleLineHeight" : 23.5, + "slashWidth" : 6.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 31.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 56.5, + "beforeHeight" : 31.5, + "beforeWidth" : 60.5, + "beforeWrapDetected" : false, + "case" : "ja_large_375_1_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "large", + "firstTextWidth" : 18, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 18, + "naturalHStackWidth" : 44.5, + "page" : 1, + "singleLineHeight" : 23.5, + "slashWidth" : 6.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 31.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 56.5, + "beforeHeight" : 31.5, + "beforeWidth" : 60.5, + "beforeWrapDetected" : false, + "case" : "ja_large_375_8_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "large", + "firstTextWidth" : 18, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 18, + "naturalHStackWidth" : 44.5, + "page" : 8, + "singleLineHeight" : 23.5, + "slashWidth" : 6.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 31.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 56.5, + "beforeHeight" : 31.5, + "beforeWidth" : 60.5, + "beforeWrapDetected" : false, + "case" : "ja_large_375_20_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "large", + "firstTextWidth" : 18, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 18, + "naturalHStackWidth" : 44.5, + "page" : 20, + "singleLineHeight" : 23.5, + "slashWidth" : 6.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 38.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 69.5, + "beforeHeight" : 69, + "beforeWidth" : 62.5, + "beforeWrapDetected" : true, + "case" : "ja_xxxLarge_320_1_1", + "containerWidth" : 320, + "count" : 1, + "dynamicType" : "xxxLarge", + "firstTextWidth" : 23.5, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 23.5, + "naturalHStackWidth" : 57.5, + "page" : 1, + "singleLineHeight" : 30.5, + "slashWidth" : 8.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 38.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 69.5, + "beforeHeight" : 69, + "beforeWidth" : 62.5, + "beforeWrapDetected" : true, + "case" : "ja_xxxLarge_320_1_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "xxxLarge", + "firstTextWidth" : 23.5, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 23.5, + "naturalHStackWidth" : 57.5, + "page" : 1, + "singleLineHeight" : 30.5, + "slashWidth" : 8.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 38.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 69.5, + "beforeHeight" : 69, + "beforeWidth" : 62.5, + "beforeWrapDetected" : true, + "case" : "ja_xxxLarge_320_8_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "xxxLarge", + "firstTextWidth" : 23.5, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 23.5, + "naturalHStackWidth" : 57.5, + "page" : 8, + "singleLineHeight" : 30.5, + "slashWidth" : 8.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 38.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 69.5, + "beforeHeight" : 69, + "beforeWidth" : 62.5, + "beforeWrapDetected" : true, + "case" : "ja_xxxLarge_320_20_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "xxxLarge", + "firstTextWidth" : 23.5, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 23.5, + "naturalHStackWidth" : 57.5, + "page" : 20, + "singleLineHeight" : 30.5, + "slashWidth" : 8.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 38.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 69.5, + "beforeHeight" : 69, + "beforeWidth" : 62.5, + "beforeWrapDetected" : true, + "case" : "ja_xxxLarge_375_1_1", + "containerWidth" : 375, + "count" : 1, + "dynamicType" : "xxxLarge", + "firstTextWidth" : 23.5, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 23.5, + "naturalHStackWidth" : 57.5, + "page" : 1, + "singleLineHeight" : 30.5, + "slashWidth" : 8.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 38.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 69.5, + "beforeHeight" : 69, + "beforeWidth" : 62.5, + "beforeWrapDetected" : true, + "case" : "ja_xxxLarge_375_1_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "xxxLarge", + "firstTextWidth" : 23.5, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 23.5, + "naturalHStackWidth" : 57.5, + "page" : 1, + "singleLineHeight" : 30.5, + "slashWidth" : 8.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 38.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 69.5, + "beforeHeight" : 69, + "beforeWidth" : 62.5, + "beforeWrapDetected" : true, + "case" : "ja_xxxLarge_375_8_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "xxxLarge", + "firstTextWidth" : 23.5, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 23.5, + "naturalHStackWidth" : 57.5, + "page" : 8, + "singleLineHeight" : 30.5, + "slashWidth" : 8.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 38.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 69.5, + "beforeHeight" : 69, + "beforeWidth" : 62.5, + "beforeWrapDetected" : true, + "case" : "ja_xxxLarge_375_20_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "xxxLarge", + "firstTextWidth" : 23.5, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 23.5, + "naturalHStackWidth" : 57.5, + "page" : 20, + "singleLineHeight" : 30.5, + "slashWidth" : 8.5, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 73.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 132, + "beforeHeight" : 138.5, + "beforeWidth" : 72, + "beforeWrapDetected" : true, + "case" : "ja_accessibility5_320_1_1", + "containerWidth" : 320, + "count" : 1, + "dynamicType" : "accessibility5", + "firstTextWidth" : 50, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 50, + "naturalHStackWidth" : 120, + "page" : 1, + "singleLineHeight" : 65.5, + "slashWidth" : 18, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 73.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 132, + "beforeHeight" : 138.5, + "beforeWidth" : 72, + "beforeWrapDetected" : true, + "case" : "ja_accessibility5_320_1_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "accessibility5", + "firstTextWidth" : 50, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 50, + "naturalHStackWidth" : 120, + "page" : 1, + "singleLineHeight" : 65.5, + "slashWidth" : 18, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 73.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 132, + "beforeHeight" : 138.5, + "beforeWidth" : 72, + "beforeWrapDetected" : true, + "case" : "ja_accessibility5_320_8_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "accessibility5", + "firstTextWidth" : 50, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 50, + "naturalHStackWidth" : 120, + "page" : 8, + "singleLineHeight" : 65.5, + "slashWidth" : 18, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 73.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 132, + "beforeHeight" : 138.5, + "beforeWidth" : 72, + "beforeWrapDetected" : true, + "case" : "ja_accessibility5_320_20_20", + "containerWidth" : 320, + "count" : 20, + "dynamicType" : "accessibility5", + "firstTextWidth" : 50, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 50, + "naturalHStackWidth" : 120, + "page" : 20, + "singleLineHeight" : 65.5, + "slashWidth" : 18, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 73.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 132, + "beforeHeight" : 138.5, + "beforeWidth" : 72, + "beforeWrapDetected" : true, + "case" : "ja_accessibility5_375_1_1", + "containerWidth" : 375, + "count" : 1, + "dynamicType" : "accessibility5", + "firstTextWidth" : 50, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 50, + "naturalHStackWidth" : 120, + "page" : 1, + "singleLineHeight" : 65.5, + "slashWidth" : 18, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 73.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 132, + "beforeHeight" : 138.5, + "beforeWidth" : 72, + "beforeWrapDetected" : true, + "case" : "ja_accessibility5_375_1_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "accessibility5", + "firstTextWidth" : 50, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 50, + "naturalHStackWidth" : 120, + "page" : 1, + "singleLineHeight" : 65.5, + "slashWidth" : 18, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 73.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 132, + "beforeHeight" : 138.5, + "beforeWidth" : 72, + "beforeWrapDetected" : true, + "case" : "ja_accessibility5_375_8_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "accessibility5", + "firstTextWidth" : 50, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 50, + "naturalHStackWidth" : 120, + "page" : 8, + "singleLineHeight" : 65.5, + "slashWidth" : 18, + "verticalPaddingTotal" : 8, + "widthError" : 0 + }, + { + "afterHeight" : 73.5, + "afterNaturalUnscaledSingleLinePASS" : true, + "afterWidth" : 132, + "beforeHeight" : 138.5, + "beforeWidth" : 72, + "beforeWrapDetected" : true, + "case" : "ja_accessibility5_375_20_20", + "containerWidth" : 375, + "count" : 20, + "dynamicType" : "accessibility5", + "firstTextWidth" : 50, + "fitsCardAfter34ptTrailing20ptLeading" : true, + "font" : "NotoSansJP-Regular", + "heightError" : 0, + "horizontalPaddingTotal" : 12, + "lastTextWidth" : 50, + "naturalHStackWidth" : 120, + "page" : 20, + "singleLineHeight" : 65.5, + "slashWidth" : 18, + "verticalPaddingTotal" : 8, + "widthError" : 0 + } +] \ No newline at end of file diff --git a/docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase9-carousel-badge-width-evidence/simulator-screen.png b/docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase9-carousel-badge-width-evidence/simulator-screen.png new file mode 100644 index 00000000..54b04fb1 Binary files /dev/null and b/docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase9-carousel-badge-width-evidence/simulator-screen.png differ diff --git a/docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase9-carousel-badge-width.md b/docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase9-carousel-badge-width.md new file mode 100644 index 00000000..143de2fb --- /dev/null +++ b/docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase9-carousel-badge-width.md @@ -0,0 +1,39 @@ +# Phase 9 페이지 배지 가변 너비 리뷰 + +## 1. 리뷰 정보 +- 대상: 현재 `main` working tree의 Task 9.6 (`P9-T6`). +- 일자: 2026-10-26. +- 기준: `../prd.md` 8.6 및 인터뷰 결정, `../plan-task.md` Task 9.6. +- 상태: 독립 리뷰 판정 완료(PASS). + +## 2. 목적과 범위 +- `BannerCarousel.swift`의 페이지 숫자 고정 너비만 제거하고, 기존 폰트·간격·패딩·서식·위치를 보존하는지 확인한다. +- 실제 배지 본문을 추출한 iOS 18.3 SwiftUI 렌더링을 검토한다. 전체 로그인 화면 및 API E2E는 범위 밖이며 수행했다고 주장하지 않는다. + +## 3. 판정 기준 +- 숫자/글자 크기에 따라 가변 너비, 줄바꿈·말줄임 없는 한 줄, 좌우 각 6pt/상하 각 4pt 패딩. +- 기존 `%02d`, `body3`, HStack spacing 1, 색상, Capsule, 우측 상단 위치 보존. +- 타이머·스와이프·상태·라우팅 수정 없음. + +## 4. 검토한 근거 +- 코드: `SodaLive/Sources/V2/Component/Banner/BannerCarousel.swift:112`. +- 소스 SHA-256: `3dc39a2bcb081ed0013a8940f22537b79765353881e0f9468aae98f547bcde19`. +- iOS 18.3 SE 3세대: ko/ja, 기본/xxxLarge/accessibility5, 320/375pt, `01/01`, `01/20`, `08/20`, `20/20` 총 48개 조합 모두 한 줄 고유 너비와 padding 측정 통과. +- UIKit `UIHostingController.sizeThatFits`로 개별 글자 고유 크기와 배지 크기를 대조했다. 생성된 이미지를 직접 열어 확대 숫자의 줄바꿈 해소를 확인했다. +- 증거: `phase9-carousel-badge-width-evidence/`의 비교 이미지, 시뮬레이터 화면 및 측정값. +- Swift 구문 검사와 `git diff --check` 성공. `SodaLive-dev` Debug x86_64 시뮬레이터 빌드 exit 0. +- 전체 test는 스킴에 test action이 구성되지 않아 exit 66. `lsp_diagnostics` 도구가 없어 별도 LSP 진단은 미실행. +- 주 실행자가 측정 JSON을 별도로 검사해 `48/48`, 가로 패딩 합 `12`, 세로 패딩 합 `8`, 수정 전 줄바꿈 `32/48`을 재확인했다. +- `visual-qa.mjs image-diff`로 ko/accessibility5/320pt/08-20의 전후 PNG를 비교했다. 640×360 동일 크기, alpha 정상, diffRatio `0.1502`, similarity `85`. 변경 영역은 의도한 배지의 가변 너비와 두 줄→한 줄 전환이며, 이 수치 자체를 합격 판정으로 사용하지 않았다. + +## 5. 발견 사항 +- 확정 발견 사항 없음. 독립 리뷰어가 소스 diff, 실제 추출 본문·폰트·테마의 일치, 48개 측정값 및 전후 이미지를 확인하고 PASS로 판정했다. +- 배지 바깥 코드는 HEAD와 동일하여 타이머·제스처·페이징의 변경이 없음을 확인했다. + +## 6. plan·goal 전환 +- 전환 항목 없음. + +## 7. 종료 판정 +- `P9-T6`의 제품 변경과 컴포넌트 검증 완료. 실제 앱의 인증된 두 탭 E2E 및 물리 기기 검증은 미실행이며 전체 테스트는 기존 test action 부재로 실행 불가하다. +- 소유 임시 시뮬레이터의 종료·삭제와 부재를 확인했다. 임시 앱·컴파일 캐시·DerivedData·notepad·test 오류 xcresult를 삭제하고 경로 부재를 재확인했다. +- 최종 결론: 확정 발견 사항 없음. 검증 한계를 숨기지 않고 기존 PRD/계획에 기록했다.