Skip to content

[Feat] 장르칩, 저장된 컬렉션 리스트 컴포넌트 구현 및 아이콘 추가#199

Merged
kimjw2003 merged 8 commits into
developfrom
feat/#197-component-genre
Apr 30, 2026
Merged

[Feat] 장르칩, 저장된 컬렉션 리스트 컴포넌트 구현 및 아이콘 추가#199
kimjw2003 merged 8 commits into
developfrom
feat/#197-component-genre

Conversation

@ckals413
Copy link
Copy Markdown
Contributor

@ckals413 ckals413 commented Apr 27, 2026

📮 관련 이슈

📌 작업 내용

  • 변경된 아이콘과 추가된 아이콘 추가해뒀습니다.
  • 장르칩 컴포넌트 추가했습니다.
  • 저장된 컬렉션 리스트에 들어 갈 컴포넌트 추가했습니다.

📸 스크린샷

스크린샷 스크린샷
image image

🫛 To. 리뷰어

  • 화이팅입니다 ~.

Summary by CodeRabbit

릴리스 노트

  • 신기능

    • 장르 선택용 인터랙티브 칩 컴포넌트 추가 — 선택/비선택 시각과 터치 상호작용, 미리보기 포함
    • 북마크 기능이 포함된 콘텐츠 카드 컴포넌트 추가 — 썸네일, OTT 태그, 제목·감독·제작연도 표시 및 북마크 토글, 이동 액션 포함
  • 스타일

    • 배경 이미지 리소스 크기 조정 및 그래픽 업데이트

@ckals413 ckals413 self-assigned this Apr 27, 2026
@ckals413 ckals413 added 🧩 Component feat - 공통 컴포넌트 작업 Feat ✨ 신규 기능을 추가하거나 기존 기능의 동작, 정책을 변경 labels Apr 27, 2026
@ckals413 ckals413 linked an issue Apr 27, 2026 that may be closed by this pull request
2 tasks
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 27, 2026

📝 Walkthrough

Walkthrough

온보딩용 원형 장르 칩 컴포저블과 프로필용 콘텐츠 북마크 카드 컴포저블이 추가되었고, 배경 사진 벡터 드로어블의 뷰포트 및 경로(pathData)가 재정의되었습니다.

Changes

Cohort / File(s) Summary
온보딩 장르 선택 컴포넌트
app/src/main/java/com/flint/presentation/onboarding/component/FlintGenreChip.kt
원형 장르 칩 컴포저블 추가: 선택/비선택 시 배경 색상과 선택적 테두리 처리, 클릭 처리(noRippleClickable), 내부 패딩, 정적 및 인터랙티브 프리뷰 포함.
콘텐츠 북마크 카드 컴포넌트
app/src/main/java/com/flint/presentation/profile/component/CollectionCreateContentBookmark.kt
포스터 네트워크 이미지 및 OTT 태그 오버레이, 제목/감독/연도 텍스트, 북마크 토글(아이콘/카운트), "작품 보러가기" 액션을 갖춘 카드형 컴포저블 추가 및 프리뷰 추가.
벡터 드로어블 리소스
app/src/main/res/drawable/ic_background_photo.xml
벡터의 width/heightviewportWidth/viewportHeight를 48→30으로 조정하고, 새로운 pathData로 경로를 재정의하여 아이콘 스케일/모양 변경.

Sequence Diagram(s)

(생성 조건 미충족 — 생략)

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • [Feat] ExploreScreen(탐색 화면) #120: CollectionCreateContentBookmark에서 사용하는 콘텐츠 속성(감독, isBookmarked, bookmarkCount)과 모델/필드 변경 관점에서 연관됨.
  • [Feat] SavedFilmListItem 제작 #84: 포스터+OTT 오버레이, 텍스트, 북마크 토글을 포함하는 유사한 아이템 UI가 추가되어 중복 또는 레이아웃 패턴 연관성이 있음.
  • [Fix] 온보딩 QA 반영 #184: 온보딩 장르 선택 관련 UI(원형 선택 지시자/배경) 변경과 직접적인 디자인/구현 연관성 있음.

