From dd256ea49e13f7a070189e8b7b44eb1a1c44b03f Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Sat, 28 Feb 2026 00:31:08 +0900 Subject: [PATCH 01/16] =?UTF-8?q?feat:=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20=EC=A0=95=EC=9D=98=20=EB=B0=8F=20=EC=9C=A0=ED=8B=B8?= =?UTF-8?q?=EB=A6=AC=ED=8B=B0=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 디자인 시스템의 리스트 컴포넌트에서 공통으로 사용할 `PrezelListSize` 열거형과 사이즈별 스타일 처리 로직을 추가했습니다. * `PrezelListSize`: `SMALL`, `REGULAR` 사이즈 정의 * `PrezelListIcon`: `IconSource`를 기반으로 사이즈에 따른 아이콘 렌더링 구현 * `prezelListVerticalPadding`: 사이즈별 수직 패딩 값 제공 * `prezelListTextStyle`: 사이즈별 타이포그래피 스타일 제공 * 사이즈별 간격 조절 함수(`prezelListIconTextSpacing`, `prezelListTextTrailingSpacing`, `prezelListTrailingIconSpacing`) 추가 --- .../component/list/PrezelListStyle.kt | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListStyle.kt diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListStyle.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListStyle.kt new file mode 100644 index 0000000..080a8ca --- /dev/null +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListStyle.kt @@ -0,0 +1,87 @@ +package com.team.prezel.core.designsystem.component.list + +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Icon +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.team.prezel.core.designsystem.foundation.number.PrezelSpacing +import com.team.prezel.core.designsystem.icon.IconSource +import com.team.prezel.core.designsystem.theme.PrezelTheme + +@Immutable +enum class PrezelListSize { + SMALL, + REGULAR, +} + +@Composable +internal fun PrezelListIcon( + icon: IconSource, + size: PrezelListSize, + modifier: Modifier = Modifier, +) { + Icon( + painter = icon.painter(), + contentDescription = icon.contentDescription(), + modifier = modifier.size( + when (size) { + PrezelListSize.SMALL -> 20.dp + PrezelListSize.REGULAR -> 24.dp + }, + ), + ) +} + +@Composable +internal fun prezelListVerticalPadding( + size: PrezelListSize, + spacing: PrezelSpacing = PrezelTheme.spacing, +): Dp = + when (size) { + PrezelListSize.SMALL -> spacing.V10 + PrezelListSize.REGULAR -> spacing.V14 + } + +@Composable +internal fun prezelListTextStyle( + size: PrezelListSize, + spacing: PrezelSpacing = PrezelTheme.spacing, +): TextStyle = + when (size) { + PrezelListSize.SMALL -> PrezelTheme.typography.body3Medium + PrezelListSize.REGULAR -> PrezelTheme.typography.body2Medium + } + +@Composable +internal fun prezelListIconTextSpacing( + size: PrezelListSize, + spacing: PrezelSpacing = PrezelTheme.spacing, +): Dp = + when (size) { + PrezelListSize.SMALL -> spacing.V8 + PrezelListSize.REGULAR -> spacing.V12 + } + +@Composable +internal fun prezelListTextTrailingSpacing( + size: PrezelListSize, + spacing: PrezelSpacing = PrezelTheme.spacing, +): Dp = + when (size) { + PrezelListSize.SMALL -> spacing.V6 + PrezelListSize.REGULAR -> spacing.V12 + } + +@Composable +internal fun prezelListTrailingIconSpacing( + size: PrezelListSize, + spacing: PrezelSpacing = PrezelTheme.spacing, +): Dp = + when (size) { + PrezelListSize.SMALL -> spacing.V6 + PrezelListSize.REGULAR -> spacing.V8 + } From fc574d78f27bbdbc731c23d1dff6b27525e84033 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Sat, 28 Feb 2026 00:31:19 +0900 Subject: [PATCH 02/16] =?UTF-8?q?feat:=20PrezelList=20=EA=B3=B5=ED=86=B5?= =?UTF-8?q?=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 디자인 시스템 가이드에 맞춘 리스트 아이템 컴포넌트인 `PrezelList`를 추가했습니다. * `PrezelListSize` (SMALL, REGULAR)에 따른 텍스트 스타일 및 간격 대응 * `leadingContent` 및 `trailingContents`를 통한 아이콘/컨텐츠 삽입 지원 * `nested` 파라미터를 통한 계층 구조 인덴트 지원 * `ImmutableList`를 활용한 다중 트레일링 컨텐츠 렌더링 및 노출 제어 로직 구현 * 테마별 미리보기(Preview) 코드 추가 --- .../designsystem/component/list/PrezelList.kt | 188 ++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt new file mode 100644 index 0000000..618fa92 --- /dev/null +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt @@ -0,0 +1,188 @@ +package com.team.prezel.core.designsystem.component.list + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.team.prezel.core.designsystem.icon.IconSource +import com.team.prezel.core.designsystem.icon.PrezelIcons +import com.team.prezel.core.designsystem.preview.PreviewScaffold +import com.team.prezel.core.designsystem.preview.ThemePreview +import com.team.prezel.core.designsystem.theme.PrezelTheme +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf + +@Composable +fun PrezelList( + title: String, + modifier: Modifier = Modifier, + size: PrezelListSize = PrezelListSize.REGULAR, + nested: Boolean = false, + enabled: Boolean = true, + onClick: (() -> Unit)? = null, + showLeadingContent: Boolean = false, + leadingContent: @Composable () -> Unit = {}, + showTrailingContent: Boolean = true, + showFirstTrailingContent: Boolean = true, + trailingContents: ImmutableList<@Composable () -> Unit> = persistentListOf(), +) { + val visibleTrailingContents = + if (!showFirstTrailingContent) trailingContents.take(1) else trailingContents + + Row( + modifier = modifier + .fillMaxWidth() + .padding(horizontal = PrezelTheme.spacing.V12, vertical = prezelListVerticalPadding(size = size)), + verticalAlignment = Alignment.CenterVertically, + ) { + if (nested) { + Spacer(modifier = Modifier.width(PrezelTheme.spacing.V12)) + } + + if (showLeadingContent) { + leadingContent() + Spacer(modifier = Modifier.width(prezelListIconTextSpacing(size = size))) + } + + Text( + text = title, + modifier = Modifier.weight(1f), + color = LocalContentColor.current, + maxLines = 1, + style = prezelListTextStyle(size = size), + ) + Spacer(modifier = Modifier.width(prezelListTextTrailingSpacing(size = size))) + + if (showTrailingContent) { + Row( + horizontalArrangement = Arrangement.spacedBy( + prezelListTrailingIconSpacing(size), + ), + verticalAlignment = Alignment.CenterVertically, + ) { + visibleTrailingContents.forEach { it() } + } + } + } +} + +@ThemePreview +@Composable +private fun PrezelListPreview() { + PrezelTheme { + PreviewScaffold { + Column(verticalArrangement = Arrangement.spacedBy(24.dp)) { + PrezelList( + title = "Small Title", + size = PrezelListSize.SMALL, + showLeadingContent = true, + leadingContent = { + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = PrezelListSize.SMALL, + ) + }, + showFirstTrailingContent = false, + trailingContents = persistentListOf( + { + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = PrezelListSize.SMALL, + ) + }, + { + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = PrezelListSize.SMALL, + ) + }, + ), + ) + PrezelList( + title = "Small Title 2", + size = PrezelListSize.SMALL, + leadingContent = { + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = PrezelListSize.SMALL, + ) + }, + trailingContents = persistentListOf( + { + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = PrezelListSize.SMALL, + ) + }, + { + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = PrezelListSize.SMALL, + ) + }, + ), + ) + + PrezelList( + title = "Regular Title", + size = PrezelListSize.REGULAR, + showLeadingContent = true, + leadingContent = { + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = PrezelListSize.REGULAR, + ) + }, + showFirstTrailingContent = false, + trailingContents = persistentListOf( + { + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = PrezelListSize.REGULAR, + ) + }, + { + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = PrezelListSize.REGULAR, + ) + }, + ), + ) + PrezelList( + title = "Regular Title 2", + size = PrezelListSize.REGULAR, + leadingContent = { + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = PrezelListSize.REGULAR, + ) + }, + trailingContents = persistentListOf( + { + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = PrezelListSize.REGULAR, + ) + }, + { + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = PrezelListSize.REGULAR, + ) + }, + ), + ) + } + } + } +} From ee3fe36bf7353deb708b45db2e23ad4f2d10a592 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Sat, 28 Feb 2026 01:17:05 +0900 Subject: [PATCH 03/16] =?UTF-8?q?refactor:=20PrezelList=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B5=AC=EC=A1=B0=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=20=EB=B0=8F=20=ED=94=84=EB=A6=AC=EB=B7=B0=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `PrezelList` 컴포넌트의 패딩 로직을 개선하고, 가독성을 위해 프리뷰 관련 코드를 별도 파일로 분리하였습니다. * **PrezelList**: `enabled`, `onClick` 등 미사용 파라미터를 제거하고, `nested` 상태에 따른 레이아웃 처리를 `prezelListContentPadding`으로 통합했습니다. * **PrezelListStyle**: `prezelListVerticalPadding`을 `prezelListContentPadding`으로 변경하여 `nested` 여부에 따른 `PaddingValues`를 반환하도록 수정했습니다. * **PrezelListPreview**: 기존 `PrezelList.kt`에 있던 프리뷰 코드를 `PrezelListPreview.kt`로 분리하고, 사이즈별(SMALL, REGULAR) 및 케이스별(Nested, Leading, Trailing) 상세 프리뷰를 추가했습니다. --- .../designsystem/component/list/PrezelList.kt | 140 ++++-------------- .../component/list/PrezelListPreview.kt | 91 ++++++++++++ .../component/list/PrezelListStyle.kt | 23 ++- 3 files changed, 134 insertions(+), 120 deletions(-) create mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt index 618fa92..34a1ae3 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt @@ -7,14 +7,12 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.LocalContentColor import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import com.team.prezel.core.designsystem.icon.IconSource -import com.team.prezel.core.designsystem.icon.PrezelIcons import com.team.prezel.core.designsystem.preview.PreviewScaffold import com.team.prezel.core.designsystem.preview.ThemePreview import com.team.prezel.core.designsystem.theme.PrezelTheme @@ -27,8 +25,6 @@ fun PrezelList( modifier: Modifier = Modifier, size: PrezelListSize = PrezelListSize.REGULAR, nested: Boolean = false, - enabled: Boolean = true, - onClick: (() -> Unit)? = null, showLeadingContent: Boolean = false, leadingContent: @Composable () -> Unit = {}, showTrailingContent: Boolean = true, @@ -41,13 +37,9 @@ fun PrezelList( Row( modifier = modifier .fillMaxWidth() - .padding(horizontal = PrezelTheme.spacing.V12, vertical = prezelListVerticalPadding(size = size)), + .padding(paddingValues = prezelListContentPadding(size, nested)), verticalAlignment = Alignment.CenterVertically, ) { - if (nested) { - Spacer(modifier = Modifier.width(PrezelTheme.spacing.V12)) - } - if (showLeadingContent) { leadingContent() Spacer(modifier = Modifier.width(prezelListIconTextSpacing(size = size))) @@ -75,114 +67,36 @@ fun PrezelList( } } +@Composable +private fun PrezelListSizeCases(size: PrezelListSize) { + Column(verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V24)) { + NestedCases(size) + ShowLeadingCases(size) + ShowTrailingCases(size) + ShowFirstTrailingCases(size) + } +} + @ThemePreview @Composable -private fun PrezelListPreview() { +private fun PrezelListSmallPreview() { PrezelTheme { PreviewScaffold { - Column(verticalArrangement = Arrangement.spacedBy(24.dp)) { - PrezelList( - title = "Small Title", - size = PrezelListSize.SMALL, - showLeadingContent = true, - leadingContent = { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = PrezelListSize.SMALL, - ) - }, - showFirstTrailingContent = false, - trailingContents = persistentListOf( - { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = PrezelListSize.SMALL, - ) - }, - { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = PrezelListSize.SMALL, - ) - }, - ), - ) - PrezelList( - title = "Small Title 2", - size = PrezelListSize.SMALL, - leadingContent = { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = PrezelListSize.SMALL, - ) - }, - trailingContents = persistentListOf( - { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = PrezelListSize.SMALL, - ) - }, - { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = PrezelListSize.SMALL, - ) - }, - ), - ) + Text(text = "PrezelList - SMALL", style = PrezelTheme.typography.title2Medium) + HorizontalDivider() + PrezelListSizeCases(PrezelListSize.SMALL) + } + } +} - PrezelList( - title = "Regular Title", - size = PrezelListSize.REGULAR, - showLeadingContent = true, - leadingContent = { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = PrezelListSize.REGULAR, - ) - }, - showFirstTrailingContent = false, - trailingContents = persistentListOf( - { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = PrezelListSize.REGULAR, - ) - }, - { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = PrezelListSize.REGULAR, - ) - }, - ), - ) - PrezelList( - title = "Regular Title 2", - size = PrezelListSize.REGULAR, - leadingContent = { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = PrezelListSize.REGULAR, - ) - }, - trailingContents = persistentListOf( - { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = PrezelListSize.REGULAR, - ) - }, - { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = PrezelListSize.REGULAR, - ) - }, - ), - ) - } +@ThemePreview +@Composable +private fun PrezelListRegularPreview() { + PrezelTheme { + PreviewScaffold { + Text(text = "PrezelList - REGULAR", style = PrezelTheme.typography.title2Medium) + HorizontalDivider() + PrezelListSizeCases(PrezelListSize.REGULAR) } } } diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt new file mode 100644 index 0000000..8495f2f --- /dev/null +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt @@ -0,0 +1,91 @@ +package com.team.prezel.core.designsystem.component.list + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import com.team.prezel.core.designsystem.icon.IconSource +import com.team.prezel.core.designsystem.icon.PrezelIcons +import com.team.prezel.core.designsystem.theme.PrezelTheme +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toPersistentList + +@Composable +internal fun NestedCases(size: PrezelListSize) { + Column(verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12)) { + Text("nested off", style = PrezelTheme.typography.body3Medium) + BasePrezelList(size = size, nested = false) + + Text("nested on", style = PrezelTheme.typography.body3Medium) + BasePrezelList(size = size, nested = true) + } +} + +@Composable +internal fun ShowLeadingCases(size: PrezelListSize) { + Column(verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12)) { + Text("showLeadingContent off", style = PrezelTheme.typography.body3Medium) + BasePrezelList(size = size, showLeading = false) + + Text("showLeadingContent on", style = PrezelTheme.typography.body3Medium) + BasePrezelList(size = size, showLeading = true) + } +} + +@Composable +internal fun ShowTrailingCases(size: PrezelListSize) { + Column(verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12)) { + Text("showTrailingContent off", style = PrezelTheme.typography.body3Medium) + BasePrezelList(size = size, showTrailing = false) + + Text("showTrailingContent on", style = PrezelTheme.typography.body3Medium) + BasePrezelList(size = size, showTrailing = true, showFirstTrailing = true) + } +} + +@Composable +internal fun ShowFirstTrailingCases(size: PrezelListSize) { + Column(verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12)) { + Text("showFirstTrailingContent off", style = PrezelTheme.typography.body3Medium) + BasePrezelList(size = size, showFirstTrailing = false) + + Text("showFirstTrailingContent on", style = PrezelTheme.typography.body3Medium) + BasePrezelList(size = size, showFirstTrailing = true) + } +} + +@Composable +private fun prezelListTrailingIcons(size: PrezelListSize): ImmutableList<@Composable () -> Unit> = + List(2) { + @Composable { + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = size, + ) + } + }.toPersistentList() + +@Composable +internal fun BasePrezelList( + size: PrezelListSize, + nested: Boolean = false, + showLeading: Boolean = true, + showTrailing: Boolean = true, + showFirstTrailing: Boolean = false, +) { + PrezelList( + title = "Title", + size = size, + nested = nested, + showLeadingContent = showLeading, + leadingContent = { + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = size, + ) + }, + showTrailingContent = showTrailing, + showFirstTrailingContent = showFirstTrailing, + trailingContents = prezelListTrailingIcons(size), + ) +} diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListStyle.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListStyle.kt index 080a8ca..43295c1 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListStyle.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListStyle.kt @@ -1,5 +1,6 @@ package com.team.prezel.core.designsystem.component.list +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.size import androidx.compose.material3.Icon import androidx.compose.runtime.Composable @@ -37,20 +38,28 @@ internal fun PrezelListIcon( } @Composable -internal fun prezelListVerticalPadding( +internal fun prezelListContentPadding( size: PrezelListSize, + nested: Boolean, spacing: PrezelSpacing = PrezelTheme.spacing, -): Dp = - when (size) { +): PaddingValues { + if (nested) { + return PaddingValues(spacing.V0) + } + + val vertical = when (size) { PrezelListSize.SMALL -> spacing.V10 PrezelListSize.REGULAR -> spacing.V14 } + return PaddingValues( + horizontal = spacing.V12, + vertical = vertical, + ) +} + @Composable -internal fun prezelListTextStyle( - size: PrezelListSize, - spacing: PrezelSpacing = PrezelTheme.spacing, -): TextStyle = +internal fun prezelListTextStyle(size: PrezelListSize): TextStyle = when (size) { PrezelListSize.SMALL -> PrezelTheme.typography.body3Medium PrezelListSize.REGULAR -> PrezelTheme.typography.body2Medium From 1eb1f10c4f5c8bd351b71c821a51aab617801d0a Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Sat, 28 Feb 2026 01:27:33 +0900 Subject: [PATCH 04/16] =?UTF-8?q?refactor:=20PrezelList=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B5=AC=EC=A1=B0=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=20=EB=B0=8F=20=EB=82=B4=EB=B6=80=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EC=B5=9C=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `PrezelList` 컴포넌트의 가독성과 유지보수성을 높이기 위해 내부 구현을 서브 컴포저블로 분리하고 로직을 정리했습니다. * `PrezelListLeadingSlot`, `PrezelListTitle`, `PrezelListTrailingSlot` 비공개 컴포너트 추출 * `visibleTrailingContents` 생성 시 `toImmutableList()`를 사용하여 타입 안정성 확보 * 트레일링 콘텐츠가 없을 경우 불필요한 `Spacer` 및 `Row`가 생성되지 않도록 조건부 렌더링 최적화 * 불필요한 파라미터 명칭 생략 및 코드 스타일 정리 --- .../designsystem/component/list/PrezelList.kt | 71 ++++++++++++------- 1 file changed, 47 insertions(+), 24 deletions(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt index 34a1ae3..7eac7db 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt @@ -3,6 +3,7 @@ package com.team.prezel.core.designsystem.component.list import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -18,6 +19,7 @@ import com.team.prezel.core.designsystem.preview.ThemePreview import com.team.prezel.core.designsystem.theme.PrezelTheme import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toImmutableList @Composable fun PrezelList( @@ -32,38 +34,59 @@ fun PrezelList( trailingContents: ImmutableList<@Composable () -> Unit> = persistentListOf(), ) { val visibleTrailingContents = - if (!showFirstTrailingContent) trailingContents.take(1) else trailingContents + if (!showFirstTrailingContent) trailingContents.take(1).toImmutableList() else trailingContents Row( modifier = modifier .fillMaxWidth() - .padding(paddingValues = prezelListContentPadding(size, nested)), + .padding(prezelListContentPadding(size, nested)), verticalAlignment = Alignment.CenterVertically, ) { - if (showLeadingContent) { - leadingContent() - Spacer(modifier = Modifier.width(prezelListIconTextSpacing(size = size))) - } + PrezelListLeadingSlot(size, showLeadingContent, leadingContent) + PrezelListTitle(title, size) + PrezelListTrailingSlot(size, showTrailingContent, visibleTrailingContents) + } +} - Text( - text = title, - modifier = Modifier.weight(1f), - color = LocalContentColor.current, - maxLines = 1, - style = prezelListTextStyle(size = size), - ) - Spacer(modifier = Modifier.width(prezelListTextTrailingSpacing(size = size))) +@Composable +private fun PrezelListLeadingSlot( + size: PrezelListSize, + showLeadingContent: Boolean, + leadingContent: @Composable () -> Unit, +) { + if (!showLeadingContent) return + leadingContent() + Spacer(modifier = Modifier.width(prezelListIconTextSpacing(size))) +} - if (showTrailingContent) { - Row( - horizontalArrangement = Arrangement.spacedBy( - prezelListTrailingIconSpacing(size), - ), - verticalAlignment = Alignment.CenterVertically, - ) { - visibleTrailingContents.forEach { it() } - } - } +@Composable +private fun RowScope.PrezelListTitle( + title: String, + size: PrezelListSize, +) { + Text( + text = title, + modifier = Modifier.weight(1f), + color = LocalContentColor.current, + maxLines = 1, + style = prezelListTextStyle(size), + ) +} + +@Composable +private fun PrezelListTrailingSlot( + size: PrezelListSize, + showTrailingContent: Boolean, + trailingContents: ImmutableList<@Composable () -> Unit>, +) { + if (!showTrailingContent || trailingContents.isEmpty()) return + + Spacer(modifier = Modifier.width(prezelListTextTrailingSpacing(size))) + Row( + horizontalArrangement = Arrangement.spacedBy(prezelListTrailingIconSpacing(size)), + verticalAlignment = Alignment.CenterVertically, + ) { + trailingContents.forEach { it() } } } From 3a98db653ec836e28b0d650b03291cbeea34d829 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Sat, 28 Feb 2026 01:40:19 +0900 Subject: [PATCH 05/16] =?UTF-8?q?refactor:=20PrezelList=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=EC=9D=98=20Trailing=20Content=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `PrezelList` 컴포넌트에서 리스트 끝에 표시되는 아이콘(Trailing Content)의 전달 방식을 리스트 형태에서 단일 컴포저블 람다 방식으로 변경하여 유연성을 높였습니다. * `PrezelList` 및 `PrezelListTrailingSlot`의 `trailingContents: ImmutableList<@Composable () -> Unit>` 파라미터를 `trailingContent: @Composable () -> Unit`으로 변경 * 내부적으로 `ImmutableList`를 처리하던 로직을 제거하고 호출부에서 UI 구성을 제어하도록 수정 * `PrezelListPreview.kt` 내 미리보기 코드를 변경된 구조에 맞게 업데이트 * 불필요한 `kotlinx.collections.immutable` 관련 임포트 제거 --- .../designsystem/component/list/PrezelList.kt | 16 +++------ .../component/list/PrezelListPreview.kt | 33 +++++++++++-------- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt index 7eac7db..d320fbe 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt @@ -17,9 +17,6 @@ import androidx.compose.ui.Modifier import com.team.prezel.core.designsystem.preview.PreviewScaffold import com.team.prezel.core.designsystem.preview.ThemePreview import com.team.prezel.core.designsystem.theme.PrezelTheme -import kotlinx.collections.immutable.ImmutableList -import kotlinx.collections.immutable.persistentListOf -import kotlinx.collections.immutable.toImmutableList @Composable fun PrezelList( @@ -31,11 +28,8 @@ fun PrezelList( leadingContent: @Composable () -> Unit = {}, showTrailingContent: Boolean = true, showFirstTrailingContent: Boolean = true, - trailingContents: ImmutableList<@Composable () -> Unit> = persistentListOf(), + trailingContent: @Composable () -> Unit = {}, ) { - val visibleTrailingContents = - if (!showFirstTrailingContent) trailingContents.take(1).toImmutableList() else trailingContents - Row( modifier = modifier .fillMaxWidth() @@ -44,7 +38,7 @@ fun PrezelList( ) { PrezelListLeadingSlot(size, showLeadingContent, leadingContent) PrezelListTitle(title, size) - PrezelListTrailingSlot(size, showTrailingContent, visibleTrailingContents) + PrezelListTrailingSlot(size, showTrailingContent, trailingContent) } } @@ -77,16 +71,16 @@ private fun RowScope.PrezelListTitle( private fun PrezelListTrailingSlot( size: PrezelListSize, showTrailingContent: Boolean, - trailingContents: ImmutableList<@Composable () -> Unit>, + trailingContent: @Composable () -> Unit = {}, ) { - if (!showTrailingContent || trailingContents.isEmpty()) return + if (!showTrailingContent) return Spacer(modifier = Modifier.width(prezelListTextTrailingSpacing(size))) Row( horizontalArrangement = Arrangement.spacedBy(prezelListTrailingIconSpacing(size)), verticalAlignment = Alignment.CenterVertically, ) { - trailingContents.forEach { it() } + trailingContent() } } diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt index 8495f2f..f514145 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt @@ -7,8 +7,6 @@ import androidx.compose.runtime.Composable import com.team.prezel.core.designsystem.icon.IconSource import com.team.prezel.core.designsystem.icon.PrezelIcons import com.team.prezel.core.designsystem.theme.PrezelTheme -import kotlinx.collections.immutable.ImmutableList -import kotlinx.collections.immutable.toPersistentList @Composable internal fun NestedCases(size: PrezelListSize) { @@ -54,17 +52,6 @@ internal fun ShowFirstTrailingCases(size: PrezelListSize) { } } -@Composable -private fun prezelListTrailingIcons(size: PrezelListSize): ImmutableList<@Composable () -> Unit> = - List(2) { - @Composable { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = size, - ) - } - }.toPersistentList() - @Composable internal fun BasePrezelList( size: PrezelListSize, @@ -86,6 +73,24 @@ internal fun BasePrezelList( }, showTrailingContent = showTrailing, showFirstTrailingContent = showFirstTrailing, - trailingContents = prezelListTrailingIcons(size), + trailingContent = { + if (showTrailing) { + if (!showFirstTrailing) { + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = size, + ) + } else { + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = size, + ) + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = size, + ) + } + } + }, ) } From c1bbf765960b6957b9bb9b08219d28dec1002a80 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Sat, 28 Feb 2026 02:00:53 +0900 Subject: [PATCH 06/16] =?UTF-8?q?refactor:=20PrezelList=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B5=AC=EC=A1=B0=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=20=EB=B0=8F=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `PrezelList` 컴포넌트에서 가시성 제어를 위한 Boolean 파라미터들을 제거하고, 람다의 null 여부에 따라 콘텐츠를 표시하도록 리팩토링했습니다. * `PrezelList`: `showLeadingContent`, `showTrailingContent`, `showFirstTrailingContent` 파라미터 제거 * `leadingContent` 및 `trailingContent` 타입을 옵셔널(`@Composable () -> Unit?`)로 변경하여 null이 아닐 경우에만 렌더링하도록 수정 * `PrezelListLeadingSlot`, `PrezelListTrailingSlot` 내부 로직을 null 체크 방식으로 변경 * `PrezelListPreview`: 파라미터 변경에 맞춰 프리뷰 코드 수정 및 간소화 --- .../designsystem/component/list/PrezelList.kt | 40 ++++++++--------- .../component/list/PrezelListPreview.kt | 43 ++++++------------- 2 files changed, 32 insertions(+), 51 deletions(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt index d320fbe..d7146c9 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt @@ -24,11 +24,8 @@ fun PrezelList( modifier: Modifier = Modifier, size: PrezelListSize = PrezelListSize.REGULAR, nested: Boolean = false, - showLeadingContent: Boolean = false, - leadingContent: @Composable () -> Unit = {}, - showTrailingContent: Boolean = true, - showFirstTrailingContent: Boolean = true, - trailingContent: @Composable () -> Unit = {}, + leadingContent: (@Composable () -> Unit)? = null, + trailingContent: (@Composable () -> Unit)? = null, ) { Row( modifier = modifier @@ -36,21 +33,21 @@ fun PrezelList( .padding(prezelListContentPadding(size, nested)), verticalAlignment = Alignment.CenterVertically, ) { - PrezelListLeadingSlot(size, showLeadingContent, leadingContent) + PrezelListLeadingSlot(size, leadingContent) PrezelListTitle(title, size) - PrezelListTrailingSlot(size, showTrailingContent, trailingContent) + PrezelListTrailingSlot(size, trailingContent) } } @Composable private fun PrezelListLeadingSlot( size: PrezelListSize, - showLeadingContent: Boolean, - leadingContent: @Composable () -> Unit, + leadingContent: (@Composable () -> Unit)?, ) { - if (!showLeadingContent) return - leadingContent() - Spacer(modifier = Modifier.width(prezelListIconTextSpacing(size))) + leadingContent?.let { + it() + Spacer(modifier = Modifier.width(prezelListIconTextSpacing(size))) + } } @Composable @@ -70,17 +67,16 @@ private fun RowScope.PrezelListTitle( @Composable private fun PrezelListTrailingSlot( size: PrezelListSize, - showTrailingContent: Boolean, - trailingContent: @Composable () -> Unit = {}, + trailingContent: (@Composable () -> Unit)?, ) { - if (!showTrailingContent) return - - Spacer(modifier = Modifier.width(prezelListTextTrailingSpacing(size))) - Row( - horizontalArrangement = Arrangement.spacedBy(prezelListTrailingIconSpacing(size)), - verticalAlignment = Alignment.CenterVertically, - ) { - trailingContent() + trailingContent?.let { + Spacer(modifier = Modifier.width(prezelListTextTrailingSpacing(size))) + Row( + horizontalArrangement = Arrangement.spacedBy(prezelListTrailingIconSpacing(size)), + verticalAlignment = Alignment.CenterVertically, + ) { + it() + } } } diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt index f514145..ba1df9d 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt @@ -23,10 +23,10 @@ internal fun NestedCases(size: PrezelListSize) { internal fun ShowLeadingCases(size: PrezelListSize) { Column(verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12)) { Text("showLeadingContent off", style = PrezelTheme.typography.body3Medium) - BasePrezelList(size = size, showLeading = false) + BasePrezelList(size = size) Text("showLeadingContent on", style = PrezelTheme.typography.body3Medium) - BasePrezelList(size = size, showLeading = true) + BasePrezelList(size = size) } } @@ -34,10 +34,10 @@ internal fun ShowLeadingCases(size: PrezelListSize) { internal fun ShowTrailingCases(size: PrezelListSize) { Column(verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12)) { Text("showTrailingContent off", style = PrezelTheme.typography.body3Medium) - BasePrezelList(size = size, showTrailing = false) + BasePrezelList(size = size) Text("showTrailingContent on", style = PrezelTheme.typography.body3Medium) - BasePrezelList(size = size, showTrailing = true, showFirstTrailing = true) + BasePrezelList(size = size) } } @@ -45,10 +45,10 @@ internal fun ShowTrailingCases(size: PrezelListSize) { internal fun ShowFirstTrailingCases(size: PrezelListSize) { Column(verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12)) { Text("showFirstTrailingContent off", style = PrezelTheme.typography.body3Medium) - BasePrezelList(size = size, showFirstTrailing = false) + BasePrezelList(size = size) Text("showFirstTrailingContent on", style = PrezelTheme.typography.body3Medium) - BasePrezelList(size = size, showFirstTrailing = true) + BasePrezelList(size = size) } } @@ -56,41 +56,26 @@ internal fun ShowFirstTrailingCases(size: PrezelListSize) { internal fun BasePrezelList( size: PrezelListSize, nested: Boolean = false, - showLeading: Boolean = true, - showTrailing: Boolean = true, - showFirstTrailing: Boolean = false, ) { PrezelList( title = "Title", size = size, nested = nested, - showLeadingContent = showLeading, leadingContent = { PrezelListIcon( icon = IconSource(resId = PrezelIcons.Blank), size = size, ) }, - showTrailingContent = showTrailing, - showFirstTrailingContent = showFirstTrailing, trailingContent = { - if (showTrailing) { - if (!showFirstTrailing) { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = size, - ) - } else { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = size, - ) - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = size, - ) - } - } + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = size, + ) + PrezelListIcon( + icon = IconSource(resId = PrezelIcons.Blank), + size = size, + ) }, ) } From 0f6da172400566a457e862db0d15fbd01fea3573 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Sun, 1 Mar 2026 16:11:17 +0900 Subject: [PATCH 07/16] =?UTF-8?q?refactor:=20PrezelList=20=EB=82=B4?= =?UTF-8?q?=EB=B6=80=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C=EC=84=A0=20=EB=B0=8F?= =?UTF-8?q?=20=ED=94=84=EB=A6=AC=EB=B7=B0=20=EC=BD=94=EB=93=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `PrezelList` 컴포넌트의 내부 가독성을 높이고 불필요한 레이아웃 구조를 정리했습니다. * `PrezelListLeading` 및 `PrezelListTrailing` 내부의 `let` 확장 함수 사용을 조기 리턴(Early Return) 방식으로 변경하여 코드 가독성을 개선했습니다. * `PrezelListTrailing`에서 불필요하게 사용되던 `it()` 호출을 명시적인 `trailingContent()` 호출로 수정했습니다. * 프리뷰 코드에서 사용하지 않는 `PrezelListSizeCases` 함수와 `HorizontalDivider`를 제거하고, `PrezelListPreviewBySize`를 사용하도록 구조를 단순화했습니다. * 불필요한 `Column` 및 `import` 문을 정리했습니다. --- .../designsystem/component/list/PrezelList.kt | 41 ++---- .../component/list/PrezelListPreview.kt | 134 +++++++++++------- 2 files changed, 97 insertions(+), 78 deletions(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt index d7146c9..36f18a8 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt @@ -1,14 +1,12 @@ package com.team.prezel.core.designsystem.component.list import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width -import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.LocalContentColor import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -44,10 +42,10 @@ private fun PrezelListLeadingSlot( size: PrezelListSize, leadingContent: (@Composable () -> Unit)?, ) { - leadingContent?.let { - it() - Spacer(modifier = Modifier.width(prezelListIconTextSpacing(size))) - } + if (leadingContent == null) return + + leadingContent() + Spacer(modifier = Modifier.width(prezelListIconTextSpacing(size))) } @Composable @@ -69,24 +67,15 @@ private fun PrezelListTrailingSlot( size: PrezelListSize, trailingContent: (@Composable () -> Unit)?, ) { - trailingContent?.let { - Spacer(modifier = Modifier.width(prezelListTextTrailingSpacing(size))) - Row( - horizontalArrangement = Arrangement.spacedBy(prezelListTrailingIconSpacing(size)), - verticalAlignment = Alignment.CenterVertically, - ) { - it() - } - } -} + if (trailingContent == null) return -@Composable -private fun PrezelListSizeCases(size: PrezelListSize) { - Column(verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V24)) { - NestedCases(size) - ShowLeadingCases(size) - ShowTrailingCases(size) - ShowFirstTrailingCases(size) + Spacer(modifier = Modifier.width(prezelListTextTrailingSpacing(size))) + + Row( + horizontalArrangement = Arrangement.spacedBy(prezelListTrailingIconSpacing(size)), + verticalAlignment = Alignment.CenterVertically, + ) { + trailingContent() } } @@ -96,8 +85,7 @@ private fun PrezelListSmallPreview() { PrezelTheme { PreviewScaffold { Text(text = "PrezelList - SMALL", style = PrezelTheme.typography.title2Medium) - HorizontalDivider() - PrezelListSizeCases(PrezelListSize.SMALL) + PrezelListPreviewBySize(size = PrezelListSize.SMALL) } } } @@ -108,8 +96,7 @@ private fun PrezelListRegularPreview() { PrezelTheme { PreviewScaffold { Text(text = "PrezelList - REGULAR", style = PrezelTheme.typography.title2Medium) - HorizontalDivider() - PrezelListSizeCases(PrezelListSize.REGULAR) + PrezelListPreviewBySize(size = PrezelListSize.REGULAR) } } } diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt index ba1df9d..31b6099 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt @@ -2,80 +2,112 @@ package com.team.prezel.core.designsystem.component.list import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import com.team.prezel.core.designsystem.icon.IconSource +import androidx.compose.runtime.Immutable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource import com.team.prezel.core.designsystem.icon.PrezelIcons import com.team.prezel.core.designsystem.theme.PrezelTheme +import kotlinx.collections.immutable.persistentListOf -@Composable -internal fun NestedCases(size: PrezelListSize) { - Column(verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12)) { - Text("nested off", style = PrezelTheme.typography.body3Medium) - BasePrezelList(size = size, nested = false) +@Immutable +private data class PrezelListVariant( + val hasLeading: Boolean, + val hasTrailing: Boolean, +) - Text("nested on", style = PrezelTheme.typography.body3Medium) - BasePrezelList(size = size, nested = true) - } -} +private val PrezelListVariants = persistentListOf( + PrezelListVariant(hasLeading = false, hasTrailing = false), + PrezelListVariant(hasLeading = true, hasTrailing = false), + PrezelListVariant(hasLeading = false, hasTrailing = true), + PrezelListVariant(hasLeading = true, hasTrailing = true), +) @Composable -internal fun ShowLeadingCases(size: PrezelListSize) { - Column(verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12)) { - Text("showLeadingContent off", style = PrezelTheme.typography.body3Medium) - BasePrezelList(size = size) - - Text("showLeadingContent on", style = PrezelTheme.typography.body3Medium) - BasePrezelList(size = size) - } -} - -@Composable -internal fun ShowTrailingCases(size: PrezelListSize) { - Column(verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12)) { - Text("showTrailingContent off", style = PrezelTheme.typography.body3Medium) - BasePrezelList(size = size) +internal fun PrezelListPreviewBySize( + size: PrezelListSize, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier, + verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12), + ) { + PrezelListVariants.forEach { variant -> + HorizontalDivider() + PrezelListVariantSection( + size = size, + nested = false, + variant = variant, + ) + } - Text("showTrailingContent on", style = PrezelTheme.typography.body3Medium) - BasePrezelList(size = size) + HorizontalDivider() + PrezelListVariantSection( + size = size, + nested = true, + variant = PrezelListVariant(hasLeading = true, hasTrailing = true), + ) } } @Composable -internal fun ShowFirstTrailingCases(size: PrezelListSize) { - Column(verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12)) { - Text("showFirstTrailingContent off", style = PrezelTheme.typography.body3Medium) - BasePrezelList(size = size) +private fun PrezelListVariantSection( + size: PrezelListSize, + nested: Boolean, + variant: PrezelListVariant, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier, + verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12), + ) { + Text( + text = "Nested: $nested | Leading: ${variant.hasLeading} | Trailing: ${variant.hasTrailing}", + style = PrezelTheme.typography.body3Medium, + ) - Text("showFirstTrailingContent on", style = PrezelTheme.typography.body3Medium) - BasePrezelList(size = size) + PrezelListCaseRow(size = size, nested = nested, variant = variant) } } @Composable -internal fun BasePrezelList( +private fun PrezelListCaseRow( size: PrezelListSize, - nested: Boolean = false, + nested: Boolean, + variant: PrezelListVariant, ) { + val leading: (@Composable () -> Unit)? = + if (variant.hasLeading) { + { + Icon( + painter = painterResource(id = PrezelIcons.Blank), + contentDescription = "leading", + ) + } + } else { + null + } + + val trailing: (@Composable () -> Unit)? = + if (variant.hasTrailing) { + { + Icon( + painter = painterResource(id = PrezelIcons.Blank), + contentDescription = "trailing", + ) + } + } else { + null + } + PrezelList( title = "Title", size = size, nested = nested, - leadingContent = { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = size, - ) - }, - trailingContent = { - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = size, - ) - PrezelListIcon( - icon = IconSource(resId = PrezelIcons.Blank), - size = size, - ) - }, + leadingContent = leading, + trailingContent = trailing, ) } From 2797442898132b353d44c781cf74304a1217ada7 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Fri, 6 Mar 2026 13:25:25 +0900 Subject: [PATCH 08/16] =?UTF-8?q?refactor:=20PrezelList=20=EC=8A=AC?= =?UTF-8?q?=EB=A1=AF=20=EA=B5=AC=ED=98=84=20=EB=B0=A9=EC=8B=9D=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=20=EB=B0=8F=20=EC=83=89=EC=83=81=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `PrezelList` 컴포넌트의 내부 구조를 정리하고, 슬롯 콘텐츠에 기본 아이콘 색상을 적용했습니다. * `PrezelListLeadingSlot`, `PrezelListTrailingSlot` 비공개 컴포넌트를 제거하고 `PrezelList` 내부에 인라인으로 통합했습니다. * `CompositionLocalProvider`를 사용하여 `leadingContent`와 `trailingContent`의 기본 `LocalContentColor`를 `PrezelTheme.colors.iconRegular`로 설정했습니다. * 슬롯 콘텐츠 렌더링 시 불필요한 함수 호출을 줄이고 가독성을 개선했습니다. --- .../designsystem/component/list/PrezelList.kt | 51 ++++++++----------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt index 36f18a8..1066529 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.width import androidx.compose.material3.LocalContentColor import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import com.team.prezel.core.designsystem.preview.PreviewScaffold @@ -31,21 +32,30 @@ fun PrezelList( .padding(prezelListContentPadding(size, nested)), verticalAlignment = Alignment.CenterVertically, ) { - PrezelListLeadingSlot(size, leadingContent) + leadingContent?.let { + CompositionLocalProvider( + LocalContentColor provides PrezelTheme.colors.iconRegular, + content = leadingContent, + ) + Spacer(modifier = Modifier.width(prezelListIconTextSpacing(size))) + } + PrezelListTitle(title, size) - PrezelListTrailingSlot(size, trailingContent) - } -} -@Composable -private fun PrezelListLeadingSlot( - size: PrezelListSize, - leadingContent: (@Composable () -> Unit)?, -) { - if (leadingContent == null) return + trailingContent?.let { + Spacer(modifier = Modifier.width(prezelListTextTrailingSpacing(size))) - leadingContent() - Spacer(modifier = Modifier.width(prezelListIconTextSpacing(size))) + Row( + horizontalArrangement = Arrangement.spacedBy(prezelListTrailingIconSpacing(size)), + verticalAlignment = Alignment.CenterVertically, + ) { + CompositionLocalProvider( + LocalContentColor provides PrezelTheme.colors.iconRegular, + content = trailingContent, + ) + } + } + } } @Composable @@ -62,23 +72,6 @@ private fun RowScope.PrezelListTitle( ) } -@Composable -private fun PrezelListTrailingSlot( - size: PrezelListSize, - trailingContent: (@Composable () -> Unit)?, -) { - if (trailingContent == null) return - - Spacer(modifier = Modifier.width(prezelListTextTrailingSpacing(size))) - - Row( - horizontalArrangement = Arrangement.spacedBy(prezelListTrailingIconSpacing(size)), - verticalAlignment = Alignment.CenterVertically, - ) { - trailingContent() - } -} - @ThemePreview @Composable private fun PrezelListSmallPreview() { From 27d91142326b62a959b1968cdf2693088bc30879 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Fri, 6 Mar 2026 13:32:34 +0900 Subject: [PATCH 09/16] =?UTF-8?q?refactor:=20PrezelList=20=ED=94=84?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EC=BD=94=EB=93=9C=20=EA=B5=AC=EC=A1=B0=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0=20=EB=B0=8F=20=EC=8A=A4=ED=83=80=EC=9D=BC=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `PrezelListPreview.kt` 내 복잡한 `PrezelListVariant` 데이터 클래스와 리스트 로직을 제거하고, 직관적인 `PrezelListPreviewItem` 및 `PrezelListPreviewBySize` 구조로 리팩토링했습니다. - 프리뷰 내 `HorizontalDivider` 및 섹션 타이틀(`SectionTitle`) 적용 방식을 개선하여 가독성을 높였습니다. - `PrezelList` 컴포넌트 내 불필요한 `LocalContentColor.current` 설정을 제거했습니다. - `PrezelListStyle.kt`에서 사용되지 않는 `PrezelListIcon` 함수를 삭제했습니다. --- .../designsystem/component/list/PrezelList.kt | 10 +- .../component/list/PrezelListPreview.kt | 121 +++++++----------- .../component/list/PrezelListStyle.kt | 23 ---- 3 files changed, 52 insertions(+), 102 deletions(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt index 1066529..ed08270 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt @@ -14,6 +14,7 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import com.team.prezel.core.designsystem.preview.PreviewScaffold +import com.team.prezel.core.designsystem.preview.SectionTitle import com.team.prezel.core.designsystem.preview.ThemePreview import com.team.prezel.core.designsystem.theme.PrezelTheme @@ -66,7 +67,6 @@ private fun RowScope.PrezelListTitle( Text( text = title, modifier = Modifier.weight(1f), - color = LocalContentColor.current, maxLines = 1, style = prezelListTextStyle(size), ) @@ -77,8 +77,8 @@ private fun RowScope.PrezelListTitle( private fun PrezelListSmallPreview() { PrezelTheme { PreviewScaffold { - Text(text = "PrezelList - SMALL", style = PrezelTheme.typography.title2Medium) - PrezelListPreviewBySize(size = PrezelListSize.SMALL) + SectionTitle("PrezelList - SMALL") + PrezelListPreviewBySize(PrezelListSize.SMALL) } } } @@ -88,8 +88,8 @@ private fun PrezelListSmallPreview() { private fun PrezelListRegularPreview() { PrezelTheme { PreviewScaffold { - Text(text = "PrezelList - REGULAR", style = PrezelTheme.typography.title2Medium) - PrezelListPreviewBySize(size = PrezelListSize.REGULAR) + SectionTitle("PrezelList - REGULAR") + PrezelListPreviewBySize(PrezelListSize.REGULAR) } } } diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt index 31b6099..e716737 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt @@ -6,81 +6,21 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.Immutable import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import com.team.prezel.core.designsystem.icon.PrezelIcons import com.team.prezel.core.designsystem.theme.PrezelTheme -import kotlinx.collections.immutable.persistentListOf - -@Immutable -private data class PrezelListVariant( - val hasLeading: Boolean, - val hasTrailing: Boolean, -) - -private val PrezelListVariants = persistentListOf( - PrezelListVariant(hasLeading = false, hasTrailing = false), - PrezelListVariant(hasLeading = true, hasTrailing = false), - PrezelListVariant(hasLeading = false, hasTrailing = true), - PrezelListVariant(hasLeading = true, hasTrailing = true), -) - -@Composable -internal fun PrezelListPreviewBySize( - size: PrezelListSize, - modifier: Modifier = Modifier, -) { - Column( - modifier = modifier, - verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12), - ) { - PrezelListVariants.forEach { variant -> - HorizontalDivider() - PrezelListVariantSection( - size = size, - nested = false, - variant = variant, - ) - } - - HorizontalDivider() - PrezelListVariantSection( - size = size, - nested = true, - variant = PrezelListVariant(hasLeading = true, hasTrailing = true), - ) - } -} @Composable -private fun PrezelListVariantSection( +internal fun PrezelListPreviewItem( size: PrezelListSize, nested: Boolean, - variant: PrezelListVariant, + showLeadingContent: Boolean, + showTrailingContent: Boolean, modifier: Modifier = Modifier, ) { - Column( - modifier = modifier, - verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12), - ) { - Text( - text = "Nested: $nested | Leading: ${variant.hasLeading} | Trailing: ${variant.hasTrailing}", - style = PrezelTheme.typography.body3Medium, - ) - - PrezelListCaseRow(size = size, nested = nested, variant = variant) - } -} - -@Composable -private fun PrezelListCaseRow( - size: PrezelListSize, - nested: Boolean, - variant: PrezelListVariant, -) { - val leading: (@Composable () -> Unit)? = - if (variant.hasLeading) { + val leadingContent: (@Composable () -> Unit)? = + if (showLeadingContent) { { Icon( painter = painterResource(id = PrezelIcons.Blank), @@ -91,8 +31,8 @@ private fun PrezelListCaseRow( null } - val trailing: (@Composable () -> Unit)? = - if (variant.hasTrailing) { + val trailingContent: (@Composable () -> Unit)? = + if (showTrailingContent) { { Icon( painter = painterResource(id = PrezelIcons.Blank), @@ -103,11 +43,44 @@ private fun PrezelListCaseRow( null } - PrezelList( - title = "Title", - size = size, - nested = nested, - leadingContent = leading, - trailingContent = trailing, - ) + Column( + modifier = modifier, + verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12), + ) { + Text( + text = "Nested: $nested | Leading: $showLeadingContent | Trailing: $showTrailingContent", + style = PrezelTheme.typography.body3Medium, + ) + + PrezelList( + title = "Title", + size = size, + nested = nested, + leadingContent = leadingContent, + trailingContent = trailingContent, + ) + + HorizontalDivider() + } +} + +@Composable +internal fun PrezelListPreviewBySize( + size: PrezelListSize, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier, + verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12), + ) { + PrezelListPreviewItem(size, nested = false, showLeadingContent = true, showTrailingContent = true) + PrezelListPreviewItem(size, nested = false, showLeadingContent = true, showTrailingContent = false) + PrezelListPreviewItem(size, nested = false, showLeadingContent = false, showTrailingContent = true) + PrezelListPreviewItem(size, nested = false, showLeadingContent = false, showTrailingContent = false) + + PrezelListPreviewItem(size, nested = true, showLeadingContent = true, showTrailingContent = true) + PrezelListPreviewItem(size, nested = true, showLeadingContent = true, showTrailingContent = false) + PrezelListPreviewItem(size, nested = true, showLeadingContent = false, showTrailingContent = true) + PrezelListPreviewItem(size, nested = true, showLeadingContent = false, showTrailingContent = false) + } } diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListStyle.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListStyle.kt index 43295c1..9c33625 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListStyle.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListStyle.kt @@ -1,16 +1,11 @@ package com.team.prezel.core.designsystem.component.list import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.size -import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable -import androidx.compose.ui.Modifier import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp import com.team.prezel.core.designsystem.foundation.number.PrezelSpacing -import com.team.prezel.core.designsystem.icon.IconSource import com.team.prezel.core.designsystem.theme.PrezelTheme @Immutable @@ -19,24 +14,6 @@ enum class PrezelListSize { REGULAR, } -@Composable -internal fun PrezelListIcon( - icon: IconSource, - size: PrezelListSize, - modifier: Modifier = Modifier, -) { - Icon( - painter = icon.painter(), - contentDescription = icon.contentDescription(), - modifier = modifier.size( - when (size) { - PrezelListSize.SMALL -> 20.dp - PrezelListSize.REGULAR -> 24.dp - }, - ), - ) -} - @Composable internal fun prezelListContentPadding( size: PrezelListSize, From 910dfe76f7e155199a3f2a21fae87895a6b5750c Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Fri, 6 Mar 2026 13:50:18 +0900 Subject: [PATCH 10/16] =?UTF-8?q?refactor:=20PrezelList=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=EC=9D=98=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EB=B0=8F=20=EA=B5=AC=ED=98=84=20=EB=B0=A9=EC=8B=9D?= =?UTF-8?q?=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `PrezelList` 컴포넌트 내에서 `leadingContent`와 `trailingContent`의 유연성을 높이고 코드를 정문화했습니다. * `leadingContent` 및 `trailingContent` 파라미터의 타입을 `(@Composable () -> Unit)?`에서 `(@Composable RowScope.() -> Unit)?`로 변경하여 내부에서 `Row` 관련 scope 기능을 사용할 수 있도록 수정했습니다. * `CompositionLocalProvider` 내에서 콘텐츠를 호출하는 방식을 명시적인 람다 호출(`{ content() }`) 구조로 변경했습니다. --- .../core/designsystem/component/list/PrezelList.kt | 14 ++++++-------- .../component/list/PrezelListPreview.kt | 5 +++-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt index ed08270..f17505e 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt @@ -24,8 +24,8 @@ fun PrezelList( modifier: Modifier = Modifier, size: PrezelListSize = PrezelListSize.REGULAR, nested: Boolean = false, - leadingContent: (@Composable () -> Unit)? = null, - trailingContent: (@Composable () -> Unit)? = null, + leadingContent: (@Composable RowScope.() -> Unit)? = null, + trailingContent: (@Composable RowScope.() -> Unit)? = null, ) { Row( modifier = modifier @@ -33,17 +33,16 @@ fun PrezelList( .padding(prezelListContentPadding(size, nested)), verticalAlignment = Alignment.CenterVertically, ) { - leadingContent?.let { + leadingContent?.let { content -> CompositionLocalProvider( LocalContentColor provides PrezelTheme.colors.iconRegular, - content = leadingContent, - ) + ) { content() } Spacer(modifier = Modifier.width(prezelListIconTextSpacing(size))) } PrezelListTitle(title, size) - trailingContent?.let { + trailingContent?.let { content -> Spacer(modifier = Modifier.width(prezelListTextTrailingSpacing(size))) Row( @@ -52,8 +51,7 @@ fun PrezelList( ) { CompositionLocalProvider( LocalContentColor provides PrezelTheme.colors.iconRegular, - content = trailingContent, - ) + ) { content() } } } } diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt index e716737..261af5b 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt @@ -2,6 +2,7 @@ package com.team.prezel.core.designsystem.component.list import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.RowScope import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.Text @@ -19,7 +20,7 @@ internal fun PrezelListPreviewItem( showTrailingContent: Boolean, modifier: Modifier = Modifier, ) { - val leadingContent: (@Composable () -> Unit)? = + val leadingContent: (@Composable RowScope.() -> Unit)? = if (showLeadingContent) { { Icon( @@ -31,7 +32,7 @@ internal fun PrezelListPreviewItem( null } - val trailingContent: (@Composable () -> Unit)? = + val trailingContent: (@Composable RowScope.() -> Unit)? = if (showTrailingContent) { { Icon( From e163a885b2ea3e590be243122b260059d6cc23b1 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Sat, 7 Mar 2026 09:32:48 +0900 Subject: [PATCH 11/16] =?UTF-8?q?refactor:=20PrezelList=EC=9D=98=20Composi?= =?UTF-8?q?tionLocalProvider=20=EC=A0=81=EC=9A=A9=20=EB=B2=94=EC=9C=84=20?= =?UTF-8?q?=EC=B5=9C=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `PrezelList` 내에서 `leadingContent`와 `trailingContent`에 개별적으로 적용되던 `CompositionLocalProvider`를 `Row` 전체를 감싸는 방식으로 변경하여 코드 중복을 제거하고 구조를 개선했습니다. --- .../designsystem/component/list/PrezelList.kt | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt index f17505e..4b22b8c 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt @@ -27,31 +27,31 @@ fun PrezelList( leadingContent: (@Composable RowScope.() -> Unit)? = null, trailingContent: (@Composable RowScope.() -> Unit)? = null, ) { - Row( - modifier = modifier - .fillMaxWidth() - .padding(prezelListContentPadding(size, nested)), - verticalAlignment = Alignment.CenterVertically, + CompositionLocalProvider( + LocalContentColor provides PrezelTheme.colors.iconRegular, ) { - leadingContent?.let { content -> - CompositionLocalProvider( - LocalContentColor provides PrezelTheme.colors.iconRegular, - ) { content() } - Spacer(modifier = Modifier.width(prezelListIconTextSpacing(size))) - } + Row( + modifier = modifier + .fillMaxWidth() + .padding(prezelListContentPadding(size, nested)), + verticalAlignment = Alignment.CenterVertically, + ) { + leadingContent?.let { content -> + content() + Spacer(modifier = Modifier.width(prezelListIconTextSpacing(size))) + } - PrezelListTitle(title, size) + PrezelListTitle(title, size) - trailingContent?.let { content -> - Spacer(modifier = Modifier.width(prezelListTextTrailingSpacing(size))) + trailingContent?.let { content -> + Spacer(modifier = Modifier.width(prezelListTextTrailingSpacing(size))) - Row( - horizontalArrangement = Arrangement.spacedBy(prezelListTrailingIconSpacing(size)), - verticalAlignment = Alignment.CenterVertically, - ) { - CompositionLocalProvider( - LocalContentColor provides PrezelTheme.colors.iconRegular, - ) { content() } + Row( + horizontalArrangement = Arrangement.spacedBy(prezelListTrailingIconSpacing(size)), + verticalAlignment = Alignment.CenterVertically, + ) { + content() + } } } } From 28f2850064637e1661ae343ae82b508ec6e7ab45 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Sun, 8 Mar 2026 20:15:54 +0900 Subject: [PATCH 12/16] =?UTF-8?q?refactor:=20PrezelList=20=EB=82=B4=20?= =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20CompositionLocalProvider?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `PrezelList` 컴포넌트에서 `LocalContentColor`를 `PrezelTheme.colors.iconRegular`로 강제 설정하던 `CompositionLocalProvider`를 제거하였습니다. 이를 통해 상위 컴포넌트의 색상 설정을 따르거나 개별 콘텐츠에서 색상을 제어할 수 있도록 유연성을 높였습니다. --- .../designsystem/component/list/PrezelList.kt | 40 ++++++++----------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt index 4b22b8c..d71af1b 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt @@ -7,10 +7,8 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width -import androidx.compose.material3.LocalContentColor import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import com.team.prezel.core.designsystem.preview.PreviewScaffold @@ -27,31 +25,27 @@ fun PrezelList( leadingContent: (@Composable RowScope.() -> Unit)? = null, trailingContent: (@Composable RowScope.() -> Unit)? = null, ) { - CompositionLocalProvider( - LocalContentColor provides PrezelTheme.colors.iconRegular, + Row( + modifier = modifier + .fillMaxWidth() + .padding(prezelListContentPadding(size, nested)), + verticalAlignment = Alignment.CenterVertically, ) { - Row( - modifier = modifier - .fillMaxWidth() - .padding(prezelListContentPadding(size, nested)), - verticalAlignment = Alignment.CenterVertically, - ) { - leadingContent?.let { content -> - content() - Spacer(modifier = Modifier.width(prezelListIconTextSpacing(size))) - } + leadingContent?.let { content -> + content() + Spacer(modifier = Modifier.width(prezelListIconTextSpacing(size))) + } - PrezelListTitle(title, size) + PrezelListTitle(title, size) - trailingContent?.let { content -> - Spacer(modifier = Modifier.width(prezelListTextTrailingSpacing(size))) + trailingContent?.let { content -> + Spacer(modifier = Modifier.width(prezelListTextTrailingSpacing(size))) - Row( - horizontalArrangement = Arrangement.spacedBy(prezelListTrailingIconSpacing(size)), - verticalAlignment = Alignment.CenterVertically, - ) { - content() - } + Row( + horizontalArrangement = Arrangement.spacedBy(prezelListTrailingIconSpacing(size)), + verticalAlignment = Alignment.CenterVertically, + ) { + content() } } } From 11a7f5af30f3bda207e305e0c84f8ac4ba4a54c9 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Sun, 8 Mar 2026 20:20:19 +0900 Subject: [PATCH 13/16] =?UTF-8?q?refactor:=20PrezelList=20=ED=85=8D?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=83=89=EC=83=81=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `PrezelList` 컴포넌트의 텍스트 색상이 `LocalContentColor`를 따르도록 수정하여 테마 및 상위 컴포넌트의 색상 설정과 동기화되도록 개선했습니다. --- .../team/prezel/core/designsystem/component/list/PrezelList.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt index d71af1b..ed7ddc7 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width +import androidx.compose.material3.LocalContentColor import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -61,6 +62,7 @@ private fun RowScope.PrezelListTitle( modifier = Modifier.weight(1f), maxLines = 1, style = prezelListTextStyle(size), + color = LocalContentColor.current, ) } From 0f870535953b11a18ec2fc76975fcde3c6a15f98 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Mon, 9 Mar 2026 01:09:24 +0900 Subject: [PATCH 14/16] =?UTF-8?q?refactor:=20PrezelList=20=ED=94=84?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EC=BD=94=EB=93=9C=20=EA=B5=AC=EC=A1=B0=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 별도 파일로 분리되어 있던 `PrezelListPreview.kt`를 삭제하고, 해당 로직을 `PrezelList.kt` 내부로 통합하여 관리하도록 수정했습니다. * `PrezelListPreviewItem` 및 관련 프리뷰 로직을 `PrezelList.kt`로 이동 * `PrezelListPreviewBySize`를 제거하고 각 프리뷰 섹션에서 직접 `PrezelListPreviewItem`을 호출하도록 변경 * 불필요한 파일 삭제를 통한 프로젝트 구조 단순화 --- .../designsystem/component/list/PrezelList.kt | 76 +++++++++++++++- .../component/list/PrezelListPreview.kt | 87 ------------------- 2 files changed, 74 insertions(+), 89 deletions(-) delete mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt index ed7ddc7..7fb4476 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt @@ -1,17 +1,22 @@ package com.team.prezel.core.designsystem.component.list import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import com.team.prezel.core.designsystem.icon.PrezelIcons import com.team.prezel.core.designsystem.preview.PreviewScaffold import com.team.prezel.core.designsystem.preview.SectionTitle import com.team.prezel.core.designsystem.preview.ThemePreview @@ -72,7 +77,14 @@ private fun PrezelListSmallPreview() { PrezelTheme { PreviewScaffold { SectionTitle("PrezelList - SMALL") - PrezelListPreviewBySize(PrezelListSize.SMALL) + PrezelListPreviewItem(size = PrezelListSize.SMALL, nested = false, showLeadingContent = true, showTrailingContent = true) + PrezelListPreviewItem(size = PrezelListSize.SMALL, nested = false, showLeadingContent = true, showTrailingContent = false) + PrezelListPreviewItem(size = PrezelListSize.SMALL, nested = false, showLeadingContent = false, showTrailingContent = true) + PrezelListPreviewItem(size = PrezelListSize.SMALL, nested = false, showLeadingContent = false, showTrailingContent = false) + PrezelListPreviewItem(size = PrezelListSize.SMALL, nested = true, showLeadingContent = true, showTrailingContent = true) + PrezelListPreviewItem(size = PrezelListSize.SMALL, nested = true, showLeadingContent = true, showTrailingContent = false) + PrezelListPreviewItem(size = PrezelListSize.SMALL, nested = true, showLeadingContent = false, showTrailingContent = true) + PrezelListPreviewItem(size = PrezelListSize.SMALL, nested = true, showLeadingContent = false, showTrailingContent = false) } } } @@ -83,7 +95,67 @@ private fun PrezelListRegularPreview() { PrezelTheme { PreviewScaffold { SectionTitle("PrezelList - REGULAR") - PrezelListPreviewBySize(PrezelListSize.REGULAR) + PrezelListPreviewItem(size = PrezelListSize.REGULAR, nested = false, showLeadingContent = true, showTrailingContent = true) + PrezelListPreviewItem(size = PrezelListSize.REGULAR, nested = false, showLeadingContent = true, showTrailingContent = false) + PrezelListPreviewItem(size = PrezelListSize.REGULAR, nested = false, showLeadingContent = false, showTrailingContent = true) + PrezelListPreviewItem(size = PrezelListSize.REGULAR, nested = false, showLeadingContent = false, showTrailingContent = false) + PrezelListPreviewItem(size = PrezelListSize.REGULAR, nested = true, showLeadingContent = true, showTrailingContent = true) + PrezelListPreviewItem(size = PrezelListSize.REGULAR, nested = true, showLeadingContent = true, showTrailingContent = false) + PrezelListPreviewItem(size = PrezelListSize.REGULAR, nested = true, showLeadingContent = false, showTrailingContent = true) + PrezelListPreviewItem(size = PrezelListSize.REGULAR, nested = true, showLeadingContent = false, showTrailingContent = false) } } } + +@Composable +private fun PrezelListPreviewItem( + size: PrezelListSize, + nested: Boolean, + showLeadingContent: Boolean, + showTrailingContent: Boolean, + modifier: Modifier = Modifier, +) { + val leadingContent: (@Composable RowScope.() -> Unit)? = + if (showLeadingContent) { + { + Icon( + painter = painterResource(id = PrezelIcons.Blank), + contentDescription = "leading", + ) + } + } else { + null + } + + val trailingContent: (@Composable RowScope.() -> Unit)? = + if (showTrailingContent) { + { + Icon( + painter = painterResource(id = PrezelIcons.Blank), + contentDescription = "trailing", + ) + } + } else { + null + } + + Column( + modifier = modifier, + verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12), + ) { + Text( + text = "Nested: $nested | Leading: $showLeadingContent | Trailing: $showTrailingContent", + style = PrezelTheme.typography.body3Medium, + ) + + PrezelList( + title = "Title", + size = size, + nested = nested, + leadingContent = leadingContent, + trailingContent = trailingContent, + ) + + HorizontalDivider() + } +} diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt deleted file mode 100644 index 261af5b..0000000 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelListPreview.kt +++ /dev/null @@ -1,87 +0,0 @@ -package com.team.prezel.core.designsystem.component.list - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.RowScope -import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.Icon -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource -import com.team.prezel.core.designsystem.icon.PrezelIcons -import com.team.prezel.core.designsystem.theme.PrezelTheme - -@Composable -internal fun PrezelListPreviewItem( - size: PrezelListSize, - nested: Boolean, - showLeadingContent: Boolean, - showTrailingContent: Boolean, - modifier: Modifier = Modifier, -) { - val leadingContent: (@Composable RowScope.() -> Unit)? = - if (showLeadingContent) { - { - Icon( - painter = painterResource(id = PrezelIcons.Blank), - contentDescription = "leading", - ) - } - } else { - null - } - - val trailingContent: (@Composable RowScope.() -> Unit)? = - if (showTrailingContent) { - { - Icon( - painter = painterResource(id = PrezelIcons.Blank), - contentDescription = "trailing", - ) - } - } else { - null - } - - Column( - modifier = modifier, - verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12), - ) { - Text( - text = "Nested: $nested | Leading: $showLeadingContent | Trailing: $showTrailingContent", - style = PrezelTheme.typography.body3Medium, - ) - - PrezelList( - title = "Title", - size = size, - nested = nested, - leadingContent = leadingContent, - trailingContent = trailingContent, - ) - - HorizontalDivider() - } -} - -@Composable -internal fun PrezelListPreviewBySize( - size: PrezelListSize, - modifier: Modifier = Modifier, -) { - Column( - modifier = modifier, - verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12), - ) { - PrezelListPreviewItem(size, nested = false, showLeadingContent = true, showTrailingContent = true) - PrezelListPreviewItem(size, nested = false, showLeadingContent = true, showTrailingContent = false) - PrezelListPreviewItem(size, nested = false, showLeadingContent = false, showTrailingContent = true) - PrezelListPreviewItem(size, nested = false, showLeadingContent = false, showTrailingContent = false) - - PrezelListPreviewItem(size, nested = true, showLeadingContent = true, showTrailingContent = true) - PrezelListPreviewItem(size, nested = true, showLeadingContent = true, showTrailingContent = false) - PrezelListPreviewItem(size, nested = true, showLeadingContent = false, showTrailingContent = true) - PrezelListPreviewItem(size, nested = true, showLeadingContent = false, showTrailingContent = false) - } -} From 928a1da83fbfe6b7397396b2f1f2374d1a92f33e Mon Sep 17 00:00:00 2001 From: moondev03 Date: Mon, 9 Mar 2026 01:29:16 +0900 Subject: [PATCH 15/16] =?UTF-8?q?feat:=20=EC=A0=90=EC=84=A0=20=ED=85=8C?= =?UTF-8?q?=EB=91=90=EB=A6=AC(Dash=20Border)=20Modifier=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/designsystem/util/DrowDashBorder.kt | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/util/DrowDashBorder.kt diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/util/DrowDashBorder.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/util/DrowDashBorder.kt new file mode 100644 index 0000000..8d09b33 --- /dev/null +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/util/DrowDashBorder.kt @@ -0,0 +1,44 @@ +package com.team.prezel.core.designsystem.util + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.drawBehind +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.PathEffect +import androidx.compose.ui.graphics.drawscope.Stroke +import androidx.compose.ui.unit.dp +import com.team.prezel.core.designsystem.preview.ThemePreview +import com.team.prezel.core.designsystem.theme.PrezelTheme + +fun Modifier.drawDashBorder( + color: Color = Color.Gray, + width: Float = 1f, + interval: Float = 10f, + phase: Float = 0f, +) = this.drawBehind { + drawRoundRect( + color = color, + style = Stroke( + width = width, + pathEffect = PathEffect.dashPathEffect(floatArrayOf(interval, interval), phase), + ), + ) +} + +@ThemePreview +@Composable +private fun DrawDashBorderPreview() { + PrezelTheme { + Box( + modifier = Modifier + .fillMaxWidth() + .height(100.dp) + .padding(12.dp) + .drawDashBorder(), + ) + } +} From 13ec1f91ceb118d389e378ea874c5aa4fa476b02 Mon Sep 17 00:00:00 2001 From: moondev03 Date: Mon, 9 Mar 2026 01:31:48 +0900 Subject: [PATCH 16/16] =?UTF-8?q?refactor:=20PrezelList=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B5=AC=EC=A1=B0=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=20=EB=B0=8F=20Preview=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designsystem/component/list/PrezelList.kt | 120 +++++++++--------- 1 file changed, 58 insertions(+), 62 deletions(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt index 7fb4476..6718468 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/list/PrezelList.kt @@ -1,26 +1,29 @@ package com.team.prezel.core.designsystem.component.list +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width -import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp import com.team.prezel.core.designsystem.icon.PrezelIcons import com.team.prezel.core.designsystem.preview.PreviewScaffold import com.team.prezel.core.designsystem.preview.SectionTitle import com.team.prezel.core.designsystem.preview.ThemePreview import com.team.prezel.core.designsystem.theme.PrezelTheme +import com.team.prezel.core.designsystem.util.drawDashBorder @Composable fun PrezelList( @@ -28,8 +31,8 @@ fun PrezelList( modifier: Modifier = Modifier, size: PrezelListSize = PrezelListSize.REGULAR, nested: Boolean = false, - leadingContent: (@Composable RowScope.() -> Unit)? = null, - trailingContent: (@Composable RowScope.() -> Unit)? = null, + leadingContent: @Composable (RowScope.() -> Unit)? = null, + trailingContent: @Composable (RowScope.() -> Unit)? = null, ) { Row( modifier = modifier @@ -76,15 +79,7 @@ private fun RowScope.PrezelListTitle( private fun PrezelListSmallPreview() { PrezelTheme { PreviewScaffold { - SectionTitle("PrezelList - SMALL") - PrezelListPreviewItem(size = PrezelListSize.SMALL, nested = false, showLeadingContent = true, showTrailingContent = true) - PrezelListPreviewItem(size = PrezelListSize.SMALL, nested = false, showLeadingContent = true, showTrailingContent = false) - PrezelListPreviewItem(size = PrezelListSize.SMALL, nested = false, showLeadingContent = false, showTrailingContent = true) - PrezelListPreviewItem(size = PrezelListSize.SMALL, nested = false, showLeadingContent = false, showTrailingContent = false) - PrezelListPreviewItem(size = PrezelListSize.SMALL, nested = true, showLeadingContent = true, showTrailingContent = true) - PrezelListPreviewItem(size = PrezelListSize.SMALL, nested = true, showLeadingContent = true, showTrailingContent = false) - PrezelListPreviewItem(size = PrezelListSize.SMALL, nested = true, showLeadingContent = false, showTrailingContent = true) - PrezelListPreviewItem(size = PrezelListSize.SMALL, nested = true, showLeadingContent = false, showTrailingContent = false) + PrezelListPreviewBySize(PrezelListSize.SMALL) } } } @@ -94,15 +89,7 @@ private fun PrezelListSmallPreview() { private fun PrezelListRegularPreview() { PrezelTheme { PreviewScaffold { - SectionTitle("PrezelList - REGULAR") - PrezelListPreviewItem(size = PrezelListSize.REGULAR, nested = false, showLeadingContent = true, showTrailingContent = true) - PrezelListPreviewItem(size = PrezelListSize.REGULAR, nested = false, showLeadingContent = true, showTrailingContent = false) - PrezelListPreviewItem(size = PrezelListSize.REGULAR, nested = false, showLeadingContent = false, showTrailingContent = true) - PrezelListPreviewItem(size = PrezelListSize.REGULAR, nested = false, showLeadingContent = false, showTrailingContent = false) - PrezelListPreviewItem(size = PrezelListSize.REGULAR, nested = true, showLeadingContent = true, showTrailingContent = true) - PrezelListPreviewItem(size = PrezelListSize.REGULAR, nested = true, showLeadingContent = true, showTrailingContent = false) - PrezelListPreviewItem(size = PrezelListSize.REGULAR, nested = true, showLeadingContent = false, showTrailingContent = true) - PrezelListPreviewItem(size = PrezelListSize.REGULAR, nested = true, showLeadingContent = false, showTrailingContent = false) + PrezelListPreviewBySize(PrezelListSize.REGULAR) } } } @@ -113,49 +100,58 @@ private fun PrezelListPreviewItem( nested: Boolean, showLeadingContent: Boolean, showTrailingContent: Boolean, - modifier: Modifier = Modifier, ) { - val leadingContent: (@Composable RowScope.() -> Unit)? = - if (showLeadingContent) { - { - Icon( - painter = painterResource(id = PrezelIcons.Blank), - contentDescription = "leading", - ) - } - } else { - null - } - - val trailingContent: (@Composable RowScope.() -> Unit)? = - if (showTrailingContent) { - { - Icon( - painter = painterResource(id = PrezelIcons.Blank), - contentDescription = "trailing", - ) - } - } else { - null - } - - Column( - modifier = modifier, - verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V12), - ) { - Text( - text = "Nested: $nested | Leading: $showLeadingContent | Trailing: $showTrailingContent", - style = PrezelTheme.typography.body3Medium, + val leadingContent: @Composable RowScope.() -> Unit = { + Icon( + painter = painterResource(id = PrezelIcons.Blank), + contentDescription = "leading", ) + } - PrezelList( - title = "Title", - size = size, - nested = nested, - leadingContent = leadingContent, - trailingContent = trailingContent, + val trailingContent: @Composable RowScope.() -> Unit = { + Icon( + painter = painterResource(id = PrezelIcons.Blank), + contentDescription = "trailing", + ) + Icon( + painter = painterResource(id = PrezelIcons.Blank), + contentDescription = "trailing", ) - - HorizontalDivider() } + + PrezelList( + title = "Title", + size = size, + nested = nested, + leadingContent = if (showLeadingContent) leadingContent else null, + trailingContent = if (showTrailingContent) trailingContent else null, + modifier = Modifier.drawDashBorder(), + ) +} + +@Composable +private fun PrezelListPreviewBySize(size: PrezelListSize) { + SectionTitle(title = "PrezelList - $size") + Text( + text = "점선 테두리는 컴포넌트 경계를 의미하며,\nnested 상태별 leading/trailing 조합을 확인할 수 있습니다.", + style = PrezelTheme.typography.body3Regular, + color = PrezelTheme.colors.textMedium, + modifier = Modifier + .fillMaxWidth() + .background(Color.LightGray.copy(alpha = 0.5f)) + .padding(8.dp), + ) + + Text(text = "Nested: False", style = PrezelTheme.typography.body2Bold) + PrezelListPreviewItem(size, nested = false, showLeadingContent = true, showTrailingContent = true) + PrezelListPreviewItem(size, nested = false, showLeadingContent = true, showTrailingContent = false) + PrezelListPreviewItem(size, nested = false, showLeadingContent = false, showTrailingContent = true) + PrezelListPreviewItem(size, nested = false, showLeadingContent = false, showTrailingContent = false) + + Spacer(modifier = Modifier.height(8.dp)) + Text(text = "Nested: True", style = PrezelTheme.typography.body2Bold) + PrezelListPreviewItem(size, nested = true, showLeadingContent = true, showTrailingContent = true) + PrezelListPreviewItem(size, nested = true, showLeadingContent = true, showTrailingContent = false) + PrezelListPreviewItem(size, nested = true, showLeadingContent = false, showTrailingContent = true) + PrezelListPreviewItem(size, nested = true, showLeadingContent = false, showTrailingContent = false) }