Newer
Older
vmk-ui-kit / src / vue / components / GnDropdown.js
/**
 * GnDropdown - Dropdown menu wrapper.
 */

import { defineComponent, h, ref, provide, computed } from "vue";
import { cx } from "../utils.js";

export const dropdownKey = Symbol("vmk-ui-kit-dropdown");

export default defineComponent({
	name: "GnDropdown",
	props: {
		placement: { type: String, default: "left" },
		open: { type: Boolean, default: false }
	},
	emits: ["update:open"],
	setup(props, { slots, emit }) {
		const isOpen = ref(props.open);

		const toggle = () => {
			isOpen.value = !isOpen.value;
			emit("update:open", isOpen.value);
		};

		const close = () => {
			isOpen.value = false;
			emit("update:open", false);
		};

		provide(dropdownKey, { isOpen, close });

		return () => h("div", { class: "dropdown" }, [
			h("button", {
				class: "btn btn-sm btn-secondary",
				type: "button",
				"data-dropdown-trigger": "",
				onClick: toggle
			}, slots.trigger?.()),
			h("div", {
				class: cx("dropdown-menu", { "is-open": isOpen.value }),
				"data-placement": props.placement
			}, slots.default?.())
		]);
	}
});