use melt menu for DropDownV2

This commit is contained in:
Guilhem
2025-02-04 18:41:28 +00:00
parent 68d9a2bb40
commit b891a40ac1
4 changed files with 44 additions and 17 deletions

View File

@@ -1,6 +1,7 @@
<script lang="ts">
import { MoreVertical } from 'lucide-svelte'
import Menu from './common/menu/MenuV2.svelte'
import { Menu, Menubar } from '$lib/components/meltComponents'
import { melt } from '@melt-ui/svelte'
import DropdownV2Inner from './DropdownV2Inner.svelte'
@@ -27,17 +28,21 @@
}
</script>
<Menu placement="bottom-end" {justifyEnd} on:close on:open {disabled}>
<div slot="trigger">
{#if $$slots.buttonReplacement}
<slot name="buttonReplacement" />
{:else}
<MoreVertical
size={16}
class="w-8 h-8 p-2 hover:bg-surface-hover cursor-pointer rounded-md"
/>
{/if}
</div>
<Menubar let:createMenu>
<Menu {createMenu} placement="bottom-end" {justifyEnd} on:close on:open {disabled} let:item>
<svelte:fragment slot="trigger" let:trigger>
<div use:melt={trigger}>
{#if $$slots.buttonReplacement}
<slot name="buttonReplacement" />
{:else}
<MoreVertical
size={16}
class="w-8 h-8 p-2 hover:bg-surface-hover cursor-pointer rounded-md"
/>
{/if}
</div>
</svelte:fragment>
<DropdownV2Inner items={computeItems} />
</Menu>
<DropdownV2Inner items={computeItems} meltItem={item} />
</Menu>
</Menubar>

View File

@@ -1,5 +1,5 @@
<script lang="ts">
import { MenuItem } from '@rgossiaux/svelte-headlessui'
import { MenuItem } from '$lib/components/meltComponents'
import { Loader2 } from 'lucide-svelte'
import { twMerge } from 'tailwind-merge'
@@ -14,6 +14,7 @@
}
export let items: Item[] | (() => Item[]) | (() => Promise<Item[]>) = []
export let meltItem: any
let computedItems: Item[] | undefined = undefined
async function computeItems() {
@@ -35,13 +36,15 @@
href={item?.href}
disabled={item?.disabled}
class={twMerge(
'px-4 py-2 text-primary hover:bg-surface-hover hover:text-primary cursor-pointer text-xs transition-all',
'px-4 py-2 text-primary font-normal hover:bg-surface-hover cursor-pointer text-xs transition-all',
'data-[highlighted]:bg-surface-hover',
'flex flex-row gap-2 items-center',
item?.disabled && 'text-gray-400 cursor-not-allowed',
item?.type === 'delete' &&
!item?.disabled &&
'text-red-500 hover:bg-red-100 hover:text-red-500'
'text-red-500 hover:bg-red-100 hover:text-red-500 data-[highlighted]:text-red-500 data-[highlighted]:bg-red-100'
)}
item={meltItem}
>
{#if item.icon}
<svelte:component this={item.icon} size={14} />

View File

@@ -0,0 +1,18 @@
<script lang="ts">
import { melt } from '@melt-ui/svelte'
export let href: string | undefined = undefined
export let disabled: boolean = false
export let item: any
</script>
{#if href}
<a {href} use:melt={item} {disabled} class={$$props.class}>
<slot />
</a>
{:else}
<button use:melt={item} on:click {disabled} class={$$props.class}>
<slot />
</button>
{/if}

View File

@@ -1,2 +1,3 @@
export { default as Menu } from './Menu.svelte'
export { default as Menubar } from './Menubar.svelte'
export { default as MenuItem } from './MenuItem.svelte'