Initial commit

This commit is contained in:
2024-08-03 21:18:19 +03:00
commit ddca42e38e
37 changed files with 2170 additions and 0 deletions
@@ -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)