JSUIKitKBindings/src/jsMain/kotlin/dev/inmo/jsuikit/utils/AttributesCollection.kt

38 lines
1.3 KiB
Kotlin
Raw Normal View History

package dev.inmo.jsuikit.utils
import dev.inmo.jsuikit.modifiers.UIKitModifier
import dev.inmo.jsuikit.modifiers.include
import org.jetbrains.compose.web.attributes.AttrsScope
2022-08-20 11:43:44 +00:00
import org.jetbrains.compose.web.attributes.HtmlAttrMarker
import org.jetbrains.compose.web.attributes.builders.InputAttrsScope
2022-08-20 11:43:44 +00:00
import org.jetbrains.compose.web.dom.AttrBuilderContext
import org.w3c.dom.Element
2022-03-02 12:40:07 +00:00
import org.w3c.dom.HTMLInputElement
class AttributesCollection<T : Element, Builder : AttrsScope<T>> (
private vararg val modifiers: UIKitModifier?,
2022-03-02 12:40:07 +00:00
private val attrs: Builder.() -> Unit = {}
) {
2022-03-02 12:40:07 +00:00
val builder: Builder.() -> Unit = {
include(*modifiers)
attrs()
}
2022-03-02 12:40:07 +00:00
operator fun plus(other: AttributesCollection<T, Builder>) = AttributesCollection<T, Builder>(
2022-02-24 18:22:17 +00:00
*(modifiers + other.modifiers).distinct().toTypedArray()
) {
this@AttributesCollection.attrs.invoke(this)
other.attrs.invoke(this)
}
companion object {
val Empty = Attrs<Element>()
@Suppress("UNCHECKED_CAST")
fun <T : Element, Builder : AttrsScope<T>> empty() = Empty as AttributesCollection<T, Builder>
}
}
typealias Attrs<T> = AttributesCollection<T, AttrsScope<T>>
typealias InputAttrs<T> = AttributesCollection<HTMLInputElement, InputAttrsScope<T>>