feat: Update the design for the dropdown menu component (#10265)
Co-authored-by: Pranav <pranavrajs@gmail.com>
This commit is contained in:
@@ -0,0 +1,55 @@
|
|||||||
|
<script setup>
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import DropdownMenu from './DropdownMenu.vue';
|
||||||
|
import Button from 'dashboard/components-next/button/Button.vue';
|
||||||
|
const menuItems = [
|
||||||
|
{ label: 'Edit', action: 'edit', icon: 'edit' },
|
||||||
|
{ label: 'Publish', action: 'publish', icon: 'checkmark' },
|
||||||
|
{ label: 'Archive', action: 'archive', icon: 'archive' },
|
||||||
|
{ label: 'Delete', action: 'delete', icon: 'delete' },
|
||||||
|
];
|
||||||
|
const isOpen = ref(false);
|
||||||
|
const toggleDropdown = () => {
|
||||||
|
isOpen.value = !isOpen.value;
|
||||||
|
};
|
||||||
|
const handleAction = () => {
|
||||||
|
isOpen.value = false;
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<Story title="Components/DropdownMenu" :layout="{ type: 'grid', width: 300 }">
|
||||||
|
<Variant title="Default">
|
||||||
|
<div class="p-4 bg-white h-72 dark:bg-slate-900">
|
||||||
|
<div class="relative">
|
||||||
|
<Button label="Open Menu" size="sm" @click="toggleDropdown" />
|
||||||
|
<DropdownMenu
|
||||||
|
v-if="isOpen"
|
||||||
|
:menu-items="menuItems"
|
||||||
|
class="absolute left-0 top-10"
|
||||||
|
@action="handleAction"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Variant>
|
||||||
|
|
||||||
|
<Variant title="Always Open">
|
||||||
|
<div class="p-4 bg-white h-72 dark:bg-slate-900">
|
||||||
|
<DropdownMenu :menu-items="menuItems" @action="handleAction" />
|
||||||
|
</div>
|
||||||
|
</Variant>
|
||||||
|
|
||||||
|
<Variant title="Custom Items">
|
||||||
|
<div class="p-4 bg-white h-72 dark:bg-slate-900">
|
||||||
|
<DropdownMenu
|
||||||
|
:menu-items="[
|
||||||
|
{ label: 'Custom 1', action: 'custom1', icon: 'file-upload' },
|
||||||
|
{ label: 'Custom 2', action: 'custom2', icon: 'document' },
|
||||||
|
{ label: 'Danger', action: 'delete', icon: 'delete' },
|
||||||
|
]"
|
||||||
|
@action="handleAction"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</Variant>
|
||||||
|
</Story>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<script setup>
|
||||||
|
import { defineProps, defineEmits } from 'vue';
|
||||||
|
import Button from 'dashboard/components-next/button/Button.vue';
|
||||||
|
|
||||||
|
defineProps({
|
||||||
|
menuItems: {
|
||||||
|
type: Array,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const emit = defineEmits(['action']);
|
||||||
|
|
||||||
|
const handleAction = action => {
|
||||||
|
emit('action', action);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="bg-white dark:bg-slate-800 absolute rounded-xl z-50 py-3 px-1 gap-2 flex flex-col min-w-[136px] shadow-lg"
|
||||||
|
>
|
||||||
|
<Button
|
||||||
|
v-for="item in menuItems"
|
||||||
|
:key="item.action"
|
||||||
|
:label="item.label"
|
||||||
|
:icon="item.icon"
|
||||||
|
variant="ghost"
|
||||||
|
size="sm"
|
||||||
|
class="!justify-start w-full hover:bg-white dark:hover:bg-slate-800 z-60 font-normal"
|
||||||
|
:text-variant="item.action === 'delete' ? 'danger' : ''"
|
||||||
|
@click="handleAction(item.action)"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
Reference in New Issue
Block a user