{
TOP
+ DRAFT
@@ -151,6 +152,10 @@ const coverStyles = computed(() => {
transition: background-color var(--vp-t-color);
}
+.vp-blog-post-item.draft {
+ background-color: var(--vp-c-warning-soft);
+}
+
.vp-blog-post-item.has-cover:where(.left, .right) {
display: flex;
gap: 20px;
@@ -231,7 +236,8 @@ const coverStyles = computed(() => {
flex: 1 2;
}
-.blog-post-item-content .sticky {
+.blog-post-item-content .sticky,
+.blog-post-item-content .draft {
display: inline-block;
padding: 3px 6px;
margin-right: 0.5rem;
@@ -245,6 +251,11 @@ const coverStyles = computed(() => {
transition-property: color, background-color;
}
+.blog-post-item-content .draft {
+ color: var(--vp-c-warning-1);
+ background-color: var(--vp-c-warning-soft);
+}
+
.blog-post-item-content .icon-lock {
width: 1em;
height: 1em;
diff --git a/theme/src/client/components/VPDocMeta.vue b/theme/src/client/components/VPDocMeta.vue
index bea3280c..86d8c161 100644
--- a/theme/src/client/components/VPDocMeta.vue
+++ b/theme/src/client/components/VPDocMeta.vue
@@ -54,6 +54,7 @@ const hasMeta = computed(() =>
+
{{ page.title }}
diff --git a/theme/src/node/pages/extendsPage.ts b/theme/src/node/pages/extendsPage.ts
index 17a74fb0..f34b7339 100644
--- a/theme/src/node/pages/extendsPage.ts
+++ b/theme/src/node/pages/extendsPage.ts
@@ -30,10 +30,10 @@ function cleanPageData(page: Page) {
delete page.frontmatter.home
}
- if (page.frontmatter.article === false) {
- page.frontmatter.draft = true
- }
- delete page.frontmatter.article
+ // if (page.frontmatter.article === false) {
+ // page.frontmatter.draft = true
+ // }
+ // delete page.frontmatter.article
if (page.headers) {
page.data.headers = []
diff --git a/theme/src/node/prepare/prepareBlogData.ts b/theme/src/node/prepare/prepareBlogData.ts
index b51dd4d4..12c294ef 100644
--- a/theme/src/node/prepare/prepareBlogData.ts
+++ b/theme/src/node/prepare/prepareBlogData.ts
@@ -21,6 +21,7 @@ function getTimestamp(time: Date): number {
}
export async function preparedBlogData(app: App): Promise {
+ const isBuild = app.env.isBuild
const options = getThemeConfig()
const encrypt = options.encrypt
if (options.blog === false) {
@@ -52,7 +53,8 @@ export async function preparedBlogData(app: App): Promise {
const pages = app.pages.filter(page =>
page.filePathRelative
&& filter(page.filePathRelative)
- && page.frontmatter.draft !== true,
+ && page.frontmatter.article !== false
+ && (page.frontmatter.draft === true ? !isBuild : true),
).sort((prev, next) =>
getTimestamp((prev.frontmatter.createTime as Date) || prev.date)
< getTimestamp(next.frontmatter.createTime as Date || next.date)
@@ -83,6 +85,10 @@ export async function preparedBlogData(app: App): Promise {
data.encrypt = true
}
+ if (page.frontmatter.draft && !isBuild) {
+ data.draft = true
+ }
+
const fmExcerpt = page.frontmatter.excerpt
if (fmExcerpt !== false) {
if (typeof fmExcerpt === 'string') {
diff --git a/theme/src/shared/features/blog.ts b/theme/src/shared/features/blog.ts
index 6a9e039b..f35c1394 100644
--- a/theme/src/shared/features/blog.ts
+++ b/theme/src/shared/features/blog.ts
@@ -95,6 +95,11 @@ export interface ThemeBlogPostItem {
* 文章封面图样式
*/
coverStyle?: BlogPostCoverStyle
+
+ /**
+ * 文章是否为草稿
+ */
+ draft?: boolean
}
/**
diff --git a/theme/src/shared/frontmatter/post.ts b/theme/src/shared/frontmatter/post.ts
index 18f54ea4..c3a176af 100644
--- a/theme/src/shared/frontmatter/post.ts
+++ b/theme/src/shared/frontmatter/post.ts
@@ -17,7 +17,11 @@ export interface ThemePostFrontmatter extends ThemePageFrontmatter {
*/
sticky?: boolean | number
/**
- * @deprecated 使用 `draft` 代替
+ * 标记当前文章是否为博客文章
+ *
+ * `false` 时,从博客列表中排除
+ *
+ * @default true
*/
article?: boolean
@@ -34,6 +38,9 @@ export interface ThemePostFrontmatter extends ThemePageFrontmatter {
*/
cover?: string
+ /**
+ * 文章封面图样式
+ */
coverStyle?: BlogPostCoverStyle
/**