From a596516c79bbc2c6127d3e428015d5fd53a5d02c Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Wed, 2 Mar 2022 16:52:24 +0600 Subject: [PATCH 1/7] start 0.0.41 --- CHANGELOG.md | 2 ++ gradle.properties | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8df1f0..1b39f3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog +## 0.0.41 + ## 0.0.40 * All `DefaultTable` functions now use `Iterable` as data type diff --git a/gradle.properties b/gradle.properties index 94e07a0..9c57a62 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,4 +9,4 @@ android.enableJetifier=true # Project data group=dev.inmo -version=0.0.40 +version=0.0.41 From 556ab4e0903a86601ac842d0ebd53273f0d0ab8d Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Wed, 2 Mar 2022 16:52:58 +0600 Subject: [PATCH 2/7] add DropAre, UIKitPlaceholder and UIKitForm#Custom now have nullable target --- CHANGELOG.md | 4 ++++ .../dev/inmo/jsuikit/elements/DropArea.kt | 24 +++++++++++++++++++ .../dev/inmo/jsuikit/modifiers/UIKitForm.kt | 2 +- .../jsuikit/modifiers/UIKitPlaceholder.kt | 5 ++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/jsMain/kotlin/dev/inmo/jsuikit/elements/DropArea.kt create mode 100644 src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitPlaceholder.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b39f3b..f579161 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## 0.0.41 +* Add `DropArea` +* Add `UIKitPlaceholder` +* `UIKitForm#Custom` now have nullable param target + ## 0.0.40 * All `DefaultTable` functions now use `Iterable` as data type diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/elements/DropArea.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/elements/DropArea.kt new file mode 100644 index 0000000..9901aff --- /dev/null +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/elements/DropArea.kt @@ -0,0 +1,24 @@ +package dev.inmo.jsuikit.elements + +import androidx.compose.runtime.Composable +import dev.inmo.jsuikit.modifiers.* +import dev.inmo.jsuikit.utils.Attrs +import org.jetbrains.compose.web.attributes.InputType +import org.jetbrains.compose.web.dom.* +import org.w3c.dom.HTMLDivElement +import org.w3c.dom.HTMLInputElement + +@Composable +fun DropArea( + attrs: Attrs = Attrs.empty(), + inputAttrs: Attrs = Attrs.empty(), + contentBuilder: ContentBuilder = {} +) = Div( + { + include(UIKitPlaceholder, UIKitForm.Custom()) + attrs.builder(this) + } +) { + Input(InputType.File, attrs = { inputAttrs.builder.invoke(this) }) + contentBuilder(this) +} diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitForm.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitForm.kt index 341a09e..4c10841 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitForm.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitForm.kt @@ -47,7 +47,7 @@ sealed class UIKitForm( object Icon : UIKitForm("uk-form-icon") class Custom( - target: String = "true" + target: String? = null ) : UIKitForm( otherAttrs = mapOf( buildAttribute("uk-form-custom") { diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitPlaceholder.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitPlaceholder.kt new file mode 100644 index 0000000..a444b73 --- /dev/null +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitPlaceholder.kt @@ -0,0 +1,5 @@ +package dev.inmo.jsuikit.modifiers + +object UIKitPlaceholder : UIKitModifier { + override val classes: Array = arrayOf("uk-placeholder") +} From 0b11e2c1b9805bf63a9f8b635d62e93964709520 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Wed, 2 Mar 2022 17:59:52 +0600 Subject: [PATCH 3/7] add UIKitUtility#Link --- CHANGELOG.md | 1 + src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitUtility.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f579161..f335481 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * Add `DropArea` * Add `UIKitPlaceholder` * `UIKitForm#Custom` now have nullable param target +* Add `UIKitUtility#Link` ## 0.0.40 diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitUtility.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitUtility.kt index 97f5249..515e0b7 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitUtility.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitUtility.kt @@ -111,4 +111,5 @@ sealed class UIKitUtility(classname: String) : UIKitModifier { object Active : UIKitUtility("uk-active") object Open : UIKitUtility("uk-open") + object Link : UIKitUtility("uk-link") } From c720973bfcda67d6f4e6338cc265d561147dec05 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Wed, 2 Mar 2022 18:06:41 +0600 Subject: [PATCH 4/7] UIKitForm#Custom now will also include class uk-form-custom --- src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitForm.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitForm.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitForm.kt index 4c10841..96d5b91 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitForm.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitForm.kt @@ -49,6 +49,7 @@ sealed class UIKitForm( class Custom( target: String? = null ) : UIKitForm( + "uk-form-custom", otherAttrs = mapOf( buildAttribute("uk-form-custom") { "target" to target From f77c21ac51ff95edce2f036213bd565e7cf037e6 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Wed, 2 Mar 2022 18:40:07 +0600 Subject: [PATCH 5/7] fixes in DropAre and new type of attrs --- .../kotlin/dev/inmo/jsuikit/elements/DropArea.kt | 7 +++++-- .../inmo/jsuikit/utils/AttributesCollection.kt | 16 ++++++++++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/elements/DropArea.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/elements/DropArea.kt index 9901aff..ec24ed4 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/elements/DropArea.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/elements/DropArea.kt @@ -3,6 +3,7 @@ package dev.inmo.jsuikit.elements import androidx.compose.runtime.Composable import dev.inmo.jsuikit.modifiers.* import dev.inmo.jsuikit.utils.Attrs +import dev.inmo.jsuikit.utils.InputAttrs import org.jetbrains.compose.web.attributes.InputType import org.jetbrains.compose.web.dom.* import org.w3c.dom.HTMLDivElement @@ -11,7 +12,7 @@ import org.w3c.dom.HTMLInputElement @Composable fun DropArea( attrs: Attrs = Attrs.empty(), - inputAttrs: Attrs = Attrs.empty(), + inputAttrs: InputAttrs = Attrs.empty(), contentBuilder: ContentBuilder = {} ) = Div( { @@ -19,6 +20,8 @@ fun DropArea( attrs.builder(this) } ) { - Input(InputType.File, attrs = { inputAttrs.builder.invoke(this) }) + FileInput { + inputAttrs.builder.invoke(this) + } contentBuilder(this) } diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/utils/AttributesCollection.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/utils/AttributesCollection.kt index c71d37d..d7635ad 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/utils/AttributesCollection.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/utils/AttributesCollection.kt @@ -3,19 +3,22 @@ package dev.inmo.jsuikit.utils import dev.inmo.jsuikit.modifiers.UIKitModifier import dev.inmo.jsuikit.modifiers.include import org.jetbrains.compose.web.attributes.AttrsBuilder +import org.jetbrains.compose.web.attributes.InputType +import org.jetbrains.compose.web.attributes.builders.InputAttrsBuilder import org.jetbrains.compose.web.dom.AttrBuilderContext import org.w3c.dom.Element +import org.w3c.dom.HTMLInputElement -class AttributesCollection ( +class AttributesCollection> ( private vararg val modifiers: UIKitModifier, - private val attrs: AttrBuilderContext = {} + private val attrs: Builder.() -> Unit = {} ) { - val builder: AttrBuilderContext = { + val builder: Builder.() -> Unit = { include(*modifiers) attrs() } - operator fun plus(other: AttributesCollection) = AttributesCollection( + operator fun plus(other: AttributesCollection) = AttributesCollection( *(modifiers + other.modifiers).distinct().toTypedArray() ) { this@AttributesCollection.attrs.invoke(this) @@ -26,8 +29,9 @@ class AttributesCollection ( val Empty = Attrs() @Suppress("UNCHECKED_CAST") - fun empty() = Empty as Attrs + fun > empty() = Empty as AttributesCollection } } -typealias Attrs = AttributesCollection +typealias Attrs = AttributesCollection> +typealias InputAttrs = AttributesCollection> From b836fe744e0fa17eff3a57d7ec60abd0a61a5dce Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Wed, 2 Mar 2022 20:27:23 +0600 Subject: [PATCH 6/7] DescriptionList --- CHANGELOG.md | 1 + .../inmo/jsuikit/elements/DescriptionList.kt | 57 +++++++++++++++++++ .../jsuikit/modifiers/UIKitDescriptionList.kt | 11 ++++ .../kotlin/dev/inmo/jsuikit/utils/Dlist.kt | 55 ++++++++++++++++++ 4 files changed, 124 insertions(+) create mode 100644 src/jsMain/kotlin/dev/inmo/jsuikit/elements/DescriptionList.kt create mode 100644 src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitDescriptionList.kt create mode 100644 src/jsMain/kotlin/dev/inmo/jsuikit/utils/Dlist.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index f335481..feee5bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ * Add `UIKitPlaceholder` * `UIKitForm#Custom` now have nullable param target * Add `UIKitUtility#Link` +* Add `DescriptionList` and several support composable functions ## 0.0.40 diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/elements/DescriptionList.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/elements/DescriptionList.kt new file mode 100644 index 0000000..7510e94 --- /dev/null +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/elements/DescriptionList.kt @@ -0,0 +1,57 @@ +package dev.inmo.jsuikit.elements + +import androidx.compose.runtime.Composable +import dev.inmo.jsuikit.modifiers.UIKitDescriptionList +import dev.inmo.jsuikit.modifiers.include +import dev.inmo.jsuikit.utils.* +import org.jetbrains.compose.web.dom.ContentBuilder +import org.jetbrains.compose.web.dom.ElementScope +import org.w3c.dom.HTMLDListElement +import org.w3c.dom.HTMLElement + +@Composable +fun DescriptionList( + attrs: Attrs, + contentBuilder: ContentBuilder +) { + DList( + { + include(UIKitDescriptionList) + attrs.builder(this) + }, + contentBuilder + ) +} + +@Composable +fun DescriptionList( + data: Iterable, + attrs: Attrs, + beforeTermContent: (@Composable ElementScope.(Int, T) -> Unit)? = null, + itemTermAttrs: ((Int, T) -> Attrs?)? = null, + itemTermContent: (@Composable ElementScope.(Int, T) -> Unit)? = null, + betweenTermAndDescriptionContent: (@Composable ElementScope.(Int, T) -> Unit)? = null, + afterDescriptionContent: (@Composable ElementScope.(Int, T) -> Unit)? = null, + itemDescriptionAttrs: ((Int, T) -> Attrs?)? = null, + itemDescriptionContent: (@Composable ElementScope.(Int, T) -> Unit)? = null +) { + DescriptionList(attrs) { + data.forEachIndexed { i, t -> + beforeTermContent ?.invoke(this, i, t) + if (itemTermAttrs != null || itemTermContent != null) { + DTerm( + itemTermAttrs ?.let { { it(i, t) } }, + itemTermContent ?.let { { it(i, t) } }, + ) + } + betweenTermAndDescriptionContent ?.invoke(this, i, t) + if (itemDescriptionAttrs != null || itemDescriptionContent != null) { + DDescription( + itemDescriptionAttrs ?.let { { it(i, t) } }, + itemDescriptionContent ?.let { { it(i, t) } }, + ) + } + afterDescriptionContent ?.invoke(this, i, t) + } + } +} diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitDescriptionList.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitDescriptionList.kt new file mode 100644 index 0000000..1292c4e --- /dev/null +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitDescriptionList.kt @@ -0,0 +1,11 @@ +package dev.inmo.jsuikit.modifiers + +sealed class UIKitDescriptionList( + override val classes: Array +) : UIKitModifier { + + object Divider : UIKitDescriptionList(arrayOf("uk-description-list-divider")) + + companion object : UIKitDescriptionList(arrayOf("uk-description-list")) + +} diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/utils/Dlist.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/utils/Dlist.kt new file mode 100644 index 0000000..c886d2c --- /dev/null +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/utils/Dlist.kt @@ -0,0 +1,55 @@ +package dev.inmo.jsuikit.utils + +import androidx.compose.runtime.Composable +import kotlinx.browser.document +import org.jetbrains.compose.web.dom.* +import org.w3c.dom.* + +private object DListElementBuilder : ElementBuilder { + private val el: Element by lazy { document.createElement("dl") } + override fun create(): HTMLDListElement = el.cloneNode() as HTMLDListElement +} + +private object DTermElementBuilder : ElementBuilder { + private val el: Element by lazy { document.createElement("dt") } + override fun create(): HTMLElement = el.cloneNode() as HTMLElement +} + +private object DDescriptionElementBuilder : ElementBuilder { + private val el: Element by lazy { document.createElement("dd") } + override fun create(): HTMLElement = el.cloneNode() as HTMLElement +} + +@Composable +fun DList( + attrs: AttrBuilderContext? = null, + content: ContentBuilder? = null +) { + TagElement( + DListElementBuilder, + attrs, + content + ) +} +@Composable +fun DTerm( + attrs: AttrBuilderContext? = null, + content: ContentBuilder? = null +) { + TagElement( + DTermElementBuilder, + attrs, + content + ) +} +@Composable +fun DDescription( + attrs: AttrBuilderContext? = null, + content: ContentBuilder? = null +) { + TagElement( + DDescriptionElementBuilder, + attrs, + content + ) +} From 33fbd2c0be1ec73f6db136d9a40416085542da25 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Wed, 2 Mar 2022 21:57:55 +0600 Subject: [PATCH 7/7] now it is possible to include nullable modifiers in attrs --- .../kotlin/dev/inmo/jsuikit/utils/AttributesCollection.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/utils/AttributesCollection.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/utils/AttributesCollection.kt index d7635ad..38c7f6b 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/utils/AttributesCollection.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/utils/AttributesCollection.kt @@ -10,7 +10,7 @@ import org.w3c.dom.Element import org.w3c.dom.HTMLInputElement class AttributesCollection> ( - private vararg val modifiers: UIKitModifier, + private vararg val modifiers: UIKitModifier?, private val attrs: Builder.() -> Unit = {} ) { val builder: Builder.() -> Unit = {