mirror of
https://github.com/pengzhanbo/vuepress-theme-plume.git
synced 2026-04-26 11:38:15 +08:00
175 lines
5.3 KiB
Vue
175 lines
5.3 KiB
Vue
<script setup lang="ts">
|
|
import VPDocHeader from '@theme/VPDocHeader.vue'
|
|
import VPLink from '@theme/VPLink.vue'
|
|
import { computed } from 'vue'
|
|
import { usePageLang } from 'vuepress/client'
|
|
import { useData, useLastUpdated, useThemeData } from '../composables/index.js'
|
|
|
|
const { theme, frontmatter, page } = useData()
|
|
const themeData = useThemeData()
|
|
const lang = usePageLang()
|
|
const { datetime, lastUpdatedText } = useLastUpdated()
|
|
|
|
const list = computed(() => {
|
|
const list = page.value.git?.changelog || []
|
|
const formatter = new Intl.DateTimeFormat(lang.value, { dateStyle: 'short' })
|
|
return list.map(({ date, ...item }) => {
|
|
const datetime = formatter.format(date)
|
|
return { datetime, ...item }
|
|
})
|
|
})
|
|
|
|
const hasChangelog = computed(() =>
|
|
list.value.length && (frontmatter.value.changelog ?? !!themeData.value.changelog),
|
|
)
|
|
</script>
|
|
|
|
<template>
|
|
<div v-if="hasChangelog" class="vp-doc-changelog">
|
|
<VPDocHeader anchor="doc-changelog">
|
|
{{ theme.changelogText || 'Changelog' }}
|
|
</VPDocHeader>
|
|
|
|
<details class="hint-container details">
|
|
<summary class="changelog-header">
|
|
<span><span class="vpi-changelog" /><span>{{ lastUpdatedText }}:</span> <span>{{ datetime }}</span></span>
|
|
<span class="changelog-button"><span class="vpi-menu" /><span>{{ theme.changelogButtonText || 'View All Changelog' }}</span></span>
|
|
</summary>
|
|
|
|
<ul class="changelog-list">
|
|
<template v-for="item in list" :key="item.hash">
|
|
<li v-if="item.tag" class="changelog release-tag">
|
|
<div>
|
|
<VPLink :href="item.tagUrl" no-icon class="release-tag">
|
|
<code>{{ item.tag }}</code>
|
|
</VPLink>
|
|
<span class="datetime">{{ theme.changelogOnText }} {{ item.datetime }}</span>
|
|
</div>
|
|
</li>
|
|
<li v-else class="changelog commit">
|
|
<div>
|
|
<VPLink :href="item.commitUrl" no-icon class="hash">
|
|
<code>{{ item.hash.slice(0, 5) }}</code>
|
|
</VPLink>
|
|
<span class="divider">-</span>
|
|
</div>
|
|
<div>
|
|
<p class="message" v-html="item.message" />
|
|
<span class="datetime">{{ theme.changelogOnText }} {{ item.datetime }}</span>
|
|
</div>
|
|
</li>
|
|
</template>
|
|
</ul>
|
|
</details>
|
|
</div>
|
|
</template>
|
|
|
|
<style scoped>
|
|
.vp-doc-changelog .changelog-header {
|
|
display: block;
|
|
}
|
|
|
|
@media print {
|
|
.vp-doc-changelog {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
.vp-doc-changelog .changelog-header > span {
|
|
display: block;
|
|
}
|
|
|
|
@media (min-width: 440px) {
|
|
.vp-doc-changelog .changelog-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
}
|
|
}
|
|
|
|
.vp-doc-changelog .changelog-header [class*="vpi-"] {
|
|
margin-right: 4px;
|
|
color: var(--vp-c-text-2);
|
|
transition: color var(--vp-t-color);
|
|
transform: translateY(-1px);
|
|
}
|
|
|
|
.vp-doc-changelog .changelog-header .changelog-button:hover,
|
|
.vp-doc-changelog .changelog-header .changelog-button:hover .vpi-menu {
|
|
color: var(--vp-c-brand-1);
|
|
transition: color var(--vp-t-color);
|
|
}
|
|
|
|
.vp-doc-changelog .changelog-list {
|
|
padding-left: 0;
|
|
list-style: none;
|
|
}
|
|
|
|
.vp-doc-changelog .changelog-list .changelog {
|
|
position: relative;
|
|
display: flex;
|
|
align-items: flex-start;
|
|
padding-left: 20px;
|
|
transition: color var(--vp-t-color);
|
|
}
|
|
|
|
.vp-doc-changelog .changelog-list .changelog::before {
|
|
position: absolute;
|
|
top: 4px;
|
|
left: 0;
|
|
display: inline-block;
|
|
width: 1.25em;
|
|
height: 1.25em;
|
|
color: var(--vp-c-text-3);
|
|
content: "";
|
|
background-color: currentcolor;
|
|
-webkit-mask: var(--icon) no-repeat;
|
|
mask: var(--icon) no-repeat;
|
|
-webkit-mask-size: 100% 100%;
|
|
mask-size: 100% 100%;
|
|
transition: color var(--vp-t-color);
|
|
}
|
|
|
|
.vp-doc-changelog .changelog-list .changelog.commit::before {
|
|
--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1em' height='1em' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M9 12a3 3 0 1 0 6 0a3 3 0 1 0-6 0m3-9v6m0 6v6'/%3E%3C/svg%3E");
|
|
}
|
|
|
|
.vp-doc-changelog .changelog-list .changelog.release-tag::before {
|
|
--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1em' height='1em' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M6.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0-2 0'/%3E%3Cpath d='M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592-5.592a2.41 2.41 0 0 0 0-3.408l-7.71-7.71A2 2 0 0 0 11.172 3H6a3 3 0 0 0-3 3'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
.vp-doc-changelog .changelog-list .changelog .release-tag {
|
|
margin-right: 4px;
|
|
text-decoration: none;
|
|
}
|
|
|
|
.vp-doc-changelog .changelog-list .changelog .release-tag code {
|
|
font-size: 14px;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.vp-doc-changelog .changelog-list .changelog .hash {
|
|
margin-right: 4px;
|
|
text-decoration: none;
|
|
}
|
|
|
|
.vp-doc-changelog .changelog-list .changelog .divider {
|
|
margin-right: 8px;
|
|
}
|
|
|
|
.vp-doc-changelog .changelog-list .changelog .message {
|
|
display: inline;
|
|
margin-right: 8px;
|
|
}
|
|
|
|
.vp-doc-changelog .changelog-list .changelog .message :deep(a::after) {
|
|
display: none;
|
|
}
|
|
|
|
.vp-doc-changelog .changelog-list .changelog .datetime {
|
|
font-size: 12px;
|
|
color: var(--vp-c-text-3);
|
|
transition: color var(--vp-t-color);
|
|
}
|
|
</style>
|