Skip to content

Commit d5c7a20

Browse files
committed
feat(link): enhance slot functionality in link components to pass isHref prop for better context handling
1 parent fb2e0e5 commit d5c7a20

File tree

8 files changed

+15
-16
lines changed

8 files changed

+15
-16
lines changed

headless/src/components/link/link.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ const handleClick = (event: Event) => {
8484

8585
<template>
8686
<Primitive v-if="isHref" v-bind="forwardedProps" @click="handleClick">
87-
<slot />
87+
<slot :is-href="true" />
8888
</Primitive>
8989
<component :is="LinkComponent" v-else v-bind="forwardedProps" @click="handleClick">
90-
<slot />
90+
<slot :is-href="false" />
9191
</component>
9292
</template>

headless/src/components/navigation-menu/navigation-menu-link.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,14 @@ const onClick = async (event: MouseEvent) => {
4747

4848
<template>
4949
<Link
50+
v-slot="{ isHref }"
5051
v-bind="forwardedProps"
5152
:ref="setItemElement"
5253
:class="cls"
5354
:data-active="active ? '' : undefined"
5455
:aria-current="active ? 'page' : undefined"
5556
@click="onClick"
5657
>
57-
<slot />
58+
<slot :is-href="isHref" />
5859
</Link>
5960
</template>

src/components/link/link.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const cls = computed(() => cn(variants, props.class));
2525
</script>
2626

2727
<template>
28-
<Link v-bind="props" :class="cls">
29-
<slot />
28+
<Link v-slot="{ isHref }" v-bind="props" :class="cls">
29+
<slot :is-href="isHref" />
3030
</Link>
3131
</template>

src/components/menu/menu-option.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,12 @@ const ui = computed(() => ({ ...themeContext?.ui?.value }));
6666
:text-value="item.textValue"
6767
@select="emit('select', item, $event)"
6868
>
69-
<Link v-bind="item.linkProps" :disabled="item.disabled">
69+
<Link v-slot="{ isHref }" v-bind="item.linkProps" :disabled="item.disabled">
7070
<SMenuItemSlot :icon="item.icon" :label="item.label">
7171
<template v-for="slotKey in commonSlotKeys" :key="slotKey" #[slotKey]>
7272
<slot :name="slotKey" :item="item" />
7373
</template>
74-
<template #link-icon>
74+
<template v-if="isHref" #link-icon>
7575
<slot name="item-link-icon" :item="item">
7676
<Icon icon="lucide:arrow-up-right" :class="ui.itemLinkIcon" />
7777
</slot>

src/components/navigation-menu/navigation-menu-option.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ const { ui } = useNavigationMenuExtraThemeContext('NavigationMenuOption');
4747
<NavigationMenuItem v-bind="itemProps" :value="item.value">
4848
<NavigationMenuLink
4949
v-if="!item.children?.length"
50+
v-slot="{ isHref }"
5051
v-bind="item.linkProps"
5152
:disabled="item.disabled"
5253
@select="emit('select', $event)"
@@ -56,7 +57,7 @@ const { ui } = useNavigationMenuExtraThemeContext('NavigationMenuOption');
5657
<template v-for="slotKey in commonSlotKeys" :key="slotKey" #[slotKey]>
5758
<slot :name="slotKey" :item="item" />
5859
</template>
59-
<template #link-icon>
60+
<template v-if="isHref" #link-icon>
6061
<slot name="item-link-icon" :item="item">
6162
<Icon icon="lucide:arrow-up-right" :class="ui.linkIcon" />
6263
</slot>

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const attrs = useAttrs();
2626
2727
const listeners = useForwardListeners(emit);
2828
29-
const { size, collapsed, showLinkIcon } = useTreeMenuContext('TreeMenuItem');
29+
const { size, collapsed } = useTreeMenuContext('TreeMenuItem');
3030
3131
const { ui } = useTreeMenuThemeContext('TreeMenuItem');
3232
@@ -102,6 +102,7 @@ const onDropdownMenuSelect = (item: TreeMenuBaseOptionData) => {
102102
>
103103
<component
104104
:is="as"
105+
v-slot="slotProps"
105106
v-bind="contentProps"
106107
:class="ui.itemContent"
107108
:data-link="isLink ? '' : undefined"
@@ -116,7 +117,7 @@ const onDropdownMenuSelect = (item: TreeMenuBaseOptionData) => {
116117
</Badge>
117118
<span v-else :class="ui.itemLabel">{{ label }}</span>
118119
</slot>
119-
<Icon v-if="isLink && showLinkIcon" icon="lucide:arrow-up-right" :class="ui.itemLinkIcon" />
120+
<Icon v-if="isLink && slotProps?.isHref" icon="lucide:arrow-up-right" :class="ui.itemLinkIcon" />
120121
<Tag v-if="tag" v-bind="tagProps" :size="size" :content="tag" :class="ui.itemTag" />
121122
<DropdownMenu
122123
v-if="actions?.length"

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { computed, watch } from 'vue';
33
import type { CSSProperties } from 'vue';
44
import { TreeRoot } from '@soybeanjs/headless';
55
import { useControllableState, useForwardListeners, useOmitProps } from '@soybeanjs/headless/composables';
6-
import { transformPropsToContext } from '@soybeanjs/headless/shared';
76
import { vAutoAnimate } from '@formkit/auto-animate';
87
import { mergeSlotVariants, themeSizeMap, themeSizeRatio } from '@/theme';
98
import { treeMenuVariants } from '@/variants/tree-menu';
@@ -82,8 +81,7 @@ const size = computed(() => props.size ?? 'md');
8281
8382
provideTreeMenuContext({
8483
collapsed,
85-
size,
86-
...transformPropsToContext(props, ['showLinkIcon'])
84+
size
8785
});
8886
8987
provideTreeMenuThemeContext({

src/components/tree-menu/types.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import type { ComputedRef, ShallowRef } from 'vue';
22
import type {
33
ClassValue,
44
LinkProps,
5-
PropsToContext,
65
TreeItemEmits,
76
TreeItemProps,
87
TreeRootEmits,
@@ -91,14 +90,13 @@ export interface TreeMenuProps<T extends TreeMenuOptionData = TreeMenuOptionData
9190
badgeProps?: Omit<BadgeProps, 'content'>;
9291
tagProps?: Omit<TagProps, 'content'>;
9392
actionMenuProps?: Omit<DropdownMenuProps, 'items'>;
94-
showLinkIcon?: boolean;
9593
}
9694

9795
export type TreeMenuEmits = TreeRootEmits<false> & {
9896
'update:collapsed': [value: boolean];
9997
};
10098

101-
export interface TreeMenuContextParams extends PropsToContext<TreeMenuProps, 'showLinkIcon'> {
99+
export interface TreeMenuContextParams {
102100
collapsed: ShallowRef<boolean | undefined>;
103101
size?: ComputedRef<ThemeSize>;
104102
}

0 commit comments

Comments
 (0)