-
-
- TOP
-
-
-
- {{ post.title }}
-
-
-
-
-
-
-
- {{ cate.name }}
-
- /
-
-
-
-
-
-
- {{ tag.name }}
-
-
-
-
-
- {{ createTime }}
-
+
+
+
![]()
+
+
+
+ TOP
+
+
+
+
+
+
+
+
+ {{ cate.name }}
+
+ /
+
+
+
+
+
+
+ {{ tag.name }}
+
+
+
+
+
+ {{ createTime }}
+
+
+
-
diff --git a/theme/src/client/components/Blog/VPPostList.vue b/theme/src/client/components/Blog/VPPostList.vue
index 70a3104b..790ebcae 100644
--- a/theme/src/client/components/Blog/VPPostList.vue
+++ b/theme/src/client/components/Blog/VPPostList.vue
@@ -29,6 +29,7 @@ const {
diff --git a/theme/src/client/components/VPLink.vue b/theme/src/client/components/VPLink.vue
index b37e5946..72999a41 100644
--- a/theme/src/client/components/VPLink.vue
+++ b/theme/src/client/components/VPLink.vue
@@ -6,6 +6,7 @@ import { useLink } from '../composables/index.js'
const props = defineProps<{
tag?: string
href?: string
+ text?: string
noIcon?: boolean
target?: string
rel?: string
@@ -34,7 +35,9 @@ function linkTo(e: Event) {
:rel="rel ?? (isExternal ? 'noreferrer' : undefined)"
@click="linkTo($event)"
>
-
+
+ {{ text || href }}
+
diff --git a/theme/src/client/composables/blog-post-list.ts b/theme/src/client/composables/blog-post-list.ts
index b41085c4..d929d16f 100644
--- a/theme/src/client/composables/blog-post-list.ts
+++ b/theme/src/client/composables/blog-post-list.ts
@@ -5,7 +5,7 @@ import { useData } from './data.js'
import { useRouteQuery } from './route-query.js'
import type { PlumeThemeBlogPostItem } from '../../shared/index.js'
-const DEFAULT_PER_PAGE = 10
+const DEFAULT_PER_PAGE = 15
export function usePostListControl(homePage: Ref
) {
const { theme } = useData()
diff --git a/theme/src/node/prepare/prepareBlogData.ts b/theme/src/node/prepare/prepareBlogData.ts
index 8d6c162b..6c0bf43f 100644
--- a/theme/src/node/prepare/prepareBlogData.ts
+++ b/theme/src/node/prepare/prepareBlogData.ts
@@ -73,6 +73,7 @@ export async function preparedBlogData(
createTime: page.data.frontmatter.createTime! || page.date?.replaceAll('-', '/') || '',
lang: page.lang,
excerpt: '',
+ cover: page.data.frontmatter.cover,
}
if (isEncryptPage(page, encrypt)) {
diff --git a/theme/src/shared/blog.ts b/theme/src/shared/blog.ts
index 3f9b1aed..25bd5f29 100644
--- a/theme/src/shared/blog.ts
+++ b/theme/src/shared/blog.ts
@@ -10,6 +10,7 @@ export interface PlumeThemeBlogPostItem {
createTime: string
lang: string
encrypt?: boolean
+ cover?: string | BlogPostCover
}
export type PlumeThemeBlogPostData = PlumeThemeBlogPostItem[]
@@ -98,4 +99,44 @@ export interface PlumeThemeBlog {
* @default '/blog/categories/'
*/
categoriesLink?: string
+
+ /**
+ * 博客文章封面图
+ *
+ * 配置封面图的位置,支持 `'left'`、`'right'`、`'top'`、`'top-inside'`
+ *
+ * @default 'right'
+ */
+ postCover?: BlogPostCoverLayout | Omit
+}
+
+export type BlogPostCoverLayout = 'left' | 'right' | 'odd-left' | 'odd-right' | 'top'
+
+export interface BlogPostCover {
+ /**
+ * 封面图链接地址,只能使用 绝对路径 以及 远程图片地址
+ */
+ url: string
+ /**
+ * 博客文章封面图的位置
+ */
+ layout?: BlogPostCoverLayout
+ /**
+ * 博客文章封面图的比例
+ *
+ * @default '4:3'
+ */
+ ratio?: number | `${number}:${number}` | `${number}/${number}`
+
+ /**
+ * 封面图的宽度, 仅在 layout 为 'left' 或 'right' 时生效
+ *
+ * @default 240
+ */
+ width?: number
+ /**
+ * 是否使用紧凑模式,紧凑模式下,封面图紧贴容器边缘
+ * @default false
+ */
+ compact?: boolean
}
diff --git a/theme/src/shared/frontmatter/page.ts b/theme/src/shared/frontmatter/page.ts
index 763422d6..5a6cd533 100644
--- a/theme/src/shared/frontmatter/page.ts
+++ b/theme/src/shared/frontmatter/page.ts
@@ -62,4 +62,12 @@ export interface PlumeThemePageFrontmatter extends PlumeNormalFrontmatter {
* 或直接传入 svg 字符串
*/
icon?: string | { svg: string }
+
+ /**
+ * 标题徽章
+ */
+ badge?: string | {
+ text: string
+ type?: 'info' | 'tip' | 'warning' | 'danger'
+ }
}
diff --git a/theme/src/shared/frontmatter/post.ts b/theme/src/shared/frontmatter/post.ts
index 43c18052..65a83b19 100644
--- a/theme/src/shared/frontmatter/post.ts
+++ b/theme/src/shared/frontmatter/post.ts
@@ -1,3 +1,4 @@
+import type { BlogPostCover } from 'vuepress-theme-plume'
import type { PlumeThemePageFrontmatter } from './page.js'
export interface PlumeThemePostFrontmatter extends PlumeThemePageFrontmatter {
@@ -19,10 +20,7 @@ export interface PlumeThemePostFrontmatter extends PlumeThemePageFrontmatter {
draft?: boolean
/**
- * 标题徽章
+ * 文章封面图
*/
- badge?: string | {
- text: string
- type?: 'info' | 'tip' | 'warning' | 'danger'
- }
+ cover?: string | BlogPostCover
}