@sugarat/theme 0.1.49 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/node.d.ts +41 -1
  2. package/node.js +24 -20
  3. package/package.json +24 -24
  4. package/src/components/BlogAlert.vue +17 -17
  5. package/src/components/BlogApp.vue +91 -50
  6. package/src/components/BlogArticleAnalyze.vue +56 -57
  7. package/src/components/BlogAuthor.vue +55 -0
  8. package/src/components/BlogComment.vue +53 -50
  9. package/src/components/BlogDocCover.vue +4 -4
  10. package/src/components/BlogFooter.vue +131 -0
  11. package/src/components/BlogFriendLink.vue +40 -31
  12. package/src/components/BlogHomeBanner.vue +22 -16
  13. package/src/components/BlogHomeInfo.vue +4 -0
  14. package/src/components/BlogHomeOverview.vue +20 -20
  15. package/src/components/BlogHomeTags.vue +49 -40
  16. package/src/components/BlogHotArticle.vue +43 -36
  17. package/src/components/BlogImagePreview.vue +7 -5
  18. package/src/components/BlogItem.vue +42 -43
  19. package/src/components/BlogList.vue +46 -42
  20. package/src/components/BlogPopover.vue +41 -39
  21. package/src/components/BlogRecommendArticle.vue +58 -48
  22. package/src/components/BlogSearch.vue +143 -145
  23. package/src/components/UserWorks.vue +214 -210
  24. package/src/composables/config/blog.ts +14 -5
  25. package/src/composables/config/index.ts +74 -31
  26. package/src/constants/svg.ts +11 -2
  27. package/src/index.ts +1 -2
  28. package/src/node.ts +2 -2
  29. package/src/styles/gongan.png +0 -0
  30. package/src/styles/scss/global.scss +0 -5
  31. package/src/utils/client/index.ts +9 -8
  32. package/src/utils/node/genFeed.ts +8 -7
  33. package/src/utils/node/index.ts +8 -6
  34. package/src/utils/node/mdPlugins.ts +29 -22
  35. package/src/utils/node/theme.ts +16 -13
  36. package/src/utils/node/vitePlugins.ts +7 -6
  37. package/types/vue-shim.d.ts +1 -1
package/node.d.ts CHANGED
@@ -119,6 +119,8 @@ declare namespace Theme {
119
119
  inspiring?: string | string[];
120
120
  inspiringTimeout?: number;
121
121
  pageSize?: number;
122
+ author?: string | boolean;
123
+ logo?: string | boolean;
122
124
  }
