feat: allow VPContent to use custom components (#5176)

pull/3312/merge
Shigma 5 months ago committed by GitHub
parent 19357f9d33
commit c0b38d52c2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1,4 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { resolveComponent } from 'vue'
import NotFound from '../NotFound.vue' import NotFound from '../NotFound.vue'
import { useData } from '../composables/data' import { useData } from '../composables/data'
import { useLayout } from '../composables/layout' import { useLayout } from '../composables/layout'
@ -8,6 +9,11 @@ import VPPage from './VPPage.vue'
const { page, frontmatter } = useData() const { page, frontmatter } = useData()
const { isHome, hasSidebar } = useLayout() const { isHome, hasSidebar } = useLayout()
function resolveLayout(name: string) {
const component = resolveComponent(name)
return typeof component === 'string' ? null : component
}
</script> </script>
<template> <template>
@ -18,12 +24,12 @@ const { isHome, hasSidebar } = useLayout()
> >
<slot name="not-found" v-if="page.isNotFound"><NotFound /></slot> <slot name="not-found" v-if="page.isNotFound"><NotFound /></slot>
<VPPage v-else-if="frontmatter.layout === 'page'"> <VPPage v-else-if="frontmatter.layout === 'page' && !resolveLayout('page')">
<template #page-top><slot name="page-top" /></template> <template #page-top><slot name="page-top" /></template>
<template #page-bottom><slot name="page-bottom" /></template> <template #page-bottom><slot name="page-bottom" /></template>
</VPPage> </VPPage>
<VPHome v-else-if="frontmatter.layout === 'home'"> <VPHome v-else-if="frontmatter.layout === 'home' && !resolveLayout('home')">
<template #home-hero-before><slot name="home-hero-before" /></template> <template #home-hero-before><slot name="home-hero-before" /></template>
<template #home-hero-info-before><slot name="home-hero-info-before" /></template> <template #home-hero-info-before><slot name="home-hero-info-before" /></template>
<template #home-hero-info><slot name="home-hero-info" /></template> <template #home-hero-info><slot name="home-hero-info" /></template>
@ -36,12 +42,7 @@ const { isHome, hasSidebar } = useLayout()
<template #home-features-after><slot name="home-features-after" /></template> <template #home-features-after><slot name="home-features-after" /></template>
</VPHome> </VPHome>
<component <VPDoc v-else-if="(!frontmatter.layout || frontmatter.layout === 'doc') && !resolveLayout('doc')">
v-else-if="frontmatter.layout && frontmatter.layout !== 'doc'"
:is="frontmatter.layout"
/>
<VPDoc v-else>
<template #doc-top><slot name="doc-top" /></template> <template #doc-top><slot name="doc-top" /></template>
<template #doc-bottom><slot name="doc-bottom" /></template> <template #doc-bottom><slot name="doc-bottom" /></template>
@ -56,6 +57,8 @@ const { isHome, hasSidebar } = useLayout()
<template #aside-ads-after><slot name="aside-ads-after" /></template> <template #aside-ads-after><slot name="aside-ads-after" /></template>
<template #aside-bottom><slot name="aside-bottom" /></template> <template #aside-bottom><slot name="aside-bottom" /></template>
</VPDoc> </VPDoc>
<component v-else :is="frontmatter.layout || 'doc'" />
</div> </div>
</template> </template>

Loading…
Cancel
Save