8000 kmdc-menu and kmdc-menu-surface by pocharlebois · Pull Request #67 · mpetuska/kmdc · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

kmdc-menu and kmdc-menu-surface #67

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Jan 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,8 @@ Here's a tracker list of currently completed [material-components-web] modules (
- [ ] mdc-line-ripple
- [x] mdc-linear-progress
- [x] mdc-list
- [ ] mdc-menu-surface
- [ ] mdc-menu
- [x] mdc-menu-surface
- [x] mdc-menu
- [ ] mdc-notched-outline
- [x] mdc-progress-indicator (won't wrap)
- [x] mdc-radio
Expand Down
4 changes: 2 additions & 2 deletions kmdc/kmdc-core/src/jsMain/kotlin/attrs.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ package dev.petuska.kmdc.core

import org.jetbrains.compose.web.attributes.AttrsBuilder
import org.w3c.dom.Element
import org.w3c.dom.HTMLButtonElement
import org.w3c.dom.HTMLElement

public inline fun <T : Element> AttrsBuilder<T>.aria(key: String, value: String): AttrsBuilder<T> =
attr("aria-$key", value)

public inline fun <T : HTMLButtonElement> AttrsBuilder<T>.role(value: String): AttrsBuilder<T> =
public inline fun <T : HTMLElement> AttrsBuilder<T>.role(value: String): AttrsBuilder<T> =
attr("role", value)
4 changes: 2 additions & 2 deletions kmdc/kmdc-list/src/jsMain/kotlin/MDCList.kt
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public data class MDCListOpts(
public var size: Size = Size.SingleLine,
public var type: Type = Type.Generic,
public var dense: Boolean = false,
public var singleSelection: Boolean = false,
public var singleSelection: Boolean = false
) {
public enum class Size(public vararg val classes: String) {
SingleLine, TwoLine("mdc-deprecated-list--two-line")
Expand All @@ -73,7 +73,7 @@ public data class MDCListOpts(
}
}

public class MDCListScope<T : HTMLElement>(scope: ElementScope<T>) : ElementScope<T> by scope
public open class MDCListScope<T : HTMLElement>(scope: ElementScope<T>) : ElementScope<T> by scope

/**
* [JS API](https://github.com/material-components/material-components-web/tree/v13.0.0/packages/mdc-deprecated-list)
Expand Down
4 changes: 2 additions & 2 deletions kmdc/kmdc-list/src/jsMain/kotlin/MDCListItem.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ import org.w3c.dom.HTMLUListElement
public data class MDCListItemOpts(
public var disabled: Boolean = false,
public var selected: Boolean = false,
public var activated: Boolean = false,
public var activated: Boolean = false
)

public class MDCListItemScope<T : HTMLElement>(scope: ElementScope<T>) : ElementScope<T> by scope
public open class MDCListItemScope<T : HTMLElement>(scope: ElementScope<T>) : ElementScope<T> by scope

/**
* [JS API](https://github.com/material-components/material-components-web/tree/v13.0.0/packages/mdc-deprecated-list)
Expand Down
17 changes: 17 additions & 0 deletions kmdc/kmdc-menu-surface/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import util.mdcVersion

plugins {
id("plugin.library-compose")
id("plugin.publishing-mpp")
}

kotlin {
sourceSets {
named("jsMain") {
dependencies {
api(project(":kmdc:kmdc-core"))
api(npm("@material/menu-surface", mdcVersion))
}
}
}
}
40 changes: 40 additions & 0 deletions kmdc/kmdc-menu-surface/src/jsMain/kotlin/MDCMenuSurface.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package dev.petuska.kmdc.menu.surface

import androidx.compose.runtime.Composable
import dev.petuska.kmdc.core.Builder
import dev.petuska.kmdc.core.MDCDsl
import dev.petuska.kmdc.core.initialiseMDC
import org.jetbrains.compose.web.attributes.AttrsBuilder
import org.jetbrains.compose.web.dom.ContentBuilder
import org.jetbrains.compose.web.dom.Div
import org.w3c.dom.HTMLDivElement

@JsModule("@material/menu-surface/dist/mdc.menu-surface.css")
private external val MDCMenuSurfaceStyle: dynamic

public data class MDCMenuSurfaceOpts(
public var fixed: Boolean = false,
)

/**
* [JS API](https://github.com/material-components/material-components-web/tree/v13.0.0/packages/mdc-menu-surface)
*/
@MDCDsl
@Composable
public fun MDCMenuSurface(
opts: Builder<MDCMenuSurfaceOpts>? = null,
attrs: Builder<AttrsBuilder<HTMLDivElement>>? = null,
content: ContentBuilder<HTMLDivElement>? = null,
) {
MDCMenuSurfaceStyle
val options = MDCMenuSurfaceOpts().apply { opts?.invoke(this) }
Div(
attrs = {
classes("mdc-menu-surface")
if (options.fixed) classes("mdc-menu-surface--fixed")
initialiseMDC(MDCMenuSurfaceModule.MDCMenuSurface::attachTo)
attrs?.invoke(this)
},
content = content
)
}
F438
Original file line numberDiff line number Diff line change
@@ -0,0 +1,24 @@
package dev.petuska.kmdc.menu.surface

import androidx.compose.runtime.Composable
import dev.petuska.kmdc.core.Builder
import dev.petuska.kmdc.core.MDCDsl
import org.jetbrains.compose.web.attributes.AttrsBuilder
import org.jetbrains.compose.web.dom.ContentBuilder
import org.jetbrains.compose.web.dom.Div
import org.w3c.dom.HTMLDivElement

@MDCDsl
@Composable
public fun MDCMenuSurfaceAnchor(
attrs: Builder<AttrsBuilder<HTMLDivElement>>? = null,
content: ContentBuilder<HTMLDivElement>? = null,
) {
Div(
attrs = {
classes("mdc-menu-surface--anchor")
attrs?.invoke(this.unsafeCast<AttrsBuilder<HTMLDivElement>>())
},
content = content
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package dev.petuska.kmdc.menu.surface
import dev.petuska.kmdc.core.Destroyable
import org.w3c.dom.Element
import org.w3c.dom.HTMLElement

@JsModule("@material/menu-surface")
public external object MDCMenuSurfaceModule {
public class MDCMenuSurface(element: Element) : Destroyable {
public companion object {
public fun attachTo(element: Element): MDCMenuSurface
}

public override fun destroy()

public var anchorElement: HTMLElement

public fun isOpen(): Boolean
public fun open()
public fun close(skipRestoreFocus: Boolean)
public fun setAnchorCorner(corner: Byte)
}

// As of 1.6.20-M1, enum will be supported https://youtrack.jetbrains.com/issue/KT-37916
// public enum class Corner { TOP_LEFT, ... }

// Until then, we import the Corner definition under object
public object Corner {
public val TOP_LEFT: Byte
public val TOP_RIGHT: Byte
public val BOTTOM_LEFT: Byte
public val BOTTOM_RIGHT: Byte
public val TOP_START: Byte
public val TOP_END: Byte
public val BOTTOM_START: Byte
public val BOTTOM_END: Byte
}
}
19 changes: 19 additions & 0 deletions kmdc/kmdc-menu/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import util.mdcVersion

plugins {
id("plugin.library-compose")
id("plugin.publishing-mpp")
}

kotlin {
sourceSets {
named("jsMain") {
dependencies {
api(project(":kmdc:kmdc-core"))
api(project(":kmdc:kmdc-list"))
api(project(":kmdc:kmdc-menu-surface"))
api(npm("@material/menu", mdcVersion))
}
}
}
}
76 changes: 76 additions & 0 deletions kmdc/kmdc-menu/src/jsMain/kotlin/MDCMenu.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package dev.petuska.kmdc.menu

import androidx.compose.runtime.Composable
import dev.petuska.kmdc.core.*
import dev.petuska.kmdc.list.MDCList
import dev.petuska.kmdc.list.MDCListScope
import dev.petuska.kmdc.menu.surface.MDCMenuSurface
import org.jetbrains.compose.web.attributes.AttrsBuilder
import org.jetbrains.compose.web.dom.ElementScope
import org.w3c.dom.HTMLDivElement
import org.w3c.dom.HTMLUListElement

@JsModule("@material/menu/dist/mdc.menu.css")
private external val MDCMenuStyle: dynamic

public data class MDCMenuOpts(
var open: Boolean = false,
var fixed: Boolean = false,
var wrapFocus: Boolean? = null,
var anchorCorner: Byte? = null,
var selectedIndex: Int? = null,
var absolutePosition: Point? = null
) {
public data class Point(var x: Double = 0.0, var y: Double = 0.0)
}

public class MDCMenuAttrsScope private constructor() : AttrsBuilder<HTMLDivElement>()

public class MDCMenuScope(scope: ElementScope<HTMLUListElement>) : MDCListScope<HTMLUListElement>(scope)

/**
* [JS API](https://github.com/material-components/material-components-web/tree/v13.0.0/packages/mdc-menu)
*/
@MDCDsl
@Composable
public fun MDCMenu(
opts: Builder<MDCMenuOpts>? = null,
attrs: Builder<MDCMenuAttrsScope>? = null,
content: ComposableBuilder<MDCMenuScope>? = null,
) {
MDCMenuStyle
val options = MDCMenuOpts().apply { opts?.invoke(this) }
MDCMenuSurface(attrs = {
classes("mdc-menu")
initialiseMDC(MDCMenuModule.MDCMenu::attachTo)
attrs?.invoke(this.unsafeCast<MDCMenuAttrsScope>())
}) {
DomSideEffect(options.open) { scope ->
scope.mdc<MDCMenuModule.MDCMenu> { open = options.open }
}
DomSideEffect(options.fixed) { scope ->
scope.mdc<MDCMenuModule.MDCMenu> { setFixedPosition(options.fixed) }
}
DomSideEffect(options.wrapFocus) { scope ->
scope.mdc<MDCMenuModule.MDCMenu> { options.wrapFocus?.let { wrapFocus = it } }
}
DomSideEffect(options.selectedIndex) { scope ->
scope.mdc<MDCMenuModule.MDCMenu> { options.selectedIndex?.let { setSelectedIndex(it) } }
}
DomSideEffect(options.absolutePosition) { scope ->
scope.mdc<MDCMenuModule.MDCMenu> { options.absolutePosition?.let { setAbsolutePosition(it.x, it.y) } }
}
DomSideEffect(options.anchorCorner) { scope ->
scope.mdc<MDCMenuModule.MDCMenu> { options.anchorCorner?.let { setAnchorCorner(it) } }
}
MDCList(
attrs = {
role("menu")
attr("aria-hidden", "true")
attr("aria-orientation", "vertical")
tabIndex(-1)
},
content = content?.let { { MDCMenuScope(this).it() } }
)
}
}
23 changes: 23 additions & 0 deletions kmdc/kmdc-menu/src/jsMain/kotlin/MDCMenuItem.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package dev.petuska.kmdc.menu

import androidx.compose.runtime.Composable
import dev.petuska.kmdc.core.Builder
import dev.petuska.kmdc.core.ComposableBuilder
import dev.petuska.kmdc.core.MDCDsl
import dev.petuska.kmdc.list.MDCListItem
import dev.petuska.kmdc.list.MDCListItemOpts
import dev.petuska.kmdc.list.MDCListItemScope
import org.jetbrains.compose.web.attributes.AttrsBuilder
import org.w3c.dom.HTMLLIElement

@MDCDsl
@Composable
public fun MDCMenuScope.MDCMenuItem(
opts: Builder<MDCListItemOpts>? = null,
attrs: Builder<AttrsBuilder<HTMLLIElement>>? = null,
content: ComposableBuilder<MDCListItemScope<HTMLLIElement>>? = null,
) {
MDCListItem(attrs = {
attrs?.invoke(this)
}, opts = opts, content = content)
}
42 changes: 42 additions & 0 deletions kmdc/kmdc-menu/src/jsMain/kotlin/MDCMenuModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package dev.petuska.kmdc.menu

import dev.petuska.kmdc.core.Destroyable
import dev.petuska.kmdc.core.MDCEvent
import org.w3c.dom.Element
import org.w3c.dom.HTMLElement

@JsModule("@material/menu")
public external object MDCMenuModule {
public class MDCMenu(element: Element) : Destroyable {
public companion object {
public fun attachTo(element: Element): MDCMenu
}

override fun destroy()

public var open: Boolean
public var wrapFocus: Boolean

public fun setAnchorCorner(corner: Byte)
public fun setAbsolutePosition(x: Double, y: Double)
public fun setFixedPosition(isFixed: Boolean)
public fun setSelectedIndex(index: Int)
public fun setIsHoisted(isHoisted: Boolean)
public fun setAnchorElement(element: HTMLElement)
public fun getPrimaryTextAtIndex(index: Int): String
public fun setEnabled(index: Int, isEnabled: Boolean)
public fun typeaheadMatchItem(nextChar: String): Int
}

@Suppress("ClassName")
public object strings {
public val SELECTED_EVENT: String
}

public class MDCMenuSelectedEventDetail {
public val item: Element
public val index: Int
}

public class MDCMenuSelectedEvent : MDCEvent<MDCMenuSelectedEventDetail>
}
13 changes: 13 additions & 0 deletions kmdc/kmdc-menu/src/jsMain/kotlin/events.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import dev.petuska.kmdc.core.MDCAttrsDsl
import dev.petuska.kmdc.menu.MDCMenuAttrsScope
import dev.petuska.kmdc.menu.MDCMenuModule

/**
* [JS API](https://github.com/material-components/material-components-web/tree/v13.0.0/packages/mdc-menu)
*/
@MDCAttrsDsl
public fun MDCMenuAttrsScope.onSelected(listener: (event: MDCMenuMo B41A dule.MDCMenuSelectedEvent) -> Unit) {
addEventListener(MDCMenuModule.strings.SELECTED_EVENT) {
listener(it.nativeEvent.unsafeCast<MDCMenuModule.MDCMenuSelectedEvent>())
}
}
30 changes: 30 additions & 0 deletions kotlin-js-store/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,36 @@
"@material/typography" "^13.0.0"
tslib "^2.1.0"

"@material/menu-surface@^13.0.0":
version "13.0.0"
resolved "https://registry.yarnpkg.com/@material/menu-surface/-/menu-surface-13.0.0.tgz#b4c6c799e714cba6465513dbf1020ba2fcaee588"
integrity sha512-Irfnk0l8AO7z8ucilbBzZI8izbFV/aK1GbiPpT1SmZuKkL1z+04rB2HpB+OqwaBixdLTDq70AyawcnQ0MACeXQ==
dependencies:
"@material/animation" "^13.0.0"
"@material/base" "^13.0.0"
"@material/elevation" "^13.0.0"
"@material/feature-targeting" "^13.0.0"
"@material/rtl" "^13.0.0"
"@material/shape" "^13.0.0"
"@material/theme" "^13.0.0"
tslib "^2.1.0"

"@material/menu@^13.0.0":
version "13.0.0"
resolved "https://registry.yarnpkg.com/@material/menu/-/menu-13.0.0.tgz#60fdca3f3a8457dfee83938adaf6288789ad0ac1"
integrity sha512-RY9R2ubYU6a7WRJW3nWr/AoSzdrxwUGqkfJSx0U9M/wK1vbXYYcJ7eCXFzSpa5VrstE7of7PbyYtQ8V61tILEQ==
dependencies:
"@material/base" "^13.0.0"
"@material/dom" "^13.0.0"
"@material/elevation" "^13.0.0"
"@material/feature-targeting" "^13.0.0"
"@material/list" "^13.0.0"
"@material/menu-surface" "^13.0.0"
"@material/ripple" "^13.0.0"
"@material/rtl" "^13.0.0"
"@material/theme" "^13.0.0"
tslib "^2.1.0"

"@material/notched-outline@^13.0.0":
version "13.0.0"
resolved "https://registry.yarnpkg.com/@material/notched-outline/-/notched-outline-13.0.0.tgz#0a043cb87fc9aa19b00a1a9b7c010eab8250b820"
Expand Down
Loading
0