Compare commits

...

42 Commits

Author SHA1 Message Date
1f8298f626 attribute builder now may skip nullable values 2022-02-09 01:26:33 +06:00
ca8f927304 updates and attributes buildings and fixes 2022-02-09 01:18:51 +06:00
a856545471 start 0.0.33 2022-02-09 01:18:34 +06:00
41b8063c72 Merge pull request #32 from InsanusMokrassar/0.0.32
0.0.32
2022-02-08 22:09:00 +06:00
6f4f1776c4 fix in UIKitWidth#Fixed 2022-02-08 19:12:24 +06:00
e10bbdeaa0 support of UIKitHeight, AttributesBuilder and Percents/Pixels abstractions 2022-02-08 18:48:49 +06:00
9dd486090a start 0.0.32 2022-02-08 18:48:20 +06:00
4479d9b0f9 Merge pull request #31 from InsanusMokrassar/0.0.31
0.0.31
2022-01-28 14:14:42 +06:00
cef131b1d0 UIKitVisibility 2022-01-28 14:14:27 +06:00
15340eadb1 start 0.0.31 2022-01-28 14:14:14 +06:00
36ab3fe52e Merge pull request #30 from InsanusMokrassar/0.0.30
0.0.30
2022-01-28 14:01:31 +06:00
029a7804ad add UIKitComment, Comment element, upfill UIKitSubNav 2022-01-28 14:01:06 +06:00
7edea7bf74 start 0.0.30 2022-01-28 14:00:34 +06:00
b1ea6d3a61 Merge pull request #29 from InsanusMokrassar/0.0.29
0.0.29
2022-01-26 13:38:46 +06:00
a304dcf5df fixes for build 2022-01-26 13:37:59 +06:00
a88562d3c4 upfill UIKitText 2022-01-26 13:37:03 +06:00
d9a01a8ab8 start 0.0.29 2022-01-26 13:36:49 +06:00
56b1268172 Merge pull request #28 from InsanusMokrassar/0.0.28
0.0.28
2022-01-26 13:20:44 +06:00
a3c8cdcc96 Fixes in UIKitWidth 2022-01-26 13:20:14 +06:00
68d1ba6a37 start 0.0.28 2022-01-26 13:19:51 +06:00
1cf9655575 Merge pull request #27 from InsanusMokrassar/0.0.27
0.0.27
2022-01-26 00:51:54 +06:00
4a7101697a TextField -> StandardInput + fixes in it 2022-01-26 00:51:26 +06:00
17badd4724 start 0.0.27 2022-01-26 00:50:55 +06:00
39e54e8ca3 Merge pull request #26 from InsanusMokrassar/0.0.26
0.0.26
2022-01-25 23:44:43 +06:00
ed31eb01e5 add UIKitColumn 2022-01-25 23:44:22 +06:00
9d06725221 start 0.0.26 2022-01-25 23:44:15 +06:00
d8d4a7fcf1 Merge pull request #25 from InsanusMokrassar/0.0.25
0.0.25
2022-01-25 20:29:04 +06:00
252fe4a295 extend divider 2022-01-25 20:28:50 +06:00
6dbff07692 start 0.0.25 2022-01-25 20:28:34 +06:00
e94585fc7e Merge pull request #24 from InsanusMokrassar/0.0.24
0.0.24
2022-01-25 20:22:41 +06:00
b449caae13 add opportunity to fill space between header and body of table 2022-01-25 20:22:17 +06:00
95edaf1cfe start 0.0.24 2022-01-25 20:22:10 +06:00
cb2fbe9f42 Merge pull request #23 from InsanusMokrassar/0.0.23
0.0.23
2022-01-25 20:13:22 +06:00
598e481f75 add headerCustomizer to table 2022-01-25 20:13:03 +06:00
2a76519843 start 0.0.23 2022-01-25 20:12:48 +06:00
8e9ff07b71 Merge pull request #22 from InsanusMokrassar/0.0.22
0.0.22
2022-01-25 19:35:25 +06:00
13556a293c add opportunity to customize table header cells 2022-01-25 19:35:08 +06:00
a4d4ec3db8 start 0.0.22 2022-01-25 19:34:59 +06:00
6f095de81d Merge pull request #21 from InsanusMokrassar/0.0.21
0.0.21
2022-01-25 13:15:51 +06:00
6b60d22e1e upfill UIKitWidth 2022-01-25 13:15:37 +06:00
4e0cc3621c start 0.0.21 2022-01-25 13:15:04 +06:00
4943490910 Merge pull request #20 from InsanusMokrassar/0.0.20
0.0.20
2022-01-25 12:54:38 +06:00
28 changed files with 662 additions and 55 deletions

