Type action menu
This commit is contained in:
parent
6a3991834f
commit
aec137525e
|
@ -1,25 +1,26 @@
|
||||||
<script>
|
<script lang="ts">
|
||||||
import { setContext, getContext } from "svelte"
|
import { setContext, getContext } from "svelte"
|
||||||
import Popover from "../Popover/Popover.svelte"
|
import Popover from "../Popover/Popover.svelte"
|
||||||
import Menu from "../Menu/Menu.svelte"
|
import Menu from "../Menu/Menu.svelte"
|
||||||
|
import { PopoverAlignment } from "../constants"
|
||||||
|
|
||||||
export let disabled = false
|
export let disabled: boolean = false
|
||||||
export let align = "left"
|
export let align: `${PopoverAlignment}` = "left"
|
||||||
export let portalTarget = undefined
|
export let portalTarget: string | undefined = undefined
|
||||||
export let openOnHover = false
|
export let openOnHover: boolean = false
|
||||||
export let animate = true
|
export let animate: boolean | undefined = true
|
||||||
export let offset = undefined
|
export let offset: number | undefined = undefined
|
||||||
|
|
||||||
const actionMenuContext = getContext("actionMenu")
|
const actionMenuContext = getContext("actionMenu")
|
||||||
|
|
||||||
let anchor
|
let anchor: HTMLElement | undefined
|
||||||
let dropdown
|
let dropdown: Popover
|
||||||
let timeout
|
let timeout: ReturnType<typeof setTimeout>
|
||||||
|
|
||||||
// This is needed because display: contents is considered "invisible".
|
// This is needed because display: contents is considered "invisible".
|
||||||
// It should only ever be an action button, so should be fine.
|
// It should only ever be an action button, so should be fine.
|
||||||
function getAnchor(node) {
|
function getAnchor(node: HTMLDivElement) {
|
||||||
anchor = node.firstChild
|
anchor = (node.firstChild as HTMLElement) ?? undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
export const show = () => {
|
export const show = () => {
|
||||||
|
@ -37,7 +38,7 @@
|
||||||
actionMenuContext?.hide()
|
actionMenuContext?.hide()
|
||||||
}
|
}
|
||||||
|
|
||||||
const openMenu = event => {
|
const openMenu = (event: Event) => {
|
||||||
if (!disabled) {
|
if (!disabled) {
|
||||||
event.stopPropagation()
|
event.stopPropagation()
|
||||||
show()
|
show()
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
import { ActionMenu } from "./types"
|
||||||
|
|
||||||
|
declare module "svelte" {
|
||||||
|
export function getContext(key: "actionMenu"): ActionMenu | undefined
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
export interface ActionMenu {
|
||||||
|
hide: () => void
|
||||||
|
}
|
Loading…
Reference in New Issue