package dev.inmo.jsuikit.elements import androidx.compose.runtime.Composable import dev.inmo.jsuikit.buildAndAddAttribute import dev.inmo.jsuikit.modifiers.* import dev.inmo.jsuikit.utils.Milliseconds import org.jetbrains.compose.web.dom.* import org.jetbrains.compose.web.dom.Text import org.w3c.dom.* @Composable fun Nav( vararg modifiers: UIKitModifier, multiple: Boolean? = null, collapsible: Boolean? = null, animation: UIKitAnimation? = null, duration: Milliseconds? = null, attributesCustomizer: AttrBuilderContext = {}, dataAllocator: ContentBuilder ) { Ul( { buildAndAddAttribute("uk-nav") { "multiple" to multiple ?.toString() "collapsible" to collapsible ?.toString() "animation" to animation "duration" to duration ?.toString() } include(*modifiers, UIKitNav) attributesCustomizer() } ) { dataAllocator() } } @Composable fun DefaultNav( vararg modifiers: UIKitModifier, multiple: Boolean? = null, collapsible: Boolean? = null, animation: UIKitAnimation? = null, duration: Milliseconds? = null, attributesCustomizer: AttrBuilderContext = {}, dataAllocator: ContentBuilder ) = Nav( modifiers = modifiers + UIKitNav.Default, multiple, collapsible, animation, duration, attributesCustomizer, dataAllocator ) @Composable fun PrimaryNav( vararg modifiers: UIKitModifier, multiple: Boolean? = null, collapsible: Boolean? = null, animation: UIKitAnimation? = null, duration: Milliseconds? = null, attributesCustomizer: AttrBuilderContext = {}, dataAllocator: ContentBuilder ) = Nav( modifiers = modifiers + UIKitNav.Primary, multiple, collapsible, animation, duration, attributesCustomizer, dataAllocator ) @Composable fun SubNav( vararg modifiers: UIKitModifier, multiple: Boolean? = null, collapsible: Boolean? = null, animation: UIKitAnimation? = null, duration: Milliseconds? = null, attributesCustomizer: AttrBuilderContext = {}, dataAllocator: ContentBuilder ) = Nav( modifiers = modifiers + UIKitNav.SubNav, multiple, collapsible, animation, duration, attributesCustomizer, dataAllocator ) @Composable fun Nav( title: String?, data: Iterable, vararg ulModifiers: UIKitModifier, titleModifiers: Array = emptyArray(), multiple: Boolean? = null, collapsible: Boolean? = null, animation: UIKitAnimation? = null, duration: Milliseconds? = null, besidesTitleAndList: ContentBuilder? = null, titleCustomizer: AttrBuilderContext = {}, afterTitleContentBuilder: ContentBuilder = {}, ulCustomizer: AttrBuilderContext = {}, elementAllocator: @Composable ElementScope.(T) -> Unit ) { Ul( { buildAndAddAttribute("uk-nav") { "multiple" to multiple ?.toString() "collapsible" to collapsible ?.toString() "animation" to animation "duration" to duration ?.toString() } include(*ulModifiers, UIKitNav) ulCustomizer() } ) { title ?.let { NavHeader( title, *titleModifiers, attributesCustomizer = titleCustomizer, afterTitleContentBuilder = afterTitleContentBuilder ) } besidesTitleAndList ?.let { it() } data.forEach { elementAllocator(it) } } } @Composable fun DefaultNav( title: String?, data: Iterable, vararg ulModifiers: UIKitModifier, titleModifiers: Array = emptyArray(), multiple: Boolean? = null, collapsible: Boolean? = null, animation: UIKitAnimation? = null, duration: Milliseconds? = null, besidesTitleAndList: ContentBuilder? = null, titleCustomizer: AttrBuilderContext = {}, afterTitleContentBuilder: ContentBuilder = {}, ulCustomizer: AttrBuilderContext = {}, elementAllocator: @Composable ElementScope.(T) -> Unit ) = Nav( title, data, ulModifiers = ulModifiers + UIKitNav.Default, titleModifiers, multiple, collapsible, animation, duration, besidesTitleAndList, titleCustomizer, afterTitleContentBuilder, ulCustomizer, elementAllocator ) @Composable fun PrimaryNav( title: String?, data: Iterable, vararg ulModifiers: UIKitModifier, titleModifiers: Array = emptyArray(), multiple: Boolean? = null, collapsible: Boolean? = null, animation: UIKitAnimation? = null, duration: Milliseconds? = null, besidesTitleAndList: ContentBuilder? = null, titleCustomizer: AttrBuilderContext = {}, afterTitleContentBuilder: ContentBuilder = {}, ulCustomizer: AttrBuilderContext = {}, elementAllocator: @Composable ElementScope.(T) -> Unit ) = Nav( title, data, ulModifiers = ulModifiers + UIKitNav.Primary, titleModifiers, multiple, collapsible, animation, duration, besidesTitleAndList, titleCustomizer, afterTitleContentBuilder, ulCustomizer, elementAllocator ) @Composable fun SubNav( title: String?, data: Iterable, vararg ulModifiers: UIKitModifier, titleModifiers: Array = emptyArray(), multiple: Boolean? = null, collapsible: Boolean? = null, animation: UIKitAnimation? = null, duration: Milliseconds? = null, besidesTitleAndList: ContentBuilder? = null, titleCustomizer: AttrBuilderContext = {}, afterTitleContentBuilder: ContentBuilder = {}, ulCustomizer: AttrBuilderContext = {}, elementAllocator: @Composable ElementScope.(T) -> Unit ) = Nav( title, data, ulModifiers = ulModifiers + UIKitNav.SubNav, titleModifiers, multiple, collapsible, animation, duration, besidesTitleAndList, titleCustomizer, afterTitleContentBuilder, ulCustomizer, elementAllocator ) @Composable fun NavHeader( text: String, vararg modifiers: UIKitModifier, attributesCustomizer: AttrBuilderContext = {}, afterTitleContentBuilder: ContentBuilder = {} ) { Li( { include(*modifiers, UIKitNav.Header) attributesCustomizer() } ) { Text(text) afterTitleContentBuilder() } } @Composable fun NavItemElement( vararg modifiers: UIKitModifier, attributesCustomizer: AttrBuilderContext = {}, contentAllocator: ContentBuilder ) { Li( { include(*modifiers) attributesCustomizer() } ) { A("#") { contentAllocator() } } } @Composable fun NavElement( vararg modifiers: UIKitModifier, attributesCustomizer: AttrBuilderContext = {}, contentAllocator: ContentBuilder ) { Li( { include(*modifiers) attributesCustomizer() } ) { contentAllocator() } } @Composable fun NavDivider( vararg modifiers: UIKitModifier, attributesCustomizer: AttrBuilderContext = {}, ) { Li({ include(UIKitNav.Divider, *modifiers);attributesCustomizer() }) }