From 5acb1635413ee8365546399b037a5c7d7a62afba Mon Sep 17 00:00:00 2001 From: Gyubin Date: Sun, 25 May 2025 22:54:38 +0900 Subject: [PATCH 01/11] =?UTF-8?q?[UI]=20Default=20textField=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(UI-#18])?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/git_toolbox_prj.xml | 15 ++++ .idea/material_theme_project_new.xml | 12 +++ .../common/forms/FormTextFieldDefault.kt | 87 +++++++++++++++++++ .../main/res/drawable/ic_x_circle_white.xml | 16 ++++ 4 files changed, 130 insertions(+) create mode 100644 .idea/git_toolbox_prj.xml create mode 100644 .idea/material_theme_project_new.xml create mode 100644 app/src/main/java/com/texthip/thip/ui/theme/common/forms/FormTextFieldDefault.kt create mode 100644 app/src/main/res/drawable/ic_x_circle_white.xml diff --git a/.idea/git_toolbox_prj.xml b/.idea/git_toolbox_prj.xml new file mode 100644 index 00000000..02b915b8 --- /dev/null +++ b/.idea/git_toolbox_prj.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml new file mode 100644 index 00000000..2cb81d57 --- /dev/null +++ b/.idea/material_theme_project_new.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/theme/common/forms/FormTextFieldDefault.kt b/app/src/main/java/com/texthip/thip/ui/theme/common/forms/FormTextFieldDefault.kt new file mode 100644 index 00000000..97e6c28b --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/theme/common/forms/FormTextFieldDefault.kt @@ -0,0 +1,87 @@ +package com.texthip.thip.ui.theme.common.forms + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +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.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun BaseInputTextField( + hint: String, + modifier: Modifier = Modifier +) { + var text by rememberSaveable { mutableStateOf("") } + val myStyle = typography.menu_r400_s14_h24.copy(lineHeight = 14.sp) + + OutlinedTextField( + value = text, + onValueChange = { text = it }, + placeholder = { + Text( + text = hint, + color = colors.Grey02, + style = myStyle + ) + }, + textStyle = myStyle, + modifier = modifier.size(width = 320.dp, height = 48.dp), + shape = RoundedCornerShape(12.dp), + colors = TextFieldDefaults.colors( + focusedTextColor = colors.White, + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + focusedContainerColor = colors.Black, + unfocusedContainerColor = colors.Black, + cursorColor = colors.NeonGreen + ), + trailingIcon = { + if (text.isNotEmpty()) { + Icon( + painter = painterResource(id = R.drawable.ic_x_circle_white), + contentDescription = "Clear text", + modifier = Modifier.clickable { text = "" }, + tint = Color.Unspecified + ) + } else { + Icon( + painter = painterResource(id = R.drawable.ic_x_circle), + contentDescription = "Clear text" + ) + } + }, + singleLine = true + ) +} + +@Composable +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 200) +fun InputTextFieldPreviewEmpty() { + Box( + modifier = Modifier.size(width = 360.dp, height = 200.dp), + contentAlignment = Alignment.Center + ) { + BaseInputTextField( + hint = "이곳에 텍스트를 입력하세요" + ) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_x_circle_white.xml b/app/src/main/res/drawable/ic_x_circle_white.xml new file mode 100644 index 00000000..126b24dc --- /dev/null +++ b/app/src/main/res/drawable/ic_x_circle_white.xml @@ -0,0 +1,16 @@ + + + + From 116d34102d8a12945163e9e19f31bc95b451d56a Mon Sep 17 00:00:00 2001 From: Gyubin Date: Sun, 25 May 2025 22:56:46 +0900 Subject: [PATCH 02/11] =?UTF-8?q?[UI]=20Default=EB=A5=BC=20=EA=B8=B0?= =?UTF-8?q?=EB=B0=98=EC=9C=BC=EB=A1=9C=20=EB=82=98=EB=A8=B8=EC=A7=80=20tex?= =?UTF-8?q?tField=EB=8F=84=20=EC=B6=94=EA=B0=80=20(UI-#18])?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/deploymentTargetSelector.xml | 10 -- .../theme/common/forms/BookPageTextField.kt | 157 ++++++++++++++++++ .../theme/common/forms/BorderedTextField.kt | 89 ++++++++++ .../ui/theme/common/forms/WarningTextField.kt | 119 +++++++++++++ 4 files changed, 365 insertions(+), 10 deletions(-) delete mode 100644 .idea/deploymentTargetSelector.xml create mode 100644 app/src/main/java/com/texthip/thip/ui/theme/common/forms/BookPageTextField.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/theme/common/forms/BorderedTextField.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/theme/common/forms/WarningTextField.kt diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml deleted file mode 100644 index b268ef36..00000000 --- a/.idea/deploymentTargetSelector.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/theme/common/forms/BookPageTextField.kt b/app/src/main/java/com/texthip/thip/ui/theme/common/forms/BookPageTextField.kt new file mode 100644 index 00000000..1555eff1 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/theme/common/forms/BookPageTextField.kt @@ -0,0 +1,157 @@ +package com.texthip.thip.ui.theme.common.forms + + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.Icon +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +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.painterResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.OffsetMapping +import androidx.compose.ui.text.input.TransformedText +import androidx.compose.ui.text.input.VisualTransformation +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + + +@Composable +fun BookPageTextField( + bookPage: Int, + modifier: Modifier = Modifier +) { + var text by rememberSaveable { mutableStateOf("") } + var isError by rememberSaveable { mutableStateOf(false) } + var errorMessage by rememberSaveable { mutableStateOf("") } + + Column { + OutlinedTextField( + value = text, + onValueChange = { newText: String -> + if (newText.isEmpty() || newText.all { it.isDigit() }) { + text = newText + // 숫자만 입력된 경우에만 페이지 수 체크 + if (newText.isNotEmpty()) { + val pageNum = newText.toInt() + isError = pageNum > bookPage + if (isError) { + errorMessage = "해당 도서는 ${bookPage}p까지만 있습니다." + } + } else { + isError = false + } + } + }, + // 여기에 VisualTransformation 설정 + visualTransformation = SuffixTransformation( + suffix = "/${bookPage}p", + suffixColor = colors.Grey02 + ), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + modifier = modifier.size(width = 320.dp, height = 48.dp), + textStyle = typography.menu_r400_s14_h24.copy(lineHeight = 12.sp), + shape = RoundedCornerShape(12.dp), + colors = TextFieldDefaults.colors( + focusedTextColor = colors.White, + focusedIndicatorColor = if (isError) colors.Red else Color.Transparent, + unfocusedIndicatorColor = if (isError) colors.Red else Color.Transparent, + focusedContainerColor = colors.Black, + unfocusedContainerColor = colors.Black, + cursorColor = colors.NeonGreen + ), + trailingIcon = { + if (text.isNotEmpty()) { + Icon( + painter = painterResource(id = R.drawable.ic_x_circle_white), + contentDescription = "Clear text", + modifier = Modifier.clickable { + text = "" + isError = false + }, + tint = Color.Unspecified + ) + } else { + Icon( + painter = painterResource(id = R.drawable.ic_x_circle), + contentDescription = "Clear text" + ) + } + } + ) + + if (isError) { + Spacer(modifier = Modifier.height(4.dp)) + Text( + text = errorMessage, + color = colors.Red, + style = typography.menu_r400_s14_h24.copy(lineHeight = 12.sp) + ) + } + } +} + + +class SuffixTransformation( + private val suffix: String, + private val suffixColor: Color +) : VisualTransformation { + override fun filter(text: AnnotatedString): TransformedText { + val original = text.text + + // 1) 숫자 부분은 기본 스타일, suffix 부분만 별도 SpanStyle 적용 + val transformed = buildAnnotatedString { + append(original) + pushStyle(SpanStyle(color = suffixColor)) + append(suffix) + pop() + } + + // 2) 커서 맵핑: suffix 바깥에서만 움직이도록 + val offsetMapping = object : OffsetMapping { + override fun originalToTransformed(offset: Int): Int = + offset.coerceAtMost(original.length) + override fun transformedToOriginal(offset: Int): Int = + offset.coerceAtMost(original.length) + } + + return TransformedText(transformed, offsetMapping) + } +} + + +@Composable +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 200) +fun BookPageTextFieldPreviewEmpty() { + Box( + modifier = Modifier.size(width = 360.dp, height = 200.dp), + contentAlignment = Alignment.Center + ) { + BookPageTextField( + bookPage = 456 + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/theme/common/forms/BorderedTextField.kt b/app/src/main/java/com/texthip/thip/ui/theme/common/forms/BorderedTextField.kt new file mode 100644 index 00000000..53f9460a --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/theme/common/forms/BorderedTextField.kt @@ -0,0 +1,89 @@ +package com.texthip.thip.ui.theme.common.forms + +import android.R.attr.singleLine +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +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.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun BorderedTextField( + hint: String, + modifier: Modifier = Modifier +) { + var text by rememberSaveable { mutableStateOf("") } + val myStyle = typography.menu_r400_s14_h24.copy(lineHeight = 14.sp) + + OutlinedTextField( + value = text, + onValueChange = { text = it }, + placeholder = { + Text( + text = hint, + color = colors.Grey02, + style = myStyle + ) + }, + textStyle = myStyle, + modifier = modifier.size(width = 320.dp, height = 48.dp), + shape = RoundedCornerShape(12.dp), + colors = TextFieldDefaults.colors( + focusedTextColor = colors.White, + focusedIndicatorColor = colors.Grey02, + unfocusedIndicatorColor = colors.Grey02, + focusedContainerColor = colors.Black00, + unfocusedContainerColor = colors.Black00, + cursorColor = colors.NeonGreen, + ), + + trailingIcon = { + if (text.isNotEmpty()) { + Icon( + painter = painterResource(id = R.drawable.ic_x_circle_white), + contentDescription = "Clear text", + modifier = Modifier.clickable { text = "" }, + tint = Color.Unspecified + ) + } else { + Icon( + painter = painterResource(id = R.drawable.ic_x_circle), + contentDescription = "Clear text" + ) + } + } + ) +} + +@Composable +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 200) +fun BorderedTextFieldPreview() { + Box( + modifier = Modifier.size(width = 360.dp, height = 200.dp), + contentAlignment = Alignment.Center + ) { + BorderedTextField( + hint = "가이드 텍스트를 입력" + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/theme/common/forms/WarningTextField.kt b/app/src/main/java/com/texthip/thip/ui/theme/common/forms/WarningTextField.kt new file mode 100644 index 00000000..e14e9bc7 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/theme/common/forms/WarningTextField.kt @@ -0,0 +1,119 @@ +package com.texthip.thip.ui.theme.common.forms + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +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.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun WarningTextField( + hint: String, + warningMessage: String = "경고 메시지를 입력해주세요.", + modifier: Modifier = Modifier, + showWarning: Boolean +) { + var text by rememberSaveable { mutableStateOf("") } + val myStyle = typography.menu_r400_s14_h24.copy(lineHeight = 14.sp) + + Column { + OutlinedTextField( + value = text, + onValueChange = { text = it }, + placeholder = { + Text( + text = hint, + color = colors.Grey02, + style = myStyle + ) + }, + textStyle = myStyle, + modifier = modifier.size(width = 320.dp, height = 48.dp), + shape = RoundedCornerShape(12.dp), + colors = TextFieldDefaults.colors( + focusedTextColor = colors.White, + focusedIndicatorColor = if (showWarning) colors.Red else Color.Transparent, + unfocusedIndicatorColor = if (showWarning) colors.Red else Color.Transparent, + focusedContainerColor = colors.Black, + unfocusedContainerColor = colors.Black, + cursorColor = colors.NeonGreen + ), + trailingIcon = { + if (text.isNotEmpty()) { + Icon( + painter = painterResource(id = R.drawable.ic_x_circle_white), + contentDescription = "Clear text", + modifier = Modifier.clickable { text = "" }, + tint = Color.Unspecified + ) + } else { + Icon( + painter = painterResource(id = R.drawable.ic_x_circle), + contentDescription = "Clear text" + ) + } + }, + singleLine = true + ) + + if (showWarning) { + Spacer(modifier = Modifier.height(4.dp)) + Text( + text = warningMessage, + color = colors.Red, + style = typography.info_r400_s12.copy(lineHeight = 12.sp) + ) + } + } +} + +@Composable +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 200) +fun WarningTextFieldPreviewEmpty() { + Box( + modifier = Modifier.size(width = 360.dp, height = 200.dp), + contentAlignment = Alignment.Center + ) { + WarningTextField( + hint = "인풋 텍스트", + showWarning = true, + warningMessage = "경고 메시지를 입력해주세요." + ) + } +} + +@Composable +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 200) +fun WarningTextFieldPreviewNormal() { + Box( + modifier = Modifier.size(width = 360.dp, height = 200.dp), + contentAlignment = Alignment.Center + ) { + WarningTextField( + hint = "인풋 텍스트", + showWarning = false + ) + } +} \ No newline at end of file From dd93e7e219fc079bc85cebe3e8b2c891f299ae33 Mon Sep 17 00:00:00 2001 From: Gyubin Date: Sat, 31 May 2025 14:56:26 +0900 Subject: [PATCH 03/11] =?UTF-8?q?[UI]=20=ED=8F=B4=EB=8D=94=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EC=83=98=ED=94=8C?= =?UTF-8?q?=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=B6=94=EA=B0=80=20(UI-#18)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/deploymentTargetSelector.xml | 10 ++++++++++ .idea/misc.xml | 1 - .../common/{forms => form}/BookPageTextField.kt | 4 +--- .../common/{forms => form}/BorderedTextField.kt | 5 +---- .../{forms => form}/FormTextFieldDefault.kt | 3 +-- .../common/{forms => form}/WarningTextField.kt | 3 +-- app/src/main/res/drawable/bookcover_sample.png | Bin 0 -> 3248 bytes 7 files changed, 14 insertions(+), 12 deletions(-) create mode 100644 .idea/deploymentTargetSelector.xml rename app/src/main/java/com/texthip/thip/ui/theme/common/{forms => form}/BookPageTextField.kt (97%) rename app/src/main/java/com/texthip/thip/ui/theme/common/{forms => form}/BorderedTextField.kt (94%) rename app/src/main/java/com/texthip/thip/ui/theme/common/{forms => form}/FormTextFieldDefault.kt (97%) rename app/src/main/java/com/texthip/thip/ui/theme/common/{forms => form}/WarningTextField.kt (97%) create mode 100644 app/src/main/res/drawable/bookcover_sample.png diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 00000000..8bc271fe --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 2aa690e7..8c6d36a7 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/theme/common/card/CardAlarm.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt similarity index 97% rename from app/src/main/java/com/texthip/thip/ui/theme/common/card/CardAlarm.kt rename to app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt index 589c55b8..afdeb777 100644 --- a/app/src/main/java/com/texthip/thip/ui/theme/common/card/CardAlarm.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.theme.common.card +package com.texthip.thip.ui.common.cards import androidx.compose.foundation.background import androidx.compose.foundation.border @@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width @@ -25,7 +24,6 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview diff --git a/app/src/main/java/com/texthip/thip/ui/theme/common/card/CardBookList.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardBookList.kt similarity index 92% rename from app/src/main/java/com/texthip/thip/ui/theme/common/card/CardBookList.kt rename to app/src/main/java/com/texthip/thip/ui/common/cards/CardBookList.kt index 76b8260e..544a6555 100644 --- a/app/src/main/java/com/texthip/thip/ui/theme/common/card/CardBookList.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardBookList.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.theme.common.card +package com.texthip.thip.ui.common.cards import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -13,13 +13,8 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Add -import androidx.compose.material.icons.filled.AddCircle import androidx.compose.material3.Icon import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedTextFieldDefaults.contentPadding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue diff --git a/app/src/main/java/com/texthip/thip/ui/theme/common/card/CardBookSearch.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardBookSearch.kt similarity index 98% rename from app/src/main/java/com/texthip/thip/ui/theme/common/card/CardBookSearch.kt rename to app/src/main/java/com/texthip/thip/ui/common/cards/CardBookSearch.kt index 42b449f2..1bc7fa03 100644 --- a/app/src/main/java/com/texthip/thip/ui/theme/common/card/CardBookSearch.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardBookSearch.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.theme.common.card +package com.texthip.thip.ui.common.cards import androidx.compose.foundation.Image import androidx.compose.foundation.clickable diff --git a/app/src/main/java/com/texthip/thip/ui/theme/common/card/CardInputBook.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardInputBook.kt similarity index 98% rename from app/src/main/java/com/texthip/thip/ui/theme/common/card/CardInputBook.kt rename to app/src/main/java/com/texthip/thip/ui/common/cards/CardInputBook.kt index fbe3ba65..002ce0ba 100644 --- a/app/src/main/java/com/texthip/thip/ui/theme/common/card/CardInputBook.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardInputBook.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.theme.common.card +package com.texthip.thip.ui.common.cards import androidx.compose.foundation.Image import androidx.compose.foundation.background diff --git a/app/src/main/java/com/texthip/thip/ui/theme/common/card/CardRoomBook.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardRoomBook.kt similarity index 97% rename from app/src/main/java/com/texthip/thip/ui/theme/common/card/CardRoomBook.kt rename to app/src/main/java/com/texthip/thip/ui/common/cards/CardRoomBook.kt index edf0547c..068a4ce5 100644 --- a/app/src/main/java/com/texthip/thip/ui/theme/common/card/CardRoomBook.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardRoomBook.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.theme.common.card +package com.texthip.thip.ui.common.cards import androidx.compose.foundation.Image import androidx.compose.foundation.clickable @@ -14,8 +14,6 @@ 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.material.icons.Icons -import androidx.compose.material.icons.filled.KeyboardArrowRight import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.Icon diff --git a/app/src/main/java/com/texthip/thip/ui/theme/common/form/BookPageTextField.kt b/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt similarity index 99% rename from app/src/main/java/com/texthip/thip/ui/theme/common/form/BookPageTextField.kt rename to app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt index 70d0b377..fed14aaa 100644 --- a/app/src/main/java/com/texthip/thip/ui/theme/common/form/BookPageTextField.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.theme.common.form +package com.texthip.thip.ui.common.forms import androidx.compose.foundation.clickable diff --git a/app/src/main/java/com/texthip/thip/ui/theme/common/form/BorderedTextField.kt b/app/src/main/java/com/texthip/thip/ui/common/forms/BorderedTextField.kt similarity index 98% rename from app/src/main/java/com/texthip/thip/ui/theme/common/form/BorderedTextField.kt rename to app/src/main/java/com/texthip/thip/ui/common/forms/BorderedTextField.kt index 9053773d..6307dd2a 100644 --- a/app/src/main/java/com/texthip/thip/ui/theme/common/form/BorderedTextField.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/forms/BorderedTextField.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.theme.common.form +package com.texthip.thip.ui.common.forms import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box diff --git a/app/src/main/java/com/texthip/thip/ui/theme/common/form/FormTextFieldDefault.kt b/app/src/main/java/com/texthip/thip/ui/common/forms/FormTextFieldDefault.kt similarity index 98% rename from app/src/main/java/com/texthip/thip/ui/theme/common/form/FormTextFieldDefault.kt rename to app/src/main/java/com/texthip/thip/ui/common/forms/FormTextFieldDefault.kt index 2e467d49..cc8f2285 100644 --- a/app/src/main/java/com/texthip/thip/ui/theme/common/form/FormTextFieldDefault.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/forms/FormTextFieldDefault.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.theme.common.form +package com.texthip.thip.ui.common.forms import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box diff --git a/app/src/main/java/com/texthip/thip/ui/theme/common/form/WarningTextField.kt b/app/src/main/java/com/texthip/thip/ui/common/forms/WarningTextField.kt similarity index 98% rename from app/src/main/java/com/texthip/thip/ui/theme/common/form/WarningTextField.kt rename to app/src/main/java/com/texthip/thip/ui/common/forms/WarningTextField.kt index 9c43f81e..533cfcea 100644 --- a/app/src/main/java/com/texthip/thip/ui/theme/common/form/WarningTextField.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/forms/WarningTextField.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.theme.common.form +package com.texthip.thip.ui.common.forms import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box From 39ad4ad3ad56e835050ad8a4a8e0dfda9a4f9cc7 Mon Sep 17 00:00:00 2001 From: Gyubin Date: Mon, 23 Jun 2025 23:17:46 +0900 Subject: [PATCH 10/11] =?UTF-8?q?[Refactor]=20Commom/button=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=EB=A1=9C=20=EC=88=98=EC=A0=95=20(#1?= =?UTF-8?q?8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/cards/CardInputBook.kt | 25 +++++++------------ .../thip/ui/common/forms/BookPageTextField.kt | 2 -- app/src/main/res/values/strings.xml | 1 + 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardInputBook.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardInputBook.kt index 002ce0ba..e6b322af 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardInputBook.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardInputBook.kt @@ -5,7 +5,6 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -14,7 +13,6 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -22,10 +20,12 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource 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.common.buttons.OutlinedButton import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @@ -62,8 +62,7 @@ fun CardInputBook( // 텍스트 정보 Column( - modifier = Modifier - .width(180.dp), + modifier = Modifier.weight(.1f), verticalArrangement = Arrangement.Top ) { Text( @@ -80,23 +79,17 @@ fun CardInputBook( color = colors.Grey01 ) } - - Spacer(modifier = Modifier.weight(1f)) + // 텍스트 정보와 버튼 사이 19dp 고정 간격 + Spacer(modifier = Modifier.width(19.dp)) OutlinedButton( - onClick = onChangeClick, modifier = Modifier .size(width = 49.dp, height = 33.dp) .align(Alignment.Bottom), - contentPadding = PaddingValues(0.dp) // 기본 패딩 없애기 - ) { - // TODO: 나은이 공통 컴포넌트 사용하기 - Text( - text = "변경", - style = typography.view_m500_s14, - color = colors.Grey - ) - } + text = stringResource(R.string.change), + textStyle = typography.view_m500_s14, + onClick = onChangeClick + ) } } diff --git a/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt b/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt index fed14aaa..e15963ac 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt @@ -121,7 +121,6 @@ class SuffixTransformation( override fun filter(text: AnnotatedString): TransformedText { val original = text.text - // 1) 숫자 부분은 기본 스타일, suffix 부분만 별도 SpanStyle 적용 val transformed = buildAnnotatedString { append(original) pushStyle(SpanStyle(color = suffixColor)) @@ -129,7 +128,6 @@ class SuffixTransformation( pop() } - // 2) 커서 맵핑: suffix 바깥에서만 움직이도록 val offsetMapping = object : OffsetMapping { override fun originalToTransformed(offset: Int): Int = offset.coerceAtMost(original.length) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5d5bd7c8..0413d69a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -24,5 +24,6 @@ 시간 전 모임 + 변경 \ No newline at end of file From 6f1f708e71a294671e556c2f0150375ebd0af835 Mon Sep 17 00:00:00 2001 From: Gyubin Date: Mon, 23 Jun 2025 23:31:42 +0900 Subject: [PATCH 11/11] =?UTF-8?q?[Refactor]=20=EA=B2=BD=EA=B3=A0=20?= =?UTF-8?q?=EB=A9=94=EC=84=B8=EC=A7=80=EB=A5=BC=20String=20Resource?= =?UTF-8?q?=EB=A1=9C=20=EC=B6=94=EC=B6=9C=20(#18)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/forms/BookPageTextField.kt | 18 +++++++++++------- app/src/main/res/values/strings.xml | 3 +++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt b/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt index e15963ac..fe832cae 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt @@ -22,6 +22,7 @@ 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.text.AnnotatedString import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString @@ -44,7 +45,8 @@ fun BookPageTextField( ) { var text by rememberSaveable { mutableStateOf("") } var isError by rememberSaveable { mutableStateOf(false) } - var errorMessage by rememberSaveable { mutableStateOf("") } + var errorMessageRes by rememberSaveable { mutableStateOf(null) } + var errorMessageParam by rememberSaveable { mutableStateOf(0) } Column { OutlinedTextField( @@ -52,19 +54,21 @@ fun BookPageTextField( onValueChange = { newText: String -> if (newText.isEmpty() || newText.all { it.isDigit() }) { text = newText - // 숫자만 입력된 경우에만 페이지 수 체크 if (newText.isNotEmpty()) { val pageNum = newText.toInt() isError = pageNum > bookPage if (isError) { - errorMessage = "해당 도서는 ${bookPage}p까지만 있습니다." + errorMessageRes = R.string.error_page_over + errorMessageParam = bookPage + } else { + errorMessageRes = null } } else { isError = false + errorMessageRes = null } } }, - // 여기에 VisualTransformation 설정 visualTransformation = SuffixTransformation( suffix = "/${bookPage}p", suffixColor = colors.Grey02 @@ -90,6 +94,7 @@ fun BookPageTextField( modifier = Modifier.clickable { text = "" isError = false + errorMessageRes = null }, tint = Color.Unspecified ) @@ -102,10 +107,10 @@ fun BookPageTextField( } ) - if (isError) { + if (isError && errorMessageRes != null) { Spacer(modifier = Modifier.height(4.dp)) Text( - text = errorMessage, + text = stringResource(id = errorMessageRes!!, errorMessageParam), color = colors.Red, style = typography.menu_r400_s14_h24.copy(lineHeight = 12.sp) ) @@ -113,7 +118,6 @@ fun BookPageTextField( } } - class SuffixTransformation( private val suffix: String, private val suffixColor: Color diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0413d69a..46514a2b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -26,4 +26,7 @@ 모임 변경 + + 해당 도서는 %1$dp까지만 있습니다. + \ No newline at end of file