Suggested reviewers

  • kimjw2003
  • nahy-512
  • giovannijunseokim

Poem

🐇 둑실둑실 장르 칩 반짝
클릭하면 색이 바뀌네
포스터는 스크롤에 인사하고
북마크는 숫자 톡, 찰칵찰칵
코드 밭에 당근 한 줌 🥕

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 변경 내용을 명확하게 요약합니다. 장르칩 컴포넌트, 저장된 컬렉션 컴포넌트, 아이콘 추가라는 주요 변경 사항을 구체적으로 나열했습니다.
Description check ✅ Passed PR 설명이 저장소 템플릿의 주요 섹션(관련 이슈, 작업 내용, 스크린샷)을 포함하고 있으며 대부분 완성되어 있습니다.
Linked Issues check ✅ Passed PR의 모든 변경 사항이 연결된 이슈 #197의 요구 사항을 충족합니다. 아이콘 추가, 장르칩 컴포넌트, 저장된 컬렉션 컴포넌트 모두 구현되었습니다.
Out of Scope Changes check ✅ Passed 모든 변경 사항이 이슈 #197의 요구 범위 내에 있습니다. 아이콘, 장르칩, 컬렉션 컴포넌트만 추가되었으며 불필요한 변경은 없습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/#197-component-genre

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (5)
app/src/main/java/com/flint/presentation/onboarding/component/FlintGenreChip.kt (2)

48-60: Modifier 체인을 조건부 Modifier.then으로 단순화 제안.

.run { if (border != null) border(...) else this } 패턴 대신 Modifier.then을 활용하면 가독성이 더 좋아집니다. 또한 일반적으로 background 후에 border를 적용하는 순서가 Compose 컨벤션에 더 부합합니다(배경 위에 테두리가 그려지는 의미가 명확해짐).

