@@ -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