From 66b52abef3a4040584777fd5de043549f223a5f4 Mon Sep 17 00:00:00 2001 From: easyhooon Date: Mon, 3 Nov 2025 15:41:47 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=EB=8F=85=EC=84=9C=20=EA=B8=B0?= =?UTF-8?q?=EB=A1=9D=20=ED=99=94=EB=A9=B4=20=EA=B0=90=EC=83=81=ED=8F=89=20?= =?UTF-8?q?=EB=B9=88=20=EA=B0=92=EC=9D=BC=20=EA=B2=BD=EC=9A=B0=20=ED=95=98?= =?UTF-8?q?=EB=8B=A8=20=ED=8C=A8=EB=94=A9=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ""로 들어가도 Text의 높이를 그대로 차지함, 감상푱아 빈 값일 경우 Text Composable 사용 X --- .../feature/detail/record/RecordDetailUi.kt | 27 ++++++++++++++++++ .../detail/record/component/ReviewItem.kt | 28 ++++++++++++++----- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/record/RecordDetailUi.kt b/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/record/RecordDetailUi.kt index 93f671da..8bedd731 100644 --- a/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/record/RecordDetailUi.kt +++ b/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/record/RecordDetailUi.kt @@ -206,3 +206,30 @@ private fun ReviewDetailPreview() { ) } } + +@ComponentPreview +@Composable +private fun ReviewDetailEmptyPreview() { + ReedTheme { + RecordDetailUi( + state = RecordDetailUiState( + uiState = UiState.Success, + recordDetailInfo = RecordDetailModel( + id = "", + userBookId = "", + pageNumber = 90, + quote = "소설가들은 늘 소재를 찾아 떠도는 존재 같지만, 실은 그 반대인 경우가 더 잦다.", + review = "", + emotionTags = listOf("따뜻함"), + createdAt = "2023.10.10", + updatedAt = "", + bookTitle = "여름은 오래 그곳에 남아", + bookPublisher = "비채 비채 비채 비채", + bookCoverImageUrl = "", + author = "미쓰이에 마사시, 미쓰이에 마사시, 미쓰이에 마사시, 미쓰이에 마사시", + ), + eventSink = {}, + ), + ) + } +} diff --git a/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/record/component/ReviewItem.kt b/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/record/component/ReviewItem.kt index 8c2fa6e5..6a1c14db 100644 --- a/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/record/component/ReviewItem.kt +++ b/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/record/component/ReviewItem.kt @@ -39,7 +39,7 @@ internal fun ReviewItem( ) .padding( horizontal = ReedTheme.spacing.spacing4, - vertical = ReedTheme.spacing.spacing3, + vertical = ReedTheme.spacing.spacing4, ), ) { Column { @@ -68,12 +68,14 @@ internal fun ReviewItem( style = ReedTheme.typography.label2Regular, ) } - Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing3)) - Text( - text = review, - color = ReedTheme.colors.contentSecondary, - style = ReedTheme.typography.label1Medium, - ) + if (review.isNotBlank()) { + Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing3)) + Text( + text = review, + color = ReedTheme.colors.contentSecondary, + style = ReedTheme.typography.label1Medium, + ) + } } } } @@ -89,3 +91,15 @@ private fun ReviewBoxPreview() { ) } } + +@ComponentPreview +@Composable +private fun ReviewBoxEmptyPreview() { + ReedTheme { + ReviewItem( + emotion = "따뜻함", + review = "", + createdAt = "2025.06.25", + ) + } +} From aeea6fa248f48c65ce254834f993907845e2ba9e Mon Sep 17 00:00:00 2001 From: easyhooon Date: Mon, 3 Nov 2025 16:05:57 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[BOOK-416]=20chore:=20detail.stability=20?= =?UTF-8?q?=EC=B5=9C=EC=8B=A0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit preview Composable 추가는 설정에서 제외하고 싶은데... --- feature/detail/stability/detail.stability | 338 +--------------------- 1 file changed, 7 insertions(+), 331 deletions(-) diff --git a/feature/detail/stability/detail.stability b/feature/detail/stability/detail.stability index eb8cb1a8..d9d8bbc5 100644 --- a/feature/detail/stability/detail.stability +++ b/feature/detail/stability/detail.stability @@ -4,363 +4,39 @@ // Do not edit this file directly. To update it, run: // ./gradlew :detail:stabilityDump -@Composable -internal fun com.ninecraft.booket.feature.detail.book.BookDetailContent(state: com.ninecraft.booket.feature.detail.book.BookDetailUiState, innerPadding: androidx.compose.foundation.layout.PaddingValues, modifier: androidx.compose.ui.Modifier, lazyListState: androidx.compose.foundation.lazy.LazyListState): kotlin.Unit - skippable: true - restartable: true - params: - - state: STABLE - - innerPadding: STABLE (marked @Stable or @Immutable) - - modifier: STABLE (marked @Stable or @Immutable) - - lazyListState: STABLE (marked @Stable or @Immutable) - -@Composable -public fun com.ninecraft.booket.feature.detail.book.BookDetailPresenter.present(): com.ninecraft.booket.feature.detail.book.BookDetailUiState - skippable: true - restartable: true - params: - -@Composable -private fun com.ninecraft.booket.feature.detail.book.BookDetailPreview(): kotlin.Unit - skippable: true - restartable: true - params: - -@Composable -internal fun com.ninecraft.booket.feature.detail.book.BookDetailUi(state: com.ninecraft.booket.feature.detail.book.BookDetailUiState, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true - restartable: true - params: - - state: STABLE - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -internal fun com.ninecraft.booket.feature.detail.book.HandleBookDetailSideEffects(state: com.ninecraft.booket.feature.detail.book.BookDetailUiState, eventSink: kotlin.Function1): kotlin.Unit - skippable: true - restartable: true - params: - - state: STABLE - - eventSink: STABLE (function type) - -@Composable -internal fun com.ninecraft.booket.feature.detail.book.component.BookItem(bookDetail: com.ninecraft.booket.core.model.BookDetailModel, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true - restartable: true - params: - - bookDetail: STABLE (marked @Stable or @Immutable) - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -private fun com.ninecraft.booket.feature.detail.book.component.BookItemPreview(): kotlin.Unit - skippable: true - restartable: true - params: - -@Composable -public fun com.ninecraft.booket.feature.detail.book.component.BookStatusItem(item: com.ninecraft.booket.core.common.constants.BookStatus, selected: kotlin.Boolean, onClick: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true - restartable: true - params: - - item: STABLE - - selected: STABLE (primitive type) - - onClick: STABLE (function type) - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -internal fun com.ninecraft.booket.feature.detail.book.component.BookUpdateBottomSheet(onDismissRequest: kotlin.Function0, sheetState: androidx.compose.material3.SheetState, onCloseButtonClick: kotlin.Function0, bookStatuses: kotlinx.collections.immutable.ImmutableList, currentBookStatus: com.ninecraft.booket.core.common.constants.BookStatus?, selectedBookStatus: com.ninecraft.booket.core.common.constants.BookStatus, onItemSelected: kotlin.Function1, onBookUpdateButtonClick: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true - restartable: true - params: - - onDismissRequest: STABLE (function type) - - sheetState: STABLE (marked @Stable or @Immutable) - - onCloseButtonClick: STABLE (function type) - - bookStatuses: STABLE (known stable type) - - currentBookStatus: STABLE - - selectedBookStatus: STABLE - - onItemSelected: STABLE (function type) - - onBookUpdateButtonClick: STABLE (function type) - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -private fun com.ninecraft.booket.feature.detail.book.component.BookUpdateBottomSheetPreview(): kotlin.Unit - skippable: true - restartable: true - params: - -@Composable -private fun com.ninecraft.booket.feature.detail.book.component.ChoiceBottomSheetPreview(): kotlin.Unit - skippable: true - restartable: true - params: - -@Composable -private fun com.ninecraft.booket.feature.detail.book.component.CollectedSeedPreview(): kotlin.Unit - skippable: true - restartable: true - params: - -@Composable -internal fun com.ninecraft.booket.feature.detail.book.component.CollectedSeeds(seedsStats: kotlinx.collections.immutable.ImmutableList, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true - restartable: true - params: - - seedsStats: STABLE (known stable type) - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -internal fun com.ninecraft.booket.feature.detail.book.component.DetailMenuBottomSheet(onDismissRequest: kotlin.Function0, sheetState: androidx.compose.material3.SheetState, onDeleteBookClick: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true - restartable: true - params: - - onDismissRequest: STABLE (function type) - - sheetState: STABLE (marked @Stable or @Immutable) - - onDeleteBookClick: STABLE (function type) - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -private fun com.ninecraft.booket.feature.detail.book.component.DetailMenuItem(iconResId: kotlin.Int, iconDescription: kotlin.String, label: kotlin.String, color: androidx.compose.ui.graphics.Color, onClick: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true - restartable: true - params: - - iconResId: STABLE (primitive type) - - iconDescription: STABLE (String is immutable) - - label: STABLE (String is immutable) - - color: STABLE (marked @Stable or @Immutable) - - onClick: STABLE (function type) - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -internal fun com.ninecraft.booket.feature.detail.book.component.EmotionAnalysisResultText(emotions: kotlinx.collections.immutable.ImmutableList, brandColor: androidx.compose.ui.graphics.Color, secondaryColor: androidx.compose.ui.graphics.Color, emotionTextStyle: androidx.compose.ui.text.TextStyle, regularTextStyle: androidx.compose.ui.text.TextStyle): androidx.compose.ui.text.AnnotatedString? - skippable: true - restartable: true - params: - - emotions: STABLE (known stable type) - - brandColor: STABLE (marked @Stable or @Immutable) - - secondaryColor: STABLE (marked @Stable or @Immutable) - - emotionTextStyle: STABLE (marked @Stable or @Immutable) - - regularTextStyle: STABLE (marked @Stable or @Immutable) - -@Composable -private fun com.ninecraft.booket.feature.detail.book.component.EmotionTextAllCasesPreview(): kotlin.Unit - skippable: true - restartable: true - params: - -@Composable -internal fun com.ninecraft.booket.feature.detail.book.component.ReadingRecordsHeader(totalCount: kotlin.Int, currentRecordSort: com.ninecraft.booket.feature.detail.book.RecordSort, onReadingRecordClick: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true - restartable: true - params: - - totalCount: STABLE (primitive type) - - currentRecordSort: STABLE - - onReadingRecordClick: STABLE (function type) - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -private fun com.ninecraft.booket.feature.detail.book.component.ReadingRecordsHeaderPreview(): kotlin.Unit - skippable: true - restartable: true - params: - -@Composable -internal fun com.ninecraft.booket.feature.detail.book.component.RecordItem(recordInfo: com.ninecraft.booket.core.model.ReadingRecordModel, onRecordMenuClick: kotlin.Function1, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true - restartable: true - params: - - recordInfo: STABLE (marked @Stable or @Immutable) - - onRecordMenuClick: STABLE (function type) - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -private fun com.ninecraft.booket.feature.detail.book.component.RecordItemPreview(): kotlin.Unit - skippable: true - restartable: true - params: - -@Composable -internal fun com.ninecraft.booket.feature.detail.book.component.RecordSortBottomSheet(onDismissRequest: kotlin.Function0, sheetState: androidx.compose.material3.SheetState, onCloseButtonClick: kotlin.Function0, recordSortItems: kotlinx.collections.immutable.ImmutableList, currentRecordSort: com.ninecraft.booket.feature.detail.book.RecordSort, onItemSelected: kotlin.Function1, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true - restartable: true - params: - - onDismissRequest: STABLE (function type) - - sheetState: STABLE (marked @Stable or @Immutable) - - onCloseButtonClick: STABLE (function type) - - recordSortItems: STABLE (known stable type) - - currentRecordSort: STABLE - - onItemSelected: STABLE (function type) - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -private fun com.ninecraft.booket.feature.detail.book.component.RecordSortBottomSheetPreview(): kotlin.Unit - skippable: true - restartable: true - params: - -@Composable -public fun com.ninecraft.booket.feature.detail.book.component.RecordSortItem(item: com.ninecraft.booket.feature.detail.book.RecordSort, selected: kotlin.Boolean, onClick: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true - restartable: true - params: - - item: STABLE - - selected: STABLE (primitive type) - - onClick: STABLE (function type) - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -internal fun com.ninecraft.booket.feature.detail.book.component.SeedItem(emotion: com.ninecraft.booket.core.model.EmotionModel, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true - restartable: true - params: - - emotion: STABLE (marked @Stable or @Immutable) - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -private fun com.ninecraft.booket.feature.detail.book.component.SeedItemPreview(): kotlin.Unit - skippable: true - restartable: true - params: - -@Composable -internal fun com.ninecraft.booket.feature.detail.card.HandleRecordCardSideEffects(state: com.ninecraft.booket.feature.detail.card.RecordCardUiState, recordCardGraphicsLayer: androidx.compose.ui.graphics.layer.GraphicsLayer, eventSink: kotlin.Function1): kotlin.Unit - skippable: false - restartable: true - params: - - state: STABLE - - recordCardGraphicsLayer: UNSTABLE (has mutable properties or unstable members) - - eventSink: STABLE (function type) - -@Composable -public fun com.ninecraft.booket.feature.detail.card.RecordCardPresenter.present(): com.ninecraft.booket.feature.detail.card.RecordCardUiState - skippable: true - restartable: true - params: - -@Composable -internal fun com.ninecraft.booket.feature.detail.card.RecordCardUi(state: com.ninecraft.booket.feature.detail.card.RecordCardUiState, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true - restartable: true - params: - - state: STABLE - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -private fun com.ninecraft.booket.feature.detail.card.RecordCardUiPreview(): kotlin.Unit - skippable: true - restartable: true - params: - -@Composable -internal fun com.ninecraft.booket.feature.detail.card.component.RecordCard(quote: kotlin.String, bookTitle: kotlin.String, emotionTag: kotlin.String, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true - restartable: true - params: - - quote: STABLE (String is immutable) - - bookTitle: STABLE (String is immutable) - - emotionTag: STABLE (String is immutable) - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -private fun com.ninecraft.booket.feature.detail.card.component.RecordCardPreview(): kotlin.Unit - skippable: true - restartable: true - params: - -@Composable -internal fun com.ninecraft.booket.feature.detail.record.HandleRecordDetailSideEffects(state: com.ninecraft.booket.feature.detail.record.RecordDetailUiState): kotlin.Unit - skippable: true - restartable: true - params: - - state: STABLE - @Composable private fun com.ninecraft.booket.feature.detail.record.RecordDetailContent(state: com.ninecraft.booket.feature.detail.record.RecordDetailUiState, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true + skippable: false restartable: true params: - - state: STABLE + - state: RUNTIME (requires runtime check) - modifier: STABLE (marked @Stable or @Immutable) -@Composable -public fun com.ninecraft.booket.feature.detail.record.RecordDetailPresenter.present(): com.ninecraft.booket.feature.detail.record.RecordDetailUiState - skippable: true - restartable: true - params: - @Composable internal fun com.ninecraft.booket.feature.detail.record.RecordDetailUi(state: com.ninecraft.booket.feature.detail.record.RecordDetailUiState, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true - restartable: true - params: - - state: STABLE - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -private fun com.ninecraft.booket.feature.detail.record.ReviewDetailPreview(): kotlin.Unit - skippable: true - restartable: true - params: - -@Composable -internal fun com.ninecraft.booket.feature.detail.record.component.BookItem(imageUrl: kotlin.String, bookTitle: kotlin.String, author: kotlin.String, publisher: kotlin.String, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true + skippable: false restartable: true params: - - imageUrl: STABLE (String is immutable) - - bookTitle: STABLE (String is immutable) - - author: STABLE (String is immutable) - - publisher: STABLE (String is immutable) + - state: RUNTIME (requires runtime check) - modifier: STABLE (marked @Stable or @Immutable) @Composable -private fun com.ninecraft.booket.feature.detail.record.component.BookItemPreview(): kotlin.Unit +private fun com.ninecraft.booket.feature.detail.record.ReviewDetailEmptyPreview(): kotlin.Unit skippable: true restartable: true params: @Composable -private fun com.ninecraft.booket.feature.detail.record.component.ChoiceBottomSheetPreview(): kotlin.Unit - skippable: true - restartable: true - params: - -@Composable -private fun com.ninecraft.booket.feature.detail.record.component.QuoteBoxPreview(): kotlin.Unit - skippable: true - restartable: true - params: - -@Composable -internal fun com.ninecraft.booket.feature.detail.record.component.QuoteItem(quote: kotlin.String, page: kotlin.Int, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: true - restartable: true - params: - - quote: STABLE (String is immutable) - - page: STABLE (primitive type) - - modifier: STABLE (marked @Stable or @Immutable) - -@Composable -internal fun com.ninecraft.booket.feature.detail.record.component.RecordMenuBottomSheet(onDismissRequest: kotlin.Function0, sheetState: androidx.compose.material3.SheetState, onShareRecordClick: kotlin.Function0, onEditRecordClick: kotlin.Function0, onDeleteRecordClick: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit +private fun com.ninecraft.booket.feature.detail.record.ReviewDetailPreview(): kotlin.Unit skippable: true restartable: true params: - - onDismissRequest: STABLE (function type) - - sheetState: STABLE (marked @Stable or @Immutable) - - onShareRecordClick: STABLE (function type) - - onEditRecordClick: STABLE (function type) - - onDeleteRecordClick: STABLE (function type) - - modifier: STABLE (marked @Stable or @Immutable) @Composable -private fun com.ninecraft.booket.feature.detail.record.component.RecordMenuItem(iconResId: kotlin.Int, iconDescription: kotlin.String, label: kotlin.String, color: androidx.compose.ui.graphics.Color, onClick: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit +private fun com.ninecraft.booket.feature.detail.record.component.ReviewBoxEmptyPreview(): kotlin.Unit skippable: true restartable: true params: - - iconResId: STABLE (primitive type) - - iconDescription: STABLE (String is immutable) - - label: STABLE (String is immutable) - - color: STABLE (marked @Stable or @Immutable) - - onClick: STABLE (function type) - - modifier: STABLE (marked @Stable or @Immutable) @Composable private fun com.ninecraft.booket.feature.detail.record.component.ReviewBoxPreview(): kotlin.Unit From 0a43a7d4f08d713533e9d46b51f4d7e3adc03a2f Mon Sep 17 00:00:00 2001 From: easyhooon Date: Mon, 3 Nov 2025 16:24:55 +0900 Subject: [PATCH 3/3] [BOOK-416] chore: upgrade compose-stability-analyzer version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit .stability 파일 최신화 --- .../stability/designsystem.stability | 8 +- feature/detail/stability/detail.stability | 344 +++++++++++++++++- gradle/libs.versions.toml | 2 +- 3 files changed, 345 insertions(+), 9 deletions(-) diff --git a/core/designsystem/stability/designsystem.stability b/core/designsystem/stability/designsystem.stability index e3399e9a..319a7836 100644 --- a/core/designsystem/stability/designsystem.stability +++ b/core/designsystem/stability/designsystem.stability @@ -231,7 +231,7 @@ private fun com.ninecraft.booket.core.designsystem.component.checkbox.TickOnlyCh @Composable public fun com.ninecraft.booket.core.designsystem.component.textfield.ReedRecordTextField(recordState: androidx.compose.foundation.text.input.TextFieldState, recordHintRes: kotlin.Int, modifier: androidx.compose.ui.Modifier, inputTransformation: androidx.compose.foundation.text.input.InputTransformation?, keyboardOptions: androidx.compose.foundation.text.KeyboardOptions, lineLimits: androidx.compose.foundation.text.input.TextFieldLineLimits, isError: kotlin.Boolean, errorMessage: kotlin.String, onClear: kotlin.Function0?, onNext: kotlin.Function0, backgroundColor: androidx.compose.ui.graphics.Color, textColor: androidx.compose.ui.graphics.Color, cornerShape: androidx.compose.foundation.shape.RoundedCornerShape, borderStroke: androidx.compose.foundation.BorderStroke): kotlin.Unit - skippable: false + skippable: true restartable: true params: - recordState: STABLE (marked @Stable or @Immutable) @@ -246,7 +246,7 @@ public fun com.ninecraft.booket.core.designsystem.component.textfield.ReedRecord - onNext: STABLE (function type) - backgroundColor: STABLE (marked @Stable or @Immutable) - textColor: STABLE (marked @Stable or @Immutable) - - cornerShape: RUNTIME (requires runtime check) + - cornerShape: STABLE (known stable type) - borderStroke: STABLE (marked @Stable or @Immutable) @Composable @@ -257,7 +257,7 @@ private fun com.ninecraft.booket.core.designsystem.component.textfield.ReedRecor @Composable public fun com.ninecraft.booket.core.designsystem.component.textfield.ReedTextField(queryState: androidx.compose.foundation.text.input.TextFieldState, queryHintRes: kotlin.Int, onSearch: kotlin.Function1, onClear: kotlin.Function0, modifier: androidx.compose.ui.Modifier, backgroundColor: androidx.compose.ui.graphics.Color, textColor: androidx.compose.ui.graphics.Color, cornerShape: androidx.compose.foundation.shape.RoundedCornerShape, borderStroke: androidx.compose.foundation.BorderStroke?, searchIconTint: androidx.compose.ui.graphics.Color): kotlin.Unit - skippable: false + skippable: true restartable: true params: - queryState: STABLE (marked @Stable or @Immutable) @@ -267,7 +267,7 @@ public fun com.ninecraft.booket.core.designsystem.component.textfield.ReedTextFi - modifier: STABLE (marked @Stable or @Immutable) - backgroundColor: STABLE (marked @Stable or @Immutable) - textColor: STABLE (marked @Stable or @Immutable) - - cornerShape: RUNTIME (requires runtime check) + - cornerShape: STABLE (known stable type) - borderStroke: STABLE (marked @Stable or @Immutable) - searchIconTint: STABLE (marked @Stable or @Immutable) diff --git a/feature/detail/stability/detail.stability b/feature/detail/stability/detail.stability index d9d8bbc5..7b658259 100644 --- a/feature/detail/stability/detail.stability +++ b/feature/detail/stability/detail.stability @@ -5,19 +5,293 @@ // ./gradlew :detail:stabilityDump @Composable -private fun com.ninecraft.booket.feature.detail.record.RecordDetailContent(state: com.ninecraft.booket.feature.detail.record.RecordDetailUiState, modifier: androidx.compose.ui.Modifier): kotlin.Unit +internal fun com.ninecraft.booket.feature.detail.book.BookDetailContent(state: com.ninecraft.booket.feature.detail.book.BookDetailUiState, innerPadding: androidx.compose.foundation.layout.PaddingValues, modifier: androidx.compose.ui.Modifier, lazyListState: androidx.compose.foundation.lazy.LazyListState): kotlin.Unit + skippable: true + restartable: true + params: + - state: STABLE + - innerPadding: STABLE (marked @Stable or @Immutable) + - modifier: STABLE (marked @Stable or @Immutable) + - lazyListState: STABLE (marked @Stable or @Immutable) + +@Composable +public fun com.ninecraft.booket.feature.detail.book.BookDetailPresenter.present(): com.ninecraft.booket.feature.detail.book.BookDetailUiState + skippable: true + restartable: true + params: + +@Composable +private fun com.ninecraft.booket.feature.detail.book.BookDetailPreview(): kotlin.Unit + skippable: true + restartable: true + params: + +@Composable +internal fun com.ninecraft.booket.feature.detail.book.BookDetailUi(state: com.ninecraft.booket.feature.detail.book.BookDetailUiState, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - state: STABLE + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +internal fun com.ninecraft.booket.feature.detail.book.HandleBookDetailSideEffects(state: com.ninecraft.booket.feature.detail.book.BookDetailUiState, eventSink: kotlin.Function1): kotlin.Unit + skippable: true + restartable: true + params: + - state: STABLE + - eventSink: STABLE (function type) + +@Composable +internal fun com.ninecraft.booket.feature.detail.book.component.BookItem(bookDetail: com.ninecraft.booket.core.model.BookDetailModel, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - bookDetail: STABLE (marked @Stable or @Immutable) + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +private fun com.ninecraft.booket.feature.detail.book.component.BookItemPreview(): kotlin.Unit + skippable: true + restartable: true + params: + +@Composable +public fun com.ninecraft.booket.feature.detail.book.component.BookStatusItem(item: com.ninecraft.booket.core.common.constants.BookStatus, selected: kotlin.Boolean, onClick: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - item: STABLE + - selected: STABLE (primitive type) + - onClick: STABLE (function type) + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +internal fun com.ninecraft.booket.feature.detail.book.component.BookUpdateBottomSheet(onDismissRequest: kotlin.Function0, sheetState: androidx.compose.material3.SheetState, onCloseButtonClick: kotlin.Function0, bookStatuses: kotlinx.collections.immutable.ImmutableList, currentBookStatus: com.ninecraft.booket.core.common.constants.BookStatus?, selectedBookStatus: com.ninecraft.booket.core.common.constants.BookStatus, onItemSelected: kotlin.Function1, onBookUpdateButtonClick: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - onDismissRequest: STABLE (function type) + - sheetState: STABLE (marked @Stable or @Immutable) + - onCloseButtonClick: STABLE (function type) + - bookStatuses: STABLE (known stable type) + - currentBookStatus: STABLE + - selectedBookStatus: STABLE + - onItemSelected: STABLE (function type) + - onBookUpdateButtonClick: STABLE (function type) + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +private fun com.ninecraft.booket.feature.detail.book.component.BookUpdateBottomSheetPreview(): kotlin.Unit + skippable: true + restartable: true + params: + +@Composable +private fun com.ninecraft.booket.feature.detail.book.component.ChoiceBottomSheetPreview(): kotlin.Unit + skippable: true + restartable: true + params: + +@Composable +private fun com.ninecraft.booket.feature.detail.book.component.CollectedSeedPreview(): kotlin.Unit + skippable: true + restartable: true + params: + +@Composable +internal fun com.ninecraft.booket.feature.detail.book.component.CollectedSeeds(seedsStats: kotlinx.collections.immutable.ImmutableList, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - seedsStats: STABLE (known stable type) + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +internal fun com.ninecraft.booket.feature.detail.book.component.DetailMenuBottomSheet(onDismissRequest: kotlin.Function0, sheetState: androidx.compose.material3.SheetState, onDeleteBookClick: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - onDismissRequest: STABLE (function type) + - sheetState: STABLE (marked @Stable or @Immutable) + - onDeleteBookClick: STABLE (function type) + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +private fun com.ninecraft.booket.feature.detail.book.component.DetailMenuItem(iconResId: kotlin.Int, iconDescription: kotlin.String, label: kotlin.String, color: androidx.compose.ui.graphics.Color, onClick: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - iconResId: STABLE (primitive type) + - iconDescription: STABLE (String is immutable) + - label: STABLE (String is immutable) + - color: STABLE (marked @Stable or @Immutable) + - onClick: STABLE (function type) + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +internal fun com.ninecraft.booket.feature.detail.book.component.EmotionAnalysisResultText(emotions: kotlinx.collections.immutable.ImmutableList, brandColor: androidx.compose.ui.graphics.Color, secondaryColor: androidx.compose.ui.graphics.Color, emotionTextStyle: androidx.compose.ui.text.TextStyle, regularTextStyle: androidx.compose.ui.text.TextStyle): androidx.compose.ui.text.AnnotatedString? + skippable: true + restartable: true + params: + - emotions: STABLE (known stable type) + - brandColor: STABLE (marked @Stable or @Immutable) + - secondaryColor: STABLE (marked @Stable or @Immutable) + - emotionTextStyle: STABLE (marked @Stable or @Immutable) + - regularTextStyle: STABLE (marked @Stable or @Immutable) + +@Composable +private fun com.ninecraft.booket.feature.detail.book.component.EmotionTextAllCasesPreview(): kotlin.Unit + skippable: true + restartable: true + params: + +@Composable +internal fun com.ninecraft.booket.feature.detail.book.component.ReadingRecordsHeader(totalCount: kotlin.Int, currentRecordSort: com.ninecraft.booket.feature.detail.book.RecordSort, onReadingRecordClick: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - totalCount: STABLE (primitive type) + - currentRecordSort: STABLE + - onReadingRecordClick: STABLE (function type) + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +private fun com.ninecraft.booket.feature.detail.book.component.ReadingRecordsHeaderPreview(): kotlin.Unit + skippable: true + restartable: true + params: + +@Composable +internal fun com.ninecraft.booket.feature.detail.book.component.RecordItem(recordInfo: com.ninecraft.booket.core.model.ReadingRecordModel, onRecordMenuClick: kotlin.Function1, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - recordInfo: STABLE (marked @Stable or @Immutable) + - onRecordMenuClick: STABLE (function type) + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +private fun com.ninecraft.booket.feature.detail.book.component.RecordItemPreview(): kotlin.Unit + skippable: true + restartable: true + params: + +@Composable +internal fun com.ninecraft.booket.feature.detail.book.component.RecordSortBottomSheet(onDismissRequest: kotlin.Function0, sheetState: androidx.compose.material3.SheetState, onCloseButtonClick: kotlin.Function0, recordSortItems: kotlinx.collections.immutable.ImmutableList, currentRecordSort: com.ninecraft.booket.feature.detail.book.RecordSort, onItemSelected: kotlin.Function1, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - onDismissRequest: STABLE (function type) + - sheetState: STABLE (marked @Stable or @Immutable) + - onCloseButtonClick: STABLE (function type) + - recordSortItems: STABLE (known stable type) + - currentRecordSort: STABLE + - onItemSelected: STABLE (function type) + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +private fun com.ninecraft.booket.feature.detail.book.component.RecordSortBottomSheetPreview(): kotlin.Unit + skippable: true + restartable: true + params: + +@Composable +public fun com.ninecraft.booket.feature.detail.book.component.RecordSortItem(item: com.ninecraft.booket.feature.detail.book.RecordSort, selected: kotlin.Boolean, onClick: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - item: STABLE + - selected: STABLE (primitive type) + - onClick: STABLE (function type) + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +internal fun com.ninecraft.booket.feature.detail.book.component.SeedItem(emotion: com.ninecraft.booket.core.model.EmotionModel, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - emotion: STABLE (marked @Stable or @Immutable) + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +private fun com.ninecraft.booket.feature.detail.book.component.SeedItemPreview(): kotlin.Unit + skippable: true + restartable: true + params: + +@Composable +internal fun com.ninecraft.booket.feature.detail.card.HandleRecordCardSideEffects(state: com.ninecraft.booket.feature.detail.card.RecordCardUiState, recordCardGraphicsLayer: androidx.compose.ui.graphics.layer.GraphicsLayer, eventSink: kotlin.Function1): kotlin.Unit skippable: false restartable: true params: - - state: RUNTIME (requires runtime check) + - state: STABLE + - recordCardGraphicsLayer: UNSTABLE (has mutable properties or unstable members) + - eventSink: STABLE (function type) + +@Composable +public fun com.ninecraft.booket.feature.detail.card.RecordCardPresenter.present(): com.ninecraft.booket.feature.detail.card.RecordCardUiState + skippable: true + restartable: true + params: + +@Composable +internal fun com.ninecraft.booket.feature.detail.card.RecordCardUi(state: com.ninecraft.booket.feature.detail.card.RecordCardUiState, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - state: STABLE + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +private fun com.ninecraft.booket.feature.detail.card.RecordCardUiPreview(): kotlin.Unit + skippable: true + restartable: true + params: + +@Composable +internal fun com.ninecraft.booket.feature.detail.card.component.RecordCard(quote: kotlin.String, bookTitle: kotlin.String, emotionTag: kotlin.String, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - quote: STABLE (String is immutable) + - bookTitle: STABLE (String is immutable) + - emotionTag: STABLE (String is immutable) + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +private fun com.ninecraft.booket.feature.detail.card.component.RecordCardPreview(): kotlin.Unit + skippable: true + restartable: true + params: + +@Composable +internal fun com.ninecraft.booket.feature.detail.record.HandleRecordDetailSideEffects(state: com.ninecraft.booket.feature.detail.record.RecordDetailUiState): kotlin.Unit + skippable: true + restartable: true + params: + - state: STABLE + +@Composable +private fun com.ninecraft.booket.feature.detail.record.RecordDetailContent(state: com.ninecraft.booket.feature.detail.record.RecordDetailUiState, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - state: STABLE - modifier: STABLE (marked @Stable or @Immutable) +@Composable +public fun com.ninecraft.booket.feature.detail.record.RecordDetailPresenter.present(): com.ninecraft.booket.feature.detail.record.RecordDetailUiState + skippable: true + restartable: true + params: + @Composable internal fun com.ninecraft.booket.feature.detail.record.RecordDetailUi(state: com.ninecraft.booket.feature.detail.record.RecordDetailUiState, modifier: androidx.compose.ui.Modifier): kotlin.Unit - skippable: false + skippable: true restartable: true params: - - state: RUNTIME (requires runtime check) + - state: STABLE - modifier: STABLE (marked @Stable or @Immutable) @Composable @@ -32,6 +306,68 @@ private fun com.ninecraft.booket.feature.detail.record.ReviewDetailPreview(): ko restartable: true params: +@Composable +internal fun com.ninecraft.booket.feature.detail.record.component.BookItem(imageUrl: kotlin.String, bookTitle: kotlin.String, author: kotlin.String, publisher: kotlin.String, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - imageUrl: STABLE (String is immutable) + - bookTitle: STABLE (String is immutable) + - author: STABLE (String is immutable) + - publisher: STABLE (String is immutable) + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +private fun com.ninecraft.booket.feature.detail.record.component.BookItemPreview(): kotlin.Unit + skippable: true + restartable: true + params: + +@Composable +private fun com.ninecraft.booket.feature.detail.record.component.ChoiceBottomSheetPreview(): kotlin.Unit + skippable: true + restartable: true + params: + +@Composable +private fun com.ninecraft.booket.feature.detail.record.component.QuoteBoxPreview(): kotlin.Unit + skippable: true + restartable: true + params: + +@Composable +internal fun com.ninecraft.booket.feature.detail.record.component.QuoteItem(quote: kotlin.String, page: kotlin.Int, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - quote: STABLE (String is immutable) + - page: STABLE (primitive type) + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +internal fun com.ninecraft.booket.feature.detail.record.component.RecordMenuBottomSheet(onDismissRequest: kotlin.Function0, sheetState: androidx.compose.material3.SheetState, onShareRecordClick: kotlin.Function0, onEditRecordClick: kotlin.Function0, onDeleteRecordClick: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - onDismissRequest: STABLE (function type) + - sheetState: STABLE (marked @Stable or @Immutable) + - onShareRecordClick: STABLE (function type) + - onEditRecordClick: STABLE (function type) + - onDeleteRecordClick: STABLE (function type) + - modifier: STABLE (marked @Stable or @Immutable) + +@Composable +private fun com.ninecraft.booket.feature.detail.record.component.RecordMenuItem(iconResId: kotlin.Int, iconDescription: kotlin.String, label: kotlin.String, color: androidx.compose.ui.graphics.Color, onClick: kotlin.Function0, modifier: androidx.compose.ui.Modifier): kotlin.Unit + skippable: true + restartable: true + params: + - iconResId: STABLE (primitive type) + - iconDescription: STABLE (String is immutable) + - label: STABLE (String is immutable) + - color: STABLE (marked @Stable or @Immutable) + - onClick: STABLE (function type) + - modifier: STABLE (marked @Stable or @Immutable) + @Composable private fun com.ninecraft.booket.feature.detail.record.component.ReviewBoxEmptyPreview(): kotlin.Unit skippable: true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b086333d..22d562d0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -24,7 +24,7 @@ androidx-compose-material3 = "1.4.0-alpha18" compose-stable-marker = "1.0.6" compose-effects = "0.1.1" compose-shadow = "2.0.4" -compose-stability-analyzer = "0.4.0" +compose-stability-analyzer = "0.4.1" ## Kotlin Symbol Processing ksp = "2.3.0"