chore: tweak

This commit is contained in:
pengzhanbo 2024-06-10 05:48:02 +08:00
parent 82401f0ddd
commit 3018f6789b
58 changed files with 129 additions and 174 deletions

View File

@ -2,6 +2,7 @@ import type { Plugin } from 'vuepress/core'
import { getDirname, path } from 'vuepress/utils'
import type { NotesDataOptions } from '../shared/index.js'
import { prepareNotesData, watchNotesData } from './prepareNotesData.js'
import { wait } from './utils.js'
export function notesDataPlugin(options: NotesDataOptions | NotesDataOptions[]): Plugin {
return {
@ -12,7 +13,10 @@ export function notesDataPlugin(options: NotesDataOptions | NotesDataOptions[]):
'../client/clientConfig.js',
),
onPrepared: app => prepareNotesData(app, options),
onPrepared: async (app) => {
await wait(50)
await prepareNotesData(app, options)
},
onWatched: (app, watchers) => watchNotesData(app, watchers, options),
}
}

View File

@ -9,3 +9,7 @@ export function ensureArray<T>(thing: T | T[] | null | undefined): T[] {
export function normalizePath(str: string) {
return str.replace(/\\+/g, '/')
}
export function wait(time: number) {
return new Promise(resolve => setTimeout(resolve, time))
}

View File

@ -1,5 +1,5 @@
<script lang="ts" setup>
import { useArchives, useBlogExtract } from '../../composables/index.js'
import { useArchives, useBlogExtract } from '../../composables/blog.js'
import ShortPostList from './ShortPostList.vue'
const { archives: archivesLink } = useBlogExtract()

View File

@ -1,8 +1,6 @@
<script lang="ts" setup>
import { usePageData } from 'vuepress/client'
import { computed } from 'vue'
import type { PlumeThemePageData } from '../../../shared/index.js'
import { useThemeLocaleData } from '../../composables/index.js'
import { useData } from '../../composables/data.js'
import TransitionFadeSlideY from '../TransitionFadeSlideY.vue'
import PostList from './PostList.vue'
import Archives from './Archives.vue'
@ -11,8 +9,7 @@ import BlogExtract from './BlogExtract.vue'
import Tags from './Tags.vue'
import BlogNav from './BlogNav.vue'
const theme = useThemeLocaleData()
const page = usePageData<PlumeThemePageData>()
const { theme, page } = useData()
const com = {
PostList,

View File

@ -1,9 +1,9 @@
<script lang="ts" setup>
import { useThemeLocaleData } from '../../composables/index.js'
import { useData } from '../../composables/data.js'
import BlogNav from './BlogNav.vue'
import BlogProfile from './BlogProfile.vue'
const theme = useThemeLocaleData()
const { theme } = useData()
</script>
<template>

View File

@ -3,11 +3,12 @@ import { useScrollLock } from '@vueuse/core'
import { computed, ref, watch } from 'vue'
import { useRoute, withBase } from 'vuepress/client'
import { isLinkHttp } from 'vuepress/shared'
import { useBlogExtract, useThemeLocaleData } from '../../composables/index.js'
import { useBlogExtract } from '../../composables/blog.js'
import { useData } from '../../composables/data.js'
import { inBrowser } from '../../utils/index.js'
import AutoLink from '../AutoLink.vue'
const theme = useThemeLocaleData()
const { theme } = useData()
const route = useRoute()
const avatar = computed(() => theme.value.avatar)

View File

@ -1,6 +1,6 @@
<script lang="ts" setup>
import { useRoute } from 'vuepress/client'
import { useBlogExtract } from '../../composables/index.js'
import { useBlogExtract } from '../../composables/blog.js'
import AutoLink from '../AutoLink.vue'
const props = defineProps<{

View File

@ -2,10 +2,10 @@
import { computed } from 'vue'
import { withBase } from 'vuepress/client'
import { isLinkHttp } from 'vuepress/shared'
import { useThemeLocaleData } from '../../composables/index.js'
import { useData } from '../../composables/data.js'
import SocialLinks from '../SocialLinks.vue'
const theme = useThemeLocaleData()
const { theme } = useData()
const avatar = computed(() => theme.value.avatar)
const imageUrl = computed(() => {
const url = avatar.value?.url

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import { useData } from '../../composables/index.js'
import { useData } from '../../composables/data.js'
defineProps<{
page: number

View File

@ -1,7 +1,7 @@
<script lang="ts" setup>
import { computed } from 'vue'
import type { PlumeThemeBlogPostItem } from '../../../shared/index.js'
import { useTagColors } from '../../composables/index.js'
import { useTagColors } from '../../composables/tag-colors.js'
import AutoLink from '../AutoLink.vue'
const props = defineProps<{

View File

@ -1,5 +1,5 @@
<script lang="ts" setup>
import { usePostListControl } from '../../composables/index.js'
import { usePostListControl } from '../../composables/blog.js'
import TransitionDrop from '../TransitionDrop.vue'
import PostItem from './PostItem.vue'
import Pagination from './Pagination.vue'

View File

@ -1,5 +1,5 @@
<script lang="ts" setup>
import { useBlogExtract, useTags } from '../../composables/index.js'
import { useBlogExtract, useTags } from '../../composables/blog.js'
import ShortPostList from './ShortPostList.vue'
const { tags, currentTag, postList, handleTagClick } = useTags()

View File

@ -1,5 +1,5 @@
<script lang="ts" setup>
import { usePageData } from 'vuepress/client'
import { useData } from '../../composables/data.js'
import { isActive } from '../../utils/index.js'
import AutoLink from '../AutoLink.vue'
import VIcon from '../VIcon.vue'
@ -8,7 +8,7 @@ defineProps<{
item: any
}>()
const page = usePageData()
const { page } = useData()
</script>
<template>

View File

@ -1,6 +1,7 @@
<script lang="ts" setup>
import { computed } from 'vue'
import { useData, useEditNavLink } from '../composables/index.js'
import { useData } from '../composables/data.js'
import { useEditNavLink } from '../composables/page.js'
import AutoLink from './AutoLink.vue'
import FriendsItem from './FriendsItem.vue'
import FriendsGroup from './FriendsGroup.vue'

View File

@ -2,7 +2,7 @@
import { isPlainObject } from '@vuepress/helper/client'
import { computed } from 'vue'
import type { FriendsItem } from '../../shared/index'
import { useDarkMode } from '../composables/index.js'
import { useDarkMode } from '../composables/dark-mode.js'
import AutoLink from './AutoLink.vue'
const props = defineProps<{
@ -117,3 +117,4 @@ const friendStyle = computed(() => {
line-clamp: 3;
}
</style>
../composables/dark-mode.js

View File

@ -1,7 +1,6 @@
<script lang="ts" setup>
import { usePageFrontmatter } from 'vuepress/client'
import { type Component, computed, nextTick, onUnmounted, resolveComponent, watch } from 'vue'
import type { PlumeThemeHomeFrontmatter } from '../../../shared/index.js'
import { useData } from '../../composables/data.js'
import HomeBanner from './HomeBanner.vue'
import HomeHero from './HomeHero.vue'
import HomeFeatures from './HomeFeatures.vue'
@ -25,7 +24,7 @@ const DEFAULT_HERO = {
text: '一个简约的,功能丰富的 vuepress 文档&博客 主题',
}
const matter = usePageFrontmatter<PlumeThemeHomeFrontmatter>()
const { frontmatter: matter } = useData<'home'>()
const config = computed(() => {
const config = matter.value.config

View File

@ -1,17 +1,16 @@
<script setup lang="ts">
import { usePageFrontmatter, withBase } from 'vuepress/client'
import { withBase } from 'vuepress/client'
import { isLinkHttp } from 'vuepress/shared'
import { computed } from 'vue'
import type { PlumeThemeHomeBanner, PlumeThemeHomeFrontmatter } from '../../../shared/index.js'
import { useDarkMode } from '../../composables/darkMode.js'
import type { PlumeThemeHomeBanner } from '../../../shared/index.js'
import { useData } from '../../composables/data.js'
import VButton from '../VButton.vue'
const props = defineProps<PlumeThemeHomeBanner>()
const DEFAULT_BANNER = 'https://api.pengzhanbo.cn/wallpaper/bing'
const matter = usePageFrontmatter<PlumeThemeHomeFrontmatter>()
const isDark = useDarkMode()
const { isDark, frontmatter: matter } = useData<'home'>()
const mask = computed(() => {
const mask = props.bannerMask ?? matter.value.bannerMask

View File

@ -3,7 +3,7 @@ import { withBase } from 'vuepress/client'
import { computed, normalizeClass } from 'vue'
import { isLinkHttp } from 'vuepress/shared'
import type { PlumeHomeConfigBase } from '../../../shared/index.js'
import { useDarkMode } from '../../composables/index.js'
import { useDarkMode } from '../../composables/dark-mode.js'
const props = defineProps<PlumeHomeConfigBase & {
containerClass?: any
@ -71,3 +71,4 @@ const containerClass = computed(() => normalizeClass(props.containerClass || '')
min-height: calc(100vh - var(--vp-nav-height));
}
</style>
../../composables/dark-mode.js

View File

@ -1,16 +1,15 @@
<script setup lang="ts">
import { usePageFrontmatter, withBase } from 'vuepress/client'
import { withBase } from 'vuepress/client'
import { isLinkHttp } from 'vuepress/shared'
import { computed, ref } from 'vue'
import VButton from '../VButton.vue'
import { useDarkMode } from '../../composables/index.js'
import { useData } from '../../composables/data.js'
import { useHomeHeroTintPlate } from '../../composables/home.js'
import type { PlumeThemeHomeFrontmatter, PlumeThemeHomeHero } from '../../../shared/index.js'
import type { PlumeThemeHomeHero } from '../../../shared/index.js'
const props = defineProps<PlumeThemeHomeHero>()
const matter = usePageFrontmatter<PlumeThemeHomeFrontmatter>()
const isDark = useDarkMode()
const { isDark, frontmatter: matter } = useData<'home'>()
const heroBackground = computed(() => {
if (props.background === 'tint-plate')

View File

@ -2,12 +2,12 @@
import { computed } from 'vue'
import type { PlumeThemeHomeProfile } from '../../../shared/index.js'
import VImage from '../VImage.vue'
import { useThemeLocaleData } from '../../composables/index.js'
import { useData } from '../../composables/data.js'
import HomeBox from './HomeBox.vue'
const props = defineProps<PlumeThemeHomeProfile>()
const theme = useThemeLocaleData()
const { theme } = useData()
const avatar = computed(() => theme.value.avatar)

View File

@ -1,8 +1,8 @@
<script setup lang="ts">
import type { PageHeader } from 'vuepress/client'
import type { MenuItem } from '../../composables/outline.js'
defineProps<{
headers: PageHeader[]
headers: MenuItem[]
root?: boolean
}>()

View File

@ -1,11 +1,10 @@
<script lang="ts" setup>
import { usePageData } from 'vuepress/client'
import { useWindowScroll } from '@vueuse/core'
import { computed, onMounted, ref } from 'vue'
import type {
PlumeThemePageData,
} from '../../../shared/index.js'
import { useSidebar, useThemeLocaleData } from '../../composables/index.js'
import { onContentUpdated } from '@vuepress-plume/plugin-content-update/client'
import { useSidebar } from '../../composables/sidebar.js'
import { type MenuItem, getHeaders } from '../../composables/outline.js'
import { useData } from '../../composables/data.js'
import LocalNavOutlineDropdown from './LocalNavOutlineDropdown.vue'
const props = defineProps<{
@ -15,19 +14,23 @@ const props = defineProps<{
defineEmits<(e: 'openMenu') => void>()
const page = usePageData<PlumeThemePageData>()
const themeData = useThemeLocaleData()
const { page, theme, frontmatter } = useData()
const { hasSidebar } = useSidebar()
const { y } = useWindowScroll()
const navHeight = ref(0)
const headers = computed(() => page.value.headers)
const headers = ref<MenuItem[]>([])
const empty = computed(() => {
return headers.value.length === 0 && !hasSidebar.value
})
onContentUpdated(() => {
headers.value = getHeaders(frontmatter.value.outline ?? theme.value.outline)
})
onMounted(() => {
navHeight.value = Number.parseInt(
getComputedStyle(document.documentElement).getPropertyValue(
@ -54,15 +57,14 @@ const showLocalNav = computed(() => {
<template>
<div v-if="showLocalNav" :class="classes">
<button
class="menu"
:class="{ hidden: page.isBlogPost }"
class="menu" :class="{ hidden: page.isBlogPost }"
:disabled="page.isBlogPost"
:aria-expanded="open"
aria-controls="SidebarNav"
@click="$emit('openMenu')"
>
<span class="vpi-align-left menu-icon" />
<span class="menu-text"> {{ themeData.sidebarMenuLabel || 'Menu' }} </span>
<span class="menu-text"> {{ theme.sidebarMenuLabel || 'Menu' }} </span>
</button>
<LocalNavOutlineDropdown v-if="showOutline" :headers="headers" :nav-height="navHeight" />

View File

@ -1,16 +1,16 @@
<script setup lang="ts">
import type { PageHeader } from 'vuepress/client'
import { onClickOutside } from '@vueuse/core'
import { nextTick, ref, watch } from 'vue'
import { useThemeLocaleData } from '../../composables/index.js'
import type { MenuItem } from '../../composables/outline.js'
import { useData } from '../../composables/data.js'
import DocOutlineItem from './DocOutlineItem.vue'
const props = defineProps<{
headers: PageHeader[]
headers: MenuItem[]
navHeight: number
}>()
const theme = useThemeLocaleData()
const { theme } = useData()
const open = ref(false)
const vh = ref(0)
const items = ref<HTMLDivElement>()

View File

@ -1,8 +1,8 @@
<script lang="ts" setup>
import { usePageFrontmatter } from 'vuepress/client'
import { useWindowScroll } from '@vueuse/core'
import { ref, watchPostEffect } from 'vue'
import { useSidebar } from '../../composables/sidebar.js'
import { useData } from '../../composables/data.js'
import NavBarAppearance from './NavBarAppearance.vue'
import NavBarExtra from './NavBarExtra.vue'
import NavBarHamburger from './NavBarHamburger.vue'
@ -17,7 +17,7 @@ defineProps<{
}>()
defineEmits<(e: 'toggleScreen') => void>()
const matter = usePageFrontmatter()
const { frontmatter } = useData()
const { y } = useWindowScroll()
const { hasSidebar } = useSidebar()
@ -26,7 +26,7 @@ const classes = ref<Record<string, boolean>>({})
watchPostEffect(() => {
classes.value = {
'has-sidebar': hasSidebar.value,
'top': !!matter.value.home && y.value === 0,
'top': !!frontmatter.value.home && y.value === 0,
}
})
</script>

View File

@ -1,8 +1,8 @@
<script lang="ts" setup>
import { useThemeLocaleData } from '../../composables/index.js'
import { useData } from '../../composables/data.js'
import SwitchAppearance from '../SwitchAppearance.vue'
const theme = useThemeLocaleData()
const { theme } = useData()
</script>
<template>

View File

@ -1,13 +1,13 @@
<script lang="ts" setup>
import { computed } from 'vue'
import { useThemeLocaleData } from '../../composables/index.js'
import { useData } from '../../composables/data.js'
import { useLangs } from '../../composables/langs.js'
import Flyout from '../Flyout/index.vue'
import MenuLink from '../Flyout/MenuLink.vue'
import SocialLinks from '../SocialLinks.vue'
import SwitchAppearance from '../SwitchAppearance.vue'
const theme = useThemeLocaleData()
const { theme } = useData()
const { localeLinks, currentLang } = useLangs()
const hasExtraContent = computed(

View File

@ -1,9 +1,9 @@
<script lang="ts" setup>
import { useThemeLocaleData } from '../../composables/themeData.js'
import { useData } from '../../composables/data.js'
import NavBarMenuGroup from './NavBarMenuGroup.vue'
import NavBarMenuLink from './NavBarMenuLink.vue'
const theme = useThemeLocaleData()
const { theme } = useData()
</script>
<template>

View File

@ -1,15 +1,15 @@
<script lang="ts" setup>
import { usePageData } from 'vuepress/client'
import { computed } from 'vue'
import type { NavItem, NavItemWithChildren } from '../../../shared/index.js'
import { isActive } from '../../utils/index.js'
import Flyout from '../Flyout/index.vue'
import { useData } from '../../composables/data.js'
const props = defineProps<{
item: NavItemWithChildren
}>()
const page = usePageData()
const { page } = useData()
function isChildActive(navItem: NavItem) {
if ('link' in navItem) {

View File

@ -1,15 +1,15 @@
<script lang="ts" setup>
import { usePageData } from 'vuepress/client'
import type { NavItemWithLink } from '../../../shared/index.js'
import { isActive } from '../../utils/index.js'
import AutoLink from '../AutoLink.vue'
import VIcon from '../VIcon.vue'
import { useData } from '../../composables/data.js'
defineProps<{
item: NavItemWithLink
}>()
const page = usePageData()
const { page } = useData()
</script>
<template>

View File

@ -1,9 +1,9 @@
<script lang="ts" setup>
import { computed } from 'vue'
import { useThemeLocaleData } from '../../composables/index.js'
import { useData } from '../../composables/data.js'
import SocialLinks from '../SocialLinks.vue'
const theme = useThemeLocaleData()
const { theme } = useData()
const social = computed(() => {
const includes = theme.value.navbarSocialInclude ?? []

View File

@ -1,12 +1,11 @@
<script lang="ts" setup>
import { useRouteLocale, useSiteLocaleData } from 'vuepress/client'
import { useSidebar } from '../../composables/index.js'
import { useThemeLocaleData } from '../../composables/themeData.js'
import { useRouteLocale } from 'vuepress/client'
import { useSidebar } from '../../composables/sidebar.js'
import { useData } from '../../composables/data.js'
import AutoLink from '../AutoLink.vue'
import VImage from '../VImage.vue'
const theme = useThemeLocaleData()
const site = useSiteLocaleData()
const { theme, site } = useData()
const { hasSidebar } = useSidebar()
const routeLocale = useRouteLocale()
</script>

View File

@ -1,10 +1,10 @@
<script lang="ts" setup>
import { useLangs } from '../../composables/langs.js'
import { useThemeLocaleData } from '../../composables/themeData.js'
import { useData } from '../../composables/data.js'
import Flyout from '../Flyout/index.vue'
import MenuLink from '../Flyout/MenuLink.vue'
const theme = useThemeLocaleData()
const { theme } = useData()
const { currentLang, localeLinks } = useLangs()
</script>

View File

@ -1,8 +1,8 @@
<script lang="ts" setup>
import { useThemeLocaleData } from '../../composables/index.js'
import { useData } from '../../composables/data.js'
import SwitchAppearance from '../SwitchAppearance.vue'
const theme = useThemeLocaleData()
const { theme } = useData()
</script>
<template>

View File

@ -1,9 +1,9 @@
<script lang="ts" setup>
import { useThemeLocaleData } from '../../composables/index.js'
import { useData } from '../../composables/data.js'
import NavScreenMenuGroup from './NavScreenMenuGroup.vue'
import NavScreenMenuLink from './NavScreenMenuLink.vue'
const theme = useThemeLocaleData()
const { theme } = useData()
</script>
<template>

View File

@ -1,8 +1,8 @@
<script lang="ts" setup>
import { useThemeData } from '../../composables/index.js'
import { useData } from '../../composables/data.js'
import SocialLinks from '../SocialLinks.vue'
const theme = useThemeData()
const { theme } = useData()
</script>
<template>

View File

@ -1,12 +1,11 @@
<script lang="ts" setup>
import { usePageData } from 'vuepress/client'
import { computed, provide } from 'vue'
import type { PlumeThemePageData } from '../../../shared/index.js'
import { useNav } from '../../composables/nav.js'
import { useData } from '../../composables/data.js'
import Navbar from './NavBar.vue'
import NavScreen from './NavScreen.vue'
const page = usePageData<PlumeThemePageData>()
const { page } = useData()
const { isScreenOpen, closeScreen, toggleScreen } = useNav()

View File

@ -1,7 +1,8 @@
<script lang="ts" setup>
import { computed, nextTick, ref, watch } from 'vue'
import { useRoute } from 'vuepress/client'
import { useData, useSidebar } from '../composables/index.js'
import { useData } from '../composables/data.js'
import { useSidebar } from '../composables/sidebar.js'
import { usePageEncrypt } from '../composables/encrypt.js'
import PageAside from './PageAside.vue'
import PageFooter from './PageFooter.vue'

View File

@ -1,7 +1,8 @@
<script lang="ts" setup>
import { computed, ref } from 'vue'
import { onContentUpdated } from '@vuepress-plume/plugin-content-update/client'
import { type MenuItem, getHeaders, useActiveAnchor, useData } from '../composables/index.js'
import { type MenuItem, getHeaders, useActiveAnchor } from '../composables/outline.js'
import { useData } from '../composables/data.js'
import PageAsideItem from './PageAsideItem.vue'
const { theme, frontmatter } = useData()

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import type { MenuItem } from '../composables/index.js'
import type { MenuItem } from '../composables/outline.js'
defineProps<{
headers: MenuItem[]

View File

@ -2,11 +2,11 @@
import { computed } from 'vue'
import {
useContributors,
useData,
useEditNavLink,
useLastUpdated,
usePageNav,
} from '../composables/index.js'
} from '../composables/page.js'
import { useData } from '../composables/data.js'
import AutoLink from './AutoLink.vue'
const { theme } = useData()

View File

@ -1,7 +1,8 @@
<script lang="ts" setup>
import { computed } from 'vue'
import { useReadingTimeLocale } from '@vuepress/plugin-reading-time/client'
import { useData, useTagColors } from '../composables/index.js'
import { useData } from '../composables/data.js'
import { useTagColors } from '../composables/tag-colors.js'
const { page, frontmatter: matter } = useData<'post'>()

View File

@ -1,6 +1,6 @@
<script lang="ts" setup>
import { computed, inject, ref } from 'vue'
import { useData } from '../composables/index.js'
import { useData } from '../composables/data.js'
import Switch from './Switch.vue'
const checked = ref(false)

View File

@ -1,5 +1,5 @@
<script lang="ts" setup>
import { useScrollPromise } from '../composables/index.js'
import { useScrollPromise } from '../composables/scroll-promise.js'
const { resolve: onBeforeEnter, pending: onBeforeLeave } = useScrollPromise()
</script>
@ -14,3 +14,4 @@ const { resolve: onBeforeEnter, pending: onBeforeLeave } = useScrollPromise()
<slot />
</Transition>
</template>
../composables/scroll-promise.js

View File

@ -1,7 +1,8 @@
<script setup lang="ts">
import { useCssVar } from '@vueuse/core'
import { onMounted, ref } from 'vue'
import { useData, useSidebar } from '../composables/index.js'
import { useData } from '../composables/data.js'
import { useSidebar } from '../composables/sidebar.js'
import { inBrowser } from '../utils/index.js'
const { theme } = useData()

View File

@ -1,31 +0,0 @@
<script lang="ts" setup>
import { usePageFrontmatter } from 'vuepress/client'
import { computed } from 'vue'
import type { PlumeThemePageFrontmatter } from '../../../shared/index.js'
const matter = usePageFrontmatter<PlumeThemePageFrontmatter>()
const show = computed(() => matter.value.externalLink !== false)
</script>
<template>
<span v-if="show" class="vpi-external-link external-icon" />
</template>
<style scoped>
.external-icon {
position: relative;
top: 1px;
display: inline-block;
width: 0.8em;
height: 0.8em;
color: var(--vp-c-text-3);
vertical-align: middle;
transition: color var(--t-color);
}
@media print {
.external-icon {
display: none;
}
}
</style>

View File

@ -1,7 +1,7 @@
import { useDark } from '@vueuse/core'
import { inject, ref } from 'vue'
import type { App, InjectionKey, Ref } from 'vue'
import { useThemeData } from './themeData.js'
import { useThemeData } from './theme-data.js'
type DarkModeRef = Ref<boolean>

View File

@ -13,22 +13,24 @@ import type {
} from 'vuepress/client'
import type {
PlumeThemeFriendsFrontmatter,
PlumeThemeHomeFrontmatter,
PlumeThemeLocaleData,
PlumeThemePageData,
PlumeThemePageFrontmatter,
PlumeThemePostFrontmatter,
} from '../../shared/index.js'
import { useThemeLocaleData } from './themeData.js'
import { useThemeLocaleData } from './theme-data.js'
import { hashRef } from './hash.js'
import { useDarkMode } from './darkMode.js'
import { useDarkMode } from './dark-mode.js'
type FrontmatterType = 'post' | 'friends' | 'page'
type FrontmatterType = 'home' | 'post' | 'friends' | 'page'
type Frontmatter<T extends FrontmatterType = 'page'> = T extends 'post'
? PlumeThemePostFrontmatter
: T extends 'friends'
? PlumeThemeFriendsFrontmatter
: PlumeThemePageFrontmatter
type Frontmatter<T extends FrontmatterType = 'page'> = T extends 'home'
? PlumeThemeHomeFrontmatter : T extends 'post'
? PlumeThemePostFrontmatter
: T extends 'friends'
? PlumeThemeFriendsFrontmatter
: PlumeThemePageFrontmatter
export interface Data<T extends FrontmatterType = 'page'> {
theme: ThemeLocaleDataRef<PlumeThemeLocaleData>

View File

@ -1,7 +1,7 @@
import type { Ref } from 'vue'
import { computed, onMounted, onUnmounted } from 'vue'
import type { PlumeThemeHomeHero } from '../../shared/index.js'
import { useDarkMode } from './darkMode.js'
import { useDarkMode } from './dark-mode.js'
export interface TintPlate {
r: { value: number, offset: number }

View File

@ -1,14 +1,13 @@
export * from './darkMode.js'
export * from './useScrollPromise.js'
export * from './themeData.js'
export * from './useNavLink.js'
export * from './dark-mode.js'
export * from './scroll-promise.js'
export * from './theme-data.js'
export * from './sidebar.js'
export * from './aside.js'
export * from './page.js'
export * from './blog.js'
export * from './tag-colors.js'
export * from './locale.js'
export * from './useRouteQuery.js'
export * from './route-query.js'
export * from './watermark.js'
export * from './data.js'
export * from './outline.js'

View File

@ -1,6 +1,6 @@
import { resolveRoute, useRouteLocale, withBase } from 'vuepress/client'
import { computed } from 'vue'
import { useThemeData } from './themeData.js'
import { useThemeData } from './theme-data.js'
import { useData } from './data.js'
import { getSidebarFirstLink, getSidebarList, normalizePath, useNotesData } from './sidebar.js'

View File

@ -10,8 +10,8 @@ import type {
PlumeThemePageData,
PlumeThemePageFrontmatter,
} from '../../shared/index.js'
import { useNavLink, useSidebar, useThemeLocaleData } from '../composables/index.js'
import { resolveEditLink } from '../utils/index.js'
import { useSidebar, useThemeLocaleData } from '../composables/index.js'
import { resolveEditLink, resolveNavLink } from '../utils/index.js'
export function useEditNavLink(): ComputedRef<null | NavItemWithLink> {
const themeLocale = useThemeLocaleData()
@ -120,7 +120,7 @@ function resolveFromFrontmatterConfig(conf: unknown): null | false | NavItemWith
return null
if (isString(conf))
return useNavLink(conf)
return resolveNavLink(conf)
if (isPlainObject<NavItemWithLink>(conf))
return conf

View File

@ -1,6 +1,6 @@
export * from './shared.js'
export * from './normalizeLink.js'
export * from './dom.js'
export * from './resolveEditLink.js'
export * from './resolveRepoType.js'
export * from './resolveNavLink.js'
export * from './base.js'

View File

@ -1,18 +0,0 @@
import { PATHNAME_PROTOCOL_RE, isExternal } from './shared.js'
export function normalizeLink(url: string): string {
if (isExternal(url))
return url.replace(PATHNAME_PROTOCOL_RE, '')
const { pathname, search, hash } = new URL(url, 'http://example.com')
const normalizedPath
= pathname.endsWith('/') || pathname.endsWith('.html')
? url
: url.replace(
/(?:(^\.+)\/)?.*$/,
`$1${pathname.replace(/(\.md)?$/, '.html')}${search}${hash}`,
)
return normalizedPath
}

View File

@ -8,10 +8,10 @@ import type { NavItemWithLink } from '../../shared/index.js'
* - Input: '/README.md'
* - Output: { text: 'Home', link: '/' }
*/
export function useNavLink(config: string): NavItemWithLink {
export function resolveNavLink(link: string): NavItemWithLink {
const { notFound, meta, path } = resolveRoute<{
title?: string
}>(config)
}>(link)
return notFound
? { text: path, link: path }

View File

@ -33,10 +33,6 @@ export function normalize(path: string): string {
return decodeURI(path).replace(HASH_RE, '').replace(EXT_RE, '')
}
export function isExternal(path: string): boolean {
return EXTERNAL_URL_RE.test(path)
}
export function throttleAndDebounce(fn: () => void, delay: number): () => void {
let timeoutId: NodeJS.Timeout
let called = false
@ -57,7 +53,3 @@ export function throttleAndDebounce(fn: () => void, delay: number): () => void {
}
}
}
export function ensureStartingSlash(path: string): string {
return /^\//.test(path) ? path : `/${path}`
}