mirror of
https://github.com/InsanusMokrassar/JSUIKitKBindings.git
synced 2025-12-04 13:26:27 +00:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3746b614cf | |||
| 2ece25ef4e | |||
| 18ffabf76d | |||
| c5ef64ebe4 | |||
| ee1bea8ee1 | |||
| 4a7b125abe | |||
| a756bab2a6 | |||
| be4d63f0e0 | |||
| b177760c73 | |||
| 82f00fa23b | |||
| 33b1a7af65 | |||
| e6b0ca580a | |||
| d5045bdba7 | |||
| 186eff482d |
14
CHANGELOG.md
14
CHANGELOG.md
@@ -1,5 +1,19 @@
|
||||
# Changelog
|
||||
|
||||
## 0.0.50
|
||||
|
||||
* Add opportunity to customize content in title of `Nav` after text
|
||||
|
||||
## 0.0.49
|
||||
|
||||
* Now it is possible to use optional title in navs builders
|
||||
|
||||
## 0.0.48
|
||||
|
||||
* Added support of `Breadcrumb`
|
||||
* Add opportunity to summarize `UIKitModifier`
|
||||
* Add opportunity to simply create attributes builder using `UIKitModifier` of array of them
|
||||
|
||||
## 0.0.47
|
||||
|
||||
* Add support of `Close` element
|
||||
|
||||
@@ -9,4 +9,4 @@ android.enableJetifier=true
|
||||
# Project data
|
||||
|
||||
group=dev.inmo
|
||||
version=0.0.47
|
||||
version=0.0.50
|
||||
|
||||
50
src/jsMain/kotlin/dev/inmo/jsuikit/elements/Breadcrumb.kt
Normal file
50
src/jsMain/kotlin/dev/inmo/jsuikit/elements/Breadcrumb.kt
Normal file
@@ -0,0 +1,50 @@
|
||||
package dev.inmo.jsuikit.elements
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import dev.inmo.jsuikit.modifiers.UIKitBreadcrumb
|
||||
import dev.inmo.jsuikit.modifiers.include
|
||||
import dev.inmo.jsuikit.utils.Attrs
|
||||
import org.jetbrains.compose.web.dom.*
|
||||
import org.w3c.dom.*
|
||||
|
||||
@Composable
|
||||
fun <T> Breadcrumb(
|
||||
data: Iterable<T>,
|
||||
rootAttrs: Attrs<HTMLUListElement> = Attrs.empty(),
|
||||
elementAttrs: Attrs<HTMLLIElement> = Attrs.empty(),
|
||||
elementContent: @Composable ElementScope<HTMLLIElement>.(T) -> Unit = {},
|
||||
) {
|
||||
Ul(
|
||||
{
|
||||
include(UIKitBreadcrumb)
|
||||
rootAttrs.builder(this)
|
||||
}
|
||||
) {
|
||||
data.forEach {
|
||||
Li({ elementAttrs.builder(this) }) {
|
||||
elementContent(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun BreadcrumbActiveElement(
|
||||
href: String? = "#",
|
||||
elementAttrs: Attrs<HTMLAnchorElement> = Attrs.empty(),
|
||||
elementContent: @Composable ElementScope<HTMLAnchorElement>.() -> Unit = {},
|
||||
) {
|
||||
A(href, { elementAttrs.builder(this) }) {
|
||||
elementContent()
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun BreadcrumbInactiveElement(
|
||||
elementAttrs: Attrs<HTMLSpanElement> = Attrs.empty(),
|
||||
elementContent: @Composable ElementScope<HTMLSpanElement>.() -> Unit = {},
|
||||
) {
|
||||
Span({ elementAttrs.builder(this) }) {
|
||||
elementContent()
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
package dev.inmo.jsuikit.elements
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.snapshots.SnapshotStateList
|
||||
import dev.inmo.jsuikit.buildAndAddAttribute
|
||||
import dev.inmo.jsuikit.modifiers.*
|
||||
import dev.inmo.jsuikit.utils.Milliseconds
|
||||
@@ -94,7 +93,7 @@ fun SubNav(
|
||||
|
||||
@Composable
|
||||
fun <T> Nav(
|
||||
title: String,
|
||||
title: String?,
|
||||
data: Iterable<T>,
|
||||
vararg ulModifiers: UIKitModifier,
|
||||
titleModifiers: Array<UIKitModifier> = emptyArray(),
|
||||
@@ -104,6 +103,7 @@ fun <T> Nav(
|
||||
duration: Milliseconds? = null,
|
||||
besidesTitleAndList: ContentBuilder<HTMLUListElement>? = null,
|
||||
titleCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
||||
afterTitleContentBuilder: ContentBuilder<HTMLLIElement> = {},
|
||||
ulCustomizer: AttrBuilderContext<HTMLUListElement> = {},
|
||||
elementAllocator: @Composable ElementScope<HTMLUListElement>.(T) -> Unit
|
||||
) {
|
||||
@@ -119,11 +119,14 @@ fun <T> Nav(
|
||||
ulCustomizer()
|
||||
}
|
||||
) {
|
||||
NavHeader(
|
||||
title,
|
||||
*titleModifiers,
|
||||
attributesCustomizer = titleCustomizer
|
||||
)
|
||||
title ?.let {
|
||||
NavHeader(
|
||||
title,
|
||||
*titleModifiers,
|
||||
attributesCustomizer = titleCustomizer,
|
||||
afterTitleContentBuilder = afterTitleContentBuilder
|
||||
)
|
||||
}
|
||||
besidesTitleAndList ?.let { it() }
|
||||
data.forEach {
|
||||
elementAllocator(it)
|
||||
@@ -133,7 +136,7 @@ fun <T> Nav(
|
||||
|
||||
@Composable
|
||||
fun <T> DefaultNav(
|
||||
title: String,
|
||||
title: String?,
|
||||
data: Iterable<T>,
|
||||
vararg ulModifiers: UIKitModifier,
|
||||
titleModifiers: Array<UIKitModifier> = emptyArray(),
|
||||
@@ -143,6 +146,7 @@ fun <T> DefaultNav(
|
||||
duration: Milliseconds? = null,
|
||||
besidesTitleAndList: ContentBuilder<HTMLUListElement>? = null,
|
||||
titleCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
||||
afterTitleContentBuilder: ContentBuilder<HTMLLIElement> = {},
|
||||
ulCustomizer: AttrBuilderContext<HTMLUListElement> = {},
|
||||
elementAllocator: @Composable ElementScope<HTMLUListElement>.(T) -> Unit
|
||||
) = Nav(
|
||||
@@ -156,13 +160,14 @@ fun <T> DefaultNav(
|
||||
duration,
|
||||
besidesTitleAndList,
|
||||
titleCustomizer,
|
||||
afterTitleContentBuilder,
|
||||
ulCustomizer,
|
||||
elementAllocator
|
||||
)
|
||||
|
||||
@Composable
|
||||
fun <T> PrimaryNav(
|
||||
title: String,
|
||||
title: String?,
|
||||
data: Iterable<T>,
|
||||
vararg ulModifiers: UIKitModifier,
|
||||
titleModifiers: Array<UIKitModifier> = emptyArray(),
|
||||
@@ -172,6 +177,7 @@ fun <T> PrimaryNav(
|
||||
duration: Milliseconds? = null,
|
||||
besidesTitleAndList: ContentBuilder<HTMLUListElement>? = null,
|
||||
titleCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
||||
afterTitleContentBuilder: ContentBuilder<HTMLLIElement> = {},
|
||||
ulCustomizer: AttrBuilderContext<HTMLUListElement> = {},
|
||||
elementAllocator: @Composable ElementScope<HTMLUListElement>.(T) -> Unit
|
||||
) = Nav(
|
||||
@@ -185,13 +191,14 @@ fun <T> PrimaryNav(
|
||||
duration,
|
||||
besidesTitleAndList,
|
||||
titleCustomizer,
|
||||
afterTitleContentBuilder,
|
||||
ulCustomizer,
|
||||
elementAllocator
|
||||
)
|
||||
|
||||
@Composable
|
||||
fun <T> SubNav(
|
||||
title: String,
|
||||
title: String?,
|
||||
data: Iterable<T>,
|
||||
vararg ulModifiers: UIKitModifier,
|
||||
titleModifiers: Array<UIKitModifier> = emptyArray(),
|
||||
@@ -201,6 +208,7 @@ fun <T> SubNav(
|
||||
duration: Milliseconds? = null,
|
||||
besidesTitleAndList: ContentBuilder<HTMLUListElement>? = null,
|
||||
titleCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
||||
afterTitleContentBuilder: ContentBuilder<HTMLLIElement> = {},
|
||||
ulCustomizer: AttrBuilderContext<HTMLUListElement> = {},
|
||||
elementAllocator: @Composable ElementScope<HTMLUListElement>.(T) -> Unit
|
||||
) = Nav(
|
||||
@@ -214,6 +222,7 @@ fun <T> SubNav(
|
||||
duration,
|
||||
besidesTitleAndList,
|
||||
titleCustomizer,
|
||||
afterTitleContentBuilder,
|
||||
ulCustomizer,
|
||||
elementAllocator
|
||||
)
|
||||
@@ -223,6 +232,7 @@ fun NavHeader(
|
||||
text: String,
|
||||
vararg modifiers: UIKitModifier,
|
||||
attributesCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
||||
afterTitleContentBuilder: ContentBuilder<HTMLLIElement> = {}
|
||||
) {
|
||||
Li(
|
||||
{
|
||||
@@ -231,6 +241,7 @@ fun NavHeader(
|
||||
}
|
||||
) {
|
||||
Text(text)
|
||||
afterTitleContentBuilder()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
package dev.inmo.jsuikit.modifiers
|
||||
|
||||
sealed class AttributeValue(val name: String)
|
||||
sealed class AttributeValue(val name: String) {
|
||||
override fun toString(): String = name
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package dev.inmo.jsuikit.modifiers
|
||||
|
||||
sealed class UIKitBreadcrumb(
|
||||
override val classes: Array<String> = emptyArray(),
|
||||
override val otherAttrs: Map<String, String> = emptyMap()
|
||||
) : UIKitModifier {
|
||||
companion object : UIKitBreadcrumb(arrayOf("uk-breadcrumb"))
|
||||
}
|
||||
@@ -50,6 +50,9 @@ sealed class UIKitDropdown(classname: String) : UIKitModifier {
|
||||
object Click : Mode("click")
|
||||
object Hover : Mode("hover")
|
||||
|
||||
object None : Mode("")
|
||||
object HoverAndClick : Mode("$Hover, $Click")
|
||||
|
||||
}
|
||||
|
||||
sealed class Flip(name: String) : AttributeValue(name) {
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
package dev.inmo.jsuikit.modifiers
|
||||
|
||||
import dev.inmo.jsuikit.utils.Attrs
|
||||
import org.jetbrains.compose.web.attributes.AttrsScope
|
||||
import org.jetbrains.compose.web.dom.AttrBuilderContext
|
||||
import org.w3c.dom.Element
|
||||
|
||||
interface UIKitModifier {
|
||||
val classes: Array<String>
|
||||
@@ -15,3 +18,16 @@ fun AttrsScope<*>.include(vararg container: UIKitModifier?) {
|
||||
it ?.otherAttrs ?.let { attrs -> attrs.forEach { (k, v) -> attr(k, v) } }
|
||||
}
|
||||
}
|
||||
|
||||
fun <T : Element> UIKitModifier.asAttributesBuilder(): AttrBuilderContext<T> = {
|
||||
include(this@asAttributesBuilder)
|
||||
}
|
||||
operator fun UIKitModifier.plus(other: UIKitModifier): UIKitModifier = UIKitCustom(
|
||||
classes + other.classes,
|
||||
otherAttrs + other.otherAttrs
|
||||
)
|
||||
fun <T: Element> UIKitModifier.builder() = Attrs<T>(this).builder
|
||||
fun <T: Element> Array<out UIKitModifier>.builder() = Attrs<T>(*this).builder
|
||||
inline fun <T: Element> attrsBuilder(vararg modifiers: UIKitModifier) = modifiers.builder<T>()
|
||||
@JsName("plusBuilder")
|
||||
operator fun <T: Element> UIKitModifier.plus(other: UIKitModifier): AttrBuilderContext<T> = Attrs<T>(this@plus, other).builder
|
||||
|
||||
Reference in New Issue
Block a user