Compare commits

...

11 Commits

6 changed files with 137 additions and 76 deletions

View File

@@ -1,5 +1,15 @@
# Changelog # Changelog
## 0.5.2
* More fixes in Dialogs
* Badge supported
* Inline creation support
## 0.5.1
* Fixes in new `Dialog`s
## 0.5.0 ## 0.5.0
* Fully rework `Dialog` elements * Fully rework `Dialog` elements

View File

@@ -9,4 +9,4 @@ android.enableJetifier=true
# Project data # Project data
group=dev.inmo group=dev.inmo
version=0.5.0 version=0.5.2

View File

@@ -0,0 +1,25 @@
package dev.inmo.jsuikit.elements
import androidx.compose.runtime.Composable
import dev.inmo.jsuikit.modifiers.UIKitBadge
import dev.inmo.jsuikit.modifiers.include
import org.jetbrains.compose.web.dom.AttrBuilderContext
import org.jetbrains.compose.web.dom.ContentBuilder
import org.jetbrains.compose.web.dom.Span
import org.jetbrains.compose.web.dom.Text
import org.w3c.dom.HTMLSpanElement
@Composable
fun Badge(
text: String,
onAfterText: ContentBuilder<HTMLSpanElement>? = null,
onBeforeText: ContentBuilder<HTMLSpanElement>? = null,
attrs: AttrBuilderContext<HTMLSpanElement>? = null
) = Span({
include(UIKitBadge)
attrs ?.invoke(this)
}) {
onAfterText ?.invoke(this)
Text(text)
onBeforeText ?.invoke(this)
}

View File

@@ -8,8 +8,6 @@ import dev.inmo.jsuikit.modifiers.*
import org.jetbrains.compose.web.dom.* import org.jetbrains.compose.web.dom.*
import org.jetbrains.compose.web.renderComposableInBody import org.jetbrains.compose.web.renderComposableInBody
import org.w3c.dom.HTMLDivElement import org.w3c.dom.HTMLDivElement
import org.w3c.dom.MutationObserver
import org.w3c.dom.MutationObserverInit
import kotlin.random.Random import kotlin.random.Random
import kotlin.random.nextUInt import kotlin.random.nextUInt
@@ -31,9 +29,11 @@ fun Dialog(
removeOnHide: Boolean = true, removeOnHide: Boolean = true,
bodyBuilder: ContentBuilder<HTMLDivElement> = {} bodyBuilder: ContentBuilder<HTMLDivElement> = {}
) { ) {
val drawDiv = remember { mutableStateOf(true) } val draw = remember { mutableStateOf(true) }
val composition = remember {
remember {
renderComposableInBody { renderComposableInBody {
if (draw.value) {
Div( Div(
{ {
if (modifiers.none { it is UIKitModal.WithCustomAttributes }) { if (modifiers.none { it is UIKitModal.WithCustomAttributes }) {
@@ -54,6 +54,8 @@ fun Dialog(
if (onHidden != null || removeOnHide) { if (onHidden != null || removeOnHide) {
htmlElement.addEventListener("hidden", { htmlElement.addEventListener("hidden", {
if (it.target != htmlElement) return@addEventListener
onHidden ?.invoke(htmlElement) onHidden ?.invoke(htmlElement)
if (removeOnHide) { if (removeOnHide) {
@@ -64,13 +66,15 @@ fun Dialog(
onShown ?.let { onShown ?.let {
htmlElement.addEventListener("shown", { htmlElement.addEventListener("shown", {
if (it.target != htmlElement) return@addEventListener
onShown(htmlElement) onShown(htmlElement)
}) })
} }
onDispose { onDispose {
drawDiv.value = false draw.value = false
} }
} }
@@ -114,19 +118,16 @@ fun Dialog(
} }
} }
} }
}
if (drawDiv.value) {
Div({ Div({
hidden() hidden()
ref { ref {
onDispose { onDispose {
composition.dispose() draw.value = false
} }
} }
}) })
} else {
runCatching { composition.dispose() }
}
} }
@Composable @Composable

View File

@@ -0,0 +1,18 @@
package dev.inmo.jsuikit.elements
import androidx.compose.runtime.Composable
import dev.inmo.jsuikit.modifiers.UIKitUtility
import dev.inmo.jsuikit.modifiers.include
import org.jetbrains.compose.web.dom.AttrBuilderContext
import org.jetbrains.compose.web.dom.ContentBuilder
import org.jetbrains.compose.web.dom.Div
import org.w3c.dom.HTMLDivElement
@Composable
fun Inline(
attrBuilderContext: AttrBuilderContext<HTMLDivElement>? = null,
contentBuilder: ContentBuilder<HTMLDivElement>
) = Div({
include(UIKitUtility.Inline)
attrBuilderContext ?.invoke(this)
}, contentBuilder)

View File

@@ -0,0 +1,7 @@
package dev.inmo.jsuikit.modifiers
sealed class UIKitBadge(classname: String) : UIKitModifier {
override val classes: Array<String> = arrayOf(classname)
companion object : UIKitBadge("uk-badge")
}