mirror of
https://github.com/InsanusMokrassar/JSUIKitKBindings.git
synced 2025-12-16 03:05:44 +00:00
Compare commits
43 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5afa92ef37 | |||
| 4377ec3969 | |||
| 674fbbd4d5 | |||
| efd9cb80e1 | |||
| 53b020ab8d | |||
| 67a6998f02 | |||
| abe44fe1c6 | |||
| b028b12103 | |||
| 816f341729 | |||
| 6a652249c0 | |||
| ec584798ad | |||
| faf238cf07 | |||
| d78acce3c5 | |||
| 3afe6c2815 | |||
| 29efe4b5cd | |||
| 990bd6385f | |||
| deb30957ac | |||
| 276eaddcac | |||
| 9b992cbda0 | |||
| e227d3c88e | |||
| fc4f937cc1 | |||
| 1ee9b8c4de | |||
| 90e27d0cab | |||
| 400724c918 | |||
| ea59ba1446 | |||
| a97898fe69 | |||
| 21d2ccf208 | |||
| fd6a122b40 | |||
| 6b4e141cd2 | |||
| fb5e0ade11 | |||
| 353314dd26 | |||
| 57ffe32b9f | |||
| c6bacffdb3 | |||
| 3e2aa22076 | |||
| 5842da03d0 | |||
| 6daa57fe8f | |||
| 8adbe8a1ca | |||
| 468f167ac6 | |||
| c41e2b8495 | |||
| 7cdd12e81e | |||
| f3ce0f6b6b | |||
| d24edcbaf7 | |||
| fdd98bab13 |
33
CHANGELOG.md
33
CHANGELOG.md
@@ -1,5 +1,38 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.1.4
|
||||||
|
|
||||||
|
* Improvements in `UIKitGrid`
|
||||||
|
* Add support of `UIKitSticky`
|
||||||
|
|
||||||
|
## 0.1.3
|
||||||
|
|
||||||
|
* Add support of sections
|
||||||
|
* Improve support of navbars
|
||||||
|
|
||||||
|
## 0.1.2
|
||||||
|
|
||||||
|
* New typealias `AttrsWithContentBuilder`
|
||||||
|
* Old `DList` and related composable functions removed (they are built-in in compose)
|
||||||
|
|
||||||
|
## 0.1.1
|
||||||
|
|
||||||
|
* `Compose`: `1.2.0-alpha01-dev686`
|
||||||
|
|
||||||
|
## 0.1.0
|
||||||
|
|
||||||
|
* `Kotlin` = `1.6.21`
|
||||||
|
* `Compose`: `1.2.0-alpha01-dev683`
|
||||||
|
|
||||||
|
## 0.0.53
|
||||||
|
|
||||||
|
* Improvements in `UIKitPadding`
|
||||||
|
* Add support of UIKit lists
|
||||||
|
|
||||||
|
## 0.0.52
|
||||||
|
|
||||||
|
* Improve work with UIKitModifiers
|
||||||
|
|
||||||
## 0.0.51
|
## 0.0.51
|
||||||
|
|
||||||
* New interface `Dropdown` which will be used to create (or retrieve) dropdown for an element
|
* New interface `Dropdown` which will be used to create (or retrieve) dropdown for an 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.51
|
version=0.1.4
|
||||||
|
|||||||
@@ -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-dev686"
|
||||||
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
|
||||||
|
|||||||
@@ -4,8 +4,7 @@ import androidx.compose.runtime.Composable
|
|||||||
import dev.inmo.jsuikit.modifiers.UIKitDescriptionList
|
import dev.inmo.jsuikit.modifiers.UIKitDescriptionList
|
||||||
import dev.inmo.jsuikit.modifiers.include
|
import dev.inmo.jsuikit.modifiers.include
|
||||||
import dev.inmo.jsuikit.utils.*
|
import dev.inmo.jsuikit.utils.*
|
||||||
import org.jetbrains.compose.web.dom.ContentBuilder
|
import org.jetbrains.compose.web.dom.*
|
||||||
import org.jetbrains.compose.web.dom.ElementScope
|
|
||||||
import org.w3c.dom.HTMLDListElement
|
import org.w3c.dom.HTMLDListElement
|
||||||
import org.w3c.dom.HTMLElement
|
import org.w3c.dom.HTMLElement
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import org.w3c.dom.HTMLDivElement
|
|||||||
@Composable
|
@Composable
|
||||||
fun DropArea(
|
fun DropArea(
|
||||||
attrs: Attrs<HTMLDivElement> = Attrs.empty(),
|
attrs: Attrs<HTMLDivElement> = Attrs.empty(),
|
||||||
inputAttrs: InputAttrs<String> = Attrs.empty(),
|
inputAttrs: InputAttrs<String> = InputAttrs.empty(),
|
||||||
contentBuilder: ContentBuilder<HTMLDivElement> = {}
|
contentBuilder: ContentBuilder<HTMLDivElement> = {}
|
||||||
) = Div(
|
) = Div(
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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,35 +1,76 @@
|
|||||||
package dev.inmo.jsuikit.elements
|
package dev.inmo.jsuikit.elements
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import dev.inmo.jsuikit.modifiers.UIKitModifier
|
import dev.inmo.jsuikit.modifiers.*
|
||||||
import dev.inmo.jsuikit.modifiers.include
|
import dev.inmo.jsuikit.utils.*
|
||||||
import org.jetbrains.compose.web.dom.*
|
import org.jetbrains.compose.web.dom.*
|
||||||
|
import org.w3c.dom.HTMLDivElement
|
||||||
import org.w3c.dom.HTMLElement
|
import org.w3c.dom.HTMLElement
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun Navbar(
|
fun Navbar(
|
||||||
leftBuilder: NavbarNavBuilder? = null,
|
attributesCustomizer: AttrBuilderContext<HTMLElement> = {},
|
||||||
|
contentBuilder: ContentBuilder<HTMLElement>
|
||||||
|
) {
|
||||||
|
Nav(
|
||||||
|
{
|
||||||
|
include(UIKitNavbar, UIKitNavbar(), UIKitNavbar.Container)
|
||||||
|
attributesCustomizer()
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
contentBuilder()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated("Will be removed soon. Use the variant with AttrsWithContentBuilders")
|
||||||
|
@Composable
|
||||||
|
fun Navbar(
|
||||||
|
leftBuilder: NavbarNavBuilder?,
|
||||||
centerBuilder: NavbarNavBuilder? = null,
|
centerBuilder: NavbarNavBuilder? = null,
|
||||||
rightBuilder: NavbarNavBuilder? = null,
|
rightBuilder: NavbarNavBuilder? = null,
|
||||||
vararg navModifiers: UIKitModifier,
|
vararg navModifiers: UIKitModifier,
|
||||||
attributesCustomizer: AttrBuilderContext<HTMLElement> = {},
|
attributesCustomizer: AttrBuilderContext<HTMLElement> = {},
|
||||||
) {
|
) {
|
||||||
Nav(
|
Navbar(
|
||||||
{
|
{
|
||||||
attr("uk-navbar", "")
|
|
||||||
classes("uk-navbar-container", "uk-navbar")
|
|
||||||
include(*navModifiers)
|
include(*navModifiers)
|
||||||
attributesCustomizer()
|
attributesCustomizer()
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
leftBuilder ?.let {
|
leftBuilder ?.let {
|
||||||
Div({ classes("uk-navbar-left") }) { it.draw() }
|
Div({ include(UIKitNavbar.Alignment.Left) }) { it.draw() }
|
||||||
}
|
}
|
||||||
centerBuilder ?.let {
|
centerBuilder ?.let {
|
||||||
Div({ classes("uk-navbar-center") }) { it.draw() }
|
Div({ include(UIKitNavbar.Alignment.Center) }) { it.draw() }
|
||||||
}
|
}
|
||||||
rightBuilder ?.let {
|
rightBuilder ?.let {
|
||||||
Div({ classes("uk-navbar-right") }) { it.draw() }
|
Div({ include(UIKitNavbar.Alignment.Right) }) { it.draw() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun Navbar(
|
||||||
|
leftBuilder: AttrsWithContentBuilder<HTMLDivElement>? = null,
|
||||||
|
centerBuilder: AttrsWithContentBuilder<HTMLDivElement>? = null,
|
||||||
|
rightBuilder: AttrsWithContentBuilder<HTMLDivElement>? = null,
|
||||||
|
vararg navModifiers: UIKitModifier,
|
||||||
|
attributesCustomizer: AttrBuilderContext<HTMLElement> = {},
|
||||||
|
) {
|
||||||
|
Navbar(
|
||||||
|
attributesCustomizer = {
|
||||||
|
include(*navModifiers)
|
||||||
|
attributesCustomizer()
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
leftBuilder ?.let {
|
||||||
|
Div({ include(UIKitNavbar.Alignment.Left);leftBuilder.attributesBuilderContext(this) }, leftBuilder.builder)
|
||||||
|
}
|
||||||
|
centerBuilder ?.let {
|
||||||
|
Div({ include(UIKitNavbar.Alignment.Center);centerBuilder.attributesBuilderContext(this) }, centerBuilder.builder)
|
||||||
|
}
|
||||||
|
rightBuilder ?.let {
|
||||||
|
Div({ include(UIKitNavbar.Alignment.Right);rightBuilder.attributesBuilderContext(this) }, rightBuilder.builder)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,37 @@
|
|||||||
package dev.inmo.jsuikit.elements
|
package dev.inmo.jsuikit.elements
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import dev.inmo.jsuikit.modifiers.UIKitModifier
|
import dev.inmo.jsuikit.modifiers.*
|
||||||
import dev.inmo.jsuikit.modifiers.include
|
import dev.inmo.jsuikit.utils.*
|
||||||
import org.jetbrains.compose.web.attributes.AttrsScope
|
import org.jetbrains.compose.web.attributes.AttrsScope
|
||||||
import org.jetbrains.compose.web.dom.*
|
import org.jetbrains.compose.web.dom.*
|
||||||
import org.w3c.dom.HTMLLIElement
|
import org.w3c.dom.HTMLLIElement
|
||||||
import org.w3c.dom.HTMLUListElement
|
import org.w3c.dom.HTMLUListElement
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun NavbarNav(
|
||||||
|
elements: List<AttrsWithContentBuilder<HTMLLIElement>>,
|
||||||
|
attrs: Attrs<HTMLUListElement> = Attrs.empty()
|
||||||
|
) {
|
||||||
|
Ul(
|
||||||
|
{
|
||||||
|
include(UIKitNavbar.Nav)
|
||||||
|
attrs.builder(this)
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
elements.forEach { element ->
|
||||||
|
Li(element.attributesBuilderContext, element.builder)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun NavbarNav(
|
||||||
|
vararg elements: AttrsWithContentBuilder<HTMLLIElement>,
|
||||||
|
attrs: Attrs<HTMLUListElement> = Attrs.empty()
|
||||||
|
) = NavbarNav(elements.toList(), attrs)
|
||||||
|
|
||||||
|
@Deprecated("Will be removed soon. Use NavbarNavPart with AttrsWithContentBuilder instead")
|
||||||
interface NavbarNavElement {
|
interface NavbarNavElement {
|
||||||
fun AttrsScope<HTMLLIElement>.setup() {}
|
fun AttrsScope<HTMLLIElement>.setup() {}
|
||||||
@Composable
|
@Composable
|
||||||
@@ -28,6 +52,7 @@ interface NavbarNavElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated("Will be removed soon. Use NavbarNavPart with AttrsWithContentBuilder instead")
|
||||||
class NavbarNavBuilder(
|
class NavbarNavBuilder(
|
||||||
private val modifiers: Array<UIKitModifier>,
|
private val modifiers: Array<UIKitModifier>,
|
||||||
private val elements: List<NavbarNavElement>,
|
private val elements: List<NavbarNavElement>,
|
||||||
@@ -46,8 +71,7 @@ class NavbarNavBuilder(
|
|||||||
fun draw() {
|
fun draw() {
|
||||||
Ul(
|
Ul(
|
||||||
{
|
{
|
||||||
classes("uk-navbar-nav")
|
include(UIKitNavbar.Nav, *modifiers)
|
||||||
include(*modifiers)
|
|
||||||
attributesCustomizer()
|
attributesCustomizer()
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -1,20 +1,41 @@
|
|||||||
package dev.inmo.jsuikit.modifiers
|
package dev.inmo.jsuikit.modifiers
|
||||||
|
|
||||||
sealed class UIKitGrid(suffix: String) : UIKitModifier {
|
import dev.inmo.jsuikit.utils.buildAttribute
|
||||||
override val classes: Array<String> = arrayOf("uk-grid-$suffix")
|
|
||||||
|
|
||||||
sealed class Gap(suffix: String) : UIKitGrid(suffix) {
|
sealed class UIKitGrid(vararg classnames: String) : UIKitModifier {
|
||||||
|
override val classes: Array<String> = classnames as Array<String>
|
||||||
|
|
||||||
object Small : Gap("small")
|
sealed class Gap(classname: String) : UIKitGrid(classname) {
|
||||||
object Medium : Gap("medium")
|
|
||||||
object Large : Gap("large")
|
object Small : Gap("uk-grid-small")
|
||||||
object Collapse : Gap("collapse")
|
object Medium : Gap("uk-grid-medium")
|
||||||
|
object Large : Gap("uk-grid-large")
|
||||||
|
object Collapse : Gap("uk-grid-collapse")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
object Divider : UIKitGrid("divider")
|
object Divider : UIKitGrid("uk-grid-divider")
|
||||||
|
|
||||||
object MatchHeight : UIKitGrid("match")
|
object MatchHeight : UIKitGrid("uk-grid-match")
|
||||||
object ItemMatchHeight : UIKitGrid("item-match")
|
object ItemMatchHeight : UIKitGrid("uk-grid-item-match")
|
||||||
|
|
||||||
|
class Custom internal constructor(override val otherAttrs: Map<String, String>) : UIKitGrid()
|
||||||
|
|
||||||
|
companion object : UIKitGrid("uk-grid") {
|
||||||
|
operator fun invoke(
|
||||||
|
margin: UIKitMargin? = null,
|
||||||
|
firstColumnClass: String? = null,
|
||||||
|
masonry: Boolean? = null,
|
||||||
|
parallax: UInt? = null
|
||||||
|
) = Custom(
|
||||||
|
mapOf(
|
||||||
|
buildAttribute("uk-grid") {
|
||||||
|
margin to margin ?.classes ?.joinToString(" ")
|
||||||
|
"first-column" to firstColumnClass
|
||||||
|
"masonry" to masonry
|
||||||
|
"parallax" to parallax
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
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")
|
||||||
|
}
|
||||||
@@ -26,8 +26,8 @@ operator fun UIKitModifier.plus(other: UIKitModifier): UIKitModifier = UIKitCust
|
|||||||
classes + other.classes,
|
classes + other.classes,
|
||||||
otherAttrs + other.otherAttrs
|
otherAttrs + other.otherAttrs
|
||||||
)
|
)
|
||||||
fun <T: Element> UIKitModifier.builder() = Attrs<T>(this).builder
|
fun <T: Element> UIKitModifier?.builder() = Attrs<T>(this).builder
|
||||||
fun <T: Element> Array<out 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>()
|
inline fun <T: Element> attrsBuilder(vararg modifiers: UIKitModifier?) = modifiers.builder<T>()
|
||||||
@JsName("plusBuilder")
|
@JsName("plusBuilder")
|
||||||
operator fun <T: Element> UIKitModifier.plus(other: UIKitModifier): AttrBuilderContext<T> = Attrs<T>(this@plus, other).builder
|
operator fun <T: Element> UIKitModifier?.plus(other: UIKitModifier?): AttrBuilderContext<T> = Attrs<T>(this@plus, other).builder
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ sealed class UIKitNav(classname: String) : UIKitModifier {
|
|||||||
|
|
||||||
object Center : UIKitNav("uk-nav-center")
|
object Center : UIKitNav("uk-nav-center")
|
||||||
|
|
||||||
|
object Sub : UIKitNav("uk-nav-sub")
|
||||||
|
|
||||||
companion object : UIKitNav("uk-nav") {
|
companion object : UIKitNav("uk-nav") {
|
||||||
val SubNav = UIKitSubNav
|
val SubNav = UIKitSubNav
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,86 @@
|
|||||||
package dev.inmo.jsuikit.modifiers
|
package dev.inmo.jsuikit.modifiers
|
||||||
|
|
||||||
sealed class UIKitNavbar(suffix: String) : UIKitModifier {
|
import dev.inmo.jsuikit.types.Dropdown
|
||||||
override val classes: Array<String> = arrayOf("uk-navbar-$suffix")
|
import dev.inmo.jsuikit.utils.*
|
||||||
|
|
||||||
object Transparent : UIKitNavbar("transparent")
|
sealed class UIKitNavbar(vararg classes: String) : UIKitModifier {
|
||||||
sealed class Dropdown(suffix: String?) : UIKitNavbar("dropdown${suffix ?.let { "-$it" } ?: ""}") {
|
override val classes: Array<String> = classes as Array<String>
|
||||||
|
|
||||||
|
object Transparent : UIKitNavbar("uk-navbar-transparent")
|
||||||
|
object Container : UIKitNavbar("uk-navbar-container")
|
||||||
|
sealed class Dropdown(suffix: String?) : UIKitNavbar("uk-navbar-dropdown${suffix ?.let { "-$it" } ?: ""}") {
|
||||||
object Nav : Dropdown("nav")
|
object Nav : Dropdown("nav")
|
||||||
|
|
||||||
|
sealed class Width(suffix: String) : Dropdown(suffix) {
|
||||||
|
object Two : Width("width-2")
|
||||||
|
object Three : Width("width-3")
|
||||||
|
object Four : Width("width-4")
|
||||||
|
object Five : Width("width-5")
|
||||||
|
}
|
||||||
|
|
||||||
companion object : Dropdown(null)
|
companion object : Dropdown(null)
|
||||||
}
|
}
|
||||||
object Item : UIKitNavbar("item")
|
sealed class Alignment(val suffix: String) : UIKitNavbar("uk-navbar-$suffix") {
|
||||||
|
object Left : Alignment("left")
|
||||||
|
sealed class Center(suffix: String) : Alignment(suffix) {
|
||||||
|
object Left : Center("center-left")
|
||||||
|
object Right : Center("center-right")
|
||||||
|
|
||||||
companion object {
|
companion object : Center("center")
|
||||||
|
}
|
||||||
|
object Right : Alignment("right")
|
||||||
|
}
|
||||||
|
object Item : UIKitNavbar("uk-navbar-item")
|
||||||
|
object Nav : UIKitNavbar("uk-navbar-nav")
|
||||||
|
object Subtitle : UIKitNavbar("uk-navbar-subtitle")
|
||||||
|
object Toggle : UIKitNavbar("uk-navbar-toggle")
|
||||||
|
object Sticky : UIKitNavbar("uk-navbar-sticky")
|
||||||
|
|
||||||
|
class Component internal constructor(
|
||||||
|
override val otherAttrs: Map<String, String>
|
||||||
|
) : UIKitNavbar(*UIKitNavbar.classes)
|
||||||
|
|
||||||
|
companion object : UIKitNavbar("uk-navbar") {
|
||||||
val Logo = UIKitUtility.Logo
|
val Logo = UIKitUtility.Logo
|
||||||
|
|
||||||
|
operator fun invoke(
|
||||||
|
align: String?,
|
||||||
|
mode: String? = null,
|
||||||
|
delayShow: Milliseconds? = null,
|
||||||
|
delayHide: Milliseconds? = null,
|
||||||
|
boundary: String? = null,
|
||||||
|
boundaryAlign: Boolean? = null,
|
||||||
|
offset: Pixels? = null,
|
||||||
|
dropbar: Boolean? = null,
|
||||||
|
duration: Milliseconds? = null
|
||||||
|
): Component {
|
||||||
|
return Component(
|
||||||
|
mapOf(
|
||||||
|
buildAttribute(UIKitNavbar.classes.first()) {
|
||||||
|
"align" to align
|
||||||
|
"mode" to mode
|
||||||
|
"delay-show" to delayShow
|
||||||
|
"delay-hide" to delayHide
|
||||||
|
"boundary" to boundary
|
||||||
|
"boundary-align" to boundaryAlign
|
||||||
|
"offset" to offset
|
||||||
|
"dropbar" to dropbar
|
||||||
|
"duration" to duration
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
operator fun invoke(
|
||||||
|
align: Alignment? = null,
|
||||||
|
mode: UIKitDropdown.Mode? = null,
|
||||||
|
delayShow: Milliseconds? = null,
|
||||||
|
delayHide: Milliseconds? = null,
|
||||||
|
boundary: String? = null,
|
||||||
|
boundaryAlign: Boolean? = null,
|
||||||
|
offset: Pixels? = null,
|
||||||
|
dropbar: Boolean? = null,
|
||||||
|
duration: Milliseconds? = null
|
||||||
|
): Component = invoke(align ?.suffix, mode ?.name, delayShow, delayHide, boundary, boundaryAlign, offset, dropbar, duration)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
23
src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitSection.kt
Normal file
23
src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitSection.kt
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package dev.inmo.jsuikit.modifiers
|
||||||
|
|
||||||
|
sealed class UIKitSection(vararg classes: String) : UIKitModifier {
|
||||||
|
override val classes: Array<String> = classes as Array<String>
|
||||||
|
|
||||||
|
sealed class Style(suffix: String) : UIKitSection("uk-section-$suffix") {
|
||||||
|
object Default : Style("default")
|
||||||
|
object Muted : Style("muted")
|
||||||
|
object Primary : Style("primary")
|
||||||
|
object Secondary : Style("secondary")
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class Size(suffix: String) : UIKitSection("uk-section-$suffix") {
|
||||||
|
object XSmall : Size("xsmall")
|
||||||
|
object Small : Size("small")
|
||||||
|
object Large : Size("large")
|
||||||
|
object XLarge : Size("xlarge")
|
||||||
|
}
|
||||||
|
|
||||||
|
object Overlap : UIKitSection("uk-section-overlap")
|
||||||
|
|
||||||
|
companion object : UIKitSection("uk-section")
|
||||||
|
}
|
||||||
47
src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitSticky.kt
Normal file
47
src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitSticky.kt
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
package dev.inmo.jsuikit.modifiers
|
||||||
|
|
||||||
|
import dev.inmo.jsuikit.utils.buildAttribute
|
||||||
|
import org.jetbrains.compose.web.css.CSSUnitLengthOrPercentage
|
||||||
|
import org.jetbrains.compose.web.css.CSSUnitValueTyped
|
||||||
|
|
||||||
|
sealed class UIKitSticky(
|
||||||
|
position: Position? = null,
|
||||||
|
start: String? = null,
|
||||||
|
end: String? = null,
|
||||||
|
offset: CSSUnitValueTyped<CSSUnitLengthOrPercentage>? = null,
|
||||||
|
overflowFlip: Boolean? = null,
|
||||||
|
animation: UIKitAnimation? = null,
|
||||||
|
classForActiveItems: String? = null,
|
||||||
|
classForInactiveItems: String? = null,
|
||||||
|
showOnUp: Boolean? = null,
|
||||||
|
media: String? = null,
|
||||||
|
targetOffset: CSSUnitValueTyped<CSSUnitLengthOrPercentage>? = null
|
||||||
|
) : UIKitModifier {
|
||||||
|
override val otherAttrs: Map<String, String> = mapOf(
|
||||||
|
buildAttribute("uk-sticky") {
|
||||||
|
"position" to position ?.name
|
||||||
|
"start" to start
|
||||||
|
"end" to end
|
||||||
|
"offset" to offset ?.toString()
|
||||||
|
"overflow-flip" to overflowFlip
|
||||||
|
"animation" to animation
|
||||||
|
"cls-active" to classForActiveItems
|
||||||
|
"cls-inactive" to classForInactiveItems
|
||||||
|
"show-on-up" to showOnUp
|
||||||
|
"media" to media
|
||||||
|
"target-offset" to targetOffset ?.toString()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
sealed interface Position {
|
||||||
|
val name: String
|
||||||
|
object Top : Position {
|
||||||
|
override val name: String
|
||||||
|
get() = "top"
|
||||||
|
}
|
||||||
|
object Bottom : Position {
|
||||||
|
override val name: String
|
||||||
|
get() = "bottom"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -38,7 +38,10 @@ sealed class UIKitUtility(classname: String) : UIKitModifier {
|
|||||||
object Width : Responsive("width")
|
object Width : Responsive("width")
|
||||||
object Height : Responsive("height")
|
object Height : Responsive("height")
|
||||||
}
|
}
|
||||||
object PreserveWidth : UIKitUtility("uk-preserve-width")
|
sealed class Preserve(suffix: String) : UIKitUtility("uk-preserve-$suffix") {
|
||||||
|
object Width : Preserve("width")
|
||||||
|
object Color : Preserve("color")
|
||||||
|
}
|
||||||
|
|
||||||
sealed class Border(suffix: String) : UIKitUtility("uk-border-$suffix") {
|
sealed class Border(suffix: String) : UIKitUtility("uk-border-$suffix") {
|
||||||
object Rounded : Border("rounded")
|
object Rounded : Border("rounded")
|
||||||
@@ -112,4 +115,8 @@ sealed class UIKitUtility(classname: String) : UIKitModifier {
|
|||||||
|
|
||||||
object Open : UIKitUtility("uk-open")
|
object Open : UIKitUtility("uk-open")
|
||||||
object Link : UIKitUtility("uk-link")
|
object Link : UIKitUtility("uk-link")
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val PreserveWidth = Preserve.Width
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package dev.inmo.jsuikit.utils
|
||||||
|
|
||||||
|
import dev.inmo.jsuikit.modifiers.UIKitModifier
|
||||||
|
import org.jetbrains.compose.web.attributes.AttrsScope
|
||||||
|
import org.jetbrains.compose.web.dom.ContentBuilder
|
||||||
|
import org.w3c.dom.Element
|
||||||
|
|
||||||
|
typealias AttrsWithContentBuilder<T> = Pair<Attrs<T>, ContentBuilder<T>>
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun <T : Element> AttrsWithContentBuilder(
|
||||||
|
vararg modifiers: UIKitModifier?,
|
||||||
|
noinline attrs: AttrsScope<T>.() -> Unit = {},
|
||||||
|
noinline builder: ContentBuilder<T>
|
||||||
|
) = AttrsWithContentBuilder(
|
||||||
|
Attrs(*modifiers, attrs = attrs),
|
||||||
|
builder
|
||||||
|
)
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun <T : Element> AttrsWithContentBuilder(attrs: Attrs<T>) = AttrsWithContentBuilder(
|
||||||
|
attrs
|
||||||
|
) {}
|
||||||
|
|
||||||
|
inline val <T : Element> AttrsWithContentBuilder<T>.attrs
|
||||||
|
get() = first
|
||||||
|
|
||||||
|
inline val <T : Element> AttrsWithContentBuilder<T>.attributesBuilderContext
|
||||||
|
get() = attrs.builder
|
||||||
|
|
||||||
|
inline val <T : Element> AttrsWithContentBuilder<T>.builder
|
||||||
|
get() = second
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
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
|
|
||||||
)
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user