Files
hossein-por-shop/frontend/components/global/Dropdown.vue
T
2025-02-06 22:56:20 +03:30

55 lines
2.0 KiB
Vue

<script setup lang="ts">
// types
type Props = {
items?: DropdownItem[];
};
// props
defineProps<Props>();
// state
const toggleState = ref(false);
</script>
<template>
<DropdownMenuRoot v-model:open="toggleState" dir="rtl">
<DropdownMenuTrigger>
<slot name="trigger" />
</DropdownMenuTrigger>
<DropdownMenuPortal>
<slot v-if="!!$slots.content" name="content" />
<DropdownMenuContent
v-else
class="min-w-[220px] w-full divide-y divide-gray-300 outline-none bg-gray-50 border border-gray-300 rounded-2xl font-iran-yekan-x p-2 shadow-sm will-change-[opacity,transform] data-[side=top]:animate-slide-down-fade data-[side=right]:animate-slide-left-fade data-[side=bottom]:animate-slide-up-fade data-[side=left]:animate-slide-right-fade z-10000"
:side-offset="5"
>
<DropdownMenuItem
v-for="(item, index) in items"
:key="index"
@click="item.onClick"
:class="
item.itemClass ? item.itemClass : 'hover:!text-black'
"
class="group text-xs leading-none text-black hover:!bg-gray-200 cursor-pointer rounded-lg flex items-center justify-between py-3 px-1.5 relative select-none outline-none data-[disabled]:opacity-50 data-[disabled]:pointer-events-none data-[highlighted]:bg-black data-[highlighted]:text-white"
>
<span>
{{ item.title }}
</span>
<Icon
:name="item.icon"
:class="item.iconClass"
size="16"
class="**:stroke-black"
/>
</DropdownMenuItem>
<DropdownMenuArrow class="fill-white stroke-gray-300" />
</DropdownMenuContent>
</DropdownMenuPortal>
</DropdownMenuRoot>
</template>