Browse Source

added example

pull/3193/head
Adrian Witaszak 2 years ago
parent
commit
2943aeaf19
  1. 22
      examples/compose_sharedui_kmm/README.md
  2. 7
      examples/compose_sharedui_kmm/build.gradle.kts
  3. 2
      examples/compose_sharedui_kmm/feature/counter/.gitignore
  4. 48
      examples/compose_sharedui_kmm/feature/counter/build.gradle.kts
  5. 16
      examples/compose_sharedui_kmm/feature/counter/src/commonMain/kotlin/com/ballast/counter/CounterContract.kt
  6. 13
      examples/compose_sharedui_kmm/feature/counter/src/commonMain/kotlin/com/ballast/counter/CounterEventHandler.kt
  7. 14
      examples/compose_sharedui_kmm/feature/counter/src/commonMain/kotlin/com/ballast/counter/CounterInputHandler.kt
  8. 31
      examples/compose_sharedui_kmm/feature/counter/src/commonMain/kotlin/com/ballast/counter/CounterViewModel.kt
  9. 2
      examples/compose_sharedui_kmm/feature/home/.gitignore
  10. 48
      examples/compose_sharedui_kmm/feature/home/build.gradle.kts
  11. 14
      examples/compose_sharedui_kmm/feature/home/src/commonMain/kotlin/com/ballast/home/HomeContract.kt
  12. 15
      examples/compose_sharedui_kmm/feature/home/src/commonMain/kotlin/com/ballast/home/HomeInputHandler.kt
  13. 32
      examples/compose_sharedui_kmm/feature/home/src/commonMain/kotlin/com/ballast/home/HomeViewModel.kt
  14. 2
      examples/compose_sharedui_kmm/feature/router/.gitignore
  15. 49
      examples/compose_sharedui_kmm/feature/router/build.gradle.kts
  16. 17
      examples/compose_sharedui_kmm/feature/router/src/commonMain/kotlin/com/ballast/router/RouterEventHandler.kt
  17. 19
      examples/compose_sharedui_kmm/feature/router/src/commonMain/kotlin/com/ballast/router/RouterScreen.kt
  18. 32
      examples/compose_sharedui_kmm/feature/router/src/commonMain/kotlin/com/ballast/router/RouterViewModel.kt
  19. 17
      examples/compose_sharedui_kmm/gradle.properties
  20. 26
      examples/compose_sharedui_kmm/gradle/libs.versions.toml
  21. BIN
      examples/compose_sharedui_kmm/gradle/wrapper/gradle-wrapper.jar
  22. 6
      examples/compose_sharedui_kmm/gradle/wrapper/gradle-wrapper.properties
  23. 185
      examples/compose_sharedui_kmm/gradlew
  24. 8
      examples/compose_sharedui_kmm/iosApp/Podfile
  25. 16
      examples/compose_sharedui_kmm/iosApp/Podfile.lock
  26. 28
      examples/compose_sharedui_kmm/iosApp/Pods/Local Podspecs/shared.podspec.json
  27. 16
      examples/compose_sharedui_kmm/iosApp/Pods/Manifest.lock
  28. 548
      examples/compose_sharedui_kmm/iosApp/Pods/Pods.xcodeproj/project.pbxproj
  29. 58
      examples/compose_sharedui_kmm/iosApp/Pods/Pods.xcodeproj/xcuserdata/adrianwitaszak.xcuserdatad/xcschemes/Pods-iosApp.xcscheme
  30. 58
      examples/compose_sharedui_kmm/iosApp/Pods/Pods.xcodeproj/xcuserdata/adrianwitaszak.xcuserdatad/xcschemes/shared.xcscheme
  31. 25
      examples/compose_sharedui_kmm/iosApp/Pods/Pods.xcodeproj/xcuserdata/adrianwitaszak.xcuserdatad/xcschemes/xcschememanagement.plist
  32. 26
      examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-Info.plist
  33. 3
      examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-acknowledgements.markdown
  34. 29
      examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-acknowledgements.plist
  35. 5
      examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-dummy.m
  36. 16
      examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-umbrella.h
  37. 11
      examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.debug.xcconfig
  38. 6
      examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.modulemap
  39. 11
      examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.release.xcconfig
  40. 15
      examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/shared/shared.debug.xcconfig
  41. 15
      examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/shared/shared.release.xcconfig
  42. 423
      examples/compose_sharedui_kmm/iosApp/iosApp.xcodeproj/project.pbxproj
  43. 8
      examples/compose_sharedui_kmm/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  44. BIN
      examples/compose_sharedui_kmm/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/adrianwitaszak.xcuserdatad/UserInterfaceState.xcuserstate
  45. 14
      examples/compose_sharedui_kmm/iosApp/iosApp.xcodeproj/xcuserdata/adrianwitaszak.xcuserdatad/xcschemes/xcschememanagement.plist
  46. 10
      examples/compose_sharedui_kmm/iosApp/iosApp.xcworkspace/contents.xcworkspacedata
  47. 8
      examples/compose_sharedui_kmm/iosApp/iosApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  48. BIN
      examples/compose_sharedui_kmm/iosApp/iosApp.xcworkspace/xcuserdata/adrianwitaszak.xcuserdatad/UserInterfaceState.xcuserstate
  49. 11
      examples/compose_sharedui_kmm/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json
  50. 98
      examples/compose_sharedui_kmm/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json
  51. 6
      examples/compose_sharedui_kmm/iosApp/iosApp/Assets.xcassets/Contents.json
  52. 16
      examples/compose_sharedui_kmm/iosApp/iosApp/ContentView.swift
  53. 48
      examples/compose_sharedui_kmm/iosApp/iosApp/Info.plist
  54. 6
      examples/compose_sharedui_kmm/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json
  55. 25
      examples/compose_sharedui_kmm/iosApp/iosApp/iOSApp.swift
  56. 3045
      examples/compose_sharedui_kmm/kotlin-js-store/yarn.lock
  57. 8
      examples/compose_sharedui_kmm/local.properties
  58. BIN
      examples/compose_sharedui_kmm/screenshots/android.png
  59. BIN
      examples/compose_sharedui_kmm/screenshots/desktop.png
  60. BIN
      examples/compose_sharedui_kmm/screenshots/ios.png
  61. BIN
      examples/compose_sharedui_kmm/screenshots/web.png
  62. 28
      examples/compose_sharedui_kmm/settings.gradle.kts
  63. 2
      examples/compose_sharedui_kmm/shared/.gitignore
  64. 101
      examples/compose_sharedui_kmm/shared/build.gradle.kts
  65. 39
      examples/compose_sharedui_kmm/shared/shared.podspec
  66. 9
      examples/compose_sharedui_kmm/shared/src/androidMain/kotlin/com/ballast/sharedui/AndroidRootContent.kt
  67. 70
      examples/compose_sharedui_kmm/shared/src/commonMain/kotlin/com/ballast/sharedui/content/CounterContent.kt
  68. 77
      examples/compose_sharedui_kmm/shared/src/commonMain/kotlin/com/ballast/sharedui/content/HomeContent.kt
  69. 29
      examples/compose_sharedui_kmm/shared/src/commonMain/kotlin/com/ballast/sharedui/content/RootContent.kt
  70. 43
      examples/compose_sharedui_kmm/shared/src/commonMain/kotlin/com/ballast/sharedui/content/RouterContent.kt
  71. 55
      examples/compose_sharedui_kmm/shared/src/commonMain/kotlin/com/ballast/sharedui/theme/MyApplicationTheme.kt
  72. 18
      examples/compose_sharedui_kmm/shared/src/desktopMain/kotlin/Main.kt
  73. 9
      examples/compose_sharedui_kmm/shared/src/desktopMain/kotlin/com/ballast/sharedui/DesktopRootContent.kt
  74. 10
      examples/compose_sharedui_kmm/shared/src/iosMain/kotlin/com/ballast/sharedui/IOSRootContent.kt
  75. 4
      examples/compose_sharedui_kmm/web/.gitignore
  76. 13
      examples/compose_sharedui_kmm/web/.kobweb/conf.yaml
  77. 53
      examples/compose_sharedui_kmm/web/README.md
  78. 42
      examples/compose_sharedui_kmm/web/build.gradle.kts
  79. 44
      examples/compose_sharedui_kmm/web/src/jsMain/kotlin/com/adrianwitaszak/ballast/web/BallastApp.kt
  80. 3
      examples/compose_sharedui_kmm/web/src/jsMain/kotlin/com/adrianwitaszak/ballast/web/components/README.md
  81. 38
      examples/compose_sharedui_kmm/web/src/jsMain/kotlin/com/adrianwitaszak/ballast/web/components/widgets/Card.kt
  82. 75
      examples/compose_sharedui_kmm/web/src/jsMain/kotlin/com/adrianwitaszak/ballast/web/components/widgets/EditableTextView.kt
  83. 67
      examples/compose_sharedui_kmm/web/src/jsMain/kotlin/com/adrianwitaszak/ballast/web/pages/CounterContent.kt
  84. 61
      examples/compose_sharedui_kmm/web/src/jsMain/kotlin/com/adrianwitaszak/ballast/web/pages/HomeContent.kt
  85. 45
      examples/compose_sharedui_kmm/web/src/jsMain/kotlin/com/adrianwitaszak/ballast/web/pages/Index.kt
  86. 3
      examples/compose_sharedui_kmm/web/src/jsMain/kotlin/com/adrianwitaszak/ballast/web/pages/README.md
  87. BIN
      examples/compose_sharedui_kmm/web/src/jsMain/resources/public/favicon.ico

22
examples/compose_sharedui_kmm/README.md

