mirror of
https://github.com/InsanusMokrassar/JSUIKitKBindings.git
synced 2026-01-04 12:29:28 +00:00
Compare commits
34 Commits
0.0.47
...
6b4e141cd2
| Author | SHA1 | Date | |
|---|---|---|---|
| 6b4e141cd2 | |||
| fb5e0ade11 | |||
| 353314dd26 | |||
| 57ffe32b9f | |||
| c6bacffdb3 | |||
| 3e2aa22076 | |||
| 5842da03d0 | |||
| 6daa57fe8f | |||
| 8adbe8a1ca | |||
| 468f167ac6 | |||
| c41e2b8495 | |||
| 7cdd12e81e | |||
| f3ce0f6b6b | |||
| d24edcbaf7 | |||
| fdd98bab13 | |||
| ed6582c98d | |||
| 4b697938ac | |||
| ebb350c688 | |||
| 8c2ce7b75d | |||
| 2d62f9847a | |||
| 3746b614cf | |||
| 2ece25ef4e | |||
| 18ffabf76d | |||
| c5ef64ebe4 | |||
| ee1bea8ee1 | |||
| 4a7b125abe | |||
| a756bab2a6 | |||
| be4d63f0e0 | |||
| b177760c73 | |||
| 82f00fa23b | |||
| 33b1a7af65 | |||
| e6b0ca580a | |||
| d5045bdba7 | |||
| 186eff482d |
33
CHANGELOG.md
33
CHANGELOG.md
@@ -1,5 +1,38 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.1.0
|
||||||
|
|
||||||
|
* `Kotlin` = `1.6.21`
|
||||||
|
* `Compose`: `1.2.0-alpha01-dev679`
|
||||||
|
|
||||||
|
## 0.0.53
|
||||||
|
|
||||||
|
* Improvements in `UIKitPadding`
|
||||||
|
* Add support of UIKit lists
|
||||||
|
|
||||||
|
## 0.0.52
|
||||||
|
|
||||||
|
* Improve work with UIKitModifiers
|
||||||
|
|
||||||
|
## 0.0.51
|
||||||
|
|
||||||
|
* New interface `Dropdown` which will be used to create (or retrieve) dropdown for an element
|
||||||
|
* New attribute in `NavItemElement` for configuration of `A` element
|
||||||
|
|
||||||
|
## 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
|
## 0.0.47
|
||||||
|
|
||||||
* Add support of `Close` element
|
* Add support of `Close` element
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ repositories {
|
|||||||
mavenLocal()
|
mavenLocal()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
google()
|
google()
|
||||||
|
maven { url "https://maven.pkg.jetbrains.space/public/p/compose/dev" }
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
|
|||||||
@@ -9,4 +9,4 @@ android.enableJetifier=true
|
|||||||
# Project data
|
# Project data
|
||||||
|
|
||||||
group=dev.inmo
|
group=dev.inmo
|
||||||
version=0.0.47
|
version=0.1.0
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
[versions]
|
[versions]
|
||||||
|
|
||||||
kt = "1.6.10"
|
kt = "1.6.21"
|
||||||
jb-compose = "1.1.1"
|
jb-compose = "1.2.0-alpha01-dev679"
|
||||||
jb-dokka = "1.6.10"
|
jb-dokka = "1.6.21"
|
||||||
gh-release = "2.2.12"
|
gh-release = "2.3.7"
|
||||||
|
|
||||||
[libraries]
|
[libraries]
|
||||||
|
|
||||||
|
|||||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
package dev.inmo.jsuikit
|
package dev.inmo.jsuikit
|
||||||
|
|
||||||
import dev.inmo.jsuikit.modifiers.AttributeValue
|
import dev.inmo.jsuikit.modifiers.AttributeValue
|
||||||
import dev.inmo.jsuikit.utils.AttributeBuilder
|
import dev.inmo.jsuikit.utils.*
|
||||||
import dev.inmo.jsuikit.utils.buildAttribute
|
|
||||||
import org.jetbrains.compose.web.attributes.AttrsScope
|
import org.jetbrains.compose.web.attributes.AttrsScope
|
||||||
|
|
||||||
@Deprecated("Will be removed soon")
|
@Deprecated("Will be removed soon")
|
||||||
@@ -25,7 +24,7 @@ class UIKitAttributeValueBuilder {
|
|||||||
fun AttrsScope<*>.buildAndAddAttribute(
|
fun AttrsScope<*>.buildAndAddAttribute(
|
||||||
attributeName: String,
|
attributeName: String,
|
||||||
skipNullValues: Boolean = true,
|
skipNullValues: Boolean = true,
|
||||||
block: AttributeBuilder.() -> Unit
|
block: ParametersBuilder.() -> Unit
|
||||||
) {
|
) {
|
||||||
buildAttribute(attributeName, skipNullValues, block).let {
|
buildAttribute(attributeName, skipNullValues, block).let {
|
||||||
attr(it.first, it.second)
|
attr(it.first, it.second)
|
||||||
|
|||||||
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()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,10 +3,26 @@ package dev.inmo.jsuikit.elements
|
|||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import dev.inmo.jsuikit.buildAndAddAttribute
|
import dev.inmo.jsuikit.buildAndAddAttribute
|
||||||
import dev.inmo.jsuikit.modifiers.*
|
import dev.inmo.jsuikit.modifiers.*
|
||||||
|
import dev.inmo.jsuikit.types.DropdownOptions
|
||||||
import dev.inmo.jsuikit.utils.Milliseconds
|
import dev.inmo.jsuikit.utils.Milliseconds
|
||||||
import org.jetbrains.compose.web.dom.*
|
import org.jetbrains.compose.web.dom.*
|
||||||
import org.w3c.dom.HTMLDivElement
|
import org.w3c.dom.HTMLDivElement
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun Dropdown(
|
||||||
|
vararg modifiers: UIKitModifier,
|
||||||
|
dropdownOptions: DropdownOptions,
|
||||||
|
attributesCustomizer: AttrBuilderContext<HTMLDivElement> = {},
|
||||||
|
contentBuilder: ContentBuilder<HTMLDivElement>
|
||||||
|
) {
|
||||||
|
Div(
|
||||||
|
{
|
||||||
|
include(UIKitDropdown(dropdownOptions), *modifiers)
|
||||||
|
attributesCustomizer()
|
||||||
|
},
|
||||||
|
contentBuilder
|
||||||
|
)
|
||||||
|
}
|
||||||
@Composable
|
@Composable
|
||||||
fun Dropdown(
|
fun Dropdown(
|
||||||
vararg modifiers: UIKitModifier,
|
vararg modifiers: UIKitModifier,
|
||||||
@@ -26,21 +42,24 @@ fun Dropdown(
|
|||||||
) {
|
) {
|
||||||
Div(
|
Div(
|
||||||
{
|
{
|
||||||
buildAndAddAttribute("uk-dropdown") {
|
include(
|
||||||
"toggle" to toggle
|
UIKitDropdown(
|
||||||
"pos" to pos
|
DropdownOptions(
|
||||||
"mode" to mode
|
toggle = toggle,
|
||||||
"delayShow" to delayShow
|
pos = pos,
|
||||||
"delayHide" to delayHide
|
mode = mode,
|
||||||
"boundary" to boundary
|
delayShow = delayShow,
|
||||||
"boundaryAlign" to boundaryAlign
|
delayHide = delayHide,
|
||||||
"flip" to flip
|
boundary = boundary,
|
||||||
"offset" to offset
|
boundaryAlign = boundaryAlign,
|
||||||
"animation" to animation
|
flip = flip,
|
||||||
"duration" to duration
|
offset = offset,
|
||||||
}
|
animation = animation,
|
||||||
classes("uk-dropdown")
|
duration = duration
|
||||||
include(*modifiers)
|
)
|
||||||
|
),
|
||||||
|
*modifiers
|
||||||
|
)
|
||||||
attributesCustomizer()
|
attributesCustomizer()
|
||||||
},
|
},
|
||||||
contentBuilder
|
contentBuilder
|
||||||
|
|||||||
@@ -2,14 +2,32 @@ package dev.inmo.jsuikit.elements
|
|||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.snapshots.SnapshotStateList
|
import androidx.compose.runtime.snapshots.SnapshotStateList
|
||||||
import dev.inmo.jsuikit.modifiers.UIKitModifier
|
import dev.inmo.jsuikit.modifiers.*
|
||||||
import dev.inmo.jsuikit.modifiers.include
|
import dev.inmo.jsuikit.utils.Attrs
|
||||||
import org.jetbrains.compose.web.dom.*
|
import org.jetbrains.compose.web.dom.*
|
||||||
import org.w3c.dom.HTMLHeadingElement
|
import org.w3c.dom.HTMLHeadingElement
|
||||||
import org.w3c.dom.HTMLUListElement
|
import org.w3c.dom.HTMLUListElement
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun <T> List(
|
fun <T> List(
|
||||||
|
data: SnapshotStateList<T>,
|
||||||
|
ukAttrs: Attrs<HTMLUListElement> = Attrs.empty(),
|
||||||
|
elementAllocator: @Composable ElementScope<HTMLUListElement>.(T) -> Unit
|
||||||
|
) {
|
||||||
|
Ul(
|
||||||
|
{
|
||||||
|
include(UIKitList)
|
||||||
|
ukAttrs.builder(this)
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
data.forEach {
|
||||||
|
elementAllocator(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun <T> ListWithTitle(
|
||||||
title: String,
|
title: String,
|
||||||
data: SnapshotStateList<T>,
|
data: SnapshotStateList<T>,
|
||||||
vararg titleModifiers: UIKitModifier,
|
vararg titleModifiers: UIKitModifier,
|
||||||
@@ -23,15 +41,27 @@ fun <T> List(
|
|||||||
Text(title)
|
Text(title)
|
||||||
}
|
}
|
||||||
besidesTitleAndList ?.invoke()
|
besidesTitleAndList ?.invoke()
|
||||||
Ul(
|
List(data, Attrs(*ulModifiers) { ulCustomizer(this) }, elementAllocator)
|
||||||
{
|
|
||||||
classes("uk-list")
|
|
||||||
include(*ulModifiers)
|
|
||||||
ulCustomizer()
|
|
||||||
}
|
|
||||||
) {
|
|
||||||
data.forEach {
|
|
||||||
elementAllocator(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated("Renamed", ReplaceWith("ListWithTitle", "dev.inmo.jsuikit.elements.ListWithTitle"))
|
||||||
|
@Composable
|
||||||
|
fun <T> List(
|
||||||
|
title: String,
|
||||||
|
data: SnapshotStateList<T>,
|
||||||
|
vararg titleModifiers: UIKitModifier,
|
||||||
|
ulModifiers: Array<UIKitModifier> = emptyArray(),
|
||||||
|
besidesTitleAndList: (@Composable () -> Unit)? = null,
|
||||||
|
titleCustomizer: AttrBuilderContext<HTMLHeadingElement> = {},
|
||||||
|
ulCustomizer: AttrBuilderContext<HTMLUListElement> = {},
|
||||||
|
elementAllocator: @Composable ElementScope<HTMLUListElement>.(T) -> Unit
|
||||||
|
) = ListWithTitle(
|
||||||
|
title,
|
||||||
|
data,
|
||||||
|
*titleModifiers,
|
||||||
|
ulModifiers = ulModifiers,
|
||||||
|
besidesTitleAndList = besidesTitleAndList,
|
||||||
|
titleCustomizer = titleCustomizer,
|
||||||
|
ulCustomizer = ulCustomizer,
|
||||||
|
elementAllocator = elementAllocator
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package dev.inmo.jsuikit.elements
|
package dev.inmo.jsuikit.elements
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.snapshots.SnapshotStateList
|
|
||||||
import dev.inmo.jsuikit.buildAndAddAttribute
|
import dev.inmo.jsuikit.buildAndAddAttribute
|
||||||
import dev.inmo.jsuikit.modifiers.*
|
import dev.inmo.jsuikit.modifiers.*
|
||||||
import dev.inmo.jsuikit.utils.Milliseconds
|
import dev.inmo.jsuikit.utils.Milliseconds
|
||||||
@@ -94,7 +93,7 @@ fun SubNav(
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun <T> Nav(
|
fun <T> Nav(
|
||||||
title: String,
|
title: String?,
|
||||||
data: Iterable<T>,
|
data: Iterable<T>,
|
||||||
vararg ulModifiers: UIKitModifier,
|
vararg ulModifiers: UIKitModifier,
|
||||||
titleModifiers: Array<UIKitModifier> = emptyArray(),
|
titleModifiers: Array<UIKitModifier> = emptyArray(),
|
||||||
@@ -104,6 +103,7 @@ fun <T> Nav(
|
|||||||
duration: Milliseconds? = null,
|
duration: Milliseconds? = null,
|
||||||
besidesTitleAndList: ContentBuilder<HTMLUListElement>? = null,
|
besidesTitleAndList: ContentBuilder<HTMLUListElement>? = null,
|
||||||
titleCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
titleCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
||||||
|
afterTitleContentBuilder: ContentBuilder<HTMLLIElement> = {},
|
||||||
ulCustomizer: AttrBuilderContext<HTMLUListElement> = {},
|
ulCustomizer: AttrBuilderContext<HTMLUListElement> = {},
|
||||||
elementAllocator: @Composable ElementScope<HTMLUListElement>.(T) -> Unit
|
elementAllocator: @Composable ElementScope<HTMLUListElement>.(T) -> Unit
|
||||||
) {
|
) {
|
||||||
@@ -119,11 +119,14 @@ fun <T> Nav(
|
|||||||
ulCustomizer()
|
ulCustomizer()
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
NavHeader(
|
title ?.let {
|
||||||
title,
|
NavHeader(
|
||||||
*titleModifiers,
|
title,
|
||||||
attributesCustomizer = titleCustomizer
|
*titleModifiers,
|
||||||
)
|
attributesCustomizer = titleCustomizer,
|
||||||
|
afterTitleContentBuilder = afterTitleContentBuilder
|
||||||
|
)
|
||||||
|
}
|
||||||
besidesTitleAndList ?.let { it() }
|
besidesTitleAndList ?.let { it() }
|
||||||
data.forEach {
|
data.forEach {
|
||||||
elementAllocator(it)
|
elementAllocator(it)
|
||||||
@@ -133,7 +136,7 @@ fun <T> Nav(
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun <T> DefaultNav(
|
fun <T> DefaultNav(
|
||||||
title: String,
|
title: String?,
|
||||||
data: Iterable<T>,
|
data: Iterable<T>,
|
||||||
vararg ulModifiers: UIKitModifier,
|
vararg ulModifiers: UIKitModifier,
|
||||||
titleModifiers: Array<UIKitModifier> = emptyArray(),
|
titleModifiers: Array<UIKitModifier> = emptyArray(),
|
||||||
@@ -143,6 +146,7 @@ fun <T> DefaultNav(
|
|||||||
duration: Milliseconds? = null,
|
duration: Milliseconds? = null,
|
||||||
besidesTitleAndList: ContentBuilder<HTMLUListElement>? = null,
|
besidesTitleAndList: ContentBuilder<HTMLUListElement>? = null,
|
||||||
titleCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
titleCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
||||||
|
afterTitleContentBuilder: ContentBuilder<HTMLLIElement> = {},
|
||||||
ulCustomizer: AttrBuilderContext<HTMLUListElement> = {},
|
ulCustomizer: AttrBuilderContext<HTMLUListElement> = {},
|
||||||
elementAllocator: @Composable ElementScope<HTMLUListElement>.(T) -> Unit
|
elementAllocator: @Composable ElementScope<HTMLUListElement>.(T) -> Unit
|
||||||
) = Nav(
|
) = Nav(
|
||||||
@@ -156,13 +160,14 @@ fun <T> DefaultNav(
|
|||||||
duration,
|
duration,
|
||||||
besidesTitleAndList,
|
besidesTitleAndList,
|
||||||
titleCustomizer,
|
titleCustomizer,
|
||||||
|
afterTitleContentBuilder,
|
||||||
ulCustomizer,
|
ulCustomizer,
|
||||||
elementAllocator
|
elementAllocator
|
||||||
)
|
)
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun <T> PrimaryNav(
|
fun <T> PrimaryNav(
|
||||||
title: String,
|
title: String?,
|
||||||
data: Iterable<T>,
|
data: Iterable<T>,
|
||||||
vararg ulModifiers: UIKitModifier,
|
vararg ulModifiers: UIKitModifier,
|
||||||
titleModifiers: Array<UIKitModifier> = emptyArray(),
|
titleModifiers: Array<UIKitModifier> = emptyArray(),
|
||||||
@@ -172,6 +177,7 @@ fun <T> PrimaryNav(
|
|||||||
duration: Milliseconds? = null,
|
duration: Milliseconds? = null,
|
||||||
besidesTitleAndList: ContentBuilder<HTMLUListElement>? = null,
|
besidesTitleAndList: ContentBuilder<HTMLUListElement>? = null,
|
||||||
titleCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
titleCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
||||||
|
afterTitleContentBuilder: ContentBuilder<HTMLLIElement> = {},
|
||||||
ulCustomizer: AttrBuilderContext<HTMLUListElement> = {},
|
ulCustomizer: AttrBuilderContext<HTMLUListElement> = {},
|
||||||
elementAllocator: @Composable ElementScope<HTMLUListElement>.(T) -> Unit
|
elementAllocator: @Composable ElementScope<HTMLUListElement>.(T) -> Unit
|
||||||
) = Nav(
|
) = Nav(
|
||||||
@@ -185,13 +191,14 @@ fun <T> PrimaryNav(
|
|||||||
duration,
|
duration,
|
||||||
besidesTitleAndList,
|
besidesTitleAndList,
|
||||||
titleCustomizer,
|
titleCustomizer,
|
||||||
|
afterTitleContentBuilder,
|
||||||
ulCustomizer,
|
ulCustomizer,
|
||||||
elementAllocator
|
elementAllocator
|
||||||
)
|
)
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun <T> SubNav(
|
fun <T> SubNav(
|
||||||
title: String,
|
title: String?,
|
||||||
data: Iterable<T>,
|
data: Iterable<T>,
|
||||||
vararg ulModifiers: UIKitModifier,
|
vararg ulModifiers: UIKitModifier,
|
||||||
titleModifiers: Array<UIKitModifier> = emptyArray(),
|
titleModifiers: Array<UIKitModifier> = emptyArray(),
|
||||||
@@ -201,6 +208,7 @@ fun <T> SubNav(
|
|||||||
duration: Milliseconds? = null,
|
duration: Milliseconds? = null,
|
||||||
besidesTitleAndList: ContentBuilder<HTMLUListElement>? = null,
|
besidesTitleAndList: ContentBuilder<HTMLUListElement>? = null,
|
||||||
titleCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
titleCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
||||||
|
afterTitleContentBuilder: ContentBuilder<HTMLLIElement> = {},
|
||||||
ulCustomizer: AttrBuilderContext<HTMLUListElement> = {},
|
ulCustomizer: AttrBuilderContext<HTMLUListElement> = {},
|
||||||
elementAllocator: @Composable ElementScope<HTMLUListElement>.(T) -> Unit
|
elementAllocator: @Composable ElementScope<HTMLUListElement>.(T) -> Unit
|
||||||
) = Nav(
|
) = Nav(
|
||||||
@@ -214,6 +222,7 @@ fun <T> SubNav(
|
|||||||
duration,
|
duration,
|
||||||
besidesTitleAndList,
|
besidesTitleAndList,
|
||||||
titleCustomizer,
|
titleCustomizer,
|
||||||
|
afterTitleContentBuilder,
|
||||||
ulCustomizer,
|
ulCustomizer,
|
||||||
elementAllocator
|
elementAllocator
|
||||||
)
|
)
|
||||||
@@ -223,6 +232,7 @@ fun NavHeader(
|
|||||||
text: String,
|
text: String,
|
||||||
vararg modifiers: UIKitModifier,
|
vararg modifiers: UIKitModifier,
|
||||||
attributesCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
attributesCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
||||||
|
afterTitleContentBuilder: ContentBuilder<HTMLLIElement> = {}
|
||||||
) {
|
) {
|
||||||
Li(
|
Li(
|
||||||
{
|
{
|
||||||
@@ -231,6 +241,7 @@ fun NavHeader(
|
|||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
Text(text)
|
Text(text)
|
||||||
|
afterTitleContentBuilder()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,6 +249,7 @@ fun NavHeader(
|
|||||||
fun NavItemElement(
|
fun NavItemElement(
|
||||||
vararg modifiers: UIKitModifier,
|
vararg modifiers: UIKitModifier,
|
||||||
attributesCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
attributesCustomizer: AttrBuilderContext<HTMLLIElement> = {},
|
||||||
|
anchorAttributesCustomizer: AttrBuilderContext<HTMLAnchorElement> = {},
|
||||||
contentAllocator: ContentBuilder<HTMLAnchorElement>
|
contentAllocator: ContentBuilder<HTMLAnchorElement>
|
||||||
) {
|
) {
|
||||||
Li(
|
Li(
|
||||||
@@ -246,7 +258,7 @@ fun NavItemElement(
|
|||||||
attributesCustomizer()
|
attributesCustomizer()
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
A("#") {
|
A("#", attrs = anchorAttributesCustomizer) {
|
||||||
contentAllocator()
|
contentAllocator()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
package dev.inmo.jsuikit.modifiers
|
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"))
|
||||||
|
}
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
package dev.inmo.jsuikit.modifiers
|
package dev.inmo.jsuikit.modifiers
|
||||||
|
|
||||||
|
import dev.inmo.jsuikit.types.DropdownOptions
|
||||||
|
import dev.inmo.jsuikit.utils.Milliseconds
|
||||||
|
import dev.inmo.jsuikit.utils.buildAttribute
|
||||||
|
|
||||||
sealed class UIKitDropdown(classname: String) : UIKitModifier {
|
sealed class UIKitDropdown(classname: String) : UIKitModifier {
|
||||||
override val classes: Array<String> = arrayOf(classname)
|
override val classes: Array<String> = arrayOf(classname)
|
||||||
|
|
||||||
@@ -50,6 +54,9 @@ sealed class UIKitDropdown(classname: String) : UIKitModifier {
|
|||||||
object Click : Mode("click")
|
object Click : Mode("click")
|
||||||
object Hover : Mode("hover")
|
object Hover : Mode("hover")
|
||||||
|
|
||||||
|
object None : Mode("")
|
||||||
|
object HoverAndClick : Mode("$Hover, $Click")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed class Flip(name: String) : AttributeValue(name) {
|
sealed class Flip(name: String) : AttributeValue(name) {
|
||||||
@@ -61,4 +68,48 @@ sealed class UIKitDropdown(classname: String) : UIKitModifier {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Custom(
|
||||||
|
dropdownOptions: DropdownOptions
|
||||||
|
) : UIKitDropdown("uk-dropdown") {
|
||||||
|
override val otherAttrs: Map<String, String> = mapOf(
|
||||||
|
buildAttribute(
|
||||||
|
"uk-dropdown"
|
||||||
|
) {
|
||||||
|
dropdownOptions.includeParameters(this)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
operator fun invoke(
|
||||||
|
dropdownOptions: DropdownOptions
|
||||||
|
) = Custom(dropdownOptions)
|
||||||
|
operator fun invoke(
|
||||||
|
toggle: String? = null,
|
||||||
|
pos: Position? = null,
|
||||||
|
mode: Mode? = null,
|
||||||
|
delayShow: Milliseconds? = null,
|
||||||
|
delayHide: Milliseconds? = null,
|
||||||
|
boundary: String? = null,
|
||||||
|
boundaryAlign: Boolean? = null,
|
||||||
|
flip: Flip? = null,
|
||||||
|
offset: Int? = null,
|
||||||
|
animation: UIKitAnimation? = null,
|
||||||
|
duration: Milliseconds? = null,
|
||||||
|
) = Custom(
|
||||||
|
DropdownOptions(
|
||||||
|
toggle = toggle,
|
||||||
|
pos = pos,
|
||||||
|
mode = mode,
|
||||||
|
delayShow = delayShow,
|
||||||
|
delayHide = delayHide,
|
||||||
|
boundary = boundary,
|
||||||
|
boundaryAlign = boundaryAlign,
|
||||||
|
flip = flip,
|
||||||
|
offset = offset,
|
||||||
|
animation = animation,
|
||||||
|
duration = duration
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
46
src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitList.kt
Normal file
46
src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitList.kt
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package dev.inmo.jsuikit.modifiers
|
||||||
|
|
||||||
|
sealed class UIKitList(
|
||||||
|
vararg classes: String,
|
||||||
|
override val otherAttrs: Map<String, String> = emptyMap()
|
||||||
|
) : UIKitModifier {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
override val classes: Array<String> = classes as Array<String>
|
||||||
|
|
||||||
|
sealed class Style(vararg classes: String) : UIKitList(*classes) {
|
||||||
|
|
||||||
|
object Disc : Style("uk-list-disc")
|
||||||
|
object Circle : Style("uk-list-circle")
|
||||||
|
object Square : Style("uk-list-square")
|
||||||
|
object Decimal : Style("uk-list-decimal")
|
||||||
|
object Hyphen : Style("uk-list-hyphen")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class Size(vararg classes: String) : UIKitList(*classes) {
|
||||||
|
|
||||||
|
object Large : Size("uk-list-large")
|
||||||
|
object Collapse : Size("uk-list-collapse")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class Color(vararg classes: String) : UIKitList(*classes) {
|
||||||
|
|
||||||
|
object Muted : Color("uk-list-muted")
|
||||||
|
object Emphasis : Color("uk-list-emphasis")
|
||||||
|
object Primary : Color("uk-list-primary")
|
||||||
|
object Secondary : Color("uk-list-secondary")
|
||||||
|
companion object {
|
||||||
|
val Bullet = UIKitList.Bullet
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
object Bullet: UIKitList("uk-list-bullet")
|
||||||
|
|
||||||
|
object Divider: UIKitList("uk-list-divider")
|
||||||
|
|
||||||
|
object Striped: UIKitList("uk-list-striped")
|
||||||
|
|
||||||
|
companion object : UIKitList("uk-list")
|
||||||
|
}
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
package dev.inmo.jsuikit.modifiers
|
package dev.inmo.jsuikit.modifiers
|
||||||
|
|
||||||
|
import dev.inmo.jsuikit.utils.Attrs
|
||||||
import org.jetbrains.compose.web.attributes.AttrsScope
|
import org.jetbrains.compose.web.attributes.AttrsScope
|
||||||
|
import org.jetbrains.compose.web.dom.AttrBuilderContext
|
||||||
|
import org.w3c.dom.Element
|
||||||
|
|
||||||
interface UIKitModifier {
|
interface UIKitModifier {
|
||||||
val classes: Array<String>
|
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) } }
|
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
|
||||||
|
|||||||
@@ -8,7 +8,10 @@ sealed class UIKitPadding(suffix: String?) : UIKitModifier {
|
|||||||
object Small : Size("small")
|
object Small : Size("small")
|
||||||
object Large : Size("large")
|
object Large : Size("large")
|
||||||
|
|
||||||
companion object : Size(null)
|
companion object : Size(null) {
|
||||||
|
val Default
|
||||||
|
get() = this
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,5 +28,6 @@ sealed class UIKitPadding(suffix: String?) : UIKitModifier {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
companion object : Size(null)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
44
src/jsMain/kotlin/dev/inmo/jsuikit/types/Dropdown.kt
Normal file
44
src/jsMain/kotlin/dev/inmo/jsuikit/types/Dropdown.kt
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
package dev.inmo.jsuikit.types
|
||||||
|
|
||||||
|
import dev.inmo.jsuikit.modifiers.UIKitAnimation
|
||||||
|
import dev.inmo.jsuikit.modifiers.UIKitDropdown
|
||||||
|
import dev.inmo.jsuikit.utils.*
|
||||||
|
|
||||||
|
external interface Dropdown {
|
||||||
|
fun show()
|
||||||
|
fun hide(delay: Boolean = definedExternally)
|
||||||
|
fun hide(delay: Milliseconds)
|
||||||
|
}
|
||||||
|
|
||||||
|
data class DropdownOptions(
|
||||||
|
private val toggle: String? = null,
|
||||||
|
private val pos: UIKitDropdown.Position? = null,
|
||||||
|
private val mode: UIKitDropdown.Mode? = null,
|
||||||
|
private val delayShow: Milliseconds? = null,
|
||||||
|
private val delayHide: Milliseconds? = null,
|
||||||
|
private val boundary: String? = null,
|
||||||
|
private val boundaryAlign: Boolean? = null,
|
||||||
|
private val flip: UIKitDropdown.Flip? = null,
|
||||||
|
private val offset: Int? = null,
|
||||||
|
private val animation: UIKitAnimation? = null,
|
||||||
|
private val duration: Milliseconds? = null,
|
||||||
|
) {
|
||||||
|
fun includeParameters(parametersBuilder: ParametersBuilder) {
|
||||||
|
with(parametersBuilder) {
|
||||||
|
"toggle" to toggle
|
||||||
|
"pos" to pos
|
||||||
|
"mode" to mode
|
||||||
|
"delayShow" to delayShow
|
||||||
|
"delayHide" to delayHide
|
||||||
|
"boundary" to boundary
|
||||||
|
"boundaryAlign" to boundaryAlign
|
||||||
|
"flip" to flip
|
||||||
|
"offset" to offset
|
||||||
|
"animation" to animation
|
||||||
|
"duration" to duration
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fun parameters() = buildParametersWithoutNulls {
|
||||||
|
includeParameters(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,4 +13,7 @@ external interface UIKit {
|
|||||||
|
|
||||||
fun modal(element: Element): UIKitDialog
|
fun modal(element: Element): UIKitDialog
|
||||||
fun modal(selector: String): UIKitDialog?
|
fun modal(selector: String): UIKitDialog?
|
||||||
|
|
||||||
|
fun dropdown(element: Element, options: DropdownOptions = definedExternally): Dropdown
|
||||||
|
fun dropdown(selector: String, options: DropdownOptions = definedExternally): Dropdown?
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,26 +2,24 @@ package dev.inmo.jsuikit.utils
|
|||||||
|
|
||||||
class AttributeBuilder (
|
class AttributeBuilder (
|
||||||
val attributeName: String,
|
val attributeName: String,
|
||||||
val skipNullValues: Boolean = true,
|
val parametersBuilder: ParametersBuilder
|
||||||
private val parametersPreset: MutableMap<String, String?> = mutableMapOf()
|
|
||||||
) {
|
) {
|
||||||
|
fun build(): Pair<String, String> = parametersBuilder.build().run {
|
||||||
fun add(k: String, v: Any? = null) {
|
Pair(
|
||||||
if (v != null || !skipNullValues) {
|
attributeName, toList().joinToString(";") {
|
||||||
parametersPreset[k] = v ?.toString()
|
"${it.first}${it.second ?.let { ": $it" } ?: ""}"
|
||||||
}
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
infix fun String.to(value: Any?) = add(this, value)
|
|
||||||
operator fun String.unaryPlus() = add(this, null)
|
|
||||||
|
|
||||||
fun build(): Pair<String, String> = Pair(
|
|
||||||
attributeName, parametersPreset.toList().joinToString(";") {
|
|
||||||
"${it.first}${it.second ?.let { ": $it" } ?: ""}"
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun buildAttribute(attributeName: String, skipNullValues: Boolean = true, block: AttributeBuilder.() -> Unit) = AttributeBuilder(
|
inline fun buildAttribute(
|
||||||
|
attributeName: String,
|
||||||
|
skipNullValues: Boolean = true,
|
||||||
|
block: ParametersBuilder.() -> Unit
|
||||||
|
) = AttributeBuilder(
|
||||||
attributeName,
|
attributeName,
|
||||||
skipNullValues
|
ParametersBuilder(skipNullValues)
|
||||||
).apply(block).build()
|
).apply {
|
||||||
|
parametersBuilder.block()
|
||||||
|
}.build()
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package dev.inmo.jsuikit.utils
|
||||||
|
|
||||||
|
|
||||||
|
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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
infix fun String.to(value: Any?) = add(this, value)
|
||||||
|
operator fun String.unaryPlus() = add(this, null)
|
||||||
|
|
||||||
|
operator fun Map<String, String?>.unaryPlus() = forEach {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun build() = parameters.toMap()
|
||||||
|
fun buildNotNullable() = parameters.mapNotNull { (k, v) ->
|
||||||
|
if (v != null) {
|
||||||
|
Pair(k, v)
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}.toMap()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun buildParameters(
|
||||||
|
skipNullValues: Boolean = true,
|
||||||
|
block: ParametersBuilder.() -> Unit
|
||||||
|
) = ParametersBuilder(skipNullValues).apply(block).build()
|
||||||
|
|
||||||
|
fun buildParametersWithoutNulls(
|
||||||
|
skipNullValues: Boolean = true,
|
||||||
|
block: ParametersBuilder.() -> Unit
|
||||||
|
) = ParametersBuilder(skipNullValues).apply(block).buildNotNullable()
|
||||||
Reference in New Issue
Block a user