valaxy-theme-yun 0.19.13 → 0.20.0-beta.1
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/App.vue +30 -4
- package/client/constants/index.ts +13 -0
- package/components/ValaxyMain.vue +48 -52
- package/components/YunAside.vue +66 -43
- package/components/YunBackToTop.vue +11 -4
- package/components/YunBanner.vue +31 -15
- package/components/YunBg.vue +2 -0
- package/components/YunCard.vue +5 -1
- package/components/YunCategories.vue +14 -34
- package/components/YunCategory.vue +42 -11
- package/components/YunClassifyPopover.vue +59 -0
- package/components/YunCloud.vue +5 -10
- package/components/YunConfig.vue +2 -19
- package/components/YunDebug.vue +47 -0
- package/components/YunDock.vue +223 -0
- package/components/YunFooter.vue +56 -4
- package/components/YunFullscreenMenu.vue +57 -0
- package/components/YunGirlItem.vue +98 -0
- package/components/YunGirls.vue +2 -73
- package/components/YunGoDown.vue +8 -15
- package/components/YunLinkItem.vue +62 -0
- package/components/YunLinks.vue +15 -47
- package/components/YunNavMenu.vue +125 -0
- package/components/YunOutline.vue +1 -2
- package/components/YunOverlay.vue +31 -0
- package/components/YunOverview.vue +2 -74
- package/components/YunPageHeader.vue +1 -1
- package/components/YunPagination.vue +105 -0
- package/components/YunPostCard.vue +32 -3
- package/components/YunPostCategories.vue +3 -3
- package/components/YunPostCollapse.vue +7 -72
- package/components/YunPostCollapseItem.vue +137 -0
- package/components/YunPostDateMeta.vue +30 -0
- package/components/YunPostList.vue +6 -11
- package/components/YunPostMeta.vue +31 -39
- package/components/YunPostTags.vue +2 -2
- package/components/YunPostsInfo.vue +41 -0
- package/components/YunPrologue.vue +24 -0
- package/components/YunSearchBtn.vue +8 -6
- package/components/YunSelect.vue +1 -11
- package/components/YunSidebar.vue +7 -4
- package/components/YunSidebarCard.vue +10 -0
- package/components/YunSidebarNav.vue +0 -1
- package/components/YunSiteInfo.vue +72 -0
- package/components/YunSponsor.vue +21 -6
- package/components/animation/LineBurstEffects.vue +75 -0
- package/components/author/YunAuthorAvatar.vue +12 -0
- package/components/author/YunAuthorIntro.vue +11 -0
- package/components/author/YunAuthorName.vue +14 -0
- package/components/config/YunToggleDark.vue +37 -0
- package/components/layout/YunLayoutLeft.vue +12 -0
- package/components/layout/YunLayoutRight.vue +21 -0
- package/components/layout/YunLayoutWrapper.vue +17 -0
- package/components/menu/YunNavMenuItem.vue +22 -0
- package/components/menu/YunNavMenuTitle.vue +86 -0
- package/components/menu/YunPostClassifyNavItem.vue +30 -0
- package/components/page/YunPageHeaderGradient.vue +38 -0
- package/components/project/YunProjectCard.vue +94 -0
- package/components/project/YunProjectCollection.vue +15 -0
- package/components/project/YunProjectLinkItem.vue +60 -0
- package/components/project/YunProjectToggleButton.vue +16 -0
- package/components/project/YunProjects.vue +48 -0
- package/components/prologue/PrologueSocialIcon.vue +58 -0
- package/components/prologue/PrologueSocialLinks.vue +16 -0
- package/components/prologue/PrologueSquare.vue +144 -0
- package/components/prologue/YunAEFrame.vue +155 -0
- package/components/prologue/YunAERect.vue +127 -0
- package/components/site/YunFullscreenMenuItem.vue +26 -0
- package/components/site/YunFullscreenMenuList.vue +19 -0
- package/components/site/YunSiteLinkItem.vue +26 -0
- package/components/site/YunSiteLinks.vue +19 -0
- package/components/site/YunSiteTitle.vue +59 -0
- package/components/third/YunWalineMeta.vue +17 -5
- package/docs/zh-CN/config.md +0 -3
- package/layouts/archives.vue +33 -21
- package/layouts/categories.vue +43 -31
- package/layouts/default.vue +10 -5
- package/layouts/empty.vue +3 -0
- package/layouts/home.vue +12 -5
- package/layouts/post.vue +23 -20
- package/layouts/posts.vue +10 -0
- package/layouts/projects.vue +25 -0
- package/layouts/tags.vue +45 -41
- package/node/config.ts +2 -5
- package/package.json +10 -5
- package/pages/page/[page].vue +3 -6
- package/pages/posts/index.vue +11 -0
- package/setup/main.ts +51 -9
- package/stores/app.ts +25 -3
- package/styles/animations/index.scss +36 -0
- package/styles/common/markdown.scss +4 -0
- package/styles/css-vars.scss +19 -1
- package/styles/global.scss +8 -0
- package/styles/index.scss +1 -0
- package/styles/layout/index.scss +3 -0
- package/styles/modules/prologue.scss +1 -0
- package/styles/primevue/index.ts +7 -0
- package/styles/primevue/tooltip.scss +55 -0
- package/styles/primevue/tooltip.ts +14 -0
- package/styles/vars.scss +23 -2
- package/styles/widgets/banner.scss +26 -6
- package/types/index.d.ts +53 -5
- package/types/projects.ts +48 -0
- package/unocss.config.ts +1 -1
- package/utils/animation.ts +33 -0
- package/utils/index.ts +2 -0
@@ -1,7 +1,6 @@
|
|
1
1
|
<script lang="ts" setup>
|
2
2
|
import { useI18n } from 'vue-i18n'
|
3
3
|
import type { Post } from 'valaxy'
|
4
|
-
import type { StyleValue } from 'vue'
|
5
4
|
import { usePostProperty } from '../composables'
|
6
5
|
|
7
6
|
const props = defineProps<{
|
@@ -14,7 +13,12 @@ const { icon, styles } = usePostProperty(props.post.type)
|
|
14
13
|
</script>
|
15
14
|
|
16
15
|
<template>
|
17
|
-
<YunCard
|
16
|
+
<YunCard
|
17
|
+
class="w-full"
|
18
|
+
m="auto"
|
19
|
+
:class="post.cover ? 'post-card-image' : 'post-card'"
|
20
|
+
overflow="hidden" :style="styles"
|
21
|
+
>
|
18
22
|
<div class="flex flex-1 of-hidden justify-start items-start post-card-info" w="full">
|
19
23
|
<img
|
20
24
|
v-if="post.cover"
|
@@ -67,7 +71,7 @@ const { icon, styles } = usePostProperty(props.post.type)
|
|
67
71
|
<div
|
68
72
|
w="full" class="yun-card-actions flex justify-between"
|
69
73
|
min-h="10"
|
70
|
-
|
74
|
+
text="sm"
|
71
75
|
>
|
72
76
|
<div class="post-categories inline-flex" flex="wrap 1" items="center">
|
73
77
|
<YunPostCategories m="l-1" :categories="post.categories" />
|
@@ -77,3 +81,28 @@ const { icon, styles } = usePostProperty(props.post.type)
|
|
77
81
|
</div>
|
78
82
|
</YunCard>
|
79
83
|
</template>
|
84
|
+
|
85
|
+
<style lang="scss">
|
86
|
+
.post-card {
|
87
|
+
// safari not support
|
88
|
+
// animation: card-appear 0.6s ease-in-out forwards, card-appear 0.6s ease-in-out forwards reverse;
|
89
|
+
// animation-timeline: view();
|
90
|
+
// animation-range: entry, exit;
|
91
|
+
}
|
92
|
+
|
93
|
+
@keyframes card-appear {
|
94
|
+
0% {
|
95
|
+
opacity: 0;
|
96
|
+
transform: scale(0.8) translateY(20px);
|
97
|
+
}
|
98
|
+
|
99
|
+
100% {
|
100
|
+
opacity: 1;
|
101
|
+
transform: scale(1) translateY(0);
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
.yun-card-actions {
|
106
|
+
border-top: 1px solid rgb(122 122 122 / 0.05);
|
107
|
+
}
|
108
|
+
</style>
|
@@ -12,14 +12,14 @@ defineProps<{
|
|
12
12
|
path: '/categories',
|
13
13
|
query: { category: Array.isArray(categories) ? categories.join('/') : categories },
|
14
14
|
}"
|
15
|
-
class="transition post-category inline-flex-center text-xs border-$va-c-divider
|
15
|
+
class="transition post-category inline-flex-center text-xs border-$va-c-divider"
|
16
16
|
px-2 h="7"
|
17
17
|
border rounded-full
|
18
|
-
|
18
|
+
hover="bg-blue-500 text-white"
|
19
19
|
>
|
20
20
|
<div m="x-1" inline-flex i-ri-folder-2-line />
|
21
21
|
<span>
|
22
|
-
{{ Array.isArray(categories) ? categories.join('
|
22
|
+
{{ Array.isArray(categories) ? categories.join(' / ') : categories }}
|
23
23
|
</span>
|
24
24
|
</RouterLink>
|
25
25
|
</template>
|
@@ -44,7 +44,7 @@ const sortedYears = computed(() => {
|
|
44
44
|
</script>
|
45
45
|
|
46
46
|
<template>
|
47
|
-
<div class="post-collapse px-10 lt-sm:px-5" relative>
|
47
|
+
<div class="post-collapse px-10 lt-sm:px-5 max-w-3xl" relative>
|
48
48
|
<div w="full" text="center" class="yun-text-light" p="2">
|
49
49
|
{{ t('counter.archives', posts.length) }}
|
50
50
|
</div>
|
@@ -63,23 +63,12 @@ const sortedYears = computed(() => {
|
|
63
63
|
</h2>
|
64
64
|
</div>
|
65
65
|
|
66
|
-
<
|
67
|
-
v-for="post, j in sortByDate(postListByYear[year], isDesc)"
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
<time v-if="post.date" class="post-time" font="mono" opacity="80">{{
|
73
|
-
formatDate(post.date, 'MM-dd') }}
|
74
|
-
</time>
|
75
|
-
</div>
|
76
|
-
<h2 class="post-title" inline-flex items-center font="serif black">
|
77
|
-
<RouterLink :to="post.path || ''" class="post-title-link">
|
78
|
-
{{ post.title }}
|
79
|
-
</RouterLink>
|
80
|
-
</h2>
|
81
|
-
</header>
|
82
|
-
</article>
|
66
|
+
<YunPostCollapseItem
|
67
|
+
v-for="post, j in sortByDate(postListByYear[year], isDesc)"
|
68
|
+
:key="j"
|
69
|
+
:post="post"
|
70
|
+
:i="j"
|
71
|
+
/>
|
83
72
|
</div>
|
84
73
|
</div>
|
85
74
|
</template>
|
@@ -116,59 +105,5 @@ const sortedYears = computed(() => {
|
|
116
105
|
}
|
117
106
|
}
|
118
107
|
}
|
119
|
-
|
120
|
-
.post-item {
|
121
|
-
&::before {
|
122
|
-
content: '';
|
123
|
-
position: absolute;
|
124
|
-
width: 2px;
|
125
|
-
height: 100%;
|
126
|
-
background: rgba(var(--va-c-primary-rgb), 0.3);
|
127
|
-
}
|
128
|
-
}
|
129
|
-
|
130
|
-
.post-header {
|
131
|
-
border-bottom: 1px solid rgba(var(--va-c-primary-rgb), 0.3);
|
132
|
-
|
133
|
-
&::before {
|
134
|
-
content: '';
|
135
|
-
position: absolute;
|
136
|
-
left: 0;
|
137
|
-
width: 10px;
|
138
|
-
height: 10px;
|
139
|
-
margin-left: -4px;
|
140
|
-
border-radius: 50%;
|
141
|
-
border: 1px solid var(--va-c-primary);
|
142
|
-
background-color: var(--va-c-bg-light);
|
143
|
-
z-index: 1;
|
144
|
-
transition: background var(--va-transition-duration);
|
145
|
-
}
|
146
|
-
|
147
|
-
&:hover {
|
148
|
-
&::before {
|
149
|
-
background: var(--va-c-primary);
|
150
|
-
}
|
151
|
-
}
|
152
|
-
|
153
|
-
.post-title {
|
154
|
-
margin-left: 0.1rem;
|
155
|
-
padding: 0;
|
156
|
-
font-size: 1rem;
|
157
|
-
|
158
|
-
.post-title-link {
|
159
|
-
.icon {
|
160
|
-
width: 1.1rem;
|
161
|
-
height: 1.1rem;
|
162
|
-
margin-right: 0.3rem;
|
163
|
-
}
|
164
|
-
}
|
165
|
-
}
|
166
|
-
|
167
|
-
.post-meta {
|
168
|
-
font-size: 1rem;
|
169
|
-
margin: 1rem 0 1rem 1.2rem;
|
170
|
-
white-space: nowrap;
|
171
|
-
}
|
172
|
-
}
|
173
108
|
}
|
174
109
|
</style>
|
@@ -0,0 +1,137 @@
|
|
1
|
+
<script setup lang="ts">
|
2
|
+
import { useMotion } from '@vueuse/motion'
|
3
|
+
import type { Post } from 'valaxy'
|
4
|
+
import { formatDate } from 'valaxy'
|
5
|
+
import { ref } from 'vue'
|
6
|
+
|
7
|
+
const props = defineProps<{
|
8
|
+
i: number
|
9
|
+
post: Post
|
10
|
+
}>()
|
11
|
+
|
12
|
+
const show = ref(false)
|
13
|
+
|
14
|
+
const itemRef = ref<HTMLElement>()
|
15
|
+
useMotion(itemRef, {
|
16
|
+
initial: { opacity: 0, y: 20 },
|
17
|
+
enter: {
|
18
|
+
opacity: 1,
|
19
|
+
y: 0,
|
20
|
+
transition: {
|
21
|
+
duration: 200,
|
22
|
+
delay: props.i * 50,
|
23
|
+
onComplete() {
|
24
|
+
show.value = true
|
25
|
+
},
|
26
|
+
},
|
27
|
+
},
|
28
|
+
})
|
29
|
+
</script>
|
30
|
+
|
31
|
+
<template>
|
32
|
+
<article
|
33
|
+
ref="itemRef"
|
34
|
+
class="post-item relative"
|
35
|
+
:class="{ show }"
|
36
|
+
>
|
37
|
+
<header
|
38
|
+
class="post-header cursor-pointer w-full" flex="~" items-center relative
|
39
|
+
hover="bg-black/1"
|
40
|
+
:class="{ show }"
|
41
|
+
>
|
42
|
+
<div class="post-meta">
|
43
|
+
<time v-if="post.date" class="post-time" font="mono" opacity="80">{{
|
44
|
+
formatDate(post.date, 'MM-dd') }}
|
45
|
+
</time>
|
46
|
+
</div>
|
47
|
+
<h2 class="post-title w-full" inline-flex items-center font="serif black">
|
48
|
+
<RouterLink :to="post.path || ''" class="post-title-link">
|
49
|
+
{{ post.title }}
|
50
|
+
</RouterLink>
|
51
|
+
</h2>
|
52
|
+
</header>
|
53
|
+
</article>
|
54
|
+
</template>
|
55
|
+
|
56
|
+
<style lang="scss">
|
57
|
+
@use 'sass:map';
|
58
|
+
@use 'valaxy-theme-yun/styles/vars.scss' as *;
|
59
|
+
|
60
|
+
.post-collapse {
|
61
|
+
.post-header {
|
62
|
+
&::before {
|
63
|
+
content: '';
|
64
|
+
position: absolute;
|
65
|
+
left: 0;
|
66
|
+
width: 10px;
|
67
|
+
height: 10px;
|
68
|
+
margin-left: -4px;
|
69
|
+
border-radius: 50%;
|
70
|
+
border: 1px solid var(--va-c-primary);
|
71
|
+
background-color: var(--va-c-bg-light);
|
72
|
+
z-index: 1;
|
73
|
+
transition: background var(--va-transition-duration);
|
74
|
+
}
|
75
|
+
|
76
|
+
&::after {
|
77
|
+
content: '';
|
78
|
+
position: absolute;
|
79
|
+
bottom: 0;
|
80
|
+
left: 0;
|
81
|
+
width: 0;
|
82
|
+
height: 1px;
|
83
|
+
background-color: rgba(var(--va-c-primary-rgb), 0.3);
|
84
|
+
transition: width 800ms map.get($cubic-bezier, 'ease-in');
|
85
|
+
}
|
86
|
+
|
87
|
+
&.show {
|
88
|
+
&::after {
|
89
|
+
width: 100%;
|
90
|
+
}
|
91
|
+
}
|
92
|
+
|
93
|
+
&:hover {
|
94
|
+
&::before {
|
95
|
+
background: var(--va-c-primary);
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
.post-title {
|
100
|
+
margin-left: 0.1rem;
|
101
|
+
padding: 0;
|
102
|
+
font-size: 1rem;
|
103
|
+
|
104
|
+
.post-title-link {
|
105
|
+
.icon {
|
106
|
+
width: 1.1rem;
|
107
|
+
height: 1.1rem;
|
108
|
+
margin-right: 0.3rem;
|
109
|
+
}
|
110
|
+
}
|
111
|
+
}
|
112
|
+
|
113
|
+
.post-meta {
|
114
|
+
font-size: 1rem;
|
115
|
+
margin: 1rem 0 1rem 1.2rem;
|
116
|
+
white-space: nowrap;
|
117
|
+
}
|
118
|
+
}
|
119
|
+
|
120
|
+
.post-item {
|
121
|
+
&::before {
|
122
|
+
content: '';
|
123
|
+
position: absolute;
|
124
|
+
width: 2px;
|
125
|
+
height: 0;
|
126
|
+
background: rgba(var(--va-c-primary-rgb), 0.3);
|
127
|
+
transition: height 600ms map.get($cubic-bezier, 'ease-in');
|
128
|
+
}
|
129
|
+
|
130
|
+
&.show {
|
131
|
+
&::before {
|
132
|
+
height: 100%;
|
133
|
+
}
|
134
|
+
}
|
135
|
+
}
|
136
|
+
}
|
137
|
+
</style>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<script lang="ts" setup>
|
2
|
+
import type { Post } from 'valaxy'
|
3
|
+
import { formatDate } from 'valaxy'
|
4
|
+
import { useI18n } from 'vue-i18n'
|
5
|
+
import { formatTimestamp } from '../utils'
|
6
|
+
|
7
|
+
defineProps<{
|
8
|
+
// FrontMatter
|
9
|
+
frontmatter: Post
|
10
|
+
}>()
|
11
|
+
|
12
|
+
const { t } = useI18n()
|
13
|
+
</script>
|
14
|
+
|
15
|
+
<template>
|
16
|
+
<div v-if="frontmatter.date" class="post-time flex items-center gap-4">
|
17
|
+
<span class="posted-time inline-flex-center gap-1" :title="t('post.posted') + formatTimestamp(frontmatter.date)">
|
18
|
+
<div class="inline-block" i-ri-calendar-line />
|
19
|
+
<time class="op-80">{{ formatDate(frontmatter.date) }}</time>
|
20
|
+
</span>
|
21
|
+
|
22
|
+
<span
|
23
|
+
v-if="frontmatter.updated && frontmatter.updated !== frontmatter.date"
|
24
|
+
class="edited-time inline-flex-center gap-1" :title="t('post.edited') + formatTimestamp(frontmatter.updated)"
|
25
|
+
>
|
26
|
+
<div i-ri-calendar-2-line />
|
27
|
+
<time class="op-80">{{ formatDate(frontmatter.updated) }}</time>
|
28
|
+
</span>
|
29
|
+
</div>
|
30
|
+
</template>
|
@@ -28,23 +28,18 @@ const displayedPosts = computed(() =>
|
|
28
28
|
</script>
|
29
29
|
|
30
30
|
<template>
|
31
|
-
<div class="yun-post-list" w="full" p="x-4 lt-sm:0">
|
31
|
+
<div flex="~ col" class="yun-post-list gap-4" w="full" p="x-4 lt-sm:0">
|
32
32
|
<template v-if="!displayedPosts.length">
|
33
33
|
<div py2 op50 text-center>
|
34
34
|
博主还什么都没写哦~
|
35
35
|
</div>
|
36
36
|
</template>
|
37
37
|
|
38
|
-
<
|
39
|
-
<YunPostCard v-for="route, i in displayedPosts" :key="i" :post="route" />
|
40
|
-
</TransitionGroup>
|
38
|
+
<YunPostCard v-for="route, i in displayedPosts" :key="i" :post="route" />
|
41
39
|
</div>
|
42
40
|
|
43
|
-
<
|
41
|
+
<YunPagination
|
42
|
+
class="mt-5"
|
43
|
+
:total="posts.length" :page-size="pageSize"
|
44
|
+
/>
|
44
45
|
</template>
|
45
|
-
|
46
|
-
<style>
|
47
|
-
.yun-card-actions {
|
48
|
-
border-top: 1px solid rgba(122, 122, 122, 0.15);
|
49
|
-
}
|
50
|
-
</style>
|
@@ -1,14 +1,14 @@
|
|
1
1
|
<script lang="ts" setup>
|
2
2
|
import type { Post } from 'valaxy'
|
3
|
-
import {
|
3
|
+
import { useAppStore, useSiteConfig } from 'valaxy'
|
4
4
|
import { useI18n } from 'vue-i18n'
|
5
|
-
import { formatTimestamp } from '../utils'
|
6
5
|
|
7
6
|
defineProps<{
|
8
7
|
// FrontMatter
|
9
8
|
frontmatter: Post
|
10
9
|
}>()
|
11
10
|
|
11
|
+
const app = useAppStore()
|
12
12
|
const { t } = useI18n()
|
13
13
|
|
14
14
|
const siteConfig = useSiteConfig()
|
@@ -27,50 +27,42 @@ const siteConfig = useSiteConfig()
|
|
27
27
|
</div>
|
28
28
|
|
29
29
|
<div
|
30
|
-
v-if="frontmatter"
|
31
|
-
|
30
|
+
v-if="frontmatter"
|
31
|
+
class="post-meta gap-4"
|
32
|
+
flex="~ center"
|
33
|
+
text="sm"
|
34
|
+
:class="{
|
35
|
+
'flex-col gap-2!': app.isMobile || frontmatter.updated,
|
36
|
+
}"
|
32
37
|
>
|
33
|
-
<
|
34
|
-
<span class="posted-time inline-flex-center" :title="t('post.posted') + formatTimestamp(frontmatter.date)">
|
35
|
-
<div class="inline-block" i-ri-calendar-line />
|
36
|
-
<time m="l-1">{{ formatDate(frontmatter.date) }}</time>
|
37
|
-
</span>
|
38
|
+
<YunPostDateMeta :frontmatter="frontmatter" />
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
40
|
+
<div class="inline-flex-center gap-4">
|
41
|
+
<div
|
42
|
+
v-if="siteConfig.statistics.enable"
|
43
|
+
class="inline-flex-center post-counter gap-4"
|
42
44
|
>
|
43
|
-
<span
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
<span
|
46
|
+
v-if="frontmatter.wordCount"
|
47
|
+
class="word-count inline-flex-center gap-1" :title="t('statistics.word')"
|
48
|
+
>
|
49
|
+
<div class="inline-block" i-ri-file-word-line />
|
50
|
+
<span class="op-80">{{ frontmatter.wordCount }}</span>
|
51
|
+
</span>
|
48
52
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
<span m="l-1">{{ frontmatter.wordCount }}</span>
|
59
|
-
</span>
|
53
|
+
<span
|
54
|
+
v-if="frontmatter.readingTime"
|
55
|
+
class="reading-time inline-flex-center gap-1"
|
56
|
+
:title="t('statistics.time')"
|
57
|
+
>
|
58
|
+
<div i-ri-timer-line />
|
59
|
+
<time class="op-80">{{ frontmatter.readingTime }}m</time>
|
60
|
+
</span>
|
61
|
+
</div>
|
60
62
|
|
61
|
-
<
|
62
|
-
v-if="frontmatter.readingTime"
|
63
|
-
class="reading-time inline-flex-center"
|
64
|
-
:title="t('statistics.time')"
|
65
|
-
>
|
66
|
-
<span m="x-2">-</span>
|
67
|
-
<div i-ri-timer-line />
|
68
|
-
<time m="l-1">{{ frontmatter.readingTime }}m</time>
|
69
|
-
</span>
|
63
|
+
<YunWalineMeta />
|
70
64
|
</div>
|
71
65
|
</div>
|
72
|
-
|
73
|
-
<slot />
|
74
66
|
</template>
|
75
67
|
|
76
68
|
<style>
|
@@ -13,11 +13,11 @@ defineProps<{
|
|
13
13
|
>
|
14
14
|
<RouterLink
|
15
15
|
v-for="tag, i in tags" :key="i" :to="{ path: '/tags/', query: { tag } }"
|
16
|
-
class="transition post-tag inline-flex-center text-xs border-$va-c-divider
|
16
|
+
class="transition post-tag inline-flex-center text-xs border-$va-c-divider"
|
17
17
|
px-2 h="7"
|
18
18
|
rounded-full
|
19
19
|
border
|
20
|
-
|
20
|
+
hover="bg-blue-500 text-white"
|
21
21
|
>
|
22
22
|
<span>{{ tag }}</span>
|
23
23
|
</RouterLink>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<script lang="ts" setup>
|
2
|
+
import { useCategories, useSiteStore, useTags } from 'valaxy'
|
3
|
+
import { useI18n } from 'vue-i18n'
|
4
|
+
|
5
|
+
const { t } = useI18n()
|
6
|
+
|
7
|
+
const site = useSiteStore()
|
8
|
+
|
9
|
+
const categories = useCategories()
|
10
|
+
const tags = useTags()
|
11
|
+
</script>
|
12
|
+
|
13
|
+
<template>
|
14
|
+
<nav class="site-nav" text-xl mt-2>
|
15
|
+
<YunPostClassifyNavItem
|
16
|
+
to="/archives/" icon="i-ri-archive-line" :title="t('menu.archives')"
|
17
|
+
:total="site.postList.length"
|
18
|
+
/>
|
19
|
+
<YunPostClassifyNavItem
|
20
|
+
to="/categories/" icon="i-ri-folder-2-line" :title="t('menu.categories')"
|
21
|
+
:total="Array.from(categories.children).length"
|
22
|
+
/>
|
23
|
+
<YunPostClassifyNavItem
|
24
|
+
to="/tags/" icon="i-ri-price-tag-3-line" :title="t('menu.tags')"
|
25
|
+
:total="Array.from(tags).length"
|
26
|
+
/>
|
27
|
+
</nav>
|
28
|
+
</template>
|
29
|
+
|
30
|
+
<style lang="scss">
|
31
|
+
@use "valaxy/client/styles/mixins/index.scss" as *;
|
32
|
+
|
33
|
+
.site-nav {
|
34
|
+
display: flex;
|
35
|
+
justify-content: center;
|
36
|
+
overflow: hidden;
|
37
|
+
line-height: 1.5;
|
38
|
+
white-space: nowrap;
|
39
|
+
text-align: center;
|
40
|
+
}
|
41
|
+
</style>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<template>
|
2
|
+
<div class="grid-bg">
|
3
|
+
<YunAEFrame />
|
4
|
+
<YunAERect />
|
5
|
+
|
6
|
+
<div
|
7
|
+
flex="~ col"
|
8
|
+
class="justify-center items-center absolute bottom-5 md:bottom-12 left-0 right-0"
|
9
|
+
>
|
10
|
+
<PrologueSocialLinks />
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
</template>
|
14
|
+
|
15
|
+
<style lang="scss">
|
16
|
+
.grid-bg {
|
17
|
+
--size: 40px;
|
18
|
+
|
19
|
+
background:
|
20
|
+
linear-gradient(90deg, rgb(255 255 255 / .1) 1px, transparent 1px),
|
21
|
+
linear-gradient(rgb(255 255 255 / .1) 1px, transparent 1px);
|
22
|
+
background-size: var(--size) var(--size);
|
23
|
+
}
|
24
|
+
</style>
|
@@ -20,18 +20,20 @@ function onClick() {
|
|
20
20
|
</script>
|
21
21
|
|
22
22
|
<template>
|
23
|
-
<button
|
24
|
-
|
23
|
+
<button
|
24
|
+
class="yun-search-btn popup-trigger size-12 inline-flex justify-center items-center"
|
25
|
+
text="xl $va-c-text"
|
26
|
+
hover="bg-white/80 dark:bg-black/80"
|
27
|
+
:title="t('menu.search')"
|
28
|
+
@click="onClick"
|
29
|
+
>
|
30
|
+
<div v-if="!open" i-ri-search-line op-80 hover="op-100" />
|
25
31
|
<div v-else text="!2xl" i-ri-close-line />
|
26
32
|
</button>
|
27
33
|
</template>
|
28
34
|
|
29
35
|
<style lang="scss">
|
30
36
|
.yun-search-btn {
|
31
|
-
position: fixed;
|
32
|
-
top: 0.6rem;
|
33
|
-
right: 0.8rem;
|
34
|
-
color: var(--va-c-primary);
|
35
37
|
z-index: var(--yun-z-search-btn);
|
36
38
|
}
|
37
39
|
</style>
|
package/components/YunSelect.vue
CHANGED
@@ -22,7 +22,7 @@ function toggleOptionVisible(e: MouseEvent) {
|
|
22
22
|
</script>
|
23
23
|
|
24
24
|
<template>
|
25
|
-
<div class="relative h-8 w-30 text-$va-c-text-2 z-
|
25
|
+
<div class="relative h-8 w-30 text-$va-c-text-2 z-$yun-z-select" @mousedown.stop>
|
26
26
|
<button
|
27
27
|
class="flex h-full w-full px-2 items-center justify-between rounded transition"
|
28
28
|
border="~ gray op-30"
|
@@ -55,14 +55,4 @@ function toggleOptionVisible(e: MouseEvent) {
|
|
55
55
|
.select-options {
|
56
56
|
margin: 0;
|
57
57
|
}
|
58
|
-
|
59
|
-
.v-enter-active,
|
60
|
-
.v-leave-active {
|
61
|
-
transition: opacity .2s ease;
|
62
|
-
}
|
63
|
-
|
64
|
-
.v-enter-from,
|
65
|
-
.v-leave-to {
|
66
|
-
opacity: 0;
|
67
|
-
}
|
68
58
|
</style>
|
@@ -13,13 +13,13 @@ const showOverview = ref(false)
|
|
13
13
|
<template>
|
14
14
|
<ValaxyOverlay class="md:hidden" :show="yunStore.leftSidebar.isOpen" @click="yunStore.leftSidebar.toggle()" />
|
15
15
|
|
16
|
-
<ValaxyHamburger
|
16
|
+
<!-- <ValaxyHamburger
|
17
17
|
:active="yunStore.leftSidebar.isOpen"
|
18
18
|
class="menu-btn sidebar-toggle yun-icon-btn leading-4 fixed left-0.8rem top-0.6rem"
|
19
19
|
inline-flex cursor="pointer" z="$yun-z-menu-btn"
|
20
20
|
:class="showHamburger ? '' : 'md:hidden'"
|
21
21
|
@click="yunStore.leftSidebar.toggle()"
|
22
|
-
/>
|
22
|
+
/> -->
|
23
23
|
|
24
24
|
<aside
|
25
25
|
class="va-card transition sidebar fixed inset-y-0 left-0 overflow-y-auto"
|
@@ -55,6 +55,9 @@ const showOverview = ref(false)
|
|
55
55
|
</template>
|
56
56
|
|
57
57
|
<style lang="scss">
|
58
|
+
@use 'sass:map';
|
59
|
+
@use 'valaxy-theme-yun/styles/vars.scss' as *;
|
60
|
+
|
58
61
|
.sidebar {
|
59
62
|
width: calc(100vw - 64px);
|
60
63
|
max-width: var(--va-sidebar-width);
|
@@ -62,8 +65,8 @@ const showOverview = ref(false)
|
|
62
65
|
background-position: bottom 1rem center;
|
63
66
|
transform: translateX(-100%);
|
64
67
|
transition: box-shadow var(--va-transition-duration),
|
65
|
-
background-color var(--va-transition-duration), opacity
|
66
|
-
transform var(--va-transition-duration) cubic-bezier
|
68
|
+
background-color var(--va-transition-duration), opacity var(--va-transition-duration),
|
69
|
+
transform var(--va-transition-duration) map.get($cubic-bezier, 'ease-in-out') !important;
|
67
70
|
|
68
71
|
&.open {
|
69
72
|
transform: translateX(0);
|