From 4196e27a2d7d1ea34f6cb063982b6ed7e2dc9489 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 14 May 2025 12:34:43 +0900 Subject: [PATCH 01/22] =?UTF-8?q?[UI]:=20action=20book=20button=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91=20(#1?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/common/buttons/ActionBookButton.kt | 77 +++++++++++++++++++ app/src/main/res/drawable/ic_chevron.xml | 13 ++++ app/src/main/res/values/strings.xml | 7 ++ 3 files changed, 97 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/buttons/ActionBookButton.kt create mode 100644 app/src/main/res/drawable/ic_chevron.xml diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionBookButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionBookButton.kt new file mode 100644 index 00000000..b95e43ee --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionBookButton.kt @@ -0,0 +1,77 @@ +package com.texthip.thip.ui.common.buttons + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +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 androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun ActionBookButton( + bookTitle: String = stringResource(R.string.book_title), + bookAuthor: String = stringResource(R.string.book_author), +) { + Box( + modifier = Modifier + .background(color = colors.DarkGrey, shape = RoundedCornerShape(12.dp)) + .padding(top = 16.dp, bottom = 16.dp, start = 12.dp, end = 4.dp) + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = bookTitle, + style = typography.smalltitle_sb600_s16_h24, + color = colors.White, + modifier = Modifier.weight(1f), + overflow = TextOverflow.Ellipsis, + maxLines = 1 + ) + + Text( + text = bookAuthor + stringResource(R.string.author), + style = typography.info_r400_s12_h24, + color = colors.Grey, + modifier = Modifier.width(100.dp), + textAlign = TextAlign.Right, + overflow = TextOverflow.Ellipsis, + maxLines = 1 + ) + + Icon( + painter = painterResource(R.drawable.ic_chevron), + contentDescription = null, + tint = colors.Grey, + ) + } + } +} + +@Preview +@Composable +private fun ActionBookButtonPreview() { + Column( + modifier = Modifier + .fillMaxSize() + .padding(30.dp) + ) { + ActionBookButton() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_chevron.xml b/app/src/main/res/drawable/ic_chevron.xml new file mode 100644 index 00000000..b0df5e9e --- /dev/null +++ b/app/src/main/res/drawable/ic_chevron.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d96e3164..11bc1fa4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,10 @@ Thip + + + 책이름을입력해주세요책이름을 + 한한강한강한강한ㅇㅇㄴㄴㅁ강 + + + \ No newline at end of file From 8c611e178728f6e42c75b0703c06ad46303e6c45 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Sat, 17 May 2025 01:19:02 +0900 Subject: [PATCH 02/22] =?UTF-8?q?[refactor]:=20clickable=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/common/buttons/ActionBookButton.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionBookButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionBookButton.kt index b95e43ee..fd5ebe2f 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionBookButton.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionBookButton.kt @@ -1,6 +1,7 @@ package com.texthip.thip.ui.common.buttons import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -27,11 +28,16 @@ import com.texthip.thip.ui.theme.ThipTheme.typography fun ActionBookButton( bookTitle: String = stringResource(R.string.book_title), bookAuthor: String = stringResource(R.string.book_author), + onClick: () -> Unit = {} ) { Box( modifier = Modifier .background(color = colors.DarkGrey, shape = RoundedCornerShape(12.dp)) + .clickable { + onClick() + } .padding(top = 16.dp, bottom = 16.dp, start = 12.dp, end = 4.dp) + ) { Row( verticalAlignment = Alignment.CenterVertically, From adc4b1b0923ac9dc4e9526a7a49d276849b565e3 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Sat, 17 May 2025 01:27:31 +0900 Subject: [PATCH 03/22] =?UTF-8?q?[init]:=20Color=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=98=EC=98=81=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/texthip/thip/ui/theme/Color.kt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/app/src/main/java/com/texthip/thip/ui/theme/Color.kt b/app/src/main/java/com/texthip/thip/ui/theme/Color.kt index d1a9f263..4ecc11e6 100644 --- a/app/src/main/java/com/texthip/thip/ui/theme/Color.kt +++ b/app/src/main/java/com/texthip/thip/ui/theme/Color.kt @@ -13,6 +13,15 @@ val NeonGreen50 = Color(0x80A7FFB4) val Red = Color(0xFFFF9496) +val Mint = Color(0xFFA0F8E8) +val MintSub = Color(0xFF4FD9C0) +val Orange = Color(0xFFFDB770) +val OrangeSub = Color(0xFFFF8B17) +val Skyblue = Color(0xFFA1D5FF) +val SkyblueSub = Color(0xFF6DB5EE) +val Lavendar = Color(0xFFC8A5FF) +val LavendaSub = Color(0xFFA76FFF) + val PureWhite = Color(0xFFFFFFFF) val White = Color(0xFFFEFEFE) @@ -38,6 +47,14 @@ data class ThipColors( val NeonGreen: Color, val NeonGreen50: Color, val Red: Color, + val Mint: Color, + val MintSub: Color, + val Orange: Color, + val OrangeSub: Color, + val Skyblue: Color, + val SkyblueSub: Color, + val Lavendar: Color, + val LavendaSub: Color, val PureWhite: Color, val White: Color, val Grey50: Color, @@ -61,6 +78,14 @@ val defaultThipColors = ThipColors( NeonGreen = NeonGreen, NeonGreen50 = NeonGreen50, Red = Red, + Mint = Mint, + MintSub = MintSub, + Orange = Orange, + OrangeSub = OrangeSub, + Skyblue = Skyblue, + SkyblueSub = SkyblueSub, + Lavendar = Lavendar, + LavendaSub = LavendaSub, PureWhite = PureWhite, White = White, Grey50 = Grey50, From e274b5aa5097a944d85e80ae8c6bbc554902da28 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Sat, 17 May 2025 01:45:41 +0900 Subject: [PATCH 04/22] =?UTF-8?q?[UI]:=20action=20medium=20button=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91=20(#1?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/common/buttons/ActionMediumButton.kt | 118 ++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 2 files changed, 119 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/buttons/ActionMediumButton.kt diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionMediumButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionMediumButton.kt new file mode 100644 index 00000000..e1fe24b1 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionMediumButton.kt @@ -0,0 +1,118 @@ +package com.texthip.thip.ui.common.buttons + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +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.fillMaxSize +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.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +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.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun ActionMediumButton( + text: String, + icon: Painter, + contentColor: Color, + backgroundColor: Color, + modifier: Modifier = Modifier, + onClick: () -> Unit = {}, +) { + Row( + modifier = modifier + .fillMaxWidth() + .height(44.dp) + .background(color = backgroundColor, shape = RoundedCornerShape(12.dp)) + .clickable { + onClick() + }, + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically, + ) { + + Icon( + painter = icon, + contentDescription = null, + tint = contentColor, + ) + + Spacer(modifier = Modifier.width(8.dp)) + + Text( + text = text, + color = contentColor, + style = typography.smalltitle_sb600_s16_h24, + ) + + Spacer(modifier = Modifier.width(8.dp)) + + Icon( + painter = painterResource(R.drawable.ic_chevron), + contentDescription = null, + tint = contentColor, + ) + + + } +} + +@Preview +@Composable +private fun ActionMediumButtonPreview() { + Column( + modifier = Modifier + .fillMaxSize() + .padding(30.dp) + ) { + ActionMediumButton( + text = stringResource(R.string.add_to_my_feed), + icon = painterResource(R.drawable.ic_search), + contentColor = colors.White, + backgroundColor = colors.Grey02, + modifier = Modifier.width(180.dp), + onClick = {}, + ) + + Spacer(modifier = Modifier.height(16.dp)) + + ActionMediumButton( + text = stringResource(R.string.add_to_my_feed), + icon = painterResource(R.drawable.ic_plus), + contentColor = colors.White, + backgroundColor = colors.Purple, + modifier = Modifier.width(180.dp), + onClick = {}, + ) + + Spacer(modifier = Modifier.height(16.dp)) + + ActionMediumButton( + text = stringResource(R.string.add_to_my_feed), + icon = painterResource(R.drawable.ic_search), + contentColor = colors.Grey, + backgroundColor = Color.Transparent, + modifier = Modifier.width(180.dp) + .border(width = 1.dp, color = colors.Grey02, shape = RoundedCornerShape(12.dp)), + onClick = {}, + ) + } +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 11bc1fa4..a9c3038b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,4 +7,5 @@ + 내 피드에 추가 \ No newline at end of file From ac4bf49a37ea320c56fb10e1a678fba3ea962b94 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Sat, 17 May 2025 01:54:50 +0900 Subject: [PATCH 05/22] =?UTF-8?q?[UI]:=20action=20fill=20button=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91=20(#1?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/common/buttons/ActionFillButton.kt | 82 +++++++++++++++++++ .../ui/common/buttons/ActionMediumButton.kt | 9 +- app/src/main/res/values/strings.xml | 1 + 3 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/buttons/ActionFillButton.kt diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionFillButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionFillButton.kt new file mode 100644 index 00000000..925a58c0 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionFillButton.kt @@ -0,0 +1,82 @@ +package com.texthip.thip.ui.common.buttons + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Icon +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.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun ActionFillButton( + text: String, + backgroundColor: Color, + onClick: () -> Unit, +) { + Row( + modifier = Modifier + .fillMaxWidth() + .height(50.dp) + .background(backgroundColor) + .clickable(onClick = onClick), + horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterHorizontally), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(R.drawable.ic_write), + contentDescription = null, + tint = colors.White, + ) + + Text( + text = text, + color = colors.White, + style = typography.smalltitle_sb600_s18_h24, + ) + + Icon( + painter = painterResource(R.drawable.ic_send), + contentDescription = null, + tint = colors.White, + ) + } +} + +@Preview +@Composable +private fun ActionFillButtonPreview() { + Column( + modifier = Modifier + .fillMaxSize() + .padding(30.dp), + verticalArrangement = Arrangement.spacedBy(30.dp, Alignment.CenterVertically), + ) { + ActionFillButton( + text = stringResource(R.string.post), + backgroundColor = colors.Purple, + onClick = {} + ) + + ActionFillButton( + text = stringResource(R.string.post), + backgroundColor = colors.Grey02, + onClick = {} + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionMediumButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionMediumButton.kt index e1fe24b1..fd61f9e9 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionMediumButton.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionMediumButton.kt @@ -45,33 +45,26 @@ fun ActionMediumButton( .clickable { onClick() }, - horizontalArrangement = Arrangement.Center, + horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterHorizontally), verticalAlignment = Alignment.CenterVertically, ) { - Icon( painter = icon, contentDescription = null, tint = contentColor, ) - Spacer(modifier = Modifier.width(8.dp)) - Text( text = text, color = contentColor, style = typography.smalltitle_sb600_s16_h24, ) - Spacer(modifier = Modifier.width(8.dp)) - Icon( painter = painterResource(R.drawable.ic_chevron), contentDescription = null, tint = contentColor, ) - - } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a9c3038b..101fda96 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -8,4 +8,5 @@ 내 피드에 추가 + 글 등록 \ No newline at end of file From 37d65ff5fc7a2a34a85ff3c46a34c856d58d6f09 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Sat, 17 May 2025 02:29:13 +0900 Subject: [PATCH 06/22] =?UTF-8?q?[UI]:=20toggle=20switch=20button=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91=20(#1?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/common/buttons/ToggleSwitchButton.kt | 59 +++++++++++++++++++ app/src/main/res/drawable/ic_circle.xml | 9 +++ 2 files changed, 68 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/buttons/ToggleSwitchButton.kt create mode 100644 app/src/main/res/drawable/ic_circle.xml diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/ToggleSwitchButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/ToggleSwitchButton.kt new file mode 100644 index 00000000..e1515bea --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/ToggleSwitchButton.kt @@ -0,0 +1,59 @@ +package com.texthip.thip.ui.common.buttons + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Icon +import androidx.compose.material3.Switch +import androidx.compose.material3.SwitchDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors + +@Composable +fun ToggleSwitchButton() { + var checked by remember { mutableStateOf(true) } + + Switch( + modifier = Modifier.padding(4.dp), + checked = checked, + onCheckedChange = { + checked = it + }, + colors = SwitchDefaults.colors( + checkedThumbColor = colors.White, + checkedTrackColor = colors.Purple, + uncheckedThumbColor = colors.White, + uncheckedTrackColor = colors.DarkGrey, + uncheckedBorderColor = Color.Transparent, + ), + thumbContent = { + Icon( + painter = painterResource(R.drawable.ic_circle), + contentDescription = null, + tint = Color.Unspecified, + ) + } + ) +} + +@Preview +@Composable +private fun ToggleSwitchButtonPreview() { + Column( + modifier = Modifier + .fillMaxSize() + .padding(30.dp) + ) { + ToggleSwitchButton() + } +} diff --git a/app/src/main/res/drawable/ic_circle.xml b/app/src/main/res/drawable/ic_circle.xml new file mode 100644 index 00000000..6a5e956b --- /dev/null +++ b/app/src/main/res/drawable/ic_circle.xml @@ -0,0 +1,9 @@ + + + From 56a64ccfdd4df6003eccd0c3eacc5ec7d7f4a009 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Sat, 17 May 2025 18:48:40 +0900 Subject: [PATCH 07/22] =?UTF-8?q?[UI]:=20checkbox=20button=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/buttons/CheckboxButton.kt | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/buttons/CheckboxButton.kt diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/CheckboxButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/CheckboxButton.kt new file mode 100644 index 00000000..69386852 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/CheckboxButton.kt @@ -0,0 +1,49 @@ +package com.texthip.thip.ui.common.buttons + +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Checkbox +import androidx.compose.material3.CheckboxDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.ui.theme.ThipTheme.colors + +@Composable +fun CheckboxButton( + isChecked: Boolean, + onCheckedChange: (Boolean) -> Unit, +) { + Checkbox( + checked = isChecked, + onCheckedChange = onCheckedChange, + modifier = + Modifier + .border(1.dp, colors.Grey01, RoundedCornerShape(8.dp)) + .size(30.dp), + colors = + CheckboxDefaults.colors( + checkmarkColor = colors.NeonGreen, + checkedColor = Color.Transparent, + uncheckedColor = Color.Transparent, + ), + ) +} + +@Preview +@Composable +private fun CheckboxButtonPreview() { + var isChecked by rememberSaveable { mutableStateOf(false) } + + CheckboxButton( + isChecked = isChecked, + onCheckedChange = { isChecked = it } + ) +} \ No newline at end of file From 61e4358ab915d1a69b6f9e901bb1dbdfcdeb5571 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Fri, 23 May 2025 23:50:15 +0900 Subject: [PATCH 08/22] =?UTF-8?q?[UI]:=20outlined=20button=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/buttons/OutlinedButton.kt | 99 +++++++++++++++++++ app/src/main/res/drawable/ic_reset_20.xml | 9 ++ app/src/main/res/values/strings.xml | 2 + 3 files changed, 110 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/buttons/OutlinedButton.kt create mode 100644 app/src/main/res/drawable/ic_reset_20.xml diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/OutlinedButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/OutlinedButton.kt new file mode 100644 index 00000000..4ee3b4cc --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/OutlinedButton.kt @@ -0,0 +1,99 @@ +package com.texthip.thip.ui.common.buttons + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +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.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun OutlinedButton( + modifier: Modifier = Modifier, + text: String, + icon: Painter? = null, + textStyle: TextStyle = typography.menu_sb600_s12_h20, + onClick: () -> Unit = {}, +) { + val hasIcon = icon != null + + Box( + modifier = modifier + .border( + width = 1.dp, + color = colors.Grey02, + shape = RoundedCornerShape(20.dp) + ) + .background(color = Color.Transparent, shape = RoundedCornerShape(12.dp)) + .clickable { + onClick() + }, + contentAlignment = Alignment.Center, + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + if (hasIcon) { + Icon( + painter = icon, + contentDescription = null, + tint = Color.Unspecified, + modifier = Modifier + .size(20.dp) + ) + } + Text( + text = text, + color = colors.Grey, + style = textStyle + ) + } + } +} + +@Preview +@Composable +private fun OutlinedButtonPreview() { + Column( + modifier = Modifier + .fillMaxSize() + .padding(30.dp), + verticalArrangement = Arrangement.spacedBy(30.dp, Alignment.CenterVertically), + ) { + OutlinedButton( + modifier = Modifier + .size(width = 68.dp, height = 28.dp), + text = stringResource(R.string.follow), + icon = painterResource(id = R.drawable.ic_reset_20), + onClick = {} + ) + + OutlinedButton( + modifier = Modifier + .size(width = 64.dp, height = 32.dp), + text = stringResource(R.string.change_book), + textStyle = typography.view_m500_s14, + onClick = {} + ) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_reset_20.xml b/app/src/main/res/drawable/ic_reset_20.xml new file mode 100644 index 00000000..b6e2066b --- /dev/null +++ b/app/src/main/res/drawable/ic_reset_20.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 101fda96..86d6eace 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,4 +9,6 @@ 내 피드에 추가 글 등록 + 팔로우 + 책 변경 \ No newline at end of file From f840e263325f94a55598313ec8272284fa47f8ee Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Sun, 25 May 2025 16:55:03 +0900 Subject: [PATCH 09/22] =?UTF-8?q?[UI]:=20group=20vote=20button=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/buttons/GroupVoteButton.kt | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/buttons/GroupVoteButton.kt diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/GroupVoteButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/GroupVoteButton.kt new file mode 100644 index 00000000..b65f4d39 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/GroupVoteButton.kt @@ -0,0 +1,125 @@ +package com.texthip.thip.ui.common.buttons + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + + +@Composable +fun GroupVoteButton( + options: List, + voteResults: List +) { + var selectedIndex by remember { mutableStateOf(null) } + + Column( + modifier = Modifier + .fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + options.forEachIndexed { index, option -> + val hasVoted = selectedIndex != null + val isSelected = selectedIndex == index + val votePercent = voteResults.getOrNull(index) ?: 0 + + val backgroundColor = when { + isSelected -> colors.PurpleDark + else -> colors.DarkGrey + } + + val percentBarColor = when { + isSelected -> colors.Purple + else -> colors.Grey02 + } + + val textColor = when { + isSelected -> colors.NeonGreen + else -> colors.White + } + + val fontStyle = when { + !hasVoted -> typography.feedcopy_r400_s14_h20 + else -> typography.menu_sb600_s14_h24 + } + + Box( + modifier = Modifier + .fillMaxWidth() + .background(color = backgroundColor, shape = RoundedCornerShape(12.dp)) + .height(44.dp) + .clickable(enabled = !hasVoted) { selectedIndex = index } + ) { + // 퍼센트 채우기 + if (hasVoted) { + Box( + modifier = Modifier + .fillMaxHeight() + .fillMaxWidth(votePercent / 100f) + .background( + color = percentBarColor, + shape = RoundedCornerShape(topStart = 12.dp, bottomStart = 12.dp) + ) + ) + } + + Row( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 12.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "${index + 1}. $option", + color = textColor, + style = fontStyle + ) + if (hasVoted) { + Text( + text = "$votePercent%", + color = textColor, + style = fontStyle + ) + } + } + } + } + } +} + +@Preview +@Composable +private fun GroupVoteButtonPreview() { + val options = listOf("밥", "국수", "고기") + val results = listOf(20, 30, 50) + + Column( + modifier = Modifier.fillMaxSize() + ) { + GroupVoteButton( + options = options, + voteResults = results + ) + } +} \ No newline at end of file From 4251f1f55312ab3cc345e81d9f48edbe4ce16d2d Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Sun, 25 May 2025 17:36:34 +0900 Subject: [PATCH 10/22] =?UTF-8?q?[UI]:=20filter=20button=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/buttons/FilterButton.kt | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/buttons/FilterButton.kt diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/FilterButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/FilterButton.kt new file mode 100644 index 00000000..f7d9767d --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/FilterButton.kt @@ -0,0 +1,112 @@ +package com.texthip.thip.ui.common.buttons + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun FilterButton( + modifier: Modifier = Modifier, + selectedOption: String, + options: List, + onOptionSelected: (String) -> Unit +) { + var expanded by remember { mutableStateOf(false) } + + Column(modifier = modifier) { + Row( + modifier = Modifier + .clickable { expanded = !expanded }, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = selectedOption, + color = colors.Grey01, + style = typography.menu_m500_s14_h24 + ) + Icon( + painter = painterResource(id = R.drawable.ic_downmore), + contentDescription = "Dropdown", + tint = colors.Grey02, + modifier = Modifier.size(24.dp) + ) + + } + + // 드롭다운 애니메이션 박스 + AnimatedVisibility( + visible = expanded, + enter = fadeIn(), + exit = fadeOut() + ) { + Column( + modifier = Modifier + .padding(top = 8.dp) + .width(144.dp) + .border(width = 1.dp, color = colors.Grey01, shape = RoundedCornerShape(16.dp)) + .background(color = colors.Black, shape = RoundedCornerShape(16.dp)) + .padding(vertical = 20.dp, horizontal = 12.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + options.forEach { option -> + val isSelected = option == selectedOption + Text( + text = option, + color = if (isSelected) colors.White else colors.Grey02, + style = typography.feedcopy_r400_s14_h20, + modifier = Modifier + .fillMaxWidth() + .clickable { + onOptionSelected(option) + expanded = false + } + ) + } + } + } + } +} + +@Preview +@Composable +private fun FilterButtonPreview() { + var selected by remember { mutableStateOf("인기순") } + val options = listOf("인기순", "정확도순") + + Column( + modifier = Modifier.fillMaxSize() + ) { + FilterButton( + selectedOption = selected, + options = options, + onOptionSelected = { selected = it } + ) + } +} \ No newline at end of file From acec82368d89d518079083ff08b926c54a0ba336 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 28 May 2025 16:36:28 +0900 Subject: [PATCH 11/22] =?UTF-8?q?[refactor]:=20group=20vote=20button=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20toggle=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EC=88=98=EC=A0=95=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/common/buttons/GroupVoteButton.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/GroupVoteButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/GroupVoteButton.kt index b65f4d39..cd682cdc 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/buttons/GroupVoteButton.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/GroupVoteButton.kt @@ -39,8 +39,8 @@ fun GroupVoteButton( verticalArrangement = Arrangement.spacedBy(12.dp) ) { options.forEachIndexed { index, option -> - val hasVoted = selectedIndex != null val isSelected = selectedIndex == index + val hasVoted = selectedIndex != null val votePercent = voteResults.getOrNull(index) ?: 0 val backgroundColor = when { @@ -68,7 +68,9 @@ fun GroupVoteButton( .fillMaxWidth() .background(color = backgroundColor, shape = RoundedCornerShape(12.dp)) .height(44.dp) - .clickable(enabled = !hasVoted) { selectedIndex = index } + .clickable { + selectedIndex = if (isSelected) null else index + } ) { // 퍼센트 채우기 if (hasVoted) { From dd79f980cfad435473c1b83ef7d5356ab55ae8f9 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 28 May 2025 16:42:57 +0900 Subject: [PATCH 12/22] =?UTF-8?q?[refactor]:=20filter=20button=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=9C=84=EC=B9=98,=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EC=88=98=EC=A0=95=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/buttons/FilterButton.kt | 64 ++++++++++++------- 1 file changed, 41 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/FilterButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/FilterButton.kt index f7d9767d..af36e038 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/buttons/FilterButton.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/FilterButton.kt @@ -6,7 +6,9 @@ import androidx.compose.animation.fadeOut import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize @@ -43,7 +45,12 @@ fun FilterButton( Column(modifier = modifier) { Row( modifier = Modifier - .clickable { expanded = !expanded }, + .fillMaxWidth() + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null // 클릭 효과 제거 + ) { expanded = !expanded }, + horizontalArrangement = Arrangement.End, verticalAlignment = Alignment.CenterVertically ) { Text( @@ -52,7 +59,9 @@ fun FilterButton( style = typography.menu_m500_s14_h24 ) Icon( - painter = painterResource(id = R.drawable.ic_downmore), + painter = painterResource( + id = if (expanded) R.drawable.ic_upmore else R.drawable.ic_downmore + ), contentDescription = "Dropdown", tint = colors.Grey02, modifier = Modifier.size(24.dp) @@ -66,28 +75,37 @@ fun FilterButton( enter = fadeIn(), exit = fadeOut() ) { - Column( - modifier = Modifier - .padding(top = 8.dp) - .width(144.dp) - .border(width = 1.dp, color = colors.Grey01, shape = RoundedCornerShape(16.dp)) - .background(color = colors.Black, shape = RoundedCornerShape(16.dp)) - .padding(vertical = 20.dp, horizontal = 12.dp), - verticalArrangement = Arrangement.spacedBy(16.dp) + Box( + modifier = Modifier.fillMaxWidth(), + contentAlignment = Alignment.TopEnd ) { - options.forEach { option -> - val isSelected = option == selectedOption - Text( - text = option, - color = if (isSelected) colors.White else colors.Grey02, - style = typography.feedcopy_r400_s14_h20, - modifier = Modifier - .fillMaxWidth() - .clickable { - onOptionSelected(option) - expanded = false - } - ) + Column( + modifier = Modifier + .padding(top = 8.dp) + .width(144.dp) + .border( + width = 1.dp, + color = colors.Grey01, + shape = RoundedCornerShape(16.dp) + ) + .background(color = colors.Black, shape = RoundedCornerShape(16.dp)) + .padding(vertical = 20.dp, horizontal = 12.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + options.forEach { option -> + val isSelected = option == selectedOption + Text( + text = option, + color = if (isSelected) colors.White else colors.Grey02, + style = typography.feedcopy_r400_s14_h20, + modifier = Modifier + .fillMaxWidth() + .clickable { + onOptionSelected(option) + expanded = false + } + ) + } } } } From e32baa80759f362562b7a8e991e1c28ef787e45d Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 28 May 2025 16:59:20 +0900 Subject: [PATCH 13/22] =?UTF-8?q?[refactor]:=20action=20medium=20button=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=ED=99=95=EC=9E=A5?= =?UTF-8?q?=EC=84=B1=20=EB=84=93=EA=B2=8C=20=EC=88=98=EC=A0=95=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/common/buttons/ActionMediumButton.kt | 64 +++++++++++++------ app/src/main/res/values/strings.xml | 2 + 2 files changed, 48 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionMediumButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionMediumButton.kt index fd61f9e9..33a0f0ec 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionMediumButton.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/ActionMediumButton.kt @@ -6,7 +6,6 @@ import androidx.compose.foundation.clickable 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.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -31,12 +30,15 @@ import com.texthip.thip.ui.theme.ThipTheme.typography @Composable fun ActionMediumButton( text: String, - icon: Painter, + icon: Painter? = null, contentColor: Color, backgroundColor: Color, + hasRightIcon: Boolean = false, modifier: Modifier = Modifier, onClick: () -> Unit = {}, ) { + val hasLeftIcon = icon != null + Row( modifier = modifier .fillMaxWidth() @@ -48,11 +50,13 @@ fun ActionMediumButton( horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterHorizontally), verticalAlignment = Alignment.CenterVertically, ) { - Icon( - painter = icon, - contentDescription = null, - tint = contentColor, - ) + if (hasLeftIcon) { + Icon( + painter = icon, + contentDescription = null, + tint = contentColor, + ) + } Text( text = text, @@ -60,11 +64,13 @@ fun ActionMediumButton( style = typography.smalltitle_sb600_s16_h24, ) - Icon( - painter = painterResource(R.drawable.ic_chevron), - contentDescription = null, - tint = contentColor, - ) + if (hasRightIcon) { + Icon( + painter = painterResource(R.drawable.ic_chevron), + contentDescription = null, + tint = contentColor, + ) + } } } @@ -74,38 +80,60 @@ private fun ActionMediumButtonPreview() { Column( modifier = Modifier .fillMaxSize() - .padding(30.dp) + .padding(30.dp), + verticalArrangement = Arrangement.spacedBy(16.dp, Alignment.CenterVertically), ) { ActionMediumButton( text = stringResource(R.string.add_to_my_feed), icon = painterResource(R.drawable.ic_search), contentColor = colors.White, backgroundColor = colors.Grey02, + hasRightIcon = true, modifier = Modifier.width(180.dp), onClick = {}, ) - Spacer(modifier = Modifier.height(16.dp)) - ActionMediumButton( text = stringResource(R.string.add_to_my_feed), icon = painterResource(R.drawable.ic_plus), contentColor = colors.White, backgroundColor = colors.Purple, + hasRightIcon = true, modifier = Modifier.width(180.dp), onClick = {}, ) - Spacer(modifier = Modifier.height(16.dp)) - ActionMediumButton( text = stringResource(R.string.add_to_my_feed), icon = painterResource(R.drawable.ic_search), contentColor = colors.Grey, backgroundColor = Color.Transparent, - modifier = Modifier.width(180.dp) + hasRightIcon = true, + modifier = Modifier + .width(180.dp) .border(width = 1.dp, color = colors.Grey02, shape = RoundedCornerShape(12.dp)), onClick = {}, ) + + Row( + horizontalArrangement = Arrangement.spacedBy(20.dp, Alignment.CenterHorizontally), + ) { + + ActionMediumButton( + text = stringResource(R.string.yes), + contentColor = colors.White, + backgroundColor = colors.Purple, + modifier = Modifier.weight(1f), + onClick = {}, + ) + + ActionMediumButton( + text = stringResource(R.string.no), + contentColor = colors.White, + backgroundColor = colors.Grey02, + modifier = Modifier.weight(1f), + onClick = {}, + ) + } } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 86d6eace..e57aa221 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -8,6 +8,8 @@ 내 피드에 추가 + + 아니오 글 등록 팔로우 책 변경 From 4507a30733df2e9c1a6865f393687ec396f51cd3 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 28 May 2025 17:08:27 +0900 Subject: [PATCH 14/22] =?UTF-8?q?[refactor]:=20header=20button=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/buttons/HeaderButton.kt | 68 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 2 files changed, 69 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/buttons/HeaderButton.kt diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/HeaderButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/HeaderButton.kt new file mode 100644 index 00000000..2b8995ee --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/HeaderButton.kt @@ -0,0 +1,68 @@ +package com.texthip.thip.ui.common.buttons + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun HeaderButton( + modifier: Modifier = Modifier, + text: String, + onClick: () -> Unit = {}, +) { + var clicked by remember { mutableStateOf(false) } + + Box( + modifier = modifier + .background( + color = if (clicked) colors.Purple else colors.Grey02, + shape = RoundedCornerShape(20.dp) + ) + .clickable { + clicked = !clicked + onClick() + } + .padding(vertical = 4.dp, horizontal = 12.dp), + contentAlignment = Alignment.Center, + ) { + Text( + text = text, + style = typography.menu_sb600_s14_h24, + color = colors.White + ) + } +} + +@Preview +@Composable +private fun HeaderButtonPreview() { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + + HeaderButton( + text = stringResource(R.string.finish), + ) + } +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e57aa221..d4572122 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -13,4 +13,5 @@ 글 등록 팔로우 책 변경 + 완료 \ No newline at end of file From 897585c27f8ee81077b4b6cfb65564741142fa0a Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 28 May 2025 17:23:10 +0900 Subject: [PATCH 15/22] =?UTF-8?q?[chore]:=20=EB=B3=80=EC=88=98=20=EB=AA=85?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/texthip/thip/ui/common/buttons/HeaderButton.kt | 6 +++--- .../texthip/thip/ui/common/buttons/ToggleSwitchButton.kt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/HeaderButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/HeaderButton.kt index 2b8995ee..ecae44e6 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/buttons/HeaderButton.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/HeaderButton.kt @@ -29,16 +29,16 @@ fun HeaderButton( text: String, onClick: () -> Unit = {}, ) { - var clicked by remember { mutableStateOf(false) } + var isClicked by remember { mutableStateOf(false) } Box( modifier = modifier .background( - color = if (clicked) colors.Purple else colors.Grey02, + color = if (isClicked) colors.Purple else colors.Grey02, shape = RoundedCornerShape(20.dp) ) .clickable { - clicked = !clicked + isClicked = !isClicked onClick() } .padding(vertical = 4.dp, horizontal = 12.dp), diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/ToggleSwitchButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/ToggleSwitchButton.kt index e1515bea..97e4854b 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/buttons/ToggleSwitchButton.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/ToggleSwitchButton.kt @@ -21,13 +21,13 @@ import com.texthip.thip.ui.theme.ThipTheme.colors @Composable fun ToggleSwitchButton() { - var checked by remember { mutableStateOf(true) } + var isChecked by remember { mutableStateOf(true) } Switch( modifier = Modifier.padding(4.dp), - checked = checked, + checked = isChecked, onCheckedChange = { - checked = it + isChecked = it }, colors = SwitchDefaults.colors( checkedThumbColor = colors.White, From 1a6a1056884cb9d08a1c99de1114816f1f041db2 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 28 May 2025 17:40:47 +0900 Subject: [PATCH 16/22] =?UTF-8?q?[UI]:=20option=20chip=20button=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91=20(#1?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/buttons/HeaderButton.kt | 7 +- .../ui/common/buttons/OptionChipButton.kt | 99 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/buttons/OptionChipButton.kt diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/HeaderButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/HeaderButton.kt index ecae44e6..cdff5839 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/buttons/HeaderButton.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/HeaderButton.kt @@ -60,9 +60,8 @@ private fun HeaderButtonPreview() { horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { - - HeaderButton( - text = stringResource(R.string.finish), - ) + HeaderButton( + text = stringResource(R.string.finish), + ) } } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/OptionChipButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/OptionChipButton.kt new file mode 100644 index 00000000..22069b2e --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/OptionChipButton.kt @@ -0,0 +1,99 @@ +package com.texthip.thip.ui.common.buttons + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun OptionChipButton( + modifier: Modifier = Modifier, + text: String, + isFilled: Boolean = false, + onClick: () -> Unit, +) { + var isClicked by remember { mutableStateOf(false) } + + val textColor = when { + isFilled -> colors.White + isClicked -> colors.Purple + else -> colors.Grey01 + } + val backgroundColor = when { + isFilled && isClicked -> colors.Purple + isFilled -> colors.DarkGrey + else -> Color.Transparent + } + val borderColor = when { + !isFilled && isClicked -> colors.Purple + !isFilled -> colors.Grey02 + else -> Color.Transparent + } + + Box( + modifier = modifier + .background( + color = backgroundColor, + shape = RoundedCornerShape(20.dp) + ) + .border( + width = 1.dp, + color = borderColor, + shape = RoundedCornerShape(20.dp) + ) + .clickable { + isClicked = !isClicked + onClick() + } + .padding(vertical = 8.dp, horizontal = 12.dp), + contentAlignment = Alignment.Center, + ) { + Text( + text = text, + style = typography.info_r400_s12, + color = textColor + ) + } + +} + +@Preview +@Composable +private fun OptionChipButtonPreview() { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(16.dp, Alignment.CenterVertically), + ) { + OptionChipButton( + text = stringResource(R.string.essay), + onClick = {} + ) + + OptionChipButton( + text = stringResource(R.string.essay), + isFilled = true, + onClick = {} + ) + } +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d4572122..baff2e07 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,4 +14,5 @@ 팔로우 책 변경 완료 + 에세이•자기계발 \ No newline at end of file From e57937f6ccd46673967d72a096d7241dba85c4b0 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 28 May 2025 18:27:23 +0900 Subject: [PATCH 17/22] =?UTF-8?q?[UI]:=20genre=20chip=20button=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/buttons/GenreChipButton.kt | 81 +++++++++++++++++++ app/src/main/res/drawable/ic_x_20.xml | 13 +++ 2 files changed, 94 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/buttons/GenreChipButton.kt create mode 100644 app/src/main/res/drawable/ic_x_20.xml diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/GenreChipButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/GenreChipButton.kt new file mode 100644 index 00000000..6cd73363 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/GenreChipButton.kt @@ -0,0 +1,81 @@ +package com.texthip.thip.ui.common.buttons + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +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.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun GenreChipButton( + modifier: Modifier = Modifier, + text: String, + onClick: () -> Unit = { } +) { + Box( + modifier = modifier + .border( + width = 1.dp, + color = colors.White, + shape = RoundedCornerShape(20.dp) + ) + .background(color = Color.Transparent, shape = RoundedCornerShape(12.dp)) + .padding(top = 4.dp, bottom = 4.dp, end = 8.dp, start = 12.dp) + .clickable { + onClick() + }, + contentAlignment = Alignment.Center, + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(2.dp), + ) { + Text( + text = text, + color = colors.White, + style = typography.info_r400_s12, + ) + Icon( + painter = painterResource(R.drawable.ic_x_20), + contentDescription = null, + tint = Color.Unspecified, + modifier = Modifier + .size(20.dp) + ) + } + } +} + +@Preview +@Composable +private fun GenreChipButtonPreview() { + Column( + modifier = Modifier + .fillMaxSize() + .padding(30.dp), + verticalArrangement = Arrangement.spacedBy(30.dp, Alignment.CenterVertically), + ) { + GenreChipButton( + text = stringResource(R.string.essay), + ) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_x_20.xml b/app/src/main/res/drawable/ic_x_20.xml new file mode 100644 index 00000000..4dc19579 --- /dev/null +++ b/app/src/main/res/drawable/ic_x_20.xml @@ -0,0 +1,13 @@ + + + From 243190c54a86474f1c45ca95416c6f18a9b5019b Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 28 May 2025 18:32:49 +0900 Subject: [PATCH 18/22] =?UTF-8?q?[UI]:=20recent=20search=20button=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91=20(#1?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/common/buttons/RecentSearchButton.kt | 78 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 2 files changed, 79 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/buttons/RecentSearchButton.kt diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/RecentSearchButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/RecentSearchButton.kt new file mode 100644 index 00000000..fc76e4f6 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/RecentSearchButton.kt @@ -0,0 +1,78 @@ +package com.texthip.thip.ui.common.buttons + +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +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 androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun RecentSearchButton( + modifier: Modifier = Modifier, + text: String, + onClick: () -> Unit = { } +) { + Box( + modifier = modifier + .border( + width = 1.dp, + color = colors.Grey02, + shape = RoundedCornerShape(20.dp) + ) + .padding(top = 6.dp, bottom = 6.dp, end = 8.dp, start = 12.dp) + .clickable { + onClick() + }, + contentAlignment = Alignment.Center, + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + Text( + text = text, + color = colors.White, + style = typography.menu_r400_s14_h24, + ) + Icon( + painter = painterResource(R.drawable.ic_x), + contentDescription = null, + tint = colors.Grey01, + modifier = Modifier + .size(24.dp) + ) + } + } +} + +@Preview +@Composable +private fun RecentSearchButtonPreview() { + Column( + modifier = Modifier + .fillMaxSize() + .padding(30.dp), + verticalArrangement = Arrangement.spacedBy(30.dp, Alignment.CenterVertically), + ) { + RecentSearchButton( + text = stringResource(R.string.recent_search), + ) + } +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index baff2e07..b56a92c0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,4 +15,5 @@ 책 변경 완료 에세이•자기계발 + 최근 검색어 \ No newline at end of file From ef98a300f04a22ce68de5d92c7e2d07f158440db Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Thu, 29 May 2025 16:58:26 +0900 Subject: [PATCH 19/22] =?UTF-8?q?[UI]:=20expandable=20floating=20button=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91=20(#1?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/deploymentTargetSelector.xml | 3 + .idea/misc.xml | 2 +- .../buttons/ExpandableFloatingButton.kt | 161 ++++++++++++++++++ app/src/main/res/values/strings.xml | 4 + 4 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/buttons/ExpandableFloatingButton.kt diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index b268ef36..db5ab89b 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -5,6 +5,9 @@ + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 2aa690e7..503be042 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/ExpandableFloatingButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/ExpandableFloatingButton.kt new file mode 100644 index 00000000..763d2010 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/ExpandableFloatingButton.kt @@ -0,0 +1,161 @@ +package com.texthip.thip.ui.common.buttons + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +data class FabMenuItem( + val icon: Painter, + val text: String, + val onClick: () -> Unit +) + +@Composable +fun ExpandableFloatingButton( + menuItems: List +) { + var expanded by remember { mutableStateOf(false) } + + Box( + modifier = Modifier + .fillMaxSize() + .padding(16.dp), // TODO: 화면에서 버튼 위치 조정 + contentAlignment = Alignment.BottomEnd + ) { + Column( + horizontalAlignment = Alignment.End + ) { + // 펼쳐진 메뉴 + AnimatedVisibility( + visible = expanded, + enter = fadeIn(), + exit = fadeOut(), + ) { + Column( + modifier = Modifier + .padding(bottom = 80.dp, end = 16.dp) // TODO: 화면에서 버튼 위치 조정 + .width(184.dp) + .background( + color = colors.Black, + shape = RoundedCornerShape(16.dp) + ) + .border( + width = 1.dp, + color = colors.NeonGreen, + shape = RoundedCornerShape(16.dp) + ) + .padding(vertical = 24.dp, horizontal = 12.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + menuItems.forEachIndexed { index, item -> +// if (index > 0) Spacer(modifier = Modifier.height(16.dp)) + MenuItem( + icon = item.icon, + text = item.text, + onClick = { + expanded = false + item.onClick() + } + ) + } + } + } + } + + // 플로팅 버튼 + FloatingActionButton( + onClick = { expanded = !expanded }, + containerColor = if (expanded) colors.Purple else colors.DarkGrey, + contentColor = colors.NeonGreen, + shape = CircleShape, + modifier = Modifier + .padding(16.dp) + .size(56.dp) + .border(width = 2.dp, color = colors.NeonGreen50, shape = CircleShape) + ) { + Icon( + painter = if (expanded) painterResource(R.drawable.ic_x) else painterResource(R.drawable.ic_plus), + modifier = Modifier.size(24.dp), + tint = colors.NeonGreen, + contentDescription = null + ) + } + } +} + +@Composable +fun MenuItem( + icon: Painter, + text: String, + onClick: () -> Unit +) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .clickable { onClick() } + ) { + Icon( + painter = icon, + contentDescription = null, + tint = colors.White, + modifier = Modifier.size(24.dp) + ) + Spacer(modifier = Modifier.width(8.dp)) + Text( + text = text, + color = colors.White, + style = typography.menu_m500_s16_h24 + ) + } +} + +@Preview +@Composable +private fun ExpandableFabPreview() { + ExpandableFloatingButton( + menuItems = listOf( + FabMenuItem( + icon = painterResource(R.drawable.ic_write), + text = stringResource(R.string.write_record), + onClick = { } + ), + FabMenuItem( + icon = painterResource(R.drawable.ic_vote), + text = stringResource(R.string.create_vote), + onClick = { } + ) + ) + ) +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b56a92c0..60af47c3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -16,4 +16,8 @@ 완료 에세이•자기계발 최근 검색어 + 리스트 추가하기 + 인물관계도 보기 + 기록 작성 + 투표 생성 \ No newline at end of file From 6a487cb7ee9ece61942402dd0ced638f433db684 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Thu, 29 May 2025 17:01:29 +0900 Subject: [PATCH 20/22] =?UTF-8?q?[UI]:=20floating=20button=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/buttons/FloatingButton.kt | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/buttons/FloatingButton.kt diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/FloatingButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/FloatingButton.kt new file mode 100644 index 00000000..a572751f --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/FloatingButton.kt @@ -0,0 +1,68 @@ +package com.texthip.thip.ui.common.buttons + +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors + +@Composable +fun FloatingButton( + icon: Painter, + onClick: () -> Unit = { } +) { + var expanded by remember { mutableStateOf(false) } + + Box( + modifier = Modifier + .fillMaxSize() + .padding(16.dp), // TODO: 화면에서 버튼 위치 조정 + contentAlignment = Alignment.BottomEnd + ) { + // 플로팅 버튼 + FloatingActionButton( + onClick = { + expanded = !expanded + onClick() + }, + containerColor = colors.DarkGrey, + contentColor = colors.NeonGreen, + shape = CircleShape, + modifier = Modifier + .padding(16.dp) + .size(56.dp) + .border(width = 2.dp, color = colors.NeonGreen50, shape = CircleShape) + ) { + Icon( + painter = icon, + modifier = Modifier.size(24.dp), + tint = colors.NeonGreen, + contentDescription = null + ) + } + } +} + +@Preview +@Composable +private fun FloatingButtonPreview() { + FloatingButton( + icon = painterResource(id = R.drawable.ic_write), + ) +} \ No newline at end of file From 49db2f4b09f789a2ef6b555e71fd80dc3f1384d7 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Mon, 23 Jun 2025 14:15:24 +0900 Subject: [PATCH 21/22] =?UTF-8?q?[UI]:=20floating=20button=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EC=83=81=20=EC=9C=84=EC=B9=98=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/texthip/thip/ui/common/buttons/FloatingButton.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/FloatingButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/FloatingButton.kt index a572751f..976ae34d 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/buttons/FloatingButton.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/FloatingButton.kt @@ -32,7 +32,7 @@ fun FloatingButton( Box( modifier = Modifier .fillMaxSize() - .padding(16.dp), // TODO: 화면에서 버튼 위치 조정 + .padding(end = 20.dp, bottom = 32.dp), contentAlignment = Alignment.BottomEnd ) { // 플로팅 버튼 From 3eadbf6bc68484659f6aa7ea60467fa63381aca3 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Mon, 23 Jun 2025 22:41:31 +0900 Subject: [PATCH 22/22] =?UTF-8?q?[UI]:=20Group=20Vote=20Button=EC=97=90=20?= =?UTF-8?q?=EC=95=A0=EB=8B=88=EB=A9=94=EC=9D=B4=EC=85=98=20=ED=9A=A8?= =?UTF-8?q?=EA=B3=BC=20=EC=B6=94=EA=B0=80=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/buttons/GroupVoteButton.kt | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/GroupVoteButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/GroupVoteButton.kt index cd682cdc..f30320b7 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/buttons/GroupVoteButton.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/GroupVoteButton.kt @@ -1,5 +1,8 @@ package com.texthip.thip.ui.common.buttons +import androidx.compose.animation.animateColorAsState +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.tween import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -41,27 +44,27 @@ fun GroupVoteButton( options.forEachIndexed { index, option -> val isSelected = selectedIndex == index val hasVoted = selectedIndex != null - val votePercent = voteResults.getOrNull(index) ?: 0 + val votePercent = if (hasVoted) voteResults.getOrNull(index)?.coerceIn(0, 100) ?: 0 else 0 - val backgroundColor = when { - isSelected -> colors.PurpleDark - else -> colors.DarkGrey - } + val animatedPercent by animateFloatAsState( + targetValue = votePercent / 100f, + animationSpec = tween(durationMillis = 500) + ) - val percentBarColor = when { - isSelected -> colors.Purple - else -> colors.Grey02 - } + val backgroundColor by animateColorAsState( + targetValue = if (isSelected) colors.PurpleDark else colors.DarkGrey + ) - val textColor = when { - isSelected -> colors.NeonGreen - else -> colors.White - } + val percentBarColor by animateColorAsState( + targetValue = if (isSelected) colors.Purple else colors.Grey02 + ) - val fontStyle = when { - !hasVoted -> typography.feedcopy_r400_s14_h20 - else -> typography.menu_sb600_s14_h24 - } + val textColor by animateColorAsState( + targetValue = if (isSelected) colors.NeonGreen else colors.White + ) + + val fontStyle = if (!hasVoted) typography.feedcopy_r400_s14_h20 + else typography.menu_sb600_s14_h24 Box( modifier = Modifier @@ -77,7 +80,7 @@ fun GroupVoteButton( Box( modifier = Modifier .fillMaxHeight() - .fillMaxWidth(votePercent / 100f) + .fillMaxWidth(animatedPercent) .background( color = percentBarColor, shape = RoundedCornerShape(topStart = 12.dp, bottomStart = 12.dp) @@ -99,7 +102,7 @@ fun GroupVoteButton( ) if (hasVoted) { Text( - text = "$votePercent%", + text = "${votePercent}%", color = textColor, style = fontStyle )