Browse Source
Library `org.jetbrains.compose.components:components-ui-tooling-preview` **This library is subject to change in the future.** Added library `org.jetbrains.compose.components:components-ui-tooling-preview:VERSION`, where VERSION - shoud will be Compose version. Simple Preview without arguments and PreviewParameterProvider for future usage. --------- Co-authored-by: Igor Demin <igordmn@users.noreply.github.com>pull/3956/head
dima.avdeev
1 year ago
committed by
GitHub
9 changed files with 293 additions and 0 deletions
@ -0,0 +1,22 @@
|
||||
plugins { |
||||
kotlin("multiplatform") |
||||
id("org.jetbrains.compose") |
||||
} |
||||
|
||||
kotlin { |
||||
jvm() |
||||
sourceSets { |
||||
val jvmMain by getting { |
||||
dependencies { |
||||
implementation(compose.desktop.currentOs) |
||||
implementation(project(":ui-tooling-preview:demo:shared")) |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
compose.desktop { |
||||
application { |
||||
mainClass = "MainKt" |
||||
} |
||||
} |
@ -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. |
||||
*/ |
||||
|
||||
import androidx.compose.ui.unit.DpSize |
||||
import androidx.compose.ui.unit.dp |
||||
import androidx.compose.ui.window.WindowState |
||||
import androidx.compose.ui.window.singleWindowApplication |
||||
import org.jetbrains.compose.preview.demo.shared.MainView |
||||
|
||||
fun main() = |
||||
singleWindowApplication( |
||||
title = "Preview annotation demo", |
||||
state = WindowState(size = DpSize(800.dp, 800.dp)) |
||||
) { |
||||
MainView() |
||||
} |
@ -0,0 +1,85 @@
|
||||
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi |
||||
|
||||
plugins { |
||||
kotlin("multiplatform") |
||||
id("com.android.library") |
||||
id("org.jetbrains.compose") |
||||
} |
||||
|
||||
kotlin { |
||||
@OptIn(ExperimentalKotlinGradlePluginApi::class) |
||||
targetHierarchy.default() |
||||
androidTarget { |
||||
compilations.all { |
||||
kotlinOptions { |
||||
jvmTarget = "11" |
||||
} |
||||
} |
||||
} |
||||
jvm("desktop") |
||||
listOf( |
||||
iosX64(), |
||||
iosArm64(), |
||||
iosSimulatorArm64() |
||||
).forEach { iosTarget -> |
||||
iosTarget.binaries.framework { |
||||
baseName = "shared" |
||||
isStatic = true |
||||
} |
||||
} |
||||
js { |
||||
browser { |
||||
testTask(Action { |
||||
enabled = false |
||||
}) |
||||
} |
||||
binaries.executable() |
||||
} |
||||
|
||||
listOf( |
||||
macosX64(), |
||||
macosArm64() |
||||
).forEach { macosTarget -> |
||||
macosTarget.binaries { |
||||
executable { |
||||
entryPoint = "main" |
||||
} |
||||
} |
||||
} |
||||
|
||||
sourceSets { |
||||
val commonMain by getting { |
||||
dependencies { |
||||
implementation(compose.runtime) |
||||
implementation(compose.material3) |
||||
implementation(project(":ui-tooling-preview:library")) |
||||
} |
||||
} |
||||
val desktopMain by getting { |
||||
dependencies { |
||||
implementation(compose.desktop.common) |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
android { |
||||
compileSdk = 34 |
||||
namespace = "org.jetbrains.compose.ui.tooling.preview.demo.shared" |
||||
defaultConfig { |
||||
minSdk = 21 |
||||
} |
||||
compileOptions { |
||||
sourceCompatibility = JavaVersion.VERSION_11 |
||||
targetCompatibility = JavaVersion.VERSION_11 |
||||
} |
||||
} |
||||
|
||||
compose.experimental { |
||||
web.application {} |
||||
} |
||||
|
||||
// TODO: remove this block after we update on a newer kotlin. Currently there is an error: `error:0308010C:digital envelope routines::unsupported` |
||||
rootProject.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin> { |
||||
rootProject.the<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension>().nodeVersion = "16.0.0" |
||||
} |
@ -0,0 +1,16 @@
|
||||
package org.jetbrains.compose.preview.demo.shared |
||||
|
||||
import androidx.compose.material3.Text |
||||
import androidx.compose.runtime.Composable |
||||
import org.jetbrains.compose.ui.tooling.preview.Preview |
||||
|
||||
@Composable |
||||
internal fun UsedInPreview() { |
||||
Text("This is commonMain Composable function") |
||||
} |
||||
|
||||
@Preview |
||||
@Composable |
||||
fun UsePreviewAnnotation() { |
||||
UsedInPreview() |
||||
} |
@ -0,0 +1,13 @@
|
||||
/* |
||||
* 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.preview.demo.shared |
||||
|
||||
import androidx.compose.runtime.Composable |
||||
|
||||
@Composable |
||||
fun MainView() { |
||||
UsedInPreview() |
||||
} |
@ -0,0 +1,55 @@
|
||||
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi |
||||
|
||||
plugins { |
||||
kotlin("multiplatform") |
||||
id("maven-publish") |
||||
id("com.android.library") |
||||
} |
||||
|
||||
val composeVersion = extra["compose.version"] as String |
||||
|
||||
kotlin { |
||||
@OptIn(ExperimentalKotlinGradlePluginApi::class) |
||||
targetHierarchy.default() |
||||
jvm("desktop") |
||||
androidTarget { |
||||
publishLibraryVariants("release") |
||||
compilations.all { |
||||
kotlinOptions { |
||||
jvmTarget = "11" |
||||
} |
||||
} |
||||
} |
||||
iosX64() |
||||
iosArm64() |
||||
iosSimulatorArm64() |
||||
js { |
||||
browser { |
||||
testTask(Action { |
||||
enabled = false |
||||
}) |
||||
} |
||||
} |
||||
macosX64() |
||||
macosArm64() |
||||
} |
||||
|
||||
android { |
||||
compileSdk = 34 |
||||
namespace = "org.jetbrains.compose.ui.tooling.preview" |
||||
defaultConfig { |
||||
minSdk = 21 |
||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" |
||||
} |
||||
compileOptions { |
||||
sourceCompatibility = JavaVersion.VERSION_11 |
||||
targetCompatibility = JavaVersion.VERSION_11 |
||||
} |
||||
} |
||||
|
||||
configureMavenPublication( |
||||
groupId = "org.jetbrains.compose.components", |
||||
artifactId = "components-ui-tooling-preview", |
||||
name = "Experimental Compose Multiplatform tooling library API. This library provides the API required to declare " + |
||||
"@Preview composables in user apps." |
||||
) |
@ -0,0 +1,34 @@
|
||||
/* |
||||
* Copyright 2023 The Android Open Source Project |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.jetbrains.compose.ui.tooling.preview |
||||
|
||||
import androidx.compose.runtime.Composable |
||||
|
||||
/** |
||||
* [Preview] can be applied to either of the following: |
||||
* - @[Composable] methods with no parameters to show them in the IDE preview. |
||||
* - Annotation classes, that could then be used to annotate @[Composable] methods or other |
||||
* annotation classes, which will then be considered as indirectly annotated with that [Preview]. |
||||
*/ |
||||
@MustBeDocumented |
||||
@Retention(AnnotationRetention.BINARY) |
||||
@Target( |
||||
AnnotationTarget.ANNOTATION_CLASS, |
||||
AnnotationTarget.FUNCTION |
||||
) |
||||
@Repeatable |
||||
annotation class Preview |
@ -0,0 +1,47 @@
|
||||
/* |
||||
* Copyright 2023 The Android Open Source Project |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.jetbrains.compose.ui.tooling.preview |
||||
|
||||
import kotlin.reflect.KClass |
||||
|
||||
/** |
||||
* Interface to be implemented by any provider of values that you want to be injected as @[Preview] |
||||
* parameters. This allows providing sample information for previews. |
||||
*/ |
||||
interface PreviewParameterProvider<T> { |
||||
/** |
||||
* [Sequence] of values of type [T] to be passed as @[Preview] parameter. |
||||
*/ |
||||
val values: Sequence<T> |
||||
|
||||
/** |
||||
* Returns the number of elements in the [values] [Sequence]. |
||||
*/ |
||||
val count get() = values.count() |
||||
} |
||||
|
||||
/** |
||||
* [PreviewParameter] can be applied to any parameter of a @[Preview]. |
||||
* |
||||
* @param provider A [PreviewParameterProvider] class to use to inject values to the annotated |
||||
* parameter. |
||||
* @param limit Max number of values from [provider] to inject to this parameter. |
||||
*/ |
||||
annotation class PreviewParameter( |
||||
val provider: KClass<out PreviewParameterProvider<*>>, |
||||
val limit: Int = Int.MAX_VALUE |
||||
) |
Loading…
Reference in new issue