1
.gitignore vendored
View File

@@ -11,6 +11,7 @@ out/
secret.gradle
local.properties
local.*
kotlin-js-store/

View File

@@ -1,5 +1,64 @@
# Changelog
## 0.0.33
* Fixes in attributes building and related things
## 0.0.32
* Support of `UIKitHeight`
* New builder `AttributesBuilder`
* New `Percents`/`Pixels` abstractions
* Fixes in `UIKitWidth#Fixed` classnames
## 0.0.31
* Support of `UIKitVisibility`
## 0.0.30
* Add `UIKitComment`
* Including of `Comment` element
* Upfill `UIKitSubNav`
## 0.0.29
* Unfilling of `UIKitText`
## 0.0.28
* Fixes in `UIKitWidth`
## 0.0.27
* `TextField` has been renamed to `StandardInput`
* `StandardInput` now will look for changes in state
## 0.0.26
* Add UIKitColumn
## 0.0.25
* Full including of divider
## 0.0.24
* Add opportunity to fill space between header and body of table
## 0.0.23
* New parameter of tables `headerCustomizer`
## 0.0.22
* Add opportunity to customize table header cells
## 0.0.21
* Upfill `UIKitWidth`
* New extension `UIKitModifier#applyWhenScreenSizeIs`
## 0.0.20
* Remove type of button from `DefaultButton` and add companion to `UIKitButton` to be able to use `uk-button` class

View File

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

1
local.make_version.sh Executable file
View File

@@ -0,0 +1 @@
git add -A && git stash && git checkout master && git pull && git checkout -b "$1" && nano gradle.properties CHANGELOG.md && git add -A && git commit -m "start $1" && git stash pop && git add -A && nano CHANGELOG.md && git add -A && git commit -m "$2" && git push --set-upstream origin "$1" && ./gradlew clean && ./gradlew publishToMavenLocal

View File

