用户拍板「字族扩展都补」。六款按三类各两款落地,全部单页增量 ≤150KB:
小薇(文学·宋体气质)、新晰黑(文学·现代黑)、得意黑(标题)、庆科黄油(标题·圆润)、
马善政毛笔与柳建毛草(书法),许可证均 OFL。
关键取舍:@fontsource 官方中文切片粒度太粗(每片约 33 字、单片 40KB+),一句话命中
7 片即 308–442KB/页,四款全部超闸门;即便用 subset-fonts.py 按站内用字重裁仍剩
205–346KB(笔画类字族单片就 50KB)。故改为从 google/fonts 取原始 TTF,按**字频序
细切**(约 19 字/片、单片 2–12KB),每族 99–100 片、族总量 0.5–1.2MB,浏览器只拉
命中的片。四个 @fontsource 依赖随之移除,package.json 净零变更。
实测单页增量(一句话场景):xiaowei 44.9KB / huangyou 27.1KB / mashanzheng 45.7KB /
liujianmaocao 30.0KB / smiley 27.1KB / neoxihei 30.0KB——全部 PASS;
六族同页共 105KB。
接线(一处漏就静默失效,踩过两次):
- rehype-class-whitelist 放行新类(不放行则 span 的 class 被整条剥掉,页面有字没脸)
- site-content 的 ALLOWED_PAGE_FONTS 与后台排版下拉同源补齐(三处下拉 + hint)
- font-needs 扩六个 key,保证「内容用到才加载」的按需契约继续成立
- global.css 六组规则含 .mom-text 作用域(5h 补的瞬间作用域不能漏)
- typography-classes.js(后台可视化面板单一事实源)35→42 项
- subset-fonts.py 新增 --split-ttf / --slices / --order-from(hwmc 的 --css 用法未动)
覆盖边界(已在 docs 与后台 hint 写明):切片只含站内用字(约 1900 字),
新写生僻字会回落系统字族,需按 docs 命令重切。
验证: 构建 50 页 exit 0;content-lint 51 页 0/0/0;config-check 211 字段/66 hint;
六类逐项 getComputedStyle 首项 = ZCOOL XiaoWei / ZCOOL QingKe HuangYou /
Ma Shan Zheng / Liu Jian Mao Cao / Smiley Sans / LXGW Neo XiHei(6/6);
六族全部出现在 document.fonts;首页字体请求数保持 17(零回归)
Spec: 2026-11-02_blog-5i-fonts-polish (T9)
Co-authored-by: GLM-5.3
627 lines
34 KiB
YAML
627 lines
34 KiB
YAML
# yaml-language-server: $schema=https://unpkg.com/@sveltia/cms/schema/sveltia-cms.json
|
||
# Sveltia CMS 配置(T3 试水):仅 photos 集合,见 docs 预研报告
|
||
# 纪律:不开内建图片优化(transformations 会把原图转 webp 抹掉 EXIF,构建期提取报废)
|
||
backend:
|
||
name: gitea
|
||
repo: wait4x/blog
|
||
branch: main
|
||
# 走博客域同源反代(nginx /gitea/ → 127.0.0.1:13020):
|
||
# ①绕开 git.wait4x.online 的 ESA 522 ②同源无 CORS ③ESA 缓存规则已排除 /artalk/api
|
||
base_url: https://wait4x.online/gitea
|
||
api_root: https://wait4x.online/gitea/api/v1
|
||
|
||
media_folder: content/photos
|
||
site_url: https://wait4x.online
|
||
|
||
output:
|
||
# Astro zod optional 兼容:空可选字段不写文件(官方 Astro 指南建议)
|
||
omit_empty_optional_fields: true
|
||
|
||
collections:
|
||
# 文章(含书评/技术/照片三轨;书=category:reading 的文章,同一集合管理)
|
||
- name: posts
|
||
label: 文章
|
||
label_singular: 文章
|
||
folder: content/posts
|
||
create: true
|
||
# 中文主稿;英文为 TMT 预翻译入仓的 .en.md(posts-en 集合不在后台,防误改译文)
|
||
slug: '{{slug}}'
|
||
summary: '{{pubDate}} · {{title}}'
|
||
sortable_fields: [pubDate, title]
|
||
# 注意:Sveltia 对 folder 集合的 media_folder 按"相对集合目录"解析
|
||
# (写成 content/posts/assets 会二次嵌套成 content/posts/content/posts/assets,
|
||
# 实测 2026-11-02 首上传即踩),故这里必须写 assets
|
||
media_folder: assets
|
||
public_folder: ./assets
|
||
fields:
|
||
- { label: 标题, name: title, widget: string }
|
||
- { label: 日期, name: pubDate, widget: datetime, date_format: 'YYYY-MM-DD', time_format: false, format: 'YYYY-MM-DD' }
|
||
- { label: 分轨, name: category, widget: select, options: [{label: 阅读, value: reading}, {label: 技术, value: tech}, {label: 照片, value: photo}] }
|
||
- { label: 标签, name: tags, widget: list, required: false }
|
||
- { label: 置顶, name: pinned, widget: boolean, required: false, default: false, hint: '置顶文章排在首页/归档/书架最前;只影响顺序,不改日期、URL 与 RSS 时间语义' }
|
||
- { label: 情绪色(书评色脊), name: mood, widget: color, required: false, hint: '#RRGGBB,仅阅读轨使用' }
|
||
- { label: 原书作者, name: bookAuthor, widget: string, required: false }
|
||
- { label: 一句话描述(书架策展语), name: description, widget: text, required: false }
|
||
- { label: 书封图, name: cover, widget: image, required: false, hint: '上传后自动生成,无需手填路径;仅阅读轨展示' }
|
||
- label: 附视频(可选)
|
||
name: video
|
||
widget: file
|
||
required: false
|
||
media_folder: public/media
|
||
public_folder: /media
|
||
hint: '展示在正文之后;mp4/webm ≤50MB(走 public/media,构建时原样拷贝,不做转码)'
|
||
- label: 视频封面(可选)
|
||
name: poster
|
||
widget: string
|
||
required: false
|
||
hint: '填 /media/xxx.jpg(先上传到 public/media 取路径);缺省浏览器自取首帧'
|
||
- { label: 隐藏(不进列表/sitemap), name: hiddenTag, widget: boolean, required: false, hint: '对应 tags 含 hidden;保存后请人工核对' }
|
||
- { label: 草稿, name: draft, widget: boolean, required: false, default: false }
|
||
- { label: 正文, name: body, widget: markdown }
|
||
|
||
# 主题旋钮(样式即数据 · 层 4):只放白名单内的 9 组,越界值会被构建期钳制
|
||
- name: site_theme
|
||
label: 主题设置
|
||
# 文件集合必须是 files: [{file,label,fields}] 结构;把 file 直接写在集合层级会被 Sveltia 判非法(2026-11-02 实测报 "The file option ... is invalid")
|
||
files:
|
||
- name: theme
|
||
label: 主题设置
|
||
file: content/site/theme.yaml
|
||
format: yaml
|
||
fields:
|
||
- { label: 强调色(亮), name: accent_light, widget: color, required: false, hint: '亮色模式强调色,如 #3454d1;构建期校验正文对比度 ≥4.5' }
|
||
- { label: 强调色(暗), name: accent_dark, widget: color, required: false, hint: '暗色模式强调色,如 #8ea2ff' }
|
||
- { label: 图片圆角, name: radius_img, widget: number, required: false, value_type: int, min: 4, max: 16, hint: '范围 4–16(建议 ≤14)' }
|
||
- { label: 一级标题字号, name: text_h1, widget: number, required: false, value_type: int, min: 22, max: 32, hint: '22–32,且必须大于 h2' }
|
||
- { label: 二级标题字号, name: text_h2, widget: number, required: false, value_type: int, min: 22, max: 32, hint: '22–32,必须小于 h1、大于 h3' }
|
||
- { label: 三级标题字号, name: text_h3, widget: number, required: false, value_type: int, min: 16, max: 32, hint: '16–32,必须小于 h2' }
|
||
- { label: 书评正文字号, name: prose_size_reading, widget: number, required: false, value_type: int, min: 16, max: 22, hint: '16–22' }
|
||
- { label: 技术文正文字号, name: prose_size_tech, widget: number, required: false, value_type: int, min: 16, max: 22, hint: '16–22' }
|
||
- { label: 书评行高, name: leading_reading, widget: number, required: false, value_type: float, min: 1.5, max: 2.0, step: 0.05, hint: '1.5–2.0' }
|
||
- { label: 技术文行高, name: leading_tech, widget: number, required: false, value_type: float, min: 1.5, max: 2.0, step: 0.05, hint: '1.5–2.0' }
|
||
- { label: 间距 3, name: space_3, widget: number, required: false, value_type: int, min: 8, max: 80, hint: '8–80,必须 < 间距 4' }
|
||
- { label: 间距 4, name: space_4, widget: number, required: false, value_type: int, min: 8, max: 80, hint: '8–80,必须 > 间距 3 且 < 间距 5' }
|
||
- { label: 间距 5, name: space_5, widget: number, required: false, value_type: int, min: 8, max: 80, hint: '8–80,必须 > 间距 4 且 < 间距 6' }
|
||
- { label: 间距 6, name: space_6, widget: number, required: false, value_type: int, min: 8, max: 80, hint: '8–80,必须 > 间距 5' }
|
||
- { label: 段间距, name: flow_p, widget: number, required: false, value_type: float, min: 0, max: 2, step: 0.05, hint: '0–2(em)' }
|
||
- { label: 标题下间距, name: flow_h2_post, widget: number, required: false, value_type: float, min: 0, max: 2, step: 0.05, hint: '0–2(em)' }
|
||
- { label: 过渡时长, name: dur, widget: number, required: false, value_type: int, min: 150, max: 600, hint: '150–600(毫秒)' }
|
||
|
||
# 瞬间:随手发(text/image 至少其一——Sveltia 无法表达条件必填,两者都设可选,
|
||
# 保存前自查;pubDate 必填)。图片走图库媒体库(content/photos 同源可复用)
|
||
- name: moments
|
||
label: 瞬间
|
||
folder: content/moments
|
||
create: true
|
||
slug: '{{year}}-{{month}}-{{day}}-{{slug}}'
|
||
summary: '{{fields.pubDate}} · {{fields.text}}'
|
||
sortable_fields: [pubDate, text]
|
||
fields:
|
||
- { label: 时间, name: pubDate, widget: datetime, date_format: 'YYYY-MM-DD', time_format: false, format: 'YYYY-MM-DD' }
|
||
- label: 文字
|
||
name: text
|
||
widget: markdown
|
||
required: false
|
||
hint: '与图片至少填一项。支持 markdown(**加粗**、列表、> 引用)与排版类 HTML,例如 <span class="c-blue font-kai">彩色+楷体</span>;装饰色仍守“外壳灰阶、彩色只作强调”的纪律'
|
||
- { label: 图片, name: image, widget: image, required: false, hint: '与文字至少填一项;建议先压缩' }
|
||
- label: 标签
|
||
name: tags
|
||
widget: list
|
||
required: false
|
||
- name: photos
|
||
label: 图库照片
|
||
folder: content/photos
|
||
# 整文件 JSON(非 frontmatter)= 现有 sidecar 同构;不设 format 条目不列出
|
||
format: json
|
||
create: true
|
||
# 入口相对:jpg 与 sidecar 同目录;image 引用写裸文件名(loader new URL 等价解析)
|
||
media_folder: ''
|
||
public_folder: ''
|
||
summary: '{{fields.group}} · {{fields.title}}'
|
||
# 照片无 frontmatter 日期(JSON sidecar,时间在 exif/文件侧)——列表按标题/分组排序
|
||
sortable_fields: [title, group]
|
||
fields:
|
||
# title 必填:Astro schema z.string() 无 .optional(),omit 纪律下必需且有值才会落键(空 title 会让 main 不可构建)
|
||
- { label: 标题, name: title, widget: string, required: true }
|
||
- { label: 图片, name: image, widget: image }
|
||
- { label: 分组, name: group, widget: select, options: [street, landscape] }
|
||
- { label: 替代文本, name: alt, widget: string, required: false }
|
||
- { label: 人为描述, name: caption, widget: text, required: false, hint: 展示在灯箱里的人为描述(一句话策展文案) }
|
||
- label: EXIF 覆盖(一般留空,构建期自动从图提取)
|
||
name: exif
|
||
widget: object
|
||
required: false
|
||
fields:
|
||
- { label: 机身, name: make, widget: string, required: false }
|
||
- { label: 镜头, name: lens, widget: string, required: false }
|
||
- { label: 光圈值, name: fNumber, widget: number, required: false }
|
||
- { label: 曝光秒, name: exposureTime, widget: number, required: false }
|
||
- { label: ISO, name: iso, widget: number, required: false }
|
||
|
||
# 页面文案单例(cms 车道 A):三个文件型入口,保存即写 content/site/*.yaml,
|
||
# 字段与 Astro siteHome/siteAbout/siteOpenSource 的 schema 一一对应(zh/en 双字段,留空回落默认)
|
||
- name: site_pages
|
||
label: 页面文案
|
||
files:
|
||
- name: home
|
||
label: 主页设置
|
||
file: content/site/home.yaml
|
||
format: yaml
|
||
# 头像上传落 content/site/assets/,yaml 写 ./assets/xxx(Astro 图片管线优化)
|
||
media_folder: content/site/assets
|
||
public_folder: ./assets
|
||
fields:
|
||
- label: 身份语
|
||
name: tagline
|
||
widget: object
|
||
required: false
|
||
hint: 首页大字身份语(双语,markdown 富文本);可写 <span class="font-kai c-blue">…</span> 做局部强调
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- label: 页面排版覆盖(可选)
|
||
name: typography
|
||
widget: object
|
||
required: false
|
||
hint: 本页正文默认字体 / 强调色 / 字号缩放(0.8–1.25);不填用全站默认,只影响本页
|
||
fields:
|
||
- label: 正文字体类
|
||
name: font
|
||
widget: select
|
||
required: false
|
||
hint: 整页正文换字族;艺术/展示类字族体积大。5i 新增六款(小薇/庆科黄油/马善政/柳建毛草/得意黑/新晰黑)均按站内用字切片,单页增量 27–46KB;站外用字(生僻字)会回落系统字族,需按 docs 里的命令重切
|
||
options: [font-serif, font-kai, font-sans, font-mono, font-song, font-kai-sys, font-hei-sys, font-fangsong, font-huiwen, font-kuaile, font-xiaowei, font-huangyou, font-mashanzheng, font-liujianmaocao, font-smiley, font-neoxihei]
|
||
- label: 强调色类
|
||
name: accent
|
||
widget: select
|
||
required: false
|
||
options: [ink-accent, ink-accent-soft, c-blue, c-blue-soft, c-teal, c-teal-soft, c-green, c-green-soft, c-yellow, c-yellow-soft, c-orange, c-orange-soft, c-red, c-red-soft, c-pink, c-pink-soft, c-purple, c-purple-soft]
|
||
- { label: 字号缩放, name: scale, widget: number, required: false, value_type: float, min: 0.8, max: 1.25, step: 0.05, hint: '0.8–1.25;1 = 全站默认' }
|
||
- label: 公告(可选,markdown)
|
||
name: announcement
|
||
widget: object
|
||
required: false
|
||
hint: 渲染在名片区下方;留空则不显示公告块
|
||
fields:
|
||
- { label: 中文, name: zh, widget: markdown, required: false }
|
||
- { label: 英文, name: en, widget: markdown, required: false }
|
||
- { label: 项目墙条数, name: projectsLimit, widget: number, required: false, value_type: int, min: 1, max: 99, hint: '首页项目墙显示几条(1–99,缺省 6)' }
|
||
- label: 轨细分开关(首页文章列表)
|
||
name: postsTracks
|
||
widget: object
|
||
required: false
|
||
hint: 关掉某轨则该轨文章不在首页列出(全开=现状)
|
||
fields:
|
||
- { label: 阅读轨, name: reading, widget: boolean, required: false, default: true }
|
||
- { label: 技术轨, name: tech, widget: boolean, required: false, default: true }
|
||
- { label: 照片轨, name: photo, widget: boolean, required: false, default: true }
|
||
- label: 副标题(可选,markdown 短文本)
|
||
name: subtitle
|
||
widget: object
|
||
hint: 渲染在身份语下方;留空不渲染
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- label: 最新影像张数
|
||
name: latestPhotos
|
||
widget: number
|
||
required: false
|
||
default: 4
|
||
min: 0
|
||
max: 6
|
||
hint: '1-6;填 0 = 隐藏「最新影像」区块。留空默认 4'
|
||
- label: 首页每轨文章条数
|
||
name: perTrackLimit
|
||
widget: number
|
||
required: false
|
||
default: 6
|
||
min: 4
|
||
max: 8
|
||
hint: 阅读轨/技术轨各显示条数,留空默认 6
|
||
- label: 区块开关
|
||
name: sections
|
||
widget: object
|
||
required: false
|
||
hint: 关掉的区块不渲染(默认全开)
|
||
fields:
|
||
- { label: 文章列表, name: tracks, widget: boolean, required: false, default: true }
|
||
- { label: 最新影像, name: photos, widget: boolean, required: false, default: true }
|
||
- { label: 贡献热力图, name: heatmap, widget: boolean, required: false, default: true }
|
||
- { label: 项目墙, name: projects, widget: boolean, required: false, default: true }
|
||
- label: 头像(可选)
|
||
name: avatar
|
||
widget: image
|
||
required: false
|
||
hint: '留空 = 内置渐变占位;上传后自动优化为 60px WebP'
|
||
- label: 站点图标 favicon
|
||
name: favicon
|
||
widget: string
|
||
required: false
|
||
hint: 'public 下的路径,如 /icons/my.ico 或 /icons/my.svg;留空回退 /favicon.svg。经「图标」媒体库上传'
|
||
- label: 社交链接(顺序即展示顺序)
|
||
name: socials
|
||
widget: list
|
||
required: false
|
||
summary: '{{fields.label}} → {{fields.url}}'
|
||
fields:
|
||
- { label: 名称(无障碍文字), name: label, widget: string }
|
||
- { label: 链接, name: url, widget: string }
|
||
- label: 图标
|
||
name: icon
|
||
widget: select
|
||
required: false
|
||
options: [github, rss, email, bilibili, x]
|
||
hint: '不在列表里的留空 → 显示纯文字按钮'
|
||
- name: about
|
||
label: 关于页
|
||
file: content/site/about.yaml
|
||
format: yaml
|
||
# 块内图片上传落 content/site/assets/,yaml 写 ./assets/xxx(Astro 图片管线)
|
||
media_folder: content/site/assets
|
||
public_folder: ./assets
|
||
fields:
|
||
- label: 页面块(拖拽排序;每块可折叠)
|
||
name: blocks
|
||
widget: list
|
||
typeKey: type
|
||
required: false
|
||
summary: '{{fields.type}}'
|
||
hint: '点「+ 添加」选块型。关掉某块用该块内的「显示」开关'
|
||
types:
|
||
- label: 正文(markdown)
|
||
name: prose
|
||
widget: object
|
||
hint: markdown 正文块;可选小标题与版心/通栏宽度,长文分段改内容用
|
||
fields:
|
||
- { label: 显示, name: enabled, widget: boolean, required: false, default: true }
|
||
- label: 小标题(可选)
|
||
name: title
|
||
widget: object
|
||
required: false
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- label: 正文(markdown)
|
||
name: body
|
||
widget: object
|
||
fields:
|
||
- { label: 中文, name: zh, widget: markdown, required: false }
|
||
- { label: 英文, name: en, widget: markdown, required: false }
|
||
- label: 宽度
|
||
name: width
|
||
widget: select
|
||
required: false
|
||
default: narrow
|
||
options: [{ label: 版心宽度, value: narrow }, { label: 通栏, value: full }]
|
||
- label: 版图(图标+名称+描述)
|
||
name: tracks
|
||
widget: object
|
||
hint: 版图块:图标 + 名称 + 描述,适合「几条主线/能力面」式介绍
|
||
fields:
|
||
- { label: 显示, name: enabled, widget: boolean, required: false, default: true }
|
||
- label: 标题
|
||
name: title
|
||
widget: object
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- label: 条目
|
||
name: items
|
||
widget: list
|
||
summary: '{{fields.name.zh}}'
|
||
fields:
|
||
- label: 图标
|
||
name: icon
|
||
widget: select
|
||
required: false
|
||
options: [book, terminal, camera, code, git, rss, email, github, bilibili, x, star, link]
|
||
hint: 白名单外或留空 → 显示首字占位
|
||
- label: 名称
|
||
name: name
|
||
widget: object
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- label: 描述
|
||
name: desc
|
||
widget: object
|
||
required: false
|
||
fields:
|
||
- { label: 中文, name: zh, widget: text, required: false }
|
||
- { label: 英文, name: en, widget: text, required: false }
|
||
- label: 卡片(2/3 列)
|
||
name: cards
|
||
widget: object
|
||
hint: 卡片墙(2/3 列):每卡 = 标题 + 描述 + 可选链接/角标
|
||
fields:
|
||
- { label: 显示, name: enabled, widget: boolean, required: false, default: true }
|
||
- label: 标题(可选)
|
||
name: title
|
||
widget: object
|
||
required: false
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- { label: 列数, name: columns, widget: number, required: false, default: 3, min: 2, max: 3, value_type: int }
|
||
- label: 卡片条目
|
||
name: items
|
||
widget: list
|
||
summary: '{{fields.title.zh}}'
|
||
fields:
|
||
- label: 标题
|
||
name: title
|
||
widget: object
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- label: 描述
|
||
name: desc
|
||
widget: object
|
||
required: false
|
||
fields:
|
||
- { label: 中文, name: zh, widget: text, required: false }
|
||
- { label: 英文, name: en, widget: text, required: false }
|
||
- { label: 链接(可选), name: href, widget: string, required: false }
|
||
- label: 角标(可选)
|
||
name: tag
|
||
widget: object
|
||
required: false
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- label: 时间线
|
||
name: timeline
|
||
widget: object
|
||
hint: 时间线:一条时间 + 标题 + 描述;时间可写自由文本(如 2024 — 2026)
|
||
fields:
|
||
- { label: 显示, name: enabled, widget: boolean, required: false, default: true }
|
||
- label: 标题(可选)
|
||
name: title
|
||
widget: object
|
||
required: false
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- label: 条目
|
||
name: items
|
||
widget: list
|
||
summary: '{{fields.time}} · {{fields.title.zh}}'
|
||
fields:
|
||
- { label: 时间, name: time, widget: string, hint: '自由文本,如 2024 — 2026' }
|
||
- label: 标题
|
||
name: title
|
||
widget: object
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- label: 描述(可选)
|
||
name: desc
|
||
widget: object
|
||
required: false
|
||
fields:
|
||
- { label: 中文, name: zh, widget: text, required: false }
|
||
- { label: 英文, name: en, widget: text, required: false }
|
||
- label: 引文
|
||
name: quote
|
||
widget: object
|
||
hint: 单句引文 + 可选署名;配 font-kai 排版效果更好
|
||
fields:
|
||
- { label: 显示, name: enabled, widget: boolean, required: false, default: true }
|
||
- label: 引文
|
||
name: text
|
||
widget: object
|
||
fields:
|
||
- { label: 中文, name: zh, widget: text, required: false }
|
||
- { label: 英文, name: en, widget: text, required: false }
|
||
- label: 出处(可选)
|
||
name: cite
|
||
widget: object
|
||
required: false
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- label: 图片
|
||
name: figure
|
||
widget: object
|
||
hint: 单图 + 可选说明;图片只能后台上传(落 content/site/assets),禁外链
|
||
fields:
|
||
- { label: 显示, name: enabled, widget: boolean, required: false, default: true }
|
||
- { label: 图片(必填,请用后台上传), name: image, widget: image, hint: '禁止填外链:只能上传(落 content/site/assets/),走 Astro 图片管线' }
|
||
- { label: 替代文本(无障碍), name: alt, widget: string, required: false }
|
||
- label: 图注(可选)
|
||
name: caption
|
||
widget: object
|
||
required: false
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- label: 链接清单
|
||
name: linklist
|
||
widget: object
|
||
hint: 链接清单(标签 + 链接 + 备注),适合「相关阅读 / 外部资源」
|
||
fields:
|
||
- { label: 显示, name: enabled, widget: boolean, required: false, default: true }
|
||
- label: 标题(可选)
|
||
name: title
|
||
widget: object
|
||
required: false
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- label: 链接条目
|
||
name: items
|
||
widget: list
|
||
summary: '{{fields.label.zh}} → {{fields.href}}'
|
||
fields:
|
||
- label: 名称
|
||
name: label
|
||
widget: object
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- { label: 链接, name: href, widget: string }
|
||
- label: 备注(可选)
|
||
name: note
|
||
widget: object
|
||
required: false
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- label: 行动按钮
|
||
name: cta
|
||
widget: object
|
||
hint: 行动按钮(文案 + 链接 + 按钮字);一页建议不超过一个
|
||
fields:
|
||
- { label: 显示, name: enabled, widget: boolean, required: false, default: true }
|
||
- label: 说明文字
|
||
name: text
|
||
widget: object
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- { label: 按钮链接, name: href, widget: string }
|
||
- label: 按钮文字
|
||
name: label
|
||
widget: object
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- label: 分隔
|
||
name: divider
|
||
widget: object
|
||
hint: 分隔块:细分隔线或纯留白,给长页分段
|
||
fields:
|
||
- { label: 显示, name: enabled, widget: boolean, required: false, default: true }
|
||
- label: 样式
|
||
name: style
|
||
widget: select
|
||
required: false
|
||
default: line
|
||
options: [{ label: 细分隔线, value: line }, { label: 纯留白, value: space }]
|
||
- label: 名片区开关
|
||
name: layout
|
||
widget: object
|
||
required: false
|
||
hint: 关掉则不显示头像/名字/社交(它们的数据在「主页设置」)
|
||
fields:
|
||
- { label: 显示名片区, name: showIdCard, widget: boolean, required: false, default: true }
|
||
- label: 正文回退(blocks 为空时用,markdown,多段)
|
||
name: intro
|
||
widget: object
|
||
required: false
|
||
hint: 仅在「页面块」为空时渲染;与块同时存在时以块为准
|
||
fields:
|
||
- { label: 中文, name: zh, widget: markdown, required: false }
|
||
- { label: 英文, name: en, widget: markdown, required: false }
|
||
- label: 页面排版覆盖(可选)
|
||
name: typography
|
||
widget: object
|
||
required: false
|
||
hint: 本页正文默认字体 / 强调色 / 字号缩放(0.8–1.25);不填用全站默认,只影响本页
|
||
fields:
|
||
- label: 正文字体类
|
||
name: font
|
||
widget: select
|
||
required: false
|
||
options: [font-serif, font-kai, font-sans, font-mono, font-song, font-kai-sys, font-hei-sys, font-fangsong, font-huiwen, font-kuaile, font-xiaowei, font-huangyou, font-mashanzheng, font-liujianmaocao, font-smiley, font-neoxihei]
|
||
- label: 强调色类
|
||
name: accent
|
||
widget: select
|
||
required: false
|
||
options: [ink-accent, ink-accent-soft, c-blue, c-blue-soft, c-teal, c-teal-soft, c-green, c-green-soft, c-yellow, c-yellow-soft, c-orange, c-orange-soft, c-red, c-red-soft, c-pink, c-pink-soft, c-purple, c-purple-soft]
|
||
- { label: 字号缩放, name: scale, widget: number, required: false, value_type: float, min: 0.8, max: 1.25, step: 0.05 }
|
||
- name: opensource
|
||
label: 开源页
|
||
file: content/site/opensource.yaml
|
||
format: yaml
|
||
fields:
|
||
- label: 打字机动效文案(可选,≤6 条)
|
||
name: typing
|
||
widget: list
|
||
required: false
|
||
summary: '{{fields.zh}}'
|
||
hint: '档案卡顶部逐字打出的几行文案,2–6 条最佳;留空用内置默认。中英各一行,切换语言同步'
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string }
|
||
- { label: English, name: en, widget: string }
|
||
- label: 叙述(链接前)
|
||
name: blurb
|
||
widget: object
|
||
required: false
|
||
hint: 富文本(markdown + 排版类),渲染在仓库链接之前
|
||
fields:
|
||
- { label: 中文, name: zh, widget: string, required: false }
|
||
- { label: 英文, name: en, widget: string, required: false }
|
||
- label: 页面排版覆盖(可选)
|
||
name: typography
|
||
widget: object
|
||
required: false
|
||
hint: 本页正文默认字体 / 强调色 / 字号缩放(0.8–1.25);不填用全站默认,只影响本页
|
||
fields:
|
||
- label: 正文字体类
|
||
name: font
|
||
widget: select
|
||
required: false
|
||
hint: 整页正文换字族;艺术/展示类字族体积大。5i 新增六款(小薇/庆科黄油/马善政/柳建毛草/得意黑/新晰黑)均按站内用字切片,单页增量 27–46KB;站外用字(生僻字)会回落系统字族,需按 docs 里的命令重切
|
||
options: [font-serif, font-kai, font-sans, font-mono, font-song, font-kai-sys, font-hei-sys, font-fangsong, font-huiwen, font-kuaile, font-xiaowei, font-huangyou, font-mashanzheng, font-liujianmaocao, font-smiley, font-neoxihei]
|
||
- label: 强调色类
|
||
name: accent
|
||
widget: select
|
||
required: false
|
||
options: [ink-accent, ink-accent-soft, c-blue, c-blue-soft, c-teal, c-teal-soft, c-green, c-green-soft, c-yellow, c-yellow-soft, c-orange, c-orange-soft, c-red, c-red-soft, c-pink, c-pink-soft, c-purple, c-purple-soft]
|
||
- { label: 字号缩放, name: scale, widget: number, required: false, value_type: float, min: 0.8, max: 1.25, step: 0.05, hint: '0.8–1.25;1 = 全站默认' }
|
||
- { label: 仓库链接地址, name: repo_url, widget: string, required: false }
|
||
- { label: 仓库链接文字, name: repo_label, widget: string, required: false }
|
||
- label: 叙述(链接后)
|
||
name: blurb_after
|
||
widget: object
|
||
fields:
|
||
- { label: 中文, name: zh, widget: text, required: false }
|
||
- { label: 英文, name: en, widget: text, required: false }
|
||
- label: 置顶项目(仓库短名,顺序即展示顺序)
|
||
name: pinned
|
||
widget: list
|
||
required: false
|
||
hint: '如 blog;留空则回落默认 blog。填写的名字须与仓库短名一致'
|
||
- label: 项目墙模式
|
||
name: mode
|
||
widget: select
|
||
required: false
|
||
default: all
|
||
options: [{ label: 全部, value: all }, { label: 仅白名单, value: only }, { label: 排除黑名单, value: exclude }]
|
||
hint: only/exclude 需配合下面的名单
|
||
- label: 白名单(仓库短名)
|
||
name: include
|
||
widget: list
|
||
required: false
|
||
hint: 'mode=仅白名单时生效,如 pi-board'
|
||
- label: 黑名单(仓库短名)
|
||
name: exclude
|
||
widget: list
|
||
required: false
|
||
hint: 'mode=排除黑名单时生效,如 blog'
|
||
- label: 排序
|
||
name: sort
|
||
widget: select
|
||
required: false
|
||
default: pinned-first
|
||
options:
|
||
- { label: 置顶优先,其余按星数, value: pinned-first }
|
||
- { label: 星数降序, value: stars }
|
||
- { label: 最近更新, value: updated }
|
||
- label: 来源过滤
|
||
name: perSource
|
||
widget: select
|
||
required: false
|
||
default: both
|
||
options: [{ label: 双源合并, value: both }, { label: 仅 GitHub, value: github }, { label: 仅自托管 gitea, value: gitea }]
|
||
- label: 开篇文案来源
|
||
name: intro_from
|
||
widget: select
|
||
required: false
|
||
default: 'off'
|
||
options:
|
||
- { label: 用本页叙述(默认), value: 'off' }
|
||
- { label: GitHub profile README, value: github-readme }
|
||
hint: 'github-readme = 构建期取 wait4xx/wait4xx 的 README 渲染为开篇;缓存入仓 content/.github-readme.md,取不到自动回落叙述'
|