From d2d4971f282ce02c6647f852b197651424307a27 Mon Sep 17 00:00:00 2001 From: Oleksandr Karpovich Date: Thu, 19 Aug 2021 10:24:31 +0200 Subject: [PATCH] web: mark internal and experimental api in web-core (#1077) Co-authored-by: Oleksandr Karpovich --- .../org/jetbrains/compose/web/DomApplier.kt | 6 +-- .../compose/web/ExperimentalComposeWebApi.kt | 4 ++ .../compose/web/attributes/AttrsBuilder.kt | 8 +-- .../web/attributes/EventsListenerBuilder.kt | 2 +- .../jetbrains/compose/web/elements/Base.kt | 50 ++----------------- .../compose/web/elements/ElementScope.kt | 2 +- .../compose/web/elements/Elements.kt | 8 +-- .../jetbrains/compose/web/elements/Style.kt | 8 +-- .../jsTest/kotlin/elements/ElementsTests.kt | 6 ++- 9 files changed, 28 insertions(+), 66 deletions(-) create mode 100644 web/core/src/jsMain/kotlin/org/jetbrains/compose/web/ExperimentalComposeWebApi.kt diff --git a/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/DomApplier.kt b/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/DomApplier.kt index 411477e74d..d769f3e799 100644 --- a/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/DomApplier.kt +++ b/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/DomApplier.kt @@ -11,7 +11,7 @@ import org.w3c.dom.HTMLElement import org.w3c.dom.Node import org.w3c.dom.get -class DomApplier( +internal class DomApplier( root: DomNodeWrapper ) : AbstractApplier(root) { @@ -43,7 +43,7 @@ external interface EventListenerOptions { var capture: Boolean } -open class DomNodeWrapper(open val node: Node) { +internal open class DomNodeWrapper(open val node: Node) { private var currentListeners = emptyList>() fun updateEventListeners(list: List>) { @@ -92,7 +92,7 @@ open class DomNodeWrapper(open val node: Node) { } -class DomElementWrapper(override val node: HTMLElement): DomNodeWrapper(node) { +internal class DomElementWrapper(override val node: HTMLElement): DomNodeWrapper(node) { private var currentAttrs: Map? = null fun updateAttrs(attrs: Map) { diff --git a/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/ExperimentalComposeWebApi.kt b/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/ExperimentalComposeWebApi.kt new file mode 100644 index 0000000000..6defbae097 --- /dev/null +++ b/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/ExperimentalComposeWebApi.kt @@ -0,0 +1,4 @@ +package org.jetbrains.compose.web + +@RequiresOptIn("This API is experimental and is likely to change in the future.") +annotation class ExperimentalComposeWebApi diff --git a/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/attributes/AttrsBuilder.kt b/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/attributes/AttrsBuilder.kt index fe2ae3470c..60f51cfd67 100644 --- a/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/attributes/AttrsBuilder.kt +++ b/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/attributes/AttrsBuilder.kt @@ -21,8 +21,8 @@ open class AttrsBuilder : EventsListenerBuilder() { internal val attributesMap = mutableMapOf() val styleBuilder = StyleBuilderImpl() - val propertyUpdates = mutableListOf Unit, Any>>() - var refEffect: (DisposableEffectScope.(TElement) -> DisposableEffectResult)? = null + internal val propertyUpdates = mutableListOf Unit, Any>>() + internal var refEffect: (DisposableEffectScope.(TElement) -> DisposableEffectResult)? = null /** * [style] add inline CSS-style properties to the element via [StyleBuilder] context @@ -103,7 +103,7 @@ open class AttrsBuilder : EventsListenerBuilder() { propertyUpdates.add((update to value) as Pair<(Element, Any) -> Unit, Any>) } - fun collect(): Map { + internal fun collect(): Map { return attributesMap } @@ -131,6 +131,6 @@ open class AttrsBuilder : EventsListenerBuilder() { } } -val setClassList: (HTMLElement, Array) -> Unit = { e, classList -> +private val setClassList: (HTMLElement, Array) -> Unit = { e, classList -> e.classList.add(*classList) } diff --git a/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/attributes/EventsListenerBuilder.kt b/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/attributes/EventsListenerBuilder.kt index a0ddecdf6c..aebeac14fd 100644 --- a/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/attributes/EventsListenerBuilder.kt +++ b/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/attributes/EventsListenerBuilder.kt @@ -188,7 +188,7 @@ open class EventsListenerBuilder { listeners.add(SyntheticEventListener(SCROLL, options, listener)) } - fun collectListeners(): List> = listeners + internal fun collectListeners(): List> = listeners /** * [addEventListener] used for adding arbitrary events to the element. It resembles the standard DOM addEventListener method diff --git a/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/elements/Base.kt b/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/elements/Base.kt index 005b486ab3..26ce1ca8b6 100644 --- a/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/elements/Base.kt +++ b/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/elements/Base.kt @@ -13,54 +13,9 @@ import androidx.compose.runtime.remember import org.jetbrains.compose.web.DomApplier import org.jetbrains.compose.web.DomElementWrapper import org.jetbrains.compose.web.attributes.AttrsBuilder -import kotlinx.browser.document -import org.w3c.dom.Audio +import org.jetbrains.compose.web.ExperimentalComposeWebApi import org.w3c.dom.Element -import org.w3c.dom.HTMLAnchorElement -import org.w3c.dom.HTMLAreaElement -import org.w3c.dom.HTMLAudioElement -import org.w3c.dom.HTMLBRElement -import org.w3c.dom.HTMLButtonElement -import org.w3c.dom.HTMLDataListElement -import org.w3c.dom.HTMLDivElement import org.w3c.dom.HTMLElement -import org.w3c.dom.HTMLEmbedElement -import org.w3c.dom.HTMLFieldSetElement -import org.w3c.dom.HTMLFormElement -import org.w3c.dom.HTMLHRElement -import org.w3c.dom.HTMLHeadingElement -import org.w3c.dom.HTMLIFrameElement -import org.w3c.dom.HTMLImageElement -import org.w3c.dom.HTMLInputElement -import org.w3c.dom.HTMLLIElement -import org.w3c.dom.HTMLLabelElement -import org.w3c.dom.HTMLLegendElement -import org.w3c.dom.HTMLMapElement -import org.w3c.dom.HTMLMeterElement -import org.w3c.dom.HTMLOListElement -import org.w3c.dom.HTMLObjectElement -import org.w3c.dom.HTMLOptGroupElement -import org.w3c.dom.HTMLOptionElement -import org.w3c.dom.HTMLOutputElement -import org.w3c.dom.HTMLParagraphElement -import org.w3c.dom.HTMLParamElement -import org.w3c.dom.HTMLPictureElement -import org.w3c.dom.HTMLPreElement -import org.w3c.dom.HTMLProgressElement -import org.w3c.dom.HTMLSelectElement -import org.w3c.dom.HTMLSourceElement -import org.w3c.dom.HTMLSpanElement -import org.w3c.dom.HTMLStyleElement -import org.w3c.dom.HTMLTableCaptionElement -import org.w3c.dom.HTMLTableCellElement -import org.w3c.dom.HTMLTableColElement -import org.w3c.dom.HTMLTableElement -import org.w3c.dom.HTMLTableRowElement -import org.w3c.dom.HTMLTableSectionElement -import org.w3c.dom.HTMLTextAreaElement -import org.w3c.dom.HTMLTrackElement -import org.w3c.dom.HTMLUListElement -import org.w3c.dom.HTMLVideoElement @OptIn(ComposeCompilerApi::class) @Composable @@ -89,7 +44,7 @@ inline fun > ComposeDomNode( currentComposer.endNode() } -class DisposableEffectHolder( +class DisposableEffectHolder( var effect: (DisposableEffectScope.(TElement) -> DisposableEffectResult)? = null ) @@ -135,6 +90,7 @@ fun TagElement( } @Composable +@ExperimentalComposeWebApi fun TagElement( tagName: String, applyAttrs: AttrsBuilder.() -> Unit, diff --git a/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/elements/ElementScope.kt b/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/elements/ElementScope.kt index c13281068c..cd47766054 100644 --- a/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/elements/ElementScope.kt +++ b/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/elements/ElementScope.kt @@ -113,7 +113,7 @@ abstract class ElementScopeBase : ElementScope } } -open class ElementScopeImpl : ElementScopeBase() { +internal open class ElementScopeImpl : ElementScopeBase() { public override lateinit var element: TElement } diff --git a/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/elements/Elements.kt b/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/elements/Elements.kt index d532d46907..00f77316d8 100644 --- a/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/elements/Elements.kt +++ b/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/elements/Elements.kt @@ -883,8 +883,8 @@ fun Tfoot( * Usually, it's [androidx.compose.web.css.StyleSheet] instance */ @Composable -inline fun Style( - noinline applyAttrs: (AttrsBuilder.() -> Unit)? = null, +fun Style( + applyAttrs: (AttrsBuilder.() -> Unit)? = null, cssRules: CSSRuleDeclarationList ) { TagElement( @@ -912,8 +912,8 @@ inline fun Style( * @param rulesBuild allows to define the style rules using [StyleSheetBuilder] */ @Composable -inline fun Style( - noinline applyAttrs: (AttrsBuilder.() -> Unit)? = null, +fun Style( + applyAttrs: (AttrsBuilder.() -> Unit)? = null, rulesBuild: StyleSheetBuilder.() -> Unit ) { val builder = StyleSheetBuilderImpl() diff --git a/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/elements/Style.kt b/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/elements/Style.kt index 2411cc1f4c..017debfac2 100644 --- a/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/elements/Style.kt +++ b/web/core/src/jsMain/kotlin/org/jetbrains/compose/web/elements/Style.kt @@ -7,13 +7,13 @@ import org.w3c.dom.css.CSSStyleRule import org.jetbrains.compose.web.css.* import org.w3c.dom.css.CSSStyleSheet -fun clearCSSRules(sheet: CSSStyleSheet) { +internal fun clearCSSRules(sheet: CSSStyleSheet) { repeat(sheet.cssRules.length) { sheet.deleteRule(0) } } -fun setCSSRules(sheet: CSSStyleSheet, cssRules: CSSRuleDeclarationList) { +internal fun setCSSRules(sheet: CSSStyleSheet, cssRules: CSSRuleDeclarationList) { cssRules.forEach { cssRule -> sheet.addRule(cssRule) } @@ -81,7 +81,7 @@ private fun fillRule( } } -fun setProperty( +internal fun setProperty( style: CSSStyleDeclaration, name: String, value: StylePropertyValue @@ -89,7 +89,7 @@ fun setProperty( style.setProperty(name, value.toString()) } -fun setVariable( +internal fun setVariable( style: CSSStyleDeclaration, name: String, value: StylePropertyValue diff --git a/web/core/src/jsTest/kotlin/elements/ElementsTests.kt b/web/core/src/jsTest/kotlin/elements/ElementsTests.kt index 721cd11841..1b8feab268 100644 --- a/web/core/src/jsTest/kotlin/elements/ElementsTests.kt +++ b/web/core/src/jsTest/kotlin/elements/ElementsTests.kt @@ -6,6 +6,7 @@ package org.jetbrains.compose.web.core.tests.elements import androidx.compose.runtime.Composable +import org.jetbrains.compose.web.ExperimentalComposeWebApi import org.jetbrains.compose.web.attributes.AttrsBuilder import org.jetbrains.compose.web.core.tests.runTest import org.jetbrains.compose.web.dom.* @@ -65,7 +66,7 @@ class ElementsTests { Pair({ Ol() }, "OL"), Pair({ Li() }, "LI"), - Pair({ Img(src="whatever") }, "IMG"), + Pair({ Img(src = "whatever") }, "IMG"), Pair({ Form() }, "FORM"), Pair({ Select() }, "SELECT"), @@ -106,6 +107,7 @@ class ElementsTests { } @Test + @OptIn(ExperimentalComposeWebApi::class) fun rawCreation() = runTest { @Composable fun CustomElement( @@ -129,4 +131,4 @@ class ElementsTests { assertEquals("
CUSTOM
", root.outerHTML) } -} \ No newline at end of file +}