修复 - 首页文章卡片开启"显示字数"后无效果:该配置项此前只有声明没有实现,现已在文章流卡片接入服务端字数统计(依赖 API 扩展包,未安装时自动隐藏) - Hero 下滑箭头滚动不到位:Hero 为固定背景(position: fixed),此前箭头额外减去了导航栏高度,导致内容区上方始终露出一段 Hero 渐变;现与滚动吸附逻辑对齐,内容区顶部直接对齐视口顶部 - 鼠标点击特效开启后无效果:特效类型默认值为 off(关闭),开启开关但不选择类型时静默不生效;默认值改为"社会主义核心价值观" 移除 - 移除鼠标光感跟随功能及对应配置项 优化 - 上下篇导航:新增方向箭头与悬停反馈(背景、位移、变色),移动端收紧内边距 - Hero 一言自动刷新改为淡出→换文案→淡入的过渡动画,避免生硬跳变 - README 全面更新:环境要求、插件适配表(新增微信读书与 API 扩展包)、自定义页面模板、功能说明、目录结构与开发注意事项
307 lines
6.5 KiB
Plaintext
307 lines
6.5 KiB
Plaintext
---
|
|
interface Props {
|
|
variant?: "default" | "featured" | "compact";
|
|
}
|
|
|
|
const { variant = "default" } = Astro.props;
|
|
---
|
|
|
|
<a
|
|
class:list={["post-card", `post-card--${variant}`]}
|
|
th:href="@{${post.status.permalink}}"
|
|
>
|
|
<div
|
|
th:unless="${#strings.isEmpty(post.spec.cover)}"
|
|
class="post-card__image-wrap"
|
|
>
|
|
<img
|
|
class="post-card__image"
|
|
th:src="${post.spec.cover}"
|
|
th:srcset="|${thumbnail.gen(post.spec.cover, 's')} 400w,
|
|
${thumbnail.gen(post.spec.cover, 'm')} 800w,
|
|
${thumbnail.gen(post.spec.cover, 'l')} 1200w|"
|
|
th:alt="${post.spec.title}"
|
|
loading="lazy"
|
|
decoding="async"
|
|
/>
|
|
<div class="post-card__overlay"></div>
|
|
</div>
|
|
|
|
<div class="post-card__content">
|
|
<div class="post-card__meta">
|
|
<time
|
|
class="post-card__date"
|
|
th:text="${#dates.format(post.spec.publishTime, 'yyyy-MM-dd')}"
|
|
></time>
|
|
<span
|
|
class="post-card__words"
|
|
th:if="${theme.config?.home?.home_card_show_wordcount == true and pluginFinder.available('extra-api')}"
|
|
th:with="words=${extraApiStatsFinder.getPostWordCount({name: post.metadata.name})}"
|
|
th:text="${words > 0 ? words + ' 字' : ''}"
|
|
></span>
|
|
</div>
|
|
<h3 class="post-card__title" th:text="${post.spec.title}"></h3>
|
|
<p
|
|
th:if="${variant != 'compact'}"
|
|
class="post-card__excerpt"
|
|
th:text="${post.status.excerpt}"
|
|
></p>
|
|
<div
|
|
th:if="${variant != 'compact' and !#lists.isEmpty(post.tags)}"
|
|
class="post-card__tags"
|
|
>
|
|
<span
|
|
th:each="tag : ${post.tags}"
|
|
class="post-card__tag"
|
|
th:text="${tag.spec.displayName}"
|
|
></span>
|
|
</div>
|
|
</div>
|
|
</a>
|
|
|
|
<style>
|
|
.post-card {
|
|
display: flex;
|
|
align-items: stretch;
|
|
gap: var(--space-lg);
|
|
background: var(--bg-raised);
|
|
border-radius: var(--border-radius-lg);
|
|
overflow: hidden;
|
|
text-decoration: none;
|
|
color: inherit;
|
|
box-shadow: var(--shadow-sm);
|
|
transition:
|
|
transform 400ms var(--ease-out-expo),
|
|
box-shadow 400ms var(--ease-out-expo);
|
|
}
|
|
|
|
.post-card:hover {
|
|
transform: translateY(-4px);
|
|
box-shadow: var(--shadow-lg);
|
|
}
|
|
|
|
.post-card__image-wrap {
|
|
flex-shrink: 0;
|
|
overflow: hidden;
|
|
border-radius: var(--border-radius-lg);
|
|
}
|
|
|
|
.post-card__image {
|
|
display: block;
|
|
width: 100%;
|
|
height: 100%;
|
|
object-fit: cover;
|
|
transition: transform 400ms var(--ease-out-expo);
|
|
}
|
|
|
|
.post-card:hover .post-card__image {
|
|
transform: scale(1.03);
|
|
}
|
|
|
|
.post-card__overlay {
|
|
display: none;
|
|
}
|
|
|
|
.post-card__content {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--space-sm);
|
|
padding: var(--space-lg);
|
|
min-width: 0;
|
|
}
|
|
|
|
.post-card__date {
|
|
font-size: var(--text-xs);
|
|
text-transform: uppercase;
|
|
letter-spacing: var(--tracking-wider);
|
|
color: var(--ink-3);
|
|
line-height: var(--leading-none);
|
|
}
|
|
|
|
.post-card__meta {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.6rem;
|
|
}
|
|
|
|
.post-card__words {
|
|
font-size: var(--text-xs);
|
|
color: var(--ink-3);
|
|
line-height: var(--leading-none);
|
|
padding-left: 0.6rem;
|
|
border-left: 1px solid var(--rule);
|
|
}
|
|
|
|
.post-card__title {
|
|
font-family: var(--font-sans);
|
|
font-weight: 700;
|
|
font-size: clamp(1.1rem, 2vw, 1.5rem);
|
|
line-height: var(--leading-tight);
|
|
color: var(--ink);
|
|
margin: 0;
|
|
transition: color 400ms var(--ease-out-expo);
|
|
}
|
|
|
|
.post-card:hover .post-card__title {
|
|
color: var(--accent);
|
|
}
|
|
|
|
.post-card__excerpt {
|
|
color: var(--ink-2);
|
|
font-size: var(--text-sm);
|
|
line-height: var(--leading-normal);
|
|
display: -webkit-box;
|
|
-webkit-line-clamp: 3;
|
|
-webkit-box-orient: vertical;
|
|
overflow: hidden;
|
|
margin: 0;
|
|
}
|
|
|
|
.post-card__tags {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: var(--space-xs);
|
|
margin-top: auto;
|
|
}
|
|
|
|
.post-card__tag {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
padding: 0.2em 0.6em;
|
|
border-radius: var(--border-radius-sm);
|
|
background: var(--bg-raised);
|
|
border: 1px solid var(--rule);
|
|
font-size: var(--text-xs);
|
|
color: var(--ink-2);
|
|
line-height: var(--leading-none);
|
|
}
|
|
|
|
.post-card--default {
|
|
flex-direction: row;
|
|
}
|
|
|
|
.post-card--default .post-card__image-wrap {
|
|
width: 40%;
|
|
aspect-ratio: 4 / 3;
|
|
}
|
|
|
|
.post-card--featured {
|
|
flex-direction: column;
|
|
}
|
|
|
|
.post-card--featured .post-card__image-wrap {
|
|
width: 100%;
|
|
aspect-ratio: 16 / 9;
|
|
position: relative;
|
|
}
|
|
|
|
.post-card--featured .post-card__overlay {
|
|
display: block;
|
|
position: absolute;
|
|
bottom: 0;
|
|
left: 0;
|
|
right: 0;
|
|
height: 50%;
|
|
background: linear-gradient(
|
|
to top,
|
|
var(--glass-bg),
|
|
transparent
|
|
);
|
|
backdrop-filter: blur(4px);
|
|
-webkit-backdrop-filter: blur(4px);
|
|
pointer-events: none;
|
|
}
|
|
|
|
.post-card--featured .post-card__content {
|
|
padding: var(--space-xl);
|
|
gap: var(--space-md);
|
|
}
|
|
|
|
.post-card--featured .post-card__title {
|
|
font-size: clamp(1.5rem, 3vw, 2rem);
|
|
}
|
|
|
|
.post-card--featured .post-card__excerpt {
|
|
-webkit-line-clamp: 3;
|
|
}
|
|
|
|
.post-card--compact {
|
|
flex-direction: row;
|
|
align-items: center;
|
|
background: transparent;
|
|
box-shadow: none;
|
|
gap: var(--space-md);
|
|
}
|
|
|
|
.post-card--compact:hover {
|
|
box-shadow: none;
|
|
}
|
|
|
|
.post-card--compact .post-card__image-wrap {
|
|
width: 60px;
|
|
height: 60px;
|
|
flex-shrink: 0;
|
|
border-radius: var(--border-radius-md);
|
|
}
|
|
|
|
.post-card--compact .post-card__image-wrap img {
|
|
aspect-ratio: 1 / 1;
|
|
}
|
|
|
|
.post-card--compact .post-card__content {
|
|
padding: var(--space-sm) 0;
|
|
gap: 0.2rem;
|
|
}
|
|
|
|
.post-card--compact .post-card__title {
|
|
font-size: var(--text-md);
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.post-card--default {
|
|
flex-direction: column;
|
|
}
|
|
|
|
.post-card--default .post-card__image-wrap {
|
|
width: 100%;
|
|
aspect-ratio: 16 / 9;
|
|
}
|
|
|
|
.post-card__content {
|
|
padding: var(--space-md);
|
|
}
|
|
|
|
.post-card__title {
|
|
font-size: clamp(1.15rem, 3vw, 1.5rem);
|
|
}
|
|
|
|
.post-card__excerpt {
|
|
font-size: var(--text-sm);
|
|
-webkit-line-clamp: 3;
|
|
}
|
|
|
|
.post-card--featured .post-card__content {
|
|
padding: var(--space-lg);
|
|
}
|
|
|
|
.post-card--featured .post-card__title {
|
|
font-size: clamp(1.3rem, 4vw, 1.7rem);
|
|
}
|
|
}
|
|
|
|
@media (max-width: 480px) {
|
|
.post-card__content {
|
|
padding: var(--space-md) var(--space-sm);
|
|
}
|
|
|
|
.post-card__title {
|
|
font-size: clamp(1.05rem, 4vw, 1.25rem);
|
|
}
|
|
|
|
.post-card__excerpt {
|
|
font-size: var(--text-sm);
|
|
-webkit-line-clamp: 2;
|
|
}
|
|
}
|
|
</style>
|