diff --git a/CHANGELOG.md b/CHANGELOG.md index d3d8dc1..d49061b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # 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` diff --git a/gradle.properties b/gradle.properties index acb5b2f..68a26ec 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,4 +9,4 @@ android.enableJetifier=true # Project data group=dev.inmo -version=0.4.0 +version=0.4.1 diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/elements/Icon.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/elements/Icon.kt index 945e8bb..bde17ba 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/elements/Icon.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/elements/Icon.kt @@ -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 = {}, - onClick: ((Event) -> Unit)? = null - ) { - val configurer: AttrBuilderContext = { - 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 = {}, - 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 = {}, - 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 = {}, - 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 = {}, - 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 = {}, + onClick: ((Event) -> Unit)? = null +) { + val configurer: AttrBuilderContext = { + 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 = {}, + 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 = {}, + 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 = {}, + 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 = {}, + onClick: ((Event) -> Unit)? = null +) = invoke(*modifiers, UIKitForm.Icon, ratio = ratio, onClick = onClick, attributesCustomizer = attributesCustomizer) diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/elements/List.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/elements/List.kt index d9dd2af..913e208 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/elements/List.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/elements/List.kt @@ -10,7 +10,7 @@ import org.w3c.dom.HTMLUListElement @Composable fun List( - data: SnapshotStateList, + data: Iterable, ukAttrs: Attrs = Attrs.empty(), elementAllocator: @Composable ElementScope.(T) -> Unit ) { @@ -29,7 +29,7 @@ fun List( @Composable fun ListWithTitle( title: String, - data: SnapshotStateList, + data: Iterable, vararg titleModifiers: UIKitModifier, ulModifiers: Array = emptyArray(), besidesTitleAndList: (@Composable () -> Unit)? = null, diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/elements/StandardInput.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/elements/StandardInput.kt index f5d5dd4..dab38d2 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/elements/StandardInput.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/elements/StandardInput.kt @@ -9,13 +9,14 @@ import org.jetbrains.compose.web.dom.Input import org.w3c.dom.HTMLInputElement @Composable -fun StandardInput( +fun DefaultInput( type: InputType, - state: MutableState, - disabledState: State? = null, + value: T, + disabled: Boolean = false, placeholder: String? = null, vararg modifiers: UIKitModifier, attributesCustomizer: AttrBuilderContext = {}, + onChange: (T) -> Unit ) { Input(type) { classes("uk-input") @@ -23,7 +24,7 @@ fun StandardInput( placeholder ?.let(::placeholder) - state.value.let { + value.let { when (it) { is String -> value(it) is Number -> value(it) @@ -31,13 +32,30 @@ fun StandardInput( } } - onInput { state.value = it.value } + onInput { onChange(it.value) } - disabledState ?.let { - if (it.value) { - disabled() - } + if (disabled) { + disabled() } attributesCustomizer() } } + +@Composable +fun StandardInput( + type: InputType, + state: MutableState, + disabledState: State? = null, + placeholder: String? = null, + vararg modifiers: UIKitModifier, + attributesCustomizer: AttrBuilderContext = {}, +) = DefaultInput( + type, + state.value, + disabledState ?.value == true, + placeholder, + modifiers = modifiers, + attributesCustomizer = attributesCustomizer +) { + state.value = it +}