Przeglądaj źródła

feat: 简单的替换

HapeLee 3 miesięcy temu
rodzic
commit
e2bc7daf76
100 zmienionych plików z 1406 dodań i 863 usunięć
  1. 7 0
      app/src/main/java/io/legado/app/constant/PreferKey.kt
  2. 14 0
      app/src/main/java/io/legado/app/data/repository/FeatureSettingsRepositories.kt
  3. 10 2
      app/src/main/java/io/legado/app/ui/about/AboutScreen.kt
  4. 4 3
      app/src/main/java/io/legado/app/ui/about/AboutSheets.kt
  5. 3 3
      app/src/main/java/io/legado/app/ui/about/CrashReportScreen.kt
  6. 14 6
      app/src/main/java/io/legado/app/ui/about/MiuixAboutScreen.kt
  7. 15 10
      app/src/main/java/io/legado/app/ui/ai/chat/AiChatScreen.kt
  8. 10 5
      app/src/main/java/io/legado/app/ui/ai/chat/AiGeneratedMessageContent.kt
  9. 3 5
      app/src/main/java/io/legado/app/ui/ai/chat/AiReasoningCard.kt
  10. 5 3
      app/src/main/java/io/legado/app/ui/ai/chat/AiThinkingCard.kt
  11. 12 10
      app/src/main/java/io/legado/app/ui/ai/chat/AiThinkingStepsCard.kt
  12. 10 4
      app/src/main/java/io/legado/app/ui/book/bookmark/AllBookmarkScreen.kt
  13. 8 5
      app/src/main/java/io/legado/app/ui/book/cache/manage/BookCacheManageScreen.kt
  14. 2 1
      app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceMigrationOptionsSheet.kt
  15. 3 2
      app/src/main/java/io/legado/app/ui/book/group/GroupEditSheet.kt
  16. 9 2
      app/src/main/java/io/legado/app/ui/book/import/local/ImportBookScreen.kt
  17. 6 6
      app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookScreen.kt
  18. 6 2
      app/src/main/java/io/legado/app/ui/book/info/BookInfoReadRecordSheet.kt
  19. 36 23
      app/src/main/java/io/legado/app/ui/book/info/BookInfoScreen.kt
  20. 6 3
      app/src/main/java/io/legado/app/ui/book/info/BookInfoSheets.kt
  21. 6 4
      app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditScreen.kt
  22. 8 7
      app/src/main/java/io/legado/app/ui/book/knowledge/BookCharacterDetailScreen.kt
  23. 15 9
      app/src/main/java/io/legado/app/ui/book/knowledge/BookCharacterListScreen.kt
  24. 4 3
      app/src/main/java/io/legado/app/ui/book/knowledge/BookCharacterNetworkScreen.kt
  25. 2 1
      app/src/main/java/io/legado/app/ui/book/knowledge/BookEventDetailScreen.kt
  26. 2 1
      app/src/main/java/io/legado/app/ui/book/knowledge/BookEventListScreen.kt
  27. 3 2
      app/src/main/java/io/legado/app/ui/book/knowledge/BookKnowledgeDetailScreen.kt
  28. 2 1
      app/src/main/java/io/legado/app/ui/book/knowledge/BookKnowledgeListScreen.kt
  29. 2 1
      app/src/main/java/io/legado/app/ui/book/knowledge/CharacterAvatarCropDialog.kt
  30. 3 2
      app/src/main/java/io/legado/app/ui/book/knowledge/KnowledgeSharedComponents.kt
  31. 22 12
      app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageScreen.kt
  32. 25 29
      app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt
  33. 3 2
      app/src/main/java/io/legado/app/ui/book/read/TextActionSelectionMenu.kt
  34. 8 5
      app/src/main/java/io/legado/app/ui/book/read/sheet/AiRewritePresetConfigSheet.kt
  35. 4 3
      app/src/main/java/io/legado/app/ui/book/read/sheet/AiTextCleanSheet.kt
  36. 12 7
      app/src/main/java/io/legado/app/ui/book/read/sheet/AiTextRewriteSheet.kt
  37. 6 7
      app/src/main/java/io/legado/app/ui/book/read/sheet/AutoReadSheet.kt
  38. 5 7
      app/src/main/java/io/legado/app/ui/book/read/sheet/BgTextConfigSheet.kt
  39. 2 1
      app/src/main/java/io/legado/app/ui/book/read/sheet/ChangeChapterSourceSheet.kt
  40. 4 3
      app/src/main/java/io/legado/app/ui/book/read/sheet/ChapterSummarySheet.kt
  41. 3 1
      app/src/main/java/io/legado/app/ui/book/read/sheet/CharsetConfigSheet.kt
  42. 6 4
      app/src/main/java/io/legado/app/ui/book/read/sheet/ClickActionConfigSheet.kt
  43. 4 3
      app/src/main/java/io/legado/app/ui/book/read/sheet/ContentEditSheet.kt
  44. 6 4
      app/src/main/java/io/legado/app/ui/book/read/sheet/ContentProcessesSheet.kt
  45. 2 1
      app/src/main/java/io/legado/app/ui/book/read/sheet/DownloadSheet.kt
  46. 6 3
      app/src/main/java/io/legado/app/ui/book/read/sheet/EffectiveReplacesSheet.kt
  47. 4 3
      app/src/main/java/io/legado/app/ui/book/read/sheet/EyeProtectionConfigSheet.kt
  48. 4 3
      app/src/main/java/io/legado/app/ui/book/read/sheet/FloatingBarIconConfigSheet.kt
  49. 10 5
      app/src/main/java/io/legado/app/ui/book/read/sheet/GlobalThemePage.kt
  50. 414 293
      app/src/main/java/io/legado/app/ui/book/read/sheet/HeaderFooterPage.kt
  51. 4 3
      app/src/main/java/io/legado/app/ui/book/read/sheet/HighlightRuleConfigSheet.kt
  52. 4 20
      app/src/main/java/io/legado/app/ui/book/read/sheet/HighlightRuleEditSheet.kt
  53. 4 8
      app/src/main/java/io/legado/app/ui/book/read/sheet/MoreConfigSheet.kt
  54. 6 3
      app/src/main/java/io/legado/app/ui/book/read/sheet/PaddingConfigSheet.kt
  55. 8 6
      app/src/main/java/io/legado/app/ui/book/read/sheet/PageKeyConfigSheet.kt
  56. 5 4
      app/src/main/java/io/legado/app/ui/book/read/sheet/ReadAloudConfigContent.kt
  57. 6 5
      app/src/main/java/io/legado/app/ui/book/read/sheet/ReadAloudScreen.kt
  58. 16 5
      app/src/main/java/io/legado/app/ui/book/read/sheet/ReadStyleSheet.kt
  59. 14 8
      app/src/main/java/io/legado/app/ui/book/read/sheet/ReaderBookSheet.kt
  60. 4 3
      app/src/main/java/io/legado/app/ui/book/read/sheet/ShadowSetSheet.kt
  61. 3 2
      app/src/main/java/io/legado/app/ui/book/read/sheet/SimulatedReadingSheet.kt
  62. 103 26
      app/src/main/java/io/legado/app/ui/book/read/sheet/SystemMenuPage.kt
  63. 11 7
      app/src/main/java/io/legado/app/ui/book/read/sheet/TextSelectMenuConfigSheet.kt
  64. 52 26
      app/src/main/java/io/legado/app/ui/book/read/sheet/TextTitleSheet.kt
  65. 4 9
      app/src/main/java/io/legado/app/ui/book/read/sheet/UnderlineConfigSheet.kt
  66. 46 16
      app/src/main/java/io/legado/app/ui/book/readRecord/ReadRecordOverviewScreen.kt
  67. 39 20
      app/src/main/java/io/legado/app/ui/book/readRecord/ReadRecordScreen.kt
  68. 9 2
      app/src/main/java/io/legado/app/ui/book/readRecord/component/ReadRecordCharts.kt
  69. 2 1
      app/src/main/java/io/legado/app/ui/book/readRecord/component/ReadRecordHeatmap.kt
  70. 10 3
      app/src/main/java/io/legado/app/ui/book/readRecord/component/ReadRecordListItems.kt
  71. 5 2
      app/src/main/java/io/legado/app/ui/book/readRecord/component/ReadRecordStats.kt
  72. 10 3
      app/src/main/java/io/legado/app/ui/book/readRecord/component/ReadRecordSummary.kt
  73. 3 2
      app/src/main/java/io/legado/app/ui/book/readaloud/casting/BookVoiceCastingScreen.kt
  74. 2 1
      app/src/main/java/io/legado/app/ui/book/readaloud/cloudtts/CloudTtsScreen.kt
  75. 20 7
      app/src/main/java/io/legado/app/ui/book/readaloud/player/ReadAloudPlayerScreen.kt
  76. 3 2
      app/src/main/java/io/legado/app/ui/book/search/ScopeSelectSheet.kt
  77. 29 10
      app/src/main/java/io/legado/app/ui/book/search/SearchScreen.kt
  78. 4 1
      app/src/main/java/io/legado/app/ui/book/search/SearchSourceSection.kt
  79. 12 6
      app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentScreen.kt
  80. 4 1
      app/src/main/java/io/legado/app/ui/book/toc/TocScreen.kt
  81. 8 10
      app/src/main/java/io/legado/app/ui/book/toc/rule/preview/TxtTocRulePreviewScreen.kt
  82. 7 3
      app/src/main/java/io/legado/app/ui/config/ai/AiProviderEditScreen.kt
  83. 5 3
      app/src/main/java/io/legado/app/ui/config/backupConfig/BackupConfigScreen.kt
  84. 5 3
      app/src/main/java/io/legado/app/ui/config/coverConfig/CoverAlbumManageScreen.kt
  85. 6 3
      app/src/main/java/io/legado/app/ui/config/coverConfig/CoverAlbumSelectSheet.kt
  86. 3 2
      app/src/main/java/io/legado/app/ui/config/coverConfig/CoverRuleConfigSheet.kt
  87. 3 3
      app/src/main/java/io/legado/app/ui/config/otherConfig/CheckSourceBottomSheet.kt
  88. 3 2
      app/src/main/java/io/legado/app/ui/config/otherConfig/DirectLinkUploadBottomSheet.kt
  89. 16 13
      app/src/main/java/io/legado/app/ui/config/readConfig/PageKeySheet.kt
  90. 3 3
      app/src/main/java/io/legado/app/ui/config/themeConfig/BackgroundImageManageSheet.kt
  91. 4 4
      app/src/main/java/io/legado/app/ui/config/themeConfig/LauncherIconPickerSheet.kt
  92. 4 3
      app/src/main/java/io/legado/app/ui/config/themeConfig/MainNavigationSettingsSheet.kt
  93. 6 3
      app/src/main/java/io/legado/app/ui/config/themeConfig/NavIconManageSheet.kt
  94. 47 28
      app/src/main/java/io/legado/app/ui/config/themeManage/EditThemeSheet.kt
  95. 9 5
      app/src/main/java/io/legado/app/ui/dict/DictSheet.kt
  96. 2 1
      app/src/main/java/io/legado/app/ui/highlightTagRule/HighlightTagRuleEditSheet.kt
  97. 2 1
      app/src/main/java/io/legado/app/ui/main/MainScreen.kt
  98. 27 25
      app/src/main/java/io/legado/app/ui/main/bookshelf/BookItem.kt
  99. 22 13
      app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfConfigSheet.kt
  100. 2 1
      app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfScreen.kt

+ 7 - 0
app/src/main/java/io/legado/app/constant/PreferKey.kt

