Compare commits

..

35 Commits

Author SHA1 Message Date
1f44f27fbb add container support 2022-03-16 16:03:35 +06:00
c59c442a36 start 0.0.45 2022-03-16 16:03:08 +06:00
e61f420dc4 Merge pull request #45 from InsanusMokrassar/0.0.44
0.0.44
2022-03-13 16:46:46 +06:00
e0052950e9 Update CHANGELOG.md 2022-03-13 14:04:50 +06:00
47eab8821d Update libs.versions.toml 2022-03-13 14:03:13 +06:00
b89df98459 start 0.0.44 2022-03-13 14:02:46 +06:00
f90055fa59 Merge pull request #44 from InsanusMokrassar/0.0.43
0.0.43
2022-03-12 01:45:19 +06:00
38a884cc16 add defaults in content builders of Grid and GridColumn 2022-03-12 00:16:57 +06:00
43e3ed742d update gradle wrapper 2022-03-12 00:07:32 +06:00
3ddb22341c additions in UIKitScreenSizeModifier and support of Tile 2022-03-12 00:06:47 +06:00
475afeb78b start 0.0.43 2022-03-12 00:05:54 +06:00
af289b3194 Merge pull request #43 from InsanusMokrassar/0.0.42
0.0.42
2022-03-06 16:23:38 +06:00
7bd5b26a1b migration to compose 1.1.0 and replaces according to it 2022-03-06 16:18:21 +06:00
4e22cfce1a start 0.0.42 2022-03-06 16:18:01 +06:00
60816700ea Merge pull request #42 from InsanusMokrassar/0.0.41
0.0.41
2022-03-03 00:59:28 +06:00
33fbd2c0be now it is possible to include nullable modifiers in attrs 2022-03-02 21:57:55 +06:00
b836fe744e DescriptionList 2022-03-02 20:27:23 +06:00
f77c21ac51 fixes in DropAre and new type of attrs 2022-03-02 18:40:07 +06:00
c720973bfc UIKitForm#Custom now will also include class uk-form-custom 2022-03-02 18:06:41 +06:00
0b11e2c1b9 add UIKitUtility#Link 2022-03-02 17:59:52 +06:00
556ab4e090 add DropAre, UIKitPlaceholder and UIKitForm#Custom now have nullable target 2022-03-02 16:52:58 +06:00
a596516c79 start 0.0.41 2022-03-02 16:52:24 +06:00
8eeabc4b5d Merge pull request #41 from InsanusMokrassar/0.0.40
0.0.40
2022-03-01 22:29:14 +06:00
2a3f14593b use iterables for data in default tables 2022-03-01 13:26:04 +06:00
bfd6790014 start 0.0.40 2022-03-01 13:25:37 +06:00
27ad91be74 Merge pull request #40 from InsanusMokrassar/0.0.39
0.0.39
2022-03-01 01:21:19 +06:00
3c7f17523b refactor invoke functions 2022-03-01 00:49:19 +06:00
c81c1125a0 add UIKitDialog 2022-03-01 00:14:17 +06:00
2e28334b41 add support of notifications 2022-02-28 23:55:09 +06:00
7c33efa121 start 0.0.39 2022-02-28 23:54:59 +06:00
7b6a8c81b4 Merge pull request #39 from InsanusMokrassar/0.0.38
0.0.38
2022-02-25 00:36:19 +06:00
031d07d97a AttributesCollection#plus 2022-02-25 00:22:17 +06:00
a2eda2726b add UIKitToggle 2022-02-25 00:12:20 +06:00
eb15ce9281 start 0.0.38 2022-02-25 00:12:02 +06:00
3b3319c8aa Merge pull request #38 from InsanusMokrassar/0.0.37
0.0.37
2022-02-24 14:44:23 +06:00
37 changed files with 565 additions and 56 deletions

View File

@@ -1,5 +1,45 @@
# Changelog
## 0.0.45
* `Add support of containers in `UIKitContainer` modifiers and `Container` function
## 0.0.44
* `Versions`:
* `Compose`: `1.1.0` -> `1.1.1`
## 0.0.43
* Several new extensions for `UIKitModifier` like `UIKitModifier#onSmallScreen`
* Support of `Tile`
## 0.0.42
* Migration to compose 1.1.0
* Replaces according to it
## 0.0.41
* Add `DropArea`
* Add `UIKitPlaceholder`
* `UIKitForm#Custom` now have nullable param target
* Add `UIKitUtility#Link`
* Add `DescriptionList` and several support composable functions
## 0.0.40
* All `DefaultTable` functions now use `Iterable` as data type
## 0.0.39
* Add support of `Notifications`
## 0.0.38
* Add support of `Toggle`
* Attributes collection now can be concatenated
## 0.0.37
* `Dialog` now do not add auto margin by default