♻️ Suggested refactor
     Row(
         modifier =
             modifier
                 .clip(shape)
-                .run {
-                    if (border != null)
-                        border(border = border, shape = shape)
-                    else
-                        this
-                }
                 .background(color = backgroundColor, shape = shape)
+                .then(
+                    if (border != null) Modifier.border(border = border, shape = shape)
+                    else Modifier,
+                )
                 .noRippleClickable(enabled = enabled, onClick = onClick)
                 .padding(contentPadding),
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@app/src/main/java/com/flint/presentation/onboarding/component/FlintGenreChip.kt`
around lines 48 - 60, The modifier chain in Row uses a .run { if (border !=
null) border(...) else this } pattern which is clunky; replace that with
Modifier.then to conditionally append the border and reorder so background is
applied before border. Concretely, update the chain around modifier.clip(shape)
to remove the .run block and instead call .background(backgroundColor,
shape).then(if (border != null) Modifier.border(border, shape) else
Modifier).noRippleClickable(enabled = enabled, onClick =
onClick).padding(contentPadding) so you reference Row, modifier, border, shape,
backgroundColor, noRippleClickable and contentPadding while removing the .run
usage.

29-70: 접근성: 선택 상태 semantics 추가 고려.

장르 칩은 토글 가능한 선택 컨트롤이므로 TalkBack 등 스크린 리더 사용자에게 현재 선택 여부를 전달하기 위해 Modifier.semantics { selected = isSelected; role = Role.Button } 또는 Modifier.toggleable(...) 적용을 권장합니다. 온보딩에서 다중 선택 UX가 핵심이므로 가급적 이 단계에서 함께 반영해 두면 좋겠습니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@app/src/main/java/com/flint/presentation/onboarding/component/FlintGenreChip.kt`
around lines 29 - 70, FlintGenreChip currently doesn't expose accessibility
semantics for its toggleable selection state; update the composable to attach
accessibility info to the modifier (e.g., use Modifier.semantics { selected =
isSelected; this.role = Role.Button } or wrap the modifier with
Modifier.toggleable(checked = isSelected, onValueChange = { onClick() }, enabled
= enabled, role = Role.Checkbox/Role.Button) so screen readers announce the
selection state; apply this to the same modifier chain (before
.noRippleClickable or replace it) so TalkBack users hear the current state and
the control is properly focusable and actionable.
app/src/main/java/com/flint/presentation/profile/component/CollectionCreateContentBookmark.kt (3)

89-109: NetworkImage의 사이즈 지정이 부모 Box 제약과 중복/충돌됨

호출부에서 Modifier.height(150.dp).width(100.dp)를 이미 전달하는데, 내부에서 다시 Modifier.fillMaxWidth().height(150.dp)로 하드코딩되어 있어, 이후 호출자가 사이즈를 바꿔도 이미지의 높이는 항상 150.dp로 고정됩니다. Modifier.matchParentSize()(또는 fillMaxSize())로 두면 부모 Box가 단일 사이즈 출처(single source of truth)가 됩니다.

♻️ 제안
     Box(
         modifier = modifier,
     ) {
         NetworkImage(
             imageUrl = imageUrl,
-            modifier = Modifier.fillMaxWidth().height(150.dp),
+            modifier = Modifier.matchParentSize(),
         )
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@app/src/main/java/com/flint/presentation/profile/component/CollectionCreateContentBookmark.kt`
around lines 89 - 109, The image size is being forced internally in
CollectionCreateContentBookmarkImage (NetworkImage uses
Modifier.fillMaxWidth().height(150.dp)) which overrides caller-provided
modifiers; change this so the Box uses the incoming modifier and NetworkImage
uses Modifier.matchParentSize() or fillMaxSize() (no hardcoded height/width) so
the parent modifier is the single source of truth; keep OttHorizontalList
positioning but ensure it is laid out relative to the Box that now respects the
passed modifier.

198-209: 하드코딩된 한국어 문자열 + Text/Icon 사이 간격 누락

  • "작품 보러가기"가 직접 코드에 박혀 있어 다국어/문구 수정에 취약합니다. stringResource(R.string.xxx)로 추출해 주세요. (다른 곳도 동일 패턴이 있는지 함께 확인 부탁드립니다.)
  • 또한 TextIcon 사이에 Spacer가 없어 글자 끝과 화살표가 붙어 보입니다. 디자인 시안 기준의 간격을 추가해 주세요.
♻️ 제안
         Text(
-            text = "작품 보러가기",
+            text = stringResource(R.string.collection_bookmark_go_to_content),
             color = FlintTheme.colors.white,
             style = FlintTheme.typography.body2R14,
         )

+        Spacer(modifier = Modifier.width(4.dp))
+
         Icon(
             imageVector = ImageVector.vectorResource(R.drawable.ic_more),
             contentDescription = null,
             tint = Color.Unspecified,
             modifier = Modifier.size(16.dp),
         )
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@app/src/main/java/com/flint/presentation/profile/component/CollectionCreateContentBookmark.kt`
around lines 198 - 209, The Text "작품 보러가기" is hardcoded and missing spacing to
the following Icon; replace the literal string in
CollectionCreateContentBookmark's Text with
stringResource(R.string.<appropriate_name>) and add a Spacer between the Text
and Icon (e.g., Modifier.width(4.dp or design-specified value)) to restore the
design gap; also search other usages in CollectionCreateContentBookmark for
hardcoded Korean strings and convert them to string resources similarly.

1-1: 컴포넌트 명명/위치 불일치 — 이름 또는 패키지 정리 권장

CollectionCreateContentBookmark라는 이름은 collectioncreate 도메인을 떠올리게 하지만, 파일은 presentation/profile/component에 있고 PR 설명상 "저장된 컬렉션 리스트"용 컴포넌트입니다. 향후 collectioncreate 패키지 쪽 실제 컴포넌트와 검색·임포트 시 혼동되기 쉬우니 다음 중 하나로 정리하시는 걸 권장드립니다.

  • 용도가 프로필의 저장된 컬렉션이라면 이름을 SavedCollectionContentItem / ProfileCollectionContentBookmark 등으로 변경
  • 만약 collectioncreate 화면에서도 함께 재사용할 계획이라면 core/designsystem 또는 공용 패키지로 이동

Also applies to: 36-36

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@app/src/main/java/com/flint/presentation/profile/component/CollectionCreateContentBookmark.kt`
at line 1, The component class named CollectionCreateContentBookmark in package
com.flint.presentation.profile.component should be renamed or relocated to avoid
confusion with the collectioncreate domain: either rename the class to a
profile-specific name (e.g., SavedCollectionContentItem or
ProfileCollectionContentBookmark) and update its package declaration and all
imports/usages accordingly, or move the file into a shared/common package (e.g.,
core.designsystem or a shared components package) if you intend it to be reused
by collectioncreate; update the Kotlin file's package line, the class name, and
all call sites/imports referencing CollectionCreateContentBookmark to match the
new name/location.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@app/src/main/java/com/flint/presentation/onboarding/component/FlintGenreChip.kt`:
- Line 35: The exposed enabled: Boolean = true parameter on FlintGenreChip
currently only blocks clicks but provides no visual difference when false;
either remove the parameter if unused or implement clear disabled styling: in
the FlintGenreChip composable (and related overloads around the same file/lines
48-60) switch backgroundColor, borderColor and textColor when enabled==false
(e.g., use a muted background, muted border and muted text alpha) and ensure
clickable/interactionSource reflect disabled state so accessibility and visual
feedback match; update any usages to either omit the parameter or pass enabled
appropriately.

In
`@app/src/main/java/com/flint/presentation/profile/component/CollectionCreateContentBookmark.kt`:
- Around line 56-76: Remove the fixed .height(150.dp) on the
CollectionCreateContentBookmarkInfo modifier so the info column can use natural
height (avoid content overflow when title becomes 2 lines), or if the design
requires a fixed height instead set title maxLines = 1 or move the "작품 보러가기" Row
into a dedicated bottom area; also add a small Spacer between the director and
createdYear Text composables to prevent them from appearing glued together
(refer to CollectionCreateContentBookmarkInfo, title, director, createdYear, and
the Spacer usage in the surrounding Row/Column).

---

Nitpick comments:
In
`@app/src/main/java/com/flint/presentation/onboarding/component/FlintGenreChip.kt`:
- Around line 48-60: The modifier chain in Row uses a .run { if (border != null)
border(...) else this } pattern which is clunky; replace that with Modifier.then
to conditionally append the border and reorder so background is applied before
border. Concretely, update the chain around modifier.clip(shape) to remove the
.run block and instead call .background(backgroundColor, shape).then(if (border
!= null) Modifier.border(border, shape) else Modifier).noRippleClickable(enabled
= enabled, onClick = onClick).padding(contentPadding) so you reference Row,
modifier, border, shape, backgroundColor, noRippleClickable and contentPadding
while removing the .run usage.
- Around line 29-70: FlintGenreChip currently doesn't expose accessibility
semantics for its toggleable selection state; update the composable to attach
accessibility info to the modifier (e.g., use Modifier.semantics { selected =
isSelected; this.role = Role.Button } or wrap the modifier with
Modifier.toggleable(checked = isSelected, onValueChange = { onClick() }, enabled
= enabled, role = Role.Checkbox/Role.Button) so screen readers announce the
selection state; apply this to the same modifier chain (before
.noRippleClickable or replace it) so TalkBack users hear the current state and
the control is properly focusable and actionable.

In
`@app/src/main/java/com/flint/presentation/profile/component/CollectionCreateContentBookmark.kt`:
- Around line 89-109: The image size is being forced internally in
CollectionCreateContentBookmarkImage (NetworkImage uses
Modifier.fillMaxWidth().height(150.dp)) which overrides caller-provided
modifiers; change this so the Box uses the incoming modifier and NetworkImage
uses Modifier.matchParentSize() or fillMaxSize() (no hardcoded height/width) so
the parent modifier is the single source of truth; keep OttHorizontalList
positioning but ensure it is laid out relative to the Box that now respects the
passed modifier.
- Around line 198-209: The Text "작품 보러가기" is hardcoded and missing spacing to
the following Icon; replace the literal string in
CollectionCreateContentBookmark's Text with
stringResource(R.string.<appropriate_name>) and add a Spacer between the Text
and Icon (e.g., Modifier.width(4.dp or design-specified value)) to restore the
design gap; also search other usages in CollectionCreateContentBookmark for
hardcoded Korean strings and convert them to string resources similarly.
- Line 1: The component class named CollectionCreateContentBookmark in package
com.flint.presentation.profile.component should be renamed or relocated to avoid
confusion with the collectioncreate domain: either rename the class to a
profile-specific name (e.g., SavedCollectionContentItem or
ProfileCollectionContentBookmark) and update its package declaration and all
imports/usages accordingly, or move the file into a shared/common package (e.g.,
core.designsystem or a shared components package) if you intend it to be reused
by collectioncreate; update the Kotlin file's package line, the class name, and
all call sites/imports referencing CollectionCreateContentBookmark to match the
new name/location.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 0f66b5b3-70a8-4d53-a7c8-97908dd54706

📥 Commits

Reviewing files that changed from the base of the PR and between bba776f and cadaedb.

⛔ Files ignored due to path filters (34)
  • app/src/main/res/drawable/ic_deselect_large_gray.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_deselect_large_pri.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_bookmark.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_check.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_folder.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_home.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_lock.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_magnifier.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_messages.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_none.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_pencil.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_people.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_picture.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_save.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_share.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_small_bookmark.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_small_check.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_small_folder.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_small_home.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_small_lock.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_small_magnifier.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_small_messages.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_small_none.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_small_pencil.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_small_people.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_small_picture.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_small_save.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_small_share.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_small_trash.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_gradient_trash.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_info.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_photosize_maximize.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_photosize_minmize.png is excluded by !**/*.png
  • app/src/main/res/drawable/ic_small_info.png is excluded by !**/*.png
📒 Files selected for processing (3)
  • app/src/main/java/com/flint/presentation/onboarding/component/FlintGenreChip.kt
  • app/src/main/java/com/flint/presentation/profile/component/CollectionCreateContentBookmark.kt
  • app/src/main/res/drawable/ic_background_photo.xml

Comment thread app/src/main/java/com/flint/presentation/onboarding/component/FlintGenreChip.kt Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@app/src/main/java/com/flint/presentation/onboarding/component/FlintGenreChip.kt`:
- Around line 29-69: The chip lacks accessibility semantics and a guaranteed
touch target; update FlintGenreChip to expose its selected state and a toggle
role and to ensure a minimum tap size: add a semantics block on the composable
modifier (e.g., semantics { selected = isSelected; role = Role.ToggleButton;
contentDescription = text } or set a stateDescription) so assistive tech reads
selected/unselected, and ensure the modifier includes a minimum hit target such
as .sizeIn(minHeight = 48.dp) or .heightIn(min = 48.dp) (placed before padding)
while keeping the existing noRippleClickable usage; reference FlintGenreChip,
noRippleClickable, contentPadding, and shape when making changes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ca62f6f3-75ec-4cf1-a949-6928a4dff230

📥 Commits

Reviewing files that changed from the base of the PR and between cadaedb and dd854f2.

📒 Files selected for processing (1)
  • app/src/main/java/com/flint/presentation/onboarding/component/FlintGenreChip.kt

Comment on lines +29 to +69
@Composable
fun FlintGenreChip(
text: String,
isSelected: Boolean,
onClick: () -> Unit,
modifier: Modifier = Modifier,
contentPadding: PaddingValues = PaddingValues(horizontal = 12.dp, vertical = 9.dp),
) {
val shape = CircleShape

val backgroundColor =
if (isSelected) FlintTheme.colors.primary400 else FlintTheme.colors.gray800

val border: BorderStroke? =
if (isSelected) null else BorderStroke(1.dp, FlintTheme.colors.gray300)

val contentColor = FlintTheme.colors.white

Row(
modifier =
modifier
.clip(shape)
.run {
if (border != null)
border(border = border, shape = shape)
else
this
}
.background(color = backgroundColor, shape = shape)
.noRippleClickable(onClick = onClick)
.padding(contentPadding),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = text,
color = contentColor,
style = FlintTheme.typography.body2M14,
)
}
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

선택 칩의 접근성 상태와 터치 영역을 보완해 주세요.

현재 구현은 단순 클릭 가능한 텍스트 칩이라, 보조기기가 선택/해제 상태를 명확히 읽어주지 못할 수 있습니다. 또 기본 패딩 기준으로는 실제 터치 높이가 48dp 미만일 가능성이 커서, 온보딩 선택 UI로는 누르기 불편할 수 있습니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@app/src/main/java/com/flint/presentation/onboarding/component/FlintGenreChip.kt`
around lines 29 - 69, The chip lacks accessibility semantics and a guaranteed
touch target; update FlintGenreChip to expose its selected state and a toggle
role and to ensure a minimum tap size: add a semantics block on the composable
modifier (e.g., semantics { selected = isSelected; role = Role.ToggleButton;
contentDescription = text } or set a stateDescription) so assistive tech reads
selected/unselected, and ensure the modifier includes a minimum hit target such
as .sizeIn(minHeight = 48.dp) or .heightIn(min = 48.dp) (placed before padding)
while keeping the existing noRippleClickable usage; reference FlintGenreChip,
noRippleClickable, contentPadding, and shape when making changes.

@chanmi1125
Copy link
Copy Markdown
Contributor

차민오빠 짱 수고많았어~~

Comment on lines +47 to +68
Row(
modifier =
modifier
.clip(shape)
.run {
if (border != null)
border(border = border, shape = shape)
else
this
}
.background(color = backgroundColor, shape = shape)
.noRippleClickable(onClick = onClick)
.padding(contentPadding),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = text,
color = contentColor,
style = FlintTheme.typography.body2M14,
)
}
Copy link
Copy Markdown
Contributor

@chanmi1125 chanmi1125 Apr 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 Row로 감싼 특별한 이유가 있을까요?
Text 하나만 있어서 Row 역할이 필요 없을거 같아 보여서요!!

나중에 아이콘 같은 게 추가될 예정이면 그대로 두는 것도 좋을 것 같고, 아니라면 Text에 modifier를 바로 넘기는 형태가 더 깔끔할 것 같아요!

Text(
    text = text,
    color = contentColor,
    style = FlintTheme.typography.body2M14,
    textAlign = TextAlign.Center,
    modifier = modifier
        .clip(shape)
        .then(if (border != null) Modifier.border(border, shape) else Modifier)
        .background(color = backgroundColor, shape = shape)
        .noRippleClickable(onClick = onClick)
        .padding(contentPadding),
)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

구웃! 수정완료

@ckals413 ckals413 requested a review from chanmi1125 April 28, 2026 14:41
Comment on lines +75 to +81
Box(
modifier =
Modifier
.background(FlintTheme.colors.background)
.fillMaxWidth()
.padding(20.dp),
) {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이것도 마찬가지로 Box의 역할이 따로 필요 없는 부분같아요!!
Row내에 속성 합쳐주면 깔끔할거 같습니다!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수정완@

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
app/src/main/java/com/flint/presentation/onboarding/component/FlintGenreChip.kt (1)

51-62: ⚠️ Potential issue | 🟠 Major

선택 상태 접근성 시맨틱이 빠져 있습니다.

현재 Line 61의 클릭 처리만으로는 보조기기가 칩의 선택/해제 상태를 안정적으로 전달하기 어렵습니다. 선택형 컴포넌트인 만큼 selected/stateDescription(및 필요 시 role) 시맨틱을 추가해 주세요.

♿ 제안 수정안
+import androidx.compose.ui.semantics.selected
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.semantics.stateDescription
...
         modifier =
             modifier
                 .clip(shape)
                 .run {
                     if (border != null)
                         border(border = border, shape = shape)
                     else
                         this
                 }
                 .background(color = backgroundColor, shape = shape)
+                .semantics {
+                    selected = isSelected
+                    stateDescription = if (isSelected) "선택됨" else "선택 안 됨"
+                }
                 .noRippleClickable(onClick = onClick)
                 .padding(contentPadding),
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@app/src/main/java/com/flint/presentation/onboarding/component/FlintGenreChip.kt`
around lines 51 - 62, The chip modifier chain is missing selection semantics, so
update the modifier in FlintGenreChip to include semantics reflecting the
selected state: add a .semantics block (or .semantics(mergeDescendants = false)
as appropriate) in the modifier chain used in FlintGenreChip.kt that sets
selected = selected, provides a stateDescription (e.g., "selected" / "not
selected" or localized strings), and sets an appropriate role (e.g.,
Role.Checkbox or Role.Button) so assistive tech can announce the selection
changes; keep the existing .noRippleClickable(...) and padding order intact when
inserting the semantics.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In
`@app/src/main/java/com/flint/presentation/onboarding/component/FlintGenreChip.kt`:
- Around line 51-62: The chip modifier chain is missing selection semantics, so
update the modifier in FlintGenreChip to include semantics reflecting the
selected state: add a .semantics block (or .semantics(mergeDescendants = false)
as appropriate) in the modifier chain used in FlintGenreChip.kt that sets
selected = selected, provides a stateDescription (e.g., "selected" / "not
selected" or localized strings), and sets an appropriate role (e.g.,
Role.Checkbox or Role.Button) so assistive tech can announce the selection
changes; keep the existing .noRippleClickable(...) and padding order intact when
inserting the semantics.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4accc216-ffc7-4dac-8fb7-28ae2a23ef1a

📥 Commits

Reviewing files that changed from the base of the PR and between dd854f2 and 060259c.

📒 Files selected for processing (1)
  • app/src/main/java/com/flint/presentation/onboarding/component/FlintGenreChip.kt

.height(150.dp),
)

Spacer(modifier = Modifier.width(8.dp))
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기 피그마 기준으로는 4.dp인거같습니다! 확인 부탁드려용

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아 이거 auto 레이아웃이 걸려있고 자세히 보니까 북마크랑, 숫자 부분이 한 프레임으로 묶여있는 거 같아서 피그마 참고해서 수정했습니다! 못 볼 뻔.. 감사합니당
image
image

@ckals413 ckals413 requested a review from chanmi1125 April 28, 2026 17:09
Copy link
Copy Markdown
Contributor

@kimjw2003 kimjw2003 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GOOD

@kimjw2003 kimjw2003 merged commit 47e26fe into develop Apr 30, 2026
2 checks passed
@kimjw2003 kimjw2003 deleted the feat/#197-component-genre branch April 30, 2026 09:56
@coderabbitai coderabbitai Bot mentioned this pull request May 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🧩 Component feat - 공통 컴포넌트 작업 Feat ✨ 신규 기능을 추가하거나 기존 기능의 동작, 정책을 변경

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feat] 아이콘 추가 및 컴포넌트 작업

3 participants