From a609db563a2014265caec189c615c45213ed66ff Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Mon, 24 Jul 2023 14:38:37 +0200 Subject: [PATCH 01/21] Components. Downgrade to Kotlin 1.8.22 (#3390) Dowgrading to Kotlin 1.8 will allow to use `components` in Kotlin 1.8 and Kotlin 1.9 projects (iOS, JS targets). Now it is supported only in Kotlin 1.9 projects. --- components/gradle.properties | 2 +- components/resources/library/build.gradle.kts | 2 +- .../kotlin/org/jetbrains/compose/resources/Resource.ios.kt | 2 -- .../kotlin/org/jetbrains/compose/resources/Resource.macos.kt | 2 -- 4 files changed, 2 insertions(+), 6 deletions(-) diff --git a/components/gradle.properties b/components/gradle.properties index eade84d7b8..7c56aa1e15 100644 --- a/components/gradle.properties +++ b/components/gradle.properties @@ -3,7 +3,7 @@ android.useAndroidX=true android.enableJetifier=true kotlin.code.style=official # __KOTLIN_COMPOSE_VERSION__ -kotlin.version=1.9.0 +kotlin.version=1.8.22 # __LATEST_COMPOSE_RELEASE_VERSION__ compose.version=1.5.0-dev1112 agp.version=7.3.1 diff --git a/components/resources/library/build.gradle.kts b/components/resources/library/build.gradle.kts index f40f7b7804..3bff485c99 100644 --- a/components/resources/library/build.gradle.kts +++ b/components/resources/library/build.gradle.kts @@ -63,7 +63,7 @@ kotlin { dependsOn(jvmAndAndroidMain) dependsOn(commonButJSMain) } - val androidUnitTest by getting { + val androidTest by getting { dependencies { } diff --git a/components/resources/library/src/iosMain/kotlin/org/jetbrains/compose/resources/Resource.ios.kt b/components/resources/library/src/iosMain/kotlin/org/jetbrains/compose/resources/Resource.ios.kt index fda8a5ddb7..9d9be82c9a 100644 --- a/components/resources/library/src/iosMain/kotlin/org/jetbrains/compose/resources/Resource.ios.kt +++ b/components/resources/library/src/iosMain/kotlin/org/jetbrains/compose/resources/Resource.ios.kt @@ -5,7 +5,6 @@ package org.jetbrains.compose.resources -import kotlinx.cinterop.ExperimentalForeignApi import kotlinx.cinterop.addressOf import kotlinx.cinterop.usePinned import platform.Foundation.NSBundle @@ -18,7 +17,6 @@ actual fun resource(path: String): Resource = UIKitResourceImpl(path) @ExperimentalResourceApi private class UIKitResourceImpl(path: String) : AbstractResourceImpl(path) { - @OptIn(ExperimentalForeignApi::class) override suspend fun readBytes(): ByteArray { val fileManager = NSFileManager.defaultManager() // todo: support fallback path at bundle root? diff --git a/components/resources/library/src/macosMain/kotlin/org/jetbrains/compose/resources/Resource.macos.kt b/components/resources/library/src/macosMain/kotlin/org/jetbrains/compose/resources/Resource.macos.kt index 0e4dee9096..becf5343ef 100644 --- a/components/resources/library/src/macosMain/kotlin/org/jetbrains/compose/resources/Resource.macos.kt +++ b/components/resources/library/src/macosMain/kotlin/org/jetbrains/compose/resources/Resource.macos.kt @@ -5,7 +5,6 @@ package org.jetbrains.compose.resources -import kotlinx.cinterop.ExperimentalForeignApi import kotlinx.cinterop.addressOf import kotlinx.cinterop.usePinned import platform.Foundation.NSData @@ -17,7 +16,6 @@ actual fun resource(path: String): Resource = MacOSResourceImpl(path) @ExperimentalResourceApi private class MacOSResourceImpl(path: String) : AbstractResourceImpl(path) { - @OptIn(ExperimentalForeignApi::class) override suspend fun readBytes(): ByteArray { val currentDirectoryPath = NSFileManager.defaultManager().currentDirectoryPath val contentsAtPath: NSData? = NSFileManager.defaultManager().run { From 02caf437dbd774219e2504793c9374751d0c6d8a Mon Sep 17 00:00:00 2001 From: Nikita Lipsky Date: Tue, 25 Jul 2023 11:48:13 +0300 Subject: [PATCH 02/21] Widgets gallery: fix for mismatched @Composable annotation (#3402) * Widgets gallery: fix for mismatched @Composable annotation * Widgets gallery: remove isSystemInDarkTheme expect function --- .../org/jetbrains/compose/demo/widgets/platform/System.kt | 8 -------- .../org/jetbrains/compose/demo/widgets/platform/System.kt | 3 --- .../org/jetbrains/compose/demo/widgets/theme/Theme.kt | 2 +- .../org/jetbrains/compose/demo/widgets/platform/System.kt | 7 ------- 4 files changed, 1 insertion(+), 19 deletions(-) delete mode 100644 examples/widgets-gallery/shared/src/androidMain/kotlin/org/jetbrains/compose/demo/widgets/platform/System.kt delete mode 100644 examples/widgets-gallery/shared/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/platform/System.kt delete mode 100644 examples/widgets-gallery/shared/src/iosMain/kotlin/org/jetbrains/compose/demo/widgets/platform/System.kt diff --git a/examples/widgets-gallery/shared/src/androidMain/kotlin/org/jetbrains/compose/demo/widgets/platform/System.kt b/examples/widgets-gallery/shared/src/androidMain/kotlin/org/jetbrains/compose/demo/widgets/platform/System.kt deleted file mode 100644 index be73331ce2..0000000000 --- a/examples/widgets-gallery/shared/src/androidMain/kotlin/org/jetbrains/compose/demo/widgets/platform/System.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.jetbrains.compose.demo.widgets.platform - -import androidx.compose.runtime.Composable -import androidx.compose.foundation.isSystemInDarkTheme as androidSystemIsInDarkTheme - -@Composable -actual fun isSystemInDarkTheme(): Boolean = - androidSystemIsInDarkTheme() \ No newline at end of file diff --git a/examples/widgets-gallery/shared/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/platform/System.kt b/examples/widgets-gallery/shared/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/platform/System.kt deleted file mode 100644 index 3050d9f245..0000000000 --- a/examples/widgets-gallery/shared/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/platform/System.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.jetbrains.compose.demo.widgets.platform - -expect fun isSystemInDarkTheme(): Boolean \ No newline at end of file diff --git a/examples/widgets-gallery/shared/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/theme/Theme.kt b/examples/widgets-gallery/shared/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/theme/Theme.kt index 64ec9f8344..32302d11b1 100644 --- a/examples/widgets-gallery/shared/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/theme/Theme.kt +++ b/examples/widgets-gallery/shared/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/theme/Theme.kt @@ -5,7 +5,7 @@ import androidx.compose.material.darkColors import androidx.compose.material.lightColors import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color -import org.jetbrains.compose.demo.widgets.platform.isSystemInDarkTheme +import androidx.compose.foundation.isSystemInDarkTheme import org.jetbrains.compose.demo.widgets.theme.ColorPallet.* // dark palettes diff --git a/examples/widgets-gallery/shared/src/iosMain/kotlin/org/jetbrains/compose/demo/widgets/platform/System.kt b/examples/widgets-gallery/shared/src/iosMain/kotlin/org/jetbrains/compose/demo/widgets/platform/System.kt deleted file mode 100644 index 80ad261e81..0000000000 --- a/examples/widgets-gallery/shared/src/iosMain/kotlin/org/jetbrains/compose/demo/widgets/platform/System.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.jetbrains.compose.demo.widgets.platform - -import androidx.compose.runtime.Composable -import org.jetbrains.skiko.SystemTheme - -@Composable -actual fun isSystemInDarkTheme(): Boolean = org.jetbrains.skiko.currentSystemTheme == SystemTheme.DARK From 5e71a953ef84b079170f1258cb43e77fc40e49f7 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Tue, 25 Jul 2023 21:39:53 +0200 Subject: [PATCH 03/21] Widgets gallery: fix for mismatched @Composable annotation (desktop) (#3409) Folloup after https://github.com/JetBrains/compose-multiplatform/pull/3402 --- .../org/jetbrains/compose/demo/widgets/platform/System.kt | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 examples/widgets-gallery/shared/src/desktopMain/kotlin/org/jetbrains/compose/demo/widgets/platform/System.kt diff --git a/examples/widgets-gallery/shared/src/desktopMain/kotlin/org/jetbrains/compose/demo/widgets/platform/System.kt b/examples/widgets-gallery/shared/src/desktopMain/kotlin/org/jetbrains/compose/demo/widgets/platform/System.kt deleted file mode 100644 index c479cb8cf0..0000000000 --- a/examples/widgets-gallery/shared/src/desktopMain/kotlin/org/jetbrains/compose/demo/widgets/platform/System.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.jetbrains.compose.demo.widgets.platform - -import org.jetbrains.skiko.SystemTheme - -actual fun isSystemInDarkTheme(): Boolean = org.jetbrains.skiko.currentSystemTheme == SystemTheme.DARK \ No newline at end of file From 946a185bf0502587fe80b36e3e131391b10ffcab Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Wed, 26 Jul 2023 01:12:49 +0200 Subject: [PATCH 04/21] Update CHANGELOG.md --- CHANGELOG.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ada629e21..38f52e8e98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,28 @@ +# 1.4.3 (June 2023) + +## Common + +### Features +- Support Kotlin 1.8.21, 1.8.22, 1.9.0 + +## iOS + +### Fixes +- [Using Indication as a parameter in extension function doesn't compile on iOS](https://github.com/JetBrains/compose-multiplatform/issues/3086) +- [Compile error when using delegated property with @Composable getters in objects](https://github.com/JetBrains/compose-multiplatform/issues/3216) +- [Using a public property extensions inside a class or object with a @Composable backing delegate fails to link for iOS targets](https://github.com/JetBrains/compose-multiplatform/issues/3084) + +## Dependencies + +This version of Compose Multiplatform is based on the next Jetpack Compose libraries: + +- [Compiler 1.4.4](https://developer.android.com/jetpack/androidx/releases/compose-compiler#1.4.4) +- [Runtime 1.4.3](https://developer.android.com/jetpack/androidx/releases/compose-runtime#1.4.3) +- [UI 1.4.3](https://developer.android.com/jetpack/androidx/releases/compose-ui#1.4.3) +- [Foundation 1.4.3](https://developer.android.com/jetpack/androidx/releases/compose-foundation#1.4.3) +- [Material 1.4.3](https://developer.android.com/jetpack/androidx/releases/compose-material#1.4.3) +- [Material3 1.0.1](https://developer.android.com/jetpack/androidx/releases/compose-material3#1.0.1) + # 1.4.1 (June 2023) ## Common From a6cdfd8b710682449fbc6c58338566b21965d3f6 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Wed, 26 Jul 2023 01:13:07 +0200 Subject: [PATCH 05/21] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 38f52e8e98..4634218440 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# 1.4.3 (June 2023) +# 1.4.3 (July 2023) ## Common From b67dde7295272b7f18226777e24be98384837dc9 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov <654232+AlexeyTsvetkov@users.noreply.github.com> Date: Wed, 26 Jul 2023 12:15:22 +0300 Subject: [PATCH 06/21] Add pro guard optimize flag (#3408) * Add DSL flag to control ProGuard's optimizations #3387 * Update default ProGuard version * Revert ProGuard default version to 7.2.2. --- .../desktop/application/dsl/ProguardSettings.kt | 1 + .../application/internal/configureJvmApplication.kt | 1 + .../desktop/application/tasks/AbstractProguardTask.kt | 8 ++++++++ gradle-plugins/gradle.properties | 2 +- .../README.md | 11 +++++++++++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/dsl/ProguardSettings.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/dsl/ProguardSettings.kt index 14a3e27b8f..3a6ef8d84f 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/dsl/ProguardSettings.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/dsl/ProguardSettings.kt @@ -22,4 +22,5 @@ abstract class ProguardSettings @Inject constructor( val configurationFiles: ConfigurableFileCollection = objects.fileCollection() val isEnabled: Property = objects.notNullProperty(false) val obfuscate: Property = objects.notNullProperty(false) + val optimize: Property = objects.notNullProperty(true) } diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/configureJvmApplication.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/configureJvmApplication.kt index 5f9a541bd1..36d5194667 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/configureJvmApplication.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/configureJvmApplication.kt @@ -267,6 +267,7 @@ private fun JvmApplicationContext.configureProguardTask( // That's why a task property is follows ProGuard design, // when our DSL does the opposite. dontobfuscate.set(settings.obfuscate.map { !it }) + dontoptimize.set(settings.optimize.map { !it }) dependsOn(unpackDefaultResources) defaultComposeRulesFile.set(unpackDefaultResources.flatMap { it.resources.defaultComposeProguardRules }) diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractProguardTask.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractProguardTask.kt index dc8b9187cc..201d5353b5 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractProguardTask.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractProguardTask.kt @@ -38,6 +38,10 @@ abstract class AbstractProguardTask : AbstractComposeDesktopTask() { @get:Input val dontobfuscate: Property = objects.nullableProperty() + @get:Optional + @get:Input + val dontoptimize: Property = objects.nullableProperty() + // todo: DSL for excluding default rules // also consider pulling coroutines rules from coroutines artifact // https://github.com/Kotlin/kotlinx.coroutines/blob/master/kotlinx-coroutines-core/jvm/resources/META-INF/proguard/coroutines.pro @@ -109,6 +113,10 @@ abstract class AbstractProguardTask : AbstractComposeDesktopTask() { writer.writeLn("-dontobfuscate") } + if (dontoptimize.orNull == true) { + writer.writeLn("-dontoptimize") + } + writer.writeLn(""" -keep public class ${mainClass.get()} { public static void main(java.lang.String[]); diff --git a/gradle-plugins/gradle.properties b/gradle-plugins/gradle.properties index cb78913521..2e0898d84f 100644 --- a/gradle-plugins/gradle.properties +++ b/gradle-plugins/gradle.properties @@ -2,7 +2,7 @@ org.gradle.parallel=true kotlin.code.style=official # Default version of Compose Libraries used by Gradle plugin -compose.version=1.4.1 +compose.version=1.5.0-dev1122 # The latest version of Compose Compiler used by Gradle plugin. Used only in tests/CI. compose.tests.compiler.version=1.5.0 # The latest version of Kotlin compatible with compose.tests.compiler.version. Used only in tests/CI. diff --git a/tutorials/Native_distributions_and_local_execution/README.md b/tutorials/Native_distributions_and_local_execution/README.md index 90e3791f9c..019d64c120 100755 --- a/tutorials/Native_distributions_and_local_execution/README.md +++ b/tutorials/Native_distributions_and_local_execution/README.md @@ -637,3 +637,14 @@ compose.desktop { } } ``` + +ProGuard's optimizations are enabled by default. To disable them, set the following property via Gradle DSL: +``` +compose.desktop { + application { + buildTypes.release.proguard { + optimize.set(false) + } + } +} +``` From 43a4086ba493bcaf70663508d5450e7536bee6f6 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Wed, 26 Jul 2023 17:23:38 +0200 Subject: [PATCH 07/21] Migrate examples to 1.4.3 (#3410) [Changelog](https://github.com/JetBrains/compose-multiplatform/releases/tag/v1.4.3) Changed templates: https://github.com/JetBrains/compose-multiplatform-template/commit/bbf71f754c6fd7564ebb8db8aa1e990e1160a748 https://github.com/JetBrains/compose-multiplatform-ios-android-template/commit/ba91acf5d6db3b23bdfca1b59398fcef00e1abca https://github.com/JetBrains/compose-multiplatform-desktop-template/commit/5204842894b2f175fe4f8e4d8e0be79eeec9c749 https://github.com/JetBrains/compose-multiplatform-html-library-template/commit/36d1554dee86922d90012363c862a5e88fe35a53 --- VERSIONING.md | 4 +++- ci/compose-uber-jar/gradle.properties | 2 +- ci/templates/desktop-template/gradle.properties | 4 ++-- ci/templates/html-library-template/gradle.properties | 4 ++-- ci/templates/multiplatform-template/gradle.properties | 4 ++-- examples/chat/gradle.properties | 4 ++-- examples/codeviewer/gradle.properties | 4 ++-- examples/falling-balls/gradle.properties | 4 ++-- examples/html/compose-bird/gradle.properties | 4 ++-- examples/html/compose-in-js/gradle.properties | 4 ++-- examples/html/landing/gradle.properties | 4 ++-- examples/html/with-react/gradle.properties | 4 ++-- examples/imageviewer/gradle.properties | 4 ++-- .../src/iosMain/kotlin/example/imageviewer/platform.ios.kt | 2 ++ .../kotlin/example/imageviewer/storage/FileExtensions.kt | 2 ++ .../kotlin/example/imageviewer/storage/IosImageStorage.ios.kt | 3 +++ .../iosMain/kotlin/example/imageviewer/view/CameraView.ios.kt | 3 +++ .../kotlin/example/imageviewer/view/LocationVisualizer.ios.kt | 2 ++ examples/intellij-plugin/gradle.properties | 4 ++-- examples/issues/gradle.properties | 4 ++-- examples/minesweeper/gradle.properties | 4 ++-- examples/notepad/gradle.properties | 4 ++-- examples/todoapp-lite/gradle.properties | 4 ++-- examples/todoapp/gradle.properties | 4 ++-- examples/visual-effects/gradle.properties | 4 ++-- examples/widgets-gallery/gradle.properties | 4 ++-- tools/replaceVersion.sh | 2 -- tutorials/HTML/Getting_Started/README.md | 4 ++-- 28 files changed, 56 insertions(+), 44 deletions(-) diff --git a/VERSIONING.md b/VERSIONING.md index 6bb5c5f49c..dfd636f481 100644 --- a/VERSIONING.md +++ b/VERSIONING.md @@ -37,7 +37,9 @@ Kotlin version | Minimal Compose version | Notes 1.8.0 | 1.3.0 | 1.3.0 is not supported by earlier k/native versions 1.8.10 | 1.3.1 1.8.20 | 1.4.0 -1.8.20 | 1.4.1 +1.8.21 | 1.4.3 +1.8.22 | 1.4.3 +1.9.0 | 1.4.3 ### Using the latest Kotlin version diff --git a/ci/compose-uber-jar/gradle.properties b/ci/compose-uber-jar/gradle.properties index 68f7a4b5db..9e87d28540 100644 --- a/ci/compose-uber-jar/gradle.properties +++ b/ci/compose-uber-jar/gradle.properties @@ -1,2 +1,2 @@ -compose.version=1.4.1 +compose.version=1.4.3 kotlin.code.style=official diff --git a/ci/templates/desktop-template/gradle.properties b/ci/templates/desktop-template/gradle.properties index c34a46a505..105a342d5a 100644 --- a/ci/templates/desktop-template/gradle.properties +++ b/ci/templates/desktop-template/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official -kotlin.version=1.8.20 -compose.version=1.4.1 +kotlin.version=1.9.0 +compose.version=1.4.3 diff --git a/ci/templates/html-library-template/gradle.properties b/ci/templates/html-library-template/gradle.properties index c34a46a505..105a342d5a 100644 --- a/ci/templates/html-library-template/gradle.properties +++ b/ci/templates/html-library-template/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official -kotlin.version=1.8.20 -compose.version=1.4.1 +kotlin.version=1.9.0 +compose.version=1.4.3 diff --git a/ci/templates/multiplatform-template/gradle.properties b/ci/templates/multiplatform-template/gradle.properties index 419dff984d..4d04eec50b 100644 --- a/ci/templates/multiplatform-template/gradle.properties +++ b/ci/templates/multiplatform-template/gradle.properties @@ -2,6 +2,6 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 android.useAndroidX=true android.enableJetifier=true kotlin.code.style=official -kotlin.version=1.8.20 +kotlin.version=1.9.0 agp.version=7.1.3 -compose.version=1.4.1 +compose.version=1.4.3 diff --git a/examples/chat/gradle.properties b/examples/chat/gradle.properties index 59a25387e0..0c5787e969 100644 --- a/examples/chat/gradle.properties +++ b/examples/chat/gradle.properties @@ -11,6 +11,6 @@ kotlin.native.useEmbeddableCompilerJar=true kotlin.mpp.androidSourceSetLayoutVersion=2 # Enable kotlin/native experimental memory model kotlin.native.binary.memoryModel=experimental -kotlin.version=1.8.20 +kotlin.version=1.9.0 agp.version=7.1.3 -compose.version=1.4.1 +compose.version=1.4.3 diff --git a/examples/codeviewer/gradle.properties b/examples/codeviewer/gradle.properties index 59a25387e0..0c5787e969 100644 --- a/examples/codeviewer/gradle.properties +++ b/examples/codeviewer/gradle.properties @@ -11,6 +11,6 @@ kotlin.native.useEmbeddableCompilerJar=true kotlin.mpp.androidSourceSetLayoutVersion=2 # Enable kotlin/native experimental memory model kotlin.native.binary.memoryModel=experimental -kotlin.version=1.8.20 +kotlin.version=1.9.0 agp.version=7.1.3 -compose.version=1.4.1 +compose.version=1.4.3 diff --git a/examples/falling-balls/gradle.properties b/examples/falling-balls/gradle.properties index 59a25387e0..0c5787e969 100644 --- a/examples/falling-balls/gradle.properties +++ b/examples/falling-balls/gradle.properties @@ -11,6 +11,6 @@ kotlin.native.useEmbeddableCompilerJar=true kotlin.mpp.androidSourceSetLayoutVersion=2 # Enable kotlin/native experimental memory model kotlin.native.binary.memoryModel=experimental -kotlin.version=1.8.20 +kotlin.version=1.9.0 agp.version=7.1.3 -compose.version=1.4.1 +compose.version=1.4.3 diff --git a/examples/html/compose-bird/gradle.properties b/examples/html/compose-bird/gradle.properties index 9c5d046412..c977b41e35 100644 --- a/examples/html/compose-bird/gradle.properties +++ b/examples/html/compose-bird/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official -kotlin.version=1.8.20 -compose.version=1.4.1 +kotlin.version=1.9.0 +compose.version=1.4.3 diff --git a/examples/html/compose-in-js/gradle.properties b/examples/html/compose-in-js/gradle.properties index b2e964491d..3dbe700979 100644 --- a/examples/html/compose-in-js/gradle.properties +++ b/examples/html/compose-in-js/gradle.properties @@ -2,5 +2,5 @@ kotlin.code.style=official kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.native.enableDependencyPropagation=false kotlin.js.webpack.major.version=4 -kotlin.version=1.8.20 -compose.version=1.4.1 +kotlin.version=1.9.0 +compose.version=1.4.3 diff --git a/examples/html/landing/gradle.properties b/examples/html/landing/gradle.properties index 9c5d046412..c977b41e35 100644 --- a/examples/html/landing/gradle.properties +++ b/examples/html/landing/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official -kotlin.version=1.8.20 -compose.version=1.4.1 +kotlin.version=1.9.0 +compose.version=1.4.3 diff --git a/examples/html/with-react/gradle.properties b/examples/html/with-react/gradle.properties index 9c5d046412..c977b41e35 100644 --- a/examples/html/with-react/gradle.properties +++ b/examples/html/with-react/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official -kotlin.version=1.8.20 -compose.version=1.4.1 +kotlin.version=1.9.0 +compose.version=1.4.3 diff --git a/examples/imageviewer/gradle.properties b/examples/imageviewer/gradle.properties index ed81b24b3f..a50918ec89 100644 --- a/examples/imageviewer/gradle.properties +++ b/examples/imageviewer/gradle.properties @@ -11,6 +11,6 @@ kotlin.mpp.androidSourceSetLayoutVersion=2 kotlin.native.useEmbeddableCompilerJar=true # Enable kotlin/native experimental memory model kotlin.native.binary.memoryModel=experimental -kotlin.version=1.8.20 +kotlin.version=1.9.0 agp.version=7.1.3 -compose.version=1.4.1 +compose.version=1.4.3 diff --git a/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/platform.ios.kt b/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/platform.ios.kt index 9926f5250c..92d4b9d370 100644 --- a/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/platform.ios.kt +++ b/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/platform.ios.kt @@ -8,6 +8,7 @@ import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.LayoutDirection import example.imageviewer.icon.IconIosShare import kotlinx.cinterop.useContents +import kotlinx.cinterop.ExperimentalForeignApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.IO import platform.CoreFoundation.CFUUIDCreate @@ -41,6 +42,7 @@ class IosStorableImage( actual typealias PlatformStorableImage = IosStorableImage +@OptIn(ExperimentalForeignApi::class) actual fun createUUID(): String = CFBridgingRelease(CFUUIDCreateString(null, CFUUIDCreate(null))) as String diff --git a/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/storage/FileExtensions.kt b/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/storage/FileExtensions.kt index 3513a1f662..a003027160 100644 --- a/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/storage/FileExtensions.kt +++ b/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/storage/FileExtensions.kt @@ -1,3 +1,5 @@ +@file:OptIn(ExperimentalForeignApi::class) + package example.imageviewer.storage import kotlinx.cinterop.* diff --git a/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/storage/IosImageStorage.ios.kt b/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/storage/IosImageStorage.ios.kt index 93408a61d1..59b0d7c1be 100644 --- a/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/storage/IosImageStorage.ios.kt +++ b/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/storage/IosImageStorage.ios.kt @@ -7,6 +7,7 @@ import example.imageviewer.PlatformStorableImage import example.imageviewer.model.PictureData import example.imageviewer.toImageBitmap import kotlinx.cinterop.CValue +import kotlinx.cinterop.ExperimentalForeignApi import kotlinx.cinterop.useContents import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -122,6 +123,7 @@ class IosImageStorage( } } +@OptIn(ExperimentalForeignApi::class) private fun UIImage.fitInto(px: Int): UIImage { val targetScale = maxOf( px.toFloat() / size.useContents { width }, @@ -131,6 +133,7 @@ private fun UIImage.fitInto(px: Int): UIImage { return resize(newSize) } +@OptIn(ExperimentalForeignApi::class) private fun UIImage.resize(targetSize: CValue): UIImage { val currentSize = this.size val widthRatio = targetSize.useContents { width } / currentSize.useContents { width } diff --git a/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/view/CameraView.ios.kt b/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/view/CameraView.ios.kt index c76d44fa88..5499750fba 100644 --- a/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/view/CameraView.ios.kt +++ b/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/view/CameraView.ios.kt @@ -18,6 +18,7 @@ import example.imageviewer.model.GpsPosition import example.imageviewer.model.PictureData import example.imageviewer.model.createCameraPictureData import kotlinx.cinterop.CValue +import kotlinx.cinterop.ExperimentalForeignApi import kotlinx.cinterop.ObjCAction import kotlinx.cinterop.useContents import platform.AVFoundation.* @@ -121,6 +122,7 @@ private fun BoxScope.AuthorizedCamera( } } +@OptIn(ExperimentalForeignApi::class) @Composable private fun BoxScope.RealDeviceCamera( camera: AVCaptureDevice, @@ -272,6 +274,7 @@ private fun BoxScope.RealDeviceCamera( } } +@OptIn(ExperimentalForeignApi::class) fun CLLocation.toGps() = GpsPosition( latitude = coordinate.useContents { latitude }, diff --git a/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/view/LocationVisualizer.ios.kt b/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/view/LocationVisualizer.ios.kt index 451d3b9ee5..4da53ef73b 100644 --- a/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/view/LocationVisualizer.ios.kt +++ b/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/view/LocationVisualizer.ios.kt @@ -6,11 +6,13 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.interop.UIKitView import example.imageviewer.model.GpsPosition +import kotlinx.cinterop.ExperimentalForeignApi import platform.CoreLocation.CLLocationCoordinate2DMake import platform.MapKit.MKCoordinateRegionMakeWithDistance import platform.MapKit.MKMapView import platform.MapKit.MKPointAnnotation +@OptIn(ExperimentalForeignApi::class) @Composable actual fun LocationVisualizer( modifier: Modifier, diff --git a/examples/intellij-plugin/gradle.properties b/examples/intellij-plugin/gradle.properties index 9c5d046412..c977b41e35 100644 --- a/examples/intellij-plugin/gradle.properties +++ b/examples/intellij-plugin/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official -kotlin.version=1.8.20 -compose.version=1.4.1 +kotlin.version=1.9.0 +compose.version=1.4.3 diff --git a/examples/issues/gradle.properties b/examples/issues/gradle.properties index fe0cb4ce3e..a61fd0475a 100644 --- a/examples/issues/gradle.properties +++ b/examples/issues/gradle.properties @@ -19,6 +19,6 @@ kotlin.code.style=official android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true -kotlin.version=1.8.20 +kotlin.version=1.9.0 agp.version=7.1.3 -compose.version=1.4.1 +compose.version=1.4.3 diff --git a/examples/minesweeper/gradle.properties b/examples/minesweeper/gradle.properties index 59a25387e0..0c5787e969 100644 --- a/examples/minesweeper/gradle.properties +++ b/examples/minesweeper/gradle.properties @@ -11,6 +11,6 @@ kotlin.native.useEmbeddableCompilerJar=true kotlin.mpp.androidSourceSetLayoutVersion=2 # Enable kotlin/native experimental memory model kotlin.native.binary.memoryModel=experimental -kotlin.version=1.8.20 +kotlin.version=1.9.0 agp.version=7.1.3 -compose.version=1.4.1 +compose.version=1.4.3 diff --git a/examples/notepad/gradle.properties b/examples/notepad/gradle.properties index c34a46a505..105a342d5a 100644 --- a/examples/notepad/gradle.properties +++ b/examples/notepad/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official -kotlin.version=1.8.20 -compose.version=1.4.1 +kotlin.version=1.9.0 +compose.version=1.4.3 diff --git a/examples/todoapp-lite/gradle.properties b/examples/todoapp-lite/gradle.properties index 59a25387e0..0c5787e969 100755 --- a/examples/todoapp-lite/gradle.properties +++ b/examples/todoapp-lite/gradle.properties @@ -11,6 +11,6 @@ kotlin.native.useEmbeddableCompilerJar=true kotlin.mpp.androidSourceSetLayoutVersion=2 # Enable kotlin/native experimental memory model kotlin.native.binary.memoryModel=experimental -kotlin.version=1.8.20 +kotlin.version=1.9.0 agp.version=7.1.3 -compose.version=1.4.1 +compose.version=1.4.3 diff --git a/examples/todoapp/gradle.properties b/examples/todoapp/gradle.properties index 4020275597..1b42962c80 100755 --- a/examples/todoapp/gradle.properties +++ b/examples/todoapp/gradle.properties @@ -27,5 +27,5 @@ kotlin.native.disableCompilerDaemon=true # After updating Compose Multiplatform version, update corresponding Jetpack Compose versions # in Android module (search "Workaround for https://github.com/JetBrains/compose-jb/issues/2340") #TODO also change version in buildSrc/gradle.properties -kotlin.version=1.8.20 -compose.version=1.4.1 +kotlin.version=1.9.0 +compose.version=1.4.3 diff --git a/examples/visual-effects/gradle.properties b/examples/visual-effects/gradle.properties index 9a5dc82f4e..125fb44055 100644 --- a/examples/visual-effects/gradle.properties +++ b/examples/visual-effects/gradle.properties @@ -11,6 +11,6 @@ kotlin.native.cacheKind=none kotlin.native.useEmbeddableCompilerJar=true # Enable kotlin/native experimental memory model kotlin.native.binary.memoryModel=experimental -kotlin.version=1.8.20 +kotlin.version=1.9.0 agp.version=7.1.3 -compose.version=1.4.1 +compose.version=1.4.3 diff --git a/examples/widgets-gallery/gradle.properties b/examples/widgets-gallery/gradle.properties index 59a25387e0..0c5787e969 100644 --- a/examples/widgets-gallery/gradle.properties +++ b/examples/widgets-gallery/gradle.properties @@ -11,6 +11,6 @@ kotlin.native.useEmbeddableCompilerJar=true kotlin.mpp.androidSourceSetLayoutVersion=2 # Enable kotlin/native experimental memory model kotlin.native.binary.memoryModel=experimental -kotlin.version=1.8.20 +kotlin.version=1.9.0 agp.version=7.1.3 -compose.version=1.4.1 +compose.version=1.4.3 diff --git a/tools/replaceVersion.sh b/tools/replaceVersion.sh index a94dfb1b11..7a5b1621e9 100755 --- a/tools/replaceVersion.sh +++ b/tools/replaceVersion.sh @@ -8,9 +8,7 @@ ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"/.. declare -a folders=( "$ROOT/examples" "$ROOT/gradle-plugins" - "$ROOT/components" "$ROOT/ci" - "$ROOT/html" "$ROOT/tutorials" ) diff --git a/tutorials/HTML/Getting_Started/README.md b/tutorials/HTML/Getting_Started/README.md index 81c7f99365..73f3a797af 100644 --- a/tutorials/HTML/Getting_Started/README.md +++ b/tutorials/HTML/Getting_Started/README.md @@ -36,8 +36,8 @@ pluginManagement { ``` kotlin // Add compose gradle plugin plugins { - kotlin("multiplatform") version "1.8.20" - id("org.jetbrains.compose") version "1.4.1" + kotlin("multiplatform") version "1.9.0" + id("org.jetbrains.compose") version "1.4.3" } // Add maven repositories From d39136935a4d0dac99306ac7dfbc4c98fcc3d1b4 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Fri, 28 Jul 2023 13:52:40 +0200 Subject: [PATCH 08/21] 1.5.0-beta01 CHANGELOG (#3407) --- CHANGELOG.md | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4634218440..8cc0e92153 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,118 @@ +# 1.5.0-beta01 (July 2023) + +## Common + +### Features +- [`Dialog` API is available to use from common source set](https://github.com/JetBrains/compose-multiplatform-core/pull/632) +- [`Popup` API is available to use from common source set](https://github.com/JetBrains/compose-multiplatform-core/pull/611) +- [`WindowInsets` API is available to use from common source set](https://github.com/JetBrains/compose-multiplatform-core/pull/586) +- [A warning if `compose.kotlinCompilerPlugin` is set to `androidx.compose.compiler.compiler`](https://github.com/JetBrains/compose-multiplatform/pull/3313) + +### Fixes +- [`Popup`. Fix overriding `pressOwner` on multitouch](https://github.com/JetBrains/compose-multiplatform-core/pull/704) +- [Fix sending multiple touches in tests](https://github.com/JetBrains/compose-multiplatform-core/pull/688) +- [Fix multi-owner input processing](https://github.com/JetBrains/compose-multiplatform-core/pull/634) +- [Fix paragraph word boundary unicode handling](https://github.com/JetBrains/compose-multiplatform-core/pull/541) +- [Optimize the `Canvas` transformation functions](https://github.com/JetBrains/skiko/pull/724) +- [Fix click outside of common `Dialog` behaviour](https://github.com/JetBrains/compose-multiplatform-core/pull/707) + +## iOS + +### Features +- [iOS native scroll and feel](https://github.com/JetBrains/compose-multiplatform-core/pull/609) +- [Simplify resource management](https://github.com/JetBrains/compose-multiplatform/pull/3340) (works without CocoaPods now) +- [`TextField` keyboardOptions, capitalization](https://github.com/JetBrains/compose-multiplatform/issues/2735) +- [`TextField`, keyboard behavior when have fullscreen size TextField](https://github.com/JetBrains/compose-multiplatform/issues/2752) +- [`TextField`, different behavior strategies on appearing the keyboard](https://github.com/JetBrains/compose-multiplatform/issues/3128) +- [Insets on iOS](https://github.com/JetBrains/compose-multiplatform-core/pull/577) +- [Support `Density.textSize` (Dynamic Type)](https://github.com/JetBrains/compose-multiplatform/issues/2567) +- [Change default fonts](https://github.com/JetBrains/compose-multiplatform-core/pull/552) (San Francisco is the default font) +- [UIKit public `LocalUIViewController`](https://github.com/JetBrains/compose-multiplatform-core/pull/501) + +### Fixes +- [Fix dynamic framework support](https://github.com/JetBrains/skiko/pull/763) +- [Fix `TextField` context menu](https://github.com/JetBrains/compose-multiplatform/issues/3276) +- [Fix complex blending on iOS](https://github.com/JetBrains/skiko/pull/728) +- [`ViewConfiguration.touchSlop` value is quite low on iOS](https://github.com/JetBrains/compose-multiplatform/issues/3397) +- [Fix `topLeftOffset` calculation on iOS in Split View](https://github.com/JetBrains/compose-multiplatform-core/pull/678) +- [`Modifier.draggable` `onDragStopped` not called](https://github.com/JetBrains/compose-multiplatform/issues/3310) +- [`UIKitView`. Fix lifetime discrepancy within the composition](https://github.com/JetBrains/compose-multiplatform-core/pull/576/files) +- [Support 120hz screens](https://github.com/JetBrains/compose-multiplatform-ios-android-template/pull/17) +- [Fix incorrect Skiko render target on iOS Metal](https://github.com/JetBrains/compose-multiplatform-core/pull/554) +- [Properly detect content based text direction on native](https://github.com/JetBrains/compose-multiplatform-core/pull/514) +- Implemented all low-level functions to avoid random crashes + - [Implement `TreeSet`](https://github.com/JetBrains/compose-multiplatform/issues/2878) + - [Implement `AnnotatedString.transform`](https://github.com/JetBrains/compose-multiplatform-core/pull/523) + - [Implement `WeakHashMap`](https://github.com/JetBrains/compose-multiplatform/issues/2877) + - [Implement `typefacesCache`](https://github.com/JetBrains/compose-multiplatform/issues/2873) + - [Implement `ExpireAfterAccessCache`](https://github.com/JetBrains/compose-multiplatform/issues/2871) + - [Implement `NativeStringDelegate`](https://github.com/JetBrains/compose-multiplatform/issues/2876) + +### API Changes + - Resource management was reimplemented. Follow [the guide in the PR](https://github.com/JetBrains/compose-multiplatform/pull/3340) to support new feautures + +## Desktop + +### Features +- [Swing interop. Experimental off-screen rendering on graphics](https://github.com/JetBrains/compose-multiplatform-core/pull/601) (hardware accelerated only on macOs at the moment) +- [Swing interop. `ComposePanel` that can be disposed manually](https://github.com/JetBrains/compose-multiplatform-core/pull/620) +- [Add semantic properties to `DialogWindow`, `Popup` and `Dialog`](https://github.com/JetBrains/compose-multiplatform-core/pull/698) +- [Use `Segoe UI` as sans serif font on Windows](https://github.com/JetBrains/compose-multiplatform-core/pull/557) +- [Add ProGuard optimize flag](https://github.com/JetBrains/compose-multiplatform/pull/3408) + +### Fixes +- [Fix loosing frames on macOs](https://github.com/JetBrains/skiko/pull/753) +- [Scrolling `LazyColumn` via mouse wheel stops working](https://github.com/JetBrains/compose-multiplatform/issues/3366) +- [`Slider` can be moved using keyboard, but cannot be submitted](https://github.com/JetBrains/compose-multiplatform/issues/2798) +- [Make one pixel beyond the scrollbar thumb react correctly to clicks](https://github.com/JetBrains/compose-multiplatform-core/pull/505) +- [`VerticalScrollbar` doesn't work properly when `LazyColumn` exists `StickyHeader`](https://github.com/JetBrains/compose-multiplatform/issues/2940) +- [All `Popup` overloads call dismiss on `Esc` key by default](https://github.com/JetBrains/compose-multiplatform-core/pull/712) +- [Fix Could not infer Java runtime version for Java home directory](https://github.com/JetBrains/compose-multiplatform/issues/3133) +- [Usage of deprecated `forEachGesture` in `Scrollbar.desktop.kt`](https://github.com/JetBrains/compose-multiplatform/issues/3045) +- Test framework fixes + - [Implement idling resources for tests](https://github.com/JetBrains/compose-multiplatform-core/pull/599) + - [Implement `SemanticsNodeInteraction.captureToImage()`](https://github.com/JetBrains/compose-multiplatform-core/pull/589) + - [Wait until compose is idle before returning from `DesktopTestOwner.getRoots()`](https://github.com/JetBrains/compose-multiplatform-core/pull/588) + - [When the test main clock is advanced, call `ComposeScene.render` with the current test time](https://github.com/JetBrains/compose-multiplatform-core/pull/584) + - [Add timestamps to batched test input events, and advance the test clock accordingly when sending them](https://github.com/JetBrains/compose-multiplatform-core/pull/578) + - [Tests support semanatic nodes inside `Window` and `DialogWindow`](https://github.com/JetBrains/compose-multiplatform-core/pull/697) + +### API Changes +- [Rename desktop's `Dialog` to `DialogWindow`](https://github.com/JetBrains/compose-multiplatform-core/pull/661) + +## Web + +### Features +- [Let `ComposeWindow` accept a custom canvas id (html canvas element id)](https://github.com/JetBrains/compose-multiplatform-core/pull/626) +- [Support `Scrollbar`](https://github.com/JetBrains/compose-multiplatform-core/pull/571) + +### Fixes +- [Workaround `ComposeWindow` multiple event listeners on resize](https://github.com/JetBrains/compose-multiplatform-core/pull/692) +- [Fix `Modifier.pointerHoverIcon` for browser apps](https://github.com/JetBrains/compose-multiplatform-core/pull/629) +- [Fux `RoundedCornerShape` with zero corners](https://github.com/JetBrains/compose-multiplatform/issues/3013) +- [Fix `ScrollConfig` in web target](https://github.com/JetBrains/compose-multiplatform-core/pull/628) +- Implemented low-level functions to avoid random crashes: + - [Implement cache key in `PlatformFont`](https://github.com/JetBrains/compose-multiplatform-core/pull/671) + - [implement platform detection to apply correct `KeyMapping` and `FontFamiliesMapping`](https://github.com/JetBrains/compose-multiplatform-core/pull/637) + - [Implement `PlatformLocale` and `StringDelegate` for k/wasm](https://github.com/JetBrains/compose-multiplatform-core/pull/625) + - [Add missing `getAndIncrement` in `AtomicLong` implementation for web](https://github.com/JetBrains/compose-multiplatform-core/pull/570) + +## HTML library + +### Features +- [Make HTML `TestUtils` wait functions cancellable](https://github.com/JetBrains/compose-multiplatform/pull/3320) + +## Dependencies + +This version of Compose Multiplatform is based on the next Jetpack Compose libraries: + +- [Compiler 1.5.0](https://developer.android.com/jetpack/androidx/releases/compose-compiler#1.5.0) +- [Runtime 1.5.0-beta03](https://developer.android.com/jetpack/androidx/releases/compose-runtime#1.5.0-beta03) +- [UI 1.5.0-beta03](https://developer.android.com/jetpack/androidx/releases/compose-ui#1.5.0-beta03) +- [Foundation 1.5.0-beta03](https://developer.android.com/jetpack/androidx/releases/compose-foundation#1.5.0-beta03) +- [Material 1.5.0-beta03](https://developer.android.com/jetpack/androidx/releases/compose-material#1.5.0-beta03) +- [Material3 1.1.1](https://developer.android.com/jetpack/androidx/releases/compose-material3#1.1.1) + # 1.4.3 (July 2023) ## Common From cb468adf961124c021d3259b4a34f31ea636cf4a Mon Sep 17 00:00:00 2001 From: Egor Tolstoy Date: Fri, 28 Jul 2023 16:06:17 +0300 Subject: [PATCH 09/21] Added performance issue template (#3415) * Added performance issue template * Added FPS mention --- .github/ISSUE_TEMPLATE/performance.md | 48 +++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/performance.md diff --git a/.github/ISSUE_TEMPLATE/performance.md b/.github/ISSUE_TEMPLATE/performance.md new file mode 100644 index 0000000000..7cd4658e8b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/performance.md @@ -0,0 +1,48 @@ +--- +name: Performance problem +about: Create a report to help us improve +title: '' +labels: ['submitted', 'performance'] +assignees: '' + +--- + +**Describe the problem** +Explain the performance issue you're experiencing, including the following details: + +- What specific issue did you encounter? (e.g. missing frames, high CPU usage, memory leaks) +- Have you noticed any patterns or specific circumstances under which the problem occurs? + +**Affected platforms** +Select one of the platforms below: +- All +- Desktop +- Web (K/Wasm) - Canvas based API +- Web (K/JS) - Canvas based API +- Web (K/JS) - HTML library +- iOS +- Other + +If the problem is Android-only, report it in the [Jetpack Compose tracker](https://issuetracker.google.com/issues/new?component=612128) + +**Versions** +- Kotlin version: +- Compose Multiplatform version: +- OS version(s) (required for Desktop and iOS issues): +- OS architecture (x86 or arm64): +- JDK (for desktop issues): + +**Sample code** +If possible, provide a small piece of code that reproduces the problem. If the code snippet is too large to paste here, please link to a Gist, a GitHub repo, or any other public code repository. + +**Reproduction steps** +Please provide a detailed step-by-step guide on how to reproduce the issue you are experiencing. + +**Video** +If you're reporting slow app work or missing frames, please provide a video of the problem. + +**Profiling data** +Please provide any relevant profiling data that might be helpful. This could include information like FPS, memory usage, CPU time, or any other data that could provide insight into the performance issue. + +**Additional information** +Provide any other details that you think might be helpful for us to understand the problem. This could include things like the system configuration, external factors, etc. From 77a070ae45bb62fe783b1bbb58614b786aed0c46 Mon Sep 17 00:00:00 2001 From: Oleksandr Karpovich Date: Mon, 31 Jul 2023 11:04:29 +0200 Subject: [PATCH 10/21] Update build.gradle.kts (#3425) --- compose/integrations/composable-test-cases/build.gradle.kts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/compose/integrations/composable-test-cases/build.gradle.kts b/compose/integrations/composable-test-cases/build.gradle.kts index dbc094a3df..541d06f1b2 100644 --- a/compose/integrations/composable-test-cases/build.gradle.kts +++ b/compose/integrations/composable-test-cases/build.gradle.kts @@ -1,3 +1,4 @@ +import org.jetbrains.kotlin.gradle.dsl.KotlinCompile import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompile group "com.example" @@ -8,6 +9,7 @@ allprojects { google() mavenCentral() maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") + maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev/") // to test with kotlin dev builds // mavenLocal() } @@ -28,6 +30,10 @@ allprojects { "-Xklib-enable-signature-clash-checks=false", ) } + + tasks.withType>().configureEach { + kotlinOptions.freeCompilerArgs += "-Xpartial-linkage=disable" + } } disableYarnLockMismatchReport() } From 1ae72a86471caa8aa0779755cb1f281be4c39c02 Mon Sep 17 00:00:00 2001 From: Qinglin Date: Tue, 1 Aug 2023 00:32:34 +0800 Subject: [PATCH 11/21] Fix typo in tutorials/Navigation README.md (#3419) Correct minor grammatical errors and fix some misspellings. --- tutorials/Navigation/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tutorials/Navigation/README.md b/tutorials/Navigation/README.md index 2840086db4..a1037a4979 100644 --- a/tutorials/Navigation/README.md +++ b/tutorials/Navigation/README.md @@ -2,7 +2,7 @@ ## General attitude -The Jetpack Compose navigation library ([navigation-compose](https://developer.android.com/jetpack/compose/navigation)) is an Android-only library, and so can not be used together with Compose for Desktop. Our general attitude is not to “force” people to use a particular first-party library. However there are third-party libraries available. One could consider [Decompose](https://github.com/arkivanov/Decompose) as possible solution. +The Jetpack Compose navigation library ([navigation-compose](https://developer.android.com/jetpack/compose/navigation)) is an Android-only library, and so can not be used together with Compose for Desktop. Our general attitude is not to “force” people to use a particular first-party library. However, there are third-party libraries available. One could consider [Decompose](https://github.com/arkivanov/Decompose) as possible solution. ## Patterns @@ -102,7 +102,7 @@ fun ItemDetailsScreen(item: Item, onBackClick: () -> Unit) { ### Children configuration -One of the main goals of the Decompose library is compile time safety. Each child is described by a class called `Configuration`. The purpose of the `Configuration` is to describe what child should be used and what arguments it has. So for each child there is an instance of its own `Configuration` class. Normally there are multiple children involved in the navigation, so the whole set of configurations is normally a sealed class. +One of the main goals of the Decompose library is compiled time safety. Each child is described by a class called `Configuration`. The purpose of the `Configuration` is to describe what child should be used and what arguments it has. So for each child there is an instance of its own `Configuration` class. Normally there are multiple children involved in the navigation, so the whole set of configurations is normally a sealed class. For example, for a simple List-Details navigation we need just two entries: @@ -126,8 +126,8 @@ Desktop Compose is actually a multiplatform library and can also be used in Andr To make this possible, all child Configurations must be [Parcelable](https://developer.android.com/reference/android/os/Parcelable). For convenience, Decompose defines both `Parcelable` and `@Parcelize` using [expect/actual](https://kotlinlang.org/docs/reference/mpp-connect-to-apis.html): -- `Parcelable` - this interface is defined by Decompose in the `commonMain` source set. It is typealised to the Android's `Parcelable` interface for Android target, and is just an empty interface in all other targets (including JVM/Desktop). -- `@Parcelize` - this annotation is also defined in the `commonMain` source set. It is typealised to the `@Parcelize` annotation provided by the [kotlin-parcelize](https://developer.android.com/kotlin/parcelize) plugin. And it is missing (as not needed) in non-Android targets. +- `Parcelable` - this interface is defined by Decompose in the `commonMain` source set. It is type-aliased to the Android's `Parcelable` interface for Android target, and is just an empty interface in all other targets (including JVM/Desktop). +- `@Parcelize` - this annotation is also defined in the `commonMain` source set. It is type-aliased to the `@Parcelize` annotation provided by the [kotlin-parcelize](https://developer.android.com/kotlin/parcelize) plugin. And it is missing (as not needed) in non-Android targets. If you need Android support, please make sure you have `kotlin-parcelize` plugin enabled. All Configurations should look like this: @@ -148,7 +148,7 @@ sealed class Configuration : Parcelable { This pattern should be chosen if any of the following apply: -1. You support Multipaltform targets with different UI frameworks, and you want to share the navigation logic between them. For example if you support Desktop with Compose UI, iOS with SwiftUI and/or JavaScript with React UI. +1. You support Multiplatform targets with different UI frameworks, and you want to share the navigation logic between them. For example if you support Desktop with Compose UI, iOS with SwiftUI and/or JavaScript with React UI. 2. You want to keep children running while in the back stack (stopped, but not destroyed). 3. You are targeting Android and need instance retaining functionality in children (aka AndroidX [ViewModels](https://developer.android.com/topic/libraries/architecture/viewmodel)) and you want to hide this logic as implementation details. 4. You want to keep the navigation logic (and probably the business logic) separate from UI. From a947c5efcca9802dad5a2d3a3b4e0d4447116300 Mon Sep 17 00:00:00 2001 From: Oleksandr Karpovich Date: Tue, 1 Aug 2023 12:17:56 +0200 Subject: [PATCH 12/21] Disable signature clash checks for web targets (#3445) Compose compiler plugin produces symbols with identical signatures. k/jvm and k/native do not check for clashes, while k/js does. We disable the checker in our gradle plugin, so our users do not need to add extra workaround on their side. --- .../org/jetbrains/compose/ComposePlugin.kt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt index a831a9e8a7..0bc635f99a 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt @@ -24,11 +24,14 @@ import org.jetbrains.compose.experimental.internal.configureExperimental import org.jetbrains.compose.experimental.uikit.internal.resources.configureSyncTask import org.jetbrains.compose.internal.KOTLIN_MPP_PLUGIN_ID import org.jetbrains.compose.internal.mppExt +import org.jetbrains.compose.internal.mppExtOrNull import org.jetbrains.compose.internal.utils.currentTarget import org.jetbrains.compose.web.WebExtension import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion import org.jetbrains.kotlin.gradle.dsl.KotlinCompile +import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompile +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType internal val composeVersion get() = ComposeBuildConfig.composeVersion @@ -67,6 +70,23 @@ class ComposePlugin : Plugin { } } } + + disableSignatureClashCheck(project) + } + } + + private fun disableSignatureClashCheck(project: Project) { + val hasAnyWebTarget = project.mppExtOrNull?.targets?.firstOrNull { + it.platformType == KotlinPlatformType.js || + it.platformType == KotlinPlatformType.wasm + } != null + if (hasAnyWebTarget) { + // currently k/wasm compile task is covered by KotlinJsCompile type + project.tasks.withType(KotlinJsCompile::class.java).configureEach { + it.kotlinOptions.freeCompilerArgs += listOf( + "-Xklib-enable-signature-clash-checks=false", + ) + } } } From 563575a866c09c283ba9998e3ab44888e8a00779 Mon Sep 17 00:00:00 2001 From: Sebastian Aigner Date: Wed, 2 Aug 2023 19:46:25 +0200 Subject: [PATCH 13/21] Update Navigation tutorial to refer to Awesome List (#3441) Remove third-party specific samples --- examples/README.md | 29 +- examples/todoapp/.gitignore | 15 - examples/todoapp/.run/browser.run.xml | 23 - examples/todoapp/.run/desktop.run.xml | 23 - examples/todoapp/README.md | 61 - examples/todoapp/android/build.gradle.kts | 44 - .../android/src/main/AndroidManifest.xml | 28 - .../src/main/java/example/todo/android/App.kt | 13 - .../main/java/example/todo/android/Color.kt | 8 - .../java/example/todo/android/MainActivity.kt | 39 - .../main/java/example/todo/android/Shape.kt | 11 - .../main/java/example/todo/android/Theme.kt | 35 - .../main/java/example/todo/android/Type.kt | 16 - .../drawable-v24/ic_launcher_foreground.xml | 34 - .../res/drawable/ic_launcher_background.xml | 170 - .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 2963 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 4905 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2060 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2783 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4490 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 6895 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 6387 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 10413 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 9128 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 15132 -> 0 bytes .../android/src/main/res/values/strings.xml | 4 - examples/todoapp/build.gradle.kts | 19 - examples/todoapp/buildSrc/build.gradle.kts | 24 - .../buildSrc/buildSrc/build.gradle.kts | 12 - .../buildSrc/buildSrc/src/main/kotlin/Deps.kt | 101 - .../IosWorkaroundSupportArm64Simulator.kt | 17 - examples/todoapp/buildSrc/gradle.properties | 3 - .../src/main/kotlin/android-setup.gradle.kts | 26 - .../multiplatform-compose-setup.gradle.kts | 39 - .../kotlin/multiplatform-setup.gradle.kts | 75 - .../common/compose-ui/build.gradle.kts | 25 - .../src/androidMain/AndroidManifest.xml | 2 - .../example/todo/common/ui/Scrollbars.kt | 26 - .../example/todo/common/ui/Scrollbars.kt | 23 - .../example/todo/common/ui/ShortcutHandler.kt | 15 - .../example/todo/common/ui/TodoEditUi.kt | 60 - .../example/todo/common/ui/TodoMainUi.kt | 158 - .../example/todo/common/ui/TodoRootUi.kt | 25 - .../example/todo/common/ui/Scrollbars.kt | 34 - .../example/todo/common/ui/TodoEditPreview.kt | 28 - .../example/todo/common/ui/TodoMainPreview.kt | 37 - .../todoapp/common/database/build.gradle.kts | 46 - .../src/androidMain/AndroidManifest.xml | 2 - .../database/TodoDatabaseDriverFactory.kt | 14 - .../database/DefaultTodoSharedDatabase.kt | 91 - .../common/database/TestTodoSharedDatabase.kt | 105 - .../common/database/TodoSharedDatabase.kt | 22 - .../todo/common/database/TodoDatabase.sq | 39 - .../database/TodoDatabaseDriverFactory.kt | 15 - .../database/TodoDatabaseDriverFactory.kt | 9 - .../database/TodoDatabaseDriverFactory.kt | 10 - examples/todoapp/common/edit/build.gradle.kts | 19 - .../edit/src/androidMain/AndroidManifest.xml | 2 - .../example/todo/common/edit/TodoEdit.kt | 23 - .../example/todo/common/edit/TodoItem.kt | 6 - .../todo/common/edit/integration/Mappers.kt | 12 - .../edit/integration/TodoEditComponent.kt | 48 - .../edit/integration/TodoEditStoreDatabase.kt | 31 - .../todo/common/edit/store/TodoEditStore.kt | 24 - .../edit/store/TodoEditStoreProvider.kt | 83 - examples/todoapp/common/main/build.gradle.kts | 27 - .../main/src/androidMain/AndroidManifest.xml | 2 - .../example/todo/common/main/TodoItem.kt | 8 - .../example/todo/common/main/TodoMain.kt | 27 - .../todo/common/main/integration/Mappers.kt | 12 - .../main/integration/TodoMainComponent.kt | 54 - .../main/integration/TodoMainStoreDatabase.kt | 36 - .../todo/common/main/store/TodoMainStore.kt | 21 - .../main/store/TodoMainStoreProvider.kt | 107 - .../common/main/integration/TodoMainTest.kt | 142 - .../main/store/TestTodoMainStoreDatabase.kt | 40 - .../common/main/store/TodoMainStoreTest.kt | 135 - examples/todoapp/common/root/build.gradle.kts | 55 - .../root/src/androidMain/AndroidManifest.xml | 2 - .../example/todo/common/root/TodoRoot.kt | 16 - .../root/integration/TodoRootComponent.kt | 89 - .../common/root/integration/TodoEditFake.kt | 24 - .../common/root/integration/TodoMainFake.kt | 29 - .../common/root/integration/TodoRootTest.kt | 66 - .../todoapp/common/utils/build.gradle.kts | 17 - .../utils/src/androidMain/AndroidManifest.xml | 2 - .../todo/common/utils/InstanceKeeperExt.kt | 20 - .../example/todo/common/utils/ReaktiveExt.kt | 11 - .../example/todo/common/utils/StoreExt.kt | 22 - examples/todoapp/desktop/build.gradle.kts | 51 - .../kotlin/example/todo/desktop/Main.kt | 53 - examples/todoapp/gradle.properties | 31 - .../todoapp/gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - examples/todoapp/gradlew | 240 -- examples/todoapp/gradlew.bat | 91 - examples/todoapp/ios/.gitignore | 18 - .../ios/TodoApp.xcodeproj/project.pbxproj | 410 --- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../AccentColor.colorset/Contents.json | 11 - .../AppIcon.appiconset/Contents.json | 98 - .../ios/ios/Assets.xcassets/Contents.json | 6 - .../todoapp/ios/ios/ComponentHolder.swift | 19 - examples/todoapp/ios/ios/ContentView.swift | 26 - examples/todoapp/ios/ios/EditView.swift | 67 - examples/todoapp/ios/ios/Info.plist | 50 - examples/todoapp/ios/ios/InputView.swift | 28 - examples/todoapp/ios/ios/ListView.swift | 39 - examples/todoapp/ios/ios/MainView.swift | 68 - .../todoapp/ios/ios/MutableStateBuilder.swift | 5 - .../todoapp/ios/ios/ObservableValue.swift | 22 - .../Preview Assets.xcassets/Contents.json | 6 - examples/todoapp/ios/ios/RootView.swift | 43 - .../todoapp/ios/ios/SimpleChildStack.swift | 13 - examples/todoapp/ios/ios/TodoApp.swift | 10 - examples/todoapp/kotlin-js-store/yarn.lock | 3047 ----------------- .../screenshots/browser-run-configuration.png | Bin 2428 -> 0 bytes .../screenshots/desktop-run-configuration.png | Bin 2582 -> 0 bytes examples/todoapp/screenshots/todo.png | Bin 208957 -> 0 bytes examples/todoapp/settings.gradle.kts | 11 - examples/todoapp/web/build.gradle.kts | 42 - .../src/jsMain/kotlin/example/todo/web/App.kt | 31 - .../kotlin/example/todo/web/Components.kt | 172 - .../kotlin/example/todo/web/Crossfade.kt | 115 - .../kotlin/example/todo/web/TodoEditUi.kt | 96 - .../kotlin/example/todo/web/TodoMainUi.kt | 189 - .../kotlin/example/todo/web/TodoRootUi.kt | 54 - .../kotlin/example/todo/web/ValueExt.kt | 25 - .../resources/MaterialIcons-Regular.ttf | Bin 285724 -> 0 bytes .../web/src/jsMain/resources/index.html | 30 - .../src/jsMain/resources/materialize.min.css | 13 - .../src/jsMain/resources/materialize.min.js | 6 - .../web/src/jsMain/resources/styles.css | 34 - examples/todoapp/web/webpack.config.d/fs.js | 9 - examples/todoapp/web/webpack.config.d/wasm.js | 12 - tutorials/Navigation/README.md | 416 +-- 139 files changed, 16 insertions(+), 8588 deletions(-) delete mode 100644 examples/todoapp/.gitignore delete mode 100644 examples/todoapp/.run/browser.run.xml delete mode 100644 examples/todoapp/.run/desktop.run.xml delete mode 100755 examples/todoapp/README.md delete mode 100755 examples/todoapp/android/build.gradle.kts delete mode 100755 examples/todoapp/android/src/main/AndroidManifest.xml delete mode 100644 examples/todoapp/android/src/main/java/example/todo/android/App.kt delete mode 100644 examples/todoapp/android/src/main/java/example/todo/android/Color.kt delete mode 100755 examples/todoapp/android/src/main/java/example/todo/android/MainActivity.kt delete mode 100644 examples/todoapp/android/src/main/java/example/todo/android/Shape.kt delete mode 100644 examples/todoapp/android/src/main/java/example/todo/android/Theme.kt delete mode 100644 examples/todoapp/android/src/main/java/example/todo/android/Type.kt delete mode 100644 examples/todoapp/android/src/main/res/drawable-v24/ic_launcher_foreground.xml delete mode 100644 examples/todoapp/android/src/main/res/drawable/ic_launcher_background.xml delete mode 100644 examples/todoapp/android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 examples/todoapp/android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 examples/todoapp/android/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 examples/todoapp/android/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 examples/todoapp/android/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 examples/todoapp/android/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 examples/todoapp/android/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 examples/todoapp/android/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 examples/todoapp/android/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 examples/todoapp/android/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 examples/todoapp/android/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 examples/todoapp/android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 examples/todoapp/android/src/main/res/values/strings.xml delete mode 100755 examples/todoapp/build.gradle.kts delete mode 100644 examples/todoapp/buildSrc/build.gradle.kts delete mode 100644 examples/todoapp/buildSrc/buildSrc/build.gradle.kts delete mode 100644 examples/todoapp/buildSrc/buildSrc/src/main/kotlin/Deps.kt delete mode 100644 examples/todoapp/buildSrc/buildSrc/src/main/kotlin/IosWorkaroundSupportArm64Simulator.kt delete mode 100755 examples/todoapp/buildSrc/gradle.properties delete mode 100644 examples/todoapp/buildSrc/src/main/kotlin/android-setup.gradle.kts delete mode 100644 examples/todoapp/buildSrc/src/main/kotlin/multiplatform-compose-setup.gradle.kts delete mode 100644 examples/todoapp/buildSrc/src/main/kotlin/multiplatform-setup.gradle.kts delete mode 100755 examples/todoapp/common/compose-ui/build.gradle.kts delete mode 100755 examples/todoapp/common/compose-ui/src/androidMain/AndroidManifest.xml delete mode 100644 examples/todoapp/common/compose-ui/src/androidMain/kotlin/example/todo/common/ui/Scrollbars.kt delete mode 100644 examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/Scrollbars.kt delete mode 100644 examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/ShortcutHandler.kt delete mode 100644 examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/TodoEditUi.kt delete mode 100644 examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/TodoMainUi.kt delete mode 100644 examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/TodoRootUi.kt delete mode 100644 examples/todoapp/common/compose-ui/src/desktopMain/kotlin/example/todo/common/ui/Scrollbars.kt delete mode 100644 examples/todoapp/common/compose-ui/src/desktopMain/kotlin/example/todo/common/ui/TodoEditPreview.kt delete mode 100644 examples/todoapp/common/compose-ui/src/desktopMain/kotlin/example/todo/common/ui/TodoMainPreview.kt delete mode 100755 examples/todoapp/common/database/build.gradle.kts delete mode 100755 examples/todoapp/common/database/src/androidMain/AndroidManifest.xml delete mode 100644 examples/todoapp/common/database/src/androidMain/kotlin/example/todo/common/database/TodoDatabaseDriverFactory.kt delete mode 100644 examples/todoapp/common/database/src/commonMain/kotlin/example/todo/common/database/DefaultTodoSharedDatabase.kt delete mode 100644 examples/todoapp/common/database/src/commonMain/kotlin/example/todo/common/database/TestTodoSharedDatabase.kt delete mode 100644 examples/todoapp/common/database/src/commonMain/kotlin/example/todo/common/database/TodoSharedDatabase.kt delete mode 100644 examples/todoapp/common/database/src/commonMain/sqldelight/example/todo/common/database/TodoDatabase.sq delete mode 100644 examples/todoapp/common/database/src/desktopMain/kotlin/example/todo/common/database/TodoDatabaseDriverFactory.kt delete mode 100644 examples/todoapp/common/database/src/iosMain/kotlin/example/todo/common/database/TodoDatabaseDriverFactory.kt delete mode 100644 examples/todoapp/common/database/src/jsMain/kotlin/example/todo/common/database/TodoDatabaseDriverFactory.kt delete mode 100755 examples/todoapp/common/edit/build.gradle.kts delete mode 100755 examples/todoapp/common/edit/src/androidMain/AndroidManifest.xml delete mode 100644 examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/TodoEdit.kt delete mode 100644 examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/TodoItem.kt delete mode 100644 examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/integration/Mappers.kt delete mode 100644 examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/integration/TodoEditComponent.kt delete mode 100644 examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/integration/TodoEditStoreDatabase.kt delete mode 100644 examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/store/TodoEditStore.kt delete mode 100644 examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/store/TodoEditStoreProvider.kt delete mode 100755 examples/todoapp/common/main/build.gradle.kts delete mode 100755 examples/todoapp/common/main/src/androidMain/AndroidManifest.xml delete mode 100644 examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/TodoItem.kt delete mode 100644 examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/TodoMain.kt delete mode 100644 examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/integration/Mappers.kt delete mode 100644 examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/integration/TodoMainComponent.kt delete mode 100644 examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/integration/TodoMainStoreDatabase.kt delete mode 100644 examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/store/TodoMainStore.kt delete mode 100644 examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/store/TodoMainStoreProvider.kt delete mode 100644 examples/todoapp/common/main/src/commonTest/kotlin/example/todo/common/main/integration/TodoMainTest.kt delete mode 100644 examples/todoapp/common/main/src/commonTest/kotlin/example/todo/common/main/store/TestTodoMainStoreDatabase.kt delete mode 100644 examples/todoapp/common/main/src/commonTest/kotlin/example/todo/common/main/store/TodoMainStoreTest.kt delete mode 100755 examples/todoapp/common/root/build.gradle.kts delete mode 100755 examples/todoapp/common/root/src/androidMain/AndroidManifest.xml delete mode 100644 examples/todoapp/common/root/src/commonMain/kotlin/example/todo/common/root/TodoRoot.kt delete mode 100644 examples/todoapp/common/root/src/commonMain/kotlin/example/todo/common/root/integration/TodoRootComponent.kt delete mode 100644 examples/todoapp/common/root/src/commonTest/kotlin/example/todo/common/root/integration/TodoEditFake.kt delete mode 100644 examples/todoapp/common/root/src/commonTest/kotlin/example/todo/common/root/integration/TodoMainFake.kt delete mode 100644 examples/todoapp/common/root/src/commonTest/kotlin/example/todo/common/root/integration/TodoRootTest.kt delete mode 100755 examples/todoapp/common/utils/build.gradle.kts delete mode 100755 examples/todoapp/common/utils/src/androidMain/AndroidManifest.xml delete mode 100644 examples/todoapp/common/utils/src/commonMain/kotlin/example/todo/common/utils/InstanceKeeperExt.kt delete mode 100644 examples/todoapp/common/utils/src/commonMain/kotlin/example/todo/common/utils/ReaktiveExt.kt delete mode 100644 examples/todoapp/common/utils/src/commonMain/kotlin/example/todo/common/utils/StoreExt.kt delete mode 100755 examples/todoapp/desktop/build.gradle.kts delete mode 100644 examples/todoapp/desktop/src/jvmMain/kotlin/example/todo/desktop/Main.kt delete mode 100755 examples/todoapp/gradle.properties delete mode 100644 examples/todoapp/gradle/wrapper/gradle-wrapper.jar delete mode 100644 examples/todoapp/gradle/wrapper/gradle-wrapper.properties delete mode 100755 examples/todoapp/gradlew delete mode 100644 examples/todoapp/gradlew.bat delete mode 100644 examples/todoapp/ios/.gitignore delete mode 100644 examples/todoapp/ios/TodoApp.xcodeproj/project.pbxproj delete mode 100644 examples/todoapp/ios/TodoApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 examples/todoapp/ios/TodoApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 examples/todoapp/ios/ios/Assets.xcassets/AccentColor.colorset/Contents.json delete mode 100644 examples/todoapp/ios/ios/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 examples/todoapp/ios/ios/Assets.xcassets/Contents.json delete mode 100644 examples/todoapp/ios/ios/ComponentHolder.swift delete mode 100644 examples/todoapp/ios/ios/ContentView.swift delete mode 100644 examples/todoapp/ios/ios/EditView.swift delete mode 100644 examples/todoapp/ios/ios/Info.plist delete mode 100644 examples/todoapp/ios/ios/InputView.swift delete mode 100644 examples/todoapp/ios/ios/ListView.swift delete mode 100644 examples/todoapp/ios/ios/MainView.swift delete mode 100644 examples/todoapp/ios/ios/MutableStateBuilder.swift delete mode 100644 examples/todoapp/ios/ios/ObservableValue.swift delete mode 100644 examples/todoapp/ios/ios/Preview Content/Preview Assets.xcassets/Contents.json delete mode 100644 examples/todoapp/ios/ios/RootView.swift delete mode 100644 examples/todoapp/ios/ios/SimpleChildStack.swift delete mode 100644 examples/todoapp/ios/ios/TodoApp.swift delete mode 100644 examples/todoapp/kotlin-js-store/yarn.lock delete mode 100644 examples/todoapp/screenshots/browser-run-configuration.png delete mode 100644 examples/todoapp/screenshots/desktop-run-configuration.png delete mode 100644 examples/todoapp/screenshots/todo.png delete mode 100755 examples/todoapp/settings.gradle.kts delete mode 100755 examples/todoapp/web/build.gradle.kts delete mode 100644 examples/todoapp/web/src/jsMain/kotlin/example/todo/web/App.kt delete mode 100644 examples/todoapp/web/src/jsMain/kotlin/example/todo/web/Components.kt delete mode 100644 examples/todoapp/web/src/jsMain/kotlin/example/todo/web/Crossfade.kt delete mode 100644 examples/todoapp/web/src/jsMain/kotlin/example/todo/web/TodoEditUi.kt delete mode 100644 examples/todoapp/web/src/jsMain/kotlin/example/todo/web/TodoMainUi.kt delete mode 100644 examples/todoapp/web/src/jsMain/kotlin/example/todo/web/TodoRootUi.kt delete mode 100644 examples/todoapp/web/src/jsMain/kotlin/example/todo/web/ValueExt.kt delete mode 100644 examples/todoapp/web/src/jsMain/resources/MaterialIcons-Regular.ttf delete mode 100644 examples/todoapp/web/src/jsMain/resources/index.html delete mode 100644 examples/todoapp/web/src/jsMain/resources/materialize.min.css delete mode 100644 examples/todoapp/web/src/jsMain/resources/materialize.min.js delete mode 100644 examples/todoapp/web/src/jsMain/resources/styles.css delete mode 100644 examples/todoapp/web/webpack.config.d/fs.js delete mode 100644 examples/todoapp/web/webpack.config.d/wasm.js diff --git a/examples/README.md b/examples/README.md index 7a98d1b866..0319f064b7 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,16 +1,15 @@ # Samples -| Sample | Description | Platforms | -| ------------- | ------------- | ------------- | -| [Imageviewer](imageviewer) | Image Viewer application | Android, iOS, Desktop | -| [Codeviewer](codeviewer) | File browser and code viewer application | Android, iOS, Desktop | -| [Chat](chat) | A simple chat | Android, iOS, Desktop | -| [Minesweeper](minesweeper) | A simple game where you need to find hidden mines | Android, iOS, Desktop | -| [Falling Balls](falling-balls) | A simple game | Android, iOS, Desktop | -| [Visual effects](visual-effects) | Visual effects | Android, iOS, Desktop | -| [Widgets Gallery](widgets-gallery) | Gallery of standard widgets | Android, iOS, Desktop | -| [Todoapp Lite](todoapp-lite) | A simplified version of [Todoapp](todoapp), fully based on Compose | Android, iOS, Desktop | -| [Todoapp](todoapp) | TODO items tracker with persistence and multiple screens, written with external navigation library | Android, iOS native, Desktop | -| [Issues tracker](issues) | GitHub issue tracker with an adaptive UI and ktor-client | Android, Desktop | -| [Notepad](notepad) | Notepad, using the Composable Window API | Desktop | -| [IDEA plugin](intellij-plugin) | Plugin for IDEA using Compose for Desktop | Desktop | -| [HTML based samples](html/README.md) | Examples written with Compose HTML Library \ No newline at end of file +| Sample | Description | Platforms | +| ------------- |----------------------------------------------------------------------------------------------------| ------------- | +| [Imageviewer](imageviewer) | Image Viewer application | Android, iOS, Desktop | +| [Codeviewer](codeviewer) | File browser and code viewer application | Android, iOS, Desktop | +| [Chat](chat) | A simple chat | Android, iOS, Desktop | +| [Minesweeper](minesweeper) | A simple game where you need to find hidden mines | Android, iOS, Desktop | +| [Falling Balls](falling-balls) | A simple game | Android, iOS, Desktop | +| [Visual effects](visual-effects) | Visual effects | Android, iOS, Desktop | +| [Widgets Gallery](widgets-gallery) | Gallery of standard widgets | Android, iOS, Desktop | +| [Todoapp Lite](todoapp-lite) | A simple todo app fully based on Compose | Android, iOS, Desktop | +| [Issues tracker](issues) | GitHub issue tracker with an adaptive UI and ktor-client | Android, Desktop | +| [Notepad](notepad) | Notepad, using the Composable Window API | Desktop | +| [IDEA plugin](intellij-plugin) | Plugin for IDEA using Compose for Desktop | Desktop | +| [HTML based samples](html/README.md) | Examples written with Compose HTML Library | \ No newline at end of file diff --git a/examples/todoapp/.gitignore b/examples/todoapp/.gitignore deleted file mode 100644 index a32b16597b..0000000000 --- a/examples/todoapp/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -*.iml -.gradle -/local.properties -/.idea -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -.DS_Store -build/ -/captures -.externalNativeBuild -.cxx diff --git a/examples/todoapp/.run/browser.run.xml b/examples/todoapp/.run/browser.run.xml deleted file mode 100644 index 246a33bdbf..0000000000 --- a/examples/todoapp/.run/browser.run.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - true - true - false - - - \ No newline at end of file diff --git a/examples/todoapp/.run/desktop.run.xml b/examples/todoapp/.run/desktop.run.xml deleted file mode 100644 index c10d50877a..0000000000 --- a/examples/todoapp/.run/desktop.run.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - true - true - false - - - \ No newline at end of file diff --git a/examples/todoapp/README.md b/examples/todoapp/README.md deleted file mode 100755 index cd60581184..0000000000 --- a/examples/todoapp/README.md +++ /dev/null @@ -1,61 +0,0 @@ -An example of Kotlin Multiplatform todo app with shared Android/Desktop Compose UI and SwiftUI (not Compose) iOS. - -This example supports the following targets: -- `Android` (Compose) -- `Desktop/JVM` (Compose) -- `Web/JavaScript` (Compose) -- `iOS` (SwiftUI, not Compose) - -Libraries used: -- Compose Multiplatform - shared UI -- [Decompose](https://github.com/arkivanov/Decompose) - navigation and lifecycle -- [MVIKotlin](https://github.com/arkivanov/MVIKotlin) - presentation and business logic -- [Reaktive](https://github.com/badoo/Reaktive) - background processing and data transformation -- [SQLDelight](https://github.com/cashapp/sqldelight) - data storage - -There are multiple modules: -- `:common:utils` - just some useful helpers -- `:common:database` - SQLDelight database definition -- `:common:main` - displays a list of todo items and a text field -- `:common:edit` - accepts an item id and allows editing -- `:common:root` - navigates between `main` and `edit` screens -- `:common:compose-ui` - Shared Compose UI for Android and Desktop -- `:android` - Android application -- `:desktop` - Desktop application -- `:web` - Web browser application + Compose HTML Library -- `ios` - iOS Xcode project - -The root module is integrated into Android, Desktop and iOS (non-Compose) apps. - -Features: -- 99% of the code is shared: data, business logic, presentation, navigation and UI -- View state is preserved when navigating between screens, Android configuration change, etc. -- Model-View-Intent (aka MVI) architectural pattern -- Pluggable UI - Compose UI for Android, Desktop and Web, SwiftUI (not Compose) for iOS - -### Running desktop application - * To run, launch command: `./gradlew :desktop:run` - * Or choose **desktop** configuration in IDE and run it. - ![desktop-run-configuration.png](screenshots/desktop-run-configuration.png) - -#### Building native desktop distribution -``` -./gradlew :desktop:packageDistributionForCurrentOS -# outputs are written to desktop/build/compose/binaries -``` - -### Running Android application - -Open project in Intellij IDEA or Android Studio and run "android" configuration. - -### Running Web browser application - - * To run, launch command: `./gradlew :web:jsBrowserDevelopmentRun` - * Or choose **browser** configuration in IDE and run it. - ![browser-run-configuration.png](screenshots/browser-run-configuration.png) - -### Running iOS application - -Open and build the Xcode project located in `ios` folder. - -![Desktop](screenshots/todo.png) diff --git a/examples/todoapp/android/build.gradle.kts b/examples/todoapp/android/build.gradle.kts deleted file mode 100755 index a14a5ee0c7..0000000000 --- a/examples/todoapp/android/build.gradle.kts +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id("com.android.application") - kotlin("android") - id("org.jetbrains.compose") -} - -android { - compileSdk = 33 - - defaultConfig { - minSdk = 26 - targetSdk = 33 - versionCode = 1 - versionName = "1.0" - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } - - packagingOptions { - exclude("META-INF/*") - } -} - -dependencies { - implementation(project(":common:database")) - implementation(project(":common:utils")) - implementation(project(":common:root")) - implementation(project(":common:compose-ui")) - implementation(compose.material) - implementation(Deps.ArkIvanov.MVIKotlin.mvikotlin) - implementation(Deps.ArkIvanov.MVIKotlin.mvikotlinMain) - implementation(Deps.ArkIvanov.MVIKotlin.mvikotlinLogging) - implementation(Deps.ArkIvanov.MVIKotlin.mvikotlinTimeTravel) - implementation(Deps.ArkIvanov.Decompose.decompose) - implementation(Deps.ArkIvanov.Decompose.extensionsCompose) - implementation(Deps.AndroidX.AppCompat.appCompat) - implementation(Deps.AndroidX.Activity.activityCompose) - - // Workaround for https://github.com/JetBrains/compose-jb/issues/2340 - implementation("androidx.compose.material:material:${Deps.JetpackComposeWorkaround.VERSION}") -} diff --git a/examples/todoapp/android/src/main/AndroidManifest.xml b/examples/todoapp/android/src/main/AndroidManifest.xml deleted file mode 100755 index 269bd54e17..0000000000 --- a/examples/todoapp/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/examples/todoapp/android/src/main/java/example/todo/android/App.kt b/examples/todoapp/android/src/main/java/example/todo/android/App.kt deleted file mode 100644 index 889d6e4ebf..0000000000 --- a/examples/todoapp/android/src/main/java/example/todo/android/App.kt +++ /dev/null @@ -1,13 +0,0 @@ -package example.todo.android - -import android.app.Application -import com.arkivanov.mvikotlin.timetravel.server.TimeTravelServer - -class App : Application() { - - override fun onCreate() { - super.onCreate() - - TimeTravelServer().start() - } -} diff --git a/examples/todoapp/android/src/main/java/example/todo/android/Color.kt b/examples/todoapp/android/src/main/java/example/todo/android/Color.kt deleted file mode 100644 index b96a45e539..0000000000 --- a/examples/todoapp/android/src/main/java/example/todo/android/Color.kt +++ /dev/null @@ -1,8 +0,0 @@ -package example.todo.android - -import androidx.compose.ui.graphics.Color - -val purple200 = Color(0xFFBB86FC) -val purple500 = Color(0xFF6200EE) -val purple700 = Color(0xFF3700B3) -val teal200 = Color(0xFF03DAC5) diff --git a/examples/todoapp/android/src/main/java/example/todo/android/MainActivity.kt b/examples/todoapp/android/src/main/java/example/todo/android/MainActivity.kt deleted file mode 100755 index b6b2855bcb..0000000000 --- a/examples/todoapp/android/src/main/java/example/todo/android/MainActivity.kt +++ /dev/null @@ -1,39 +0,0 @@ -package example.todo.android - -import android.os.Bundle -import androidx.activity.compose.setContent -import androidx.appcompat.app.AppCompatActivity -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Surface -import com.arkivanov.decompose.ComponentContext -import com.arkivanov.decompose.defaultComponentContext -import com.arkivanov.mvikotlin.logging.store.LoggingStoreFactory -import com.arkivanov.mvikotlin.timetravel.store.TimeTravelStoreFactory -import example.todo.common.database.DefaultTodoSharedDatabase -import example.todo.common.database.TodoDatabaseDriver -import example.todo.common.root.TodoRoot -import example.todo.common.root.integration.TodoRootComponent -import example.todo.common.ui.TodoRootContent - -class MainActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - val root = todoRoot(defaultComponentContext()) - - setContent { - ComposeAppTheme { - Surface(color = MaterialTheme.colors.background) { - TodoRootContent(root) - } - } - } - } - - private fun todoRoot(componentContext: ComponentContext): TodoRoot = - TodoRootComponent( - componentContext = componentContext, - storeFactory = LoggingStoreFactory(TimeTravelStoreFactory()), - database = DefaultTodoSharedDatabase(TodoDatabaseDriver(context = this)) - ) -} diff --git a/examples/todoapp/android/src/main/java/example/todo/android/Shape.kt b/examples/todoapp/android/src/main/java/example/todo/android/Shape.kt deleted file mode 100644 index f8ba1f30dc..0000000000 --- a/examples/todoapp/android/src/main/java/example/todo/android/Shape.kt +++ /dev/null @@ -1,11 +0,0 @@ -package example.todo.android - -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.Shapes -import androidx.compose.ui.unit.dp - -val shapes = Shapes( - small = RoundedCornerShape(4.dp), - medium = RoundedCornerShape(4.dp), - large = RoundedCornerShape(0.dp) -) diff --git a/examples/todoapp/android/src/main/java/example/todo/android/Theme.kt b/examples/todoapp/android/src/main/java/example/todo/android/Theme.kt deleted file mode 100644 index 6fc240cfdd..0000000000 --- a/examples/todoapp/android/src/main/java/example/todo/android/Theme.kt +++ /dev/null @@ -1,35 +0,0 @@ -package example.todo.android - -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.material.MaterialTheme -import androidx.compose.material.darkColors -import androidx.compose.material.lightColors -import androidx.compose.runtime.Composable - -private val DarkColorPalette = darkColors( - primary = purple200, - primaryVariant = purple700, - secondary = teal200 -) - -private val LightColorPalette = lightColors( - primary = purple500, - primaryVariant = purple700, - secondary = teal200 -) - -@Composable -fun ComposeAppTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable() () -> Unit) { - val colors = if (darkTheme) { - DarkColorPalette - } else { - LightColorPalette - } - - MaterialTheme( - colors = colors, - typography = typography, - shapes = shapes, - content = content - ) -} diff --git a/examples/todoapp/android/src/main/java/example/todo/android/Type.kt b/examples/todoapp/android/src/main/java/example/todo/android/Type.kt deleted file mode 100644 index 5852213c9e..0000000000 --- a/examples/todoapp/android/src/main/java/example/todo/android/Type.kt +++ /dev/null @@ -1,16 +0,0 @@ -package example.todo.android - -import androidx.compose.material.Typography -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.sp - -// Set of Material typography styles to start with -val typography = Typography( - body1 = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 16.sp - ) -) diff --git a/examples/todoapp/android/src/main/res/drawable-v24/ic_launcher_foreground.xml b/examples/todoapp/android/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 1f6bb29060..0000000000 --- a/examples/todoapp/android/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/examples/todoapp/android/src/main/res/drawable/ic_launcher_background.xml b/examples/todoapp/android/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 0d025f9bf6..0000000000 --- a/examples/todoapp/android/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/todoapp/android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/examples/todoapp/android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 6b78462d61..0000000000 --- a/examples/todoapp/android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/examples/todoapp/android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/examples/todoapp/android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 6b78462d61..0000000000 --- a/examples/todoapp/android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/examples/todoapp/android/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/todoapp/android/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 898f3ed59ac9f3248734a00e5902736c9367d455..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2963 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 JPDHLkV1g@XpTGbB diff --git a/examples/todoapp/android/src/main/res/mipmap-hdpi/ic_launcher_round.png b/examples/todoapp/android/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index dffca3601eba7bf5f409bdd520820e2eb5122c75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4905 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 lV%Z2*hu);6rydA(}wUDXPCF_W1vnaRBK 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 diff --git a/examples/todoapp/android/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/examples/todoapp/android/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 14ed0af35023e4f1901cf03487b6c524257b8483..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6895 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 diff --git a/examples/todoapp/android/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/todoapp/android/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index b0907cac3bfd8fbfdc46e1108247f0a1055387ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6387 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 diff --git a/examples/todoapp/android/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/examples/todoapp/android/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index d8ae03154975f397f8ed1b84f2d4bf9783ecfa26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10413 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 XdJ+W}DiIkV00000NkvXXu0mjfKBlg6 diff --git a/examples/todoapp/android/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/todoapp/android/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 2c18de9e66108411737e910f5c1972476f03ddbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9128 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 I20H400LcNok^lez diff --git a/examples/todoapp/android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/examples/todoapp/android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index beed3cdd2c32af5114a7dc70b9ef5b698eb8797e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15132 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 diff --git a/examples/todoapp/android/src/main/res/values/strings.xml b/examples/todoapp/android/src/main/res/values/strings.xml deleted file mode 100644 index 795ae0c466..0000000000 --- a/examples/todoapp/android/src/main/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - Todo - diff --git a/examples/todoapp/build.gradle.kts b/examples/todoapp/build.gradle.kts deleted file mode 100755 index 054cef3183..0000000000 --- a/examples/todoapp/build.gradle.kts +++ /dev/null @@ -1,19 +0,0 @@ -plugins { - `kotlin-dsl` -} - -allprojects { - repositories { - google() - mavenCentral() - mavenLocal() - maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") - } - - afterEvaluate { - // Workaround for https://youtrack.jetbrains.com/issue/KT-52776 - rootProject.extensions.findByType()?.apply { - versions.webpackCli.version = "4.10.0" - } - } -} diff --git a/examples/todoapp/buildSrc/build.gradle.kts b/examples/todoapp/buildSrc/build.gradle.kts deleted file mode 100644 index 6e5eb3d3c5..0000000000 --- a/examples/todoapp/buildSrc/build.gradle.kts +++ /dev/null @@ -1,24 +0,0 @@ -plugins { - `kotlin-dsl` -} - -initDeps(project) - -repositories { - mavenLocal() - google() - mavenCentral() - maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") -} - -dependencies { - implementation(Deps.JetBrains.Compose.gradlePlugin) - implementation(Deps.JetBrains.Kotlin.gradlePlugin) - implementation(Deps.Android.Tools.Build.gradlePlugin) - implementation(Deps.Squareup.SQLDelight.gradlePlugin) -} - -kotlin { - // Add Deps to compilation, so it will become available in main project - sourceSets.getByName("main").kotlin.srcDir("buildSrc/src/main/kotlin") -} \ No newline at end of file diff --git a/examples/todoapp/buildSrc/buildSrc/build.gradle.kts b/examples/todoapp/buildSrc/buildSrc/build.gradle.kts deleted file mode 100644 index 0998a7aaf9..0000000000 --- a/examples/todoapp/buildSrc/buildSrc/build.gradle.kts +++ /dev/null @@ -1,12 +0,0 @@ -plugins { - `kotlin-dsl` -} - -repositories { - mavenCentral() -} - -dependencies { - //todo workaround to build iOS Arm64 simulator: - implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10") -} diff --git a/examples/todoapp/buildSrc/buildSrc/src/main/kotlin/Deps.kt b/examples/todoapp/buildSrc/buildSrc/src/main/kotlin/Deps.kt deleted file mode 100644 index 5743652321..0000000000 --- a/examples/todoapp/buildSrc/buildSrc/src/main/kotlin/Deps.kt +++ /dev/null @@ -1,101 +0,0 @@ -// We store Kotlin and Compose versions in gradle.properties to -// be able to override them on CI. -// You probably won't need this, so you can get rid of `project` in this file. -import org.gradle.api.Project - -lateinit var properties: Map - -fun initDeps(project: Project) { - properties = project.properties -} - -object Deps { - object JetpackComposeWorkaround { - // Workaround for https://github.com/JetBrains/compose-jb/issues/2340 - val VERSION: String = "1.4.0-rc01" - } - - object JetBrains { - object Kotlin { - private val VERSION get() = properties["kotlin.version"] - val gradlePlugin get() = "org.jetbrains.kotlin:kotlin-gradle-plugin:$VERSION" - val testCommon get() = "org.jetbrains.kotlin:kotlin-test-common:$VERSION" - val testJunit get() = "org.jetbrains.kotlin:kotlin-test-junit:$VERSION" - val testJs get() = "org.jetbrains.kotlin:kotlin-test-js:$VERSION" - val testAnnotationsCommon get() = "org.jetbrains.kotlin:kotlin-test-annotations-common:$VERSION" - } - - object Coroutines { - private val VERSION get() = "1.6.4" - val swing get() = "org.jetbrains.kotlinx:kotlinx-coroutines-swing:$VERSION" - } - - object Compose { - private val VERSION get() = properties["compose.version"] - val gradlePlugin get() = "org.jetbrains.compose:compose-gradle-plugin:$VERSION" - } - } - - object Android { - object Tools { - object Build { - const val gradlePlugin = "com.android.tools.build:gradle:7.2.0" - } - } - } - - object AndroidX { - object AppCompat { - const val appCompat = "androidx.appcompat:appcompat:1.3.0" - } - - object Activity { - const val activityCompose = "androidx.activity:activity-compose:1.3.0" - } - } - - object ArkIvanov { - object MVIKotlin { - private const val VERSION = "3.0.0" - const val rx = "com.arkivanov.mvikotlin:rx:$VERSION" - const val mvikotlin = "com.arkivanov.mvikotlin:mvikotlin:$VERSION" - const val mvikotlinMain = "com.arkivanov.mvikotlin:mvikotlin-main:$VERSION" - const val mvikotlinLogging = "com.arkivanov.mvikotlin:mvikotlin-logging:$VERSION" - const val mvikotlinTimeTravel = "com.arkivanov.mvikotlin:mvikotlin-timetravel:$VERSION" - const val mvikotlinExtensionsReaktive = "com.arkivanov.mvikotlin:mvikotlin-extensions-reaktive:$VERSION" - } - - object Decompose { - private const val VERSION = "1.0.0-alpha-05" - const val decompose = "com.arkivanov.decompose:decompose:$VERSION" - const val extensionsCompose = "com.arkivanov.decompose:extensions-compose-jetbrains:$VERSION" - } - - object Essenty { - private const val VERSION = "0.6.0" - const val lifecycle = "com.arkivanov.essenty:lifecycle:$VERSION" - } - } - - object Badoo { - object Reaktive { - private const val VERSION = "1.2.1" - const val reaktive = "com.badoo.reaktive:reaktive:$VERSION" - const val reaktiveTesting = "com.badoo.reaktive:reaktive-testing:$VERSION" - const val utils = "com.badoo.reaktive:utils:$VERSION" - const val coroutinesInterop = "com.badoo.reaktive:coroutines-interop:$VERSION" - } - } - - object Squareup { - object SQLDelight { - private const val VERSION = "1.5.5" - - const val gradlePlugin = "com.squareup.sqldelight:gradle-plugin:$VERSION" - const val androidDriver = "com.squareup.sqldelight:android-driver:$VERSION" - const val sqliteDriver = "com.squareup.sqldelight:sqlite-driver:$VERSION" - const val nativeDriver = "com.squareup.sqldelight:native-driver:$VERSION" - const val sqljsDriver = "com.squareup.sqldelight:sqljs-driver:$VERSION" - } - } -} diff --git a/examples/todoapp/buildSrc/buildSrc/src/main/kotlin/IosWorkaroundSupportArm64Simulator.kt b/examples/todoapp/buildSrc/buildSrc/src/main/kotlin/IosWorkaroundSupportArm64Simulator.kt deleted file mode 100644 index 25c8b25559..0000000000 --- a/examples/todoapp/buildSrc/buildSrc/src/main/kotlin/IosWorkaroundSupportArm64Simulator.kt +++ /dev/null @@ -1,17 +0,0 @@ -import org.jetbrains.kotlin.gradle.dsl.KotlinTargetContainerWithNativeShortcuts -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget - -fun KotlinTargetContainerWithNativeShortcuts.iosWorkaroundSupportArm64Simulator( - configure: KotlinNativeTarget.() -> Unit -) { - val isBuildToSimulator = System.getenv("SDK_NAME")?.startsWith("iphonesimulator") ?: false - val isArm64Target = System.getenv("NATIVE_ARCH") == "arm64" - - if (isBuildToSimulator && isArm64Target) { - //workaround: - iosSimulatorArm64(name = "ios", configure = configure) - } else { - //default behavior: - ios(configure = configure) - } -} diff --git a/examples/todoapp/buildSrc/gradle.properties b/examples/todoapp/buildSrc/gradle.properties deleted file mode 100755 index 3e039f1f4d..0000000000 --- a/examples/todoapp/buildSrc/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -# TODO can we get rid of duplication with root gradle.properties? -kotlin.version=1.8.20 -compose.version=1.4.0 \ No newline at end of file diff --git a/examples/todoapp/buildSrc/src/main/kotlin/android-setup.gradle.kts b/examples/todoapp/buildSrc/src/main/kotlin/android-setup.gradle.kts deleted file mode 100644 index 45647c5f95..0000000000 --- a/examples/todoapp/buildSrc/src/main/kotlin/android-setup.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -plugins { - id("com.android.library") -} - -initDeps(project) - -android { - compileSdk = 33 - - defaultConfig { - minSdk = 23 - targetSdk = 33 - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } - - sourceSets { - named("main") { - manifest.srcFile("src/androidMain/AndroidManifest.xml") - res.srcDirs("src/androidMain/res") - } - } -} diff --git a/examples/todoapp/buildSrc/src/main/kotlin/multiplatform-compose-setup.gradle.kts b/examples/todoapp/buildSrc/src/main/kotlin/multiplatform-compose-setup.gradle.kts deleted file mode 100644 index 15749498b9..0000000000 --- a/examples/todoapp/buildSrc/src/main/kotlin/multiplatform-compose-setup.gradle.kts +++ /dev/null @@ -1,39 +0,0 @@ -plugins { - id("com.android.library") - id("kotlin-multiplatform") - id("org.jetbrains.compose") -} - -initDeps(project) - -kotlin { - jvm("desktop") - android() - - sourceSets { - named("commonMain") { - dependencies { - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.material) - } - } - - named("androidMain") { - dependencies { - implementation("androidx.appcompat:appcompat:1.3.0") - implementation("androidx.core:core-ktx:1.3.1") - } - } - - named("desktopMain") { - dependencies { - implementation(compose.desktop.common) - } - } - } - - tasks.withType { - kotlinOptions.jvmTarget = "11" - } -} diff --git a/examples/todoapp/buildSrc/src/main/kotlin/multiplatform-setup.gradle.kts b/examples/todoapp/buildSrc/src/main/kotlin/multiplatform-setup.gradle.kts deleted file mode 100644 index 4e102cb5da..0000000000 --- a/examples/todoapp/buildSrc/src/main/kotlin/multiplatform-setup.gradle.kts +++ /dev/null @@ -1,75 +0,0 @@ -plugins { - id("com.android.library") - id("kotlin-multiplatform") -} - -initDeps(project) - -kotlin { - jvm("desktop") - android() - iosX64() - iosArm64() - iosSimulatorArm64() - - js(IR) { - browser() - } - - sourceSets { - create("iosMain") { - dependsOn(getByName("commonMain")) - } - create("iosTest") { - dependsOn(getByName("commonTest")) - } - - getByName("iosX64Main") { - dependsOn(getByName("iosMain")) - } - getByName("iosX64Test") { - dependsOn(getByName("iosTest")) - } - - getByName("iosArm64Main") { - dependsOn(getByName("iosMain")) - } - getByName("iosArm64Test") { - dependsOn(getByName("iosTest")) - } - - getByName("iosSimulatorArm64Main") { - dependsOn(getByName("iosMain")) - } - getByName("iosSimulatorArm64Test") { - dependsOn(getByName("iosTest")) - } - - named("commonTest") { - dependencies { - implementation(Deps.JetBrains.Kotlin.testCommon) - implementation(Deps.JetBrains.Kotlin.testAnnotationsCommon) - } - } - - named("androidTest") { - dependencies { - implementation(Deps.JetBrains.Kotlin.testJunit) - } - } - named("desktopTest") { - dependencies { - implementation(Deps.JetBrains.Kotlin.testJunit) - } - } - named("jsTest") { - dependencies { - implementation(Deps.JetBrains.Kotlin.testJs) - } - } - } - - tasks.withType { - kotlinOptions.jvmTarget = "11" - } -} diff --git a/examples/todoapp/common/compose-ui/build.gradle.kts b/examples/todoapp/common/compose-ui/build.gradle.kts deleted file mode 100755 index c611feeb0b..0000000000 --- a/examples/todoapp/common/compose-ui/build.gradle.kts +++ /dev/null @@ -1,25 +0,0 @@ -plugins { - id("multiplatform-compose-setup") - id("android-setup") -} - -kotlin { - sourceSets { - named("commonMain") { - dependencies { - implementation(project(":common:main")) - implementation(project(":common:edit")) - implementation(project(":common:root")) - implementation(Deps.ArkIvanov.Decompose.decompose) - implementation(Deps.ArkIvanov.Decompose.extensionsCompose) - } - } - - named("androidMain") { - dependencies { - // Workaround for https://github.com/JetBrains/compose-jb/issues/2340 - implementation("androidx.compose.foundation:foundation:${Deps.JetpackComposeWorkaround.VERSION}") - } - } - } -} diff --git a/examples/todoapp/common/compose-ui/src/androidMain/AndroidManifest.xml b/examples/todoapp/common/compose-ui/src/androidMain/AndroidManifest.xml deleted file mode 100755 index aba3452a11..0000000000 --- a/examples/todoapp/common/compose-ui/src/androidMain/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/examples/todoapp/common/compose-ui/src/androidMain/kotlin/example/todo/common/ui/Scrollbars.kt b/examples/todoapp/common/compose-ui/src/androidMain/kotlin/example/todo/common/ui/Scrollbars.kt deleted file mode 100644 index a8a1f6b8df..0000000000 --- a/examples/todoapp/common/compose-ui/src/androidMain/kotlin/example/todo/common/ui/Scrollbars.kt +++ /dev/null @@ -1,26 +0,0 @@ -package example.todo.common.ui - -import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp - -actual val MARGIN_SCROLLBAR: Dp = 0.dp - -actual interface ScrollbarAdapter - -@Composable -actual fun rememberScrollbarAdapter( - scrollState: LazyListState, - itemCount: Int, - averageItemSize: Dp -): ScrollbarAdapter = - object : ScrollbarAdapter {} - -@Composable -actual fun VerticalScrollbar( - modifier: Modifier, - adapter: ScrollbarAdapter -) { -} diff --git a/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/Scrollbars.kt b/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/Scrollbars.kt deleted file mode 100644 index e0a1cbeca4..0000000000 --- a/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/Scrollbars.kt +++ /dev/null @@ -1,23 +0,0 @@ -package example.todo.common.ui - -import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.Dp - -expect val MARGIN_SCROLLBAR: Dp - -expect interface ScrollbarAdapter - -@Composable -expect fun rememberScrollbarAdapter( - scrollState: LazyListState, - itemCount: Int, - averageItemSize: Dp -): ScrollbarAdapter - -@Composable -expect fun VerticalScrollbar( - modifier: Modifier, - adapter: ScrollbarAdapter -) diff --git a/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/ShortcutHandler.kt b/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/ShortcutHandler.kt deleted file mode 100644 index 6559422d4e..0000000000 --- a/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/ShortcutHandler.kt +++ /dev/null @@ -1,15 +0,0 @@ -package example.todo.common.ui - -import androidx.compose.ui.input.key.Key -import androidx.compose.ui.input.key.KeyEvent -import androidx.compose.ui.input.key.key - -fun onKeyUp(key: Key, onEvent: () -> Unit): (KeyEvent) -> Boolean = - { keyEvent -> - if (keyEvent.key == key) { - onEvent() - true - } else { - false - } - } diff --git a/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/TodoEditUi.kt b/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/TodoEditUi.kt deleted file mode 100644 index 0a805b44da..0000000000 --- a/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/TodoEditUi.kt +++ /dev/null @@ -1,60 +0,0 @@ -package example.todo.common.ui - -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.material.Checkbox -import androidx.compose.material.Icon -import androidx.compose.material.IconButton -import androidx.compose.material.Text -import androidx.compose.material.TextField -import androidx.compose.material.TopAppBar -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import com.arkivanov.decompose.extensions.compose.jetbrains.subscribeAsState -import example.todo.common.edit.TodoEdit - -@Composable -fun TodoEditContent(component: TodoEdit) { - val model by component.models.subscribeAsState() - - Column(horizontalAlignment = Alignment.CenterHorizontally) { - TopAppBar( - title = { Text("Edit todo") }, - navigationIcon = { - IconButton(onClick = component::onCloseClicked) { - Icon( - imageVector = Icons.Default.ArrowBack, - contentDescription = null - ) - } - } - ) - - TextField( - value = model.text, - modifier = Modifier.weight(1F).fillMaxWidth().padding(8.dp), - label = { Text("Todo text") }, - onValueChange = component::onTextChanged - ) - - Row(modifier = Modifier.padding(8.dp), verticalAlignment = Alignment.CenterVertically) { - Text(text = "Completed") - - Spacer(modifier = Modifier.width(8.dp)) - - Checkbox( - checked = model.isDone, - onCheckedChange = component::onDoneChanged - ) - } - } -} diff --git a/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/TodoMainUi.kt b/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/TodoMainUi.kt deleted file mode 100644 index aa5d464c0d..0000000000 --- a/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/TodoMainUi.kt +++ /dev/null @@ -1,158 +0,0 @@ -package example.todo.common.ui - -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material.Checkbox -import androidx.compose.material.Divider -import androidx.compose.material.Icon -import androidx.compose.material.IconButton -import androidx.compose.material.OutlinedTextField -import androidx.compose.material.Text -import androidx.compose.material.TopAppBar -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Add -import androidx.compose.material.icons.filled.Delete -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.ExperimentalComposeUiApi -import androidx.compose.ui.Modifier -import androidx.compose.ui.input.key.Key -import androidx.compose.ui.input.key.onKeyEvent -import androidx.compose.ui.text.AnnotatedString -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import com.arkivanov.decompose.extensions.compose.jetbrains.subscribeAsState -import example.todo.common.main.TodoItem -import example.todo.common.main.TodoMain - -@Composable -fun TodoMainContent(component: TodoMain) { - val model by component.models.subscribeAsState() - - Column { - TopAppBar(title = { Text(text = "Todo List") }) - - Box(Modifier.weight(1F)) { - TodoList( - items = model.items, - onItemClicked = component::onItemClicked, - onDoneChanged = component::onItemDoneChanged, - onDeleteItemClicked = component::onItemDeleteClicked - ) - } - - TodoInput( - text = model.text, - onAddClicked = component::onAddItemClicked, - onTextChanged = component::onInputTextChanged - ) - } -} - -@Composable -private fun TodoList( - items: List, - onItemClicked: (id: Long) -> Unit, - onDoneChanged: (id: Long, isDone: Boolean) -> Unit, - onDeleteItemClicked: (id: Long) -> Unit -) { - Box { - val listState = rememberLazyListState() - - LazyColumn(state = listState) { - items(items) { - Item( - item = it, - onItemClicked = onItemClicked, - onDoneChanged = onDoneChanged, - onDeleteItemClicked = onDeleteItemClicked - ) - - Divider() - } - } - - VerticalScrollbar( - modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(), - adapter = rememberScrollbarAdapter( - scrollState = listState, - itemCount = items.size, - averageItemSize = 37.dp - ) - ) - } -} - -@Composable -private fun Item( - item: TodoItem, - onItemClicked: (id: Long) -> Unit, - onDoneChanged: (id: Long, isDone: Boolean) -> Unit, - onDeleteItemClicked: (id: Long) -> Unit -) { - Row(modifier = Modifier.clickable(onClick = { onItemClicked(item.id) })) { - Spacer(modifier = Modifier.width(8.dp)) - - Checkbox( - checked = item.isDone, - modifier = Modifier.align(Alignment.CenterVertically), - onCheckedChange = { onDoneChanged(item.id, it) } - ) - - Spacer(modifier = Modifier.width(8.dp)) - - Text( - text = AnnotatedString(item.text), - modifier = Modifier.weight(1F).align(Alignment.CenterVertically), - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - - Spacer(modifier = Modifier.width(8.dp)) - - IconButton(onClick = { onDeleteItemClicked(item.id) }) { - Icon( - imageVector = Icons.Default.Delete, - contentDescription = null - ) - } - - Spacer(modifier = Modifier.width(MARGIN_SCROLLBAR)) - } -} - -@OptIn(ExperimentalComposeUiApi::class) -@Composable -private fun TodoInput( - text: String, - onTextChanged: (String) -> Unit, - onAddClicked: () -> Unit -) { - Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(8.dp)) { - OutlinedTextField( - value = text, - modifier = Modifier.weight(weight = 1F).onKeyEvent(onKeyUp(Key.Enter, onAddClicked)), - onValueChange = onTextChanged, - label = { Text(text = "Add a todo") } - ) - - Spacer(modifier = Modifier.width(8.dp)) - - IconButton(onClick = onAddClicked) { - Icon( - imageVector = Icons.Default.Add, - contentDescription = null - ) - } - } -} diff --git a/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/TodoRootUi.kt b/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/TodoRootUi.kt deleted file mode 100644 index 4975271fd2..0000000000 --- a/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/TodoRootUi.kt +++ /dev/null @@ -1,25 +0,0 @@ -@file:Suppress("EXPERIMENTAL_API_USAGE") - -package example.todo.common.ui - -import androidx.compose.runtime.Composable -import com.arkivanov.decompose.extensions.compose.jetbrains.stack.Children -import com.arkivanov.decompose.extensions.compose.jetbrains.stack.animation.fade -import com.arkivanov.decompose.extensions.compose.jetbrains.stack.animation.plus -import com.arkivanov.decompose.extensions.compose.jetbrains.stack.animation.scale -import com.arkivanov.decompose.extensions.compose.jetbrains.stack.animation.stackAnimation -import example.todo.common.root.TodoRoot -import example.todo.common.root.TodoRoot.Child - -@Composable -fun TodoRootContent(component: TodoRoot) { - Children( - stack = component.childStack, - animation = stackAnimation(fade() + scale()), - ) { - when (val child = it.instance) { - is Child.Main -> TodoMainContent(child.component) - is Child.Edit -> TodoEditContent(child.component) - } - } -} diff --git a/examples/todoapp/common/compose-ui/src/desktopMain/kotlin/example/todo/common/ui/Scrollbars.kt b/examples/todoapp/common/compose-ui/src/desktopMain/kotlin/example/todo/common/ui/Scrollbars.kt deleted file mode 100644 index 1a74dac273..0000000000 --- a/examples/todoapp/common/compose-ui/src/desktopMain/kotlin/example/todo/common/ui/Scrollbars.kt +++ /dev/null @@ -1,34 +0,0 @@ -package example.todo.common.ui - -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp - -actual val MARGIN_SCROLLBAR: Dp = 8.dp - -actual typealias ScrollbarAdapter = androidx.compose.foundation.v2.ScrollbarAdapter - -@OptIn(ExperimentalFoundationApi::class) -@Composable -actual fun rememberScrollbarAdapter( - scrollState: LazyListState, - itemCount: Int, - averageItemSize: Dp -): ScrollbarAdapter = - androidx.compose.foundation.rememberScrollbarAdapter( - scrollState = scrollState - ) - -@Composable -actual fun VerticalScrollbar( - modifier: Modifier, - adapter: ScrollbarAdapter -) { - androidx.compose.foundation.VerticalScrollbar( - modifier = modifier, - adapter = adapter - ) -} diff --git a/examples/todoapp/common/compose-ui/src/desktopMain/kotlin/example/todo/common/ui/TodoEditPreview.kt b/examples/todoapp/common/compose-ui/src/desktopMain/kotlin/example/todo/common/ui/TodoEditPreview.kt deleted file mode 100644 index 2c917d9954..0000000000 --- a/examples/todoapp/common/compose-ui/src/desktopMain/kotlin/example/todo/common/ui/TodoEditPreview.kt +++ /dev/null @@ -1,28 +0,0 @@ -package example.todo.common.ui - -import androidx.compose.desktop.ui.tooling.preview.Preview -import androidx.compose.runtime.Composable -import com.arkivanov.decompose.value.MutableValue -import com.arkivanov.decompose.value.Value -import example.todo.common.edit.TodoEdit -import example.todo.common.edit.TodoEdit.Model - -@Composable -@Preview -fun TodoEditContentPreview() { - TodoEditContent(TodoEditPreview()) -} - -class TodoEditPreview : TodoEdit { - override val models: Value = - MutableValue( - Model( - text = "Some text", - isDone = true - ) - ) - - override fun onTextChanged(text: String) {} - override fun onDoneChanged(isDone: Boolean) {} - override fun onCloseClicked() {} -} diff --git a/examples/todoapp/common/compose-ui/src/desktopMain/kotlin/example/todo/common/ui/TodoMainPreview.kt b/examples/todoapp/common/compose-ui/src/desktopMain/kotlin/example/todo/common/ui/TodoMainPreview.kt deleted file mode 100644 index bff9c17b6b..0000000000 --- a/examples/todoapp/common/compose-ui/src/desktopMain/kotlin/example/todo/common/ui/TodoMainPreview.kt +++ /dev/null @@ -1,37 +0,0 @@ -package example.todo.common.ui - -import androidx.compose.desktop.ui.tooling.preview.Preview -import androidx.compose.runtime.Composable -import com.arkivanov.decompose.value.MutableValue -import com.arkivanov.decompose.value.Value -import example.todo.common.main.TodoItem -import example.todo.common.main.TodoMain -import example.todo.common.main.TodoMain.Model - -@Preview -@Composable -fun TodoMainContentPreview() { - TodoMainContent(TodoMainPreview()) -} - -class TodoMainPreview : TodoMain { - override val models: Value = - MutableValue( - Model( - items = List(5) { index -> - TodoItem( - id = index.toLong(), - text = "Item $index", - isDone = index % 2 == 0 - ) - }, - text = "Some text" - ) - ) - - override fun onItemClicked(id: Long) {} - override fun onItemDoneChanged(id: Long, isDone: Boolean) {} - override fun onItemDeleteClicked(id: Long) {} - override fun onInputTextChanged(text: String) {} - override fun onAddItemClicked() {} -} diff --git a/examples/todoapp/common/database/build.gradle.kts b/examples/todoapp/common/database/build.gradle.kts deleted file mode 100755 index 1d0b66c4d4..0000000000 --- a/examples/todoapp/common/database/build.gradle.kts +++ /dev/null @@ -1,46 +0,0 @@ -plugins { - id("multiplatform-setup") - id("android-setup") - id("com.squareup.sqldelight") -} - -sqldelight { - database("TodoDatabase") { - packageName = "example.todo.database" - } -} - -kotlin { - sourceSets { - commonMain { - dependencies { - implementation(Deps.Badoo.Reaktive.reaktive) - } - } - - androidMain { - dependencies { - implementation(Deps.Squareup.SQLDelight.androidDriver) - implementation(Deps.Squareup.SQLDelight.sqliteDriver) - } - } - - desktopMain { - dependencies { - implementation(Deps.Squareup.SQLDelight.sqliteDriver) - } - } - - iosMain { - dependencies { - implementation(Deps.Squareup.SQLDelight.nativeDriver) - } - } - - jsMain { - dependencies { - implementation(Deps.Squareup.SQLDelight.sqljsDriver) - } - } - } -} diff --git a/examples/todoapp/common/database/src/androidMain/AndroidManifest.xml b/examples/todoapp/common/database/src/androidMain/AndroidManifest.xml deleted file mode 100755 index c83296539a..0000000000 --- a/examples/todoapp/common/database/src/androidMain/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/examples/todoapp/common/database/src/androidMain/kotlin/example/todo/common/database/TodoDatabaseDriverFactory.kt b/examples/todoapp/common/database/src/androidMain/kotlin/example/todo/common/database/TodoDatabaseDriverFactory.kt deleted file mode 100644 index a7d809e049..0000000000 --- a/examples/todoapp/common/database/src/androidMain/kotlin/example/todo/common/database/TodoDatabaseDriverFactory.kt +++ /dev/null @@ -1,14 +0,0 @@ -package example.todo.common.database - -import android.content.Context -import com.squareup.sqldelight.android.AndroidSqliteDriver -import com.squareup.sqldelight.db.SqlDriver -import example.todo.database.TodoDatabase - -@Suppress("FunctionName") // FactoryFunction -fun TodoDatabaseDriver(context: Context): SqlDriver = - AndroidSqliteDriver( - schema = TodoDatabase.Schema, - context = context, - name = "TodoDatabase.db" - ) diff --git a/examples/todoapp/common/database/src/commonMain/kotlin/example/todo/common/database/DefaultTodoSharedDatabase.kt b/examples/todoapp/common/database/src/commonMain/kotlin/example/todo/common/database/DefaultTodoSharedDatabase.kt deleted file mode 100644 index 08795a6b04..0000000000 --- a/examples/todoapp/common/database/src/commonMain/kotlin/example/todo/common/database/DefaultTodoSharedDatabase.kt +++ /dev/null @@ -1,91 +0,0 @@ -package example.todo.common.database - -import com.badoo.reaktive.base.setCancellable -import com.badoo.reaktive.completable.Completable -import com.badoo.reaktive.maybe.Maybe -import com.badoo.reaktive.observable.Observable -import com.badoo.reaktive.observable.autoConnect -import com.badoo.reaktive.observable.firstOrError -import com.badoo.reaktive.observable.map -import com.badoo.reaktive.observable.observable -import com.badoo.reaktive.observable.observeOn -import com.badoo.reaktive.observable.replay -import com.badoo.reaktive.scheduler.ioScheduler -import com.badoo.reaktive.single.Single -import com.badoo.reaktive.single.asCompletable -import com.badoo.reaktive.single.asObservable -import com.badoo.reaktive.single.doOnBeforeSuccess -import com.badoo.reaktive.single.flatMapObservable -import com.badoo.reaktive.single.map -import com.badoo.reaktive.single.mapNotNull -import com.badoo.reaktive.single.observeOn -import com.badoo.reaktive.single.singleOf -import com.squareup.sqldelight.Query -import com.squareup.sqldelight.db.SqlDriver -import example.todo.database.TodoDatabase - -class DefaultTodoSharedDatabase(driver: Single) : TodoSharedDatabase { - - constructor(driver: SqlDriver) : this(singleOf(driver)) - - private val queries: Single = - driver - .map { TodoDatabase(it).todoDatabaseQueries } - .asObservable() - .replay() - .autoConnect() - .firstOrError() - - override fun observeAll(): Observable> = - query(TodoDatabaseQueries::selectAll) - .observe { it.executeAsList() } - - override fun select(id: Long): Maybe = - query { it.select(id = id) } - .mapNotNull { it.executeAsOneOrNull() } - - override fun add(text: String): Completable = - execute { it.add(text = text) } - - override fun setText(id: Long, text: String): Completable = - execute { it.setText(id = id, text = text) } - - override fun setDone(id: Long, isDone: Boolean): Completable = - execute { it.setDone(id = id, isDone = isDone) } - - override fun delete(id: Long): Completable = - execute { it.delete(id = id) } - - override fun clear(): Completable = - execute { it.clear() } - - private fun query(query: (TodoDatabaseQueries) -> Query): Single> = - queries - .observeOn(ioScheduler) - .map(query) - - private fun execute(query: (TodoDatabaseQueries) -> Unit): Completable = - queries - .observeOn(ioScheduler) - .doOnBeforeSuccess(query) - .asCompletable() - - private fun Single>.observe(get: (Query) -> R): Observable = - flatMapObservable { it.observed() } - .observeOn(ioScheduler) - .map(get) - - private fun Query.observed(): Observable> = - observable { emitter -> - val listener = - object : Query.Listener { - override fun queryResultsChanged() { - emitter.onNext(this@observed) - } - } - - emitter.onNext(this@observed) - addListener(listener) - emitter.setCancellable { removeListener(listener) } - } -} diff --git a/examples/todoapp/common/database/src/commonMain/kotlin/example/todo/common/database/TestTodoSharedDatabase.kt b/examples/todoapp/common/database/src/commonMain/kotlin/example/todo/common/database/TestTodoSharedDatabase.kt deleted file mode 100644 index f6d4a76007..0000000000 --- a/examples/todoapp/common/database/src/commonMain/kotlin/example/todo/common/database/TestTodoSharedDatabase.kt +++ /dev/null @@ -1,105 +0,0 @@ -package example.todo.common.database - -import com.badoo.reaktive.base.invoke -import com.badoo.reaktive.completable.Completable -import com.badoo.reaktive.completable.completableFromFunction -import com.badoo.reaktive.completable.observeOn -import com.badoo.reaktive.maybe.Maybe -import com.badoo.reaktive.maybe.observeOn -import com.badoo.reaktive.observable.Observable -import com.badoo.reaktive.observable.map -import com.badoo.reaktive.observable.observeOn -import com.badoo.reaktive.scheduler.Scheduler -import com.badoo.reaktive.single.notNull -import com.badoo.reaktive.single.singleFromFunction -import com.badoo.reaktive.subject.behavior.BehaviorSubject - -// There were problems when using real database in JS tests, hence the in-memory test implementation -class TestTodoSharedDatabase( - private val scheduler: Scheduler -) : TodoSharedDatabase { - - private val itemsSubject = BehaviorSubject>(emptyMap()) - private val itemsObservable = itemsSubject.observeOn(scheduler) - val testing: Testing = Testing() - - override fun observeAll(): Observable> = - itemsObservable.map { it.values.toList() } - - override fun select(id: Long): Maybe = - singleFromFunction { testing.select(id = id) } - .notNull() - .observeOn(scheduler) - - override fun add(text: String): Completable = - execute { testing.add(text = text) } - - override fun setText(id: Long, text: String): Completable = - execute { testing.setText(id = id, text = text) } - - override fun setDone(id: Long, isDone: Boolean): Completable = - execute { testing.setDone(id = id, isDone = isDone) } - - override fun delete(id: Long): Completable = - execute { testing.delete(id = id) } - - override fun clear(): Completable = - execute { testing.clear() } - - private fun execute(block: () -> Unit): Completable = - completableFromFunction(block) - .observeOn(scheduler) - - inner class Testing { - fun select(id: Long): TodoItemEntity? = - itemsSubject.value[id] - - fun selectRequired(id: Long): TodoItemEntity = - requireNotNull(select(id = id)) - - fun add(text: String) { - updateItems { items -> - val nextId = items.keys.maxOrNull()?.plus(1L) ?: 1L - - val item = - TodoItemEntity( - id = nextId, - orderNum = items.size.toLong(), - text = text, - isDone = false - ) - - items + (nextId to item) - } - } - - fun setText(id: Long, text: String) { - updateItem(id = id) { it.copy(text = text) } - } - - fun setDone(id: Long, isDone: Boolean) { - updateItem(id = id) { it.copy(isDone = isDone) } - } - - fun delete(id: Long) { - updateItems { it - id } - } - - fun clear() { - updateItems { emptyMap() } - } - - fun getLastInsertId(): Long? = - itemsSubject.value.values.lastOrNull()?.id - - private fun updateItems(func: (Map) -> Map) { - itemsSubject(func(itemsSubject.value)) - } - - private fun updateItem(id: Long, func: (TodoItemEntity) -> TodoItemEntity) { - updateItems { - it + (id to it.getValue(id).let(func)) - } - } - } -} diff --git a/examples/todoapp/common/database/src/commonMain/kotlin/example/todo/common/database/TodoSharedDatabase.kt b/examples/todoapp/common/database/src/commonMain/kotlin/example/todo/common/database/TodoSharedDatabase.kt deleted file mode 100644 index 0c678b9ffb..0000000000 --- a/examples/todoapp/common/database/src/commonMain/kotlin/example/todo/common/database/TodoSharedDatabase.kt +++ /dev/null @@ -1,22 +0,0 @@ -package example.todo.common.database - -import com.badoo.reaktive.completable.Completable -import com.badoo.reaktive.maybe.Maybe -import com.badoo.reaktive.observable.Observable - -interface TodoSharedDatabase { - - fun observeAll(): Observable> - - fun select(id: Long): Maybe - - fun add(text: String): Completable - - fun setText(id: Long, text: String): Completable - - fun setDone(id: Long, isDone: Boolean): Completable - - fun delete(id: Long): Completable - - fun clear(): Completable -} diff --git a/examples/todoapp/common/database/src/commonMain/sqldelight/example/todo/common/database/TodoDatabase.sq b/examples/todoapp/common/database/src/commonMain/sqldelight/example/todo/common/database/TodoDatabase.sq deleted file mode 100644 index 796a31cff1..0000000000 --- a/examples/todoapp/common/database/src/commonMain/sqldelight/example/todo/common/database/TodoDatabase.sq +++ /dev/null @@ -1,39 +0,0 @@ -CREATE TABLE IF NOT EXISTS TodoItemEntity ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - orderNum INTEGER NOT NULL, - text TEXT NOT NULL, - isDone INTEGER AS Boolean NOT NULL DEFAULT 0 -); - -selectAll: -SELECT * -FROM TodoItemEntity; - -select: -SELECT * -FROM TodoItemEntity -WHERE id = :id; - -add: -INSERT INTO TodoItemEntity (orderNum, text) -VALUES ((CASE (SELECT COUNT(*) FROM TodoItemEntity) WHEN 0 THEN 1 ELSE (SELECT MAX(orderNum)+1 FROM TodoItemEntity) END), :text); - -setText: -UPDATE TodoItemEntity -SET text = :text -WHERE id = :id; - -setDone: -UPDATE TodoItemEntity -SET isDone = :isDone -WHERE id = :id; - -delete: -DELETE FROM TodoItemEntity -WHERE id = :id; - -getLastInsertId: -SELECT last_insert_rowid(); - -clear: -DELETE FROM TodoItemEntity; diff --git a/examples/todoapp/common/database/src/desktopMain/kotlin/example/todo/common/database/TodoDatabaseDriverFactory.kt b/examples/todoapp/common/database/src/desktopMain/kotlin/example/todo/common/database/TodoDatabaseDriverFactory.kt deleted file mode 100644 index 82e584ce38..0000000000 --- a/examples/todoapp/common/database/src/desktopMain/kotlin/example/todo/common/database/TodoDatabaseDriverFactory.kt +++ /dev/null @@ -1,15 +0,0 @@ -package example.todo.common.database - -import com.squareup.sqldelight.db.SqlDriver -import com.squareup.sqldelight.sqlite.driver.JdbcSqliteDriver -import example.todo.database.TodoDatabase -import java.io.File - -@Suppress("FunctionName") // FactoryFunction -fun TodoDatabaseDriver(): SqlDriver { - val databasePath = File(System.getProperty("java.io.tmpdir"), "ComposeTodoDatabase.db") - val driver = JdbcSqliteDriver(url = "jdbc:sqlite:${databasePath.absolutePath}") - TodoDatabase.Schema.create(driver) - - return driver -} diff --git a/examples/todoapp/common/database/src/iosMain/kotlin/example/todo/common/database/TodoDatabaseDriverFactory.kt b/examples/todoapp/common/database/src/iosMain/kotlin/example/todo/common/database/TodoDatabaseDriverFactory.kt deleted file mode 100644 index 9381ca6db1..0000000000 --- a/examples/todoapp/common/database/src/iosMain/kotlin/example/todo/common/database/TodoDatabaseDriverFactory.kt +++ /dev/null @@ -1,9 +0,0 @@ -package example.todo.common.database - -import com.squareup.sqldelight.db.SqlDriver -import com.squareup.sqldelight.drivers.native.NativeSqliteDriver -import example.todo.database.TodoDatabase - -@Suppress("FunctionName") // Factory function -fun TodoDatabaseDriver(): SqlDriver = - NativeSqliteDriver(TodoDatabase.Schema, "TodoDatabase.db") diff --git a/examples/todoapp/common/database/src/jsMain/kotlin/example/todo/common/database/TodoDatabaseDriverFactory.kt b/examples/todoapp/common/database/src/jsMain/kotlin/example/todo/common/database/TodoDatabaseDriverFactory.kt deleted file mode 100644 index 8483a72280..0000000000 --- a/examples/todoapp/common/database/src/jsMain/kotlin/example/todo/common/database/TodoDatabaseDriverFactory.kt +++ /dev/null @@ -1,10 +0,0 @@ -package example.todo.common.database - -import com.badoo.reaktive.promise.asSingle -import com.badoo.reaktive.single.Single -import com.squareup.sqldelight.db.SqlDriver -import com.squareup.sqldelight.drivers.sqljs.initSqlDriver -import example.todo.database.TodoDatabase - -fun todoDatabaseDriver(): Single = - initSqlDriver(TodoDatabase.Schema).asSingle() diff --git a/examples/todoapp/common/edit/build.gradle.kts b/examples/todoapp/common/edit/build.gradle.kts deleted file mode 100755 index c1b7dbc230..0000000000 --- a/examples/todoapp/common/edit/build.gradle.kts +++ /dev/null @@ -1,19 +0,0 @@ -plugins { - id("multiplatform-setup") - id("android-setup") -} - -kotlin { - sourceSets { - named("commonMain") { - dependencies { - implementation(project(":common:utils")) - implementation(project(":common:database")) - implementation(Deps.ArkIvanov.MVIKotlin.mvikotlin) - implementation(Deps.ArkIvanov.MVIKotlin.mvikotlinExtensionsReaktive) - implementation(Deps.ArkIvanov.Decompose.decompose) - implementation(Deps.Badoo.Reaktive.reaktive) - } - } - } -} diff --git a/examples/todoapp/common/edit/src/androidMain/AndroidManifest.xml b/examples/todoapp/common/edit/src/androidMain/AndroidManifest.xml deleted file mode 100755 index 81950f91b3..0000000000 --- a/examples/todoapp/common/edit/src/androidMain/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/TodoEdit.kt b/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/TodoEdit.kt deleted file mode 100644 index 8ca3091b6e..0000000000 --- a/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/TodoEdit.kt +++ /dev/null @@ -1,23 +0,0 @@ -package example.todo.common.edit - -import com.arkivanov.decompose.value.Value - -interface TodoEdit { - - val models: Value - - fun onTextChanged(text: String) - - fun onDoneChanged(isDone: Boolean) - - fun onCloseClicked() - - data class Model( - val text: String, - val isDone: Boolean - ) - - sealed class Output { - object Finished : Output() - } -} diff --git a/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/TodoItem.kt b/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/TodoItem.kt deleted file mode 100644 index 03a9743162..0000000000 --- a/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/TodoItem.kt +++ /dev/null @@ -1,6 +0,0 @@ -package example.todo.common.edit - -internal data class TodoItem( - val text: String, - val isDone: Boolean -) diff --git a/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/integration/Mappers.kt b/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/integration/Mappers.kt deleted file mode 100644 index f1d08babcb..0000000000 --- a/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/integration/Mappers.kt +++ /dev/null @@ -1,12 +0,0 @@ -package example.todo.common.edit.integration - -import example.todo.common.edit.TodoEdit.Model -import example.todo.common.edit.store.TodoEditStore.State - -internal val stateToModel: (State) -> Model = - { - Model( - text = it.text, - isDone = it.isDone - ) - } diff --git a/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/integration/TodoEditComponent.kt b/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/integration/TodoEditComponent.kt deleted file mode 100644 index 195145ab0d..0000000000 --- a/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/integration/TodoEditComponent.kt +++ /dev/null @@ -1,48 +0,0 @@ -package example.todo.common.edit.integration - -import com.arkivanov.decompose.ComponentContext -import com.arkivanov.decompose.value.Value -import com.arkivanov.decompose.value.operator.map -import com.arkivanov.mvikotlin.core.store.StoreFactory -import com.badoo.reaktive.base.Consumer -import com.badoo.reaktive.base.invoke -import example.todo.common.database.TodoSharedDatabase -import example.todo.common.edit.TodoEdit -import example.todo.common.edit.TodoEdit.Model -import example.todo.common.edit.TodoEdit.Output -import example.todo.common.edit.store.TodoEditStore.Intent -import example.todo.common.edit.store.TodoEditStoreProvider -import example.todo.common.utils.asValue -import example.todo.common.utils.getStore - -class TodoEditComponent( - componentContext: ComponentContext, - storeFactory: StoreFactory, - database: TodoSharedDatabase, - itemId: Long, - private val output: Consumer -) : TodoEdit, ComponentContext by componentContext { - - private val store = - instanceKeeper.getStore { - TodoEditStoreProvider( - storeFactory = storeFactory, - database = TodoEditStoreDatabase(database = database), - id = itemId - ).provide() - } - - override val models: Value = store.asValue().map(stateToModel) - - override fun onTextChanged(text: String) { - store.accept(Intent.SetText(text = text)) - } - - override fun onDoneChanged(isDone: Boolean) { - store.accept(Intent.SetDone(isDone = isDone)) - } - - override fun onCloseClicked() { - output(Output.Finished) - } -} diff --git a/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/integration/TodoEditStoreDatabase.kt b/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/integration/TodoEditStoreDatabase.kt deleted file mode 100644 index 8c63bf8138..0000000000 --- a/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/integration/TodoEditStoreDatabase.kt +++ /dev/null @@ -1,31 +0,0 @@ -package example.todo.common.edit.integration - -import com.badoo.reaktive.completable.Completable -import com.badoo.reaktive.maybe.Maybe -import com.badoo.reaktive.maybe.map -import example.todo.common.database.TodoItemEntity -import example.todo.common.database.TodoSharedDatabase -import example.todo.common.edit.TodoItem -import example.todo.common.edit.store.TodoEditStoreProvider.Database - -internal class TodoEditStoreDatabase( - private val database: TodoSharedDatabase -) : Database { - - override fun load(id: Long): Maybe = - database - .select(id = id) - .map { it.toItem() } - - private fun TodoItemEntity.toItem(): TodoItem = - TodoItem( - text = text, - isDone = isDone - ) - - override fun setText(id: Long, text: String): Completable = - database.setText(id = id, text = text) - - override fun setDone(id: Long, isDone: Boolean): Completable = - database.setDone(id = id, isDone = isDone) -} diff --git a/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/store/TodoEditStore.kt b/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/store/TodoEditStore.kt deleted file mode 100644 index cb72e30d88..0000000000 --- a/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/store/TodoEditStore.kt +++ /dev/null @@ -1,24 +0,0 @@ -package example.todo.common.edit.store - -import com.arkivanov.mvikotlin.core.store.Store -import example.todo.common.edit.TodoItem -import example.todo.common.edit.store.TodoEditStore.Intent -import example.todo.common.edit.store.TodoEditStore.Label -import example.todo.common.edit.store.TodoEditStore.State - -internal interface TodoEditStore : Store { - - sealed class Intent { - data class SetText(val text: String) : Intent() - data class SetDone(val isDone: Boolean) : Intent() - } - - data class State( - val text: String = "", - val isDone: Boolean = false - ) - - sealed class Label { - data class Changed(val item: TodoItem) : Label() - } -} diff --git a/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/store/TodoEditStoreProvider.kt b/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/store/TodoEditStoreProvider.kt deleted file mode 100644 index f488f47c00..0000000000 --- a/examples/todoapp/common/edit/src/commonMain/kotlin/example/todo/common/edit/store/TodoEditStoreProvider.kt +++ /dev/null @@ -1,83 +0,0 @@ -package example.todo.common.edit.store - -import com.arkivanov.mvikotlin.core.store.Reducer -import com.arkivanov.mvikotlin.core.store.SimpleBootstrapper -import com.arkivanov.mvikotlin.core.store.Store -import com.arkivanov.mvikotlin.core.store.StoreFactory -import com.arkivanov.mvikotlin.extensions.reaktive.ReaktiveExecutor -import com.badoo.reaktive.completable.Completable -import com.badoo.reaktive.maybe.Maybe -import com.badoo.reaktive.maybe.map -import com.badoo.reaktive.maybe.observeOn -import com.badoo.reaktive.scheduler.mainScheduler -import example.todo.common.edit.TodoItem -import example.todo.common.edit.store.TodoEditStore.Intent -import example.todo.common.edit.store.TodoEditStore.Label -import example.todo.common.edit.store.TodoEditStore.State - -internal class TodoEditStoreProvider( - private val storeFactory: StoreFactory, - private val database: Database, - private val id: Long -) { - - fun provide(): TodoEditStore = - object : TodoEditStore, Store by storeFactory.create( - name = "EditStore", - initialState = State(), - bootstrapper = SimpleBootstrapper(Unit), - executorFactory = ::ExecutorImpl, - reducer = ReducerImpl - ) {} - - private sealed class Msg { - data class Loaded(val item: TodoItem) : Msg() - data class TextChanged(val text: String) : Msg() - data class DoneChanged(val isDone: Boolean) : Msg() - } - - private inner class ExecutorImpl : ReaktiveExecutor() { - override fun executeAction(action: Unit, getState: () -> State) { - database - .load(id = id) - .map(Msg::Loaded) - .observeOn(mainScheduler) - .subscribeScoped(onSuccess = ::dispatch) - } - - override fun executeIntent(intent: Intent, getState: () -> State) = - when (intent) { - is Intent.SetText -> setText(text = intent.text, state = getState()) - is Intent.SetDone -> setDone(isDone = intent.isDone, state = getState()) - } - - private fun setText(text: String, state: State) { - dispatch(Msg.TextChanged(text = text)) - publish(Label.Changed(TodoItem(text = text, isDone = state.isDone))) - database.setText(id = id, text = text).subscribeScoped() - } - - private fun setDone(isDone: Boolean, state: State) { - dispatch(Msg.DoneChanged(isDone = isDone)) - publish(Label.Changed(TodoItem(text = state.text, isDone = isDone))) - database.setDone(id = id, isDone = isDone).subscribeScoped() - } - } - - private object ReducerImpl : Reducer { - override fun State.reduce(msg: Msg): State = - when (msg) { - is Msg.Loaded -> copy(text = msg.item.text, isDone = msg.item.isDone) - is Msg.TextChanged -> copy(text = msg.text) - is Msg.DoneChanged -> copy(isDone = msg.isDone) - } - } - - interface Database { - fun load(id: Long): Maybe - - fun setText(id: Long, text: String): Completable - - fun setDone(id: Long, isDone: Boolean): Completable - } -} diff --git a/examples/todoapp/common/main/build.gradle.kts b/examples/todoapp/common/main/build.gradle.kts deleted file mode 100755 index f6bf177ab7..0000000000 --- a/examples/todoapp/common/main/build.gradle.kts +++ /dev/null @@ -1,27 +0,0 @@ -plugins { - id("multiplatform-setup") - id("android-setup") -} - -kotlin { - sourceSets { - named("commonMain") { - dependencies { - implementation(project(":common:utils")) - implementation(project(":common:database")) - implementation(Deps.ArkIvanov.Decompose.decompose) - implementation(Deps.ArkIvanov.MVIKotlin.mvikotlin) - implementation(Deps.ArkIvanov.MVIKotlin.mvikotlinExtensionsReaktive) - implementation(Deps.Badoo.Reaktive.reaktive) - } - } - - named("commonTest") { - dependencies { - implementation(Deps.ArkIvanov.MVIKotlin.mvikotlinMain) - implementation(Deps.Badoo.Reaktive.reaktiveTesting) - implementation(Deps.Badoo.Reaktive.utils) - } - } - } -} diff --git a/examples/todoapp/common/main/src/androidMain/AndroidManifest.xml b/examples/todoapp/common/main/src/androidMain/AndroidManifest.xml deleted file mode 100755 index 503253e279..0000000000 --- a/examples/todoapp/common/main/src/androidMain/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/TodoItem.kt b/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/TodoItem.kt deleted file mode 100644 index 78f93d23d9..0000000000 --- a/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/TodoItem.kt +++ /dev/null @@ -1,8 +0,0 @@ -package example.todo.common.main - -data class TodoItem( - val id: Long = 0L, - val order: Long = 0L, - val text: String = "", - val isDone: Boolean = false -) diff --git a/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/TodoMain.kt b/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/TodoMain.kt deleted file mode 100644 index 24d434313c..0000000000 --- a/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/TodoMain.kt +++ /dev/null @@ -1,27 +0,0 @@ -package example.todo.common.main - -import com.arkivanov.decompose.value.Value - -interface TodoMain { - - val models: Value - - fun onItemClicked(id: Long) - - fun onItemDoneChanged(id: Long, isDone: Boolean) - - fun onItemDeleteClicked(id: Long) - - fun onInputTextChanged(text: String) - - fun onAddItemClicked() - - data class Model( - val items: List, - val text: String - ) - - sealed class Output { - data class Selected(val id: Long) : Output() - } -} diff --git a/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/integration/Mappers.kt b/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/integration/Mappers.kt deleted file mode 100644 index 010b1e4e7c..0000000000 --- a/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/integration/Mappers.kt +++ /dev/null @@ -1,12 +0,0 @@ -package example.todo.common.main.integration - -import example.todo.common.main.TodoMain.Model -import example.todo.common.main.store.TodoMainStore.State - -internal val stateToModel: (State) -> Model = - { - Model( - items = it.items, - text = it.text - ) - } \ No newline at end of file diff --git a/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/integration/TodoMainComponent.kt b/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/integration/TodoMainComponent.kt deleted file mode 100644 index 2e70f71fc9..0000000000 --- a/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/integration/TodoMainComponent.kt +++ /dev/null @@ -1,54 +0,0 @@ -package example.todo.common.main.integration - -import com.arkivanov.decompose.ComponentContext -import com.arkivanov.decompose.value.Value -import com.arkivanov.decompose.value.operator.map -import com.arkivanov.mvikotlin.core.store.StoreFactory -import com.badoo.reaktive.base.Consumer -import com.badoo.reaktive.base.invoke -import example.todo.common.database.TodoSharedDatabase -import example.todo.common.main.TodoMain -import example.todo.common.main.TodoMain.Model -import example.todo.common.main.TodoMain.Output -import example.todo.common.main.store.TodoMainStore.Intent -import example.todo.common.main.store.TodoMainStoreProvider -import example.todo.common.utils.asValue -import example.todo.common.utils.getStore - -class TodoMainComponent( - componentContext: ComponentContext, - storeFactory: StoreFactory, - database: TodoSharedDatabase, - private val output: Consumer -) : TodoMain, ComponentContext by componentContext { - - private val store = - instanceKeeper.getStore { - TodoMainStoreProvider( - storeFactory = storeFactory, - database = TodoMainStoreDatabase(database = database) - ).provide() - } - - override val models: Value = store.asValue().map(stateToModel) - - override fun onItemClicked(id: Long) { - output(Output.Selected(id = id)) - } - - override fun onItemDoneChanged(id: Long, isDone: Boolean) { - store.accept(Intent.SetItemDone(id = id, isDone = isDone)) - } - - override fun onItemDeleteClicked(id: Long) { - store.accept(Intent.DeleteItem(id = id)) - } - - override fun onInputTextChanged(text: String) { - store.accept(Intent.SetText(text = text)) - } - - override fun onAddItemClicked() { - store.accept(Intent.AddItem) - } -} diff --git a/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/integration/TodoMainStoreDatabase.kt b/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/integration/TodoMainStoreDatabase.kt deleted file mode 100644 index 4e70c62166..0000000000 --- a/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/integration/TodoMainStoreDatabase.kt +++ /dev/null @@ -1,36 +0,0 @@ -package example.todo.common.main.integration - -import com.badoo.reaktive.completable.Completable -import com.badoo.reaktive.observable.Observable -import com.badoo.reaktive.observable.mapIterable -import example.todo.common.database.TodoItemEntity -import example.todo.common.database.TodoSharedDatabase -import example.todo.common.main.TodoItem -import example.todo.common.main.store.TodoMainStoreProvider - -internal class TodoMainStoreDatabase( - private val database: TodoSharedDatabase -) : TodoMainStoreProvider.Database { - - override val updates: Observable> = - database - .observeAll() - .mapIterable { it.toItem() } - - private fun TodoItemEntity.toItem(): TodoItem = - TodoItem( - id = id, - order = orderNum, - text = text, - isDone = isDone - ) - - override fun setDone(id: Long, isDone: Boolean): Completable = - database.setDone(id = id, isDone = isDone) - - override fun delete(id: Long): Completable = - database.delete(id = id) - - override fun add(text: String): Completable = - database.add(text = text) -} diff --git a/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/store/TodoMainStore.kt b/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/store/TodoMainStore.kt deleted file mode 100644 index f00e81f539..0000000000 --- a/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/store/TodoMainStore.kt +++ /dev/null @@ -1,21 +0,0 @@ -package example.todo.common.main.store - -import com.arkivanov.mvikotlin.core.store.Store -import example.todo.common.main.TodoItem -import example.todo.common.main.store.TodoMainStore.Intent -import example.todo.common.main.store.TodoMainStore.State - -internal interface TodoMainStore : Store { - - sealed class Intent { - data class SetItemDone(val id: Long, val isDone: Boolean) : Intent() - data class DeleteItem(val id: Long) : Intent() - data class SetText(val text: String) : Intent() - object AddItem : Intent() - } - - data class State( - val items: List = emptyList(), - val text: String = "" - ) -} diff --git a/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/store/TodoMainStoreProvider.kt b/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/store/TodoMainStoreProvider.kt deleted file mode 100644 index 3e9f3cf859..0000000000 --- a/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/store/TodoMainStoreProvider.kt +++ /dev/null @@ -1,107 +0,0 @@ -package example.todo.common.main.store - -import com.arkivanov.mvikotlin.core.store.Reducer -import com.arkivanov.mvikotlin.core.store.SimpleBootstrapper -import com.arkivanov.mvikotlin.core.store.Store -import com.arkivanov.mvikotlin.core.store.StoreFactory -import com.arkivanov.mvikotlin.extensions.reaktive.ReaktiveExecutor -import com.badoo.reaktive.completable.Completable -import com.badoo.reaktive.observable.Observable -import com.badoo.reaktive.observable.map -import com.badoo.reaktive.observable.observeOn -import com.badoo.reaktive.scheduler.mainScheduler -import example.todo.common.main.TodoItem -import example.todo.common.main.store.TodoMainStore.Intent -import example.todo.common.main.store.TodoMainStore.State - -internal class TodoMainStoreProvider( - private val storeFactory: StoreFactory, - private val database: Database -) { - - fun provide(): TodoMainStore = - object : TodoMainStore, Store by storeFactory.create( - name = "TodoListStore", - initialState = State(), - bootstrapper = SimpleBootstrapper(Unit), - executorFactory = ::ExecutorImpl, - reducer = ReducerImpl - ) {} - - private sealed class Msg { - data class ItemsLoaded(val items: List) : Msg() - data class ItemDoneChanged(val id: Long, val isDone: Boolean) : Msg() - data class ItemDeleted(val id: Long) : Msg() - data class TextChanged(val text: String) : Msg() - } - - private inner class ExecutorImpl : ReaktiveExecutor() { - override fun executeAction(action: Unit, getState: () -> State) { - database - .updates - .observeOn(mainScheduler) - .map(Msg::ItemsLoaded) - .subscribeScoped(onNext = ::dispatch) - } - - override fun executeIntent(intent: Intent, getState: () -> State): Unit = - when (intent) { - is Intent.SetItemDone -> setItemDone(id = intent.id, isDone = intent.isDone) - is Intent.DeleteItem -> deleteItem(id = intent.id) - is Intent.SetText -> dispatch(Msg.TextChanged(text = intent.text)) - is Intent.AddItem -> addItem(state = getState()) - } - - private fun setItemDone(id: Long, isDone: Boolean) { - dispatch(Msg.ItemDoneChanged(id = id, isDone = isDone)) - database.setDone(id = id, isDone = isDone).subscribeScoped() - } - - private fun deleteItem(id: Long) { - dispatch(Msg.ItemDeleted(id = id)) - database.delete(id = id).subscribeScoped() - } - - private fun addItem(state: State) { - if (state.text.isNotEmpty()) { - dispatch(Msg.TextChanged(text = "")) - database.add(text = state.text).subscribeScoped() - } - } - } - - private object ReducerImpl : Reducer { - override fun State.reduce(msg: Msg): State = - when (msg) { - is Msg.ItemsLoaded -> copy(items = msg.items.sorted()) - is Msg.ItemDoneChanged -> update(id = msg.id) { copy(isDone = msg.isDone) } - is Msg.ItemDeleted -> copy(items = items.filterNot { it.id == msg.id }) - is Msg.TextChanged -> copy(text = msg.text) - } - - private inline fun State.update(id: Long, func: TodoItem.() -> TodoItem): State { - val item = items.find { it.id == id } ?: return this - - return put(item.func()) - } - - private fun State.put(item: TodoItem): State { - val oldItems = items.associateByTo(mutableMapOf(), TodoItem::id) - val oldItem: TodoItem? = oldItems.put(item.id, item) - - return copy(items = if (oldItem?.order == item.order) oldItems.values.toList() else oldItems.values.sorted()) - } - - private fun Iterable.sorted(): List = sortedByDescending(TodoItem::order) - } - - interface Database { - val updates: Observable> - - fun setDone(id: Long, isDone: Boolean): Completable - - fun delete(id: Long): Completable - - fun add(text: String): Completable - } -} diff --git a/examples/todoapp/common/main/src/commonTest/kotlin/example/todo/common/main/integration/TodoMainTest.kt b/examples/todoapp/common/main/src/commonTest/kotlin/example/todo/common/main/integration/TodoMainTest.kt deleted file mode 100644 index 2ce2159b99..0000000000 --- a/examples/todoapp/common/main/src/commonTest/kotlin/example/todo/common/main/integration/TodoMainTest.kt +++ /dev/null @@ -1,142 +0,0 @@ -package example.todo.common.main.integration - -import com.arkivanov.decompose.DefaultComponentContext -import com.arkivanov.essenty.lifecycle.LifecycleRegistry -import com.arkivanov.mvikotlin.main.store.DefaultStoreFactory -import com.badoo.reaktive.scheduler.overrideSchedulers -import com.badoo.reaktive.subject.publish.PublishSubject -import com.badoo.reaktive.test.observable.assertValue -import com.badoo.reaktive.test.observable.test -import com.badoo.reaktive.test.scheduler.TestScheduler -import example.todo.common.database.TestTodoSharedDatabase -import example.todo.common.database.TodoItemEntity -import example.todo.common.main.TodoItem -import example.todo.common.main.TodoMain.Model -import example.todo.common.main.TodoMain.Output -import kotlin.test.BeforeTest -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertFalse -import kotlin.test.assertNull -import kotlin.test.assertTrue - -@Suppress("TestFunctionName") -class TodoMainTest { - - private val lifecycle = LifecycleRegistry() - private val database = TestTodoSharedDatabase(TestScheduler()) - private val outputSubject = PublishSubject() - private val output = outputSubject.test() - private val databaseTesting = database.testing - - private val impl by lazy { - TodoMainComponent( - componentContext = DefaultComponentContext(lifecycle = lifecycle), - storeFactory = DefaultStoreFactory(), - database = database, - output = outputSubject - ) - } - - private val model: Model get() = impl.models.value - - @BeforeTest - fun before() { - overrideSchedulers( - main = { TestScheduler() }, - io = { TestScheduler() } - ) - - databaseTesting.clear() - } - - @Test - fun WHEN_item_added_to_database_THEN_item_displayed() { - databaseTesting.add("Item1") - - assertEquals("Item1", firstItem().text) - } - - @Test - fun WHEN_item_deleted_from_database_THEN_item_not_displayed() { - databaseTesting.add("Item1") - val id = lastInsertItem().id - - databaseTesting.delete(id = id) - - assertFalse(model.items.any { it.id == id }) - } - - @Test - fun WHEN_item_clicked_THEN_Output_Selected_emitted() { - databaseTesting.add("Item1") - val id = firstItem().id - - impl.onItemClicked(id = id) - - output.assertValue(Output.Selected(id = id)) - } - - @Test - fun GIVEN_item_isDone_false_WHEN_done_changed_to_true_THEN_item_isDone_true_in_database() { - databaseTesting.add("Item1") - val id = firstItem().id - databaseTesting.setDone(id = id, isDone = false) - - impl.onItemDoneChanged(id = id, isDone = true) - - assertTrue(databaseTesting.selectRequired(id = id).isDone) - } - - @Test - fun GIVEN_item_isDone_true_WHEN_done_changed_to_false_THEN_item_isDone_false_in_database() { - databaseTesting.add("Item1") - val id = firstItem().id - databaseTesting.setDone(id = id, isDone = true) - - impl.onItemDoneChanged(id = id, isDone = false) - - assertFalse(databaseTesting.selectRequired(id = id).isDone) - } - - @Test - fun WHEN_item_delete_clicked_THEN_item_deleted_in_database() { - databaseTesting.add("Item1") - val id = firstItem().id - - impl.onItemDeleteClicked(id = id) - - assertNull(databaseTesting.select(id = id)) - } - - @Test - fun WHEN_item_text_changed_in_database_THEN_item_updated() { - databaseTesting.add("Item1") - val id = firstItem().id - - databaseTesting.setText(id = id, text = "New text") - - assertEquals("New text", firstItem().text) - } - - @Test - fun WHEN_input_text_changed_THEN_text_updated() { - impl.onInputTextChanged(text = "Item text") - - assertEquals("Item text", model.text) - } - - @Test - fun GIVEN_input_text_entered_WHEN_add_item_clicked_THEN_item_added_in_database() { - impl.onInputTextChanged(text = "Item text") - - impl.onAddItemClicked() - - assertEquals("Item text", lastInsertItem().text) - } - - private fun firstItem(): TodoItem = model.items[0] - - private fun lastInsertItem(): TodoItemEntity = - databaseTesting.selectRequired(id = requireNotNull(databaseTesting.getLastInsertId())) -} diff --git a/examples/todoapp/common/main/src/commonTest/kotlin/example/todo/common/main/store/TestTodoMainStoreDatabase.kt b/examples/todoapp/common/main/src/commonTest/kotlin/example/todo/common/main/store/TestTodoMainStoreDatabase.kt deleted file mode 100644 index 95e274ba5c..0000000000 --- a/examples/todoapp/common/main/src/commonTest/kotlin/example/todo/common/main/store/TestTodoMainStoreDatabase.kt +++ /dev/null @@ -1,40 +0,0 @@ -package example.todo.common.main.store - -import com.badoo.reaktive.completable.Completable -import com.badoo.reaktive.completable.completableFromFunction -import com.badoo.reaktive.observable.Observable -import com.badoo.reaktive.subject.behavior.BehaviorSubject -import example.todo.common.main.TodoItem - -internal class TestTodoMainStoreDatabase : TodoMainStoreProvider.Database { - - private val subject = BehaviorSubject>(emptyList()) - - var items: List - get() = subject.value - set(value) { - subject.onNext(value) - } - - override val updates: Observable> = subject - - override fun setDone(id: Long, isDone: Boolean): Completable = - completableFromFunction { - update(id = id) { copy(isDone = isDone) } - } - - override fun delete(id: Long): Completable = - completableFromFunction { - this.items = items.filterNot { it.id == id } - } - - override fun add(text: String): Completable = - completableFromFunction { - val id = items.maxByOrNull(TodoItem::id)?.id?.inc() ?: 1L - this.items += TodoItem(id = id, order = id, text = text) - } - - private fun update(id: Long, func: TodoItem.() -> TodoItem) { - items = items.map { if (it.id == id) it.func() else it } - } -} diff --git a/examples/todoapp/common/main/src/commonTest/kotlin/example/todo/common/main/store/TodoMainStoreTest.kt b/examples/todoapp/common/main/src/commonTest/kotlin/example/todo/common/main/store/TodoMainStoreTest.kt deleted file mode 100644 index c5ace73e79..0000000000 --- a/examples/todoapp/common/main/src/commonTest/kotlin/example/todo/common/main/store/TodoMainStoreTest.kt +++ /dev/null @@ -1,135 +0,0 @@ -package example.todo.common.main.store - -import com.arkivanov.mvikotlin.main.store.DefaultStoreFactory -import com.badoo.reaktive.scheduler.overrideSchedulers -import com.badoo.reaktive.test.scheduler.TestScheduler -import example.todo.common.main.TodoItem -import example.todo.common.main.store.TodoMainStore.Intent -import kotlin.test.BeforeTest -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertFalse -import kotlin.test.assertTrue - -@Suppress("TestFunctionName") -class TodoMainStoreTest { - - private val database = TestTodoMainStoreDatabase() - private val provider = TodoMainStoreProvider(storeFactory = DefaultStoreFactory(), database = database) - - @BeforeTest - fun before() { - overrideSchedulers(main = { TestScheduler() }) - } - - @Test - fun GIVEN_items_in_database_WHEN_created_THEN_loads_items_from_database() { - val item1 = TodoItem(id = 1L, order = 2L, text = "item1") - val item2 = TodoItem(id = 2L, order = 1L, text = "item2", isDone = true) - val item3 = TodoItem(id = 3L, order = 3L, text = "item3") - database.items = listOf(item1, item2, item3) - - val store = provider.provide() - - assertEquals(listOf(item3, item1, item2), store.state.items) - } - - @Test - fun WHEN_items_changed_in_database_THEN_contains_new_items() { - database.items = listOf(TodoItem()) - val store = provider.provide() - - val item1 = TodoItem(id = 1L, order = 2L, text = "item1") - val item2 = TodoItem(id = 2L, order = 1L, text = "item2", isDone = true) - val item3 = TodoItem(id = 3L, order = 3L, text = "item3") - database.items = listOf(item1, item2, item3) - - assertEquals(listOf(item3, item1, item2), store.state.items) - } - - @Test - fun WHEN_Intent_SetItemDone_THEN_done_changed_in_state() { - val item1 = TodoItem(id = 1L, text = "item1") - val item2 = TodoItem(id = 2L, text = "item2", isDone = false) - database.items = listOf(item1, item2) - val store = provider.provide() - - store.accept(Intent.SetItemDone(id = 2L, isDone = true)) - - assertTrue(store.state.items.first { it.id == 2L }.isDone) - } - - @Test - fun WHEN_Intent_SetItemDone_THEN_done_changed_in_database() { - val item1 = TodoItem(id = 1L, text = "item1") - val item2 = TodoItem(id = 2L, text = "item2", isDone = false) - database.items = listOf(item1, item2) - val store = provider.provide() - - store.accept(Intent.SetItemDone(id = 2L, isDone = true)) - - assertTrue(database.items.first { it.id == 2L }.isDone) - } - - @Test - fun WHEN_Intent_DeleteItem_THEN_item_deleted_in_state() { - val item1 = TodoItem(id = 1L, text = "item1") - val item2 = TodoItem(id = 2L, text = "item2") - database.items = listOf(item1, item2) - val store = provider.provide() - - store.accept(Intent.DeleteItem(id = 2L)) - - assertFalse(store.state.items.any { it.id == 2L }) - } - - @Test - fun WHEN_Intent_DeleteItem_THEN_item_deleted_in_database() { - val item1 = TodoItem(id = 1L, text = "item1") - val item2 = TodoItem(id = 2L, text = "item2") - database.items = listOf(item1, item2) - val store = provider.provide() - - store.accept(Intent.DeleteItem(id = 2L)) - - assertFalse(database.items.any { it.id == 2L }) - } - - @Test - fun WHEN_Intent_SetText_WHEN_text_changed_in_state() { - val store = provider.provide() - - store.accept(Intent.SetText(text = "Item text")) - - assertEquals("Item text", store.state.text) - } - - @Test - fun GIVEN_text_entered_WHEN_Intent_AddItem_THEN_item_added_in_database() { - val store = provider.provide() - store.accept(Intent.SetText(text = "Item text")) - - store.accept(Intent.AddItem) - - assertTrue(database.items.any { it.text == "Item text" }) - } - - @Test - fun GIVEN_text_entered_WHEN_Intent_AddItem_THEN_text_cleared_in_state() { - val store = provider.provide() - store.accept(Intent.SetText(text = "Item text")) - - store.accept(Intent.AddItem) - - assertEquals("", store.state.text) - } - - @Test - fun GIVEN_no_text_entered_WHEN_Intent_AddItem_THEN_item_not_added() { - val store = provider.provide() - - store.accept(Intent.AddItem) - - assertEquals(0, store.state.items.size) - } -} diff --git a/examples/todoapp/common/root/build.gradle.kts b/examples/todoapp/common/root/build.gradle.kts deleted file mode 100755 index 7355c2364e..0000000000 --- a/examples/todoapp/common/root/build.gradle.kts +++ /dev/null @@ -1,55 +0,0 @@ -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget -import org.jetbrains.kotlin.konan.target.Family - -plugins { - id("multiplatform-setup") - id("android-setup") - id("kotlin-parcelize") -} - -kotlin { - targets - .filterIsInstance() - .filter { it.konanTarget.family == Family.IOS } - .forEach { target -> - target.binaries { - framework { - baseName = "Todo" - linkerOpts.add("-lsqlite3") - export(project(":common:database")) - export(project(":common:main")) - export(project(":common:edit")) - export(Deps.ArkIvanov.Decompose.decompose) - export(Deps.ArkIvanov.MVIKotlin.mvikotlinMain) - export(Deps.ArkIvanov.Essenty.lifecycle) - } - } - } - - sourceSets { - named("commonMain") { - dependencies { - implementation(project(":common:utils")) - implementation(project(":common:database")) - implementation(project(":common:main")) - implementation(project(":common:edit")) - implementation(Deps.ArkIvanov.MVIKotlin.mvikotlin) - implementation(Deps.ArkIvanov.Decompose.decompose) - implementation(Deps.Badoo.Reaktive.reaktive) - } - } - } - - sourceSets { - named("iosMain") { - dependencies { - api(project(":common:database")) - api(project(":common:main")) - api(project(":common:edit")) - api(Deps.ArkIvanov.Decompose.decompose) - api(Deps.ArkIvanov.MVIKotlin.mvikotlinMain) - api(Deps.ArkIvanov.Essenty.lifecycle) - } - } - } -} diff --git a/examples/todoapp/common/root/src/androidMain/AndroidManifest.xml b/examples/todoapp/common/root/src/androidMain/AndroidManifest.xml deleted file mode 100755 index c22f01dc76..0000000000 --- a/examples/todoapp/common/root/src/androidMain/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/examples/todoapp/common/root/src/commonMain/kotlin/example/todo/common/root/TodoRoot.kt b/examples/todoapp/common/root/src/commonMain/kotlin/example/todo/common/root/TodoRoot.kt deleted file mode 100644 index da714e3b29..0000000000 --- a/examples/todoapp/common/root/src/commonMain/kotlin/example/todo/common/root/TodoRoot.kt +++ /dev/null @@ -1,16 +0,0 @@ -package example.todo.common.root - -import com.arkivanov.decompose.router.stack.ChildStack -import com.arkivanov.decompose.value.Value -import example.todo.common.edit.TodoEdit -import example.todo.common.main.TodoMain - -interface TodoRoot { - - val childStack: Value> - - sealed class Child { - data class Main(val component: TodoMain) : Child() - data class Edit(val component: TodoEdit) : Child() - } -} diff --git a/examples/todoapp/common/root/src/commonMain/kotlin/example/todo/common/root/integration/TodoRootComponent.kt b/examples/todoapp/common/root/src/commonMain/kotlin/example/todo/common/root/integration/TodoRootComponent.kt deleted file mode 100644 index a632aac101..0000000000 --- a/examples/todoapp/common/root/src/commonMain/kotlin/example/todo/common/root/integration/TodoRootComponent.kt +++ /dev/null @@ -1,89 +0,0 @@ -package example.todo.common.root.integration - -import com.arkivanov.decompose.ComponentContext -import com.arkivanov.decompose.router.stack.ChildStack -import com.arkivanov.decompose.router.stack.StackNavigation -import com.arkivanov.decompose.router.stack.childStack -import com.arkivanov.decompose.router.stack.pop -import com.arkivanov.decompose.router.stack.push -import com.arkivanov.decompose.value.Value -import com.arkivanov.essenty.parcelable.Parcelable -import com.arkivanov.essenty.parcelable.Parcelize -import com.arkivanov.mvikotlin.core.store.StoreFactory -import com.badoo.reaktive.base.Consumer -import example.todo.common.database.TodoSharedDatabase -import example.todo.common.edit.TodoEdit -import example.todo.common.edit.integration.TodoEditComponent -import example.todo.common.main.TodoMain -import example.todo.common.main.integration.TodoMainComponent -import example.todo.common.root.TodoRoot -import example.todo.common.root.TodoRoot.Child -import example.todo.common.utils.Consumer - -class TodoRootComponent internal constructor( - componentContext: ComponentContext, - private val todoMain: (ComponentContext, Consumer) -> TodoMain, - private val todoEdit: (ComponentContext, itemId: Long, Consumer) -> TodoEdit -) : TodoRoot, ComponentContext by componentContext { - - constructor( - componentContext: ComponentContext, - storeFactory: StoreFactory, - database: TodoSharedDatabase - ) : this( - componentContext = componentContext, - todoMain = { childContext, output -> - TodoMainComponent( - componentContext = childContext, - storeFactory = storeFactory, - database = database, - output = output - ) - }, - todoEdit = { childContext, itemId, output -> - TodoEditComponent( - componentContext = childContext, - storeFactory = storeFactory, - database = database, - itemId = itemId, - output = output - ) - } - ) - - private val navigation = StackNavigation() - - private val stack = - childStack( - source = navigation, - initialConfiguration = Configuration.Main, - handleBackButton = true, - childFactory = ::createChild - ) - - override val childStack: Value> = stack - - private fun createChild(configuration: Configuration, componentContext: ComponentContext): Child = - when (configuration) { - is Configuration.Main -> Child.Main(todoMain(componentContext, Consumer(::onMainOutput))) - is Configuration.Edit -> Child.Edit(todoEdit(componentContext, configuration.itemId, Consumer(::onEditOutput))) - } - - private fun onMainOutput(output: TodoMain.Output): Unit = - when (output) { - is TodoMain.Output.Selected -> navigation.push(Configuration.Edit(itemId = output.id)) - } - - private fun onEditOutput(output: TodoEdit.Output): Unit = - when (output) { - is TodoEdit.Output.Finished -> navigation.pop() - } - - private sealed class Configuration : Parcelable { - @Parcelize - object Main : Configuration() - - @Parcelize - data class Edit(val itemId: Long) : Configuration() - } -} diff --git a/examples/todoapp/common/root/src/commonTest/kotlin/example/todo/common/root/integration/TodoEditFake.kt b/examples/todoapp/common/root/src/commonTest/kotlin/example/todo/common/root/integration/TodoEditFake.kt deleted file mode 100644 index 4ec3c02692..0000000000 --- a/examples/todoapp/common/root/src/commonTest/kotlin/example/todo/common/root/integration/TodoEditFake.kt +++ /dev/null @@ -1,24 +0,0 @@ -package example.todo.common.root.integration - -import com.arkivanov.decompose.value.Value -import com.badoo.reaktive.base.Consumer -import example.todo.common.edit.TodoEdit -import example.todo.common.edit.TodoEdit.Model -import example.todo.common.edit.TodoEdit.Output - -class TodoEditFake( - val itemId: Long, - val output: Consumer -) : TodoEdit { - - override val models: Value get() = TODO("Not used") - - override fun onTextChanged(text: String) { - } - - override fun onDoneChanged(isDone: Boolean) { - } - - override fun onCloseClicked() { - } -} \ No newline at end of file diff --git a/examples/todoapp/common/root/src/commonTest/kotlin/example/todo/common/root/integration/TodoMainFake.kt b/examples/todoapp/common/root/src/commonTest/kotlin/example/todo/common/root/integration/TodoMainFake.kt deleted file mode 100644 index 7c2ba7e19b..0000000000 --- a/examples/todoapp/common/root/src/commonTest/kotlin/example/todo/common/root/integration/TodoMainFake.kt +++ /dev/null @@ -1,29 +0,0 @@ -package example.todo.common.root.integration - -import com.arkivanov.decompose.value.Value -import com.badoo.reaktive.base.Consumer -import example.todo.common.main.TodoMain -import example.todo.common.main.TodoMain.Model -import example.todo.common.main.TodoMain.Output - -class TodoMainFake( - val output: Consumer -) : TodoMain { - - override val models: Value get() = TODO("Not used") - - override fun onItemClicked(id: Long) { - } - - override fun onItemDoneChanged(id: Long, isDone: Boolean) { - } - - override fun onItemDeleteClicked(id: Long) { - } - - override fun onInputTextChanged(text: String) { - } - - override fun onAddItemClicked() { - } -} \ No newline at end of file diff --git a/examples/todoapp/common/root/src/commonTest/kotlin/example/todo/common/root/integration/TodoRootTest.kt b/examples/todoapp/common/root/src/commonTest/kotlin/example/todo/common/root/integration/TodoRootTest.kt deleted file mode 100644 index 805247fedc..0000000000 --- a/examples/todoapp/common/root/src/commonTest/kotlin/example/todo/common/root/integration/TodoRootTest.kt +++ /dev/null @@ -1,66 +0,0 @@ -package example.todo.common.root.integration - -import com.arkivanov.decompose.DefaultComponentContext -import com.arkivanov.essenty.lifecycle.LifecycleRegistry -import com.arkivanov.essenty.lifecycle.resume -import com.badoo.reaktive.base.invoke -import example.todo.common.edit.TodoEdit -import example.todo.common.main.TodoMain -import example.todo.common.root.TodoRoot -import example.todo.common.root.TodoRoot.Child -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertTrue - -@Suppress("TestFunctionName") -class TodoRootTest { - - private val lifecycle = LifecycleRegistry().apply { resume() } - - @Test - fun WHEN_created_THEN_TodoMain_displayed() { - val root = root() - - assertTrue(root.activeChild is Child.Main) - } - - @Test - fun GIVEN_TodoMain_displayed_WHEN_TodoMain_Output_Selected_THEN_TodoEdit_displayed() { - val root = root() - - root.activeChild.asTodoMain().output(TodoMain.Output.Selected(id = 10L)) - - assertTrue(root.activeChild is Child.Edit) - assertEquals(10L, root.activeChild.asTodoEdit().itemId) - } - - @Test - fun GIVEN_TodoEdit_displayed_WHEN_TodoEdit_Output_Finished_THEN_TodoMain_displayed() { - val root = root() - root.activeChild.asTodoMain().output(TodoMain.Output.Selected(id = 10L)) - - root.activeChild.asTodoEdit().output(TodoEdit.Output.Finished) - - assertTrue(root.activeChild is Child.Main) - } - - private fun root(): TodoRoot = - TodoRootComponent( - componentContext = DefaultComponentContext(lifecycle = lifecycle), - todoMain = { _, output -> TodoMainFake(output) }, - todoEdit = { _, itemId, output -> TodoEditFake(itemId, output) } - ) - - private val TodoRoot.activeChild: Child get() = childStack.value.active.instance - - private val Child.component: Any - get() = - when (this) { - is Child.Main -> component - is Child.Edit -> component - } - - private fun Child.asTodoMain(): TodoMainFake = component as TodoMainFake - - private fun Child.asTodoEdit(): TodoEditFake = component as TodoEditFake -} diff --git a/examples/todoapp/common/utils/build.gradle.kts b/examples/todoapp/common/utils/build.gradle.kts deleted file mode 100755 index 10cb0be17b..0000000000 --- a/examples/todoapp/common/utils/build.gradle.kts +++ /dev/null @@ -1,17 +0,0 @@ -plugins { - id("multiplatform-setup") - id("android-setup") -} - -kotlin { - sourceSets { - named("commonMain") { - dependencies { - implementation(Deps.ArkIvanov.MVIKotlin.rx) - implementation(Deps.ArkIvanov.MVIKotlin.mvikotlin) - implementation(Deps.ArkIvanov.Decompose.decompose) - implementation(Deps.Badoo.Reaktive.reaktive) - } - } - } -} diff --git a/examples/todoapp/common/utils/src/androidMain/AndroidManifest.xml b/examples/todoapp/common/utils/src/androidMain/AndroidManifest.xml deleted file mode 100755 index cc1055f110..0000000000 --- a/examples/todoapp/common/utils/src/androidMain/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/examples/todoapp/common/utils/src/commonMain/kotlin/example/todo/common/utils/InstanceKeeperExt.kt b/examples/todoapp/common/utils/src/commonMain/kotlin/example/todo/common/utils/InstanceKeeperExt.kt deleted file mode 100644 index 433fba0d72..0000000000 --- a/examples/todoapp/common/utils/src/commonMain/kotlin/example/todo/common/utils/InstanceKeeperExt.kt +++ /dev/null @@ -1,20 +0,0 @@ -package example.todo.common.utils - -import com.arkivanov.essenty.instancekeeper.InstanceKeeper -import com.arkivanov.essenty.instancekeeper.getOrCreate -import com.arkivanov.mvikotlin.core.store.Store - -fun > InstanceKeeper.getStore(key: Any, factory: () -> T): T = - getOrCreate(key) { StoreHolder(factory()) } - .store - -inline fun > InstanceKeeper.getStore(noinline factory: () -> T): T = - getStore(T::class, factory) - -private class StoreHolder>( - val store: T -) : InstanceKeeper.Instance { - override fun onDestroy() { - store.dispose() - } -} diff --git a/examples/todoapp/common/utils/src/commonMain/kotlin/example/todo/common/utils/ReaktiveExt.kt b/examples/todoapp/common/utils/src/commonMain/kotlin/example/todo/common/utils/ReaktiveExt.kt deleted file mode 100644 index 53ea787517..0000000000 --- a/examples/todoapp/common/utils/src/commonMain/kotlin/example/todo/common/utils/ReaktiveExt.kt +++ /dev/null @@ -1,11 +0,0 @@ -package example.todo.common.utils - -import com.badoo.reaktive.base.Consumer - -@Suppress("FunctionName") // Factory function -inline fun Consumer(crossinline block: (T) -> Unit): Consumer = - object : Consumer { - override fun onNext(value: T) { - block(value) - } - } diff --git a/examples/todoapp/common/utils/src/commonMain/kotlin/example/todo/common/utils/StoreExt.kt b/examples/todoapp/common/utils/src/commonMain/kotlin/example/todo/common/utils/StoreExt.kt deleted file mode 100644 index 48982e9abc..0000000000 --- a/examples/todoapp/common/utils/src/commonMain/kotlin/example/todo/common/utils/StoreExt.kt +++ /dev/null @@ -1,22 +0,0 @@ -package example.todo.common.utils - -import com.arkivanov.decompose.value.Value -import com.arkivanov.mvikotlin.core.store.Store -import com.arkivanov.mvikotlin.rx.Disposable - -fun Store<*, T, *>.asValue(): Value = - object : Value() { - override val value: T get() = state - private var disposables = emptyMap<(T) -> Unit, Disposable>() - - override fun subscribe(observer: (T) -> Unit) { - val disposable = states(com.arkivanov.mvikotlin.rx.observer(onNext = observer)) - this.disposables += observer to disposable - } - - override fun unsubscribe(observer: (T) -> Unit) { - val disposable = disposables[observer] ?: return - this.disposables -= observer - disposable.dispose() - } - } diff --git a/examples/todoapp/desktop/build.gradle.kts b/examples/todoapp/desktop/build.gradle.kts deleted file mode 100755 index db755cbebd..0000000000 --- a/examples/todoapp/desktop/build.gradle.kts +++ /dev/null @@ -1,51 +0,0 @@ -import org.jetbrains.compose.desktop.application.dsl.TargetFormat - -plugins { - kotlin("multiplatform") // kotlin("jvm") doesn't work well in IDEA/AndroidStudio (https://github.com/JetBrains/compose-jb/issues/22) - id("org.jetbrains.compose") -} - -kotlin { - jvm { - withJava() - } - - sourceSets { - named("jvmMain") { - dependencies { - implementation(compose.desktop.currentOs) - implementation(project(":common:utils")) - implementation(project(":common:database")) - implementation(project(":common:root")) - implementation(project(":common:compose-ui")) - implementation(Deps.JetBrains.Coroutines.swing) - implementation(Deps.ArkIvanov.Decompose.decompose) - implementation(Deps.ArkIvanov.Decompose.extensionsCompose) - implementation(Deps.ArkIvanov.MVIKotlin.mvikotlin) - implementation(Deps.ArkIvanov.MVIKotlin.mvikotlinMain) - implementation(Deps.Badoo.Reaktive.reaktive) - implementation(Deps.Badoo.Reaktive.coroutinesInterop) - } - } - } -} - -compose.desktop { - application { - mainClass = "example.todo.desktop.MainKt" - - nativeDistributions { - targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) - packageName = "ComposeDesktopTodo" - packageVersion = "1.0.0" - - modules("java.sql") - - windows { - menuGroup = "Compose Examples" - // see https://wixtoolset.org/documentation/manual/v3/howtos/general/generate_guids.html - upgradeUuid = "BF9CDA6A-1391-46D5-9ED5-383D6E68CCEB" - } - } - } -} diff --git a/examples/todoapp/desktop/src/jvmMain/kotlin/example/todo/desktop/Main.kt b/examples/todoapp/desktop/src/jvmMain/kotlin/example/todo/desktop/Main.kt deleted file mode 100644 index 005a1f5f36..0000000000 --- a/examples/todoapp/desktop/src/jvmMain/kotlin/example/todo/desktop/Main.kt +++ /dev/null @@ -1,53 +0,0 @@ -package example.todo.desktop - -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Surface -import androidx.compose.ui.Modifier -import androidx.compose.ui.window.Window -import androidx.compose.ui.window.application -import androidx.compose.ui.window.rememberWindowState -import com.arkivanov.decompose.ComponentContext -import com.arkivanov.decompose.DefaultComponentContext -import com.arkivanov.decompose.extensions.compose.jetbrains.lifecycle.LifecycleController -import com.arkivanov.essenty.lifecycle.LifecycleRegistry -import com.arkivanov.mvikotlin.main.store.DefaultStoreFactory -import com.badoo.reaktive.coroutinesinterop.asScheduler -import com.badoo.reaktive.scheduler.overrideSchedulers -import example.todo.common.database.DefaultTodoSharedDatabase -import example.todo.common.database.TodoDatabaseDriver -import example.todo.common.root.TodoRoot -import example.todo.common.root.integration.TodoRootComponent -import example.todo.common.ui.TodoRootContent -import kotlinx.coroutines.Dispatchers - -fun main() { - overrideSchedulers(main = Dispatchers.Main::asScheduler) - - val lifecycle = LifecycleRegistry() - val root = todoRoot(DefaultComponentContext(lifecycle = lifecycle)) - - application { - val windowState = rememberWindowState() - LifecycleController(lifecycle, windowState) - - Window( - onCloseRequest = ::exitApplication, - state = windowState, - title = "Todo" - ) { - Surface(modifier = Modifier.fillMaxSize()) { - MaterialTheme { - TodoRootContent(root) - } - } - } - } -} - -private fun todoRoot(componentContext: ComponentContext): TodoRoot = - TodoRootComponent( - componentContext = componentContext, - storeFactory = DefaultStoreFactory(), - database = DefaultTodoSharedDatabase(TodoDatabaseDriver()) - ) diff --git a/examples/todoapp/gradle.properties b/examples/todoapp/gradle.properties deleted file mode 100755 index 1b42962c80..0000000000 --- a/examples/todoapp/gradle.properties +++ /dev/null @@ -1,31 +0,0 @@ -# Project-wide Gradle settings. -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app"s APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true -# Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true -# Kotlin code style for this project: "official" or "obsolete": -kotlin.code.style=official -org.gradle.parallel=true -org.gradle.caching=true -kotlin.native.disableCompilerDaemon=true - -#TODO remove workaround after upgrading to AGP 7.3 -# After updating Compose Multiplatform version, update corresponding Jetpack Compose versions -# in Android module (search "Workaround for https://github.com/JetBrains/compose-jb/issues/2340") -#TODO also change version in buildSrc/gradle.properties -kotlin.version=1.9.0 -compose.version=1.4.3 diff --git a/examples/todoapp/gradle/wrapper/gradle-wrapper.jar b/examples/todoapp/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 249e5832f090a2944b7473328c07c9755baa3196..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60756 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 '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${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 "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# 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 ;; #( - MSYS* | 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" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/examples/todoapp/gradlew.bat b/examples/todoapp/gradlew.bat deleted file mode 100644 index f127cfd49d..0000000000 --- a/examples/todoapp/gradlew.bat +++ /dev/null @@ -1,91 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/examples/todoapp/ios/.gitignore b/examples/todoapp/ios/.gitignore deleted file mode 100644 index 97d5de824c..0000000000 --- a/examples/todoapp/ios/.gitignore +++ /dev/null @@ -1,18 +0,0 @@ -DerivedData/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata/ -*.moved-aside -*.xccheckout -*.xcscmblueprint -*.hmap -*.ipa -*.dSYM.zip -*.dSYM -Pods diff --git a/examples/todoapp/ios/TodoApp.xcodeproj/project.pbxproj b/examples/todoapp/ios/TodoApp.xcodeproj/project.pbxproj deleted file mode 100644 index 106219cbe3..0000000000 --- a/examples/todoapp/ios/TodoApp.xcodeproj/project.pbxproj +++ /dev/null @@ -1,410 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 1F00F38D257599D800CFAF97 /* TodoApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F00F38C257599D800CFAF97 /* TodoApp.swift */; }; - 1F00F38F257599D800CFAF97 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F00F38E257599D800CFAF97 /* ContentView.swift */; }; - 1F00F391257599DA00CFAF97 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1F00F390257599DA00CFAF97 /* Assets.xcassets */; }; - 1F00F394257599DA00CFAF97 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1F00F393257599DA00CFAF97 /* Preview Assets.xcassets */; }; - 1F00F3A82575A16400CFAF97 /* ObservableValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F00F3A72575A16400CFAF97 /* ObservableValue.swift */; }; - 1F00F3AA2575A71000CFAF97 /* MutableStateBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F00F3A92575A71000CFAF97 /* MutableStateBuilder.swift */; }; - 1F00F3AC2575AA4500CFAF97 /* ListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F00F3AB2575AA4500CFAF97 /* ListView.swift */; }; - 1F00F3AE2575AC6A00CFAF97 /* InputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F00F3AD2575AC6A00CFAF97 /* InputView.swift */; }; - 1F00F3B02575ADB500CFAF97 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F00F3AF2575ADB500CFAF97 /* MainView.swift */; }; - 1F00F3B22575B07700CFAF97 /* EditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F00F3B12575B07700CFAF97 /* EditView.swift */; }; - 1F00F3B42575B18200CFAF97 /* RootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F00F3B32575B18200CFAF97 /* RootView.swift */; }; - 1F00F3B62575B41900CFAF97 /* SimpleChildStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F00F3B52575B41900CFAF97 /* SimpleChildStack.swift */; }; - 1F00F3B82575B4F800CFAF97 /* ComponentHolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F00F3B72575B4F800CFAF97 /* ComponentHolder.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 1F00F389257599D800CFAF97 /* TodoApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TodoApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F00F38C257599D800CFAF97 /* TodoApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodoApp.swift; sourceTree = ""; }; - 1F00F38E257599D800CFAF97 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; - 1F00F390257599DA00CFAF97 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 1F00F393257599DA00CFAF97 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - 1F00F395257599DA00CFAF97 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1F00F3A325759FEC00CFAF97 /* Todo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Todo.framework; path = "../common/root/build/xcode-frameworks/Todo.framework"; sourceTree = ""; }; - 1F00F3A72575A16400CFAF97 /* ObservableValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObservableValue.swift; sourceTree = ""; }; - 1F00F3A92575A71000CFAF97 /* MutableStateBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MutableStateBuilder.swift; sourceTree = ""; }; - 1F00F3AB2575AA4500CFAF97 /* ListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListView.swift; sourceTree = ""; }; - 1F00F3AD2575AC6A00CFAF97 /* InputView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InputView.swift; sourceTree = ""; }; - 1F00F3AF2575ADB500CFAF97 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = ""; }; - 1F00F3B12575B07700CFAF97 /* EditView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditView.swift; sourceTree = ""; }; - 1F00F3B32575B18200CFAF97 /* RootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootView.swift; sourceTree = ""; }; - 1F00F3B52575B41900CFAF97 /* SimpleChildStack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleChildStack.swift; sourceTree = ""; }; - 1F00F3B72575B4F800CFAF97 /* ComponentHolder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComponentHolder.swift; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1F00F386257599D800CFAF97 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 1F00F380257599D800CFAF97 = { - isa = PBXGroup; - children = ( - 1F00F38B257599D800CFAF97 /* ios */, - 1F00F38A257599D800CFAF97 /* Products */, - 1F00F3A225759FEC00CFAF97 /* Frameworks */, - ); - sourceTree = ""; - }; - 1F00F38A257599D800CFAF97 /* Products */ = { - isa = PBXGroup; - children = ( - 1F00F389257599D800CFAF97 /* TodoApp.app */, - ); - name = Products; - sourceTree = ""; - }; - 1F00F38B257599D800CFAF97 /* ios */ = { - isa = PBXGroup; - children = ( - 1F00F38C257599D800CFAF97 /* TodoApp.swift */, - 1F00F38E257599D800CFAF97 /* ContentView.swift */, - 1F00F390257599DA00CFAF97 /* Assets.xcassets */, - 1F00F395257599DA00CFAF97 /* Info.plist */, - 1F00F392257599DA00CFAF97 /* Preview Content */, - 1F00F3A72575A16400CFAF97 /* ObservableValue.swift */, - 1F00F3A92575A71000CFAF97 /* MutableStateBuilder.swift */, - 1F00F3AB2575AA4500CFAF97 /* ListView.swift */, - 1F00F3AD2575AC6A00CFAF97 /* InputView.swift */, - 1F00F3AF2575ADB500CFAF97 /* MainView.swift */, - 1F00F3B12575B07700CFAF97 /* EditView.swift */, - 1F00F3B32575B18200CFAF97 /* RootView.swift */, - 1F00F3B52575B41900CFAF97 /* SimpleChildStack.swift */, - 1F00F3B72575B4F800CFAF97 /* ComponentHolder.swift */, - ); - path = ios; - sourceTree = ""; - }; - 1F00F392257599DA00CFAF97 /* Preview Content */ = { - isa = PBXGroup; - children = ( - 1F00F393257599DA00CFAF97 /* Preview Assets.xcassets */, - ); - path = "Preview Content"; - sourceTree = ""; - }; - 1F00F3A225759FEC00CFAF97 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 1F00F3A325759FEC00CFAF97 /* Todo.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 1F00F388257599D800CFAF97 /* TodoApp */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F00F398257599DA00CFAF97 /* Build configuration list for PBXNativeTarget "TodoApp" */; - buildPhases = ( - 1F00F39D25759BB300CFAF97 /* ShellScript */, - 1F00F385257599D800CFAF97 /* Sources */, - 1F00F386257599D800CFAF97 /* Frameworks */, - 1F00F387257599D800CFAF97 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = TodoApp; - productName = ios; - productReference = 1F00F389257599D800CFAF97 /* TodoApp.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 1F00F381257599D800CFAF97 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1220; - LastUpgradeCheck = 1220; - TargetAttributes = { - 1F00F388257599D800CFAF97 = { - CreatedOnToolsVersion = 12.2; - }; - }; - }; - buildConfigurationList = 1F00F384257599D800CFAF97 /* Build configuration list for PBXProject "TodoApp" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 1F00F380257599D800CFAF97; - productRefGroup = 1F00F38A257599D800CFAF97 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1F00F388257599D800CFAF97 /* TodoApp */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1F00F387257599D800CFAF97 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F00F394257599DA00CFAF97 /* Preview Assets.xcassets in Resources */, - 1F00F391257599DA00CFAF97 /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 1F00F39D25759BB300CFAF97 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "cd $SRCROOT/..\n./gradlew :common:root:embedAndSignAppleFrameworkForXcode\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1F00F385257599D800CFAF97 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F00F38F257599D800CFAF97 /* ContentView.swift in Sources */, - 1F00F3B02575ADB500CFAF97 /* MainView.swift in Sources */, - 1F00F3B22575B07700CFAF97 /* EditView.swift in Sources */, - 1F00F38D257599D800CFAF97 /* TodoApp.swift in Sources */, - 1F00F3AC2575AA4500CFAF97 /* ListView.swift in Sources */, - 1F00F3B82575B4F800CFAF97 /* ComponentHolder.swift in Sources */, - 1F00F3B42575B18200CFAF97 /* RootView.swift in Sources */, - 1F00F3B62575B41900CFAF97 /* SimpleChildStack.swift in Sources */, - 1F00F3AE2575AC6A00CFAF97 /* InputView.swift in Sources */, - 1F00F3AA2575A71000CFAF97 /* MutableStateBuilder.swift in Sources */, - 1F00F3A82575A16400CFAF97 /* ObservableValue.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 1F00F396257599DA00CFAF97 /* 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; - 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.2; - 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; - }; - 1F00F397257599DA00CFAF97 /* 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.2; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 1F00F399257599DA00CFAF97 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_ASSET_PATHS = "\"ios/Preview Content\""; - ENABLE_PREVIEWS = YES; - FRAMEWORK_SEARCH_PATHS = "$SRCROOT/../common/root/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)"; - INFOPLIST_FILE = ios/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-framework", - Todo, - ); - PRODUCT_BUNDLE_IDENTIFIER = org.jetbrains.todoapp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 1F00F39A257599DA00CFAF97 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_ASSET_PATHS = "\"ios/Preview Content\""; - ENABLE_PREVIEWS = YES; - FRAMEWORK_SEARCH_PATHS = "$SRCROOT/../common/root/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)"; - INFOPLIST_FILE = ios/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-framework", - Todo, - ); - PRODUCT_BUNDLE_IDENTIFIER = org.jetbrains.todoapp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1F00F384257599D800CFAF97 /* Build configuration list for PBXProject "TodoApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F00F396257599DA00CFAF97 /* Debug */, - 1F00F397257599DA00CFAF97 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F00F398257599DA00CFAF97 /* Build configuration list for PBXNativeTarget "TodoApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F00F399257599DA00CFAF97 /* Debug */, - 1F00F39A257599DA00CFAF97 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 1F00F381257599D800CFAF97 /* Project object */; -} diff --git a/examples/todoapp/ios/TodoApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/todoapp/ios/TodoApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 13f1516a39..0000000000 --- a/examples/todoapp/ios/TodoApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/examples/todoapp/ios/TodoApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/todoapp/ios/TodoApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003d..0000000000 --- a/examples/todoapp/ios/TodoApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/examples/todoapp/ios/ios/Assets.xcassets/AccentColor.colorset/Contents.json b/examples/todoapp/ios/ios/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index eb87897008..0000000000 --- a/examples/todoapp/ios/ios/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/examples/todoapp/ios/ios/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/todoapp/ios/ios/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 9221b9bb1a..0000000000 --- a/examples/todoapp/ios/ios/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "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 - } -} diff --git a/examples/todoapp/ios/ios/Assets.xcassets/Contents.json b/examples/todoapp/ios/ios/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596a7..0000000000 --- a/examples/todoapp/ios/ios/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/examples/todoapp/ios/ios/ComponentHolder.swift b/examples/todoapp/ios/ios/ComponentHolder.swift deleted file mode 100644 index 29bf16b8cc..0000000000 --- a/examples/todoapp/ios/ios/ComponentHolder.swift +++ /dev/null @@ -1,19 +0,0 @@ -import Todo - -class ComponentHolder { - let lifecycle: LifecycleRegistry - let component: T - - init(factory: (ComponentContext) -> T) { - let lifecycle = LifecycleRegistryKt.LifecycleRegistry() - let component = factory(DefaultComponentContext(lifecycle: lifecycle)) - self.lifecycle = lifecycle - self.component = component - - lifecycle.onCreate() - } - - deinit { - lifecycle.onDestroy() - } -} diff --git a/examples/todoapp/ios/ios/ContentView.swift b/examples/todoapp/ios/ios/ContentView.swift deleted file mode 100644 index 2f319069b4..0000000000 --- a/examples/todoapp/ios/ios/ContentView.swift +++ /dev/null @@ -1,26 +0,0 @@ -import SwiftUI -import Todo - -struct ContentView: View { - @State - private var componentHolder = - ComponentHolder { - TodoRootComponent( - componentContext: $0, - storeFactory: DefaultStoreFactory(), - database: DefaultTodoSharedDatabase(driver: TodoDatabaseDriverFactoryKt.TodoDatabaseDriver()) - ) - } - - var body: some View { - RootView(componentHolder.component) - .onAppear { LifecycleRegistryExtKt.resume(self.componentHolder.lifecycle) } - .onDisappear { LifecycleRegistryExtKt.stop(self.componentHolder.lifecycle) } - } -} - -struct ContentView_Previews: PreviewProvider { - static var previews: some View { - ContentView() - } -} diff --git a/examples/todoapp/ios/ios/EditView.swift b/examples/todoapp/ios/ios/EditView.swift deleted file mode 100644 index 951c99ba1b..0000000000 --- a/examples/todoapp/ios/ios/EditView.swift +++ /dev/null @@ -1,67 +0,0 @@ -import SwiftUI -import Todo - -struct EditView: View { - private let component: TodoEdit - - @ObservedObject - private var models: ObservableValue - - init(_ component: TodoEdit) { - self.component = component - self.models = ObservableValue(component.models) - } - - var body: some View { - let model = models.value - let binding = Binding(get: { model.text }, set: component.onTextChanged) - - return NavigationView { - VStack{ - TextEditor(text: binding) - .frame(maxHeight: .infinity) - .padding(8) - - HStack { - Text("Completed") - Image(systemName: model.isDone ? "checkmark.square" : "square") - .onTapGesture { self.component.onDoneChanged(isDone: !model.isDone) } - }.padding(8) - } - .navigationBarTitle("Edit todo", displayMode: .inline) - .navigationBarItems( - leading: Button(action: { withAnimation { component.onCloseClicked() } } ) { - HStack { - Image(systemName: "chevron.left") - Text("Close") - } - } - ) - } - } -} - -struct EditView_Previews: PreviewProvider { - static var previews: some View { - EditView(StubTodoEdit()) - } - - class StubTodoEdit: TodoEdit { - let models: Value = - valueOf( - TodoEditModel( - text: "Text", - isDone: true - ) - ) - - func onCloseClicked() { - } - - func onDoneChanged(isDone: Bool) { - } - - func onTextChanged(text: String) { - } - } -} diff --git a/examples/todoapp/ios/ios/Info.plist b/examples/todoapp/ios/ios/Info.plist deleted file mode 100644 index efc211a0c1..0000000000 --- a/examples/todoapp/ios/ios/Info.plist +++ /dev/null @@ -1,50 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - - UIApplicationSupportsIndirectInputEvents - - UILaunchScreen - - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/examples/todoapp/ios/ios/InputView.swift b/examples/todoapp/ios/ios/InputView.swift deleted file mode 100644 index 712f712664..0000000000 --- a/examples/todoapp/ios/ios/InputView.swift +++ /dev/null @@ -1,28 +0,0 @@ -import SwiftUI -import Todo - -struct InputView: View { - var textBinding: Binding - var onAddClicked: () -> Void - - var body: some View { - HStack { - TextField("Todo text", text: self.textBinding) - .textFieldStyle(RoundedBorderTextFieldStyle()) - .edgesIgnoringSafeArea(Edge.Set.bottom) - - Button(action: self.onAddClicked) { - Image(systemName: "plus") - }.frame(minWidth: 36, minHeight: 36) - }.padding(8) - } -} - -struct InputView_Previews: PreviewProvider { - static var previews: some View { - InputView( - textBinding: Binding(get: { "Text" }, set: {_ in }), - onAddClicked: {} - ) - } -} diff --git a/examples/todoapp/ios/ios/ListView.swift b/examples/todoapp/ios/ios/ListView.swift deleted file mode 100644 index 262efbafed..0000000000 --- a/examples/todoapp/ios/ios/ListView.swift +++ /dev/null @@ -1,39 +0,0 @@ -import SwiftUI -import Todo - -struct ListView: View { - var items: [TodoItem] - var onItemClicked: (_ id: Int64) -> Void - var onDoneChanged: (_ id: Int64, _ isDone: Bool) -> Void - - var body: some View { - List(self.items) { item in - HStack { - Text(item.text) - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading) - .background(Color.white) - .onTapGesture { withAnimation { self.onItemClicked(item.id) } } - - Image(systemName: item.isDone ? "checkmark.square" : "square") - .onTapGesture { self.onDoneChanged(item.id, !item.isDone) } - } - }.listStyle(PlainListStyle()) - } -} - -struct ListView_Previews: PreviewProvider { - static var previews: some View { - ListView( - items: [ - TodoItem(id: 1, order: 1, text: "Item 1", isDone: false), - TodoItem(id: 2, order: 2, text: "Item 2", isDone: true), - TodoItem(id: 3, order: 3, text: "Item 3", isDone: false) - ], - onItemClicked: {_ in }, - onDoneChanged: {_,_ in } - ) - } -} - -extension TodoItem : Identifiable { -} diff --git a/examples/todoapp/ios/ios/MainView.swift b/examples/todoapp/ios/ios/MainView.swift deleted file mode 100644 index aea28cfbbf..0000000000 --- a/examples/todoapp/ios/ios/MainView.swift +++ /dev/null @@ -1,68 +0,0 @@ -import SwiftUI -import Todo - -struct MainView: View { - private let component: TodoMain - - @ObservedObject - private var models: ObservableValue - - init(_ component: TodoMain) { - self.component = component - self.models = ObservableValue(component.models) - } - - var body: some View { - let model = models.value - - return NavigationView { - VStack { - ListView( - items: model.items, - onItemClicked: component.onItemClicked, - onDoneChanged: component.onItemDoneChanged - ) - - InputView( - textBinding: Binding(get: { model.text }, set: component.onInputTextChanged), - onAddClicked: component.onAddItemClicked - ) - }.navigationBarTitle("Todo Sample", displayMode: .inline) - } - } -} - -struct MainView_Previews: PreviewProvider { - static var previews: some View { - MainView(StubTodoMain()) - } - - class StubTodoMain: TodoMain { - let models: Value = - valueOf( - TodoMainModel( - items: [ - TodoItem(id: 1, order: 1, text: "Item 1", isDone: false), - TodoItem(id: 2, order: 2, text: "Item 2", isDone: true), - TodoItem(id: 3, order: 3, text: "Item 3", isDone: false) - ], - text: "Text" - ) - ) - - func onAddItemClicked() { - } - - func onInputTextChanged(text: String) { - } - - func onItemClicked(id: Int64) { - } - - func onItemDeleteClicked(id: Int64) { - } - - func onItemDoneChanged(id: Int64, isDone: Bool) { - } - } -} diff --git a/examples/todoapp/ios/ios/MutableStateBuilder.swift b/examples/todoapp/ios/ios/MutableStateBuilder.swift deleted file mode 100644 index 874d4eb52e..0000000000 --- a/examples/todoapp/ios/ios/MutableStateBuilder.swift +++ /dev/null @@ -1,5 +0,0 @@ -import Todo - -func valueOf(_ value: T) -> Value { - return MutableValueBuilderKt.MutableValue(initialValue: value) as! MutableValue -} diff --git a/examples/todoapp/ios/ios/ObservableValue.swift b/examples/todoapp/ios/ios/ObservableValue.swift deleted file mode 100644 index 46dc338d50..0000000000 --- a/examples/todoapp/ios/ios/ObservableValue.swift +++ /dev/null @@ -1,22 +0,0 @@ -import Todo - -public class ObservableValue : ObservableObject { - private let observableValue: Value - - @Published - var value: T - - private var observer: ((T) -> Void)? - - init(_ value: Value) { - self.observableValue = value - self.value = observableValue.value - self.observer = { [weak self] value in self?.value = value } - - observableValue.subscribe(observer: observer!) - } - - deinit { - self.observableValue.unsubscribe(observer: self.observer!) - } -} diff --git a/examples/todoapp/ios/ios/Preview Content/Preview Assets.xcassets/Contents.json b/examples/todoapp/ios/ios/Preview Content/Preview Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596a7..0000000000 --- a/examples/todoapp/ios/ios/Preview Content/Preview Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/examples/todoapp/ios/ios/RootView.swift b/examples/todoapp/ios/ios/RootView.swift deleted file mode 100644 index 909a2b47d3..0000000000 --- a/examples/todoapp/ios/ios/RootView.swift +++ /dev/null @@ -1,43 +0,0 @@ -import SwiftUI -import Todo - -struct RootView: View { - @ObservedObject - private var childStack: ObservableValue> - - init(_ component: TodoRoot) { - self.childStack = ObservableValue(component.childStack) - } - - var body: some View { - let child = self.childStack.value.active.instance - - switch child { - case let main as TodoRootChild.Main: - MainView(main.component) - - case let edit as TodoRootChild.Edit: - EditView(edit.component) - .transition( - .asymmetric( - insertion: AnyTransition.move(edge: .trailing), - removal: AnyTransition.move(edge: .trailing) - ) - ) - .animation(.easeInOut) - - default: EmptyView() - } - } -} - -struct RootView_Previews: PreviewProvider { - static var previews: some View { - RootView(StubTodoRoot()) - } - - class StubTodoRoot : TodoRoot { - let childStack: Value> = - simpleChildStack(.Main(component: MainView_Previews.StubTodoMain())) - } -} diff --git a/examples/todoapp/ios/ios/SimpleChildStack.swift b/examples/todoapp/ios/ios/SimpleChildStack.swift deleted file mode 100644 index 98faa61a6f..0000000000 --- a/examples/todoapp/ios/ios/SimpleChildStack.swift +++ /dev/null @@ -1,13 +0,0 @@ -import Todo - -func simpleChildStack(_ child: T) -> Value> { - return valueOf( - ChildStack( - active: ChildCreated( - configuration: "config" as AnyObject, - instance: child - ), - backStack: [] - ) - ) -} diff --git a/examples/todoapp/ios/ios/TodoApp.swift b/examples/todoapp/ios/ios/TodoApp.swift deleted file mode 100644 index 20d351dcfa..0000000000 --- a/examples/todoapp/ios/ios/TodoApp.swift +++ /dev/null @@ -1,10 +0,0 @@ -import SwiftUI - -@main -struct TodoApp: App { - var body: some Scene { - WindowGroup { - ContentView() - } - } -} diff --git a/examples/todoapp/kotlin-js-store/yarn.lock b/examples/todoapp/kotlin-js-store/yarn.lock deleted file mode 100644 index 808211c646..0000000000 --- a/examples/todoapp/kotlin-js-store/yarn.lock +++ /dev/null @@ -1,3047 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/runtime@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.6.tgz#6a1ef59f838debd670421f8c7f2cbb8da9751580" - integrity sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ== - dependencies: - regenerator-runtime "^0.13.4" - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@discoveryjs/json-ext@^0.5.0": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== - -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.14" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@material-ui/icons@4.11.2": - version "4.11.2" - resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.2.tgz#b3a7353266519cd743b6461ae9fdfcb1b25eb4c5" - integrity sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ== - dependencies: - "@babel/runtime" "^7.4.4" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@socket.io/component-emitter@~3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" - integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== - -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - -"@types/cors@^2.8.12": - version "2.8.12" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" - integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== - -"@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.4.5" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.5.tgz#acdfb7dd36b91cc5d812d7c093811a8f3d9b31e4" - integrity sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== - -"@types/http-proxy@^1.17.8": - version "1.17.9" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" - integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== - dependencies: - "@types/node" "*" - -"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/node@*", "@types/node@>=10.0.0": - version "18.0.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.5.tgz#96be8113b014e9e7f0c3609c4a25afadd85ff659" - integrity sha512-En7tneq+j0qAiVwysBD79y86MT3ModuoIJbe7JXp+sb5UAjInSShmK3nXXMioBzfF7rXC12hv12d4IyCVwN4dA== - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== - -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== - -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== - -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== - -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" - integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== - -"@webpack-cli/info@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" - integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== - dependencies: - envinfo "^7.7.3" - -"@webpack-cli/serve@^1.7.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" - integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== - -acorn@^8.4.1, acorn@^8.5.0: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.8.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-html@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -async@^2.6.2: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64id@2.0.0, base64id@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -body-parser@1.20.0, body-parser@^1.19.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" - integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.10.3" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg== - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserslist@^4.14.5: - version "4.21.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.2.tgz#59a400757465535954946a400b841ed37e2b4ecf" - integrity sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA== - dependencies: - caniuse-lite "^1.0.30001366" - electron-to-chromium "^1.4.188" - node-releases "^2.0.6" - update-browserslist-db "^1.0.4" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001366: - version "1.0.30001367" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001367.tgz#2b97fe472e8fa29c78c5970615d7cd2ee414108a" - integrity sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw== - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@3.5.3, chokidar@^3.5.1: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^1.2.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" - integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== - -colorette@^2.0.10, colorette@^2.0.14: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== - -connect@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cookie@~0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - -copy-webpack-plugin@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-9.0.0.tgz#2bf592785d2fcdde9342dfed3676490fe0aa7ce8" - integrity sha512-k8UB2jLIb1Jip2nZbCz83T/XfhfjX6mB1yLJNYKrpYi7FQimfOoFv/0//iT6HV1K8FwUB5yUbCcnpLebJXJTug== - dependencies: - fast-glob "^3.2.5" - glob-parent "^6.0.0" - globby "^11.0.3" - normalize-path "^3.0.0" - p-limit "^3.1.0" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cors@~2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -custom-event@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" - integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== - -date-format@^4.0.10, date-format@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.11.tgz#ae0d1e069d7f0687938fd06f98c12f3a6276e526" - integrity sha512-VS20KRyorrbMCQmpdl2hg5KaOUsda1RbnsJg461FfrcyCUg+pkd0b40BSW4niQyTheww4DBXQnS7HwSrKkipLw== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4.3.4, debug@^4.1.0, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.1.1: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - -default-gateway@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -del@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -di@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" - integrity sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA== - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - -dns-packet@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" - integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ== - dependencies: - buffer-indexof "^1.0.0" - -dom-serialize@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" - integrity sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ== - dependencies: - custom-event "~1.0.0" - ent "~2.2.0" - extend "^3.0.0" - void-elements "^2.0.0" - -dukat@0.5.8-rc.4: - version "0.5.8-rc.4" - resolved "https://registry.yarnpkg.com/dukat/-/dukat-0.5.8-rc.4.tgz#90384dcb50b14c26f0e99dae92b2dea44f5fce21" - integrity sha512-ZnMt6DGBjlVgK2uQamXfd7uP/AxH7RqI0BL9GLrrJb2gKdDxvJChWy+M9AQEaL+7/6TmxzJxFOsRiInY9oGWTA== - dependencies: - google-protobuf "3.12.2" - typescript "3.9.5" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.4.188: - version "1.4.192" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.192.tgz#fac050058b3e0713b401a1088cc579e14c2ab165" - integrity sha512-8nCXyIQY9An88NXAp+PuPy5h3/w5ZY7Iu2lag65Q0XREprcat5F8gKhoHsBUnQcFuCRnmevpR8yEBYRU3d2HDw== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -engine.io-parser@~5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0" - integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== - -engine.io@~6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.0.tgz#003bec48f6815926f2b1b17873e576acd54f41d0" - integrity sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg== - dependencies: - "@types/cookie" "^0.4.1" - "@types/cors" "^2.8.12" - "@types/node" ">=10.0.0" - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.4.1" - cors "~2.8.5" - debug "~4.3.1" - engine.io-parser "~5.0.3" - ws "~8.2.3" - -enhanced-resolve@^5.9.3: - version "5.10.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" - integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -ent@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" - integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== - -envinfo@^7.7.3: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== - -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -express@^4.17.1: - version "4.18.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" - integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.0" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.10.3" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.5, fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.2.5: - version "3.2.6" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" - integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== - -follow-redirects@^1.0.0: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== - -format-util@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" - integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-extra@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-monkey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.3, glob@^7.1.7: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globby@^11.0.1, globby@^11.0.3: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -google-protobuf@3.12.2: - version "3.12.2" - resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.12.2.tgz#50ce9f9b6281235724eb243d6a83e969a2176e53" - integrity sha512-4CZhpuRr1d6HjlyrxoXoocoGFnRYgKULgMtikMddA9ztRyYR59Aondv2FioyxWVamRo0rF2XpYawkTCBEQOSkA== - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-entities@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" - integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== - -http-proxy-middleware@^2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -internal-ip@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-6.2.0.tgz#d5541e79716e406b74ac6b07b856ef18dc1621c1" - integrity sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg== - dependencies: - default-gateway "^6.0.0" - ipaddr.js "^1.9.1" - is-ip "^3.1.0" - p-event "^4.2.0" - -interpret@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" - integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== - -ip-regex@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" - integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== - -ip@^1.1.0: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" - integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== - -ipaddr.js@1.9.1, ipaddr.js@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-ip@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" - integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== - dependencies: - ip-regex "^4.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regex@^1.0.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isbinaryfile@^4.0.8: - version "4.0.10" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" - integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -karma-chrome-launcher@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz#baca9cc071b1562a1db241827257bfe5cab597ea" - integrity sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ== - dependencies: - which "^1.2.1" - -karma-mocha@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.1.tgz#4b0254a18dfee71bdbe6188d9a6861bf86b0cd7d" - integrity sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ== - dependencies: - minimist "^1.2.3" - -karma-sourcemap-loader@0.3.8: - version "0.3.8" - resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.8.tgz#d4bae72fb7a8397328a62b75013d2df937bdcf9c" - integrity sha512-zorxyAakYZuBcHRJE+vbrK2o2JXLFWK8VVjiT/6P+ltLBUGUvqTEkUiQ119MGdOrK7mrmxXHZF1/pfT6GgIZ6g== - dependencies: - graceful-fs "^4.1.2" - -karma-webpack@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" - integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== - dependencies: - glob "^7.1.3" - minimatch "^3.0.4" - webpack-merge "^4.1.5" - -karma@6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.0.tgz#82652dfecdd853ec227b74ed718a997028a99508" - integrity sha512-s8m7z0IF5g/bS5ONT7wsOavhW4i4aFkzD4u4wgzAQWT4HGUeWI3i21cK2Yz6jndMAeHETp5XuNsRoyGJZXVd4w== - dependencies: - "@colors/colors" "1.5.0" - body-parser "^1.19.0" - braces "^3.0.2" - chokidar "^3.5.1" - connect "^3.7.0" - di "^0.0.1" - dom-serialize "^2.2.1" - glob "^7.1.7" - graceful-fs "^4.2.6" - http-proxy "^1.18.1" - isbinaryfile "^4.0.8" - lodash "^4.17.21" - log4js "^6.4.1" - mime "^2.5.2" - minimatch "^3.0.4" - mkdirp "^0.5.5" - qjobs "^1.2.0" - range-parser "^1.2.1" - rimraf "^3.0.2" - socket.io "^4.4.1" - source-map "^0.6.1" - tmp "^0.2.1" - ua-parser-js "^0.7.30" - yargs "^16.1.1" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log4js@^6.4.1: - version "6.6.0" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.6.0.tgz#e8fd00143d1e0ecf1d10959bb69b90b1b30137f3" - integrity sha512-3v8R7fd45UB6THucSht6wN2/7AZEruQbXdjygPZcxt5TA/msO6si9CN5MefUuKXbYnJHTBnYcx4famwcyQd+sA== - dependencies: - date-format "^4.0.11" - debug "^4.3.4" - flatted "^3.2.5" - rfdc "^1.3.0" - streamroller "^3.1.1" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memfs@^3.4.3: - version "3.4.7" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.7.tgz#e5252ad2242a724f938cb937e3c4f7ceb1f70e5a" - integrity sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw== - dependencies: - fs-monkey "^1.0.3" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.5.2: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.4, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.3, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -mkdirp@^0.5.5: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mocha@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" - integrity sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - nanoid "3.3.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ== - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - -nanoid@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -node-forge@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== - -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -object-assign@^4: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^8.0.9: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -p-event@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" - integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== - dependencies: - p-timeout "^3.1.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -p-timeout@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -portfinder@^1.0.28: - version "1.0.28" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" - integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== - dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qjobs@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" - integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== - -qs@6.10.3: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== - dependencies: - side-channel "^1.0.4" - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -readable-stream@^2.0.1: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" - integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== - dependencies: - resolve "^1.9.0" - -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -regexp.prototype.flags@^1.2.0: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve@^1.9.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.8.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== - -selfsigned@^1.10.11: - version "1.10.14" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.14.tgz#ee51d84d9dcecc61e07e4aba34f229ab525c1574" - integrity sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA== - dependencies: - node-forge "^0.10.0" - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-javascript@6.0.0, serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -serialize-javascript@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== - dependencies: - randombytes "^2.1.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -socket.io-adapter@~2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" - integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== - -socket.io-parser@~4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.1.tgz#01c96efa11ded938dcb21cbe590c26af5eff65e5" - integrity sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - -socket.io@^4.4.1: - version "4.5.2" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.2.tgz#1eb25fd380ab3d63470aa8279f8e48d922d443ac" - integrity sha512-6fCnk4ARMPZN448+SQcnn1u8OHUC72puJcNtSgg2xS34Cu7br1gQ09YKkO1PFfDn/wyUE9ZgMAwosJed003+NQ== - dependencies: - accepts "~1.3.4" - base64id "~2.0.0" - debug "~4.3.2" - engine.io "~6.2.0" - socket.io-adapter "~2.4.0" - socket.io-parser "~4.2.0" - -sockjs@^0.3.21: - version "0.3.24" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-loader@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-4.0.0.tgz#bdc6b118bc6c87ee4d8d851f2d4efcc5abdb2ef5" - integrity sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw== - dependencies: - abab "^2.0.6" - iconv-lite "^0.6.3" - source-map-js "^1.0.2" - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -sql.js@1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/sql.js/-/sql.js-1.6.2.tgz#7fb70ff68089434826a39b8f5afb2170d682eb3f" - integrity sha512-9iucI5fXQa+Gspeqf/BNB20PxJIn5LhXDt4mjXoFPqXdR+NqtFs15SdKpSIJ6s529aGL9zFR9p2eSCIEiMsNGA== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -streamroller@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.1.tgz#679aae10a4703acdf2740755307df0a05ad752e6" - integrity sha512-iPhtd9unZ6zKdWgMeYGfSBuqCngyJy1B/GPi/lTpwGpa3bajuX30GjUVd0/Tn/Xhg0mr4DOSENozz9Y06qyonQ== - dependencies: - date-format "^4.0.10" - debug "^4.3.4" - fs-extra "^10.1.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@8.1.1, supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.1.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" - integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== - dependencies: - "@jridgewell/trace-mapping" "^0.3.7" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.7.2" - -terser@^5.7.2: - version "5.14.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" - integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== - dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typescript@3.9.5: - version "3.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" - integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== - -ua-parser-js@^0.7.30: - version "0.7.31" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" - integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -update-browserslist-db@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz#dbfc5a789caa26b1db8990796c2c8ebbce304824" - integrity sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -void-elements@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== - -watchpack@^2.3.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -webpack-cli@4.10.0: - version "4.10.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" - integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== - dependencies: - "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^1.2.0" - "@webpack-cli/info" "^1.5.0" - "@webpack-cli/serve" "^1.7.0" - colorette "^2.0.14" - commander "^7.0.0" - cross-spawn "^7.0.3" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^2.2.0" - rechoir "^0.7.0" - webpack-merge "^5.7.3" - -webpack-dev-middleware@^5.0.0: - version "5.3.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.0.0.tgz#fb4906e91182154bba54a66e6e06f84c1e3c0a80" - integrity sha512-ya5cjoBSf3LqrshZn2HMaRZQx8YRNBE+tx+CQNFGaLLHrvs4Y1aik0sl5SFhLz2cW1O9/NtyaZhthc+8UiuvkQ== - dependencies: - ansi-html "^0.0.7" - bonjour "^3.5.0" - chokidar "^3.5.1" - colorette "^1.2.2" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - del "^6.0.0" - express "^4.17.1" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.0" - internal-ip "^6.2.0" - ipaddr.js "^2.0.1" - open "^8.0.9" - p-retry "^4.5.0" - portfinder "^1.0.28" - schema-utils "^3.1.0" - selfsigned "^1.10.11" - serve-index "^1.9.1" - sockjs "^0.3.21" - spdy "^4.0.2" - strip-ansi "^7.0.0" - url "^0.11.0" - webpack-dev-middleware "^5.0.0" - ws "^8.1.0" - -webpack-merge@^4.1.5: - version "4.2.2" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" - integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== - dependencies: - lodash "^4.17.15" - -webpack-merge@^5.7.3: - version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@5.73.0: - version "5.73.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" - integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.3" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" - webpack-sources "^3.2.3" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -which@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@^8.1.0: - version "8.8.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0" - integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA== - -ws@~8.2.3: - version "8.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" - integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0, yargs@^16.1.1: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/examples/todoapp/screenshots/browser-run-configuration.png b/examples/todoapp/screenshots/browser-run-configuration.png deleted file mode 100644 index 8a08eeac5336455be979686a2a22d2958e0a114e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2428 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

7ffK8`ZU4h>jSjyH5njyUlYUh`%t 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 { - versions.webpackDevServer.version = "4.0.0" - versions.webpackCli.version = "4.10.0" - } -} diff --git a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/App.kt b/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/App.kt deleted file mode 100644 index b59b5b8467..0000000000 --- a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/App.kt +++ /dev/null @@ -1,31 +0,0 @@ -package example.todo.web - -import com.arkivanov.decompose.DefaultComponentContext -import com.arkivanov.essenty.lifecycle.LifecycleRegistry -import com.arkivanov.essenty.lifecycle.resume -import com.arkivanov.mvikotlin.main.store.DefaultStoreFactory -import example.todo.common.database.DefaultTodoSharedDatabase -import example.todo.common.database.todoDatabaseDriver -import example.todo.common.root.integration.TodoRootComponent -import kotlinx.browser.document -import org.jetbrains.compose.web.renderComposable -import org.w3c.dom.HTMLElement - -fun main() { - val rootElement = document.getElementById("root") as HTMLElement - - val lifecycle = LifecycleRegistry() - - val root = - TodoRootComponent( - componentContext = DefaultComponentContext(lifecycle = lifecycle), - storeFactory = DefaultStoreFactory(), - database = DefaultTodoSharedDatabase(todoDatabaseDriver()) - ) - - lifecycle.resume() - - renderComposable(root = rootElement) { - TodoRootUi(root) - } -} diff --git a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/Components.kt b/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/Components.kt deleted file mode 100644 index 829dab3323..0000000000 --- a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/Components.kt +++ /dev/null @@ -1,172 +0,0 @@ -package example.todo.web - -import androidx.compose.runtime.Composable -import org.jetbrains.compose.web.attributes.InputType -import org.jetbrains.compose.web.css.AlignItems -import org.jetbrains.compose.web.css.DisplayStyle -import org.jetbrains.compose.web.css.JustifyContent -import org.jetbrains.compose.web.css.alignItems -import org.jetbrains.compose.web.css.display -import org.jetbrains.compose.web.css.height -import org.jetbrains.compose.web.css.justifyContent -import org.jetbrains.compose.web.css.percent -import org.jetbrains.compose.web.css.px -import org.jetbrains.compose.web.css.width -import org.jetbrains.compose.web.dom.A -import org.jetbrains.compose.web.dom.AttrBuilderContext -import org.jetbrains.compose.web.dom.Div -import org.jetbrains.compose.web.dom.ElementScope -import org.jetbrains.compose.web.dom.I -import org.jetbrains.compose.web.dom.Input -import org.jetbrains.compose.web.dom.Label -import org.jetbrains.compose.web.dom.Li -import org.jetbrains.compose.web.dom.Nav -import org.jetbrains.compose.web.dom.Span -import org.jetbrains.compose.web.dom.Text -import org.jetbrains.compose.web.dom.TextArea -import org.jetbrains.compose.web.dom.Ul -import org.w3c.dom.HTMLUListElement - -@Composable -fun MaterialCheckbox( - checked: Boolean, - onCheckedChange: (Boolean) -> Unit, - attrs: AttrBuilderContext<*> = {}, - content: @Composable () -> Unit = {} -) { - Div(attrs = attrs) { - Label { - Input( - type = InputType.Checkbox, - attrs = { - classes("filled-in") - checked(checked) - onChange { onCheckedChange(it.value) } - } - ) - - Span { - content() - } - } - } -} - -@Composable -fun Card(attrs: AttrBuilderContext<*> = {}, content: @Composable () -> Unit) { - Div( - attrs = { - classes("card") - attrs() - } - ) { - content() - } -} - -@Composable -fun MaterialTextArea( - id: String, - label: String, - text: String, - onTextChanged: (String) -> Unit, - attrs: AttrBuilderContext<*> = {} -) { - Div( - attrs = { - classes("input-field", "col", "s12") - attrs() - } - ) { - TextArea( - value = text, - attrs = { - id("text_area_add_todo") - classes("materialize-textarea") - onInput { onTextChanged(it.value) } - style { - width(100.percent) - height(100.percent) - } - } - ) - - Label(forId = id) { - Text(value = label) - } - } -} - -@Composable -fun ImageButton( - onClick: () -> Unit, - iconName: String, - attrs: AttrBuilderContext<*> = {} -) { - A( - attrs = { - classes("waves-effect", "waves-teal", "btn-flat") - style { - width(48.px) - height(48.px) - display(DisplayStyle.Flex) - alignItems(AlignItems.Center) - justifyContent(JustifyContent.Center) - } - this.onClick { onClick() } - attrs() - } - ) { - MaterialIcon(name = iconName) - } -} - -@Composable -fun MaterialIcon(name: String) { - I(attrs = { classes("material-icons") }) { Text(value = name) } -} - -@Composable -fun NavBar( - title: String, - navigationIcon: NavBarIcon? = null -) { - Nav { - Div(attrs = { classes("nav-wrapper") }) { - if (navigationIcon != null) { - Ul(attrs = { classes("left") }) { - NavBarIcon(icon = navigationIcon) - } - } - - A( - attrs = { - classes("brand-logo") - style { - property("padding-left", 16.px) - } - } - ) { - Text(value = title) - } - } - } -} - -@Composable -private fun ElementScope.NavBarIcon(icon: NavBarIcon) { - Li { - A( - attrs = { - onClick { icon.onClick() } - } - ) { - MaterialIcon(name = icon.name) - } - } -} - -class NavBarIcon( - val name: String, - val onClick: () -> Unit -) diff --git a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/Crossfade.kt b/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/Crossfade.kt deleted file mode 100644 index 246165bab9..0000000000 --- a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/Crossfade.kt +++ /dev/null @@ -1,115 +0,0 @@ -package example.todo.web - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.State -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import kotlinx.coroutines.delay -import org.jetbrains.compose.web.css.Position -import org.jetbrains.compose.web.css.height -import org.jetbrains.compose.web.css.left -import org.jetbrains.compose.web.css.opacity -import org.jetbrains.compose.web.css.percent -import org.jetbrains.compose.web.css.position -import org.jetbrains.compose.web.css.px -import org.jetbrains.compose.web.css.top -import org.jetbrains.compose.web.css.width -import org.jetbrains.compose.web.dom.AttrBuilderContext -import org.jetbrains.compose.web.dom.Div -import kotlin.js.Date -import kotlin.math.sqrt - -@Composable -fun Crossfade(target: T, attrs: AttrBuilderContext<*> = {}, content: @Composable (T) -> Unit) { - val holder = remember { TargetHolder(null) } - val previousTarget: T? = holder.value - - if (previousTarget == null) { - holder.value = target - Div(attrs = attrs) { - content(target) - } - return - } - - if (previousTarget == target) { - Div(attrs = attrs) { - content(target) - } - return - } - - holder.value = target - - val animationFactor by animateFloatFactor(key = target, durationMillis = 300L, easing = ::sqrt) - - Div(attrs = attrs) { - if (animationFactor < 1F) { - Div( - attrs = { - style { - width(100.percent) - height(100.percent) - position(Position.Absolute) - top(0.px) - left(0.px) - opacity(1F - animationFactor) - } - } - ) { - content(previousTarget) - } - } - - Div( - attrs = { - style { - width(100.percent) - height(100.percent) - position(Position.Absolute) - top(0.px) - left(0.px) - if (animationFactor < 1F) { - opacity(animationFactor) - } - } - } - ) { - content(target) - } - } -} - -private class TargetHolder( - var value: T? -) - -@Composable -private fun animateFloatFactor(key: Any, durationMillis: Long, easing: Easing = Easing { it }): State { - val state = remember(key) { mutableStateOf(0F) } - - LaunchedEffect(key) { - var date = Date.now() - val startMillis = date - val endMillis = startMillis + durationMillis.toDouble() - while (true) { - date = Date.now() - if (date >= endMillis) { - break - } - - state.value = easing.transform(((date - startMillis) / durationMillis.toDouble()).toFloat()) - delay(16L) - } - - state.value = 1F - } - - return state -} - -private fun interface Easing { - fun transform(fraction: Float): Float -} diff --git a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/TodoEditUi.kt b/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/TodoEditUi.kt deleted file mode 100644 index e1fa9628ee..0000000000 --- a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/TodoEditUi.kt +++ /dev/null @@ -1,96 +0,0 @@ -package example.todo.web - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import example.todo.common.edit.TodoEdit -import org.jetbrains.compose.web.css.DisplayStyle -import org.jetbrains.compose.web.css.FlexDirection -import org.jetbrains.compose.web.css.FlexWrap -import org.jetbrains.compose.web.css.JustifyContent -import org.jetbrains.compose.web.css.display -import org.jetbrains.compose.web.css.flexFlow -import org.jetbrains.compose.web.css.height -import org.jetbrains.compose.web.css.justifyContent -import org.jetbrains.compose.web.css.percent -import org.jetbrains.compose.web.css.width -import org.jetbrains.compose.web.dom.Div -import org.jetbrains.compose.web.dom.Text - -@Composable -fun TodoEditUi(component: TodoEdit) { - val model by component.models.subscribeAsState() - - Div( - attrs = { - style { - width(100.percent) - height(100.percent) - display(DisplayStyle.Flex) - flexFlow(FlexDirection.Column, FlexWrap.Nowrap) - } - } - ) { - Div( - attrs = { - style { - width(100.percent) - property("flex", "0 1 auto") - } - } - ) { - NavBar( - title = "Edit todo", - navigationIcon = NavBarIcon( - name = "arrow_back", - onClick = component::onCloseClicked - ) - ) - } - - Div( - attrs = { - style { - width(100.percent) - property("flex", "1 1 auto") - property("padding", "0px 16px 0px 16px") - display(DisplayStyle.Flex) - flexFlow(FlexDirection.Column, FlexWrap.Nowrap) - } - } - ) { - MaterialTextArea( - id = "text_area_edit_todo", - label = "", - text = model.text, - onTextChanged = component::onTextChanged, - attrs = { - style { - width(100.percent) - property("flex", "1 1 auto") - } - } - ) - } - - Div( - attrs = { - style { - width(100.percent) - property("flex", "0 1 auto") - property("padding-bottom", "16px") - display(DisplayStyle.Flex) - justifyContent(JustifyContent.Center) - } - } - ) { - MaterialCheckbox( - checked = model.isDone, - onCheckedChange = component::onDoneChanged, - content = { - Text(value = "Completed") - } - ) - } - } -} - diff --git a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/TodoMainUi.kt b/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/TodoMainUi.kt deleted file mode 100644 index db6c622deb..0000000000 --- a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/TodoMainUi.kt +++ /dev/null @@ -1,189 +0,0 @@ -package example.todo.web - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import example.todo.common.main.TodoItem -import example.todo.common.main.TodoMain -import org.jetbrains.compose.web.css.AlignItems -import org.jetbrains.compose.web.css.DisplayStyle -import org.jetbrains.compose.web.css.FlexDirection -import org.jetbrains.compose.web.css.FlexWrap -import org.jetbrains.compose.web.css.alignItems -import org.jetbrains.compose.web.css.display -import org.jetbrains.compose.web.css.flexFlow -import org.jetbrains.compose.web.css.height -import org.jetbrains.compose.web.css.margin -import org.jetbrains.compose.web.css.marginLeft -import org.jetbrains.compose.web.css.percent -import org.jetbrains.compose.web.css.px -import org.jetbrains.compose.web.css.width -import org.jetbrains.compose.web.dom.DOMScope -import org.jetbrains.compose.web.dom.Div -import org.jetbrains.compose.web.dom.Li -import org.jetbrains.compose.web.dom.Text -import org.jetbrains.compose.web.dom.Ul -import org.w3c.dom.HTMLUListElement - - -@Composable -fun TodoMainUi(component: TodoMain) { - val model by component.models.subscribeAsState() - - Div( - attrs = { - style { - width(100.percent) - height(100.percent) - display(DisplayStyle.Flex) - flexFlow(FlexDirection.Column, FlexWrap.Nowrap) - } - } - ) { - Div( - attrs = { - style { - width(100.percent) - property("flex", "0 1 auto") - } - } - ) { - NavBar(title = "Todo List") - } - - Ul( - attrs = { - style { - width(100.percent) - margin(0.px) - property("flex", "1 1 auto") - property("overflow-y", "scroll") - } - } - ) { - model.items.forEach { item -> - Item( - item = item, - onClicked = component::onItemClicked, - onDoneChanged = component::onItemDoneChanged, - onDeleteClicked = component::onItemDeleteClicked - ) - } - } - - Div( - attrs = { - style { - width(100.percent) - property("flex", "0 1 auto") - } - } - ) { - TodoInput( - text = model.text, - onTextChanged = component::onInputTextChanged, - onAddClicked = component::onAddItemClicked - ) - } - } -} - -@Composable -private fun DOMScope.Item( - item: TodoItem, - onClicked: (id: Long) -> Unit, - onDoneChanged: (id: Long, isDone: Boolean) -> Unit, - onDeleteClicked: (id: Long) -> Unit -) { - Li( - attrs = { - style { - width(100.percent) - display(DisplayStyle.Flex) - flexFlow(FlexDirection.Row, FlexWrap.Nowrap) - alignItems(AlignItems.Center) - property("padding", "0px 0px 0px 16px") - } - } - ) { - MaterialCheckbox( - checked = item.isDone, - onCheckedChange = { onDoneChanged(item.id, !item.isDone) }, - attrs = { - style { - property("flex", "0 1 auto") - property("padding-top", 10.px) // Fix for the checkbox not being centered vertically - } - } - ) - - Div( - attrs = { - style { - height(48.px) - property("flex", "1 1 auto") - property("white-space", "nowrap") - property("text-overflow", "ellipsis") - property("overflow", "hidden") - display(DisplayStyle.Flex) - alignItems(AlignItems.Center) - } - onClick { onClicked(item.id) } - } - ) { - Text(value = item.text) - } - - ImageButton( - onClick = { onDeleteClicked(item.id) }, - iconName = "delete", - attrs = { - style { - property("flex", "0 1 auto") - marginLeft(8.px) - } - } - ) - } -} - -@Composable -private fun TodoInput( - text: String, - onTextChanged: (String) -> Unit, - onAddClicked: () -> Unit -) { - Div( - attrs = { - style { - width(100.percent) - display(DisplayStyle.Flex) - flexFlow(FlexDirection.Row, FlexWrap.Nowrap) - alignItems(AlignItems.Center) - } - } - ) { - MaterialTextArea( - id = "text_area_add_todo", - label = "Add todo", - text = text, - onTextChanged = onTextChanged, - attrs = { - style { - property("flex", "1 1 auto") - margin(16.px) - } - } - ) - - ImageButton( - onClick = onAddClicked, - iconName = "add", - attrs = { - style { - property("flex", "0 1 auto") - property("margin", "0px 16px 0px 0px") - } - } - ) - } -} diff --git a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/TodoRootUi.kt b/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/TodoRootUi.kt deleted file mode 100644 index 8096bc646b..0000000000 --- a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/TodoRootUi.kt +++ /dev/null @@ -1,54 +0,0 @@ -package example.todo.web - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import example.todo.common.root.TodoRoot -import org.jetbrains.compose.web.css.Position -import org.jetbrains.compose.web.css.bottom -import org.jetbrains.compose.web.css.height -import org.jetbrains.compose.web.css.keywords.auto -import org.jetbrains.compose.web.css.left -import org.jetbrains.compose.web.css.percent -import org.jetbrains.compose.web.css.position -import org.jetbrains.compose.web.css.px -import org.jetbrains.compose.web.css.right -import org.jetbrains.compose.web.css.top -import org.jetbrains.compose.web.css.width - -@Composable -fun TodoRootUi(component: TodoRoot) { - Card( - attrs = { - style { - position(Position.Absolute) - height(700.px) - property("max-width", 640.px) - top(0.px) - bottom(0.px) - left(0.px) - right(0.px) - property("margin", auto) - } - } - ) { - val childStack by component.childStack.subscribeAsState() - - Crossfade( - target = childStack.active.instance, - attrs = { - style { - width(100.percent) - height(100.percent) - position(Position.Relative) - left(0.px) - top(0.px) - } - } - ) { child -> - when (child) { - is TodoRoot.Child.Main -> TodoMainUi(child.component) - is TodoRoot.Child.Edit -> TodoEditUi(child.component) - } - } - } -} diff --git a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/ValueExt.kt b/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/ValueExt.kt deleted file mode 100644 index c45a06f05c..0000000000 --- a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/ValueExt.kt +++ /dev/null @@ -1,25 +0,0 @@ -package example.todo.web - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.State -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import com.arkivanov.decompose.value.Value - -@Composable -fun Value.subscribeAsState(): State { - val state = remember(this) { mutableStateOf(value) } - - DisposableEffect(this) { - val observer: (T) -> Unit = { state.value = it } - - subscribe(observer) - - onDispose { - unsubscribe(observer) - } - } - - return state -} diff --git a/examples/todoapp/web/src/jsMain/resources/MaterialIcons-Regular.ttf b/examples/todoapp/web/src/jsMain/resources/MaterialIcons-Regular.ttf deleted file mode 100644 index 453b3e4cbcb0e98b6a67789c0220fdcf2d229323..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 285724 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 z%0D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 diff --git a/examples/todoapp/web/src/jsMain/resources/index.html b/examples/todoapp/web/src/jsMain/resources/index.html deleted file mode 100644 index cae0724daf..0000000000 --- a/examples/todoapp/web/src/jsMain/resources/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - Todo - - - - -

    - - - - diff --git a/examples/todoapp/web/src/jsMain/resources/materialize.min.css b/examples/todoapp/web/src/jsMain/resources/materialize.min.css deleted file mode 100644 index 74b1741b62..0000000000 --- a/examples/todoapp/web/src/jsMain/resources/materialize.min.css +++ /dev/null @@ -1,13 +0,0 @@ -/*! - * Materialize v1.0.0 (http://materializecss.com) - * Copyright 2014-2017 Materialize - * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE) - */ -.materialize-red{background-color:#e51c23 !important}.materialize-red-text{color:#e51c23 !important}.materialize-red.lighten-5{background-color:#fdeaeb !important}.materialize-red-text.text-lighten-5{color:#fdeaeb !important}.materialize-red.lighten-4{background-color:#f8c1c3 !important}.materialize-red-text.text-lighten-4{color:#f8c1c3 !important}.materialize-red.lighten-3{background-color:#f3989b !important}.materialize-red-text.text-lighten-3{color:#f3989b !important}.materialize-red.lighten-2{background-color:#ee6e73 !important}.materialize-red-text.text-lighten-2{color:#ee6e73 !important}.materialize-red.lighten-1{background-color:#ea454b !important}.materialize-red-text.text-lighten-1{color:#ea454b !important}.materialize-red.darken-1{background-color:#d0181e !important}.materialize-red-text.text-darken-1{color:#d0181e !important}.materialize-red.darken-2{background-color:#b9151b !important}.materialize-red-text.text-darken-2{color:#b9151b !important}.materialize-red.darken-3{background-color:#a21318 !important}.materialize-red-text.text-darken-3{color:#a21318 !important}.materialize-red.darken-4{background-color:#8b1014 !important}.materialize-red-text.text-darken-4{color:#8b1014 !important}.red{background-color:#F44336 !important}.red-text{color:#F44336 !important}.red.lighten-5{background-color:#FFEBEE !important}.red-text.text-lighten-5{color:#FFEBEE !important}.red.lighten-4{background-color:#FFCDD2 !important}.red-text.text-lighten-4{color:#FFCDD2 !important}.red.lighten-3{background-color:#EF9A9A !important}.red-text.text-lighten-3{color:#EF9A9A !important}.red.lighten-2{background-color:#E57373 !important}.red-text.text-lighten-2{color:#E57373 !important}.red.lighten-1{background-color:#EF5350 !important}.red-text.text-lighten-1{color:#EF5350 !important}.red.darken-1{background-color:#E53935 !important}.red-text.text-darken-1{color:#E53935 !important}.red.darken-2{background-color:#D32F2F !important}.red-text.text-darken-2{color:#D32F2F !important}.red.darken-3{background-color:#C62828 !important}.red-text.text-darken-3{color:#C62828 !important}.red.darken-4{background-color:#B71C1C !important}.red-text.text-darken-4{color:#B71C1C !important}.red.accent-1{background-color:#FF8A80 !important}.red-text.text-accent-1{color:#FF8A80 !important}.red.accent-2{background-color:#FF5252 !important}.red-text.text-accent-2{color:#FF5252 !important}.red.accent-3{background-color:#FF1744 !important}.red-text.text-accent-3{color:#FF1744 !important}.red.accent-4{background-color:#D50000 !important}.red-text.text-accent-4{color:#D50000 !important}.pink{background-color:#e91e63 !important}.pink-text{color:#e91e63 !important}.pink.lighten-5{background-color:#fce4ec !important}.pink-text.text-lighten-5{color:#fce4ec !important}.pink.lighten-4{background-color:#f8bbd0 !important}.pink-text.text-lighten-4{color:#f8bbd0 !important}.pink.lighten-3{background-color:#f48fb1 !important}.pink-text.text-lighten-3{color:#f48fb1 !important}.pink.lighten-2{background-color:#f06292 !important}.pink-text.text-lighten-2{color:#f06292 !important}.pink.lighten-1{background-color:#ec407a !important}.pink-text.text-lighten-1{color:#ec407a !important}.pink.darken-1{background-color:#d81b60 !important}.pink-text.text-darken-1{color:#d81b60 !important}.pink.darken-2{background-color:#c2185b !important}.pink-text.text-darken-2{color:#c2185b !important}.pink.darken-3{background-color:#ad1457 !important}.pink-text.text-darken-3{color:#ad1457 !important}.pink.darken-4{background-color:#880e4f !important}.pink-text.text-darken-4{color:#880e4f !important}.pink.accent-1{background-color:#ff80ab !important}.pink-text.text-accent-1{color:#ff80ab !important}.pink.accent-2{background-color:#ff4081 !important}.pink-text.text-accent-2{color:#ff4081 !important}.pink.accent-3{background-color:#f50057 !important}.pink-text.text-accent-3{color:#f50057 !important}.pink.accent-4{background-color:#c51162 !important}.pink-text.text-accent-4{color:#c51162 !important}.purple{background-color:#9c27b0 !important}.purple-text{color:#9c27b0 !important}.purple.lighten-5{background-color:#f3e5f5 !important}.purple-text.text-lighten-5{color:#f3e5f5 !important}.purple.lighten-4{background-color:#e1bee7 !important}.purple-text.text-lighten-4{color:#e1bee7 !important}.purple.lighten-3{background-color:#ce93d8 !important}.purple-text.text-lighten-3{color:#ce93d8 !important}.purple.lighten-2{background-color:#ba68c8 !important}.purple-text.text-lighten-2{color:#ba68c8 !important}.purple.lighten-1{background-color:#ab47bc !important}.purple-text.text-lighten-1{color:#ab47bc !important}.purple.darken-1{background-color:#8e24aa !important}.purple-text.text-darken-1{color:#8e24aa !important}.purple.darken-2{background-color:#7b1fa2 !important}.purple-text.text-darken-2{color:#7b1fa2 !important}.purple.darken-3{background-color:#6a1b9a !important}.purple-text.text-darken-3{color:#6a1b9a !important}.purple.darken-4{background-color:#4a148c !important}.purple-text.text-darken-4{color:#4a148c !important}.purple.accent-1{background-color:#ea80fc !important}.purple-text.text-accent-1{color:#ea80fc !important}.purple.accent-2{background-color:#e040fb !important}.purple-text.text-accent-2{color:#e040fb !important}.purple.accent-3{background-color:#d500f9 !important}.purple-text.text-accent-3{color:#d500f9 !important}.purple.accent-4{background-color:#a0f !important}.purple-text.text-accent-4{color:#a0f !important}.deep-purple{background-color:#673ab7 !important}.deep-purple-text{color:#673ab7 !important}.deep-purple.lighten-5{background-color:#ede7f6 !important}.deep-purple-text.text-lighten-5{color:#ede7f6 !important}.deep-purple.lighten-4{background-color:#d1c4e9 !important}.deep-purple-text.text-lighten-4{color:#d1c4e9 !important}.deep-purple.lighten-3{background-color:#b39ddb !important}.deep-purple-text.text-lighten-3{color:#b39ddb !important}.deep-purple.lighten-2{background-color:#9575cd !important}.deep-purple-text.text-lighten-2{color:#9575cd !important}.deep-purple.lighten-1{background-color:#7e57c2 !important}.deep-purple-text.text-lighten-1{color:#7e57c2 !important}.deep-purple.darken-1{background-color:#5e35b1 !important}.deep-purple-text.text-darken-1{color:#5e35b1 !important}.deep-purple.darken-2{background-color:#512da8 !important}.deep-purple-text.text-darken-2{color:#512da8 !important}.deep-purple.darken-3{background-color:#4527a0 !important}.deep-purple-text.text-darken-3{color:#4527a0 !important}.deep-purple.darken-4{background-color:#311b92 !important}.deep-purple-text.text-darken-4{color:#311b92 !important}.deep-purple.accent-1{background-color:#b388ff !important}.deep-purple-text.text-accent-1{color:#b388ff !important}.deep-purple.accent-2{background-color:#7c4dff !important}.deep-purple-text.text-accent-2{color:#7c4dff !important}.deep-purple.accent-3{background-color:#651fff !important}.deep-purple-text.text-accent-3{color:#651fff !important}.deep-purple.accent-4{background-color:#6200ea !important}.deep-purple-text.text-accent-4{color:#6200ea !important}.indigo{background-color:#3f51b5 !important}.indigo-text{color:#3f51b5 !important}.indigo.lighten-5{background-color:#e8eaf6 !important}.indigo-text.text-lighten-5{color:#e8eaf6 !important}.indigo.lighten-4{background-color:#c5cae9 !important}.indigo-text.text-lighten-4{color:#c5cae9 !important}.indigo.lighten-3{background-color:#9fa8da !important}.indigo-text.text-lighten-3{color:#9fa8da !important}.indigo.lighten-2{background-color:#7986cb !important}.indigo-text.text-lighten-2{color:#7986cb !important}.indigo.lighten-1{background-color:#5c6bc0 !important}.indigo-text.text-lighten-1{color:#5c6bc0 !important}.indigo.darken-1{background-color:#3949ab !important}.indigo-text.text-darken-1{color:#3949ab !important}.indigo.darken-2{background-color:#303f9f !important}.indigo-text.text-darken-2{color:#303f9f !important}.indigo.darken-3{background-color:#283593 !important}.indigo-text.text-darken-3{color:#283593 !important}.indigo.darken-4{background-color:#1a237e !important}.indigo-text.text-darken-4{color:#1a237e !important}.indigo.accent-1{background-color:#8c9eff !important}.indigo-text.text-accent-1{color:#8c9eff !important}.indigo.accent-2{background-color:#536dfe !important}.indigo-text.text-accent-2{color:#536dfe !important}.indigo.accent-3{background-color:#3d5afe !important}.indigo-text.text-accent-3{color:#3d5afe !important}.indigo.accent-4{background-color:#304ffe !important}.indigo-text.text-accent-4{color:#304ffe !important}.blue{background-color:#2196F3 !important}.blue-text{color:#2196F3 !important}.blue.lighten-5{background-color:#E3F2FD !important}.blue-text.text-lighten-5{color:#E3F2FD !important}.blue.lighten-4{background-color:#BBDEFB !important}.blue-text.text-lighten-4{color:#BBDEFB !important}.blue.lighten-3{background-color:#90CAF9 !important}.blue-text.text-lighten-3{color:#90CAF9 !important}.blue.lighten-2{background-color:#64B5F6 !important}.blue-text.text-lighten-2{color:#64B5F6 !important}.blue.lighten-1{background-color:#42A5F5 !important}.blue-text.text-lighten-1{color:#42A5F5 !important}.blue.darken-1{background-color:#1E88E5 !important}.blue-text.text-darken-1{color:#1E88E5 !important}.blue.darken-2{background-color:#1976D2 !important}.blue-text.text-darken-2{color:#1976D2 !important}.blue.darken-3{background-color:#1565C0 !important}.blue-text.text-darken-3{color:#1565C0 !important}.blue.darken-4{background-color:#0D47A1 !important}.blue-text.text-darken-4{color:#0D47A1 !important}.blue.accent-1{background-color:#82B1FF !important}.blue-text.text-accent-1{color:#82B1FF !important}.blue.accent-2{background-color:#448AFF !important}.blue-text.text-accent-2{color:#448AFF !important}.blue.accent-3{background-color:#2979FF !important}.blue-text.text-accent-3{color:#2979FF !important}.blue.accent-4{background-color:#2962FF !important}.blue-text.text-accent-4{color:#2962FF !important}.light-blue{background-color:#03a9f4 !important}.light-blue-text{color:#03a9f4 !important}.light-blue.lighten-5{background-color:#e1f5fe !important}.light-blue-text.text-lighten-5{color:#e1f5fe !important}.light-blue.lighten-4{background-color:#b3e5fc !important}.light-blue-text.text-lighten-4{color:#b3e5fc !important}.light-blue.lighten-3{background-color:#81d4fa !important}.light-blue-text.text-lighten-3{color:#81d4fa !important}.light-blue.lighten-2{background-color:#4fc3f7 !important}.light-blue-text.text-lighten-2{color:#4fc3f7 !important}.light-blue.lighten-1{background-color:#29b6f6 !important}.light-blue-text.text-lighten-1{color:#29b6f6 !important}.light-blue.darken-1{background-color:#039be5 !important}.light-blue-text.text-darken-1{color:#039be5 !important}.light-blue.darken-2{background-color:#0288d1 !important}.light-blue-text.text-darken-2{color:#0288d1 !important}.light-blue.darken-3{background-color:#0277bd !important}.light-blue-text.text-darken-3{color:#0277bd !important}.light-blue.darken-4{background-color:#01579b !important}.light-blue-text.text-darken-4{color:#01579b !important}.light-blue.accent-1{background-color:#80d8ff !important}.light-blue-text.text-accent-1{color:#80d8ff !important}.light-blue.accent-2{background-color:#40c4ff !important}.light-blue-text.text-accent-2{color:#40c4ff !important}.light-blue.accent-3{background-color:#00b0ff !important}.light-blue-text.text-accent-3{color:#00b0ff !important}.light-blue.accent-4{background-color:#0091ea !important}.light-blue-text.text-accent-4{color:#0091ea !important}.cyan{background-color:#00bcd4 !important}.cyan-text{color:#00bcd4 !important}.cyan.lighten-5{background-color:#e0f7fa !important}.cyan-text.text-lighten-5{color:#e0f7fa !important}.cyan.lighten-4{background-color:#b2ebf2 !important}.cyan-text.text-lighten-4{color:#b2ebf2 !important}.cyan.lighten-3{background-color:#80deea !important}.cyan-text.text-lighten-3{color:#80deea !important}.cyan.lighten-2{background-color:#4dd0e1 !important}.cyan-text.text-lighten-2{color:#4dd0e1 !important}.cyan.lighten-1{background-color:#26c6da !important}.cyan-text.text-lighten-1{color:#26c6da !important}.cyan.darken-1{background-color:#00acc1 !important}.cyan-text.text-darken-1{color:#00acc1 !important}.cyan.darken-2{background-color:#0097a7 !important}.cyan-text.text-darken-2{color:#0097a7 !important}.cyan.darken-3{background-color:#00838f !important}.cyan-text.text-darken-3{color:#00838f !important}.cyan.darken-4{background-color:#006064 !important}.cyan-text.text-darken-4{color:#006064 !important}.cyan.accent-1{background-color:#84ffff !important}.cyan-text.text-accent-1{color:#84ffff !important}.cyan.accent-2{background-color:#18ffff !important}.cyan-text.text-accent-2{color:#18ffff !important}.cyan.accent-3{background-color:#00e5ff !important}.cyan-text.text-accent-3{color:#00e5ff !important}.cyan.accent-4{background-color:#00b8d4 !important}.cyan-text.text-accent-4{color:#00b8d4 !important}.teal{background-color:#009688 !important}.teal-text{color:#009688 !important}.teal.lighten-5{background-color:#e0f2f1 !important}.teal-text.text-lighten-5{color:#e0f2f1 !important}.teal.lighten-4{background-color:#b2dfdb !important}.teal-text.text-lighten-4{color:#b2dfdb !important}.teal.lighten-3{background-color:#80cbc4 !important}.teal-text.text-lighten-3{color:#80cbc4 !important}.teal.lighten-2{background-color:#4db6ac !important}.teal-text.text-lighten-2{color:#4db6ac !important}.teal.lighten-1{background-color:#26a69a !important}.teal-text.text-lighten-1{color:#26a69a !important}.teal.darken-1{background-color:#00897b !important}.teal-text.text-darken-1{color:#00897b !important}.teal.darken-2{background-color:#00796b !important}.teal-text.text-darken-2{color:#00796b !important}.teal.darken-3{background-color:#00695c !important}.teal-text.text-darken-3{color:#00695c !important}.teal.darken-4{background-color:#004d40 !important}.teal-text.text-darken-4{color:#004d40 !important}.teal.accent-1{background-color:#a7ffeb !important}.teal-text.text-accent-1{color:#a7ffeb !important}.teal.accent-2{background-color:#64ffda !important}.teal-text.text-accent-2{color:#64ffda !important}.teal.accent-3{background-color:#1de9b6 !important}.teal-text.text-accent-3{color:#1de9b6 !important}.teal.accent-4{background-color:#00bfa5 !important}.teal-text.text-accent-4{color:#00bfa5 !important}.green{background-color:#4CAF50 !important}.green-text{color:#4CAF50 !important}.green.lighten-5{background-color:#E8F5E9 !important}.green-text.text-lighten-5{color:#E8F5E9 !important}.green.lighten-4{background-color:#C8E6C9 !important}.green-text.text-lighten-4{color:#C8E6C9 !important}.green.lighten-3{background-color:#A5D6A7 !important}.green-text.text-lighten-3{color:#A5D6A7 !important}.green.lighten-2{background-color:#81C784 !important}.green-text.text-lighten-2{color:#81C784 !important}.green.lighten-1{background-color:#66BB6A !important}.green-text.text-lighten-1{color:#66BB6A !important}.green.darken-1{background-color:#43A047 !important}.green-text.text-darken-1{color:#43A047 !important}.green.darken-2{background-color:#388E3C !important}.green-text.text-darken-2{color:#388E3C !important}.green.darken-3{background-color:#2E7D32 !important}.green-text.text-darken-3{color:#2E7D32 !important}.green.darken-4{background-color:#1B5E20 !important}.green-text.text-darken-4{color:#1B5E20 !important}.green.accent-1{background-color:#B9F6CA !important}.green-text.text-accent-1{color:#B9F6CA !important}.green.accent-2{background-color:#69F0AE !important}.green-text.text-accent-2{color:#69F0AE !important}.green.accent-3{background-color:#00E676 !important}.green-text.text-accent-3{color:#00E676 !important}.green.accent-4{background-color:#00C853 !important}.green-text.text-accent-4{color:#00C853 !important}.light-green{background-color:#8bc34a !important}.light-green-text{color:#8bc34a !important}.light-green.lighten-5{background-color:#f1f8e9 !important}.light-green-text.text-lighten-5{color:#f1f8e9 !important}.light-green.lighten-4{background-color:#dcedc8 !important}.light-green-text.text-lighten-4{color:#dcedc8 !important}.light-green.lighten-3{background-color:#c5e1a5 !important}.light-green-text.text-lighten-3{color:#c5e1a5 !important}.light-green.lighten-2{background-color:#aed581 !important}.light-green-text.text-lighten-2{color:#aed581 !important}.light-green.lighten-1{background-color:#9ccc65 !important}.light-green-text.text-lighten-1{color:#9ccc65 !important}.light-green.darken-1{background-color:#7cb342 !important}.light-green-text.text-darken-1{color:#7cb342 !important}.light-green.darken-2{background-color:#689f38 !important}.light-green-text.text-darken-2{color:#689f38 !important}.light-green.darken-3{background-color:#558b2f !important}.light-green-text.text-darken-3{color:#558b2f !important}.light-green.darken-4{background-color:#33691e !important}.light-green-text.text-darken-4{color:#33691e !important}.light-green.accent-1{background-color:#ccff90 !important}.light-green-text.text-accent-1{color:#ccff90 !important}.light-green.accent-2{background-color:#b2ff59 !important}.light-green-text.text-accent-2{color:#b2ff59 !important}.light-green.accent-3{background-color:#76ff03 !important}.light-green-text.text-accent-3{color:#76ff03 !important}.light-green.accent-4{background-color:#64dd17 !important}.light-green-text.text-accent-4{color:#64dd17 !important}.lime{background-color:#cddc39 !important}.lime-text{color:#cddc39 !important}.lime.lighten-5{background-color:#f9fbe7 !important}.lime-text.text-lighten-5{color:#f9fbe7 !important}.lime.lighten-4{background-color:#f0f4c3 !important}.lime-text.text-lighten-4{color:#f0f4c3 !important}.lime.lighten-3{background-color:#e6ee9c !important}.lime-text.text-lighten-3{color:#e6ee9c !important}.lime.lighten-2{background-color:#dce775 !important}.lime-text.text-lighten-2{color:#dce775 !important}.lime.lighten-1{background-color:#d4e157 !important}.lime-text.text-lighten-1{color:#d4e157 !important}.lime.darken-1{background-color:#c0ca33 !important}.lime-text.text-darken-1{color:#c0ca33 !important}.lime.darken-2{background-color:#afb42b !important}.lime-text.text-darken-2{color:#afb42b !important}.lime.darken-3{background-color:#9e9d24 !important}.lime-text.text-darken-3{color:#9e9d24 !important}.lime.darken-4{background-color:#827717 !important}.lime-text.text-darken-4{color:#827717 !important}.lime.accent-1{background-color:#f4ff81 !important}.lime-text.text-accent-1{color:#f4ff81 !important}.lime.accent-2{background-color:#eeff41 !important}.lime-text.text-accent-2{color:#eeff41 !important}.lime.accent-3{background-color:#c6ff00 !important}.lime-text.text-accent-3{color:#c6ff00 !important}.lime.accent-4{background-color:#aeea00 !important}.lime-text.text-accent-4{color:#aeea00 !important}.yellow{background-color:#ffeb3b !important}.yellow-text{color:#ffeb3b !important}.yellow.lighten-5{background-color:#fffde7 !important}.yellow-text.text-lighten-5{color:#fffde7 !important}.yellow.lighten-4{background-color:#fff9c4 !important}.yellow-text.text-lighten-4{color:#fff9c4 !important}.yellow.lighten-3{background-color:#fff59d !important}.yellow-text.text-lighten-3{color:#fff59d !important}.yellow.lighten-2{background-color:#fff176 !important}.yellow-text.text-lighten-2{color:#fff176 !important}.yellow.lighten-1{background-color:#ffee58 !important}.yellow-text.text-lighten-1{color:#ffee58 !important}.yellow.darken-1{background-color:#fdd835 !important}.yellow-text.text-darken-1{color:#fdd835 !important}.yellow.darken-2{background-color:#fbc02d !important}.yellow-text.text-darken-2{color:#fbc02d !important}.yellow.darken-3{background-color:#f9a825 !important}.yellow-text.text-darken-3{color:#f9a825 !important}.yellow.darken-4{background-color:#f57f17 !important}.yellow-text.text-darken-4{color:#f57f17 !important}.yellow.accent-1{background-color:#ffff8d !important}.yellow-text.text-accent-1{color:#ffff8d !important}.yellow.accent-2{background-color:#ff0 !important}.yellow-text.text-accent-2{color:#ff0 !important}.yellow.accent-3{background-color:#ffea00 !important}.yellow-text.text-accent-3{color:#ffea00 !important}.yellow.accent-4{background-color:#ffd600 !important}.yellow-text.text-accent-4{color:#ffd600 !important}.amber{background-color:#ffc107 !important}.amber-text{color:#ffc107 !important}.amber.lighten-5{background-color:#fff8e1 !important}.amber-text.text-lighten-5{color:#fff8e1 !important}.amber.lighten-4{background-color:#ffecb3 !important}.amber-text.text-lighten-4{color:#ffecb3 !important}.amber.lighten-3{background-color:#ffe082 !important}.amber-text.text-lighten-3{color:#ffe082 !important}.amber.lighten-2{background-color:#ffd54f !important}.amber-text.text-lighten-2{color:#ffd54f !important}.amber.lighten-1{background-color:#ffca28 !important}.amber-text.text-lighten-1{color:#ffca28 !important}.amber.darken-1{background-color:#ffb300 !important}.amber-text.text-darken-1{color:#ffb300 !important}.amber.darken-2{background-color:#ffa000 !important}.amber-text.text-darken-2{color:#ffa000 !important}.amber.darken-3{background-color:#ff8f00 !important}.amber-text.text-darken-3{color:#ff8f00 !important}.amber.darken-4{background-color:#ff6f00 !important}.amber-text.text-darken-4{color:#ff6f00 !important}.amber.accent-1{background-color:#ffe57f !important}.amber-text.text-accent-1{color:#ffe57f !important}.amber.accent-2{background-color:#ffd740 !important}.amber-text.text-accent-2{color:#ffd740 !important}.amber.accent-3{background-color:#ffc400 !important}.amber-text.text-accent-3{color:#ffc400 !important}.amber.accent-4{background-color:#ffab00 !important}.amber-text.text-accent-4{color:#ffab00 !important}.orange{background-color:#ff9800 !important}.orange-text{color:#ff9800 !important}.orange.lighten-5{background-color:#fff3e0 !important}.orange-text.text-lighten-5{color:#fff3e0 !important}.orange.lighten-4{background-color:#ffe0b2 !important}.orange-text.text-lighten-4{color:#ffe0b2 !important}.orange.lighten-3{background-color:#ffcc80 !important}.orange-text.text-lighten-3{color:#ffcc80 !important}.orange.lighten-2{background-color:#ffb74d !important}.orange-text.text-lighten-2{color:#ffb74d !important}.orange.lighten-1{background-color:#ffa726 !important}.orange-text.text-lighten-1{color:#ffa726 !important}.orange.darken-1{background-color:#fb8c00 !important}.orange-text.text-darken-1{color:#fb8c00 !important}.orange.darken-2{background-color:#f57c00 !important}.orange-text.text-darken-2{color:#f57c00 !important}.orange.darken-3{background-color:#ef6c00 !important}.orange-text.text-darken-3{color:#ef6c00 !important}.orange.darken-4{background-color:#e65100 !important}.orange-text.text-darken-4{color:#e65100 !important}.orange.accent-1{background-color:#ffd180 !important}.orange-text.text-accent-1{color:#ffd180 !important}.orange.accent-2{background-color:#ffab40 !important}.orange-text.text-accent-2{color:#ffab40 !important}.orange.accent-3{background-color:#ff9100 !important}.orange-text.text-accent-3{color:#ff9100 !important}.orange.accent-4{background-color:#ff6d00 !important}.orange-text.text-accent-4{color:#ff6d00 !important}.deep-orange{background-color:#ff5722 !important}.deep-orange-text{color:#ff5722 !important}.deep-orange.lighten-5{background-color:#fbe9e7 !important}.deep-orange-text.text-lighten-5{color:#fbe9e7 !important}.deep-orange.lighten-4{background-color:#ffccbc !important}.deep-orange-text.text-lighten-4{color:#ffccbc !important}.deep-orange.lighten-3{background-color:#ffab91 !important}.deep-orange-text.text-lighten-3{color:#ffab91 !important}.deep-orange.lighten-2{background-color:#ff8a65 !important}.deep-orange-text.text-lighten-2{color:#ff8a65 !important}.deep-orange.lighten-1{background-color:#ff7043 !important}.deep-orange-text.text-lighten-1{color:#ff7043 !important}.deep-orange.darken-1{background-color:#f4511e !important}.deep-orange-text.text-darken-1{color:#f4511e !important}.deep-orange.darken-2{background-color:#e64a19 !important}.deep-orange-text.text-darken-2{color:#e64a19 !important}.deep-orange.darken-3{background-color:#d84315 !important}.deep-orange-text.text-darken-3{color:#d84315 !important}.deep-orange.darken-4{background-color:#bf360c !important}.deep-orange-text.text-darken-4{color:#bf360c !important}.deep-orange.accent-1{background-color:#ff9e80 !important}.deep-orange-text.text-accent-1{color:#ff9e80 !important}.deep-orange.accent-2{background-color:#ff6e40 !important}.deep-orange-text.text-accent-2{color:#ff6e40 !important}.deep-orange.accent-3{background-color:#ff3d00 !important}.deep-orange-text.text-accent-3{color:#ff3d00 !important}.deep-orange.accent-4{background-color:#dd2c00 !important}.deep-orange-text.text-accent-4{color:#dd2c00 !important}.brown{background-color:#795548 !important}.brown-text{color:#795548 !important}.brown.lighten-5{background-color:#efebe9 !important}.brown-text.text-lighten-5{color:#efebe9 !important}.brown.lighten-4{background-color:#d7ccc8 !important}.brown-text.text-lighten-4{color:#d7ccc8 !important}.brown.lighten-3{background-color:#bcaaa4 !important}.brown-text.text-lighten-3{color:#bcaaa4 !important}.brown.lighten-2{background-color:#a1887f !important}.brown-text.text-lighten-2{color:#a1887f !important}.brown.lighten-1{background-color:#8d6e63 !important}.brown-text.text-lighten-1{color:#8d6e63 !important}.brown.darken-1{background-color:#6d4c41 !important}.brown-text.text-darken-1{color:#6d4c41 !important}.brown.darken-2{background-color:#5d4037 !important}.brown-text.text-darken-2{color:#5d4037 !important}.brown.darken-3{background-color:#4e342e !important}.brown-text.text-darken-3{color:#4e342e !important}.brown.darken-4{background-color:#3e2723 !important}.brown-text.text-darken-4{color:#3e2723 !important}.blue-grey{background-color:#607d8b !important}.blue-grey-text{color:#607d8b !important}.blue-grey.lighten-5{background-color:#eceff1 !important}.blue-grey-text.text-lighten-5{color:#eceff1 !important}.blue-grey.lighten-4{background-color:#cfd8dc !important}.blue-grey-text.text-lighten-4{color:#cfd8dc !important}.blue-grey.lighten-3{background-color:#b0bec5 !important}.blue-grey-text.text-lighten-3{color:#b0bec5 !important}.blue-grey.lighten-2{background-color:#90a4ae !important}.blue-grey-text.text-lighten-2{color:#90a4ae !important}.blue-grey.lighten-1{background-color:#78909c !important}.blue-grey-text.text-lighten-1{color:#78909c !important}.blue-grey.darken-1{background-color:#546e7a !important}.blue-grey-text.text-darken-1{color:#546e7a !important}.blue-grey.darken-2{background-color:#455a64 !important}.blue-grey-text.text-darken-2{color:#455a64 !important}.blue-grey.darken-3{background-color:#37474f !important}.blue-grey-text.text-darken-3{color:#37474f !important}.blue-grey.darken-4{background-color:#263238 !important}.blue-grey-text.text-darken-4{color:#263238 !important}.grey{background-color:#9e9e9e !important}.grey-text{color:#9e9e9e !important}.grey.lighten-5{background-color:#fafafa !important}.grey-text.text-lighten-5{color:#fafafa !important}.grey.lighten-4{background-color:#f5f5f5 !important}.grey-text.text-lighten-4{color:#f5f5f5 !important}.grey.lighten-3{background-color:#eee !important}.grey-text.text-lighten-3{color:#eee !important}.grey.lighten-2{background-color:#e0e0e0 !important}.grey-text.text-lighten-2{color:#e0e0e0 !important}.grey.lighten-1{background-color:#bdbdbd !important}.grey-text.text-lighten-1{color:#bdbdbd !important}.grey.darken-1{background-color:#757575 !important}.grey-text.text-darken-1{color:#757575 !important}.grey.darken-2{background-color:#616161 !important}.grey-text.text-darken-2{color:#616161 !important}.grey.darken-3{background-color:#424242 !important}.grey-text.text-darken-3{color:#424242 !important}.grey.darken-4{background-color:#212121 !important}.grey-text.text-darken-4{color:#212121 !important}.black{background-color:#000 !important}.black-text{color:#000 !important}.white{background-color:#fff !important}.white-text{color:#fff !important}.transparent{background-color:rgba(0,0,0,0) !important}.transparent-text{color:rgba(0,0,0,0) !important}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{-webkit-box-sizing:border-box;box-sizing:border-box}*,*:before,*:after{-webkit-box-sizing:inherit;box-sizing:inherit}button,input,optgroup,select,textarea{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{color:#039be5;text-decoration:none;-webkit-tap-highlight-color:transparent}.valign-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.clearfix{clear:both}.z-depth-0{-webkit-box-shadow:none !important;box-shadow:none !important}.z-depth-1,nav,.card-panel,.card,.toast,.btn,.btn-large,.btn-small,.btn-floating,.dropdown-content,.collapsible,.sidenav{-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2);box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2)}.z-depth-1-half,.btn:hover,.btn-large:hover,.btn-small:hover,.btn-floating:hover{-webkit-box-shadow:0 3px 3px 0 rgba(0,0,0,0.14),0 1px 7px 0 rgba(0,0,0,0.12),0 3px 1px -1px rgba(0,0,0,0.2);box-shadow:0 3px 3px 0 rgba(0,0,0,0.14),0 1px 7px 0 rgba(0,0,0,0.12),0 3px 1px -1px rgba(0,0,0,0.2)}.z-depth-2{-webkit-box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.3);box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.3)}.z-depth-3{-webkit-box-shadow:0 8px 17px 2px rgba(0,0,0,0.14),0 3px 14px 2px rgba(0,0,0,0.12),0 5px 5px -3px rgba(0,0,0,0.2);box-shadow:0 8px 17px 2px rgba(0,0,0,0.14),0 3px 14px 2px rgba(0,0,0,0.12),0 5px 5px -3px rgba(0,0,0,0.2)}.z-depth-4{-webkit-box-shadow:0 16px 24px 2px rgba(0,0,0,0.14),0 6px 30px 5px rgba(0,0,0,0.12),0 8px 10px -7px rgba(0,0,0,0.2);box-shadow:0 16px 24px 2px rgba(0,0,0,0.14),0 6px 30px 5px rgba(0,0,0,0.12),0 8px 10px -7px rgba(0,0,0,0.2)}.z-depth-5,.modal{-webkit-box-shadow:0 24px 38px 3px rgba(0,0,0,0.14),0 9px 46px 8px rgba(0,0,0,0.12),0 11px 15px -7px rgba(0,0,0,0.2);box-shadow:0 24px 38px 3px rgba(0,0,0,0.14),0 9px 46px 8px rgba(0,0,0,0.12),0 11px 15px -7px rgba(0,0,0,0.2)}.hoverable{-webkit-transition:-webkit-box-shadow .25s;transition:-webkit-box-shadow .25s;transition:box-shadow .25s;transition:box-shadow .25s, -webkit-box-shadow .25s}.hoverable:hover{-webkit-box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19);box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}.divider{height:1px;overflow:hidden;background-color:#e0e0e0}blockquote{margin:20px 0;padding-left:1.5rem;border-left:5px solid #ee6e73}i{line-height:inherit}i.left{float:left;margin-right:15px}i.right{float:right;margin-left:15px}i.tiny{font-size:1rem}i.small{font-size:2rem}i.medium{font-size:4rem}i.large{font-size:6rem}img.responsive-img,video.responsive-video{max-width:100%;height:auto}.pagination li{display:inline-block;border-radius:2px;text-align:center;vertical-align:top;height:30px}.pagination li a{color:#444;display:inline-block;font-size:1.2rem;padding:0 10px;line-height:30px}.pagination li.active a{color:#fff}.pagination li.active{background-color:#ee6e73}.pagination li.disabled a{cursor:default;color:#999}.pagination li i{font-size:2rem}.pagination li.pages ul li{display:inline-block;float:none}@media only screen and (max-width: 992px){.pagination{width:100%}.pagination li.prev,.pagination li.next{width:10%}.pagination li.pages{width:80%;overflow:hidden;white-space:nowrap}}.breadcrumb{font-size:18px;color:rgba(255,255,255,0.7)}.breadcrumb i,.breadcrumb [class^="mdi-"],.breadcrumb [class*="mdi-"],.breadcrumb i.material-icons{display:inline-block;float:left;font-size:24px}.breadcrumb:before{content:'\E5CC';color:rgba(255,255,255,0.7);vertical-align:top;display:inline-block;font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:25px;margin:0 10px 0 8px;-webkit-font-smoothing:antialiased}.breadcrumb:first-child:before{display:none}.breadcrumb:last-child{color:#fff}.parallax-container{position:relative;overflow:hidden;height:500px}.parallax-container .parallax{position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1}.parallax-container .parallax img{opacity:0;position:absolute;left:50%;bottom:0;min-width:100%;min-height:100%;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);-webkit-transform:translateX(-50%);transform:translateX(-50%)}.pin-top,.pin-bottom{position:relative}.pinned{position:fixed !important}ul.staggered-list li{opacity:0}.fade-in{opacity:0;-webkit-transform-origin:0 50%;transform-origin:0 50%}@media only screen and (max-width: 600px){.hide-on-small-only,.hide-on-small-and-down{display:none !important}}@media only screen and (max-width: 992px){.hide-on-med-and-down{display:none !important}}@media only screen and (min-width: 601px){.hide-on-med-and-up{display:none !important}}@media only screen and (min-width: 600px) and (max-width: 992px){.hide-on-med-only{display:none !important}}@media only screen and (min-width: 993px){.hide-on-large-only{display:none !important}}@media only screen and (min-width: 1201px){.hide-on-extra-large-only{display:none !important}}@media only screen and (min-width: 1201px){.show-on-extra-large{display:block !important}}@media only screen and (min-width: 993px){.show-on-large{display:block !important}}@media only screen and (min-width: 600px) and (max-width: 992px){.show-on-medium{display:block !important}}@media only screen and (max-width: 600px){.show-on-small{display:block !important}}@media only screen and (min-width: 601px){.show-on-medium-and-up{display:block !important}}@media only screen and (max-width: 992px){.show-on-medium-and-down{display:block !important}}@media only screen and (max-width: 600px){.center-on-small-only{text-align:center}}.page-footer{padding-top:20px;color:#fff;background-color:#ee6e73}.page-footer .footer-copyright{overflow:hidden;min-height:50px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:10px 0px;color:rgba(255,255,255,0.8);background-color:rgba(51,51,51,0.08)}table,th,td{border:none}table{width:100%;display:table;border-collapse:collapse;border-spacing:0}table.striped tr{border-bottom:none}table.striped>tbody>tr:nth-child(odd){background-color:rgba(242,242,242,0.5)}table.striped>tbody>tr>td{border-radius:0}table.highlight>tbody>tr{-webkit-transition:background-color .25s ease;transition:background-color .25s ease}table.highlight>tbody>tr:hover{background-color:rgba(242,242,242,0.5)}table.centered thead tr th,table.centered tbody tr td{text-align:center}tr{border-bottom:1px solid rgba(0,0,0,0.12)}td,th{padding:15px 5px;display:table-cell;text-align:left;vertical-align:middle;border-radius:2px}@media only screen and (max-width: 992px){table.responsive-table{width:100%;border-collapse:collapse;border-spacing:0;display:block;position:relative}table.responsive-table td:empty:before{content:'\00a0'}table.responsive-table th,table.responsive-table td{margin:0;vertical-align:top}table.responsive-table th{text-align:left}table.responsive-table thead{display:block;float:left}table.responsive-table thead tr{display:block;padding:0 10px 0 0}table.responsive-table thead tr th::before{content:"\00a0"}table.responsive-table tbody{display:block;width:auto;position:relative;overflow-x:auto;white-space:nowrap}table.responsive-table tbody tr{display:inline-block;vertical-align:top}table.responsive-table th{display:block;text-align:right}table.responsive-table td{display:block;min-height:1.25em;text-align:left}table.responsive-table tr{border-bottom:none;padding:0 10px}table.responsive-table thead{border:0;border-right:1px solid rgba(0,0,0,0.12)}}.collection{margin:.5rem 0 1rem 0;border:1px solid #e0e0e0;border-radius:2px;overflow:hidden;position:relative}.collection .collection-item{background-color:#fff;line-height:1.5rem;padding:10px 20px;margin:0;border-bottom:1px solid #e0e0e0}.collection .collection-item.avatar{min-height:84px;padding-left:72px;position:relative}.collection .collection-item.avatar:not(.circle-clipper)>.circle,.collection .collection-item.avatar :not(.circle-clipper)>.circle{position:absolute;width:42px;height:42px;overflow:hidden;left:15px;display:inline-block;vertical-align:middle}.collection .collection-item.avatar i.circle{font-size:18px;line-height:42px;color:#fff;background-color:#999;text-align:center}.collection .collection-item.avatar .title{font-size:16px}.collection .collection-item.avatar p{margin:0}.collection .collection-item.avatar .secondary-content{position:absolute;top:16px;right:16px}.collection .collection-item:last-child{border-bottom:none}.collection .collection-item.active{background-color:#26a69a;color:#eafaf9}.collection .collection-item.active .secondary-content{color:#fff}.collection a.collection-item{display:block;-webkit-transition:.25s;transition:.25s;color:#26a69a}.collection a.collection-item:not(.active):hover{background-color:#ddd}.collection.with-header .collection-header{background-color:#fff;border-bottom:1px solid #e0e0e0;padding:10px 20px}.collection.with-header .collection-item{padding-left:30px}.collection.with-header .collection-item.avatar{padding-left:72px}.secondary-content{float:right;color:#26a69a}.collapsible .collection{margin:0;border:none}.video-container{position:relative;padding-bottom:56.25%;height:0;overflow:hidden}.video-container iframe,.video-container object,.video-container embed{position:absolute;top:0;left:0;width:100%;height:100%}.progress{position:relative;height:4px;display:block;width:100%;background-color:#acece6;border-radius:2px;margin:.5rem 0 1rem 0;overflow:hidden}.progress .determinate{position:absolute;top:0;left:0;bottom:0;background-color:#26a69a;-webkit-transition:width .3s linear;transition:width .3s linear}.progress .indeterminate{background-color:#26a69a}.progress .indeterminate:before{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;-webkit-animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}.progress .indeterminate:after{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;-webkit-animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;-webkit-animation-delay:1.15s;animation-delay:1.15s}@-webkit-keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@-webkit-keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}.hide{display:none !important}.left-align{text-align:left}.right-align{text-align:right}.center,.center-align{text-align:center}.left{float:left !important}.right{float:right !important}.no-select,input[type=range],input[type=range]+.thumb{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.circle{border-radius:50%}.center-block{display:block;margin-left:auto;margin-right:auto}.truncate{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-padding{padding:0 !important}span.badge{min-width:3rem;padding:0 6px;margin-left:14px;text-align:center;font-size:1rem;line-height:22px;height:22px;color:#757575;float:right;-webkit-box-sizing:border-box;box-sizing:border-box}span.badge.new{font-weight:300;font-size:0.8rem;color:#fff;background-color:#26a69a;border-radius:2px}span.badge.new:after{content:" new"}span.badge[data-badge-caption]::after{content:" " attr(data-badge-caption)}nav ul a span.badge{display:inline-block;float:none;margin-left:4px;line-height:22px;height:22px;-webkit-font-smoothing:auto}.collection-item span.badge{margin-top:calc(.75rem - 11px)}.collapsible span.badge{margin-left:auto}.sidenav span.badge{margin-top:calc(24px - 11px)}table span.badge{display:inline-block;float:none;margin-left:auto}.material-icons{text-rendering:optimizeLegibility;-webkit-font-feature-settings:'liga';-moz-font-feature-settings:'liga';font-feature-settings:'liga'}.container{margin:0 auto;max-width:1280px;width:90%}@media only screen and (min-width: 601px){.container{width:85%}}@media only screen and (min-width: 993px){.container{width:70%}}.col .row{margin-left:-.75rem;margin-right:-.75rem}.section{padding-top:1rem;padding-bottom:1rem}.section.no-pad{padding:0}.section.no-pad-bot{padding-bottom:0}.section.no-pad-top{padding-top:0}.row{margin-left:auto;margin-right:auto;margin-bottom:20px}.row:after{content:"";display:table;clear:both}.row .col{float:left;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0 .75rem;min-height:1px}.row .col[class*="push-"],.row .col[class*="pull-"]{position:relative}.row .col.s1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.s4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.s7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.s10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-s1{margin-left:8.3333333333%}.row .col.pull-s1{right:8.3333333333%}.row .col.push-s1{left:8.3333333333%}.row .col.offset-s2{margin-left:16.6666666667%}.row .col.pull-s2{right:16.6666666667%}.row .col.push-s2{left:16.6666666667%}.row .col.offset-s3{margin-left:25%}.row .col.pull-s3{right:25%}.row .col.push-s3{left:25%}.row .col.offset-s4{margin-left:33.3333333333%}.row .col.pull-s4{right:33.3333333333%}.row .col.push-s4{left:33.3333333333%}.row .col.offset-s5{margin-left:41.6666666667%}.row .col.pull-s5{right:41.6666666667%}.row .col.push-s5{left:41.6666666667%}.row .col.offset-s6{margin-left:50%}.row .col.pull-s6{right:50%}.row .col.push-s6{left:50%}.row .col.offset-s7{margin-left:58.3333333333%}.row .col.pull-s7{right:58.3333333333%}.row .col.push-s7{left:58.3333333333%}.row .col.offset-s8{margin-left:66.6666666667%}.row .col.pull-s8{right:66.6666666667%}.row .col.push-s8{left:66.6666666667%}.row .col.offset-s9{margin-left:75%}.row .col.pull-s9{right:75%}.row .col.push-s9{left:75%}.row .col.offset-s10{margin-left:83.3333333333%}.row .col.pull-s10{right:83.3333333333%}.row .col.push-s10{left:83.3333333333%}.row .col.offset-s11{margin-left:91.6666666667%}.row .col.pull-s11{right:91.6666666667%}.row .col.push-s11{left:91.6666666667%}.row .col.offset-s12{margin-left:100%}.row .col.pull-s12{right:100%}.row .col.push-s12{left:100%}@media only screen and (min-width: 601px){.row .col.m1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.m4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.m7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.m10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-m1{margin-left:8.3333333333%}.row .col.pull-m1{right:8.3333333333%}.row .col.push-m1{left:8.3333333333%}.row .col.offset-m2{margin-left:16.6666666667%}.row .col.pull-m2{right:16.6666666667%}.row .col.push-m2{left:16.6666666667%}.row .col.offset-m3{margin-left:25%}.row .col.pull-m3{right:25%}.row .col.push-m3{left:25%}.row .col.offset-m4{margin-left:33.3333333333%}.row .col.pull-m4{right:33.3333333333%}.row .col.push-m4{left:33.3333333333%}.row .col.offset-m5{margin-left:41.6666666667%}.row .col.pull-m5{right:41.6666666667%}.row .col.push-m5{left:41.6666666667%}.row .col.offset-m6{margin-left:50%}.row .col.pull-m6{right:50%}.row .col.push-m6{left:50%}.row .col.offset-m7{margin-left:58.3333333333%}.row .col.pull-m7{right:58.3333333333%}.row .col.push-m7{left:58.3333333333%}.row .col.offset-m8{margin-left:66.6666666667%}.row .col.pull-m8{right:66.6666666667%}.row .col.push-m8{left:66.6666666667%}.row .col.offset-m9{margin-left:75%}.row .col.pull-m9{right:75%}.row .col.push-m9{left:75%}.row .col.offset-m10{margin-left:83.3333333333%}.row .col.pull-m10{right:83.3333333333%}.row .col.push-m10{left:83.3333333333%}.row .col.offset-m11{margin-left:91.6666666667%}.row .col.pull-m11{right:91.6666666667%}.row .col.push-m11{left:91.6666666667%}.row .col.offset-m12{margin-left:100%}.row .col.pull-m12{right:100%}.row .col.push-m12{left:100%}}@media only screen and (min-width: 993px){.row .col.l1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.l4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.l7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.l10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-l1{margin-left:8.3333333333%}.row .col.pull-l1{right:8.3333333333%}.row .col.push-l1{left:8.3333333333%}.row .col.offset-l2{margin-left:16.6666666667%}.row .col.pull-l2{right:16.6666666667%}.row .col.push-l2{left:16.6666666667%}.row .col.offset-l3{margin-left:25%}.row .col.pull-l3{right:25%}.row .col.push-l3{left:25%}.row .col.offset-l4{margin-left:33.3333333333%}.row .col.pull-l4{right:33.3333333333%}.row .col.push-l4{left:33.3333333333%}.row .col.offset-l5{margin-left:41.6666666667%}.row .col.pull-l5{right:41.6666666667%}.row .col.push-l5{left:41.6666666667%}.row .col.offset-l6{margin-left:50%}.row .col.pull-l6{right:50%}.row .col.push-l6{left:50%}.row .col.offset-l7{margin-left:58.3333333333%}.row .col.pull-l7{right:58.3333333333%}.row .col.push-l7{left:58.3333333333%}.row .col.offset-l8{margin-left:66.6666666667%}.row .col.pull-l8{right:66.6666666667%}.row .col.push-l8{left:66.6666666667%}.row .col.offset-l9{margin-left:75%}.row .col.pull-l9{right:75%}.row .col.push-l9{left:75%}.row .col.offset-l10{margin-left:83.3333333333%}.row .col.pull-l10{right:83.3333333333%}.row .col.push-l10{left:83.3333333333%}.row .col.offset-l11{margin-left:91.6666666667%}.row .col.pull-l11{right:91.6666666667%}.row .col.push-l11{left:91.6666666667%}.row .col.offset-l12{margin-left:100%}.row .col.pull-l12{right:100%}.row .col.push-l12{left:100%}}@media only screen and (min-width: 1201px){.row .col.xl1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.xl4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.xl7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.xl10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-xl1{margin-left:8.3333333333%}.row .col.pull-xl1{right:8.3333333333%}.row .col.push-xl1{left:8.3333333333%}.row .col.offset-xl2{margin-left:16.6666666667%}.row .col.pull-xl2{right:16.6666666667%}.row .col.push-xl2{left:16.6666666667%}.row .col.offset-xl3{margin-left:25%}.row .col.pull-xl3{right:25%}.row .col.push-xl3{left:25%}.row .col.offset-xl4{margin-left:33.3333333333%}.row .col.pull-xl4{right:33.3333333333%}.row .col.push-xl4{left:33.3333333333%}.row .col.offset-xl5{margin-left:41.6666666667%}.row .col.pull-xl5{right:41.6666666667%}.row .col.push-xl5{left:41.6666666667%}.row .col.offset-xl6{margin-left:50%}.row .col.pull-xl6{right:50%}.row .col.push-xl6{left:50%}.row .col.offset-xl7{margin-left:58.3333333333%}.row .col.pull-xl7{right:58.3333333333%}.row .col.push-xl7{left:58.3333333333%}.row .col.offset-xl8{margin-left:66.6666666667%}.row .col.pull-xl8{right:66.6666666667%}.row .col.push-xl8{left:66.6666666667%}.row .col.offset-xl9{margin-left:75%}.row .col.pull-xl9{right:75%}.row .col.push-xl9{left:75%}.row .col.offset-xl10{margin-left:83.3333333333%}.row .col.pull-xl10{right:83.3333333333%}.row .col.push-xl10{left:83.3333333333%}.row .col.offset-xl11{margin-left:91.6666666667%}.row .col.pull-xl11{right:91.6666666667%}.row .col.push-xl11{left:91.6666666667%}.row .col.offset-xl12{margin-left:100%}.row .col.pull-xl12{right:100%}.row .col.push-xl12{left:100%}}nav{color:#fff;background-color:#ee6e73;width:100%;height:56px;line-height:56px}nav.nav-extended{height:auto}nav.nav-extended .nav-wrapper{min-height:56px;height:auto}nav.nav-extended .nav-content{position:relative;line-height:normal}nav a{color:#fff}nav i,nav [class^="mdi-"],nav [class*="mdi-"],nav i.material-icons{display:block;font-size:24px;height:56px;line-height:56px}nav .nav-wrapper{position:relative;height:100%}@media only screen and (min-width: 993px){nav a.sidenav-trigger{display:none}}nav .sidenav-trigger{float:left;position:relative;z-index:1;height:56px;margin:0 18px}nav .sidenav-trigger i{height:56px;line-height:56px}nav .brand-logo{position:absolute;color:#fff;display:inline-block;font-size:2.1rem;padding:0}nav .brand-logo.center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}@media only screen and (max-width: 992px){nav .brand-logo{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}nav .brand-logo.left,nav .brand-logo.right{padding:0;-webkit-transform:none;transform:none}nav .brand-logo.left{left:0.5rem}nav .brand-logo.right{right:0.5rem;left:auto}}nav .brand-logo.right{right:0.5rem;padding:0}nav .brand-logo i,nav .brand-logo [class^="mdi-"],nav .brand-logo [class*="mdi-"],nav .brand-logo i.material-icons{float:left;margin-right:15px}nav .nav-title{display:inline-block;font-size:32px;padding:28px 0}nav ul{margin:0}nav ul li{-webkit-transition:background-color .3s;transition:background-color .3s;float:left;padding:0}nav ul li.active{background-color:rgba(0,0,0,0.1)}nav ul a{-webkit-transition:background-color .3s;transition:background-color .3s;font-size:1rem;color:#fff;display:block;padding:0 15px;cursor:pointer}nav ul a.btn,nav ul a.btn-large,nav ul a.btn-small,nav ul a.btn-large,nav ul a.btn-flat,nav ul a.btn-floating{margin-top:-2px;margin-left:15px;margin-right:15px}nav ul a.btn>.material-icons,nav ul a.btn-large>.material-icons,nav ul a.btn-small>.material-icons,nav ul a.btn-large>.material-icons,nav ul a.btn-flat>.material-icons,nav ul a.btn-floating>.material-icons{height:inherit;line-height:inherit}nav ul a:hover{background-color:rgba(0,0,0,0.1)}nav ul.left{float:left}nav form{height:100%}nav .input-field{margin:0;height:100%}nav .input-field input{height:100%;font-size:1.2rem;border:none;padding-left:2rem}nav .input-field input:focus,nav .input-field input[type=text]:valid,nav .input-field input[type=password]:valid,nav .input-field input[type=email]:valid,nav .input-field input[type=url]:valid,nav .input-field input[type=date]:valid{border:none;-webkit-box-shadow:none;box-shadow:none}nav .input-field label{top:0;left:0}nav .input-field label i{color:rgba(255,255,255,0.7);-webkit-transition:color .3s;transition:color .3s}nav .input-field label.active i{color:#fff}.navbar-fixed{position:relative;height:56px;z-index:997}.navbar-fixed nav{position:fixed}@media only screen and (min-width: 601px){nav.nav-extended .nav-wrapper{min-height:64px}nav,nav .nav-wrapper i,nav a.sidenav-trigger,nav a.sidenav-trigger i{height:64px;line-height:64px}.navbar-fixed{height:64px}}a{text-decoration:none}html{line-height:1.5;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-weight:normal;color:rgba(0,0,0,0.87)}@media only screen and (min-width: 0){html{font-size:14px}}@media only screen and (min-width: 992px){html{font-size:14.5px}}@media only screen and (min-width: 1200px){html{font-size:15px}}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.3}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{font-size:4.2rem;line-height:110%;margin:2.8rem 0 1.68rem 0}h2{font-size:3.56rem;line-height:110%;margin:2.3733333333rem 0 1.424rem 0}h3{font-size:2.92rem;line-height:110%;margin:1.9466666667rem 0 1.168rem 0}h4{font-size:2.28rem;line-height:110%;margin:1.52rem 0 .912rem 0}h5{font-size:1.64rem;line-height:110%;margin:1.0933333333rem 0 .656rem 0}h6{font-size:1.15rem;line-height:110%;margin:.7666666667rem 0 .46rem 0}em{font-style:italic}strong{font-weight:500}small{font-size:75%}.light{font-weight:300}.thin{font-weight:200}@media only screen and (min-width: 360px){.flow-text{font-size:1.2rem}}@media only screen and (min-width: 390px){.flow-text{font-size:1.224rem}}@media only screen and (min-width: 420px){.flow-text{font-size:1.248rem}}@media only screen and (min-width: 450px){.flow-text{font-size:1.272rem}}@media only screen and (min-width: 480px){.flow-text{font-size:1.296rem}}@media only screen and (min-width: 510px){.flow-text{font-size:1.32rem}}@media only screen and (min-width: 540px){.flow-text{font-size:1.344rem}}@media only screen and (min-width: 570px){.flow-text{font-size:1.368rem}}@media only screen and (min-width: 600px){.flow-text{font-size:1.392rem}}@media only screen and (min-width: 630px){.flow-text{font-size:1.416rem}}@media only screen and (min-width: 660px){.flow-text{font-size:1.44rem}}@media only screen and (min-width: 690px){.flow-text{font-size:1.464rem}}@media only screen and (min-width: 720px){.flow-text{font-size:1.488rem}}@media only screen and (min-width: 750px){.flow-text{font-size:1.512rem}}@media only screen and (min-width: 780px){.flow-text{font-size:1.536rem}}@media only screen and (min-width: 810px){.flow-text{font-size:1.56rem}}@media only screen and (min-width: 840px){.flow-text{font-size:1.584rem}}@media only screen and (min-width: 870px){.flow-text{font-size:1.608rem}}@media only screen and (min-width: 900px){.flow-text{font-size:1.632rem}}@media only screen and (min-width: 930px){.flow-text{font-size:1.656rem}}@media only screen and (min-width: 960px){.flow-text{font-size:1.68rem}}@media only screen and (max-width: 360px){.flow-text{font-size:1.2rem}}.scale-transition{-webkit-transition:-webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;transition:-webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;transition:transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;transition:transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63), -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important}.scale-transition.scale-out{-webkit-transform:scale(0);transform:scale(0);-webkit-transition:-webkit-transform .2s !important;transition:-webkit-transform .2s !important;transition:transform .2s !important;transition:transform .2s, -webkit-transform .2s !important}.scale-transition.scale-in{-webkit-transform:scale(1);transform:scale(1)}.card-panel{-webkit-transition:-webkit-box-shadow .25s;transition:-webkit-box-shadow .25s;transition:box-shadow .25s;transition:box-shadow .25s, -webkit-box-shadow .25s;padding:24px;margin:.5rem 0 1rem 0;border-radius:2px;background-color:#fff}.card{position:relative;margin:.5rem 0 1rem 0;background-color:#fff;-webkit-transition:-webkit-box-shadow .25s;transition:-webkit-box-shadow .25s;transition:box-shadow .25s;transition:box-shadow .25s, -webkit-box-shadow .25s;border-radius:2px}.card .card-title{font-size:24px;font-weight:300}.card .card-title.activator{cursor:pointer}.card.small,.card.medium,.card.large{position:relative}.card.small .card-image,.card.medium .card-image,.card.large .card-image{max-height:60%;overflow:hidden}.card.small .card-image+.card-content,.card.medium .card-image+.card-content,.card.large .card-image+.card-content{max-height:40%}.card.small .card-content,.card.medium .card-content,.card.large .card-content{max-height:100%;overflow:hidden}.card.small .card-action,.card.medium .card-action,.card.large .card-action{position:absolute;bottom:0;left:0;right:0}.card.small{height:300px}.card.medium{height:400px}.card.large{height:500px}.card.horizontal{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.card.horizontal.small .card-image,.card.horizontal.medium .card-image,.card.horizontal.large .card-image{height:100%;max-height:none;overflow:visible}.card.horizontal.small .card-image img,.card.horizontal.medium .card-image img,.card.horizontal.large .card-image img{height:100%}.card.horizontal .card-image{max-width:50%}.card.horizontal .card-image img{border-radius:2px 0 0 2px;max-width:100%;width:auto}.card.horizontal .card-stacked{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.card.horizontal .card-stacked .card-content{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.card.sticky-action .card-action{z-index:2}.card.sticky-action .card-reveal{z-index:1;padding-bottom:64px}.card .card-image{position:relative}.card .card-image img{display:block;border-radius:2px 2px 0 0;position:relative;left:0;right:0;top:0;bottom:0;width:100%}.card .card-image .card-title{color:#fff;position:absolute;bottom:0;left:0;max-width:100%;padding:24px}.card .card-content{padding:24px;border-radius:0 0 2px 2px}.card .card-content p{margin:0}.card .card-content .card-title{display:block;line-height:32px;margin-bottom:8px}.card .card-content .card-title i{line-height:32px}.card .card-action{background-color:inherit;border-top:1px solid rgba(160,160,160,0.2);position:relative;padding:16px 24px}.card .card-action:last-child{border-radius:0 0 2px 2px}.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating){color:#ffab40;margin-right:24px;-webkit-transition:color .3s ease;transition:color .3s ease;text-transform:uppercase}.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating):hover{color:#ffd8a6}.card .card-reveal{padding:24px;position:absolute;background-color:#fff;width:100%;overflow-y:auto;left:0;top:100%;height:100%;z-index:3;display:none}.card .card-reveal .card-title{cursor:pointer;display:block}#toast-container{display:block;position:fixed;z-index:10000}@media only screen and (max-width: 600px){#toast-container{min-width:100%;bottom:0%}}@media only screen and (min-width: 601px) and (max-width: 992px){#toast-container{left:5%;bottom:7%;max-width:90%}}@media only screen and (min-width: 993px){#toast-container{top:10%;right:7%;max-width:86%}}.toast{border-radius:2px;top:35px;width:auto;margin-top:10px;position:relative;max-width:100%;height:auto;min-height:48px;line-height:1.5em;background-color:#323232;padding:10px 25px;font-size:1.1rem;font-weight:300;color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;cursor:default}.toast .toast-action{color:#eeff41;font-weight:500;margin-right:-25px;margin-left:3rem}.toast.rounded{border-radius:24px}@media only screen and (max-width: 600px){.toast{width:100%;border-radius:0}}.tabs{position:relative;overflow-x:auto;overflow-y:hidden;height:48px;width:100%;background-color:#fff;margin:0 auto;white-space:nowrap}.tabs.tabs-transparent{background-color:transparent}.tabs.tabs-transparent .tab a,.tabs.tabs-transparent .tab.disabled a,.tabs.tabs-transparent .tab.disabled a:hover{color:rgba(255,255,255,0.7)}.tabs.tabs-transparent .tab a:hover,.tabs.tabs-transparent .tab a.active{color:#fff}.tabs.tabs-transparent .indicator{background-color:#fff}.tabs.tabs-fixed-width{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs.tabs-fixed-width .tab{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab{display:inline-block;text-align:center;line-height:48px;height:48px;padding:0;margin:0;text-transform:uppercase}.tabs .tab a{color:rgba(238,110,115,0.7);display:block;width:100%;height:100%;padding:0 24px;font-size:14px;text-overflow:ellipsis;overflow:hidden;-webkit-transition:color .28s ease, background-color .28s ease;transition:color .28s ease, background-color .28s ease}.tabs .tab a:focus,.tabs .tab a:focus.active{background-color:rgba(246,178,181,0.2);outline:none}.tabs .tab a:hover,.tabs .tab a.active{background-color:transparent;color:#ee6e73}.tabs .tab.disabled a,.tabs .tab.disabled a:hover{color:rgba(238,110,115,0.4);cursor:default}.tabs .indicator{position:absolute;bottom:0;height:2px;background-color:#f6b2b5;will-change:left, right}@media only screen and (max-width: 992px){.tabs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs .tab{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab a{padding:0 12px}}.material-tooltip{padding:10px 8px;font-size:1rem;z-index:2000;background-color:transparent;border-radius:2px;color:#fff;min-height:36px;line-height:120%;opacity:0;position:absolute;text-align:center;max-width:calc(100% - 4px);overflow:hidden;left:0;top:0;pointer-events:none;visibility:hidden;background-color:#323232}.backdrop{position:absolute;opacity:0;height:7px;width:14px;border-radius:0 0 50% 50%;background-color:#323232;z-index:-1;-webkit-transform-origin:50% 0%;transform-origin:50% 0%;visibility:hidden}.btn,.btn-large,.btn-small,.btn-flat{border:none;border-radius:2px;display:inline-block;height:36px;line-height:36px;padding:0 16px;text-transform:uppercase;vertical-align:middle;-webkit-tap-highlight-color:transparent}.btn.disabled,.disabled.btn-large,.disabled.btn-small,.btn-floating.disabled,.btn-large.disabled,.btn-small.disabled,.btn-flat.disabled,.btn:disabled,.btn-large:disabled,.btn-small:disabled,.btn-floating:disabled,.btn-large:disabled,.btn-small:disabled,.btn-flat:disabled,.btn[disabled],.btn-large[disabled],.btn-small[disabled],.btn-floating[disabled],.btn-large[disabled],.btn-small[disabled],.btn-flat[disabled]{pointer-events:none;background-color:#DFDFDF !important;-webkit-box-shadow:none;box-shadow:none;color:#9F9F9F !important;cursor:default}.btn.disabled:hover,.disabled.btn-large:hover,.disabled.btn-small:hover,.btn-floating.disabled:hover,.btn-large.disabled:hover,.btn-small.disabled:hover,.btn-flat.disabled:hover,.btn:disabled:hover,.btn-large:disabled:hover,.btn-small:disabled:hover,.btn-floating:disabled:hover,.btn-large:disabled:hover,.btn-small:disabled:hover,.btn-flat:disabled:hover,.btn[disabled]:hover,.btn-large[disabled]:hover,.btn-small[disabled]:hover,.btn-floating[disabled]:hover,.btn-large[disabled]:hover,.btn-small[disabled]:hover,.btn-flat[disabled]:hover{background-color:#DFDFDF !important;color:#9F9F9F !important}.btn,.btn-large,.btn-small,.btn-floating,.btn-large,.btn-small,.btn-flat{font-size:14px;outline:0}.btn i,.btn-large i,.btn-small i,.btn-floating i,.btn-large i,.btn-small i,.btn-flat i{font-size:1.3rem;line-height:inherit}.btn:focus,.btn-large:focus,.btn-small:focus,.btn-floating:focus{background-color:#1d7d74}.btn,.btn-large,.btn-small{text-decoration:none;color:#fff;background-color:#26a69a;text-align:center;letter-spacing:.5px;-webkit-transition:background-color .2s ease-out;transition:background-color .2s ease-out;cursor:pointer}.btn:hover,.btn-large:hover,.btn-small:hover{background-color:#2bbbad}.btn-floating{display:inline-block;color:#fff;position:relative;overflow:hidden;z-index:1;width:40px;height:40px;line-height:40px;padding:0;background-color:#26a69a;border-radius:50%;-webkit-transition:background-color .3s;transition:background-color .3s;cursor:pointer;vertical-align:middle}.btn-floating:hover{background-color:#26a69a}.btn-floating:before{border-radius:0}.btn-floating.btn-large{width:56px;height:56px;padding:0}.btn-floating.btn-large.halfway-fab{bottom:-28px}.btn-floating.btn-large i{line-height:56px}.btn-floating.btn-small{width:32.4px;height:32.4px}.btn-floating.btn-small.halfway-fab{bottom:-16.2px}.btn-floating.btn-small i{line-height:32.4px}.btn-floating.halfway-fab{position:absolute;right:24px;bottom:-20px}.btn-floating.halfway-fab.left{right:auto;left:24px}.btn-floating i{width:inherit;display:inline-block;text-align:center;color:#fff;font-size:1.6rem;line-height:40px}button.btn-floating{border:none}.fixed-action-btn{position:fixed;right:23px;bottom:23px;padding-top:15px;margin-bottom:0;z-index:997}.fixed-action-btn.active ul{visibility:visible}.fixed-action-btn.direction-left,.fixed-action-btn.direction-right{padding:0 0 0 15px}.fixed-action-btn.direction-left ul,.fixed-action-btn.direction-right ul{text-align:right;right:64px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);height:100%;left:auto;width:500px}.fixed-action-btn.direction-left ul li,.fixed-action-btn.direction-right ul li{display:inline-block;margin:7.5px 15px 0 0}.fixed-action-btn.direction-right{padding:0 15px 0 0}.fixed-action-btn.direction-right ul{text-align:left;direction:rtl;left:64px;right:auto}.fixed-action-btn.direction-right ul li{margin:7.5px 0 0 15px}.fixed-action-btn.direction-bottom{padding:0 0 15px 0}.fixed-action-btn.direction-bottom ul{top:64px;bottom:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.fixed-action-btn.direction-bottom ul li{margin:15px 0 0 0}.fixed-action-btn.toolbar{padding:0;height:56px}.fixed-action-btn.toolbar.active>a i{opacity:0}.fixed-action-btn.toolbar ul{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;top:0;bottom:0;z-index:1}.fixed-action-btn.toolbar ul li{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;display:inline-block;margin:0;height:100%;-webkit-transition:none;transition:none}.fixed-action-btn.toolbar ul li a{display:block;overflow:hidden;position:relative;width:100%;height:100%;background-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#fff;line-height:56px;z-index:1}.fixed-action-btn.toolbar ul li a i{line-height:inherit}.fixed-action-btn ul{left:0;right:0;text-align:center;position:absolute;bottom:64px;margin:0;visibility:hidden}.fixed-action-btn ul li{margin-bottom:15px}.fixed-action-btn ul a.btn-floating{opacity:0}.fixed-action-btn .fab-backdrop{position:absolute;top:0;left:0;z-index:-1;width:40px;height:40px;background-color:#26a69a;border-radius:50%;-webkit-transform:scale(0);transform:scale(0)}.btn-flat{-webkit-box-shadow:none;box-shadow:none;background-color:transparent;color:#343434;cursor:pointer;-webkit-transition:background-color .2s;transition:background-color .2s}.btn-flat:focus,.btn-flat:hover{-webkit-box-shadow:none;box-shadow:none}.btn-flat:focus{background-color:rgba(0,0,0,0.1)}.btn-flat.disabled,.btn-flat.btn-flat[disabled]{background-color:transparent !important;color:#b3b2b2 !important;cursor:default}.btn-large{height:54px;line-height:54px;font-size:15px;padding:0 28px}.btn-large i{font-size:1.6rem}.btn-small{height:32.4px;line-height:32.4px;font-size:13px}.btn-small i{font-size:1.2rem}.btn-block{display:block}.dropdown-content{background-color:#fff;margin:0;display:none;min-width:100px;overflow-y:auto;opacity:0;position:absolute;left:0;top:0;z-index:9999;-webkit-transform-origin:0 0;transform-origin:0 0}.dropdown-content:focus{outline:0}.dropdown-content li{clear:both;color:rgba(0,0,0,0.87);cursor:pointer;min-height:50px;line-height:1.5rem;width:100%;text-align:left}.dropdown-content li:hover,.dropdown-content li.active{background-color:#eee}.dropdown-content li:focus{outline:none}.dropdown-content li.divider{min-height:0;height:1px}.dropdown-content li>a,.dropdown-content li>span{font-size:16px;color:#26a69a;display:block;line-height:22px;padding:14px 16px}.dropdown-content li>span>label{top:1px;left:0;height:18px}.dropdown-content li>a>i{height:inherit;line-height:inherit;float:left;margin:0 24px 0 0;width:24px}body.keyboard-focused .dropdown-content li:focus{background-color:#dadada}.input-field.col .dropdown-content [type="checkbox"]+label{top:1px;left:0;height:18px;-webkit-transform:none;transform:none}.dropdown-trigger{cursor:pointer}/*! - * Waves v0.6.0 - * http://fian.my.id/Waves - * - * Copyright 2014 Alfiana E. Sibuea and other contributors - * Released under the MIT license - * https://github.com/fians/Waves/blob/master/LICENSE - */.waves-effect{position:relative;cursor:pointer;display:inline-block;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;vertical-align:middle;z-index:1;-webkit-transition:.3s ease-out;transition:.3s ease-out}.waves-effect .waves-ripple{position:absolute;border-radius:50%;width:20px;height:20px;margin-top:-10px;margin-left:-10px;opacity:0;background:rgba(0,0,0,0.2);-webkit-transition:all 0.7s ease-out;transition:all 0.7s ease-out;-webkit-transition-property:opacity, -webkit-transform;transition-property:opacity, -webkit-transform;transition-property:transform, opacity;transition-property:transform, opacity, -webkit-transform;-webkit-transform:scale(0);transform:scale(0);pointer-events:none}.waves-effect.waves-light .waves-ripple{background-color:rgba(255,255,255,0.45)}.waves-effect.waves-red .waves-ripple{background-color:rgba(244,67,54,0.7)}.waves-effect.waves-yellow .waves-ripple{background-color:rgba(255,235,59,0.7)}.waves-effect.waves-orange .waves-ripple{background-color:rgba(255,152,0,0.7)}.waves-effect.waves-purple .waves-ripple{background-color:rgba(156,39,176,0.7)}.waves-effect.waves-green .waves-ripple{background-color:rgba(76,175,80,0.7)}.waves-effect.waves-teal .waves-ripple{background-color:rgba(0,150,136,0.7)}.waves-effect input[type="button"],.waves-effect input[type="reset"],.waves-effect input[type="submit"]{border:0;font-style:normal;font-size:inherit;text-transform:inherit;background:none}.waves-effect img{position:relative;z-index:-1}.waves-notransition{-webkit-transition:none !important;transition:none !important}.waves-circle{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.waves-input-wrapper{border-radius:0.2em;vertical-align:bottom}.waves-input-wrapper .waves-button-input{position:relative;top:0;left:0;z-index:1}.waves-circle{text-align:center;width:2.5em;height:2.5em;line-height:2.5em;border-radius:50%;-webkit-mask-image:none}.waves-block{display:block}.waves-effect .waves-ripple{z-index:-1}.modal{display:none;position:fixed;left:0;right:0;background-color:#fafafa;padding:0;max-height:70%;width:55%;margin:auto;overflow-y:auto;border-radius:2px;will-change:top, opacity}.modal:focus{outline:none}@media only screen and (max-width: 992px){.modal{width:80%}}.modal h1,.modal h2,.modal h3,.modal h4{margin-top:0}.modal .modal-content{padding:24px}.modal .modal-close{cursor:pointer}.modal .modal-footer{border-radius:0 0 2px 2px;background-color:#fafafa;padding:4px 6px;height:56px;width:100%;text-align:right}.modal .modal-footer .btn,.modal .modal-footer .btn-large,.modal .modal-footer .btn-small,.modal .modal-footer .btn-flat{margin:6px 0}.modal-overlay{position:fixed;z-index:999;top:-25%;left:0;bottom:0;right:0;height:125%;width:100%;background:#000;display:none;will-change:opacity}.modal.modal-fixed-footer{padding:0;height:70%}.modal.modal-fixed-footer .modal-content{position:absolute;height:calc(100% - 56px);max-height:100%;width:100%;overflow-y:auto}.modal.modal-fixed-footer .modal-footer{border-top:1px solid rgba(0,0,0,0.1);position:absolute;bottom:0}.modal.bottom-sheet{top:auto;bottom:-100%;margin:0;width:100%;max-height:45%;border-radius:0;will-change:bottom, opacity}.collapsible{border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;margin:.5rem 0 1rem 0}.collapsible-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;cursor:pointer;-webkit-tap-highlight-color:transparent;line-height:1.5;padding:1rem;background-color:#fff;border-bottom:1px solid #ddd}.collapsible-header:focus{outline:0}.collapsible-header i{width:2rem;font-size:1.6rem;display:inline-block;text-align:center;margin-right:1rem}.keyboard-focused .collapsible-header:focus{background-color:#eee}.collapsible-body{display:none;border-bottom:1px solid #ddd;-webkit-box-sizing:border-box;box-sizing:border-box;padding:2rem}.sidenav .collapsible,.sidenav.fixed .collapsible{border:none;-webkit-box-shadow:none;box-shadow:none}.sidenav .collapsible li,.sidenav.fixed .collapsible li{padding:0}.sidenav .collapsible-header,.sidenav.fixed .collapsible-header{background-color:transparent;border:none;line-height:inherit;height:inherit;padding:0 16px}.sidenav .collapsible-header:hover,.sidenav.fixed .collapsible-header:hover{background-color:rgba(0,0,0,0.05)}.sidenav .collapsible-header i,.sidenav.fixed .collapsible-header i{line-height:inherit}.sidenav .collapsible-body,.sidenav.fixed .collapsible-body{border:0;background-color:#fff}.sidenav .collapsible-body li a,.sidenav.fixed .collapsible-body li a{padding:0 23.5px 0 31px}.collapsible.popout{border:none;-webkit-box-shadow:none;box-shadow:none}.collapsible.popout>li{-webkit-box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);margin:0 24px;-webkit-transition:margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94)}.collapsible.popout>li.active{-webkit-box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);margin:16px 0}.chip{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,0.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4;margin-bottom:5px;margin-right:5px}.chip:focus{outline:none;background-color:#26a69a;color:#fff}.chip>img{float:left;margin:0 8px 0 -12px;height:32px;width:32px;border-radius:50%}.chip .close{cursor:pointer;float:right;font-size:16px;line-height:32px;padding-left:8px}.chips{border:none;border-bottom:1px solid #9e9e9e;-webkit-box-shadow:none;box-shadow:none;margin:0 0 8px 0;min-height:45px;outline:none;-webkit-transition:all .3s;transition:all .3s}.chips.focus{border-bottom:1px solid #26a69a;-webkit-box-shadow:0 1px 0 0 #26a69a;box-shadow:0 1px 0 0 #26a69a}.chips:hover{cursor:text}.chips .input{background:none;border:0;color:rgba(0,0,0,0.6);display:inline-block;font-size:16px;height:3rem;line-height:32px;outline:0;margin:0;padding:0 !important;width:120px !important}.chips .input:focus{border:0 !important;-webkit-box-shadow:none !important;box-shadow:none !important}.chips .autocomplete-content{margin-top:0;margin-bottom:0}.prefix ~ .chips{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.chips:empty ~ label{font-size:0.8rem;-webkit-transform:translateY(-140%);transform:translateY(-140%)}.materialboxed{display:block;cursor:-webkit-zoom-in;cursor:zoom-in;position:relative;-webkit-transition:opacity .4s;transition:opacity .4s;-webkit-backface-visibility:hidden}.materialboxed:hover:not(.active){opacity:.8}.materialboxed.active{cursor:-webkit-zoom-out;cursor:zoom-out}#materialbox-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#292929;z-index:1000;will-change:opacity}.materialbox-caption{position:fixed;display:none;color:#fff;line-height:50px;bottom:0;left:0;width:100%;text-align:center;padding:0% 15%;height:50px;z-index:1000;-webkit-font-smoothing:antialiased}select:focus{outline:1px solid #c9f3ef}button:focus{outline:none;background-color:#2ab7a9}label{font-size:.8rem;color:#9e9e9e}::-webkit-input-placeholder{color:#d1d1d1}::-moz-placeholder{color:#d1d1d1}:-ms-input-placeholder{color:#d1d1d1}::-ms-input-placeholder{color:#d1d1d1}::placeholder{color:#d1d1d1}input:not([type]),input[type=text]:not(.browser-default),input[type=password]:not(.browser-default),input[type=email]:not(.browser-default),input[type=url]:not(.browser-default),input[type=time]:not(.browser-default),input[type=date]:not(.browser-default),input[type=datetime]:not(.browser-default),input[type=datetime-local]:not(.browser-default),input[type=tel]:not(.browser-default),input[type=number]:not(.browser-default),input[type=search]:not(.browser-default),textarea.materialize-textarea{background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:none;height:3rem;width:100%;font-size:16px;margin:0 0 8px 0;padding:0;-webkit-box-shadow:none;box-shadow:none;-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-transition:border .3s, -webkit-box-shadow .3s;transition:border .3s, -webkit-box-shadow .3s;transition:box-shadow .3s, border .3s;transition:box-shadow .3s, border .3s, -webkit-box-shadow .3s}input:not([type]):disabled,input:not([type])[readonly="readonly"],input[type=text]:not(.browser-default):disabled,input[type=text]:not(.browser-default)[readonly="readonly"],input[type=password]:not(.browser-default):disabled,input[type=password]:not(.browser-default)[readonly="readonly"],input[type=email]:not(.browser-default):disabled,input[type=email]:not(.browser-default)[readonly="readonly"],input[type=url]:not(.browser-default):disabled,input[type=url]:not(.browser-default)[readonly="readonly"],input[type=time]:not(.browser-default):disabled,input[type=time]:not(.browser-default)[readonly="readonly"],input[type=date]:not(.browser-default):disabled,input[type=date]:not(.browser-default)[readonly="readonly"],input[type=datetime]:not(.browser-default):disabled,input[type=datetime]:not(.browser-default)[readonly="readonly"],input[type=datetime-local]:not(.browser-default):disabled,input[type=datetime-local]:not(.browser-default)[readonly="readonly"],input[type=tel]:not(.browser-default):disabled,input[type=tel]:not(.browser-default)[readonly="readonly"],input[type=number]:not(.browser-default):disabled,input[type=number]:not(.browser-default)[readonly="readonly"],input[type=search]:not(.browser-default):disabled,input[type=search]:not(.browser-default)[readonly="readonly"],textarea.materialize-textarea:disabled,textarea.materialize-textarea[readonly="readonly"]{color:rgba(0,0,0,0.42);border-bottom:1px dotted rgba(0,0,0,0.42)}input:not([type]):disabled+label,input:not([type])[readonly="readonly"]+label,input[type=text]:not(.browser-default):disabled+label,input[type=text]:not(.browser-default)[readonly="readonly"]+label,input[type=password]:not(.browser-default):disabled+label,input[type=password]:not(.browser-default)[readonly="readonly"]+label,input[type=email]:not(.browser-default):disabled+label,input[type=email]:not(.browser-default)[readonly="readonly"]+label,input[type=url]:not(.browser-default):disabled+label,input[type=url]:not(.browser-default)[readonly="readonly"]+label,input[type=time]:not(.browser-default):disabled+label,input[type=time]:not(.browser-default)[readonly="readonly"]+label,input[type=date]:not(.browser-default):disabled+label,input[type=date]:not(.browser-default)[readonly="readonly"]+label,input[type=datetime]:not(.browser-default):disabled+label,input[type=datetime]:not(.browser-default)[readonly="readonly"]+label,input[type=datetime-local]:not(.browser-default):disabled+label,input[type=datetime-local]:not(.browser-default)[readonly="readonly"]+label,input[type=tel]:not(.browser-default):disabled+label,input[type=tel]:not(.browser-default)[readonly="readonly"]+label,input[type=number]:not(.browser-default):disabled+label,input[type=number]:not(.browser-default)[readonly="readonly"]+label,input[type=search]:not(.browser-default):disabled+label,input[type=search]:not(.browser-default)[readonly="readonly"]+label,textarea.materialize-textarea:disabled+label,textarea.materialize-textarea[readonly="readonly"]+label{color:rgba(0,0,0,0.42)}input:not([type]):focus:not([readonly]),input[type=text]:not(.browser-default):focus:not([readonly]),input[type=password]:not(.browser-default):focus:not([readonly]),input[type=email]:not(.browser-default):focus:not([readonly]),input[type=url]:not(.browser-default):focus:not([readonly]),input[type=time]:not(.browser-default):focus:not([readonly]),input[type=date]:not(.browser-default):focus:not([readonly]),input[type=datetime]:not(.browser-default):focus:not([readonly]),input[type=datetime-local]:not(.browser-default):focus:not([readonly]),input[type=tel]:not(.browser-default):focus:not([readonly]),input[type=number]:not(.browser-default):focus:not([readonly]),input[type=search]:not(.browser-default):focus:not([readonly]),textarea.materialize-textarea:focus:not([readonly]){border-bottom:1px solid #26a69a;-webkit-box-shadow:0 1px 0 0 #26a69a;box-shadow:0 1px 0 0 #26a69a}input:not([type]):focus:not([readonly])+label,input[type=text]:not(.browser-default):focus:not([readonly])+label,input[type=password]:not(.browser-default):focus:not([readonly])+label,input[type=email]:not(.browser-default):focus:not([readonly])+label,input[type=url]:not(.browser-default):focus:not([readonly])+label,input[type=time]:not(.browser-default):focus:not([readonly])+label,input[type=date]:not(.browser-default):focus:not([readonly])+label,input[type=datetime]:not(.browser-default):focus:not([readonly])+label,input[type=datetime-local]:not(.browser-default):focus:not([readonly])+label,input[type=tel]:not(.browser-default):focus:not([readonly])+label,input[type=number]:not(.browser-default):focus:not([readonly])+label,input[type=search]:not(.browser-default):focus:not([readonly])+label,textarea.materialize-textarea:focus:not([readonly])+label{color:#26a69a}input:not([type]):focus.valid ~ label,input[type=text]:not(.browser-default):focus.valid ~ label,input[type=password]:not(.browser-default):focus.valid ~ label,input[type=email]:not(.browser-default):focus.valid ~ label,input[type=url]:not(.browser-default):focus.valid ~ label,input[type=time]:not(.browser-default):focus.valid ~ label,input[type=date]:not(.browser-default):focus.valid ~ label,input[type=datetime]:not(.browser-default):focus.valid ~ label,input[type=datetime-local]:not(.browser-default):focus.valid ~ label,input[type=tel]:not(.browser-default):focus.valid ~ label,input[type=number]:not(.browser-default):focus.valid ~ label,input[type=search]:not(.browser-default):focus.valid ~ label,textarea.materialize-textarea:focus.valid ~ label{color:#4CAF50}input:not([type]):focus.invalid ~ label,input[type=text]:not(.browser-default):focus.invalid ~ label,input[type=password]:not(.browser-default):focus.invalid ~ label,input[type=email]:not(.browser-default):focus.invalid ~ label,input[type=url]:not(.browser-default):focus.invalid ~ label,input[type=time]:not(.browser-default):focus.invalid ~ label,input[type=date]:not(.browser-default):focus.invalid ~ label,input[type=datetime]:not(.browser-default):focus.invalid ~ label,input[type=datetime-local]:not(.browser-default):focus.invalid ~ label,input[type=tel]:not(.browser-default):focus.invalid ~ label,input[type=number]:not(.browser-default):focus.invalid ~ label,input[type=search]:not(.browser-default):focus.invalid ~ label,textarea.materialize-textarea:focus.invalid ~ label{color:#F44336}input:not([type]).validate+label,input[type=text]:not(.browser-default).validate+label,input[type=password]:not(.browser-default).validate+label,input[type=email]:not(.browser-default).validate+label,input[type=url]:not(.browser-default).validate+label,input[type=time]:not(.browser-default).validate+label,input[type=date]:not(.browser-default).validate+label,input[type=datetime]:not(.browser-default).validate+label,input[type=datetime-local]:not(.browser-default).validate+label,input[type=tel]:not(.browser-default).validate+label,input[type=number]:not(.browser-default).validate+label,input[type=search]:not(.browser-default).validate+label,textarea.materialize-textarea.validate+label{width:100%}input.valid:not([type]),input.valid:not([type]):focus,input.valid[type=text]:not(.browser-default),input.valid[type=text]:not(.browser-default):focus,input.valid[type=password]:not(.browser-default),input.valid[type=password]:not(.browser-default):focus,input.valid[type=email]:not(.browser-default),input.valid[type=email]:not(.browser-default):focus,input.valid[type=url]:not(.browser-default),input.valid[type=url]:not(.browser-default):focus,input.valid[type=time]:not(.browser-default),input.valid[type=time]:not(.browser-default):focus,input.valid[type=date]:not(.browser-default),input.valid[type=date]:not(.browser-default):focus,input.valid[type=datetime]:not(.browser-default),input.valid[type=datetime]:not(.browser-default):focus,input.valid[type=datetime-local]:not(.browser-default),input.valid[type=datetime-local]:not(.browser-default):focus,input.valid[type=tel]:not(.browser-default),input.valid[type=tel]:not(.browser-default):focus,input.valid[type=number]:not(.browser-default),input.valid[type=number]:not(.browser-default):focus,input.valid[type=search]:not(.browser-default),input.valid[type=search]:not(.browser-default):focus,textarea.materialize-textarea.valid,textarea.materialize-textarea.valid:focus,.select-wrapper.valid>input.select-dropdown{border-bottom:1px solid #4CAF50;-webkit-box-shadow:0 1px 0 0 #4CAF50;box-shadow:0 1px 0 0 #4CAF50}input.invalid:not([type]),input.invalid:not([type]):focus,input.invalid[type=text]:not(.browser-default),input.invalid[type=text]:not(.browser-default):focus,input.invalid[type=password]:not(.browser-default),input.invalid[type=password]:not(.browser-default):focus,input.invalid[type=email]:not(.browser-default),input.invalid[type=email]:not(.browser-default):focus,input.invalid[type=url]:not(.browser-default),input.invalid[type=url]:not(.browser-default):focus,input.invalid[type=time]:not(.browser-default),input.invalid[type=time]:not(.browser-default):focus,input.invalid[type=date]:not(.browser-default),input.invalid[type=date]:not(.browser-default):focus,input.invalid[type=datetime]:not(.browser-default),input.invalid[type=datetime]:not(.browser-default):focus,input.invalid[type=datetime-local]:not(.browser-default),input.invalid[type=datetime-local]:not(.browser-default):focus,input.invalid[type=tel]:not(.browser-default),input.invalid[type=tel]:not(.browser-default):focus,input.invalid[type=number]:not(.browser-default),input.invalid[type=number]:not(.browser-default):focus,input.invalid[type=search]:not(.browser-default),input.invalid[type=search]:not(.browser-default):focus,textarea.materialize-textarea.invalid,textarea.materialize-textarea.invalid:focus,.select-wrapper.invalid>input.select-dropdown,.select-wrapper.invalid>input.select-dropdown:focus{border-bottom:1px solid #F44336;-webkit-box-shadow:0 1px 0 0 #F44336;box-shadow:0 1px 0 0 #F44336}input:not([type]).valid ~ .helper-text[data-success],input:not([type]):focus.valid ~ .helper-text[data-success],input:not([type]).invalid ~ .helper-text[data-error],input:not([type]):focus.invalid ~ .helper-text[data-error],input[type=text]:not(.browser-default).valid ~ .helper-text[data-success],input[type=text]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=text]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=text]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=password]:not(.browser-default).valid ~ .helper-text[data-success],input[type=password]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=password]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=password]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=email]:not(.browser-default).valid ~ .helper-text[data-success],input[type=email]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=email]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=email]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=url]:not(.browser-default).valid ~ .helper-text[data-success],input[type=url]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=url]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=url]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=time]:not(.browser-default).valid ~ .helper-text[data-success],input[type=time]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=time]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=time]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=date]:not(.browser-default).valid ~ .helper-text[data-success],input[type=date]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=date]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=date]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=datetime]:not(.browser-default).valid ~ .helper-text[data-success],input[type=datetime]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=datetime]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=datetime-local]:not(.browser-default).valid ~ .helper-text[data-success],input[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=datetime-local]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=tel]:not(.browser-default).valid ~ .helper-text[data-success],input[type=tel]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=tel]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=tel]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=number]:not(.browser-default).valid ~ .helper-text[data-success],input[type=number]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=number]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=number]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=search]:not(.browser-default).valid ~ .helper-text[data-success],input[type=search]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=search]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=search]:not(.browser-default):focus.invalid ~ .helper-text[data-error],textarea.materialize-textarea.valid ~ .helper-text[data-success],textarea.materialize-textarea:focus.valid ~ .helper-text[data-success],textarea.materialize-textarea.invalid ~ .helper-text[data-error],textarea.materialize-textarea:focus.invalid ~ .helper-text[data-error],.select-wrapper.valid .helper-text[data-success],.select-wrapper.invalid ~ .helper-text[data-error]{color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}input:not([type]).valid ~ .helper-text:after,input:not([type]):focus.valid ~ .helper-text:after,input[type=text]:not(.browser-default).valid ~ .helper-text:after,input[type=text]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=password]:not(.browser-default).valid ~ .helper-text:after,input[type=password]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=email]:not(.browser-default).valid ~ .helper-text:after,input[type=email]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=url]:not(.browser-default).valid ~ .helper-text:after,input[type=url]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=time]:not(.browser-default).valid ~ .helper-text:after,input[type=time]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=date]:not(.browser-default).valid ~ .helper-text:after,input[type=date]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=datetime]:not(.browser-default).valid ~ .helper-text:after,input[type=datetime]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default).valid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=tel]:not(.browser-default).valid ~ .helper-text:after,input[type=tel]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=number]:not(.browser-default).valid ~ .helper-text:after,input[type=number]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=search]:not(.browser-default).valid ~ .helper-text:after,input[type=search]:not(.browser-default):focus.valid ~ .helper-text:after,textarea.materialize-textarea.valid ~ .helper-text:after,textarea.materialize-textarea:focus.valid ~ .helper-text:after,.select-wrapper.valid ~ .helper-text:after{content:attr(data-success);color:#4CAF50}input:not([type]).invalid ~ .helper-text:after,input:not([type]):focus.invalid ~ .helper-text:after,input[type=text]:not(.browser-default).invalid ~ .helper-text:after,input[type=text]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=password]:not(.browser-default).invalid ~ .helper-text:after,input[type=password]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=email]:not(.browser-default).invalid ~ .helper-text:after,input[type=email]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=url]:not(.browser-default).invalid ~ .helper-text:after,input[type=url]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=time]:not(.browser-default).invalid ~ .helper-text:after,input[type=time]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=date]:not(.browser-default).invalid ~ .helper-text:after,input[type=date]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=datetime]:not(.browser-default).invalid ~ .helper-text:after,input[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default).invalid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=tel]:not(.browser-default).invalid ~ .helper-text:after,input[type=tel]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=number]:not(.browser-default).invalid ~ .helper-text:after,input[type=number]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=search]:not(.browser-default).invalid ~ .helper-text:after,input[type=search]:not(.browser-default):focus.invalid ~ .helper-text:after,textarea.materialize-textarea.invalid ~ .helper-text:after,textarea.materialize-textarea:focus.invalid ~ .helper-text:after,.select-wrapper.invalid ~ .helper-text:after{content:attr(data-error);color:#F44336}input:not([type])+label:after,input[type=text]:not(.browser-default)+label:after,input[type=password]:not(.browser-default)+label:after,input[type=email]:not(.browser-default)+label:after,input[type=url]:not(.browser-default)+label:after,input[type=time]:not(.browser-default)+label:after,input[type=date]:not(.browser-default)+label:after,input[type=datetime]:not(.browser-default)+label:after,input[type=datetime-local]:not(.browser-default)+label:after,input[type=tel]:not(.browser-default)+label:after,input[type=number]:not(.browser-default)+label:after,input[type=search]:not(.browser-default)+label:after,textarea.materialize-textarea+label:after,.select-wrapper+label:after{display:block;content:"";position:absolute;top:100%;left:0;opacity:0;-webkit-transition:.2s opacity ease-out, .2s color ease-out;transition:.2s opacity ease-out, .2s color ease-out}.input-field{position:relative;margin-top:1rem;margin-bottom:1rem}.input-field.inline{display:inline-block;vertical-align:middle;margin-left:5px}.input-field.inline input,.input-field.inline .select-dropdown{margin-bottom:1rem}.input-field.col label{left:.75rem}.input-field.col .prefix ~ label,.input-field.col .prefix ~ .validate ~ label{width:calc(100% - 3rem - 1.5rem)}.input-field>label{color:#9e9e9e;position:absolute;top:0;left:0;font-size:1rem;cursor:text;-webkit-transition:color .2s ease-out, -webkit-transform .2s ease-out;transition:color .2s ease-out, -webkit-transform .2s ease-out;transition:transform .2s ease-out, color .2s ease-out;transition:transform .2s ease-out, color .2s ease-out, -webkit-transform .2s ease-out;-webkit-transform-origin:0% 100%;transform-origin:0% 100%;text-align:initial;-webkit-transform:translateY(12px);transform:translateY(12px)}.input-field>label:not(.label-icon).active{-webkit-transform:translateY(-14px) scale(0.8);transform:translateY(-14px) scale(0.8);-webkit-transform-origin:0 0;transform-origin:0 0}.input-field>input[type]:-webkit-autofill:not(.browser-default):not([type="search"])+label,.input-field>input[type=date]:not(.browser-default)+label,.input-field>input[type=time]:not(.browser-default)+label{-webkit-transform:translateY(-14px) scale(0.8);transform:translateY(-14px) scale(0.8);-webkit-transform-origin:0 0;transform-origin:0 0}.input-field .helper-text{position:relative;min-height:18px;display:block;font-size:12px;color:rgba(0,0,0,0.54)}.input-field .helper-text::after{opacity:1;position:absolute;top:0;left:0}.input-field .prefix{position:absolute;width:3rem;font-size:2rem;-webkit-transition:color .2s;transition:color .2s;top:.5rem}.input-field .prefix.active{color:#26a69a}.input-field .prefix ~ input,.input-field .prefix ~ textarea,.input-field .prefix ~ label,.input-field .prefix ~ .validate ~ label,.input-field .prefix ~ .helper-text,.input-field .prefix ~ .autocomplete-content{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.input-field .prefix ~ label{margin-left:3rem}@media only screen and (max-width: 992px){.input-field .prefix ~ input{width:86%;width:calc(100% - 3rem)}}@media only screen and (max-width: 600px){.input-field .prefix ~ input{width:80%;width:calc(100% - 3rem)}}.input-field input[type=search]{display:block;line-height:inherit;-webkit-transition:.3s background-color;transition:.3s background-color}.nav-wrapper .input-field input[type=search]{height:inherit;padding-left:4rem;width:calc(100% - 4rem);border:0;-webkit-box-shadow:none;box-shadow:none}.input-field input[type=search]:focus:not(.browser-default){background-color:#fff;border:0;-webkit-box-shadow:none;box-shadow:none;color:#444}.input-field input[type=search]:focus:not(.browser-default)+label i,.input-field input[type=search]:focus:not(.browser-default) ~ .mdi-navigation-close,.input-field input[type=search]:focus:not(.browser-default) ~ .material-icons{color:#444}.input-field input[type=search]+.label-icon{-webkit-transform:none;transform:none;left:1rem}.input-field input[type=search] ~ .mdi-navigation-close,.input-field input[type=search] ~ .material-icons{position:absolute;top:0;right:1rem;color:transparent;cursor:pointer;font-size:2rem;-webkit-transition:.3s color;transition:.3s color}textarea{width:100%;height:3rem;background-color:transparent}textarea.materialize-textarea{line-height:normal;overflow-y:hidden;padding:.8rem 0 .8rem 0;resize:none;min-height:3rem;-webkit-box-sizing:border-box;box-sizing:border-box}.hiddendiv{visibility:hidden;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word;padding-top:1.2rem;position:absolute;top:0;z-index:-1}.autocomplete-content li .highlight{color:#444}.autocomplete-content li img{height:40px;width:40px;margin:5px 15px}.character-counter{min-height:18px}[type="radio"]:not(:checked),[type="radio"]:checked{position:absolute;opacity:0;pointer-events:none}[type="radio"]:not(:checked)+span,[type="radio"]:checked+span{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-transition:.28s ease;transition:.28s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[type="radio"]+span:before,[type="radio"]+span:after{content:'';position:absolute;left:0;top:0;margin:4px;width:16px;height:16px;z-index:0;-webkit-transition:.28s ease;transition:.28s ease}[type="radio"]:not(:checked)+span:before,[type="radio"]:not(:checked)+span:after,[type="radio"]:checked+span:before,[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:before,[type="radio"].with-gap:checked+span:after{border-radius:50%}[type="radio"]:not(:checked)+span:before,[type="radio"]:not(:checked)+span:after{border:2px solid #5a5a5a}[type="radio"]:not(:checked)+span:after{-webkit-transform:scale(0);transform:scale(0)}[type="radio"]:checked+span:before{border:2px solid transparent}[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:before,[type="radio"].with-gap:checked+span:after{border:2px solid #26a69a}[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:after{background-color:#26a69a}[type="radio"]:checked+span:after{-webkit-transform:scale(1.02);transform:scale(1.02)}[type="radio"].with-gap:checked+span:after{-webkit-transform:scale(0.5);transform:scale(0.5)}[type="radio"].tabbed:focus+span:before{-webkit-box-shadow:0 0 0 10px rgba(0,0,0,0.1);box-shadow:0 0 0 10px rgba(0,0,0,0.1)}[type="radio"].with-gap:disabled:checked+span:before{border:2px solid rgba(0,0,0,0.42)}[type="radio"].with-gap:disabled:checked+span:after{border:none;background-color:rgba(0,0,0,0.42)}[type="radio"]:disabled:not(:checked)+span:before,[type="radio"]:disabled:checked+span:before{background-color:transparent;border-color:rgba(0,0,0,0.42)}[type="radio"]:disabled+span{color:rgba(0,0,0,0.42)}[type="radio"]:disabled:not(:checked)+span:before{border-color:rgba(0,0,0,0.42)}[type="radio"]:disabled:checked+span:after{background-color:rgba(0,0,0,0.42);border-color:#949494}[type="checkbox"]:not(:checked),[type="checkbox"]:checked{position:absolute;opacity:0;pointer-events:none}[type="checkbox"]+span:not(.lever){position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[type="checkbox"]+span:not(.lever):before,[type="checkbox"]:not(.filled-in)+span:not(.lever):after{content:'';position:absolute;top:0;left:0;width:18px;height:18px;z-index:0;border:2px solid #5a5a5a;border-radius:1px;margin-top:3px;-webkit-transition:.2s;transition:.2s}[type="checkbox"]:not(.filled-in)+span:not(.lever):after{border:0;-webkit-transform:scale(0);transform:scale(0)}[type="checkbox"]:not(:checked):disabled+span:not(.lever):before{border:none;background-color:rgba(0,0,0,0.42)}[type="checkbox"].tabbed:focus+span:not(.lever):after{-webkit-transform:scale(1);transform:scale(1);border:0;border-radius:50%;-webkit-box-shadow:0 0 0 10px rgba(0,0,0,0.1);box-shadow:0 0 0 10px rgba(0,0,0,0.1);background-color:rgba(0,0,0,0.1)}[type="checkbox"]:checked+span:not(.lever):before{top:-4px;left:-5px;width:12px;height:22px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #26a69a;border-bottom:2px solid #26a69a;-webkit-transform:rotate(40deg);transform:rotate(40deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"]:checked:disabled+span:before{border-right:2px solid rgba(0,0,0,0.42);border-bottom:2px solid rgba(0,0,0,0.42)}[type="checkbox"]:indeterminate+span:not(.lever):before{top:-11px;left:-12px;width:10px;height:22px;border-top:none;border-left:none;border-right:2px solid #26a69a;border-bottom:none;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"]:indeterminate:disabled+span:not(.lever):before{border-right:2px solid rgba(0,0,0,0.42);background-color:transparent}[type="checkbox"].filled-in+span:not(.lever):after{border-radius:2px}[type="checkbox"].filled-in+span:not(.lever):before,[type="checkbox"].filled-in+span:not(.lever):after{content:'';left:0;position:absolute;-webkit-transition:border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;transition:border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;z-index:1}[type="checkbox"].filled-in:not(:checked)+span:not(.lever):before{width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"].filled-in:not(:checked)+span:not(.lever):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0px;z-index:0}[type="checkbox"].filled-in:checked+span:not(.lever):before{top:0;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"].filled-in:checked+span:not(.lever):after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}[type="checkbox"].filled-in.tabbed:focus+span:not(.lever):after{border-radius:2px;border-color:#5a5a5a;background-color:rgba(0,0,0,0.1)}[type="checkbox"].filled-in.tabbed:checked:focus+span:not(.lever):after{border-radius:2px;background-color:#26a69a;border-color:#26a69a}[type="checkbox"].filled-in:disabled:not(:checked)+span:not(.lever):before{background-color:transparent;border:2px solid transparent}[type="checkbox"].filled-in:disabled:not(:checked)+span:not(.lever):after{border-color:transparent;background-color:#949494}[type="checkbox"].filled-in:disabled:checked+span:not(.lever):before{background-color:transparent}[type="checkbox"].filled-in:disabled:checked+span:not(.lever):after{background-color:#949494;border-color:#949494}.switch,.switch *{-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch label{cursor:pointer}.switch label input[type=checkbox]{opacity:0;width:0;height:0}.switch label input[type=checkbox]:checked+.lever{background-color:#84c7c1}.switch label input[type=checkbox]:checked+.lever:before,.switch label input[type=checkbox]:checked+.lever:after{left:18px}.switch label input[type=checkbox]:checked+.lever:after{background-color:#26a69a}.switch label .lever{content:"";display:inline-block;position:relative;width:36px;height:14px;background-color:rgba(0,0,0,0.38);border-radius:15px;margin-right:10px;-webkit-transition:background 0.3s ease;transition:background 0.3s ease;vertical-align:middle;margin:0 16px}.switch label .lever:before,.switch label .lever:after{content:"";position:absolute;display:inline-block;width:20px;height:20px;border-radius:50%;left:0;top:-3px;-webkit-transition:left 0.3s ease, background .3s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease;transition:left 0.3s ease, background .3s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease;transition:left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease;transition:left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease}.switch label .lever:before{background-color:rgba(38,166,154,0.15)}.switch label .lever:after{background-color:#F1F1F1;-webkit-box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)}input[type=checkbox]:checked:not(:disabled) ~ .lever:active::before,input[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::before{-webkit-transform:scale(2.4);transform:scale(2.4);background-color:rgba(38,166,154,0.15)}input[type=checkbox]:not(:disabled) ~ .lever:active:before,input[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::before{-webkit-transform:scale(2.4);transform:scale(2.4);background-color:rgba(0,0,0,0.08)}.switch input[type=checkbox][disabled]+.lever{cursor:default;background-color:rgba(0,0,0,0.12)}.switch label input[type=checkbox][disabled]+.lever:after,.switch label input[type=checkbox][disabled]:checked+.lever:after{background-color:#949494}select{display:none}select.browser-default{display:block}select{background-color:rgba(255,255,255,0.9);width:100%;padding:5px;border:1px solid #f2f2f2;border-radius:2px;height:3rem}.select-label{position:absolute}.select-wrapper{position:relative}.select-wrapper.valid+label,.select-wrapper.invalid+label{width:100%;pointer-events:none}.select-wrapper input.select-dropdown{position:relative;cursor:pointer;background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;outline:none;height:3rem;line-height:3rem;width:100%;font-size:16px;margin:0 0 8px 0;padding:0;display:block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}.select-wrapper input.select-dropdown:focus{border-bottom:1px solid #26a69a}.select-wrapper .caret{position:absolute;right:0;top:0;bottom:0;margin:auto 0;z-index:0;fill:rgba(0,0,0,0.87)}.select-wrapper+label{position:absolute;top:-26px;font-size:.8rem}select:disabled{color:rgba(0,0,0,0.42)}.select-wrapper.disabled+label{color:rgba(0,0,0,0.42)}.select-wrapper.disabled .caret{fill:rgba(0,0,0,0.42)}.select-wrapper input.select-dropdown:disabled{color:rgba(0,0,0,0.42);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select-wrapper i{color:rgba(0,0,0,0.3)}.select-dropdown li.disabled,.select-dropdown li.disabled>span,.select-dropdown li.optgroup{color:rgba(0,0,0,0.3);background-color:transparent}body.keyboard-focused .select-dropdown.dropdown-content li:focus{background-color:rgba(0,0,0,0.08)}.select-dropdown.dropdown-content li:hover{background-color:rgba(0,0,0,0.08)}.select-dropdown.dropdown-content li.selected{background-color:rgba(0,0,0,0.03)}.prefix ~ .select-wrapper{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.prefix ~ label{margin-left:3rem}.select-dropdown li img{height:40px;width:40px;margin:5px 15px;float:right}.select-dropdown li.optgroup{border-top:1px solid #eee}.select-dropdown li.optgroup.selected>span{color:rgba(0,0,0,0.7)}.select-dropdown li.optgroup>span{color:rgba(0,0,0,0.4)}.select-dropdown li.optgroup ~ li.optgroup-option{padding-left:1rem}.file-field{position:relative}.file-field .file-path-wrapper{overflow:hidden;padding-left:10px}.file-field input.file-path{width:100%}.file-field .btn,.file-field .btn-large,.file-field .btn-small{float:left;height:3rem;line-height:3rem}.file-field span{cursor:pointer}.file-field input[type=file]{position:absolute;top:0;right:0;left:0;bottom:0;width:100%;margin:0;padding:0;font-size:20px;cursor:pointer;opacity:0;filter:alpha(opacity=0)}.file-field input[type=file]::-webkit-file-upload-button{display:none}.range-field{position:relative}input[type=range],input[type=range]+.thumb{cursor:pointer}input[type=range]{position:relative;background-color:transparent;border:none;outline:none;width:100%;margin:15px 0;padding:0}input[type=range]:focus{outline:none}input[type=range]+.thumb{position:absolute;top:10px;left:0;border:none;height:0;width:0;border-radius:50%;background-color:#26a69a;margin-left:7px;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}input[type=range]+.thumb .value{display:block;width:30px;text-align:center;color:#26a69a;font-size:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}input[type=range]+.thumb.active{border-radius:50% 50% 50% 0}input[type=range]+.thumb.active .value{color:#fff;margin-left:-1px;margin-top:8px;font-size:10px}input[type=range]{-webkit-appearance:none}input[type=range]::-webkit-slider-runnable-track{height:3px;background:#c2c0c2;border:none}input[type=range]::-webkit-slider-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;-webkit-transition:-webkit-box-shadow .3s;transition:-webkit-box-shadow .3s;transition:box-shadow .3s;transition:box-shadow .3s, -webkit-box-shadow .3s;-webkit-appearance:none;background-color:#26a69a;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;margin:-5px 0 0 0}.keyboard-focused input[type=range]:focus:not(.active)::-webkit-slider-thumb{-webkit-box-shadow:0 0 0 10px rgba(38,166,154,0.26);box-shadow:0 0 0 10px rgba(38,166,154,0.26)}input[type=range]{border:1px solid white}input[type=range]::-moz-range-track{height:3px;background:#c2c0c2;border:none}input[type=range]::-moz-focus-inner{border:0}input[type=range]::-moz-range-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;-webkit-transition:-webkit-box-shadow .3s;transition:-webkit-box-shadow .3s;transition:box-shadow .3s;transition:box-shadow .3s, -webkit-box-shadow .3s;margin-top:-5px}input[type=range]:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}.keyboard-focused input[type=range]:focus:not(.active)::-moz-range-thumb{box-shadow:0 0 0 10px rgba(38,166,154,0.26)}input[type=range]::-ms-track{height:3px;background:transparent;border-color:transparent;border-width:6px 0;color:transparent}input[type=range]::-ms-fill-lower{background:#777}input[type=range]::-ms-fill-upper{background:#ddd}input[type=range]::-ms-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;-webkit-transition:-webkit-box-shadow .3s;transition:-webkit-box-shadow .3s;transition:box-shadow .3s;transition:box-shadow .3s, -webkit-box-shadow .3s}.keyboard-focused input[type=range]:focus:not(.active)::-ms-thumb{box-shadow:0 0 0 10px rgba(38,166,154,0.26)}.table-of-contents.fixed{position:fixed}.table-of-contents li{padding:2px 0}.table-of-contents a{display:inline-block;font-weight:300;color:#757575;padding-left:16px;height:1.5rem;line-height:1.5rem;letter-spacing:.4;display:inline-block}.table-of-contents a:hover{color:#a8a8a8;padding-left:15px;border-left:1px solid #ee6e73}.table-of-contents a.active{font-weight:500;padding-left:14px;border-left:2px solid #ee6e73}.sidenav{position:fixed;width:300px;left:0;top:0;margin:0;-webkit-transform:translateX(-100%);transform:translateX(-100%);height:100%;height:calc(100% + 60px);height:-moz-calc(100%);padding-bottom:60px;background-color:#fff;z-index:999;overflow-y:auto;will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateX(-105%);transform:translateX(-105%)}.sidenav.right-aligned{right:0;-webkit-transform:translateX(105%);transform:translateX(105%);left:auto;-webkit-transform:translateX(100%);transform:translateX(100%)}.sidenav .collapsible{margin:0}.sidenav li{float:none;line-height:48px}.sidenav li.active{background-color:rgba(0,0,0,0.05)}.sidenav li>a{color:rgba(0,0,0,0.87);display:block;font-size:14px;font-weight:500;height:48px;line-height:48px;padding:0 32px}.sidenav li>a:hover{background-color:rgba(0,0,0,0.05)}.sidenav li>a.btn,.sidenav li>a.btn-large,.sidenav li>a.btn-small,.sidenav li>a.btn-large,.sidenav li>a.btn-flat,.sidenav li>a.btn-floating{margin:10px 15px}.sidenav li>a.btn,.sidenav li>a.btn-large,.sidenav li>a.btn-small,.sidenav li>a.btn-large,.sidenav li>a.btn-floating{color:#fff}.sidenav li>a.btn-flat{color:#343434}.sidenav li>a.btn:hover,.sidenav li>a.btn-large:hover,.sidenav li>a.btn-small:hover,.sidenav li>a.btn-large:hover{background-color:#2bbbad}.sidenav li>a.btn-floating:hover{background-color:#26a69a}.sidenav li>a>i,.sidenav li>a>[class^="mdi-"],.sidenav li>a li>a>[class*="mdi-"],.sidenav li>a>i.material-icons{float:left;height:48px;line-height:48px;margin:0 32px 0 0;width:24px;color:rgba(0,0,0,0.54)}.sidenav .divider{margin:8px 0 0 0}.sidenav .subheader{cursor:initial;pointer-events:none;color:rgba(0,0,0,0.54);font-size:14px;font-weight:500;line-height:48px}.sidenav .subheader:hover{background-color:transparent}.sidenav .user-view{position:relative;padding:32px 32px 0;margin-bottom:8px}.sidenav .user-view>a{height:auto;padding:0}.sidenav .user-view>a:hover{background-color:transparent}.sidenav .user-view .background{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1}.sidenav .user-view .circle,.sidenav .user-view .name,.sidenav .user-view .email{display:block}.sidenav .user-view .circle{height:64px;width:64px}.sidenav .user-view .name,.sidenav .user-view .email{font-size:14px;line-height:24px}.sidenav .user-view .name{margin-top:16px;font-weight:500}.sidenav .user-view .email{padding-bottom:16px;font-weight:400}.drag-target{height:100%;width:10px;position:fixed;top:0;z-index:998}.drag-target.right-aligned{right:0}.sidenav.sidenav-fixed{left:0;-webkit-transform:translateX(0);transform:translateX(0);position:fixed}.sidenav.sidenav-fixed.right-aligned{right:0;left:auto}@media only screen and (max-width: 992px){.sidenav.sidenav-fixed{-webkit-transform:translateX(-105%);transform:translateX(-105%)}.sidenav.sidenav-fixed.right-aligned{-webkit-transform:translateX(105%);transform:translateX(105%)}.sidenav>a{padding:0 16px}.sidenav .user-view{padding:16px 16px 0}}.sidenav .collapsible-body>ul:not(.collapsible)>li.active,.sidenav.sidenav-fixed .collapsible-body>ul:not(.collapsible)>li.active{background-color:#ee6e73}.sidenav .collapsible-body>ul:not(.collapsible)>li.active a,.sidenav.sidenav-fixed .collapsible-body>ul:not(.collapsible)>li.active a{color:#fff}.sidenav .collapsible-body{padding:0}.sidenav-overlay{position:fixed;top:0;left:0;right:0;opacity:0;height:120vh;background-color:rgba(0,0,0,0.5);z-index:997;display:none}.preloader-wrapper{display:inline-block;position:relative;width:50px;height:50px}.preloader-wrapper.small{width:36px;height:36px}.preloader-wrapper.big{width:64px;height:64px}.preloader-wrapper.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(360deg)}}@keyframes container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0;border-color:#26a69a}.spinner-blue,.spinner-blue-only{border-color:#4285f4}.spinner-red,.spinner-red-only{border-color:#db4437}.spinner-yellow,.spinner-yellow-only{border-color:#f4b400}.spinner-green,.spinner-green-only{border-color:#0f9d58}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer,.active .spinner-layer.spinner-blue-only,.active .spinner-layer.spinner-red-only,.active .spinner-layer.spinner-yellow-only,.active .spinner-layer.spinner-green-only{opacity:1;-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg)}}@keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@-webkit-keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}@keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.gap-patch{position:absolute;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.gap-patch .circle{width:1000%;left:-450%}.circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.circle-clipper .circle{width:200%;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent !important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0}.circle-clipper.left .circle{left:0;border-right-color:transparent !important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.circle-clipper.right .circle{left:-100%;border-left-color:transparent !important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.active .circle-clipper.left .circle{-webkit-animation:left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .circle-clipper.right .circle{-webkit-animation:right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@-webkit-keyframes left-spin{from{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{from{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@-webkit-keyframes right-spin{from{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{from{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}#spinnerContainer.cooldown{-webkit-animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1);animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1)}@-webkit-keyframes fade-out{from{opacity:1}to{opacity:0}}@keyframes fade-out{from{opacity:1}to{opacity:0}}.slider{position:relative;height:400px;width:100%}.slider.fullscreen{height:100%;width:100%;position:absolute;top:0;left:0;right:0;bottom:0}.slider.fullscreen ul.slides{height:100%}.slider.fullscreen ul.indicators{z-index:2;bottom:30px}.slider .slides{background-color:#9e9e9e;margin:0;height:400px}.slider .slides li{opacity:0;position:absolute;top:0;left:0;z-index:1;width:100%;height:inherit;overflow:hidden}.slider .slides li img{height:100%;width:100%;background-size:cover;background-position:center}.slider .slides li .caption{color:#fff;position:absolute;top:15%;left:15%;width:70%;opacity:0}.slider .slides li .caption p{color:#e0e0e0}.slider .slides li.active{z-index:2}.slider .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.slider .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:16px;width:16px;margin:0 12px;background-color:#e0e0e0;-webkit-transition:background-color .3s;transition:background-color .3s;border-radius:50%}.slider .indicators .indicator-item.active{background-color:#4CAF50}.carousel{overflow:hidden;position:relative;width:100%;height:400px;-webkit-perspective:500px;perspective:500px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transform-origin:0% 50%;transform-origin:0% 50%}.carousel.carousel-slider{top:0;left:0}.carousel.carousel-slider .carousel-fixed-item{position:absolute;left:0;right:0;bottom:20px;z-index:1}.carousel.carousel-slider .carousel-fixed-item.with-indicators{bottom:68px}.carousel.carousel-slider .carousel-item{width:100%;height:100%;min-height:400px;position:absolute;top:0;left:0}.carousel.carousel-slider .carousel-item h2{font-size:24px;font-weight:500;line-height:32px}.carousel.carousel-slider .carousel-item p{font-size:15px}.carousel .carousel-item{visibility:hidden;width:200px;height:200px;position:absolute;top:0;left:0}.carousel .carousel-item>img{width:100%}.carousel .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.carousel .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:8px;width:8px;margin:24px 4px;background-color:rgba(255,255,255,0.5);-webkit-transition:background-color .3s;transition:background-color .3s;border-radius:50%}.carousel .indicators .indicator-item.active{background-color:#fff}.carousel.scrolling .carousel-item .materialboxed,.carousel .carousel-item:not(.active) .materialboxed{pointer-events:none}.tap-target-wrapper{width:800px;height:800px;position:fixed;z-index:1000;visibility:hidden;-webkit-transition:visibility 0s .3s;transition:visibility 0s .3s}.tap-target-wrapper.open{visibility:visible;-webkit-transition:visibility 0s;transition:visibility 0s}.tap-target-wrapper.open .tap-target{-webkit-transform:scale(1);transform:scale(1);opacity:.95;-webkit-transition:opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:transform 0.3s cubic-bezier(0.42, 0, 0.58, 1),opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:transform 0.3s cubic-bezier(0.42, 0, 0.58, 1),opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1)}.tap-target-wrapper.open .tap-target-wave::before{-webkit-transform:scale(1);transform:scale(1)}.tap-target-wrapper.open .tap-target-wave::after{visibility:visible;-webkit-animation:pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;animation:pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;-webkit-transition:opacity .3s, visibility 0s 1s, -webkit-transform .3s;transition:opacity .3s, visibility 0s 1s, -webkit-transform .3s;transition:opacity .3s, transform .3s, visibility 0s 1s;transition:opacity .3s, transform .3s, visibility 0s 1s, -webkit-transform .3s}.tap-target{position:absolute;font-size:1rem;border-radius:50%;background-color:#ee6e73;-webkit-box-shadow:0 20px 20px 0 rgba(0,0,0,0.14),0 10px 50px 0 rgba(0,0,0,0.12),0 30px 10px -20px rgba(0,0,0,0.2);box-shadow:0 20px 20px 0 rgba(0,0,0,0.14),0 10px 50px 0 rgba(0,0,0,0.12),0 30px 10px -20px rgba(0,0,0,0.2);width:100%;height:100%;opacity:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transition:opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:transform 0.3s cubic-bezier(0.42, 0, 0.58, 1),opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:transform 0.3s cubic-bezier(0.42, 0, 0.58, 1),opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1)}.tap-target-content{position:relative;display:table-cell}.tap-target-wave{position:absolute;border-radius:50%;z-index:10001}.tap-target-wave::before,.tap-target-wave::after{content:'';display:block;position:absolute;width:100%;height:100%;border-radius:50%;background-color:#ffffff}.tap-target-wave::before{-webkit-transform:scale(0);transform:scale(0);-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s, -webkit-transform .3s}.tap-target-wave::after{visibility:hidden;-webkit-transition:opacity .3s, visibility 0s, -webkit-transform .3s;transition:opacity .3s, visibility 0s, -webkit-transform .3s;transition:opacity .3s, transform .3s, visibility 0s;transition:opacity .3s, transform .3s, visibility 0s, -webkit-transform .3s;z-index:-1}.tap-target-origin{top:50%;left:50%;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);z-index:10002;position:absolute !important}.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small),.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small):hover{background:none}@media only screen and (max-width: 600px){.tap-target,.tap-target-wrapper{width:600px;height:600px}}.pulse{overflow:visible;position:relative}.pulse::before{content:'';display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:inherit;border-radius:inherit;-webkit-transition:opacity .3s, -webkit-transform .3s;transition:opacity .3s, -webkit-transform .3s;transition:opacity .3s, transform .3s;transition:opacity .3s, transform .3s, -webkit-transform .3s;-webkit-animation:pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;animation:pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;z-index:-1}@-webkit-keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}100%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}@keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}100%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}.datepicker-modal{max-width:325px;min-width:300px;max-height:none}.datepicker-container.modal-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:0}.datepicker-controls{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;width:280px;margin:0 auto}.datepicker-controls .selects-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.datepicker-controls .select-wrapper input{border-bottom:none;text-align:center;margin:0}.datepicker-controls .select-wrapper input:focus{border-bottom:none}.datepicker-controls .select-wrapper .caret{display:none}.datepicker-controls .select-year input{width:50px}.datepicker-controls .select-month input{width:70px}.month-prev,.month-next{margin-top:4px;cursor:pointer;background-color:transparent;border:none}.datepicker-date-display{-webkit-box-flex:1;-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;background-color:#26a69a;color:#fff;padding:20px 22px;font-weight:500}.datepicker-date-display .year-text{display:block;font-size:1.5rem;line-height:25px;color:rgba(255,255,255,0.7)}.datepicker-date-display .date-text{display:block;font-size:2.8rem;line-height:47px;font-weight:500}.datepicker-calendar-container{-webkit-box-flex:2.5;-webkit-flex:2.5 auto;-ms-flex:2.5 auto;flex:2.5 auto}.datepicker-table{width:280px;font-size:1rem;margin:0 auto}.datepicker-table thead{border-bottom:none}.datepicker-table th{padding:10px 5px;text-align:center}.datepicker-table tr{border:none}.datepicker-table abbr{text-decoration:none;color:#999}.datepicker-table td{border-radius:50%;padding:0}.datepicker-table td.is-today{color:#26a69a}.datepicker-table td.is-selected{background-color:#26a69a;color:#fff}.datepicker-table td.is-outside-current-month,.datepicker-table td.is-disabled{color:rgba(0,0,0,0.3);pointer-events:none}.datepicker-day-button{background-color:transparent;border:none;line-height:38px;display:block;width:100%;border-radius:50%;padding:0 5px;cursor:pointer;color:inherit}.datepicker-day-button:focus{background-color:rgba(43,161,150,0.25)}.datepicker-footer{width:280px;margin:0 auto;padding-bottom:5px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.datepicker-cancel,.datepicker-clear,.datepicker-today,.datepicker-done{color:#26a69a;padding:0 1rem}.datepicker-clear{color:#F44336}@media only screen and (min-width: 601px){.datepicker-modal{max-width:625px}.datepicker-container.modal-content{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.datepicker-date-display{-webkit-box-flex:0;-webkit-flex:0 1 270px;-ms-flex:0 1 270px;flex:0 1 270px}.datepicker-controls,.datepicker-table,.datepicker-footer{width:320px}.datepicker-day-button{line-height:44px}}.timepicker-modal{max-width:325px;max-height:none}.timepicker-container.modal-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:0}.text-primary{color:#fff}.timepicker-digital-display{-webkit-box-flex:1;-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;background-color:#26a69a;padding:10px;font-weight:300}.timepicker-text-container{font-size:4rem;font-weight:bold;text-align:center;color:rgba(255,255,255,0.6);font-weight:400;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.timepicker-span-hours,.timepicker-span-minutes,.timepicker-span-am-pm div{cursor:pointer}.timepicker-span-hours{margin-right:3px}.timepicker-span-minutes{margin-left:3px}.timepicker-display-am-pm{font-size:1.3rem;position:absolute;right:1rem;bottom:1rem;font-weight:400}.timepicker-analog-display{-webkit-box-flex:2.5;-webkit-flex:2.5 auto;-ms-flex:2.5 auto;flex:2.5 auto}.timepicker-plate{background-color:#eee;border-radius:50%;width:270px;height:270px;overflow:visible;position:relative;margin:auto;margin-top:25px;margin-bottom:5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.timepicker-canvas,.timepicker-dial{position:absolute;left:0;right:0;top:0;bottom:0}.timepicker-minutes{visibility:hidden}.timepicker-tick{border-radius:50%;color:rgba(0,0,0,0.87);line-height:40px;text-align:center;width:40px;height:40px;position:absolute;cursor:pointer;font-size:15px}.timepicker-tick.active,.timepicker-tick:hover{background-color:rgba(38,166,154,0.25)}.timepicker-dial{-webkit-transition:opacity 350ms, -webkit-transform 350ms;transition:opacity 350ms, -webkit-transform 350ms;transition:transform 350ms, opacity 350ms;transition:transform 350ms, opacity 350ms, -webkit-transform 350ms}.timepicker-dial-out{opacity:0}.timepicker-dial-out.timepicker-hours{-webkit-transform:scale(1.1, 1.1);transform:scale(1.1, 1.1)}.timepicker-dial-out.timepicker-minutes{-webkit-transform:scale(0.8, 0.8);transform:scale(0.8, 0.8)}.timepicker-canvas{-webkit-transition:opacity 175ms;transition:opacity 175ms}.timepicker-canvas line{stroke:#26a69a;stroke-width:4;stroke-linecap:round}.timepicker-canvas-out{opacity:0.25}.timepicker-canvas-bearing{stroke:none;fill:#26a69a}.timepicker-canvas-bg{stroke:none;fill:#26a69a}.timepicker-footer{margin:0 auto;padding:5px 1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.timepicker-clear{color:#F44336}.timepicker-close{color:#26a69a}.timepicker-clear,.timepicker-close{padding:0 20px}@media only screen and (min-width: 601px){.timepicker-modal{max-width:600px}.timepicker-container.modal-content{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.timepicker-text-container{top:32%}.timepicker-display-am-pm{position:relative;right:auto;bottom:auto;text-align:center;margin-top:1.2rem}} diff --git a/examples/todoapp/web/src/jsMain/resources/materialize.min.js b/examples/todoapp/web/src/jsMain/resources/materialize.min.js deleted file mode 100644 index 4ff077d6db..0000000000 --- a/examples/todoapp/web/src/jsMain/resources/materialize.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Materialize v1.0.0 (http://materializecss.com) - * Copyright 2014-2017 Materialize - * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE) - */ -var _get=function t(e,i,n){null===e&&(e=Function.prototype);var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var o=Object.getPrototypeOf(e);return null===o?void 0:t(o,i,n)}if("value"in s)return s.value;var a=s.get;return void 0!==a?a.call(n):void 0},_createClass=function(){function n(t,e){for(var i=0;i/,p=/^\w+$/;function v(t,e){e=e||o;var i=u.test(t)?e.getElementsByClassName(t.slice(1)):p.test(t)?e.getElementsByTagName(t):e.querySelectorAll(t);return i}function f(t){if(!i){var e=(i=o.implementation.createHTMLDocument(null)).createElement("base");e.href=o.location.href,i.head.appendChild(e)}return i.body.innerHTML=t,i.body.childNodes}function m(t){"loading"!==o.readyState?t():o.addEventListener("DOMContentLoaded",t)}function g(t,e){if(!t)return this;if(t.cash&&t!==a)return t;var i,n=t,s=0;if(d(t))n=l.test(t)?o.getElementById(t.slice(1)):c.test(t)?f(t):v(t,e);else if(h(t))return m(t),this;if(!n)return this;if(n.nodeType||n===a)this[0]=n,this.length=1;else for(i=this.length=n.length;ss.right-i||l+e.width>window.innerWidth-i)&&(n.right=!0),(ho-i||h+e.height>window.innerHeight-i)&&(n.bottom=!0),n},M.checkPossibleAlignments=function(t,e,i,n){var s={top:!0,right:!0,bottom:!0,left:!0,spaceOnTop:null,spaceOnRight:null,spaceOnBottom:null,spaceOnLeft:null},o="visible"===getComputedStyle(e).overflow,a=e.getBoundingClientRect(),r=Math.min(a.height,window.innerHeight),l=Math.min(a.width,window.innerWidth),h=t.getBoundingClientRect(),d=e.scrollLeft,u=e.scrollTop,c=i.left-d,p=i.top-u,v=i.top+h.height-u;return s.spaceOnRight=o?window.innerWidth-(h.left+i.width):l-(c+i.width),s.spaceOnRight<0&&(s.left=!1),s.spaceOnLeft=o?h.right-i.width:c-i.width+h.width,s.spaceOnLeft<0&&(s.right=!1),s.spaceOnBottom=o?window.innerHeight-(h.top+i.height+n):r-(p+i.height+n),s.spaceOnBottom<0&&(s.top=!1),s.spaceOnTop=o?h.bottom-(i.height+n):v-(i.height-n),s.spaceOnTop<0&&(s.bottom=!1),s},M.getOverflowParent=function(t){return null==t?null:t===document.body||"visible"!==getComputedStyle(t).overflow?t:M.getOverflowParent(t.parentElement)},M.getIdFromTrigger=function(t){var e=t.getAttribute("data-target");return e||(e=(e=t.getAttribute("href"))?e.slice(1):""),e},M.getDocumentScrollTop=function(){return window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},M.getDocumentScrollLeft=function(){return window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0};var getTime=Date.now||function(){return(new Date).getTime()};M.throttle=function(i,n,s){var o=void 0,a=void 0,r=void 0,l=null,h=0;s||(s={});var d=function(){h=!1===s.leading?0:getTime(),l=null,r=i.apply(o,a),o=a=null};return function(){var t=getTime();h||!1!==s.leading||(h=t);var e=n-(t-h);return o=this,a=arguments,e<=0?(clearTimeout(l),l=null,h=t,r=i.apply(o,a),o=a=null):l||!1===s.trailing||(l=setTimeout(d,e)),r}};var $jscomp={scope:{}};$jscomp.defineProperty="function"==typeof Object.defineProperties?Object.defineProperty:function(t,e,i){if(i.get||i.set)throw new TypeError("ES3 does not support getters and setters.");t!=Array.prototype&&t!=Object.prototype&&(t[e]=i.value)},$jscomp.getGlobal=function(t){return"undefined"!=typeof window&&window===t?t:"undefined"!=typeof global&&null!=global?global:t},$jscomp.global=$jscomp.getGlobal(this),$jscomp.SYMBOL_PREFIX="jscomp_symbol_",$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){},$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)},$jscomp.symbolCounter_=0,$jscomp.Symbol=function(t){return $jscomp.SYMBOL_PREFIX+(t||"")+$jscomp.symbolCounter_++},$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var t=$jscomp.global.Symbol.iterator;t||(t=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator")),"function"!=typeof Array.prototype[t]&&$jscomp.defineProperty(Array.prototype,t,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}}),$jscomp.initSymbolIterator=function(){}},$jscomp.arrayIterator=function(t){var e=0;return $jscomp.iteratorPrototype(function(){return e=k.currentTime)for(var h=0;ht&&(s.duration=e.duration),s.children.push(e)}),s.seek(0),s.reset(),s.autoplay&&s.restart(),s},s},O.random=function(t,e){return Math.floor(Math.random()*(e-t+1))+t},O}(),function(r,l){"use strict";var e={accordion:!0,onOpenStart:void 0,onOpenEnd:void 0,onCloseStart:void 0,onCloseEnd:void 0,inDuration:300,outDuration:300},t=function(t){function s(t,e){_classCallCheck(this,s);var i=_possibleConstructorReturn(this,(s.__proto__||Object.getPrototypeOf(s)).call(this,s,t,e));(i.el.M_Collapsible=i).options=r.extend({},s.defaults,e),i.$headers=i.$el.children("li").children(".collapsible-header"),i.$headers.attr("tabindex",0),i._setupEventHandlers();var n=i.$el.children("li.active").children(".collapsible-body");return i.options.accordion?n.first().css("display","block"):n.css("display","block"),i}return _inherits(s,Component),_createClass(s,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.M_Collapsible=void 0}},{key:"_setupEventHandlers",value:function(){var e=this;this._handleCollapsibleClickBound=this._handleCollapsibleClick.bind(this),this._handleCollapsibleKeydownBound=this._handleCollapsibleKeydown.bind(this),this.el.addEventListener("click",this._handleCollapsibleClickBound),this.$headers.each(function(t){t.addEventListener("keydown",e._handleCollapsibleKeydownBound)})}},{key:"_removeEventHandlers",value:function(){var e=this;this.el.removeEventListener("click",this._handleCollapsibleClickBound),this.$headers.each(function(t){t.removeEventListener("keydown",e._handleCollapsibleKeydownBound)})}},{key:"_handleCollapsibleClick",value:function(t){var e=r(t.target).closest(".collapsible-header");if(t.target&&e.length){var i=e.closest(".collapsible");if(i[0]===this.el){var n=e.closest("li"),s=i.children("li"),o=n[0].classList.contains("active"),a=s.index(n);o?this.close(a):this.open(a)}}}},{key:"_handleCollapsibleKeydown",value:function(t){13===t.keyCode&&this._handleCollapsibleClickBound(t)}},{key:"_animateIn",value:function(t){var e=this,i=this.$el.children("li").eq(t);if(i.length){var n=i.children(".collapsible-body");l.remove(n[0]),n.css({display:"block",overflow:"hidden",height:0,paddingTop:"",paddingBottom:""});var s=n.css("padding-top"),o=n.css("padding-bottom"),a=n[0].scrollHeight;n.css({paddingTop:0,paddingBottom:0}),l({targets:n[0],height:a,paddingTop:s,paddingBottom:o,duration:this.options.inDuration,easing:"easeInOutCubic",complete:function(t){n.css({overflow:"",paddingTop:"",paddingBottom:"",height:""}),"function"==typeof e.options.onOpenEnd&&e.options.onOpenEnd.call(e,i[0])}})}}},{key:"_animateOut",value:function(t){var e=this,i=this.$el.children("li").eq(t);if(i.length){var n=i.children(".collapsible-body");l.remove(n[0]),n.css("overflow","hidden"),l({targets:n[0],height:0,paddingTop:0,paddingBottom:0,duration:this.options.outDuration,easing:"easeInOutCubic",complete:function(){n.css({height:"",overflow:"",padding:"",display:""}),"function"==typeof e.options.onCloseEnd&&e.options.onCloseEnd.call(e,i[0])}})}}},{key:"open",value:function(t){var i=this,e=this.$el.children("li").eq(t);if(e.length&&!e[0].classList.contains("active")){if("function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,e[0]),this.options.accordion){var n=this.$el.children("li");this.$el.children("li.active").each(function(t){var e=n.index(r(t));i.close(e)})}e[0].classList.add("active"),this._animateIn(t)}}},{key:"close",value:function(t){var e=this.$el.children("li").eq(t);e.length&&e[0].classList.contains("active")&&("function"==typeof this.options.onCloseStart&&this.options.onCloseStart.call(this,e[0]),e[0].classList.remove("active"),this._animateOut(t))}}],[{key:"init",value:function(t,e){return _get(s.__proto__||Object.getPrototypeOf(s),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Collapsible}},{key:"defaults",get:function(){return e}}]),s}();M.Collapsible=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"collapsible","M_Collapsible")}(cash,M.anime),function(h,i){"use strict";var e={alignment:"left",autoFocus:!0,constrainWidth:!0,container:null,coverTrigger:!0,closeOnClick:!0,hover:!1,inDuration:150,outDuration:250,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null,onItemClick:null},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return i.el.M_Dropdown=i,n._dropdowns.push(i),i.id=M.getIdFromTrigger(t),i.dropdownEl=document.getElementById(i.id),i.$dropdownEl=h(i.dropdownEl),i.options=h.extend({},n.defaults,e),i.isOpen=!1,i.isScrollable=!1,i.isTouchMoving=!1,i.focusedIndex=-1,i.filterQuery=[],i.options.container?h(i.options.container).append(i.dropdownEl):i.$el.after(i.dropdownEl),i._makeDropdownFocusable(),i._resetFilterQueryBound=i._resetFilterQuery.bind(i),i._handleDocumentClickBound=i._handleDocumentClick.bind(i),i._handleDocumentTouchmoveBound=i._handleDocumentTouchmove.bind(i),i._handleDropdownClickBound=i._handleDropdownClick.bind(i),i._handleDropdownKeydownBound=i._handleDropdownKeydown.bind(i),i._handleTriggerKeydownBound=i._handleTriggerKeydown.bind(i),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._resetDropdownStyles(),this._removeEventHandlers(),n._dropdowns.splice(n._dropdowns.indexOf(this),1),this.el.M_Dropdown=void 0}},{key:"_setupEventHandlers",value:function(){this.el.addEventListener("keydown",this._handleTriggerKeydownBound),this.dropdownEl.addEventListener("click",this._handleDropdownClickBound),this.options.hover?(this._handleMouseEnterBound=this._handleMouseEnter.bind(this),this.el.addEventListener("mouseenter",this._handleMouseEnterBound),this._handleMouseLeaveBound=this._handleMouseLeave.bind(this),this.el.addEventListener("mouseleave",this._handleMouseLeaveBound),this.dropdownEl.addEventListener("mouseleave",this._handleMouseLeaveBound)):(this._handleClickBound=this._handleClick.bind(this),this.el.addEventListener("click",this._handleClickBound))}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("keydown",this._handleTriggerKeydownBound),this.dropdownEl.removeEventListener("click",this._handleDropdownClickBound),this.options.hover?(this.el.removeEventListener("mouseenter",this._handleMouseEnterBound),this.el.removeEventListener("mouseleave",this._handleMouseLeaveBound),this.dropdownEl.removeEventListener("mouseleave",this._handleMouseLeaveBound)):this.el.removeEventListener("click",this._handleClickBound)}},{key:"_setupTemporaryEventHandlers",value:function(){document.body.addEventListener("click",this._handleDocumentClickBound,!0),document.body.addEventListener("touchend",this._handleDocumentClickBound),document.body.addEventListener("touchmove",this._handleDocumentTouchmoveBound),this.dropdownEl.addEventListener("keydown",this._handleDropdownKeydownBound)}},{key:"_removeTemporaryEventHandlers",value:function(){document.body.removeEventListener("click",this._handleDocumentClickBound,!0),document.body.removeEventListener("touchend",this._handleDocumentClickBound),document.body.removeEventListener("touchmove",this._handleDocumentTouchmoveBound),this.dropdownEl.removeEventListener("keydown",this._handleDropdownKeydownBound)}},{key:"_handleClick",value:function(t){t.preventDefault(),this.open()}},{key:"_handleMouseEnter",value:function(){this.open()}},{key:"_handleMouseLeave",value:function(t){var e=t.toElement||t.relatedTarget,i=!!h(e).closest(".dropdown-content").length,n=!1,s=h(e).closest(".dropdown-trigger");s.length&&s[0].M_Dropdown&&s[0].M_Dropdown.isOpen&&(n=!0),n||i||this.close()}},{key:"_handleDocumentClick",value:function(t){var e=this,i=h(t.target);this.options.closeOnClick&&i.closest(".dropdown-content").length&&!this.isTouchMoving?setTimeout(function(){e.close()},0):!i.closest(".dropdown-trigger").length&&i.closest(".dropdown-content").length||setTimeout(function(){e.close()},0),this.isTouchMoving=!1}},{key:"_handleTriggerKeydown",value:function(t){t.which!==M.keys.ARROW_DOWN&&t.which!==M.keys.ENTER||this.isOpen||(t.preventDefault(),this.open())}},{key:"_handleDocumentTouchmove",value:function(t){h(t.target).closest(".dropdown-content").length&&(this.isTouchMoving=!0)}},{key:"_handleDropdownClick",value:function(t){if("function"==typeof this.options.onItemClick){var e=h(t.target).closest("li")[0];this.options.onItemClick.call(this,e)}}},{key:"_handleDropdownKeydown",value:function(t){if(t.which===M.keys.TAB)t.preventDefault(),this.close();else if(t.which!==M.keys.ARROW_DOWN&&t.which!==M.keys.ARROW_UP||!this.isOpen)if(t.which===M.keys.ENTER&&this.isOpen){var e=this.dropdownEl.children[this.focusedIndex],i=h(e).find("a, button").first();i.length?i[0].click():e&&e.click()}else t.which===M.keys.ESC&&this.isOpen&&(t.preventDefault(),this.close());else{t.preventDefault();var n=t.which===M.keys.ARROW_DOWN?1:-1,s=this.focusedIndex,o=!1;do{if(s+=n,this.dropdownEl.children[s]&&-1!==this.dropdownEl.children[s].tabIndex){o=!0;break}}while(sl.spaceOnBottom?(h="bottom",i+=l.spaceOnTop,o-=l.spaceOnTop):i+=l.spaceOnBottom)),!l[d]){var u="left"===d?"right":"left";l[u]?d=u:l.spaceOnLeft>l.spaceOnRight?(d="right",n+=l.spaceOnLeft,s-=l.spaceOnLeft):(d="left",n+=l.spaceOnRight)}return"bottom"===h&&(o=o-e.height+(this.options.coverTrigger?t.height:0)),"right"===d&&(s=s-e.width+t.width),{x:s,y:o,verticalAlignment:h,horizontalAlignment:d,height:i,width:n}}},{key:"_animateIn",value:function(){var e=this;i.remove(this.dropdownEl),i({targets:this.dropdownEl,opacity:{value:[0,1],easing:"easeOutQuad"},scaleX:[.3,1],scaleY:[.3,1],duration:this.options.inDuration,easing:"easeOutQuint",complete:function(t){e.options.autoFocus&&e.dropdownEl.focus(),"function"==typeof e.options.onOpenEnd&&e.options.onOpenEnd.call(e,e.el)}})}},{key:"_animateOut",value:function(){var e=this;i.remove(this.dropdownEl),i({targets:this.dropdownEl,opacity:{value:0,easing:"easeOutQuint"},scaleX:.3,scaleY:.3,duration:this.options.outDuration,easing:"easeOutQuint",complete:function(t){e._resetDropdownStyles(),"function"==typeof e.options.onCloseEnd&&e.options.onCloseEnd.call(e,e.el)}})}},{key:"_placeDropdown",value:function(){var t=this.options.constrainWidth?this.el.getBoundingClientRect().width:this.dropdownEl.getBoundingClientRect().width;this.dropdownEl.style.width=t+"px";var e=this._getDropdownPosition();this.dropdownEl.style.left=e.x+"px",this.dropdownEl.style.top=e.y+"px",this.dropdownEl.style.height=e.height+"px",this.dropdownEl.style.width=e.width+"px",this.dropdownEl.style.transformOrigin=("left"===e.horizontalAlignment?"0":"100%")+" "+("top"===e.verticalAlignment?"0":"100%")}},{key:"open",value:function(){this.isOpen||(this.isOpen=!0,"function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,this.el),this._resetDropdownStyles(),this.dropdownEl.style.display="block",this._placeDropdown(),this._animateIn(),this._setupTemporaryEventHandlers())}},{key:"close",value:function(){this.isOpen&&(this.isOpen=!1,this.focusedIndex=-1,"function"==typeof this.options.onCloseStart&&this.options.onCloseStart.call(this,this.el),this._animateOut(),this._removeTemporaryEventHandlers(),this.options.autoFocus&&this.el.focus())}},{key:"recalculateDimensions",value:function(){this.isOpen&&(this.$dropdownEl.css({width:"",height:"",left:"",top:"","transform-origin":""}),this._placeDropdown())}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Dropdown}},{key:"defaults",get:function(){return e}}]),n}();t._dropdowns=[],M.Dropdown=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"dropdown","M_Dropdown")}(cash,M.anime),function(s,i){"use strict";var e={opacity:.5,inDuration:250,outDuration:250,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null,preventScrolling:!0,dismissible:!0,startingTop:"4%",endingTop:"10%"},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Modal=i).options=s.extend({},n.defaults,e),i.isOpen=!1,i.id=i.$el.attr("id"),i._openingTrigger=void 0,i.$overlay=s(''),i.el.tabIndex=0,i._nthModalOpened=0,n._count++,i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){n._count--,this._removeEventHandlers(),this.el.removeAttribute("style"),this.$overlay.remove(),this.el.M_Modal=void 0}},{key:"_setupEventHandlers",value:function(){this._handleOverlayClickBound=this._handleOverlayClick.bind(this),this._handleModalCloseClickBound=this._handleModalCloseClick.bind(this),1===n._count&&document.body.addEventListener("click",this._handleTriggerClick),this.$overlay[0].addEventListener("click",this._handleOverlayClickBound),this.el.addEventListener("click",this._handleModalCloseClickBound)}},{key:"_removeEventHandlers",value:function(){0===n._count&&document.body.removeEventListener("click",this._handleTriggerClick),this.$overlay[0].removeEventListener("click",this._handleOverlayClickBound),this.el.removeEventListener("click",this._handleModalCloseClickBound)}},{key:"_handleTriggerClick",value:function(t){var e=s(t.target).closest(".modal-trigger");if(e.length){var i=M.getIdFromTrigger(e[0]),n=document.getElementById(i).M_Modal;n&&n.open(e),t.preventDefault()}}},{key:"_handleOverlayClick",value:function(){this.options.dismissible&&this.close()}},{key:"_handleModalCloseClick",value:function(t){s(t.target).closest(".modal-close").length&&this.close()}},{key:"_handleKeydown",value:function(t){27===t.keyCode&&this.options.dismissible&&this.close()}},{key:"_handleFocus",value:function(t){this.el.contains(t.target)||this._nthModalOpened!==n._modalsOpen||this.el.focus()}},{key:"_animateIn",value:function(){var t=this;s.extend(this.el.style,{display:"block",opacity:0}),s.extend(this.$overlay[0].style,{display:"block",opacity:0}),i({targets:this.$overlay[0],opacity:this.options.opacity,duration:this.options.inDuration,easing:"easeOutQuad"});var e={targets:this.el,duration:this.options.inDuration,easing:"easeOutCubic",complete:function(){"function"==typeof t.options.onOpenEnd&&t.options.onOpenEnd.call(t,t.el,t._openingTrigger)}};this.el.classList.contains("bottom-sheet")?s.extend(e,{bottom:0,opacity:1}):s.extend(e,{top:[this.options.startingTop,this.options.endingTop],opacity:1,scaleX:[.8,1],scaleY:[.8,1]}),i(e)}},{key:"_animateOut",value:function(){var t=this;i({targets:this.$overlay[0],opacity:0,duration:this.options.outDuration,easing:"easeOutQuart"});var e={targets:this.el,duration:this.options.outDuration,easing:"easeOutCubic",complete:function(){t.el.style.display="none",t.$overlay.remove(),"function"==typeof t.options.onCloseEnd&&t.options.onCloseEnd.call(t,t.el)}};this.el.classList.contains("bottom-sheet")?s.extend(e,{bottom:"-100%",opacity:0}):s.extend(e,{top:[this.options.endingTop,this.options.startingTop],opacity:0,scaleX:.8,scaleY:.8}),i(e)}},{key:"open",value:function(t){if(!this.isOpen)return this.isOpen=!0,n._modalsOpen++,this._nthModalOpened=n._modalsOpen,this.$overlay[0].style.zIndex=1e3+2*n._modalsOpen,this.el.style.zIndex=1e3+2*n._modalsOpen+1,this._openingTrigger=t?t[0]:void 0,"function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,this.el,this._openingTrigger),this.options.preventScrolling&&(document.body.style.overflow="hidden"),this.el.classList.add("open"),this.el.insertAdjacentElement("afterend",this.$overlay[0]),this.options.dismissible&&(this._handleKeydownBound=this._handleKeydown.bind(this),this._handleFocusBound=this._handleFocus.bind(this),document.addEventListener("keydown",this._handleKeydownBound),document.addEventListener("focus",this._handleFocusBound,!0)),i.remove(this.el),i.remove(this.$overlay[0]),this._animateIn(),this.el.focus(),this}},{key:"close",value:function(){if(this.isOpen)return this.isOpen=!1,n._modalsOpen--,this._nthModalOpened=0,"function"==typeof this.options.onCloseStart&&this.options.onCloseStart.call(this,this.el),this.el.classList.remove("open"),0===n._modalsOpen&&(document.body.style.overflow=""),this.options.dismissible&&(document.removeEventListener("keydown",this._handleKeydownBound),document.removeEventListener("focus",this._handleFocusBound,!0)),i.remove(this.el),i.remove(this.$overlay[0]),this._animateOut(),this}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Modal}},{key:"defaults",get:function(){return e}}]),n}();t._modalsOpen=0,t._count=0,M.Modal=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"modal","M_Modal")}(cash,M.anime),function(o,a){"use strict";var e={inDuration:275,outDuration:200,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Materialbox=i).options=o.extend({},n.defaults,e),i.overlayActive=!1,i.doneAnimating=!0,i.placeholder=o("
    ").addClass("material-placeholder"),i.originalWidth=0,i.originalHeight=0,i.originInlineStyles=i.$el.attr("style"),i.caption=i.el.getAttribute("data-caption")||"",i.$el.before(i.placeholder),i.placeholder.append(i.$el),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.M_Materialbox=void 0,o(this.placeholder).after(this.el).remove(),this.$el.removeAttr("style")}},{key:"_setupEventHandlers",value:function(){this._handleMaterialboxClickBound=this._handleMaterialboxClick.bind(this),this.el.addEventListener("click",this._handleMaterialboxClickBound)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleMaterialboxClickBound)}},{key:"_handleMaterialboxClick",value:function(t){!1===this.doneAnimating||this.overlayActive&&this.doneAnimating?this.close():this.open()}},{key:"_handleWindowScroll",value:function(){this.overlayActive&&this.close()}},{key:"_handleWindowResize",value:function(){this.overlayActive&&this.close()}},{key:"_handleWindowEscape",value:function(t){27===t.keyCode&&this.doneAnimating&&this.overlayActive&&this.close()}},{key:"_makeAncestorsOverflowVisible",value:function(){this.ancestorsChanged=o();for(var t=this.placeholder[0].parentNode;null!==t&&!o(t).is(document);){var e=o(t);"visible"!==e.css("overflow")&&(e.css("overflow","visible"),void 0===this.ancestorsChanged?this.ancestorsChanged=e:this.ancestorsChanged=this.ancestorsChanged.add(e)),t=t.parentNode}}},{key:"_animateImageIn",value:function(){var t=this,e={targets:this.el,height:[this.originalHeight,this.newHeight],width:[this.originalWidth,this.newWidth],left:M.getDocumentScrollLeft()+this.windowWidth/2-this.placeholder.offset().left-this.newWidth/2,top:M.getDocumentScrollTop()+this.windowHeight/2-this.placeholder.offset().top-this.newHeight/2,duration:this.options.inDuration,easing:"easeOutQuad",complete:function(){t.doneAnimating=!0,"function"==typeof t.options.onOpenEnd&&t.options.onOpenEnd.call(t,t.el)}};this.maxWidth=this.$el.css("max-width"),this.maxHeight=this.$el.css("max-height"),"none"!==this.maxWidth&&(e.maxWidth=this.newWidth),"none"!==this.maxHeight&&(e.maxHeight=this.newHeight),a(e)}},{key:"_animateImageOut",value:function(){var t=this,e={targets:this.el,width:this.originalWidth,height:this.originalHeight,left:0,top:0,duration:this.options.outDuration,easing:"easeOutQuad",complete:function(){t.placeholder.css({height:"",width:"",position:"",top:"",left:""}),t.attrWidth&&t.$el.attr("width",t.attrWidth),t.attrHeight&&t.$el.attr("height",t.attrHeight),t.$el.removeAttr("style"),t.originInlineStyles&&t.$el.attr("style",t.originInlineStyles),t.$el.removeClass("active"),t.doneAnimating=!0,t.ancestorsChanged.length&&t.ancestorsChanged.css("overflow",""),"function"==typeof t.options.onCloseEnd&&t.options.onCloseEnd.call(t,t.el)}};a(e)}},{key:"_updateVars",value:function(){this.windowWidth=window.innerWidth,this.windowHeight=window.innerHeight,this.caption=this.el.getAttribute("data-caption")||""}},{key:"open",value:function(){var t=this;this._updateVars(),this.originalWidth=this.el.getBoundingClientRect().width,this.originalHeight=this.el.getBoundingClientRect().height,this.doneAnimating=!1,this.$el.addClass("active"),this.overlayActive=!0,"function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,this.el),this.placeholder.css({width:this.placeholder[0].getBoundingClientRect().width+"px",height:this.placeholder[0].getBoundingClientRect().height+"px",position:"relative",top:0,left:0}),this._makeAncestorsOverflowVisible(),this.$el.css({position:"absolute","z-index":1e3,"will-change":"left, top, width, height"}),this.attrWidth=this.$el.attr("width"),this.attrHeight=this.$el.attr("height"),this.attrWidth&&(this.$el.css("width",this.attrWidth+"px"),this.$el.removeAttr("width")),this.attrHeight&&(this.$el.css("width",this.attrHeight+"px"),this.$el.removeAttr("height")),this.$overlay=o('
    ').css({opacity:0}).one("click",function(){t.doneAnimating&&t.close()}),this.$el.before(this.$overlay);var e=this.$overlay[0].getBoundingClientRect();this.$overlay.css({width:this.windowWidth+"px",height:this.windowHeight+"px",left:-1*e.left+"px",top:-1*e.top+"px"}),a.remove(this.el),a.remove(this.$overlay[0]),a({targets:this.$overlay[0],opacity:1,duration:this.options.inDuration,easing:"easeOutQuad"}),""!==this.caption&&(this.$photocaption&&a.remove(this.$photoCaption[0]),this.$photoCaption=o('
    '),this.$photoCaption.text(this.caption),o("body").append(this.$photoCaption),this.$photoCaption.css({display:"inline"}),a({targets:this.$photoCaption[0],opacity:1,duration:this.options.inDuration,easing:"easeOutQuad"}));var i=0,n=this.originalWidth/this.windowWidth,s=this.originalHeight/this.windowHeight;this.newWidth=0,this.newHeight=0,si.options.responsiveThreshold,i.$img=i.$el.find("img").first(),i.$img.each(function(){this.complete&&s(this).trigger("load")}),i._updateParallax(),i._setupEventHandlers(),i._setupStyles(),n._parallaxes.push(i),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){n._parallaxes.splice(n._parallaxes.indexOf(this),1),this.$img[0].style.transform="",this._removeEventHandlers(),this.$el[0].M_Parallax=void 0}},{key:"_setupEventHandlers",value:function(){this._handleImageLoadBound=this._handleImageLoad.bind(this),this.$img[0].addEventListener("load",this._handleImageLoadBound),0===n._parallaxes.length&&(n._handleScrollThrottled=M.throttle(n._handleScroll,5),window.addEventListener("scroll",n._handleScrollThrottled),n._handleWindowResizeThrottled=M.throttle(n._handleWindowResize,5),window.addEventListener("resize",n._handleWindowResizeThrottled))}},{key:"_removeEventHandlers",value:function(){this.$img[0].removeEventListener("load",this._handleImageLoadBound),0===n._parallaxes.length&&(window.removeEventListener("scroll",n._handleScrollThrottled),window.removeEventListener("resize",n._handleWindowResizeThrottled))}},{key:"_setupStyles",value:function(){this.$img[0].style.opacity=1}},{key:"_handleImageLoad",value:function(){this._updateParallax()}},{key:"_updateParallax",value:function(){var t=0e.options.responsiveThreshold}}},{key:"defaults",get:function(){return e}}]),n}();t._parallaxes=[],M.Parallax=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"parallax","M_Parallax")}(cash),function(a,s){"use strict";var e={duration:300,onShow:null,swipeable:!1,responsiveThreshold:1/0},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Tabs=i).options=a.extend({},n.defaults,e),i.$tabLinks=i.$el.children("li.tab").children("a"),i.index=0,i._setupActiveTabLink(),i.options.swipeable?i._setupSwipeableTabs():i._setupNormalTabs(),i._setTabsAndTabWidth(),i._createIndicator(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this._indicator.parentNode.removeChild(this._indicator),this.options.swipeable?this._teardownSwipeableTabs():this._teardownNormalTabs(),this.$el[0].M_Tabs=void 0}},{key:"_setupEventHandlers",value:function(){this._handleWindowResizeBound=this._handleWindowResize.bind(this),window.addEventListener("resize",this._handleWindowResizeBound),this._handleTabClickBound=this._handleTabClick.bind(this),this.el.addEventListener("click",this._handleTabClickBound)}},{key:"_removeEventHandlers",value:function(){window.removeEventListener("resize",this._handleWindowResizeBound),this.el.removeEventListener("click",this._handleTabClickBound)}},{key:"_handleWindowResize",value:function(){this._setTabsAndTabWidth(),0!==this.tabWidth&&0!==this.tabsWidth&&(this._indicator.style.left=this._calcLeftPos(this.$activeTabLink)+"px",this._indicator.style.right=this._calcRightPos(this.$activeTabLink)+"px")}},{key:"_handleTabClick",value:function(t){var e=this,i=a(t.target).closest("li.tab"),n=a(t.target).closest("a");if(n.length&&n.parent().hasClass("tab"))if(i.hasClass("disabled"))t.preventDefault();else if(!n.attr("target")){this.$activeTabLink.removeClass("active");var s=this.$content;this.$activeTabLink=n,this.$content=a(M.escapeHash(n[0].hash)),this.$tabLinks=this.$el.children("li.tab").children("a"),this.$activeTabLink.addClass("active");var o=this.index;this.index=Math.max(this.$tabLinks.index(n),0),this.options.swipeable?this._tabsCarousel&&this._tabsCarousel.set(this.index,function(){"function"==typeof e.options.onShow&&e.options.onShow.call(e,e.$content[0])}):this.$content.length&&(this.$content[0].style.display="block",this.$content.addClass("active"),"function"==typeof this.options.onShow&&this.options.onShow.call(this,this.$content[0]),s.length&&!s.is(this.$content)&&(s[0].style.display="none",s.removeClass("active"))),this._setTabsAndTabWidth(),this._animateIndicator(o),t.preventDefault()}}},{key:"_createIndicator",value:function(){var t=this,e=document.createElement("li");e.classList.add("indicator"),this.el.appendChild(e),this._indicator=e,setTimeout(function(){t._indicator.style.left=t._calcLeftPos(t.$activeTabLink)+"px",t._indicator.style.right=t._calcRightPos(t.$activeTabLink)+"px"},0)}},{key:"_setupActiveTabLink",value:function(){this.$activeTabLink=a(this.$tabLinks.filter('[href="'+location.hash+'"]')),0===this.$activeTabLink.length&&(this.$activeTabLink=this.$el.children("li.tab").children("a.active").first()),0===this.$activeTabLink.length&&(this.$activeTabLink=this.$el.children("li.tab").children("a").first()),this.$tabLinks.removeClass("active"),this.$activeTabLink[0].classList.add("active"),this.index=Math.max(this.$tabLinks.index(this.$activeTabLink),0),this.$activeTabLink.length&&(this.$content=a(M.escapeHash(this.$activeTabLink[0].hash)),this.$content.addClass("active"))}},{key:"_setupSwipeableTabs",value:function(){var i=this;window.innerWidth>this.options.responsiveThreshold&&(this.options.swipeable=!1);var n=a();this.$tabLinks.each(function(t){var e=a(M.escapeHash(t.hash));e.addClass("carousel-item"),n=n.add(e)});var t=a('');n.first().before(t),t.append(n),n[0].style.display="";var e=this.$activeTabLink.closest(".tab").index();this._tabsCarousel=M.Carousel.init(t[0],{fullWidth:!0,noWrap:!0,onCycleTo:function(t){var e=i.index;i.index=a(t).index(),i.$activeTabLink.removeClass("active"),i.$activeTabLink=i.$tabLinks.eq(i.index),i.$activeTabLink.addClass("active"),i._animateIndicator(e),"function"==typeof i.options.onShow&&i.options.onShow.call(i,i.$content[0])}}),this._tabsCarousel.set(e)}},{key:"_teardownSwipeableTabs",value:function(){var t=this._tabsCarousel.$el;this._tabsCarousel.destroy(),t.after(t.children()),t.remove()}},{key:"_setupNormalTabs",value:function(){this.$tabLinks.not(this.$activeTabLink).each(function(t){if(t.hash){var e=a(M.escapeHash(t.hash));e.length&&(e[0].style.display="none")}})}},{key:"_teardownNormalTabs",value:function(){this.$tabLinks.each(function(t){if(t.hash){var e=a(M.escapeHash(t.hash));e.length&&(e[0].style.display="")}})}},{key:"_setTabsAndTabWidth",value:function(){this.tabsWidth=this.$el.width(),this.tabWidth=Math.max(this.tabsWidth,this.el.scrollWidth)/this.$tabLinks.length}},{key:"_calcRightPos",value:function(t){return Math.ceil(this.tabsWidth-t.position().left-t[0].getBoundingClientRect().width)}},{key:"_calcLeftPos",value:function(t){return Math.floor(t.position().left)}},{key:"updateTabIndicator",value:function(){this._setTabsAndTabWidth(),this._animateIndicator(this.index)}},{key:"_animateIndicator",value:function(t){var e=0,i=0;0<=this.index-t?e=90:i=90;var n={targets:this._indicator,left:{value:this._calcLeftPos(this.$activeTabLink),delay:e},right:{value:this._calcRightPos(this.$activeTabLink),delay:i},duration:this.options.duration,easing:"easeOutQuad"};s.remove(this._indicator),s(n)}},{key:"select",value:function(t){var e=this.$tabLinks.filter('[href="#'+t+'"]');e.length&&e.trigger("click")}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Tabs}},{key:"defaults",get:function(){return e}}]),n}();M.Tabs=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"tabs","M_Tabs")}(cash,M.anime),function(d,e){"use strict";var i={exitDelay:200,enterDelay:0,html:null,margin:5,inDuration:250,outDuration:200,position:"bottom",transitionMovement:10},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Tooltip=i).options=d.extend({},n.defaults,e),i.isOpen=!1,i.isHovered=!1,i.isFocused=!1,i._appendTooltipEl(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){d(this.tooltipEl).remove(),this._removeEventHandlers(),this.el.M_Tooltip=void 0}},{key:"_appendTooltipEl",value:function(){var t=document.createElement("div");t.classList.add("material-tooltip"),this.tooltipEl=t;var e=document.createElement("div");e.classList.add("tooltip-content"),e.innerHTML=this.options.html,t.appendChild(e),document.body.appendChild(t)}},{key:"_updateTooltipContent",value:function(){this.tooltipEl.querySelector(".tooltip-content").innerHTML=this.options.html}},{key:"_setupEventHandlers",value:function(){this._handleMouseEnterBound=this._handleMouseEnter.bind(this),this._handleMouseLeaveBound=this._handleMouseLeave.bind(this),this._handleFocusBound=this._handleFocus.bind(this),this._handleBlurBound=this._handleBlur.bind(this),this.el.addEventListener("mouseenter",this._handleMouseEnterBound),this.el.addEventListener("mouseleave",this._handleMouseLeaveBound),this.el.addEventListener("focus",this._handleFocusBound,!0),this.el.addEventListener("blur",this._handleBlurBound,!0)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("mouseenter",this._handleMouseEnterBound),this.el.removeEventListener("mouseleave",this._handleMouseLeaveBound),this.el.removeEventListener("focus",this._handleFocusBound,!0),this.el.removeEventListener("blur",this._handleBlurBound,!0)}},{key:"open",value:function(t){this.isOpen||(t=void 0===t||void 0,this.isOpen=!0,this.options=d.extend({},this.options,this._getAttributeOptions()),this._updateTooltipContent(),this._setEnterDelayTimeout(t))}},{key:"close",value:function(){this.isOpen&&(this.isHovered=!1,this.isFocused=!1,this.isOpen=!1,this._setExitDelayTimeout())}},{key:"_setExitDelayTimeout",value:function(){var t=this;clearTimeout(this._exitDelayTimeout),this._exitDelayTimeout=setTimeout(function(){t.isHovered||t.isFocused||t._animateOut()},this.options.exitDelay)}},{key:"_setEnterDelayTimeout",value:function(t){var e=this;clearTimeout(this._enterDelayTimeout),this._enterDelayTimeout=setTimeout(function(){(e.isHovered||e.isFocused||t)&&e._animateIn()},this.options.enterDelay)}},{key:"_positionTooltip",value:function(){var t,e=this.el,i=this.tooltipEl,n=e.offsetHeight,s=e.offsetWidth,o=i.offsetHeight,a=i.offsetWidth,r=this.options.margin,l=void 0,h=void 0;this.xMovement=0,this.yMovement=0,l=e.getBoundingClientRect().top+M.getDocumentScrollTop(),h=e.getBoundingClientRect().left+M.getDocumentScrollLeft(),"top"===this.options.position?(l+=-o-r,h+=s/2-a/2,this.yMovement=-this.options.transitionMovement):"right"===this.options.position?(l+=n/2-o/2,h+=s+r,this.xMovement=this.options.transitionMovement):"left"===this.options.position?(l+=n/2-o/2,h+=-a-r,this.xMovement=-this.options.transitionMovement):(l+=n+r,h+=s/2-a/2,this.yMovement=this.options.transitionMovement),t=this._repositionWithinScreen(h,l,a,o),d(i).css({top:t.y+"px",left:t.x+"px"})}},{key:"_repositionWithinScreen",value:function(t,e,i,n){var s=M.getDocumentScrollLeft(),o=M.getDocumentScrollTop(),a=t-s,r=e-o,l={left:a,top:r,width:i,height:n},h=this.options.margin+this.options.transitionMovement,d=M.checkWithinContainer(document.body,l,h);return d.left?a=h:d.right&&(a-=a+i-window.innerWidth),d.top?r=h:d.bottom&&(r-=r+n-window.innerHeight),{x:a+s,y:r+o}}},{key:"_animateIn",value:function(){this._positionTooltip(),this.tooltipEl.style.visibility="visible",e.remove(this.tooltipEl),e({targets:this.tooltipEl,opacity:1,translateX:this.xMovement,translateY:this.yMovement,duration:this.options.inDuration,easing:"easeOutCubic"})}},{key:"_animateOut",value:function(){e.remove(this.tooltipEl),e({targets:this.tooltipEl,opacity:0,translateX:0,translateY:0,duration:this.options.outDuration,easing:"easeOutCubic"})}},{key:"_handleMouseEnter",value:function(){this.isHovered=!0,this.isFocused=!1,this.open(!1)}},{key:"_handleMouseLeave",value:function(){this.isHovered=!1,this.isFocused=!1,this.close()}},{key:"_handleFocus",value:function(){M.tabPressed&&(this.isFocused=!0,this.open(!1))}},{key:"_handleBlur",value:function(){this.isFocused=!1,this.close()}},{key:"_getAttributeOptions",value:function(){var t={},e=this.el.getAttribute("data-tooltip"),i=this.el.getAttribute("data-position");return e&&(t.html=e),i&&(t.position=i),t}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Tooltip}},{key:"defaults",get:function(){return i}}]),n}();M.Tooltip=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"tooltip","M_Tooltip")}(cash,M.anime),function(i){"use strict";var t=t||{},e=document.querySelectorAll.bind(document);function m(t){var e="";for(var i in t)t.hasOwnProperty(i)&&(e+=i+":"+t[i]+";");return e}var g={duration:750,show:function(t,e){if(2===t.button)return!1;var i=e||this,n=document.createElement("div");n.className="waves-ripple",i.appendChild(n);var s,o,a,r,l,h,d,u=(h={top:0,left:0},d=(s=i)&&s.ownerDocument,o=d.documentElement,void 0!==s.getBoundingClientRect&&(h=s.getBoundingClientRect()),a=null!==(l=r=d)&&l===l.window?r:9===r.nodeType&&r.defaultView,{top:h.top+a.pageYOffset-o.clientTop,left:h.left+a.pageXOffset-o.clientLeft}),c=t.pageY-u.top,p=t.pageX-u.left,v="scale("+i.clientWidth/100*10+")";"touches"in t&&(c=t.touches[0].pageY-u.top,p=t.touches[0].pageX-u.left),n.setAttribute("data-hold",Date.now()),n.setAttribute("data-scale",v),n.setAttribute("data-x",p),n.setAttribute("data-y",c);var f={top:c+"px",left:p+"px"};n.className=n.className+" waves-notransition",n.setAttribute("style",m(f)),n.className=n.className.replace("waves-notransition",""),f["-webkit-transform"]=v,f["-moz-transform"]=v,f["-ms-transform"]=v,f["-o-transform"]=v,f.transform=v,f.opacity="1",f["-webkit-transition-duration"]=g.duration+"ms",f["-moz-transition-duration"]=g.duration+"ms",f["-o-transition-duration"]=g.duration+"ms",f["transition-duration"]=g.duration+"ms",f["-webkit-transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",f["-moz-transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",f["-o-transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",f["transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",n.setAttribute("style",m(f))},hide:function(t){l.touchup(t);var e=this,i=(e.clientWidth,null),n=e.getElementsByClassName("waves-ripple");if(!(0i||1"+o+""+a+""+r+""),i.length&&e.prepend(i)}},{key:"_resetCurrentElement",value:function(){this.activeIndex=-1,this.$active.removeClass("active")}},{key:"_resetAutocomplete",value:function(){h(this.container).empty(),this._resetCurrentElement(),this.oldVal=null,this.isOpen=!1,this._mousedown=!1}},{key:"selectOption",value:function(t){var e=t.text().trim();this.el.value=e,this.$el.trigger("change"),this._resetAutocomplete(),this.close(),"function"==typeof this.options.onAutocomplete&&this.options.onAutocomplete.call(this,e)}},{key:"_renderDropdown",value:function(t,i){var n=this;this._resetAutocomplete();var e=[];for(var s in t)if(t.hasOwnProperty(s)&&-1!==s.toLowerCase().indexOf(i)){if(this.count>=this.options.limit)break;var o={data:t[s],key:s};e.push(o),this.count++}if(this.options.sortFunction){e.sort(function(t,e){return n.options.sortFunction(t.key.toLowerCase(),e.key.toLowerCase(),i.toLowerCase())})}for(var a=0;a");r.data?l.append(''+r.key+""):l.append(""+r.key+""),h(this.container).append(l),this._highlight(i,l)}}},{key:"open",value:function(){var t=this.el.value.toLowerCase();this._resetAutocomplete(),t.length>=this.options.minLength&&(this.isOpen=!0,this._renderDropdown(this.options.data,t)),this.dropdown.isOpen?this.dropdown.recalculateDimensions():this.dropdown.open()}},{key:"close",value:function(){this.dropdown.close()}},{key:"updateData",value:function(t){var e=this.el.value.toLowerCase();this.options.data=t,this.isOpen&&this._renderDropdown(t,e)}}],[{key:"init",value:function(t,e){return _get(s.__proto__||Object.getPrototypeOf(s),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Autocomplete}},{key:"defaults",get:function(){return e}}]),s}();t._keydown=!1,M.Autocomplete=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"autocomplete","M_Autocomplete")}(cash),function(d){M.updateTextFields=function(){d("input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], input[type=date], input[type=time], textarea").each(function(t,e){var i=d(this);0'),d("body").append(e));var i=t.css("font-family"),n=t.css("font-size"),s=t.css("line-height"),o=t.css("padding-top"),a=t.css("padding-right"),r=t.css("padding-bottom"),l=t.css("padding-left");n&&e.css("font-size",n),i&&e.css("font-family",i),s&&e.css("line-height",s),o&&e.css("padding-top",o),a&&e.css("padding-right",a),r&&e.css("padding-bottom",r),l&&e.css("padding-left",l),t.data("original-height")||t.data("original-height",t.height()),"off"===t.attr("wrap")&&e.css("overflow-wrap","normal").css("white-space","pre"),e.text(t[0].value+"\n");var h=e.html().replace(/\n/g,"
    ");e.html(h),0'),this.$slides.each(function(t,e){var i=s('
  1. ');n.$indicators.append(i[0])}),this.$el.append(this.$indicators[0]),this.$indicators=this.$indicators.children("li.indicator-item"))}},{key:"_removeIndicators",value:function(){this.$el.find("ul.indicators").remove()}},{key:"set",value:function(t){var e=this;if(t>=this.$slides.length?t=0:t<0&&(t=this.$slides.length-1),this.activeIndex!=t){this.$active=this.$slides.eq(this.activeIndex);var i=this.$active.find(".caption");this.$active.removeClass("active"),o({targets:this.$active[0],opacity:0,duration:this.options.duration,easing:"easeOutQuad",complete:function(){e.$slides.not(".active").each(function(t){o({targets:t,opacity:0,translateX:0,translateY:0,duration:0,easing:"easeOutQuad"})})}}),this._animateCaptionIn(i[0],this.options.duration),this.options.indicators&&(this.$indicators.eq(this.activeIndex).removeClass("active"),this.$indicators.eq(t).addClass("active")),o({targets:this.$slides.eq(t)[0],opacity:1,duration:this.options.duration,easing:"easeOutQuad"}),o({targets:this.$slides.eq(t).find(".caption")[0],opacity:1,translateX:0,translateY:0,duration:this.options.duration,delay:this.options.duration,easing:"easeOutQuad"}),this.$slides.eq(t).addClass("active"),this.activeIndex=t,this.start()}}},{key:"pause",value:function(){clearInterval(this.interval)}},{key:"start",value:function(){clearInterval(this.interval),this.interval=setInterval(this._handleIntervalBound,this.options.duration+this.options.interval)}},{key:"next",value:function(){var t=this.activeIndex+1;t>=this.$slides.length?t=0:t<0&&(t=this.$slides.length-1),this.set(t)}},{key:"prev",value:function(){var t=this.activeIndex-1;t>=this.$slides.length?t=0:t<0&&(t=this.$slides.length-1),this.set(t)}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Slider}},{key:"defaults",get:function(){return e}}]),n}();M.Slider=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"slider","M_Slider")}(cash,M.anime),function(n,s){n(document).on("click",".card",function(t){if(n(this).children(".card-reveal").length){var i=n(t.target).closest(".card");void 0===i.data("initialOverflow")&&i.data("initialOverflow",void 0===i.css("overflow")?"":i.css("overflow"));var e=n(this).find(".card-reveal");n(t.target).is(n(".card-reveal .card-title"))||n(t.target).is(n(".card-reveal .card-title i"))?s({targets:e[0],translateY:0,duration:225,easing:"easeInOutQuad",complete:function(t){var e=t.animatables[0].target;n(e).css({display:"none"}),i.css("overflow",i.data("initialOverflow"))}}):(n(t.target).is(n(".card .activator"))||n(t.target).is(n(".card .activator i")))&&(i.css("overflow","hidden"),e.css({display:"block"}),s({targets:e[0],translateY:"-100%",duration:300,easing:"easeInOutQuad"}))}})}(cash,M.anime),function(h){"use strict";var e={data:[],placeholder:"",secondaryPlaceholder:"",autocompleteOptions:{},limit:1/0,onChipAdd:null,onChipSelect:null,onChipDelete:null},t=function(t){function l(t,e){_classCallCheck(this,l);var i=_possibleConstructorReturn(this,(l.__proto__||Object.getPrototypeOf(l)).call(this,l,t,e));return(i.el.M_Chips=i).options=h.extend({},l.defaults,e),i.$el.addClass("chips input-field"),i.chipsData=[],i.$chips=h(),i._setupInput(),i.hasAutocomplete=0"),this.$el.append(this.$input)),this.$input.addClass("input")}},{key:"_setupLabel",value:function(){this.$label=this.$el.find("label"),this.$label.length&&this.$label.setAttribute("for",this.$input.attr("id"))}},{key:"_setPlaceholder",value:function(){void 0!==this.chipsData&&!this.chipsData.length&&this.options.placeholder?h(this.$input).prop("placeholder",this.options.placeholder):(void 0===this.chipsData||this.chipsData.length)&&this.options.secondaryPlaceholder&&h(this.$input).prop("placeholder",this.options.secondaryPlaceholder)}},{key:"_isValid",value:function(t){if(t.hasOwnProperty("tag")&&""!==t.tag){for(var e=!1,i=0;i=this.options.limit)){var e=this._renderChip(t);this.$chips.add(e),this.chipsData.push(t),h(this.$input).before(e),this._setPlaceholder(),"function"==typeof this.options.onChipAdd&&this.options.onChipAdd.call(this,this.$el,e)}}},{key:"deleteChip",value:function(t){var e=this.$chips.eq(t);this.$chips.eq(t).remove(),this.$chips=this.$chips.filter(function(t){return 0<=h(t).index()}),this.chipsData.splice(t,1),this._setPlaceholder(),"function"==typeof this.options.onChipDelete&&this.options.onChipDelete.call(this,this.$el,e[0])}},{key:"selectChip",value:function(t){var e=this.$chips.eq(t);(this._selectedChip=e)[0].focus(),"function"==typeof this.options.onChipSelect&&this.options.onChipSelect.call(this,this.$el,e[0])}}],[{key:"init",value:function(t,e){return _get(l.__proto__||Object.getPrototypeOf(l),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Chips}},{key:"_handleChipsKeydown",value:function(t){l._keydown=!0;var e=h(t.target).closest(".chips"),i=t.target&&e.length;if(!h(t.target).is("input, textarea")&&i){var n=e[0].M_Chips;if(8===t.keyCode||46===t.keyCode){t.preventDefault();var s=n.chipsData.length;if(n._selectedChip){var o=n._selectedChip.index();n.deleteChip(o),n._selectedChip=null,s=Math.max(o-1,0)}n.chipsData.length&&n.selectChip(s)}else if(37===t.keyCode){if(n._selectedChip){var a=n._selectedChip.index()-1;if(a<0)return;n.selectChip(a)}}else if(39===t.keyCode&&n._selectedChip){var r=n._selectedChip.index()+1;r>=n.chipsData.length?n.$input[0].focus():n.selectChip(r)}}}},{key:"_handleChipsKeyup",value:function(t){l._keydown=!1}},{key:"_handleChipsBlur",value:function(t){l._keydown||(h(t.target).closest(".chips")[0].M_Chips._selectedChip=null)}},{key:"defaults",get:function(){return e}}]),l}();t._keydown=!1,M.Chips=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"chips","M_Chips"),h(document).ready(function(){h(document.body).on("click",".chip .close",function(){var t=h(this).closest(".chips");t.length&&t[0].M_Chips||h(this).closest(".chip").remove()})})}(cash),function(s){"use strict";var e={top:0,bottom:1/0,offset:0,onPositionChange:null},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Pushpin=i).options=s.extend({},n.defaults,e),i.originalOffset=i.el.offsetTop,n._pushpins.push(i),i._setupEventHandlers(),i._updatePosition(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this.el.style.top=null,this._removePinClasses(),this._removeEventHandlers();var t=n._pushpins.indexOf(this);n._pushpins.splice(t,1)}},{key:"_setupEventHandlers",value:function(){document.addEventListener("scroll",n._updateElements)}},{key:"_removeEventHandlers",value:function(){document.removeEventListener("scroll",n._updateElements)}},{key:"_updatePosition",value:function(){var t=M.getDocumentScrollTop()+this.options.offset;this.options.top<=t&&this.options.bottom>=t&&!this.el.classList.contains("pinned")&&(this._removePinClasses(),this.el.style.top=this.options.offset+"px",this.el.classList.add("pinned"),"function"==typeof this.options.onPositionChange&&this.options.onPositionChange.call(this,"pinned")),tthis.options.bottom&&!this.el.classList.contains("pin-bottom")&&(this._removePinClasses(),this.el.classList.add("pin-bottom"),this.el.style.top=this.options.bottom-this.originalOffset+"px","function"==typeof this.options.onPositionChange&&this.options.onPositionChange.call(this,"pin-bottom"))}},{key:"_removePinClasses",value:function(){this.el.classList.remove("pin-top"),this.el.classList.remove("pinned"),this.el.classList.remove("pin-bottom")}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Pushpin}},{key:"_updateElements",value:function(){for(var t in n._pushpins){n._pushpins[t]._updatePosition()}}},{key:"defaults",get:function(){return e}}]),n}();t._pushpins=[],M.Pushpin=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"pushpin","M_Pushpin")}(cash),function(r,s){"use strict";var e={direction:"top",hoverEnabled:!0,toolbarEnabled:!1};r.fn.reverse=[].reverse;var t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_FloatingActionButton=i).options=r.extend({},n.defaults,e),i.isOpen=!1,i.$anchor=i.$el.children("a").first(),i.$menu=i.$el.children("ul").first(),i.$floatingBtns=i.$el.find("ul .btn-floating"),i.$floatingBtnsReverse=i.$el.find("ul .btn-floating").reverse(),i.offsetY=0,i.offsetX=0,i.$el.addClass("direction-"+i.options.direction),"top"===i.options.direction?i.offsetY=40:"right"===i.options.direction?i.offsetX=-40:"bottom"===i.options.direction?i.offsetY=-40:i.offsetX=40,i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.M_FloatingActionButton=void 0}},{key:"_setupEventHandlers",value:function(){this._handleFABClickBound=this._handleFABClick.bind(this),this._handleOpenBound=this.open.bind(this),this._handleCloseBound=this.close.bind(this),this.options.hoverEnabled&&!this.options.toolbarEnabled?(this.el.addEventListener("mouseenter",this._handleOpenBound),this.el.addEventListener("mouseleave",this._handleCloseBound)):this.el.addEventListener("click",this._handleFABClickBound)}},{key:"_removeEventHandlers",value:function(){this.options.hoverEnabled&&!this.options.toolbarEnabled?(this.el.removeEventListener("mouseenter",this._handleOpenBound),this.el.removeEventListener("mouseleave",this._handleCloseBound)):this.el.removeEventListener("click",this._handleFABClickBound)}},{key:"_handleFABClick",value:function(){this.isOpen?this.close():this.open()}},{key:"_handleDocumentClick",value:function(t){r(t.target).closest(this.$menu).length||this.close()}},{key:"open",value:function(){this.isOpen||(this.options.toolbarEnabled?this._animateInToolbar():this._animateInFAB(),this.isOpen=!0)}},{key:"close",value:function(){this.isOpen&&(this.options.toolbarEnabled?(window.removeEventListener("scroll",this._handleCloseBound,!0),document.body.removeEventListener("click",this._handleDocumentClickBound,!0),this._animateOutToolbar()):this._animateOutFAB(),this.isOpen=!1)}},{key:"_animateInFAB",value:function(){var e=this;this.$el.addClass("active");var i=0;this.$floatingBtnsReverse.each(function(t){s({targets:t,opacity:1,scale:[.4,1],translateY:[e.offsetY,0],translateX:[e.offsetX,0],duration:275,delay:i,easing:"easeInOutQuad"}),i+=40})}},{key:"_animateOutFAB",value:function(){var e=this;this.$floatingBtnsReverse.each(function(t){s.remove(t),s({targets:t,opacity:0,scale:.4,translateY:e.offsetY,translateX:e.offsetX,duration:175,easing:"easeOutQuad",complete:function(){e.$el.removeClass("active")}})})}},{key:"_animateInToolbar",value:function(){var t,e=this,i=window.innerWidth,n=window.innerHeight,s=this.el.getBoundingClientRect(),o=r('
    '),a=this.$anchor.css("background-color");this.$anchor.append(o),this.offsetX=s.left-i/2+s.width/2,this.offsetY=n-s.bottom,t=i/o[0].clientWidth,this.btnBottom=s.bottom,this.btnLeft=s.left,this.btnWidth=s.width,this.$el.addClass("active"),this.$el.css({"text-align":"center",width:"100%",bottom:0,left:0,transform:"translateX("+this.offsetX+"px)",transition:"none"}),this.$anchor.css({transform:"translateY("+-this.offsetY+"px)",transition:"none"}),o.css({"background-color":a}),setTimeout(function(){e.$el.css({transform:"",transition:"transform .2s cubic-bezier(0.550, 0.085, 0.680, 0.530), background-color 0s linear .2s"}),e.$anchor.css({overflow:"visible",transform:"",transition:"transform .2s"}),setTimeout(function(){e.$el.css({overflow:"hidden","background-color":a}),o.css({transform:"scale("+t+")",transition:"transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)"}),e.$menu.children("li").children("a").css({opacity:1}),e._handleDocumentClickBound=e._handleDocumentClick.bind(e),window.addEventListener("scroll",e._handleCloseBound,!0),document.body.addEventListener("click",e._handleDocumentClickBound,!0)},100)},0)}},{key:"_animateOutToolbar",value:function(){var t=this,e=window.innerWidth,i=window.innerHeight,n=this.$el.find(".fab-backdrop"),s=this.$anchor.css("background-color");this.offsetX=this.btnLeft-e/2+this.btnWidth/2,this.offsetY=i-this.btnBottom,this.$el.removeClass("active"),this.$el.css({"background-color":"transparent",transition:"none"}),this.$anchor.css({transition:"none"}),n.css({transform:"scale(0)","background-color":s}),this.$menu.children("li").children("a").css({opacity:""}),setTimeout(function(){n.remove(),t.$el.css({"text-align":"",width:"",bottom:"",left:"",overflow:"","background-color":"",transform:"translate3d("+-t.offsetX+"px,0,0)"}),t.$anchor.css({overflow:"",transform:"translate3d(0,"+t.offsetY+"px,0)"}),setTimeout(function(){t.$el.css({transform:"translate3d(0,0,0)",transition:"transform .2s"}),t.$anchor.css({transform:"translate3d(0,0,0)",transition:"transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)"})},20)},200)}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_FloatingActionButton}},{key:"defaults",get:function(){return e}}]),n}();M.FloatingActionButton=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"floatingActionButton","M_FloatingActionButton")}(cash,M.anime),function(g){"use strict";var e={autoClose:!1,format:"mmm dd, yyyy",parse:null,defaultDate:null,setDefaultDate:!1,disableWeekends:!1,disableDayFn:null,firstDay:0,minDate:null,maxDate:null,yearRange:10,minYear:0,maxYear:9999,minMonth:void 0,maxMonth:void 0,startRange:null,endRange:null,isRTL:!1,showMonthAfterYear:!1,showDaysInNextAndPreviousMonths:!1,container:null,showClearBtn:!1,i18n:{cancel:"Cancel",clear:"Clear",done:"Ok",previousMonth:"‹",nextMonth:"›",months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],weekdays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],weekdaysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],weekdaysAbbrev:["S","M","T","W","T","F","S"]},events:[],onSelect:null,onOpen:null,onClose:null,onDraw:null},t=function(t){function B(t,e){_classCallCheck(this,B);var i=_possibleConstructorReturn(this,(B.__proto__||Object.getPrototypeOf(B)).call(this,B,t,e));(i.el.M_Datepicker=i).options=g.extend({},B.defaults,e),e&&e.hasOwnProperty("i18n")&&"object"==typeof e.i18n&&(i.options.i18n=g.extend({},B.defaults.i18n,e.i18n)),i.options.minDate&&i.options.minDate.setHours(0,0,0,0),i.options.maxDate&&i.options.maxDate.setHours(0,0,0,0),i.id=M.guid(),i._setupVariables(),i._insertHTMLIntoDOM(),i._setupModal(),i._setupEventHandlers(),i.options.defaultDate||(i.options.defaultDate=new Date(Date.parse(i.el.value)));var n=i.options.defaultDate;return B._isDate(n)?i.options.setDefaultDate?(i.setDate(n,!0),i.setInputValue()):i.gotoDate(n):i.gotoDate(new Date),i.isOpen=!1,i}return _inherits(B,Component),_createClass(B,[{key:"destroy",value:function(){this._removeEventHandlers(),this.modal.destroy(),g(this.modalEl).remove(),this.destroySelects(),this.el.M_Datepicker=void 0}},{key:"destroySelects",value:function(){var t=this.calendarEl.querySelector(".orig-select-year");t&&M.FormSelect.getInstance(t).destroy();var e=this.calendarEl.querySelector(".orig-select-month");e&&M.FormSelect.getInstance(e).destroy()}},{key:"_insertHTMLIntoDOM",value:function(){this.options.showClearBtn&&(g(this.clearBtn).css({visibility:""}),this.clearBtn.innerHTML=this.options.i18n.clear),this.doneBtn.innerHTML=this.options.i18n.done,this.cancelBtn.innerHTML=this.options.i18n.cancel,this.options.container?this.$modalEl.appendTo(this.options.container):this.$modalEl.insertBefore(this.el)}},{key:"_setupModal",value:function(){var t=this;this.modalEl.id="modal-"+this.id,this.modal=M.Modal.init(this.modalEl,{onCloseEnd:function(){t.isOpen=!1}})}},{key:"toString",value:function(t){var e=this;return t=t||this.options.format,B._isDate(this.date)?t.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g).map(function(t){return e.formats[t]?e.formats[t]():t}).join(""):""}},{key:"setDate",value:function(t,e){if(!t)return this.date=null,this._renderDateDisplay(),this.draw();if("string"==typeof t&&(t=new Date(Date.parse(t))),B._isDate(t)){var i=this.options.minDate,n=this.options.maxDate;B._isDate(i)&&tn.maxDate||n.disableWeekends&&B._isWeekend(y)||n.disableDayFn&&n.disableDayFn(y),isEmpty:C,isStartRange:x,isEndRange:L,isInRange:T,showDaysInNextAndPreviousMonths:n.showDaysInNextAndPreviousMonths};l.push(this.renderDay($)),7==++_&&(r.push(this.renderRow(l,n.isRTL,m)),_=0,m=!(l=[]))}return this.renderTable(n,r,i)}},{key:"renderDay",value:function(t){var e=[],i="false";if(t.isEmpty){if(!t.showDaysInNextAndPreviousMonths)return'';e.push("is-outside-current-month"),e.push("is-selection-disabled")}return t.isDisabled&&e.push("is-disabled"),t.isToday&&e.push("is-today"),t.isSelected&&(e.push("is-selected"),i="true"),t.hasEvent&&e.push("has-event"),t.isInRange&&e.push("is-inrange"),t.isStartRange&&e.push("is-startrange"),t.isEndRange&&e.push("is-endrange"),'"}},{key:"renderRow",value:function(t,e,i){return''+(e?t.reverse():t).join("")+""}},{key:"renderTable",value:function(t,e,i){return'
    '+this.renderHead(t)+this.renderBody(e)+"
    "}},{key:"renderHead",value:function(t){var e=void 0,i=[];for(e=0;e<7;e++)i.push(''+this.renderDayName(t,e,!0)+"");return""+(t.isRTL?i.reverse():i).join("")+""}},{key:"renderBody",value:function(t){return""+t.join("")+""}},{key:"renderTitle",value:function(t,e,i,n,s,o){var a,r,l=void 0,h=void 0,d=void 0,u=this.options,c=i===u.minYear,p=i===u.maxYear,v='
    ',f=!0,m=!0;for(d=[],l=0;l<12;l++)d.push('");for(a='",g.isArray(u.yearRange)?(l=u.yearRange[0],h=u.yearRange[1]+1):(l=i-u.yearRange,h=1+i+u.yearRange),d=[];l=u.minYear&&d.push('");r='";v+='',v+='
    ',u.showMonthAfterYear?v+=r+a:v+=a+r,v+="
    ",c&&(0===n||u.minMonth>=n)&&(f=!1),p&&(11===n||u.maxMonth<=n)&&(m=!1);return(v+='')+"
    "}},{key:"draw",value:function(t){if(this.isOpen||t){var e,i=this.options,n=i.minYear,s=i.maxYear,o=i.minMonth,a=i.maxMonth,r="";this._y<=n&&(this._y=n,!isNaN(o)&&this._m=s&&(this._y=s,!isNaN(a)&&this._m>a&&(this._m=a)),e="datepicker-title-"+Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,2);for(var l=0;l<1;l++)this._renderDateDisplay(),r+=this.renderTitle(this,l,this.calendars[l].year,this.calendars[l].month,this.calendars[0].year,e)+this.render(this.calendars[l].year,this.calendars[l].month,e);this.destroySelects(),this.calendarEl.innerHTML=r;var h=this.calendarEl.querySelector(".orig-select-year"),d=this.calendarEl.querySelector(".orig-select-month");M.FormSelect.init(h,{classes:"select-year",dropdownOptions:{container:document.body,constrainWidth:!1}}),M.FormSelect.init(d,{classes:"select-month",dropdownOptions:{container:document.body,constrainWidth:!1}}),h.addEventListener("change",this._handleYearChange.bind(this)),d.addEventListener("change",this._handleMonthChange.bind(this)),"function"==typeof this.options.onDraw&&this.options.onDraw(this)}}},{key:"_setupEventHandlers",value:function(){this._handleInputKeydownBound=this._handleInputKeydown.bind(this),this._handleInputClickBound=this._handleInputClick.bind(this),this._handleInputChangeBound=this._handleInputChange.bind(this),this._handleCalendarClickBound=this._handleCalendarClick.bind(this),this._finishSelectionBound=this._finishSelection.bind(this),this._handleMonthChange=this._handleMonthChange.bind(this),this._closeBound=this.close.bind(this),this.el.addEventListener("click",this._handleInputClickBound),this.el.addEventListener("keydown",this._handleInputKeydownBound),this.el.addEventListener("change",this._handleInputChangeBound),this.calendarEl.addEventListener("click",this._handleCalendarClickBound),this.doneBtn.addEventListener("click",this._finishSelectionBound),this.cancelBtn.addEventListener("click",this._closeBound),this.options.showClearBtn&&(this._handleClearClickBound=this._handleClearClick.bind(this),this.clearBtn.addEventListener("click",this._handleClearClickBound))}},{key:"_setupVariables",value:function(){var e=this;this.$modalEl=g(B._template),this.modalEl=this.$modalEl[0],this.calendarEl=this.modalEl.querySelector(".datepicker-calendar"),this.yearTextEl=this.modalEl.querySelector(".year-text"),this.dateTextEl=this.modalEl.querySelector(".date-text"),this.options.showClearBtn&&(this.clearBtn=this.modalEl.querySelector(".datepicker-clear")),this.doneBtn=this.modalEl.querySelector(".datepicker-done"),this.cancelBtn=this.modalEl.querySelector(".datepicker-cancel"),this.formats={d:function(){return e.date.getDate()},dd:function(){var t=e.date.getDate();return(t<10?"0":"")+t},ddd:function(){return e.options.i18n.weekdaysShort[e.date.getDay()]},dddd:function(){return e.options.i18n.weekdays[e.date.getDay()]},m:function(){return e.date.getMonth()+1},mm:function(){var t=e.date.getMonth()+1;return(t<10?"0":"")+t},mmm:function(){return e.options.i18n.monthsShort[e.date.getMonth()]},mmmm:function(){return e.options.i18n.months[e.date.getMonth()]},yy:function(){return(""+e.date.getFullYear()).slice(2)},yyyy:function(){return e.date.getFullYear()}}}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleInputClickBound),this.el.removeEventListener("keydown",this._handleInputKeydownBound),this.el.removeEventListener("change",this._handleInputChangeBound),this.calendarEl.removeEventListener("click",this._handleCalendarClickBound)}},{key:"_handleInputClick",value:function(){this.open()}},{key:"_handleInputKeydown",value:function(t){t.which===M.keys.ENTER&&(t.preventDefault(),this.open())}},{key:"_handleCalendarClick",value:function(t){if(this.isOpen){var e=g(t.target);e.hasClass("is-disabled")||(!e.hasClass("datepicker-day-button")||e.hasClass("is-empty")||e.parent().hasClass("is-disabled")?e.closest(".month-prev").length?this.prevMonth():e.closest(".month-next").length&&this.nextMonth():(this.setDate(new Date(t.target.getAttribute("data-year"),t.target.getAttribute("data-month"),t.target.getAttribute("data-day"))),this.options.autoClose&&this._finishSelection()))}}},{key:"_handleClearClick",value:function(){this.date=null,this.setInputValue(),this.close()}},{key:"_handleMonthChange",value:function(t){this.gotoMonth(t.target.value)}},{key:"_handleYearChange",value:function(t){this.gotoYear(t.target.value)}},{key:"gotoMonth",value:function(t){isNaN(t)||(this.calendars[0].month=parseInt(t,10),this.adjustCalendars())}},{key:"gotoYear",value:function(t){isNaN(t)||(this.calendars[0].year=parseInt(t,10),this.adjustCalendars())}},{key:"_handleInputChange",value:function(t){var e=void 0;t.firedBy!==this&&(e=this.options.parse?this.options.parse(this.el.value,this.options.format):new Date(Date.parse(this.el.value)),B._isDate(e)&&this.setDate(e))}},{key:"renderDayName",value:function(t,e,i){for(e+=t.firstDay;7<=e;)e-=7;return i?t.i18n.weekdaysAbbrev[e]:t.i18n.weekdays[e]}},{key:"_finishSelection",value:function(){this.setInputValue(),this.close()}},{key:"open",value:function(){if(!this.isOpen)return this.isOpen=!0,"function"==typeof this.options.onOpen&&this.options.onOpen.call(this),this.draw(),this.modal.open(),this}},{key:"close",value:function(){if(this.isOpen)return this.isOpen=!1,"function"==typeof this.options.onClose&&this.options.onClose.call(this),this.modal.close(),this}}],[{key:"init",value:function(t,e){return _get(B.__proto__||Object.getPrototypeOf(B),"init",this).call(this,this,t,e)}},{key:"_isDate",value:function(t){return/Date/.test(Object.prototype.toString.call(t))&&!isNaN(t.getTime())}},{key:"_isWeekend",value:function(t){var e=t.getDay();return 0===e||6===e}},{key:"_setToStartOfDay",value:function(t){B._isDate(t)&&t.setHours(0,0,0,0)}},{key:"_getDaysInMonth",value:function(t,e){return[31,B._isLeapYear(t)?29:28,31,30,31,30,31,31,30,31,30,31][e]}},{key:"_isLeapYear",value:function(t){return t%4==0&&t%100!=0||t%400==0}},{key:"_compareDates",value:function(t,e){return t.getTime()===e.getTime()}},{key:"_setToStartOfDay",value:function(t){B._isDate(t)&&t.setHours(0,0,0,0)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Datepicker}},{key:"defaults",get:function(){return e}}]),B}();t._template=['"].join(""),M.Datepicker=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"datepicker","M_Datepicker")}(cash),function(h){"use strict";var e={dialRadius:135,outerRadius:105,innerRadius:70,tickRadius:20,duration:350,container:null,defaultTime:"now",fromNow:0,showClearBtn:!1,i18n:{cancel:"Cancel",clear:"Clear",done:"Ok"},autoClose:!1,twelveHour:!0,vibrate:!0,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null,onSelect:null},t=function(t){function f(t,e){_classCallCheck(this,f);var i=_possibleConstructorReturn(this,(f.__proto__||Object.getPrototypeOf(f)).call(this,f,t,e));return(i.el.M_Timepicker=i).options=h.extend({},f.defaults,e),i.id=M.guid(),i._insertHTMLIntoDOM(),i._setupModal(),i._setupVariables(),i._setupEventHandlers(),i._clockSetup(),i._pickerSetup(),i}return _inherits(f,Component),_createClass(f,[{key:"destroy",value:function(){this._removeEventHandlers(),this.modal.destroy(),h(this.modalEl).remove(),this.el.M_Timepicker=void 0}},{key:"_setupEventHandlers",value:function(){this._handleInputKeydownBound=this._handleInputKeydown.bind(this),this._handleInputClickBound=this._handleInputClick.bind(this),this._handleClockClickStartBound=this._handleClockClickStart.bind(this),this._handleDocumentClickMoveBound=this._handleDocumentClickMove.bind(this),this._handleDocumentClickEndBound=this._handleDocumentClickEnd.bind(this),this.el.addEventListener("click",this._handleInputClickBound),this.el.addEventListener("keydown",this._handleInputKeydownBound),this.plate.addEventListener("mousedown",this._handleClockClickStartBound),this.plate.addEventListener("touchstart",this._handleClockClickStartBound),h(this.spanHours).on("click",this.showView.bind(this,"hours")),h(this.spanMinutes).on("click",this.showView.bind(this,"minutes"))}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleInputClickBound),this.el.removeEventListener("keydown",this._handleInputKeydownBound)}},{key:"_handleInputClick",value:function(){this.open()}},{key:"_handleInputKeydown",value:function(t){t.which===M.keys.ENTER&&(t.preventDefault(),this.open())}},{key:"_handleClockClickStart",value:function(t){t.preventDefault();var e=this.plate.getBoundingClientRect(),i=e.left,n=e.top;this.x0=i+this.options.dialRadius,this.y0=n+this.options.dialRadius,this.moved=!1;var s=f._Pos(t);this.dx=s.x-this.x0,this.dy=s.y-this.y0,this.setHand(this.dx,this.dy,!1),document.addEventListener("mousemove",this._handleDocumentClickMoveBound),document.addEventListener("touchmove",this._handleDocumentClickMoveBound),document.addEventListener("mouseup",this._handleDocumentClickEndBound),document.addEventListener("touchend",this._handleDocumentClickEndBound)}},{key:"_handleDocumentClickMove",value:function(t){t.preventDefault();var e=f._Pos(t),i=e.x-this.x0,n=e.y-this.y0;this.moved=!0,this.setHand(i,n,!1,!0)}},{key:"_handleDocumentClickEnd",value:function(t){var e=this;t.preventDefault(),document.removeEventListener("mouseup",this._handleDocumentClickEndBound),document.removeEventListener("touchend",this._handleDocumentClickEndBound);var i=f._Pos(t),n=i.x-this.x0,s=i.y-this.y0;this.moved&&n===this.dx&&s===this.dy&&this.setHand(n,s),"hours"===this.currentView?this.showView("minutes",this.options.duration/2):this.options.autoClose&&(h(this.minutesView).addClass("timepicker-dial-out"),setTimeout(function(){e.done()},this.options.duration/2)),"function"==typeof this.options.onSelect&&this.options.onSelect.call(this,this.hours,this.minutes),document.removeEventListener("mousemove",this._handleDocumentClickMoveBound),document.removeEventListener("touchmove",this._handleDocumentClickMoveBound)}},{key:"_insertHTMLIntoDOM",value:function(){this.$modalEl=h(f._template),this.modalEl=this.$modalEl[0],this.modalEl.id="modal-"+this.id;var t=document.querySelector(this.options.container);this.options.container&&t?this.$modalEl.appendTo(t):this.$modalEl.insertBefore(this.el)}},{key:"_setupModal",value:function(){var t=this;this.modal=M.Modal.init(this.modalEl,{onOpenStart:this.options.onOpenStart,onOpenEnd:this.options.onOpenEnd,onCloseStart:this.options.onCloseStart,onCloseEnd:function(){"function"==typeof t.options.onCloseEnd&&t.options.onCloseEnd.call(t),t.isOpen=!1}})}},{key:"_setupVariables",value:function(){this.currentView="hours",this.vibrate=navigator.vibrate?"vibrate":navigator.webkitVibrate?"webkitVibrate":null,this._canvas=this.modalEl.querySelector(".timepicker-canvas"),this.plate=this.modalEl.querySelector(".timepicker-plate"),this.hoursView=this.modalEl.querySelector(".timepicker-hours"),this.minutesView=this.modalEl.querySelector(".timepicker-minutes"),this.spanHours=this.modalEl.querySelector(".timepicker-span-hours"),this.spanMinutes=this.modalEl.querySelector(".timepicker-span-minutes"),this.spanAmPm=this.modalEl.querySelector(".timepicker-span-am-pm"),this.footer=this.modalEl.querySelector(".timepicker-footer"),this.amOrPm="PM"}},{key:"_pickerSetup",value:function(){var t=h('").appendTo(this.footer).on("click",this.clear.bind(this));this.options.showClearBtn&&t.css({visibility:""});var e=h('
    ');h('").appendTo(e).on("click",this.close.bind(this)),h('").appendTo(e).on("click",this.done.bind(this)),e.appendTo(this.footer)}},{key:"_clockSetup",value:function(){this.options.twelveHour&&(this.$amBtn=h('
    AM
    '),this.$pmBtn=h('
    PM
    '),this.$amBtn.on("click",this._handleAmPmClick.bind(this)).appendTo(this.spanAmPm),this.$pmBtn.on("click",this._handleAmPmClick.bind(this)).appendTo(this.spanAmPm)),this._buildHoursView(),this._buildMinutesView(),this._buildSVGClock()}},{key:"_buildSVGClock",value:function(){var t=this.options.dialRadius,e=this.options.tickRadius,i=2*t,n=f._createSVGEl("svg");n.setAttribute("class","timepicker-svg"),n.setAttribute("width",i),n.setAttribute("height",i);var s=f._createSVGEl("g");s.setAttribute("transform","translate("+t+","+t+")");var o=f._createSVGEl("circle");o.setAttribute("class","timepicker-canvas-bearing"),o.setAttribute("cx",0),o.setAttribute("cy",0),o.setAttribute("r",4);var a=f._createSVGEl("line");a.setAttribute("x1",0),a.setAttribute("y1",0);var r=f._createSVGEl("circle");r.setAttribute("class","timepicker-canvas-bg"),r.setAttribute("r",e),s.appendChild(a),s.appendChild(r),s.appendChild(o),n.appendChild(s),this._canvas.appendChild(n),this.hand=a,this.bg=r,this.bearing=o,this.g=s}},{key:"_buildHoursView",value:function(){var t=h('
    ');if(this.options.twelveHour)for(var e=1;e<13;e+=1){var i=t.clone(),n=e/6*Math.PI,s=this.options.outerRadius;i.css({left:this.options.dialRadius+Math.sin(n)*s-this.options.tickRadius+"px",top:this.options.dialRadius-Math.cos(n)*s-this.options.tickRadius+"px"}),i.html(0===e?"00":e),this.hoursView.appendChild(i[0])}else for(var o=0;o<24;o+=1){var a=t.clone(),r=o/6*Math.PI,l=0'),e=0;e<60;e+=5){var i=t.clone(),n=e/30*Math.PI;i.css({left:this.options.dialRadius+Math.sin(n)*this.options.outerRadius-this.options.tickRadius+"px",top:this.options.dialRadius-Math.cos(n)*this.options.outerRadius-this.options.tickRadius+"px"}),i.html(f._addLeadingZero(e)),this.minutesView.appendChild(i[0])}}},{key:"_handleAmPmClick",value:function(t){var e=h(t.target);this.amOrPm=e.hasClass("am-btn")?"AM":"PM",this._updateAmPmView()}},{key:"_updateAmPmView",value:function(){this.options.twelveHour&&(this.$amBtn.toggleClass("text-primary","AM"===this.amOrPm),this.$pmBtn.toggleClass("text-primary","PM"===this.amOrPm))}},{key:"_updateTimeFromInput",value:function(){var t=((this.el.value||this.options.defaultTime||"")+"").split(":");if(this.options.twelveHour&&void 0!==t[1]&&(0','",""].join(""),M.Timepicker=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"timepicker","M_Timepicker")}(cash),function(s){"use strict";var e={},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_CharacterCounter=i).options=s.extend({},n.defaults,e),i.isInvalid=!1,i.isValidLength=!1,i._setupCounter(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.CharacterCounter=void 0,this._removeCounter()}},{key:"_setupEventHandlers",value:function(){this._handleUpdateCounterBound=this.updateCounter.bind(this),this.el.addEventListener("focus",this._handleUpdateCounterBound,!0),this.el.addEventListener("input",this._handleUpdateCounterBound,!0)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("focus",this._handleUpdateCounterBound,!0),this.el.removeEventListener("input",this._handleUpdateCounterBound,!0)}},{key:"_setupCounter",value:function(){this.counterEl=document.createElement("span"),s(this.counterEl).addClass("character-counter").css({float:"right","font-size":"12px",height:1}),this.$el.parent().append(this.counterEl)}},{key:"_removeCounter",value:function(){s(this.counterEl).remove()}},{key:"updateCounter",value:function(){var t=+this.$el.attr("data-length"),e=this.el.value.length;this.isValidLength=e<=t;var i=e;t&&(i+="/"+t,this._validateInput()),s(this.counterEl).html(i)}},{key:"_validateInput",value:function(){this.isValidLength&&this.isInvalid?(this.isInvalid=!1,this.$el.removeClass("invalid")):this.isValidLength||this.isInvalid||(this.isInvalid=!0,this.$el.removeClass("valid"),this.$el.addClass("invalid"))}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_CharacterCounter}},{key:"defaults",get:function(){return e}}]),n}();M.CharacterCounter=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"characterCounter","M_CharacterCounter")}(cash),function(b){"use strict";var e={duration:200,dist:-100,shift:0,padding:0,numVisible:5,fullWidth:!1,indicators:!1,noWrap:!1,onCycleTo:null},t=function(t){function i(t,e){_classCallCheck(this,i);var n=_possibleConstructorReturn(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,i,t,e));return(n.el.M_Carousel=n).options=b.extend({},i.defaults,e),n.hasMultipleSlides=1'),n.$el.find(".carousel-item").each(function(t,e){if(n.images.push(t),n.showIndicators){var i=b('
  2. ');0===e&&i[0].classList.add("active"),n.$indicators.append(i)}}),n.showIndicators&&n.$el.append(n.$indicators),n.count=n.images.length,n.options.numVisible=Math.min(n.count,n.options.numVisible),n.xform="transform",["webkit","Moz","O","ms"].every(function(t){var e=t+"Transform";return void 0===document.body.style[e]||(n.xform=e,!1)}),n._setupEventHandlers(),n._scroll(n.offset),n}return _inherits(i,Component),_createClass(i,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.M_Carousel=void 0}},{key:"_setupEventHandlers",value:function(){var i=this;this._handleCarouselTapBound=this._handleCarouselTap.bind(this),this._handleCarouselDragBound=this._handleCarouselDrag.bind(this),this._handleCarouselReleaseBound=this._handleCarouselRelease.bind(this),this._handleCarouselClickBound=this._handleCarouselClick.bind(this),void 0!==window.ontouchstart&&(this.el.addEventListener("touchstart",this._handleCarouselTapBound),this.el.addEventListener("touchmove",this._handleCarouselDragBound),this.el.addEventListener("touchend",this._handleCarouselReleaseBound)),this.el.addEventListener("mousedown",this._handleCarouselTapBound),this.el.addEventListener("mousemove",this._handleCarouselDragBound),this.el.addEventListener("mouseup",this._handleCarouselReleaseBound),this.el.addEventListener("mouseleave",this._handleCarouselReleaseBound),this.el.addEventListener("click",this._handleCarouselClickBound),this.showIndicators&&this.$indicators&&(this._handleIndicatorClickBound=this._handleIndicatorClick.bind(this),this.$indicators.find(".indicator-item").each(function(t,e){t.addEventListener("click",i._handleIndicatorClickBound)}));var t=M.throttle(this._handleResize,200);this._handleThrottledResizeBound=t.bind(this),window.addEventListener("resize",this._handleThrottledResizeBound)}},{key:"_removeEventHandlers",value:function(){var i=this;void 0!==window.ontouchstart&&(this.el.removeEventListener("touchstart",this._handleCarouselTapBound),this.el.removeEventListener("touchmove",this._handleCarouselDragBound),this.el.removeEventListener("touchend",this._handleCarouselReleaseBound)),this.el.removeEventListener("mousedown",this._handleCarouselTapBound),this.el.removeEventListener("mousemove",this._handleCarouselDragBound),this.el.removeEventListener("mouseup",this._handleCarouselReleaseBound),this.el.removeEventListener("mouseleave",this._handleCarouselReleaseBound),this.el.removeEventListener("click",this._handleCarouselClickBound),this.showIndicators&&this.$indicators&&this.$indicators.find(".indicator-item").each(function(t,e){t.removeEventListener("click",i._handleIndicatorClickBound)}),window.removeEventListener("resize",this._handleThrottledResizeBound)}},{key:"_handleCarouselTap",value:function(t){"mousedown"===t.type&&b(t.target).is("img")&&t.preventDefault(),this.pressed=!0,this.dragged=!1,this.verticalDragged=!1,this.reference=this._xpos(t),this.referenceY=this._ypos(t),this.velocity=this.amplitude=0,this.frame=this.offset,this.timestamp=Date.now(),clearInterval(this.ticker),this.ticker=setInterval(this._trackBound,100)}},{key:"_handleCarouselDrag",value:function(t){var e=void 0,i=void 0,n=void 0;if(this.pressed)if(e=this._xpos(t),i=this._ypos(t),n=this.reference-e,Math.abs(this.referenceY-i)<30&&!this.verticalDragged)(2=this.dim*(this.count-1)?this.target=this.dim*(this.count-1):this.target<0&&(this.target=0)),this.amplitude=this.target-this.offset,this.timestamp=Date.now(),requestAnimationFrame(this._autoScrollBound),this.dragged&&(t.preventDefault(),t.stopPropagation()),!1}},{key:"_handleCarouselClick",value:function(t){if(this.dragged)return t.preventDefault(),t.stopPropagation(),!1;if(!this.options.fullWidth){var e=b(t.target).closest(".carousel-item").index();0!==this._wrap(this.center)-e&&(t.preventDefault(),t.stopPropagation()),this._cycleTo(e)}}},{key:"_handleIndicatorClick",value:function(t){t.stopPropagation();var e=b(t.target).closest(".indicator-item");e.length&&this._cycleTo(e.index())}},{key:"_handleResize",value:function(t){this.options.fullWidth?(this.itemWidth=this.$el.find(".carousel-item").first().innerWidth(),this.imageHeight=this.$el.find(".carousel-item.active").height(),this.dim=2*this.itemWidth+this.options.padding,this.offset=2*this.center*this.itemWidth,this.target=this.offset,this._setCarouselHeight(!0)):this._scroll()}},{key:"_setCarouselHeight",value:function(t){var i=this,e=this.$el.find(".carousel-item.active").length?this.$el.find(".carousel-item.active").first():this.$el.find(".carousel-item").first(),n=e.find("img").first();if(n.length)if(n[0].complete){var s=n.height();if(0=this.count?t%this.count:t<0?this._wrap(this.count+t%this.count):t}},{key:"_track",value:function(){var t,e,i,n;e=(t=Date.now())-this.timestamp,this.timestamp=t,i=this.offset-this.frame,this.frame=this.offset,n=1e3*i/(1+e),this.velocity=.8*n+.2*this.velocity}},{key:"_autoScroll",value:function(){var t=void 0,e=void 0;this.amplitude&&(t=Date.now()-this.timestamp,2<(e=this.amplitude*Math.exp(-t/this.options.duration))||e<-2?(this._scroll(this.target-e),requestAnimationFrame(this._autoScrollBound)):this._scroll(this.target))}},{key:"_scroll",value:function(t){var e=this;this.$el.hasClass("scrolling")||this.el.classList.add("scrolling"),null!=this.scrollingTimeout&&window.clearTimeout(this.scrollingTimeout),this.scrollingTimeout=window.setTimeout(function(){e.$el.removeClass("scrolling")},this.options.duration);var i,n,s,o,a=void 0,r=void 0,l=void 0,h=void 0,d=void 0,u=void 0,c=this.center,p=1/this.options.numVisible;if(this.offset="number"==typeof t?t:this.offset,this.center=Math.floor((this.offset+this.dim/2)/this.dim),o=-(s=(n=this.offset-this.center*this.dim)<0?1:-1)*n*2/this.dim,i=this.count>>1,this.options.fullWidth?(l="translateX(0)",u=1):(l="translateX("+(this.el.clientWidth-this.itemWidth)/2+"px) ",l+="translateY("+(this.el.clientHeight-this.itemHeight)/2+"px)",u=1-p*o),this.showIndicators){var v=this.center%this.count,f=this.$indicators.find(".indicator-item.active");f.index()!==v&&(f.removeClass("active"),this.$indicators.find(".indicator-item").eq(v)[0].classList.add("active"))}if(!this.noWrap||0<=this.center&&this.center=this.count||e<0){if(this.noWrap)return;e=this._wrap(e)}this._cycleTo(e)}},{key:"prev",value:function(t){(void 0===t||isNaN(t))&&(t=1);var e=this.center-t;if(e>=this.count||e<0){if(this.noWrap)return;e=this._wrap(e)}this._cycleTo(e)}},{key:"set",value:function(t,e){if((void 0===t||isNaN(t))&&(t=0),t>this.count||t<0){if(this.noWrap)return;t=this._wrap(t)}this._cycleTo(t,e)}}],[{key:"init",value:function(t,e){return _get(i.__proto__||Object.getPrototypeOf(i),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Carousel}},{key:"defaults",get:function(){return e}}]),i}();M.Carousel=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"carousel","M_Carousel")}(cash),function(S){"use strict";var e={onOpen:void 0,onClose:void 0},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_TapTarget=i).options=S.extend({},n.defaults,e),i.isOpen=!1,i.$origin=S("#"+i.$el.attr("data-target")),i._setup(),i._calculatePositioning(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.TapTarget=void 0}},{key:"_setupEventHandlers",value:function(){this._handleDocumentClickBound=this._handleDocumentClick.bind(this),this._handleTargetClickBound=this._handleTargetClick.bind(this),this._handleOriginClickBound=this._handleOriginClick.bind(this),this.el.addEventListener("click",this._handleTargetClickBound),this.originEl.addEventListener("click",this._handleOriginClickBound);var t=M.throttle(this._handleResize,200);this._handleThrottledResizeBound=t.bind(this),window.addEventListener("resize",this._handleThrottledResizeBound)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleTargetClickBound),this.originEl.removeEventListener("click",this._handleOriginClickBound),window.removeEventListener("resize",this._handleThrottledResizeBound)}},{key:"_handleTargetClick",value:function(t){this.open()}},{key:"_handleOriginClick",value:function(t){this.close()}},{key:"_handleResize",value:function(t){this._calculatePositioning()}},{key:"_handleDocumentClick",value:function(t){S(t.target).closest(".tap-target-wrapper").length||(this.close(),t.preventDefault(),t.stopPropagation())}},{key:"_setup",value:function(){this.wrapper=this.$el.parent()[0],this.waveEl=S(this.wrapper).find(".tap-target-wave")[0],this.originEl=S(this.wrapper).find(".tap-target-origin")[0],this.contentEl=this.$el.find(".tap-target-content")[0],S(this.wrapper).hasClass(".tap-target-wrapper")||(this.wrapper=document.createElement("div"),this.wrapper.classList.add("tap-target-wrapper"),this.$el.before(S(this.wrapper)),this.wrapper.append(this.el)),this.contentEl||(this.contentEl=document.createElement("div"),this.contentEl.classList.add("tap-target-content"),this.$el.append(this.contentEl)),this.waveEl||(this.waveEl=document.createElement("div"),this.waveEl.classList.add("tap-target-wave"),this.originEl||(this.originEl=this.$origin.clone(!0,!0),this.originEl.addClass("tap-target-origin"),this.originEl.removeAttr("id"),this.originEl.removeAttr("style"),this.originEl=this.originEl[0],this.waveEl.append(this.originEl)),this.wrapper.append(this.waveEl))}},{key:"_calculatePositioning",value:function(){var t="fixed"===this.$origin.css("position");if(!t)for(var e=this.$origin.parents(),i=0;i'+t.getAttribute("label")+"")[0]),i.each(function(t){var e=n._appendOptionWithIcon(n.$el,t,"optgroup-option");n._addOptionToValueDict(t,e)})}}),this.$el.after(this.dropdownOptions),this.input=document.createElement("input"),d(this.input).addClass("select-dropdown dropdown-trigger"),this.input.setAttribute("type","text"),this.input.setAttribute("readonly","true"),this.input.setAttribute("data-target",this.dropdownOptions.id),this.el.disabled&&d(this.input).prop("disabled","true"),this.$el.before(this.input),this._setValueToInput();var t=d('');if(this.$el.before(t[0]),!this.el.disabled){var e=d.extend({},this.options.dropdownOptions);e.onOpenEnd=function(t){var e=d(n.dropdownOptions).find(".selected").first();if(e.length&&(M.keyDown=!0,n.dropdown.focusedIndex=e.index(),n.dropdown._focusFocusedItem(),M.keyDown=!1,n.dropdown.isScrollable)){var i=e[0].getBoundingClientRect().top-n.dropdownOptions.getBoundingClientRect().top;i-=n.dropdownOptions.clientHeight/2,n.dropdownOptions.scrollTop=i}},this.isMultiple&&(e.closeOnClick=!1),this.dropdown=M.Dropdown.init(this.input,e)}this._setSelectedStates()}},{key:"_addOptionToValueDict",value:function(t,e){var i=Object.keys(this._valueDict).length,n=this.dropdownOptions.id+i,s={};e.id=n,s.el=t,s.optionEl=e,this._valueDict[n]=s}},{key:"_removeDropdown",value:function(){d(this.wrapper).find(".caret").remove(),d(this.input).remove(),d(this.dropdownOptions).remove(),d(this.wrapper).before(this.$el),d(this.wrapper).remove()}},{key:"_appendOptionWithIcon",value:function(t,e,i){var n=e.disabled?"disabled ":"",s="optgroup-option"===i?"optgroup-option ":"",o=this.isMultiple?'":e.innerHTML,a=d("
  3. "),r=d("");r.html(o),a.addClass(n+" "+s),a.append(r);var l=e.getAttribute("data-icon");if(l){var h=d('');a.prepend(h)}return d(this.dropdownOptions).append(a[0]),a[0]}},{key:"_toggleEntryFromArray",value:function(t){var e=!this._keysSelected.hasOwnProperty(t),i=d(this._valueDict[t].optionEl);return e?this._keysSelected[t]=!0:delete this._keysSelected[t],i.toggleClass("selected",e),i.find('input[type="checkbox"]').prop("checked",e),i.prop("selected",e),e}},{key:"_setValueToInput",value:function(){var i=[];if(this.$el.find("option").each(function(t){if(d(t).prop("selected")){var e=d(t).text();i.push(e)}}),!i.length){var t=this.$el.find("option:disabled").eq(0);t.length&&""===t[0].value&&i.push(t.text())}this.input.value=i.join(", ")}},{key:"_setSelectedStates",value:function(){for(var t in this._keysSelected={},this._valueDict){var e=this._valueDict[t],i=d(e.el).prop("selected");d(e.optionEl).find('input[type="checkbox"]').prop("checked",i),i?(this._activateOption(d(this.dropdownOptions),d(e.optionEl)),this._keysSelected[t]=!0):d(e.optionEl).removeClass("selected")}}},{key:"_activateOption",value:function(t,e){e&&(this.isMultiple||t.find("li.selected").removeClass("selected"),d(e).addClass("selected"))}},{key:"getSelectedValues",value:function(){var t=[];for(var e in this._keysSelected)t.push(this._valueDict[e].el.value);return t}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_FormSelect}},{key:"defaults",get:function(){return e}}]),n}();M.FormSelect=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"formSelect","M_FormSelect")}(cash),function(s,e){"use strict";var i={},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Range=i).options=s.extend({},n.defaults,e),i._mousedown=!1,i._setupThumb(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this._removeThumb(),this.el.M_Range=void 0}},{key:"_setupEventHandlers",value:function(){this._handleRangeChangeBound=this._handleRangeChange.bind(this),this._handleRangeMousedownTouchstartBound=this._handleRangeMousedownTouchstart.bind(this),this._handleRangeInputMousemoveTouchmoveBound=this._handleRangeInputMousemoveTouchmove.bind(this),this._handleRangeMouseupTouchendBound=this._handleRangeMouseupTouchend.bind(this),this._handleRangeBlurMouseoutTouchleaveBound=this._handleRangeBlurMouseoutTouchleave.bind(this),this.el.addEventListener("change",this._handleRangeChangeBound),this.el.addEventListener("mousedown",this._handleRangeMousedownTouchstartBound),this.el.addEventListener("touchstart",this._handleRangeMousedownTouchstartBound),this.el.addEventListener("input",this._handleRangeInputMousemoveTouchmoveBound),this.el.addEventListener("mousemove",this._handleRangeInputMousemoveTouchmoveBound),this.el.addEventListener("touchmove",this._handleRangeInputMousemoveTouchmoveBound),this.el.addEventListener("mouseup",this._handleRangeMouseupTouchendBound),this.el.addEventListener("touchend",this._handleRangeMouseupTouchendBound),this.el.addEventListener("blur",this._handleRangeBlurMouseoutTouchleaveBound),this.el.addEventListener("mouseout",this._handleRangeBlurMouseoutTouchleaveBound),this.el.addEventListener("touchleave",this._handleRangeBlurMouseoutTouchleaveBound)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("change",this._handleRangeChangeBound),this.el.removeEventListener("mousedown",this._handleRangeMousedownTouchstartBound),this.el.removeEventListener("touchstart",this._handleRangeMousedownTouchstartBound),this.el.removeEventListener("input",this._handleRangeInputMousemoveTouchmoveBound),this.el.removeEventListener("mousemove",this._handleRangeInputMousemoveTouchmoveBound),this.el.removeEventListener("touchmove",this._handleRangeInputMousemoveTouchmoveBound),this.el.removeEventListener("mouseup",this._handleRangeMouseupTouchendBound),this.el.removeEventListener("touchend",this._handleRangeMouseupTouchendBound),this.el.removeEventListener("blur",this._handleRangeBlurMouseoutTouchleaveBound),this.el.removeEventListener("mouseout",this._handleRangeBlurMouseoutTouchleaveBound),this.el.removeEventListener("touchleave",this._handleRangeBlurMouseoutTouchleaveBound)}},{key:"_handleRangeChange",value:function(){s(this.value).html(this.$el.val()),s(this.thumb).hasClass("active")||this._showRangeBubble();var t=this._calcRangeOffset();s(this.thumb).addClass("active").css("left",t+"px")}},{key:"_handleRangeMousedownTouchstart",value:function(t){if(s(this.value).html(this.$el.val()),this._mousedown=!0,this.$el.addClass("active"),s(this.thumb).hasClass("active")||this._showRangeBubble(),"input"!==t.type){var e=this._calcRangeOffset();s(this.thumb).addClass("active").css("left",e+"px")}}},{key:"_handleRangeInputMousemoveTouchmove",value:function(){if(this._mousedown){s(this.thumb).hasClass("active")||this._showRangeBubble();var t=this._calcRangeOffset();s(this.thumb).addClass("active").css("left",t+"px"),s(this.value).html(this.$el.val())}}},{key:"_handleRangeMouseupTouchend",value:function(){this._mousedown=!1,this.$el.removeClass("active")}},{key:"_handleRangeBlurMouseoutTouchleave",value:function(){if(!this._mousedown){var t=7+parseInt(this.$el.css("padding-left"))+"px";s(this.thumb).hasClass("active")&&(e.remove(this.thumb),e({targets:this.thumb,height:0,width:0,top:10,easing:"easeOutQuad",marginLeft:t,duration:100})),s(this.thumb).removeClass("active")}}},{key:"_setupThumb",value:function(){this.thumb=document.createElement("span"),this.value=document.createElement("span"),s(this.thumb).addClass("thumb"),s(this.value).addClass("value"),s(this.thumb).append(this.value),this.$el.after(this.thumb)}},{key:"_removeThumb",value:function(){s(this.thumb).remove()}},{key:"_showRangeBubble",value:function(){var t=-7+parseInt(s(this.thumb).parent().css("padding-left"))+"px";e.remove(this.thumb),e({targets:this.thumb,height:30,width:30,top:-30,marginLeft:t,duration:300,easing:"easeOutQuint"})}},{key:"_calcRangeOffset",value:function(){var t=this.$el.width()-15,e=parseFloat(this.$el.attr("max"))||100,i=parseFloat(this.$el.attr("min"))||0;return(parseFloat(this.$el.val())-i)/(e-i)*t}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Range}},{key:"defaults",get:function(){return i}}]),n}();M.Range=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"range","M_Range"),t.init(s("input[type=range]"))}(cash,M.anime); \ No newline at end of file diff --git a/examples/todoapp/web/src/jsMain/resources/styles.css b/examples/todoapp/web/src/jsMain/resources/styles.css deleted file mode 100644 index 0fb771903b..0000000000 --- a/examples/todoapp/web/src/jsMain/resources/styles.css +++ /dev/null @@ -1,34 +0,0 @@ -@font-face { - font-family: 'Material Icons'; - font-style: normal; - font-weight: 400; - src: local('Material Icons'), - local('MaterialIcons-Regular'), - url(MaterialIcons-Regular.ttf) format('truetype'); -} - -.material-icons { - font-family: 'Material Icons'; - font-weight: normal; - font-style: normal; - font-size: 24px; /* Preferred icon size */ - display: inline-block; - line-height: 1; - text-transform: none; - letter-spacing: normal; - word-wrap: normal; - white-space: nowrap; - direction: ltr; - - /* Support for all WebKit browsers. */ - -webkit-font-smoothing: antialiased; - /* Support for Safari and Chrome. */ - text-rendering: optimizeLegibility; - - /* Support for Firefox. */ - -moz-osx-font-smoothing: grayscale; - - /* Support for IE. */ - font-feature-settings: 'liga'; -} - diff --git a/examples/todoapp/web/webpack.config.d/fs.js b/examples/todoapp/web/webpack.config.d/fs.js deleted file mode 100644 index 99ab171341..0000000000 --- a/examples/todoapp/web/webpack.config.d/fs.js +++ /dev/null @@ -1,9 +0,0 @@ -// As per https://cashapp.github.io/sqldelight/js_sqlite/ - -config.resolve = { - fallback: { - fs: false, - path: false, - crypto: false - } -} diff --git a/examples/todoapp/web/webpack.config.d/wasm.js b/examples/todoapp/web/webpack.config.d/wasm.js deleted file mode 100644 index 94bd17dfd2..0000000000 --- a/examples/todoapp/web/webpack.config.d/wasm.js +++ /dev/null @@ -1,12 +0,0 @@ -// As per https://cashapp.github.io/sqldelight/js_sqlite/ - -var CopyWebpackPlugin = require('copy-webpack-plugin'); -config.plugins.push( - new CopyWebpackPlugin( - { - patterns: [ - {from: '../../node_modules/sql.js/dist/sql-wasm.wasm', to: '../../../web/build/distributions'} - ] - } - ) -); diff --git a/tutorials/Navigation/README.md b/tutorials/Navigation/README.md index a1037a4979..c875d6d3f8 100644 --- a/tutorials/Navigation/README.md +++ b/tutorials/Navigation/README.md @@ -1,417 +1,5 @@ # Navigation -## General attitude - -The Jetpack Compose navigation library ([navigation-compose](https://developer.android.com/jetpack/compose/navigation)) is an Android-only library, and so can not be used together with Compose for Desktop. Our general attitude is not to “force” people to use a particular first-party library. However, there are third-party libraries available. One could consider [Decompose](https://github.com/arkivanov/Decompose) as possible solution. - -## Patterns - -Navigation is not only about switching child components and managing the back stack. It may also affect the architecture of the application. - -There are two common patterns of the navigation in Compose: the navigation logic can be kept and managed either inside or outside `@Composable` world. Each approach has its advantages and disadvantages, so please decide wisely. - -This tutorial describes both patterns, how to choose between them, and how the Decompose library can help. - -## Prerequisites - -This tutorial uses a very simple example of a List-Details application with just two screens: `ItemList` and `ItemDetails`. There are few things we need to do first. - -### Setup - -First let's add the Decompose library to the project. Please refer to the [Getting started](https://arkivanov.github.io/Decompose/getting-started/) section of the documentation. - -### Item model and Database - -Here is the `Item` data class that we will need: - -```kotlin -data class Item( - val id: Long, - val text: String -) -``` - -And a simple `Database` interface that will be used by child screens (there is no concurrency just for simplicity): - -``` kotlin -interface Database { - fun getAll(): List - fun getById(id: Long): Item -} -``` - -### Basic UI for child screens - -We will need some basic UI for both `List` and `Details` screens. - -The `ItemListScreen` `@Composable` component displays the list of `Items` and calls `onItemClick` callback when an item is clicked: - -``` kotlin -import androidx.compose.foundation.clickable -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.material.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier - -@Composable -fun ItemListScreen(items: List, onItemClick: (id: Long) -> Unit) { - LazyColumn { - items(items = items) { item -> - Text( - text = item.text, - modifier = Modifier.clickable { onItemClick(item.id) } - ) - } - } -} -``` - -The `ItemDetailsScreen` `@Composable` component displays the previously selected `Item` and calls `onBackClick` callback when the back button in the `TopAppBar` is clicked: - -``` kotlin -import androidx.compose.foundation.layout.Column -import androidx.compose.material.Icon -import androidx.compose.material.IconButton -import androidx.compose.material.Text -import androidx.compose.material.TopAppBar -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.runtime.Composable - -@Composable -fun ItemDetailsScreen(item: Item, onBackClick: () -> Unit) { - Column { - TopAppBar( - title = { Text("Item details") }, - navigationIcon = { - IconButton(onClick = onBackClick) { - Icon( - imageVector = Icons.Default.ArrowBack, - contentDescription = null - ) - } - } - ) - - Text(text = item.text) - } -} -``` - - -### Children configuration - -One of the main goals of the Decompose library is compiled time safety. Each child is described by a class called `Configuration`. The purpose of the `Configuration` is to describe what child should be used and what arguments it has. So for each child there is an instance of its own `Configuration` class. Normally there are multiple children involved in the navigation, so the whole set of configurations is normally a sealed class. - -For example, for a simple List-Details navigation we need just two entries: - -``` kotlin -import com.arkivanov.decompose.statekeeper.Parcelable - -sealed class Configuration : Parcelable { - object List : Configuration() - data class Details(val itemId: Long) : Configuration() -} -``` - -Such an approach looks a bit verbose, but it brings compile time safety in the following cases: - -- Child arguments are verified at compile time (unlike passing arguments via strings, `Bundles`, etc.). -- Configurations can be checked exhaustively, so the compilation will fail if not all children are covered. - -#### Parcelable configurations in Android - -Desktop Compose is actually a multiplatform library and can also be used in Android. This makes it possible to share the navigation logic as well. But Android has additional requirements for navigation - the back stack should survive [configuration changes](https://developer.android.com/guide/topics/resources/runtime-changes). In general, the back stack should be saved and restored when such an event occurs. - -To make this possible, all child Configurations must be [Parcelable](https://developer.android.com/reference/android/os/Parcelable). For convenience, Decompose defines both `Parcelable` and `@Parcelize` using [expect/actual](https://kotlinlang.org/docs/reference/mpp-connect-to-apis.html): - -- `Parcelable` - this interface is defined by Decompose in the `commonMain` source set. It is type-aliased to the Android's `Parcelable` interface for Android target, and is just an empty interface in all other targets (including JVM/Desktop). -- `@Parcelize` - this annotation is also defined in the `commonMain` source set. It is type-aliased to the `@Parcelize` annotation provided by the [kotlin-parcelize](https://developer.android.com/kotlin/parcelize) plugin. And it is missing (as not needed) in non-Android targets. - -If you need Android support, please make sure you have `kotlin-parcelize` plugin enabled. All Configurations should look like this: - -``` kotlin -import com.arkivanov.decompose.statekeeper.Parcelable -import com.arkivanov.decompose.statekeeper.Parcelize - -sealed class Configuration : Parcelable { - @Parcelize - object List : Configuration() - - @Parcelize - data class Details(val itemId: Long) : Configuration() -} -``` - -## Managing navigation outside @Composable world - -This pattern should be chosen if any of the following apply: - -1. You support Multiplatform targets with different UI frameworks, and you want to share the navigation logic between them. For example if you support Desktop with Compose UI, iOS with SwiftUI and/or JavaScript with React UI. -2. You want to keep children running while in the back stack (stopped, but not destroyed). -3. You are targeting Android and need instance retaining functionality in children (aka AndroidX [ViewModels](https://developer.android.com/topic/libraries/architecture/viewmodel)) and you want to hide this logic as implementation details. -4. You want to keep the navigation logic (and probably the business logic) separate from UI. - -The first point is quite obvious. If Compose is not the only UI you are using and you want to share the navigation logic, then it can not be managed by Compose. - -The second point may be especially useful in Desktop. When a child is pushed to the back stack, it is stopped but not destroyed. So it keeps running in "background" without UI. This makes it possible to keep children's state in memory while navigating. - -The third point is about instances retaining, like AndroidX `ViewModels`, and is mostly used in Android. It allows to retain (keep in memory) some data when Android configuration change occurs and the whole navigation stack is recreated. The most important advantage of instance retaining in this pattern is that it is encapsulated in children as implementation details. - -The fourth point is not that obvious but might be very important. Separating navigation and business logic from the user interface may improve testability. E.g. it becomes possible to test non-UI code in integration with just plain JUnit tests. And the UI can be tested in isolation as well using another testing frameworks. - -You can find some integration tests in the TodoApp example: - -- [TodoMainTest](https://github.com/JetBrains/compose-multiplatform/blob/master/examples/todoapp/common/main/src/commonTest/kotlin/example/todo/common/main/integration/TodoMainTest.kt) - integration tests for the Main screen. -- [TodoRootTest](https://github.com/JetBrains/compose-multiplatform/blob/master/examples/todoapp/common/root/src/commonTest/kotlin/example/todo/common/root/integration/TodoRootTest.kt) - integration tests for navigation between the Main and the Edit screens. - -This pattern is encouraged by the Decompose library. If this is your choice, then you can just use its recommended approach. - -The main idea is to split (decompose) your project by multiple components. Components can be organized in a tree structure, and each level can (but not must) have multiple [Routers](https://arkivanov.github.io/Decompose/router/overview/). Each component is just a normal interface/class, an entry point to the underlying logic. - -The only responsibility of the user interface is to listen for components' state changes and trigger their events. - -The following resources can help with this pattern: -- The Decompose [documentation](https://arkivanov.github.io/Decompose/) -- The [TodoApp](https://github.com/JetBrains/compose-multiplatform/tree/master/examples/todoapp) example -- The article "[Fully cross-platform Kotlin applications (almost)](https://proandroiddev.com/fully-cross-platform-kotlin-applications-almost-29c7054f8f28)" - -### A very basic example: - -`ItemList` child with UI: - -``` kotlin -import androidx.compose.runtime.Composable -import androidx.compose.runtime.State -import androidx.compose.runtime.mutableStateOf - -class ItemList( - database: Database, // Accept the Database as dependency - val onItemSelected: (itemId: Long) -> Unit // Called on item click -) { - // No concurrency involved just for simplicity. The state can be updated if needed. - private val _state = mutableStateOf(database.getAll()) - val state: State> = _state -} - -@Composable -fun ItemListUi(list: ItemList) { - ItemListScreen( - items = list.state.value, - onItemClick = list.onItemSelected - ) -} -``` - -`ItemDetails` child with UI: - -``` kotlin -import androidx.compose.runtime.Composable -import androidx.compose.runtime.State -import androidx.compose.runtime.mutableStateOf - -class ItemDetails( - itemId: Long, // An item id to be loaded and displayed - database: Database, // Accept the Database as dependency - val onFinished: () -> Unit // Called on TopAppBar back button click -) { - // No concurrency involved just for simplicity. The state can be updated if needed. - private val _state = mutableStateOf(database.getById(id = itemId)) - val state: State = _state -} - -@Composable -fun ItemDetailsUi(details: ItemDetails) { - ItemDetailsScreen( - item = details.state.value, - onBackClick = details.onFinished - ) -} -``` - -Root with navigation (assuming only Compose UI is used): - -``` kotlin -import androidx.compose.runtime.Composable -import com.arkivanov.decompose.ComponentContext -import com.arkivanov.decompose.extensions.compose.jetbrains.Children -import com.arkivanov.decompose.pop -import com.arkivanov.decompose.push -import com.arkivanov.decompose.router - -typealias Content = @Composable () -> Unit - -fun T.asContent(content: @Composable (T) -> Unit): Content = { content(this) } - -class Root( - componentContext: ComponentContext, // In Decompose each component has its own ComponentContext - private val database: Database // Accept the Database as dependency -) : ComponentContext by componentContext { - - private val router = - router( - initialConfiguration = Configuration.List, // Starting with List - childFactory = ::createChild // The Router calls this function, providing the child Configuration and ComponentContext - ) - - val routerState = router.state - - private fun createChild(configuration: Configuration, context: ComponentContext): Content = - when (configuration) { - is Configuration.List -> list() - is Configuration.Details -> details(configuration) - } // Configurations are handled exhaustively - - private fun list(): Content = - ItemList( - database = database, // Supply dependencies - onItemSelected = { router.push(Configuration.Details(itemId = it)) } // Push Details on item click - ).asContent { ItemListUi(it) } - - private fun details(configuration: Configuration.Details): Content = - ItemDetails( - itemId = configuration.itemId, // Safely pass arguments - database = database, // Supply dependencies - onFinished = router::pop // Go back to List - ).asContent { ItemDetailsUi(it) } -} - -@Composable -fun RootUi(root: Root) { - Children(root.routerState) { child -> - child.instance() - } -} -``` - -Application and Root initialization: - -``` kotlin -import androidx.compose.desktop.DesktopTheme -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Surface -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.window.singleWindowApplication -import com.arkivanov.decompose.extensions.compose.jetbrains.rememberRootComponent - -fun main() = singleWindowApplication( - title = "Navigation tutorial" -) { - Surface(modifier = Modifier.fillMaxSize()) { - MaterialTheme { - DesktopTheme { - RootUi(root()) // Render the Root and its children - } - } - } -} - -@Composable -private fun root(): Root = - // The rememberRootComponent function provides the root ComponentContext and remembers the instance or Root - rememberRootComponent { componentContext -> - Root( - componentContext = componentContext, - database = DatabaseImpl() // Supply dependencies - ) - } -``` - -## Managing navigation inside @Composable world - -By using this pattern, the navigation logic is kept and managed inside `@Composable` functions. For example, this pattern is used by the Jetpack Compose `navigation-compose` library. In practice there is normally a function like `@Composable fun Navigator(...)` or `@Composable fun NavHost(...)` that manages the back stack and renders the currently active child. The way how the function renders children depends on its API. - -This pattern should be chosen if you prefer to use Compose for more than just UI, and none of the first pattern's points apply. - -Decompose does not provide any out-of-the-box `@Composable` navigation API. But it is pretty easy to write your own with it. You can experiment and come up with your own API. - -Please refer to the following article for implementation details: "[A comprehensive hundred-line navigation for Jetpack/Desktop Compose](https://proandroiddev.com/a-comprehensive-hundred-line-navigation-for-jetpack-desktop-compose-5b723c4f256e)". It also explains some additional features, like back button handling, transition animations, etc. - -### A very basic example: - -``` kotlin -import androidx.compose.runtime.Composable -import com.arkivanov.decompose.Router -import com.arkivanov.decompose.statekeeper.Parcelable - -@Composable -inline fun rememberRouter( - noinline initialConfiguration: () -> C -): Router = - TODO("See the article mentioned above for the implementation") -``` - -First of all we need the `Router` from the Decompose library. Once we have it, all we need to do is to use the `Children` function. The `Children` function listens for the `Router` state changes, and renders the currently active child using the provided callback. The article mentioned above explains the implementation details. - -Using the `Router`: - -``` kotlin -import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import com.arkivanov.composenavigatorexample.navigator.rememberRouter -import com.arkivanov.decompose.extensions.compose.jetbrains.Children -import com.arkivanov.decompose.pop -import com.arkivanov.decompose.push - - -@Composable -fun ItemList( - database: Database, - onItemClick: (itemId: Long) -> Unit -) { - // No concurrency involved just for simplicity. The state can be updated if needed. - val items = remember { mutableStateOf(database.getAll()) } - - ItemListScreen( - items = items.value, - onItemClick = onItemClick - ) -} - -@Composable -fun ItemDetails( - itemId: Long, - database: Database, - onBackClick: () -> Unit -) { - // No concurrency involved just for simplicity. The state can be updated if needed. - val item = remember { mutableStateOf(database.getById(id = itemId)) } - - ItemDetailsScreen( - item = item.value, - onBackClick = onBackClick - ) -} - -@Composable -fun Root(database: Database) { - // Create and remember the Router - val router = - rememberRouter( - initialConfiguration = { Configuration.List } // Start with the List screen - ) - - // Render children - Children(routerState = router.state) { screen -> - when (val configuration = screen.configuration) { - is Configuration.List -> - ItemList( - database = database, // Supply dependencies - onItemClick = { router.push(Configuration.Details(itemId = it)) } // Push Details on item click - ) - - is Configuration.Details -> - ItemDetails( - itemId = configuration.itemId, // Safely pass arguments - database = database, // Supply dependencies - onBackClick = router::pop // Go back to List - ) - }.let {} // Ensure exhaustiveness - } -} -``` +The [Jetpack Compose navigation library](https://developer.android.com/jetpack/compose/navigation) is currently an Android-only library. +There are a number of libraries available that provide navigation functionality for Compose Multiplatform projects. Refer to the [Awesome Kotlin Multiplatform](https://github.com/terrakok/kmm-awesome#-compose-ui) list for an overview and more information. \ No newline at end of file From d9767c34a2e18738b7f7acdcacda58bb88ea1515 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov <654232+AlexeyTsvetkov@users.noreply.github.com> Date: Wed, 2 Aug 2023 20:39:10 +0200 Subject: [PATCH 14/21] Set icon on EDT (#3452) --- .../compose/desktop/ide/preview/PreviewToolWindow.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/idea-plugin/src/main/kotlin/org/jetbrains/compose/desktop/ide/preview/PreviewToolWindow.kt b/idea-plugin/src/main/kotlin/org/jetbrains/compose/desktop/ide/preview/PreviewToolWindow.kt index dc1546e0d6..c3a10cd449 100644 --- a/idea-plugin/src/main/kotlin/org/jetbrains/compose/desktop/ide/preview/PreviewToolWindow.kt +++ b/idea-plugin/src/main/kotlin/org/jetbrains/compose/desktop/ide/preview/PreviewToolWindow.kt @@ -4,6 +4,7 @@ */ package org.jetbrains.compose.desktop.ide.preview +import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.components.service import com.intellij.openapi.project.DumbAware import com.intellij.openapi.project.Project @@ -18,7 +19,9 @@ class PreviewToolWindow : ToolWindowFactory, DumbAware { isPreviewCompatible(project) override fun init(toolWindow: ToolWindow) { - toolWindow.setIcon(PreviewIcons.COMPOSE) + ApplicationManager.getApplication().invokeLater { + toolWindow.setIcon(PreviewIcons.COMPOSE) + } } override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) { From 3add7ce9dab20e5fc5f5a0aa6aa2580937214778 Mon Sep 17 00:00:00 2001 From: Oleksandr Karpovich Date: Thu, 3 Aug 2023 09:34:04 +0200 Subject: [PATCH 15/21] Add runtimeSaveable to Dependencies in compose gradle plugin (#3449) --- .../src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt index 0bc635f99a..041a68bb4a 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt @@ -100,6 +100,7 @@ class ComposePlugin : Plugin { val material get() = composeDependency("org.jetbrains.compose.material:material") val material3 get() = composeDependency("org.jetbrains.compose.material3:material3") val runtime get() = composeDependency("org.jetbrains.compose.runtime:runtime") + val runtimeSaveable get() = composeDependency("org.jetbrains.compose.runtime:runtime-saveable") val ui get() = composeDependency("org.jetbrains.compose.ui:ui") @ExperimentalComposeLibrary val uiTestJUnit4 get() = composeDependency("org.jetbrains.compose.ui:ui-test-junit4") From 1dc5839ed781a7d7893814b701c18b88c8097046 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov <654232+AlexeyTsvetkov@users.noreply.github.com> Date: Thu, 3 Aug 2023 12:17:15 +0200 Subject: [PATCH 16/21] Raise error when Homebrew JDK is used for packaging (#3451) Resolves #3107 --- gradle-plugins/compose/build.gradle.kts | 1 + .../internal/ComposeProjectProperties.kt | 4 ++ .../internal/configureJvmApplication.kt | 1 + .../AbstractCheckNativeDistributionRuntime.kt | 56 +++++++++++++++---- .../application/internal/JdkVersionProbe.java | 25 ++++++--- 5 files changed, 66 insertions(+), 21 deletions(-) diff --git a/gradle-plugins/compose/build.gradle.kts b/gradle-plugins/compose/build.gradle.kts index a02b508e1a..485c8906ba 100644 --- a/gradle-plugins/compose/build.gradle.kts +++ b/gradle-plugins/compose/build.gradle.kts @@ -70,6 +70,7 @@ dependencies { embedded("org.jetbrains.kotlinx:kotlinx-serialization-core:${BuildProperties.serializationVersion}") embedded("org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:${BuildProperties.serializationVersion}") embedded(project(":preview-rpc")) + embedded(project(":jdk-version-probe")) } val shadow = tasks.named("shadowJar") { diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/ComposeProjectProperties.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/ComposeProjectProperties.kt index 977ed4a32e..ab1011bc80 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/ComposeProjectProperties.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/ComposeProjectProperties.kt @@ -20,6 +20,7 @@ internal object ComposeProperties { internal const val MAC_NOTARIZATION_APPLE_ID = "compose.desktop.mac.notarization.appleID" internal const val MAC_NOTARIZATION_PASSWORD = "compose.desktop.mac.notarization.password" internal const val MAC_NOTARIZATION_ASC_PROVIDER = "compose.desktop.mac.notarization.ascProvider" + internal const val CHECK_JDK_VENDOR = "compose.desktop.packaging.checkJdkVendor" fun isVerbose(providers: ProviderFactory): Provider = providers.findProperty(VERBOSE).toBooleanProvider(false) @@ -47,4 +48,7 @@ internal object ComposeProperties { fun macNotarizationAscProvider(providers: ProviderFactory): Provider = providers.findProperty(MAC_NOTARIZATION_ASC_PROVIDER) + + fun checkJdkVendor(providers: ProviderFactory): Provider = + providers.findProperty(CHECK_JDK_VENDOR).toBooleanProvider(true) } \ No newline at end of file diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/configureJvmApplication.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/configureJvmApplication.kt index 36d5194667..83707cf8b5 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/configureJvmApplication.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/configureJvmApplication.kt @@ -67,6 +67,7 @@ private fun JvmApplicationContext.configureCommonJvmDesktopTasks(): CommonJvmDes taskNameObject = "runtime" ) { jdkHome.set(app.javaHomeProvider) + checkJdkVendor.set(ComposeProperties.checkJdkVendor(project.providers)) jdkVersionProbeJar.from( project.detachedComposeGradleDependency( artifactId = "gradle-plugin-internal-jdk-version-probe" diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractCheckNativeDistributionRuntime.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractCheckNativeDistributionRuntime.kt index 68dd0518f4..e4e8010c89 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractCheckNativeDistributionRuntime.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractCheckNativeDistributionRuntime.kt @@ -10,13 +10,19 @@ import org.gradle.api.file.RegularFile import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.tasks.* +import org.jetbrains.compose.desktop.application.internal.ComposeProperties import org.jetbrains.compose.desktop.application.internal.JvmRuntimeProperties +import org.jetbrains.compose.desktop.application.internal.ExternalToolRunner +import org.jetbrains.compose.desktop.application.internal.JdkVersionProbe +import org.jetbrains.compose.desktop.tasks.AbstractComposeDesktopTask +import org.jetbrains.compose.internal.utils.OS +import org.jetbrains.compose.internal.utils.currentOS import org.jetbrains.compose.internal.utils.executableName import org.jetbrains.compose.internal.utils.ioFile import org.jetbrains.compose.internal.utils.notNullProperty -import org.jetbrains.compose.desktop.application.internal.ExternalToolRunner -import org.jetbrains.compose.desktop.tasks.AbstractComposeDesktopTask +import java.io.ByteArrayInputStream import java.io.File +import java.util.* // __COMPOSE_NATIVE_DISTRIBUTIONS_MIN_JAVA_VERSION__ internal const val MIN_JAVA_RUNTIME_VERSION = 17 @@ -30,6 +36,9 @@ abstract class AbstractCheckNativeDistributionRuntime : AbstractComposeDesktopTa @get:InputDirectory val jdkHome: Property = objects.notNullProperty() + @get:Input + abstract val checkJdkVendor: Property + private val taskDir = project.layout.buildDirectory.dir("compose/tmp/$name") @get:OutputFile @@ -69,18 +78,37 @@ abstract class AbstractCheckNativeDistributionRuntime : AbstractComposeDesktopTa val jpackageExecutabke = jdkHome.getJdkTool("jpackage") ensureToolsExist(javaExecutable, jlinkExecutable, jpackageExecutabke) - val jvmRuntimeVersionString = getJavaRuntimeVersion(javaExecutable) + val jdkRuntimeProperties = getJDKRuntimeProperties(javaExecutable) - val jvmRuntimeVersion = jvmRuntimeVersionString?.toIntOrNull() - ?: jdkDistributionProbingError("JDK version '$jvmRuntimeVersionString' has unexpected format") + val jdkMajorVersionString = jdkRuntimeProperties.getProperty(JdkVersionProbe.JDK_MAJOR_VERSION_KEY) + val jdkMajorVersion = jdkMajorVersionString?.toIntOrNull() + ?: jdkDistributionProbingError("JDK version '$jdkMajorVersionString' has unexpected format") - check(jvmRuntimeVersion >= MIN_JAVA_RUNTIME_VERSION) { + check(jdkMajorVersion >= MIN_JAVA_RUNTIME_VERSION) { jdkDistributionProbingError( "minimum required JDK version is '$MIN_JAVA_RUNTIME_VERSION', " + - "but actual version is '$jvmRuntimeVersion'" + "but actual version is '$jdkMajorVersion'" ) } + if (checkJdkVendor.get()) { + val vendor = jdkRuntimeProperties.getProperty(JdkVersionProbe.JDK_VENDOR_KEY) + if (vendor == null) { + logger.warn("JDK vendor probe failed: $jdkHome") + } else { + if (currentOS == OS.MacOS && vendor.equals("homebrew", ignoreCase = true)) { + error( + """ + |Homebrew's JDK distribution may cause issues with packaging. + |See: https://github.com/JetBrains/compose-multiplatform/issues/3107 + |Possible solutions: + |* Use other vendor's JDK distribution, such as Amazon Corretto; + |* To continue using Homebrew distribution for packaging on your own risk, add "${ComposeProperties.CHECK_JDK_VENDOR}=false" to your gradle.properties + """.trimMargin()) + } + } + } + val modules = arrayListOf() runExternalTool( tool = javaExecutable, @@ -96,17 +124,21 @@ abstract class AbstractCheckNativeDistributionRuntime : AbstractComposeDesktopTa } ) - val properties = JvmRuntimeProperties(jvmRuntimeVersion, modules) + val properties = JvmRuntimeProperties(jdkMajorVersion, modules) JvmRuntimeProperties.writeToFile(properties, javaRuntimePropertiesFile.ioFile) } - private fun getJavaRuntimeVersion(javaExecutable: File): String? { - var javaRuntimeVersion: String? = null + private fun getJDKRuntimeProperties(javaExecutable: File): Properties { + val jdkProperties = Properties() runExternalTool( tool = javaExecutable, args = listOf("-jar", jdkVersionProbeJar.files.single().absolutePath), - processStdout = { stdout -> javaRuntimeVersion = stdout.trim() } + processStdout = { stdout -> + ByteArrayInputStream(stdout.trim().toByteArray()).use { + jdkProperties.loadFromXML(it) + } + } ) - return javaRuntimeVersion + return jdkProperties } } diff --git a/gradle-plugins/jdk-version-probe/src/main/java/org/jetbrains/compose/desktop/application/internal/JdkVersionProbe.java b/gradle-plugins/jdk-version-probe/src/main/java/org/jetbrains/compose/desktop/application/internal/JdkVersionProbe.java index 35edb75f9d..dad19d659b 100644 --- a/gradle-plugins/jdk-version-probe/src/main/java/org/jetbrains/compose/desktop/application/internal/JdkVersionProbe.java +++ b/gradle-plugins/jdk-version-probe/src/main/java/org/jetbrains/compose/desktop/application/internal/JdkVersionProbe.java @@ -4,10 +4,22 @@ */ package org.jetbrains.compose.desktop.application.internal; +import java.io.IOException; import java.lang.reflect.Method; +import java.util.Properties; public class JdkVersionProbe { - public static void main(String[] args) { + public final static String JDK_MAJOR_VERSION_KEY = "jdk.major.version"; + public final static String JDK_VENDOR_KEY = "jdk.vendor"; + + public static void main(String[] args) throws IOException { + Properties properties = new Properties(); + properties.setProperty(JDK_MAJOR_VERSION_KEY, getJDKMajorVersion()); + properties.setProperty(JDK_VENDOR_KEY, System.getProperty("java.vendor")); + properties.storeToXML(System.out, null); + } + + private static String getJDKMajorVersion() { Class runtimeClass = Runtime.class; try { Method version = runtimeClass.getMethod("version"); @@ -15,24 +27,19 @@ public class JdkVersionProbe { Class runtimeVerClass = runtimeVer.getClass(); try { int feature = (int) runtimeVerClass.getMethod("feature").invoke(runtimeVer); - printVersionAndHalt((Integer.valueOf(feature)).toString()); + return (Integer.valueOf(feature)).toString(); } catch (NoSuchMethodException e) { int major = (int) runtimeVerClass.getMethod("major").invoke(runtimeVer); - printVersionAndHalt((Integer.valueOf(major)).toString()); + return (Integer.valueOf(major)).toString(); } } catch (Exception e) { String javaVersion = System.getProperty("java.version"); String[] parts = javaVersion.split("\\."); if (parts.length > 2 && "1".equalsIgnoreCase(parts[0])) { - printVersionAndHalt(parts[1]); + return parts[1]; } else { throw new IllegalStateException("Could not determine JDK version from string: '" + javaVersion + "'"); } } } - - private static void printVersionAndHalt(String version) { - System.out.println(version); - Runtime.getRuntime().exit(0); - } } \ No newline at end of file From 1d6752b9126bb748daae7d4a652db6eb599f6a41 Mon Sep 17 00:00:00 2001 From: Oleksandr Karpovich Date: Mon, 7 Aug 2023 11:20:05 +0200 Subject: [PATCH 17/21] add a test for composable getter in expect/actual val getter (#3456) --- .../composable-test-cases/gradle.properties | 6 +-- .../composable-test-cases/settings.gradle.kts | 3 ++ .../expectActual/lib/build.gradle.kts | 39 +++++++++++++++++++ .../lib/src/commonMain/kotlin/Dependencies.kt | 10 +++++ .../lib/src/desktopMain/kotlin/Actuals.kt | 4 ++ .../lib/src/jsMain/kotlin/Actuals.kt | 4 ++ .../lib/src/nativeMain/kotlin/Actuals.kt | 4 ++ .../expectActual/main/build.gradle.kts | 21 ++++++++++ .../main/src/commonTest/kotlin/Tests.kt | 32 +++++++++++++++ 9 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 compose/integrations/composable-test-cases/testcases/expectActual/lib/build.gradle.kts create mode 100644 compose/integrations/composable-test-cases/testcases/expectActual/lib/src/commonMain/kotlin/Dependencies.kt create mode 100644 compose/integrations/composable-test-cases/testcases/expectActual/lib/src/desktopMain/kotlin/Actuals.kt create mode 100644 compose/integrations/composable-test-cases/testcases/expectActual/lib/src/jsMain/kotlin/Actuals.kt create mode 100644 compose/integrations/composable-test-cases/testcases/expectActual/lib/src/nativeMain/kotlin/Actuals.kt create mode 100644 compose/integrations/composable-test-cases/testcases/expectActual/main/build.gradle.kts create mode 100644 compose/integrations/composable-test-cases/testcases/expectActual/main/src/commonTest/kotlin/Tests.kt diff --git a/compose/integrations/composable-test-cases/gradle.properties b/compose/integrations/composable-test-cases/gradle.properties index 062f87bc1e..292c20dbeb 100644 --- a/compose/integrations/composable-test-cases/gradle.properties +++ b/compose/integrations/composable-test-cases/gradle.properties @@ -2,13 +2,13 @@ org.gradle.jvmargs=-Xmx2048M -XX:MaxMetaspaceSize=512m kotlin.code.style=official kotlin.native.enableDependencyPropagation=false android.useAndroidX=true -kotlin.version=1.8.20 +kotlin.version=1.9.0 agp.version=7.3.0 -compose.version=1.5.0-dev1063 +compose.version=1.5.0-beta01 kotlin.native.cacheKind=none #empty by default - a default version will be used -compose.kotlinCompilerPluginVersion=1.4.2 +compose.kotlinCompilerPluginVersion=1.5.0 # default|failingJs - see enum class CasesToRun tests.casesToRun=default diff --git a/compose/integrations/composable-test-cases/settings.gradle.kts b/compose/integrations/composable-test-cases/settings.gradle.kts index 628c7bddb9..83bcc66de6 100644 --- a/compose/integrations/composable-test-cases/settings.gradle.kts +++ b/compose/integrations/composable-test-cases/settings.gradle.kts @@ -118,6 +118,9 @@ if (casesToRun.isDefault()) { module(":testcase-lambdas-lib", "testcases/lambdas/lib") module(":testcase-lambdas-main", "testcases/lambdas/main") + + module(":testcase-expectActual-lib", "testcases/expectActual/lib") + module(":testcase-expectActual-main", "testcases/expectActual/main") } /** diff --git a/compose/integrations/composable-test-cases/testcases/expectActual/lib/build.gradle.kts b/compose/integrations/composable-test-cases/testcases/expectActual/lib/build.gradle.kts new file mode 100644 index 0000000000..1ec04242a4 --- /dev/null +++ b/compose/integrations/composable-test-cases/testcases/expectActual/lib/build.gradle.kts @@ -0,0 +1,39 @@ +plugins { + kotlin("multiplatform") + id("org.jetbrains.compose") +} + +kotlin { + configureTargets() + + sourceSets { + val commonMain by getting { + dependencies { + implementation(compose.runtime) + implementation(getCommonLib()) + } + } + val commonTest by getting { + configureCommonTestDependencies() + } + + val nativeMain by creating { + dependsOn(commonMain) + } + val iosMain by getting { + dependsOn(nativeMain) + } + val linuxX64Main by getting { + dependsOn(nativeMain) + } + val macosX64Main by getting { + dependsOn(nativeMain) + } + val macosArm64Main by getting { + dependsOn(nativeMain) + } + val mingwX64Main by getting { + dependsOn(nativeMain) + } + } +} diff --git a/compose/integrations/composable-test-cases/testcases/expectActual/lib/src/commonMain/kotlin/Dependencies.kt b/compose/integrations/composable-test-cases/testcases/expectActual/lib/src/commonMain/kotlin/Dependencies.kt new file mode 100644 index 0000000000..edb625e065 --- /dev/null +++ b/compose/integrations/composable-test-cases/testcases/expectActual/lib/src/commonMain/kotlin/Dependencies.kt @@ -0,0 +1,10 @@ +import androidx.compose.runtime.Composable + +class Abc + + +val Abc.commonIntVal: Int + @Composable get() = 1000 + +expect val Abc.composableIntVal: Int + @Composable get \ No newline at end of file diff --git a/compose/integrations/composable-test-cases/testcases/expectActual/lib/src/desktopMain/kotlin/Actuals.kt b/compose/integrations/composable-test-cases/testcases/expectActual/lib/src/desktopMain/kotlin/Actuals.kt new file mode 100644 index 0000000000..3fef212c35 --- /dev/null +++ b/compose/integrations/composable-test-cases/testcases/expectActual/lib/src/desktopMain/kotlin/Actuals.kt @@ -0,0 +1,4 @@ +import androidx.compose.runtime.Composable + +actual val Abc.composableIntVal: Int + @Composable get () = 100 \ No newline at end of file diff --git a/compose/integrations/composable-test-cases/testcases/expectActual/lib/src/jsMain/kotlin/Actuals.kt b/compose/integrations/composable-test-cases/testcases/expectActual/lib/src/jsMain/kotlin/Actuals.kt new file mode 100644 index 0000000000..3fef212c35 --- /dev/null +++ b/compose/integrations/composable-test-cases/testcases/expectActual/lib/src/jsMain/kotlin/Actuals.kt @@ -0,0 +1,4 @@ +import androidx.compose.runtime.Composable + +actual val Abc.composableIntVal: Int + @Composable get () = 100 \ No newline at end of file diff --git a/compose/integrations/composable-test-cases/testcases/expectActual/lib/src/nativeMain/kotlin/Actuals.kt b/compose/integrations/composable-test-cases/testcases/expectActual/lib/src/nativeMain/kotlin/Actuals.kt new file mode 100644 index 0000000000..3fef212c35 --- /dev/null +++ b/compose/integrations/composable-test-cases/testcases/expectActual/lib/src/nativeMain/kotlin/Actuals.kt @@ -0,0 +1,4 @@ +import androidx.compose.runtime.Composable + +actual val Abc.composableIntVal: Int + @Composable get () = 100 \ No newline at end of file diff --git a/compose/integrations/composable-test-cases/testcases/expectActual/main/build.gradle.kts b/compose/integrations/composable-test-cases/testcases/expectActual/main/build.gradle.kts new file mode 100644 index 0000000000..d49878c7d2 --- /dev/null +++ b/compose/integrations/composable-test-cases/testcases/expectActual/main/build.gradle.kts @@ -0,0 +1,21 @@ +plugins { + kotlin("multiplatform") + id("org.jetbrains.compose") +} + +kotlin { + configureTargets() + + sourceSets { + val commonMain by getting { + dependencies { + implementation(compose.runtime) + implementation(getCommonLib()) + implementation(getLibDependencyForMain()) + } + } + val commonTest by getting { + configureCommonTestDependencies() + } + } +} diff --git a/compose/integrations/composable-test-cases/testcases/expectActual/main/src/commonTest/kotlin/Tests.kt b/compose/integrations/composable-test-cases/testcases/expectActual/main/src/commonTest/kotlin/Tests.kt new file mode 100644 index 0000000000..ec41e67c5b --- /dev/null +++ b/compose/integrations/composable-test-cases/testcases/expectActual/main/src/commonTest/kotlin/Tests.kt @@ -0,0 +1,32 @@ +import com.example.common.TextLeafNode +import com.example.common.composeText +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest +import kotlin.test.Test +import kotlin.test.assertEquals + +@OptIn(ExperimentalCoroutinesApi::class) +class Tests { + + @Test + // K/JS fails. Related: https://github.com/JetBrains/compose-multiplatform/issues/3373 + fun composableExpectActualValGetter() = runTest { + val root = composeText { + val v = Abc().composableIntVal + TextLeafNode("$v") + } + + assertEquals("root:{100}", root.dump()) + } + + @Test + fun commonComposableValGetter() = runTest { + val root = composeText { + val v = Abc().commonIntVal + TextLeafNode("$v") + } + + assertEquals("root:{1000}", root.dump()) + } + +} From e888495386d11e13a7bccbb5af012683462d1abc Mon Sep 17 00:00:00 2001 From: Oleksandr Karpovich Date: Tue, 8 Aug 2023 14:21:57 +0200 Subject: [PATCH 18/21] Handle ClassCastException for ComposeMultiplatformBuildService in Compose Gradle plugin (#3467) * Handle ClassCastException for ComposeMultiplatformBuildService in Compose Gradle plugin ClassCastException might occur when our gradle plugin was loaded more than once. See https://github.com/JetBrains/compose-multiplatform/issues/3459 We throw another exception with a bit more clear message. * Update gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeCompilerKotlinSupportPlugin.kt --- .../ComposeCompilerKotlinSupportPlugin.kt | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeCompilerKotlinSupportPlugin.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeCompilerKotlinSupportPlugin.kt index 7cd7f229f3..caeac692ef 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeCompilerKotlinSupportPlugin.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeCompilerKotlinSupportPlugin.kt @@ -13,6 +13,7 @@ import org.jetbrains.compose.internal.mppExtOrNull import org.jetbrains.compose.internal.webExt import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget +import java.lang.ClassCastException import javax.inject.Inject @Suppress("UnstableApiUsage") @@ -50,7 +51,21 @@ class ComposeCompilerKotlinSupportPlugin @Inject constructor( val service = ComposeMultiplatformBuildService.provider(target) buildEventsListenerRegistry.onTaskCompletion(service) - service.get().parameters.unsupportedCompilerPlugins.add( + val providedService = try { + service.get() + } catch (e: ClassCastException) { + // Compose Gradle plugin was probably loaded more than once + // See https://github.com/JetBrains/compose-multiplatform/issues/3459 + + throw IllegalStateException( + "Failed to get ComposeMultiplatformBuildService instance." + + " Compose Gradle plugin was probably loaded more than once." + + " Consider declaring it in the root build.gradle.kts", + e + ) + } + + providedService.parameters.unsupportedCompilerPlugins.add( target.provider { composeCompilerArtifactProvider.compilerArtifact.takeIf { target.hasNonJvmTargets() && it.isNonJBComposeCompiler() From 44376fdf851f3a6091e565c52c8e28d614f8a8d2 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov <654232+AlexeyTsvetkov@users.noreply.github.com> Date: Tue, 8 Aug 2023 14:38:41 +0200 Subject: [PATCH 19/21] =?UTF-8?q?Turn=20off=20Compose=20resources=20sync?= =?UTF-8?q?=20when=20third=20party=20resources=20plugins=20ar=E2=80=A6=20(?= =?UTF-8?q?#3469)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Turn off Compose resources sync when third party resources plugins are used * Fix Gradle 7.x test kit check --- .../resources/configureSyncIosResources.kt | 21 ++++- .../tests/integration/GradlePluginTest.kt | 89 +++++++++++++++++++ .../compose/test/utils/TestProject.kt | 7 ++ .../compose/test/utils/TestProjects.kt | 2 + .../compose/test/utils/assertUtils.kt | 7 ++ .../misc/iosMokoResources/build.gradle | 53 +++++++++++ .../misc/iosMokoResources/gradle.properties | 1 + .../misc/iosMokoResources/settings.gradle | 13 +++ .../src/commonMain/kotlin/App.kt | 10 +++ .../misc/iosResources/build.gradle | 48 ++++++++++ .../misc/iosResources/gradle.properties | 1 + .../misc/iosResources/settings.gradle | 12 +++ .../iosResources/src/commonMain/kotlin/App.kt | 38 ++++++++ .../resources/compose-multiplatform.xml | 36 ++++++++ 14 files changed, 337 insertions(+), 1 deletion(-) create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/iosMokoResources/build.gradle create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/iosMokoResources/gradle.properties create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/iosMokoResources/settings.gradle create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/iosMokoResources/src/commonMain/kotlin/App.kt create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/iosResources/build.gradle create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/iosResources/gradle.properties create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/iosResources/settings.gradle create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/kotlin/App.kt create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/resources/compose-multiplatform.xml diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/resources/configureSyncIosResources.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/resources/configureSyncIosResources.kt index 7e86148dd5..e640f8e9ba 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/resources/configureSyncIosResources.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/resources/configureSyncIosResources.kt @@ -23,8 +23,27 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.Framework import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType import java.io.File +private val incompatiblePlugins = listOf( + "dev.icerock.mobile.multiplatform-resources", + "io.github.skeptick.libres", +) + internal fun Project.configureSyncTask(mppExt: KotlinMultiplatformExtension) { - if (!IosGradleProperties.syncResources(providers).get()) return + fun reportSyncIsDisabled(reason: String) { + logger.info("Compose Multiplatform resource management for iOS is disabled: $reason") + } + + if (!IosGradleProperties.syncResources(providers).get()) { + reportSyncIsDisabled("'${IosGradleProperties.SYNC_RESOURCES_PROPERTY}' value is 'false'") + return + } + + for (incompatiblePluginId in incompatiblePlugins) { + if (project.plugins.hasPlugin(incompatiblePluginId)) { + reportSyncIsDisabled("resource management is not compatible with '$incompatiblePluginId'") + return + } + } with (SyncIosResourcesContext(project, mppExt)) { configureSyncResourcesTasks() diff --git a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/GradlePluginTest.kt b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/GradlePluginTest.kt index ab4c765ef6..f32fde4f74 100644 --- a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/GradlePluginTest.kt +++ b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/GradlePluginTest.kt @@ -8,7 +8,10 @@ package org.jetbrains.compose.test.tests.integration import org.jetbrains.compose.desktop.ui.tooling.preview.rpc.PreviewLogger import org.jetbrains.compose.desktop.ui.tooling.preview.rpc.RemoteConnection import org.jetbrains.compose.desktop.ui.tooling.preview.rpc.receiveConfigFromGradle +import org.jetbrains.compose.internal.utils.OS +import org.jetbrains.compose.internal.utils.currentOS import org.jetbrains.compose.test.utils.* +import org.junit.jupiter.api.Assumptions import java.net.ServerSocket import java.net.Socket @@ -17,8 +20,94 @@ import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicInteger import kotlin.concurrent.thread import org.junit.jupiter.api.Test +import java.io.File class GradlePluginTest : GradlePluginTestBase() { + private data class IosTestEnv( + val targetBuildDir: File, + val appDir: File, + val envVars: Map + ) + + enum class IosPlatform(val id: String) { + SIMULATOR("iphonesimulator"), IOS("iphoneos") + } + enum class IosArch(val id: String) { + X64("x86_64"), ARM64("arm64") + } + + enum class IosBuildConfiguration(val id: String) { + DEBUG("Debug"), RELEASE("Release") + } + + private fun iosTestEnv( + platform: IosPlatform = IosPlatform.SIMULATOR, + arch: IosArch = IosArch.X64, + configuration: IosBuildConfiguration = IosBuildConfiguration.DEBUG + ): IosTestEnv { + val targetBuildDir = testWorkDir.resolve("build/ios/${configuration.id}-${platform.id}").apply { mkdirs() } + val appDir = targetBuildDir.resolve("App.app").apply { mkdirs() } + val envVars = mapOf( + "PLATFORM_NAME" to platform.id, + "ARCHS" to arch.id, + "BUILT_PRODUCTS_DIR" to targetBuildDir.canonicalPath, + "CONTENTS_FOLDER_PATH" to appDir.name, + ) + return IosTestEnv( + targetBuildDir = targetBuildDir, + appDir = appDir, + envVars = envVars + ) + } + + @Test + fun iosResources() { + Assumptions.assumeTrue(currentOS == OS.MacOS) + val iosTestEnv = iosTestEnv() + val testEnv = defaultTestEnvironment.copy( + // for some reason configuration cache + test kit + custom vars does not work + useGradleConfigurationCache = false, + additionalEnvVars = iosTestEnv.envVars + ) + + with(testProject(TestProjects.iosResources, testEnv)) { + gradle(":embedAndSignAppleFrameworkForXcode", "--dry-run").checks { + // This test is not intended to actually run embedAndSignAppleFrameworkForXcode. + // Instead, it should check that embedAndSign depends on syncComposeResources using dry run + check.taskSkipped(":syncComposeResourcesForIos") + check.taskSkipped(":embedAndSignAppleFrameworkForXcode") + } + gradle(":syncComposeResourcesForIos").checks { + check.taskSuccessful(":syncComposeResourcesForIos") + iosTestEnv.appDir.resolve("compose-resources/compose-multiplatform.xml").checkExists() + } + } + } + + @Test + fun iosMokoResources() { + Assumptions.assumeTrue(currentOS == OS.MacOS) + val iosTestEnv = iosTestEnv() + val testEnv = defaultTestEnvironment.copy( + // for some reason configuration cache + test kit + custom vars does not work + useGradleConfigurationCache = false, + additionalEnvVars = iosTestEnv.envVars + ) + with(testProject(TestProjects.iosMokoResources, testEnv)) { + gradle( + ":embedAndSignAppleFrameworkForXcode", + ":copyFrameworkResourcesToApp", + "--dry-run", + "--info" + ).checks { + // This test is not intended to actually run embedAndSignAppleFrameworkForXcode. + // Instead, it should check that the sync disables itself. + check.logContains("Compose Multiplatform resource management for iOS is disabled") + check.logDoesntContain(":syncComposeResourcesForIos") + } + } + } + @Test fun skikoWasm() = with( testProject( diff --git a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/TestProject.kt b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/TestProject.kt index 3b4be8f071..ac5b024917 100644 --- a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/TestProject.kt +++ b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/TestProject.kt @@ -16,16 +16,19 @@ data class TestEnvironment( val workingDir: File, val kotlinVersion: String = TestKotlinVersions.Default, val composeGradlePluginVersion: String = TestProperties.composeGradlePluginVersion, + val mokoResourcesPluginVersion: String = "0.23.0", val composeCompilerPlugin: String? = null, val composeCompilerArgs: String? = null, val composeVerbose: Boolean = true, val useGradleConfigurationCache: Boolean = TestProperties.gradleConfigurationCache, + val additionalEnvVars: Map = mapOf() ) { private val placeholders = linkedMapOf( "COMPOSE_GRADLE_PLUGIN_VERSION_PLACEHOLDER" to composeGradlePluginVersion, "KOTLIN_VERSION_PLACEHOLDER" to kotlinVersion, "COMPOSE_COMPILER_PLUGIN_PLACEHOLDER" to composeCompilerPlugin, "COMPOSE_COMPILER_PLUGIN_ARGS_PLACEHOLDER" to composeCompilerArgs, + "MOKO_RESOURCES_PLUGIN_VERSION_PLACEHOLDER" to mokoResourcesPluginVersion, ) fun replacePlaceholdersInFile(file: File) { @@ -121,6 +124,10 @@ class TestProject( withGradleVersion(TestProperties.gradleVersionForTests) withProjectDir(testEnvironment.workingDir) withArguments(allArgs) + if (testEnvironment.additionalEnvVars.isNotEmpty()) { + val newEnv = HashMap(System.getenv() + testEnvironment.additionalEnvVars) + withEnvironment(newEnv) + } forwardOutput() } } diff --git a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/TestProjects.kt b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/TestProjects.kt index 27475fbb85..8ca826726a 100644 --- a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/TestProjects.kt +++ b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/TestProjects.kt @@ -24,4 +24,6 @@ object TestProjects { const val jsMpp = "misc/jsMpp" const val skikoWasm = "misc/skikoWasm" const val jvmPreview = "misc/jvmPreview" + const val iosResources = "misc/iosResources" + const val iosMokoResources = "misc/iosMokoResources" } \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/assertUtils.kt b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/assertUtils.kt index 56fbb3fea2..955616674c 100644 --- a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/assertUtils.kt +++ b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/assertUtils.kt @@ -53,6 +53,13 @@ internal class BuildResultChecks(private val result: BuildResult) { taskOutcome(task, TaskOutcome.FROM_CACHE) } + fun taskSkipped(task: String) { + // task outcome for skipped task is null in Gradle 7.x + if (result.task(task)?.outcome != null) { + taskOutcome(task, TaskOutcome.SKIPPED) + } + } + private fun taskOutcome(task: String, expectedOutcome: TaskOutcome) { val actualOutcome = result.task(task)?.outcome if (actualOutcome != expectedOutcome) { diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosMokoResources/build.gradle b/gradle-plugins/compose/src/test/test-projects/misc/iosMokoResources/build.gradle new file mode 100644 index 0000000000..f04770477f --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/iosMokoResources/build.gradle @@ -0,0 +1,53 @@ +plugins { + id "org.jetbrains.kotlin.multiplatform" + id "org.jetbrains.compose" + id "dev.icerock.mobile.multiplatform-resources" +} + +kotlin { + iosX64 { + binaries.framework { + baseName = "shared" + isStatic = true + } + } + iosArm64 { + binaries.framework { + baseName = "shared" + isStatic = true + } + } + iosSimulatorArm64 { + binaries.framework { + baseName = "shared" + isStatic = true + } + } + + sourceSets { + def commonMain = named("commonMain") { + dependencies { + implementation(compose.runtime) + implementation(compose.foundation) + implementation(compose.material) + implementation("dev.icerock.moko:resources-compose:MOKO_RESOURCES_PLUGIN_VERSION_PLACEHOLDER") // for compose multiplatform + } + } + def iosMain = create("iosMain") { + dependsOn(commonMain.get()) + } + named("iosX64Main") { + dependsOn(iosMain) + } + named("iosArm64Main") { + dependsOn(iosMain) + } + named("iosSimulatorArm64Main") { + dependsOn(iosMain) + } + } +} + +multiplatformResources { + multiplatformResourcesPackage = "org.example" +} \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosMokoResources/gradle.properties b/gradle-plugins/compose/src/test/test-projects/misc/iosMokoResources/gradle.properties new file mode 100644 index 0000000000..689880ee3f --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/iosMokoResources/gradle.properties @@ -0,0 +1 @@ +org.jetbrains.compose.experimental.uikit.enabled=true \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosMokoResources/settings.gradle b/gradle-plugins/compose/src/test/test-projects/misc/iosMokoResources/settings.gradle new file mode 100644 index 0000000000..7ce2258db9 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/iosMokoResources/settings.gradle @@ -0,0 +1,13 @@ +pluginManagement { + plugins { + id 'org.jetbrains.kotlin.multiplatform' version 'KOTLIN_VERSION_PLACEHOLDER' + id 'org.jetbrains.compose' version 'COMPOSE_GRADLE_PLUGIN_VERSION_PLACEHOLDER' + id 'dev.icerock.mobile.multiplatform-resources' version 'MOKO_RESOURCES_PLUGIN_VERSION_PLACEHOLDER' + } + repositories { + mavenLocal() + gradlePluginPortal() + maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" } + } +} +rootProject.name = "iosResources" \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosMokoResources/src/commonMain/kotlin/App.kt b/gradle-plugins/compose/src/test/test-projects/misc/iosMokoResources/src/commonMain/kotlin/App.kt new file mode 100644 index 0000000000..052b410fb1 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/iosMokoResources/src/commonMain/kotlin/App.kt @@ -0,0 +1,10 @@ +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable + +@Composable +fun App() { + MaterialTheme { + Text("Hello, World!") + } +} diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/build.gradle b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/build.gradle new file mode 100644 index 0000000000..df4dca6b00 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/build.gradle @@ -0,0 +1,48 @@ +plugins { + id "org.jetbrains.kotlin.multiplatform" + id "org.jetbrains.compose" +} + +kotlin { + iosX64 { + binaries.framework { + baseName = "shared" + isStatic = true + } + } + iosArm64 { + binaries.framework { + baseName = "shared" + isStatic = true + } + } + iosSimulatorArm64 { + binaries.framework { + baseName = "shared" + isStatic = true + } + } + + sourceSets { + def commonMain = named("commonMain") { + dependencies { + implementation(compose.runtime) + implementation(compose.foundation) + implementation(compose.material) + implementation(compose.components.resources) + } + } + def iosMain = create("iosMain") { + dependsOn(commonMain.get()) + } + named("iosX64Main") { + dependsOn(iosMain) + } + named("iosArm64Main") { + dependsOn(iosMain) + } + named("iosSimulatorArm64Main") { + dependsOn(iosMain) + } + } +} diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/gradle.properties b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/gradle.properties new file mode 100644 index 0000000000..689880ee3f --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/gradle.properties @@ -0,0 +1 @@ +org.jetbrains.compose.experimental.uikit.enabled=true \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/settings.gradle b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/settings.gradle new file mode 100644 index 0000000000..bcfce8c1d4 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/settings.gradle @@ -0,0 +1,12 @@ +pluginManagement { + plugins { + id 'org.jetbrains.kotlin.multiplatform' version 'KOTLIN_VERSION_PLACEHOLDER' + id 'org.jetbrains.compose' version 'COMPOSE_GRADLE_PLUGIN_VERSION_PLACEHOLDER' + } + repositories { + mavenLocal() + gradlePluginPortal() + maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" } + } +} +rootProject.name = "iosResources" \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/kotlin/App.kt b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/kotlin/App.kt new file mode 100644 index 0000000000..4b856546d9 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/kotlin/App.kt @@ -0,0 +1,38 @@ +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material.Button +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.painterResource + +@OptIn(ExperimentalResourceApi::class) +@Composable +fun App() { + MaterialTheme { + var greetingText by remember { mutableStateOf("Hello, World!") } + var showImage by remember { mutableStateOf(false) } + Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) { + Button(onClick = { + showImage = !showImage + }) { + Text(greetingText) + } + AnimatedVisibility(showImage) { + Image( + painterResource("compose-multiplatform.xml"), + null + ) + } + } + } +} diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/resources/compose-multiplatform.xml b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/resources/compose-multiplatform.xml new file mode 100644 index 0000000000..d7bf7955f4 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/resources/compose-multiplatform.xml @@ -0,0 +1,36 @@ + + + + + + + + From 950d5a991ccffbe9d7b831af413b30c97aa5ccf0 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov <654232+AlexeyTsvetkov@users.noreply.github.com> Date: Fri, 11 Aug 2023 17:33:11 +0200 Subject: [PATCH 20/21] Manage Kotlin native cache kind automatically based on Kotlin version (#3477) Set Kotlin/Native cache kind based on Kotlin version Resolves #2046 Resolves #2386 --- .../ComposeCompilerKotlinSupportPlugin.kt | 20 +-- .../ComposeMultiplatformBuildService.kt | 78 ++++++++---- .../org/jetbrains/compose/ComposePlugin.kt | 6 +- .../internal/ComposeProjectProperties.kt | 22 ++-- .../configureNativeCompilerCaching.kt | 114 ++++++++++++++++++ .../internal/utils/IosGradleProperties.kt | 4 +- .../BuildEventsListenerRegistryProvider.kt | 18 +++ .../internal/utils/KGPPropertyProvider.kt | 35 ++++++ .../compose/internal/utils/fileUtils.kt | 13 +- .../compose/internal/utils/gradleUtils.kt | 11 ++ .../compose/internal/utils/providerUtils.kt | 2 +- .../tests/integration/GradlePluginTest.kt | 55 +++++++++ .../compose/test/utils/TestKotlinVersions.kt | 2 + .../compose/test/utils/TestProjects.kt | 2 + .../compose/test/utils/assertUtils.kt | 22 ++++ .../misc/nativeCacheKind/build.gradle | 27 +++++ .../misc/nativeCacheKind/gradle.properties | 1 + .../misc/nativeCacheKind/settings.gradle | 12 ++ .../src/commonMain/kotlin/App.kt | 10 ++ .../misc/nativeCacheKindWarning/build.gradle | 20 +++ .../nativeCacheKindWarning/gradle.properties | 1 + .../nativeCacheKindWarning/settings.gradle | 12 ++ .../src/commonMain/kotlin/App.kt | 10 ++ 23 files changed, 439 insertions(+), 58 deletions(-) create mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/internal/configureNativeCompilerCaching.kt create mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/BuildEventsListenerRegistryProvider.kt create mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/KGPPropertyProvider.kt create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKind/build.gradle create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKind/gradle.properties create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKind/settings.gradle create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKind/src/commonMain/kotlin/App.kt create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKindWarning/build.gradle create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKindWarning/gradle.properties create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKindWarning/settings.gradle create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKindWarning/src/commonMain/kotlin/App.kt diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeCompilerKotlinSupportPlugin.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeCompilerKotlinSupportPlugin.kt index caeac692ef..3d9c326490 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeCompilerKotlinSupportPlugin.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeCompilerKotlinSupportPlugin.kt @@ -13,7 +13,6 @@ import org.jetbrains.compose.internal.mppExtOrNull import org.jetbrains.compose.internal.webExt import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget -import java.lang.ClassCastException import javax.inject.Inject @Suppress("UnstableApiUsage") @@ -48,24 +47,7 @@ class ComposeCompilerKotlinSupportPlugin @Inject constructor( return !groupId.startsWith("org.jetbrains.compose.compiler") } - val service = ComposeMultiplatformBuildService.provider(target) - buildEventsListenerRegistry.onTaskCompletion(service) - - val providedService = try { - service.get() - } catch (e: ClassCastException) { - // Compose Gradle plugin was probably loaded more than once - // See https://github.com/JetBrains/compose-multiplatform/issues/3459 - - throw IllegalStateException( - "Failed to get ComposeMultiplatformBuildService instance." + - " Compose Gradle plugin was probably loaded more than once." + - " Consider declaring it in the root build.gradle.kts", - e - ) - } - - providedService.parameters.unsupportedCompilerPlugins.add( + ComposeMultiplatformBuildService.getInstance(target).unsupportedCompilerPlugins.add( target.provider { composeCompilerArtifactProvider.compilerArtifact.takeIf { target.hasNonJvmTargets() && it.isNonJBComposeCompiler() diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeMultiplatformBuildService.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeMultiplatformBuildService.kt index 5e117da92e..e8da1a73c4 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeMultiplatformBuildService.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeMultiplatformBuildService.kt @@ -6,27 +6,32 @@ import org.gradle.api.provider.Provider import org.gradle.api.provider.SetProperty import org.gradle.api.services.BuildService import org.gradle.api.services.BuildServiceParameters -import org.gradle.api.services.BuildServiceRegistry import org.gradle.tooling.events.FinishEvent import org.gradle.tooling.events.OperationCompletionListener +import org.jetbrains.compose.internal.utils.BuildEventsListenerRegistryProvider import org.jetbrains.kotlin.gradle.plugin.SubpluginArtifact // The service implements OperationCompletionListener just so Gradle would use the service // even if the service is not used by any task or transformation -abstract class ComposeMultiplatformBuildService : BuildService, +abstract class ComposeMultiplatformBuildService : BuildService, OperationCompletionListener, AutoCloseable { - interface Parameters : BuildServiceParameters { - val unsupportedCompilerPlugins: SetProperty> - } private val log = Logging.getLogger(this.javaClass) + internal abstract val unsupportedCompilerPlugins: SetProperty> + internal abstract val delayedWarnings: SetProperty + + fun warnOnceAfterBuild(message: String) { + delayedWarnings.add(message) + } + override fun close() { notifyAboutUnsupportedCompilerPlugin() + logDelayedWarnings() } private fun notifyAboutUnsupportedCompilerPlugin() { - val unsupportedCompilerPlugin = parameters.unsupportedCompilerPlugins.orNull + val unsupportedCompilerPlugin = unsupportedCompilerPlugins.orNull ?.firstOrNull() ?.orNull @@ -35,28 +40,55 @@ abstract class ComposeMultiplatformBuildService : BuildService Unit): Provider = - project.gradle.sharedServices.registerOrConfigure { - fn() + private val COMPOSE_SERVICE_FQ_NAME = ComposeMultiplatformBuildService::class.java.canonicalName + + private fun findExistingComposeService(project: Project): ComposeMultiplatformBuildService? { + val registration = project.gradle.sharedServices.registrations.findByName(COMPOSE_SERVICE_FQ_NAME) + val service = registration?.service?.orNull + if (service != null) { + if (service !is ComposeMultiplatformBuildService) { + // Compose Gradle plugin was probably loaded more than once + // See https://github.com/JetBrains/compose-multiplatform/issues/3459 + if (service.javaClass.canonicalName == ComposeMultiplatformBuildService::class.java.canonicalName) { + val rootScript = project.rootProject.buildFile + error(""" + Compose Multiplatform Gradle plugin has been loaded in multiple classloaders. + To avoid classloading issues, declare Compose Gradle Plugin in root build file $rootScript. + """.trimIndent()) + } else { + error("Shared build service '$COMPOSE_SERVICE_FQ_NAME' has unexpected type: ${service.javaClass.canonicalName}") + } + } + return service } - fun provider(project: Project): Provider = configure(project) {} + return null + } + + @Suppress("UnstableApiUsage") + fun init(project: Project) { + val existingService = findExistingComposeService(project) + if (existingService != null) { + return + } + + val newService = project.gradle.sharedServices.registerIfAbsent(COMPOSE_SERVICE_FQ_NAME, ComposeMultiplatformBuildService::class.java) { + } + // workaround to instanciate a service even if it not binded to a task + BuildEventsListenerRegistryProvider.getInstance(project).onTaskCompletion(newService) + } + + fun getInstance(project: Project): ComposeMultiplatformBuildService = + findExistingComposeService(project) ?: error("ComposeMultiplatformBuildService was not initialized!") } } -inline fun > BuildServiceRegistry.registerOrConfigure( - crossinline fn: P.() -> Unit -): Provider { - val serviceClass = S::class.java - val serviceFqName = serviceClass.canonicalName - val existingService = registrations.findByName(serviceFqName) - ?.apply { (parameters as? P)?.fn() } - ?.service - return (existingService as? Provider) - ?: registerIfAbsent(serviceFqName, serviceClass) { - it.parameters.fn() - } -} \ No newline at end of file diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt index 041a68bb4a..d7e473e28e 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt @@ -21,6 +21,7 @@ import org.jetbrains.compose.desktop.preview.internal.initializePreview import org.jetbrains.compose.experimental.dsl.ExperimentalExtension import org.jetbrains.compose.experimental.internal.configureExperimentalTargetsFlagsCheck import org.jetbrains.compose.experimental.internal.configureExperimental +import org.jetbrains.compose.experimental.internal.configureNativeCompilerCaching import org.jetbrains.compose.experimental.uikit.internal.resources.configureSyncTask import org.jetbrains.compose.internal.KOTLIN_MPP_PLUGIN_ID import org.jetbrains.compose.internal.mppExt @@ -35,8 +36,10 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType internal val composeVersion get() = ComposeBuildConfig.composeVersion -class ComposePlugin : Plugin { +abstract class ComposePlugin : Plugin { override fun apply(project: Project) { + ComposeMultiplatformBuildService.init(project) + val composeExtension = project.extensions.create("compose", ComposeExtension::class.java, project) val desktopExtension = composeExtension.extensions.create("desktop", DesktopExtension::class.java) val androidExtension = composeExtension.extensions.create("android", AndroidExtension::class.java) @@ -52,6 +55,7 @@ class ComposePlugin : Plugin { composeExtension.extensions.create("web", WebExtension::class.java) project.plugins.apply(ComposeCompilerKotlinSupportPlugin::class.java) + project.configureNativeCompilerCaching() project.afterEvaluate { configureDesktop(project, desktopExtension) diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/ComposeProjectProperties.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/ComposeProjectProperties.kt index ab1011bc80..08123a4125 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/ComposeProjectProperties.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/ComposeProjectProperties.kt @@ -7,7 +7,7 @@ package org.jetbrains.compose.desktop.application.internal import org.gradle.api.provider.Provider import org.gradle.api.provider.ProviderFactory -import org.jetbrains.compose.internal.utils.findProperty +import org.jetbrains.compose.internal.utils.valueOrNull import org.jetbrains.compose.internal.utils.toBooleanProvider internal object ComposeProperties { @@ -23,32 +23,32 @@ internal object ComposeProperties { internal const val CHECK_JDK_VENDOR = "compose.desktop.packaging.checkJdkVendor" fun isVerbose(providers: ProviderFactory): Provider = - providers.findProperty(VERBOSE).toBooleanProvider(false) + providers.valueOrNull(VERBOSE).toBooleanProvider(false) fun preserveWorkingDir(providers: ProviderFactory): Provider = - providers.findProperty(PRESERVE_WD).toBooleanProvider(false) + providers.valueOrNull(PRESERVE_WD).toBooleanProvider(false) fun macSign(providers: ProviderFactory): Provider = - providers.findProperty(MAC_SIGN).toBooleanProvider(false) + providers.valueOrNull(MAC_SIGN).toBooleanProvider(false) fun macSignIdentity(providers: ProviderFactory): Provider = - providers.findProperty(MAC_SIGN_ID) + providers.valueOrNull(MAC_SIGN_ID) fun macSignKeychain(providers: ProviderFactory): Provider = - providers.findProperty(MAC_SIGN_KEYCHAIN) + providers.valueOrNull(MAC_SIGN_KEYCHAIN) fun macSignPrefix(providers: ProviderFactory): Provider = - providers.findProperty(MAC_SIGN_PREFIX) + providers.valueOrNull(MAC_SIGN_PREFIX) fun macNotarizationAppleID(providers: ProviderFactory): Provider = - providers.findProperty(MAC_NOTARIZATION_APPLE_ID) + providers.valueOrNull(MAC_NOTARIZATION_APPLE_ID) fun macNotarizationPassword(providers: ProviderFactory): Provider = - providers.findProperty(MAC_NOTARIZATION_PASSWORD) + providers.valueOrNull(MAC_NOTARIZATION_PASSWORD) fun macNotarizationAscProvider(providers: ProviderFactory): Provider = - providers.findProperty(MAC_NOTARIZATION_ASC_PROVIDER) + providers.valueOrNull(MAC_NOTARIZATION_ASC_PROVIDER) fun checkJdkVendor(providers: ProviderFactory): Provider = - providers.findProperty(CHECK_JDK_VENDOR).toBooleanProvider(true) + providers.valueOrNull(CHECK_JDK_VENDOR).toBooleanProvider(true) } \ No newline at end of file diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/internal/configureNativeCompilerCaching.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/internal/configureNativeCompilerCaching.kt new file mode 100644 index 0000000000..55e3a440a0 --- /dev/null +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/internal/configureNativeCompilerCaching.kt @@ -0,0 +1,114 @@ +/* + * Copyright 2020-2023 JetBrains s.r.o. and respective authors and developers. + * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. + */ + +package org.jetbrains.compose.experimental.internal + +import org.gradle.api.Project +import org.jetbrains.compose.ComposeMultiplatformBuildService +import org.jetbrains.compose.internal.KOTLIN_MPP_PLUGIN_ID +import org.jetbrains.compose.internal.mppExt +import org.jetbrains.compose.internal.utils.KGPPropertyProvider +import org.jetbrains.compose.internal.utils.configureEachWithType +import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget +import org.jetbrains.kotlin.konan.target.presetName + +private const val PROJECT_CACHE_KIND_PROPERTY_NAME = "kotlin.native.cacheKind" +private const val COMPOSE_NATIVE_MANAGE_CACHE_KIND = "compose.kotlin.native.manageCacheKind" +private const val NONE_VALUE = "none" + +internal fun Project.configureNativeCompilerCaching() { + if (findProperty(COMPOSE_NATIVE_MANAGE_CACHE_KIND) == "false") return + + plugins.withId(KOTLIN_MPP_PLUGIN_ID) { + val kotlinVersion = kotlinVersionNumbers(this) + mppExt.targets.configureEachWithType { + checkCacheKindUserValueIsNotNone() + configureTargetCompilerCache(kotlinVersion) + } + } +} + +private fun KotlinNativeTarget.checkCacheKindUserValueIsNotNone() { + // To determine cache kind KGP checks kotlin.native.cacheKind. first, then kotlin.native.cacheKind + // For each property it tries to read Project.property, then checks local.properties + // See https://github.com/JetBrains/kotlin/blob/d4d30dcfcf1afb083f09279c6f1ba05031efeabb/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt#L416 + val cacheKindProperties = listOf(targetCacheKindPropertyName, PROJECT_CACHE_KIND_PROPERTY_NAME) + val propertyProviders = listOf( + KGPPropertyProvider.GradleProperties(project), + KGPPropertyProvider.LocalProperties(project) + ) + + for (cacheKindProperty in cacheKindProperties) { + for (provider in propertyProviders) { + val value = provider.valueOrNull(cacheKindProperty) + if (value != null) { + if (value.equals(NONE_VALUE, ignoreCase = true)) { + ComposeMultiplatformBuildService + .getInstance(project) + .warnOnceAfterBuild(cacheKindPropertyWarningMessage(cacheKindProperty, provider)) + } + return + } + } + } +} + +private fun cacheKindPropertyWarningMessage( + cacheKindProperty: String, + provider: KGPPropertyProvider +) = """ + |Warning: '$cacheKindProperty' is explicitly set to `none`. + |This option significantly slows the Kotlin/Native compiler. + |Compose Multiplatform Gradle plugin can set this property automatically, + |when it is necessary. + | * Recommended action: remove explicit '$cacheKindProperty=$NONE_VALUE' from ${provider.location}. + | * Alternative action: if you are sure you need '$cacheKindProperty=$NONE_VALUE', disable + |this warning by adding '$COMPOSE_NATIVE_MANAGE_CACHE_KIND=false' to your 'gradle.properties'. +""".trimMargin() + +private fun KotlinNativeTarget.configureTargetCompilerCache(kotlinVersion: KotlinVersion) { + // See comments in https://youtrack.jetbrains.com/issue/KT-57329 + when { + // Kotlin < 1.9.0 => disable cache + kotlinVersion < KotlinVersion(1, 9, 0) -> { + disableKotlinNativeCache() + } + // 1.9.0 <= Kotlin < 1.9.20 => add -Xlazy-ir-for-caches=disable + kotlinVersion < KotlinVersion(1, 9, 20) -> { + disableLazyIrForCaches() + } + // Kotlin >= 1.9.20 => do nothing + else -> {} + } +} + +private val KotlinNativeTarget.targetCacheKindPropertyName: String + get() = "$PROJECT_CACHE_KIND_PROPERTY_NAME.${konanTarget.presetName}" + +private fun KotlinNativeTarget.disableKotlinNativeCache() { + if (project.hasProperty(targetCacheKindPropertyName)) { + project.setProperty(targetCacheKindPropertyName, NONE_VALUE) + } else { + project.extensions.extraProperties.set(targetCacheKindPropertyName, NONE_VALUE) + } +} + +private fun KotlinNativeTarget.disableLazyIrForCaches() { + compilations.configureEach { compilation -> + compilation.kotlinOptions.freeCompilerArgs += listOf("-Xlazy-ir-for-caches=disable") + } +} + +private fun kotlinVersionNumbers(project: Project): KotlinVersion { + val version = project.getKotlinPluginVersion() + val m = Regex("(\\d+)\\.(\\d+)\\.(\\d+)").find(version) ?: error("Kotlin version has unexpected format: '$version'") + val (_, majorPart, minorPart, patchPart) = m.groupValues + return KotlinVersion( + major = majorPart.toIntOrNull() ?: error("Could not parse major part '$majorPart' of Kotlin plugin version: '$version'"), + minor = minorPart.toIntOrNull() ?: error("Could not parse minor part '$minorPart' of Kotlin plugin version: '$version'"), + patch = patchPart.toIntOrNull() ?: error("Could not parse patch part '$patchPart' of Kotlin plugin version: '$version'"), + ) +} \ No newline at end of file diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/utils/IosGradleProperties.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/utils/IosGradleProperties.kt index bfacedbf39..fa5829b21d 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/utils/IosGradleProperties.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/utils/IosGradleProperties.kt @@ -7,12 +7,12 @@ package org.jetbrains.compose.experimental.uikit.internal.utils import org.gradle.api.provider.Provider import org.gradle.api.provider.ProviderFactory -import org.jetbrains.compose.internal.utils.findProperty +import org.jetbrains.compose.internal.utils.valueOrNull import org.jetbrains.compose.internal.utils.toBooleanProvider internal object IosGradleProperties { const val SYNC_RESOURCES_PROPERTY = "org.jetbrains.compose.ios.resources.sync" fun syncResources(providers: ProviderFactory): Provider = - providers.findProperty(SYNC_RESOURCES_PROPERTY).toBooleanProvider(true) + providers.valueOrNull(SYNC_RESOURCES_PROPERTY).toBooleanProvider(true) } \ No newline at end of file diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/BuildEventsListenerRegistryProvider.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/BuildEventsListenerRegistryProvider.kt new file mode 100644 index 0000000000..5aeab21c98 --- /dev/null +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/BuildEventsListenerRegistryProvider.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2020-2023 JetBrains s.r.o. and respective authors and developers. + * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. + */ + +package org.jetbrains.compose.internal.utils + +import org.gradle.api.Project +import org.gradle.build.event.BuildEventsListenerRegistry +import javax.inject.Inject + +@Suppress("UnstableApiUsage") +internal abstract class BuildEventsListenerRegistryProvider @Inject constructor(val registry: BuildEventsListenerRegistry) { + companion object { + fun getInstance(project: Project): BuildEventsListenerRegistry = + project.objects.newInstance(BuildEventsListenerRegistryProvider::class.java).registry + } +} \ No newline at end of file diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/KGPPropertyProvider.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/KGPPropertyProvider.kt new file mode 100644 index 0000000000..bef38b4a25 --- /dev/null +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/KGPPropertyProvider.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2020-2023 JetBrains s.r.o. and respective authors and developers. + * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. + */ + +package org.jetbrains.compose.internal.utils + +import org.gradle.api.Project +import java.util.* + +/** + * Reads Kotlin Gradle plugin properties. + * + * Kotlin Gradle plugin supports reading property from two sources: + * 1. Gradle properties. Normally located in gradle.properties file, + * but can also be provided via command-line, /gradle.properties + * or can be set via Gradle API. + * 2. local.properties file. local.properties file is not supported by Gradle out-of-the-box. + * Nevertheless, it became a widespread convention. + */ +internal abstract class KGPPropertyProvider { + abstract fun valueOrNull(propertyName: String): String? + abstract val location: String + + class GradleProperties(private val project: Project) : KGPPropertyProvider() { + override fun valueOrNull(propertyName: String): String? = project.findProperty(propertyName)?.toString() + override val location: String = "gradle.properties" + } + + class LocalProperties(project: Project) : KGPPropertyProvider() { + private val localProperties: Properties by lazyLoadProperties(project.localPropertiesFile) + override fun valueOrNull(propertyName: String): String? = localProperties.getProperty(propertyName) + override val location: String = "local.properties" + } +} \ No newline at end of file diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/fileUtils.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/fileUtils.kt index ed4dcec5ed..cb1cc91f4b 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/fileUtils.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/fileUtils.kt @@ -12,6 +12,7 @@ import org.gradle.api.file.FileSystemOperations import org.gradle.api.file.RegularFile import org.gradle.api.provider.Provider import java.io.File +import java.util.* internal fun Provider.toDir(project: Project): Provider = project.layout.dir(map { File(it) }) @@ -55,4 +56,14 @@ internal fun FileSystemOperations.clearDirs(vararg dirs: Provider>.ioFiles(): Array = - let { providers -> Array(size) { i -> providers[i].ioFile } } \ No newline at end of file + let { providers -> Array(size) { i -> providers[i].ioFile } } + +internal fun lazyLoadProperties(propertiesFile: File): Lazy = lazy { + Properties().apply { + if (propertiesFile.isFile) { + propertiesFile.inputStream().use { + load(it) + } + } + } +} \ No newline at end of file diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/gradleUtils.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/gradleUtils.kt index 570262ba67..4b41821891 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/gradleUtils.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/gradleUtils.kt @@ -5,6 +5,7 @@ package org.jetbrains.compose.internal.utils +import org.gradle.api.DomainObjectCollection import org.gradle.api.Project import org.gradle.api.artifacts.Configuration import org.gradle.api.logging.Logger @@ -61,3 +62,13 @@ internal fun Project.detachedDependency( internal fun Configuration.excludeTransitiveDependencies(): Configuration = apply { isTransitive = false } + +internal inline fun DomainObjectCollection<*>.configureEachWithType( + crossinline fn: SubT.() -> Unit +) { + configureEach { + if (it is SubT) { + it.fn() + } + } +} diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/providerUtils.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/providerUtils.kt index 955b49dd14..07bd94dd3b 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/providerUtils.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/internal/utils/providerUtils.kt @@ -30,7 +30,7 @@ internal inline fun Provider.toProperty(objects: ObjectFactory): internal inline fun Task.provider(noinline fn: () -> T): Provider = project.provider(fn) -internal fun ProviderFactory.findProperty(prop: String): Provider = +internal fun ProviderFactory.valueOrNull(prop: String): Provider = provider { gradleProperty(prop).forUseAtConfigurationTimeSafe().orNull } diff --git a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/GradlePluginTest.kt b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/GradlePluginTest.kt index f32fde4f74..f2cd0db71a 100644 --- a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/GradlePluginTest.kt +++ b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/GradlePluginTest.kt @@ -108,6 +108,61 @@ class GradlePluginTest : GradlePluginTestBase() { } } + @Test + fun nativeCacheKind() { + Assumptions.assumeTrue(currentOS == OS.MacOS) + fun nativeCacheKindProject(kotlinVersion: String) = testProject( + TestProjects.nativeCacheKind, + defaultTestEnvironment.copy(kotlinVersion = kotlinVersion, useGradleConfigurationCache = false) + ) + + val task = ":linkDebugFrameworkIosX64" + with(nativeCacheKindProject(kotlinVersion = TestKotlinVersions.v1_8_20)) { + gradle(task, "--info").checks { + check.taskSuccessful(task) + check.logDoesntContain("-Xauto-cache-from=") + } + } + testWorkDir.deleteRecursively() + testWorkDir.mkdirs() + with(nativeCacheKindProject(kotlinVersion = TestKotlinVersions.v1_9_0) ) { + gradle(task, "--info").checks { + check.taskSuccessful(task) + check.logContains("-Xauto-cache-from=") + check.logContains("-Xlazy-ir-for-caches=disable") + } + } + } + + @Test + fun nativeCacheKindWarning() { + Assumptions.assumeTrue(currentOS == OS.MacOS) + fun nativeCacheKindWarningProject(kotlinVersion: String) = testProject( + TestProjects.nativeCacheKindWarning, + defaultTestEnvironment.copy(kotlinVersion = kotlinVersion) + ) + + val cacheKindWarning = "Warning: 'kotlin.native.cacheKind' is explicitly set to `none`" + + val args = arrayOf("build", "--dry-run", "-Pkotlin.native.cacheKind=none") + with(nativeCacheKindWarningProject(kotlinVersion = TestKotlinVersions.v1_8_20)) { + gradle(*args).checks { + check.logContainsOnce(cacheKindWarning) + } + // check that the warning is shown even when the configuration is loaded from cache + gradle(*args).checks { + check.logContainsOnce(cacheKindWarning) + } + } + testWorkDir.deleteRecursively() + testWorkDir.mkdirs() + with(nativeCacheKindWarningProject(kotlinVersion = TestKotlinVersions.v1_9_0) ) { + gradle(*args).checks { + check.logContainsOnce(cacheKindWarning) + } + } + } + @Test fun skikoWasm() = with( testProject( diff --git a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/TestKotlinVersions.kt b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/TestKotlinVersions.kt index bfa4c10336..5dc8a2c555 100644 --- a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/TestKotlinVersions.kt +++ b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/TestKotlinVersions.kt @@ -7,4 +7,6 @@ package org.jetbrains.compose.test.utils object TestKotlinVersions { val Default = TestProperties.composeCompilerCompatibleKotlinVersion + val v1_8_20 = "1.8.20" + val v1_9_0 = "1.9.0" } \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/TestProjects.kt b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/TestProjects.kt index 8ca826726a..b2a84f49ba 100644 --- a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/TestProjects.kt +++ b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/TestProjects.kt @@ -26,4 +26,6 @@ object TestProjects { const val jvmPreview = "misc/jvmPreview" const val iosResources = "misc/iosResources" const val iosMokoResources = "misc/iosMokoResources" + const val nativeCacheKind = "misc/nativeCacheKind" + const val nativeCacheKindWarning = "misc/nativeCacheKindWarning" } \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/assertUtils.kt b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/assertUtils.kt index 955616674c..6be9978bb0 100644 --- a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/assertUtils.kt +++ b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/assertUtils.kt @@ -29,6 +29,14 @@ internal class BuildResultChecks(private val result: BuildResult) { val log: String get() = result.output + fun logContainsOnce(substring: String) { + val actualCount = log.countOccurrencesOf(substring) + if (actualCount != 1) throw AssertionError( + "Test output must contain substring '$substring' exactly once. " + + "Actual number of occurrences: $actualCount" + ) + } + fun logContains(substring: String) { if (!result.output.contains(substring)) { throw AssertionError("Test output does not contain the expected string: '$substring'") @@ -96,3 +104,17 @@ internal fun assertNotEqualTextFiles(actual: File, expected: File) { private fun File.normalizedText() = readLines().joinToString("\n") { it.trim() } + +private fun String.countOccurrencesOf(substring: String): Int { + var count = 0 + var i = 0 + while (i >= 0 && i < length) { + i = indexOf(substring, startIndex = i) + + if (i == -1) break + + i++ + count++ + } + return count +} diff --git a/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKind/build.gradle b/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKind/build.gradle new file mode 100644 index 0000000000..1e43a147b8 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKind/build.gradle @@ -0,0 +1,27 @@ +plugins { + id "org.jetbrains.kotlin.multiplatform" + id "org.jetbrains.compose" +} + +kotlin { + iosX64 { + binaries.framework { + isStatic = true + baseName = "shared" + } + } + iosArm64 { + binaries.framework { + isStatic = true + baseName = "shared" + } + } + + sourceSets { + commonMain { + dependencies { + implementation(compose.runtime) + } + } + } +} \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKind/gradle.properties b/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKind/gradle.properties new file mode 100644 index 0000000000..689880ee3f --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKind/gradle.properties @@ -0,0 +1 @@ +org.jetbrains.compose.experimental.uikit.enabled=true \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKind/settings.gradle b/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKind/settings.gradle new file mode 100644 index 0000000000..a270b9409b --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKind/settings.gradle @@ -0,0 +1,12 @@ +pluginManagement { + plugins { + id 'org.jetbrains.kotlin.multiplatform' version 'KOTLIN_VERSION_PLACEHOLDER' + id 'org.jetbrains.compose' version 'COMPOSE_GRADLE_PLUGIN_VERSION_PLACEHOLDER' + } + repositories { + mavenLocal() + gradlePluginPortal() + maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" } + } +} +rootProject.name = "nativeCacheKind" \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKind/src/commonMain/kotlin/App.kt b/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKind/src/commonMain/kotlin/App.kt new file mode 100644 index 0000000000..2fe6d0719f --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKind/src/commonMain/kotlin/App.kt @@ -0,0 +1,10 @@ +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue + +@Composable +fun App() { + var text by remember { mutableStateOf("Hello, World!") } +} diff --git a/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKindWarning/build.gradle b/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKindWarning/build.gradle new file mode 100644 index 0000000000..40170b68cb --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKindWarning/build.gradle @@ -0,0 +1,20 @@ +plugins { + id "org.jetbrains.kotlin.multiplatform" + id "org.jetbrains.compose" +} + +kotlin { + iosX64() + iosArm64() + iosSimulatorArm64() + macosX64() + macosArm64() + + sourceSets { + commonMain { + dependencies { + implementation(compose.runtime) + } + } + } +} \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKindWarning/gradle.properties b/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKindWarning/gradle.properties new file mode 100644 index 0000000000..689880ee3f --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKindWarning/gradle.properties @@ -0,0 +1 @@ +org.jetbrains.compose.experimental.uikit.enabled=true \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKindWarning/settings.gradle b/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKindWarning/settings.gradle new file mode 100644 index 0000000000..a270b9409b --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKindWarning/settings.gradle @@ -0,0 +1,12 @@ +pluginManagement { + plugins { + id 'org.jetbrains.kotlin.multiplatform' version 'KOTLIN_VERSION_PLACEHOLDER' + id 'org.jetbrains.compose' version 'COMPOSE_GRADLE_PLUGIN_VERSION_PLACEHOLDER' + } + repositories { + mavenLocal() + gradlePluginPortal() + maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" } + } +} +rootProject.name = "nativeCacheKind" \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKindWarning/src/commonMain/kotlin/App.kt b/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKindWarning/src/commonMain/kotlin/App.kt new file mode 100644 index 0000000000..2fe6d0719f --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/nativeCacheKindWarning/src/commonMain/kotlin/App.kt @@ -0,0 +1,10 @@ +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue + +@Composable +fun App() { + var text by remember { mutableStateOf("Hello, World!") } +} From 6d88ec2220f1b6620789a16a77173150ee8a185d Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Mon, 14 Aug 2023 03:04:03 +0200 Subject: [PATCH 21/21] 1.5.0-beta02 Changelog (#3483) --- CHANGELOG.md | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8cc0e92153..823fbd6623 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,58 @@ +# 1.5.0-beta02 (August 2023) + +## Common + +### Features +- [`androidx.compose.material.DropdownMenu` is available to use from common source set](https://github.com/JetBrains/compose-multiplatform-core/pull/738) +- [`androidx.compose.material3.DropdownMenu` is available to use from common source set](https://github.com/JetBrains/compose-multiplatform-core/pull/737) +- [`androidx.compose.material.AlertDialog` is available to use from common source set](https://github.com/JetBrains/compose-multiplatform-core/pull/708) +- [`androidx.compose.material3.AlertDialog` is available to use from common source set](https://github.com/JetBrains/compose-multiplatform-core/pull/710) +- [Add `PopupProperties.clippingEnabled` setting](https://github.com/JetBrains/compose-multiplatform-core/pull/740) +- material3. Support [`DatePicker`](https://github.com/JetBrains/compose-multiplatform-core/pull/717), [`DatePickerDialog`](https://github.com/JetBrains/compose-multiplatform-core/pull/745) and `TimePicker` + +### API Changes +- [Change the default layout behavior of `AlertDialog`](https://github.com/JetBrains/compose-multiplatform-core/pull/708) + +## iOS + +### Features +- [Support singleLine and `KeyboardAction`](https://github.com/JetBrains/compose-multiplatform-core/pull/699) + +### Fixes +- [Fix memory leak in `ComposeUIViewController`](https://github.com/JetBrains/compose-multiplatform/issues/3201) +- [Manage Kotlin native cache kind automatically based on Kotlin version](https://github.com/JetBrains/compose-multiplatform/pull/3477) (`kotlin.native.cacheKind=none` is no longer needed) +- [Limit max `Dialog` and `Popup` size by safe area on iOS](https://github.com/JetBrains/compose-multiplatform-core/pull/732) +- [`TextField`, Korean characters are not normally entered](https://github.com/JetBrains/compose-multiplatform/issues/3101) +- [`ColorMatrix` value range for 5th column was incorrect on Skiko backed platforms](https://github.com/JetBrains/compose-multiplatform/issues/3461) +- [`isSystemDarkTheme` now automatically react to the system theme changes](https://github.com/JetBrains/compose-multiplatform-core/pull/715) + +### API Changes +- [`ComposeUIViewController`. Dispose composition on `viewDidDisappear`](https://github.com/JetBrains/compose-multiplatform-core/pull/747) + +## Web + +### Features +- [Make `CanvasBasedWindow` apply default styles, set title](https://github.com/JetBrains/compose-multiplatform-core/pull/722) + +## Gradle Plugin + +### Features +- [Add `runtimeSaveable` to Dependencies in compose gradle plugin](https://github.com/JetBrains/compose-multiplatform/pull/3449) + +### API Changes +- [Raise error when Homebrew JDK is used for packaging](https://github.com/JetBrains/compose-multiplatform/pull/3451/files) + +## Dependencies + +This version of Compose Multiplatform is based on the next Jetpack Compose libraries: + +- [Compiler 1.5.0](https://developer.android.com/jetpack/androidx/releases/compose-compiler#1.5.0) +- [Runtime 1.5.0](https://developer.android.com/jetpack/androidx/releases/compose-runtime#1.5.0) +- [UI 1.5.0](https://developer.android.com/jetpack/androidx/releases/compose-ui#1.5.0) +- [Foundation 1.5.0](https://developer.android.com/jetpack/androidx/releases/compose-foundation#1.5.0) +- [Material 1.5.0](https://developer.android.com/jetpack/androidx/releases/compose-material#1.5.0) +- [Material3 1.1.1](https://developer.android.com/jetpack/androidx/releases/compose-material3#1.1.1) + # 1.5.0-beta01 (July 2023) ## Common