Initial commit
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
package dev.meloda.overseerr
|
||||
|
||||
import androidx.compose.animation.core.*
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.material3.*
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.rotate
|
||||
import androidx.compose.ui.graphics.ColorFilter
|
||||
import androidx.compose.ui.platform.LocalUriHandler
|
||||
import androidx.compose.ui.text.font.FontFamily
|
||||
import androidx.compose.ui.unit.dp
|
||||
import overseerr.composeapp.generated.resources.*
|
||||
import dev.meloda.overseerr.theme.AppTheme
|
||||
import dev.meloda.overseerr.theme.LocalThemeIsDark
|
||||
import kotlinx.coroutines.isActive
|
||||
import org.jetbrains.compose.resources.Font
|
||||
import org.jetbrains.compose.resources.stringResource
|
||||
import org.jetbrains.compose.resources.vectorResource
|
||||
|
||||
@Composable
|
||||
internal fun App() = AppTheme {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.windowInsetsPadding(WindowInsets.safeDrawing)
|
||||
.padding(16.dp),
|
||||
horizontalAlignment = Alignment.CenterHorizontally
|
||||
) {
|
||||
Text(
|
||||
text = stringResource(Res.string.cyclone),
|
||||
fontFamily = FontFamily(Font(Res.font.IndieFlower_Regular)),
|
||||
style = MaterialTheme.typography.displayLarge
|
||||
)
|
||||
|
||||
var isRotating by remember { mutableStateOf(false) }
|
||||
|
||||
val rotate = remember { Animatable(0f) }
|
||||
val target = 360f
|
||||
if (isRotating) {
|
||||
LaunchedEffect(Unit) {
|
||||
while (isActive) {
|
||||
val remaining = (target - rotate.value) / target
|
||||
rotate.animateTo(target, animationSpec = tween((1_000 * remaining).toInt(), easing = LinearEasing))
|
||||
rotate.snapTo(0f)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Image(
|
||||
modifier = Modifier
|
||||
.size(250.dp)
|
||||
.padding(16.dp)
|
||||
.run { rotate(rotate.value) },
|
||||
imageVector = vectorResource(Res.drawable.ic_cyclone),
|
||||
colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onSurface),
|
||||
contentDescription = null
|
||||
)
|
||||
|
||||
ElevatedButton(
|
||||
modifier = Modifier
|
||||
.padding(horizontal = 8.dp, vertical = 4.dp)
|
||||
.widthIn(min = 200.dp),
|
||||
onClick = { isRotating = !isRotating },
|
||||
content = {
|
||||
Icon(vectorResource(Res.drawable.ic_rotate_right), contentDescription = null)
|
||||
Spacer(Modifier.size(ButtonDefaults.IconSpacing))
|
||||
Text(
|
||||
stringResource(if (isRotating) Res.string.stop else Res.string.run)
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
var isDark by LocalThemeIsDark.current
|
||||
val icon = remember(isDark) {
|
||||
if (isDark) Res.drawable.ic_light_mode
|
||||
else Res.drawable.ic_dark_mode
|
||||
}
|
||||
|
||||
ElevatedButton(
|
||||
modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp).widthIn(min = 200.dp),
|
||||
onClick = { isDark = !isDark },
|
||||
content = {
|
||||
Icon(vectorResource(icon), contentDescription = null)
|
||||
Spacer(Modifier.size(ButtonDefaults.IconSpacing))
|
||||
Text(stringResource(Res.string.theme))
|
||||
}
|
||||
)
|
||||
|
||||
val uriHandler = LocalUriHandler.current
|
||||
TextButton(
|
||||
modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp).widthIn(min = 200.dp),
|
||||
onClick = { uriHandler.openUri("https://github.com/terrakok") },
|
||||
) {
|
||||
Text(stringResource(Res.string.open_github))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
package dev.meloda.overseerr.theme
|
||||
|
||||
import androidx.compose.ui.graphics.Color
|
||||
|
||||
//generated by https://m3.material.io/theme-builder#/custom
|
||||
//Color palette was taken here: https://colorhunt.co/palettes/popular
|
||||
|
||||
internal val md_theme_light_primary = Color(0xFF00687A)
|
||||
internal val md_theme_light_onPrimary = Color(0xFFFFFFFF)
|
||||
internal val md_theme_light_primaryContainer = Color(0xFFABEDFF)
|
||||
internal val md_theme_light_onPrimaryContainer = Color(0xFF001F26)
|
||||
internal val md_theme_light_secondary = Color(0xFF00696E)
|
||||
internal val md_theme_light_onSecondary = Color(0xFFFFFFFF)
|
||||
internal val md_theme_light_secondaryContainer = Color(0xFF6FF6FE)
|
||||
internal val md_theme_light_onSecondaryContainer = Color(0xFF002022)
|
||||
internal val md_theme_light_tertiary = Color(0xFF904D00)
|
||||
internal val md_theme_light_onTertiary = Color(0xFFFFFFFF)
|
||||
internal val md_theme_light_tertiaryContainer = Color(0xFFFFDCC2)
|
||||
internal val md_theme_light_onTertiaryContainer = Color(0xFF2E1500)
|
||||
internal val md_theme_light_error = Color(0xFFBA1A1A)
|
||||
internal val md_theme_light_errorContainer = Color(0xFFFFDAD6)
|
||||
internal val md_theme_light_onError = Color(0xFFFFFFFF)
|
||||
internal val md_theme_light_onErrorContainer = Color(0xFF410002)
|
||||
internal val md_theme_light_background = Color(0xFFFFFBFF)
|
||||
internal val md_theme_light_onBackground = Color(0xFF221B00)
|
||||
internal val md_theme_light_surface = Color(0xFFFFFBFF)
|
||||
internal val md_theme_light_onSurface = Color(0xFF221B00)
|
||||
internal val md_theme_light_surfaceVariant = Color(0xFFDBE4E7)
|
||||
internal val md_theme_light_onSurfaceVariant = Color(0xFF3F484B)
|
||||
internal val md_theme_light_outline = Color(0xFF70797B)
|
||||
internal val md_theme_light_inverseOnSurface = Color(0xFFFFF0C0)
|
||||
internal val md_theme_light_inverseSurface = Color(0xFF3A3000)
|
||||
internal val md_theme_light_inversePrimary = Color(0xFF55D6F4)
|
||||
internal val md_theme_light_shadow = Color(0xFF000000)
|
||||
internal val md_theme_light_surfaceTint = Color(0xFF00687A)
|
||||
internal val md_theme_light_outlineVariant = Color(0xFFBFC8CB)
|
||||
internal val md_theme_light_scrim = Color(0xFF000000)
|
||||
|
||||
internal val md_theme_dark_primary = Color(0xFF55D6F4)
|
||||
internal val md_theme_dark_onPrimary = Color(0xFF003640)
|
||||
internal val md_theme_dark_primaryContainer = Color(0xFF004E5C)
|
||||
internal val md_theme_dark_onPrimaryContainer = Color(0xFFABEDFF)
|
||||
internal val md_theme_dark_secondary = Color(0xFF4CD9E2)
|
||||
internal val md_theme_dark_onSecondary = Color(0xFF00373A)
|
||||
internal val md_theme_dark_secondaryContainer = Color(0xFF004F53)
|
||||
internal val md_theme_dark_onSecondaryContainer = Color(0xFF6FF6FE)
|
||||
internal val md_theme_dark_tertiary = Color(0xFFFFB77C)
|
||||
internal val md_theme_dark_onTertiary = Color(0xFF4D2700)
|
||||
internal val md_theme_dark_tertiaryContainer = Color(0xFF6D3900)
|
||||
internal val md_theme_dark_onTertiaryContainer = Color(0xFFFFDCC2)
|
||||
internal val md_theme_dark_error = Color(0xFFFFB4AB)
|
||||
internal val md_theme_dark_errorContainer = Color(0xFF93000A)
|
||||
internal val md_theme_dark_onError = Color(0xFF690005)
|
||||
internal val md_theme_dark_onErrorContainer = Color(0xFFFFDAD6)
|
||||
internal val md_theme_dark_background = Color(0xFF221B00)
|
||||
internal val md_theme_dark_onBackground = Color(0xFFFFE264)
|
||||
internal val md_theme_dark_surface = Color(0xFF221B00)
|
||||
internal val md_theme_dark_onSurface = Color(0xFFFFE264)
|
||||
internal val md_theme_dark_surfaceVariant = Color(0xFF3F484B)
|
||||
internal val md_theme_dark_onSurfaceVariant = Color(0xFFBFC8CB)
|
||||
internal val md_theme_dark_outline = Color(0xFF899295)
|
||||
internal val md_theme_dark_inverseOnSurface = Color(0xFF221B00)
|
||||
internal val md_theme_dark_inverseSurface = Color(0xFFFFE264)
|
||||
internal val md_theme_dark_inversePrimary = Color(0xFF00687A)
|
||||
internal val md_theme_dark_shadow = Color(0xFF000000)
|
||||
internal val md_theme_dark_surfaceTint = Color(0xFF55D6F4)
|
||||
internal val md_theme_dark_outlineVariant = Color(0xFF3F484B)
|
||||
internal val md_theme_dark_scrim = Color(0xFF000000)
|
||||
|
||||
|
||||
internal val seed = Color(0xFF2C3639)
|
||||
@@ -0,0 +1,31 @@
|
||||
package dev.meloda.overseerr.theme
|
||||
|
||||
import androidx.compose.foundation.isSystemInDarkTheme
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Surface
|
||||
import androidx.compose.material3.darkColorScheme
|
||||
import androidx.compose.material3.lightColorScheme
|
||||
import androidx.compose.runtime.*
|
||||
|
||||
internal val LocalThemeIsDark = compositionLocalOf { mutableStateOf(true) }
|
||||
|
||||
@Composable
|
||||
internal fun AppTheme(
|
||||
content: @Composable () -> Unit
|
||||
) {
|
||||
val systemIsDark = isSystemInDarkTheme()
|
||||
val isDarkState = remember { mutableStateOf(systemIsDark) }
|
||||
CompositionLocalProvider(
|
||||
LocalThemeIsDark provides isDarkState
|
||||
) {
|
||||
val isDark by isDarkState
|
||||
SystemAppearance(!isDark)
|
||||
MaterialTheme(
|
||||
colorScheme = if (isDark) darkColorScheme() else lightColorScheme(),
|
||||
content = { Surface(content = content) }
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
internal expect fun SystemAppearance(isDark: Boolean)
|
||||
Reference in New Issue
Block a user