mirror of
https://github.com/InsanusMokrassar/JSUIKitKBindings.git
synced 2025-12-05 13:55:45 +00:00
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0d55505e09 | |||
| eefdb5fda1 | |||
| 0c281aa653 | |||
| 17ae0b119b | |||
| 36214aeba5 | |||
| 19f3a59a79 | |||
| 5cfee9c4cc | |||
| c9a17fa92a | |||
| c36e8c58f4 | |||
| 67f083610a | |||
| 636280a982 | |||
| 415549b251 | |||
| 0d2672b679 | |||
| a511def014 | |||
| d783834aa4 | |||
| cf2b823765 | |||
| 0f6e2c9805 |
15
CHANGELOG.md
15
CHANGELOG.md
@@ -1,5 +1,20 @@
|
||||
# Changelog
|
||||
|
||||
## 0.4.1
|
||||
|
||||
* Now it is possible to use `StandardInput` with simple `T` types instead of states
|
||||
* `List` may accept any `Iterable`
|
||||
|
||||
## 0.4.0
|
||||
|
||||
* `Kotlin`: `1.7.20`
|
||||
* `Compose`: `1.2.1`
|
||||
|
||||
## 0.2.2
|
||||
|
||||
* Add support of `Drop` component
|
||||
* Improve support of `Navbar`s
|
||||
|
||||
## 0.2.1
|
||||
|
||||
* `Tab` elements become supported
|
||||
|
||||
@@ -9,4 +9,4 @@ android.enableJetifier=true
|
||||
# Project data
|
||||
|
||||
group=dev.inmo
|
||||
version=0.2.1
|
||||
version=0.4.1
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
[versions]
|
||||
|
||||
kt = "1.7.0"
|
||||
jb-compose = "1.2.0-alpha01-dev753"
|
||||
jb-dokka = "1.7.0"
|
||||
kt = "1.7.20"
|
||||
jb-compose = "1.2.1"
|
||||
jb-dokka = "1.7.20"
|
||||
gh-release = "2.4.1"
|
||||
|
||||
[libraries]
|
||||
|
||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
24
src/jsMain/kotlin/dev/inmo/jsuikit/elements/Drop.kt
Normal file
24
src/jsMain/kotlin/dev/inmo/jsuikit/elements/Drop.kt
Normal file
@@ -0,0 +1,24 @@
|
||||
package dev.inmo.jsuikit.elements
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import dev.inmo.jsuikit.modifiers.UIKitDrop
|
||||
import dev.inmo.jsuikit.modifiers.attrsBuilder
|
||||
import dev.inmo.jsuikit.utils.*
|
||||
import org.jetbrains.compose.web.dom.Div
|
||||
import org.w3c.dom.HTMLButtonElement
|
||||
import org.w3c.dom.HTMLDivElement
|
||||
|
||||
@Composable
|
||||
fun Drop(
|
||||
buttonBuilder: AttrsWithContentBuilder<HTMLButtonElement>,
|
||||
dropBuilder: AttrsWithContentBuilder<HTMLDivElement>
|
||||
) {
|
||||
DefaultButton(
|
||||
attributesCustomizer = buttonBuilder.attributesBuilderContext,
|
||||
contentAllocator = buttonBuilder.builder
|
||||
)
|
||||
Div(
|
||||
(Attrs<HTMLDivElement>(UIKitDrop.Custom()) + dropBuilder.attrs).builder,
|
||||
dropBuilder.builder
|
||||
)
|
||||
}
|
||||
@@ -202,60 +202,62 @@ sealed class Icon(val name: String) {
|
||||
object Youtube : Brands("youtube")
|
||||
}
|
||||
|
||||
@Composable
|
||||
operator fun invoke(
|
||||
vararg modifiers: UIKitModifier,
|
||||
type: UIKitIconType = UIKitIconType.Default,
|
||||
ratio: Float? = null,
|
||||
attributesCustomizer: AttrBuilderContext<out HTMLElement> = {},
|
||||
onClick: ((Event) -> Unit)? = null
|
||||
) {
|
||||
val configurer: AttrBuilderContext<out HTMLElement> = {
|
||||
include(*modifiers, type, UIKitIcon)
|
||||
attr("uk-icon", "icon: $name${if (ratio != null) { "; ratio: $ratio" } else ""}")
|
||||
onClick ?.let { _ ->
|
||||
onClick { onClick(it.nativeEvent) }
|
||||
}
|
||||
attributesCustomizer()
|
||||
}
|
||||
when (type) {
|
||||
UIKitIconType.Default -> Span(configurer)
|
||||
UIKitIconType.Link -> A(href = "#", configurer)
|
||||
UIKitIconType.Button -> Button(configurer)
|
||||
}
|
||||
}
|
||||
|
||||
class Custom(name: String) : Icon(name)
|
||||
|
||||
@Composable
|
||||
fun drawAsButton(
|
||||
vararg modifiers: UIKitModifier,
|
||||
ratio: Float? = null,
|
||||
attributesCustomizer: AttrBuilderContext<out HTMLElement> = {},
|
||||
onClick: ((Event) -> Unit)? = null
|
||||
) = invoke(*modifiers, type = UIKitIconType.Button, ratio = ratio, onClick = onClick, attributesCustomizer = attributesCustomizer)
|
||||
|
||||
@Composable
|
||||
fun drawAsIcon(
|
||||
vararg modifiers: UIKitModifier,
|
||||
ratio: Float? = null,
|
||||
attributesCustomizer: AttrBuilderContext<out HTMLElement> = {},
|
||||
onClick: ((Event) -> Unit)? = null
|
||||
) = invoke(*modifiers, type = UIKitIconType.Default, ratio = ratio, onClick = onClick, attributesCustomizer = attributesCustomizer)
|
||||
|
||||
@Composable
|
||||
fun drawAsLink(
|
||||
vararg modifiers: UIKitModifier,
|
||||
ratio: Float? = null,
|
||||
attributesCustomizer: AttrBuilderContext<out HTMLElement> = {},
|
||||
onClick: ((Event) -> Unit)? = null
|
||||
) = invoke(*modifiers, type = UIKitIconType.Link, ratio = ratio, onClick = onClick, attributesCustomizer = attributesCustomizer)
|
||||
|
||||
@Composable
|
||||
fun drawAsFormInputPart(
|
||||
vararg modifiers: UIKitModifier,
|
||||
ratio: Float? = null,
|
||||
attributesCustomizer: AttrBuilderContext<out HTMLElement> = {},
|
||||
onClick: ((Event) -> Unit)? = null
|
||||
) = invoke(*modifiers, UIKitForm.Icon, ratio = ratio, onClick = onClick, attributesCustomizer = attributesCustomizer)
|
||||
companion object {
|
||||
}
|
||||
}
|
||||
@Composable
|
||||
operator fun Icon.invoke(
|
||||
vararg modifiers: UIKitModifier,
|
||||
type: UIKitIconType = UIKitIconType.Default,
|
||||
ratio: Float? = null,
|
||||
attributesCustomizer: AttrBuilderContext<out HTMLElement> = {},
|
||||
onClick: ((Event) -> Unit)? = null
|
||||
) {
|
||||
val configurer: AttrBuilderContext<out HTMLElement> = {
|
||||
include(*modifiers, type, UIKitIcon)
|
||||
attr("uk-icon", "icon: $name${if (ratio != null) { "; ratio: $ratio" } else ""}")
|
||||
onClick ?.let { _ ->
|
||||
onClick { onClick(it.nativeEvent) }
|
||||
}
|
||||
attributesCustomizer()
|
||||
}
|
||||
when (type) {
|
||||
UIKitIconType.Default -> Span(configurer)
|
||||
UIKitIconType.Link -> A(href = "#", configurer)
|
||||
UIKitIconType.Button -> Button(configurer)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun Icon.drawAsButton(
|
||||
vararg modifiers: UIKitModifier,
|
||||
ratio: Float? = null,
|
||||
attributesCustomizer: AttrBuilderContext<out HTMLElement> = {},
|
||||
onClick: ((Event) -> Unit)? = null
|
||||
) = invoke(*modifiers, type = UIKitIconType.Button, ratio = ratio, onClick = onClick, attributesCustomizer = attributesCustomizer)
|
||||
|
||||
@Composable
|
||||
fun Icon.drawAsIcon(
|
||||
vararg modifiers: UIKitModifier,
|
||||
ratio: Float? = null,
|
||||
attributesCustomizer: AttrBuilderContext<out HTMLElement> = {},
|
||||
onClick: ((Event) -> Unit)? = null
|
||||
) = invoke(*modifiers, type = UIKitIconType.Default, ratio = ratio, onClick = onClick, attributesCustomizer = attributesCustomizer)
|
||||
|
||||
@Composable
|
||||
fun Icon.drawAsLink(
|
||||
vararg modifiers: UIKitModifier,
|
||||
ratio: Float? = null,
|
||||
attributesCustomizer: AttrBuilderContext<out HTMLElement> = {},
|
||||
onClick: ((Event) -> Unit)? = null
|
||||
) = invoke(*modifiers, type = UIKitIconType.Link, ratio = ratio, onClick = onClick, attributesCustomizer = attributesCustomizer)
|
||||
|
||||
@Composable
|
||||
fun Icon.drawAsFormInputPart(
|
||||
vararg modifiers: UIKitModifier,
|
||||
ratio: Float? = null,
|
||||
attributesCustomizer: AttrBuilderContext<out HTMLElement> = {},
|
||||
onClick: ((Event) -> Unit)? = null
|
||||
) = invoke(*modifiers, UIKitForm.Icon, ratio = ratio, onClick = onClick, attributesCustomizer = attributesCustomizer)
|
||||
|
||||
@@ -10,7 +10,7 @@ import org.w3c.dom.HTMLLIElement
|
||||
import org.w3c.dom.HTMLUListElement
|
||||
|
||||
@Composable
|
||||
fun <T> Iconnav(
|
||||
fun <T> IconNav(
|
||||
data: Iterable<T>,
|
||||
listAttrs: Attrs<HTMLUListElement> = Attrs.empty(),
|
||||
elementAttrsBuilder: AttrsScope<HTMLLIElement>.(T) -> Unit = {},
|
||||
@@ -31,3 +31,11 @@ fun <T> Iconnav(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun <T> Iconnav(
|
||||
data: Iterable<T>,
|
||||
listAttrs: Attrs<HTMLUListElement> = Attrs.empty(),
|
||||
elementAttrsBuilder: AttrsScope<HTMLLIElement>.(T) -> Unit = {},
|
||||
elementBuilder: @Composable ElementScope<HTMLLIElement>.(T) -> Unit
|
||||
) = IconNav(data, listAttrs, elementAttrsBuilder, elementBuilder)
|
||||
|
||||
@@ -10,7 +10,7 @@ import org.w3c.dom.HTMLUListElement
|
||||
|
||||
@Composable
|
||||
fun <T> List(
|
||||
data: SnapshotStateList<T>,
|
||||
data: Iterable<T>,
|
||||
ukAttrs: Attrs<HTMLUListElement> = Attrs.empty(),
|
||||
elementAllocator: @Composable ElementScope<HTMLUListElement>.(T) -> Unit
|
||||
) {
|
||||
@@ -29,7 +29,7 @@ fun <T> List(
|
||||
@Composable
|
||||
fun <T> ListWithTitle(
|
||||
title: String,
|
||||
data: SnapshotStateList<T>,
|
||||
data: Iterable<T>,
|
||||
vararg titleModifiers: UIKitModifier,
|
||||
ulModifiers: Array<UIKitModifier> = emptyArray(),
|
||||
besidesTitleAndList: (@Composable () -> Unit)? = null,
|
||||
|
||||
@@ -5,8 +5,7 @@ import dev.inmo.jsuikit.modifiers.*
|
||||
import dev.inmo.jsuikit.utils.*
|
||||
import org.jetbrains.compose.web.attributes.AttrsScope
|
||||
import org.jetbrains.compose.web.dom.*
|
||||
import org.w3c.dom.HTMLLIElement
|
||||
import org.w3c.dom.HTMLUListElement
|
||||
import org.w3c.dom.*
|
||||
|
||||
@Composable
|
||||
fun NavbarNav(
|
||||
@@ -30,3 +29,17 @@ fun NavbarNav(
|
||||
vararg elements: AttrsWithContentBuilder<HTMLLIElement>,
|
||||
attrs: Attrs<HTMLUListElement> = Attrs.empty()
|
||||
) = NavbarNav(elements.toList(), attrs)
|
||||
|
||||
fun NavbarNavBuilder(
|
||||
elements: List<AttrsWithContentBuilder<HTMLLIElement>>,
|
||||
attrs: Attrs<HTMLUListElement> = Attrs.empty(),
|
||||
containerAttrs: Attrs<HTMLDivElement> = Attrs.empty()
|
||||
) = AttrsWithContentBuilder<HTMLDivElement>(containerAttrs) {
|
||||
NavbarNav(elements, attrs)
|
||||
}
|
||||
|
||||
fun NavbarNavBuilder(
|
||||
vararg elements: AttrsWithContentBuilder<HTMLLIElement>,
|
||||
attrs: Attrs<HTMLUListElement> = Attrs.empty(),
|
||||
containerAttrs: Attrs<HTMLDivElement> = Attrs.empty()
|
||||
) = NavbarNavBuilder(elements.toList(), attrs, containerAttrs)
|
||||
|
||||
@@ -9,13 +9,14 @@ import org.jetbrains.compose.web.dom.Input
|
||||
import org.w3c.dom.HTMLInputElement
|
||||
|
||||
@Composable
|
||||
fun <T> StandardInput(
|
||||
fun <T> DefaultInput(
|
||||
type: InputType<T>,
|
||||
state: MutableState<T>,
|
||||
disabledState: State<Boolean>? = null,
|
||||
value: T,
|
||||
disabled: Boolean = false,
|
||||
placeholder: String? = null,
|
||||
vararg modifiers: UIKitModifier,
|
||||
attributesCustomizer: AttrBuilderContext<HTMLInputElement> = {},
|
||||
onChange: (T) -> Unit
|
||||
) {
|
||||
Input(type) {
|
||||
classes("uk-input")
|
||||
@@ -23,7 +24,7 @@ fun <T> StandardInput(
|
||||
|
||||
placeholder ?.let(::placeholder)
|
||||
|
||||
state.value.let {
|
||||
value.let {
|
||||
when (it) {
|
||||
is String -> value(it)
|
||||
is Number -> value(it)
|
||||
@@ -31,13 +32,30 @@ fun <T> StandardInput(
|
||||
}
|
||||
}
|
||||
|
||||
onInput { state.value = it.value }
|
||||
onInput { onChange(it.value) }
|
||||
|
||||
disabledState ?.let {
|
||||
if (it.value) {
|
||||
disabled()
|
||||
}
|
||||
if (disabled) {
|
||||
disabled()
|
||||
}
|
||||
attributesCustomizer()
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun <T> StandardInput(
|
||||
type: InputType<T>,
|
||||
state: MutableState<T>,
|
||||
disabledState: State<Boolean>? = null,
|
||||
placeholder: String? = null,
|
||||
vararg modifiers: UIKitModifier,
|
||||
attributesCustomizer: AttrBuilderContext<HTMLInputElement> = {},
|
||||
) = DefaultInput(
|
||||
type,
|
||||
state.value,
|
||||
disabledState ?.value == true,
|
||||
placeholder,
|
||||
modifiers = modifiers,
|
||||
attributesCustomizer = attributesCustomizer
|
||||
) {
|
||||
state.value = it
|
||||
}
|
||||
|
||||
122
src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitDrop.kt
Normal file
122
src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitDrop.kt
Normal file
@@ -0,0 +1,122 @@
|
||||
package dev.inmo.jsuikit.modifiers
|
||||
|
||||
import dev.inmo.jsuikit.utils.*
|
||||
import org.jetbrains.compose.web.css.selectors.CSSSelector
|
||||
|
||||
sealed class UIKitDrop(
|
||||
override val classes: Array<String> = emptyArray(),
|
||||
override val otherAttrs: Map<String, String> = emptyMap()
|
||||
) : UIKitModifier {
|
||||
sealed class Position(name: String) : AttributeValue(name) {
|
||||
|
||||
sealed class Bottom(name: String) : Position("bottom-$name") {
|
||||
|
||||
object Left : Bottom("left")
|
||||
object Center : Bottom("center")
|
||||
object Right : Bottom("right")
|
||||
object Justify : Bottom("justify")
|
||||
|
||||
}
|
||||
|
||||
sealed class Top(name: String) : Position("top-$name") {
|
||||
|
||||
object Left : Top("left")
|
||||
object Center : Top("center")
|
||||
object Right : Top("right")
|
||||
object Justify : Top("justify")
|
||||
|
||||
}
|
||||
|
||||
sealed class Left(name: String) : Position("left-$name") {
|
||||
|
||||
object Top : Left("top")
|
||||
object Center : Left("center")
|
||||
object Bottom : Left("bottom")
|
||||
|
||||
}
|
||||
|
||||
sealed class Right(name: String) : Position("right-$name") {
|
||||
|
||||
object Top : Right("top")
|
||||
object Center : Right("center")
|
||||
object Bottom : Right("bottom")
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
sealed class Stretch(name: String) : AttributeValue(name) {
|
||||
object True : Stretch("true")
|
||||
object X : Stretch("x")
|
||||
object Y : Stretch("y")
|
||||
}
|
||||
|
||||
sealed class Mode(name: String) : AttributeValue(name) {
|
||||
|
||||
object Click : Mode("click")
|
||||
object Hover : Mode("hover")
|
||||
|
||||
object None : Mode("")
|
||||
object HoverAndClick : Mode("$Hover, $Click")
|
||||
|
||||
}
|
||||
|
||||
class Custom internal constructor(
|
||||
classes: Array<String> = emptyArray(),
|
||||
otherAttrs: Map<String, String> = emptyMap()
|
||||
) : UIKitDrop(classes, otherAttrs)
|
||||
|
||||
companion object {
|
||||
operator fun invoke(
|
||||
toggle: CSSSelector? = null,
|
||||
position: Position? = null,
|
||||
stretch: Stretch? = null,
|
||||
mode: Mode? = null,
|
||||
delayShow: Milliseconds? = null,
|
||||
delayHide: Milliseconds? = null,
|
||||
autoUpdate: Boolean? = null,
|
||||
boundary: CSSSelector? = null,
|
||||
boundaryX: CSSSelector? = null,
|
||||
boundaryY: CSSSelector? = null,
|
||||
target: CSSSelector? = null,
|
||||
targetX: CSSSelector? = null,
|
||||
targetY: CSSSelector? = null,
|
||||
inset: Boolean? = null,
|
||||
flip: Boolean? = null,
|
||||
shift: Boolean? = null,
|
||||
offset: Pixels? = null,
|
||||
animation: UIKitAnimation? = null,
|
||||
animationOut: Boolean? = null,
|
||||
bgScroll: Boolean? = null,
|
||||
duration: Milliseconds? = null,
|
||||
container: Boolean? = null
|
||||
) = Custom(
|
||||
arrayOf("uk-drop"),
|
||||
mapOf(
|
||||
buildAttribute("uk-drop") {
|
||||
"toggle" to toggle
|
||||
"position" to position
|
||||
"stretch" to stretch
|
||||
"mode" to mode
|
||||
"delay-show" to delayShow
|
||||
"delay-hide" to delayHide
|
||||
"auto-update" to autoUpdate
|
||||
"boundary" to boundary
|
||||
"boundary-x" to boundaryX
|
||||
"boundary-y" to boundaryY
|
||||
"target" to target
|
||||
"target-x" to targetX
|
||||
"target-y" to targetY
|
||||
"inset" to inset
|
||||
"flip" to flip
|
||||
"shift" to shift
|
||||
"offset" to offset
|
||||
"animation" to animation
|
||||
"animation-out" to animationOut
|
||||
"bg-scroll" to bgScroll
|
||||
"duration" to duration
|
||||
"container" to container
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,17 @@
|
||||
package dev.inmo.jsuikit.utils
|
||||
|
||||
import dev.inmo.jsuikit.modifiers.AttributeValue
|
||||
|
||||
|
||||
class ParametersBuilder(
|
||||
val skipNullValues: Boolean = true,
|
||||
private val parameters: MutableMap<String, String?> = mutableMapOf()
|
||||
) {
|
||||
fun add(k: String, v: Any? = null) {
|
||||
if (v != null || !skipNullValues) {
|
||||
parameters[k] = v ?.toString()
|
||||
when {
|
||||
v is AttributeValue -> parameters[k] = v.name
|
||||
v == null && skipNullValues -> return
|
||||
else -> parameters[k] = v ?.toString()
|
||||
}
|
||||
}
|
||||
infix fun String.to(value: Any?) = add(this, value)
|
||||
|
||||
Reference in New Issue
Block a user