mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Start moving some Compose components to presentation-core module
This commit is contained in:
		@@ -3,7 +3,7 @@ package eu.kanade.presentation.browse
 | 
			
		||||
import androidx.compose.material.icons.Icons
 | 
			
		||||
import androidx.compose.material.icons.outlined.CollectionsBookmark
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import eu.kanade.presentation.components.Badge
 | 
			
		||||
import tachiyomi.presentation.core.components.Badge
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun InLibraryBadge(enabled: Boolean) {
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,6 @@ import eu.kanade.presentation.components.AppBar
 | 
			
		||||
import eu.kanade.presentation.components.EmptyScreen
 | 
			
		||||
import eu.kanade.presentation.components.EmptyScreenAction
 | 
			
		||||
import eu.kanade.presentation.components.LoadingScreen
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.source.LocalSource
 | 
			
		||||
import eu.kanade.tachiyomi.source.Source
 | 
			
		||||
@@ -32,6 +31,7 @@ import eu.kanade.tachiyomi.source.SourceManager
 | 
			
		||||
import kotlinx.coroutines.flow.StateFlow
 | 
			
		||||
import tachiyomi.domain.library.model.LibraryDisplayMode
 | 
			
		||||
import tachiyomi.domain.manga.model.Manga
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun BrowseSourceContent(
 | 
			
		||||
 
 | 
			
		||||
@@ -47,10 +47,7 @@ import eu.kanade.domain.extension.interactor.ExtensionSourceItem
 | 
			
		||||
import eu.kanade.presentation.browse.components.ExtensionIcon
 | 
			
		||||
import eu.kanade.presentation.components.AppBar
 | 
			
		||||
import eu.kanade.presentation.components.AppBarActions
 | 
			
		||||
import eu.kanade.presentation.components.DIVIDER_ALPHA
 | 
			
		||||
import eu.kanade.presentation.components.Divider
 | 
			
		||||
import eu.kanade.presentation.components.EmptyScreen
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.components.ScrollbarLazyColumn
 | 
			
		||||
import eu.kanade.presentation.components.WarningBanner
 | 
			
		||||
import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget
 | 
			
		||||
@@ -61,6 +58,9 @@ import eu.kanade.tachiyomi.extension.model.Extension
 | 
			
		||||
import eu.kanade.tachiyomi.source.ConfigurableSource
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.extension.details.ExtensionDetailsState
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.LocaleHelper
 | 
			
		||||
import tachiyomi.presentation.core.components.material.DIVIDER_ALPHA
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Divider
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun ExtensionDetailsScreen(
 | 
			
		||||
 
 | 
			
		||||
@@ -10,11 +10,11 @@ import androidx.compose.ui.res.stringResource
 | 
			
		||||
import eu.kanade.presentation.components.AppBar
 | 
			
		||||
import eu.kanade.presentation.components.EmptyScreen
 | 
			
		||||
import eu.kanade.presentation.components.FastScrollLazyColumn
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.extension.ExtensionFilterState
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.LocaleHelper
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun ExtensionFilterScreen(
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,6 @@ import eu.kanade.presentation.browse.components.ExtensionIcon
 | 
			
		||||
import eu.kanade.presentation.components.EmptyScreen
 | 
			
		||||
import eu.kanade.presentation.components.FastScrollLazyColumn
 | 
			
		||||
import eu.kanade.presentation.components.LoadingScreen
 | 
			
		||||
import eu.kanade.presentation.components.PullRefresh
 | 
			
		||||
import eu.kanade.presentation.manga.components.DotSeparatorNoSpaceText
 | 
			
		||||
import eu.kanade.presentation.theme.header
 | 
			
		||||
import eu.kanade.presentation.util.padding
 | 
			
		||||
@@ -53,6 +52,7 @@ import eu.kanade.tachiyomi.extension.model.InstallStep
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.extension.ExtensionUiModel
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.extension.ExtensionsState
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.LocaleHelper
 | 
			
		||||
import tachiyomi.presentation.core.components.material.PullRefresh
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun ExtensionScreen(
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,6 @@ import eu.kanade.presentation.browse.components.GlobalSearchLoadingResultItem
 | 
			
		||||
import eu.kanade.presentation.browse.components.GlobalSearchResultItem
 | 
			
		||||
import eu.kanade.presentation.browse.components.GlobalSearchToolbar
 | 
			
		||||
import eu.kanade.presentation.components.LazyColumn
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.util.padding
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.source.CatalogueSource
 | 
			
		||||
@@ -22,6 +21,7 @@ import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchState
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.source.globalsearch.SearchItemResult
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.LocaleHelper
 | 
			
		||||
import tachiyomi.domain.manga.model.Manga
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun GlobalSearchScreen(
 | 
			
		||||
 
 | 
			
		||||
@@ -8,11 +8,11 @@ import androidx.compose.ui.Modifier
 | 
			
		||||
import eu.kanade.presentation.components.AppBar
 | 
			
		||||
import eu.kanade.presentation.components.EmptyScreen
 | 
			
		||||
import eu.kanade.presentation.components.FastScrollLazyColumn
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.manga.components.BaseMangaListItem
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.migration.manga.MigrateMangaState
 | 
			
		||||
import tachiyomi.domain.manga.model.Manga
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun MigrateMangaScreen(
 | 
			
		||||
 
 | 
			
		||||
@@ -10,12 +10,12 @@ import eu.kanade.presentation.browse.components.GlobalSearchLoadingResultItem
 | 
			
		||||
import eu.kanade.presentation.browse.components.GlobalSearchResultItem
 | 
			
		||||
import eu.kanade.presentation.browse.components.GlobalSearchToolbar
 | 
			
		||||
import eu.kanade.presentation.components.LazyColumn
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.tachiyomi.source.CatalogueSource
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.migration.search.MigrateSearchState
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.source.globalsearch.SearchItemResult
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.LocaleHelper
 | 
			
		||||
import tachiyomi.domain.manga.model.Manga
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun MigrateSearchScreen(
 | 
			
		||||
 
 | 
			
		||||
@@ -25,8 +25,6 @@ import androidx.compose.ui.text.style.TextOverflow
 | 
			
		||||
import eu.kanade.domain.source.interactor.SetMigrateSorting
 | 
			
		||||
import eu.kanade.presentation.browse.components.BaseSourceItem
 | 
			
		||||
import eu.kanade.presentation.browse.components.SourceIcon
 | 
			
		||||
import eu.kanade.presentation.components.Badge
 | 
			
		||||
import eu.kanade.presentation.components.BadgeGroup
 | 
			
		||||
import eu.kanade.presentation.components.EmptyScreen
 | 
			
		||||
import eu.kanade.presentation.components.LoadingScreen
 | 
			
		||||
import eu.kanade.presentation.components.ScrollbarLazyColumn
 | 
			
		||||
@@ -40,6 +38,8 @@ import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.migration.sources.MigrateSourceState
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.copyToClipboard
 | 
			
		||||
import tachiyomi.domain.source.model.Source
 | 
			
		||||
import tachiyomi.presentation.core.components.Badge
 | 
			
		||||
import tachiyomi.presentation.core.components.BadgeGroup
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun MigrateSourceScreen(
 | 
			
		||||
 
 | 
			
		||||
@@ -12,12 +12,12 @@ import eu.kanade.presentation.browse.components.BaseSourceItem
 | 
			
		||||
import eu.kanade.presentation.components.AppBar
 | 
			
		||||
import eu.kanade.presentation.components.EmptyScreen
 | 
			
		||||
import eu.kanade.presentation.components.FastScrollLazyColumn
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.source.SourcesFilterState
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.LocaleHelper
 | 
			
		||||
import tachiyomi.domain.source.model.Source
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun SourcesFilterScreen(
 | 
			
		||||
 
 | 
			
		||||
@@ -11,13 +11,13 @@ import eu.kanade.presentation.category.components.CategoryContent
 | 
			
		||||
import eu.kanade.presentation.category.components.CategoryFloatingActionButton
 | 
			
		||||
import eu.kanade.presentation.components.AppBar
 | 
			
		||||
import eu.kanade.presentation.components.EmptyScreen
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.util.padding
 | 
			
		||||
import eu.kanade.presentation.util.plus
 | 
			
		||||
import eu.kanade.presentation.util.topSmallPaddingValues
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.ui.category.CategoryScreenState
 | 
			
		||||
import tachiyomi.domain.category.model.Category
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun CategoryScreen(
 | 
			
		||||
 
 | 
			
		||||
@@ -7,10 +7,10 @@ import androidx.compose.material3.Icon
 | 
			
		||||
import androidx.compose.material3.Text
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.ui.res.stringResource
 | 
			
		||||
import eu.kanade.presentation.components.ExtendedFloatingActionButton
 | 
			
		||||
import eu.kanade.presentation.util.isScrolledToEnd
 | 
			
		||||
import eu.kanade.presentation.util.isScrollingUp
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun CategoryFloatingActionButton(
 | 
			
		||||
 
 | 
			
		||||
@@ -1,93 +0,0 @@
 | 
			
		||||
package eu.kanade.presentation.components
 | 
			
		||||
 | 
			
		||||
import androidx.compose.foundation.layout.Box
 | 
			
		||||
import androidx.compose.foundation.layout.Column
 | 
			
		||||
import androidx.compose.foundation.layout.PaddingValues
 | 
			
		||||
import androidx.compose.foundation.layout.padding
 | 
			
		||||
import androidx.compose.foundation.layout.sizeIn
 | 
			
		||||
import androidx.compose.material3.LocalContentColor
 | 
			
		||||
import androidx.compose.material3.MaterialTheme
 | 
			
		||||
import androidx.compose.material3.ProvideTextStyle
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.runtime.CompositionLocalProvider
 | 
			
		||||
import androidx.compose.ui.Alignment
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun AlertDialogContent(
 | 
			
		||||
    buttons: @Composable () -> Unit,
 | 
			
		||||
    modifier: Modifier = Modifier,
 | 
			
		||||
    icon: (@Composable () -> Unit)? = null,
 | 
			
		||||
    title: (@Composable () -> Unit)? = null,
 | 
			
		||||
    text: @Composable (() -> Unit)? = null,
 | 
			
		||||
) {
 | 
			
		||||
    Column(
 | 
			
		||||
        modifier = modifier
 | 
			
		||||
            .sizeIn(minWidth = MinWidth, maxWidth = MaxWidth)
 | 
			
		||||
            .padding(DialogPadding),
 | 
			
		||||
    ) {
 | 
			
		||||
        icon?.let {
 | 
			
		||||
            CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.secondary) {
 | 
			
		||||
                Box(
 | 
			
		||||
                    Modifier
 | 
			
		||||
                        .padding(IconPadding)
 | 
			
		||||
                        .align(Alignment.CenterHorizontally),
 | 
			
		||||
                ) {
 | 
			
		||||
                    icon()
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        title?.let {
 | 
			
		||||
            CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onSurface) {
 | 
			
		||||
                val textStyle = MaterialTheme.typography.headlineSmall
 | 
			
		||||
                ProvideTextStyle(textStyle) {
 | 
			
		||||
                    Box(
 | 
			
		||||
                        // Align the title to the center when an icon is present.
 | 
			
		||||
                        Modifier
 | 
			
		||||
                            .padding(TitlePadding)
 | 
			
		||||
                            .align(
 | 
			
		||||
                                if (icon == null) {
 | 
			
		||||
                                    Alignment.Start
 | 
			
		||||
                                } else {
 | 
			
		||||
                                    Alignment.CenterHorizontally
 | 
			
		||||
                                },
 | 
			
		||||
                            ),
 | 
			
		||||
                    ) {
 | 
			
		||||
                        title()
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        text?.let {
 | 
			
		||||
            CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onSurfaceVariant) {
 | 
			
		||||
                val textStyle = MaterialTheme.typography.bodyMedium
 | 
			
		||||
                ProvideTextStyle(textStyle) {
 | 
			
		||||
                    Box(
 | 
			
		||||
                        Modifier
 | 
			
		||||
                            .weight(weight = 1f, fill = false)
 | 
			
		||||
                            .padding(TextPadding)
 | 
			
		||||
                            .align(Alignment.Start),
 | 
			
		||||
                    ) {
 | 
			
		||||
                        text()
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        Box(modifier = Modifier.align(Alignment.End)) {
 | 
			
		||||
            CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.primary) {
 | 
			
		||||
                val textStyle = MaterialTheme.typography.labelLarge
 | 
			
		||||
                ProvideTextStyle(value = textStyle, content = buttons)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Paddings for each of the dialog's parts.
 | 
			
		||||
private val DialogPadding = PaddingValues(all = 24.dp)
 | 
			
		||||
private val IconPadding = PaddingValues(bottom = 16.dp)
 | 
			
		||||
private val TitlePadding = PaddingValues(bottom = 16.dp)
 | 
			
		||||
private val TextPadding = PaddingValues(bottom = 24.dp)
 | 
			
		||||
 | 
			
		||||
private val MinWidth = 280.dp
 | 
			
		||||
private val MaxWidth = 560.dp
 | 
			
		||||
@@ -1,98 +0,0 @@
 | 
			
		||||
package eu.kanade.presentation.components
 | 
			
		||||
 | 
			
		||||
import androidx.compose.foundation.background
 | 
			
		||||
import androidx.compose.foundation.layout.Row
 | 
			
		||||
import androidx.compose.foundation.layout.RowScope
 | 
			
		||||
import androidx.compose.foundation.layout.padding
 | 
			
		||||
import androidx.compose.foundation.text.InlineTextContent
 | 
			
		||||
import androidx.compose.foundation.text.appendInlineContent
 | 
			
		||||
import androidx.compose.material3.Icon
 | 
			
		||||
import androidx.compose.material3.MaterialTheme
 | 
			
		||||
import androidx.compose.material3.Text
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.draw.clip
 | 
			
		||||
import androidx.compose.ui.graphics.Color
 | 
			
		||||
import androidx.compose.ui.graphics.RectangleShape
 | 
			
		||||
import androidx.compose.ui.graphics.Shape
 | 
			
		||||
import androidx.compose.ui.graphics.vector.ImageVector
 | 
			
		||||
import androidx.compose.ui.text.Placeholder
 | 
			
		||||
import androidx.compose.ui.text.PlaceholderVerticalAlign
 | 
			
		||||
import androidx.compose.ui.text.buildAnnotatedString
 | 
			
		||||
import androidx.compose.ui.text.font.FontWeight
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun BadgeGroup(
 | 
			
		||||
    modifier: Modifier = Modifier,
 | 
			
		||||
    shape: Shape = MaterialTheme.shapes.extraSmall,
 | 
			
		||||
    content: @Composable RowScope.() -> Unit,
 | 
			
		||||
) {
 | 
			
		||||
    Row(modifier = modifier.clip(shape)) {
 | 
			
		||||
        content()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun Badge(
 | 
			
		||||
    text: String,
 | 
			
		||||
    color: Color = MaterialTheme.colorScheme.secondary,
 | 
			
		||||
    textColor: Color = MaterialTheme.colorScheme.onSecondary,
 | 
			
		||||
    shape: Shape = RectangleShape,
 | 
			
		||||
) {
 | 
			
		||||
    Text(
 | 
			
		||||
        text = text,
 | 
			
		||||
        modifier = Modifier
 | 
			
		||||
            .clip(shape)
 | 
			
		||||
            .background(color)
 | 
			
		||||
            .padding(horizontal = 3.dp, vertical = 1.dp),
 | 
			
		||||
        color = textColor,
 | 
			
		||||
        fontWeight = FontWeight.Medium,
 | 
			
		||||
        maxLines = 1,
 | 
			
		||||
        style = MaterialTheme.typography.bodySmall,
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun Badge(
 | 
			
		||||
    imageVector: ImageVector,
 | 
			
		||||
    color: Color = MaterialTheme.colorScheme.secondary,
 | 
			
		||||
    iconColor: Color = MaterialTheme.colorScheme.onSecondary,
 | 
			
		||||
    shape: Shape = RectangleShape,
 | 
			
		||||
) {
 | 
			
		||||
    val iconContentPlaceholder = "[icon]"
 | 
			
		||||
    val text = buildAnnotatedString {
 | 
			
		||||
        appendInlineContent(iconContentPlaceholder)
 | 
			
		||||
    }
 | 
			
		||||
    val inlineContent = mapOf(
 | 
			
		||||
        Pair(
 | 
			
		||||
            iconContentPlaceholder,
 | 
			
		||||
            InlineTextContent(
 | 
			
		||||
                Placeholder(
 | 
			
		||||
                    width = MaterialTheme.typography.bodySmall.fontSize,
 | 
			
		||||
                    height = MaterialTheme.typography.bodySmall.fontSize,
 | 
			
		||||
                    placeholderVerticalAlign = PlaceholderVerticalAlign.Center,
 | 
			
		||||
                ),
 | 
			
		||||
            ) {
 | 
			
		||||
                Icon(
 | 
			
		||||
                    imageVector = imageVector,
 | 
			
		||||
                    tint = iconColor,
 | 
			
		||||
                    contentDescription = null,
 | 
			
		||||
                )
 | 
			
		||||
            },
 | 
			
		||||
        ),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    Text(
 | 
			
		||||
        text = text,
 | 
			
		||||
        inlineContent = inlineContent,
 | 
			
		||||
        modifier = Modifier
 | 
			
		||||
            .clip(shape)
 | 
			
		||||
            .background(color)
 | 
			
		||||
            .padding(horizontal = 3.dp, vertical = 1.dp),
 | 
			
		||||
        color = iconColor,
 | 
			
		||||
        fontWeight = FontWeight.Medium,
 | 
			
		||||
        maxLines = 1,
 | 
			
		||||
        style = MaterialTheme.typography.bodySmall,
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
@@ -40,6 +40,7 @@ import androidx.compose.ui.text.style.TextOverflow
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
import androidx.compose.ui.unit.sp
 | 
			
		||||
import eu.kanade.presentation.util.selectedBackground
 | 
			
		||||
import tachiyomi.presentation.core.components.BadgeGroup
 | 
			
		||||
 | 
			
		||||
object CommonMangaItemDefaults {
 | 
			
		||||
    val GridHorizontalSpacer = 4.dp
 | 
			
		||||
 
 | 
			
		||||
@@ -1,44 +0,0 @@
 | 
			
		||||
package eu.kanade.presentation.components
 | 
			
		||||
 | 
			
		||||
import androidx.compose.foundation.background
 | 
			
		||||
import androidx.compose.foundation.layout.Box
 | 
			
		||||
import androidx.compose.foundation.layout.fillMaxHeight
 | 
			
		||||
import androidx.compose.foundation.layout.fillMaxWidth
 | 
			
		||||
import androidx.compose.foundation.layout.height
 | 
			
		||||
import androidx.compose.foundation.layout.width
 | 
			
		||||
import androidx.compose.material3.DividerDefaults
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.draw.alpha
 | 
			
		||||
import androidx.compose.ui.graphics.Color
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
 | 
			
		||||
const val DIVIDER_ALPHA = 0.2f
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun Divider(
 | 
			
		||||
    modifier: Modifier = Modifier,
 | 
			
		||||
    color: Color = DividerDefaults.color,
 | 
			
		||||
) {
 | 
			
		||||
    Box(
 | 
			
		||||
        modifier
 | 
			
		||||
            .fillMaxWidth()
 | 
			
		||||
            .height(1.dp)
 | 
			
		||||
            .background(color = color)
 | 
			
		||||
            .alpha(DIVIDER_ALPHA),
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun VerticalDivider(
 | 
			
		||||
    modifier: Modifier = Modifier,
 | 
			
		||||
    color: Color = DividerDefaults.color,
 | 
			
		||||
) {
 | 
			
		||||
    Box(
 | 
			
		||||
        modifier
 | 
			
		||||
            .fillMaxHeight()
 | 
			
		||||
            .width(1.dp)
 | 
			
		||||
            .background(color = color)
 | 
			
		||||
            .alpha(DIVIDER_ALPHA),
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
@@ -1,116 +0,0 @@
 | 
			
		||||
package eu.kanade.presentation.components
 | 
			
		||||
 | 
			
		||||
import androidx.compose.animation.AnimatedVisibility
 | 
			
		||||
import androidx.compose.animation.core.CubicBezierEasing
 | 
			
		||||
import androidx.compose.animation.core.animateDpAsState
 | 
			
		||||
import androidx.compose.animation.core.tween
 | 
			
		||||
import androidx.compose.animation.expandHorizontally
 | 
			
		||||
import androidx.compose.animation.fadeIn
 | 
			
		||||
import androidx.compose.animation.fadeOut
 | 
			
		||||
import androidx.compose.animation.shrinkHorizontally
 | 
			
		||||
import androidx.compose.foundation.interaction.MutableInteractionSource
 | 
			
		||||
import androidx.compose.foundation.layout.Row
 | 
			
		||||
import androidx.compose.foundation.layout.Spacer
 | 
			
		||||
import androidx.compose.foundation.layout.padding
 | 
			
		||||
import androidx.compose.foundation.layout.sizeIn
 | 
			
		||||
import androidx.compose.foundation.layout.width
 | 
			
		||||
import androidx.compose.material3.FloatingActionButton
 | 
			
		||||
import androidx.compose.material3.FloatingActionButtonDefaults
 | 
			
		||||
import androidx.compose.material3.FloatingActionButtonElevation
 | 
			
		||||
import androidx.compose.material3.MaterialTheme
 | 
			
		||||
import androidx.compose.material3.contentColorFor
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.runtime.getValue
 | 
			
		||||
import androidx.compose.runtime.remember
 | 
			
		||||
import androidx.compose.ui.Alignment
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.graphics.Color
 | 
			
		||||
import androidx.compose.ui.graphics.Shape
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ExtendedFloatingActionButton with custom transition between collapsed/expanded state.
 | 
			
		||||
 *
 | 
			
		||||
 * @see androidx.compose.material3.ExtendedFloatingActionButton
 | 
			
		||||
 */
 | 
			
		||||
@Composable
 | 
			
		||||
fun ExtendedFloatingActionButton(
 | 
			
		||||
    text: @Composable () -> Unit,
 | 
			
		||||
    icon: @Composable () -> Unit,
 | 
			
		||||
    onClick: () -> Unit,
 | 
			
		||||
    modifier: Modifier = Modifier,
 | 
			
		||||
    expanded: Boolean = true,
 | 
			
		||||
    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
 | 
			
		||||
    shape: Shape = MaterialTheme.shapes.large,
 | 
			
		||||
    containerColor: Color = MaterialTheme.colorScheme.primaryContainer,
 | 
			
		||||
    contentColor: Color = contentColorFor(containerColor),
 | 
			
		||||
    elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
 | 
			
		||||
) {
 | 
			
		||||
    val minWidth by animateDpAsState(if (expanded) ExtendedFabMinimumWidth else FabContainerWidth)
 | 
			
		||||
    FloatingActionButton(
 | 
			
		||||
        modifier = modifier.sizeIn(minWidth = minWidth),
 | 
			
		||||
        onClick = onClick,
 | 
			
		||||
        interactionSource = interactionSource,
 | 
			
		||||
        shape = shape,
 | 
			
		||||
        containerColor = containerColor,
 | 
			
		||||
        contentColor = contentColor,
 | 
			
		||||
        elevation = elevation,
 | 
			
		||||
    ) {
 | 
			
		||||
        val startPadding by animateDpAsState(if (expanded) ExtendedFabIconSize / 2 else 0.dp)
 | 
			
		||||
        val endPadding by animateDpAsState(if (expanded) ExtendedFabTextPadding else 0.dp)
 | 
			
		||||
 | 
			
		||||
        Row(
 | 
			
		||||
            modifier = Modifier.padding(start = startPadding, end = endPadding),
 | 
			
		||||
            verticalAlignment = Alignment.CenterVertically,
 | 
			
		||||
        ) {
 | 
			
		||||
            icon()
 | 
			
		||||
            AnimatedVisibility(
 | 
			
		||||
                visible = expanded,
 | 
			
		||||
                enter = ExtendedFabExpandAnimation,
 | 
			
		||||
                exit = ExtendedFabCollapseAnimation,
 | 
			
		||||
            ) {
 | 
			
		||||
                Row {
 | 
			
		||||
                    Spacer(Modifier.width(ExtendedFabIconPadding))
 | 
			
		||||
                    text()
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
private val EasingLinearCubicBezier = CubicBezierEasing(0.0f, 0.0f, 1.0f, 1.0f)
 | 
			
		||||
private val EasingEmphasizedCubicBezier = CubicBezierEasing(0.2f, 0.0f, 0.0f, 1.0f)
 | 
			
		||||
 | 
			
		||||
private val ExtendedFabMinimumWidth = 80.dp
 | 
			
		||||
private val ExtendedFabIconSize = 24.0.dp
 | 
			
		||||
private val ExtendedFabIconPadding = 12.dp
 | 
			
		||||
private val ExtendedFabTextPadding = 20.dp
 | 
			
		||||
 | 
			
		||||
private val ExtendedFabCollapseAnimation = fadeOut(
 | 
			
		||||
    animationSpec = tween(
 | 
			
		||||
        durationMillis = 100,
 | 
			
		||||
        easing = EasingLinearCubicBezier,
 | 
			
		||||
    ),
 | 
			
		||||
) + shrinkHorizontally(
 | 
			
		||||
    animationSpec = tween(
 | 
			
		||||
        durationMillis = 500,
 | 
			
		||||
        easing = EasingEmphasizedCubicBezier,
 | 
			
		||||
    ),
 | 
			
		||||
    shrinkTowards = Alignment.Start,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
private val ExtendedFabExpandAnimation = fadeIn(
 | 
			
		||||
    animationSpec = tween(
 | 
			
		||||
        durationMillis = 200,
 | 
			
		||||
        delayMillis = 100,
 | 
			
		||||
        easing = EasingLinearCubicBezier,
 | 
			
		||||
    ),
 | 
			
		||||
) + expandHorizontally(
 | 
			
		||||
    animationSpec = tween(
 | 
			
		||||
        durationMillis = 500,
 | 
			
		||||
        easing = EasingEmphasizedCubicBezier,
 | 
			
		||||
    ),
 | 
			
		||||
    expandFrom = Alignment.Start,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
private val FabContainerWidth = 56.0.dp
 | 
			
		||||
@@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
 | 
			
		||||
import androidx.compose.foundation.layout.height
 | 
			
		||||
import androidx.compose.foundation.layout.padding
 | 
			
		||||
import androidx.compose.foundation.layout.size
 | 
			
		||||
import androidx.compose.foundation.layout.width
 | 
			
		||||
import androidx.compose.foundation.layout.windowInsetsPadding
 | 
			
		||||
import androidx.compose.foundation.rememberScrollState
 | 
			
		||||
import androidx.compose.foundation.verticalScroll
 | 
			
		||||
@@ -31,6 +30,7 @@ import eu.kanade.presentation.theme.TachiyomiTheme
 | 
			
		||||
import eu.kanade.presentation.util.ThemePreviews
 | 
			
		||||
import eu.kanade.presentation.util.padding
 | 
			
		||||
import eu.kanade.presentation.util.secondaryItemAlpha
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun InfoScaffold(
 | 
			
		||||
 
 | 
			
		||||
@@ -1,41 +0,0 @@
 | 
			
		||||
package eu.kanade.presentation.components
 | 
			
		||||
 | 
			
		||||
import androidx.compose.foundation.layout.padding
 | 
			
		||||
import androidx.compose.material3.Icon
 | 
			
		||||
import androidx.compose.material3.IconButton
 | 
			
		||||
import androidx.compose.material3.MaterialTheme
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.graphics.painter.Painter
 | 
			
		||||
import androidx.compose.ui.platform.LocalUriHandler
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun LinkIcon(
 | 
			
		||||
    modifier: Modifier = Modifier,
 | 
			
		||||
    label: String,
 | 
			
		||||
    painter: Painter,
 | 
			
		||||
    url: String,
 | 
			
		||||
) {
 | 
			
		||||
    val uriHandler = LocalUriHandler.current
 | 
			
		||||
    LinkIcon(modifier, label, painter) { uriHandler.openUri(url) }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun LinkIcon(
 | 
			
		||||
    modifier: Modifier = Modifier,
 | 
			
		||||
    label: String,
 | 
			
		||||
    painter: Painter,
 | 
			
		||||
    onClick: () -> Unit,
 | 
			
		||||
) {
 | 
			
		||||
    IconButton(
 | 
			
		||||
        modifier = modifier.padding(4.dp),
 | 
			
		||||
        onClick = onClick,
 | 
			
		||||
    ) {
 | 
			
		||||
        Icon(
 | 
			
		||||
            painter = painter,
 | 
			
		||||
            tint = MaterialTheme.colorScheme.primary,
 | 
			
		||||
            contentDescription = label,
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,48 +0,0 @@
 | 
			
		||||
package eu.kanade.presentation.components
 | 
			
		||||
 | 
			
		||||
import androidx.compose.foundation.layout.Box
 | 
			
		||||
import androidx.compose.foundation.layout.IntrinsicSize
 | 
			
		||||
import androidx.compose.foundation.layout.padding
 | 
			
		||||
import androidx.compose.foundation.layout.requiredWidth
 | 
			
		||||
import androidx.compose.material3.LocalTextStyle
 | 
			
		||||
import androidx.compose.material3.MaterialTheme
 | 
			
		||||
import androidx.compose.material3.Text
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.ui.Alignment
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.graphics.Color
 | 
			
		||||
import androidx.compose.ui.unit.Dp
 | 
			
		||||
import androidx.compose.ui.unit.TextUnit
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun Pill(
 | 
			
		||||
    text: String,
 | 
			
		||||
    modifier: Modifier = Modifier,
 | 
			
		||||
    color: Color = MaterialTheme.colorScheme.background,
 | 
			
		||||
    contentColor: Color = MaterialTheme.colorScheme.onBackground,
 | 
			
		||||
    elevation: Dp = 1.dp,
 | 
			
		||||
    fontSize: TextUnit = LocalTextStyle.current.fontSize,
 | 
			
		||||
) {
 | 
			
		||||
    androidx.compose.material3.Surface(
 | 
			
		||||
        modifier = modifier
 | 
			
		||||
            .padding(start = 4.dp),
 | 
			
		||||
        shape = MaterialTheme.shapes.extraLarge,
 | 
			
		||||
        color = color,
 | 
			
		||||
        contentColor = contentColor,
 | 
			
		||||
        tonalElevation = elevation,
 | 
			
		||||
    ) {
 | 
			
		||||
        Box(
 | 
			
		||||
            modifier = Modifier
 | 
			
		||||
                .requiredWidth(IntrinsicSize.Max)
 | 
			
		||||
                .padding(6.dp, 1.dp),
 | 
			
		||||
            contentAlignment = Alignment.Center,
 | 
			
		||||
        ) {
 | 
			
		||||
            Text(
 | 
			
		||||
                text = text,
 | 
			
		||||
                fontSize = fontSize,
 | 
			
		||||
                maxLines = 1,
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,56 +0,0 @@
 | 
			
		||||
package eu.kanade.presentation.components
 | 
			
		||||
 | 
			
		||||
import androidx.compose.foundation.layout.Box
 | 
			
		||||
import androidx.compose.foundation.layout.PaddingValues
 | 
			
		||||
import androidx.compose.foundation.layout.padding
 | 
			
		||||
import androidx.compose.material.pullrefresh.PullRefreshIndicator
 | 
			
		||||
import androidx.compose.material.pullrefresh.pullRefresh
 | 
			
		||||
import androidx.compose.material.pullrefresh.rememberPullRefreshState
 | 
			
		||||
import androidx.compose.material3.MaterialTheme
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.ui.Alignment
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.draw.clipToBounds
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param refreshing Whether the layout is currently refreshing
 | 
			
		||||
 * @param onRefresh Lambda which is invoked when a swipe to refresh gesture is completed.
 | 
			
		||||
 * @param enabled Whether the the layout should react to swipe gestures or not.
 | 
			
		||||
 * @param indicatorPadding Content padding for the indicator, to inset the indicator in if required.
 | 
			
		||||
 * @param content The content containing a vertically scrollable composable.
 | 
			
		||||
 *
 | 
			
		||||
 * Code reference: [Accompanist SwipeRefresh](https://github.com/google/accompanist/blob/677bc4ca0ee74677a8ba73793d04d85fe4ab55fb/swiperefresh/src/main/java/com/google/accompanist/swiperefresh/SwipeRefresh.kt#L265-L283)
 | 
			
		||||
 */
 | 
			
		||||
@Composable
 | 
			
		||||
fun PullRefresh(
 | 
			
		||||
    refreshing: Boolean,
 | 
			
		||||
    onRefresh: () -> Unit,
 | 
			
		||||
    enabled: Boolean,
 | 
			
		||||
    indicatorPadding: PaddingValues = PaddingValues(0.dp),
 | 
			
		||||
    content: @Composable () -> Unit,
 | 
			
		||||
) {
 | 
			
		||||
    val state = rememberPullRefreshState(
 | 
			
		||||
        refreshing = refreshing,
 | 
			
		||||
        onRefresh = onRefresh,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    Box(Modifier.pullRefresh(state, enabled)) {
 | 
			
		||||
        content()
 | 
			
		||||
 | 
			
		||||
        Box(
 | 
			
		||||
            Modifier
 | 
			
		||||
                .padding(indicatorPadding)
 | 
			
		||||
                .matchParentSize()
 | 
			
		||||
                .clipToBounds(),
 | 
			
		||||
        ) {
 | 
			
		||||
            PullRefreshIndicator(
 | 
			
		||||
                refreshing = refreshing,
 | 
			
		||||
                state = state,
 | 
			
		||||
                modifier = Modifier.align(Alignment.TopCenter),
 | 
			
		||||
                backgroundColor = MaterialTheme.colorScheme.primary,
 | 
			
		||||
                contentColor = MaterialTheme.colorScheme.onPrimary,
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,360 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright 2021 The Android Open Source Project
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *      http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package eu.kanade.presentation.components
 | 
			
		||||
 | 
			
		||||
import androidx.compose.foundation.layout.MutableWindowInsets
 | 
			
		||||
import androidx.compose.foundation.layout.PaddingValues
 | 
			
		||||
import androidx.compose.foundation.layout.WindowInsets
 | 
			
		||||
import androidx.compose.foundation.layout.asPaddingValues
 | 
			
		||||
import androidx.compose.foundation.layout.calculateEndPadding
 | 
			
		||||
import androidx.compose.foundation.layout.calculateStartPadding
 | 
			
		||||
import androidx.compose.foundation.layout.exclude
 | 
			
		||||
import androidx.compose.foundation.layout.onConsumedWindowInsetsChanged
 | 
			
		||||
import androidx.compose.material3.ExperimentalMaterial3Api
 | 
			
		||||
import androidx.compose.material3.MaterialTheme
 | 
			
		||||
import androidx.compose.material3.ScaffoldDefaults
 | 
			
		||||
import androidx.compose.material3.TopAppBarDefaults
 | 
			
		||||
import androidx.compose.material3.TopAppBarScrollBehavior
 | 
			
		||||
import androidx.compose.material3.contentColorFor
 | 
			
		||||
import androidx.compose.material3.rememberTopAppBarState
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.runtime.CompositionLocalProvider
 | 
			
		||||
import androidx.compose.runtime.Immutable
 | 
			
		||||
import androidx.compose.runtime.remember
 | 
			
		||||
import androidx.compose.runtime.staticCompositionLocalOf
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.graphics.Color
 | 
			
		||||
import androidx.compose.ui.input.nestedscroll.nestedScroll
 | 
			
		||||
import androidx.compose.ui.layout.SubcomposeLayout
 | 
			
		||||
import androidx.compose.ui.unit.Constraints
 | 
			
		||||
import androidx.compose.ui.unit.LayoutDirection
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
import androidx.compose.ui.unit.max
 | 
			
		||||
import androidx.compose.ui.util.fastForEach
 | 
			
		||||
import androidx.compose.ui.util.fastMap
 | 
			
		||||
import androidx.compose.ui.util.fastMaxBy
 | 
			
		||||
import kotlin.math.max
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <a href="https://material.io/design/layout/understanding-layout.html" class="external" target="_blank">Material Design layout</a>.
 | 
			
		||||
 *
 | 
			
		||||
 * Scaffold implements the basic material design visual layout structure.
 | 
			
		||||
 *
 | 
			
		||||
 * This component provides API to put together several material components to construct your
 | 
			
		||||
 * screen, by ensuring proper layout strategy for them and collecting necessary data so these
 | 
			
		||||
 * components will work together correctly.
 | 
			
		||||
 *
 | 
			
		||||
 * Simple example of a Scaffold with [SmallTopAppBar], [FloatingActionButton]:
 | 
			
		||||
 *
 | 
			
		||||
 * @sample androidx.compose.material3.samples.SimpleScaffoldWithTopBar
 | 
			
		||||
 *
 | 
			
		||||
 * To show a [Snackbar], use [SnackbarHostState.showSnackbar].
 | 
			
		||||
 *
 | 
			
		||||
 * @sample androidx.compose.material3.samples.ScaffoldWithSimpleSnackbar
 | 
			
		||||
 *
 | 
			
		||||
 * Tachiyomi changes:
 | 
			
		||||
 * * Pass scroll behavior to top bar by default
 | 
			
		||||
 * * Remove height constraint for expanded app bar
 | 
			
		||||
 * * Also take account of fab height when providing inner padding
 | 
			
		||||
 * * Fixes for fab and snackbar horizontal placements when [contentWindowInsets] is used
 | 
			
		||||
 * * Handle consumed window insets
 | 
			
		||||
 * * Add startBar slot for Navigation Rail
 | 
			
		||||
 *
 | 
			
		||||
 * @param modifier the [Modifier] to be applied to this scaffold
 | 
			
		||||
 * @param topBar top app bar of the screen, typically a [SmallTopAppBar]
 | 
			
		||||
 * @param startBar side bar on the start of the screen, typically a [NavigationRail]
 | 
			
		||||
 * @param bottomBar bottom bar of the screen, typically a [NavigationBar]
 | 
			
		||||
 * @param snackbarHost component to host [Snackbar]s that are pushed to be shown via
 | 
			
		||||
 * [SnackbarHostState.showSnackbar], typically a [SnackbarHost]
 | 
			
		||||
 * @param floatingActionButton Main action button of the screen, typically a [FloatingActionButton]
 | 
			
		||||
 * @param floatingActionButtonPosition position of the FAB on the screen. See [FabPosition].
 | 
			
		||||
 * @param containerColor the color used for the background of this scaffold. Use [Color.Transparent]
 | 
			
		||||
 * to have no color.
 | 
			
		||||
 * @param contentColor the preferred color for content inside this scaffold. Defaults to either the
 | 
			
		||||
 * matching content color for [containerColor], or to the current [LocalContentColor] if
 | 
			
		||||
 * [containerColor] is not a color from the theme.
 | 
			
		||||
 * @param contentWindowInsets window insets to be passed to content slot via PaddingValues params.
 | 
			
		||||
 * Scaffold will take the insets into account from the top/bottom only if the topBar/ bottomBar
 | 
			
		||||
 * are not present, as the scaffold expect topBar/bottomBar to handle insets instead
 | 
			
		||||
 * @param content content of the screen. The lambda receives a [PaddingValues] that should be
 | 
			
		||||
 * applied to the content root via [Modifier.padding] and [Modifier.consumeWindowInsets] to
 | 
			
		||||
 * properly offset top and bottom bars. If using [Modifier.verticalScroll], apply this modifier to
 | 
			
		||||
 * the child of the scroll, and not on the scroll itself.
 | 
			
		||||
 */
 | 
			
		||||
@ExperimentalMaterial3Api
 | 
			
		||||
@Composable
 | 
			
		||||
fun Scaffold(
 | 
			
		||||
    modifier: Modifier = Modifier,
 | 
			
		||||
    topBarScrollBehavior: TopAppBarScrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()),
 | 
			
		||||
    topBar: @Composable (TopAppBarScrollBehavior) -> Unit = {},
 | 
			
		||||
    bottomBar: @Composable () -> Unit = {},
 | 
			
		||||
    startBar: @Composable () -> Unit = {},
 | 
			
		||||
    snackbarHost: @Composable () -> Unit = {},
 | 
			
		||||
    floatingActionButton: @Composable () -> Unit = {},
 | 
			
		||||
    floatingActionButtonPosition: FabPosition = FabPosition.End,
 | 
			
		||||
    containerColor: Color = MaterialTheme.colorScheme.background,
 | 
			
		||||
    contentColor: Color = contentColorFor(containerColor),
 | 
			
		||||
    contentWindowInsets: WindowInsets = ScaffoldDefaults.contentWindowInsets,
 | 
			
		||||
    content: @Composable (PaddingValues) -> Unit,
 | 
			
		||||
) {
 | 
			
		||||
    // Tachiyomi: Handle consumed window insets
 | 
			
		||||
    val remainingWindowInsets = remember { MutableWindowInsets() }
 | 
			
		||||
    androidx.compose.material3.Surface(
 | 
			
		||||
        modifier = Modifier
 | 
			
		||||
            .nestedScroll(topBarScrollBehavior.nestedScrollConnection)
 | 
			
		||||
            .onConsumedWindowInsetsChanged { remainingWindowInsets.insets = contentWindowInsets.exclude(it) }
 | 
			
		||||
            .then(modifier),
 | 
			
		||||
        color = containerColor,
 | 
			
		||||
        contentColor = contentColor,
 | 
			
		||||
    ) {
 | 
			
		||||
        ScaffoldLayout(
 | 
			
		||||
            fabPosition = floatingActionButtonPosition,
 | 
			
		||||
            topBar = { topBar(topBarScrollBehavior) },
 | 
			
		||||
            startBar = startBar,
 | 
			
		||||
            bottomBar = bottomBar,
 | 
			
		||||
            content = content,
 | 
			
		||||
            snackbar = snackbarHost,
 | 
			
		||||
            contentWindowInsets = remainingWindowInsets,
 | 
			
		||||
            fab = floatingActionButton,
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Layout for a [Scaffold]'s content.
 | 
			
		||||
 *
 | 
			
		||||
 * @param fabPosition [FabPosition] for the FAB (if present)
 | 
			
		||||
 * @param topBar the content to place at the top of the [Scaffold], typically a [SmallTopAppBar]
 | 
			
		||||
 * @param content the main 'body' of the [Scaffold]
 | 
			
		||||
 * @param snackbar the [Snackbar] displayed on top of the [content]
 | 
			
		||||
 * @param fab the [FloatingActionButton] displayed on top of the [content], below the [snackbar]
 | 
			
		||||
 * and above the [bottomBar]
 | 
			
		||||
 * @param bottomBar the content to place at the bottom of the [Scaffold], on top of the
 | 
			
		||||
 * [content], typically a [NavigationBar].
 | 
			
		||||
 */
 | 
			
		||||
@OptIn(ExperimentalMaterial3Api::class)
 | 
			
		||||
@Composable
 | 
			
		||||
private fun ScaffoldLayout(
 | 
			
		||||
    fabPosition: FabPosition,
 | 
			
		||||
    topBar: @Composable () -> Unit,
 | 
			
		||||
    startBar: @Composable () -> Unit,
 | 
			
		||||
    content: @Composable (PaddingValues) -> Unit,
 | 
			
		||||
    snackbar: @Composable () -> Unit,
 | 
			
		||||
    fab: @Composable () -> Unit,
 | 
			
		||||
    contentWindowInsets: WindowInsets,
 | 
			
		||||
    bottomBar: @Composable () -> Unit,
 | 
			
		||||
) {
 | 
			
		||||
    SubcomposeLayout { constraints ->
 | 
			
		||||
        val layoutWidth = constraints.maxWidth
 | 
			
		||||
        val layoutHeight = constraints.maxHeight
 | 
			
		||||
 | 
			
		||||
        val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Tachiyomi: Remove height constraint for expanded app bar
 | 
			
		||||
         */
 | 
			
		||||
        val topBarConstraints = looseConstraints.copy(maxHeight = Constraints.Infinity)
 | 
			
		||||
 | 
			
		||||
        layout(layoutWidth, layoutHeight) {
 | 
			
		||||
            val leftInset = contentWindowInsets.getLeft(this@SubcomposeLayout, layoutDirection)
 | 
			
		||||
            val rightInset = contentWindowInsets.getRight(this@SubcomposeLayout, layoutDirection)
 | 
			
		||||
            val bottomInset = contentWindowInsets.getBottom(this@SubcomposeLayout)
 | 
			
		||||
 | 
			
		||||
            // Tachiyomi: Add startBar slot for Navigation Rail
 | 
			
		||||
            val startBarPlaceables = subcompose(ScaffoldLayoutContent.StartBar, startBar).fastMap {
 | 
			
		||||
                it.measure(looseConstraints)
 | 
			
		||||
            }
 | 
			
		||||
            val startBarWidth = startBarPlaceables.fastMaxBy { it.width }?.width ?: 0
 | 
			
		||||
 | 
			
		||||
            // Tachiyomi: layoutWidth after horizontal insets
 | 
			
		||||
            val insetLayoutWidth = layoutWidth - leftInset - rightInset - startBarWidth
 | 
			
		||||
 | 
			
		||||
            val topBarPlaceables = subcompose(ScaffoldLayoutContent.TopBar, topBar).fastMap {
 | 
			
		||||
                it.measure(topBarConstraints)
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            val topBarHeight = topBarPlaceables.fastMaxBy { it.height }?.height ?: 0
 | 
			
		||||
 | 
			
		||||
            val snackbarPlaceables = subcompose(ScaffoldLayoutContent.Snackbar, snackbar).fastMap {
 | 
			
		||||
                it.measure(looseConstraints)
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            val snackbarHeight = snackbarPlaceables.fastMaxBy { it.height }?.height ?: 0
 | 
			
		||||
            val snackbarWidth = snackbarPlaceables.fastMaxBy { it.width }?.width ?: 0
 | 
			
		||||
 | 
			
		||||
            // Tachiyomi: Calculate insets for snackbar placement offset
 | 
			
		||||
            val snackbarLeft = if (snackbarPlaceables.isNotEmpty()) {
 | 
			
		||||
                (insetLayoutWidth - snackbarWidth) / 2 + leftInset
 | 
			
		||||
            } else {
 | 
			
		||||
                0
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            val fabPlaceables =
 | 
			
		||||
                subcompose(ScaffoldLayoutContent.Fab, fab).fastMap { measurable ->
 | 
			
		||||
                    measurable.measure(looseConstraints)
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            val fabWidth = fabPlaceables.fastMaxBy { it.width }?.width ?: 0
 | 
			
		||||
            val fabHeight = fabPlaceables.fastMaxBy { it.height }?.height ?: 0
 | 
			
		||||
 | 
			
		||||
            val fabPlacement = if (fabPlaceables.isNotEmpty() && fabWidth != 0 && fabHeight != 0) {
 | 
			
		||||
                // FAB distance from the left of the layout, taking into account LTR / RTL
 | 
			
		||||
                // Tachiyomi: Calculate insets for fab placement offset
 | 
			
		||||
                val fabLeftOffset = if (fabPosition == FabPosition.End) {
 | 
			
		||||
                    if (layoutDirection == LayoutDirection.Ltr) {
 | 
			
		||||
                        layoutWidth - FabSpacing.roundToPx() - fabWidth - rightInset
 | 
			
		||||
                    } else {
 | 
			
		||||
                        FabSpacing.roundToPx() + leftInset
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    leftInset + ((insetLayoutWidth - fabWidth) / 2)
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                FabPlacement(
 | 
			
		||||
                    left = fabLeftOffset,
 | 
			
		||||
                    width = fabWidth,
 | 
			
		||||
                    height = fabHeight,
 | 
			
		||||
                )
 | 
			
		||||
            } else {
 | 
			
		||||
                null
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            val bottomBarPlaceables = subcompose(ScaffoldLayoutContent.BottomBar) {
 | 
			
		||||
                CompositionLocalProvider(
 | 
			
		||||
                    LocalFabPlacement provides fabPlacement,
 | 
			
		||||
                    content = bottomBar,
 | 
			
		||||
                )
 | 
			
		||||
            }.fastMap { it.measure(looseConstraints) }
 | 
			
		||||
 | 
			
		||||
            val bottomBarHeight = bottomBarPlaceables
 | 
			
		||||
                .fastMaxBy { it.height }
 | 
			
		||||
                ?.height
 | 
			
		||||
                ?.takeIf { it != 0 }
 | 
			
		||||
            val fabOffsetFromBottom = fabPlacement?.let {
 | 
			
		||||
                max(bottomBarHeight ?: 0, bottomInset) + it.height + FabSpacing.roundToPx()
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            val snackbarOffsetFromBottom = if (snackbarHeight != 0) {
 | 
			
		||||
                snackbarHeight + (fabOffsetFromBottom ?: max(bottomBarHeight ?: 0, bottomInset))
 | 
			
		||||
            } else {
 | 
			
		||||
                0
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            val bodyContentPlaceables = subcompose(ScaffoldLayoutContent.MainContent) {
 | 
			
		||||
                val insets = contentWindowInsets.asPaddingValues(this@SubcomposeLayout)
 | 
			
		||||
                val fabOffsetDp = fabOffsetFromBottom?.toDp() ?: 0.dp
 | 
			
		||||
                val bottomBarHeightPx = bottomBarHeight ?: 0
 | 
			
		||||
                val innerPadding = PaddingValues(
 | 
			
		||||
                    top =
 | 
			
		||||
                    if (topBarPlaceables.isEmpty()) {
 | 
			
		||||
                        insets.calculateTopPadding()
 | 
			
		||||
                    } else {
 | 
			
		||||
                        topBarHeight.toDp()
 | 
			
		||||
                    },
 | 
			
		||||
                    bottom = // Tachiyomi: Also take account of fab height when providing inner padding
 | 
			
		||||
                    if (bottomBarPlaceables.isEmpty() || bottomBarHeightPx == 0) {
 | 
			
		||||
                        max(insets.calculateBottomPadding(), fabOffsetDp)
 | 
			
		||||
                    } else {
 | 
			
		||||
                        max(bottomBarHeightPx.toDp(), fabOffsetDp)
 | 
			
		||||
                    },
 | 
			
		||||
                    start = max(insets.calculateStartPadding((this@SubcomposeLayout).layoutDirection), startBarWidth.toDp()),
 | 
			
		||||
                    end = insets.calculateEndPadding((this@SubcomposeLayout).layoutDirection),
 | 
			
		||||
                )
 | 
			
		||||
                content(innerPadding)
 | 
			
		||||
            }.fastMap { it.measure(looseConstraints) }
 | 
			
		||||
 | 
			
		||||
            // Placing to control drawing order to match default elevation of each placeable
 | 
			
		||||
 | 
			
		||||
            bodyContentPlaceables.fastForEach {
 | 
			
		||||
                it.place(0, 0)
 | 
			
		||||
            }
 | 
			
		||||
            startBarPlaceables.fastForEach {
 | 
			
		||||
                it.placeRelative(0, 0)
 | 
			
		||||
            }
 | 
			
		||||
            topBarPlaceables.fastForEach {
 | 
			
		||||
                it.place(0, 0)
 | 
			
		||||
            }
 | 
			
		||||
            snackbarPlaceables.fastForEach {
 | 
			
		||||
                it.place(
 | 
			
		||||
                    snackbarLeft,
 | 
			
		||||
                    layoutHeight - snackbarOffsetFromBottom,
 | 
			
		||||
                )
 | 
			
		||||
            }
 | 
			
		||||
            // The bottom bar is always at the bottom of the layout
 | 
			
		||||
            bottomBarPlaceables.fastForEach {
 | 
			
		||||
                it.place(0, layoutHeight - (bottomBarHeight ?: 0))
 | 
			
		||||
            }
 | 
			
		||||
            // Explicitly not using placeRelative here as `leftOffset` already accounts for RTL
 | 
			
		||||
            fabPlaceables.fastForEach {
 | 
			
		||||
                it.place(fabPlacement?.left ?: 0, layoutHeight - (fabOffsetFromBottom ?: 0))
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The possible positions for a [FloatingActionButton] attached to a [Scaffold].
 | 
			
		||||
 */
 | 
			
		||||
@ExperimentalMaterial3Api
 | 
			
		||||
@JvmInline
 | 
			
		||||
value class FabPosition internal constructor(@Suppress("unused") private val value: Int) {
 | 
			
		||||
    companion object {
 | 
			
		||||
        /**
 | 
			
		||||
         * Position FAB at the bottom of the screen in the center, above the [NavigationBar] (if it
 | 
			
		||||
         * exists)
 | 
			
		||||
         */
 | 
			
		||||
        val Center = FabPosition(0)
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Position FAB at the bottom of the screen at the end, above the [NavigationBar] (if it
 | 
			
		||||
         * exists)
 | 
			
		||||
         */
 | 
			
		||||
        val End = FabPosition(1)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun toString(): String {
 | 
			
		||||
        return when (this) {
 | 
			
		||||
            Center -> "FabPosition.Center"
 | 
			
		||||
            else -> "FabPosition.End"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Placement information for a [FloatingActionButton] inside a [Scaffold].
 | 
			
		||||
 *
 | 
			
		||||
 * @property left the FAB's offset from the left edge of the bottom bar, already adjusted for RTL
 | 
			
		||||
 * support
 | 
			
		||||
 * @property width the width of the FAB
 | 
			
		||||
 * @property height the height of the FAB
 | 
			
		||||
 */
 | 
			
		||||
@Immutable
 | 
			
		||||
internal class FabPlacement(
 | 
			
		||||
    val left: Int,
 | 
			
		||||
    val width: Int,
 | 
			
		||||
    val height: Int,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * CompositionLocal containing a [FabPlacement] that is used to calculate the FAB bottom offset.
 | 
			
		||||
 */
 | 
			
		||||
internal val LocalFabPlacement = staticCompositionLocalOf<FabPlacement?> { null }
 | 
			
		||||
 | 
			
		||||
// FAB spacing above the bottom bar / bottom of the Scaffold
 | 
			
		||||
private val FabSpacing = 16.dp
 | 
			
		||||
 | 
			
		||||
private enum class ScaffoldLayoutContent { TopBar, MainContent, Snackbar, Fab, BottomBar, StartBar }
 | 
			
		||||
@@ -31,6 +31,7 @@ import androidx.compose.ui.unit.dp
 | 
			
		||||
import androidx.compose.ui.util.fastForEachIndexed
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import kotlinx.coroutines.launch
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Divider
 | 
			
		||||
 | 
			
		||||
object TabbedDialogPaddings {
 | 
			
		||||
    val Horizontal = 24.dp
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@ import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.platform.LocalLayoutDirection
 | 
			
		||||
import androidx.compose.ui.res.stringResource
 | 
			
		||||
import kotlinx.coroutines.launch
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun TabbedScreen(
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,7 @@ import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.draw.clip
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
import androidx.compose.ui.unit.sp
 | 
			
		||||
import tachiyomi.presentation.core.components.Pill
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun TabIndicator(currentTabPosition: TabPosition) {
 | 
			
		||||
 
 | 
			
		||||
@@ -13,13 +13,13 @@ import androidx.compose.ui.res.stringResource
 | 
			
		||||
import eu.kanade.presentation.components.AppBarTitle
 | 
			
		||||
import eu.kanade.presentation.components.EmptyScreen
 | 
			
		||||
import eu.kanade.presentation.components.LoadingScreen
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.components.SearchToolbar
 | 
			
		||||
import eu.kanade.presentation.history.components.HistoryContent
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.ui.history.HistoryScreenModel
 | 
			
		||||
import eu.kanade.tachiyomi.ui.history.HistoryState
 | 
			
		||||
import tachiyomi.domain.history.model.HistoryWithRelations
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
import java.util.Date
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
 
 | 
			
		||||
@@ -5,9 +5,9 @@ import androidx.compose.material.icons.Icons
 | 
			
		||||
import androidx.compose.material.icons.outlined.Folder
 | 
			
		||||
import androidx.compose.material3.MaterialTheme
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import eu.kanade.presentation.components.Badge
 | 
			
		||||
import eu.kanade.presentation.theme.TachiyomiTheme
 | 
			
		||||
import eu.kanade.presentation.util.ThemePreviews
 | 
			
		||||
import tachiyomi.presentation.core.components.Badge
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun DownloadsBadge(count: Long) {
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,6 @@ import androidx.compose.runtime.setValue
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.platform.LocalLayoutDirection
 | 
			
		||||
import eu.kanade.core.prefs.PreferenceMutableState
 | 
			
		||||
import eu.kanade.presentation.components.PullRefresh
 | 
			
		||||
import eu.kanade.presentation.components.rememberPagerState
 | 
			
		||||
import eu.kanade.tachiyomi.ui.library.LibraryItem
 | 
			
		||||
import kotlinx.coroutines.delay
 | 
			
		||||
@@ -23,6 +22,7 @@ import kotlinx.coroutines.launch
 | 
			
		||||
import tachiyomi.domain.category.model.Category
 | 
			
		||||
import tachiyomi.domain.library.model.LibraryDisplayMode
 | 
			
		||||
import tachiyomi.domain.library.model.LibraryManga
 | 
			
		||||
import tachiyomi.presentation.core.components.material.PullRefresh
 | 
			
		||||
import kotlin.time.Duration.Companion.seconds
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
 
 | 
			
		||||
@@ -7,10 +7,10 @@ import androidx.compose.material3.Tab
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
import eu.kanade.presentation.category.visualName
 | 
			
		||||
import eu.kanade.presentation.components.Divider
 | 
			
		||||
import eu.kanade.presentation.components.TabIndicator
 | 
			
		||||
import eu.kanade.presentation.components.TabText
 | 
			
		||||
import tachiyomi.domain.category.model.Category
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Divider
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun LibraryTabs(
 | 
			
		||||
 
 | 
			
		||||
@@ -22,10 +22,10 @@ import androidx.compose.ui.text.style.TextOverflow
 | 
			
		||||
import androidx.compose.ui.unit.sp
 | 
			
		||||
import eu.kanade.presentation.components.AppBar
 | 
			
		||||
import eu.kanade.presentation.components.OverflowMenu
 | 
			
		||||
import eu.kanade.presentation.components.Pill
 | 
			
		||||
import eu.kanade.presentation.components.SearchToolbar
 | 
			
		||||
import eu.kanade.presentation.theme.active
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import tachiyomi.presentation.core.components.Pill
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun LibraryToolbar(
 | 
			
		||||
 
 | 
			
		||||
@@ -49,11 +49,8 @@ import androidx.compose.ui.util.fastAny
 | 
			
		||||
import androidx.compose.ui.util.fastMap
 | 
			
		||||
import eu.kanade.domain.manga.model.chaptersFiltered
 | 
			
		||||
import eu.kanade.presentation.components.ChapterDownloadAction
 | 
			
		||||
import eu.kanade.presentation.components.ExtendedFloatingActionButton
 | 
			
		||||
import eu.kanade.presentation.components.LazyColumn
 | 
			
		||||
import eu.kanade.presentation.components.MangaBottomActionMenu
 | 
			
		||||
import eu.kanade.presentation.components.PullRefresh
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.components.TwoPanelBox
 | 
			
		||||
import eu.kanade.presentation.components.VerticalFastScroller
 | 
			
		||||
import eu.kanade.presentation.manga.components.ChapterHeader
 | 
			
		||||
@@ -75,6 +72,9 @@ import eu.kanade.tachiyomi.util.lang.toRelativeString
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.copyToClipboard
 | 
			
		||||
import tachiyomi.domain.chapter.model.Chapter
 | 
			
		||||
import tachiyomi.domain.manga.model.Manga
 | 
			
		||||
import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton
 | 
			
		||||
import tachiyomi.presentation.core.components.material.PullRefresh
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
import java.text.DateFormat
 | 
			
		||||
import java.util.Date
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -42,14 +42,14 @@ import androidx.compose.ui.res.stringResource
 | 
			
		||||
import androidx.compose.ui.text.style.TextAlign
 | 
			
		||||
import androidx.compose.ui.text.style.TextOverflow
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
import eu.kanade.presentation.components.Divider
 | 
			
		||||
import eu.kanade.presentation.components.DropdownMenu
 | 
			
		||||
import eu.kanade.presentation.components.TrackLogoIcon
 | 
			
		||||
import eu.kanade.presentation.components.VerticalDivider
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.TrackService
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.track.TrackItem
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.copyToClipboard
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Divider
 | 
			
		||||
import tachiyomi.presentation.core.components.material.VerticalDivider
 | 
			
		||||
import java.text.DateFormat
 | 
			
		||||
 | 
			
		||||
private const val UnsetStatusTextAlpha = 0.5F
 | 
			
		||||
 
 | 
			
		||||
@@ -29,8 +29,6 @@ import androidx.compose.ui.draw.clip
 | 
			
		||||
import androidx.compose.ui.res.stringResource
 | 
			
		||||
import androidx.compose.ui.text.style.TextAlign
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
import eu.kanade.presentation.components.AlertDialogContent
 | 
			
		||||
import eu.kanade.presentation.components.Divider
 | 
			
		||||
import eu.kanade.presentation.components.ScrollbarLazyColumn
 | 
			
		||||
import eu.kanade.presentation.components.WheelDatePicker
 | 
			
		||||
import eu.kanade.presentation.components.WheelTextPicker
 | 
			
		||||
@@ -39,6 +37,8 @@ import eu.kanade.presentation.util.isScrolledToStart
 | 
			
		||||
import eu.kanade.presentation.util.minimumTouchTargetSize
 | 
			
		||||
import eu.kanade.presentation.util.padding
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import tachiyomi.presentation.core.components.material.AlertDialogContent
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Divider
 | 
			
		||||
import java.time.LocalDate
 | 
			
		||||
import java.time.format.TextStyle
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -56,11 +56,9 @@ import androidx.compose.ui.text.intl.Locale
 | 
			
		||||
import androidx.compose.ui.text.style.TextOverflow
 | 
			
		||||
import androidx.compose.ui.text.toLowerCase
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
import eu.kanade.presentation.components.Divider
 | 
			
		||||
import eu.kanade.presentation.components.EmptyScreen
 | 
			
		||||
import eu.kanade.presentation.components.LoadingScreen
 | 
			
		||||
import eu.kanade.presentation.components.MangaCover
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.components.ScrollbarLazyColumn
 | 
			
		||||
import eu.kanade.presentation.util.padding
 | 
			
		||||
import eu.kanade.presentation.util.plus
 | 
			
		||||
@@ -68,6 +66,8 @@ import eu.kanade.presentation.util.runOnEnterKeyPressed
 | 
			
		||||
import eu.kanade.presentation.util.secondaryItemAlpha
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.model.TrackSearch
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Divider
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun TrackServiceSearch(
 | 
			
		||||
 
 | 
			
		||||
@@ -44,12 +44,12 @@ import coil.request.CachePolicy
 | 
			
		||||
import coil.request.ImageRequest
 | 
			
		||||
import coil.size.Size
 | 
			
		||||
import eu.kanade.presentation.components.DropdownMenu
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.manga.EditCoverAction
 | 
			
		||||
import eu.kanade.presentation.util.clickableNoIndication
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.viewer.ReaderPageImageView
 | 
			
		||||
import tachiyomi.domain.manga.model.Manga
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun MangaCoverDialog(
 | 
			
		||||
 
 | 
			
		||||
@@ -11,8 +11,8 @@ import androidx.compose.ui.Alignment
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.res.painterResource
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
import eu.kanade.presentation.components.Divider
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Divider
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun LogoHeader() {
 | 
			
		||||
 
 | 
			
		||||
@@ -24,8 +24,6 @@ import androidx.compose.ui.platform.LocalUriHandler
 | 
			
		||||
import androidx.compose.ui.res.pluralStringResource
 | 
			
		||||
import androidx.compose.ui.res.stringResource
 | 
			
		||||
import androidx.compose.ui.res.vectorResource
 | 
			
		||||
import eu.kanade.presentation.components.Divider
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.components.ScrollbarLazyColumn
 | 
			
		||||
import eu.kanade.presentation.components.WarningBanner
 | 
			
		||||
import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget
 | 
			
		||||
@@ -33,6 +31,8 @@ import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.ui.more.DownloadQueueState
 | 
			
		||||
import tachiyomi.core.Constants
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Divider
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun MoreScreen(
 | 
			
		||||
 
 | 
			
		||||
@@ -10,8 +10,8 @@ import androidx.compose.material3.Text
 | 
			
		||||
import androidx.compose.material3.TopAppBar
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.ui.res.stringResource
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun PreferenceScaffold(
 | 
			
		||||
 
 | 
			
		||||
@@ -21,8 +21,6 @@ import cafe.adriel.voyager.navigator.LocalNavigator
 | 
			
		||||
import cafe.adriel.voyager.navigator.currentOrThrow
 | 
			
		||||
import eu.kanade.domain.ui.UiPreferences
 | 
			
		||||
import eu.kanade.presentation.components.AppBar
 | 
			
		||||
import eu.kanade.presentation.components.LinkIcon
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.components.ScrollbarLazyColumn
 | 
			
		||||
import eu.kanade.presentation.more.LogoHeader
 | 
			
		||||
import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget
 | 
			
		||||
@@ -42,6 +40,8 @@ import logcat.LogPriority
 | 
			
		||||
import tachiyomi.core.util.lang.withIOContext
 | 
			
		||||
import tachiyomi.core.util.lang.withUIContext
 | 
			
		||||
import tachiyomi.core.util.system.logcat
 | 
			
		||||
import tachiyomi.presentation.core.components.LinkIcon
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
import java.text.DateFormat
 | 
			
		||||
 
 | 
			
		||||
@@ -38,11 +38,9 @@ import eu.kanade.domain.source.interactor.GetSourcesWithNonLibraryManga
 | 
			
		||||
import eu.kanade.presentation.browse.components.SourceIcon
 | 
			
		||||
import eu.kanade.presentation.components.AppBar
 | 
			
		||||
import eu.kanade.presentation.components.AppBarActions
 | 
			
		||||
import eu.kanade.presentation.components.Divider
 | 
			
		||||
import eu.kanade.presentation.components.EmptyScreen
 | 
			
		||||
import eu.kanade.presentation.components.FastScrollLazyColumn
 | 
			
		||||
import eu.kanade.presentation.components.LoadingScreen
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.util.selectedBackground
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.toast
 | 
			
		||||
@@ -54,6 +52,8 @@ import tachiyomi.core.util.lang.withNonCancellableContext
 | 
			
		||||
import tachiyomi.data.Database
 | 
			
		||||
import tachiyomi.domain.source.model.Source
 | 
			
		||||
import tachiyomi.domain.source.model.SourceWithCount
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Divider
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -11,8 +11,8 @@ import cafe.adriel.voyager.navigator.currentOrThrow
 | 
			
		||||
import com.mikepenz.aboutlibraries.ui.compose.LibrariesContainer
 | 
			
		||||
import com.mikepenz.aboutlibraries.ui.compose.LibraryDefaults
 | 
			
		||||
import eu.kanade.presentation.components.AppBar
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
class LicensesScreen : Screen {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,6 @@ import androidx.compose.ui.unit.dp
 | 
			
		||||
import androidx.core.net.toUri
 | 
			
		||||
import com.hippo.unifile.UniFile
 | 
			
		||||
import eu.kanade.domain.backup.service.BackupPreferences
 | 
			
		||||
import eu.kanade.presentation.components.Divider
 | 
			
		||||
import eu.kanade.presentation.components.ScrollbarLazyColumn
 | 
			
		||||
import eu.kanade.presentation.more.settings.Preference
 | 
			
		||||
import eu.kanade.presentation.util.collectAsState
 | 
			
		||||
@@ -54,6 +53,7 @@ import eu.kanade.tachiyomi.util.system.DeviceUtil
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.copyToClipboard
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.toast
 | 
			
		||||
import kotlinx.coroutines.launch
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Divider
 | 
			
		||||
import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -48,10 +48,10 @@ import cafe.adriel.voyager.navigator.currentOrThrow
 | 
			
		||||
import eu.kanade.presentation.components.AppBar
 | 
			
		||||
import eu.kanade.presentation.components.AppBarActions
 | 
			
		||||
import eu.kanade.presentation.components.LazyColumn
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget
 | 
			
		||||
import eu.kanade.presentation.util.LocalBackPress
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
object SettingsMainScreen : Screen {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -50,13 +50,13 @@ import androidx.compose.ui.unit.dp
 | 
			
		||||
import cafe.adriel.voyager.core.screen.Screen
 | 
			
		||||
import cafe.adriel.voyager.navigator.LocalNavigator
 | 
			
		||||
import cafe.adriel.voyager.navigator.currentOrThrow
 | 
			
		||||
import eu.kanade.presentation.components.Divider
 | 
			
		||||
import eu.kanade.presentation.components.EmptyScreen
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.more.settings.Preference
 | 
			
		||||
import eu.kanade.presentation.util.runOnEnterKeyPressed
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.isLTR
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Divider
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
class SettingsSearchScreen : Screen {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -38,13 +38,13 @@ import cafe.adriel.voyager.core.screen.Screen
 | 
			
		||||
import cafe.adriel.voyager.navigator.LocalNavigator
 | 
			
		||||
import cafe.adriel.voyager.navigator.currentOrThrow
 | 
			
		||||
import eu.kanade.presentation.components.LazyColumn
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.util.plus
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import kotlinx.coroutines.flow.SharingStarted
 | 
			
		||||
import kotlinx.coroutines.flow.map
 | 
			
		||||
import kotlinx.coroutines.flow.stateIn
 | 
			
		||||
import kotlinx.coroutines.launch
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
object WorkerInfoScreen : Screen {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,6 @@ import androidx.compose.ui.res.stringResource
 | 
			
		||||
import androidx.compose.ui.text.style.TextAlign
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
import eu.kanade.domain.ui.model.AppTheme
 | 
			
		||||
import eu.kanade.presentation.components.DIVIDER_ALPHA
 | 
			
		||||
import eu.kanade.presentation.components.MangaCover
 | 
			
		||||
import eu.kanade.presentation.theme.TachiyomiTheme
 | 
			
		||||
import eu.kanade.presentation.util.ThemePreviews
 | 
			
		||||
@@ -48,6 +47,7 @@ import eu.kanade.presentation.util.secondaryItemAlpha
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.DeviceUtil
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.isDynamicColorAvailable
 | 
			
		||||
import tachiyomi.presentation.core.components.material.DIVIDER_ALPHA
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
internal fun AppThemePreferenceWidget(
 | 
			
		||||
 
 | 
			
		||||
@@ -22,12 +22,12 @@ import androidx.compose.ui.draw.clip
 | 
			
		||||
import androidx.compose.ui.graphics.vector.ImageVector
 | 
			
		||||
import androidx.compose.ui.res.stringResource
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
import eu.kanade.presentation.components.Divider
 | 
			
		||||
import eu.kanade.presentation.components.ScrollbarLazyColumn
 | 
			
		||||
import eu.kanade.presentation.util.isScrolledToEnd
 | 
			
		||||
import eu.kanade.presentation.util.isScrolledToStart
 | 
			
		||||
import eu.kanade.presentation.util.minimumTouchTargetSize
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Divider
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun <T> ListPreferenceWidget(
 | 
			
		||||
 
 | 
			
		||||
@@ -27,11 +27,11 @@ import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.draw.clip
 | 
			
		||||
import androidx.compose.ui.res.stringResource
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
import eu.kanade.presentation.components.Divider
 | 
			
		||||
import eu.kanade.presentation.components.LazyColumn
 | 
			
		||||
import eu.kanade.presentation.util.isScrolledToEnd
 | 
			
		||||
import eu.kanade.presentation.util.isScrolledToStart
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Divider
 | 
			
		||||
 | 
			
		||||
private enum class State {
 | 
			
		||||
    CHECKED, INVERSED, UNCHECKED
 | 
			
		||||
 
 | 
			
		||||
@@ -29,14 +29,14 @@ import eu.kanade.presentation.components.EmptyScreen
 | 
			
		||||
import eu.kanade.presentation.components.FastScrollLazyColumn
 | 
			
		||||
import eu.kanade.presentation.components.LoadingScreen
 | 
			
		||||
import eu.kanade.presentation.components.MangaBottomActionMenu
 | 
			
		||||
import eu.kanade.presentation.components.PullRefresh
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.model.Download
 | 
			
		||||
import eu.kanade.tachiyomi.ui.updates.UpdatesItem
 | 
			
		||||
import eu.kanade.tachiyomi.ui.updates.UpdatesState
 | 
			
		||||
import kotlinx.coroutines.delay
 | 
			
		||||
import kotlinx.coroutines.launch
 | 
			
		||||
import tachiyomi.presentation.core.components.material.PullRefresh
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
import kotlin.time.Duration.Companion.seconds
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
 
 | 
			
		||||
@@ -25,10 +25,10 @@ import com.google.accompanist.web.rememberWebViewNavigator
 | 
			
		||||
import com.google.accompanist.web.rememberWebViewState
 | 
			
		||||
import eu.kanade.presentation.components.AppBar
 | 
			
		||||
import eu.kanade.presentation.components.AppBarActions
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.tachiyomi.BuildConfig
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.setDefaultSettings
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun WebViewScreenContent(
 | 
			
		||||
 
 | 
			
		||||
@@ -39,13 +39,13 @@ import cafe.adriel.voyager.core.screen.Screen
 | 
			
		||||
import cafe.adriel.voyager.core.screen.uniqueScreenKey
 | 
			
		||||
import cafe.adriel.voyager.navigator.LocalNavigator
 | 
			
		||||
import cafe.adriel.voyager.navigator.currentOrThrow
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.SharedPreferencesDataStore
 | 
			
		||||
import eu.kanade.tachiyomi.source.ConfigurableSource
 | 
			
		||||
import eu.kanade.tachiyomi.source.SourceManager
 | 
			
		||||
import eu.kanade.tachiyomi.source.getPreferenceKey
 | 
			
		||||
import eu.kanade.tachiyomi.widget.TachiyomiTextInputEditText.Companion.setIncognito
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -23,8 +23,6 @@ import cafe.adriel.voyager.core.screen.Screen
 | 
			
		||||
import cafe.adriel.voyager.navigator.LocalNavigator
 | 
			
		||||
import cafe.adriel.voyager.navigator.currentOrThrow
 | 
			
		||||
import eu.kanade.presentation.browse.BrowseSourceContent
 | 
			
		||||
import eu.kanade.presentation.components.ExtendedFloatingActionButton
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.components.SearchToolbar
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.source.LocalSource
 | 
			
		||||
@@ -36,6 +34,8 @@ import eu.kanade.tachiyomi.ui.webview.WebViewScreen
 | 
			
		||||
import kotlinx.coroutines.launch
 | 
			
		||||
import tachiyomi.core.Constants
 | 
			
		||||
import tachiyomi.domain.manga.model.Manga
 | 
			
		||||
import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
data class SourceSearchScreen(
 | 
			
		||||
    private val oldManga: Manga,
 | 
			
		||||
 
 | 
			
		||||
@@ -43,9 +43,7 @@ import eu.kanade.presentation.browse.MissingSourceScreen
 | 
			
		||||
import eu.kanade.presentation.browse.components.BrowseSourceToolbar
 | 
			
		||||
import eu.kanade.presentation.browse.components.RemoveMangaDialog
 | 
			
		||||
import eu.kanade.presentation.components.ChangeCategoryDialog
 | 
			
		||||
import eu.kanade.presentation.components.Divider
 | 
			
		||||
import eu.kanade.presentation.components.DuplicateMangaDialog
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.util.AssistContentScreen
 | 
			
		||||
import eu.kanade.presentation.util.padding
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
@@ -62,6 +60,8 @@ import kotlinx.coroutines.flow.collectLatest
 | 
			
		||||
import kotlinx.coroutines.flow.receiveAsFlow
 | 
			
		||||
import tachiyomi.core.Constants
 | 
			
		||||
import tachiyomi.core.util.lang.launchIO
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Divider
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
data class BrowseSourceScreen(
 | 
			
		||||
    private val sourceId: Long,
 | 
			
		||||
 
 | 
			
		||||
@@ -50,14 +50,14 @@ import cafe.adriel.voyager.navigator.LocalNavigator
 | 
			
		||||
import cafe.adriel.voyager.navigator.currentOrThrow
 | 
			
		||||
import eu.kanade.presentation.components.AppBar
 | 
			
		||||
import eu.kanade.presentation.components.EmptyScreen
 | 
			
		||||
import eu.kanade.presentation.components.ExtendedFloatingActionButton
 | 
			
		||||
import eu.kanade.presentation.components.OverflowMenu
 | 
			
		||||
import eu.kanade.presentation.components.Pill
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.DownloadService
 | 
			
		||||
import eu.kanade.tachiyomi.databinding.DownloadListBinding
 | 
			
		||||
import tachiyomi.core.util.lang.launchUI
 | 
			
		||||
import tachiyomi.presentation.core.components.Pill
 | 
			
		||||
import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
import kotlin.math.roundToInt
 | 
			
		||||
 | 
			
		||||
object DownloadQueueScreen : Screen {
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,6 @@ import eu.kanade.domain.library.service.LibraryPreferences
 | 
			
		||||
import eu.kanade.domain.source.service.SourcePreferences
 | 
			
		||||
import eu.kanade.presentation.components.NavigationBar
 | 
			
		||||
import eu.kanade.presentation.components.NavigationRail
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.util.isTabletUi
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.BrowseTab
 | 
			
		||||
@@ -56,6 +55,7 @@ import kotlinx.coroutines.flow.receiveAsFlow
 | 
			
		||||
import kotlinx.coroutines.launch
 | 
			
		||||
import soup.compose.material.motion.animation.materialFadeThroughIn
 | 
			
		||||
import soup.compose.material.motion.animation.materialFadeThroughOut
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,6 @@ import eu.kanade.presentation.components.EmptyScreen
 | 
			
		||||
import eu.kanade.presentation.components.EmptyScreenAction
 | 
			
		||||
import eu.kanade.presentation.components.LibraryBottomActionMenu
 | 
			
		||||
import eu.kanade.presentation.components.LoadingScreen
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.library.components.LibraryContent
 | 
			
		||||
import eu.kanade.presentation.library.components.LibraryToolbar
 | 
			
		||||
import eu.kanade.presentation.util.Tab
 | 
			
		||||
@@ -56,6 +55,7 @@ import tachiyomi.domain.category.model.Category
 | 
			
		||||
import tachiyomi.domain.library.model.LibraryManga
 | 
			
		||||
import tachiyomi.domain.library.model.display
 | 
			
		||||
import tachiyomi.domain.manga.model.Manga
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
object LibraryTab : Tab {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -61,7 +61,6 @@ import eu.kanade.presentation.components.AppStateBanners
 | 
			
		||||
import eu.kanade.presentation.components.DownloadedOnlyBannerBackgroundColor
 | 
			
		||||
import eu.kanade.presentation.components.IncognitoModeBannerBackgroundColor
 | 
			
		||||
import eu.kanade.presentation.components.IndexingBannerBackgroundColor
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.util.AssistContentScreen
 | 
			
		||||
import eu.kanade.presentation.util.DefaultNavigatorScreenTransition
 | 
			
		||||
import eu.kanade.presentation.util.collectAsState
 | 
			
		||||
@@ -102,6 +101,7 @@ import logcat.LogPriority
 | 
			
		||||
import tachiyomi.core.Constants
 | 
			
		||||
import tachiyomi.core.util.system.logcat
 | 
			
		||||
import tachiyomi.domain.category.model.Category
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,6 @@ import eu.kanade.domain.chapter.interactor.SyncChaptersWithTrackServiceTwoWay
 | 
			
		||||
import eu.kanade.domain.track.model.toDbTrack
 | 
			
		||||
import eu.kanade.domain.track.model.toDomainTrack
 | 
			
		||||
import eu.kanade.domain.ui.UiPreferences
 | 
			
		||||
import eu.kanade.presentation.components.AlertDialogContent
 | 
			
		||||
import eu.kanade.presentation.manga.TrackChapterSelector
 | 
			
		||||
import eu.kanade.presentation.manga.TrackDateSelector
 | 
			
		||||
import eu.kanade.presentation.manga.TrackInfoDialogHome
 | 
			
		||||
@@ -73,6 +72,7 @@ import tachiyomi.domain.manga.interactor.GetMangaWithChapters
 | 
			
		||||
import tachiyomi.domain.track.interactor.DeleteTrack
 | 
			
		||||
import tachiyomi.domain.track.interactor.GetTracks
 | 
			
		||||
import tachiyomi.domain.track.interactor.InsertTrack
 | 
			
		||||
import tachiyomi.presentation.core.components.material.AlertDialogContent
 | 
			
		||||
import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
import java.time.Instant
 | 
			
		||||
 
 | 
			
		||||
@@ -11,10 +11,10 @@ import cafe.adriel.voyager.navigator.LocalNavigator
 | 
			
		||||
import cafe.adriel.voyager.navigator.currentOrThrow
 | 
			
		||||
import eu.kanade.presentation.components.AppBar
 | 
			
		||||
import eu.kanade.presentation.components.LoadingScreen
 | 
			
		||||
import eu.kanade.presentation.components.Scaffold
 | 
			
		||||
import eu.kanade.presentation.more.stats.StatsScreenContent
 | 
			
		||||
import eu.kanade.presentation.more.stats.StatsScreenState
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import tachiyomi.presentation.core.components.material.Scaffold
 | 
			
		||||
 | 
			
		||||
class StatsScreen : Screen {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user