diff --git a/.github/workflows/example-layout-slots-deploy.yml b/.github/workflows/example-layout-slots-deploy.yml
new file mode 100644
index 00000000..970becdf
--- /dev/null
+++ b/.github/workflows/example-layout-slots-deploy.yml
@@ -0,0 +1,39 @@
+name: Deploy Docs
+
+on:
+ workflow_dispatch:
+
+jobs:
+ deploy-docs:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Install pnpm
+ uses: pnpm/action-setup@v4
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 22
+ cache: pnpm
+
+ - name: Install deps
+ run: pnpm install --frozen-lockfile
+
+ - name: Build Packages
+ run: pnpm build:package
+
+ - name: Docs build
+ env:
+ NODE_OPTIONS: --max_old_space_size=8192
+ run: cd examples/layout-slots && pnpm docs:build
+
+ - name: Deploy docs
+ uses: JamesIves/github-pages-deploy-action@v4
+ with:
+ branch: gh-pages-layout-slots
+ folder: examples/layout-slots/docs/.vuepress/dist
+ single-commit: true
diff --git a/.gitignore b/.gitignore
index 7ab039dc..59b93115 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,8 @@
**/node_modules/
-docs/.vuepress/.cache
-docs/.vuepress/.temp
-docs/.vuepress/dist
+**/.vuepress/.cache
+**/.vuepress/.temp
+**/.vuepress/dist
lib/
dist/
diff --git a/examples/layout-slots/docs/.vuepress/client.ts b/examples/layout-slots/docs/.vuepress/client.ts
new file mode 100644
index 00000000..1b3b3851
--- /dev/null
+++ b/examples/layout-slots/docs/.vuepress/client.ts
@@ -0,0 +1,89 @@
+import { h } from 'vue'
+import { Layout, NotFound } from 'vuepress-theme-plume/client'
+import { defineClientConfig } from 'vuepress/client'
+import SlotDemo from './theme/components/SlotDemo.vue'
+
+import './theme/styles/custom.css'
+
+export default defineClientConfig({
+ layouts: {
+ Layout: () => h(Layout, null, {
+ 'layout-top': () => h(SlotDemo, { name: 'layout-top' }),
+ 'layout-bottom': () => h(SlotDemo, { name: 'layout-bottom' }),
+
+ 'nav-bar-title-before': () => h(SlotDemo, { name: 'nav-bar-title-before', w: 64, h: 44, small: true }),
+ 'nav-bar-title-after': () => h(SlotDemo, { name: 'nav-bar-title-after', w: 64, h: 44, small: true }),
+ 'nav-bar-content-before': () => h(SlotDemo, { name: 'nav-bar-content-before', h: 44, small: true }),
+ 'nav-bar-content-after': () => h(SlotDemo, { name: 'nav-bar-content-after', h: 44, small: true }),
+ 'nav-bar-menu-before': () => h(SlotDemo, { name: 'nav-bar-menu-before', h: 44, small: true }),
+ 'nav-bar-menu-after': () => h(SlotDemo, { name: 'nav-bar-menu-after', h: 44, small: true }),
+ 'nav-screen-content-before': () => h(SlotDemo, { name: 'nav-screen-content-before', h: 44, small: true }),
+ 'nav-screen-content-after': () => h(SlotDemo, { name: 'nav-screen-content-after', h: 44, small: true }),
+ 'nav-screen-menu-before': () => h(SlotDemo, { name: 'nav-screen-menu-before', h: 44, small: true }),
+ 'nav-screen-menu-after': () => h(SlotDemo, { name: 'nav-screen-menu-after', h: 44, small: true }),
+
+ 'footer-content': () => h(SlotDemo, { name: 'footer-content' }),
+ 'bulletin-content': () => h(SlotDemo, { name: 'bulletin-content' }),
+
+ 'doc-top': () => h(SlotDemo, { name: 'doc-top' }),
+ 'doc-bottom': () => h(SlotDemo, { name: 'doc-bottom' }),
+ 'doc-footer-before': () => h(SlotDemo, { name: 'doc-footer-before' }),
+ 'doc-before': () => h(SlotDemo, { name: 'doc-before', mt: 16 }),
+ 'doc-after': () => h(SlotDemo, { name: 'doc-after' }),
+ 'doc-meta-before': () => h(SlotDemo, { name: 'doc-meta-before', h: 24 }),
+ 'doc-meta-after': () => h(SlotDemo, { name: 'doc-meta-after', h: 24 }),
+ 'doc-meta-top': () => h(SlotDemo, { name: 'doc-meta-top' }),
+ 'doc-meta-bottom': () => h(SlotDemo, { name: 'doc-meta-bottom' }),
+
+ 'sidebar-nav-before': () => h(SlotDemo, { name: 'sidebar-nav-before' }),
+ 'sidebar-nav-after': () => h(SlotDemo, { name: 'sidebar-nav-after' }),
+ 'aside-top': () => h(SlotDemo, { name: 'aside-top' }),
+ 'aside-bottom': () => h(SlotDemo, { name: 'aside-bottom' }),
+ 'aside-outline-before': () => h(SlotDemo, { name: 'aside-outline-before', mt: 16 }),
+ 'aside-outline-after': () => h(SlotDemo, { name: 'aside-outline-after' }),
+
+ 'page-top': () => h(SlotDemo, { name: 'page-top' }),
+ 'page-bottom': () => h(SlotDemo, { name: 'page-bottom' }),
+
+ 'blog-top': () => h(SlotDemo, { name: 'blog-top' }),
+ 'blog-bottom': () => h(SlotDemo, { name: 'blog-bottom', mt: 16 }),
+ 'blog-aside-top': () => h(SlotDemo, { name: 'blog-aside-top', h: 44, mt: 16 }),
+ 'blog-aside-bottom': () => h(SlotDemo, { name: 'blog-aside-bottom', h: 44 }),
+ 'blog-extract-before': () => h(SlotDemo, { name: 'blog-extract-before' }),
+ 'blog-extract-after': () => h(SlotDemo, { name: 'blog-extract-after' }),
+ 'blog-post-list-before': () => h(SlotDemo, { name: 'blog-post-list-before', mt: 16 }),
+ 'blog-post-list-after': () => h(SlotDemo, { name: 'blog-post-list-after' }),
+ 'blog-post-list-pagination-after': () => h(SlotDemo, {
+ name: 'blog-post-list-pagination-after',
+ }),
+ 'blog-tags-before': () => h(SlotDemo, { name: 'blog-tags-before', mt: 16 }),
+ 'blog-tags-after': () => h(SlotDemo, { name: 'blog-tags-after', mt: 16 }),
+ 'blog-tags-content-before': () => h(SlotDemo, { name: 'blog-tags-content-before', mt: 16 }),
+ 'blog-tags-title-after': () => h(SlotDemo, { name: 'blog-tags-title-after' }),
+ 'blog-archives-before': () => h(SlotDemo, { name: 'blog-archives-before', mt: 16 }),
+ 'blog-archives-after': () => h(SlotDemo, { name: 'blog-archives-after' }),
+ 'blog-categories-before': () => h(SlotDemo, { name: 'blog-categories-before' }),
+ 'blog-categories-content-before': () => h(SlotDemo, { name: 'blog-categories-content-before' }),
+ 'blog-categories-after': () => h(SlotDemo, { name: 'blog-categories-after' }),
+ }),
+ NotFound: () => h(NotFound, null, {
+ 'layout-top': () => h(SlotDemo, { name: 'layout-top' }),
+ 'layout-bottom': () => h(SlotDemo, { name: 'layout-bottom' }),
+
+ 'nav-bar-title-before': () => h(SlotDemo, { name: 'nav-bar-title-before', w: 64, h: 44, small: true }),
+ 'nav-bar-title-after': () => h(SlotDemo, { name: 'nav-bar-title-after', w: 64, h: 44, small: true }),
+ 'nav-bar-content-before': () => h(SlotDemo, { name: 'nav-bar-content-before', h: 44, small: true }),
+ 'nav-bar-content-after': () => h(SlotDemo, { name: 'nav-bar-content-after', h: 44, small: true }),
+ 'nav-bar-menu-before': () => h(SlotDemo, { name: 'nav-bar-menu-before', h: 44, small: true }),
+ 'nav-bar-menu-after': () => h(SlotDemo, { name: 'nav-bar-menu-after', h: 44, small: true }),
+ 'nav-screen-content-before': () => h(SlotDemo, { name: 'nav-screen-content-before', h: 44, small: true }),
+ 'nav-screen-content-after': () => h(SlotDemo, { name: 'nav-screen-content-after', h: 44, small: true }),
+ 'nav-screen-menu-before': () => h(SlotDemo, { name: 'nav-screen-menu-before', h: 44, small: true }),
+ 'nav-screen-menu-after': () => h(SlotDemo, { name: 'nav-screen-menu-after', h: 44, small: true }),
+
+ 'footer-content': () => h(SlotDemo, { name: 'footer-content' }),
+
+ 'not-found': () => h(SlotDemo, { name: 'not-found' }),
+ }),
+ },
+})
diff --git a/examples/layout-slots/docs/.vuepress/config.ts b/examples/layout-slots/docs/.vuepress/config.ts
new file mode 100644
index 00000000..f6ea78bd
--- /dev/null
+++ b/examples/layout-slots/docs/.vuepress/config.ts
@@ -0,0 +1,34 @@
+import { viteBundler } from '@vuepress/bundler-vite'
+import { defineUserConfig } from 'vuepress'
+import { plumeTheme } from 'vuepress-theme-plume'
+
+export default defineUserConfig({
+ base: '/',
+ lang: 'zh-CN',
+ title: 'Plume',
+ description: 'vuepress-theme-plume',
+
+ head: [
+ // 配置站点图标
+ ['link', { rel: 'icon', type: 'image/png', href: 'https://theme-plume.vuejs.press/favicon-32x32.png' }],
+ ],
+
+ bundler: viteBundler(),
+ shouldPrefetch: false, // 站点较大,页面数量较多时,不建议启用
+
+ theme: plumeTheme({
+ /* 添加您的部署域名, 有助于 SEO, 生成 sitemap */
+ // hostname: 'https://your_site_url',
+
+ /* 文档仓库配置,用于 editLink */
+ docsRepo: 'pengzhanbo/vuepress-theme-plume',
+ docsDir: 'examples/layout-slots/docs',
+
+ /* 页内信息 */
+ contributors: { mode: 'block' },
+ changelog: true,
+
+ /* 本地搜索, 默认启用 */
+ search: { provider: 'local' },
+ }),
+})
diff --git a/examples/layout-slots/docs/.vuepress/navbar.ts b/examples/layout-slots/docs/.vuepress/navbar.ts
new file mode 100644
index 00000000..6a5128e1
--- /dev/null
+++ b/examples/layout-slots/docs/.vuepress/navbar.ts
@@ -0,0 +1,8 @@
+import { defineNavbarConfig } from 'vuepress-theme-plume'
+
+export const navbar = defineNavbarConfig([
+ { text: '首页', link: '/' },
+ { text: '博客', link: '/blog/' },
+ { text: '404', link: '/404/' },
+ { text: '笔记', link: '/notes/demo/README.md' },
+])
diff --git a/examples/layout-slots/docs/.vuepress/notes.ts b/examples/layout-slots/docs/.vuepress/notes.ts
new file mode 100644
index 00000000..01c39b0c
--- /dev/null
+++ b/examples/layout-slots/docs/.vuepress/notes.ts
@@ -0,0 +1,13 @@
+import { defineNoteConfig, defineNotesConfig } from 'vuepress-theme-plume'
+
+const demoNote = defineNoteConfig({
+ dir: 'demo',
+ link: '/demo',
+ sidebar: ['', 'foo', 'bar'],
+})
+
+export const notes = defineNotesConfig({
+ dir: 'notes',
+ link: '/',
+ notes: [demoNote],
+})
diff --git a/examples/layout-slots/docs/.vuepress/plume.config.ts b/examples/layout-slots/docs/.vuepress/plume.config.ts
new file mode 100644
index 00000000..8e4f20cf
--- /dev/null
+++ b/examples/layout-slots/docs/.vuepress/plume.config.ts
@@ -0,0 +1,31 @@
+import { defineThemeConfig } from 'vuepress-theme-plume'
+import { navbar } from './navbar'
+import { notes } from './notes'
+
+/**
+ * @see https://theme-plume.vuejs.press/config/basic/
+ */
+export default defineThemeConfig({
+ logo: 'https://theme-plume.vuejs.press/plume.png',
+
+ appearance: true, // 配置 深色模式
+
+ social: [
+ { icon: 'github', link: '/' },
+ ],
+
+ /**
+ * @see https://theme-plume.vuejs.press/config/basic/#profile
+ */
+ profile: {
+ avatar: 'https://theme-plume.vuejs.press/plume.png',
+ name: 'VuePress Plume',
+ description: 'vuepress-theme-plume',
+ // circle: true,
+ // location: '',
+ // organization: '',
+ },
+
+ navbar,
+ notes,
+})
diff --git a/examples/layout-slots/docs/.vuepress/public/plume.svg b/examples/layout-slots/docs/.vuepress/public/plume.svg
new file mode 100644
index 00000000..62ee70c6
--- /dev/null
+++ b/examples/layout-slots/docs/.vuepress/public/plume.svg
@@ -0,0 +1,8 @@
+
diff --git a/examples/layout-slots/docs/.vuepress/theme/components/Custom.vue b/examples/layout-slots/docs/.vuepress/theme/components/Custom.vue
new file mode 100644
index 00000000..04bac0a3
--- /dev/null
+++ b/examples/layout-slots/docs/.vuepress/theme/components/Custom.vue
@@ -0,0 +1,11 @@
+
+
+
+