@@ -1,8 +1,11 @@
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
@Deprecated("Will be removed soon")
class UIKitAttributeValueBuilder {
private val attrs = mutableListOf<Pair<String, String>>()
@@ -21,7 +24,10 @@ class UIKitAttributeValueBuilder {
fun AttrsBuilder<*>.buildAndAddAttribute(
attributeName: String,
block: UIKitAttributeValueBuilder.() -> Unit
skipNullValues: Boolean = true,
block: AttributeBuilder.() -> Unit
) {
attr(attributeName, UIKitAttributeValueBuilder().apply(block).build())
buildAttribute(attributeName, skipNullValues, block).let {
attr(it.first, it.second)
}
}

View File

@@ -0,0 +1,106 @@
package dev.inmo.jsuikit.elements
import androidx.compose.runtime.Composable
import dev.inmo.jsuikit.modifiers.*
import dev.inmo.jsuikit.utils.*
import org.jetbrains.compose.web.dom.*
import org.w3c.dom.*
@Composable
fun Comment(
rootAttrs: Attrs<HTMLElement> = Attrs.empty(),
headerAttrs: Attrs<HTMLElement>? = null,
headerContent: ContentBuilder<HTMLElement>? = null,
bodyAttrs: Attrs<HTMLDivElement>? = null,
bodyContent: ContentBuilder<HTMLDivElement>? = null,
) {
Article(
{
include(UIKitComment)
rootAttrs.builder(this)
}
) {
if (headerAttrs != null || headerContent != null) {
Header (
{
include(UIKitComment.Header)
headerAttrs ?.builder ?.invoke(this)
}
) {
headerContent ?.let { it(this) }
}
}
if (bodyAttrs != null || bodyContent != null) {
Div(
{
include(UIKitComment.Body)
bodyAttrs ?.builder ?.invoke(this)
}
) {
bodyContent ?.let { it(this) }
}
}
}
}
@Composable
fun DefaultComment(
headerGridAttrs: Attrs<HTMLDivElement>? = null,
avatarUrl: String? = null,
avatarAttrs: Attrs<HTMLImageElement>? = null,
titleAttrs: Attrs<HTMLHeadingElement>? = null,
titleContent: ContentBuilder<HTMLHeadingElement>? = null,
metaAttrs: Attrs<HTMLUListElement>? = null,
metaContent: ContentBuilder<HTMLUListElement>? = null,
rootAttrs: Attrs<HTMLElement> = Attrs.empty(),
headerAttrs: Attrs<HTMLElement>? = null,
additionalHeaderContent: ContentBuilder<HTMLElement>? = null,
bodyAttrs: Attrs<HTMLDivElement>? = null,
bodyContent: ContentBuilder<HTMLDivElement>? = null,
) {
Comment(
rootAttrs = rootAttrs,
headerAttrs = headerAttrs,
headerContent = {
if (arrayOf(headerGridAttrs, avatarUrl, avatarAttrs, titleAttrs, titleContent, metaAttrs, metaContent).anyNotNull()) {
Grid(
UIKitGrid.Gap.Medium, UIKitFlex.Alignment.Vertical.Middle,
attributesCustomizer = headerGridAttrs ?.builder ?: {}
) {
if (avatarUrl != null) {
Div({ include(UIKitWidth.Auto) }) {
Img(avatarUrl, attrs = avatarAttrs ?.builder)
}
}
if (arrayOf(titleAttrs, titleContent, metaAttrs, metaContent).anyNotNull()) {
Div({ include(UIKitWidth.Expand) }) {
optionallyDraw(titleAttrs, titleContent) {
H4(
{
include(UIKitComment.Title, UIKitMargin.Remove)
titleAttrs ?.builder ?.invoke(this)
}
) {
titleContent ?.invoke(this)
}
}
optionallyDraw(metaAttrs, metaContent) {
Ul (
{
include(UIKitComment.Meta, UIKitSubNav, UIKitSubNav.Divider, UIKitMargin.Remove.Top)
metaAttrs ?.builder ?.invoke(this)
}
) {
metaContent ?.invoke(this)
}
}
}
}
}
}
additionalHeaderContent ?.let { it(this) }
},
bodyAttrs = bodyAttrs,
bodyContent = bodyContent
)
}

View File

@@ -1,7 +1,40 @@
package dev.inmo.jsuikit.elements
import androidx.compose.runtime.Composable
import dev.inmo.jsuikit.modifiers.*
import org.jetbrains.compose.web.dom.AttrBuilderContext
import org.jetbrains.compose.web.dom.Hr
import org.w3c.dom.HTMLHRElement
object Divider {
@Composable
fun Common(
vararg modifiers: UIKitModifier,
attributesCustomizer: AttrBuilderContext<HTMLHRElement> = {}
) = Hr {
include(*modifiers)
attributesCustomizer()
}
@Composable
fun Icon(
vararg modifiers: UIKitModifier,
attributesCustomizer: AttrBuilderContext<HTMLHRElement> = {}
) = Common(
*(modifiers + UIKitDivider.Icon), attributesCustomizer = attributesCustomizer
)
@Composable
fun Small(
vararg modifiers: UIKitModifier,
attributesCustomizer: AttrBuilderContext<HTMLHRElement> = {}
) = Common(
*(modifiers + UIKitDivider.Small), attributesCustomizer = attributesCustomizer
)
@Composable
fun Vertical(
vararg modifiers: UIKitModifier,
attributesCustomizer: AttrBuilderContext<HTMLHRElement> = {}
) = Common(
*(modifiers + UIKitDivider.Vertical), attributesCustomizer = attributesCustomizer
)
}
@Composable
fun Divider() = Hr({ classes("uk-divider-icon") })

View File

@@ -4,6 +4,7 @@ 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

@@ -23,4 +23,4 @@ fun Spinner(
}
@Composable
fun DefaultSpinner() = Spinner(UIKitAlign.Center, UIKitMargin.Small, UIKitText.Alignment.Center)
fun DefaultSpinner() = Spinner(UIKitAlign.Center, UIKitMargin.Small, UIKitText.Alignment.Horizontal.Center, UIKitText.Alignment.Vertical.Middle)

View File

@@ -9,7 +9,7 @@ import org.jetbrains.compose.web.dom.Input
import org.w3c.dom.HTMLInputElement
@Composable
fun <T> TextField(
fun <T> StandardInput(
type: InputType<T>,
state: MutableState<T>,
disabledState: State<Boolean>? = null,
@@ -23,7 +23,16 @@ fun <T> TextField(
placeholder ?.let(::placeholder)
onChange { state.value = it.value }
state.value.let {
when (it) {
is String -> value(it)
is Number -> value(it)
else -> {}
}
}
onInput { state.value = it.value }
disabledState ?.let {
if (it.value) {
disabled()
@@ -32,3 +41,14 @@ fun <T> TextField(
attributesCustomizer()
}
}
@Composable
@Deprecated("Renamed", ReplaceWith("StandardInput", "dev.inmo.jsuikit.elements.StandardInput"))
fun <T> TextField(
type: InputType<T>,
state: MutableState<T>,
disabledState: State<Boolean>? = null,
placeholder: String? = null,
vararg modifiers: UIKitModifier,
attributesCustomizer: AttrBuilderContext<HTMLInputElement> = {},
) = StandardInput(type, state, disabledState, placeholder, modifiers = modifiers, attributesCustomizer)

View File

@@ -10,16 +10,18 @@ import org.w3c.dom.*
@Composable
fun <T> DefaultTable(
heading: List<String>,
headerBuilders: List<ContentBuilder<HTMLTableCellElement>>,
dataList: SnapshotStateList<T>,
vararg tableModifiers: UIKitModifier,
attributesCustomizer: AttrBuilderContext<HTMLTableElement> = {},
headerCellCustomizer: AttrsBuilder<HTMLTableCellElement>.(i: Int, title: String) -> Unit = { _, _ -> },
headerCustomizer: AttrBuilderContext<HTMLTableSectionElement> = {},
headerCellCustomizer: AttrsBuilder<HTMLTableCellElement>.(i: Int) -> Unit = {},
rowAttributes: AttrsBuilder<HTMLTableRowElement>.(t: T) -> Unit = {},
cellCustomizer: AttrsBuilder<HTMLTableCellElement>.(i: Int, t: T) -> Unit = { _, _ -> },
betweenHeaderAndBodyFiller: ContentBuilder<HTMLTableElement> = {},
cellFiller: @Composable ElementScope<HTMLTableCellElement>.(i: Int, t: T) -> Unit
) {
val headingIndexes = heading.indices
val headingIndexes = headerBuilders.indices
Table(
{
classes("uk-table")
@@ -27,19 +29,20 @@ fun <T> DefaultTable(
attributesCustomizer()
}
) {
Thead {
Thead(headerCustomizer) {
Tr {
heading.forEachIndexed { i, t ->
headerBuilders.forEachIndexed { i, t ->
Th(
{
headerCellCustomizer(i, t)
headerCellCustomizer(i)
}
) {
Text(t)
t()
}
}
}
}
betweenHeaderAndBodyFiller()
Tbody {
dataList.forEach {
Tr(
@@ -61,3 +64,41 @@ fun <T> DefaultTable(
}
}
}
@Composable
fun <T> DefaultTable(
heading: List<String>,
dataList: SnapshotStateList<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 = { _, _ -> },
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 header = headersByIndex[i]
if (header != null) {
headerCellCustomizer(i, header)
}
}
inline fun headerFactory(header: String): ContentBuilder<HTMLTableCellElement> = {
Text(header)
}
val headerBuilders = heading.map(::headerFactory)
return DefaultTable(
headerBuilders,
dataList,
tableModifiers = tableModifiers,
attributesCustomizer,
headerCustomizer,
headerCellCustomizer,
rowAttributes,
cellCustomizer,
betweenHeaderAndBodyFiller,
cellFiller
)
}

View File

@@ -0,0 +1,14 @@
package dev.inmo.jsuikit.modifiers
sealed class UIKitBase(classname: String) : UIKitModifier {
override val classes: Array<String> = arrayOf(classname)
sealed class Heading(suffix: String) : UIKitBase("uk-h$suffix") {
object H1 : Heading("1")
object H2 : Heading("2")
object H3 : Heading("3")
object H4 : Heading("4")
object H5 : Heading("5")
object H6 : Heading("6")
}
}

View File

@@ -0,0 +1,15 @@
package dev.inmo.jsuikit.modifiers
sealed class UIKitColumn(classname: String) : UIKitModifier {
override val classes: Array<String> = arrayOf(classname)
object Two : UIKitColumn("uk-column-1-2")
object Three : UIKitColumn("uk-column-1-3")
object Four : UIKitColumn("uk-column-1-4")
object Five : UIKitColumn("uk-column-1-5")
object Six : UIKitColumn("uk-column-1-6")
object Divider : UIKitColumn("uk-column-divider")
object Span : UIKitColumn("uk-column-span")
}

View File

@@ -0,0 +1,17 @@
package dev.inmo.jsuikit.modifiers
sealed class UIKitComment(suffix: String?) : UIKitModifier {
override val classes: Array<String> = arrayOf("uk-comment${suffix ?.let { "-$it" } ?: ""}")
object Body : UIKitComment("body")
object Header : UIKitComment("header")
object Title : UIKitComment("title")
object Meta : UIKitComment("meta")
object Avatar : UIKitComment("avatar")
object Primary : UIKitComment("primary")
object List : UIKitComment("list")
companion object : UIKitComment(null)
}

View File

@@ -0,0 +1,10 @@
package dev.inmo.jsuikit.modifiers
sealed class UIKitDivider(classname: String) : UIKitModifier {
override val classes: Array<String> = arrayOf(classname)
object Icon : UIKitDivider("uk-divider-icon")
object Small : UIKitDivider("uk-divider-small")
object Vertical : UIKitDivider("uk-divider-vertical")
}

View File

@@ -0,0 +1,80 @@
package dev.inmo.jsuikit.modifiers
import dev.inmo.jsuikit.utils.*
import org.jetbrains.compose.web.css.CSSKeyframe
sealed class UIKitHeight(
classname: String?,
override val otherAttrs: Map<String, String> = emptyMap()
) : UIKitModifier {
override val classes: Array<String> = classname ?.let { arrayOf(it) } ?: emptyArray()
object Full : UIKitHeight("uk-height-1-1")
sealed class Size(classname: String) : UIKitHeight(classname) {
sealed class Small(classname: String = "uk-height-small") : Size(classname) {
object Max : Small("uk-height-max-small")
companion object : Small()
}
sealed class Medium(classname: String = "uk-height-medium") : Size(classname) {
object Max : Medium("uk-height-max-medium")
companion object : Medium()
}
sealed class Large(classname: String = "uk-height-large") : Size(classname) {
object Max : Large("uk-height-max-large")
companion object : Large()
}
}
class Viewport(offsetTop: Boolean? = null, offsetBottom: String? = null, expand: Boolean? = null, minHeight: Int? = null) : UIKitHeight(
null,
mapOf(
buildAttribute("uk-height-viewport") {
offsetTop ?.let { "offset-top" to it.toString() }
offsetBottom ?.let { "offset-bottom" to it }
expand ?.let { "expand" to it.toString() }
minHeight ?.let { "min-height" to it.toString() }
}
)
)
fun Viewport(
offsetTop: Boolean? = null,
offsetBottom: Boolean,
expand: Boolean? = null,
minHeight: Int? = null
) = Viewport(offsetTop, offsetBottom.toString(), expand, minHeight)
fun Viewport(
offsetTop: Boolean? = null,
offsetBottom: Pixels,
expand: Boolean? = null,
minHeight: Int? = null
) = Viewport(offsetTop, offsetBottom.toString(), expand, minHeight)
fun Viewport(
offsetTop: Boolean? = null,
offsetBottom: Percents,
expand: Boolean? = null,
minHeight: Int? = null
) = Viewport(offsetTop, offsetBottom.toString(), expand, minHeight)
class Match(target: String? = null, row: Boolean? = null) : UIKitHeight(
null,
mapOf(
buildAttribute("uk-height-match") {
target ?.let { "target" to it }
row ?.let { "row" to it.toString() }
}
)
)
}

View File

@@ -4,7 +4,6 @@ sealed class UIKitNav(classname: String) : UIKitModifier {
override val classes: Array<String> = arrayOf(classname)
object ParentIcon : UIKitNav("uk-nav-parent-icon")
object SubNav : UIKitNav("uk-nav-sub")
object Header : UIKitNav("uk-nav-header")
object Divider : UIKitNav("uk-nav-divider")
@@ -15,5 +14,7 @@ sealed class UIKitNav(classname: String) : UIKitModifier {
object Center : UIKitNav("uk-nav-center")
companion object : UIKitNav("uk-nav")
companion object : UIKitNav("uk-nav") {
val SubNav = UIKitSubNav
}
}

View File

@@ -18,3 +18,5 @@ sealed class UIKitScreenSizeModifier(val name: String) {
modifier
)
}
fun UIKitModifier.applyWhenScreenSizeIs(size: UIKitScreenSizeModifier) = size.modify(this)

View File

@@ -0,0 +1,10 @@
package dev.inmo.jsuikit.modifiers
sealed class UIKitSubNav(classname: String) : UIKitModifier {
override val classes: Array<String> = arrayOf(classname)
object Divider : UIKitSubNav("uk-subnav-divider")
object Pill : UIKitSubNav("uk-subnav-pill")
companion object : UIKitSubNav("uk-subnav")
}

View File

@@ -3,16 +3,34 @@ package dev.inmo.jsuikit.modifiers
sealed class UIKitText(suffix: String) : UIKitModifier {
override val classes: Array<String> = arrayOf("uk-text-$suffix")
object Lead : UIKitText("lead")
object Meta : UIKitText("meta")
sealed class Alignment(suffix: String) : UIKitText(suffix) {
object Left : Alignment("left")
object Right : Alignment("right")
object Center : Alignment("center")
object Justify : Alignment("justify")
sealed class Style(suffix: String) : UIKitText(suffix) {
object Lead : Style("lead")
object Meta : Style("meta")
object Italic : Style("italic")
}
sealed class Size(suffix: String) : UIKitText(suffix) {
object Small : Size("small")
object Default : Size("default")
object Large : Size("large")
}
sealed class Weight(suffix: String) : UIKitText(suffix) {
object Light : Weight("light")
object Normal : Weight("normal")
object Bold : Weight("bold")
object Lighter : Weight("lighter")
object Bolder : Weight("bolder")
}
sealed class Transform(suffix: String) : UIKitText(suffix) {
object Capitalize : Transform("capitalize")
object Uppercase : Transform("uppercase")
object Lowercase : Transform("lowercase")
}
object DecorationNone : UIKitText("decoration-none")
sealed class Color(suffix: String) : UIKitText(suffix) {
object Muted : Color("muted")
object Emphasis : Color("emphasis")
@@ -22,4 +40,32 @@ sealed class UIKitText(suffix: String) : UIKitModifier {
object Warning : Color("warning")
object Danger : Color("danger")
}
object Background : UIKitText("background")
sealed class Alignment(suffix: String) : UIKitText(suffix) {
sealed class Horizontal(suffix: String) : Alignment(suffix) {
object Left : Horizontal("left")
object Right : Horizontal("right")
object Center : Horizontal("center")
object Justify : Horizontal("justify")
}
sealed class Vertical(suffix: String) : Alignment(suffix) {
object Top : Vertical("top")
object Middle : Vertical("middle")
object Bottom : Vertical("bottom")
object Baseline : Vertical("baseline")
}
}
sealed class Wrapping(suffix: String) : UIKitText(suffix) {
object Truncate : Wrapping("truncate")
object Break : Wrapping("break")
object NoWrap : Wrapping("nowrap")
}
}

View File

@@ -1,5 +1,7 @@
package dev.inmo.jsuikit.modifiers
import dev.inmo.jsuikit.utils.buildAttribute
class UIKitTooltipModifier(
text: String,
align: Align? = null,
@@ -8,16 +10,15 @@ class UIKitTooltipModifier(
duration: Int? = null,
animation: UIKitAnimation? = null
) : UIKitModifier {
private val parametersMap = listOfNotNull(
"title" to text,
align ?.let { it.k to it.v },
delay ?.let { "delay" to it.toString() },
offset ?.let { "offset" to it.toString() },
duration ?.let { "duration" to it.toString() },
animation ?.let { "animation" to it.name },
)
override val otherAttrs: Map<String, String> = mapOf(
"uk-tooltip" to parametersMap.joinToString(";") { (k, v) -> "$k: $v" }
buildAttribute("uk-tooltip") {
"title" to text
align ?.let { it.k to it.v }
delay ?.let { "delay" to it.toString() }
offset ?.let { "offset" to it.toString() }
duration ?.let { "duration" to it.toString() }
animation ?.let { "animation" to it.name }
}
)
sealed class Align(name: String) {

View File

@@ -0,0 +1,30 @@
package dev.inmo.jsuikit.modifiers
sealed class UIKitVisibility(classname: String) : UIKitModifier {
override val classes: Array<String> = arrayOf(classname)
sealed class Hidden(suffix: String?) : UIKitModifier {
override val classes: Array<String> = arrayOf("uk-hidden${suffix ?.let { "-$it" } ?: ""}")
object Hover : Hidden("hover")
sealed class Touch(suffix: String?) : Hidden(suffix) {
override val classes: Array<String> = arrayOf("${suffix ?: ""}touch")
object No : Touch("no")
companion object : Touch(null)
}
companion object : Hidden(null) {
val NoTouch = Touch.No
}
}
sealed class Invisible(suffix: String?) : UIKitModifier {
override val classes: Array<String> = arrayOf("uk-invisible${suffix ?.let { "-$it" } ?: ""}")
object Hover : Invisible("hover")
companion object : Invisible(null)
}
}

View File

@@ -1,33 +1,82 @@
package dev.inmo.jsuikit.modifiers
sealed class UIKitWidth(classname: String) : UIKitModifier {
override val classes: Array<String> = arrayOf("uk-width-$classname")
override val classes: Array<String> = arrayOf(classname)
object Full : UIKitWidth("1-1")
object Expand : UIKitWidth("expand")
object Auto : UIKitWidth("uk-width-auto")
object Expand : UIKitWidth("uk-width-expand")
object Full : UIKitWidth("uk-width-1-1")
object Half : UIKitWidth("1-2")
object Half : UIKitWidth("uk-width-1-2")
object OneThird : UIKitWidth("1-3")
object TwoThird : UIKitWidth("2-3")
object OneThird : UIKitWidth("uk-width-1-3")
object TwoThird : UIKitWidth("uk-width-2-3")
object OneFourth : UIKitWidth("1-4")
val TwoFourth get() = Half
object ThreeFourth : UIKitWidth("3-4")
val FourFourth get() = Full
object OneFourth : UIKitWidth("uk-width-1-4")
object ThreeFourth : UIKitWidth("uk-width-3-4")
object OneFifth : UIKitWidth("1-5")
object TwoFifth : UIKitWidth("2-5")
object ThreeFifth : UIKitWidth("3-5")
object FourFifth : UIKitWidth("4-5")
val FiveFifth get() = Full
object OneFifth : UIKitWidth("uk-width-1-5")
object TwoFifth : UIKitWidth("uk-width-2-5")
object ThreeFifth : UIKitWidth("uk-width-3-5")
object FourFifth : UIKitWidth("uk-width-4-5")
object OneSixth : UIKitWidth("1-6")
val TwoSixth get() = OneThird
val ThreeSixth get() = Half
val FourSixth get() = TwoThird
object FiveSixth : UIKitWidth("5-6")
val SixSixth get() = Full
object OneSixth : UIKitWidth("uk-width-1-6")
object FiveSixth : UIKitWidth("uk-width-5-6")
sealed class Child(suffix: String) : UIKitWidth("uk-child-width-$suffix") {
object Full : Child("1-1")
object Half : Child("1-2")
object OneThird : Child("1-3")
object TwoThird : Child("2-3")
object OneFourth : Child("1-4")
object ThreeFourth : Child("3-4")
object OneFifth : Child("1-5")
object TwoFifth : Child("2-5")
object ThreeFifth : Child("3-5")
object FourFifth : Child("4-5")
object OneSixth : Child("1-6")
object FiveSixth : Child("5-6")
object Auto : Child("auto")
object Expand : Child("expand")
companion object {
val TwoFourth get() = Half
val TwoSixth get() = OneThird
val ThreeSixth get() = Half
val FourSixth get() = TwoThird
val FourFourth get() = Full
val FiveFifth get() = Full
val SixSixth get() = Full
}
}
sealed class Fixed(suffix: String) : UIKitWidth("uk-width-$suffix") {
object Small : Fixed("small")
object Medium : Fixed("medium")
object Large : Fixed("large")
object XLarge : Fixed("xlarge")
object XXLarge : Fixed("2xlarge")
}
override fun toString() = classes.first()
companion object {
val TwoFourth get() = Half
val TwoSixth get() = OneThird
val ThreeSixth get() = Half
val FourSixth get() = TwoThird
val FourFourth get() = Full
val FiveFifth get() = Full
val SixSixth get() = Full
}
}

View File

@@ -0,0 +1,11 @@
package dev.inmo.jsuikit.utils
fun <T> Array<T>.anyNotNull(): Boolean {
for (item in this) {
if (item != null) {
return true
}
}
return false
}

View File

@@ -0,0 +1,27 @@
package dev.inmo.jsuikit.utils
class AttributeBuilder (
val attributeName: String,
val skipNullValues: Boolean = true,
private val parametersPreset: MutableMap<String, String?> = mutableMapOf()
) {
fun add(k: String, v: Any? = null) {
if (v != null || !skipNullValues) {
parametersPreset[k] = v ?.toString()
}
}
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(
attributeName,
skipNullValues
).apply(block).build()

View File

@@ -0,0 +1,16 @@
package dev.inmo.jsuikit.utils
import androidx.compose.runtime.Composable
import org.jetbrains.compose.web.dom.ContentBuilder
import org.w3c.dom.Element
@Composable
inline fun <T : Element> optionallyDraw (
attrs: Attrs<T>? = null,
noinline contentBuilder: ContentBuilder<T>? = null,
whatToDraw: @Composable () -> Unit
) {
if (attrs != null || contentBuilder != null) {
whatToDraw()
}
}

View File

@@ -0,0 +1,5 @@
package dev.inmo.jsuikit.utils
value class Percents(val int: Int) {
override fun toString(): String = "${int}%"
}

View File

@@ -0,0 +1,5 @@
package dev.inmo.jsuikit.utils
value class Pixels(val int: Int) {
override fun toString(): String = "${int}px"
}