opnform-host-nginx/client/components/global/Dropdown.vue

70 lines
1.2 KiB
Vue
Raw Normal View History

2023-12-09 15:47:03 +01:00
<template>
<div
ref="dropdown"
class="relative"
>
<slot
name="trigger"
:toggle="toggle"
:open="open"
:close="close"
2023-12-09 15:47:03 +01:00
/>
<collapsible
v-model="isOpen"
:class="dropdownClass"
@click-away="onClickAway"
>
<div
class="py-1"
role="menu"
aria-orientation="vertical"
aria-labelledby="options-menu"
>
<slot />
2023-12-09 15:47:03 +01:00
</div>
</collapsible>
</div>
</template>
2023-12-20 13:42:43 +01:00
<script setup>
import { ref } from "vue"
import Collapsible from "./transitions/Collapsible.vue"
2023-12-09 15:47:03 +01:00
defineProps({
2023-12-20 13:42:43 +01:00
dropdownClass: {
type: String,
default:
"origin-top-right absolute right-0 mt-2 w-56 rounded-md shadow-lg bg-white dark:bg-gray-800 ring-1 ring-black ring-opacity-5 z-20",
},
2023-12-20 13:42:43 +01:00
})
const isOpen = ref(false)
const dropdown = ref(null)
const open = () => {
2023-12-20 13:42:43 +01:00
isOpen.value = true
}
const close = () => {
2023-12-20 13:42:43 +01:00
isOpen.value = false
}
const toggle = () => {
2023-12-20 13:42:43 +01:00
isOpen.value = !isOpen.value
}
const onClickAway = (event) => {
// Check that event target isn't children of dropdown
if (dropdown.value && !dropdown.value.contains(event.target)) {
close(event)
2023-12-09 15:47:03 +01:00
}
}
defineExpose({
open,
close,
toggle,
})
2023-12-09 15:47:03 +01:00
</script>