chore: scaffold KMP (wizard JetBrains) avec cible jvm et wiring filesDirPath
This commit is contained in:
68 files changed
+1417
No files matched your search
@@ -0,0 +1,62 @@
|
||||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||
import org.gradle.kotlin.dsl.withType
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
|
||||
|
||||
plugins {
|
||||
alias(libs.plugins.kotlin.multiplatform)
|
||||
alias(libs.plugins.android.kmp.library)
|
||||
alias(libs.plugins.compose.compiler)
|
||||
alias(libs.plugins.compose.multiplatform)
|
||||
alias(libs.plugins.kotlinx.serialization)
|
||||
}
|
||||
|
||||
kotlin {
|
||||
android {
|
||||
namespace = "com.livrets"
|
||||
compileSdk = 37
|
||||
minSdk = 23
|
||||
androidResources.enable = true
|
||||
compilerOptions { jvmTarget = JvmTarget.JVM_17 }
|
||||
}
|
||||
|
||||
jvm()
|
||||
|
||||
iosArm64()
|
||||
iosSimulatorArm64()
|
||||
|
||||
sourceSets {
|
||||
commonMain.dependencies {
|
||||
api(libs.compose.runtime)
|
||||
api(libs.compose.ui)
|
||||
api(libs.compose.foundation)
|
||||
api(libs.compose.ui.tooling.preview)
|
||||
api(libs.compose.material3)
|
||||
implementation(libs.kotlinx.datetime)
|
||||
implementation(libs.kotlinx.serialization.json)
|
||||
implementation(libs.kotlinx.coroutines.core)
|
||||
implementation(libs.okio)
|
||||
}
|
||||
|
||||
commonTest.dependencies {
|
||||
implementation(kotlin("test"))
|
||||
implementation(libs.kotlinx.coroutines.test)
|
||||
implementation(libs.okio.fakefilesystem)
|
||||
}
|
||||
}
|
||||
|
||||
targets
|
||||
.withType<KotlinNativeTarget>()
|
||||
.matching { it.konanTarget.family.isAppleFamily }
|
||||
.configureEach {
|
||||
binaries {
|
||||
framework {
|
||||
baseName = "SharedUI"
|
||||
isStatic = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
androidRuntimeClasspath(libs.compose.ui.tooling)
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.livrets
|
||||
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.WindowInsets
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.safeDrawing
|
||||
import androidx.compose.foundation.layout.windowInsetsPadding
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import com.livrets.theme.AppTheme
|
||||
|
||||
@Composable
|
||||
fun App(
|
||||
filesDirPath: String,
|
||||
onThemeChanged: @Composable (isDark: Boolean) -> Unit = {},
|
||||
) = AppTheme(onThemeChanged) {
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.windowInsetsPadding(WindowInsets.safeDrawing),
|
||||
contentAlignment = Alignment.Center,
|
||||
) {
|
||||
Text("Livrets")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
package com.livrets.theme
|
||||
|
||||
import androidx.compose.ui.graphics.Color
|
||||
|
||||
//generated by https://materialkolor.com
|
||||
//Color palette was taken here: https://coolors.co/palette/e63946-f1faee-a8dadc-457b9d-1d3557
|
||||
|
||||
internal val Seed = Color(0xFF1D3557)
|
||||
|
||||
internal val PrimaryLight = Color(0xFF485F84)
|
||||
internal val OnPrimaryLight = Color(0xFFFFFFFF)
|
||||
internal val PrimaryContainerLight = Color(0xFFD5E3FF)
|
||||
internal val OnPrimaryContainerLight = Color(0xFF30476A)
|
||||
internal val SecondaryLight = Color(0xFF2B6485)
|
||||
internal val OnSecondaryLight = Color(0xFFFFFFFF)
|
||||
internal val SecondaryContainerLight = Color(0xFFC7E7FF)
|
||||
internal val OnSecondaryContainerLight = Color(0xFF064C6B)
|
||||
internal val TertiaryLight = Color(0xFF356668)
|
||||
internal val OnTertiaryLight = Color(0xFFFFFFFF)
|
||||
internal val TertiaryContainerLight = Color(0xFFB9ECEE)
|
||||
internal val OnTertiaryContainerLight = Color(0xFF1A4E50)
|
||||
internal val ErrorLight = Color(0xFFBB152C)
|
||||
internal val OnErrorLight = Color(0xFFFFFFFF)
|
||||
internal val ErrorContainerLight = Color(0xFFFFDAD8)
|
||||
internal val OnErrorContainerLight = Color(0xFF410007)
|
||||
internal val BackgroundLight = Color(0xFFF9F9F9)
|
||||
internal val OnBackgroundLight = Color(0xFF1A1C1C)
|
||||
internal val SurfaceLight = Color(0xFFF9F9F9)
|
||||
internal val OnSurfaceLight = Color(0xFF1A1C1C)
|
||||
internal val SurfaceVariantLight = Color(0xFFDCE5D9)
|
||||
internal val OnSurfaceVariantLight = Color(0xFF404941)
|
||||
internal val OutlineLight = Color(0xFF717970)
|
||||
internal val OutlineVariantLight = Color(0xFFC0C9BE)
|
||||
internal val ScrimLight = Color(0xFF000000)
|
||||
internal val InverseSurfaceLight = Color(0xFF2F3131)
|
||||
internal val InverseOnSurfaceLight = Color(0xFFF0F1F1)
|
||||
internal val InversePrimaryLight = Color(0xFFB0C7F1)
|
||||
internal val SurfaceDimLight = Color(0xFFDADADA)
|
||||
internal val SurfaceBrightLight = Color(0xFFF9F9F9)
|
||||
internal val SurfaceContainerLowestLight = Color(0xFFFFFFFF)
|
||||
internal val SurfaceContainerLowLight = Color(0xFFF3F3F4)
|
||||
internal val SurfaceContainerLight = Color(0xFFEEEEEE)
|
||||
internal val SurfaceContainerHighLight = Color(0xFFE8E8E8)
|
||||
internal val SurfaceContainerHighestLight = Color(0xFFE2E2E2)
|
||||
|
||||
internal val PrimaryDark = Color(0xFFB0C7F1)
|
||||
internal val OnPrimaryDark = Color(0xFF183153)
|
||||
internal val PrimaryContainerDark = Color(0xFF30476A)
|
||||
internal val OnPrimaryContainerDark = Color(0xFFD5E3FF)
|
||||
internal val SecondaryDark = Color(0xFF98CDF2)
|
||||
internal val OnSecondaryDark = Color(0xFF00344C)
|
||||
internal val SecondaryContainerDark = Color(0xFF064C6B)
|
||||
internal val OnSecondaryContainerDark = Color(0xFFC7E7FF)
|
||||
internal val TertiaryDark = Color(0xFF9ECFD1)
|
||||
internal val OnTertiaryDark = Color(0xFF003739)
|
||||
internal val TertiaryContainerDark = Color(0xFF1A4E50)
|
||||
internal val OnTertiaryContainerDark = Color(0xFFB9ECEE)
|
||||
internal val ErrorDark = Color(0xFFFFB3B1)
|
||||
internal val OnErrorDark = Color(0xFF680011)
|
||||
internal val ErrorContainerDark = Color(0xFF92001C)
|
||||
internal val OnErrorContainerDark = Color(0xFFFFDAD8)
|
||||
internal val BackgroundDark = Color(0xFF121414)
|
||||
internal val OnBackgroundDark = Color(0xFFE2E2E2)
|
||||
internal val SurfaceDark = Color(0xFF121414)
|
||||
internal val OnSurfaceDark = Color(0xFFE2E2E2)
|
||||
internal val SurfaceVariantDark = Color(0xFF404941)
|
||||
internal val OnSurfaceVariantDark = Color(0xFFC0C9BE)
|
||||
internal val OutlineDark = Color(0xFF8A9389)
|
||||
internal val OutlineVariantDark = Color(0xFF404941)
|
||||
internal val ScrimDark = Color(0xFF000000)
|
||||
internal val InverseSurfaceDark = Color(0xFFE2E2E2)
|
||||
internal val InverseOnSurfaceDark = Color(0xFF2F3131)
|
||||
internal val InversePrimaryDark = Color(0xFF485F84)
|
||||
internal val SurfaceDimDark = Color(0xFF121414)
|
||||
internal val SurfaceBrightDark = Color(0xFF37393A)
|
||||
internal val SurfaceContainerLowestDark = Color(0xFF0C0F0F)
|
||||
internal val SurfaceContainerLowDark = Color(0xFF1A1C1C)
|
||||
internal val SurfaceContainerDark = Color(0xFF1E2020)
|
||||
internal val SurfaceContainerHighDark = Color(0xFF282A2B)
|
||||
internal val SurfaceContainerHighestDark = Color(0xFF333535)
|
||||
@@ -0,0 +1,105 @@
|
||||
package com.livrets.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.*
|
||||
|
||||
private val LightColorScheme = lightColorScheme(
|
||||
primary = PrimaryLight,
|
||||
onPrimary = OnPrimaryLight,
|
||||
primaryContainer = PrimaryContainerLight,
|
||||
onPrimaryContainer = OnPrimaryContainerLight,
|
||||
secondary = SecondaryLight,
|
||||
onSecondary = OnSecondaryLight,
|
||||
secondaryContainer = SecondaryContainerLight,
|
||||
onSecondaryContainer = OnSecondaryContainerLight,
|
||||
tertiary = TertiaryLight,
|
||||
onTertiary = OnTertiaryLight,
|
||||
tertiaryContainer = TertiaryContainerLight,
|
||||
onTertiaryContainer = OnTertiaryContainerLight,
|
||||
error = ErrorLight,
|
||||
onError = OnErrorLight,
|
||||
errorContainer = ErrorContainerLight,
|
||||
onErrorContainer = OnErrorContainerLight,
|
||||
background = BackgroundLight,
|
||||
onBackground = OnBackgroundLight,
|
||||
surface = SurfaceLight,
|
||||
onSurface = OnSurfaceLight,
|
||||
surfaceVariant = SurfaceVariantLight,
|
||||
onSurfaceVariant = OnSurfaceVariantLight,
|
||||
outline = OutlineLight,
|
||||
outlineVariant = OutlineVariantLight,
|
||||
scrim = ScrimLight,
|
||||
inverseSurface = InverseSurfaceLight,
|
||||
inverseOnSurface = InverseOnSurfaceLight,
|
||||
inversePrimary = InversePrimaryLight,
|
||||
surfaceDim = SurfaceDimLight,
|
||||
surfaceBright = SurfaceBrightLight,
|
||||
surfaceContainerLowest = SurfaceContainerLowestLight,
|
||||
surfaceContainerLow = SurfaceContainerLowLight,
|
||||
surfaceContainer = SurfaceContainerLight,
|
||||
surfaceContainerHigh = SurfaceContainerHighLight,
|
||||
surfaceContainerHighest = SurfaceContainerHighestLight,
|
||||
)
|
||||
|
||||
private val DarkColorScheme = darkColorScheme(
|
||||
primary = PrimaryDark,
|
||||
onPrimary = OnPrimaryDark,
|
||||
primaryContainer = PrimaryContainerDark,
|
||||
onPrimaryContainer = OnPrimaryContainerDark,
|
||||
secondary = SecondaryDark,
|
||||
onSecondary = OnSecondaryDark,
|
||||
secondaryContainer = SecondaryContainerDark,
|
||||
onSecondaryContainer = OnSecondaryContainerDark,
|
||||
tertiary = TertiaryDark,
|
||||
onTertiary = OnTertiaryDark,
|
||||
tertiaryContainer = TertiaryContainerDark,
|
||||
onTertiaryContainer = OnTertiaryContainerDark,
|
||||
error = ErrorDark,
|
||||
onError = OnErrorDark,
|
||||
errorContainer = ErrorContainerDark,
|
||||
onErrorContainer = OnErrorContainerDark,
|
||||
background = BackgroundDark,
|
||||
onBackground = OnBackgroundDark,
|
||||
surface = SurfaceDark,
|
||||
onSurface = OnSurfaceDark,
|
||||
surfaceVariant = SurfaceVariantDark,
|
||||
onSurfaceVariant = OnSurfaceVariantDark,
|
||||
outline = OutlineDark,
|
||||
outlineVariant = OutlineVariantDark,
|
||||
scrim = ScrimDark,
|
||||
inverseSurface = InverseSurfaceDark,
|
||||
inverseOnSurface = InverseOnSurfaceDark,
|
||||
inversePrimary = InversePrimaryDark,
|
||||
surfaceDim = SurfaceDimDark,
|
||||
surfaceBright = SurfaceBrightDark,
|
||||
surfaceContainerLowest = SurfaceContainerLowestDark,
|
||||
surfaceContainerLow = SurfaceContainerLowDark,
|
||||
surfaceContainer = SurfaceContainerDark,
|
||||
surfaceContainerHigh = SurfaceContainerHighDark,
|
||||
surfaceContainerHighest = SurfaceContainerHighestDark,
|
||||
)
|
||||
|
||||
internal val LocalThemeIsDark = compositionLocalOf { mutableStateOf(true) }
|
||||
|
||||
@Composable
|
||||
internal fun AppTheme(
|
||||
onThemeChanged: @Composable (isDark: Boolean) -> Unit,
|
||||
content: @Composable () -> Unit
|
||||
) {
|
||||
val systemIsDark = isSystemInDarkTheme()
|
||||
val isDarkState = remember(systemIsDark) { mutableStateOf(systemIsDark) }
|
||||
CompositionLocalProvider(
|
||||
LocalThemeIsDark provides isDarkState
|
||||
) {
|
||||
val isDark by isDarkState
|
||||
onThemeChanged(!isDark)
|
||||
MaterialTheme(
|
||||
colorScheme = if (isDark) DarkColorScheme else LightColorScheme,
|
||||
content = { Surface(content = content) }
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.ui.window.ComposeUIViewController
|
||||
import com.livrets.App
|
||||
import platform.Foundation.NSHomeDirectory
|
||||
import platform.UIKit.UIApplication
|
||||
import platform.UIKit.UIStatusBarStyleDarkContent
|
||||
import platform.UIKit.UIStatusBarStyleLightContent
|
||||
import platform.UIKit.UIViewController
|
||||
import platform.UIKit.setStatusBarStyle
|
||||
|
||||
fun MainViewController(): UIViewController = ComposeUIViewController {
|
||||
App(filesDirPath = NSHomeDirectory() + "/Documents", onThemeChanged = { ThemeChanged(it) })
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun ThemeChanged(isDark: Boolean) {
|
||||
LaunchedEffect(isDark) {
|
||||
UIApplication.sharedApplication.setStatusBarStyle(
|
||||
if (isDark) UIStatusBarStyleDarkContent else UIStatusBarStyleLightContent
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user