123
125
  interface ArticleConfig {
124
126
  readingTime?: boolean;
@@ -260,12 +262,16 @@ declare namespace Theme {
260
262
  /**
261
263
  * 设置解析 frontmatter 里 date 的时区
262
264
  * @default 8 => 'UTC+8'
263
- * */
265
+ */
264
266
  timeZone?: number;
265
267
  /**
266
268
  * 启用RSS配置
267
269
  */
268
270
  RSS?: RSSOptions;
271
+ /**
272
+ * 首页页脚
273
+ */
274
+ footer?: Footer;
269
275
  }
270
276
  type RSSOptions = Omit<FeedOptions, 'id'> & {
271
277
  id?: string;
@@ -301,6 +307,40 @@ declare namespace Theme {
301
307
  limit?: number;
302
308
  ariaLabel?: string;
303
309
  };
310
+ interface Footer {
311
+ /**
312
+ * 自定义补充信息
313
+ */
314
+ message?: string;
315
+ /**
316
+ * 是否展示主题版本信息
317
+ */
318
+ version?: boolean;
319
+ /**
320
+ * copyright
321
+ */
322
+ copyright?: string | {
323
+ message: string;
324
+ link?: string;
325
+ icon?: boolean | string;
326
+ };
327
+ /**
328
+ * ICP 备案信息
329
+ */
330
+ icpRecord?: {
331
+ name: string;
332
+ link: string;
333
+ icon?: boolean | string;
334
+ };
335
+ /**
336
+ * 公安备案信息
337
+ */
338
+ securityRecord?: {
339
+ name: string;
340
+ link: string;
341
+ icon?: boolean | string;
342
+ };
343
+ }
304
344
  interface Config extends DefaultTheme.Config {
305
345
  blog?: BlogConfig;
306
346
  }
package/node.js CHANGED
@@ -32,7 +32,7 @@ __export(node_exports, {
32
32
  });
33
33
  module.exports = __toCommonJS(node_exports);
34
34
 
35
- // ../../node_modules/.pnpm/vitepress-plugin-tabs@0.2.0_vitepress@1.0.0-rc.14_vue@3.3.4/node_modules/vitepress-plugin-tabs/dist/index.js
35
+ // ../../node_modules/.pnpm/vitepress-plugin-tabs@0.2.0_vitepress@1.0.0-rc.17_vue@3.3.4/node_modules/vitepress-plugin-tabs/dist/index.js
36
36
  var tabsMarker = "=tabs";
37
37
  var tabsMarkerLen = tabsMarker.length;
38
38
  var ruleBlockTabs = (state, startLine, endLine, silent) => {
@@ -197,7 +197,7 @@ var tabsPlugin = (md) => {
197
197
  };
198
198
 
199
199
  // src/utils/node/index.ts
200
- var import_child_process = require("child_process");
200
+ var import_node_child_process = require("child_process");
201
201
 
202
202
  // src/utils/client/index.ts
203
203
  function formatDate(d, fmt = "yyyy-MM-dd hh:mm:ss") {
@@ -211,7 +211,7 @@ function formatDate(d, fmt = "yyyy-MM-dd hh:mm:ss") {
211
211
  "m+": d.getMinutes(),
212
212
  "s+": d.getSeconds(),
213
213
  "q+": Math.floor((d.getMonth() + 3) / 3),
214
- S: d.getMilliseconds()
214
+ "S": d.getMilliseconds()
215
215
  };
216
216
  if (/(y+)/.test(fmt)) {
217
217
  fmt = fmt.replace(
@@ -258,7 +258,7 @@ function getDefaultTitle(content) {
258
258
  function getFileBirthTime(url) {
259
259
  let date = new Date();
260
260
  try {
261
- const infoStr = (0, import_child_process.spawnSync)("git", ["log", "-1", '--pretty="%ci"', url]).stdout?.toString().replace(/["']/g, "").trim();
261
+ const infoStr = (0, import_node_child_process.spawnSync)("git", ["log", "-1", '--pretty="%ci"', url]).stdout?.toString().replace(/["']/g, "").trim();
262
262
  if (infoStr) {
263
263
  date = new Date(infoStr);
264
264
  }
@@ -277,11 +277,11 @@ function aliasObjectToArray(obj) {
277
277
  }));
278
278
  }
279
279
  var EXTERNAL_URL_RE = /^[a-z]+:/i;
280
- function joinPath(base, path3) {
281
- return `${base}${path3}`.replace(/\/+/g, "/");
280
+ function joinPath(base, path4) {
281
+ return `${base}${path4}`.replace(/\/+/g, "/");
282
282
  }
283
- function withBase(base, path3) {
284
- return EXTERNAL_URL_RE.test(path3) || path3.startsWith(".") ? path3 : joinPath(base, path3);
283
+ function withBase(base, path4) {
284
+ return EXTERNAL_URL_RE.test(path4) || path4.startsWith(".") ? path4 : joinPath(base, path4);
285
285
  }
286
286
 
287
287
  // src/utils/node/mdPlugins.ts
@@ -327,7 +327,7 @@ function assignMermaid(config) {
327
327
  ...aliasObjectToArray({
328
328
  ...config.vite.resolve.alias,
329
329
  "cytoscape/dist/cytoscape.umd.js": "cytoscape/dist/cytoscape.esm.js",
330
- mermaid: "mermaid/dist/mermaid.esm.mjs"
330
+ "mermaid": "mermaid/dist/mermaid.esm.mjs"
331
331
  }),
332
332
  { find: /^dayjs\/(.*).js/, replacement: "dayjs/esm/$1" }
333
333
  ];
@@ -360,10 +360,11 @@ function supportRunExtendsPlugin(config) {
360
360
  }
361
361
 
362
362
  // src/utils/node/theme.ts
363
+ var import_node_fs = __toESM(require("fs"));
364
+ var import_node_path = __toESM(require("path"));
365
+ var import_node_process = __toESM(require("process"));
363
366
  var import_fast_glob = __toESM(require("fast-glob"));
364
367
  var import_gray_matter = __toESM(require("gray-matter"));
365
- var import_fs = __toESM(require("fs"));
366
- var import_path = __toESM(require("path"));
367
368
  function patchDefaultThemeSideBar(cfg) {
368
369
  return cfg?.blog !== false && cfg?.recommend !== false ? {
369
370
  sidebar: [
@@ -376,27 +377,27 @@ function patchDefaultThemeSideBar(cfg) {
376
377
  }
377
378
  var pageMap = /* @__PURE__ */ new Map();
378
379
  function getArticles(cfg) {
379
- const srcDir = cfg?.srcDir || process.argv.slice(2)?.[1] || ".";
380
+ const srcDir = cfg?.srcDir || import_node_process.default.argv.slice(2)?.[1] || ".";
380
381
  const files = import_fast_glob.default.sync(`${srcDir}/**/*.md`, { ignore: ["node_modules"] });
381
382
  const data = files.map((v) => {
382
383
  let route = v.replace(".md", "");
383
384
  if (route.startsWith("./")) {
384
385
  route = route.replace(
385
386
  new RegExp(
386
- `^\\.\\/${import_path.default.join(srcDir, "/").replace(new RegExp(`\\${import_path.default.sep}`, "g"), "/")}`
387
+ `^\\.\\/${import_node_path.default.join(srcDir, "/").replace(new RegExp(`\\${import_node_path.default.sep}`, "g"), "/")}`
387
388
  ),
388
389
  ""
389
390
  );
390
391
  } else {
391
392
  route = route.replace(
392
393
  new RegExp(
393
- `^${import_path.default.join(srcDir, "/").replace(new RegExp(`\\${import_path.default.sep}`, "g"), "/")}`
394
+ `^${import_node_path.default.join(srcDir, "/").replace(new RegExp(`\\${import_node_path.default.sep}`, "g"), "/")}`
394
395
  ),
395
396
  ""
396
397
  );
397
398
  }
398
399
  pageMap.set(`/${route}`, v);
399
- const fileContent = import_fs.default.readFileSync(v, "utf-8");
400
+ const fileContent = import_node_fs.default.readFileSync(v, "utf-8");
400
401
  const { data: frontmatter, excerpt } = (0, import_gray_matter.default)(fileContent, {
401
402
  excerpt: true
402
403
  });
@@ -452,11 +453,14 @@ function patchVPThemeConfig(cfg, vpThemeConfig = {}) {
452
453
  }
453
454
 
454
455
  // src/utils/node/vitePlugins.ts
456
+ var import_node_path3 = __toESM(require("path"));
457
+ var import_node_child_process2 = require("child_process");
458
+ var import_node_process2 = __toESM(require("process"));
455
459
  var import_vitepress_plugin_pagefind = require("vitepress-plugin-pagefind");
456
460
 
457
461
  // src/utils/node/genFeed.ts
458
- var import_path2 = __toESM(require("path"));
459
- var import_fs2 = __toESM(require("fs"));
462
+ var import_node_path2 = __toESM(require("path"));
463
+ var import_node_fs2 = __toESM(require("fs"));
460
464
  var import_feed = require("feed");
461
465
  async function genFeed(config) {
462
466
  const blogCfg = config.userConfig.themeConfig.blog;
@@ -499,7 +503,7 @@ async function genFeed(config) {
499
503
  let html;
500
504
  const filepath = pageMap.get(route);
501
505
  if (filepath) {
502
- const fileContent = import_fs2.default.readFileSync(filepath, "utf-8");
506
+ const fileContent = import_node_fs2.default.readFileSync(filepath, "utf-8");
503
507
  html = mdRender.render(fileContent);
504
508
  }
505
509
  feed.addItem({
@@ -518,8 +522,8 @@ async function genFeed(config) {
518
522
  });
519
523
  }
520
524
  const RSSFilename = filename || "feed.rss";
521
- const RSSFile = import_path2.default.join(config.outDir, RSSFilename);
522
- (0, import_fs2.writeFileSync)(RSSFile, feed.rss2());
525
+ const RSSFile = import_node_path2.default.join(config.outDir, RSSFilename);
526
+ (0, import_node_fs2.writeFileSync)(RSSFile, feed.rss2());
523
527
  console.log("\u{1F389} RSS generated", RSSFilename);
524
528
  console.log("rss filepath:", RSSFile);
525
529
  console.log("rss url:", `${baseUrl}${config.site.base + RSSFilename}`);
package/package.json CHANGED
@@ -1,8 +1,22 @@
1
1
  {
2
2
  "name": "@sugarat/theme",
3
- "version": "0.1.49",
3
+ "version": "0.2.0",
4
4
  "description": "简约风的 Vitepress 博客主题,sugarat vitepress blog theme",
5
- "main": "src/index.ts",
5
+ "author": "sugar",
6
+ "license": "MIT",
7
+ "homepage": "https://theme.sugarat.top",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/ATQQ/sugar-blog.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/ATQQ/sugar-blog/issues"
14
+ },
15
+ "keywords": [
16
+ "vitepress",
17
+ "theme",
18
+ "粥里有勺糖"
19
+ ],
6
20
  "exports": {
7
21
  "./node": {
8
22
  "types": "./node.d.ts",
@@ -11,27 +25,13 @@
11
25
  "./package.json": "./package.json",
12
26
  ".": "./src/index.ts"
13
27
  },
28
+ "main": "src/index.ts",
14
29
  "files": [
15
- "src",
16
- "types",
30
+ "node.d.ts",
17
31
  "node.js",
18
- "node.d.ts"
19
- ],
20
- "repository": {
21
- "type": "git",
22
- "url": "git+https://github.com/ATQQ/sugar-blog.git"
23
- },
24
- "keywords": [
25
- "vitepress",
26
- "theme",
27
- "粥里有勺糖"
32
+ "src",
33
+ "types"
28
34
  ],
29
- "author": "sugar",
30
- "license": "MIT",
31
- "homepage": "https://theme.sugarat.top",
32
- "bugs": {
33
- "url": "https://github.com/ATQQ/sugar-blog/issues"
34
- },
35
35
  "dependencies": {
36
36
  "@mdit-vue/shared": "^0.12.0",
37
37
  "@mermaid-js/mermaid-mindmap": "^9.3.0",
@@ -43,19 +43,19 @@
43
43
  "highlight.js": "^11.7.0",
44
44
  "mermaid": "^10.2.4",
45
45
  "vitepress-plugin-mermaid": "^2.0.13",
46
- "vitepress-plugin-pagefind": "0.2.9",
46
+ "vitepress-plugin-pagefind": "0.2.10",
47
47
  "vue-command-palette": "^0.1.4"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@element-plus/icons-vue": "^2.1.0",
51
51
  "element-plus": "^2.3.4",
52
+ "pagefind": "1.0.3",
52
53
  "sass": "^1.56.1",
53
54
  "tsup": " ^6.5.0",
54
55
  "typescript": "^4.8.2",
55
- "vitepress": "1.0.0-rc.14",
56
+ "vitepress": "1.0.0-rc.17",
56
57
  "vitepress-plugin-tabs": "^0.2.0",
57
- "vue": "^3.3.4",
58
- "pagefind": "1.0.3"
58
+ "vue": "^3.3.4"
59
59
  },
60
60
  "scripts": {
61
61
  "dev": "npm run build:node && npm run dev:docs",
@@ -1,22 +1,6 @@
1
- <template>
2
- <div class="global-alert" v-if="show" data-pagefind-ignore="all">
3
- <el-alert
4
- :title="alertProps?.title"
5
- :type="alertProps?.type"
6
- :show-icon="alertProps?.showIcon"
7
- :center="alertProps?.center"
8
- :closable="alertProps?.closable"
9
- :close-text="alertProps?.closeText"
10
- :description="alertProps?.description"
11
- >
12
- <div v-if="alertProps?.html" v-html="alertProps?.html"></div>
13
- </el-alert>
14
- </div>
15
- </template>
16
-
17
1
  <script lang="ts" setup>
18
2
  import { ElAlert } from 'element-plus'
19
- import { ref, onMounted } from 'vue'
3
+ import { onMounted, ref } from 'vue'
20
4
  import { useBlogConfig } from '../composables/config/blog'
21
5
 
22
6
  const { alert: alertProps } = useBlogConfig()
@@ -46,6 +30,22 @@ onMounted(() => {
46
30
  })
47
31
  </script>
48
32
 
33
+ <template>
34
+ <div v-if="show" class="global-alert" data-pagefind-ignore="all">
35
+ <ElAlert
36
+ :title="alertProps?.title"
37
+ :type="alertProps?.type"
38
+ :show-icon="alertProps?.showIcon"
39
+ :center="alertProps?.center"
40
+ :closable="alertProps?.closable"
41
+ :close-text="alertProps?.closeText"
42
+ :description="alertProps?.description"
43
+ >
44
+ <div v-if="alertProps?.html" v-html="alertProps?.html" />
45
+ </ElAlert>
46
+ </div>
47
+ </template>
48
+
49
49
  <style lang="scss" scoped>
50
50
  .global-alert {
51
51
  position: fixed;
@@ -1,17 +1,23 @@
1
1
  <script setup lang="ts" name="BlogApp">
2
2
  import Theme from 'vitepress/theme'
3
+ import { useData } from 'vitepress'
4
+ import { computed } from 'vue'
5
+ import { useBlogThemeMode } from '../composables/config/blog'
3
6
  import BlogHomeInfo from './BlogHomeInfo.vue'
4
7
  import BlogHomeBanner from './BlogHomeBanner.vue'
5
8
  import BlogList from './BlogList.vue'
6
9
  import BlogComment from './BlogComment.vue'
10
+
7
11
  // import BlogSearch from './BlogSearch.vue'
8
12
  import BlogSidebar from './BlogSidebar.vue'
9
13
  import BlogImagePreview from './BlogImagePreview.vue'
10
14
  import BlogArticleAnalyze from './BlogArticleAnalyze.vue'
11
15
  import BlogAlert from './BlogAlert.vue'
12
16
  import BlogPopover from './BlogPopover.vue'
13
- import { useBlogThemeMode } from '../composables/config/blog'
17
+ import BlogFooter from './BlogFooter.vue'
14
18
 
19
+ const { frontmatter } = useData()
20
+ const layout = computed(() => frontmatter.value.layout)
15
21
  const isBlogTheme = useBlogThemeMode()
16
22
  const { Layout } = Theme
17
23
  </script>
@@ -19,6 +25,7 @@ const { Layout } = Theme
19
25
  <template>
20
26
  <Layout>
21
27
  <template #layout-top>
28
+ <slot name="layout-top" />
22
29
  <BlogAlert />
23
30
  <BlogPopover />
24
31
  </template>
@@ -39,7 +46,7 @@ const { Layout } = Theme
39
46
  <BlogSearch />
40
47
  </template> -->
41
48
  <!-- 自定义首页 -->
42
- <template #home-hero-before v-if="isBlogTheme">
49
+ <template v-if="isBlogTheme" #home-hero-before>
43
50
  <slot name="home-hero-before" />
44
51
  <div class="home">
45
52
  <div class="header-banner">
@@ -49,11 +56,13 @@ const { Layout } = Theme
49
56
  <div class="blog-list-wrapper">
50
57
  <BlogList />
51
58
  </div>
52
- <div class="blog-info-wrapper"><BlogHomeInfo /></div>
59
+ <div class="blog-info-wrapper">
60
+ <BlogHomeInfo />
61
+ </div>
53
62
  </div>
54
63
  </div>
55
64
  </template>
56
- <template #sidebar-nav-after v-if="isBlogTheme">
65
+ <template v-if="isBlogTheme" #sidebar-nav-after>
57
66
  <slot name="sidebar-nav-after" />
58
67
  <BlogSidebar />
59
68
  </template>
@@ -62,60 +71,92 @@ const { Layout } = Theme
62
71
  <slot name="doc-after" />
63
72
  <BlogComment />
64
73
  </template>
65
-
74
+ <template #layout-bottom>
75
+ <BlogFooter v-if="layout === 'home'" />
76
+ <slot name="layout-bottom" />
77
+ </template>
66
78
  <!-- 透传默认主题的其它插槽 -->
67
79
  <!-- navbar -->
68
- <template #nav-bar-title-before
69
- ><slot name="nav-bar-title-before"
70
- /></template>
71
- <template #nav-bar-title-after
72
- ><slot name="nav-bar-title-after"
73
- /></template>
74
- <template #nav-bar-content-after
75
- ><slot name="nav-bar-content-after"
76
- /></template>
77
- <template #nav-screen-content-before
78
- ><slot name="nav-screen-content-before"
79
- /></template>
80
- <template #nav-screen-content-after
81
- ><slot name="nav-screen-content-after"
82
- /></template>
80
+ <template #nav-bar-title-before>
81
+ <slot name="nav-bar-title-before" />
82
+ </template>
83
+ <template #nav-bar-title-after>
84
+ <slot name="nav-bar-title-after" />
85
+ </template>
86
+ <template #nav-bar-content-after>
87
+ <slot name="nav-bar-content-after" />
88
+ </template>
89
+ <template #nav-screen-content-before>
90
+ <slot name="nav-screen-content-before" />
91
+ </template>
92
+ <template #nav-screen-content-after>
93
+ <slot name="nav-screen-content-after" />
94
+ </template>
83
95
 
84
96
  <!-- sidebar -->
85
- <template #sidebar-nav-before><slot name="sidebar-nav-before" /></template>
97
+ <template #sidebar-nav-before>
98
+ <slot name="sidebar-nav-before" />
99
+ </template>
86
100
 
87
101
  <!-- content -->
88
- <template #page-top><slot name="page-top" /></template>
89
- <template #page-bottom><slot name="page-bottom" /></template>
90
-
91
- <template #not-found><slot name="not-found" /></template>
92
- <template #home-hero-info><slot name="home-hero-info" /></template>
93
- <template #home-hero-image><slot name="home-hero-image" /></template>
94
- <template #home-hero-after><slot name="home-hero-after" /></template>
95
- <template #home-features-before
96
- ><slot name="home-features-before"
97
- /></template>
98
- <template #home-features-after
99
- ><slot name="home-features-after"
100
- /></template>
101
-
102
- <template #doc-footer-before><slot name="doc-footer-before" /></template>
103
-
104
- <template #doc-top><slot name="doc-top" /></template>
105
- <template #doc-bottom><slot name="doc-bottom" /></template>
106
-
107
- <template #aside-top><slot name="aside-top" /></template>
108
- <template #aside-bottom><slot name="aside-bottom" /></template>
109
- <template #aside-outline-before
110
- ><slot name="aside-outline-before"
111
- /></template>
112
- <template #aside-outline-after
113
- ><slot name="aside-outline-after"
114
- /></template>
115
- <template #aside-ads-before><slot name="aside-ads-before" /></template>
116
- <template #aside-ads-after><slot name="aside-ads-after" /></template>
102
+ <template #page-top>
103
+ <slot name="page-top" />
104
+ </template>
105
+ <template #page-bottom>
106
+ <slot name="page-bottom" />
107
+ </template>
108
+
109
+ <template #not-found>
110
+ <slot name="not-found" />
111
+ </template>
112
+ <template #home-hero-info>
113
+ <slot name="home-hero-info" />
114
+ </template>
115
+ <template #home-hero-image>
116
+ <slot name="home-hero-image" />
117
+ </template>
118
+ <template #home-hero-after>
119
+ <slot name="home-hero-after" />
120
+ </template>
121
+ <template #home-features-before>
122
+ <slot name="home-features-before" />
123
+ </template>
124
+ <template #home-features-after>
125
+ <slot name="home-features-after" />
126
+ </template>
127
+
128
+ <template #doc-footer-before>
129
+ <slot name="doc-footer-before" />
130
+ </template>
131
+
132
+ <template #doc-top>
133
+ <slot name="doc-top" />
134
+ </template>
135
+ <template #doc-bottom>
136
+ <slot name="doc-bottom" />
137
+ </template>
138
+
139
+ <template #aside-top>
140
+ <slot name="aside-top" />
141
+ </template>
142
+ <template #aside-bottom>
143
+ <slot name="aside-bottom" />
144
+ </template>
145
+ <template #aside-outline-before>
146
+ <slot name="aside-outline-before" />
147
+ </template>
148
+ <template #aside-outline-after>
149
+ <slot name="aside-outline-after" />
150
+ </template>
151
+ <template #aside-ads-before>
152
+ <slot name="aside-ads-before" />
153
+ </template>
154
+ <template #aside-ads-after>
155
+ <slot name="aside-ads-after" />
156
+ </template>
117
157
  </Layout>
118
158
  </template>
159
+
119
160
  <style scoped lang="scss">
120
161
  .home {
121
162
  margin: 0 auto;