@@ -239,6 +239,13 @@ object PreferKey {
     const val labelContainerColorNight = "colorMD3SurfaceContainerLowNight"
     const val labelContainerColorNight = "colorMD3SurfaceContainerLowNight"
     // 中间单线间隔设置
     // 中间单线间隔设置
     const val enableItemDivider = "enableItemDivider"
     const val enableItemDivider = "enableItemDivider"
+    const val enableContainerBackgroundImage = "enableContainerBackgroundImage"
+    const val appColumnBackgroundOpacity = "appColumnBackgroundOpacity"
+    const val glassCardBackgroundOpacity = "glassCardBackgroundOpacity"
+    const val largeContainerBackgroundImageLight = "largeContainerBackgroundImageLight"
+    const val largeContainerBackgroundImageDark = "largeContainerBackgroundImageDark"
+    const val itemBackgroundImageLight = "itemBackgroundImageLight"
+    const val itemBackgroundImageDark = "itemBackgroundImageDark"
     const val itemDividerWidth = "itemDividerWidth"
     const val itemDividerWidth = "itemDividerWidth"
     const val itemDividerLength = "itemDividerLength"
     const val itemDividerLength = "itemDividerLength"
     const val itemDividerColor = "itemDividerColor"
     const val itemDividerColor = "itemDividerColor"

+ 14 - 0
app/src/main/java/io/legado/app/data/repository/FeatureSettingsRepositories.kt

@@ -385,6 +385,13 @@ internal fun Preferences.toThemeSettings(): ThemeSettings = ThemeSettings(
     backgroundImageDark = compatDsString(PreferKey.bgImageN),
     backgroundImageDark = compatDsString(PreferKey.bgImageN),
     backgroundImageBlurring = compatDsInt(PreferKey.bgImageBlurring) ?: 0,
     backgroundImageBlurring = compatDsInt(PreferKey.bgImageBlurring) ?: 0,
     backgroundImageDarkBlurring = compatDsInt(PreferKey.bgImageNBlurring) ?: 0,
     backgroundImageDarkBlurring = compatDsInt(PreferKey.bgImageNBlurring) ?: 0,
+    largeContainerBackgroundImageLight = compatDsString(PreferKey.largeContainerBackgroundImageLight),
+    largeContainerBackgroundImageDark = compatDsString(PreferKey.largeContainerBackgroundImageDark),
+    itemBackgroundImageLight = compatDsString(PreferKey.itemBackgroundImageLight),
+    itemBackgroundImageDark = compatDsString(PreferKey.itemBackgroundImageDark),
+    enableContainerBackgroundImage = compatDsBoolean(PreferKey.enableContainerBackgroundImage) ?: false,
+    appColumnBackgroundOpacity = compatDsInt(PreferKey.appColumnBackgroundOpacity) ?: 100,
+    glassCardBackgroundOpacity = compatDsInt(PreferKey.glassCardBackgroundOpacity) ?: 100,
     enableItemDivider = compatDsBoolean(PreferKey.enableItemDivider) ?: false,
     enableItemDivider = compatDsBoolean(PreferKey.enableItemDivider) ?: false,
     itemDividerWidth = compatDsFloat(PreferKey.itemDividerWidth) ?: 1f,
     itemDividerWidth = compatDsFloat(PreferKey.itemDividerWidth) ?: 1f,
     itemDividerLength = compatDsFloat(PreferKey.itemDividerLength) ?: 80f,
     itemDividerLength = compatDsFloat(PreferKey.itemDividerLength) ?: 80f,
@@ -454,6 +461,13 @@ internal fun ThemeSettings.toGatewayPrefMap(): Map<String, Any?> = mapOf(
     PreferKey.bgImageN to backgroundImageDark,
     PreferKey.bgImageN to backgroundImageDark,
     PreferKey.bgImageBlurring to backgroundImageBlurring,
     PreferKey.bgImageBlurring to backgroundImageBlurring,
     PreferKey.bgImageNBlurring to backgroundImageDarkBlurring,
     PreferKey.bgImageNBlurring to backgroundImageDarkBlurring,
+    PreferKey.largeContainerBackgroundImageLight to largeContainerBackgroundImageLight,
+    PreferKey.largeContainerBackgroundImageDark to largeContainerBackgroundImageDark,
+    PreferKey.itemBackgroundImageLight to itemBackgroundImageLight,
+    PreferKey.itemBackgroundImageDark to itemBackgroundImageDark,
+    PreferKey.enableContainerBackgroundImage to enableContainerBackgroundImage,
+    PreferKey.appColumnBackgroundOpacity to appColumnBackgroundOpacity,
+    PreferKey.glassCardBackgroundOpacity to glassCardBackgroundOpacity,
     PreferKey.enableItemDivider to enableItemDivider,
     PreferKey.enableItemDivider to enableItemDivider,
     PreferKey.itemDividerWidth to itemDividerWidth,
     PreferKey.itemDividerWidth to itemDividerWidth,
     PreferKey.itemDividerLength to itemDividerLength,
     PreferKey.itemDividerLength to itemDividerLength,

+ 10 - 2
app/src/main/java/io/legado/app/ui/about/AboutScreen.kt

@@ -35,6 +35,7 @@ import io.legado.app.R
 import io.legado.app.constant.AppConst.appInfo
 import io.legado.app.constant.AppConst.appInfo
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.ThemeResolver
 import io.legado.app.ui.theme.ThemeResolver
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.SettingItemWithDivider
 import io.legado.app.ui.widget.components.SettingItemWithDivider
 import io.legado.app.ui.widget.components.SplicedColumnGroup
 import io.legado.app.ui.widget.components.SplicedColumnGroup
@@ -104,7 +105,7 @@ private fun MaterialAboutScreen(
             )
             )
         }
         }
     ) { padding ->
     ) { padding ->
-        Column(
+        AppColumn(
             modifier = Modifier
             modifier = Modifier
                 .padding(padding)
                 .padding(padding)
                 .verticalScroll(rememberScrollState())
                 .verticalScroll(rememberScrollState())
@@ -200,7 +201,14 @@ private fun MaterialAboutScreen(
                 SettingItemWithDivider {
                 SettingItemWithDivider {
                     SettingItem(
                     SettingItem(
                         title = stringResource(R.string.disclaimer),
                         title = stringResource(R.string.disclaimer),
-                        onClick = { onIntent(AboutIntent.ShowMdFile(disclaimerTitle, "disclaimer.md")) }
+                        onClick = {
+                            onIntent(
+                                AboutIntent.ShowMdFile(
+                                    disclaimerTitle,
+                                    "disclaimer.md"
+                                )
+                            )
+                        }
                     )
                     )
                 }
                 }
                 SettingItemWithDivider {
                 SettingItemWithDivider {

+ 4 - 3
app/src/main/java/io/legado/app/ui/about/AboutSheets.kt

@@ -24,6 +24,7 @@ import io.legado.app.R
 import io.legado.app.constant.AppConst.appInfo
 import io.legado.app.constant.AppConst.appInfo
 import io.legado.app.help.update.AppUpdate
 import io.legado.app.help.update.AppUpdate
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.button.PrimaryButton
 import io.legado.app.ui.widget.components.button.PrimaryButton
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.ui.widget.components.text.AppText
@@ -43,7 +44,7 @@ fun MarkdownSheet(
         title = title,
         title = title,
     ) {
     ) {
         SelectionContainer {
         SelectionContainer {
-            Column(
+            AppColumn(
                 modifier = Modifier
                 modifier = Modifier
                     .fillMaxWidth()
                     .fillMaxWidth()
                     .verticalScroll(rememberScrollState())
                     .verticalScroll(rememberScrollState())
@@ -78,8 +79,8 @@ fun UpdateSheet(
         onDismissRequest = onDismissRequest,
         onDismissRequest = onDismissRequest,
         title = title,
         title = title,
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .verticalScroll(rememberScrollState())
                 .verticalScroll(rememberScrollState())
         ) {
         ) {

+ 3 - 3
app/src/main/java/io/legado/app/ui/about/CrashReportScreen.kt

@@ -24,6 +24,7 @@ import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import androidx.compose.ui.unit.sp
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
 import io.legado.app.ui.widget.components.icon.AppIcons
 import io.legado.app.ui.widget.components.icon.AppIcons
@@ -60,14 +61,13 @@ fun CrashReportScreen(
             )
             )
         }
         }
     ) { padding ->
     ) { padding ->
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxSize()
                 .fillMaxSize()
                 .padding(padding)
                 .padding(padding)
                 .padding(horizontal = 16.dp, vertical = 12.dp),
                 .padding(horizontal = 16.dp, vertical = 12.dp),
             verticalArrangement = Arrangement.spacedBy(16.dp)
             verticalArrangement = Arrangement.spacedBy(16.dp)
         ) {
         ) {
-
             Icon(
             Icon(
                 imageVector = AppIcons.BugReport,
                 imageVector = AppIcons.BugReport,
                 contentDescription = null,
                 contentDescription = null,

+ 14 - 6
app/src/main/java/io/legado/app/ui/about/MiuixAboutScreen.kt

@@ -55,6 +55,7 @@ import io.legado.app.ui.util.pageContentPadding
 import io.legado.app.ui.util.pageScrollModifiers
 import io.legado.app.ui.util.pageScrollModifiers
 import io.legado.app.ui.util.rememberBlurBackdrop
 import io.legado.app.ui.util.rememberBlurBackdrop
 import io.legado.app.ui.util.shouldShowSplitPane
 import io.legado.app.ui.util.shouldShowSplitPane
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.effect.BgEffectBackground
 import io.legado.app.ui.widget.components.effect.BgEffectBackground
 import io.legado.app.ui.widget.components.effect.ColorBlendToken
 import io.legado.app.ui.widget.components.effect.ColorBlendToken
 import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton
 import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton
@@ -248,8 +249,8 @@ private fun AboutContent(
         bgModifier = if (backdrop != null) Modifier.layerBackdrop(backdrop) else Modifier,
         bgModifier = if (backdrop != null) Modifier.layerBackdrop(backdrop) else Modifier,
         alpha = { 1f - scrollProgress },
         alpha = { 1f - scrollProgress },
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(
                 .padding(
                     top = logoPadding.calculateTopPadding() + 52.dp,
                     top = logoPadding.calculateTopPadding() + 52.dp,
@@ -355,10 +356,10 @@ private fun AboutContent(
             }
             }
 
 
             item(key = "about") {
             item(key = "about") {
-                Column(
-                    modifier = Modifier
+                AppColumn(
+                    Modifier
                         .fillParentMaxHeight()
                         .fillParentMaxHeight()
-                        .padding(bottom = scrollPadding.calculateBottomPadding()),
+                        .padding(bottom = scrollPadding.calculateBottomPadding())
                 ) {
                 ) {
                     Card(
                     Card(
                         modifier = Modifier
                         modifier = Modifier
@@ -439,7 +440,14 @@ private fun AboutContent(
                         )
                         )
                         ArrowPreference(
                         ArrowPreference(
                             title = stringResource(R.string.license),
                             title = stringResource(R.string.license),
-                            onClick = { onIntent(AboutIntent.ShowMdFile(licenseTitle, "LICENSE.md")) },
+                            onClick = {
+                                onIntent(
+                                    AboutIntent.ShowMdFile(
+                                        licenseTitle,
+                                        "LICENSE.md"
+                                    )
+                                )
+                            },
                         )
                         )
                         ArrowPreference(
                         ArrowPreference(
                             title = stringResource(R.string.disclaimer),
                             title = stringResource(R.string.disclaimer),

+ 15 - 10
app/src/main/java/io/legado/app/ui/ai/chat/AiChatScreen.kt

@@ -91,6 +91,7 @@ import io.legado.app.domain.model.AiMessagePart
 import io.legado.app.domain.model.AiMessageRole
 import io.legado.app.domain.model.AiMessageRole
 import io.legado.app.domain.model.AiReasoningLevel
 import io.legado.app.domain.model.AiReasoningLevel
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
@@ -384,8 +385,8 @@ fun AiChatScreen(
                 }
                 }
 
 
                 // Draw behind both the floating input and the system navigation/IME area.
                 // Draw behind both the floating input and the system navigation/IME area.
-                Column(
-                    modifier = Modifier
+                AppColumn(
+                    Modifier
                         .align(Alignment.BottomCenter)
                         .align(Alignment.BottomCenter)
                         .fillMaxWidth()
                         .fillMaxWidth()
                 ) {
                 ) {
@@ -425,8 +426,8 @@ fun AiChatScreen(
                             .fillMaxWidth()
                             .fillMaxWidth()
                             .onSizeChanged { bottomOverlayHeightPx = it.height }
                             .onSizeChanged { bottomOverlayHeightPx = it.height }
                     ) {
                     ) {
-                        Column(
-                            modifier = Modifier
+                        AppColumn(
+                            Modifier
                                 .fillMaxWidth()
                                 .fillMaxWidth()
                                 .padding(top = 32.dp)
                                 .padding(top = 32.dp)
                         ) {
                         ) {
@@ -534,8 +535,8 @@ fun AiChatScreen(
                                 shape = RoundedCornerShape(50),
                                 shape = RoundedCornerShape(50),
                                 color = LegadoTheme.colorScheme.surfaceContainerLow
                                 color = LegadoTheme.colorScheme.surfaceContainerLow
                             ) {
                             ) {
-                                Column(
-                                    modifier = Modifier
+                                AppColumn(
+                                    Modifier
                                         .height(40.dp)
                                         .height(40.dp)
                                         .padding(horizontal = 12.dp),
                                         .padding(horizontal = 12.dp),
                                     horizontalAlignment = Alignment.Start,
                                     horizontalAlignment = Alignment.Start,
@@ -597,7 +598,9 @@ private fun PendingToolConfirmationCard(
             .fillMaxWidth()
             .fillMaxWidth()
             .padding(top = 8.dp)
             .padding(top = 8.dp)
     ) {
     ) {
-        Column(modifier = Modifier.padding(12.dp)) {
+        AppColumn(
+            Modifier.padding(12.dp)
+        ) {
             AppText(
             AppText(
                 text = stringResource(R.string.ai_tool_confirmation),
                 text = stringResource(R.string.ai_tool_confirmation),
                 style = LegadoTheme.typography.labelMedium,
                 style = LegadoTheme.typography.labelMedium,
@@ -727,8 +730,8 @@ private fun RecentChatsDrawer(
                         LegadoTheme.colorScheme.surface
                         LegadoTheme.colorScheme.surface
                     }
                     }
                 ) {
                 ) {
-                    Column(
-                        modifier = Modifier
+                    AppColumn(
+                        Modifier
                             .fillMaxWidth()
                             .fillMaxWidth()
                             .padding(horizontal = 12.dp, vertical = 10.dp)
                             .padding(horizontal = 12.dp, vertical = 10.dp)
                     ) {
                     ) {
@@ -906,7 +909,9 @@ private fun ChatInputBar(
                     .padding(horizontal = 16.dp, vertical = 14.dp),
                     .padding(horizontal = 16.dp, vertical = 14.dp),
                 verticalAlignment = Alignment.CenterVertically
                 verticalAlignment = Alignment.CenterVertically
             ) {
             ) {
-                Column(modifier = Modifier.weight(1f)) {
+                AppColumn(
+                    Modifier.weight(1f)
+                ) {
                     AppText(
                     AppText(
                         text = label,
                         text = label,
                         style = LegadoTheme.typography.bodyLarge,
                         style = LegadoTheme.typography.bodyLarge,

+ 10 - 5
app/src/main/java/io/legado/app/ui/ai/chat/AiGeneratedMessageContent.kt

@@ -43,6 +43,7 @@ import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.domain.model.AiMessagePart
 import io.legado.app.domain.model.AiMessagePart
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.button.series.SmallPlainButton
 import io.legado.app.ui.widget.components.button.series.SmallPlainButton
 import io.legado.app.ui.widget.components.image.cover.CoilBookCover
 import io.legado.app.ui.widget.components.image.cover.CoilBookCover
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.ui.widget.components.text.AppText
@@ -74,8 +75,8 @@ fun AiGeneratedMessageContent(
         .flatMap { block -> block.steps.filterIsInstance<AiThinkingStep.ToolStep>() }
         .flatMap { block -> block.steps.filterIsInstance<AiThinkingStep.ToolStep>() }
     val contentBlocks = groupedParts.filterIsInstance<AiMessagePartBlock.ContentBlock>()
     val contentBlocks = groupedParts.filterIsInstance<AiMessagePartBlock.ContentBlock>()
 
 
-    Column(
-        modifier = modifier.animateContentSize()
+    AppColumn(
+        modifier.animateContentSize()
     ) {
     ) {
         if (showHeader) {
         if (showHeader) {
             AppText(
             AppText(
@@ -264,7 +265,7 @@ private fun BookResultsList(
 ) {
 ) {
     if (books.isEmpty()) return
     if (books.isEmpty()) return
     Spacer(modifier = Modifier.height(10.dp))
     Spacer(modifier = Modifier.height(10.dp))
-    Column(
+    AppColumn(
         modifier = Modifier.fillMaxWidth(),
         modifier = Modifier.fillMaxWidth(),
         verticalArrangement = Arrangement.spacedBy(6.dp)
         verticalArrangement = Arrangement.spacedBy(6.dp)
     ) {
     ) {
@@ -306,7 +307,9 @@ private fun ChatBookResultItem(
                 .height(68.dp)
                 .height(68.dp)
         )
         )
         Spacer(modifier = Modifier.width(10.dp))
         Spacer(modifier = Modifier.width(10.dp))
-        Column(modifier = Modifier.weight(1f)) {
+        AppColumn(
+            Modifier.weight(1f)
+        ) {
             AppText(
             AppText(
                 text = book.name.ifBlank { book.bookUrl },
                 text = book.name.ifBlank { book.bookUrl },
                 style = LegadoTheme.typography.titleSmall,
                 style = LegadoTheme.typography.titleSmall,
@@ -372,7 +375,9 @@ private fun TracePanel(
 ) {
 ) {
     var expanded by rememberSaveable(title) { mutableStateOf(false) }
     var expanded by rememberSaveable(title) { mutableStateOf(false) }
 
 
-    Column(modifier = Modifier.fillMaxWidth()) {
+    AppColumn(
+        Modifier.fillMaxWidth()
+    ) {
         Row(
         Row(
             modifier = Modifier
             modifier = Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()

+ 3 - 5
app/src/main/java/io/legado/app/ui/ai/chat/AiReasoningCard.kt

@@ -45,6 +45,7 @@ import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.ui.widget.components.text.AppText
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.isActive
 import kotlinx.coroutines.isActive
@@ -129,12 +130,11 @@ fun ReasoningCard(
     val (state, loading) = rememberReasoningState(text, isStreaming, messageCreatedAt)
     val (state, loading) = rememberReasoningState(text, isStreaming, messageCreatedAt)
     val fadeHeight = 64f
     val fadeHeight = 64f
 
 
-    Column(
-        modifier = modifier
+    AppColumn(
+        modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .animateContentSize()
             .animateContentSize()
     ) {
     ) {
-        // Header row
         Row(
         Row(
             modifier = Modifier
             modifier = Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
@@ -193,8 +193,6 @@ fun ReasoningCard(
                 tint = LegadoTheme.colorScheme.outline
                 tint = LegadoTheme.colorScheme.outline
             )
             )
         }
         }
-
-        // Content area
         if (state.expandState != ReasoningCardState.Collapsed) {
         if (state.expandState != ReasoningCardState.Collapsed) {
             val isPreview = state.expandState == ReasoningCardState.Preview
             val isPreview = state.expandState == ReasoningCardState.Preview
             val contentModifier = Modifier
             val contentModifier = Modifier

+ 5 - 3
app/src/main/java/io/legado/app/ui/ai/chat/AiThinkingCard.kt

@@ -30,6 +30,7 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
 import io.legado.app.domain.model.AiMessagePart
 import io.legado.app.domain.model.AiMessagePart
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.TextCard
 import io.legado.app.ui.widget.components.card.TextCard
 import io.legado.app.ui.widget.components.icon.AppIcon
 import io.legado.app.ui.widget.components.icon.AppIcon
@@ -133,7 +134,7 @@ fun AiThinkingCard(
             enter = expandVertically(),
             enter = expandVertically(),
             exit = shrinkVertically()
             exit = shrinkVertically()
         ) {
         ) {
-            Column(
+            io.legado.app.ui.widget.components.AppColumn(
                 modifier = Modifier
                 modifier = Modifier
                     .fillMaxWidth()
                     .fillMaxWidth()
                     .heightIn(max = 400.dp)
                     .heightIn(max = 400.dp)
@@ -152,6 +153,7 @@ fun AiThinkingCard(
                                     .padding(horizontal = 12.dp, vertical = 10.dp)
                                     .padding(horizontal = 12.dp, vertical = 10.dp)
                             )
                             )
                         }
                         }
+
                         is AiThinkingStep.ToolStep -> {
                         is AiThinkingStep.ToolStep -> {
                             ToolStepContent(tool = step.tool)
                             ToolStepContent(tool = step.tool)
                         }
                         }
@@ -166,8 +168,8 @@ fun AiThinkingCard(
 private fun ToolStepContent(tool: AiMessagePart.Tool) {
 private fun ToolStepContent(tool: AiMessagePart.Tool) {
     val hasContent = tool.output.isNotBlank() || tool.input.isNotBlank()
     val hasContent = tool.output.isNotBlank() || tool.input.isNotBlank()
 
 
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .padding(start = 12.dp, end = 12.dp, top = 10.dp, bottom = 10.dp)
             .padding(start = 12.dp, end = 12.dp, top = 10.dp, bottom = 10.dp)
     ) {
     ) {

+ 12 - 10
app/src/main/java/io/legado/app/ui/ai/chat/AiThinkingStepsCard.kt

@@ -37,7 +37,9 @@ import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.domain.model.AiMessagePart
 import io.legado.app.domain.model.AiMessagePart
+import io.legado.app.domain.model.AiToolApprovalState
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.ui.widget.components.text.AppText
 
 
@@ -68,12 +70,11 @@ fun AiThinkingStepsCard(
     NormalCard(
     NormalCard(
         modifier = modifier.fillMaxWidth(),
         modifier = modifier.fillMaxWidth(),
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .animateContentSize()
                 .animateContentSize()
                 .padding(horizontal = 12.dp, vertical = 8.dp)
                 .padding(horizontal = 12.dp, vertical = 8.dp)
         ) {
         ) {
-            // Collapse/expand toggle - no padding, ripple clipped by card
             if (canCollapse) {
             if (canCollapse) {
                 Row(
                 Row(
                     modifier = Modifier
                     modifier = Modifier
@@ -95,15 +96,16 @@ fun AiThinkingStepsCard(
                         text = if (expanded) {
                         text = if (expanded) {
                             stringResource(R.string.ai_thinking_collapse)
                             stringResource(R.string.ai_thinking_collapse)
                         } else {
                         } else {
-                            stringResource(R.string.ai_thinking_show_more, steps.size - collapsedVisibleCount)
+                            stringResource(
+                                R.string.ai_thinking_show_more,
+                                steps.size - collapsedVisibleCount
+                            )
                         },
                         },
                         style = LegadoTheme.typography.labelMedium,
                         style = LegadoTheme.typography.labelMedium,
                         color = LegadoTheme.colorScheme.primary,
                         color = LegadoTheme.colorScheme.primary,
                     )
                     )
                 }
                 }
             }
             }
-
-            // Content
             Column {
             Column {
                 visibleSteps.forEachIndexed { index, step ->
                 visibleSteps.forEachIndexed { index, step ->
                     ThinkingStepRow(
                     ThinkingStepRow(
@@ -157,7 +159,8 @@ private fun ToolStepRow(
     var expanded by remember { mutableStateOf(false) }
     var expanded by remember { mutableStateOf(false) }
     val hasContent = tool.input.isNotBlank() || tool.output.isNotBlank()
     val hasContent = tool.input.isNotBlank() || tool.output.isNotBlank()
 
 
-    Column {
+    AppColumn(
+    ) {
         Row(
         Row(
             modifier = Modifier
             modifier = Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
@@ -200,8 +203,9 @@ private fun ToolStepRow(
             // Status
             // Status
             val statusText = when {
             val statusText = when {
                 tool.output.isNotBlank() -> stringResource(R.string.ai_tool_done)
                 tool.output.isNotBlank() -> stringResource(R.string.ai_tool_done)
-                tool.approvalState == io.legado.app.domain.model.AiToolApprovalState.PENDING ->
+                tool.approvalState == AiToolApprovalState.PENDING ->
                     stringResource(R.string.ai_tool_pending)
                     stringResource(R.string.ai_tool_pending)
+
                 else -> stringResource(R.string.ai_tool_running)
                 else -> stringResource(R.string.ai_tool_running)
             }
             }
             AppText(
             AppText(
@@ -219,8 +223,6 @@ private fun ToolStepRow(
                 )
                 )
             }
             }
         }
         }
-
-        // Expandable tool details
         AnimatedVisibility(
         AnimatedVisibility(
             visible = expanded,
             visible = expanded,
             enter = fadeIn() + expandVertically(),
             enter = fadeIn() + expandVertically(),

+ 10 - 4
app/src/main/java/io/legado/app/ui/book/bookmark/AllBookmarkScreen.kt

@@ -76,6 +76,7 @@ import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.ui.widget.components.topbar.GlassMediumFlexibleTopAppBar
 import io.legado.app.ui.widget.components.topbar.GlassMediumFlexibleTopAppBar
 import io.legado.app.ui.widget.components.topbar.GlassTopAppBarDefaults
 import io.legado.app.ui.widget.components.topbar.GlassTopAppBarDefaults
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import io.legado.app.ui.widget.components.AppColumn
 import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.launch
 import org.koin.androidx.compose.koinViewModel
 import org.koin.androidx.compose.koinViewModel
@@ -167,7 +168,8 @@ fun AllBookmarkScreen(
     AppScaffold(
     AppScaffold(
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         topBar = {
         topBar = {
-            Column {
+            AppColumn(
+            ) {
                 GlassMediumFlexibleTopAppBar(
                 GlassMediumFlexibleTopAppBar(
                     title = stringResource(R.string.all_bookmark),
                     title = stringResource(R.string.all_bookmark),
                     scrollBehavior = scrollBehavior,
                     scrollBehavior = scrollBehavior,
@@ -242,8 +244,8 @@ fun AllBookmarkScreen(
             }
             }
         }
         }
     ) { paddingValues ->
     ) { paddingValues ->
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxSize()
                 .fillMaxSize()
         ) {
         ) {
             AnimatedContent(
             AnimatedContent(
@@ -307,7 +309,11 @@ fun AllBookmarkScreen(
                                             subtitle = headerKey.bookAuthor,
                                             subtitle = headerKey.bookAuthor,
                                             isCollapsed = isCollapsed,
                                             isCollapsed = isCollapsed,
                                             onToggle = {
                                             onToggle = {
-                                                onIntent(AllBookmarkIntent.ToggleGroupCollapse(headerKey))
+                                                onIntent(
+                                                    AllBookmarkIntent.ToggleGroupCollapse(
+                                                        headerKey
+                                                    )
+                                                )
                                             },
                                             },
                                             isMiuix = isMiuix
                                             isMiuix = isMiuix
                                         )
                                         )

+ 8 - 5
app/src/main/java/io/legado/app/ui/book/cache/manage/BookCacheManageScreen.kt

@@ -46,6 +46,7 @@ import io.legado.app.R
 import io.legado.app.data.entities.BookGroup
 import io.legado.app.data.entities.BookGroup
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveContentPadding
 import io.legado.app.ui.theme.adaptiveContentPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
@@ -220,7 +221,7 @@ private fun BookCacheManageScreen(
         }
         }
     ) { paddingValues ->
     ) { paddingValues ->
         if (state.isLoading) {
         if (state.isLoading) {
-            Column(
+            AppColumn(
                 modifier = Modifier
                 modifier = Modifier
                     .fillMaxSize()
                     .fillMaxSize()
                     .padding(paddingValues),
                     .padding(paddingValues),
@@ -419,8 +420,8 @@ private fun BookCacheBookCard(
         onClick = onToggleExpanded,
         onClick = onToggleExpanded,
         containerColor = LegadoTheme.colorScheme.surfaceContainer
         containerColor = LegadoTheme.colorScheme.surfaceContainer
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(12.dp),
                 .padding(12.dp),
             verticalArrangement = Arrangement.spacedBy(8.dp)
             verticalArrangement = Arrangement.spacedBy(8.dp)
@@ -492,10 +493,12 @@ private fun BookCacheBookCard(
                                 R.string.pause_book_download,
                                 R.string.pause_book_download,
                                 item.name
                                 item.name
                             )
                             )
+
                             item.isPaused -> stringResource(
                             item.isPaused -> stringResource(
                                 R.string.resume_book_download,
                                 R.string.resume_book_download,
                                 item.name
                                 item.name
                             )
                             )
+
                             else -> stringResource(R.string.start_book_download, item.name)
                             else -> stringResource(R.string.start_book_download, item.name)
                         }
                         }
                     )
                     )
@@ -540,8 +543,8 @@ private fun BookCacheChapterRow(
         horizontalArrangement = Arrangement.spacedBy(8.dp),
         horizontalArrangement = Arrangement.spacedBy(8.dp),
         verticalAlignment = Alignment.CenterVertically
         verticalAlignment = Alignment.CenterVertically
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .weight(1f)
                 .weight(1f)
                 .semantics(mergeDescendants = true) {
                 .semantics(mergeDescendants = true) {
                     contentDescription = chapterDescription
                     contentDescription = chapterDescription

+ 2 - 1
app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceMigrationOptionsSheet.kt

@@ -17,6 +17,7 @@ import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.domain.usecase.ChangeSourceMigrationOptions
 import io.legado.app.domain.usecase.ChangeSourceMigrationOptions
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
 import io.legado.app.ui.widget.components.checkBox.CheckboxItem
 import io.legado.app.ui.widget.components.checkBox.CheckboxItem
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
@@ -58,7 +59,7 @@ fun ChangeSourceMigrationOptionsSheet(
         onDismissRequest = onDismissRequest,
         onDismissRequest = onDismissRequest,
         title = title,
         title = title,
     ) {
     ) {
-        Column(
+        AppColumn(
             modifier = Modifier.fillMaxWidth(),
             modifier = Modifier.fillMaxWidth(),
             verticalArrangement = Arrangement.spacedBy(4.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
         ) {
         ) {

+ 3 - 2
app/src/main/java/io/legado/app/ui/book/group/GroupEditSheet.kt

@@ -32,6 +32,7 @@ import io.legado.app.R
 import io.legado.app.data.entities.BookGroup
 import io.legado.app.data.entities.BookGroup
 import io.legado.app.data.entities.TagGroupRule
 import io.legado.app.data.entities.TagGroupRule
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
@@ -139,8 +140,8 @@ fun GroupEditContent(
         }
         }
     }
     }
 
 
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .padding(bottom = 16.dp)
             .padding(bottom = 16.dp)
             .verticalScroll(rememberScrollState()),
             .verticalScroll(rememberScrollState()),

+ 9 - 2
app/src/main/java/io/legado/app/ui/book/import/local/ImportBookScreen.kt

@@ -56,6 +56,7 @@ import io.legado.app.lib.dialogs.alert
 import io.legado.app.lib.dialogs.selector
 import io.legado.app.lib.dialogs.selector
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.widget.components.ActionItem
 import io.legado.app.ui.widget.components.ActionItem
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppPullToRefresh
 import io.legado.app.ui.widget.components.AppPullToRefresh
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.SelectionActions
 import io.legado.app.ui.widget.components.SelectionActions
@@ -530,7 +531,9 @@ private fun ImportBookItem(
 
 
             Spacer(modifier = Modifier.width(16.dp))
             Spacer(modifier = Modifier.width(16.dp))
 
 
-            Column(modifier = Modifier.weight(1f)) {
+            AppColumn(
+                modifier = Modifier.weight(1f)
+            ) {
                 AppText(
                 AppText(
                     text = item.name,
                     text = item.name,
                     style = LegadoTheme.typography.bodyMedium,
                     style = LegadoTheme.typography.bodyMedium,
@@ -551,7 +554,11 @@ private fun ImportBookItem(
                         )
                         )
                         Spacer(modifier = Modifier.width(6.dp))
                         Spacer(modifier = Modifier.width(6.dp))
                         AppText(
                         AppText(
-                            text = "${ConvertUtils.formatFileSize(item.size)} - ${AppConst.dateFormat.format(item.lastModified)}",
+                            text = "${ConvertUtils.formatFileSize(item.size)} - ${
+                                AppConst.dateFormat.format(
+                                    item.lastModified
+                                )
+                            }",
                             style = LegadoTheme.typography.labelMedium,
                             style = LegadoTheme.typography.labelMedium,
                             color = LegadoTheme.colorScheme.onSurfaceVariant
                             color = LegadoTheme.colorScheme.onSurfaceVariant
                         )
                         )

+ 6 - 6
app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookScreen.kt

@@ -69,6 +69,7 @@ import io.legado.app.lib.dialogs.selector
 import io.legado.app.model.remote.RemoteBook
 import io.legado.app.model.remote.RemoteBook
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.widget.components.ActionItem
 import io.legado.app.ui.widget.components.ActionItem
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppPullToRefresh
 import io.legado.app.ui.widget.components.AppPullToRefresh
 import io.legado.app.ui.widget.components.AppRadioButton
 import io.legado.app.ui.widget.components.AppRadioButton
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
@@ -395,8 +396,8 @@ private fun ServersSheetContent(
     onDelete: (Server) -> Unit,
     onDelete: (Server) -> Unit,
     onDefault: () -> Unit
     onDefault: () -> Unit
 ) {
 ) {
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .navigationBarsPadding()
             .navigationBarsPadding()
             .padding(bottom = 8.dp)
             .padding(bottom = 8.dp)
@@ -493,8 +494,8 @@ private fun ServerConfigSheetContent(
     var password by remember { mutableStateOf(configJson.optString("password")) }
     var password by remember { mutableStateOf(configJson.optString("password")) }
     var passwordVisible by remember { mutableStateOf(false) }
     var passwordVisible by remember { mutableStateOf(false) }
 
 
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .navigationBarsPadding()
             .navigationBarsPadding()
             .verticalScroll(rememberScrollState())
             .verticalScroll(rememberScrollState())
@@ -684,10 +685,9 @@ private fun RemoteBookItem(
 
 
             Spacer(modifier = Modifier.width(16.dp))
             Spacer(modifier = Modifier.width(16.dp))
 
 
-            Column(
+            AppColumn(
                 modifier = Modifier.weight(1f)
                 modifier = Modifier.weight(1f)
             ) {
             ) {
-
                 AppText(
                 AppText(
                     text = book.filename.substringBeforeLast("."),
                     text = book.filename.substringBeforeLast("."),
                     style = LegadoTheme.typography.bodyMedium,
                     style = LegadoTheme.typography.bodyMedium,

+ 6 - 2
app/src/main/java/io/legado/app/ui/book/info/BookInfoReadRecordSheet.kt

@@ -28,6 +28,7 @@ import io.legado.app.R
 import io.legado.app.data.entities.readRecord.ReadRecordSession
 import io.legado.app.data.entities.readRecord.ReadRecordSession
 import io.legado.app.data.entities.readRecord.ReadRecordTimelineDay
 import io.legado.app.data.entities.readRecord.ReadRecordTimelineDay
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.card.TextCard
 import io.legado.app.ui.widget.components.card.TextCard
@@ -64,7 +65,8 @@ fun BookReadRecordSheet(
                     contentDescription = null,
                     contentDescription = null,
                     tint = LegadoTheme.colorScheme.primary
                     tint = LegadoTheme.colorScheme.primary
                 )
                 )
-                Column {
+                AppColumn(
+                ) {
                     AppText(
                     AppText(
                         text = stringResource(R.string.all_read_time),
                         text = stringResource(R.string.all_read_time),
                         style = LegadoTheme.typography.labelMedium,
                         style = LegadoTheme.typography.labelMedium,
@@ -140,7 +142,9 @@ private fun TimelineSessionRow(session: ReadRecordSession) {
         verticalAlignment = Alignment.CenterVertically
         verticalAlignment = Alignment.CenterVertically
     ) {
     ) {
         Spacer(modifier = Modifier.width(8.dp))
         Spacer(modifier = Modifier.width(8.dp))
-        Column(modifier = Modifier.weight(1f)) {
+        AppColumn(
+            Modifier.weight(1f)
+        ) {
             AppText(
             AppText(
                 text = DateUtil.format(Date(session.endTime), "HH:mm"),
                 text = DateUtil.format(Date(session.endTime), "HH:mm"),
                 style = LegadoTheme.typography.bodyMedium,
                 style = LegadoTheme.typography.bodyMedium,

+ 36 - 23
app/src/main/java/io/legado/app/ui/book/info/BookInfoScreen.kt

@@ -83,6 +83,7 @@ import io.legado.app.R
 import io.legado.app.constant.BookType
 import io.legado.app.constant.BookType
 import io.legado.app.data.entities.SearchBook
 import io.legado.app.data.entities.SearchBook
 import io.legado.app.data.entities.BookGroup
 import io.legado.app.data.entities.BookGroup
+import io.legado.app.ui.main.homepage.HomepageBookItemUi
 import io.legado.app.ui.main.homepage.modules.BannerModule
 import io.legado.app.ui.main.homepage.modules.BannerModule
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LocalHazeState
 import io.legado.app.ui.theme.LocalHazeState
@@ -95,6 +96,7 @@ import io.legado.app.ui.theme.fadingEdge
 import io.legado.app.ui.theme.rememberImageSeedColor
 import io.legado.app.ui.theme.rememberImageSeedColor
 import io.legado.app.ui.theme.rememberThemeOverride
 import io.legado.app.ui.theme.rememberThemeOverride
 import io.legado.app.ui.theme.responsiveHazeEffectFixedStyle
 import io.legado.app.ui.theme.responsiveHazeEffectFixedStyle
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppPullToRefresh
 import io.legado.app.ui.widget.components.AppPullToRefresh
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
@@ -303,8 +305,8 @@ private fun BookInfoScreenContent(
                             )
                             )
                         }
                         }
                         item {
                         item {
-                            Column(
-                                modifier = Modifier
+                            AppColumn(
+                                Modifier
                                     .fillMaxWidth()
                                     .fillMaxWidth()
                                     .background(
                                     .background(
                                         color = LegadoTheme.colorScheme.surface
                                         color = LegadoTheme.colorScheme.surface
@@ -351,7 +353,12 @@ private fun BookInfoScreenContent(
                                             onIntent(BookInfoIntent.RelatedBookClick(book))
                                             onIntent(BookInfoIntent.RelatedBookClick(book))
                                         },
                                         },
                                         onMoreClick = {
                                         onMoreClick = {
-                                            onIntent(BookInfoIntent.RelatedBooksMore(module.title, module.resolvedUrl))
+                                            onIntent(
+                                                BookInfoIntent.RelatedBooksMore(
+                                                    module.title,
+                                                    module.resolvedUrl
+                                                )
+                                            )
                                         },
                                         },
                                     )
                                     )
                                 }
                                 }
@@ -887,8 +894,8 @@ private fun BookInfoHeader(
     sharedCoverKey: String?,
     sharedCoverKey: String?,
 ) {
 ) {
     val coverDescription = stringResource(R.string.a11y_book_cover_actions, book.name)
     val coverDescription = stringResource(R.string.a11y_book_cover_actions, book.name)
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .background(
             .background(
                 Brush.verticalGradient(
                 Brush.verticalGradient(
@@ -1134,8 +1141,8 @@ private fun BookInfoActionCard(
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
         contentColor = LegadoTheme.colorScheme.onSurface,
         contentColor = LegadoTheme.colorScheme.onSurface,
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(horizontal = 8.dp, vertical = 12.dp),
                 .padding(horizontal = 8.dp, vertical = 12.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
@@ -1157,15 +1164,18 @@ private fun BookInfoSummary(
     tocLoadFailed: Boolean,
     tocLoadFailed: Boolean,
     onRemarkClick: () -> Unit,
     onRemarkClick: () -> Unit,
 ) {
 ) {
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .background(LegadoTheme.colorScheme.surface)
             .background(LegadoTheme.colorScheme.surface)
             .padding(start = 16.dp, end = 16.dp, top = 8.dp, bottom = 120.dp),
             .padding(start = 16.dp, end = 16.dp, top = 8.dp, bottom = 120.dp),
         verticalArrangement = Arrangement.spacedBy(4.dp)
         verticalArrangement = Arrangement.spacedBy(4.dp)
     ) {
     ) {
         AnimatedTextLine(
         AnimatedTextLine(
-            text = stringResource(R.string.toc_s, book.durChapterTitle ?: stringResource(R.string.loading)),
+            text = stringResource(
+                R.string.toc_s,
+                book.durChapterTitle ?: stringResource(R.string.loading)
+            ),
             style = LegadoTheme.typography.titleMedium,
             style = LegadoTheme.typography.titleMedium,
             fontWeight = FontWeight.Bold,
             fontWeight = FontWeight.Bold,
         )
         )
@@ -1217,7 +1227,10 @@ private fun BookInfoSummary(
                 onClick = onRemarkClick,
                 onClick = onRemarkClick,
                 containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
                 containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
             ) {
             ) {
-                Column(modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(4.dp)) {
+                Column(
+                    modifier = Modifier.padding(16.dp),
+                    verticalArrangement = Arrangement.spacedBy(4.dp)
+                ) {
                     AnimatedTextLine(
                     AnimatedTextLine(
                         text = remark,
                         text = remark,
                         style = LegadoTheme.typography.labelMediumEmphasized
                         style = LegadoTheme.typography.labelMediumEmphasized
@@ -1352,8 +1365,8 @@ private fun RelatedBooksBanner(
     onBookClick: (SearchBook, String?) -> Unit,
     onBookClick: (SearchBook, String?) -> Unit,
     onMoreClick: () -> Unit,
     onMoreClick: () -> Unit,
 ) {
 ) {
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .padding(bottom = 16.dp)
             .padding(bottom = 16.dp)
     ) {
     ) {
@@ -1378,7 +1391,7 @@ private fun RelatedBooksBanner(
             }
             }
         }
         }
         BannerModule(
         BannerModule(
-            books = books.map { io.legado.app.ui.main.homepage.HomepageBookItemUi(book = it) }
+            books = books.map { HomepageBookItemUi(book = it) }
                 .toImmutableList(),
                 .toImmutableList(),
             onClick = onBookClick,
             onClick = onBookClick,
             modifier = Modifier
             modifier = Modifier
@@ -1397,8 +1410,8 @@ private fun BookInfoCharacters(
     onKnowledgeClick: () -> Unit,
     onKnowledgeClick: () -> Unit,
     onEventsClick: () -> Unit,
     onEventsClick: () -> Unit,
 ) {
 ) {
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .background(LegadoTheme.colorScheme.surface)
             .background(LegadoTheme.colorScheme.surface)
             .padding(vertical = 8.dp),
             .padding(vertical = 8.dp),
@@ -1477,7 +1490,7 @@ private fun CharacterEntryCard(
         onClick = onClick,
         onClick = onClick,
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
     ) {
     ) {
-        Column(
+        AppColumn(
             modifier = Modifier.padding(10.dp),
             modifier = Modifier.padding(10.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
         ) {
         ) {
@@ -1548,8 +1561,8 @@ private fun BookInfoKnowledge(
     onViewAllClick: () -> Unit,
     onViewAllClick: () -> Unit,
 ) {
 ) {
     if (entries.isEmpty()) return
     if (entries.isEmpty()) return
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .background(LegadoTheme.colorScheme.surface)
             .background(LegadoTheme.colorScheme.surface)
             .padding(vertical = 8.dp),
             .padding(vertical = 8.dp),
@@ -1600,7 +1613,7 @@ private fun KnowledgeInfoCard(
         modifier = Modifier.width(140.dp),
         modifier = Modifier.width(140.dp),
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
     ) {
     ) {
-        Column(
+        AppColumn(
             modifier = Modifier.padding(12.dp),
             modifier = Modifier.padding(12.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
         ) {
         ) {
@@ -1625,8 +1638,8 @@ private fun BookInfoEvents(
     onViewAllClick: () -> Unit,
     onViewAllClick: () -> Unit,
 ) {
 ) {
     if (events.isEmpty()) return
     if (events.isEmpty()) return
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .background(LegadoTheme.colorScheme.surface)
             .background(LegadoTheme.colorScheme.surface)
             .padding(vertical = 8.dp),
             .padding(vertical = 8.dp),
@@ -1680,7 +1693,7 @@ private fun EventInfoCard(
         modifier = Modifier.width(160.dp),
         modifier = Modifier.width(160.dp),
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
     ) {
     ) {
-        Column(
+        AppColumn(
             modifier = Modifier.padding(12.dp),
             modifier = Modifier.padding(12.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
         ) {
         ) {

+ 6 - 3
app/src/main/java/io/legado/app/ui/book/info/BookInfoSheets.kt

@@ -69,6 +69,7 @@ import io.legado.app.ui.book.search.ScopeSelectSheet
 import io.legado.app.ui.book.source.edit.BookSourceEditActivity
 import io.legado.app.ui.book.source.edit.BookSourceEditActivity
 import io.legado.app.ui.book.source.manage.BookSourceActivity
 import io.legado.app.ui.book.source.manage.BookSourceActivity
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
@@ -160,7 +161,9 @@ fun GroupSelectSheet(
             )
             )
         }
         }
     ) {
     ) {
-        Column(modifier = Modifier.fillMaxWidth()) {
+        AppColumn(
+            Modifier.fillMaxWidth()
+        ) {
             LazyColumn(
             LazyColumn(
                 modifier = Modifier.heightIn(max = 560.dp),
                 modifier = Modifier.heightIn(max = 560.dp),
                 verticalArrangement = Arrangement.spacedBy(8.dp)
                 verticalArrangement = Arrangement.spacedBy(8.dp)
@@ -255,8 +258,8 @@ fun ChangeCoverSheet(
         }
         }
         LazyVerticalGrid(columns = GridCells.Fixed(3), horizontalArrangement = Arrangement.spacedBy(12.dp), verticalArrangement = Arrangement.spacedBy(12.dp)) {
         LazyVerticalGrid(columns = GridCells.Fixed(3), horizontalArrangement = Arrangement.spacedBy(12.dp), verticalArrangement = Arrangement.spacedBy(12.dp)) {
             items(items, key = { it.bookUrl + it.originName }) { item ->
             items(items, key = { it.bookUrl + it.originName }) { item ->
-                Column(
-                    modifier = Modifier
+                AppColumn(
+                    Modifier
                         .fillMaxWidth()
                         .fillMaxWidth()
                         .clip(RoundedCornerShape(4.dp))
                         .clip(RoundedCornerShape(4.dp))
                         .clickable {
                         .clickable {

+ 6 - 4
app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditScreen.kt

@@ -58,6 +58,7 @@ import io.legado.app.R
 import io.legado.app.ui.book.changecover.ChangeCoverDialog
 import io.legado.app.ui.book.changecover.ChangeCoverDialog
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.fadingEdge
 import io.legado.app.ui.theme.fadingEdge
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
@@ -152,8 +153,8 @@ fun BookInfoEditContent(
         }
         }
     }
     }
 
 
-    Column(
-        modifier = modifier.padding(16.dp)
+    AppColumn(
+        modifier.padding(16.dp)
     ) {
     ) {
         Row(
         Row(
             modifier = Modifier.fillMaxWidth(),
             modifier = Modifier.fillMaxWidth(),
@@ -291,7 +292,7 @@ private fun BookKnowledgeEditCard(
     onOpenEventList: (String) -> Unit,
     onOpenEventList: (String) -> Unit,
 ) {
 ) {
     NormalCard(modifier = Modifier.fillMaxWidth()) {
     NormalCard(modifier = Modifier.fillMaxWidth()) {
-        Column(
+        AppColumn(
             modifier = Modifier.padding(16.dp),
             modifier = Modifier.padding(16.dp),
             verticalArrangement = Arrangement.spacedBy(12.dp),
             verticalArrangement = Arrangement.spacedBy(12.dp),
         ) {
         ) {
@@ -412,11 +413,12 @@ fun KindEditor(
         mutable.add(to, mutable.removeAt(from))
         mutable.add(to, mutable.removeAt(from))
         onKindListChange(mutable)
         onKindListChange(mutable)
     }
     }
+
     val reorderableState = rememberReorderableLazyListState(listState) { from, to ->
     val reorderableState = rememberReorderableLazyListState(listState) { from, to ->
         moveKind(from.index, to.index)
         moveKind(from.index, to.index)
     }
     }
 
 
-    Column(
+    AppColumn(
         modifier = Modifier.padding(vertical = 8.dp),
         modifier = Modifier.padding(vertical = 8.dp),
         verticalArrangement = Arrangement.spacedBy(4.dp)
         verticalArrangement = Arrangement.spacedBy(4.dp)
     ) {
     ) {

+ 8 - 7
app/src/main/java/io/legado/app/ui/book/knowledge/BookCharacterDetailScreen.kt

@@ -40,6 +40,7 @@ import coil.compose.AsyncImage
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.data.entities.BookCharacterProfile
 import io.legado.app.data.entities.BookCharacterProfile
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.EmptyMessage
@@ -159,7 +160,7 @@ private fun CharacterDetailContent(
     var dialogVoiceGender by remember(state.voiceGender) { mutableStateOf(state.voiceGender) }
     var dialogVoiceGender by remember(state.voiceGender) { mutableStateOf(state.voiceGender) }
     var dialogVoiceAgeBand by remember(state.voiceAgeBand) { mutableStateOf(state.voiceAgeBand) }
     var dialogVoiceAgeBand by remember(state.voiceAgeBand) { mutableStateOf(state.voiceAgeBand) }
 
 
-    Column(
+    AppColumn(
         modifier = modifier.padding(horizontal = 16.dp, vertical = 12.dp),
         modifier = modifier.padding(horizontal = 16.dp, vertical = 12.dp),
         verticalArrangement = Arrangement.spacedBy(12.dp),
         verticalArrangement = Arrangement.spacedBy(12.dp),
     ) {
     ) {
@@ -244,7 +245,7 @@ private fun CharacterDetailContent(
         dismissText = stringResource(R.string.cancel),
         dismissText = stringResource(R.string.cancel),
         onDismiss = { showProfileDialog = false },
         onDismiss = { showProfileDialog = false },
         content = {
         content = {
-            Column(verticalArrangement = Arrangement.spacedBy(12.dp)) {
+            AppColumn(verticalArrangement = Arrangement.spacedBy(12.dp)) {
                 AppTextField(
                 AppTextField(
                     value = dialogName,
                     value = dialogName,
                     onValueChange = { dialogName = it },
                     onValueChange = { dialogName = it },
@@ -338,7 +339,7 @@ private fun CharacterDeleteDialog(
         dismissText = stringResource(R.string.cancel),
         dismissText = stringResource(R.string.cancel),
         onDismiss = onDismiss,
         onDismiss = onDismiss,
         content = {
         content = {
-            Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
+            AppColumn(verticalArrangement = Arrangement.spacedBy(8.dp)) {
                 CheckboxItem(
                 CheckboxItem(
                     stringResource(R.string.character_delete_relations),
                     stringResource(R.string.character_delete_relations),
                     checked = deleteRelations
                     checked = deleteRelations
@@ -473,8 +474,8 @@ private fun CharacterHeader(
             }
             }
         }
         }
 
 
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .weight(1f)
                 .weight(1f)
                 .clip(RoundedCornerShape(12.dp))
                 .clip(RoundedCornerShape(12.dp))
                 .clickable(onClick = onInfoClick)
                 .clickable(onClick = onInfoClick)
@@ -526,7 +527,7 @@ private fun CharacterReadonlySection(
     isEmpty: Boolean,
     isEmpty: Boolean,
     content: @Composable ColumnScope.() -> Unit,
     content: @Composable ColumnScope.() -> Unit,
 ) {
 ) {
-    Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
+    AppColumn(verticalArrangement = Arrangement.spacedBy(8.dp)) {
         AppText(text = title, style = LegadoTheme.typography.titleMedium)
         AppText(text = title, style = LegadoTheme.typography.titleMedium)
         if (isEmpty) {
         if (isEmpty) {
             GlassCard {
             GlassCard {
@@ -554,7 +555,7 @@ private fun InfoCard(
         modifier = Modifier.fillMaxWidth(),
         modifier = Modifier.fillMaxWidth(),
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
     ) {
     ) {
-        Column(
+        AppColumn(
             modifier = Modifier.padding(12.dp),
             modifier = Modifier.padding(12.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
         ) {
         ) {

+ 15 - 9
app/src/main/java/io/legado/app/ui/book/knowledge/BookCharacterListScreen.kt

@@ -1,5 +1,10 @@
 package io.legado.app.ui.book.knowledge
 package io.legado.app.ui.book.knowledge
 
 
+import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.expandVertically
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
+import androidx.compose.animation.shrinkVertically
 import androidx.compose.foundation.background
 import androidx.compose.foundation.background
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Arrangement
@@ -47,6 +52,7 @@ import io.legado.app.ui.ai.AiTaskResultSheet
 import io.legado.app.ui.ai.chat.ReasoningCard
 import io.legado.app.ui.ai.chat.ReasoningCard
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveContentPadding
 import io.legado.app.ui.theme.adaptiveContentPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
@@ -202,7 +208,7 @@ private fun CharacterIdentifySheet(
     ) {
     ) {
         when {
         when {
             sheet == null -> Unit
             sheet == null -> Unit
-            sheet.loading -> Column(verticalArrangement = Arrangement.spacedBy(12.dp)) {
+            sheet.loading -> AppColumn(verticalArrangement = Arrangement.spacedBy(12.dp)) {
                 Box(
                 Box(
                     Modifier
                     Modifier
                         .fillMaxWidth()
                         .fillMaxWidth()
@@ -219,18 +225,18 @@ private fun CharacterIdentifySheet(
                 )
                 )
             }
             }
 
 
-            sheet.error != null -> Column(verticalArrangement = Arrangement.spacedBy(12.dp)) {
+            sheet.error != null -> AppColumn(verticalArrangement = Arrangement.spacedBy(12.dp)) {
                 AnimatedTextLine(sheet.error, color = LegadoTheme.colorScheme.error)
                 AnimatedTextLine(sheet.error, color = LegadoTheme.colorScheme.error)
             }
             }
 
 
-            sheet.candidates.isEmpty() -> Column(verticalArrangement = Arrangement.spacedBy(12.dp)) {
+            sheet.candidates.isEmpty() -> AppColumn(verticalArrangement = Arrangement.spacedBy(12.dp)) {
                 AnimatedTextLine(
                 AnimatedTextLine(
                     stringResource(R.string.ai_identify_characters_hint),
                     stringResource(R.string.ai_identify_characters_hint),
                     color = LegadoTheme.colorScheme.onSurfaceVariant
                     color = LegadoTheme.colorScheme.onSurfaceVariant
                 )
                 )
             }
             }
 
 
-            else -> Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
+            else -> AppColumn(verticalArrangement = Arrangement.spacedBy(8.dp)) {
                 sheet.candidates.forEach { candidate ->
                 sheet.candidates.forEach { candidate ->
                     CharacterIdentifyCandidateRow(candidate, onIntent)
                     CharacterIdentifyCandidateRow(candidate, onIntent)
                 }
                 }
@@ -245,7 +251,7 @@ private fun CharacterIdentifyCandidateRow(
     onIntent: (CharacterListIntent) -> Unit,
     onIntent: (CharacterListIntent) -> Unit,
 ) {
 ) {
     val expanded = rememberSaveable(candidate.id) { mutableStateOf(false) }
     val expanded = rememberSaveable(candidate.id) { mutableStateOf(false) }
-    Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
+    AppColumn(verticalArrangement = Arrangement.spacedBy(4.dp)) {
         CheckboxItem(
         CheckboxItem(
             title = candidate.name,
             title = candidate.name,
             checked = candidate.selected,
             checked = candidate.selected,
@@ -271,10 +277,10 @@ private fun CharacterIdentifyCandidateRow(
                     tint = LegadoTheme.colorScheme.onSurfaceVariant,
                     tint = LegadoTheme.colorScheme.onSurfaceVariant,
                 )
                 )
             }
             }
-            androidx.compose.animation.AnimatedVisibility(
+            AnimatedVisibility(
                 visible = expanded.value,
                 visible = expanded.value,
-                enter = androidx.compose.animation.expandVertically() + androidx.compose.animation.fadeIn(),
-                exit = androidx.compose.animation.shrinkVertically() + androidx.compose.animation.fadeOut(),
+                enter = expandVertically() + fadeIn(),
+                exit = shrinkVertically() + fadeOut(),
             ) {
             ) {
                 AnimatedTextLine(
                 AnimatedTextLine(
                     candidate.summary,
                     candidate.summary,
@@ -373,7 +379,7 @@ private fun CharacterListItem(
                     )
                     )
                 }
                 }
             }
             }
-            Column(
+            AppColumn(
                 modifier = Modifier.weight(1f),
                 modifier = Modifier.weight(1f),
                 verticalArrangement = Arrangement.spacedBy(2.dp),
                 verticalArrangement = Arrangement.spacedBy(2.dp),
             ) {
             ) {

+ 4 - 3
app/src/main/java/io/legado/app/ui/book/knowledge/BookCharacterNetworkScreen.kt

@@ -41,6 +41,7 @@ import coil.compose.AsyncImage
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveContentPadding
 import io.legado.app.ui.theme.adaptiveContentPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
@@ -190,7 +191,7 @@ private fun CharacterNodeStrip(
     characters: List<CharacterNodeUi>,
     characters: List<CharacterNodeUi>,
     onOpenCharacter: (String) -> Unit,
     onOpenCharacter: (String) -> Unit,
 ) {
 ) {
-    Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
+    AppColumn(verticalArrangement = Arrangement.spacedBy(8.dp)) {
         AppText(
         AppText(
             text = stringResource(R.string.book_characters),
             text = stringResource(R.string.book_characters),
             style = LegadoTheme.typography.titleMedium,
             style = LegadoTheme.typography.titleMedium,
@@ -255,7 +256,7 @@ private fun AddRelationCard(
         modifier = Modifier.fillMaxWidth(),
         modifier = Modifier.fillMaxWidth(),
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
     ) {
     ) {
-        Column(
+        AppColumn(
             modifier = Modifier.padding(12.dp),
             modifier = Modifier.padding(12.dp),
             verticalArrangement = Arrangement.spacedBy(8.dp),
             verticalArrangement = Arrangement.spacedBy(8.dp),
         ) {
         ) {
@@ -322,7 +323,7 @@ private fun RelationEditorCard(
         modifier = Modifier.fillMaxWidth(),
         modifier = Modifier.fillMaxWidth(),
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
     ) {
     ) {
-        Column(
+        AppColumn(
             modifier = Modifier.padding(12.dp),
             modifier = Modifier.padding(12.dp),
             verticalArrangement = Arrangement.spacedBy(8.dp),
             verticalArrangement = Arrangement.spacedBy(8.dp),
         ) {
         ) {

+ 2 - 1
app/src/main/java/io/legado/app/ui/book/knowledge/BookEventDetailScreen.kt

@@ -21,6 +21,7 @@ import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.progressIndicator.AppCircularProgressIndicator
 import io.legado.app.ui.widget.components.progressIndicator.AppCircularProgressIndicator
 import io.legado.app.ui.widget.components.topbar.GlassMediumFlexibleTopAppBar
 import io.legado.app.ui.widget.components.topbar.GlassMediumFlexibleTopAppBar
@@ -99,7 +100,7 @@ private fun EventDetailContent(
     onIntent: (EventDetailIntent) -> Unit,
     onIntent: (EventDetailIntent) -> Unit,
     modifier: Modifier = Modifier,
     modifier: Modifier = Modifier,
 ) {
 ) {
-    Column(
+    AppColumn(
         modifier = modifier.padding(horizontal = 16.dp, vertical = 12.dp),
         modifier = modifier.padding(horizontal = 16.dp, vertical = 12.dp),
         verticalArrangement = Arrangement.spacedBy(12.dp),
         verticalArrangement = Arrangement.spacedBy(12.dp),
     ) {
     ) {

+ 2 - 1
app/src/main/java/io/legado/app/ui/book/knowledge/BookEventListScreen.kt

@@ -27,6 +27,7 @@ import androidx.lifecycle.compose.LocalLifecycleOwner
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveContentPadding
 import io.legado.app.ui.theme.adaptiveContentPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.card.GlassCard
@@ -151,7 +152,7 @@ private fun EventEntryCard(
         onClick = onClick,
         onClick = onClick,
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
     ) {
     ) {
-        Column(
+        AppColumn(
             modifier = Modifier.padding(12.dp),
             modifier = Modifier.padding(12.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
         ) {
         ) {

+ 3 - 2
app/src/main/java/io/legado/app/ui/book/knowledge/BookKnowledgeDetailScreen.kt

@@ -29,6 +29,7 @@ import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.card.GlassCard
@@ -144,7 +145,7 @@ private fun KnowledgeDetailContent(
     onIntent: (KnowledgeDetailIntent) -> Unit,
     onIntent: (KnowledgeDetailIntent) -> Unit,
     modifier: Modifier = Modifier,
     modifier: Modifier = Modifier,
 ) {
 ) {
-    Column(
+    AppColumn(
         modifier = modifier.padding(horizontal = 16.dp, vertical = 12.dp),
         modifier = modifier.padding(horizontal = 16.dp, vertical = 12.dp),
         verticalArrangement = Arrangement.spacedBy(12.dp),
         verticalArrangement = Arrangement.spacedBy(12.dp),
     ) {
     ) {
@@ -195,7 +196,7 @@ private fun KnowledgeTypeSelector(
     var showDropdown by remember { mutableStateOf(false) }
     var showDropdown by remember { mutableStateOf(false) }
     val currentLabel = KNOWLEDGE_TYPE_LABELS[selectedType]?.let { stringResource(it) } ?: "—"
     val currentLabel = KNOWLEDGE_TYPE_LABELS[selectedType]?.let { stringResource(it) } ?: "—"
 
 
-    Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
+    AppColumn(verticalArrangement = Arrangement.spacedBy(8.dp)) {
         AppText(
         AppText(
             text = stringResource(R.string.knowledge_type),
             text = stringResource(R.string.knowledge_type),
             style = LegadoTheme.typography.titleMedium,
             style = LegadoTheme.typography.titleMedium,

+ 2 - 1
app/src/main/java/io/legado/app/ui/book/knowledge/BookKnowledgeListScreen.kt

@@ -27,6 +27,7 @@ import androidx.lifecycle.compose.LocalLifecycleOwner
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveContentPadding
 import io.legado.app.ui.theme.adaptiveContentPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.card.GlassCard
@@ -151,7 +152,7 @@ private fun KnowledgeEntryCard(
         onClick = onClick,
         onClick = onClick,
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
     ) {
     ) {
-        Column(
+        AppColumn(
             modifier = Modifier.padding(12.dp),
             modifier = Modifier.padding(12.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
         ) {
         ) {

+ 2 - 1
app/src/main/java/io/legado/app/ui/book/knowledge/CharacterAvatarCropDialog.kt

@@ -32,6 +32,7 @@ import androidx.compose.ui.unit.dp
 import coil.compose.AsyncImage
 import coil.compose.AsyncImage
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import kotlin.math.roundToInt
 import kotlin.math.roundToInt
 
 
@@ -70,7 +71,7 @@ fun CharacterAvatarCropDialog(
         dismissText = stringResource(R.string.cancel),
         dismissText = stringResource(R.string.cancel),
         onDismiss = onDismissRequest,
         onDismiss = onDismissRequest,
         content = {
         content = {
-            Column(
+            AppColumn(
                 verticalArrangement = Arrangement.spacedBy(12.dp),
                 verticalArrangement = Arrangement.spacedBy(12.dp),
             ) {
             ) {
                 BoxWithConstraints(
                 BoxWithConstraints(

+ 3 - 2
app/src/main/java/io/legado/app/ui/book/knowledge/KnowledgeSharedComponents.kt

@@ -26,6 +26,7 @@ import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.card.GlassCard
@@ -54,7 +55,7 @@ fun KnowledgeEditFieldCard(
         modifier = modifier,
         modifier = modifier,
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
     ) {
     ) {
-        Column(
+        AppColumn(
             modifier = Modifier.padding(16.dp),
             modifier = Modifier.padding(16.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp)
             verticalArrangement = Arrangement.spacedBy(4.dp)
         ) {
         ) {
@@ -112,7 +113,7 @@ fun KnowledgeFlowTagEditor(
     var removeTagIndex by remember { mutableStateOf(-1) }
     var removeTagIndex by remember { mutableStateOf(-1) }
     var removeTagName by remember { mutableStateOf("") }
     var removeTagName by remember { mutableStateOf("") }
 
 
-    Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
+    AppColumn(verticalArrangement = Arrangement.spacedBy(8.dp)) {
         AppText(
         AppText(
             text = title,
             text = title,
             style = LegadoTheme.typography.titleMedium,
             style = LegadoTheme.typography.titleMedium,

+ 22 - 12
app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageScreen.kt

@@ -79,6 +79,7 @@ import io.legado.app.ui.theme.LegadoTheme.composeEngine
 import io.legado.app.ui.theme.ThemeResolver
 import io.legado.app.ui.theme.ThemeResolver
 import io.legado.app.ui.theme.adaptiveContentPadding
 import io.legado.app.ui.theme.adaptiveContentPadding
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppFloatingActionButtonMenu
 import io.legado.app.ui.widget.components.AppFloatingActionButtonMenu
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.FabMenuItem
 import io.legado.app.ui.widget.components.FabMenuItem
@@ -709,8 +710,8 @@ private fun BookshelfManageScreen(
                         onLongClick = { toggleBookSelection(book) },
                         onLongClick = { toggleBookSelection(book) },
                         containerColor = animatedContainerColor
                         containerColor = animatedContainerColor
                     ) {
                     ) {
-                        Column(
-                            modifier = Modifier
+                        AppColumn(
+                            Modifier
                                 .fillMaxWidth()
                                 .fillMaxWidth()
                                 .adaptiveHorizontalPadding(vertical = 12.dp),
                                 .adaptiveHorizontalPadding(vertical = 12.dp),
                             verticalArrangement = Arrangement.SpaceBetween
                             verticalArrangement = Arrangement.SpaceBetween
@@ -734,10 +735,15 @@ private fun BookshelfManageScreen(
                                     )
                                     )
                                     AppText(
                                     AppText(
                                         text = "${groupNameResolver(book)} | ${book.originName.ifBlank { book.origin }}",
                                         text = "${groupNameResolver(book)} | ${book.originName.ifBlank { book.origin }}",
-                                        style = LegadoTheme.typography.labelSmallEmphasized.copy(color = LegadoTheme.colorScheme.primary)
+                                        style = LegadoTheme.typography.labelSmallEmphasized.copy(
+                                            color = LegadoTheme.colorScheme.primary
+                                        )
                                     )
                                     )
                                     if (exportMsg != null) {
                                     if (exportMsg != null) {
-                                        AppText(text = exportMsg, modifier = Modifier.padding(top = 2.dp))
+                                        AppText(
+                                            text = exportMsg,
+                                            modifier = Modifier.padding(top = 2.dp)
+                                        )
                                     }
                                     }
                                 }
                                 }
                                 TextCard(
                                 TextCard(
@@ -808,7 +814,11 @@ private fun BookshelfManageScreen(
                                     SmallTonalButton(
                                     SmallTonalButton(
                                         onClick = {
                                         onClick = {
                                             if (!book.isLocal) {
                                             if (!book.isLocal) {
-                                                viewModel.dispatch(BookshelfManageScreenIntent.ToggleBookDownload(book))
+                                                viewModel.dispatch(
+                                                    BookshelfManageScreenIntent.ToggleBookDownload(
+                                                        book
+                                                    )
+                                                )
                                             }
                                             }
                                         },
                                         },
                                         icon = if (isDownloading) Icons.Default.Stop else Icons.Default.Download,
                                         icon = if (isDownloading) Icons.Default.Stop else Icons.Default.Download,
@@ -948,7 +958,7 @@ private fun BookshelfManageScreen(
         },
         },
         title = stringResource(R.string.change_source_batch),
         title = stringResource(R.string.change_source_batch),
         content = {
         content = {
-            Column(
+            AppColumn(
                 modifier = Modifier.fillMaxWidth(),
                 modifier = Modifier.fillMaxWidth(),
                 horizontalAlignment = Alignment.CenterHorizontally,
                 horizontalAlignment = Alignment.CenterHorizontally,
                 verticalArrangement = Arrangement.spacedBy(12.dp),
                 verticalArrangement = Arrangement.spacedBy(12.dp),
@@ -1009,7 +1019,7 @@ private fun BookshelfManageScreen(
         onDismissRequest = { showDeleteBookConfirmDialog = false },
         onDismissRequest = { showDeleteBookConfirmDialog = false },
         title = stringResource(R.string.draw),
         title = stringResource(R.string.draw),
         content = {
         content = {
-            Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
+            AppColumn(verticalArrangement = Arrangement.spacedBy(8.dp)) {
                 AppText(text = stringResource(R.string.sure_del))
                 AppText(text = stringResource(R.string.sure_del))
                 if (hasLocalBookInDeleteTarget) {
                 if (hasLocalBookInDeleteTarget) {
                     Row(
                     Row(
@@ -1108,7 +1118,7 @@ private fun BookshelfManageScreen(
         onDismissRequest = { showExportFileNameDialog = false },
         onDismissRequest = { showExportFileNameDialog = false },
         title = stringResource(R.string.export_file_name),
         title = stringResource(R.string.export_file_name),
         content = {
         content = {
-            Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
+            AppColumn(verticalArrangement = Arrangement.spacedBy(8.dp)) {
                 AppText(text = exportFileNameHelpText)
                 AppText(text = exportFileNameHelpText)
                 AppTextField(
                 AppTextField(
                     value = exportFileNameInput,
                     value = exportFileNameInput,
@@ -1169,7 +1179,7 @@ private fun BookshelfManageScreen(
         content = {
         content = {
             val episodeTemplateValid = customEpisodeExportNameInput.isNotBlank()
             val episodeTemplateValid = customEpisodeExportNameInput.isNotBlank()
                 && tryParesExportFileName(customEpisodeExportNameInput)
                 && tryParesExportFileName(customEpisodeExportNameInput)
-            Column(verticalArrangement = Arrangement.spacedBy(12.dp)) {
+            AppColumn(verticalArrangement = Arrangement.spacedBy(12.dp)) {
                 Row(
                 Row(
                     modifier = Modifier.fillMaxWidth(),
                     modifier = Modifier.fillMaxWidth(),
                     horizontalArrangement = Arrangement.spacedBy(8.dp)
                     horizontalArrangement = Arrangement.spacedBy(8.dp)
@@ -1498,8 +1508,8 @@ private fun BatchChangePreviewRow(
         modifier = Modifier.fillMaxWidth(),
         modifier = Modifier.fillMaxWidth(),
         containerColor = LegadoTheme.colorScheme.onSheetContent,
         containerColor = LegadoTheme.colorScheme.onSheetContent,
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(12.dp),
                 .padding(12.dp),
             verticalArrangement = Arrangement.spacedBy(12.dp),
             verticalArrangement = Arrangement.spacedBy(12.dp),
@@ -1582,7 +1592,7 @@ private fun PreviewBookInfo(
     onClick: () -> Unit,
     onClick: () -> Unit,
     modifier: Modifier = Modifier,
     modifier: Modifier = Modifier,
 ) {
 ) {
-    Column(
+    AppColumn(
         modifier = modifier.clickable(enabled = book != null, onClick = onClick),
         modifier = modifier.clickable(enabled = book != null, onClick = onClick),
         verticalArrangement = Arrangement.spacedBy(6.dp),
         verticalArrangement = Arrangement.spacedBy(6.dp),
         horizontalAlignment = Alignment.CenterHorizontally,
         horizontalAlignment = Alignment.CenterHorizontally,

+ 25 - 29
app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt

@@ -166,6 +166,7 @@ import io.legado.app.ui.book.read.sheet.ReadStyleContent
 import io.legado.app.ui.book.read.sheet.ReadStyleTextTitleContent
 import io.legado.app.ui.book.read.sheet.ReadStyleTextTitleContent
 import io.legado.app.ui.book.read.sheet.readMenuButtonInfos
 import io.legado.app.ui.book.read.sheet.readMenuButtonInfos
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppSlider
 import io.legado.app.ui.widget.components.AppSlider
 import io.legado.app.ui.widget.components.AppVerticalSlider
 import io.legado.app.ui.widget.components.AppVerticalSlider
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
@@ -250,7 +251,8 @@ fun ReadBookMenuBar(
             exit = slideOutVertically(targetOffsetY = { -it }) + fadeOut(),
             exit = slideOutVertically(targetOffsetY = { -it }) + fadeOut(),
             modifier = Modifier.align(Alignment.TopCenter),
             modifier = Modifier.align(Alignment.TopCenter),
         ) {
         ) {
-            Column {
+            AppColumn(
+            ) {
                 MenuTitleBar(
                 MenuTitleBar(
                     state = state,
                     state = state,
                     colors = menuColors,
                     colors = menuColors,
@@ -371,7 +373,7 @@ fun ReadBookMenuBar(
             exit = slideOutVertically(targetOffsetY = { it }) + fadeOut(),
             exit = slideOutVertically(targetOffsetY = { it }) + fadeOut(),
             modifier = Modifier.align(Alignment.BottomCenter),
             modifier = Modifier.align(Alignment.BottomCenter),
         ) {
         ) {
-            Column(horizontalAlignment = Alignment.CenterHorizontally) {
+            AppColumn(horizontalAlignment = Alignment.CenterHorizontally) {
                 if (state.menuVisible &&
                 if (state.menuVisible &&
                     state.menuConfig.showTitleBarIcons &&
                     state.menuConfig.showTitleBarIcons &&
                     state.menuConfig.titleBarIconPosition >= 2
                     state.menuConfig.titleBarIconPosition >= 2
@@ -864,12 +866,12 @@ private fun ReadBookMenuRoutePage(
     onBack: () -> Unit,
     onBack: () -> Unit,
     content: @Composable () -> Unit,
     content: @Composable () -> Unit,
 ) {
 ) {
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .heightIn(max = maxHeight)
             .heightIn(max = maxHeight)
             .let { if (animateSize) it.animateContentSize() else it }
             .let { if (animateSize) it.animateContentSize() else it }
-            .padding(top = 16.dp, bottom = 16.dp + bottomPadding),
+            .padding(top = 16.dp, bottom = 16.dp + bottomPadding)
     ) {
     ) {
         Row(
         Row(
             modifier = Modifier
             modifier = Modifier
@@ -955,8 +957,8 @@ private fun MenuTitleBar(
         )
         )
     )
     )
 
 
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .then(
             .then(
                 if (useTopBarBlur && hazeState != null) {
                 if (useTopBarBlur && hazeState != null) {
@@ -1010,8 +1012,6 @@ private fun MenuTitleBar(
     ) {
     ) {
         val useTitleCapsule = readMenuTopBarTitleCapsuleEnabled(backdrop, state.menuConfig)
         val useTitleCapsule = readMenuTopBarTitleCapsuleEnabled(backdrop, state.menuConfig)
         val capsuleIconColor = LegadoTheme.colorScheme.onSurfaceVariant
         val capsuleIconColor = LegadoTheme.colorScheme.onSurfaceVariant
-
-        // Title row: left group (back + capsule/title) + right group (actions)
         Row(
         Row(
             modifier = Modifier
             modifier = Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
@@ -1141,8 +1141,6 @@ private fun MenuTitleBar(
                 }
                 }
             }
             }
         }
         }
-
-        // Book name on its own line (mode "1") — hidden when capsule is active
         if (titleBarMode == "1" && !useTitleCapsule) {
         if (titleBarMode == "1" && !useTitleCapsule) {
             AppText(
             AppText(
                 text = state.bookName,
                 text = state.bookName,
@@ -1162,8 +1160,6 @@ private fun MenuTitleBar(
                 overflow = TextOverflow.Ellipsis,
                 overflow = TextOverflow.Ellipsis,
             )
             )
         }
         }
-
-        // Chapter name + source action (modes "0" and "1") — hidden when capsule is active
         if ((titleBarMode == "0" || titleBarMode == "1") && !useTitleCapsule) {
         if ((titleBarMode == "0" || titleBarMode == "1") && !useTitleCapsule) {
             Row(
             Row(
                 modifier = Modifier
                 modifier = Modifier
@@ -1468,8 +1464,8 @@ private fun RowScope.TitleCapsuleGlassLayout(
             .padding(horizontal = 12.dp),
             .padding(horizontal = 12.dp),
         verticalAlignment = Alignment.CenterVertically,
         verticalAlignment = Alignment.CenterVertically,
     ) {
     ) {
-        Column(
-            modifier = Modifier.weight(1f),
+        AppColumn(
+            Modifier.weight(1f)
         ) {
         ) {
             AppText(
             AppText(
                 text = state.bookName,
                 text = state.bookName,
@@ -2282,14 +2278,14 @@ private fun SearchBottomMenuContent(
         0
         0
     }
     }
 
 
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .windowInsetsPadding(
             .windowInsetsPadding(
                 WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal)
                 WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal)
             )
             )
             .padding(top = 12.dp, bottom = bottomPadding)
             .padding(top = 12.dp, bottom = bottomPadding)
-            .animateContentSize(),
+            .animateContentSize()
     ) {
     ) {
         Column(
         Column(
             modifier = Modifier
             modifier = Modifier
@@ -2436,7 +2432,11 @@ private fun MenuBottomBar(
 ) {
 ) {
     val seekMax = state.seekMax.coerceAtLeast(0)
     val seekMax = state.seekMax.coerceAtLeast(0)
     val sliderMax = seekMax.toFloat().coerceAtLeast(1f)
     val sliderMax = seekMax.toFloat().coerceAtLeast(1f)
-    var sliderValue by remember { mutableFloatStateOf(state.seekProgress.coerceIn(0, seekMax).toFloat()) }
+    var sliderValue by remember {
+        mutableFloatStateOf(
+            state.seekProgress.coerceIn(0, seekMax).toFloat()
+        )
+    }
     var sliderDragging by remember { mutableStateOf(false) }
     var sliderDragging by remember { mutableStateOf(false) }
     var previewPageIndex by remember { mutableIntStateOf(state.seekProgress.coerceIn(0, seekMax)) }
     var previewPageIndex by remember { mutableIntStateOf(state.seekProgress.coerceIn(0, seekMax)) }
     val toolButtonsBottomPadding = if (buttonGlassEnabled) 6.dp else 0.dp
     val toolButtonsBottomPadding = if (buttonGlassEnabled) 6.dp else 0.dp
@@ -2490,14 +2490,14 @@ private fun MenuBottomBar(
         }
         }
     }
     }
 
 
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .windowInsetsPadding(
             .windowInsetsPadding(
                 WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal)
                 WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal)
             )
             )
             .padding(top = 8.dp, bottom = contentBottomPadding)
             .padding(top = 8.dp, bottom = contentBottomPadding)
-            .animateContentSize(),
+            .animateContentSize()
     ) {
     ) {
         if (state.menuConfig.showBrightnessView == "1") {
         if (state.menuConfig.showBrightnessView == "1") {
             BrightnessBar(
             BrightnessBar(
@@ -2520,8 +2520,6 @@ private fun MenuBottomBar(
             )
             )
             Spacer(Modifier.height(4.dp))
             Spacer(Modifier.height(4.dp))
         }
         }
-
-        // Seek bar row: prev + slider + next
         AnimatedVisibility(visible = state.menuConfig.readSliderMode != "1") {
         AnimatedVisibility(visible = state.menuConfig.readSliderMode != "1") {
             Row(
             Row(
                 modifier = Modifier
                 modifier = Modifier
@@ -2573,8 +2571,6 @@ private fun MenuBottomBar(
         }
         }
 
 
         Spacer(Modifier.height(12.dp))
         Spacer(Modifier.height(12.dp))
-
-        // Tool buttons
         val toolButtons = remember(
         val toolButtons = remember(
             context,
             context,
             state.menuConfig.bottomBarButtons,
             state.menuConfig.bottomBarButtons,
@@ -2941,7 +2937,7 @@ private fun ToolButtonItem(
         else -> null
         else -> null
     }
     }
 
 
-    Column(
+    AppColumn(
         modifier = modifier,
         modifier = modifier,
         horizontalAlignment = Alignment.CenterHorizontally
         horizontalAlignment = Alignment.CenterHorizontally
     ) {
     ) {
@@ -3487,8 +3483,8 @@ private fun BrightnessBar(
     )
     )
 
 
     if (vertical) {
     if (vertical) {
-        Column(
-            modifier = modifier
+        AppColumn(
+            modifier
                 .width(if (buttonGlassEnabled) 64.dp else 56.dp)
                 .width(if (buttonGlassEnabled) 64.dp else 56.dp)
                 .padding(vertical = 12.dp, horizontal = 4.dp),
                 .padding(vertical = 12.dp, horizontal = 4.dp),
             horizontalAlignment = Alignment.CenterHorizontally,
             horizontalAlignment = Alignment.CenterHorizontally,

+ 3 - 2
app/src/main/java/io/legado/app/ui/book/read/TextActionSelectionMenu.kt

@@ -63,6 +63,7 @@ import androidx.compose.ui.window.PopupProperties
 import coil.compose.AsyncImage
 import coil.compose.AsyncImage
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.ui.widget.components.text.AppText
 import kotlin.math.roundToInt
 import kotlin.math.roundToInt
@@ -421,8 +422,8 @@ private fun MoreMenuView(
 ) {
 ) {
     val scrollState = rememberScrollState()
     val scrollState = rememberScrollState()
 
 
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .width(IntrinsicSize.Max)
             .width(IntrinsicSize.Max)
     ) {
     ) {
         Box(
         Box(

+ 8 - 5
app/src/main/java/io/legado/app/ui/book/read/sheet/AiRewritePresetConfigSheet.kt

@@ -25,6 +25,7 @@ import io.legado.app.ui.book.read.AiRewritePresetConfigUiState
 import io.legado.app.ui.book.read.AiRewritePresetUi
 import io.legado.app.ui.book.read.AiRewritePresetUi
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
@@ -45,8 +46,8 @@ fun AiRewritePresetConfigSheet(
         onDismissRequest = onDismissRequest,
         onDismissRequest = onDismissRequest,
         title = stringResource(R.string.ai_rewrite_presets),
         title = stringResource(R.string.ai_rewrite_presets),
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
         ) {
         ) {
             Row(
             Row(
@@ -129,8 +130,8 @@ private fun PresetEditor(
         modifier = Modifier.fillMaxWidth(),
         modifier = Modifier.fillMaxWidth(),
         containerColor = LegadoTheme.colorScheme.surfaceContainerHigh,
         containerColor = LegadoTheme.colorScheme.surfaceContainerHigh,
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(12.dp),
                 .padding(12.dp),
             verticalArrangement = Arrangement.spacedBy(10.dp),
             verticalArrangement = Arrangement.spacedBy(10.dp),
@@ -177,7 +178,9 @@ private fun PresetItem(
             verticalAlignment = Alignment.CenterVertically,
             verticalAlignment = Alignment.CenterVertically,
             horizontalArrangement = Arrangement.spacedBy(8.dp),
             horizontalArrangement = Arrangement.spacedBy(8.dp),
         ) {
         ) {
-            Column(modifier = Modifier.weight(1f)) {
+            AppColumn(
+                modifier = Modifier.weight(1f)
+            ) {
                 AppText(
                 AppText(
                     text = preset.name,
                     text = preset.name,
                     style = LegadoTheme.typography.labelLargeEmphasized,
                     style = LegadoTheme.typography.labelLargeEmphasized,

+ 4 - 3
app/src/main/java/io/legado/app/ui/book/read/sheet/AiTextCleanSheet.kt

@@ -23,6 +23,7 @@ import io.legado.app.ui.ai.chat.AiGeneratedMessageContent
 import io.legado.app.ui.book.read.AiTextCleanUiState
 import io.legado.app.ui.book.read.AiTextCleanUiState
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.NormalCard
@@ -45,10 +46,10 @@ fun AiTextCleanSheet(
         },
         },
         title = stringResource(R.string.ai_text_clean),
         title = stringResource(R.string.ai_text_clean),
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
-                .padding(bottom = 24.dp),
+                .padding(bottom = 24.dp)
         ) {
         ) {
             Column(
             Column(
                 modifier = Modifier
                 modifier = Modifier

+ 12 - 7
app/src/main/java/io/legado/app/ui/book/read/sheet/AiTextRewriteSheet.kt

@@ -38,6 +38,7 @@ import io.legado.app.ui.book.read.AiRewritePresetUi
 import io.legado.app.ui.book.read.AiTextRewriteUiState
 import io.legado.app.ui.book.read.AiTextRewriteUiState
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppRadioButton
 import io.legado.app.ui.widget.components.AppRadioButton
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.EmptyMessage
@@ -92,9 +93,9 @@ fun AiTextRewriteSheet(
             )
             )
         }
         }
     ) {
     ) {
-        Column(
-            modifier = Modifier
-                .fillMaxWidth(),
+        AppColumn(
+            Modifier
+                .fillMaxWidth()
         ) {
         ) {
             Column(
             Column(
                 modifier = Modifier
                 modifier = Modifier
@@ -312,8 +313,8 @@ private fun RewriteHistoryItem(
         onClick = if (enabled) onSelect else null,
         onClick = if (enabled) onSelect else null,
         containerColor = LegadoTheme.colorScheme.surfaceContainerHigh,
         containerColor = LegadoTheme.colorScheme.surfaceContainerHigh,
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(12.dp),
                 .padding(12.dp),
             verticalArrangement = Arrangement.spacedBy(8.dp),
             verticalArrangement = Arrangement.spacedBy(8.dp),
@@ -402,7 +403,9 @@ private fun RewritePresetOption(
                 onClick = onSelect,
                 onClick = onSelect,
                 enabled = enabled,
                 enabled = enabled,
             )
             )
-            Column(modifier = Modifier.weight(1f)) {
+            AppColumn(
+                modifier = Modifier.weight(1f)
+            ) {
                 AppText(
                 AppText(
                     text = preset.name,
                     text = preset.name,
                     style = LegadoTheme.typography.labelLargeEmphasized,
                     style = LegadoTheme.typography.labelLargeEmphasized,
@@ -435,7 +438,9 @@ private fun CollapsibleTextPreview(
         modifier = Modifier.fillMaxWidth(),
         modifier = Modifier.fillMaxWidth(),
         containerColor = LegadoTheme.colorScheme.surfaceContainerHigh,
         containerColor = LegadoTheme.colorScheme.surfaceContainerHigh,
     ) {
     ) {
-        Column(modifier = Modifier.padding(16.dp)) {
+        AppColumn(
+            Modifier.padding(16.dp)
+        ) {
             SelectionContainer {
             SelectionContainer {
                 AppText(
                 AppText(
                     text = text,
                     text = text,

+ 6 - 7
app/src/main/java/io/legado/app/ui/book/read/sheet/AutoReadSheet.kt

@@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.FilledTonalIconButton
 import androidx.compose.material3.Icon
 import androidx.compose.material3.Icon
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Text
 import androidx.compose.material3.Text
@@ -27,6 +28,7 @@ import io.legado.app.data.repository.ReadPreferences
 import io.legado.app.data.repository.ReadSettingsRepository
 import io.legado.app.data.repository.ReadSettingsRepository
 import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.settingItem.TinySliderSettingItem
 import io.legado.app.ui.widget.components.settingItem.TinySliderSettingItem
 import org.koin.compose.koinInject
 import org.koin.compose.koinInject
@@ -79,10 +81,9 @@ fun AutoReadContent(
         speed = preferences.autoReadSpeed.coerceIn(1, 120).toFloat()
         speed = preferences.autoReadSpeed.coerceIn(1, 120).toFloat()
     }
     }
 
 
-    Column(
-        modifier = modifier.fillMaxWidth(),
+    AppColumn(
+        modifier.fillMaxWidth()
     ) {
     ) {
-        // Speed display
         Row(
         Row(
             modifier = Modifier.fillMaxWidth(),
             modifier = Modifier.fillMaxWidth(),
             horizontalArrangement = Arrangement.Center,
             horizontalArrangement = Arrangement.Center,
@@ -115,8 +116,6 @@ fun AutoReadContent(
         )
         )
 
 
         Spacer(Modifier.height(12.dp))
         Spacer(Modifier.height(12.dp))
-
-        // Action buttons
         Row(
         Row(
             modifier = Modifier.fillMaxWidth(),
             modifier = Modifier.fillMaxWidth(),
             horizontalArrangement = Arrangement.SpaceEvenly,
             horizontalArrangement = Arrangement.SpaceEvenly,
@@ -155,10 +154,10 @@ private fun ActionButton(
     label: String,
     label: String,
     onClick: () -> Unit,
     onClick: () -> Unit,
 ) {
 ) {
-    Column(
+    AppColumn(
         horizontalAlignment = Alignment.CenterHorizontally,
         horizontalAlignment = Alignment.CenterHorizontally,
     ) {
     ) {
-        androidx.compose.material3.FilledTonalIconButton(onClick = onClick) {
+        FilledTonalIconButton(onClick = onClick) {
             Icon(
             Icon(
                 painter = painterResource(icon),
                 painter = painterResource(icon),
                 contentDescription = label,
                 contentDescription = label,

+ 5 - 7
app/src/main/java/io/legado/app/ui/book/read/sheet/BgTextConfigSheet.kt

@@ -43,6 +43,7 @@ import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookStyleConfig
 import io.legado.app.ui.book.read.ReadBookStyleConfig
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.dialog.ColorPickerSheet
 import io.legado.app.ui.widget.components.dialog.ColorPickerSheet
@@ -93,13 +94,12 @@ fun BgTextConfigSheet(
         title = styleName,
         title = styleName,
         contentWindowInsets = { WindowInsets.navigationBars },
         contentWindowInsets = { WindowInsets.navigationBars },
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(bottom = 16.dp)
                 .padding(bottom = 16.dp)
-                .verticalScroll(rememberScrollState()),
+                .verticalScroll(rememberScrollState())
         ) {
         ) {
-            // Action buttons row
             Row(
             Row(
                 modifier = Modifier.fillMaxWidth(),
                 modifier = Modifier.fillMaxWidth(),
                 horizontalArrangement = Arrangement.spacedBy(4.dp),
                 horizontalArrangement = Arrangement.spacedBy(4.dp),
@@ -184,8 +184,6 @@ fun BgTextConfigSheet(
                     onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.BgAlpha(it.toInt())))
                     onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.BgAlpha(it.toInt())))
                 },
                 },
             )
             )
-
-            // TODO: Add background image grid from assets
         }
         }
     }
     }
 
 
@@ -287,7 +285,7 @@ private fun ActionCard(
         modifier = modifier,
         modifier = modifier,
         containerColor = if (enabled) LegadoTheme.colorScheme.surfaceContainerLow else LegadoTheme.colorScheme.surfaceContainerLow.copy(alpha = 0.5f),
         containerColor = if (enabled) LegadoTheme.colorScheme.surfaceContainerLow else LegadoTheme.colorScheme.surfaceContainerLow.copy(alpha = 0.5f),
     ) {
     ) {
-        Column(
+        AppColumn(
             horizontalAlignment = Alignment.CenterHorizontally,
             horizontalAlignment = Alignment.CenterHorizontally,
             verticalArrangement = Arrangement.Center,
             verticalArrangement = Arrangement.Center,
             modifier = Modifier
             modifier = Modifier

+ 2 - 1
app/src/main/java/io/legado/app/ui/book/read/sheet/ChangeChapterSourceSheet.kt

@@ -36,6 +36,7 @@ import io.legado.app.ui.book.changesource.ChangeChapterSourceIntent
 import io.legado.app.ui.book.changesource.ChangeChapterSourceUiState
 import io.legado.app.ui.book.changesource.ChangeChapterSourceUiState
 import io.legado.app.ui.book.search.ScopeSelectSheet
 import io.legado.app.ui.book.search.ScopeSelectSheet
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.button.series.MediumPlainButton
 import io.legado.app.ui.widget.components.button.series.MediumPlainButton
@@ -271,7 +272,7 @@ private fun SearchContent(
                         )
                         )
                     },
                     },
                     supportingContent = {
                     supportingContent = {
-                        Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
+                        AppColumn(verticalArrangement = Arrangement.spacedBy(4.dp)) {
                             AppText(
                             AppText(
                                 text = item.author,
                                 text = item.author,
                                 style = LegadoTheme.typography.labelLargeEmphasized
                                 style = LegadoTheme.typography.labelLargeEmphasized

+ 4 - 3
app/src/main/java/io/legado/app/ui/book/read/sheet/ChapterSummarySheet.kt

@@ -22,6 +22,7 @@ import io.legado.app.ui.ai.chat.AiGeneratedMessageContent
 import io.legado.app.ui.book.read.ChapterSummaryUiState
 import io.legado.app.ui.book.read.ChapterSummaryUiState
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
@@ -45,8 +46,8 @@ fun ChapterSummarySheet(
     ) {
     ) {
         when {
         when {
             state.errorMessage != null -> {
             state.errorMessage != null -> {
-                Column(
-                    modifier = Modifier
+                AppColumn(
+                    Modifier
                         .fillMaxWidth()
                         .fillMaxWidth()
                         .padding(bottom = 24.dp),
                         .padding(bottom = 24.dp),
                     horizontalAlignment = Alignment.CenterHorizontally,
                     horizontalAlignment = Alignment.CenterHorizontally,
@@ -93,7 +94,7 @@ fun ChapterSummarySheet(
                         .height(240.dp),
                         .height(240.dp),
                     contentAlignment = Alignment.Center,
                     contentAlignment = Alignment.Center,
                 ) {
                 ) {
-                    Column(horizontalAlignment = Alignment.CenterHorizontally) {
+                    AppColumn(horizontalAlignment = Alignment.CenterHorizontally) {
                         AppCircularProgressIndicator()
                         AppCircularProgressIndicator()
                         Spacer(Modifier.height(16.dp))
                         Spacer(Modifier.height(16.dp))
                         AppText(
                         AppText(

+ 3 - 1
app/src/main/java/io/legado/app/ui/book/read/sheet/CharsetConfigSheet.kt

@@ -22,6 +22,7 @@ import io.legado.app.R
 import io.legado.app.constant.AppConst
 import io.legado.app.constant.AppConst
 import io.legado.app.model.ReadBook
 import io.legado.app.model.ReadBook
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 
 
 @OptIn(ExperimentalMaterial3Api::class)
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
 @Composable
@@ -37,7 +38,8 @@ fun CharsetConfigSheet(
         containerColor = LegadoTheme.colorScheme.surfaceContainer,
         containerColor = LegadoTheme.colorScheme.surfaceContainer,
         title = { Text(stringResource(R.string.set_charset)) },
         title = { Text(stringResource(R.string.set_charset)) },
         text = {
         text = {
-            Column {
+            AppColumn(
+            ) {
                 ExposedDropdownMenuBox(
                 ExposedDropdownMenuBox(
                     expanded = expanded,
                     expanded = expanded,
                     onExpandedChange = { expanded = it },
                     onExpandedChange = { expanded = it },

+ 6 - 4
app/src/main/java/io/legado/app/ui/book/read/sheet/ClickActionConfigSheet.kt

@@ -27,6 +27,7 @@ import io.legado.app.constant.PreferKey
 import io.legado.app.data.repository.ReadPreferences
 import io.legado.app.data.repository.ReadPreferences
 import io.legado.app.data.repository.ReadSettingsRepository
 import io.legado.app.data.repository.ReadSettingsRepository
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.ui.widget.components.text.AppText
@@ -71,10 +72,10 @@ fun ClickActionConfigSheet(
             .background(LegadoTheme.colorScheme.surfaceContainerLow.copy(alpha = 0.4f))
             .background(LegadoTheme.colorScheme.surfaceContainerLow.copy(alpha = 0.4f))
             .clickable(onClick = onDismissRequest),
             .clickable(onClick = onDismissRequest),
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxSize()
                 .fillMaxSize()
-                .padding(12.dp),
+                .padding(12.dp)
         ) {
         ) {
             Spacer(
             Spacer(
                 modifier = Modifier.padding(top = 36.dp)
                 modifier = Modifier.padding(top = 36.dp)
@@ -180,7 +181,8 @@ fun ClickActionConfigSheet(
         onDismissRequest = { selectingPrefKey = null },
         onDismissRequest = { selectingPrefKey = null },
         title = stringResource(R.string.select_action),
         title = stringResource(R.string.select_action),
         content = {
         content = {
-            Column {
+            AppColumn(
+            ) {
                 actionValues.forEachIndexed { index, label ->
                 actionValues.forEachIndexed { index, label ->
                     AppText(
                     AppText(
                         text = label,
                         text = label,

+ 4 - 3
app/src/main/java/io/legado/app/ui/book/read/sheet/ContentEditSheet.kt

@@ -30,6 +30,7 @@ import io.legado.app.R
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookUiState
 import io.legado.app.ui.book.read.ReadBookUiState
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.checkBox.AppCheckbox
 import io.legado.app.ui.widget.components.checkBox.AppCheckbox
@@ -121,10 +122,10 @@ fun ContentEditSheet(
             )
             )
         },
         },
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
-                .padding(bottom = 16.dp),
+                .padding(bottom = 16.dp)
         ) {
         ) {
             if (state.contentEditLoading) {
             if (state.contentEditLoading) {
                 Box(
                 Box(

+ 6 - 4
app/src/main/java/io/legado/app/ui/book/read/sheet/ContentProcessesSheet.kt

@@ -31,6 +31,7 @@ import io.legado.app.ui.book.read.ContentProcessConfigUiState
 import io.legado.app.ui.book.read.ContentProcessItemUi
 import io.legado.app.ui.book.read.ContentProcessItemUi
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.button.series.MediumToggleButton
 import io.legado.app.ui.widget.components.button.series.MediumToggleButton
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
@@ -113,7 +114,8 @@ fun ContentProcessesSheet(
                         onDismissRequest = { viewingItem = null },
                         onDismissRequest = { viewingItem = null },
                         title = contentProcessTitle(item),
                         title = contentProcessTitle(item),
                         content = {
                         content = {
-                            Column {
+                            AppColumn(
+                            ) {
                                 AppText(
                                 AppText(
                                     text = stringResource(R.string.ai_text_clean_before),
                                     text = stringResource(R.string.ai_text_clean_before),
                                     style = LegadoTheme.typography.labelSmall,
                                     style = LegadoTheme.typography.labelSmall,
@@ -174,10 +176,10 @@ private fun ContentProcessItem(
         onClick = onClick,
         onClick = onClick,
         containerColor = LegadoTheme.colorScheme.onSheetContent,
         containerColor = LegadoTheme.colorScheme.onSheetContent,
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
-                .padding(12.dp),
+                .padding(12.dp)
         ) {
         ) {
             Row(
             Row(
                 modifier = Modifier.fillMaxWidth(),
                 modifier = Modifier.fillMaxWidth(),

+ 2 - 1
app/src/main/java/io/legado/app/ui/book/read/sheet/DownloadSheet.kt

@@ -19,6 +19,7 @@ import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.model.ReadBook
 import io.legado.app.model.ReadBook
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 
 
 @Composable
 @Composable
 fun DownloadSheet(
 fun DownloadSheet(
@@ -34,7 +35,7 @@ fun DownloadSheet(
         containerColor = LegadoTheme.colorScheme.surfaceContainer,
         containerColor = LegadoTheme.colorScheme.surfaceContainer,
         title = { Text(stringResource(R.string.offline_cache)) },
         title = { Text(stringResource(R.string.offline_cache)) },
         text = {
         text = {
-            androidx.compose.foundation.layout.Column {
+            AppColumn {
                 OutlinedTextField(
                 OutlinedTextField(
                     value = startChapter,
                     value = startChapter,
                     onValueChange = { startChapter = it },
                     onValueChange = { startChapter = it },

+ 6 - 3
app/src/main/java/io/legado/app/ui/book/read/sheet/EffectiveReplacesSheet.kt

@@ -26,6 +26,7 @@ import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.data.entities.ReplaceRule
 import io.legado.app.data.entities.ReplaceRule
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.icon.AppIcon
 import io.legado.app.ui.widget.components.icon.AppIcon
@@ -104,7 +105,9 @@ fun EffectiveReplacesSheet(
                                 .padding(horizontal = 12.dp, vertical = 8.dp),
                                 .padding(horizontal = 12.dp, vertical = 8.dp),
                             verticalAlignment = Alignment.CenterVertically,
                             verticalAlignment = Alignment.CenterVertically,
                         ) {
                         ) {
-                            Column(modifier = Modifier.weight(1f)) {
+                            AppColumn(
+                                Modifier.weight(1f)
+                            ) {
                                 AppText(
                                 AppText(
                                     text = if (rule.id == RE_SEGMENT_ID) {
                                     text = if (rule.id == RE_SEGMENT_ID) {
                                         stringResource(R.string.re_segment)
                                         stringResource(R.string.re_segment)
@@ -156,8 +159,8 @@ fun EffectiveReplacesSheet(
                                         else -> onDisableRule(rule)
                                         else -> onDisableRule(rule)
                                     }
                                     }
                                 },
                                 },
-                icon = Icons.Default.Close,
-                contentDescription = stringResource(R.string.close)
+                                icon = Icons.Default.Close,
+                                contentDescription = stringResource(R.string.close)
                             )
                             )
                         }
                         }
                     }
                     }

+ 4 - 3
app/src/main/java/io/legado/app/ui/book/read/sheet/EyeProtectionConfigSheet.kt

@@ -15,6 +15,7 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.dialog.TimePickerDialog
 import io.legado.app.ui.widget.components.dialog.TimePickerDialog
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.settingItem.ClickableSettingItem
 import io.legado.app.ui.widget.components.settingItem.ClickableSettingItem
@@ -52,11 +53,11 @@ fun EyeProtectionConfigSheet(
         title = stringResource(R.string.eye_protection),
         title = stringResource(R.string.eye_protection),
         animateContentSize = false,
         animateContentSize = false,
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .verticalScroll(rememberScrollState())
                 .verticalScroll(rememberScrollState())
-                .padding(bottom = 16.dp),
+                .padding(bottom = 16.dp)
         ) {
         ) {
             SwitchSettingItem(
             SwitchSettingItem(
                 title = stringResource(R.string.eye_protection_enabled),
                 title = stringResource(R.string.eye_protection_enabled),

+ 4 - 3
app/src/main/java/io/legado/app/ui/book/read/sheet/FloatingBarIconConfigSheet.kt

@@ -41,6 +41,7 @@ import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ReadBookButtonConfigItem
 import io.legado.app.ui.book.read.ReadBookButtonConfigItem
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.NormalCard
@@ -121,10 +122,10 @@ private fun ButtonIconConfigSheet(
         onDismissRequest = onDismissRequest,
         onDismissRequest = onDismissRequest,
         title = title,
         title = title,
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
-                .padding(bottom = 16.dp),
+                .padding(bottom = 16.dp)
         ) {
         ) {
             LazyColumn(
             LazyColumn(
                 state = lazyListState,
                 state = lazyListState,

+ 10 - 5
app/src/main/java/io/legado/app/ui/book/read/sheet/GlobalThemePage.kt

@@ -60,6 +60,7 @@ import io.legado.app.ui.book.read.ReadBookSheet
 import io.legado.app.ui.book.read.ReadBookStyleConfig
 import io.legado.app.ui.book.read.ReadBookStyleConfig
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.fadingEdge
 import io.legado.app.ui.theme.fadingEdge
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.TextCard
 import io.legado.app.ui.widget.components.card.TextCard
@@ -93,8 +94,8 @@ fun GlobalThemePage(
 
 
     val configList = styleConfig.styleItems
     val configList = styleConfig.styleItems
 
 
-    Column(
-        modifier = modifier
+    AppColumn(
+        modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .verticalScroll(rememberScrollState())
             .verticalScroll(rememberScrollState())
     ) {
     ) {
@@ -134,8 +135,6 @@ fun GlobalThemePage(
         }
         }
 
 
         Spacer(Modifier.height(4.dp))
         Spacer(Modifier.height(4.dp))
-
-        // Style section label + Day/Night
         NormalCard(
         NormalCard(
             containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
             containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
             cornerRadius = 12.dp
             cornerRadius = 12.dp
@@ -208,7 +207,13 @@ fun GlobalThemePage(
                     NormalCard(
                     NormalCard(
                         onClick = {
                         onClick = {
                             val newShareLayout = !shareLayout
                             val newShareLayout = !shareLayout
-                            onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.ShareLayout(newShareLayout)))
+                            onIntent(
+                                ReadBookIntent.UpdateConfig(
+                                    ConfigUpdate.ShareLayout(
+                                        newShareLayout
+                                    )
+                                )
+                            )
                             onShareLayoutChange(newShareLayout)
                             onShareLayoutChange(newShareLayout)
                         },
                         },
                         modifier = Modifier
                         modifier = Modifier

+ 414 - 293
app/src/main/java/io/legado/app/ui/book/read/sheet/HeaderFooterPage.kt

@@ -50,6 +50,7 @@ import io.legado.app.help.config.ReadBookConfig
 import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.FontFolderState
 import io.legado.app.ui.widget.components.FontFolderState
 import io.legado.app.ui.widget.components.FontSelectSheet
 import io.legado.app.ui.widget.components.FontSelectSheet
 import io.legado.app.ui.widget.components.dialog.CustomTipDialog
 import io.legado.app.ui.widget.components.dialog.CustomTipDialog
@@ -200,22 +201,27 @@ internal fun HeaderFooterPage(
                 headerLeft = value
                 headerLeft = value
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipHeaderLeft(value)))
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipHeaderLeft(value)))
             }
             }
+
             CustomTipTarget.HEADER_MIDDLE -> {
             CustomTipTarget.HEADER_MIDDLE -> {
                 headerMiddle = value
                 headerMiddle = value
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipHeaderMiddle(value)))
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipHeaderMiddle(value)))
             }
             }
+
             CustomTipTarget.HEADER_RIGHT -> {
             CustomTipTarget.HEADER_RIGHT -> {
                 headerRight = value
                 headerRight = value
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipHeaderRight(value)))
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipHeaderRight(value)))
             }
             }
+
             CustomTipTarget.FOOTER_LEFT -> {
             CustomTipTarget.FOOTER_LEFT -> {
                 footerLeft = value
                 footerLeft = value
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipFooterLeft(value)))
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipFooterLeft(value)))
             }
             }
+
             CustomTipTarget.FOOTER_MIDDLE -> {
             CustomTipTarget.FOOTER_MIDDLE -> {
                 footerMiddle = value
                 footerMiddle = value
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipFooterMiddle(value)))
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipFooterMiddle(value)))
             }
             }
+
             CustomTipTarget.FOOTER_RIGHT -> {
             CustomTipTarget.FOOTER_RIGHT -> {
                 footerRight = value
                 footerRight = value
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipFooterRight(value)))
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipFooterRight(value)))
@@ -244,8 +250,8 @@ internal fun HeaderFooterPage(
         }
         }
     }
     }
 
 
-    Column(
-        modifier = modifier
+    AppColumn(
+        modifier
             .fillMaxWidth()
             .fillMaxWidth()
     ) {
     ) {
         CardTabRow(
         CardTabRow(
@@ -258,7 +264,10 @@ internal fun HeaderFooterPage(
                     try {
                     try {
                         pagerState.animateScrollToPage(
                         pagerState.animateScrollToPage(
                             page = index,
                             page = index,
-                            animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
+                            animationSpec = tween(
+                                durationMillis = 300,
+                                easing = FastOutSlowInEasing
+                            )
                         )
                         )
                     } finally {
                     } finally {
                         clickScrollCount = (clickScrollCount - 1).coerceAtLeast(0)
                         clickScrollCount = (clickScrollCount - 1).coerceAtLeast(0)
@@ -284,320 +293,432 @@ internal fun HeaderFooterPage(
                     }
                     }
             ) {
             ) {
                 when (page) {
                 when (page) {
-                0 -> {
-                    // Header tab
-                    Column(
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .padding(horizontal = 16.dp)
-                            .verticalScroll(headerScrollState),
-                    ) {
-                        TinySwitchSettingItem(
-                            title = stringResource(R.string.showLine),
-                            checked = showHeaderLine,
-                            onCheckedChange = {
-                                showHeaderLine = it
-                                onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.ShowHeaderLine(it)))
-                            },
-                        )
-                        val headerModes = ReadBookConfig.getHeaderModes(context)
-                        TinyDropdownSettingItem(
-                            title = stringResource(R.string.header),
-                            selectedValue = headerMode.toString(),
-                            displayEntries = headerModes.values.toTypedArray(),
-                            entryValues = headerModes.keys.map { it.toString() }.toTypedArray(),
-                            onValueChange = {
-                                headerMode = it.toInt()
-                                onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.HeaderMode(headerMode)))
-                            },
-                        )
-                        TipPositionDropdown(
-                            label = stringResource(R.string.left),
-                            value = headerLeft,
-                            tipNames = tipNames,
-                            tipValues = tipValues,
-                            onValueChange = { handleTipChange(CustomTipTarget.HEADER_LEFT, it) },
-                        )
-                        TipPositionDropdown(
-                            label = stringResource(R.string.middle),
-                            value = headerMiddle,
-                            tipNames = tipNames,
-                            tipValues = tipValues,
-                            onValueChange = { handleTipChange(CustomTipTarget.HEADER_MIDDLE, it) },
-                        )
-                        TipPositionDropdown(
-                            label = stringResource(R.string.right),
-                            value = headerRight,
-                            tipNames = tipNames,
-                            tipValues = tipValues,
-                            onValueChange = { handleTipChange(CustomTipTarget.HEADER_RIGHT, it) },
-                        )
-                        TinyColorModeSettingItem(
-                            title = stringResource(R.string.header_color),
-                            dayColor = if (ReadBookConfig.tipHeaderColor != 0) {
-                                ReadBookConfig.tipHeaderColor
-                            } else {
-                                ReadBookConfig.textColor
-                            },
-                            nightColor = if (ReadBookConfig.tipHeaderColorNight != 0) {
-                                ReadBookConfig.tipHeaderColorNight
-                            } else {
-                                ReadBookConfig.textColorNight
-                            },
-                            onClickColor = { isNight ->
-                                if (isNight) {
-                                    colorPickerId = COLOR_HEADER_NIGHT
-                                    colorPickerInitial = if (ReadBookConfig.tipHeaderColorNight != 0) {
-                                        ReadBookConfig.tipHeaderColorNight
-                                    } else {
-                                        ReadBookConfig.textColorNight
-                                    }
+                    0 -> {
+                        // Header tab
+                        Column(
+                            modifier = Modifier
+                                .fillMaxWidth()
+                                .padding(horizontal = 16.dp)
+                                .verticalScroll(headerScrollState),
+                        ) {
+                            TinySwitchSettingItem(
+                                title = stringResource(R.string.showLine),
+                                checked = showHeaderLine,
+                                onCheckedChange = {
+                                    showHeaderLine = it
+                                    onIntent(
+                                        ReadBookIntent.UpdateConfig(
+                                            ConfigUpdate.ShowHeaderLine(
+                                                it
+                                            )
+                                        )
+                                    )
+                                },
+                            )
+                            val headerModes = ReadBookConfig.getHeaderModes(context)
+                            TinyDropdownSettingItem(
+                                title = stringResource(R.string.header),
+                                selectedValue = headerMode.toString(),
+                                displayEntries = headerModes.values.toTypedArray(),
+                                entryValues = headerModes.keys.map { it.toString() }.toTypedArray(),
+                                onValueChange = {
+                                    headerMode = it.toInt()
+                                    onIntent(
+                                        ReadBookIntent.UpdateConfig(
+                                            ConfigUpdate.HeaderMode(
+                                                headerMode
+                                            )
+                                        )
+                                    )
+                                },
+                            )
+                            TipPositionDropdown(
+                                label = stringResource(R.string.left),
+                                value = headerLeft,
+                                tipNames = tipNames,
+                                tipValues = tipValues,
+                                onValueChange = {
+                                    handleTipChange(
+                                        CustomTipTarget.HEADER_LEFT,
+                                        it
+                                    )
+                                },
+                            )
+                            TipPositionDropdown(
+                                label = stringResource(R.string.middle),
+                                value = headerMiddle,
+                                tipNames = tipNames,
+                                tipValues = tipValues,
+                                onValueChange = {
+                                    handleTipChange(
+                                        CustomTipTarget.HEADER_MIDDLE,
+                                        it
+                                    )
+                                },
+                            )
+                            TipPositionDropdown(
+                                label = stringResource(R.string.right),
+                                value = headerRight,
+                                tipNames = tipNames,
+                                tipValues = tipValues,
+                                onValueChange = {
+                                    handleTipChange(
+                                        CustomTipTarget.HEADER_RIGHT,
+                                        it
+                                    )
+                                },
+                            )
+                            TinyColorModeSettingItem(
+                                title = stringResource(R.string.header_color),
+                                dayColor = if (ReadBookConfig.tipHeaderColor != 0) {
+                                    ReadBookConfig.tipHeaderColor
+                                } else {
+                                    ReadBookConfig.textColor
+                                },
+                                nightColor = if (ReadBookConfig.tipHeaderColorNight != 0) {
+                                    ReadBookConfig.tipHeaderColorNight
                                 } else {
                                 } else {
-                                    colorPickerId = COLOR_HEADER
-                                    colorPickerInitial = if (ReadBookConfig.tipHeaderColor != 0) {
-                                        ReadBookConfig.tipHeaderColor
+                                    ReadBookConfig.textColorNight
+                                },
+                                onClickColor = { isNight ->
+                                    if (isNight) {
+                                        colorPickerId = COLOR_HEADER_NIGHT
+                                        colorPickerInitial =
+                                            if (ReadBookConfig.tipHeaderColorNight != 0) {
+                                                ReadBookConfig.tipHeaderColorNight
+                                            } else {
+                                                ReadBookConfig.textColorNight
+                                            }
                                     } else {
                                     } else {
-                                        ReadBookConfig.textColor
+                                        colorPickerId = COLOR_HEADER
+                                        colorPickerInitial =
+                                            if (ReadBookConfig.tipHeaderColor != 0) {
+                                                ReadBookConfig.tipHeaderColor
+                                            } else {
+                                                ReadBookConfig.textColor
+                                            }
                                     }
                                     }
+                                    showColorPicker = true
+                                },
+                            )
+
+                            TinyClickableSettingItem(
+                                title = stringResource(R.string.padding),
+                                description = stringResource(
+                                    R.string.padding_format,
+                                    headerPaddingTop.toInt(),
+                                    headerPaddingBottom.toInt(),
+                                    headerPaddingLeft.toInt(),
+                                    headerPaddingRight.toInt(),
+                                ),
+                                trailingContent = {
+                                    Icon(
+                                        imageVector = if (expandHeaderPadding) Icons.Default.ExpandMore else Icons.Default.ChevronRight,
+                                        contentDescription = null,
+                                        tint = LegadoTheme.colorScheme.onSurfaceVariant,
+                                        modifier = Modifier.size(20.dp),
+                                    )
+                                },
+                                onClick = {
+                                    expandHeaderPadding = !expandHeaderPadding
+                                },
+                            )
+                            AnimatedVisibility(
+                                visible = expandHeaderPadding,
+                                enter = expandVertically() + fadeIn(),
+                                exit = shrinkVertically() + fadeOut(),
+                            ) {
+                                Column(modifier = Modifier.fillMaxWidth()) {
+                                    PaddingSliders(
+                                        top = headerPaddingTop, bottom = headerPaddingBottom,
+                                        left = headerPaddingLeft, right = headerPaddingRight,
+                                        onTopChange = {
+                                            headerPaddingTop = it
+                                            onIntent(
+                                                ReadBookIntent.UpdateConfig(
+                                                    ConfigUpdate.HeaderPaddingTop(
+                                                        it.toInt()
+                                                    )
+                                                )
+                                            )
+                                        },
+                                        onBottomChange = {
+                                            headerPaddingBottom = it
+                                            onIntent(
+                                                ReadBookIntent.UpdateConfig(
+                                                    ConfigUpdate.HeaderPaddingBottom(
+                                                        it.toInt()
+                                                    )
+                                                )
+                                            )
+                                        },
+                                        onLeftChange = {
+                                            headerPaddingLeft = it
+                                            onIntent(
+                                                ReadBookIntent.UpdateConfig(
+                                                    ConfigUpdate.HeaderPaddingLeft(
+                                                        it.toInt()
+                                                    )
+                                                )
+                                            )
+                                        },
+                                        onRightChange = {
+                                            headerPaddingRight = it
+                                            onIntent(
+                                                ReadBookIntent.UpdateConfig(
+                                                    ConfigUpdate.HeaderPaddingRight(
+                                                        it.toInt()
+                                                    )
+                                                )
+                                            )
+                                        },
+                                    )
                                 }
                                 }
-                                showColorPicker = true
-                            },
-                        )
-
-                        TinyClickableSettingItem(
-                            title = stringResource(R.string.padding),
-                            description = stringResource(
-                                R.string.padding_format,
-                                headerPaddingTop.toInt(),
-                                headerPaddingBottom.toInt(),
-                                headerPaddingLeft.toInt(),
-                                headerPaddingRight.toInt(),
-                            ),
-                            trailingContent = {
-                                Icon(
-                                    imageVector = if (expandHeaderPadding) Icons.Default.ExpandMore else Icons.Default.ChevronRight,
-                                    contentDescription = null,
-                                    tint = LegadoTheme.colorScheme.onSurfaceVariant,
-                                    modifier = Modifier.size(20.dp),
-                                )
-                            },
-                            onClick = {
-                                expandHeaderPadding = !expandHeaderPadding
-                            },
-                        )
-                        AnimatedVisibility(
-                            visible = expandHeaderPadding,
-                            enter = expandVertically() + fadeIn(),
-                            exit = shrinkVertically() + fadeOut(),
-                        ) {
-                            Column(modifier = Modifier.fillMaxWidth()) {
-                                PaddingSliders(
-                                    top = headerPaddingTop, bottom = headerPaddingBottom,
-                                    left = headerPaddingLeft, right = headerPaddingRight,
-                                    onTopChange = {
-                                        headerPaddingTop = it
-                                        onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.HeaderPaddingTop(it.toInt())))
-                                    },
-                                    onBottomChange = {
-                                        headerPaddingBottom = it
-                                        onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.HeaderPaddingBottom(it.toInt())))
-                                    },
-                                    onLeftChange = {
-                                        headerPaddingLeft = it
-                                        onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.HeaderPaddingLeft(it.toInt())))
-                                    },
-                                    onRightChange = {
-                                        headerPaddingRight = it
-                                        onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.HeaderPaddingRight(it.toInt())))
-                                    },
-                                )
                             }
                             }
                         }
                         }
                     }
                     }
-                }
 
 
-                1 -> {
-                    // Footer tab
-                    Column(
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .padding(horizontal = 16.dp)
-                            .verticalScroll(footerScrollState),
-                    ) {
-                        TinySwitchSettingItem(
-                            title = stringResource(R.string.showLine),
-                            checked = showFooterLine,
-                            onCheckedChange = {
-                                showFooterLine = it
-                                onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.ShowFooterLine(it)))
-                            },
-                        )
-                        val footerModes = ReadBookConfig.getFooterModes(context)
-                        TinyDropdownSettingItem(
-                            title = stringResource(R.string.footer),
-                            selectedValue = footerMode.toString(),
-                            displayEntries = footerModes.values.toTypedArray(),
-                            entryValues = footerModes.keys.map { it.toString() }.toTypedArray(),
-                            onValueChange = {
-                                footerMode = it.toInt()
-                                onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.FooterMode(footerMode)))
-                            },
-                        )
-                        TipPositionDropdown(
-                            label = stringResource(R.string.left),
-                            value = footerLeft,
-                            tipNames = tipNames,
-                            tipValues = tipValues,
-                            onValueChange = { handleTipChange(CustomTipTarget.FOOTER_LEFT, it) },
-                        )
-                        TipPositionDropdown(
-                            label = stringResource(R.string.middle),
-                            value = footerMiddle,
-                            tipNames = tipNames,
-                            tipValues = tipValues,
-                            onValueChange = { handleTipChange(CustomTipTarget.FOOTER_MIDDLE, it) },
-                        )
-                        TipPositionDropdown(
-                            label = stringResource(R.string.right),
-                            value = footerRight,
-                            tipNames = tipNames,
-                            tipValues = tipValues,
-                            onValueChange = { handleTipChange(CustomTipTarget.FOOTER_RIGHT, it) },
-                        )
-                        TinyColorModeSettingItem(
-                            title = stringResource(R.string.footer_color),
-                            dayColor = if (ReadBookConfig.tipFooterColor != 0) {
-                                ReadBookConfig.tipFooterColor
-                            } else {
-                                ReadBookConfig.textColor
-                            },
-                            nightColor = if (ReadBookConfig.tipFooterColorNight != 0) {
-                                ReadBookConfig.tipFooterColorNight
-                            } else {
-                                ReadBookConfig.textColorNight
-                            },
-                            onClickColor = { isNight ->
-                                if (isNight) {
-                                    colorPickerId = COLOR_FOOTER_NIGHT
-                                    colorPickerInitial = if (ReadBookConfig.tipFooterColorNight != 0) {
-                                        ReadBookConfig.tipFooterColorNight
-                                    } else {
-                                        ReadBookConfig.textColorNight
-                                    }
+                    1 -> {
+                        // Footer tab
+                        Column(
+                            modifier = Modifier
+                                .fillMaxWidth()
+                                .padding(horizontal = 16.dp)
+                                .verticalScroll(footerScrollState),
+                        ) {
+                            TinySwitchSettingItem(
+                                title = stringResource(R.string.showLine),
+                                checked = showFooterLine,
+                                onCheckedChange = {
+                                    showFooterLine = it
+                                    onIntent(
+                                        ReadBookIntent.UpdateConfig(
+                                            ConfigUpdate.ShowFooterLine(
+                                                it
+                                            )
+                                        )
+                                    )
+                                },
+                            )
+                            val footerModes = ReadBookConfig.getFooterModes(context)
+                            TinyDropdownSettingItem(
+                                title = stringResource(R.string.footer),
+                                selectedValue = footerMode.toString(),
+                                displayEntries = footerModes.values.toTypedArray(),
+                                entryValues = footerModes.keys.map { it.toString() }.toTypedArray(),
+                                onValueChange = {
+                                    footerMode = it.toInt()
+                                    onIntent(
+                                        ReadBookIntent.UpdateConfig(
+                                            ConfigUpdate.FooterMode(
+                                                footerMode
+                                            )
+                                        )
+                                    )
+                                },
+                            )
+                            TipPositionDropdown(
+                                label = stringResource(R.string.left),
+                                value = footerLeft,
+                                tipNames = tipNames,
+                                tipValues = tipValues,
+                                onValueChange = {
+                                    handleTipChange(
+                                        CustomTipTarget.FOOTER_LEFT,
+                                        it
+                                    )
+                                },
+                            )
+                            TipPositionDropdown(
+                                label = stringResource(R.string.middle),
+                                value = footerMiddle,
+                                tipNames = tipNames,
+                                tipValues = tipValues,
+                                onValueChange = {
+                                    handleTipChange(
+                                        CustomTipTarget.FOOTER_MIDDLE,
+                                        it
+                                    )
+                                },
+                            )
+                            TipPositionDropdown(
+                                label = stringResource(R.string.right),
+                                value = footerRight,
+                                tipNames = tipNames,
+                                tipValues = tipValues,
+                                onValueChange = {
+                                    handleTipChange(
+                                        CustomTipTarget.FOOTER_RIGHT,
+                                        it
+                                    )
+                                },
+                            )
+                            TinyColorModeSettingItem(
+                                title = stringResource(R.string.footer_color),
+                                dayColor = if (ReadBookConfig.tipFooterColor != 0) {
+                                    ReadBookConfig.tipFooterColor
                                 } else {
                                 } else {
-                                    colorPickerId = COLOR_FOOTER
-                                    colorPickerInitial = if (ReadBookConfig.tipFooterColor != 0) {
-                                        ReadBookConfig.tipFooterColor
+                                    ReadBookConfig.textColor
+                                },
+                                nightColor = if (ReadBookConfig.tipFooterColorNight != 0) {
+                                    ReadBookConfig.tipFooterColorNight
+                                } else {
+                                    ReadBookConfig.textColorNight
+                                },
+                                onClickColor = { isNight ->
+                                    if (isNight) {
+                                        colorPickerId = COLOR_FOOTER_NIGHT
+                                        colorPickerInitial =
+                                            if (ReadBookConfig.tipFooterColorNight != 0) {
+                                                ReadBookConfig.tipFooterColorNight
+                                            } else {
+                                                ReadBookConfig.textColorNight
+                                            }
                                     } else {
                                     } else {
-                                        ReadBookConfig.textColor
+                                        colorPickerId = COLOR_FOOTER
+                                        colorPickerInitial =
+                                            if (ReadBookConfig.tipFooterColor != 0) {
+                                                ReadBookConfig.tipFooterColor
+                                            } else {
+                                                ReadBookConfig.textColor
+                                            }
                                     }
                                     }
+                                    showColorPicker = true
+                                },
+                            )
+
+                            TinyClickableSettingItem(
+                                title = stringResource(R.string.padding),
+                                description = stringResource(
+                                    R.string.padding_format,
+                                    footerPaddingTop.toInt(),
+                                    footerPaddingBottom.toInt(),
+                                    footerPaddingLeft.toInt(),
+                                    footerPaddingRight.toInt(),
+                                ),
+                                trailingContent = {
+                                    Icon(
+                                        imageVector = if (expandFooterPadding) Icons.Default.ExpandMore else Icons.Default.ChevronRight,
+                                        contentDescription = null,
+                                        tint = LegadoTheme.colorScheme.onSurfaceVariant,
+                                        modifier = Modifier.size(20.dp),
+                                    )
+                                },
+                                onClick = {
+                                    expandFooterPadding = !expandFooterPadding
+                                },
+                            )
+                            AnimatedVisibility(
+                                visible = expandFooterPadding,
+                                enter = expandVertically() + fadeIn(),
+                                exit = shrinkVertically() + fadeOut(),
+                            ) {
+                                Column(modifier = Modifier.fillMaxWidth()) {
+                                    PaddingSliders(
+                                        top = footerPaddingTop, bottom = footerPaddingBottom,
+                                        left = footerPaddingLeft, right = footerPaddingRight,
+                                        onTopChange = {
+                                            footerPaddingTop = it
+                                            onIntent(
+                                                ReadBookIntent.UpdateConfig(
+                                                    ConfigUpdate.FooterPaddingTop(
+                                                        it.toInt()
+                                                    )
+                                                )
+                                            )
+                                        },
+                                        onBottomChange = {
+                                            footerPaddingBottom = it
+                                            onIntent(
+                                                ReadBookIntent.UpdateConfig(
+                                                    ConfigUpdate.FooterPaddingBottom(
+                                                        it.toInt()
+                                                    )
+                                                )
+                                            )
+                                        },
+                                        onLeftChange = {
+                                            footerPaddingLeft = it
+                                            onIntent(
+                                                ReadBookIntent.UpdateConfig(
+                                                    ConfigUpdate.FooterPaddingLeft(
+                                                        it.toInt()
+                                                    )
+                                                )
+                                            )
+                                        },
+                                        onRightChange = {
+                                            footerPaddingRight = it
+                                            onIntent(
+                                                ReadBookIntent.UpdateConfig(
+                                                    ConfigUpdate.FooterPaddingRight(
+                                                        it.toInt()
+                                                    )
+                                                )
+                                            )
+                                        },
+                                    )
                                 }
                                 }
-                                showColorPicker = true
-                            },
-                        )
-
-                        TinyClickableSettingItem(
-                            title = stringResource(R.string.padding),
-                            description = stringResource(
-                                R.string.padding_format,
-                                footerPaddingTop.toInt(),
-                                footerPaddingBottom.toInt(),
-                                footerPaddingLeft.toInt(),
-                                footerPaddingRight.toInt(),
-                            ),
-                            trailingContent = {
-                                Icon(
-                                    imageVector = if (expandFooterPadding) Icons.Default.ExpandMore else Icons.Default.ChevronRight,
-                                    contentDescription = null,
-                                    tint = LegadoTheme.colorScheme.onSurfaceVariant,
-                                    modifier = Modifier.size(20.dp),
-                                )
-                            },
-                            onClick = {
-                                expandFooterPadding = !expandFooterPadding
-                            },
-                        )
-                        AnimatedVisibility(
-                            visible = expandFooterPadding,
-                            enter = expandVertically() + fadeIn(),
-                            exit = shrinkVertically() + fadeOut(),
-                        ) {
-                            Column(modifier = Modifier.fillMaxWidth()) {
-                                PaddingSliders(
-                                    top = footerPaddingTop, bottom = footerPaddingBottom,
-                                    left = footerPaddingLeft, right = footerPaddingRight,
-                                    onTopChange = {
-                                        footerPaddingTop = it
-                                        onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.FooterPaddingTop(it.toInt())))
-                                    },
-                                    onBottomChange = {
-                                        footerPaddingBottom = it
-                                        onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.FooterPaddingBottom(it.toInt())))
-                                    },
-                                    onLeftChange = {
-                                        footerPaddingLeft = it
-                                        onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.FooterPaddingLeft(it.toInt())))
-                                    },
-                                    onRightChange = {
-                                        footerPaddingRight = it
-                                        onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.FooterPaddingRight(it.toInt())))
-                                    },
-                                )
                             }
                             }
                         }
                         }
                     }
                     }
-                }
 
 
-                2 -> {
-                    // Global tab
-                    Column(
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .padding(horizontal = 16.dp)
-                            .verticalScroll(rememberScrollState()),
-                    ) {
-                        SectionTitle(stringResource(R.string.read_config_divider_line))
-                        TinyColorSettingItem(
-                            title = stringResource(R.string.tip_divider_color),
-                            colorValue = when (ReadBookConfig.tipDividerColor) {
-                                -1 -> context.getCompatColor(R.color.divider)
-                                0 -> ReadBookConfig.textColor
-                                else -> ReadBookConfig.tipDividerColor
-                            },
-                            onClick = {
-                                colorPickerId = COLOR_DIVIDER
-                                colorPickerInitial = when (ReadBookConfig.tipDividerColor) {
+                    2 -> {
+                        // Global tab
+                        Column(
+                            modifier = Modifier
+                                .fillMaxWidth()
+                                .padding(horizontal = 16.dp)
+                                .verticalScroll(rememberScrollState()),
+                        ) {
+                            SectionTitle(stringResource(R.string.read_config_divider_line))
+                            TinyColorSettingItem(
+                                title = stringResource(R.string.tip_divider_color),
+                                colorValue = when (ReadBookConfig.tipDividerColor) {
                                     -1 -> context.getCompatColor(R.color.divider)
                                     -1 -> context.getCompatColor(R.color.divider)
                                     0 -> ReadBookConfig.textColor
                                     0 -> ReadBookConfig.textColor
                                     else -> ReadBookConfig.tipDividerColor
                                     else -> ReadBookConfig.tipDividerColor
-                                }
-                                showColorPicker = true
-                            },
-                        )
-
-                        SectionTitle(stringResource(R.string.text_typeface))
-                        TinyClickableSettingItem(
-                            title = stringResource(R.string.header_font),
-                            description = stringResource(R.string.select_font),
-                            imageVector = Icons.Default.TextFields,
-                            onClick = { showFontSelect = true },
-                        )
-                        TinySliderSettingItem(
-                            title = stringResource(R.string.header_font_size),
-                            value = headerFontSize.toFloat(),
-                            valueRange = 0f..100f,
-                            onValueChange = { value ->
-                                headerFontSize = value.toInt()
-                                onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.HeaderFontSize(value.toInt())))
-                                onIntent(ReadBookIntent.SaveReadStyleConfig)
-                            },
-                        )
+                                },
+                                onClick = {
+                                    colorPickerId = COLOR_DIVIDER
+                                    colorPickerInitial = when (ReadBookConfig.tipDividerColor) {
+                                        -1 -> context.getCompatColor(R.color.divider)
+                                        0 -> ReadBookConfig.textColor
+                                        else -> ReadBookConfig.tipDividerColor
+                                    }
+                                    showColorPicker = true
+                                },
+                            )
+
+                            SectionTitle(stringResource(R.string.text_typeface))
+                            TinyClickableSettingItem(
+                                title = stringResource(R.string.header_font),
+                                description = stringResource(R.string.select_font),
+                                imageVector = Icons.Default.TextFields,
+                                onClick = { showFontSelect = true },
+                            )
+                            TinySliderSettingItem(
+                                title = stringResource(R.string.header_font_size),
+                                value = headerFontSize.toFloat(),
+                                valueRange = 0f..100f,
+                                onValueChange = { value ->
+                                    headerFontSize = value.toInt()
+                                    onIntent(
+                                        ReadBookIntent.UpdateConfig(
+                                            ConfigUpdate.HeaderFontSize(
+                                                value.toInt()
+                                            )
+                                        )
+                                    )
+                                    onIntent(ReadBookIntent.SaveReadStyleConfig)
+                                },
+                            )
+                        }
                     }
                     }
                 }
                 }
             }
             }
         }
         }
     }
     }
-}
 
 
     // Color picker
     // Color picker
     ColorPickerSheet(
     ColorPickerSheet(

+ 4 - 3
app/src/main/java/io/legado/app/ui/book/read/sheet/HighlightRuleConfigSheet.kt

@@ -32,6 +32,7 @@ import io.legado.app.data.entities.HighlightRule
 import io.legado.app.data.repository.configNames
 import io.legado.app.data.repository.configNames
 import io.legado.app.ui.book.read.HighlightRuleConfigUiState
 import io.legado.app.ui.book.read.HighlightRuleConfigUiState
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.TinySwitch
 import io.legado.app.ui.widget.components.TinySwitch
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
@@ -164,10 +165,10 @@ fun HighlightRuleConfigSheet(
             }
             }
         },
         },
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
-                .padding(bottom = 16.dp),
+                .padding(bottom = 16.dp)
         ) {
         ) {
             LazyColumn(
             LazyColumn(
                 state = listState,
                 state = listState,

+ 4 - 20
app/src/main/java/io/legado/app/ui/book/read/sheet/HighlightRuleEditSheet.kt

@@ -50,6 +50,7 @@ import io.legado.app.data.repository.ReadSettingsRepository
 import io.legado.app.data.repository.configNames
 import io.legado.app.data.repository.configNames
 import io.legado.app.data.repository.toJsonArray
 import io.legado.app.data.repository.toJsonArray
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.FontFolderState
 import io.legado.app.ui.widget.components.FontFolderState
 import io.legado.app.ui.widget.components.FontSelectSheet
 import io.legado.app.ui.widget.components.FontSelectSheet
@@ -236,13 +237,12 @@ fun HighlightRuleEditSheet(
             )
             )
         },
         },
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(bottom = 16.dp)
                 .padding(bottom = 16.dp)
-                .verticalScroll(rememberScrollState()),
+                .verticalScroll(rememberScrollState())
         ) {
         ) {
-            // === Section 1: Rule Info ===
             SectionTitle(stringResource(R.string.rule_info))
             SectionTitle(stringResource(R.string.rule_info))
 
 
             AppTextField(
             AppTextField(
@@ -295,11 +295,7 @@ fun HighlightRuleEditSheet(
                 checked = enabled,
                 checked = enabled,
                 onCheckedChange = { enabled = it },
                 onCheckedChange = { enabled = it },
             )
             )
-
-            // === Section 2: Style Settings ===
             SectionTitle(stringResource(R.string.style_settings))
             SectionTitle(stringResource(R.string.style_settings))
-
-            // Text color
             TinySwitchSettingItem(
             TinySwitchSettingItem(
                 title = stringResource(R.string.text_color),
                 title = stringResource(R.string.text_color),
                 checked = hasTextColor,
                 checked = hasTextColor,
@@ -312,8 +308,6 @@ fun HighlightRuleEditSheet(
                     onClick = { showTextColorPicker = true },
                     onClick = { showTextColorPicker = true },
                 )
                 )
             }
             }
-
-            // Underline
             TinySwitchSettingItem(
             TinySwitchSettingItem(
                 title = stringResource(R.string.underline_style),
                 title = stringResource(R.string.underline_style),
                 checked = hasUnderline,
                 checked = hasUnderline,
@@ -376,8 +370,6 @@ fun HighlightRuleEditSheet(
                     }
                     }
                 }
                 }
             }
             }
-
-            // Background color
             TinySwitchSettingItem(
             TinySwitchSettingItem(
                 title = stringResource(R.string.bg_color),
                 title = stringResource(R.string.bg_color),
                 checked = hasBgColor,
                 checked = hasBgColor,
@@ -390,8 +382,6 @@ fun HighlightRuleEditSheet(
                     onClick = { showBgColorPicker = true },
                     onClick = { showBgColorPicker = true },
                 )
                 )
             }
             }
-
-            // Background image
             TinySwitchSettingItem(
             TinySwitchSettingItem(
                 title = stringResource(R.string.highlight_bg_image),
                 title = stringResource(R.string.highlight_bg_image),
                 checked = hasBgImage,
                 checked = hasBgImage,
@@ -431,8 +421,6 @@ fun HighlightRuleEditSheet(
                     )
                     )
                 }
                 }
             }
             }
-
-            // === Section 3: Config Binding ===
             if (allConfigNames.isNotEmpty()) {
             if (allConfigNames.isNotEmpty()) {
                 SectionTitle("应用排版")
                 SectionTitle("应用排版")
                 LazyRow(
                 LazyRow(
@@ -483,8 +471,6 @@ fun HighlightRuleEditSheet(
                     }
                     }
                 }
                 }
             }
             }
-
-            // === Section 4: Font ===
             SectionTitle("字体替换")
             SectionTitle("字体替换")
             TinySwitchSettingItem(
             TinySwitchSettingItem(
                 title = "自定义字体",
                 title = "自定义字体",
@@ -498,8 +484,6 @@ fun HighlightRuleEditSheet(
                     onClick = { showFontSelect = true },
                     onClick = { showFontSelect = true },
                 )
                 )
             }
             }
-
-            // === Section 5: Preview ===
             SectionTitle(stringResource(R.string.preview_effect))
             SectionTitle(stringResource(R.string.preview_effect))
 
 
             AppTextField(
             AppTextField(

+ 4 - 8
app/src/main/java/io/legado/app/ui/book/read/sheet/MoreConfigSheet.kt

@@ -18,6 +18,7 @@ import io.legado.app.data.repository.ReadSettingsRepository
 import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookSheet
 import io.legado.app.ui.book.read.ReadBookSheet
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.SectionTitle
 import io.legado.app.ui.widget.components.SectionTitle
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.settingItem.TinyClickableSettingItem
 import io.legado.app.ui.widget.components.settingItem.TinyClickableSettingItem
@@ -44,13 +45,12 @@ fun MoreConfigSheet(
         onDismissRequest = onDismissRequest,
         onDismissRequest = onDismissRequest,
         title = stringResource(R.string.more_setting),
         title = stringResource(R.string.more_setting),
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(bottom = 16.dp)
                 .padding(bottom = 16.dp)
-                .verticalScroll(rememberScrollState()),
+                .verticalScroll(rememberScrollState())
         ) {
         ) {
-            // Screen settings
             SectionTitle(stringResource(R.string.screen_settings))
             SectionTitle(stringResource(R.string.screen_settings))
             ScreenSettings(
             ScreenSettings(
                 preferences = preferences,
                 preferences = preferences,
@@ -91,8 +91,6 @@ fun MoreConfigSheet(
                     onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.EyeProtection))
                     onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.EyeProtection))
                 }
                 }
             )
             )
-
-            // Page control
             SectionTitle(stringResource(R.string.page_control))
             SectionTitle(stringResource(R.string.page_control))
             PageControlSettings(
             PageControlSettings(
                 preferences = preferences,
                 preferences = preferences,
@@ -115,8 +113,6 @@ fun MoreConfigSheet(
                     onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.KeyPageOnLongPress(it)))
                     onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.KeyPageOnLongPress(it)))
                 },
                 },
             )
             )
-
-            // Other
             SectionTitle(stringResource(R.string.other))
             SectionTitle(stringResource(R.string.other))
             OtherSettings(
             OtherSettings(
                 preferences = preferences,
                 preferences = preferences,

+ 6 - 3
app/src/main/java/io/legado/app/ui/book/read/sheet/PaddingConfigSheet.kt

@@ -29,6 +29,7 @@ import io.legado.app.R
 import io.legado.app.ui.book.read.ReadSheetConfigUiState
 import io.legado.app.ui.book.read.ReadSheetConfigUiState
 import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.pager.pagerHeight
 import io.legado.app.ui.widget.components.pager.pagerHeight
 import io.legado.app.ui.widget.components.pager.rememberPagerAnimatedHeight
 import io.legado.app.ui.widget.components.pager.rememberPagerAnimatedHeight
@@ -103,8 +104,8 @@ fun PaddingConfigContent(
         }
         }
     }
     }
 
 
-    Column(
-        modifier = modifier.fillMaxWidth(),
+    AppColumn(
+        modifier.fillMaxWidth()
     ) {
     ) {
         CardTabRow(
         CardTabRow(
             tabTitles = tabTitles,
             tabTitles = tabTitles,
@@ -221,7 +222,9 @@ internal fun PaddingSliders(
     onTopChange: (Float) -> Unit, onBottomChange: (Float) -> Unit,
     onTopChange: (Float) -> Unit, onBottomChange: (Float) -> Unit,
     onLeftChange: (Float) -> Unit, onRightChange: (Float) -> Unit,
     onLeftChange: (Float) -> Unit, onRightChange: (Float) -> Unit,
 ) {
 ) {
-    Column(modifier = Modifier.fillMaxWidth()) {
+    AppColumn(
+        Modifier.fillMaxWidth()
+    ) {
         TinySliderSettingItem(
         TinySliderSettingItem(
             title = stringResource(R.string.padding_top),
             title = stringResource(R.string.padding_top),
             value = top,
             value = top,

+ 8 - 6
app/src/main/java/io/legado/app/ui/book/read/sheet/PageKeyConfigSheet.kt

@@ -1,5 +1,6 @@
 package io.legado.app.ui.book.read.sheet
 package io.legado.app.ui.book.read.sheet
 
 
+import android.view.KeyEvent
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.fillMaxWidth
@@ -29,6 +30,7 @@ import io.legado.app.R
 import io.legado.app.data.repository.ReadPreferences
 import io.legado.app.data.repository.ReadPreferences
 import io.legado.app.data.repository.ReadSettingsRepository
 import io.legado.app.data.repository.ReadSettingsRepository
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.launch
 import org.koin.compose.koinInject
 import org.koin.compose.koinInject
 
 
@@ -54,8 +56,8 @@ fun PageKeyConfigSheet(
         containerColor = LegadoTheme.colorScheme.surfaceContainer,
         containerColor = LegadoTheme.colorScheme.surfaceContainer,
         title = { Text(stringResource(R.string.custom_page_key)) },
         title = { Text(stringResource(R.string.custom_page_key)) },
         text = {
         text = {
-            Column(
-                modifier = Modifier.verticalScroll(rememberScrollState()),
+            AppColumn(
+                modifier = Modifier.verticalScroll(rememberScrollState())
             ) {
             ) {
                 OutlinedTextField(
                 OutlinedTextField(
                     value = prevKeys,
                     value = prevKeys,
@@ -67,8 +69,8 @@ fun PageKeyConfigSheet(
                         .fillMaxWidth()
                         .fillMaxWidth()
                         .onKeyEvent { event ->
                         .onKeyEvent { event ->
                             val keyCode = event.nativeKeyEvent.keyCode
                             val keyCode = event.nativeKeyEvent.keyCode
-                            if (keyCode != android.view.KeyEvent.KEYCODE_BACK &&
-                                keyCode != android.view.KeyEvent.KEYCODE_DEL
+                            if (keyCode != KeyEvent.KEYCODE_BACK &&
+                                keyCode != KeyEvent.KEYCODE_DEL
                             ) {
                             ) {
                                 prevKeys = if (prevKeys.isEmpty() || prevKeys.endsWith(",")) {
                                 prevKeys = if (prevKeys.isEmpty() || prevKeys.endsWith(",")) {
                                     "$prevKeys$keyCode"
                                     "$prevKeys$keyCode"
@@ -92,8 +94,8 @@ fun PageKeyConfigSheet(
                         .fillMaxWidth()
                         .fillMaxWidth()
                         .onKeyEvent { event ->
                         .onKeyEvent { event ->
                             val keyCode = event.nativeKeyEvent.keyCode
                             val keyCode = event.nativeKeyEvent.keyCode
-                            if (keyCode != android.view.KeyEvent.KEYCODE_BACK &&
-                                keyCode != android.view.KeyEvent.KEYCODE_DEL
+                            if (keyCode != KeyEvent.KEYCODE_BACK &&
+                                keyCode != KeyEvent.KEYCODE_DEL
                             ) {
                             ) {
                                 nextKeys = if (nextKeys.isEmpty() || nextKeys.endsWith(",")) {
                                 nextKeys = if (nextKeys.isEmpty() || nextKeys.endsWith(",")) {
                                     "$nextKeys$keyCode"
                                     "$nextKeys$keyCode"

+ 5 - 4
app/src/main/java/io/legado/app/ui/book/read/sheet/ReadAloudConfigContent.kt

@@ -39,6 +39,7 @@ import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookUiState
 import io.legado.app.ui.book.read.ReadBookUiState
 import io.legado.app.ui.book.readaloud.player.ReadAloudPlayerIntent
 import io.legado.app.ui.book.readaloud.player.ReadAloudPlayerIntent
 import io.legado.app.ui.book.readaloud.player.ReadAloudPlayerUiState
 import io.legado.app.ui.book.readaloud.player.ReadAloudPlayerUiState
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
@@ -67,8 +68,8 @@ fun ReadAloudConfigContent(
 ) {
 ) {
     val pagerState = rememberPagerState(pageCount = { 2 })
     val pagerState = rememberPagerState(pageCount = { 2 })
     val scope = rememberCoroutineScope()
     val scope = rememberCoroutineScope()
-    Column(
-        modifier = Modifier.fillMaxWidth(),
+    AppColumn(
+        Modifier.fillMaxWidth()
     ) {
     ) {
         CardTabRow(
         CardTabRow(
             modifier = modifier,
             modifier = modifier,
@@ -635,8 +636,8 @@ fun ReadAloudNumberConfigSheet(
         onDismissRequest = onDismissRequest,
         onDismissRequest = onDismissRequest,
         title = title,
         title = title,
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(bottom = 16.dp)
                 .padding(bottom = 16.dp)
         ) {
         ) {

+ 6 - 5
app/src/main/java/io/legado/app/ui/book/read/sheet/ReadAloudScreen.kt

@@ -63,6 +63,7 @@ import io.legado.app.ui.book.readaloud.player.ReadAloudPlayerUiState
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.ProvideThemeOverride
 import io.legado.app.ui.theme.ProvideThemeOverride
 import io.legado.app.ui.theme.ThemeOverrideState
 import io.legado.app.ui.theme.ThemeOverrideState
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenu
 import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenu
 import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenuItem
 import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenuItem
@@ -148,7 +149,8 @@ fun ReadAloudScreen(
                 label = "ReadAloudPage",
                 label = "ReadAloudPage",
             ) { targetPage ->
             ) { targetPage ->
                 when (targetPage) {
                 when (targetPage) {
-                    ReadAloudPage.Config -> Column {
+                    ReadAloudPage.Config -> AppColumn(
+                    ) {
                         Row(
                         Row(
                             modifier = Modifier
                             modifier = Modifier
                                 .fillMaxWidth()
                                 .fillMaxWidth()
@@ -207,10 +209,9 @@ fun ReadAloudContent(
     val ttsSpeechRate = state.readAloudTtsSpeechRate
     val ttsSpeechRate = state.readAloudTtsSpeechRate
     var timerMenuExpanded by remember { mutableStateOf(false) }
     var timerMenuExpanded by remember { mutableStateOf(false) }
 
 
-    Column(
-        modifier = modifier.fillMaxWidth(),
+    AppColumn(
+        modifier.fillMaxWidth()
     ) {
     ) {
-        // Media controls
         Row(
         Row(
             modifier = Modifier.fillMaxWidth(),
             modifier = Modifier.fillMaxWidth(),
             horizontalArrangement = Arrangement.Center,
             horizontalArrangement = Arrangement.Center,
@@ -361,7 +362,7 @@ private fun ActionButton(
     label: String,
     label: String,
     onClick: () -> Unit,
     onClick: () -> Unit,
 ) {
 ) {
-    Column(
+    AppColumn(
         horizontalAlignment = Alignment.CenterHorizontally,
         horizontalAlignment = Alignment.CenterHorizontally,
     ) {
     ) {
         MediumTonalButton(
         MediumTonalButton(

+ 16 - 5
app/src/main/java/io/legado/app/ui/book/read/sheet/ReadStyleSheet.kt

@@ -30,6 +30,7 @@ import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ReadBookButtonConfigItem
 import io.legado.app.ui.book.read.ReadBookButtonConfigItem
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookStyleConfig
 import io.legado.app.ui.book.read.ReadBookStyleConfig
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.pager.pagerHeight
 import io.legado.app.ui.widget.components.pager.pagerHeight
 import io.legado.app.ui.widget.components.pager.rememberPagerAnimatedHeight
 import io.legado.app.ui.widget.components.pager.rememberPagerAnimatedHeight
 import io.legado.app.ui.widget.components.pager.rememberPagerFlingPassThroughConnection
 import io.legado.app.ui.widget.components.pager.rememberPagerFlingPassThroughConnection
@@ -72,9 +73,9 @@ fun ReadStyleContent(
         }
         }
     }
     }
 
 
-    Column(
-        modifier = modifier
-            .fillMaxWidth(),
+    AppColumn(
+        modifier
+            .fillMaxWidth()
     ) {
     ) {
         HorizontalPager(
         HorizontalPager(
             state = pagerState,
             state = pagerState,
@@ -100,7 +101,13 @@ fun ReadStyleContent(
                         onOpenTextTitle = onOpenTextTitle,
                         onOpenTextTitle = onOpenTextTitle,
                         onOpenPaddingConfig = onOpenPaddingConfig,
                         onOpenPaddingConfig = onOpenPaddingConfig,
                         onShareLayoutChange = { shareLayout ->
                         onShareLayoutChange = { shareLayout ->
-                            onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.ShareLayout(shareLayout)))
+                            onIntent(
+                                ReadBookIntent.UpdateConfig(
+                                    ConfigUpdate.ShareLayout(
+                                        shareLayout
+                                    )
+                                )
+                            )
                         },
                         },
                         onStyleSelect = { index ->
                         onStyleSelect = { index ->
                             onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.StyleSelect(index)))
                             onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.StyleSelect(index)))
@@ -135,10 +142,14 @@ fun ReadStyleContent(
                         scope.launch {
                         scope.launch {
                             pagerState.animateScrollToPage(
                             pagerState.animateScrollToPage(
                                 page = index,
                                 page = index,
-                                animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
+                                animationSpec = tween(
+                                    durationMillis = 300,
+                                    easing = FastOutSlowInEasing
+                                )
                             )
                             )
                         }
                         }
                     }
                     }
+
                     2 -> onOpenHeaderFooterConfig()
                     2 -> onOpenHeaderFooterConfig()
                     3 -> onOpenMoreConfig()
                     3 -> onOpenMoreConfig()
                 }
                 }

+ 14 - 8
app/src/main/java/io/legado/app/ui/book/read/sheet/ReaderBookSheet.kt

@@ -92,6 +92,7 @@ import io.legado.app.ui.book.toc.rule.TxtTocRuleActivity
 import io.legado.app.ui.replace.ReplaceEditRoute
 import io.legado.app.ui.replace.ReplaceEditRoute
 import io.legado.app.ui.replace.ReplaceRuleActivity
 import io.legado.app.ui.replace.ReplaceRuleActivity
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppFloatingActionButtonMenu
 import io.legado.app.ui.widget.components.AppFloatingActionButtonMenu
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.FabMenuItem
 import io.legado.app.ui.widget.components.FabMenuItem
@@ -349,8 +350,8 @@ private fun ReaderBookHeader(book: Book?) {
             sourceOrigin = book?.origin,
             sourceOrigin = book?.origin,
             modifier = Modifier.width(40.dp),
             modifier = Modifier.width(40.dp),
         )
         )
-        Column(
-            modifier = Modifier.weight(1f),
+        AppColumn(
+            Modifier.weight(1f)
         ) {
         ) {
             AppText(
             AppText(
                 text = book?.name.orEmpty(),
                 text = book?.name.orEmpty(),
@@ -377,7 +378,6 @@ private fun ReaderBookHeader(book: Book?) {
                     text = if (total > 0) "$current / $total" else "--",
                     text = if (total > 0) "$current / $total" else "--",
                 )
                 )
             }
             }
-
         }
         }
     }
     }
 }
 }
@@ -414,7 +414,7 @@ private fun InformationRow(label: String, value: String) {
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
         containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
         modifier = Modifier.fillMaxWidth(),
         modifier = Modifier.fillMaxWidth(),
     ) {
     ) {
-        Column(
+        AppColumn(
             modifier = Modifier.padding(horizontal = 12.dp, vertical = 10.dp),
             modifier = Modifier.padding(horizontal = 12.dp, vertical = 10.dp),
             verticalArrangement = Arrangement.spacedBy(3.dp),
             verticalArrangement = Arrangement.spacedBy(3.dp),
         ) {
         ) {
@@ -581,7 +581,9 @@ private fun ReaderBookTocPage(
         }
         }
     }
     }
 
 
-    Column(modifier = Modifier.fillMaxSize()) {
+    AppColumn(
+        Modifier.fillMaxSize()
+    ) {
         Row(
         Row(
             modifier = Modifier
             modifier = Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
@@ -774,7 +776,9 @@ private fun ReaderSheetChapterItem(
             modifier = Modifier.padding(start = 12.dp, end = 4.dp, top = 8.dp, bottom = 8.dp),
             modifier = Modifier.padding(start = 12.dp, end = 4.dp, top = 8.dp, bottom = 8.dp),
             verticalAlignment = Alignment.CenterVertically,
             verticalAlignment = Alignment.CenterVertically,
         ) {
         ) {
-            Column(modifier = Modifier.weight(1f)) {
+            AppColumn(
+                modifier = Modifier.weight(1f)
+            ) {
                 AppText(
                 AppText(
                     modifier = Modifier.padding(vertical = 8.dp),
                     modifier = Modifier.padding(vertical = 8.dp),
                     text = item.title,
                     text = item.title,
@@ -960,7 +964,9 @@ private fun ReaderBookBookmarksPage(
 ) {
 ) {
     var menuExpanded by rememberSaveable { mutableStateOf(false) }
     var menuExpanded by rememberSaveable { mutableStateOf(false) }
     val date = remember { SimpleDateFormat("yyyyMMdd_HHmm", Locale.getDefault()).format(Date()) }
     val date = remember { SimpleDateFormat("yyyyMMdd_HHmm", Locale.getDefault()).format(Date()) }
-    Column(modifier = Modifier.fillMaxSize()) {
+    AppColumn(
+        Modifier.fillMaxSize()
+    ) {
         Row(
         Row(
             modifier = Modifier
             modifier = Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
@@ -1089,7 +1095,7 @@ private fun ReaderSheetBookmarkItem(
         contentColor = contentColor,
         contentColor = contentColor,
         modifier = modifier.fillMaxWidth(),
         modifier = modifier.fillMaxWidth(),
     ) {
     ) {
-        Column(
+        AppColumn(
             modifier = Modifier.padding(horizontal = 12.dp, vertical = 10.dp),
             modifier = Modifier.padding(horizontal = 12.dp, vertical = 10.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
             verticalArrangement = Arrangement.spacedBy(4.dp),
         ) {
         ) {

+ 4 - 3
app/src/main/java/io/legado/app/ui/book/read/sheet/ShadowSetSheet.kt

@@ -19,6 +19,7 @@ import io.legado.app.R
 import io.legado.app.ui.book.read.ReadSheetConfigUiState
 import io.legado.app.ui.book.read.ReadSheetConfigUiState
 import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.dialog.ColorPickerSheet
 import io.legado.app.ui.widget.components.dialog.ColorPickerSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.settingItem.TinyColorSettingItem
 import io.legado.app.ui.widget.components.settingItem.TinyColorSettingItem
@@ -44,11 +45,11 @@ fun ShadowSetSheet(
         onDismissRequest = onDismissRequest,
         onDismissRequest = onDismissRequest,
         title = stringResource(R.string.text_shadow_set),
         title = stringResource(R.string.text_shadow_set),
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .verticalScroll(rememberScrollState())
                 .verticalScroll(rememberScrollState())
-                .padding(bottom = 16.dp),
+                .padding(bottom = 16.dp)
         ) {
         ) {
             TinySwitchSettingItem(
             TinySwitchSettingItem(
                 title = stringResource(R.string.text_shadow_set),
                 title = stringResource(R.string.text_shadow_set),

+ 3 - 2
app/src/main/java/io/legado/app/ui/book/read/sheet/SimulatedReadingSheet.kt

@@ -28,6 +28,7 @@ import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.model.ReadBook
 import io.legado.app.model.ReadBook
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.settingItem.TinySwitchSettingItem
 import io.legado.app.ui.widget.components.settingItem.TinySwitchSettingItem
 import java.time.Instant
 import java.time.Instant
 import java.time.LocalDate
 import java.time.LocalDate
@@ -53,7 +54,8 @@ fun SimulatedReadingSheet(
         containerColor = LegadoTheme.colorScheme.surfaceContainer,
         containerColor = LegadoTheme.colorScheme.surfaceContainer,
         title = { Text(stringResource(R.string.simulated_reading)) },
         title = { Text(stringResource(R.string.simulated_reading)) },
         text = {
         text = {
-            Column {
+            AppColumn(
+            ) {
                 OutlinedTextField(
                 OutlinedTextField(
                     value = startDate.format(dateFormatter),
                     value = startDate.format(dateFormatter),
                     onValueChange = {},
                     onValueChange = {},
@@ -72,7 +74,6 @@ fun SimulatedReadingSheet(
                     onCheckedChange = { enabled = it },
                     onCheckedChange = { enabled = it },
                 )
                 )
                 Spacer(modifier = Modifier.height(12.dp))
                 Spacer(modifier = Modifier.height(12.dp))
-                // Start chapter + daily chapters
                 Row(modifier = Modifier.fillMaxWidth()) {
                 Row(modifier = Modifier.fillMaxWidth()) {
                     OutlinedTextField(
                     OutlinedTextField(
                         value = startChapter,
                         value = startChapter,

+ 103 - 26
app/src/main/java/io/legado/app/ui/book/read/sheet/SystemMenuPage.kt

@@ -64,6 +64,7 @@ import io.legado.app.ui.book.read.ReadBookButtonConfigItem
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookSheet
 import io.legado.app.ui.book.read.ReadBookSheet
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.SectionTitle
 import io.legado.app.ui.widget.components.SectionTitle
 import io.legado.app.ui.widget.components.dialog.ColorPickerSheet
 import io.legado.app.ui.widget.components.dialog.ColorPickerSheet
 import io.legado.app.ui.widget.components.pager.pagerHeight
 import io.legado.app.ui.widget.components.pager.pagerHeight
@@ -129,8 +130,8 @@ internal fun SystemMenuPage(
         }
         }
     }
     }
 
 
-    Column(
-        modifier = modifier.fillMaxWidth(),
+    AppColumn(
+        modifier.fillMaxWidth()
     ) {
     ) {
         val tabTitles = listOf(
         val tabTitles = listOf(
             stringResource(R.string.read_config_menu_system),
             stringResource(R.string.read_config_menu_system),
@@ -147,7 +148,10 @@ internal fun SystemMenuPage(
                     try {
                     try {
                         pagerState.animateScrollToPage(
                         pagerState.animateScrollToPage(
                             page = index,
                             page = index,
-                            animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
+                            animationSpec = tween(
+                                durationMillis = 300,
+                                easing = FastOutSlowInEasing
+                            )
                         )
                         )
                     } finally {
                     } finally {
                         clickScrollCount = (clickScrollCount - 1).coerceAtLeast(0)
                         clickScrollCount = (clickScrollCount - 1).coerceAtLeast(0)
@@ -210,17 +214,86 @@ internal fun SystemMenuPage(
         onColorSelected = { color ->
         onColorSelected = { color ->
             when (colorPickerId) {
             when (colorPickerId) {
                 COLOR_BG -> onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.MenuBgColor(color)))
                 COLOR_BG -> onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.MenuBgColor(color)))
-                COLOR_MENU_ACCENT -> onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.MenuAccentColor(color)))
-                COLOR_MENU_CONTAINER -> onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.MenuContainerColor(color)))
-                COLOR_BG_NIGHT -> onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.MenuBgColorNight(color)))
-                COLOR_MENU_ACCENT_NIGHT -> onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.MenuAccentColorNight(color)))
-                COLOR_MENU_CONTAINER_NIGHT -> onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.MenuContainerColorNight(color)))
+                COLOR_MENU_ACCENT -> onIntent(
+                    ReadBookIntent.UpdateConfig(
+                        ConfigUpdate.MenuAccentColor(
+                            color
+                        )
+                    )
+                )
+
+                COLOR_MENU_CONTAINER -> onIntent(
+                    ReadBookIntent.UpdateConfig(
+                        ConfigUpdate.MenuContainerColor(
+                            color
+                        )
+                    )
+                )
+
+                COLOR_BG_NIGHT -> onIntent(
+                    ReadBookIntent.UpdateConfig(
+                        ConfigUpdate.MenuBgColorNight(
+                            color
+                        )
+                    )
+                )
+
+                COLOR_MENU_ACCENT_NIGHT -> onIntent(
+                    ReadBookIntent.UpdateConfig(
+                        ConfigUpdate.MenuAccentColorNight(
+                            color
+                        )
+                    )
+                )
+
+                COLOR_MENU_CONTAINER_NIGHT -> onIntent(
+                    ReadBookIntent.UpdateConfig(
+                        ConfigUpdate.MenuContainerColorNight(
+                            color
+                        )
+                    )
+                )
+
                 COLOR_BORDER -> onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.BorderColor(color)))
                 COLOR_BORDER -> onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.BorderColor(color)))
-                COLOR_BORDER_NIGHT -> onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.BorderColorNight(color)))
-                COLOR_BLUR_TINT -> onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.MenuBlurColor(color)))
-                COLOR_BLUR_TINT_NIGHT -> onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.MenuBlurColorNight(color)))
-                COLOR_MENU_TEXT -> onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.MenuTextColor(color)))
-                COLOR_MENU_TEXT_NIGHT -> onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.MenuTextColorNight(color)))
+                COLOR_BORDER_NIGHT -> onIntent(
+                    ReadBookIntent.UpdateConfig(
+                        ConfigUpdate.BorderColorNight(
+                            color
+                        )
+                    )
+                )
+
+                COLOR_BLUR_TINT -> onIntent(
+                    ReadBookIntent.UpdateConfig(
+                        ConfigUpdate.MenuBlurColor(
+                            color
+                        )
+                    )
+                )
+
+                COLOR_BLUR_TINT_NIGHT -> onIntent(
+                    ReadBookIntent.UpdateConfig(
+                        ConfigUpdate.MenuBlurColorNight(
+                            color
+                        )
+                    )
+                )
+
+                COLOR_MENU_TEXT -> onIntent(
+                    ReadBookIntent.UpdateConfig(
+                        ConfigUpdate.MenuTextColor(
+                            color
+                        )
+                    )
+                )
+
+                COLOR_MENU_TEXT_NIGHT -> onIntent(
+                    ReadBookIntent.UpdateConfig(
+                        ConfigUpdate.MenuTextColorNight(
+                            color
+                        )
+                    )
+                )
             }
             }
             showColorPicker = false
             showColorPicker = false
         },
         },
@@ -267,11 +340,11 @@ private fun GlobalMenuTab(
         .takeIf { it != 0 }
         .takeIf { it != 0 }
         ?: nightMenuBgColor
         ?: nightMenuBgColor
 
 
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .padding(horizontal = 16.dp)
             .padding(horizontal = 16.dp)
-            .verticalScroll(rememberScrollState()),
+            .verticalScroll(rememberScrollState())
     ) {
     ) {
         TinyDropdownSettingItem(
         TinyDropdownSettingItem(
             title = stringResource(R.string.tool_bar_style),
             title = stringResource(R.string.tool_bar_style),
@@ -360,7 +433,10 @@ private fun GlobalMenuTab(
                             enabled = true,
                             enabled = true,
                             onClickColor = { isNight ->
                             onClickColor = { isNight ->
                                 if (isNight) {
                                 if (isNight) {
-                                    onShowColorPicker(COLOR_MENU_CONTAINER_NIGHT, nightMenuContainerColor)
+                                    onShowColorPicker(
+                                        COLOR_MENU_CONTAINER_NIGHT,
+                                        nightMenuContainerColor
+                                    )
                                 } else {
                                 } else {
                                     onShowColorPicker(COLOR_MENU_CONTAINER, dayMenuContainerColor)
                                     onShowColorPicker(COLOR_MENU_CONTAINER, dayMenuContainerColor)
                                 }
                                 }
@@ -440,7 +516,10 @@ private fun GlobalMenuTab(
                     },
                     },
                     onClickColor = { isNight ->
                     onClickColor = { isNight ->
                         if (isNight) {
                         if (isNight) {
-                            onShowColorPicker(COLOR_BORDER_NIGHT, preferences.readMenuBorderColorNight)
+                            onShowColorPicker(
+                                COLOR_BORDER_NIGHT,
+                                preferences.readMenuBorderColorNight
+                            )
                         } else {
                         } else {
                             onShowColorPicker(COLOR_BORDER, preferences.readMenuBorderColor)
                             onShowColorPicker(COLOR_BORDER, preferences.readMenuBorderColor)
                         }
                         }
@@ -501,8 +580,6 @@ private fun GlobalMenuTab(
                 }
                 }
             },
             },
         )
         )
-
-        // --- Floating icon settings (at bottom) ---
         SectionTitle(stringResource(R.string.show_title_bar_icons))
         SectionTitle(stringResource(R.string.show_title_bar_icons))
 
 
         TinySwitchSettingItem(
         TinySwitchSettingItem(
@@ -581,11 +658,11 @@ private fun BottomBarTab(
         preferences.readMenuBottomBarBlurMode
         preferences.readMenuBottomBarBlurMode
     }
     }
 
 
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .padding(horizontal = 16.dp)
             .padding(horizontal = 16.dp)
-            .verticalScroll(rememberScrollState()),
+            .verticalScroll(rememberScrollState())
     ) {
     ) {
         val readSliderModeEntries = stringArrayResource(R.array.read_slider_mode)
         val readSliderModeEntries = stringArrayResource(R.array.read_slider_mode)
         val readSliderModeValues = stringArrayResource(R.array.read_slider_mode_value)
         val readSliderModeValues = stringArrayResource(R.array.read_slider_mode_value)
@@ -759,11 +836,11 @@ private fun TopBarTab(
     val titleBarModeEntries = stringArrayResource(R.array.title_bar_mode)
     val titleBarModeEntries = stringArrayResource(R.array.title_bar_mode)
     val titleBarModeValues = stringArrayResource(R.array.title_bar_mode_value)
     val titleBarModeValues = stringArrayResource(R.array.title_bar_mode_value)
 
 
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .padding(horizontal = 16.dp)
             .padding(horizontal = 16.dp)
-            .verticalScroll(rememberScrollState()),
+            .verticalScroll(rememberScrollState())
     ) {
     ) {
         TinySwitchSettingItem(
         TinySwitchSettingItem(
             title = stringResource(R.string.read_menu_top_bar_title_capsule),
             title = stringResource(R.string.read_menu_top_bar_title_capsule),

+ 11 - 7
app/src/main/java/io/legado/app/ui/book/read/sheet/TextSelectMenuConfigSheet.kt

@@ -46,6 +46,7 @@ import coil.compose.AsyncImage
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.ui.book.read.ActionMenuItem
 import io.legado.app.ui.book.read.ActionMenuItem
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
@@ -135,11 +136,11 @@ fun TextSelectMenuConfigSheet(
             )
             )
         }
         }
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .fillMaxHeight(0.8f)
                 .fillMaxHeight(0.8f)
-                .padding(bottom = 16.dp),
+                .padding(bottom = 16.dp)
         ) {
         ) {
             LazyColumn(
             LazyColumn(
                 state = lazyListState,
                 state = lazyListState,
@@ -218,7 +219,8 @@ fun TextSelectMenuConfigSheet(
 
 
 
 
                 stickyHeader(key = "group2") {
                 stickyHeader(key = "group2") {
-                    val subtitle = if (expandTextMenu) stringResource(R.string.merged_in_multiline) else null
+                    val subtitle =
+                        if (expandTextMenu) stringResource(R.string.merged_in_multiline) else null
                     SheetHeader(
                     SheetHeader(
                         isCollapsed = !group2Expanded,
                         isCollapsed = !group2Expanded,
                         onToggle = { group2Expanded = !group2Expanded },
                         onToggle = { group2Expanded = !group2Expanded },
@@ -269,7 +271,7 @@ fun TextSelectMenuConfigSheet(
                 }
                 }
 
 
 
 
-                item (key="group_3"){
+                item(key = "group_3") {
                     Box(
                     Box(
                         modifier = Modifier
                         modifier = Modifier
                             .fillMaxWidth()
                             .fillMaxWidth()
@@ -286,7 +288,8 @@ fun TextSelectMenuConfigSheet(
                                 if (expanded) {
                                 if (expanded) {
                                     coroutineScope.launch {
                                     coroutineScope.launch {
                                         delay(300.milliseconds)
                                         delay(300.milliseconds)
-                                        val targetIndex = lazyListState.layoutInfo.totalItemsCount - 1
+                                        val targetIndex =
+                                            lazyListState.layoutInfo.totalItemsCount - 1
                                         if (targetIndex >= 0) {
                                         if (targetIndex >= 0) {
                                             lazyListState.animateScrollToItem(targetIndex)
                                             lazyListState.animateScrollToItem(targetIndex)
                                         }
                                         }
@@ -303,7 +306,8 @@ fun TextSelectMenuConfigSheet(
                                         }
                                         }
                                         coroutineScope.launch {
                                         coroutineScope.launch {
                                             delay(200.milliseconds)
                                             delay(200.milliseconds)
-                                            val targetIndex = lazyListState.layoutInfo.totalItemsCount - 1
+                                            val targetIndex =
+                                                lazyListState.layoutInfo.totalItemsCount - 1
                                             if (targetIndex >= 0) {
                                             if (targetIndex >= 0) {
                                                 lazyListState.scrollToItem(targetIndex)
                                                 lazyListState.scrollToItem(targetIndex)
                                             }
                                             }

+ 52 - 26
app/src/main/java/io/legado/app/ui/book/read/sheet/TextTitleSheet.kt

@@ -49,6 +49,7 @@ import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadSheetConfigUiState
 import io.legado.app.ui.book.read.ReadSheetConfigUiState
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppSlider
 import io.legado.app.ui.widget.components.AppSlider
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.SectionTitle
 import io.legado.app.ui.widget.components.SectionTitle
@@ -155,8 +156,8 @@ internal fun ReadStyleTextTitleContent(
         orientation = Orientation.Horizontal,
         orientation = Orientation.Horizontal,
     )
     )
 
 
-    Column(
-        modifier = modifier
+    AppColumn(
+        modifier
             .fillMaxWidth()
             .fillMaxWidth()
     ) {
     ) {
         CardTabRow(
         CardTabRow(
@@ -218,11 +219,11 @@ internal fun LayoutSpacingPage(
     var paragraphSpacing by remember { mutableFloatStateOf(config.paragraphSpacing.toFloat()) }
     var paragraphSpacing by remember { mutableFloatStateOf(config.paragraphSpacing.toFloat()) }
     var indentCount by remember { mutableIntStateOf(config.paragraphIndentCount) }
     var indentCount by remember { mutableIntStateOf(config.paragraphIndentCount) }
 
 
-    Column(
-        modifier = modifier
+    AppColumn(
+        modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .padding(horizontal = 16.dp)
             .padding(horizontal = 16.dp)
-            .verticalScroll(rememberScrollState()),
+            .verticalScroll(rememberScrollState())
     ) {
     ) {
         SectionTitle(stringResource(R.string.read_config_body_spacing))
         SectionTitle(stringResource(R.string.read_config_body_spacing))
         TinySliderSettingItem(
         TinySliderSettingItem(
@@ -232,7 +233,15 @@ internal fun LayoutSpacingPage(
             steps = 3,
             steps = 3,
             onValueChange = { value ->
             onValueChange = { value ->
                 indentCount = value.toInt()
                 indentCount = value.toInt()
-                onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.ParagraphIndent(" ".repeat(indentCount))))
+                onIntent(
+                    ReadBookIntent.UpdateConfig(
+                        ConfigUpdate.ParagraphIndent(
+                            " ".repeat(
+                                indentCount
+                            )
+                        )
+                    )
+                )
             },
             },
         )
         )
         TinySliderSettingItem(
         TinySliderSettingItem(
@@ -290,11 +299,11 @@ internal fun TextEffectsPage(
     var colorPickerId by remember { mutableIntStateOf(0) }
     var colorPickerId by remember { mutableIntStateOf(0) }
     var colorPickerInitial by remember { mutableIntStateOf(0) }
     var colorPickerInitial by remember { mutableIntStateOf(0) }
 
 
-    Column(
-        modifier = modifier
+    AppColumn(
+        modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .padding(horizontal = 16.dp)
             .padding(horizontal = 16.dp)
-            .verticalScroll(rememberScrollState()),
+            .verticalScroll(rememberScrollState())
     ) {
     ) {
         SectionTitle(stringResource(R.string.text_typeface))
         SectionTitle(stringResource(R.string.text_typeface))
         TinySwitchSettingItem(
         TinySwitchSettingItem(
@@ -331,8 +340,6 @@ internal fun TextEffectsPage(
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.ChineseConverterType(it.toInt())))
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.ChineseConverterType(it.toInt())))
             },
             },
         )
         )
-
-        // Colors
         SectionTitle(stringResource(R.string.read_color))
         SectionTitle(stringResource(R.string.read_color))
         TinyColorSettingItem(
         TinyColorSettingItem(
             title = stringResource(R.string.text_color),
             title = stringResource(R.string.text_color),
@@ -421,11 +428,11 @@ internal fun TitleSettingsPage(
     var colorPickerId by remember { mutableIntStateOf(0) }
     var colorPickerId by remember { mutableIntStateOf(0) }
     var colorPickerInitial by remember { mutableIntStateOf(0) }
     var colorPickerInitial by remember { mutableIntStateOf(0) }
 
 
-    Column(
-        modifier = modifier
+    AppColumn(
+        modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .padding(horizontal = 16.dp)
             .padding(horizontal = 16.dp)
-            .verticalScroll(rememberScrollState()),
+            .verticalScroll(rememberScrollState())
     ) {
     ) {
         TinyDropdownSettingItem(
         TinyDropdownSettingItem(
             title = stringResource(R.string.body_title),
             title = stringResource(R.string.body_title),
@@ -481,15 +488,11 @@ internal fun TitleSettingsPage(
                 showColorPicker = true
                 showColorPicker = true
             },
             },
         )
         )
-
-        // Title font
         TinyClickableSettingItem(
         TinyClickableSettingItem(
             title = stringResource(R.string.read_config_title_settings),
             title = stringResource(R.string.read_config_title_settings),
             imageVector = Icons.Default.TextFields,
             imageVector = Icons.Default.TextFields,
             onClick = onOpenTitleFontSelect,
             onClick = onOpenTitleFontSelect,
         )
         )
-
-        // Title segmentation
         TinyDropdownSettingItem(
         TinyDropdownSettingItem(
             title = stringResource(R.string.split_title_mode),
             title = stringResource(R.string.split_title_mode),
             selectedValue = titleSegType.toString(),
             selectedValue = titleSegType.toString(),
@@ -513,7 +516,13 @@ internal fun TitleSettingsPage(
                 steps = 18,
                 steps = 18,
                 onValueChange = { value ->
                 onValueChange = { value ->
                     titleSegDistance = value.toInt()
                     titleSegDistance = value.toInt()
-                    onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TitleSegDistance(titleSegDistance)))
+                    onIntent(
+                        ReadBookIntent.UpdateConfig(
+                            ConfigUpdate.TitleSegDistance(
+                                titleSegDistance
+                            )
+                        )
+                    )
                 },
                 },
             )
             )
         }
         }
@@ -549,8 +558,6 @@ internal fun TitleSettingsPage(
                 onDismiss = { showFlagDialog = false },
                 onDismiss = { showFlagDialog = false },
             )
             )
         }
         }
-
-        // Title spacing sliders
         TinySliderSettingItem(
         TinySliderSettingItem(
             title = stringResource(R.string.subtitle_scale),
             title = stringResource(R.string.subtitle_scale),
             value = titleSegScaling,
             value = titleSegScaling,
@@ -569,7 +576,13 @@ internal fun TitleSettingsPage(
             valueRange = 0f..20f,
             valueRange = 0f..20f,
             onValueChange = { value ->
             onValueChange = { value ->
                 titleLineSpacingExtra = value.toInt()
                 titleLineSpacingExtra = value.toInt()
-                onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TitleLineSpacingExtra(titleLineSpacingExtra)))
+                onIntent(
+                    ReadBookIntent.UpdateConfig(
+                        ConfigUpdate.TitleLineSpacingExtra(
+                            titleLineSpacingExtra
+                        )
+                    )
+                )
             },
             },
         )
         )
         TinySliderSettingItem(
         TinySliderSettingItem(
@@ -578,7 +591,13 @@ internal fun TitleSettingsPage(
             valueRange = -30f..30f,
             valueRange = -30f..30f,
             onValueChange = { value ->
             onValueChange = { value ->
                 titleLineSpacingSub = value.toInt()
                 titleLineSpacingSub = value.toInt()
-                onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TitleLineSpacingSub(titleLineSpacingSub)))
+                onIntent(
+                    ReadBookIntent.UpdateConfig(
+                        ConfigUpdate.TitleLineSpacingSub(
+                            titleLineSpacingSub
+                        )
+                    )
+                )
             },
             },
         )
         )
         TinySliderSettingItem(
         TinySliderSettingItem(
@@ -605,10 +624,15 @@ internal fun TitleSettingsPage(
             valueRange = 0f..200f,
             valueRange = 0f..200f,
             onValueChange = { value ->
             onValueChange = { value ->
                 titleBottomSpacing = value.toInt()
                 titleBottomSpacing = value.toInt()
-                onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TitleBottomSpacing(titleBottomSpacing)))
+                onIntent(
+                    ReadBookIntent.UpdateConfig(
+                        ConfigUpdate.TitleBottomSpacing(
+                            titleBottomSpacing
+                        )
+                    )
+                )
             },
             },
         )
         )
-
     }
     }
 
 
     // Color picker
     // Color picker
@@ -621,6 +645,7 @@ internal fun TitleSettingsPage(
                 COLOR_TITLE -> {
                 COLOR_TITLE -> {
                     onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TitleColor(color)))
                     onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TitleColor(color)))
                 }
                 }
+
                 COLOR_TITLE_NIGHT -> {
                 COLOR_TITLE_NIGHT -> {
                     onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TitleColorNight(color)))
                     onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TitleColorNight(color)))
                 }
                 }
@@ -648,7 +673,8 @@ private fun FontWeightSetting(
     }
     }
     val weightEntries = stringArrayResource(R.array.text_font_weight)
     val weightEntries = stringArrayResource(R.array.text_font_weight)
 
 
-    Column {
+    AppColumn(
+    ) {
         Row(
         Row(
             modifier = Modifier.fillMaxWidth(),
             modifier = Modifier.fillMaxWidth(),
             horizontalArrangement = Arrangement.spacedBy(8.dp),
             horizontalArrangement = Arrangement.spacedBy(8.dp),

+ 4 - 9
app/src/main/java/io/legado/app/ui/book/read/sheet/UnderlineConfigSheet.kt

@@ -24,6 +24,7 @@ import io.legado.app.R
 import io.legado.app.ui.book.read.ReadSheetConfigUiState
 import io.legado.app.ui.book.read.ReadSheetConfigUiState
 import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookIntent
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.dialog.ColorPickerSheet
 import io.legado.app.ui.widget.components.dialog.ColorPickerSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.settingItem.TinyColorSettingItem
 import io.legado.app.ui.widget.components.settingItem.TinyColorSettingItem
@@ -52,11 +53,11 @@ fun UnderlineConfigSheet(
         onDismissRequest = onDismissRequest,
         onDismissRequest = onDismissRequest,
         title = stringResource(R.string.text_underline),
         title = stringResource(R.string.text_underline),
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .verticalScroll(rememberScrollState())
                 .verticalScroll(rememberScrollState())
-                .padding(bottom = 16.dp),
+                .padding(bottom = 16.dp)
         ) {
         ) {
             TinySwitchSettingItem(
             TinySwitchSettingItem(
                 title = stringResource(R.string.text_underline),
                 title = stringResource(R.string.text_underline),
@@ -92,8 +93,6 @@ fun UnderlineConfigSheet(
                     onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.UnderlineExtend(it)))
                     onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.UnderlineExtend(it)))
                 },
                 },
             )
             )
-
-            // Underline height & padding
             TinySliderSettingItem(
             TinySliderSettingItem(
                 title = stringResource(R.string.underline_height),
                 title = stringResource(R.string.underline_height),
                 value = underlineHeight,
                 value = underlineHeight,
@@ -114,8 +113,6 @@ fun UnderlineConfigSheet(
             )
             )
 
 
             Spacer(Modifier.height(8.dp))
             Spacer(Modifier.height(8.dp))
-
-            // Dotted line section title
             Text(
             Text(
                 text = stringResource(R.string.text_dottedline),
                 text = stringResource(R.string.text_dottedline),
                 style = MaterialTheme.typography.titleSmallEmphasized,
                 style = MaterialTheme.typography.titleSmallEmphasized,
@@ -126,8 +123,6 @@ fun UnderlineConfigSheet(
             )
             )
 
 
             Spacer(Modifier.height(8.dp))
             Spacer(Modifier.height(8.dp))
-
-            // Dotted line sliders
             TinySliderSettingItem(
             TinySliderSettingItem(
                 title = stringResource(R.string.dotted_line_black),
                 title = stringResource(R.string.dotted_line_black),
                 value = dottedBase,
                 value = dottedBase,

+ 46 - 16
app/src/main/java/io/legado/app/ui/book/readRecord/ReadRecordOverviewScreen.kt

@@ -59,6 +59,7 @@ import io.legado.app.ui.book.readRecord.component.StatItem
 import io.legado.app.ui.book.readRecord.component.StatsGridCard
 import io.legado.app.ui.book.readRecord.component.StatsGridCard
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.button.series.MediumPlainButton
 import io.legado.app.ui.widget.components.button.series.MediumPlainButton
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.card.GlassCard
@@ -114,8 +115,8 @@ fun ReadRecordOverviewScreen(
             )
             )
         }
         }
     ) { padding ->
     ) { padding ->
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxSize()
                 .fillMaxSize()
                 .padding(padding)
                 .padding(padding)
         ) {
         ) {
@@ -150,10 +151,12 @@ fun ReadRecordOverviewScreen(
                             readingTime.hours,
                             readingTime.hours,
                             readingTime.minutes,
                             readingTime.minutes,
                         )
                         )
+
                         readingTime.hours > 0 -> stringResource(
                         readingTime.hours > 0 -> stringResource(
                             R.string.whole_hours_format,
                             R.string.whole_hours_format,
                             readingTime.hours,
                             readingTime.hours,
                         )
                         )
+
                         else -> stringResource(
                         else -> stringResource(
                             R.string.minutes_format,
                             R.string.minutes_format,
                             readingTime.minutes,
                             readingTime.minutes,
@@ -164,11 +167,26 @@ fun ReadRecordOverviewScreen(
                             stringResource(R.string.reading_time),
                             stringResource(R.string.reading_time),
                             readingTimeText,
                             readingTimeText,
                         ),
                         ),
-                        StatItem(stringResource(R.string.reading_days), stringResource(R.string.days_format, state.readingDays)),
-                        StatItem(stringResource(R.string.total_read_books), stringResource(R.string.books_format, state.totalBooks)),
-                        StatItem(stringResource(R.string.finished_books), stringResource(R.string.books_format, state.finishedBooks)),
-                        StatItem(stringResource(R.string.reading_books), stringResource(R.string.books_format, state.readingBooks)),
-                        StatItem(stringResource(R.string.reading_words), ReadRecordFormatter.formatWords(state.totalWords))
+                        StatItem(
+                            stringResource(R.string.reading_days),
+                            stringResource(R.string.days_format, state.readingDays)
+                        ),
+                        StatItem(
+                            stringResource(R.string.total_read_books),
+                            stringResource(R.string.books_format, state.totalBooks)
+                        ),
+                        StatItem(
+                            stringResource(R.string.finished_books),
+                            stringResource(R.string.books_format, state.finishedBooks)
+                        ),
+                        StatItem(
+                            stringResource(R.string.reading_books),
+                            stringResource(R.string.books_format, state.readingBooks)
+                        ),
+                        StatItem(
+                            stringResource(R.string.reading_words),
+                            ReadRecordFormatter.formatWords(state.totalWords)
+                        )
                     )
                     )
                     StatsGridCard(title = stringResource(R.string.reading_data), items = stats)
                     StatsGridCard(title = stringResource(R.string.reading_data), items = stats)
                 }
                 }
@@ -283,7 +301,9 @@ fun HeatmapCard(state: ReadRecordOverviewUiState) {
             .fillMaxWidth()
             .fillMaxWidth()
             .adaptiveHorizontalPadding(vertical = 8.dp)
             .adaptiveHorizontalPadding(vertical = 8.dp)
     ) {
     ) {
-        Column(modifier = Modifier.padding(16.dp)) {
+        AppColumn(
+            Modifier.padding(16.dp)
+        ) {
             Row(verticalAlignment = Alignment.CenterVertically) {
             Row(verticalAlignment = Alignment.CenterVertically) {
                 Icon(
                 Icon(
                     imageVector = Icons.Default.GridOn,
                     imageVector = Icons.Default.GridOn,
@@ -292,7 +312,10 @@ fun HeatmapCard(state: ReadRecordOverviewUiState) {
                     modifier = Modifier.size(20.dp)
                     modifier = Modifier.size(20.dp)
                 )
                 )
                 Spacer(modifier = Modifier.width(8.dp))
                 Spacer(modifier = Modifier.width(8.dp))
-                AppText(stringResource(R.string.reading_heatmap), style = LegadoTheme.typography.titleMedium)
+                AppText(
+                    stringResource(R.string.reading_heatmap),
+                    style = LegadoTheme.typography.titleMedium
+                )
             }
             }
             Spacer(modifier = Modifier.height(8.dp))
             Spacer(modifier = Modifier.height(8.dp))
             HeatmapCalendarSection(
             HeatmapCalendarSection(
@@ -317,7 +340,9 @@ fun TopReadingListCard(
             .fillMaxWidth()
             .fillMaxWidth()
             .adaptiveHorizontalPadding(vertical = 8.dp)
             .adaptiveHorizontalPadding(vertical = 8.dp)
     ) {
     ) {
-        Column(modifier = Modifier.padding(vertical = 16.dp)) {
+        AppColumn(
+            Modifier.padding(vertical = 16.dp)
+        ) {
             Row(
             Row(
                 modifier = Modifier.padding(horizontal = 16.dp),
                 modifier = Modifier.padding(horizontal = 16.dp),
                 verticalAlignment = Alignment.CenterVertically
                 verticalAlignment = Alignment.CenterVertically
@@ -335,7 +360,7 @@ fun TopReadingListCard(
                 )
                 )
             }
             }
             Spacer(modifier = Modifier.height(8.dp))
             Spacer(modifier = Modifier.height(8.dp))
-            
+
             topBooks.forEachIndexed { index, book ->
             topBooks.forEachIndexed { index, book ->
                 var coverPath by remember { mutableStateOf<String?>(null) }
                 var coverPath by remember { mutableStateOf<String?>(null) }
                 LaunchedEffect(book.bookName, book.bookAuthor) {
                 LaunchedEffect(book.bookName, book.bookAuthor) {
@@ -415,7 +440,9 @@ fun ReadingCalendarCard(
             .fillMaxWidth()
             .fillMaxWidth()
             .adaptiveHorizontalPadding(vertical = 8.dp)
             .adaptiveHorizontalPadding(vertical = 8.dp)
     ) {
     ) {
-        Column(modifier = Modifier.padding(16.dp)) {
+        AppColumn(
+            Modifier.padding(16.dp)
+        ) {
             Row(verticalAlignment = Alignment.CenterVertically) {
             Row(verticalAlignment = Alignment.CenterVertically) {
                 Icon(
                 Icon(
                     imageVector = Icons.Default.CalendarMonth,
                     imageVector = Icons.Default.CalendarMonth,
@@ -424,10 +451,13 @@ fun ReadingCalendarCard(
                     modifier = Modifier.size(20.dp)
                     modifier = Modifier.size(20.dp)
                 )
                 )
                 Spacer(modifier = Modifier.width(8.dp))
                 Spacer(modifier = Modifier.width(8.dp))
-                AppText(stringResource(R.string.reading_calendar), style = LegadoTheme.typography.titleMedium)
+                AppText(
+                    stringResource(R.string.reading_calendar),
+                    style = LegadoTheme.typography.titleMedium
+                )
             }
             }
             Spacer(modifier = Modifier.height(16.dp))
             Spacer(modifier = Modifier.height(16.dp))
-            
+
             Row(modifier = Modifier.fillMaxWidth()) {
             Row(modifier = Modifier.fillMaxWidth()) {
                 val days = listOf("日", "一", "二", "三", "四", "五", "六")
                 val days = listOf("日", "一", "二", "三", "四", "五", "六")
                 days.forEach { day ->
                 days.forEach { day ->
@@ -439,7 +469,7 @@ fun ReadingCalendarCard(
                     )
                     )
                 }
                 }
             }
             }
-            
+
             Spacer(modifier = Modifier.height(8.dp))
             Spacer(modifier = Modifier.height(8.dp))
 
 
             val totalCells = ((daysInMonth + firstDayOfWeek + 6) / 7) * 7
             val totalCells = ((daysInMonth + firstDayOfWeek + 6) / 7) * 7
@@ -448,7 +478,7 @@ fun ReadingCalendarCard(
                     for (j in 0 until 7) {
                     for (j in 0 until 7) {
                         val cellIndex = i + j
                         val cellIndex = i + j
                         val dayOfMonth = cellIndex - firstDayOfWeek + 1
                         val dayOfMonth = cellIndex - firstDayOfWeek + 1
-                        
+
                         Box(
                         Box(
                             modifier = Modifier
                             modifier = Modifier
                                 .weight(1f)
                                 .weight(1f)

+ 39 - 20
app/src/main/java/io/legado/app/ui/book/readRecord/ReadRecordScreen.kt

@@ -76,6 +76,7 @@ import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveContentPaddingOnlyVertical
 import io.legado.app.ui.theme.adaptiveContentPaddingOnlyVertical
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
 import io.legado.app.ui.theme.fadingEdge
 import io.legado.app.ui.theme.fadingEdge
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.CollapsibleHeader
 import io.legado.app.ui.widget.components.CollapsibleHeader
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.EmptyMessage
@@ -227,7 +228,8 @@ fun ReadRecordScreen(
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         snackbarHost = { SnackbarHost(snackbarHostState) },
         snackbarHost = { SnackbarHost(snackbarHostState) },
         topBar = {
         topBar = {
-            Column {
+            AppColumn(
+            ) {
                 GlassMediumFlexibleTopAppBar(
                 GlassMediumFlexibleTopAppBar(
                     title = if (inSelectionMode) {
                     title = if (inSelectionMode) {
                         stringResource(R.string.selected_count, selectedItemKeys.size)
                         stringResource(R.string.selected_count, selectedItemKeys.size)
@@ -297,7 +299,10 @@ fun ReadRecordScreen(
                                 AppIcon(icon, description)
                                 AppIcon(icon, description)
                             }
                             }
                             AppIconButton(onClick = { showSearch = !showSearch }) {
                             AppIconButton(onClick = { showSearch = !showSearch }) {
-                                AppIcon(Icons.Default.Search, contentDescription = stringResource(R.string.search))
+                                AppIcon(
+                                    Icons.Default.Search,
+                                    contentDescription = stringResource(R.string.search)
+                                )
                             }
                             }
                             AppIconButton(onClick = { showActionsSheet = true }) {
                             AppIconButton(onClick = { showActionsSheet = true }) {
                                 AppIcon(
                                 AppIcon(
@@ -466,12 +471,16 @@ fun ReadRecordScreen(
         onDismissRequest = { pendingDeleteAction = null },
         onDismissRequest = { pendingDeleteAction = null },
         title = stringResource(R.string.confirm_delete_read_record),
         title = stringResource(R.string.confirm_delete_read_record),
         content = { _ ->
         content = { _ ->
-            Column {
+            AppColumn(
+            ) {
                 AppText(
                 AppText(
                     if (pendingDeleteCount == -1) {
                     if (pendingDeleteCount == -1) {
                         stringResource(R.string.clear_read_records_message)
                         stringResource(R.string.clear_read_records_message)
                     } else if (pendingDeleteCount > 1) {
                     } else if (pendingDeleteCount > 1) {
-                        stringResource(R.string.delete_selected_read_records_message, pendingDeleteCount)
+                        stringResource(
+                            R.string.delete_selected_read_records_message,
+                            pendingDeleteCount
+                        )
                     } else {
                     } else {
                         stringResource(R.string.delete_read_record_message)
                         stringResource(R.string.delete_read_record_message)
                     }
                     }
@@ -548,7 +557,8 @@ fun ReadRecordScreen(
         title = stringResource(R.string.merge_read_records),
         title = stringResource(R.string.merge_read_records),
         content = { (targetRecord, candidates) ->
         content = { (targetRecord, candidates) ->
             val unknownAuthor = stringResource(R.string.unknown_author)
             val unknownAuthor = stringResource(R.string.unknown_author)
-            Column {
+            AppColumn(
+            ) {
                 AppText(
                 AppText(
                     stringResource(
                     stringResource(
                         R.string.merge_read_records_message,
                         R.string.merge_read_records_message,
@@ -614,8 +624,8 @@ private fun ReadRecordActionsSheet(
         onDismissRequest = onDismissRequest,
         onDismissRequest = onDismissRequest,
         title = stringResource(R.string.read_record_options)
         title = stringResource(R.string.read_record_options)
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(bottom = 16.dp),
                 .padding(bottom = 16.dp),
             verticalArrangement = Arrangement.spacedBy(8.dp)
             verticalArrangement = Arrangement.spacedBy(8.dp)
@@ -771,8 +781,8 @@ fun HeatmapCalendarSection(
         }
         }
     }
     }
 
 
-    Column(
-        modifier = modifier
+    AppColumn(
+        modifier
             .fillMaxWidth()
             .fillMaxWidth()
             .padding(horizontal = 16.dp, vertical = 8.dp)
             .padding(horizontal = 16.dp, vertical = 8.dp)
             .padding(bottom = 32.dp)
             .padding(bottom = 32.dp)
@@ -1050,7 +1060,9 @@ fun LatestReadItem(
 
 
         Spacer(modifier = Modifier.width(if (inSelectionMode) 8.dp else 16.dp))
         Spacer(modifier = Modifier.width(if (inSelectionMode) 8.dp else 16.dp))
 
 
-        Column(modifier = Modifier.weight(1f)) {
+        AppColumn(
+            Modifier.weight(1f)
+        ) {
             AppText(
             AppText(
                 text = record.bookName,
                 text = record.bookName,
                 style = LegadoTheme.typography.titleMedium,
                 style = LegadoTheme.typography.titleMedium,
@@ -1170,7 +1182,7 @@ fun TimelineSessionItem(
                 .padding(start = contentPaddingStart, end = 16.dp, top = 8.dp, bottom = 8.dp),
                 .padding(start = contentPaddingStart, end = 16.dp, top = 8.dp, bottom = 8.dp),
             verticalAlignment = Alignment.CenterVertically
             verticalAlignment = Alignment.CenterVertically
         ) {
         ) {
-            Column(
+            AppColumn(
                 modifier = Modifier.width(48.dp),
                 modifier = Modifier.width(48.dp),
                 verticalArrangement = Arrangement.Center
                 verticalArrangement = Arrangement.Center
             ) {
             ) {
@@ -1191,7 +1203,8 @@ fun TimelineSessionItem(
                 )
                 )
                 SelectionCheckmark(inSelectionMode, isSelected)
                 SelectionCheckmark(inSelectionMode, isSelected)
                 Spacer(modifier = Modifier.width(8.dp))
                 Spacer(modifier = Modifier.width(8.dp))
-                Column {
+                AppColumn(
+                ) {
                     AppText(
                     AppText(
                         text = session.bookName,
                         text = session.bookName,
                         style = LegadoTheme.typography.titleMedium,
                         style = LegadoTheme.typography.titleMedium,
@@ -1269,7 +1282,9 @@ fun ReadRecordItem(
 
 
         Spacer(modifier = Modifier.width(if (inSelectionMode) 8.dp else 16.dp))
         Spacer(modifier = Modifier.width(if (inSelectionMode) 8.dp else 16.dp))
 
 
-        Column(modifier = Modifier.weight(1f)) {
+        AppColumn(
+            Modifier.weight(1f)
+        ) {
             AppText(
             AppText(
                 text = detail.bookName,
                 text = detail.bookName,
                 style = LegadoTheme.typography.titleMedium,
                 style = LegadoTheme.typography.titleMedium,
@@ -1282,7 +1297,10 @@ fun ReadRecordItem(
             )
             )
             Spacer(modifier = Modifier.height(8.dp))
             Spacer(modifier = Modifier.height(8.dp))
             AppText(
             AppText(
-                text = stringResource(R.string.reading_time_with_value, formatDuring(detail.readTime)),
+                text = stringResource(
+                    R.string.reading_time_with_value,
+                    formatDuring(detail.readTime)
+                ),
                 color = MaterialTheme.colorScheme.outline,
                 color = MaterialTheme.colorScheme.outline,
                 style = LegadoTheme.typography.labelSmall
                 style = LegadoTheme.typography.labelSmall
             )
             )
@@ -1363,8 +1381,9 @@ fun ReadingSummaryCard(
             verticalAlignment = Alignment.CenterVertically
             verticalAlignment = Alignment.CenterVertically
         ) {
         ) {
 
 
-            Column(modifier = Modifier.weight(1f)) {
-
+            AppColumn(
+                modifier = Modifier.weight(1f)
+            ) {
                 AppText(
                 AppText(
                     text = title,
                     text = title,
                     style = LegadoTheme.typography.labelLarge,
                     style = LegadoTheme.typography.labelLarge,
@@ -1374,8 +1393,8 @@ fun ReadingSummaryCard(
                 Spacer(modifier = Modifier.height(4.dp))
                 Spacer(modifier = Modifier.height(4.dp))
 
 
                 Row(verticalAlignment = Alignment.Bottom) {
                 Row(verticalAlignment = Alignment.Bottom) {
-                AppText(
-                    text = stringResource(R.string.read_books_prefix),
+                    AppText(
+                        text = stringResource(R.string.read_books_prefix),
                         style = LegadoTheme.typography.titleMedium
                         style = LegadoTheme.typography.titleMedium
                     )
                     )
                     AppText(
                     AppText(
@@ -1384,8 +1403,8 @@ fun ReadingSummaryCard(
                         color = LegadoTheme.colorScheme.primary,
                         color = LegadoTheme.colorScheme.primary,
                         fontWeight = FontWeight.Bold,
                         fontWeight = FontWeight.Bold,
                     )
                     )
-                AppText(
-                    text = stringResource(R.string.read_books_suffix),
+                    AppText(
+                        text = stringResource(R.string.read_books_suffix),
                         style = LegadoTheme.typography.titleMedium
                         style = LegadoTheme.typography.titleMedium
                     )
                     )
                 }
                 }

+ 9 - 2
app/src/main/java/io/legado/app/ui/book/readRecord/component/ReadRecordCharts.kt

@@ -32,6 +32,7 @@ import io.legado.app.ui.book.readRecord.ReadPeriod
 import io.legado.app.ui.book.readRecord.ReadRecordFormatter
 import io.legado.app.ui.book.readRecord.ReadRecordFormatter
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.ui.widget.components.text.AppText
 import java.time.LocalDate
 import java.time.LocalDate
@@ -58,7 +59,9 @@ fun ReadingTimeBarChartCard(
             .fillMaxWidth()
             .fillMaxWidth()
             .adaptiveHorizontalPadding(vertical = 8.dp)
             .adaptiveHorizontalPadding(vertical = 8.dp)
     ) {
     ) {
-        Column(modifier = Modifier.padding(16.dp)) {
+        AppColumn(
+            Modifier.padding(16.dp)
+        ) {
             Row(verticalAlignment = Alignment.CenterVertically) {
             Row(verticalAlignment = Alignment.CenterVertically) {
                 Icon(
                 Icon(
                     imageVector = Icons.Default.BarChart,
                     imageVector = Icons.Default.BarChart,
@@ -130,6 +133,7 @@ fun ReadingTimeBarChartCard(
                             ReadPeriod.WEEK -> when (date.dayOfWeek.value) {
                             ReadPeriod.WEEK -> when (date.dayOfWeek.value) {
                                 1 -> "一"; 2 -> "二"; 3 -> "三"; 4 -> "四"; 5 -> "五"; 6 -> "六"; 7 -> "日"; else -> ""
                                 1 -> "一"; 2 -> "二"; 3 -> "三"; 4 -> "四"; 5 -> "五"; 6 -> "六"; 7 -> "日"; else -> ""
                             }
                             }
+
                             else -> date.dayOfMonth.toString()
                             else -> date.dayOfMonth.toString()
                         }
                         }
 
 
@@ -159,7 +163,10 @@ fun ReadingTimeBarChartCard(
                                 )
                                 )
                             }
                             }
 
 
-                            Box(modifier = Modifier.height(20.dp), contentAlignment = Alignment.TopCenter) {
+                            Box(
+                                modifier = Modifier.height(20.dp),
+                                contentAlignment = Alignment.TopCenter
+                            ) {
                                 if (showLabel) {
                                 if (showLabel) {
                                     AppText(
                                     AppText(
                                         text = labelText,
                                         text = labelText,

+ 2 - 1
app/src/main/java/io/legado/app/ui/book/readRecord/component/ReadRecordHeatmap.kt

@@ -8,6 +8,7 @@ import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.heatmap.*
 import io.legado.app.ui.widget.components.heatmap.*
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.ui.widget.components.text.AppText
 import java.time.LocalDate
 import java.time.LocalDate
@@ -26,7 +27,7 @@ fun HeatmapCalendarSection(
     val days = rememberDaysInRange(startDate, endDate)
     val days = rememberDaysInRange(startDate, endDate)
     val weeks = rememberWeeks(days, startDate)
     val weeks = rememberWeeks(days, startDate)
 
 
-    Column(
+    AppColumn(
         modifier = modifier.fillMaxWidth(),
         modifier = modifier.fillMaxWidth(),
         horizontalAlignment = Alignment.Start
         horizontalAlignment = Alignment.Start
     ) {
     ) {

+ 10 - 3
app/src/main/java/io/legado/app/ui/book/readRecord/component/ReadRecordListItems.kt

@@ -28,6 +28,7 @@ import io.legado.app.ui.book.readRecord.ReadRecordFormatter
 import io.legado.app.ui.book.readRecord.ReadRecordViewModel
 import io.legado.app.ui.book.readRecord.ReadRecordViewModel
 import io.legado.app.ui.book.readRecord.TimelineItem
 import io.legado.app.ui.book.readRecord.TimelineItem
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.image.cover.CoilBookCover
 import io.legado.app.ui.widget.components.image.cover.CoilBookCover
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.utils.StringUtils.formatFriendlyDate
 import io.legado.app.utils.StringUtils.formatFriendlyDate
@@ -58,7 +59,9 @@ fun LatestReadItem(
             modifier = Modifier.size(48.dp, 64.dp)
             modifier = Modifier.size(48.dp, 64.dp)
         )
         )
         Spacer(modifier = Modifier.width(16.dp))
         Spacer(modifier = Modifier.width(16.dp))
-        Column(modifier = Modifier.weight(1f)) {
+        AppColumn(
+            Modifier.weight(1f)
+        ) {
             AppText(
             AppText(
                 text = record.bookName,
                 text = record.bookName,
                 style = LegadoTheme.typography.titleMedium,
                 style = LegadoTheme.typography.titleMedium,
@@ -113,7 +116,9 @@ fun TimelineSessionItem(
             modifier = Modifier.size(40.dp, 56.dp)
             modifier = Modifier.size(40.dp, 56.dp)
         )
         )
         Spacer(modifier = Modifier.width(12.dp))
         Spacer(modifier = Modifier.width(12.dp))
-        Column(modifier = Modifier.weight(1f)) {
+        AppColumn(
+            Modifier.weight(1f)
+        ) {
             AppText(
             AppText(
                 text = session.bookName,
                 text = session.bookName,
                 style = LegadoTheme.typography.bodyMedium,
                 style = LegadoTheme.typography.bodyMedium,
@@ -160,7 +165,9 @@ fun ReadRecordItem(
             modifier = Modifier.size(40.dp, 56.dp)
             modifier = Modifier.size(40.dp, 56.dp)
         )
         )
         Spacer(modifier = Modifier.width(16.dp))
         Spacer(modifier = Modifier.width(16.dp))
-        Column(modifier = Modifier.weight(1f)) {
+        AppColumn(
+            Modifier.weight(1f)
+        ) {
             AppText(
             AppText(
                 text = detail.bookName,
                 text = detail.bookName,
                 style = LegadoTheme.typography.bodyLarge,
                 style = LegadoTheme.typography.bodyLarge,

+ 5 - 2
app/src/main/java/io/legado/app/ui/book/readRecord/component/ReadRecordStats.kt

@@ -25,6 +25,7 @@ import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.icon.AppIcon
 import io.legado.app.ui.widget.components.icon.AppIcon
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.ui.widget.components.text.AppText
@@ -42,7 +43,9 @@ fun StatsGridCard(
             .fillMaxWidth()
             .fillMaxWidth()
             .adaptiveHorizontalPadding(vertical = 8.dp)
             .adaptiveHorizontalPadding(vertical = 8.dp)
     ) {
     ) {
-        Column(modifier = Modifier.padding(16.dp)) {
+        AppColumn(
+            Modifier.padding(16.dp)
+        ) {
             Row(verticalAlignment = Alignment.CenterVertically) {
             Row(verticalAlignment = Alignment.CenterVertically) {
                 AppIcon(
                 AppIcon(
                     imageVector = Icons.Default.Equalizer,
                     imageVector = Icons.Default.Equalizer,
@@ -80,7 +83,7 @@ private fun StatCell(
     item: StatItem,
     item: StatItem,
     modifier: Modifier = Modifier
     modifier: Modifier = Modifier
 ) {
 ) {
-    Column(
+    AppColumn(
         modifier = modifier,
         modifier = modifier,
         horizontalAlignment = Alignment.Start
         horizontalAlignment = Alignment.Start
     ) {
     ) {

+ 10 - 3
app/src/main/java/io/legado/app/ui/book/readRecord/component/ReadRecordSummary.kt

@@ -22,6 +22,7 @@ import io.legado.app.ui.book.readRecord.ReadRecordUiState
 import io.legado.app.ui.book.readRecord.ReadRecordViewModel
 import io.legado.app.ui.book.readRecord.ReadRecordViewModel
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.image.cover.CoilBookCover
 import io.legado.app.ui.widget.components.image.cover.CoilBookCover
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.ui.widget.components.text.AppText
@@ -88,16 +89,22 @@ fun ReadingSummaryCard(
             modifier = Modifier.padding(16.dp),
             modifier = Modifier.padding(16.dp),
             verticalAlignment = Alignment.CenterVertically
             verticalAlignment = Alignment.CenterVertically
         ) {
         ) {
-            Column(modifier = Modifier.weight(1f)) {
+            AppColumn(
+                modifier = Modifier.weight(1f)
+            ) {
                 AppText(title, style = LegadoTheme.typography.titleMedium)
                 AppText(title, style = LegadoTheme.typography.titleMedium)
                 Spacer(modifier = Modifier.height(4.dp))
                 Spacer(modifier = Modifier.height(4.dp))
                 AppText(
                 AppText(
-                    text = "共阅读 $bookCount 本书,时长 ${ReadRecordFormatter.formatDuration(totalTimeMillis)}",
+                    text = "共阅读 $bookCount 本书,时长 ${
+                        ReadRecordFormatter.formatDuration(
+                            totalTimeMillis
+                        )
+                    }",
                     style = LegadoTheme.typography.bodyMedium,
                     style = LegadoTheme.typography.bodyMedium,
                     color = LegadoTheme.colorScheme.onSurfaceVariant
                     color = LegadoTheme.colorScheme.onSurfaceVariant
                 )
                 )
             }
             }
-            
+
             BookStackView(
             BookStackView(
                 bookNamesForCover = bookNamesForCover,
                 bookNamesForCover = bookNamesForCover,
                 viewModel = viewModel
                 viewModel = viewModel

+ 3 - 2
app/src/main/java/io/legado/app/ui/book/readaloud/casting/BookVoiceCastingScreen.kt

@@ -37,6 +37,7 @@ import io.legado.app.R
 import io.legado.app.domain.model.readaloud.ReadAloudVoice
 import io.legado.app.domain.model.readaloud.ReadAloudVoice
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveContentPadding
 import io.legado.app.ui.theme.adaptiveContentPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.icon.AppIcon
 import io.legado.app.ui.widget.components.icon.AppIcon
@@ -235,7 +236,7 @@ private fun VoiceCastingCard(
                 }
                 }
             },
             },
             supportingContent = {
             supportingContent = {
-                Column(verticalArrangement = Arrangement.spacedBy(2.dp)) {
+                AppColumn(verticalArrangement = Arrangement.spacedBy(2.dp)) {
                     if (item.description.isNotBlank()) {
                     if (item.description.isNotBlank()) {
                         AnimatedTextLine(
                         AnimatedTextLine(
                             text = item.description,
                             text = item.description,
@@ -281,7 +282,7 @@ private fun VoicePickerSheet(
         title = picker?.let { subjectTitle(it.kind, it.name) }.orEmpty(),
         title = picker?.let { subjectTitle(it.kind, it.name) }.orEmpty(),
     ) {
     ) {
         if (picker == null) return@AppModalBottomSheet
         if (picker == null) return@AppModalBottomSheet
-        Column(
+        AppColumn(
             modifier = Modifier
             modifier = Modifier
                 .fillMaxWidth(),
                 .fillMaxWidth(),
             verticalArrangement = Arrangement.spacedBy(8.dp),
             verticalArrangement = Arrangement.spacedBy(8.dp),

+ 2 - 1
app/src/main/java/io/legado/app/ui/book/readaloud/cloudtts/CloudTtsScreen.kt

@@ -49,6 +49,7 @@ import io.legado.app.domain.model.readaloud.ReadAloudVoice
 import io.legado.app.domain.model.readaloud.profile
 import io.legado.app.domain.model.readaloud.profile
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveContentPadding
 import io.legado.app.ui.theme.adaptiveContentPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
@@ -689,7 +690,7 @@ private fun CloudTtsEngineEditorContent(
     val profile = provider.profile
     val profile = provider.profile
     LazyColumn {
     LazyColumn {
         item {
         item {
-            Column(
+            AppColumn(
                 verticalArrangement = Arrangement.spacedBy(4.dp)
                 verticalArrangement = Arrangement.spacedBy(4.dp)
             ) {
             ) {
                 MenuButton(profile.displayName) { providerMenu = true }
                 MenuButton(profile.displayName) { providerMenu = true }

+ 20 - 7
app/src/main/java/io/legado/app/ui/book/readaloud/player/ReadAloudPlayerScreen.kt

@@ -95,6 +95,7 @@ import io.legado.app.constant.ReadAloudBgMode
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.hazeStyle.HazeLegado
 import io.legado.app.ui.theme.hazeStyle.HazeLegado
 import io.legado.app.ui.util.rememberBlurBackdrop
 import io.legado.app.ui.util.rememberBlurBackdrop
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.button.series.MediumPlainButton
 import io.legado.app.ui.widget.components.button.series.MediumPlainButton
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
@@ -188,7 +189,7 @@ fun ReadAloudPlayerScreenContent(
                         .padding(horizontal = 24.dp, vertical = 16.dp),
                         .padding(horizontal = 24.dp, vertical = 16.dp),
                     verticalAlignment = Alignment.CenterVertically,
                     verticalAlignment = Alignment.CenterVertically,
                 ) {
                 ) {
-                    Column(
+                    AppColumn(
                         modifier = Modifier.weight(1f),
                         modifier = Modifier.weight(1f),
                         horizontalAlignment = Alignment.Start,
                         horizontalAlignment = Alignment.Start,
                     ) {
                     ) {
@@ -236,8 +237,8 @@ fun ReadAloudPlayerScreenContent(
                 } else {
                 } else {
                     Modifier
                     Modifier
                 }
                 }
-                Column(
-                    modifier = Modifier
+                AppColumn(
+                    Modifier
                         .fillMaxWidth()
                         .fillMaxWidth()
                         .clip(RectangleShape)
                         .clip(RectangleShape)
                         .then(hazeModifier)
                         .then(hazeModifier)
@@ -259,8 +260,20 @@ fun ReadAloudPlayerScreenContent(
                             .padding(horizontal = 24.dp),
                             .padding(horizontal = 24.dp),
                         horizontalArrangement = Arrangement.SpaceBetween
                         horizontalArrangement = Arrangement.SpaceBetween
                     ) {
                     ) {
-                        AppText(formatPosition(state.chapterPosition), style = LegadoTheme.typography.labelSmall, color = LegadoTheme.colorScheme.onSurfaceVariant)
-                        AppText("${(state.chapterPosition * 100 / state.chapterLength.coerceAtLeast(1))}%", style = LegadoTheme.typography.labelSmall, color = LegadoTheme.colorScheme.onSurfaceVariant)
+                        AppText(
+                            formatPosition(state.chapterPosition),
+                            style = LegadoTheme.typography.labelSmall,
+                            color = LegadoTheme.colorScheme.onSurfaceVariant
+                        )
+                        AppText(
+                            "${
+                                (state.chapterPosition * 100 / state.chapterLength.coerceAtLeast(
+                                    1
+                                ))
+                            }%",
+                            style = LegadoTheme.typography.labelSmall,
+                            color = LegadoTheme.colorScheme.onSurfaceVariant
+                        )
                     }
                     }
 
 
                     Row(
                     Row(
@@ -502,8 +515,8 @@ private fun CoverPage(
     contentPadding: PaddingValues,
     contentPadding: PaddingValues,
     flowingTextModifier: Modifier,
     flowingTextModifier: Modifier,
 ) {
 ) {
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxSize()
             .fillMaxSize()
             .padding(contentPadding)
             .padding(contentPadding)
             .padding(horizontal = 24.dp),
             .padding(horizontal = 24.dp),

+ 3 - 2
app/src/main/java/io/legado/app/ui/book/search/ScopeSelectSheet.kt

@@ -24,6 +24,7 @@ import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.data.entities.BookSourcePart
 import io.legado.app.data.entities.BookSourcePart
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.SearchBar
 import io.legado.app.ui.widget.components.SearchBar
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.card.SelectionItemCard
 import io.legado.app.ui.widget.components.card.SelectionItemCard
@@ -111,8 +112,8 @@ fun ScopeSelectSheet(
             }
             }
         },
         },
     ) {
     ) {
-        Column {
-
+        AppColumn(
+        ) {
             SearchBar(
             SearchBar(
                 query = filterText,
                 query = filterText,
                 onQueryChange = { filterText = it },
                 onQueryChange = { filterText = it },

+ 29 - 10
app/src/main/java/io/legado/app/ui/book/search/SearchScreen.kt

@@ -66,6 +66,7 @@ import io.legado.app.ui.theme.ThemeResolver
 import io.legado.app.ui.theme.adaptiveContentPadding
 import io.legado.app.ui.theme.adaptiveContentPadding
 import io.legado.app.ui.theme.adaptiveContentPaddingOnlyVertical
 import io.legado.app.ui.theme.adaptiveContentPaddingOnlyVertical
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.LoadMoreFooter
 import io.legado.app.ui.widget.components.LoadMoreFooter
@@ -307,7 +308,8 @@ fun SearchScreen(
     AppScaffold(
     AppScaffold(
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         topBar = {
         topBar = {
-            Column {
+            AppColumn(
+            ) {
                 GlassMediumFlexibleTopAppBar(
                 GlassMediumFlexibleTopAppBar(
                     title = stringResource(R.string.search),
                     title = stringResource(R.string.search),
                     navigationIcon = {
                     navigationIcon = {
@@ -332,7 +334,8 @@ fun SearchScreen(
                         TopBarAnimatedActionButton(
                         TopBarAnimatedActionButton(
                             checked = state.matchMode == MatchMode.EXACT,
                             checked = state.matchMode == MatchMode.EXACT,
                             onCheckedChange = {
                             onCheckedChange = {
-                                val newMode = if (state.matchMode == MatchMode.EXACT) MatchMode.DEFAULT else MatchMode.EXACT
+                                val newMode =
+                                    if (state.matchMode == MatchMode.EXACT) MatchMode.DEFAULT else MatchMode.EXACT
                                 onIntent(SearchIntent.SetMatchMode(newMode))
                                 onIntent(SearchIntent.SetMatchMode(newMode))
                             },
                             },
                             iconChecked = AppIcons.PrecisionSearch,
                             iconChecked = AppIcons.PrecisionSearch,
@@ -401,8 +404,8 @@ fun SearchScreen(
             }
             }
         }
         }
     ) { paddingValues ->
     ) { paddingValues ->
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxSize()
                 .fillMaxSize()
                 .padding(paddingValues)
                 .padding(paddingValues)
         ) {
         ) {
@@ -576,8 +579,15 @@ fun SearchScreen(
                         TopFloatingStickyItem(
                         TopFloatingStickyItem(
                             item = if (showResultCountCard || showSourceProgressCard) {
                             item = if (showResultCountCard || showSourceProgressCard) {
                                 SearchFloatingSummary(
                                 SearchFloatingSummary(
-                                    resultText = if (showResultCountCard) stringResource(R.string.search_result_count, state.results.size) else null,
-                                    sourceText = if (showSourceProgressCard) stringResource(R.string.search_source_progress, state.processedSources, state.totalSources) else null,
+                                    resultText = if (showResultCountCard) stringResource(
+                                        R.string.search_result_count,
+                                        state.results.size
+                                    ) else null,
+                                    sourceText = if (showSourceProgressCard) stringResource(
+                                        R.string.search_source_progress,
+                                        state.processedSources,
+                                        state.totalSources
+                                    ) else null,
                                 )
                                 )
                             } else {
                             } else {
                                 null
                                 null
@@ -592,13 +602,22 @@ fun SearchScreen(
                                 contentColor = LegadoTheme.colorScheme.onCardContainer
                                 contentColor = LegadoTheme.colorScheme.onCardContainer
                             ) {
                             ) {
                                 Row(
                                 Row(
-                                    modifier = Modifier.padding(horizontal = 12.dp, vertical = 8.dp),
+                                    modifier = Modifier.padding(
+                                        horizontal = 12.dp,
+                                        vertical = 8.dp
+                                    ),
                                 ) {
                                 ) {
                                     summary.resultText?.let { text ->
                                     summary.resultText?.let { text ->
-                                        AppText(text = text, style = LegadoTheme.typography.labelSmallEmphasized)
+                                        AppText(
+                                            text = text,
+                                            style = LegadoTheme.typography.labelSmallEmphasized
+                                        )
                                     }
                                     }
                                     summary.sourceText?.let { text ->
                                     summary.sourceText?.let { text ->
-                                        AppText(text = text, style = LegadoTheme.typography.labelSmallEmphasized)
+                                        AppText(
+                                            text = text,
+                                            style = LegadoTheme.typography.labelSmallEmphasized
+                                        )
                                     }
                                     }
                                 }
                                 }
                             }
                             }
@@ -672,7 +691,7 @@ fun SearchScreen(
         onDismissRequest = { onIntent(SearchIntent.SetSettingsSheetVisible(false)) },
         onDismissRequest = { onIntent(SearchIntent.SetSettingsSheetVisible(false)) },
         title = stringResource(R.string.setting),
         title = stringResource(R.string.setting),
     ) {
     ) {
-        Column(
+        AppColumn(
             verticalArrangement = Arrangement.spacedBy(8.dp)
             verticalArrangement = Arrangement.spacedBy(8.dp)
         ) {
         ) {
             CompactDropdownSettingItem(
             CompactDropdownSettingItem(

+ 4 - 1
app/src/main/java/io/legado/app/ui/book/search/SearchSourceSection.kt

@@ -29,6 +29,7 @@ import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveHorizonalPadding
 import io.legado.app.ui.theme.adaptiveHorizonalPadding
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
 import io.legado.app.ui.theme.fadingEdge
 import io.legado.app.ui.theme.fadingEdge
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.book.SearchBookGridItem
 import io.legado.app.ui.widget.components.book.SearchBookGridItem
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
 import io.legado.app.ui.widget.components.card.TextCard
 import io.legado.app.ui.widget.components.card.TextCard
@@ -49,7 +50,9 @@ fun SearchSourceSection(
 ) {
 ) {
     if (items.isEmpty()) return
     if (items.isEmpty()) return
 
 
-    Column(modifier = modifier) {
+    AppColumn(
+        modifier
+    ) {
         Row(
         Row(
             modifier = Modifier
             modifier = Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()

+ 12 - 6
app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentScreen.kt

@@ -55,6 +55,7 @@ import io.legado.app.R
 import io.legado.app.data.entities.SearchContentHistory
 import io.legado.app.data.entities.SearchContentHistory
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.EmptyMessage
@@ -167,7 +168,8 @@ fun SearchContentScreen(
     AppScaffold(
     AppScaffold(
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         topBar = {
         topBar = {
-            Column {
+            AppColumn(
+            ) {
                 GlassMediumFlexibleTopAppBar(
                 GlassMediumFlexibleTopAppBar(
                     title = if (searchQuery.isNotBlank() && searchResults.isNotEmpty()) {
                     title = if (searchQuery.isNotBlank() && searchResults.isNotEmpty()) {
                         "共 ${searchResults.size} 条结果"
                         "共 ${searchResults.size} 条结果"
@@ -258,8 +260,8 @@ fun SearchContentScreen(
             }
             }
         }
         }
     ) { paddingValues ->
     ) { paddingValues ->
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxSize()
                 .fillMaxSize()
                 .padding(paddingValues)
                 .padding(paddingValues)
         ) {
         ) {
@@ -293,6 +295,7 @@ fun SearchContentScreen(
                             onToggleScope = { onIntent(SearchContentIntent.ToggleHistoryScope) }
                             onToggleScope = { onIntent(SearchContentIntent.ToggleHistoryScope) }
                         )
                         )
                     }
                     }
+
                     SearchContentState.EmptyResult -> {
                     SearchContentState.EmptyResult -> {
                         EmptyMessage(
                         EmptyMessage(
                             message = "没有找到相关内容!",
                             message = "没有找到相关内容!",
@@ -338,7 +341,9 @@ fun SearchHistoryList(
     onClearHistory: () -> Unit,
     onClearHistory: () -> Unit,
     onToggleScope: () -> Unit
     onToggleScope: () -> Unit
 ) {
 ) {
-    Column(modifier = Modifier.fillMaxSize()) {
+    AppColumn(
+        Modifier.fillMaxSize()
+    ) {
         Box(
         Box(
             modifier = Modifier
             modifier = Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
@@ -440,7 +445,8 @@ fun SearchResultItem(
     ) {
     ) {
         Box(modifier = Modifier.padding(16.dp)) {
         Box(modifier = Modifier.padding(16.dp)) {
 
 
-            Column {
+            AppColumn(
+            ) {
                 AppText(
                 AppText(
                     text = result.getTitleAnnotatedString(
                     text = result.getTitleAnnotatedString(
                         accentColor = LegadoTheme.colorScheme.primary,
                         accentColor = LegadoTheme.colorScheme.primary,
@@ -466,7 +472,7 @@ fun SearchResultItem(
                 )
                 )
             }
             }
 
 
-            Row (
+            Row(
                 modifier = Modifier.align(Alignment.TopEnd),
                 modifier = Modifier.align(Alignment.TopEnd),
                 horizontalArrangement = Arrangement.spacedBy(4.dp)
                 horizontalArrangement = Arrangement.spacedBy(4.dp)
             ) {
             ) {

+ 4 - 1
app/src/main/java/io/legado/app/ui/book/toc/TocScreen.kt

@@ -96,6 +96,7 @@ import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveContentPaddingOnlyVertical
 import io.legado.app.ui.theme.adaptiveContentPaddingOnlyVertical
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
 import io.legado.app.ui.widget.components.ActionItem
 import io.legado.app.ui.widget.components.ActionItem
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppFloatingActionButtonMenu
 import io.legado.app.ui.widget.components.AppFloatingActionButtonMenu
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.CollapsibleHeader
 import io.legado.app.ui.widget.components.CollapsibleHeader
@@ -888,7 +889,9 @@ fun ChapterItem(
                 .adaptiveHorizontalPadding(vertical = 16.dp),
                 .adaptiveHorizontalPadding(vertical = 16.dp),
             verticalAlignment = Alignment.CenterVertically,
             verticalAlignment = Alignment.CenterVertically,
         ) {
         ) {
-            Column(modifier = Modifier.weight(1f)) {
+            AppColumn(
+                modifier = Modifier.weight(1f)
+            ) {
                 Row(verticalAlignment = Alignment.CenterVertically) {
                 Row(verticalAlignment = Alignment.CenterVertically) {
                     if (item.isVip && !item.isPay) {
                     if (item.isVip && !item.isPay) {
                         Icon(
                         Icon(

+ 8 - 10
app/src/main/java/io/legado/app/ui/book/toc/rule/preview/TxtTocRulePreviewScreen.kt

@@ -52,6 +52,7 @@ import io.legado.app.utils.toastOnUi
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveContentPadding
 import io.legado.app.ui.theme.adaptiveContentPadding
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.SearchBar
 import io.legado.app.ui.widget.components.SearchBar
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.card.GlassCard
@@ -309,10 +310,10 @@ private fun RulePreviewCard(
         modifier = Modifier.fillMaxWidth(),
         modifier = Modifier.fillMaxWidth(),
     ) {
     ) {
         Box(modifier = Modifier.fillMaxWidth()) {
         Box(modifier = Modifier.fillMaxWidth()) {
-            Column(
+            AppColumn(
                 modifier = Modifier
                 modifier = Modifier
                     .padding(12.dp)
                     .padding(12.dp)
-                    .padding(bottom = 28.dp),
+                    .padding(bottom = 28.dp)
             ) {
             ) {
                 AppText(
                 AppText(
                     text = item.rule.name,
                     text = item.rule.name,
@@ -384,8 +385,8 @@ private fun RulePreviewListItem(
             verticalAlignment = Alignment.CenterVertically,
             verticalAlignment = Alignment.CenterVertically,
             horizontalArrangement = Arrangement.SpaceBetween,
             horizontalArrangement = Arrangement.SpaceBetween,
         ) {
         ) {
-            Column(
-                modifier = Modifier.weight(1f),
+            AppColumn(
+                modifier = Modifier.weight(1f)
             ) {
             ) {
                 Text(
                 Text(
                     text = item.rule.name,
                     text = item.rule.name,
@@ -439,12 +440,11 @@ private fun ChapterListSheetContent(
     item: TocRulePreviewItem,
     item: TocRulePreviewItem,
     onEditRule: (TxtTocRule) -> Unit,
     onEditRule: (TxtTocRule) -> Unit,
 ) {
 ) {
-    Column(
-        modifier = Modifier
+    AppColumn(
+        Modifier
             .fillMaxWidth()
             .fillMaxWidth()
-            .padding(16.dp),
+            .padding(16.dp)
     ) {
     ) {
-        // Header
         Row(
         Row(
             modifier = Modifier.fillMaxWidth(),
             modifier = Modifier.fillMaxWidth(),
             verticalAlignment = Alignment.CenterVertically,
             verticalAlignment = Alignment.CenterVertically,
@@ -478,8 +478,6 @@ private fun ChapterListSheetContent(
         }
         }
 
 
         Spacer(modifier = Modifier.height(12.dp))
         Spacer(modifier = Modifier.height(12.dp))
-
-        // Chapter list
         FastScrollLazyColumn(
         FastScrollLazyColumn(
             modifier = Modifier
             modifier = Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()

+ 7 - 3
app/src/main/java/io/legado/app/ui/config/ai/AiProviderEditScreen.kt

@@ -34,6 +34,7 @@ import io.legado.app.R
 import io.legado.app.domain.model.AiProtocol
 import io.legado.app.domain.model.AiProtocol
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveContentPadding
 import io.legado.app.ui.theme.adaptiveContentPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
@@ -228,7 +229,8 @@ fun AiProviderEditScreen(
         onDismissRequest = { showApiKeyDialog = false },
         onDismissRequest = { showApiKeyDialog = false },
         title = stringResource(R.string.ai_api_key),
         title = stringResource(R.string.ai_api_key),
         content = {
         content = {
-            Column {
+            AppColumn(
+            ) {
                 AppTextField(
                 AppTextField(
                     value = apiKeyDraft,
                     value = apiKeyDraft,
                     onValueChange = { apiKeyDraft = it },
                     onValueChange = { apiKeyDraft = it },
@@ -238,7 +240,8 @@ fun AiProviderEditScreen(
                     visualTransformation = if (apiKeyVisible) VisualTransformation.None else PasswordVisualTransformation(),
                     visualTransformation = if (apiKeyVisible) VisualTransformation.None else PasswordVisualTransformation(),
                     keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
                     keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
                     trailingIcon = {
                     trailingIcon = {
-                        val image = if (apiKeyVisible) Icons.Filled.Visibility else Icons.Filled.VisibilityOff
+                        val image =
+                            if (apiKeyVisible) Icons.Filled.Visibility else Icons.Filled.VisibilityOff
                         val description = if (apiKeyVisible) {
                         val description = if (apiKeyVisible) {
                             stringResource(R.string.hide_password)
                             stringResource(R.string.hide_password)
                         } else {
                         } else {
@@ -266,7 +269,8 @@ fun AiProviderEditScreen(
         onDismissRequest = { onIntent(AiProviderEditIntent.DismissModelEditor) },
         onDismissRequest = { onIntent(AiProviderEditIntent.DismissModelEditor) },
         title = stringResource(R.string.ai_model_edit),
         title = stringResource(R.string.ai_model_edit),
         content = { model ->
         content = { model ->
-            Column {
+            io.legado.app.ui.widget.components.AppColumn(
+            ) {
                 AppTextField(
                 AppTextField(
                     value = model.modelName,
                     value = model.modelName,
                     onValueChange = { onIntent(AiProviderEditIntent.UpdateEditingModelName(it)) },
                     onValueChange = { onIntent(AiProviderEditIntent.UpdateEditingModelName(it)) },

+ 5 - 3
app/src/main/java/io/legado/app/ui/config/backupConfig/BackupConfigScreen.kt

@@ -45,6 +45,7 @@ import io.legado.app.lib.permission.Permissions
 import io.legado.app.lib.permission.PermissionsCompat
 import io.legado.app.lib.permission.PermissionsCompat
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveContentPadding
 import io.legado.app.ui.theme.adaptiveContentPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.SplicedColumnGroup
 import io.legado.app.ui.widget.components.SplicedColumnGroup
@@ -405,8 +406,8 @@ private fun IgnoreItemsSheet(
             )
             )
         },
         },
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .verticalScroll(rememberScrollState()),
                 .verticalScroll(rememberScrollState()),
             verticalArrangement = Arrangement.spacedBy(8.dp),
             verticalArrangement = Arrangement.spacedBy(8.dp),
@@ -464,7 +465,8 @@ private fun BackupConfigDialogs(
         title = stringResource(R.string.web_dav_account),
         title = stringResource(R.string.web_dav_account),
         content = {
         content = {
             auth?.let {
             auth?.let {
-                Column {
+                io.legado.app.ui.widget.components.AppColumn(
+                ) {
                     AppTextField(
                     AppTextField(
                         value = it.account,
                         value = it.account,
                         onValueChange = { value ->
                         onValueChange = { value ->

+ 5 - 3
app/src/main/java/io/legado/app/ui/config/coverConfig/CoverAlbumManageScreen.kt

@@ -48,6 +48,7 @@ import coil.compose.AsyncImage
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.adaptiveContentPadding
 import io.legado.app.ui.theme.adaptiveContentPadding
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
@@ -148,7 +149,7 @@ fun CoverAlbumManageScreen(
                     .padding(paddingValues),
                     .padding(paddingValues),
                 contentAlignment = Alignment.Center,
                 contentAlignment = Alignment.Center,
             ) {
             ) {
-                Column(
+                AppColumn(
                     horizontalAlignment = Alignment.CenterHorizontally,
                     horizontalAlignment = Alignment.CenterHorizontally,
                     verticalArrangement = Arrangement.spacedBy(12.dp),
                     verticalArrangement = Arrangement.spacedBy(12.dp),
                 ) {
                 ) {
@@ -254,7 +255,7 @@ private fun CoverAlbumCard(
                     )
                     )
                 }
                 }
             }
             }
-            Column(
+            AppColumn(
                 modifier = Modifier.weight(1f),
                 modifier = Modifier.weight(1f),
                 verticalArrangement = Arrangement.spacedBy(4.dp),
                 verticalArrangement = Arrangement.spacedBy(4.dp),
             ) {
             ) {
@@ -280,7 +281,8 @@ private fun CoverAlbumCard(
                     )
                     )
                 }
                 }
             }
             }
-            Column {
+            AppColumn(
+            ) {
                 SmallPlainButton(
                 SmallPlainButton(
                     onClick = onRename,
                     onClick = onRename,
                     icon = Icons.Default.Edit,
                     icon = Icons.Default.Edit,

+ 6 - 3
app/src/main/java/io/legado/app/ui/config/coverConfig/CoverAlbumSelectSheet.kt

@@ -25,6 +25,7 @@ import androidx.compose.ui.unit.dp
 import coil.compose.AsyncImage
 import coil.compose.AsyncImage
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.icon.AppIcon
 import io.legado.app.ui.widget.components.icon.AppIcon
@@ -52,8 +53,8 @@ fun CoverAlbumSelectSheet(
             )
             )
         },
         },
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .verticalScroll(rememberScrollState())
                 .verticalScroll(rememberScrollState())
                 .padding(vertical = 8.dp),
                 .padding(vertical = 8.dp),
@@ -135,7 +136,9 @@ private fun CoverAlbumSelectionItem(
                     )
                     )
                 }
                 }
             }
             }
-            Column(modifier = Modifier.weight(1f)) {
+            AppColumn(
+                modifier = Modifier.weight(1f)
+            ) {
                 AppText(
                 AppText(
                     text = name,
                     text = name,
                     style = LegadoTheme.typography.titleSmall,
                     style = LegadoTheme.typography.titleSmall,

+ 3 - 2
app/src/main/java/io/legado/app/ui/config/coverConfig/CoverRuleConfigSheet.kt

@@ -15,6 +15,7 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.checkBox.CheckboxItem
 import io.legado.app.ui.widget.components.checkBox.CheckboxItem
@@ -51,8 +52,8 @@ fun CoverRuleConfigSheet(
             )
             )
         }
         }
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(bottom = 24.dp)
                 .padding(bottom = 24.dp)
                 .verticalScroll(rememberScrollState()),
                 .verticalScroll(rememberScrollState()),

+ 3 - 3
app/src/main/java/io/legado/app/ui/config/otherConfig/CheckSourceBottomSheet.kt

@@ -12,6 +12,7 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.checkBox.CheckboxItem
 import io.legado.app.ui.widget.components.checkBox.CheckboxItem
@@ -32,12 +33,11 @@ fun CheckSourceBottomSheet(
         onDismissRequest = onDismiss,
         onDismissRequest = onDismiss,
         title = stringResource(R.string.check_source_config)
         title = stringResource(R.string.check_source_config)
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(bottom = 32.dp)
                 .padding(bottom = 32.dp)
         ) {
         ) {
-
             GlassCard {
             GlassCard {
                 SliderSettingItem(
                 SliderSettingItem(
                     title = stringResource(R.string.check_source_timeout),
                     title = stringResource(R.string.check_source_timeout),

+ 3 - 2
app/src/main/java/io/legado/app/ui/config/otherConfig/DirectLinkUploadBottomSheet.kt

@@ -29,6 +29,7 @@ import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.lib.dialogs.selector
 import io.legado.app.lib.dialogs.selector
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
@@ -139,8 +140,8 @@ fun DirectLinkUploadBottomSheet(
         },
         },
         onDismissRequest = onDismiss
         onDismissRequest = onDismiss
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(bottom = 24.dp)
                 .padding(bottom = 24.dp)
                 .verticalScroll(rememberScrollState())
                 .verticalScroll(rememberScrollState())

+ 16 - 13
app/src/main/java/io/legado/app/ui/config/readConfig/PageKeySheet.kt

@@ -18,6 +18,7 @@ import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
@@ -47,8 +48,8 @@ fun PageKeySheet(
         onDismissRequest = onDismissRequest,
         onDismissRequest = onDismissRequest,
         title = stringResource(R.string.custom_page_key)
         title = stringResource(R.string.custom_page_key)
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(16.dp),
                 .padding(16.dp),
             verticalArrangement = Arrangement.spacedBy(16.dp)
             verticalArrangement = Arrangement.spacedBy(16.dp)
@@ -63,11 +64,12 @@ fun PageKeySheet(
                         if (event.nativeKeyEvent.action == KeyEvent.ACTION_DOWN) {
                         if (event.nativeKeyEvent.action == KeyEvent.ACTION_DOWN) {
                             val keyCode = event.nativeKeyEvent.keyCode
                             val keyCode = event.nativeKeyEvent.keyCode
                             if (keyCode != KeyEvent.KEYCODE_BACK && keyCode != KeyEvent.KEYCODE_DEL) {
                             if (keyCode != KeyEvent.KEYCODE_BACK && keyCode != KeyEvent.KEYCODE_DEL) {
-                                prevKeysDraft = if (prevKeysDraft.isEmpty() || prevKeysDraft.endsWith(",")) {
-                                    prevKeysDraft + keyCode.toString()
-                                } else {
-                                    "$prevKeysDraft,$keyCode"
-                                }
+                                prevKeysDraft =
+                                    if (prevKeysDraft.isEmpty() || prevKeysDraft.endsWith(",")) {
+                                        prevKeysDraft + keyCode.toString()
+                                    } else {
+                                        "$prevKeysDraft,$keyCode"
+                                    }
                                 return@onPreviewKeyEvent true
                                 return@onPreviewKeyEvent true
                             }
                             }
                         }
                         }
@@ -80,17 +82,18 @@ fun PageKeySheet(
                 value = nextKeysDraft,
                 value = nextKeysDraft,
                 onValueChange = { nextKeysDraft = it },
                 onValueChange = { nextKeysDraft = it },
                 label = stringResource(R.string.next_page_key),
                 label = stringResource(R.string.next_page_key),
-                modifier = Modifier.Companion
+                modifier = Modifier
                     .fillMaxWidth()
                     .fillMaxWidth()
                     .onPreviewKeyEvent { event ->
                     .onPreviewKeyEvent { event ->
                         if (event.nativeKeyEvent.action == KeyEvent.ACTION_DOWN) {
                         if (event.nativeKeyEvent.action == KeyEvent.ACTION_DOWN) {
                             val keyCode = event.nativeKeyEvent.keyCode
                             val keyCode = event.nativeKeyEvent.keyCode
                             if (keyCode != KeyEvent.KEYCODE_BACK && keyCode != KeyEvent.KEYCODE_DEL) {
                             if (keyCode != KeyEvent.KEYCODE_BACK && keyCode != KeyEvent.KEYCODE_DEL) {
-                                nextKeysDraft = if (nextKeysDraft.isEmpty() || nextKeysDraft.endsWith(",")) {
-                                    nextKeysDraft + keyCode.toString()
-                                } else {
-                                    "$nextKeysDraft,$keyCode"
-                                }
+                                nextKeysDraft =
+                                    if (nextKeysDraft.isEmpty() || nextKeysDraft.endsWith(",")) {
+                                        nextKeysDraft + keyCode.toString()
+                                    } else {
+                                        "$nextKeysDraft,$keyCode"
+                                    }
                                 return@onPreviewKeyEvent true
                                 return@onPreviewKeyEvent true
                             }
                             }
                         }
                         }

+ 3 - 3
app/src/main/java/io/legado/app/ui/config/themeConfig/BackgroundImageManageSheet.kt

@@ -20,6 +20,7 @@ import androidx.compose.ui.unit.dp
 import coil.compose.AsyncImage
 import coil.compose.AsyncImage
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.icon.AppIcon
 import io.legado.app.ui.widget.components.icon.AppIcon
@@ -39,12 +40,11 @@ fun BackgroundImageManageSheet(
         onDismissRequest = onDismissRequest,
         onDismissRequest = onDismissRequest,
         title = stringResource(R.string.background_image),
         title = stringResource(R.string.background_image),
     ) { isDark ->
     ) { isDark ->
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(bottom = 24.dp)
                 .padding(bottom = 24.dp)
         ) {
         ) {
-
             if (currentPath.isNullOrBlank()) {
             if (currentPath.isNullOrBlank()) {
                 NormalCard(
                 NormalCard(
                     onClick = { onSelectImage(isDark) },
                     onClick = { onSelectImage(isDark) },

+ 4 - 4
app/src/main/java/io/legado/app/ui/config/themeConfig/LauncherIconPickerSheet.kt

@@ -39,6 +39,7 @@ import io.legado.app.ui.main.Launcher5
 import io.legado.app.ui.main.Launcher6
 import io.legado.app.ui.main.Launcher6
 import io.legado.app.ui.main.LauncherW
 import io.legado.app.ui.main.LauncherW
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.utils.getCompatDrawable
 import io.legado.app.utils.getCompatDrawable
@@ -60,12 +61,11 @@ fun LauncherIconPickerSheet(
         onDismissRequest = onDismissRequest,
         onDismissRequest = onDismissRequest,
         title = stringResource(R.string.change_icon)
         title = stringResource(R.string.change_icon)
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .padding(bottom = 24.dp)
                 .padding(bottom = 24.dp)
         ) {
         ) {
-
             LazyVerticalGrid(
             LazyVerticalGrid(
                 columns = GridCells.Fixed(3),
                 columns = GridCells.Fixed(3),
                 contentPadding = PaddingValues(horizontal = 16.dp),
                 contentPadding = PaddingValues(horizontal = 16.dp),
@@ -196,4 +196,4 @@ object LauncherIcons {
     fun find(value: String?): LauncherIconItem? {
     fun find(value: String?): LauncherIconItem? {
         return list.find { it.value == value }
         return list.find { it.value == value }
     }
     }
-}
+}

+ 4 - 3
app/src/main/java/io/legado/app/ui/config/themeConfig/MainNavigationSettingsSheet.kt

@@ -22,6 +22,7 @@ import io.legado.app.R
 import io.legado.app.domain.model.settings.AppShellSettings
 import io.legado.app.domain.model.settings.AppShellSettings
 import io.legado.app.ui.main.MainDestination
 import io.legado.app.ui.main.MainDestination
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.card.ReorderableSelectionItem
 import io.legado.app.ui.widget.components.card.ReorderableSelectionItem
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.settingItem.CompactClickableSettingItem
 import io.legado.app.ui.widget.components.settingItem.CompactClickableSettingItem
@@ -87,10 +88,10 @@ fun MainNavigationSettingsSheet(
         onDismissRequest = onDismissRequest,
         onDismissRequest = onDismissRequest,
         title = stringResource(R.string.main_navigation_settings),
         title = stringResource(R.string.main_navigation_settings),
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
-                .padding(bottom = 24.dp),
+                .padding(bottom = 24.dp)
         ) {
         ) {
             CompactDropdownSettingItem(
             CompactDropdownSettingItem(
                 title = stringResource(R.string.default_home_page),
                 title = stringResource(R.string.default_home_page),

+ 6 - 3
app/src/main/java/io/legado/app/ui/config/themeConfig/NavIconManageSheet.kt

@@ -29,6 +29,7 @@ import io.legado.app.ui.widget.components.icon.AppIcon
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.domain.model.settings.AppShellSettings
 import io.legado.app.domain.model.settings.AppShellSettings
+import io.legado.app.ui.widget.components.AppColumn
 
 
 private data class NavIconDestination(
 private data class NavIconDestination(
     val key: String,
     val key: String,
@@ -62,9 +63,11 @@ fun NavIconManageSheet(
         onDismissRequest = onDismissRequest,
         onDismissRequest = onDismissRequest,
         title = stringResource(R.string.theme_config_nav_icons),
         title = stringResource(R.string.theme_config_nav_icons),
     ) {
     ) {
-        Column(modifier = Modifier
-            .fillMaxWidth()
-            .padding(bottom = 24.dp)) {
+        AppColumn(
+            Modifier
+                .fillMaxWidth()
+                .padding(bottom = 24.dp)
+        ) {
             Row(
             Row(
                 modifier = Modifier
                 modifier = Modifier
                     .fillMaxWidth()
                     .fillMaxWidth()

+ 47 - 28
app/src/main/java/io/legado/app/ui/config/themeManage/EditThemeSheet.kt

@@ -30,6 +30,7 @@ import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.domain.model.settings.ThemeExportData
 import io.legado.app.domain.model.settings.ThemeExportData
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.dialog.ColorPickerSheet
 import io.legado.app.ui.widget.components.dialog.ColorPickerSheet
@@ -71,15 +72,14 @@ fun EditThemeSheet(
             )
             )
         }
         }
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .verticalScroll(rememberScrollState())
                 .verticalScroll(rememberScrollState())
                 .navigationBarsPadding()
                 .navigationBarsPadding()
                 .padding(bottom = 32.dp),
                 .padding(bottom = 32.dp),
             verticalArrangement = Arrangement.spacedBy(8.dp)
             verticalArrangement = Arrangement.spacedBy(8.dp)
         ) {
         ) {
-            // Name
             AppTextField(
             AppTextField(
                 value = name,
                 value = name,
                 onValueChange = { name = it },
                 onValueChange = { name = it },
@@ -90,8 +90,6 @@ fun EditThemeSheet(
             )
             )
 
 
             Spacer(modifier = Modifier.height(8.dp))
             Spacer(modifier = Modifier.height(8.dp))
-
-            // Basic settings
             SectionTitle(stringResource(R.string.theme_manage_section_basic))
             SectionTitle(stringResource(R.string.theme_manage_section_basic))
             CompactDropdownSettingItem(
             CompactDropdownSettingItem(
                 title = stringResource(R.string.theme_mode),
                 title = stringResource(R.string.theme_mode),
@@ -123,8 +121,6 @@ fun EditThemeSheet(
             )
             )
 
 
             Spacer(modifier = Modifier.height(8.dp))
             Spacer(modifier = Modifier.height(8.dp))
-
-            // Colors
             SectionTitle(stringResource(R.string.theme_manage_section_colors))
             SectionTitle(stringResource(R.string.theme_manage_section_colors))
             CompactSwitchSettingItem(
             CompactSwitchSettingItem(
                 title = stringResource(R.string.theme_manage_use_palette_colors),
                 title = stringResource(R.string.theme_manage_use_palette_colors),
@@ -136,38 +132,71 @@ fun EditThemeSheet(
                 ColorItem(stringResource(R.string.theme_manage_primary_color), data.themeColor) {
                 ColorItem(stringResource(R.string.theme_manage_primary_color), data.themeColor) {
                     currentColorKey = "themeColor"; showColorPicker = true
                     currentColorKey = "themeColor"; showColorPicker = true
                 }
                 }
-                ColorItem(stringResource(R.string.theme_manage_secondary_color), data.secondaryThemeColor) {
+                ColorItem(
+                    stringResource(R.string.theme_manage_secondary_color),
+                    data.secondaryThemeColor
+                ) {
                     currentColorKey = "secondaryThemeColor"; showColorPicker = true
                     currentColorKey = "secondaryThemeColor"; showColorPicker = true
                 }
                 }
-                ColorItem(stringResource(R.string.theme_manage_primary_text_color), data.primaryTextColor) {
+                ColorItem(
+                    stringResource(R.string.theme_manage_primary_text_color),
+                    data.primaryTextColor
+                ) {
                     currentColorKey = "primaryTextColor"; showColorPicker = true
                     currentColorKey = "primaryTextColor"; showColorPicker = true
                 }
                 }
-                ColorItem(stringResource(R.string.theme_manage_secondary_text_color), data.secondaryTextColor) {
+                ColorItem(
+                    stringResource(R.string.theme_manage_secondary_text_color),
+                    data.secondaryTextColor
+                ) {
                     currentColorKey = "secondaryTextColor"; showColorPicker = true
                     currentColorKey = "secondaryTextColor"; showColorPicker = true
                 }
                 }
-                ColorItem(stringResource(R.string.theme_manage_background_color), data.themeBackgroundColor) {
+                ColorItem(
+                    stringResource(R.string.theme_manage_background_color),
+                    data.themeBackgroundColor
+                ) {
                     currentColorKey = "themeBackgroundColor"; showColorPicker = true
                     currentColorKey = "themeBackgroundColor"; showColorPicker = true
                 }
                 }
-                ColorItem(stringResource(R.string.theme_manage_label_container_color), data.labelContainerColor) {
+                ColorItem(
+                    stringResource(R.string.theme_manage_label_container_color),
+                    data.labelContainerColor
+                ) {
                     currentColorKey = "labelContainerColor"; showColorPicker = true
                     currentColorKey = "labelContainerColor"; showColorPicker = true
                 }
                 }
                 SectionTitle(stringResource(R.string.night))
                 SectionTitle(stringResource(R.string.night))
-                ColorItem(stringResource(R.string.theme_manage_primary_color), data.themeColorNight) {
+                ColorItem(
+                    stringResource(R.string.theme_manage_primary_color),
+                    data.themeColorNight
+                ) {
                     currentColorKey = "themeColorNight"; showColorPicker = true
                     currentColorKey = "themeColorNight"; showColorPicker = true
                 }
                 }
-                ColorItem(stringResource(R.string.theme_manage_secondary_color), data.secondaryThemeColorNight) {
+                ColorItem(
+                    stringResource(R.string.theme_manage_secondary_color),
+                    data.secondaryThemeColorNight
+                ) {
                     currentColorKey = "secondaryThemeColorNight"; showColorPicker = true
                     currentColorKey = "secondaryThemeColorNight"; showColorPicker = true
                 }
                 }
-                ColorItem(stringResource(R.string.theme_manage_primary_text_color), data.primaryTextColorNight) {
+                ColorItem(
+                    stringResource(R.string.theme_manage_primary_text_color),
+                    data.primaryTextColorNight
+                ) {
                     currentColorKey = "primaryTextColorNight"; showColorPicker = true
                     currentColorKey = "primaryTextColorNight"; showColorPicker = true
                 }
                 }
-                ColorItem(stringResource(R.string.theme_manage_secondary_text_color), data.secondaryTextColorNight) {
+                ColorItem(
+                    stringResource(R.string.theme_manage_secondary_text_color),
+                    data.secondaryTextColorNight
+                ) {
                     currentColorKey = "secondaryTextColorNight"; showColorPicker = true
                     currentColorKey = "secondaryTextColorNight"; showColorPicker = true
                 }
                 }
-                ColorItem(stringResource(R.string.theme_manage_background_color), data.themeBackgroundColorNight) {
+                ColorItem(
+                    stringResource(R.string.theme_manage_background_color),
+                    data.themeBackgroundColorNight
+                ) {
                     currentColorKey = "themeBackgroundColorNight"; showColorPicker = true
                     currentColorKey = "themeBackgroundColorNight"; showColorPicker = true
                 }
                 }
-                ColorItem(stringResource(R.string.theme_manage_label_container_color), data.labelContainerColorNight) {
+                ColorItem(
+                    stringResource(R.string.theme_manage_label_container_color),
+                    data.labelContainerColorNight
+                ) {
                     currentColorKey = "labelContainerColorNight"; showColorPicker = true
                     currentColorKey = "labelContainerColorNight"; showColorPicker = true
                 }
                 }
             } else {
             } else {
@@ -180,8 +209,6 @@ fun EditThemeSheet(
             }
             }
 
 
             Spacer(modifier = Modifier.height(8.dp))
             Spacer(modifier = Modifier.height(8.dp))
-
-            // Interface layout
             SectionTitle(stringResource(R.string.theme_manage_section_layout))
             SectionTitle(stringResource(R.string.theme_manage_section_layout))
             CompactSwitchSettingItem(
             CompactSwitchSettingItem(
                 title = stringResource(R.string.show_home),
                 title = stringResource(R.string.show_home),
@@ -241,8 +268,6 @@ fun EditThemeSheet(
             )
             )
 
 
             Spacer(modifier = Modifier.height(8.dp))
             Spacer(modifier = Modifier.height(8.dp))
-
-            // Blur
             SectionTitle(stringResource(R.string.theme_manage_section_blur))
             SectionTitle(stringResource(R.string.theme_manage_section_blur))
             CompactSwitchSettingItem(
             CompactSwitchSettingItem(
                 title = stringResource(R.string.is_blur_enable),
                 title = stringResource(R.string.is_blur_enable),
@@ -277,8 +302,6 @@ fun EditThemeSheet(
             }
             }
 
 
             Spacer(modifier = Modifier.height(8.dp))
             Spacer(modifier = Modifier.height(8.dp))
-
-            // Opacity
             SectionTitle(stringResource(R.string.theme_manage_section_opacity))
             SectionTitle(stringResource(R.string.theme_manage_section_opacity))
             CompactSliderSettingItem(
             CompactSliderSettingItem(
                 title = stringResource(R.string.top_bar_opacity),
                 title = stringResource(R.string.top_bar_opacity),
@@ -294,8 +317,6 @@ fun EditThemeSheet(
             )
             )
 
 
             Spacer(modifier = Modifier.height(8.dp))
             Spacer(modifier = Modifier.height(8.dp))
-
-            // Container
             SectionTitle(stringResource(R.string.theme_manage_section_container))
             SectionTitle(stringResource(R.string.theme_manage_section_container))
             CompactSliderSettingItem(
             CompactSliderSettingItem(
                 title = stringResource(R.string.container_opacity),
                 title = stringResource(R.string.container_opacity),
@@ -305,8 +326,6 @@ fun EditThemeSheet(
             )
             )
 
 
             Spacer(modifier = Modifier.height(8.dp))
             Spacer(modifier = Modifier.height(8.dp))
-
-            // Other
             SectionTitle(stringResource(R.string.other))
             SectionTitle(stringResource(R.string.other))
             CompactSwitchSettingItem(
             CompactSwitchSettingItem(
                 title = stringResource(R.string.pure_black),
                 title = stringResource(R.string.pure_black),

+ 9 - 5
app/src/main/java/io/legado/app/ui/dict/DictSheet.kt

@@ -33,6 +33,7 @@ import androidx.compose.ui.unit.dp
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import coil.compose.AsyncImage
 import coil.compose.AsyncImage
 import io.legado.app.R
 import io.legado.app.R
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.pager.pagerHeight
 import io.legado.app.ui.widget.components.pager.pagerHeight
@@ -161,8 +162,8 @@ private fun DictPagerContent(
         heightAnimationSpec = spring(),
         heightAnimationSpec = spring(),
     )
     )
 
 
-    Column(
-        modifier = modifier,
+    AppColumn(
+        modifier
     ) {
     ) {
         AppTabRow(
         AppTabRow(
             tabTitles = tabTitles,
             tabTitles = tabTitles,
@@ -227,8 +228,8 @@ private fun DictPageContent(
     emptyMessage: String?,
     emptyMessage: String?,
     modifier: Modifier = Modifier,
     modifier: Modifier = Modifier,
 ) {
 ) {
-    Column(
-        modifier = modifier.verticalScroll(rememberScrollState()),
+    AppColumn(
+        modifier.verticalScroll(rememberScrollState())
     ) {
     ) {
         when {
         when {
             state.isLoading -> {
             state.isLoading -> {
@@ -270,7 +271,9 @@ private fun DictHtmlContent(
     modifier: Modifier = Modifier,
     modifier: Modifier = Modifier,
 ) {
 ) {
     val blocks = remember(htmlContent) { parseHtmlBlocks(htmlContent) }
     val blocks = remember(htmlContent) { parseHtmlBlocks(htmlContent) }
-    Column(modifier = modifier.padding(horizontal = 32.dp, vertical = 16.dp)) {
+    AppColumn(
+        modifier.padding(horizontal = 32.dp, vertical = 16.dp)
+    ) {
         blocks.forEach { block ->
         blocks.forEach { block ->
             when (block) {
             when (block) {
                 is HtmlBlock.Text -> {
                 is HtmlBlock.Text -> {
@@ -280,6 +283,7 @@ private fun DictHtmlContent(
                         },
                         },
                     )
                     )
                 }
                 }
+
                 is HtmlBlock.Image -> {
                 is HtmlBlock.Image -> {
                     AsyncImage(
                     AsyncImage(
                         model = block.url,
                         model = block.url,

+ 2 - 1
app/src/main/java/io/legado/app/ui/highlightTagRule/HighlightTagRuleEditSheet.kt

@@ -34,6 +34,7 @@ import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AdaptiveSwitch
 import io.legado.app.ui.widget.components.AdaptiveSwitch
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenu
 import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenu
 import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenuItem
 import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenuItem
@@ -122,7 +123,7 @@ fun HighlightTagRuleEditSheet(
         onDismissRequest = onDismissRequest
         onDismissRequest = onDismissRequest
     ) {
     ) {
         Box(modifier = Modifier.fillMaxWidth()) {
         Box(modifier = Modifier.fillMaxWidth()) {
-            Column(
+            AppColumn(
                 modifier = Modifier
                 modifier = Modifier
                     .fillMaxWidth()
                     .fillMaxWidth()
                     .padding(bottom = 120.dp)
                     .padding(bottom = 120.dp)

+ 2 - 1
app/src/main/java/io/legado/app/ui/main/MainScreen.kt

@@ -345,7 +345,8 @@ fun MainScreen(
                 header = {
                 header = {
                     val expanded = navState.targetValue == WideNavigationRailValue.Expanded
                     val expanded = navState.targetValue == WideNavigationRailValue.Expanded
 
 
-                    Column {
+                    io.legado.app.ui.widget.components.AppColumn(
+                    ) {
                         IconButton(
                         IconButton(
                             modifier = Modifier.padding(start = 24.dp),
                             modifier = Modifier.padding(start = 24.dp),
                             onClick = {
                             onClick = {

+ 27 - 25
app/src/main/java/io/legado/app/ui/main/bookshelf/BookItem.kt

@@ -55,6 +55,7 @@ import io.legado.app.constant.BookType
 import io.legado.app.domain.model.settings.BookshelfSettings
 import io.legado.app.domain.model.settings.BookshelfSettings
 import io.legado.app.ui.config.themeConfig.TagColorPair
 import io.legado.app.ui.config.themeConfig.TagColorPair
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.TextCard
 import io.legado.app.ui.widget.components.card.TextCard
 import io.legado.app.ui.widget.components.icon.AppIcon
 import io.legado.app.ui.widget.components.icon.AppIcon
@@ -134,13 +135,12 @@ fun BookshelfItem(
                 )
                 )
                 .then(accessibilityModifier)
                 .then(accessibilityModifier)
         ) {
         ) {
-            Column(
+            AppColumn(
                 horizontalAlignment = Alignment.CenterHorizontally,
                 horizontalAlignment = Alignment.CenterHorizontally,
                 modifier = Modifier
                 modifier = Modifier
                     .align(Alignment.Center)
                     .align(Alignment.Center)
                     .width(coverWidth.dp)
                     .width(coverWidth.dp)
             ) {
             ) {
-
                 Box(
                 Box(
                     modifier = Modifier
                     modifier = Modifier
                         .padding(4.dp)
                         .padding(4.dp)
@@ -199,7 +199,8 @@ fun BookshelfItem(
             }
             }
         }
         }
     } else {
     } else {
-        Column {
+        AppColumn(
+        ) {
             NormalCard(
             NormalCard(
                 modifier = modifier
                 modifier = modifier
                     .fillMaxWidth()
                     .fillMaxWidth()
@@ -246,26 +247,26 @@ fun BookshelfItem(
                             .padding(top = 4.dp, bottom = 4.dp, end = 8.dp, start = 4.dp),
                             .padding(top = 4.dp, bottom = 4.dp, end = 8.dp, start = 4.dp),
                         verticalArrangement = Arrangement.Center
                         verticalArrangement = Arrangement.Center
                     ) {
                     ) {
-                    Row(
-                        verticalAlignment = Alignment.Top
-                    ) {
-                        AppText(
-                            text = title,
-                            style = if (titleColor != null) {
-                                LegadoTheme.typography.titleMediumEmphasized.copy(color = titleColor)
-                            } else {
-                                LegadoTheme.typography.titleMediumEmphasized
-                            },
-                            maxLines = settings.bookshelfTitleMaxLines,
-                            overflow = TextOverflow.Ellipsis,
-                            modifier = Modifier.weight(1f)
-                        )
-                        titleEnd?.let {
-                            Box(modifier = Modifier.padding(top = 4.dp, start = 4.dp)) {
-                                it.invoke()
+                        Row(
+                            verticalAlignment = Alignment.Top
+                        ) {
+                            AppText(
+                                text = title,
+                                style = if (titleColor != null) {
+                                    LegadoTheme.typography.titleMediumEmphasized.copy(color = titleColor)
+                                } else {
+                                    LegadoTheme.typography.titleMediumEmphasized
+                                },
+                                maxLines = settings.bookshelfTitleMaxLines,
+                                overflow = TextOverflow.Ellipsis,
+                                modifier = Modifier.weight(1f)
+                            )
+                            titleEnd?.let {
+                                Box(modifier = Modifier.padding(top = 4.dp, start = 4.dp)) {
+                                    it.invoke()
+                                }
                             }
                             }
                         }
                         }
-                    }
                         subTitle?.let {
                         subTitle?.let {
                             AppText(
                             AppText(
                                 text = it,
                                 text = it,
@@ -344,10 +345,10 @@ fun BookGroupCover(
                     }
                     }
                 }
                 }
             ) {
             ) {
-                Column(
-                    modifier = Modifier
+                AppColumn(
+                    Modifier
                         .fillMaxSize()
                         .fillMaxSize()
-                        .padding(horizontal = 1.dp),
+                        .padding(horizontal = 1.dp)
                 ) {
                 ) {
                     Row(modifier = Modifier.weight(1f)) {
                     Row(modifier = Modifier.weight(1f)) {
                         Box(
                         Box(
@@ -556,7 +557,8 @@ fun BookGroupItemHorizontalCovers(
     onLongClick: (() -> Unit)? = null,
     onLongClick: (() -> Unit)? = null,
     onBookClick: ((BookShelfItem) -> Unit)? = null
     onBookClick: ((BookShelfItem) -> Unit)? = null
 ) {
 ) {
-    Column {
+    AppColumn(
+    ) {
         val isDark = LegadoTheme.isDark
         val isDark = LegadoTheme.isDark
         val bookshelfCardColor =
         val bookshelfCardColor =
             if (isDark) settings.bookshelfCardColorDark else settings.bookshelfCardColor
             if (isDark) settings.bookshelfCardColorDark else settings.bookshelfCardColor

+ 22 - 13
app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfConfigSheet.kt

@@ -35,6 +35,7 @@ import io.legado.app.domain.model.settings.BookshelfSettings
 import io.legado.app.ui.config.themeConfig.LabelColorManageSheet
 import io.legado.app.ui.config.themeConfig.LabelColorManageSheet
 import io.legado.app.ui.config.themeConfig.TagColorPair
 import io.legado.app.ui.config.themeConfig.TagColorPair
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.dialog.ColorPickerSheet
 import io.legado.app.ui.widget.components.dialog.ColorPickerSheet
 import io.legado.app.ui.widget.components.divider.PillDivider
 import io.legado.app.ui.widget.components.divider.PillDivider
 import io.legado.app.ui.widget.components.divider.PillHeaderDivider
 import io.legado.app.ui.widget.components.divider.PillHeaderDivider
@@ -68,8 +69,8 @@ fun BookshelfConfigSheet(
         show = show,
         show = show,
         onDismissRequest = onDismissRequest
         onDismissRequest = onDismissRequest
     ) {
     ) {
-        Column(
-            modifier = Modifier
+        AppColumn(
+            Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
                 .verticalScroll(rememberScrollState())
                 .verticalScroll(rememberScrollState())
                 .animateContentSize(),
                 .animateContentSize(),
@@ -107,8 +108,6 @@ fun BookshelfConfigSheet(
                     onUpdate { it.copy(bookshelfSort = value.toInt()) }
                     onUpdate { it.copy(bookshelfSort = value.toInt()) }
                 }
                 }
             )
             )
-
-            // Sort Order
             CompactDropdownSettingItem(
             CompactDropdownSettingItem(
                 title = stringResource(R.string.sort_order),
                 title = stringResource(R.string.sort_order),
                 selectedValue = settings.bookshelfSortOrder.toString(),
                 selectedValue = settings.bookshelfSortOrder.toString(),
@@ -123,16 +122,12 @@ fun BookshelfConfigSheet(
             )
             )
 
 
             PillHeaderDivider(title = stringResource(R.string.bookshelf_section_layout))
             PillHeaderDivider(title = stringResource(R.string.bookshelf_section_layout))
-
-            // Layout Mode (non-folder)
             val layoutMode =
             val layoutMode =
                 if (isLandscape) settings.bookshelfLayoutModeLandscape
                 if (isLandscape) settings.bookshelfLayoutModeLandscape
                 else settings.bookshelfLayoutModePortrait
                 else settings.bookshelfLayoutModePortrait
             val folderLayoutMode =
             val folderLayoutMode =
                 if (isLandscape) settings.bookshelfFolderLayoutModeLandscape
                 if (isLandscape) settings.bookshelfFolderLayoutModeLandscape
                 else settings.bookshelfFolderLayoutModePortrait
                 else settings.bookshelfFolderLayoutModePortrait
-
-            // Folder Layout Mode
             AnimatedVisibility(visible = settings.bookGroupStyle == 2) {
             AnimatedVisibility(visible = settings.bookGroupStyle == 2) {
                 Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
                 Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
 
 
@@ -140,7 +135,10 @@ fun BookshelfConfigSheet(
                         title = stringResource(R.string.folder_layout_mode),
                         title = stringResource(R.string.folder_layout_mode),
                         description = stringResource(if (isLandscape) R.string.screen_landscape else R.string.screen_portrait),
                         description = stringResource(if (isLandscape) R.string.screen_landscape else R.string.screen_portrait),
                         selectedValue = folderLayoutMode.toString(),
                         selectedValue = folderLayoutMode.toString(),
-                        displayEntries = arrayOf(stringResource(R.string.layout_mode_list), stringResource(R.string.layout_mode_grid)),
+                        displayEntries = arrayOf(
+                            stringResource(R.string.layout_mode_list),
+                            stringResource(R.string.layout_mode_grid)
+                        ),
                         entryValues = arrayOf("0", "1"),
                         entryValues = arrayOf("0", "1"),
                         onValueChange = { value ->
                         onValueChange = { value ->
                             onUpdate {
                             onUpdate {
@@ -216,7 +214,11 @@ fun BookshelfConfigSheet(
                             CompactDropdownSettingItem(
                             CompactDropdownSettingItem(
                                 title = stringResource(R.string.folder_list_style),
                                 title = stringResource(R.string.folder_list_style),
                                 selectedValue = settings.bookshelfGroupListStyle.toString(),
                                 selectedValue = settings.bookshelfGroupListStyle.toString(),
-                                displayEntries = arrayOf(stringResource(R.string.group), stringResource(R.string.compact_list), stringResource(R.string.horizontal_cover_count)),
+                                displayEntries = arrayOf(
+                                    stringResource(R.string.group),
+                                    stringResource(R.string.compact_list),
+                                    stringResource(R.string.horizontal_cover_count)
+                                ),
                                 entryValues = arrayOf("0", "1", "2"),
                                 entryValues = arrayOf("0", "1", "2"),
                                 onValueChange = { value ->
                                 onValueChange = { value ->
                                     onUpdate { it.copy(bookshelfGroupListStyle = value.toInt()) }
                                     onUpdate { it.copy(bookshelfGroupListStyle = value.toInt()) }
@@ -453,7 +455,12 @@ fun BookshelfConfigSheet(
                             ) {
                             ) {
                                 CompactSliderSettingItem(
                                 CompactSliderSettingItem(
                                     title = stringResource(R.string.synopsis_lines),
                                     title = stringResource(R.string.synopsis_lines),
-                                    description = if (settings.bookshelfIntroMaxLines == 0) stringResource(R.string.show_all_synopsis) else stringResource(R.string.show_lines_synopsis, settings.bookshelfIntroMaxLines),
+                                    description = if (settings.bookshelfIntroMaxLines == 0) stringResource(
+                                        R.string.show_all_synopsis
+                                    ) else stringResource(
+                                        R.string.show_lines_synopsis,
+                                        settings.bookshelfIntroMaxLines
+                                    ),
                                     value = settings.bookshelfIntroMaxLines.toFloat(),
                                     value = settings.bookshelfIntroMaxLines.toFloat(),
                                     valueRange = 0f..10f,
                                     valueRange = 0f..10f,
                                     steps = 10,
                                     steps = 10,
@@ -604,7 +611,10 @@ fun BookshelfConfigSheet(
 
 
             CompactSliderSettingItem(
             CompactSliderSettingItem(
                 title = stringResource(R.string.bookshelf_update_limit),
                 title = stringResource(R.string.bookshelf_update_limit),
-                description = if (settings.bookshelfRefreshingLimit <= 0) stringResource(R.string.refresh_limit_unlimited) else stringResource(R.string.refresh_limit_books, settings.bookshelfRefreshingLimit),
+                description = if (settings.bookshelfRefreshingLimit <= 0) stringResource(R.string.refresh_limit_unlimited) else stringResource(
+                    R.string.refresh_limit_books,
+                    settings.bookshelfRefreshingLimit
+                ),
                 value = settings.bookshelfRefreshingLimit.toFloat(),
                 value = settings.bookshelfRefreshingLimit.toFloat(),
                 valueRange = 0f..100f,
                 valueRange = 0f..100f,
                 steps = 100,
                 steps = 100,
@@ -614,7 +624,6 @@ fun BookshelfConfigSheet(
             )
             )
 
 
             Spacer(modifier = Modifier.height(32.dp))
             Spacer(modifier = Modifier.height(32.dp))
-
         }
         }
 
 
         LabelColorManageSheet(
         LabelColorManageSheet(

+ 2 - 1
app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfScreen.kt

@@ -111,6 +111,7 @@ import io.legado.app.ui.theme.ThemeResolver
 import io.legado.app.ui.theme.adaptiveContentPaddingBookshelf
 import io.legado.app.ui.theme.adaptiveContentPaddingBookshelf
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
 import io.legado.app.ui.theme.adaptiveHorizontalPadding
 import io.legado.app.ui.theme.adaptiveHorizontalPaddingTab
 import io.legado.app.ui.theme.adaptiveHorizontalPaddingTab
+import io.legado.app.ui.widget.components.AppColumn
 import io.legado.app.ui.widget.components.AppPullToRefresh
 import io.legado.app.ui.widget.components.AppPullToRefresh
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.EmptyMessage
 import io.legado.app.ui.widget.components.EmptyMessage
@@ -1297,7 +1298,7 @@ private fun BookshelfOverlays(
                 cornerRadius = 12.dp,
                 cornerRadius = 12.dp,
                 containerColor = LegadoTheme.colorScheme.surfaceContainerHigh
                 containerColor = LegadoTheme.colorScheme.surfaceContainerHigh
             ) {
             ) {
-                Column(
+                AppColumn(
                     modifier = Modifier.padding(24.dp),
                     modifier = Modifier.padding(24.dp),
                     horizontalAlignment = Alignment.CenterHorizontally
                     horizontalAlignment = Alignment.CenterHorizontally
                 ) {
                 ) {

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików