valaxy-theme-hairy 0.0.6 → 0.0.7
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.
- package/components/HairyBody.vue +1 -1
- package/components/HairyFooter.vue +53 -0
- package/components/HairyHeader.vue +1 -1
- package/components/HairyLayout.vue +3 -4
- package/components/HairyWaline.vue +4 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +40 -0
- package/dist/index.mjs +17 -0
- package/index.d.ts +43 -0
- package/layouts/hairy.vue +24 -0
- package/layouts/tag.vue +1 -1
- package/modules/loading.scss +4 -0
- package/node/addon-hairy.ts +13 -0
- package/package.json +3 -3
- package/styles/aplayer.scss +76 -0
- package/styles/index.scss +3 -0
- package/valaxy.config.ts +3 -1
package/components/HairyBody.vue
CHANGED
@@ -9,7 +9,7 @@ const showWaline = computed(() => route.path.includes('/posts/') || fr.value.wal
|
|
9
9
|
</script>
|
10
10
|
|
11
11
|
<template>
|
12
|
-
<div class="HairyBody min-h-
|
12
|
+
<div class="HairyBody min-h-49vh relative">
|
13
13
|
<div class="mx-auto breakpoint flex z-1 relative">
|
14
14
|
<div class="relative flex-1 pt-2">
|
15
15
|
<slot />
|
@@ -0,0 +1,53 @@
|
|
1
|
+
<script lang="ts" setup>
|
2
|
+
import { capitalize, computed } from 'vue'
|
3
|
+
import { useConfig, useThemeConfig } from 'valaxy'
|
4
|
+
import { useI18n } from 'vue-i18n'
|
5
|
+
|
6
|
+
import pkg from 'valaxy/package.json'
|
7
|
+
|
8
|
+
const { t } = useI18n()
|
9
|
+
|
10
|
+
const config = useConfig()
|
11
|
+
const themeConfig = useThemeConfig()
|
12
|
+
|
13
|
+
const year = new Date().getFullYear()
|
14
|
+
|
15
|
+
const isThisYear = computed(() => {
|
16
|
+
return year === themeConfig.value.footer.since
|
17
|
+
})
|
18
|
+
|
19
|
+
const poweredHtml = computed(() => t('footer.powered', [`<a href="${pkg.repository}" target="_blank" rel="noopener">Valaxy</a> v${pkg.version}`]))
|
20
|
+
const footerIcon = computed(() => themeConfig.value.footer.icon)
|
21
|
+
</script>
|
22
|
+
|
23
|
+
<template>
|
24
|
+
<footer class="va-footer p-4 pb-10" text="center sm" style="color:var(--va-c-text-light)">
|
25
|
+
<div v-if="themeConfig.footer.beian?.enable && themeConfig.footer.beian.icp" class="beian" m="y-2">
|
26
|
+
<a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener">
|
27
|
+
{{ themeConfig.footer.beian.icp }}
|
28
|
+
</a>
|
29
|
+
</div>
|
30
|
+
|
31
|
+
<div class="copyright flex justify-center items-center" p="1">
|
32
|
+
<span>
|
33
|
+
©
|
34
|
+
<template v-if="!isThisYear">
|
35
|
+
{{ themeConfig.footer.since }} -
|
36
|
+
</template>
|
37
|
+
{{ year }}
|
38
|
+
</span>
|
39
|
+
|
40
|
+
<a v-if="footerIcon" class="inline-flex animate-pulse ml-2" :href="footerIcon.url" target="_blank" :title="footerIcon.title">
|
41
|
+
<div :class="footerIcon.name" />
|
42
|
+
</a>
|
43
|
+
|
44
|
+
<span class="ml-2">{{ config.author.name }}</span>
|
45
|
+
</div>
|
46
|
+
|
47
|
+
<div v-if="themeConfig.footer.powered" class="powered" m="2">
|
48
|
+
<span v-html="poweredHtml" /> | <span>{{ t('footer.theme') }} - <a :href="themeConfig.pkg.homepage" :title="`valaxy-theme-${config.theme}`" target="_blank">{{ capitalize(config.theme) }}</a> v{{ themeConfig.pkg.version }}</span>
|
49
|
+
</div>
|
50
|
+
|
51
|
+
<slot />
|
52
|
+
</footer>
|
53
|
+
</template>
|
@@ -11,7 +11,7 @@ const { headerRef } = useContext()
|
|
11
11
|
</script>
|
12
12
|
|
13
13
|
<template>
|
14
|
-
<header ref="headerRef" class="HairyHeader relative">
|
14
|
+
<header ref="headerRef" class="HairyHeader relative animate__animated animate__fadeIn">
|
15
15
|
<div class="h-30vh lt-md:h-60vh min-h-80 flex-center">
|
16
16
|
<HairyPostTitle v-if="title" class="relative z-2" :title="title" v-bind="$props">
|
17
17
|
<template #description>
|
@@ -9,7 +9,7 @@ defineProps<{
|
|
9
9
|
</script>
|
10
10
|
|
11
11
|
<template>
|
12
|
-
<div class="HairyLayout">
|
12
|
+
<div class="HairyLayout min-h-100vh">
|
13
13
|
<HairyNav />
|
14
14
|
<HairyHeader v-bind="header">
|
15
15
|
<template #description>
|
@@ -22,8 +22,7 @@ defineProps<{
|
|
22
22
|
<template v-if="$slots['body-slide']" #slide>
|
23
23
|
<slot name="body-slide" />
|
24
24
|
</template>
|
25
|
-
</HairyBody>
|
26
|
-
<
|
27
|
-
<HairyMeting />
|
25
|
+
</HairyBody>
|
26
|
+
<HairyFooter class="z-1 relative" />
|
28
27
|
</div>
|
29
28
|
</template>
|
package/dist/index.d.ts
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
import * as valaxy_dist_node from 'valaxy/dist/node';
|
2
|
+
|
3
|
+
interface HairyTheme {
|
4
|
+
nav?: NavItem[];
|
5
|
+
}
|
6
|
+
interface NavItem {
|
7
|
+
text: string;
|
8
|
+
icon?: string;
|
9
|
+
link?: string;
|
10
|
+
items?: NavItem[];
|
11
|
+
}
|
12
|
+
|
13
|
+
declare const _default: Promise<valaxy_dist_node.ValaxyThemePlugin | valaxy_dist_node.ThemeConfigFn>;
|
14
|
+
|
15
|
+
export { HairyTheme, NavItem, _default as default };
|
package/dist/index.js
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __defProp = Object.defineProperty;
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
6
|
+
var __export = (target, all) => {
|
7
|
+
for (var name in all)
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
9
|
+
};
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
12
|
+
for (let key of __getOwnPropNames(from))
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
15
|
+
}
|
16
|
+
return to;
|
17
|
+
};
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
19
|
+
|
20
|
+
// node/index.ts
|
21
|
+
var node_exports = {};
|
22
|
+
__export(node_exports, {
|
23
|
+
default: () => node_default
|
24
|
+
});
|
25
|
+
module.exports = __toCommonJS(node_exports);
|
26
|
+
var import_valaxy = require("valaxy");
|
27
|
+
var safelist = [
|
28
|
+
"i-ri-home-line",
|
29
|
+
"i-ri-github-line"
|
30
|
+
];
|
31
|
+
var node_default = (0, import_valaxy.defineThemePlugin)(() => {
|
32
|
+
return {
|
33
|
+
vite: {},
|
34
|
+
unocss: {
|
35
|
+
safelist
|
36
|
+
}
|
37
|
+
};
|
38
|
+
});
|
39
|
+
// Annotate the CommonJS export names for ESM import in node:
|
40
|
+
0 && (module.exports = {});
|
package/dist/index.mjs
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
// node/index.ts
|
2
|
+
import { defineThemePlugin } from "valaxy";
|
3
|
+
var safelist = [
|
4
|
+
"i-ri-home-line",
|
5
|
+
"i-ri-github-line"
|
6
|
+
];
|
7
|
+
var node_default = defineThemePlugin(() => {
|
8
|
+
return {
|
9
|
+
vite: {},
|
10
|
+
unocss: {
|
11
|
+
safelist
|
12
|
+
}
|
13
|
+
};
|
14
|
+
});
|
15
|
+
export {
|
16
|
+
node_default as default
|
17
|
+
};
|
package/index.d.ts
CHANGED
@@ -3,6 +3,9 @@ import type { ViteSSGContext } from 'vite-ssg'
|
|
3
3
|
export interface HairyTheme {
|
4
4
|
nav?: NavItem[];
|
5
5
|
home?: {
|
6
|
+
headline?: string
|
7
|
+
title?: string
|
8
|
+
description?: string
|
6
9
|
images?: string[]
|
7
10
|
}
|
8
11
|
user?: {
|
@@ -42,6 +45,46 @@ export interface HairyTheme {
|
|
42
45
|
'storage-name'?: string
|
43
46
|
[key: string]: any
|
44
47
|
}
|
48
|
+
|
49
|
+
footer: Partial<{
|
50
|
+
/**
|
51
|
+
* 建站于
|
52
|
+
*/
|
53
|
+
since: number
|
54
|
+
|
55
|
+
/**
|
56
|
+
* Icon between year and copyright info.
|
57
|
+
*/
|
58
|
+
icon: {
|
59
|
+
/**
|
60
|
+
* icon name, i-xxx
|
61
|
+
*/
|
62
|
+
name: string
|
63
|
+
animated: boolean
|
64
|
+
color: string
|
65
|
+
url: string
|
66
|
+
title: string
|
67
|
+
}
|
68
|
+
|
69
|
+
/**
|
70
|
+
* Powered by valaxy & valaxy-theme-${name}, default is yun
|
71
|
+
*/
|
72
|
+
powered: boolean
|
73
|
+
|
74
|
+
/**
|
75
|
+
* Chinese Users | 中国用户
|
76
|
+
* 备案 ICP
|
77
|
+
* 国内用户需要在网站页脚展示备案 ICP 号
|
78
|
+
* https://beian.miit.gov.cn/
|
79
|
+
*/
|
80
|
+
beian: {
|
81
|
+
enable: boolean
|
82
|
+
/**
|
83
|
+
* 苏ICP备xxxxxxxx号
|
84
|
+
*/
|
85
|
+
icp: string
|
86
|
+
}
|
87
|
+
}>
|
45
88
|
}
|
46
89
|
export interface NavItem {
|
47
90
|
text: string;
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<script lang="ts" setup>
|
2
|
+
import { computed } from 'vue'
|
3
|
+
import { useRoute } from 'vue-router'
|
4
|
+
|
5
|
+
const route = useRoute()
|
6
|
+
const meta = computed(() => route.meta)
|
7
|
+
const type = computed(() => meta.value.type || '')
|
8
|
+
console.log(type.value)
|
9
|
+
</script>
|
10
|
+
|
11
|
+
<template>
|
12
|
+
<HairyBackToTop />
|
13
|
+
<HairyMeting />
|
14
|
+
<home v-if="type === 'home'" />
|
15
|
+
<post v-if="type === 'post'" />
|
16
|
+
<archives v-if="type === 'archives'" />
|
17
|
+
<categories v-if="type === 'categories'" />
|
18
|
+
<month v-if="type === 'month'" />
|
19
|
+
<tag v-if="type === 'tag'" />
|
20
|
+
<tags v-if="type === 'tags'" />
|
21
|
+
<year v-if="type === 'year'" />
|
22
|
+
<default v-if="type === 'default'" />
|
23
|
+
</template>
|
24
|
+
|
package/layouts/tag.vue
CHANGED
package/modules/loading.scss
CHANGED
package/node/addon-hairy.ts
CHANGED
@@ -6,6 +6,19 @@ function addonHairy(): ValaxyExtendConfig {
|
|
6
6
|
if (ctx.route.meta.excerpt)
|
7
7
|
ctx.route.meta.frontmatter.text = removeTags(ctx.route.meta.excerpt)
|
8
8
|
},
|
9
|
+
pages: {
|
10
|
+
extendRoute(route) {
|
11
|
+
// 改用 type, 由 theme 决定使用布局
|
12
|
+
if (!route.meta.type && route.meta.layout)
|
13
|
+
route.meta.type = route.meta.layout
|
14
|
+
|
15
|
+
if (!route.meta.type)
|
16
|
+
route.meta.type = 'default'
|
17
|
+
|
18
|
+
// 清除所有 layout, 使用统一入口 hairy.vue
|
19
|
+
route.meta.layout = 'hairy'
|
20
|
+
},
|
21
|
+
},
|
9
22
|
}
|
10
23
|
}
|
11
24
|
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "valaxy-theme-hairy",
|
3
|
-
"version": "0.0.
|
3
|
+
"version": "0.0.7",
|
4
4
|
"packageManager": "pnpm@7.5.0",
|
5
5
|
"author": {
|
6
6
|
"email": "wwu710632@gmail.com",
|
@@ -27,6 +27,7 @@
|
|
27
27
|
"@iconify-json/simple-icons": "^1.1.19",
|
28
28
|
"@vueuse/core": "^8.9.4",
|
29
29
|
"@waline/client": "^2.6.1",
|
30
|
+
"animate.css": "^4.1.1",
|
30
31
|
"dayjs": "^1.11.4",
|
31
32
|
"defu": "^6.0.0",
|
32
33
|
"element-plus": "^2.2.10",
|
@@ -34,8 +35,7 @@
|
|
34
35
|
"markdown-toc": "^1.2.0",
|
35
36
|
"reading-time": "^1.5.0",
|
36
37
|
"swiper": "^8.3.1",
|
37
|
-
"unoverlay-vue": "0.2.1"
|
38
|
-
"yaml": "^2.1.1"
|
38
|
+
"unoverlay-vue": "0.2.1"
|
39
39
|
},
|
40
40
|
"devDependencies": {
|
41
41
|
"@types/lodash": "^4.14.182",
|
@@ -0,0 +1,76 @@
|
|
1
|
+
.aplayer.aplayer-fixed .aplayer-list,
|
2
|
+
.aplayer .aplayer-info {
|
3
|
+
font-family: var(--hy-font-family-seto);
|
4
|
+
}
|
5
|
+
|
6
|
+
.dark {
|
7
|
+
.aplayer {
|
8
|
+
background: #2B2B2B;
|
9
|
+
padding: 6px;
|
10
|
+
color: #c2c2c2;
|
11
|
+
}
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
.aplayer.aplayer-fixed .aplayer-body {
|
16
|
+
background-color: #2B2B2B;
|
17
|
+
}
|
18
|
+
|
19
|
+
.aplayer.aplayer-fixed .aplayer-info {
|
20
|
+
border: none;
|
21
|
+
}
|
22
|
+
|
23
|
+
.aplayer .aplayer-miniswitcher {
|
24
|
+
background: #bebebe;
|
25
|
+
}
|
26
|
+
|
27
|
+
.aplayer.aplayer-fixed .aplayer-list {
|
28
|
+
border: none;
|
29
|
+
}
|
30
|
+
|
31
|
+
.aplayer .aplayer-list ol {
|
32
|
+
padding-right: 4px;
|
33
|
+
}
|
34
|
+
|
35
|
+
.aplayer .aplayer-list ol li.aplayer-list-light {
|
36
|
+
background-color: #404040;
|
37
|
+
color: var(--hy-c-primary);
|
38
|
+
|
39
|
+
.aplayer-list-cur {
|
40
|
+
background-color: var(--hy-c-primary) !important;
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
.aplayer .aplayer-list ol li {
|
45
|
+
border: none;
|
46
|
+
|
47
|
+
&:hover {
|
48
|
+
background: #373737;
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
.aplayer .aplayer-list ol li:nth-child(2n) {
|
53
|
+
background: #2F2F2F;
|
54
|
+
|
55
|
+
&:hover {
|
56
|
+
background: #373737;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
.aplayer .aplayer-list ol li .aplayer-list-index,
|
61
|
+
.aplayer .aplayer-list ol li .aplayer-list-author {
|
62
|
+
color: #8C8C8C;
|
63
|
+
}
|
64
|
+
|
65
|
+
.aplayer .aplayer-info .aplayer-controller .aplayer-time .aplayer-icon:hover path {
|
66
|
+
fill: #d9d9d9 !important;
|
67
|
+
}
|
68
|
+
|
69
|
+
.aplayer .aplayer-miniswitcher .aplayer-icon:hover path {
|
70
|
+
// fill: #c2c2c2;
|
71
|
+
}
|
72
|
+
|
73
|
+
.aplayer-pic {
|
74
|
+
// border-radius: 4px;
|
75
|
+
}
|
76
|
+
}
|
package/styles/index.scss
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
@import "./markdown.scss";
|
3
3
|
@import "./element-plus/index.scss";
|
4
4
|
@import "./scrollbar.scss";
|
5
|
+
@import "./aplayer.scss";
|
6
|
+
@import "animate.css";
|
5
7
|
|
6
8
|
body {
|
7
9
|
font-family: var(--hy-font-family-seto);
|
@@ -10,6 +12,7 @@ body {
|
|
10
12
|
|
11
13
|
#app {
|
12
14
|
@apply transition-none;
|
15
|
+
min-height: 100vh;
|
13
16
|
}
|
14
17
|
|
15
18
|
a {
|
package/valaxy.config.ts
CHANGED
@@ -7,11 +7,13 @@ import addonStatistics from './node/addon-statistics'
|
|
7
7
|
import addonToc from './node/addon-toc'
|
8
8
|
export default defineTheme<HairyTheme>((options) => {
|
9
9
|
const images = addonImages(options)
|
10
|
+
const hairy = addonHairy()
|
10
11
|
|
11
12
|
return {
|
12
13
|
vite: images.vite,
|
14
|
+
pages: hairy.pages,
|
13
15
|
extendMd(ctx) {
|
14
|
-
|
16
|
+
hairy.extendMd?.(ctx)
|
15
17
|
images.extendMd?.(ctx)
|
16
18
|
addonStatistics().extendMd?.(ctx)
|
17
19
|
addonToc().extendMd?.(ctx)
|