feat(theme): allow link on nav item with children

fix/2989
Divyansh Singh 1 year ago
parent 4f9a60b0cf
commit 36313dbe0e

@ -5,7 +5,7 @@ import { isActive } from '../../shared'
import VPLink from './VPLink.vue' import VPLink from './VPLink.vue'
defineProps<{ defineProps<{
item: DefaultTheme.NavItemWithLink item: DefaultTheme.NavItem
}>() }>()
const { page } = useData() const { page } = useData()

@ -6,21 +6,16 @@ import { isActive } from '../../shared'
import VPFlyout from './VPFlyout.vue' import VPFlyout from './VPFlyout.vue'
const props = defineProps<{ const props = defineProps<{
item: DefaultTheme.NavItemWithChildren item: DefaultTheme.NavItem
}>() }>()
const { page } = useData() const { page } = useData()
const isChildActive = (navItem: DefaultTheme.NavItem) => { const isChildActive = (navItem: DefaultTheme.NavItem) => {
if ('link' in navItem) { return (
return isActive( isActive(page.value.relativePath, navItem.link, !!props.item.activeMatch) ||
page.value.relativePath, navItem.items?.some(isChildActive)
navItem.link, )
!!props.item.activeMatch
)
} else {
return navItem.items.some(isChildActive)
}
} }
const childrenActive = computed(() => isChildActive(props.item)) const childrenActive = computed(() => isChildActive(props.item))
@ -30,11 +25,9 @@ const childrenActive = computed(() => isChildActive(props.item))
<VPFlyout <VPFlyout
:class="{ :class="{
VPNavBarMenuGroup: true, VPNavBarMenuGroup: true,
active: isActive( active:
page.relativePath, isActive(page.relativePath, item.activeMatch, !!item.activeMatch) ||
item.activeMatch, childrenActive
!!item.activeMatch
) || childrenActive
}" }"
:button="item.text" :button="item.text"
:items="item.items" :items="item.items"

@ -5,7 +5,7 @@ import { isActive } from '../../shared'
import VPLink from './VPLink.vue' import VPLink from './VPLink.vue'
defineProps<{ defineProps<{
item: DefaultTheme.NavItemWithLink item: DefaultTheme.NavItem
}>() }>()
const { page } = useData() const { page } = useData()

@ -9,15 +9,15 @@ const { theme } = useData()
<template> <template>
<nav v-if="theme.nav" class="VPNavScreenMenu"> <nav v-if="theme.nav" class="VPNavScreenMenu">
<template v-for="item in theme.nav" :key="item.text"> <template v-for="item in theme.nav" :key="item.text">
<VPNavScreenMenuLink
v-if="'link' in item"
:item="item"
/>
<VPNavScreenMenuGroup <VPNavScreenMenuGroup
v-else v-if="item.items"
:text="item.text || ''" :text="item.text || ''"
:items="item.items" :items="item.items"
/> />
<VPNavScreenMenuLink
v-else
:item="item"
/>
</template> </template>
</nav> </nav>
</template> </template>

@ -4,7 +4,7 @@ import { inject } from 'vue'
import VPLink from './VPLink.vue' import VPLink from './VPLink.vue'
defineProps<{ defineProps<{
item: DefaultTheme.NavItemWithLink item: DefaultTheme.NavItem
}>() }>()
const closeScreen = inject('close-screen') as () => void const closeScreen = inject('close-screen') as () => void

@ -4,7 +4,7 @@ import VPNavScreenMenuGroupLink from './VPNavScreenMenuGroupLink.vue'
defineProps<{ defineProps<{
text?: string text?: string
items: DefaultTheme.NavItemWithLink[] items: DefaultTheme.NavItem[]
}>() }>()
</script> </script>

@ -4,7 +4,7 @@ import { inject } from 'vue'
import VPLink from './VPLink.vue' import VPLink from './VPLink.vue'
defineProps<{ defineProps<{
item: DefaultTheme.NavItemWithLink item: DefaultTheme.NavItem
}>() }>()
const closeScreen = inject('close-screen') as () => void const closeScreen = inject('close-screen') as () => void

@ -149,12 +149,10 @@ export namespace DefaultTheme {
// nav ----------------------------------------------------------------------- // nav -----------------------------------------------------------------------
export type NavItem = NavItemWithLink | NavItemWithChildren export interface NavItem {
export interface NavItemWithLink {
text: string text: string
link: string link?: string
items?: never items?: NavItem[]
/** /**
* `activeMatch` is expected to be a regex string. We can't use actual * `activeMatch` is expected to be a regex string. We can't use actual
@ -165,22 +163,6 @@ export namespace DefaultTheme {
rel?: string rel?: string
} }
export interface NavItemChildren {
text?: string
items: NavItemWithLink[]
}
export interface NavItemWithChildren {
text?: string
items: (NavItemChildren | NavItemWithLink)[]
/**
* `activeMatch` is expected to be a regex string. We can't use actual
* RegExp object here because it isn't serializable
*/
activeMatch?: string
}
// image --------------------------------------------------------------------- // image ---------------------------------------------------------------------
export type ThemeableImage = export type ThemeableImage =

Loading…
Cancel
Save