diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/TopAppBar.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/TopAppBar.kt index 83be6342..d14a7be9 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/TopAppBar.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/TopAppBar.kt @@ -1,5 +1,6 @@ package com.team.prezel.core.designsystem.component +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn @@ -8,6 +9,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.ProvideTextStyle import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults @@ -19,7 +21,6 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import com.team.prezel.core.designsystem.foundation.typography.PrezelTextStyles import com.team.prezel.core.designsystem.icon.PrezelIcons import com.team.prezel.core.designsystem.preview.ThemePreview import com.team.prezel.core.designsystem.theme.PrezelTheme @@ -63,14 +64,9 @@ private fun prezelTopAppBarColors() = @Composable private fun PrezelTopAppBarTitleOnlyPreview() { PrezelTheme { - PrezelTopAppBar( - title = { - Text( - text = "제목", - style = PrezelTextStyles.Body2Bold.toTextStyle(), - ) - }, - ) + Surface(color = PrezelTheme.colors.bgRegular) { + PrezelTopAppBar(title = { Text(text = "제목") }) + } } } @@ -79,23 +75,19 @@ private fun PrezelTopAppBarTitleOnlyPreview() { @Composable private fun PrezelTopAppBarWithLeadingPreview() { PrezelTheme { - PrezelTopAppBar( - title = { - Text( - text = "제목", - style = PrezelTextStyles.Body2Bold.toTextStyle(), - ) - }, - leadingIcon = { - IconButton(onClick = {}) { - Icon( - painter = painterResource(PrezelIcons.Blank), - contentDescription = "뒤로가기", - tint = PrezelTheme.colors.iconRegular, - ) - } - }, - ) + Surface(color = PrezelTheme.colors.bgRegular) { + PrezelTopAppBar( + title = { Text(text = "제목") }, + leadingIcon = { + IconButton(onClick = {}) { + Icon( + painter = painterResource(PrezelIcons.Blank), + contentDescription = "뒤로가기", + ) + } + }, + ) + } } } @@ -104,39 +96,33 @@ private fun PrezelTopAppBarWithLeadingPreview() { @Composable private fun PrezelTopAppBarWithAllIconsPreview() { PrezelTheme { - PrezelTopAppBar( - title = { - Text( - text = "제목", - style = PrezelTextStyles.Body2Bold.toTextStyle(), - ) - }, - leadingIcon = { - IconButton(onClick = {}) { - Icon( - painter = painterResource(PrezelIcons.Blank), - contentDescription = "뒤로가기", - tint = PrezelTheme.colors.iconRegular, - ) - } - }, - trailingIcons = { - IconButton(onClick = {}) { - Icon( - painter = painterResource(PrezelIcons.Blank), - contentDescription = "검색", - tint = PrezelTheme.colors.iconRegular, - ) - } - IconButton(onClick = {}) { - Icon( - painter = painterResource(PrezelIcons.Blank), - contentDescription = "더보기", - tint = PrezelTheme.colors.iconRegular, - ) - } - }, - ) + Surface(color = PrezelTheme.colors.bgRegular) { + PrezelTopAppBar( + title = { Text(text = "제목") }, + leadingIcon = { + IconButton(onClick = {}) { + Icon( + painter = painterResource(PrezelIcons.Blank), + contentDescription = "뒤로가기", + ) + } + }, + trailingIcons = { + IconButton(onClick = {}) { + Icon( + painter = painterResource(PrezelIcons.Blank), + contentDescription = "검색", + ) + } + IconButton(onClick = {}) { + Icon( + painter = painterResource(PrezelIcons.Blank), + contentDescription = "더보기", + ) + } + }, + ) + } } } @@ -149,6 +135,7 @@ private fun PrezelTopAppBarScrollTestPreview() { Scaffold( modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), + containerColor = PrezelTheme.colors.bgRegular, topBar = { PrezelTopAppBar( title = { Text("제목") }, @@ -165,14 +152,12 @@ private fun PrezelTopAppBarScrollTestPreview() { }, ) { innerPadding -> LazyColumn( - modifier = Modifier.padding(innerPadding), + modifier = Modifier + .padding(innerPadding) + .padding(horizontal = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp), ) { - items(30) { index -> - Text( - text = "Item $index", - modifier = Modifier.padding(16.dp), - ) - } + items(30) { index -> Text(text = "Item $index") } } } } diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/button/PrezelButton.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/button/PrezelButton.kt new file mode 100644 index 00000000..8dba7950 --- /dev/null +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/button/PrezelButton.kt @@ -0,0 +1,106 @@ +package com.team.prezel.core.designsystem.component.button + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.Surface +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 androidx.compose.ui.semantics.Role +import androidx.compose.ui.semantics.role +import androidx.compose.ui.semantics.semantics +import com.team.prezel.core.designsystem.icon.DrawableIcon +import com.team.prezel.core.designsystem.icon.IconSource +import com.team.prezel.core.designsystem.icon.PrezelIcons +import com.team.prezel.core.designsystem.preview.ThemePreview +import com.team.prezel.core.designsystem.theme.PrezelTheme + +@Composable +fun PrezelButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + text: String? = null, + icon: IconSource? = null, + enabled: Boolean = true, + style: PrezelButtonStyle = PrezelButtonStyle(), +) { + val hasText = text != null + val hasIcon = icon != null + require(hasText || hasIcon) { "Button은 text 또는 icon 중 하나는 반드시 필요합니다." } + val (buttonType, buttonHierarchy, buttonSize, isRounded) = style + + Surface( + onClick = onClick, + modifier = modifier.semantics { role = Role.Button }, + enabled = enabled, + shape = prezelButtonShape(isRounded = isRounded), + color = prezelButtonContainerColor(type = buttonType, hierarchy = buttonHierarchy, enabled = enabled), + border = prezelButtonBorderStroke(type = buttonType, hierarchy = buttonHierarchy, enabled = enabled), + ) { + CompositionLocalProvider( + LocalTextStyle provides prezelButtonTextStyle(buttonSize), + LocalContentColor provides prezelButtonContentColor(type = buttonType, hierarchy = buttonHierarchy, enabled = enabled), + ) { + Row( + modifier = Modifier.padding(prezelButtonContentPadding(size = buttonSize, onlyIcon = hasIcon && !hasText)), + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically, + ) { + PrezelButtonIcon(icon = icon, size = buttonSize) + + if (!hasText) return@Row + if (hasIcon) { + val spacing = if (buttonSize == PrezelButtonSize.REGULAR) PrezelTheme.spacing.V8 else PrezelTheme.spacing.V4 + Spacer(modifier = Modifier.width(width = spacing)) + } + + Text(text = text) + } + } + } +} + +@ThemePreview +@Composable +private fun PrezelButtonPreviewFilled() { + PrezelTheme { + PrezelButtonPreviewByType(type = PrezelButtonType.FILLED, content = ::PrezelButtonPreviewItem) + } +} + +@ThemePreview +@Composable +private fun PrezelButtonPreviewOutlined() { + PrezelTheme { + PrezelButtonPreviewByType(type = PrezelButtonType.OUTLINED, content = ::PrezelButtonPreviewItem) + } +} + +@ThemePreview +@Composable +private fun PrezelButtonPreviewGhost() { + PrezelTheme { + PrezelButtonPreviewByType(type = PrezelButtonType.GHOST, content = ::PrezelButtonPreviewItem) + } +} + +@Composable +private fun PrezelButtonPreviewItem( + style: PrezelButtonStyle, + enabled: Boolean, +) { + PrezelButton( + text = "Label", + icon = DrawableIcon(resId = PrezelIcons.Blank), + onClick = {}, + enabled = enabled, + style = style, + ) +} diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/button/PrezelButtonPreview.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/button/PrezelButtonPreview.kt new file mode 100644 index 00000000..0694e425 --- /dev/null +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/button/PrezelButtonPreview.kt @@ -0,0 +1,113 @@ +package com.team.prezel.core.designsystem.component.button + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.team.prezel.core.designsystem.preview.PreviewScaffold +import com.team.prezel.core.designsystem.theme.PrezelTheme +import kotlinx.collections.immutable.persistentListOf + +internal typealias PrezelButtonPreviewContent = @Composable (PrezelButtonStyle, Boolean) -> Unit + +@Immutable +private data class PreviewVariant( + val enabled: Boolean, + val isRounded: Boolean, +) + +private val PreviewVariants = persistentListOf( + PreviewVariant(enabled = true, isRounded = false), + PreviewVariant(enabled = true, isRounded = true), + PreviewVariant(enabled = false, isRounded = true), + PreviewVariant(enabled = false, isRounded = false), +) + +private val PreviewSizes = persistentListOf( + PrezelButtonSize.XSMALL, + PrezelButtonSize.SMALL, + PrezelButtonSize.REGULAR, +) + +@Composable +internal fun PrezelButtonPreviewByType( + type: PrezelButtonType, + content: PrezelButtonPreviewContent, +) { + PreviewScaffold { + Text(text = type.name, style = PrezelTheme.typography.title2Medium) + + PreviewVariants.forEach { variant -> + HorizontalDivider() + PrezelButtonVariantSection( + type = type, + enabled = variant.enabled, + isRounded = variant.isRounded, + content = content, + ) + } + } +} + +@Composable +private fun PrezelButtonVariantSection( + type: PrezelButtonType, + enabled: Boolean, + isRounded: Boolean, + content: PrezelButtonPreviewContent, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier, + verticalArrangement = Arrangement.spacedBy(12.dp), + ) { + Text(text = "Hierarchy: Primary | Enabled: $enabled | Radius: $isRounded", style = PrezelTheme.typography.body3Medium) + PrezelButtonPreviewHierarchyBlock( + type = type, + hierarchy = PrezelButtonHierarchy.PRIMARY, + enabled = enabled, + isRounded = isRounded, + content = content, + ) + Text(text = "Hierarchy: Secondary | Enabled: $enabled | Radius: $isRounded", style = PrezelTheme.typography.body3Medium) + PrezelButtonPreviewHierarchyBlock( + type = type, + hierarchy = PrezelButtonHierarchy.SECONDARY, + enabled = enabled, + isRounded = isRounded, + content = content, + ) + } +} + +@Composable +private fun PrezelButtonPreviewHierarchyBlock( + type: PrezelButtonType, + hierarchy: PrezelButtonHierarchy, + enabled: Boolean, + isRounded: Boolean, + content: PrezelButtonPreviewContent, + modifier: Modifier = Modifier, +) { + Row( + modifier = modifier, + horizontalArrangement = Arrangement.spacedBy(8.dp), + ) { + PreviewSizes.forEach { size -> + content( + PrezelButtonStyle( + buttonType = type, + buttonHierarchy = hierarchy, + buttonSize = size, + isRounded = isRounded, + ), + enabled, + ) + } + } +} diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/button/PrezelButtonStyle.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/button/PrezelButtonStyle.kt new file mode 100644 index 00000000..f98193ed --- /dev/null +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/button/PrezelButtonStyle.kt @@ -0,0 +1,170 @@ +package com.team.prezel.core.designsystem.component.button + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.isSystemInDarkTheme +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.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.unit.dp +import com.team.prezel.core.designsystem.foundation.color.PrezelColors +import com.team.prezel.core.designsystem.foundation.number.PrezelShapes +import com.team.prezel.core.designsystem.foundation.number.PrezelSpacing +import com.team.prezel.core.designsystem.foundation.number.PrezelStroke +import com.team.prezel.core.designsystem.icon.IconSource +import com.team.prezel.core.designsystem.theme.PrezelColorScheme +import com.team.prezel.core.designsystem.theme.PrezelTheme + +enum class PrezelButtonType { + FILLED, + OUTLINED, + GHOST, +} + +enum class PrezelButtonHierarchy { + PRIMARY, + SECONDARY, +} + +enum class PrezelButtonSize { + XSMALL, + SMALL, + REGULAR, +} + +@Immutable +data class PrezelButtonStyle( + val buttonType: PrezelButtonType = PrezelButtonType.FILLED, + val buttonHierarchy: PrezelButtonHierarchy = PrezelButtonHierarchy.PRIMARY, + val buttonSize: PrezelButtonSize = PrezelButtonSize.REGULAR, + val isRounded: Boolean = false, +) + +@Composable +internal fun PrezelButtonIcon( + icon: IconSource?, + size: PrezelButtonSize, + modifier: Modifier = Modifier, +) { + if (icon == null) return + Icon( + painter = icon.painter(), + contentDescription = icon.contentDescription, + modifier = modifier.size( + when (size) { + PrezelButtonSize.XSMALL -> 14.dp + PrezelButtonSize.SMALL -> 16.dp + PrezelButtonSize.REGULAR -> 20.dp + }, + ), + ) +} + +@Composable +internal fun prezelButtonShape( + isRounded: Boolean, + shapes: PrezelShapes = PrezelTheme.shapes, +): Shape = if (isRounded) shapes.V1000 else shapes.V4 + +@Composable +internal fun prezelButtonBorderStroke( + type: PrezelButtonType, + hierarchy: PrezelButtonHierarchy, + enabled: Boolean, + colors: PrezelColors = PrezelTheme.colors, + stroke: PrezelStroke = PrezelTheme.stroke, +): BorderStroke { + if (type != PrezelButtonType.OUTLINED) return BorderStroke(0.dp, Color.Transparent) + if (!enabled) return BorderStroke(width = stroke.V1, color = colors.borderDisabled) + + val borderColor = when (hierarchy) { + PrezelButtonHierarchy.PRIMARY -> colors.interactiveRegular + PrezelButtonHierarchy.SECONDARY -> colors.borderMedium + } + + return BorderStroke(width = stroke.V1, color = borderColor) +} + +@Composable +internal fun prezelButtonTextStyle(size: PrezelButtonSize): TextStyle = + when (size) { + PrezelButtonSize.XSMALL -> PrezelTheme.typography.caption2Medium + PrezelButtonSize.SMALL -> PrezelTheme.typography.body3Medium + PrezelButtonSize.REGULAR -> PrezelTheme.typography.body2Bold + } + +@Composable +internal fun prezelButtonContainerColor( + type: PrezelButtonType, + hierarchy: PrezelButtonHierarchy, + enabled: Boolean, + colors: PrezelColors = PrezelTheme.colors, +): Color = + when (type) { + PrezelButtonType.FILLED -> { + if (!enabled || hierarchy == PrezelButtonHierarchy.SECONDARY) { + colors.bgLarge + } else { + colors.interactiveRegular + } + } + + PrezelButtonType.OUTLINED -> Color.Transparent + PrezelButtonType.GHOST -> Color.Transparent + } + +@Composable +internal fun prezelButtonContentColor( + type: PrezelButtonType, + hierarchy: PrezelButtonHierarchy, + enabled: Boolean, + colors: PrezelColors = PrezelTheme.colors, +): Color { + if (!enabled) return colors.textDisabled + if (hierarchy == PrezelButtonHierarchy.SECONDARY) return colors.textMedium + + return when (type) { + PrezelButtonType.FILLED -> if (isSystemInDarkTheme()) colors.textLarge else PrezelColorScheme.Dark.textLarge + PrezelButtonType.OUTLINED -> colors.interactiveRegular + PrezelButtonType.GHOST -> colors.interactiveRegular + } +} + +@Composable +internal fun prezelButtonContentPadding( + size: PrezelButtonSize, + onlyIcon: Boolean = false, + spacing: PrezelSpacing = PrezelTheme.spacing, +): PaddingValues { + if (onlyIcon) return prezelIconButtonContentPadding(size) + + val horizontal = when (size) { + PrezelButtonSize.XSMALL -> spacing.V10 + PrezelButtonSize.SMALL -> spacing.V12 + PrezelButtonSize.REGULAR -> spacing.V16 + } + + val vertical = when (size) { + PrezelButtonSize.XSMALL -> spacing.V6 + PrezelButtonSize.SMALL -> spacing.V8 + PrezelButtonSize.REGULAR -> spacing.V12 + } + + return PaddingValues(horizontal = horizontal, vertical = vertical) +} + +@Composable +private fun prezelIconButtonContentPadding( + size: PrezelButtonSize, + spacing: PrezelSpacing = PrezelTheme.spacing, +): PaddingValues = + when (size) { + PrezelButtonSize.XSMALL -> spacing.V8 + PrezelButtonSize.SMALL -> spacing.V10 + PrezelButtonSize.REGULAR -> spacing.V14 + }.let { spacing -> PaddingValues(all = spacing) } diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/button/PrezelIconButton.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/button/PrezelIconButton.kt new file mode 100644 index 00000000..740fa8e6 --- /dev/null +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/button/PrezelIconButton.kt @@ -0,0 +1,63 @@ +package com.team.prezel.core.designsystem.component.button + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.team.prezel.core.designsystem.icon.DrawableIcon +import com.team.prezel.core.designsystem.icon.IconSource +import com.team.prezel.core.designsystem.icon.PrezelIcons +import com.team.prezel.core.designsystem.preview.ThemePreview +import com.team.prezel.core.designsystem.theme.PrezelTheme + +@Composable +fun PrezelIconButton( + icon: IconSource, + onClick: () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + style: PrezelButtonStyle = PrezelButtonStyle(), +) { + PrezelButton( + icon = icon, + onClick = onClick, + modifier = modifier, + enabled = enabled, + style = style, + ) +} + +@ThemePreview +@Composable +private fun PrezelIconButtonPreviewFilled() { + PrezelTheme { + PrezelButtonPreviewByType(type = PrezelButtonType.FILLED, content = ::PrezelIconButtonPreviewItem) + } +} + +@ThemePreview +@Composable +private fun PrezelIconButtonPreviewOutlined() { + PrezelTheme { + PrezelButtonPreviewByType(type = PrezelButtonType.OUTLINED, content = ::PrezelIconButtonPreviewItem) + } +} + +@ThemePreview +@Composable +private fun PrezelIconButtonPreviewGhost() { + PrezelTheme { + PrezelButtonPreviewByType(type = PrezelButtonType.GHOST, content = ::PrezelIconButtonPreviewItem) + } +} + +@Composable +private fun PrezelIconButtonPreviewItem( + style: PrezelButtonStyle, + enabled: Boolean, +) { + PrezelIconButton( + icon = DrawableIcon(resId = PrezelIcons.Blank), + onClick = {}, + enabled = enabled, + style = style, + ) +} diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/button/PrezelTextButton.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/button/PrezelTextButton.kt new file mode 100644 index 00000000..3973f499 --- /dev/null +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/button/PrezelTextButton.kt @@ -0,0 +1,60 @@ +package com.team.prezel.core.designsystem.component.button + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.team.prezel.core.designsystem.preview.ThemePreview +import com.team.prezel.core.designsystem.theme.PrezelTheme + +@Composable +fun PrezelTextButton( + text: String, + onClick: () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + style: PrezelButtonStyle = PrezelButtonStyle(), +) { + PrezelButton( + text = text, + onClick = onClick, + modifier = modifier, + enabled = enabled, + style = style, + ) +} + +@ThemePreview +@Composable +private fun PrezelTextButtonPreviewFilled() { + PrezelTheme { + PrezelButtonPreviewByType(type = PrezelButtonType.FILLED, content = ::PrezelTextButtonPreviewItem) + } +} + +@ThemePreview +@Composable +private fun PrezelTextButtonPreviewOutlined() { + PrezelTheme { + PrezelButtonPreviewByType(type = PrezelButtonType.OUTLINED, content = ::PrezelTextButtonPreviewItem) + } +} + +@ThemePreview +@Composable +private fun PrezelTextButtonPreviewGhost() { + PrezelTheme { + PrezelButtonPreviewByType(type = PrezelButtonType.GHOST, content = ::PrezelTextButtonPreviewItem) + } +} + +@Composable +private fun PrezelTextButtonPreviewItem( + style: PrezelButtonStyle, + enabled: Boolean, +) { + PrezelTextButton( + text = "Label", + onClick = {}, + enabled = enabled, + style = style, + ) +} diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/icon/IconSource.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/icon/IconSource.kt new file mode 100644 index 00000000..40d8ecf9 --- /dev/null +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/icon/IconSource.kt @@ -0,0 +1,24 @@ +package com.team.prezel.core.designsystem.icon + +import androidx.annotation.DrawableRes +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource + +@Immutable +interface IconSource { + val contentDescription: String? + + @Composable + fun painter(): Painter +} + +@Immutable +data class DrawableIcon( + override val contentDescription: String? = null, + @param:DrawableRes val resId: Int, +) : IconSource { + @Composable + override fun painter(): Painter = painterResource(resId) +} diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/theme/PrezelColorScheme.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/theme/PrezelColorScheme.kt index db684b31..c2e505ef 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/theme/PrezelColorScheme.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/theme/PrezelColorScheme.kt @@ -43,7 +43,7 @@ internal object PrezelColorScheme { iconMedium = ColorTokens.CoolGray800, iconLarge = ColorTokens.CoolGray900, iconDisabled = ColorTokens.CoolGray300, - borderSmall = ColorTokens.CoolGray500, + borderSmall = ColorTokens.CoolGray50, borderRegular = ColorTokens.CoolGray100, borderMedium = ColorTokens.CoolGray200, borderLarge = ColorTokens.CoolGray500, diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/theme/PrezelTheme.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/theme/PrezelTheme.kt index 88fdd41f..5871eb49 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/theme/PrezelTheme.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/theme/PrezelTheme.kt @@ -1,6 +1,8 @@ package com.team.prezel.core.designsystem.theme import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.LocalTextStyle import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.ReadOnlyComposable @@ -66,6 +68,8 @@ fun PrezelTheme( LocalPrezelShapes provides PrezelShapes, LocalPrezelSpacing provides PrezelSpacing, LocalPrezelStroke provides PrezelStroke, + LocalTextStyle provides typographyScheme.body3Regular, + LocalContentColor provides colorScheme.textLarge, content = content, ) } diff --git a/Prezel/detekt-config.yml b/Prezel/detekt-config.yml index ec6a92e8..3f97a7a1 100644 --- a/Prezel/detekt-config.yml +++ b/Prezel/detekt-config.yml @@ -1,60 +1,62 @@ build: - maxIssues: 0 + maxIssues: 0 config: - validation: true - warningsAsErrors: false - checkExhaustiveness: false + validation: true + warningsAsErrors: false + checkExhaustiveness: false processors: - active: true + active: true style: - active: true - MaxLineLength: - active: true - maxLineLength: 150 - MagicNumber: - active: false - ReturnCount: - active: true - max: 3 - UnusedPrivateMember: - active: true - ignoreAnnotated: - - Preview - - ThemePreview - WildcardImport: active: true + MaxLineLength: + active: true + maxLineLength: 150 + MagicNumber: + active: false + ReturnCount: + active: true + max: 3 + UnusedPrivateMember: + active: true + ignoreAnnotated: + - Preview + - ThemePreview + WildcardImport: + active: true + DestructuringDeclarationWithTooManyEntries: + active: false complexity: - active: true - LongMethod: - active: true - threshold: 40 - LongParameterList: active: true - functionThreshold: 7 - constructorThreshold: 8 - CyclomaticComplexMethod: - active: true - threshold: 15 - NestedBlockDepth: - active: true - threshold: 4 + LongMethod: + active: true + threshold: 40 + LongParameterList: + active: true + functionThreshold: 7 + constructorThreshold: 8 + CyclomaticComplexMethod: + active: true + threshold: 15 + NestedBlockDepth: + active: true + threshold: 4 naming: - active: true - FunctionNaming: active: true - ignoreAnnotated: - - Composable - - Preview + FunctionNaming: + active: true + ignoreAnnotated: + - Composable + - Preview potential-bugs: - active: true + active: true exceptions: - active: true - TooGenericExceptionCaught: - active: false + active: true + TooGenericExceptionCaught: + active: false