View File

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

View File

@@ -1,7 +1,7 @@
[versions]
kt = "1.6.10"
jb-compose = "1.0.1"
jb-compose = "1.1.1"
jb-dokka = "1.6.10"
gh-release = "2.2.12"

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@@ -3,7 +3,7 @@ package dev.inmo.jsuikit
import dev.inmo.jsuikit.modifiers.AttributeValue
import dev.inmo.jsuikit.utils.AttributeBuilder
import dev.inmo.jsuikit.utils.buildAttribute
import org.jetbrains.compose.web.attributes.AttrsBuilder
import org.jetbrains.compose.web.attributes.AttrsScope
@Deprecated("Will be removed soon")
class UIKitAttributeValueBuilder {
@@ -22,7 +22,7 @@ class UIKitAttributeValueBuilder {
fun build(): String = attrs.joinToString(";") { (k, v) -> "$k: $v" }
}
fun AttrsBuilder<*>.buildAndAddAttribute(
fun AttrsScope<*>.buildAndAddAttribute(
attributeName: String,
skipNullValues: Boolean = true,
block: AttributeBuilder.() -> Unit

View File

@@ -4,7 +4,7 @@ import androidx.compose.runtime.Composable
import dev.inmo.jsuikit.modifiers.UIKitAccordion
import dev.inmo.jsuikit.modifiers.include
import dev.inmo.jsuikit.utils.Attrs
import org.jetbrains.compose.web.attributes.AttrsBuilder
import org.jetbrains.compose.web.attributes.AttrsScope
import org.jetbrains.compose.web.dom.*
import org.w3c.dom.*
@@ -12,7 +12,7 @@ import org.w3c.dom.*
fun <T> Accordion(
data: Iterable<T>,
attrs: Attrs<HTMLUListElement> = Attrs.empty(),
itemAttrsBuilder: AttrsBuilder<HTMLLIElement>.(Int, T) -> Unit = { _, _ -> },
itemAttrsBuilder: AttrsScope<HTMLLIElement>.(Int, T) -> Unit = { _, _ -> },
itemContentBuilder: @Composable ElementScope<HTMLLIElement>.(Int, T) -> Unit
) {
Ul(
@@ -33,13 +33,13 @@ fun <T> Accordion(
fun <T> DefaultAccordion(
data: Iterable<T>,
attrs: Attrs<HTMLUListElement> = Attrs.empty(),
itemAttrsBuilder: AttrsBuilder<HTMLLIElement>.(Int, T) -> Unit = { _, _ -> },
titleAttrsBuilder: AttrsBuilder<HTMLAnchorElement>.(Int, T) -> Unit = { _, _ -> },
itemAttrsBuilder: AttrsScope<HTMLLIElement>.(Int, T) -> Unit = { _, _ -> },
titleAttrsBuilder: AttrsScope<HTMLAnchorElement>.(Int, T) -> Unit = { _, _ -> },
titleContentBuilder: @Composable ElementScope<HTMLAnchorElement>.(Int, T) -> Unit = { _, _ -> },
beforeTitleContentBuilder: @Composable ElementScope<HTMLLIElement>.(Int, T) -> Unit = { _, _ -> },
afterTitleContentBuilder: @Composable ElementScope<HTMLLIElement>.(Int, T) -> Unit = { _, _ -> },
afterContentContentBuilder: @Composable ElementScope<HTMLLIElement>.(Int, T) -> Unit = { _, _ -> },
contentAttrsBuilder: AttrsBuilder<HTMLDivElement>.(Int, T) -> Unit = { _, _ -> },
contentAttrsBuilder: AttrsScope<HTMLDivElement>.(Int, T) -> Unit = { _, _ -> },
contentContentBuilder: @Composable ElementScope<HTMLDivElement>.(Int, T) -> Unit
) = Accordion(
data,
@@ -72,9 +72,9 @@ fun <T> DefaultAccordion(
data: Iterable<T>,
titleResolver: (Int, T) -> String,
attrs: Attrs<HTMLUListElement> = Attrs.empty(),
itemAttrsBuilder: AttrsBuilder<HTMLLIElement>.(Int, T) -> Unit = { _, _ -> },
titleAttrsBuilder: AttrsBuilder<HTMLAnchorElement>.(Int, T) -> Unit = { _, _ -> },
contentAttrsBuilder: AttrsBuilder<HTMLDivElement>.(Int, T) -> Unit = { _, _ -> },
itemAttrsBuilder: AttrsScope<HTMLLIElement>.(Int, T) -> Unit = { _, _ -> },
titleAttrsBuilder: AttrsScope<HTMLAnchorElement>.(Int, T) -> Unit = { _, _ -> },
contentAttrsBuilder: AttrsScope<HTMLDivElement>.(Int, T) -> Unit = { _, _ -> },
contentContentBuilder: @Composable ElementScope<HTMLDivElement>.(Int, T) -> Unit
) = DefaultAccordion(
data,

View File

@@ -4,7 +4,8 @@ import androidx.compose.runtime.Composable
import dev.inmo.jsuikit.modifiers.*
import dev.inmo.jsuikit.utils.Attrs
import org.jetbrains.compose.web.dom.*
import org.w3c.dom.*
import org.w3c.dom.HTMLDivElement
import org.w3c.dom.HTMLHeadingElement
@Composable
fun Card(

View File

@@ -0,0 +1,21 @@
package dev.inmo.jsuikit.elements
import androidx.compose.runtime.Composable
import dev.inmo.jsuikit.modifiers.UIKitContainer
import dev.inmo.jsuikit.modifiers.include
import dev.inmo.jsuikit.utils.Attrs
import org.jetbrains.compose.web.dom.ContentBuilder
import org.jetbrains.compose.web.dom.Div
import org.w3c.dom.HTMLDivElement
@Composable
fun Container(
attrs: Attrs<HTMLDivElement> = Attrs.empty(),
contentBuilder: ContentBuilder<HTMLDivElement> = {}
) = Div(
{
include(UIKitContainer)
attrs.builder.invoke(this)
},
contentBuilder
)

View File

@@ -0,0 +1,57 @@
package dev.inmo.jsuikit.elements
import androidx.compose.runtime.Composable
import dev.inmo.jsuikit.modifiers.UIKitDescriptionList
import dev.inmo.jsuikit.modifiers.include
import dev.inmo.jsuikit.utils.*
import org.jetbrains.compose.web.dom.ContentBuilder
import org.jetbrains.compose.web.dom.ElementScope
import org.w3c.dom.HTMLDListElement
import org.w3c.dom.HTMLElement
@Composable
fun DescriptionList(
attrs: Attrs<HTMLDListElement>,
contentBuilder: ContentBuilder<HTMLDListElement>
) {
DList(
{
include(UIKitDescriptionList)
attrs.builder(this)
},
contentBuilder
)
}
@Composable
fun <T> DescriptionList(
data: Iterable<T>,
attrs: Attrs<HTMLDListElement>,
beforeTermContent: (@Composable ElementScope<HTMLElement>.(Int, T) -> Unit)? = null,
itemTermAttrs: ((Int, T) -> Attrs<HTMLElement>?)? = null,
itemTermContent: (@Composable ElementScope<HTMLElement>.(Int, T) -> Unit)? = null,
betweenTermAndDescriptionContent: (@Composable ElementScope<HTMLElement>.(Int, T) -> Unit)? = null,
afterDescriptionContent: (@Composable ElementScope<HTMLElement>.(Int, T) -> Unit)? = null,
itemDescriptionAttrs: ((Int, T) -> Attrs<HTMLElement>?)? = null,
itemDescriptionContent: (@Composable ElementScope<HTMLElement>.(Int, T) -> Unit)? = null
) {
DescriptionList(attrs) {
data.forEachIndexed { i, t ->
beforeTermContent ?.invoke(this, i, t)
if (itemTermAttrs != null || itemTermContent != null) {
DTerm(
itemTermAttrs ?.let { { it(i, t) } },
itemTermContent ?.let { { it(i, t) } },
)
}
betweenTermAndDescriptionContent ?.invoke(this, i, t)
if (itemDescriptionAttrs != null || itemDescriptionContent != null) {
DDescription(
itemDescriptionAttrs ?.let { { it(i, t) } },
itemDescriptionContent ?.let { { it(i, t) } },
)
}
afterDescriptionContent ?.invoke(this, i, t)
}
}
}

View File

@@ -4,8 +4,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffectResult
import dev.inmo.jsuikit.modifiers.*
import org.jetbrains.compose.web.dom.*
import org.jetbrains.compose.web.dom.Text
import org.w3c.dom.*
import org.w3c.dom.HTMLDivElement
import org.w3c.dom.HTMLElement
import org.w3c.dom.events.Event
import kotlin.random.Random
import kotlin.random.nextUInt
@@ -17,7 +17,7 @@ private class DialogDisposableEffectResult(
) : DisposableEffectResult {
override fun dispose() {
onDispose?.invoke()
js("UIkit").modal("#${element.id}") ?.hide()
UIKit.modal("#${element.id}") ?.hide()
onDisposed?.invoke()
}
}
@@ -99,9 +99,7 @@ fun Dialog(
}
htmlElement.addEventListener("hidden", wrapper)
val dialog = UIKit.modal("#${htmlElement.id}")
dialog.show()
Unit
UIKit.modal("#${htmlElement.id}") ?.show()
}
}
}

View File

@@ -0,0 +1,25 @@
package dev.inmo.jsuikit.elements
import androidx.compose.runtime.Composable
import dev.inmo.jsuikit.modifiers.*
import dev.inmo.jsuikit.utils.Attrs
import dev.inmo.jsuikit.utils.InputAttrs
import org.jetbrains.compose.web.dom.*
import org.w3c.dom.HTMLDivElement
@Composable
fun DropArea(
attrs: Attrs<HTMLDivElement> = Attrs.empty(),
inputAttrs: InputAttrs<String> = Attrs.empty(),
contentBuilder: ContentBuilder<HTMLDivElement> = {}
) = Div(
{
include(UIKitPlaceholder, UIKitForm.Custom())
attrs.builder(this)
}
) {
FileInput {
inputAttrs.builder.invoke(this)
}
contentBuilder(this)
}

View File

@@ -4,7 +4,6 @@ import androidx.compose.runtime.Composable
import dev.inmo.jsuikit.buildAndAddAttribute
import dev.inmo.jsuikit.modifiers.*
import dev.inmo.jsuikit.utils.Milliseconds
import dev.inmo.jsuikit.utils.buildAttribute
import org.jetbrains.compose.web.dom.*
import org.w3c.dom.HTMLDivElement

View File

@@ -10,7 +10,7 @@ import org.w3c.dom.HTMLDivElement
fun GridColumn(
vararg modifiers: UIKitModifier,
attributesCustomizer: AttrBuilderContext<HTMLDivElement> = {},
builder: @Composable ElementScope<HTMLDivElement>.() -> Unit
builder: @Composable ElementScope<HTMLDivElement>.() -> Unit = {}
) {
Div(
{
@@ -30,7 +30,7 @@ fun Grid(
marginClass: String? = null,
firstColumnClass: String? = null,
attributesCustomizer: AttrBuilderContext<HTMLDivElement> = {},
builder: @Composable ElementScope<HTMLDivElement>.() -> Unit
builder: @Composable ElementScope<HTMLDivElement>.() -> Unit = {}
) {
val attrs = listOfNotNull(
if (masonry) "masonry" to "true" else null,

View File

@@ -1,9 +1,11 @@
package dev.inmo.jsuikit.elements
import androidx.compose.runtime.Composable
import dev.inmo.jsuikit.modifiers.*
import dev.inmo.jsuikit.modifiers.UIKitLabel
import dev.inmo.jsuikit.modifiers.include
import dev.inmo.jsuikit.utils.Attrs
import org.jetbrains.compose.web.dom.*
import org.jetbrains.compose.web.dom.Span
import org.jetbrains.compose.web.dom.Text
import org.w3c.dom.HTMLSpanElement
@Composable

View File

@@ -3,21 +3,21 @@ package dev.inmo.jsuikit.elements
import androidx.compose.runtime.Composable
import dev.inmo.jsuikit.modifiers.UIKitModifier
import dev.inmo.jsuikit.modifiers.include
import org.jetbrains.compose.web.attributes.AttrsBuilder
import org.jetbrains.compose.web.attributes.AttrsScope
import org.jetbrains.compose.web.dom.*
import org.w3c.dom.HTMLLIElement
import org.w3c.dom.HTMLUListElement
interface NavbarNavElement {
fun AttrsBuilder<HTMLLIElement>.setup() {}
fun AttrsScope<HTMLLIElement>.setup() {}
@Composable
fun ElementScope<HTMLLIElement>.fill()
class Default(
private val setupCallback: AttrsBuilder<HTMLLIElement>.() -> Unit,
private val setupCallback: AttrsScope<HTMLLIElement>.() -> Unit,
private val fillCallback: @Composable ElementScope<HTMLLIElement>.() -> Unit
) : NavbarNavElement {
override fun AttrsBuilder<HTMLLIElement>.setup() {
override fun AttrsScope<HTMLLIElement>.setup() {
setupCallback()
}

View File

@@ -0,0 +1,13 @@
package dev.inmo.jsuikit.elements
import dev.inmo.jsuikit.modifiers.UIKit
import dev.inmo.jsuikit.types.*
import dev.inmo.jsuikit.utils.Milliseconds
fun Notification(
message: String,
status: UIKitNotificationParameter.Style? = null,
timeout: Milliseconds? = null,
group: NotificationsGroup? = null,
position: UIKitNotificationParameter.Position? = null
) = UIKit.notification.invoke(message, status, timeout, group, position)

View File

@@ -1,9 +1,9 @@
package dev.inmo.jsuikit.elements
import androidx.compose.runtime.Composable
import androidx.compose.runtime.snapshots.SnapshotStateList
import dev.inmo.jsuikit.modifiers.*
import org.jetbrains.compose.web.attributes.AttrsBuilder
import dev.inmo.jsuikit.modifiers.UIKitModifier
import dev.inmo.jsuikit.modifiers.include
import org.jetbrains.compose.web.attributes.AttrsScope
import org.jetbrains.compose.web.dom.*
import org.jetbrains.compose.web.dom.Text
import org.w3c.dom.*
@@ -11,13 +11,13 @@ import org.w3c.dom.*
@Composable
fun <T> DefaultTable(
headerBuilders: List<ContentBuilder<HTMLTableCellElement>>,
dataList: SnapshotStateList<T>,
dataList: Iterable<T>,
vararg tableModifiers: UIKitModifier,
attributesCustomizer: AttrBuilderContext<HTMLTableElement> = {},
headerCustomizer: AttrBuilderContext<HTMLTableSectionElement> = {},
headerCellCustomizer: AttrsBuilder<HTMLTableCellElement>.(i: Int) -> Unit = {},
rowAttributes: AttrsBuilder<HTMLTableRowElement>.(t: T) -> Unit = {},
cellCustomizer: AttrsBuilder<HTMLTableCellElement>.(i: Int, t: T) -> Unit = { _, _ -> },
headerCellCustomizer: AttrsScope<HTMLTableCellElement>.(i: Int) -> Unit = {},
rowAttributes: AttrsScope<HTMLTableRowElement>.(t: T) -> Unit = {},
cellCustomizer: AttrsScope<HTMLTableCellElement>.(i: Int, t: T) -> Unit = { _, _ -> },
betweenHeaderAndBodyFiller: ContentBuilder<HTMLTableElement> = {},
cellFiller: @Composable ElementScope<HTMLTableCellElement>.(i: Int, t: T) -> Unit
) {
@@ -68,18 +68,18 @@ fun <T> DefaultTable(
@Composable
fun <T> DefaultTable(
heading: List<String>,
dataList: SnapshotStateList<T>,
dataList: Iterable<T>,
vararg tableModifiers: UIKitModifier,
attributesCustomizer: AttrBuilderContext<HTMLTableElement> = {},
headerCustomizer: AttrBuilderContext<HTMLTableSectionElement> = {},
headerCellCustomizer: AttrsBuilder<HTMLTableCellElement>.(i: Int, title: String) -> Unit = { _, _ -> },
rowAttributes: AttrsBuilder<HTMLTableRowElement>.(t: T) -> Unit = {},
cellCustomizer: AttrsBuilder<HTMLTableCellElement>.(i: Int, t: T) -> Unit = { _, _ -> },
headerCellCustomizer: AttrsScope<HTMLTableCellElement>.(i: Int, title: String) -> Unit = { _, _ -> },
rowAttributes: AttrsScope<HTMLTableRowElement>.(t: T) -> Unit = {},
cellCustomizer: AttrsScope<HTMLTableCellElement>.(i: Int, t: T) -> Unit = { _, _ -> },
betweenHeaderAndBodyFiller: ContentBuilder<HTMLTableElement> = {},
cellFiller: @Composable ElementScope<HTMLTableCellElement>.(i: Int, t: T) -> Unit
) {
val headersByIndex = heading.mapIndexed { index, s -> index to s }.toMap()
val headerCellCustomizer: AttrsBuilder<HTMLTableCellElement>.(i: Int) -> Unit = { i ->
val headerCellCustomizer: AttrsScope<HTMLTableCellElement>.(i: Int) -> Unit = { i ->
val header = headersByIndex[i]
if (header != null) {
headerCellCustomizer(i, header)

View File

@@ -0,0 +1,21 @@
package dev.inmo.jsuikit.elements
import androidx.compose.runtime.Composable
import dev.inmo.jsuikit.modifiers.UIKitTile
import dev.inmo.jsuikit.modifiers.include
import dev.inmo.jsuikit.utils.Attrs
import org.jetbrains.compose.web.dom.ContentBuilder
import org.jetbrains.compose.web.dom.Div
import org.w3c.dom.HTMLDivElement
@Composable
fun Tile(
attrs: Attrs<HTMLDivElement> = Attrs.empty(),
contentBuilder: ContentBuilder<HTMLDivElement>
) = Div(
{
include(UIKitTile)
attrs.builder(this)
},
contentBuilder
)

View File

@@ -1,4 +1,6 @@
package dev.inmo.jsuikit.modifiers
inline val UIKit
get() = js("UIkit")
import dev.inmo.jsuikit.types.UIKit
inline val UIKit: UIKit
get() = js("UIkit").unsafeCast<UIKit>()

View File

@@ -1,6 +1,7 @@
package dev.inmo.jsuikit.modifiers
import dev.inmo.jsuikit.utils.*
import dev.inmo.jsuikit.utils.Milliseconds
import dev.inmo.jsuikit.utils.buildAttribute
import org.w3c.dom.PageTransitionEvent
sealed class UIKitAccordion(

View File

@@ -62,4 +62,7 @@ sealed class UIKitAnimation (name: String) : UIKitModifier, AttributeValue(name)
object KenBurns : UIKitAnimation("kenburns")
override fun toString(): String {
return classes.joinToString(" ")
}
}

View File

@@ -0,0 +1,19 @@
package dev.inmo.jsuikit.modifiers
sealed class UIKitContainer(
override val classes: Array<String> = emptyArray(),
override val otherAttrs: Map<String, String> = emptyMap()
) : UIKitModifier {
sealed class Size(size: String) : UIKitContainer(arrayOf("uk-container-$size")) {
object XSmall : Size("xsmall")
object Small : Size("small")
object Large : Size("large")
object XLarge : Size("xlarge")
object Expand : Size("expand")
}
companion object : UIKitContainer(
arrayOf("uk-container")
)
}

View File

@@ -0,0 +1,11 @@
package dev.inmo.jsuikit.modifiers
sealed class UIKitDescriptionList(
override val classes: Array<String>
) : UIKitModifier {
object Divider : UIKitDescriptionList(arrayOf("uk-description-list-divider"))
companion object : UIKitDescriptionList(arrayOf("uk-description-list"))
}

View File

@@ -47,8 +47,9 @@ sealed class UIKitForm(
object Icon : UIKitForm("uk-form-icon")
class Custom(
target: String = "true"
target: String? = null
) : UIKitForm(
"uk-form-custom",
otherAttrs = mapOf(
buildAttribute("uk-form-custom") {
"target" to target

View File

@@ -1,7 +1,6 @@
package dev.inmo.jsuikit.modifiers
import dev.inmo.jsuikit.utils.*
import org.jetbrains.compose.web.css.CSSKeyframe
sealed class UIKitHeight(
classname: String?,

View File

@@ -1,6 +1,6 @@
package dev.inmo.jsuikit.modifiers
import org.jetbrains.compose.web.attributes.AttrsBuilder
import org.jetbrains.compose.web.attributes.AttrsScope
interface UIKitModifier {
val classes: Array<String>
@@ -9,7 +9,7 @@ interface UIKitModifier {
get() = emptyMap()
}
fun AttrsBuilder<*>.include(vararg container: UIKitModifier?) {
fun AttrsScope<*>.include(vararg container: UIKitModifier?) {
container.forEach {
it ?.classes ?.let { newClasses -> classes(*newClasses) }
it ?.otherAttrs ?.let { attrs -> attrs.forEach { (k, v) -> attr(k, v) } }

View File

@@ -0,0 +1,5 @@
package dev.inmo.jsuikit.modifiers
object UIKitPlaceholder : UIKitModifier {
override val classes: Array<String> = arrayOf("uk-placeholder")
}

View File

@@ -20,3 +20,12 @@ sealed class UIKitScreenSizeModifier(val name: String) {
}
fun UIKitModifier.applyWhenScreenSizeIs(size: UIKitScreenSizeModifier) = size.modify(this)
val UIKitModifier.onSmallScreens
get() = applyWhenScreenSizeIs(UIKitScreenSizeModifier.Small)
val UIKitModifier.onMediumScreens
get() = applyWhenScreenSizeIs(UIKitScreenSizeModifier.Medium)
val UIKitModifier.onLargeScreens
get() = applyWhenScreenSizeIs(UIKitScreenSizeModifier.Large)
val UIKitModifier.onXLargeScreens
get() = applyWhenScreenSizeIs(UIKitScreenSizeModifier.XLarge)

View File

@@ -0,0 +1,15 @@
package dev.inmo.jsuikit.modifiers
sealed class UIKitTile(
override val classes: Array<String> = emptyArray(),
override val otherAttrs: Map<String, String> = emptyMap()
) : UIKitModifier {
object Default : UIKitTile(arrayOf("uk-tile-default"))
object Muted : UIKitTile(arrayOf("uk-tile-muted"))
object Primary : UIKitTile(arrayOf("uk-tile-primary"))
object Secondary : UIKitTile(arrayOf("uk-tile-secondary"))
companion object : UIKitTile(arrayOf("uk-tile"))
}

View File

@@ -0,0 +1,64 @@
package dev.inmo.jsuikit.modifiers
import dev.inmo.jsuikit.utils.Milliseconds
import dev.inmo.jsuikit.utils.buildAttribute
sealed class UIKitToggle(
vararg classnames: String,
override val otherAttrs: Map<String, String>
) : UIKitModifier {
@Suppress("UNCHECKED_CAST")
override val classes: Array<String> = classnames as Array<String>
sealed class Mode {
abstract val mode: String
object Click : Mode() {
override val mode: String
get() = "click"
}
object Hover : Mode() {
override val mode: String
get() = "hover"
}
object ClickAndHover : Mode() {
override val mode: String
get() = "${Click.mode}, ${Hover.mode}"
}
object Media : Mode() {
override val mode: String
get() = "media"
}
override fun toString(): String = mode
}
class Custom internal constructor(otherAttrs: Map<String, String>) : UIKitToggle(otherAttrs = otherAttrs)
companion object {
operator fun invoke(
target: String? = null,
mode: Mode? = null,
classesToApplyOnToggle: String? = null,
media: String? = null,
animation: UIKitAnimation? = null,
duration: Milliseconds? = null,
queued: Boolean? = null
) = Custom(
mapOf(
buildAttribute("uk-toggle") {
"target" to target
"mode" to mode
"cls" to classesToApplyOnToggle
"media" to media
"animation" to animation
"duration" to duration
"queued" to queued
}
)
)
}
}

View File

@@ -111,4 +111,5 @@ sealed class UIKitUtility(classname: String) : UIKitModifier {
object Active : UIKitUtility("uk-active")
object Open : UIKitUtility("uk-open")
object Link : UIKitUtility("uk-link")
}

View File

@@ -0,0 +1,16 @@
package dev.inmo.jsuikit.types
import org.w3c.dom.Element
import kotlin.js.Json
external interface UIKit {
val notification: UIKitNotifications
val modal: UIKitDialogs
fun notification(message: String, parameters: Json)
fun notification(element: Element): UIKitNotification?
fun modal(element: Element): UIKitDialog
fun modal(selector: String): UIKitDialog?
}

View File

@@ -0,0 +1,38 @@
package dev.inmo.jsuikit.types
import org.w3c.dom.Element
import kotlin.js.Promise
external interface UIKitDialogs {
fun alert(text: String): UIKitDialogPromiseAlert
fun confirm(text: String): UIKitDialogPromiseConfirm
fun prompt(title: String): UIKitDialogPromisePrompt
fun prompt(title: String, preset: String): UIKitDialogPromisePrompt
fun dialog(element: Element): UIKitDialog
}
external class UIKitDialogPromiseConfirm : Promise<Unit> {
val dialog: UIKitDialog
fun then(
onConfirm: () -> Unit = definedExternally,
onRejected: () -> Unit = definedExternally,
)
}
external class UIKitDialogPromisePrompt : Promise<Unit> {
val dialog: UIKitDialog
fun then(onResult: (data: String?) -> Unit)
}
external class UIKitDialogPromiseAlert : Promise<Unit> {
val dialog: UIKitDialog
fun then(onClose: () -> Unit)
}
external interface UIKitDialog {
fun show()
fun hide()
}

View File

@@ -0,0 +1,39 @@
package dev.inmo.jsuikit.types
sealed class UIKitNotificationParameter {
abstract val parameterName: String
abstract val parameterValue: String
sealed class Style(override val parameterValue: String) : UIKitNotificationParameter() {
override val parameterName: String
get() = "status"
object Primary : Style("primary")
object Success : Style("success")
object Warning : Style("warning")
object Danger : Style("danger")
}
sealed class Position(override val parameterValue: String) : UIKitNotificationParameter() {
override val parameterName: String
get() = "pos"
sealed class Top(parameterValue: String) : Position("top-$parameterValue") {
object Left : Top("left")
object Center : Top("center")
object Right : Top("right")
}
sealed class Bottom(parameterValue: String) : Position("bottom-$parameterValue") {
object Left : Bottom("left")
object Center : Bottom("center")
object Right : Bottom("right")
}
}
}

View File

@@ -0,0 +1,45 @@
package dev.inmo.jsuikit.types
import dev.inmo.jsuikit.modifiers.UIKit
import dev.inmo.jsuikit.utils.Milliseconds
import kotlin.js.json
typealias NotificationsGroup = String
external interface UIKitNotifications {
fun closeAll(group: NotificationsGroup)
}
external interface UIKitNotification {
fun close(immediate: Boolean)
}
data class UIKitNotificationsParameters(
val status: UIKitNotificationParameter.Style? = null,
val timeout: Milliseconds? = null,
val group: NotificationsGroup? = null,
val position: UIKitNotificationParameter.Position? = null
) {
fun parametersJson() = json(
*listOfNotNull(
status ?.let { it.parameterName to it.parameterValue },
timeout ?.let { "timeout" to timeout.toString() },
group ?.let { "group" to it },
position ?.let { it.parameterName to it.parameterValue },
).toTypedArray()
)
}
operator fun UIKitNotifications.invoke(
message: String,
parameters: UIKitNotificationsParameters
) = UIKit.notification(message, parameters.parametersJson())
operator fun UIKitNotifications.invoke(
message: String,
status: UIKitNotificationParameter.Style? = null,
timeout: Milliseconds? = null,
group: NotificationsGroup? = null,
position: UIKitNotificationParameter.Position? = null
) = invoke(message, UIKitNotificationsParameters(status, timeout, group, position))

View File

@@ -2,25 +2,34 @@ package dev.inmo.jsuikit.utils
import dev.inmo.jsuikit.modifiers.UIKitModifier
import dev.inmo.jsuikit.modifiers.include
import org.jetbrains.compose.web.attributes.AttrsBuilder
import org.jetbrains.compose.web.dom.AttrBuilderContext
import org.jetbrains.compose.web.attributes.AttrsScope
import org.jetbrains.compose.web.attributes.builders.InputAttrsScope
import org.w3c.dom.Element
import org.w3c.dom.HTMLInputElement
class AttributesCollection<T : Element> (
private vararg val modifiers: UIKitModifier,
private val attrs: AttrBuilderContext<T> = {}
class AttributesCollection<T : Element, Builder : AttrsScope<T>> (
private vararg val modifiers: UIKitModifier?,
private val attrs: Builder.() -> Unit = {}
) {
val builder: AttrBuilderContext<T> = {
val builder: Builder.() -> Unit = {
include(*modifiers)
attrs()
}
operator fun plus(other: AttributesCollection<T, Builder>) = AttributesCollection<T, Builder>(
*(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> empty() = Empty as Attrs<T>
fun <T : Element, Builder : AttrsScope<T>> empty() = Empty as AttributesCollection<T, Builder>
}
}
typealias Attrs<T> = AttributesCollection<T>
typealias Attrs<T> = AttributesCollection<T, AttrsScope<T>>
typealias InputAttrs<T> = AttributesCollection<HTMLInputElement, InputAttrsScope<T>>

View File

@@ -0,0 +1,55 @@
package dev.inmo.jsuikit.utils
import androidx.compose.runtime.Composable
import kotlinx.browser.document
import org.jetbrains.compose.web.dom.*
import org.w3c.dom.*
private object DListElementBuilder : ElementBuilder<HTMLDListElement> {
private val el: Element by lazy { document.createElement("dl") }
override fun create(): HTMLDListElement = el.cloneNode() as HTMLDListElement
}
private object DTermElementBuilder : ElementBuilder<HTMLElement> {
private val el: Element by lazy { document.createElement("dt") }
override fun create(): HTMLElement = el.cloneNode() as HTMLElement
}
private object DDescriptionElementBuilder : ElementBuilder<HTMLElement> {
private val el: Element by lazy { document.createElement("dd") }
override fun create(): HTMLElement = el.cloneNode() as HTMLElement
}
@Composable
fun DList(
attrs: AttrBuilderContext<HTMLDListElement>? = null,
content: ContentBuilder<HTMLDListElement>? = null
) {
TagElement(
DListElementBuilder,
attrs,
content
)
}
@Composable
fun DTerm(
attrs: AttrBuilderContext<HTMLElement>? = null,
content: ContentBuilder<HTMLElement>? = null
) {
TagElement(
DTermElementBuilder,
attrs,
content
)
}
@Composable
fun DDescription(
attrs: AttrBuilderContext<HTMLElement>? = null,
content: ContentBuilder<HTMLElement>? = null
) {
TagElement(
DDescriptionElementBuilder,
attrs,
content
)
}