@ -0,0 +1,22 @@
This is an example of a Kotlin Multiplatform project that targets Android, iOS, Web, and Desktop platforms. The project follows a modular approach, with each feature being represented as a Ballast component. The Compose UI code is located in the shared module. For the web UI, you can find it in the web module, which is built using [Kobweb](https://github.com/varabyte/kobweb).
## Run projects:
### Android
- Run `androidsApp` from the _Run Configuration_
### iOS
- Run `iosApp` from the _Run Configuration_
- or open `iosApp/iosApp.xcodeproj` in Xcode and Run
### Web
- Run `./gradlew :web:kobwebStart -t`
### Desktop
- Run `./gradlew :shared:run`
## Screenshots
![android](./screenshots/android.png)
![ios](./screenshots/ios.png)
![web](./screenshots/web.png)
![desktop](./screenshots/desktop.png)

7
examples/compose_sharedui_kmm/build.gradle.kts

@ -0,0 +1,7 @@
plugins {
id("com.android.application").version("8.0.1").apply(false)
id("com.android.library").version("8.0.1").apply(false)
kotlin("android").version("1.8.20").apply(false)
kotlin("multiplatform").version("1.8.20").apply(false)
id("org.jetbrains.compose") version "1.4.0" apply false
}

2
examples/compose_sharedui_kmm/feature/counter/.gitignore vendored

@ -0,0 +1,2 @@
/build
.gradle

48
examples/compose_sharedui_kmm/feature/counter/build.gradle.kts

@ -0,0 +1,48 @@
plugins {
kotlin("multiplatform")
id("com.android.library")
}
kotlin {
android()
ios()
iosSimulatorArm64()
jvm("desktop") {
compilations.all {
kotlinOptions.jvmTarget = "11"
}
}
js(IR) {
moduleName = project.name
browser {
commonWebpackConfig {
outputFileName = "$moduleName.js"
}
}
binaries.executable()
}
sourceSets {
val commonMain by getting {
dependencies {
implementation(libs.ballast.core)
}
}
}
}
android {
namespace = "com.adrianwitaszak.ballastsharedui.${project.name}"
compileSdk = 33
defaultConfig {
minSdk = 24
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}
java {
toolchain.languageVersion.set(JavaLanguageVersion.of(11))
}

16
examples/compose_sharedui_kmm/feature/counter/src/commonMain/kotlin/com/ballast/counter/CounterContract.kt

@ -0,0 +1,16 @@
package com.ballast.sharedui.root
object CounterContract {
data class State(
val count: Int = 0,
val timerCount: Int = 0
)
sealed interface Inputs {
data class Increment(val amount: Int = 1) : Inputs
data class Decrement(val amount: Int = 1) : Inputs
}
sealed interface Events {
}
}

13
examples/compose_sharedui_kmm/feature/counter/src/commonMain/kotlin/com/ballast/counter/CounterEventHandler.kt

@ -0,0 +1,13 @@
package com.ballast.sharedui.root
import com.copperleaf.ballast.EventHandler
import com.copperleaf.ballast.EventHandlerScope
class CounterEventHandler :
EventHandler<CounterContract.Inputs, CounterContract.Events, CounterContract.State> {
override suspend fun EventHandlerScope<CounterContract.Inputs, CounterContract.Events, CounterContract.State>.handleEvent(
event: CounterContract.Events,
) {
}
}

14
examples/compose_sharedui_kmm/feature/counter/src/commonMain/kotlin/com/ballast/counter/CounterInputHandler.kt

@ -0,0 +1,14 @@
package com.ballast.sharedui.root
import com.copperleaf.ballast.InputHandler
import com.copperleaf.ballast.InputHandlerScope
class CounterInputHandler :
InputHandler<CounterContract.Inputs, CounterContract.Events, CounterContract.State> {
override suspend fun InputHandlerScope<CounterContract.Inputs, CounterContract.Events, CounterContract.State>.handleInput(
input: CounterContract.Inputs,
) = when (input) {
is CounterContract.Inputs.Increment -> updateState { it.copy(count = it.count + input.amount) }
is CounterContract.Inputs.Decrement -> updateState { it.copy(count = it.count - input.amount) }
}
}

31
examples/compose_sharedui_kmm/feature/counter/src/commonMain/kotlin/com/ballast/counter/CounterViewModel.kt

@ -0,0 +1,31 @@
package com.ballast.sharedui.root
import com.copperleaf.ballast.BallastViewModelConfiguration
import com.copperleaf.ballast.build
import com.copperleaf.ballast.core.BasicViewModel
import com.copperleaf.ballast.core.LoggingInterceptor
import com.copperleaf.ballast.core.PrintlnLogger
import com.copperleaf.ballast.plusAssign
import com.copperleaf.ballast.withViewModel
import kotlinx.coroutines.CoroutineScope
class CounterViewModel(
viewModelCoroutineScope: CoroutineScope,
) : BasicViewModel<
CounterContract.Inputs,
CounterContract.Events,
CounterContract.State>(
config = BallastViewModelConfiguration.Builder()
.apply {
this += LoggingInterceptor()
logger = { PrintlnLogger() }
}
.withViewModel(
initialState = CounterContract.State(),
inputHandler = CounterInputHandler(),
name = "LoginScreen",
)
.build(),
eventHandler = CounterEventHandler(),
coroutineScope = viewModelCoroutineScope,
)

2
examples/compose_sharedui_kmm/feature/home/.gitignore vendored

@ -0,0 +1,2 @@
/build
.gradle

48
examples/compose_sharedui_kmm/feature/home/build.gradle.kts

@ -0,0 +1,48 @@
plugins {
kotlin("multiplatform")
id("com.android.library")
}
kotlin {
android()
ios()
iosSimulatorArm64()
jvm("desktop") {
compilations.all {
kotlinOptions.jvmTarget = "11"
}
}
js(IR) {
moduleName = project.name
browser {
commonWebpackConfig {
outputFileName = "$moduleName.js"
}
}
binaries.executable()
}
sourceSets {
val commonMain by getting {
dependencies {
implementation(libs.ballast.core)
}
}
}
}
android {
namespace = "com.adrianwitaszak.ballastsharedui.${project.name}"
compileSdk = 33
defaultConfig {
minSdk = 24
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}
java {
toolchain.languageVersion.set(JavaLanguageVersion.of(11))
}

14
examples/compose_sharedui_kmm/feature/home/src/commonMain/kotlin/com/ballast/home/HomeContract.kt

@ -0,0 +1,14 @@
package com.ballast.sharedui.root
object HomeContract {
data class State(
val name: String = "",
)
sealed interface Inputs {
data class OnNameChanged(val newName: String) : Inputs
}
sealed interface Events {
}
}

15
examples/compose_sharedui_kmm/feature/home/src/commonMain/kotlin/com/ballast/home/HomeInputHandler.kt

@ -0,0 +1,15 @@
package com.ballast.sharedui.root
import com.copperleaf.ballast.InputHandler
import com.copperleaf.ballast.InputHandlerScope
class HomeInputHandler :
InputHandler<HomeContract.Inputs, HomeContract.Events, HomeContract.State> {
override suspend fun InputHandlerScope<HomeContract.Inputs, HomeContract.Events, HomeContract.State>.handleInput(
input: HomeContract.Inputs,
) = when (input) {
is HomeContract.Inputs.OnNameChanged -> {
updateState { it.copy(name = input.newName) }
}
}
}

32
examples/compose_sharedui_kmm/feature/home/src/commonMain/kotlin/com/ballast/home/HomeViewModel.kt

@ -0,0 +1,32 @@
package com.ballast.sharedui.root
import com.copperleaf.ballast.BallastViewModelConfiguration
import com.copperleaf.ballast.build
import com.copperleaf.ballast.core.BasicViewModel
import com.copperleaf.ballast.core.LoggingInterceptor
import com.copperleaf.ballast.core.PrintlnLogger
import com.copperleaf.ballast.eventHandler
import com.copperleaf.ballast.plusAssign
import com.copperleaf.ballast.withViewModel
import kotlinx.coroutines.CoroutineScope
class HomeViewModel(
viewModelCoroutineScope: CoroutineScope,
) : BasicViewModel<
HomeContract.Inputs,
HomeContract.Events,
HomeContract.State>(
config = BallastViewModelConfiguration.Builder()
.apply {
this += LoggingInterceptor()
logger = { PrintlnLogger() }
}
.withViewModel(
initialState = HomeContract.State(),
inputHandler = HomeInputHandler(),
name = "LoginScreen",
)
.build(),
eventHandler = eventHandler { },
coroutineScope = viewModelCoroutineScope,
)

2
examples/compose_sharedui_kmm/feature/router/.gitignore vendored

@ -0,0 +1,2 @@
/build
.gradle

49
examples/compose_sharedui_kmm/feature/router/build.gradle.kts

@ -0,0 +1,49 @@
plugins {
kotlin("multiplatform")
id("com.android.library")
}
kotlin {
android()
ios()
iosSimulatorArm64()
jvm("desktop") {
compilations.all {
kotlinOptions.jvmTarget = "11"
}
}
js(IR) {
moduleName = project.name
browser {
commonWebpackConfig {
outputFileName = "$moduleName.js"
}
}
binaries.executable()
}
sourceSets {
val commonMain by getting {
dependencies {
implementation(libs.ballast.core)
implementation(libs.ballast.navigation)
}
}
}
}
android {
namespace = "com.adrianwitaszak.ballastsharedui.${project.name}"
compileSdk = 33
defaultConfig {
minSdk = 24
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}
java {
toolchain.languageVersion.set(JavaLanguageVersion.of(11))
}

17
examples/compose_sharedui_kmm/feature/router/src/commonMain/kotlin/com/ballast/router/RouterEventHandler.kt

@ -0,0 +1,17 @@
package com.ballast.shoppe.feature.router
import com.copperleaf.ballast.EventHandler
import com.copperleaf.ballast.EventHandlerScope
import com.copperleaf.ballast.navigation.routing.RouterContract
internal class RouterEventHandler :
EventHandler<RouterContract.Inputs<RouterScreen>, RouterContract.Events<RouterScreen>, RouterContract.State<RouterScreen>> {
override suspend fun EventHandlerScope<RouterContract.Inputs<RouterScreen>, RouterContract.Events<RouterScreen>, RouterContract.State<RouterScreen>>.handleEvent(
event: RouterContract.Events<RouterScreen>,
) {
when {
event is RouterContract.Events.BackstackEmptied ->
postInput(RouterContract.Inputs.GoToDestination(RouterScreen.Home.matcher.routeFormat))
}
}
}

19
examples/compose_sharedui_kmm/feature/router/src/commonMain/kotlin/com/ballast/router/RouterScreen.kt

@ -0,0 +1,19 @@
package com.ballast.shoppe.feature.router
import com.copperleaf.ballast.navigation.routing.Route
import com.copperleaf.ballast.navigation.routing.RouteAnnotation
import com.copperleaf.ballast.navigation.routing.RouteMatcher
private const val HOME = "/home"
private const val COUNTER = "/counter"
enum class RouterScreen(
routeFormat: String,
override val annotations: Set<RouteAnnotation> = emptySet(),
) : Route {
Home(HOME),
Counter(COUNTER)
;
override val matcher: RouteMatcher = RouteMatcher.create(routeFormat)
}

32
examples/compose_sharedui_kmm/feature/router/src/commonMain/kotlin/com/ballast/router/RouterViewModel.kt

@ -0,0 +1,32 @@
package com.ballast.shoppe.feature.router
import com.copperleaf.ballast.BallastViewModelConfiguration
import com.copperleaf.ballast.ExperimentalBallastApi
import com.copperleaf.ballast.build
import com.copperleaf.ballast.core.LoggingInterceptor
import com.copperleaf.ballast.core.PrintlnLogger
import com.copperleaf.ballast.navigation.routing.RoutingTable
import com.copperleaf.ballast.navigation.routing.fromEnum
import com.copperleaf.ballast.navigation.vm.BasicRouter
import com.copperleaf.ballast.navigation.vm.withRouter
import com.copperleaf.ballast.plusAssign
import kotlinx.coroutines.CoroutineScope
@OptIn(ExperimentalBallastApi::class)
class RouterViewModel(
viewModelScope: CoroutineScope,
initialRoute: RouterScreen,
) : BasicRouter<RouterScreen>(
config = BallastViewModelConfiguration.Builder()
.apply {
this += LoggingInterceptor()
logger = ::PrintlnLogger
}
.withRouter(
routingTable = RoutingTable.fromEnum(RouterScreen.values()),
initialRoute = initialRoute
)
.build(),
eventHandler = RouterEventHandler(),
coroutineScope = viewModelScope
)

17
examples/compose_sharedui_kmm/gradle.properties

@ -0,0 +1,17 @@
#Gradle
org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 -Dkotlin.daemon.jvm.options\="-Xmx2048M"
#Kotlin
kotlin.code.style=official
#Android
android.useAndroidX=true
android.nonTransitiveRClass=true
#MPP
kotlin.mpp.enableCInteropCommonization=true
kotlin.native.cacheKind=none
kotlin.native.useEmbeddableCompilerJar=true
kotlin.mpp.androidSourceSetLayoutVersion=2
compose.desktop.verbose=true
org.jetbrains.compose.experimental.jscanvas.enabled=true
org.jetbrains.compose.experimental.macos.enabled=true
org.jetbrains.compose.experimental.uikit.enabled=true

26
examples/compose_sharedui_kmm/gradle/libs.versions.toml

@ -0,0 +1,26 @@
[versions]
activityCompose = "1.7.1"
agp = "8.0.1"
androidxCore = "1.10.1"
androidxMaterial = "1.9.0"
ballast = "3.0.1"
composeMultiplatform = "1.4.0"
jetpackCompose = "1.3.2"
kobweb = "0.13.2"
kotlin = "1.8.20" # Max Kotlin version supported by Compose-Multiplatform 1.4.0 is Kotlin 1.8.20
[libraries]
androidx-core = { module = "androidx.core:core-ktx", version.ref = "androidxCore" }
androidx-material = { module = "com.google.android.material:material", version.ref = "androidxMaterial" }
ballast-core = { module = "io.github.copper-leaf:ballast-core", version.ref = "ballast" }
ballast-navigation = { module = "io.github.copper-leaf:ballast-navigation", version.ref = "ballast" }
ballast-savedState = { module = "io.github.copper-leaf:ballast-saved-state", version.ref = "ballast" }
jetpackCompose-activity = { module = "androidx.activity:activity-compose", version.ref = "activityCompose" }
kobweb-core = { module = "com.varabyte.kobweb:kobweb-core", version.ref = "kobweb" }
kobweb-silk = { module = "com.varabyte.kobweb:kobweb-silk", version.ref = "kobweb" }
[plugins]
composeMultiplatform = { id = "org.jetbrains.compose", version.ref = "composeMultiplatform" }

BIN
examples/compose_sharedui_kmm/gradle/wrapper/gradle-wrapper.jar vendored

Binary file not shown.

6
examples/compose_sharedui_kmm/gradle/wrapper/gradle-wrapper.properties vendored

@ -0,0 +1,6 @@
#Sun May 21 15:36:54 BST 2023
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

185
examples/compose_sharedui_kmm/gradlew vendored

@ -0,0 +1,185 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# 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
#
# https://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.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"

8
examples/compose_sharedui_kmm/iosApp/Podfile

@ -0,0 +1,8 @@
# Uncomment the next line to define a global platform for your project
# platform :ios, '11.0'
target 'iosApp' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
pod 'shared', :path => '../shared'
end

16
examples/compose_sharedui_kmm/iosApp/Podfile.lock

@ -0,0 +1,16 @@
PODS:
- shared (1.0.0)
DEPENDENCIES:
- shared (from `../shared`)
EXTERNAL SOURCES:
shared:
:path: "../shared"
SPEC CHECKSUMS:
shared: c9483bd6363e51b30c0c29e0b11ed85cdaf2faf3
PODFILE CHECKSUM: 97c32ffa6c179d80a75e56c799153bdc084ea434
COCOAPODS: 1.11.3

28
examples/compose_sharedui_kmm/iosApp/Pods/Local Podspecs/shared.podspec.json generated

@ -0,0 +1,28 @@
{
"name": "shared",
"version": "1.0.0",
"homepage": "http://",
"source": {
"http": ""
},
"authors": "",
"license": "",
"summary": "Shared code for Ballast app",
"vendored_frameworks": "build/cocoapods/framework/shared.framework",
"libraries": "c++",
"platforms": {
"ios": "11"
},
"pod_target_xcconfig": {
"KOTLIN_PROJECT_PATH": ":shared",
"PRODUCT_MODULE_NAME": "shared"
},
"script_phases": [
{
"name": "Build shared",
"execution_position": "before_compile",
"shell_path": "/bin/sh",
"script": " if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\"\"\n exit 0\n fi\n set -ev\n REPO_ROOT=\"$PODS_TARGET_SRCROOT\"\n \"$REPO_ROOT/../gradlew\" -p \"$REPO_ROOT\" $KOTLIN_PROJECT_PATH:syncFramework -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME -Pkotlin.native.cocoapods.archs=\"$ARCHS\" -Pkotlin.native.cocoapods.configuration=\"$CONFIGURATION\"\n"
}
]
}

16
examples/compose_sharedui_kmm/iosApp/Pods/Manifest.lock generated

@ -0,0 +1,16 @@
PODS:
- shared (1.0.0)
DEPENDENCIES:
- shared (from `../shared`)
EXTERNAL SOURCES:
shared:
:path: "../shared"
SPEC CHECKSUMS:
shared: c9483bd6363e51b30c0c29e0b11ed85cdaf2faf3
PODFILE CHECKSUM: 97c32ffa6c179d80a75e56c799153bdc084ea434
COCOAPODS: 1.11.3

548
examples/compose_sharedui_kmm/iosApp/Pods/Pods.xcodeproj/project.pbxproj generated

@ -0,0 +1,548 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objects = {
/* Begin PBXAggregateTarget section */
8777C9F6889E59EFFD631D80AEE9048B /* shared */ = {
isa = PBXAggregateTarget;
buildConfigurationList = 8349D8E2EC974421A14EF8ABFF6AD6DC /* Build configuration list for PBXAggregateTarget "shared" */;
buildPhases = (
BEA8885189D408D600647BDC228A6A20 /* [CP-User] Build shared */,
);
dependencies = (
);
name = shared;
};
/* End PBXAggregateTarget section */
/* Begin PBXBuildFile section */
648F16425FEF89525AE0325F5A984B86 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; };
8749C8E8DC500B064FA0BC7A78C38A2A /* Pods-iosApp-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A2475209BEE7612101900020629C625 /* Pods-iosApp-dummy.m */; };
8801CBFD38B946597BD07145B2EEFC9F /* Pods-iosApp-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 42DE4C0106600A5B6D599285368F3270 /* Pods-iosApp-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
C1E4F2F8101E860063100BCC8448BC3B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 8777C9F6889E59EFFD631D80AEE9048B;
remoteInfo = shared;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
0011AEE22E8296B3D9E0B0B2CDCAB2EE /* Pods-iosApp-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-iosApp-acknowledgements.plist"; sourceTree = "<group>"; };
1A2FB55B5C37861BC78ECD1420D818C3 /* Pods-iosApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-iosApp.release.xcconfig"; sourceTree = "<group>"; };
35548E3BD8DA30925E8FE97E67B84868 /* shared.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = shared.release.xcconfig; sourceTree = "<group>"; };
3A2475209BEE7612101900020629C625 /* Pods-iosApp-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-iosApp-dummy.m"; sourceTree = "<group>"; };
42DE4C0106600A5B6D599285368F3270 /* Pods-iosApp-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-iosApp-umbrella.h"; sourceTree = "<group>"; };
482384ADFE4EF692B16FACB8C2021970 /* Pods-iosApp.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-iosApp.modulemap"; sourceTree = "<group>"; };
73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
73D4D08B8C9FAD17B10E8E5C0EB49A76 /* shared.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = shared.framework; path = build/cocoapods/framework/shared.framework; sourceTree = "<group>"; };
95B09EA82E7AF9ACCCCAF3E55C859116 /* shared.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = shared.debug.xcconfig; sourceTree = "<group>"; };
9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
A43877303056397968EC90C7AAFE17E8 /* Pods-iosApp-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-iosApp-acknowledgements.markdown"; sourceTree = "<group>"; };
A79C2AA5C063914B2D1BD80187FDF6DE /* Pods-iosApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-iosApp.debug.xcconfig"; sourceTree = "<group>"; };
B097DD7534E741D5C41838011D755842 /* Pods-iosApp */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-iosApp"; path = Pods_iosApp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
BCAED803D074E2E9C3B1327F049C8C2A /* Pods-iosApp-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-iosApp-Info.plist"; sourceTree = "<group>"; };
FB1BF8BE937671FB0F330C2D28634477 /* shared.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = shared.podspec; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
CC3CD5459C4A5476C5A93268587E63E7 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
648F16425FEF89525AE0325F5A984B86 /* Foundation.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
1F86AA6785DF34AFD5A71790761717DE /* Products */ = {
isa = PBXGroup;
children = (
B097DD7534E741D5C41838011D755842 /* Pods-iosApp */,
);
name = Products;
sourceTree = "<group>";
};
310087C345B86EEF25A054485E0BB5CB /* Pods-iosApp */ = {
isa = PBXGroup;
children = (
482384ADFE4EF692B16FACB8C2021970 /* Pods-iosApp.modulemap */,
A43877303056397968EC90C7AAFE17E8 /* Pods-iosApp-acknowledgements.markdown */,
0011AEE22E8296B3D9E0B0B2CDCAB2EE /* Pods-iosApp-acknowledgements.plist */,
3A2475209BEE7612101900020629C625 /* Pods-iosApp-dummy.m */,
BCAED803D074E2E9C3B1327F049C8C2A /* Pods-iosApp-Info.plist */,
42DE4C0106600A5B6D599285368F3270 /* Pods-iosApp-umbrella.h */,
A79C2AA5C063914B2D1BD80187FDF6DE /* Pods-iosApp.debug.xcconfig */,
1A2FB55B5C37861BC78ECD1420D818C3 /* Pods-iosApp.release.xcconfig */,
);
name = "Pods-iosApp";
path = "Target Support Files/Pods-iosApp";
sourceTree = "<group>";
};
313FE5FE915A4A924C55AAC02A910D61 /* Development Pods */ = {
isa = PBXGroup;
children = (
EEF3277DCE2E4B31CF76A57AB68C2BA1 /* shared */,
);
name = "Development Pods";
sourceTree = "<group>";
};
569B56E5B05425CAE32676C6049DC8CB /* Pod */ = {
isa = PBXGroup;
children = (
FB1BF8BE937671FB0F330C2D28634477 /* shared.podspec */,
);
name = Pod;
sourceTree = "<group>";
};
578452D2E740E91742655AC8F1636D1F /* iOS */ = {
isa = PBXGroup;
children = (
73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */,
);
name = iOS;
sourceTree = "<group>";
};
5CB66AAACA3977B45E9869C360E9F289 /* Support Files */ = {
isa = PBXGroup;
children = (
95B09EA82E7AF9ACCCCAF3E55C859116 /* shared.debug.xcconfig */,
35548E3BD8DA30925E8FE97E67B84868 /* shared.release.xcconfig */,
);
name = "Support Files";
path = "../iosApp/Pods/Target Support Files/shared";
sourceTree = "<group>";
};
7DBF81461E18ACE1B4BD971BAC841CF7 /* Frameworks */ = {
isa = PBXGroup;
children = (
73D4D08B8C9FAD17B10E8E5C0EB49A76 /* shared.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
C9F6DDEE5D76F65BB478A349731F54F4 /* Targets Support Files */ = {
isa = PBXGroup;
children = (
310087C345B86EEF25A054485E0BB5CB /* Pods-iosApp */,
);
name = "Targets Support Files";
sourceTree = "<group>";
};
CF1408CF629C7361332E53B88F7BD30C = {
isa = PBXGroup;
children = (
9D940727FF8FB9C785EB98E56350EF41 /* Podfile */,
313FE5FE915A4A924C55AAC02A910D61 /* Development Pods */,
D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */,
1F86AA6785DF34AFD5A71790761717DE /* Products */,
C9F6DDEE5D76F65BB478A349731F54F4 /* Targets Support Files */,
);
sourceTree = "<group>";
};
D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = {
isa = PBXGroup;
children = (
578452D2E740E91742655AC8F1636D1F /* iOS */,
);
name = Frameworks;
sourceTree = "<group>";
};
EEF3277DCE2E4B31CF76A57AB68C2BA1 /* shared */ = {
isa = PBXGroup;
children = (
7DBF81461E18ACE1B4BD971BAC841CF7 /* Frameworks */,
569B56E5B05425CAE32676C6049DC8CB /* Pod */,
5CB66AAACA3977B45E9869C360E9F289 /* Support Files */,
);
name = shared;
path = ../../shared;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
DA71CB665A4F7860DB550FAA48FB6AD2 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
8801CBFD38B946597BD07145B2EEFC9F /* Pods-iosApp-umbrella.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
ED39C638569286489CD697A6C8964146 /* Pods-iosApp */ = {
isa = PBXNativeTarget;
buildConfigurationList = 9F1E85ECB672A0CC96333A6C6DF60EE6 /* Build configuration list for PBXNativeTarget "Pods-iosApp" */;
buildPhases = (
DA71CB665A4F7860DB550FAA48FB6AD2 /* Headers */,
EB28A529759E3D2117E28CE3CB8387D3 /* Sources */,
CC3CD5459C4A5476C5A93268587E63E7 /* Frameworks */,
0EC1C62FF9B25EAB2D236D122EAF4C98 /* Resources */,
);
buildRules = (
);
dependencies = (
4A9525469F8E46F3883CC6599FCCFEDB /* PBXTargetDependency */,
);
name = "Pods-iosApp";
productName = Pods_iosApp;
productReference = B097DD7534E741D5C41838011D755842 /* Pods-iosApp */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
BFDFE7DC352907FC980B868725387E98 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 1300;
LastUpgradeCheck = 1300;
};
buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
Base,
en,
);
mainGroup = CF1408CF629C7361332E53B88F7BD30C;
productRefGroup = 1F86AA6785DF34AFD5A71790761717DE /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
ED39C638569286489CD697A6C8964146 /* Pods-iosApp */,
8777C9F6889E59EFFD631D80AEE9048B /* shared */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
0EC1C62FF9B25EAB2D236D122EAF4C98 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
BEA8885189D408D600647BDC228A6A20 /* [CP-User] Build shared */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
name = "[CP-User] Build shared";
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = " if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\"\"\n exit 0\n fi\n set -ev\n REPO_ROOT=\"$PODS_TARGET_SRCROOT\"\n \"$REPO_ROOT/../gradlew\" -p \"$REPO_ROOT\" $KOTLIN_PROJECT_PATH:syncFramework -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME -Pkotlin.native.cocoapods.archs=\"$ARCHS\" -Pkotlin.native.cocoapods.configuration=\"$CONFIGURATION\"\n";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
EB28A529759E3D2117E28CE3CB8387D3 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8749C8E8DC500B064FA0BC7A78C38A2A /* Pods-iosApp-dummy.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
4A9525469F8E46F3883CC6599FCCFEDB /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = shared;
target = 8777C9F6889E59EFFD631D80AEE9048B /* shared */;
targetProxy = C1E4F2F8101E860063100BCC8448BC3B /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
02DDCCED053337F381DEBAFDEC6F354F /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 1A2FB55B5C37861BC78ECD1420D818C3 /* Pods-iosApp.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
CLANG_ENABLE_OBJC_WEAK = NO;
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = "Target Support Files/Pods-iosApp/Pods-iosApp-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 14.1;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MACH_O_TYPE = staticlib;
MODULEMAP_FILE = "Target Support Files/Pods-iosApp/Pods-iosApp.modulemap";
OTHER_LDFLAGS = "";
OTHER_LIBTOOLFLAGS = "";
PODS_ROOT = "$(SRCROOT)";
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
593F10BFFA94DAC7D6E17FB8A7F32D72 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
"POD_CONFIGURATION_RELEASE=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.1;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
STRIP_INSTALLED_PRODUCT = NO;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
SYMROOT = "${SRCROOT}/../build";
};
name = Release;
};
5C79EBBEF4D856E116AE03C8C2DFFEB9 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 35548E3BD8DA30925E8FE97E67B84868 /* shared.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CLANG_ENABLE_OBJC_WEAK = NO;
IPHONEOS_DEPLOYMENT_TARGET = 11;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
97719A16ED118586687DA782DCA53747 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 95B09EA82E7AF9ACCCCAF3E55C859116 /* shared.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CLANG_ENABLE_OBJC_WEAK = NO;
IPHONEOS_DEPLOYMENT_TARGET = 11;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
A0374B8CF9A7D6A45F6D116D698D1C19 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"POD_CONFIGURATION_DEBUG=1",
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.1;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
STRIP_INSTALLED_PRODUCT = NO;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
SYMROOT = "${SRCROOT}/../build";
};
name = Debug;
};
AF088B6CD92A52AC4DCB62DEEC871231 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = A79C2AA5C063914B2D1BD80187FDF6DE /* Pods-iosApp.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
CLANG_ENABLE_OBJC_WEAK = NO;
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = "Target Support Files/Pods-iosApp/Pods-iosApp-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 14.1;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MACH_O_TYPE = staticlib;
MODULEMAP_FILE = "Target Support Files/Pods-iosApp/Pods-iosApp.modulemap";
OTHER_LDFLAGS = "";
OTHER_LIBTOOLFLAGS = "";
PODS_ROOT = "$(SRCROOT)";
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = {
isa = XCConfigurationList;
buildConfigurations = (
A0374B8CF9A7D6A45F6D116D698D1C19 /* Debug */,
593F10BFFA94DAC7D6E17FB8A7F32D72 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
8349D8E2EC974421A14EF8ABFF6AD6DC /* Build configuration list for PBXAggregateTarget "shared" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97719A16ED118586687DA782DCA53747 /* Debug */,
5C79EBBEF4D856E116AE03C8C2DFFEB9 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
9F1E85ECB672A0CC96333A6C6DF60EE6 /* Build configuration list for PBXNativeTarget "Pods-iosApp" */ = {
isa = XCConfigurationList;
buildConfigurations = (
AF088B6CD92A52AC4DCB62DEEC871231 /* Debug */,
02DDCCED053337F381DEBAFDEC6F354F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */;
}

58
examples/compose_sharedui_kmm/iosApp/Pods/Pods.xcodeproj/xcuserdata/adrianwitaszak.xcuserdatad/xcschemes/Pods-iosApp.xcscheme generated

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1300"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "ED39C638569286489CD697A6C8964146"
BuildableName = "Pods_iosApp.framework"
BlueprintName = "Pods-iosApp"
ReferencedContainer = "container:Pods.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

58
examples/compose_sharedui_kmm/iosApp/Pods/Pods.xcodeproj/xcuserdata/adrianwitaszak.xcuserdatad/xcschemes/shared.xcscheme generated

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1300"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8777C9F6889E59EFFD631D80AEE9048B"
BuildableName = "shared"
BlueprintName = "shared"
ReferencedContainer = "container:Pods.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

25
examples/compose_sharedui_kmm/iosApp/Pods/Pods.xcodeproj/xcuserdata/adrianwitaszak.xcuserdatad/xcschemes/xcschememanagement.plist generated

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>Pods-iosApp.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>0</integer>
</dict>
<key>shared.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>1</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict/>
</dict>
</plist>

26
examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-Info.plist generated

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${CURRENT_PROJECT_VERSION}</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

3
examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-acknowledgements.markdown generated

@ -0,0 +1,3 @@
# Acknowledgements
This application makes use of the following third party libraries:
Generated by CocoaPods - https://cocoapods.org

29
examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-acknowledgements.plist generated

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>FooterText</key>
<string>This application makes use of the following third party libraries:</string>
<key>Title</key>
<string>Acknowledgements</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>Generated by CocoaPods - https://cocoapods.org</string>
<key>Title</key>
<string></string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
</array>
<key>StringsTable</key>
<string>Acknowledgements</string>
<key>Title</key>
<string>Acknowledgements</string>
</dict>
</plist>

5
examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-dummy.m generated

@ -0,0 +1,5 @@
#import <Foundation/Foundation.h>
@interface PodsDummy_Pods_iosApp : NSObject
@end
@implementation PodsDummy_Pods_iosApp
@end

16
examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-umbrella.h generated

@ -0,0 +1,16 @@
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif
FOUNDATION_EXPORT double Pods_iosAppVersionNumber;
FOUNDATION_EXPORT const unsigned char Pods_iosAppVersionString[];

11
examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.debug.xcconfig generated

@ -0,0 +1,11 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../shared/build/cocoapods/framework"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -framework "shared"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

6
examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.modulemap generated

@ -0,0 +1,6 @@
framework module Pods_iosApp {
umbrella header "Pods-iosApp-umbrella.h"
export *
module * { export * }
}

11
examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.release.xcconfig generated

@ -0,0 +1,11 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../shared/build/cocoapods/framework"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -framework "shared"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

15
examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/shared/shared.debug.xcconfig generated

@ -0,0 +1,15 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/shared
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../shared/build/cocoapods/framework"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
KOTLIN_PROJECT_PATH = :shared
OTHER_LDFLAGS = $(inherited) -l"c++"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../shared
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
PRODUCT_MODULE_NAME = shared
SKIP_INSTALL = YES
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

15
examples/compose_sharedui_kmm/iosApp/Pods/Target Support Files/shared/shared.release.xcconfig generated

@ -0,0 +1,15 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/shared
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../shared/build/cocoapods/framework"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
KOTLIN_PROJECT_PATH = :shared
OTHER_LDFLAGS = $(inherited) -l"c++"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../shared
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
PRODUCT_MODULE_NAME = shared
SKIP_INSTALL = YES
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

423
examples/compose_sharedui_kmm/iosApp/iosApp.xcodeproj/project.pbxproj

@ -0,0 +1,423 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objects = {
/* Begin PBXBuildFile section */
058557BB273AAA24004C7B11 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 058557BA273AAA24004C7B11 /* Assets.xcassets */; };
058557D9273AAEEB004C7B11 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */; };
2152FB042600AC8F00CF470E /* iOSApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2152FB032600AC8F00CF470E /* iOSApp.swift */; };
EF1AC847DCACB91B1B481C0E /* Pods_iosApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 399097587D30CABFAD7C5EBF /* Pods_iosApp.framework */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
7555FFB4242A642300829871 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
058557BA273AAA24004C7B11 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
1244B5DBD38780121D5F0462 /* Pods-iosApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosApp.debug.xcconfig"; path = "Target Support Files/Pods-iosApp/Pods-iosApp.debug.xcconfig"; sourceTree = "<group>"; };
2152FB032600AC8F00CF470E /* iOSApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSApp.swift; sourceTree = "<group>"; };
399097587D30CABFAD7C5EBF /* Pods_iosApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_iosApp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
4B3445C2912F5920A32F4449 /* Pods-iosApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosApp.release.xcconfig"; path = "Target Support Files/Pods-iosApp/Pods-iosApp.release.xcconfig"; sourceTree = "<group>"; };
7555FF7B242A565900829871 /* iosApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iosApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
7555FF8C242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
7555FF78242A565900829871 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
EF1AC847DCACB91B1B481C0E /* Pods_iosApp.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
058557D7273AAEEB004C7B11 /* Preview Content */ = {
isa = PBXGroup;
children = (
058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */,
);
path = "Preview Content";
sourceTree = "<group>";
};
7555FF72242A565900829871 = {
isa = PBXGroup;
children = (
7555FF7D242A565900829871 /* iosApp */,
7555FF7C242A565900829871 /* Products */,
7555FFB0242A642200829871 /* Frameworks */,
EF190E904E5CABBC301E3B27 /* Pods */,
);
sourceTree = "<group>";
};
7555FF7C242A565900829871 /* Products */ = {
isa = PBXGroup;
children = (
7555FF7B242A565900829871 /* iosApp.app */,
);
name = Products;
sourceTree = "<group>";
};
7555FF7D242A565900829871 /* iosApp */ = {
isa = PBXGroup;
children = (
058557BA273AAA24004C7B11 /* Assets.xcassets */,
7555FF8C242A565B00829871 /* Info.plist */,
2152FB032600AC8F00CF470E /* iOSApp.swift */,
058557D7273AAEEB004C7B11 /* Preview Content */,
);
path = iosApp;
sourceTree = "<group>";
};
7555FFB0242A642200829871 /* Frameworks */ = {
isa = PBXGroup;
children = (
399097587D30CABFAD7C5EBF /* Pods_iosApp.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
EF190E904E5CABBC301E3B27 /* Pods */ = {
isa = PBXGroup;
children = (
1244B5DBD38780121D5F0462 /* Pods-iosApp.debug.xcconfig */,
4B3445C2912F5920A32F4449 /* Pods-iosApp.release.xcconfig */,
);
name = Pods;
path = Pods;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
7555FF7A242A565900829871 /* iosApp */ = {
isa = PBXNativeTarget;
buildConfigurationList = 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */;
buildPhases = (
A7D945ECBD212FA7DF7B846F /* [CP] Check Pods Manifest.lock */,
7555FFB5242A651A00829871 /* ShellScript */,
7555FF77242A565900829871 /* Sources */,
7555FF78242A565900829871 /* Frameworks */,
7555FF79242A565900829871 /* Resources */,
7555FFB4242A642300829871 /* Embed Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = iosApp;
productName = iosApp;
productReference = 7555FF7B242A565900829871 /* iosApp.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
7555FF73242A565900829871 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 1130;
LastUpgradeCheck = 1130;
ORGANIZATIONNAME = orgName;
TargetAttributes = {
7555FF7A242A565900829871 = {
CreatedOnToolsVersion = 11.3.1;
};
};
};
buildConfigurationList = 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 7555FF72242A565900829871;
productRefGroup = 7555FF7C242A565900829871 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
7555FF7A242A565900829871 /* iosApp */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
7555FF79242A565900829871 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
058557D9273AAEEB004C7B11 /* Preview Assets.xcassets in Resources */,
058557BB273AAA24004C7B11 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
7555FFB5242A651A00829871 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "cd \"$SRCROOT/..\"\n./gradlew :shared:embedAndSignAppleFrameworkForXcode\n";
};
A7D945ECBD212FA7DF7B846F /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-iosApp-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
7555FF77242A565900829871 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
2152FB042600AC8F00CF470E /* iOSApp.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
7555FFA3242A565B00829871 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.1;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
7555FFA4242A565B00829871 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.1;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
7555FFA6242A565B00829871 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 1244B5DBD38780121D5F0462 /* Pods-iosApp.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\"";
DEVELOPMENT_TEAM = 35M6G2GGQB;
ENABLE_PREVIEWS = YES;
FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)";
INFOPLIST_FILE = iosApp/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
OTHER_LDFLAGS = (
"$(inherited)",
"-framework",
shared,
);
PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosApp;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
7555FFA7242A565B00829871 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 4B3445C2912F5920A32F4449 /* Pods-iosApp.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\"";
DEVELOPMENT_TEAM = 35M6G2GGQB;
ENABLE_PREVIEWS = YES;
FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)";
INFOPLIST_FILE = iosApp/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
OTHER_LDFLAGS = (
"$(inherited)",
"-framework",
shared,
);
PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosApp;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */ = {
isa = XCConfigurationList;
buildConfigurations = (
7555FFA3242A565B00829871 /* Debug */,
7555FFA4242A565B00829871 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */ = {
isa = XCConfigurationList;
buildConfigurations = (
7555FFA6242A565B00829871 /* Debug */,
7555FFA7242A565B00829871 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 7555FF73242A565900829871 /* Project object */;
}

8
examples/compose_sharedui_kmm/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

BIN
examples/compose_sharedui_kmm/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/adrianwitaszak.xcuserdatad/UserInterfaceState.xcuserstate generated

Binary file not shown.

14
examples/compose_sharedui_kmm/iosApp/iosApp.xcodeproj/xcuserdata/adrianwitaszak.xcuserdatad/xcschemes/xcschememanagement.plist

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>iosApp.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>2</integer>
</dict>
</dict>
</dict>
</plist>

10
examples/compose_sharedui_kmm/iosApp/iosApp.xcworkspace/contents.xcworkspacedata generated

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:iosApp.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

8
examples/compose_sharedui_kmm/iosApp/iosApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

BIN
examples/compose_sharedui_kmm/iosApp/iosApp.xcworkspace/xcuserdata/adrianwitaszak.xcuserdatad/UserInterfaceState.xcuserstate generated

Binary file not shown.

11
examples/compose_sharedui_kmm/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json

@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

98
examples/compose_sharedui_kmm/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json

@ -0,0 +1,98 @@
{
"images" : [
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "29x29"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "29x29"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "40x40"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "40x40"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "60x60"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "60x60"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "20x20"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "20x20"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "29x29"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "29x29"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "40x40"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "40x40"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "76x76"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "76x76"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "83.5x83.5"
},
{
"idiom" : "ios-marketing",
"scale" : "1x",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

6
examples/compose_sharedui_kmm/iosApp/iosApp/Assets.xcassets/Contents.json

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

16
examples/compose_sharedui_kmm/iosApp/iosApp/ContentView.swift

@ -0,0 +1,16 @@
import SwiftUI
import shared
struct ContentView: View {
let greet = Greeting().greet()
var body: some View {
Text(greet)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

48
examples/compose_sharedui_kmm/iosApp/iosApp/Info.plist

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
</dict>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UILaunchScreen</key>
<dict/>
</dict>
</plist>

6
examples/compose_sharedui_kmm/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

25
examples/compose_sharedui_kmm/iosApp/iosApp/iOSApp.swift

@ -0,0 +1,25 @@
import SwiftUI
import shared
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var myWindow: UIWindow?
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
myWindow = UIWindow(frame: UIScreen.main.bounds)
let mainViewController = IOSRootContentKt.RootViewController()
myWindow?.rootViewController = mainViewController
myWindow?.makeKeyAndVisible()
return true
}
func application(
_ application: UIApplication,
supportedInterfaceOrientationsFor supportedInterfaceOrientationsForWindow: UIWindow?
) -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.all
}
}

3045
examples/compose_sharedui_kmm/kotlin-js-store/yarn.lock

File diff suppressed because it is too large Load Diff

8
examples/compose_sharedui_kmm/local.properties

@ -0,0 +1,8 @@
## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Sun May 21 10:03:36 BST 2023
sdk.dir=/Users/adrianwitaszak/Library/Android/sdk

BIN
examples/compose_sharedui_kmm/screenshots/android.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

BIN
examples/compose_sharedui_kmm/screenshots/desktop.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 KiB

BIN
examples/compose_sharedui_kmm/screenshots/ios.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 664 KiB

BIN
examples/compose_sharedui_kmm/screenshots/web.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

28
examples/compose_sharedui_kmm/settings.gradle.kts

@ -0,0 +1,28 @@
pluginManagement {
repositories {
google()
gradlePluginPortal()
mavenCentral()
maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
maven("https://us-central1-maven.pkg.dev/varabyte-repos/public")
}
}
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
maven("https://us-central1-maven.pkg.dev/varabyte-repos/public")
}
}
rootProject.name = "BallastSharedUI"
include(
":androidApp",
":web",
":shared",
":feature:router",
":feature:home",
":feature:counter",
)

2
examples/compose_sharedui_kmm/shared/.gitignore vendored

@ -0,0 +1,2 @@
/build
.gradle

101
examples/compose_sharedui_kmm/shared/build.gradle.kts

@ -0,0 +1,101 @@
plugins {
kotlin("multiplatform")
kotlin("native.cocoapods")
id("com.android.library")
id("org.jetbrains.compose")
}
kotlin {
android()
ios()
iosSimulatorArm64()
jvm("desktop") {
compilations.all {
kotlinOptions.jvmTarget = "11"
}
}
js(IR) {
moduleName = project.name
browser {
commonWebpackConfig {
outputFileName = "$moduleName.js"
}
}
binaries.executable()
}
cocoapods {
framework {
summary = "Shared code for Ballast app"
homepage = "http://"
baseName = project.name
isStatic = true
}
ios.deploymentTarget = "11"
version = "1.11.3"
}
sourceSets {
val commonMain by getting {
dependencies {
implementation(project(":feature:router"))
implementation(project(":feature:counter"))
implementation(project(":feature:home"))
implementation(compose.animation)
implementation(compose.animationGraphics)
implementation(compose.foundation)
implementation(compose.material)
implementation(compose.materialIconsExtended)
implementation(compose.runtime)
implementation(compose.ui)
implementation(libs.ballast.core)
implementation(libs.ballast.navigation)
}
}
val androidMain by getting
val iosMain by getting {
dependsOn(commonMain)
}
val iosSimulatorArm64Main by getting {
dependsOn(iosMain)
}
val desktopMain by getting {
dependencies {
implementation(compose.desktop.currentOs)
}
}
}
}
android {
namespace = "com.adrianwitaszak.ballastsharedui.${project.name}"
compileSdk = 33
defaultConfig {
minSdk = 24
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}
compose {
desktop {
application {
mainClass = "MainKt"
nativeDistributions {
targetFormats(
org.jetbrains.compose.desktop.application.dsl.TargetFormat.Dmg,
org.jetbrains.compose.desktop.application.dsl.TargetFormat.Msi,
org.jetbrains.compose.desktop.application.dsl.TargetFormat.Deb
)
packageName = "Ballast"
packageVersion = "1.0.0"
}
}
}
}
java {
toolchain.languageVersion.set(JavaLanguageVersion.of(11))
}

39
examples/compose_sharedui_kmm/shared/shared.podspec

@ -0,0 +1,39 @@
Pod::Spec.new do |spec|
spec.name = 'shared'
spec.version = '1.11.3'
spec.homepage = 'http://'
spec.source = { :http=> ''}
spec.authors = ''
spec.license = ''
spec.summary = 'Shared code for Ballast app'
spec.vendored_frameworks = 'build/cocoapods/framework/shared.framework'
spec.libraries = 'c++'
spec.ios.deployment_target = '11'
spec.pod_target_xcconfig = {
'KOTLIN_PROJECT_PATH' => ':shared',
'PRODUCT_MODULE_NAME' => 'shared',
}
spec.script_phases = [
{
:name => 'Build shared',
:execution_position => :before_compile,
:shell_path => '/bin/sh',
:script => <<-SCRIPT
if [ "YES" = "$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED" ]; then
echo "Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\""
exit 0
fi
set -ev
REPO_ROOT="$PODS_TARGET_SRCROOT"
"$REPO_ROOT/../gradlew" -p "$REPO_ROOT" $KOTLIN_PROJECT_PATH:syncFramework \
-Pkotlin.native.cocoapods.platform=$PLATFORM_NAME \
-Pkotlin.native.cocoapods.archs="$ARCHS" \
-Pkotlin.native.cocoapods.configuration="$CONFIGURATION"
SCRIPT
}
]
end

9
examples/compose_sharedui_kmm/shared/src/androidMain/kotlin/com/ballast/sharedui/AndroidRootContent.kt

@ -0,0 +1,9 @@
package com.ballast.sharedui
import androidx.compose.runtime.Composable
import com.ballast.sharedui.content.RootContent
@Composable
fun AndroidRootContent() {
RootContent()
}

70
examples/compose_sharedui_kmm/shared/src/commonMain/kotlin/com/ballast/sharedui/content/CounterContent.kt

@ -0,0 +1,70 @@
package com.ballast.sharedui.content
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Button
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.ballast.sharedui.root.CounterContract
import com.ballast.sharedui.root.CounterViewModel
@Composable
internal fun CounterContent(
onGoBack: () -> Unit,
) {
val coroutineScope = rememberCoroutineScope()
val vm = remember(coroutineScope) { CounterViewModel(coroutineScope) }
val state by vm.observeStates().collectAsState()
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colors.background
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.fillMaxSize()
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Text(
text = "Counter",
style = MaterialTheme.typography.h2,
modifier = Modifier.padding(16.dp)
)
Row(verticalAlignment = Alignment.CenterVertically) {
Button(
onClick = { vm.trySend(CounterContract.Inputs.Decrement()) }
) {
Text("-")
}
Text(
text = state.count.toString(),
modifier = Modifier.padding(horizontal = 16.dp)
)
Button(
onClick = { vm.trySend(CounterContract.Inputs.Increment()) }
) {
Text("+")
}
}
Button(
onClick = onGoBack,
modifier = Modifier.padding(16.dp)
) {
Text("Go Back")
}
}
}
}
}

77
examples/compose_sharedui_kmm/shared/src/commonMain/kotlin/com/ballast/sharedui/content/HomeContent.kt

@ -0,0 +1,77 @@
package com.ballast.sharedui.content
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Button
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.material.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.ballast.sharedui.root.HomeContract
import com.ballast.sharedui.root.HomeViewModel
@Composable
internal fun HomeContent(
onGoToCounter: () -> Unit,
) {
val coroutineScope = rememberCoroutineScope()
val vm = remember(coroutineScope) { HomeViewModel(coroutineScope) }
val state by vm.observeStates().collectAsState()
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colors.background
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.fillMaxSize()
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Text(
text = "Welcome to Ballast",
style = MaterialTheme.typography.h2,
modifier = Modifier.padding(16.dp)
)
Text(
text = "What's you name?",
style = MaterialTheme.typography.h4,
modifier = Modifier.padding(16.dp)
)
TextField(
value = state.name,
onValueChange = { vm.trySend(HomeContract.Inputs.OnNameChanged(it)) },
label = { Text("Name") },
modifier = Modifier.padding(16.dp)
)
if (state.name.isNotEmpty()) {
Text(
text = "Hello ${state.name}!",
style = MaterialTheme.typography.h4,
modifier = Modifier.padding(16.dp)
)
} else {
Text(
text = "Please enter your name",
style = MaterialTheme.typography.h4,
modifier = Modifier.padding(16.dp)
)
}
Button(
onClick = onGoToCounter
) {
Text("Go to Counter")
}
}
}
}
}

29
examples/compose_sharedui_kmm/shared/src/commonMain/kotlin/com/ballast/sharedui/content/RootContent.kt

@ -0,0 +1,29 @@
package com.ballast.sharedui.content
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Button
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.ballast.sharedui.root.CounterContract
import com.ballast.sharedui.root.CounterViewModel
import com.ballast.sharedui.theme.MyApplicationTheme
@Composable
internal fun RootContent() {
MyApplicationTheme {
RouterContent()
}
}

43
examples/compose_sharedui_kmm/shared/src/commonMain/kotlin/com/ballast/sharedui/content/RouterContent.kt

@ -0,0 +1,43 @@
package com.ballast.sharedui.content
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import com.ballast.shoppe.feature.router.RouterScreen
import com.ballast.shoppe.feature.router.RouterViewModel
import com.copperleaf.ballast.navigation.routing.Backstack
import com.copperleaf.ballast.navigation.routing.RouterContract
import com.copperleaf.ballast.navigation.routing.renderCurrentDestination
import com.copperleaf.ballast.navigation.vm.Router
@Composable
internal fun RouterContent() {
val coroutineScope = rememberCoroutineScope()
val router: Router<RouterScreen> =
remember(coroutineScope) {
RouterViewModel(
viewModelScope = coroutineScope,
initialRoute = RouterScreen.Home,
)
}
val routerState: Backstack<RouterScreen> by router.observeStates().collectAsState()
routerState.renderCurrentDestination(
route = { routerScreen: RouterScreen ->
when (routerScreen) {
RouterScreen.Home -> HomeContent(
onGoToCounter = {
router.trySend(RouterContract.Inputs.GoToDestination(RouterScreen.Counter.matcher.routeFormat))
}
)
RouterScreen.Counter -> CounterContent(
onGoBack = { router.trySend(RouterContract.Inputs.GoBack()) },
)
}
},
notFound = { },
)
}

55
examples/compose_sharedui_kmm/shared/src/commonMain/kotlin/com/ballast/sharedui/theme/MyApplicationTheme.kt

@ -0,0 +1,55 @@
package com.ballast.sharedui.theme
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Shapes
import androidx.compose.material.Typography
import androidx.compose.material.darkColors
import androidx.compose.material.lightColors
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@Composable
internal fun MyApplicationTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
content: @Composable () -> Unit
) {
val colors = if (darkTheme) {
darkColors(
primary = Color(0xFFBB86FC),
primaryVariant = Color(0xFF3700B3),
secondary = Color(0xFF03DAC5)
)
} else {
lightColors(
primary = Color(0xFF6200EE),
primaryVariant = Color(0xFF3700B3),
secondary = Color(0xFF03DAC5)
)
}
val typography = Typography(
body1 = TextStyle(
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Normal,
fontSize = 16.sp
)
)
val shapes = Shapes(
small = RoundedCornerShape(4.dp),
medium = RoundedCornerShape(4.dp),
large = RoundedCornerShape(0.dp)
)
MaterialTheme(
colors = colors,
typography = typography,
shapes = shapes,
content = content
)
}

18
examples/compose_sharedui_kmm/shared/src/desktopMain/kotlin/Main.kt

@ -0,0 +1,18 @@
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
import androidx.compose.ui.window.rememberWindowState
import com.ballast.sharedui.DesktopRootContent
fun main() {
application {
val windowState = rememberWindowState()
Window(
onCloseRequest = ::exitApplication,
state = windowState,
title = "Shoppe",
) {
DesktopRootContent()
}
}
}

9
examples/compose_sharedui_kmm/shared/src/desktopMain/kotlin/com/ballast/sharedui/DesktopRootContent.kt

@ -0,0 +1,9 @@
package com.ballast.sharedui
import androidx.compose.runtime.Composable
import com.ballast.sharedui.content.RootContent
@Composable
fun DesktopRootContent() {
RootContent()
}

10
examples/compose_sharedui_kmm/shared/src/iosMain/kotlin/com/ballast/sharedui/IOSRootContent.kt

@ -0,0 +1,10 @@
package com.ballast.sharedui
import androidx.compose.ui.window.ComposeUIViewController
import com.ballast.sharedui.content.RootContent
import platform.UIKit.UIViewController
@Suppress("FunctionName", "unused") // Used in iOS
fun RootViewController(): UIViewController = ComposeUIViewController {
RootContent()
}

4
examples/compose_sharedui_kmm/web/.gitignore vendored

@ -0,0 +1,4 @@
/build
# Kobweb ignores
.kobweb/*
!.kobweb/conf.yaml

13
examples/compose_sharedui_kmm/web/.kobweb/conf.yaml

@ -0,0 +1,13 @@
site:
title: "Ballast"
server:
files:
dev:
contentRoot: "build/processedResources/js/main/public"
script: "build/developmentExecutable/web.js"
prod:
script: "build/distributions/web.js"
siteRoot: ".kobweb/site"
port: 8080

53
examples/compose_sharedui_kmm/web/README.md

@ -0,0 +1,53 @@
This is a [Kobweb](https://github.com/varabyte/kobweb) project bootstrapped with the `app/empty` template.
This template is useful if you already know what you're doing and just want a clean slate. By default, it
just creates a blank home page (which prints to the console so you can confirm it's working)
If you are still learning, consider instantiating the `app` template (or one of the examples) to see actual,
working projects.
## Getting Started
First, run the development server by typing the following command in a terminal under the `site` folder:
```bash
$ cd site
$ kobweb run
```
Open [http://localhost:8080](http://localhost:8080) with your browser to see the result.
You can use any editor you want for the project, but we recommend using **IntelliJ IDEA Community Edition** downloaded
using the [Toolbox App](https://www.jetbrains.com/toolbox-app/).
Press `Q` in the terminal to gracefully stop the server.
### Live Reload
Feel free to edit / add / delete new components, pages, and API endpoints! When you make any changes, the site will
indicate the status of the build and automatically reload when ready.
## Exporting the Project
When you are ready to ship, you should shutdown the development server and then export the project using:
```bash
kobweb export
```
When finished, you can run a Kobweb server in production mode:
```bash
kobweb run --env prod
```
If you want to run this command in the Cloud provider of your choice, consider disabling interactive mode since nobody
is sitting around watching the console in that case anyway. To do that, use:
```bash
kobweb run --env prod --notty
```
Kobweb also supports exporting to a static layout which is compatible with static hosting providers, such as GitHub
Pages, Netlify, Firebase, any presumably all the others. You can read more about that approach here:
https://bitspittle.dev/blog/2022/staticdeploy

42
examples/compose_sharedui_kmm/web/build.gradle.kts

@ -0,0 +1,42 @@
import kotlinx.html.link
plugins {
kotlin("multiplatform")
id("org.jetbrains.compose")
id("com.varabyte.kobweb.application") version libs.versions.kobweb.get()
}
group = "com.adrianwitaszak.ballast.web"
kotlin {
js(IR) {
moduleName = project.name
browser {
commonWebpackConfig {
outputFileName = "$moduleName.js"
}
}
binaries.executable()
}
sourceSets {
named("jsMain") {
dependencies {
implementation(project(":feature:router"))
implementation(project(":feature:counter"))
implementation(project(":feature:home"))
implementation(libs.kobweb.core)
implementation(libs.kobweb.silk)
implementation(libs.ballast.core)
implementation(libs.ballast.navigation)
}
}
}
}
kobweb {
app {
index {
description.set("Ballast Web UI")
}
}
}

44
examples/compose_sharedui_kmm/web/src/jsMain/kotlin/com/adrianwitaszak/ballast/web/BallastApp.kt

@ -0,0 +1,44 @@
package com.adrianwitaszak.ballast.web
import androidx.compose.runtime.Composable
import com.varabyte.kobweb.compose.ui.Modifier
import com.varabyte.kobweb.compose.ui.modifiers.fontFamily
import com.varabyte.kobweb.compose.ui.modifiers.minHeight
import com.varabyte.kobweb.core.App
import com.varabyte.kobweb.silk.SilkApp
import com.varabyte.kobweb.silk.components.layout.Surface
import com.varabyte.kobweb.silk.components.style.common.SmoothColorStyle
import com.varabyte.kobweb.silk.components.style.toModifier
import com.varabyte.kobweb.silk.init.InitSilk
import com.varabyte.kobweb.silk.init.InitSilkContext
import com.varabyte.kobweb.silk.init.registerBaseStyle
import com.varabyte.kobweb.silk.theme.colors.ColorMode
import kotlinx.browser.localStorage
import org.jetbrains.compose.web.css.vh
private const val COLOR_MODE_KEY = "admin:colorMode"
@InitSilk
fun updateTheme(ctx: InitSilkContext) = ctx.config.apply {
initialColorMode = localStorage.getItem(COLOR_MODE_KEY)?.let { ColorMode.valueOf(it) } ?: ColorMode.LIGHT
}
@InitSilk
fun registerGlobalStyles(ctx: InitSilkContext) = ctx.config.apply {
ctx.stylesheet.registerBaseStyle("body") {
Modifier.fontFamily(
"-apple-system", "BlinkMacSystemFont", "Segoe UI", "Roboto", "Oxygen", "Ubuntu",
"Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "sans-serif"
)
}
}
@App
@Composable
fun BallastApp(content: @Composable () -> Unit) {
SilkApp {
Surface(SmoothColorStyle.toModifier().minHeight(100.vh)) {
content()
}
}
}

3
examples/compose_sharedui_kmm/web/src/jsMain/kotlin/com/adrianwitaszak/ballast/web/components/README.md

@ -0,0 +1,3 @@
Define layouts, sections, and widgest in here.
See also: https://github.com/varabyte/kobweb#components-layouts-sections-and-widgets

38
examples/compose_sharedui_kmm/web/src/jsMain/kotlin/com/adrianwitaszak/ballast/web/components/widgets/Card.kt

@ -0,0 +1,38 @@
package com.adrianwitaszak.ballast.web.components.widgets
import androidx.compose.runtime.Composable
import com.varabyte.kobweb.compose.foundation.layout.Box
import com.varabyte.kobweb.compose.foundation.layout.BoxScope
import com.varabyte.kobweb.compose.ui.Alignment
import com.varabyte.kobweb.compose.ui.Modifier
import com.varabyte.kobweb.compose.ui.modifiers.backgroundColor
import com.varabyte.kobweb.compose.ui.modifiers.borderRadius
import com.varabyte.kobweb.compose.ui.modifiers.padding
import com.varabyte.kobweb.silk.components.style.ComponentStyle
import com.varabyte.kobweb.silk.theme.SilkTheme
import com.varabyte.kobweb.silk.theme.colors.getColorMode
import org.jetbrains.compose.web.css.px
@Composable
fun Card(
modifier: Modifier = Modifier,
content: @Composable BoxScope.() -> Unit,
) {
Box(
contentAlignment = Alignment.Center,
modifier = modifier
.backgroundColor(SilkTheme.palettes[getColorMode()].background)
.borderRadius(14.px)
.padding(16.px),
content = content
)
}
val CardStyle = ComponentStyle("cardstyle") {
base {
Modifier
.backgroundColor(SilkTheme.palettes[colorMode].background)
.borderRadius(14.px)
.padding(16.px)
}
}

75
examples/compose_sharedui_kmm/web/src/jsMain/kotlin/com/adrianwitaszak/ballast/web/components/widgets/EditableTextView.kt

@ -0,0 +1,75 @@
package com.adrianwitaszak.ballast.web.components.widgets
import androidx.compose.runtime.Composable
import com.varabyte.kobweb.compose.css.BoxSizing
import com.varabyte.kobweb.compose.css.CSSTransition
import com.varabyte.kobweb.compose.foundation.layout.Box
import com.varabyte.kobweb.compose.foundation.layout.Column
import com.varabyte.kobweb.compose.ui.Alignment
import com.varabyte.kobweb.compose.ui.Modifier
import com.varabyte.kobweb.compose.ui.modifiers.backgroundColor
import com.varabyte.kobweb.compose.ui.modifiers.border
import com.varabyte.kobweb.compose.ui.modifiers.borderRadius
import com.varabyte.kobweb.compose.ui.modifiers.boxSizing
import com.varabyte.kobweb.compose.ui.modifiers.fillMaxSize
import com.varabyte.kobweb.compose.ui.modifiers.fillMaxWidth
import com.varabyte.kobweb.compose.ui.modifiers.height
import com.varabyte.kobweb.compose.ui.modifiers.maxWidth
import com.varabyte.kobweb.compose.ui.modifiers.minWidth
import com.varabyte.kobweb.compose.ui.modifiers.outline
import com.varabyte.kobweb.compose.ui.modifiers.padding
import com.varabyte.kobweb.compose.ui.modifiers.transition
import com.varabyte.kobweb.compose.ui.toAttrs
import com.varabyte.kobweb.silk.theme.colors.getColorMode
import com.varabyte.kobweb.silk.theme.toSilkPalette
import org.jetbrains.compose.web.attributes.InputType
import org.jetbrains.compose.web.attributes.type
import org.jetbrains.compose.web.css.LineStyle
import org.jetbrains.compose.web.css.px
import org.jetbrains.compose.web.css.s
import org.jetbrains.compose.web.dom.TextInput
@Composable
fun EditableTextView(
modifier: Modifier = Modifier,
value: String,
onValueChange: (String) -> Unit,
inputType: InputType.InputTypeWithStringValue = InputType.Text,
) {
Column(
modifier = modifier
.minWidth(250.px)
.maxWidth(500.px)
.transition(CSSTransition("scale", 0.2.s))
) {
Box(
contentAlignment = Alignment.CenterEnd,
modifier = modifier.fillMaxSize()
) {
TextInput(
value = value,
attrs = Modifier
.fillMaxWidth()
.padding(20.px)
.height(60.px)
.backgroundColor(getColorMode().toSilkPalette().background)
.borderRadius(14.px)
.boxSizing(BoxSizing.BorderBox)
.outline(style = LineStyle.None)
.border(
width = 3.px,
style = LineStyle.Solid,
color = getColorMode().toSilkPalette().border
)
.padding(16.px)
.toAttrs {
onInput {
onValueChange(it.value)
}
type(inputType)
}
)
}
}
}

67
examples/compose_sharedui_kmm/web/src/jsMain/kotlin/com/adrianwitaszak/ballast/web/pages/CounterContent.kt

@ -0,0 +1,67 @@
package com.adrianwitaszak.ballast.web.pages
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import com.adrianwitaszak.ballast.web.components.widgets.Card
import com.ballast.sharedui.root.CounterContract
import com.ballast.sharedui.root.CounterViewModel
import com.varabyte.kobweb.compose.foundation.layout.Box
import com.varabyte.kobweb.compose.foundation.layout.Column
import com.varabyte.kobweb.compose.foundation.layout.Row
import com.varabyte.kobweb.compose.ui.Alignment
import com.varabyte.kobweb.compose.ui.Modifier
import com.varabyte.kobweb.compose.ui.modifiers.fillMaxSize
import com.varabyte.kobweb.compose.ui.modifiers.gap
import com.varabyte.kobweb.silk.components.forms.Button
import com.varabyte.kobweb.silk.components.text.SpanText
import org.jetbrains.compose.web.css.px
@Composable
fun Counter(
goBack: () -> Unit,
) {
val coroutineScope = rememberCoroutineScope()
val vm = remember(coroutineScope) {
CounterViewModel(viewModelCoroutineScope = coroutineScope)
}
val state by vm.observeStates().collectAsState()
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.fillMaxSize()
) {
Card {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.gap(24.px)
) {
SpanText("Counter")
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.gap(24.px)
) {
Button(
onClick = { vm.trySend(CounterContract.Inputs.Decrement()) },
) {
SpanText(text = "-")
}
SpanText("Current count: ${state.count}")
Button(
onClick = { vm.trySend(CounterContract.Inputs.Increment()) },
) {
SpanText(text = "+")
}
}
Button(
onClick = { goBack() },
) {
SpanText(text = "Go back")
}
}
}
}
}

61
examples/compose_sharedui_kmm/web/src/jsMain/kotlin/com/adrianwitaszak/ballast/web/pages/HomeContent.kt

@ -0,0 +1,61 @@
package com.adrianwitaszak.ballast.web.pages
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import com.adrianwitaszak.ballast.web.components.widgets.Card
import com.adrianwitaszak.ballast.web.components.widgets.EditableTextView
import com.ballast.sharedui.root.HomeContract
import com.ballast.sharedui.root.HomeViewModel
import com.varabyte.kobweb.compose.foundation.layout.Box
import com.varabyte.kobweb.compose.foundation.layout.Column
import com.varabyte.kobweb.compose.ui.Alignment
import com.varabyte.kobweb.compose.ui.Modifier
import com.varabyte.kobweb.compose.ui.modifiers.fillMaxSize
import com.varabyte.kobweb.compose.ui.modifiers.gap
import com.varabyte.kobweb.silk.components.forms.Button
import com.varabyte.kobweb.silk.components.text.SpanText
import org.jetbrains.compose.web.css.px
@Composable
fun Home(
goToCounter: () -> Unit,
) {
val coroutineScope = rememberCoroutineScope()
val vm = remember(coroutineScope) {
HomeViewModel(viewModelCoroutineScope = coroutineScope)
}
val state by vm.observeStates().collectAsState()
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.fillMaxSize()
) {
Card {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.gap(24.px)
) {
SpanText("Welcome to Kobweb!")
SpanText("What is your name?")
EditableTextView(
value = state.name,
onValueChange = { vm.trySend(HomeContract.Inputs.OnNameChanged(it)) }
)
if (state.name.isNotBlank()) {
SpanText("Hello, ${state.name}!")
} else {
SpanText("")
}
Button(
onClick = { goToCounter() },
) {
SpanText(text = "Go to Counter")
}
}
}
}
}

45
examples/compose_sharedui_kmm/web/src/jsMain/kotlin/com/adrianwitaszak/ballast/web/pages/Index.kt

@ -0,0 +1,45 @@
package com.adrianwitaszak.ballast.web.pages
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import com.ballast.shoppe.feature.router.RouterScreen
import com.ballast.shoppe.feature.router.RouterViewModel
import com.copperleaf.ballast.navigation.routing.Backstack
import com.copperleaf.ballast.navigation.routing.RouterContract
import com.copperleaf.ballast.navigation.routing.renderCurrentDestination
import com.copperleaf.ballast.navigation.vm.Router
import com.varabyte.kobweb.core.Page
@Page("/")
@Composable
fun HomePage() {
val coroutineScope = rememberCoroutineScope()
val router: Router<RouterScreen> =
remember(coroutineScope) {
RouterViewModel(
viewModelScope = coroutineScope,
initialRoute = RouterScreen.Home,
)
}
val routerState: Backstack<RouterScreen> by router.observeStates().collectAsState()
routerState.renderCurrentDestination(
route = { routerScreen: RouterScreen ->
when (routerScreen) {
RouterScreen.Home -> Home(
goToCounter = {
router.trySend(RouterContract.Inputs.GoToDestination(RouterScreen.Counter.matcher.routeFormat))
}
)
RouterScreen.Counter -> Counter(
goBack = { router.trySend(RouterContract.Inputs.GoBack()) },
)
}
},
notFound = { },
)
}

3
examples/compose_sharedui_kmm/web/src/jsMain/kotlin/com/adrianwitaszak/ballast/web/pages/README.md

@ -0,0 +1,3 @@
Define pages in here.
See also: https://github.com/varabyte/kobweb#create-a-page

BIN
examples/compose_sharedui_kmm/web/src/jsMain/resources/public/favicon.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Loading…
Cancel
Save