Skip to content

Commit 8fd11d1

Browse files
committed
refactor(tree-menu): improve item action positioning and tooltip logic for better usability
1 parent 630c3ff commit 8fd11d1

File tree

2 files changed

+18
-9
lines changed

2 files changed

+18
-9
lines changed

src/components/tree-menu/tree-menu-item.vue

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ const showDropdown = computed(() => collapsed.value && hasChildren.value);
6262
6363
const tooltip = computed(() => (collapsed.value && !showDropdown.value ? props.label : undefined));
6464
65-
const showAbsolute = computed(() => showDropdown.value || tooltip.value);
65+
const showAbsolute = computed(() => Boolean(showDropdown.value || tooltip.value));
6666
6767
const tooltipProps = computed(() => ({
6868
placement: 'right' as const,
@@ -95,6 +95,8 @@ const onDropdownMenuSelect = (item: TreeMenuBaseOptionData) => {
9595
:class="ui.item"
9696
v-bind="forwardedProps"
9797
:data-level="level"
98+
:disabled-toggle="showAbsolute"
99+
:disabled-select="showAbsolute"
98100
:style="itemStyle"
99101
v-on="listeners"
100102
>
@@ -124,7 +126,7 @@ const onDropdownMenuSelect = (item: TreeMenuBaseOptionData) => {
124126
@select="onActionSelect"
125127
>
126128
<template #trigger>
127-
<ButtonIcon icon="lucide:ellipsis" :size="size" :class="ui.itemAction" @click.stop />
129+
<ButtonIcon v-if="!collapsed" icon="lucide:ellipsis" :size="size" :class="ui.itemAction" @click.stop />
128130
</template>
129131
</DropdownMenu>
130132
<slot name="trailing" />
@@ -148,6 +150,7 @@ const onDropdownMenuSelect = (item: TreeMenuBaseOptionData) => {
148150
:items="children ?? []"
149151
:disabled="disabled"
150152
:size="size"
153+
:data-menu="label"
151154
@select="onDropdownMenuSelect"
152155
>
153156
<template #trigger>

src/variants/tree-menu.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export const treeMenuVariants = tv({
2020
itemLinkIcon: `shrink-0 self-start text-muted-foreground`,
2121
itemBadge: ``,
2222
itemTag: `shrink-0 ml-auto`,
23-
itemAction: `shrink-0 ml-auto`,
23+
itemAction: `absolute -translate-y-1/2 top-1/2`,
2424
collapsibleIcon: `shrink-0 ml-auto text-muted-foreground transition-transform-200 data-[expanded]:rotate-90`
2525
},
2626
variants: {
@@ -30,42 +30,48 @@ export const treeMenuVariants = tv({
3030
groupLabel: 'h-6 gap-1 px-1.5 py-1 text-3xs',
3131
item: 'h-6 px-1.5 py-1 group-data-[state=collapsed]:w-6 text-2xs ml-[calc(var(--soybean-tree-menu-indent)*0.75rem)]',
3232
itemContent: 'gap-1.5',
33-
itemLinkIcon: 'size-2 -ml-1'
33+
itemLinkIcon: 'size-2 -ml-1',
34+
itemAction: 'right-1.5'
3435
},
3536
sm: {
3637
root: 'space-y-0.875 p-1.75 text-xs',
3738
groupLabel: 'h-7 gap-1.5 px-1.75 py-1 text-2xs',
3839
item: 'h-7 px-1.75 py-1 group-data-[state=collapsed]:w-7 text-xs ml-[calc(var(--soybean-tree-menu-indent)*0.875rem)]',
3940
itemContent: 'gap-1.75',
40-
itemLinkIcon: 'size-2.5 -ml-1.5'
41+
itemLinkIcon: 'size-2.5 -ml-1.5',
42+
itemAction: 'right-1.75'
4143
},
4244
md: {
4345
root: 'space-y-1 p-2 text-sm',
4446
groupLabel: 'h-8 gap-2 px-2 py-1.5 text-xs',
4547
item: 'h-8 px-2 py-1.5 group-data-[state=collapsed]:w-8 text-sm ml-[calc(var(--soybean-tree-menu-indent)*1rem)]',
4648
itemContent: 'gap-2',
47-
itemLinkIcon: 'size-3 -ml-2'
49+
itemLinkIcon: 'size-3 -ml-2',
50+
itemAction: 'right-2'
4851
},
4952
lg: {
5053
root: 'space-y-1.25 p-2.25 text-base',
5154
groupLabel: 'h-9 gap-2.5 px-2.25 py-1.5 text-sm',
5255
item: 'h-9 px-2.25 py-1.5 group-data-[state=collapsed]:w-9 text-base ml-[calc(var(--soybean-tree-menu-indent)*1.125rem)]',
5356
itemContent: 'gap-2.25',
54-
itemLinkIcon: 'size-3.5 -ml-2.5'
57+
itemLinkIcon: 'size-3.5 -ml-2.5',
58+
itemAction: 'right-2.25'
5559
},
5660
xl: {
5761
root: 'space-y-1.5 p-2.5 text-lg',
5862
groupLabel: 'h-10 gap-3 px-2.5 py-1.5 text-base',
5963
item: 'h-10 px-2.5 py-2 group-data-[state=collapsed]:w-10 text-lg ml-[calc(var(--soybean-tree-menu-indent)*1.25rem)]',
6064
itemContent: 'gap-2.5',
61-
itemLinkIcon: 'size-4 -ml-3'
65+
itemLinkIcon: 'size-4 -ml-3',
66+
itemAction: 'right-2.5'
6267
},
6368
'2xl': {
6469
root: 'space-y-2 p-3 text-xl',
6570
groupLabel: 'h-12 gap-3.5 px-3 py-2.5 text-lg',
6671
item: 'h-12 px-3 py-2.5 group-data-[state=collapsed]:w-12 text-xl ml-[calc(var(--soybean-tree-menu-indent)*1.5rem)]',
6772
itemContent: 'gap-3',
68-
itemLinkIcon: 'size-5 -ml-4'
73+
itemLinkIcon: 'size-5 -ml-4',
74+
itemAction: 'right-3'
6975
}
7076
}
7177
},

0 commit comments

Comments
 (0)