-
Notifications
You must be signed in to change notification settings - Fork 28
/
Copy pathbuttonMenu.svelte
69 lines (59 loc) · 1.77 KB
/
buttonMenu.svelte
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<script context="module" lang="ts">
import type { HTMLAttributes } from 'svelte/elements'
declare global {
namespace JSX {
interface IntrinsicElements {
'leo-menu-item': HTMLAttributes<HTMLElement> & {
key?: string | number | null
children?: any
onClick?: EventListener
}
}
}
}
</script>
<script lang="ts">
import Menu, { type CloseEvent, type CloseEventDetail } from '../menu/menu.svelte'
import type { Strategy } from '@floating-ui/dom'
export let isOpen: boolean | undefined = undefined
export let onClose: CloseEvent = undefined
export let onChange: (e: { isOpen: boolean }) => void = undefined
export let positionStrategy: Strategy = 'absolute'
let anchor: HTMLElement
$: isOpenInternal = isOpen ?? false
const toggle = () => {
const toggleTo = !isOpenInternal
if (isOpen === undefined) isOpenInternal = toggleTo
onChange?.({ isOpen: toggleTo })
}
const handleClose = (e: CloseEventDetail) => {
if (isOpen === undefined) isOpenInternal = false
onClose?.(e)
onChange?.({ isOpen: false })
}
</script>
<div class="leo-button-menu">
<!--
We disable this check - the menu is triggered by the contained element
firing a `click` event. This may be triggered with a keypress or click.
-->
<!-- svelte-ignore a11y-click-events-have-key-events -->
<div bind:this={anchor} on:click|stopPropagation={toggle}>
<slot name="anchor-content"/>
</div>
<Menu {positionStrategy} isOpen={isOpenInternal} target={anchor} onClose={handleClose}>
<slot />
</Menu>
</div>
<style lang="scss">
:host {
display: inline-block;
}
.leo-button-menu {
cursor: pointer;
-webkit-tap-highlight-color: transparent;
button {
all: unset;
}
}
</style>