@@ -42,10 +42,11 @@ export interface NavigationMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'cu
42
42
trailingIcon?: string
43
43
/**
44
44
* The type of the item.
45
- * The `label` type only works on `vertical` orientation.
45
+ * The `label` type is only displayed in `vertical` orientation.
46
+ * The `trigger` type is used to force the item to be collapsible when its a link in `vertical` orientation.
46
47
* @defaultValue 'link'
47
48
*/
48
- type?: 'label' | 'link'
49
+ type?: 'label' | 'trigger' | ' link'
49
50
slot?: string
50
51
/**
51
52
* The value of the item. Avoid using `index` as the value to prevent conflicts in horizontal orientation with Reka UI.
@@ -300,21 +301,21 @@ function getAccordionDefaultValue(list: NavigationMenuItem[]) {
300
301
<div v-if="orientation === 'vertical' && item.type === 'label' && !collapsed" :class="ui.label({ class: [props.ui?.label, item.ui?.label, item.class] })">
301
302
<ReuseLinkTemplate :item="item" :index="index" />
302
303
</div>
303
- <ULink v-else-if="item.type !== 'label'" v-slot="{ active, ...slotProps }" v-bind="pickLinkProps(item as Omit<NavigationMenuItem, 'type'>)" custom>
304
+ <ULink v-else-if="item.type !== 'label'" v-slot="{ active, ...slotProps }" v-bind="(orientation === 'vertical' && item.children?.length && !collapsed && item.type === 'trigger') ? {} : pickLinkProps(item as Omit<NavigationMenuItem, 'type'>)" custom>
304
305
<component
305
306
:is="(orientation === 'horizontal' && (item.children?.length || !!slots[(item.slot ? `${item.slot}-content` : 'item-content') as keyof NavigationMenuSlots<T>])) ? NavigationMenuTrigger : ((orientation === 'vertical' && item.children?.length && !collapsed && !(slotProps as any).href) ? AccordionTrigger : NavigationMenuLink)"
306
307
as-child
307
- :active="active"
308
+ :active="active || item.active "
308
309
:disabled="item.disabled"
309
310
@select="item.onSelect"
310
311
>
311
312
<UPopover v-if="orientation === 'vertical' && collapsed && item.children?.length && (!!props.popover || !!item.popover)" v-bind="{ ...popoverProps, ...(typeof item.popover === 'boolean' ? {} : item.popover || {}) }" :ui="{ content: ui.content({ class: [props.ui?.content, item.ui?.content] }) }">
312
- <ULinkBase v-bind="slotProps" :class="ui.link({ class: [props.ui?.link, item.ui?.link, item.class], active, disabled: !!item.disabled, level: level > 0 })">
313
- <ReuseLinkTemplate :item="item" :active="active" :index="index" />
313
+ <ULinkBase v-bind="slotProps" :class="ui.link({ class: [props.ui?.link, item.ui?.link, item.class], active: active || item.active , disabled: !!item.disabled, level: level > 0 })">
314
+ <ReuseLinkTemplate :item="item" :active="active || item.active " :index="index" />
314
315
</ULinkBase>
315
316
316
317
<template #content>
317
- <slot :name="((item.slot ? `${item.slot}-content` : 'item-content') as keyof NavigationMenuSlots<T>)" :item="item" :active="active" :index="index">
318
+ <slot :name="((item.slot ? `${item.slot}-content` : 'item-content') as keyof NavigationMenuSlots<T>)" :item="item" :active="active || item.active " :index="index">
318
319
<ul :class="ui.childList({ class: [props.ui?.childList, item.ui?.childList] })">
319
320
<li :class="ui.childLabel({ class: [props.ui?.childLabel, item.ui?.childLabel] })">
320
321
{{ get(item, props.labelKey as string) }}
@@ -339,17 +340,17 @@ function getAccordionDefaultValue(list: NavigationMenuItem[]) {
339
340
</template>
340
341
</UPopover>
341
342
<UTooltip v-else-if="orientation === 'vertical' && collapsed && (!!props.tooltip || !!item.tooltip)" :text="get(item, props.labelKey as string)" v-bind="{ ...tooltipProps, ...(typeof item.tooltip === 'boolean' ? {} : item.tooltip || {}) }">
342
- <ULinkBase v-bind="slotProps" :class="ui.link({ class: [props.ui?.link, item.ui?.link, item.class], active, disabled: !!item.disabled, level: level > 0 })">
343
- <ReuseLinkTemplate :item="item" :active="active" :index="index" />
343
+ <ULinkBase v-bind="slotProps" :class="ui.link({ class: [props.ui?.link, item.ui?.link, item.class], active: active || item.active , disabled: !!item.disabled, level: level > 0 })">
344
+ <ReuseLinkTemplate :item="item" :active="active || item.active " :index="index" />
344
345
</ULinkBase>
345
346
</UTooltip>
346
- <ULinkBase v-else v-bind="slotProps" :class="ui.link({ class: [props.ui?.link, item.ui?.link, item.class], active, disabled: !!item.disabled, level: orientation === 'horizontal' || level > 0 })">
347
- <ReuseLinkTemplate :item="item" :active="active" :index="index" />
347
+ <ULinkBase v-else v-bind="slotProps" :class="ui.link({ class: [props.ui?.link, item.ui?.link, item.class], active: active || item.active , disabled: !!item.disabled, level: orientation === 'horizontal' || level > 0 })">
348
+ <ReuseLinkTemplate :item="item" :active="active || item.active " :index="index" />
348
349
</ULinkBase>
349
350
</component>
350
351
351
352
<NavigationMenuContent v-if="orientation === 'horizontal' && (item.children?.length || !!slots[(item.slot ? `${item.slot}-content` : 'item-content') as keyof NavigationMenuSlots<T>])" v-bind="contentProps" :class="ui.content({ class: [props.ui?.content, item.ui?.content] })">
352
- <slot :name="((item.slot ? `${item.slot}-content` : 'item-content') as keyof NavigationMenuSlots<T>)" :item="item" :active="active" :index="index">
353
+ <slot :name="((item.slot ? `${item.slot}-content` : 'item-content') as keyof NavigationMenuSlots<T>)" :item="item" :active="active || item.active " :index="index">
353
354
<ul :class="ui.childList({ class: [props.ui?.childList, item.ui?.childList] })">
354
355
<li v-for="(childItem, childIndex) in item.children" :key="childIndex" :class="ui.childItem({ class: [props.ui?.childItem, item.ui?.childItem] })">
355
356
<ULink v-slot="{ active: childActive, ...childSlotProps }" v-bind="pickLinkProps(childItem)" custom>
0 commit comments