Files
ONE/frontend/src/ui/yohaku/YohakuHero.vue
T
Sakurasan fbda293072 余白 UI:按设计稿模块化还原 + 站主自定义 CSS + 详情 neighbors + 静态缓存头
前端(新增 ui/yohaku/,各视图按 ui_id=vivid 分支渲染;classic 与后台不受影响)
- 令牌层:设计稿数值原样落地,28 个 --v-* 为站主接口(自定义 CSS 可覆盖,
  放 @layer 让出优先级);另加防线,中和 styles.css 裸选择器
  (h1 衬线 / body 行高 / 后台 .stat/.toolbar/.chip 卡片)漏进余白元素
- 顶栏(滚动收缩态)/ 阅读进度(顶部 2px + READ n%)/ 页脚
- 首页:hero(统计条)/ 筛选(类型分段 + 标签 chips + 搜索)/
  长文卡片与短文纸条 / 分页 / 作品展示区(3 件 + 查看所有,参照 diygod.cc);
  面板栅格改 1.6fr 1fr 1fr 且高度自适应内容(标签云明显大一圈)
- 文章页:三栏「纸」—— 左时间线(前后各两篇)/ 中纸张 / 右目录与阅读进度;
  短文详情不显示标题(h1 视觉隐藏保留无障碍)
- 全部规则收敛在 html[data-ui='vivid'] 前缀下;无 !important

后端
- GET /api/posts/:slug 增 neighbors(前后各两篇,详情页侧栏时间线用)
- SPA 缓存头:index.html no-cache,assets/ 带 hash 长期 immutable
  (此前无缓存头,浏览器会一直拿旧构建)

其他
- 站主自定义 CSS 管线(customCss.js + ui/sections.js,按分区注入,仅 vivid)
- 删除旧 vivid 覆盖层实现(VividNav/Hero/Footer/Timeline/Toc、ui/vivid.css)
- 设计稿原型附于仓库根 index.html;作品表清掉外链 diygod.cc 的示例封面,
  改用本地占位图(public/covers/)
2026-09-23 15:37:42 +08:00

39 lines
1.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<script setup>
import { computed } from 'vue'
import { site } from '../../site'
// 余白头版。对应设计稿的 <section class="hero">。
// 四个数字全部由传入的数据算出来,不写死 : 设计稿里也是算的。
const props = defineProps({
postCount: { type: Number, default: 0 },
charCount: { type: Number, default: 0 },
tagCount: { type: Number, default: 0 },
projectCount: { type: Number, default: 0 }
})
const nf = new Intl.NumberFormat('zh-CN')
const stats = computed(() => [
{ n: props.postCount, label: '篇文章' },
{ n: props.charCount, label: '累计字数' },
{ n: props.tagCount, label: '个标签' },
{ n: props.projectCount, label: '件作品' }
])
</script>
<template>
<section class="hero">
<div class="kicker">Personal Site · 在余白处书写</div>
<h1>把想法写下来,<br><span class="hl">留白也是内容</span>。</h1>
<p class="lead">
{{ site.site_desc }}<br>
<strong>全部内容自托管</strong>,没有推荐算法,只有时间线。
</p>
<div class="stats">
<div v-for="s in stats" :key="s.label" class="stat">
<b>{{ nf.format(s.n) }}</b><span>{{ s.label }}</span>
</div>
</div>
</section>
</template>