输入关键词,开始搜索

↑↓ 选择 打开 esc 关闭
沉浸
Markdown 内容指令示例

Markdown 内容指令示例

34 min read
  1. 1 Markdown 内容指令示例

在普通 .md 文章里直接使用 :::: 语法,无需 import,无需 MDX。下面每个指令都分成了演示效果示例代码两个选项卡,方便你边预览边复制。


块级组件

Callout 提示块

Info

这是一条信息提示,适合补充说明背景知识。

小技巧

通过 title 属性自定义标题。

Warning

这是一条注意事项,提醒读者小心的地方。

危险操作

执行此操作前请务必备份数据。

:::callout{type="info"}
这是一条**信息提示**,适合补充说明背景知识。
:::

:::callout{type="tip" title="小技巧"}
通过 `title` 属性自定义标题。
:::

:::callout{type="warn"}
这是一条**注意事项**,提醒读者小心的地方。
:::

:::callout{type="danger" title="危险操作"}
执行此操作前请务必备份数据。
:::
  • type 可选值:info | tip | warn | danger
  • title 可自定义标题,不传则使用默认值

Note 主题色提示

使用博客主题色的轻量提示块。支持 color 属性。

关于本站
  • blue:科技蓝
  • green:自然绿
  • red:警示红
  • yellow:活力黄
  • purple:优雅紫
:::note
使用博客**主题色**的轻量提示块。支持 `color` 属性。
:::

:::note{title="关于本站" color="blue"}
- `blue`:科技蓝
- `green`:自然绿
- `red`:警示红
- `yellow`:活力黄
- `purple`:优雅紫
:::
  • color 可选值:bluegreenredyellowpurple 或任意十六进制色值
  • title 可设置标题

Folding 折叠块

查看完整配置
// astro.config.mjs
import remarkDirective from 'remark-directive';
import { remarkContentDirectives } from './src/plugins/remark-content-directives.mjs';

export default defineConfig({
  markdown: {
    remarkPlugins: [remarkDirective, remarkContentDirectives]
  }
});
默认展开的折叠块

通过 open="true" 让折叠块默认展开。支持 color 属性自定义颜色。

:::folding{title="查看完整配置"}
```js
import remarkDirective from 'remark-directive';
import { remarkContentDirectives } from './src/plugins/remark-content-directives.mjs';

export default defineConfig({
  markdown: {
    remarkPlugins: [remarkDirective, remarkContentDirectives]
  }
});
```
:::

:::folding{title="默认展开的折叠块" open="true"}
通过 `open="true"` 让折叠块默认展开。支持 `color` 属性自定义颜色。
:::
  • title 折叠按钮上的文字
  • open="true" 默认展开
  • color 自定义颜色

Folders 多级折叠

第一章:基础概念

Astro 是一个内容优先的静态站点生成器。核心特点:

  1. 零 JS 默认输出
  2. 群岛架构
  3. 支持 React / Vue / Svelte
第二章:组件系统

Astro 组件使用 .astro 后缀,语法类似 HTML + JS:

---
const name = 'Astro';
---
<h1>Hello {name}</h1>
第三章:内容集合

使用 Content Collections 管理类型安全的内容。

:::folders
folder: 第一章:基础概念

Astro 是一个**内容优先**的静态站点生成器。核心特点:

1. 零 JS 默认输出
2. 群岛架构
3. 支持 React / Vue / Svelte

folder: 第二章:组件系统

Astro 组件使用 `.astro` 后缀,语法类似 HTML + JS:

```astro
---
const name = 'Astro';
---
<h1>Hello {name}</h1>
```

folder: 第三章:内容集合

使用 [Content Collections](https://docs.astro.build/zh-cn/guides/content-collections/) 管理类型安全的内容。
:::
  • 每个 folder: 标题 开启一个新的折叠项
  • 支持在内容中嵌套代码块、列表、链接等 Markdown 内容

Timeline 时间线

  1. 开始学习 Astro

    从官方文档入手,了解基本概念

  2. 搭建个人博客

    基于 Vergil 主题开始定制

  3. 上线运营

    正式部署到 GitHub Pages

  4. 持续迭代

    添加分类、专栏、内容指令等功能

:::timeline
- 2024-01 | 开始学习 Astro | 从官方文档入手,了解基本概念
- 2024-03 | 搭建个人博客 | 基于 Vergil 主题开始定制
- 2024-06 | 上线运营 | 正式部署到 GitHub Pages
- 2025-04 | 持续迭代 | 添加分类、专栏、内容指令等功能
:::
  • 每条时间线以 - 开头,用 | 分隔日期标题描述
  • 描述为可选

Deadline 倒计时

年度目标截止
00
00
00
00
:
00
00
00
00
:
00
00
00
00
:
00
00
00
00
目标日期 2026/12/31
保持节奏,稳步推进
已过期示例
00
00
00
00
:
00
00
00
00
:
00
00
00
00
目标日期 2025/01/01
保持节奏,稳步推进
:::deadline{date="2026-12-31" title="年度目标截止" description="保持节奏,稳步推进"}
:::

:::deadline{date="2025-01-01" title="已过期示例" expiredText="活动已结束" description="保持节奏,稳步推进" showSeconds="false"}
:::
  • date必填):目标日期,格式 YYYY-MM-DDYYYY-MM-DD HH:mm
  • title:倒计时标题
  • description:描述文字
  • showSeconds:是否显示秒数,默认 true
  • expiredText:过期后显示的文案,默认 已截止

Tabs 选项卡

演示效果

这是标签 A 的内容。

这是带 color 属性的标签 B

示例代码

:::tabs
tab: 标签 A

这是**标签 A** 的内容。

tab: 标签 B{color=blue}

这是带 `color` 属性的**标签 B**。
:::
  • tab: 标签名 后需要空一行,再写内容
  • tab: 标签名{color=blue} 可给标签设置颜色

Poetry 诗歌/引用

游山西村
陆游 · (宋)

莫笑农家腊酒浑,丰年留客足鸡豚。

山重水复疑无路,柳暗花明又一村

箫鼓追随春社近,衣冠简朴古风存。

从今若许闲乘月,拄杖无时夜叩门。

:::poetry{title="游山西村" author="陆游"  footer="诗词节选" date="(宋)"}
莫笑农家腊酒浑,丰年留客足鸡豚。

**山重水复疑无路,柳暗花明又一村**

箫鼓追随春社近,衣冠简朴古风存。

从今若许闲乘月,拄杖无时夜叩门。

:::
  • title 诗歌标题
  • author 作者
  • date 日期/朝代

Reel 卷轴

卷轴示例
作者

这是卷轴的内容,文字会从右向左竖排显示。

支持多段落内容。

2026-04-20
:::reel{title="卷轴示例" author="作者" date="2026-04-20" footer="卷轴底部"}
这是卷轴的内容,文字会从右向左竖排显示。

支持多段落内容。
:::
  • title:卷轴标题
  • author:作者信息
  • date:日期
  • footer:底部文字

Paper 纸张

文言文

出师表

先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。

后出师表

先帝深虑汉、贼不两立,王业不偏安,故托臣以讨贼也。

臣鞠躬尽瘁,死而后已。

:::paper{title="文言文" author="诸葛亮" date="三国" footer="节选"}
出师表

<!-- paragraph -->
先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。

<!-- section 后出师表 -->
先帝深虑汉、贼不两立,王业不偏安,故托臣以讨贼也。

<!-- line right -->
臣鞠躬尽瘁,死而后已。
:::
  • title:纸张标题(居中)
  • author / date / footer:作者、日期、底部文字
  • 内容分区:
  • <!-- paragraph -->:普通段落(首行缩进)
  • <!-- section 标题 -->:带居中标题的章节
  • <!-- line right -->:右对齐行

Copy 一键复制

安装
SSH
:::copy{label="安装"}
pnpm add remark-directive unist-util-visit
:::

:::copy{label="SSH"}
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA example@example.com
:::
  • label 左侧标签文字
  • 内容区域会被处理为一行纯文本,点击右侧按钮即可复制

Grid 网格布局

快速开始

npm create astro@latest

部署指南

  1. 构建项目:npm run build
  2. 选择平台:Vercel / Netlify / Cloudflare Pages
  3. 一键部署
:::grid{cols="3" gap="12"}
**快速开始**

```bash
npm create astro@latest
```

---

**核心概念**

- [群岛架构](https://docs.astro.build/)
- [内容集合](https://docs.astro.build/)
- [视图过渡](https://docs.astro.build/)

---

**部署指南**

1. 构建项目:`npm run build`
2. 选择平台:Vercel / Netlify / Cloudflare Pages
3. 一键部署
:::
  • cols 列数,可选 2 | 3 | 4,不传则按最小宽度自动换行
  • gap 格子间距,单位 px
  • minw 自动列数时的最小列宽,默认 240px
  • bg 格子背景样式:card(默认) | box | none
  • --- 分隔每个格子

Quot 引言

代码是写给人看的,顺便让机器执行。

:::quot{icon="x"}
代码是写给人看的,顺便让机器执行。
:::
  • icon 可自定义图标,不传则使用默认引号图标

Blockquote 段落引用

这是使用 blockquote 标签的例子。

支持多段落内容,适合引用长段文字。

:::blockquote
这是使用 blockquote 标签的例子。

支持多段落内容,适合引用长段文字。
:::
  • 使用 <blockquote> 标签包裹内容
  • 顶部左右角自动显示引号图标

行内指令

文字装饰

  • 高亮:默认主题色高亮黄色高亮红色高亮
  • 下划线:实线下划线蓝色下划线
  • 着重号:着重号下划线(点状)
  • 波浪线:波浪下划线
  • 删除线:已删除的内容
  • 上标:H2O 和 注释1
  • 下标:CO2 和 H2O
- 高亮::mark[默认主题色高亮] 和 :mark[黄色高亮]{color="yellow"} 和 :mark[红色高亮]{color="red"}
- 下划线::u[实线下划线] 和 :u[蓝色下划线]{color="blue"}
- 着重号::emp[着重号下划线](点状)
- 波浪线::wavy[波浪下划线]
- 删除线::del[已删除的内容]
- 上标:H:sup[2]O 和 注释:sup[1]{color="red"}
- 下标:CO:sub[2] 和 H:sub[2]O
  • :markcolor 可选值:yellowredgreenbluepurple 或任意色值
  • :u:sup:sub 同样支持 color 属性

交互效果

  • 键盘按键:按 Ctrl+C 复制,按 Ctrl+V 粘贴,按 ⌘+K 搜索
  • 模糊遮罩:点击可以查看隐藏内容(点击揭示)
  • 密码遮罩:密码是 MySecretPassword123(点击显示)
- 键盘按键:按 :kbd[Ctrl+C] 复制,按 :kbd[Ctrl+V] 粘贴,按 :kbd[⌘+K] 搜索
- 模糊遮罩::blur[点击可以查看隐藏内容](点击揭示)
- 密码遮罩:密码是 :psw[MySecretPassword123](点击显示)
  • :blur 点击后移除模糊效果
  • :psw 点击后显示明文

Hashtag 标签

- 自动轮询颜色::hashtag[Astro]{href="/tags/astro"} :hashtag[博客]{href="/tags/blog"} :hashtag[教程]{href="/tags/tutorial"} :hashtag[前端]{href="/tags/frontend"} :hashtag[CSS]{href="/tags/css"}
- 自定义颜色::hashtag[指定蓝色]{href="/tags/blue" color="blue"} :hashtag[指定红色]{href="/tags/red" color="red"}
  • :hashtag 默认自动轮询 7 种颜色(红、橙、黄、绿、青、蓝、紫),无需指定 color
  • :hashtaghref 为跳转链接,color 可手动自定义颜色
  • :hashtag 左侧会自动显示 # 图标

Button 按钮

- 普通按钮::button[查看文档]{href="/" color="accent"} :button[GitHub]{href="/" color="blue"}
- 带图标的按钮::button[搜索]{href="/search" color="green" icon="lucide:search"}
- 小尺寸按钮::button[标签]{href="/tags" color="purple" size="xs"}
- 图标按钮组::button[文档]{href="/docs" color="cyan" icon="lucide:book-open"} :button[源码]{href="/github" color="cyan" icon="lucide:code-2"} :button[示例]{href="/demo" color="cyan" icon="lucide:trophy"}
  • :buttonhref 为跳转链接,color 可自定义颜色
  • :button 支持 icon 属性,可传入 Iconify 图标名(如 lucide:search)或图片 URL
  • :button 支持 size="xs" 小尺寸模式

Image 图片

风景照片
风景照片
带下载按钮
带下载按钮
正方形裁剪
正方形裁剪
::image{src="https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=800&q=80" alt="风景照片"}

::image{src="https://images.unsplash.com/photo-1464822759023-fed622ff2c3b?w=800&q=80" alt="带下载按钮" download="true"}

::image{src="https://images.unsplash.com/photo-1448375240586-882707db888b?w=800&q=80" alt="正方形裁剪" ratio="1/1" width="300px"}
  • src必填):图片地址
  • alt:图片描述,会显示在图片下方作为 caption
  • width / height:设置图片尺寸
  • bg:背景颜色
  • padding:内边距
  • ratio:固定宽高比
  • downloadtrue 或自定义下载链接
  • fancyboxfalse 可禁用点击放大

:::gallery{layout="grid" size="m" ratio="square"}
![山景1](https://images.unsplash.com/photo-1464822759023-fed622ff2c3b?w=400&q=80)
![山景2](https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400&q=80)
![森林](https://images.unsplash.com/photo-1448375240586-882707db888b?w=400&q=80)
![湖泊](https://images.unsplash.com/photo-1433086966358-54859d0ed716?w=400&q=80)
:::
  • layoutgrid(网格,默认)或 flow(瀑布流)
  • sizexs | s | m | l | xl | mix
  • ratiosquare | portrait | origin(保持原始比例)

Vergil 主题
Astro 驱动的个人博客主题
:::banner{title="Vergil 主题" subtitle="Astro 驱动的个人博客主题" bg="https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1200&q=80"}
:::
  • title必填):主标题
  • subtitle:副标题
  • bg:背景图片地址
  • avatar:头像图片地址
  • link:点击跳转链接

Panel 代码面板

将多个相关代码块或文字段落放入同一个面板中并列展示。每段有独立的左侧标签和右侧说明,支持每段单独复制。

场景 1:多语言代码对比

JavaScript
ES2024
const user = await fetch('/api/user').then(r => r.json())
console.log(user.name)
TypeScript
v5.7
interface User { name: string }
const user = await fetch<User>('/api/user').then(r => r.json())
console.log(user.name)
Python
3.13
import requests
user = requests.get('/api/user').json()
print(user['name'])
:::panel
```js title="JavaScript" right="ES2024"
const user = await fetch('/api/user').then(r => r.json())
```

```ts title="TypeScript" right="v5.7"
const user = await fetch<User>('/api/user').then(r => r.json())
```
:::
  • title -> 左侧标签(场景/功能描述)
  • right -> 右侧说明(语言、版本、文件名等任意文本)

场景 2:前后端配对

前端调用
React
api.getUser(id).then(user => {
  setUser(user)
})
后端实现
Go 1.23
func GetUser(w http.ResponseWriter, r *http.Request) {
  id := r.URL.Query().Get("id")
  user := db.FindUser(id)
  json.NewEncoder(w).Encode(user)
}
:::panel
```js title="前端调用" right="React"
fetch('/api/user').then(r => r.json())
```

```go title="后端实现" right="Go 1.23"
func GetUser(w http.ResponseWriter, r *http.Request) { ... }
```
:::

场景 3:请求与响应

请求
HTTP/1.1
GET /api/posts?page=1&limit=10
Authorization: Bearer eyJhbG...
响应
JSON
{
  "data": [...],
  "total": 42,
  "page": 1,
  "limit": 10
}
:::panel
```http title="请求" right="HTTP/1.1"
GET /api/posts?page=1&limit=10
```

```json title="响应" right="JSON"
{ "data": [...], "total": 42 }
```
:::

场景 4:配置文件多环境对比

开发环境
dev.yaml
database: localhost:5432
debug: true
log_level: debug
生产环境
prod.yaml
database: prod.db.internal:5432
debug: false
log_level: warn
:::panel
```yaml title="开发环境" right="dev.yaml"
database: localhost:5432
```

```yaml title="生产环境" right="prod.yaml"
database: prod.db.internal:5432
```
:::

场景 5:普通文字内容分段

快速上手
1 分钟

创建项目只需一行命令:

bash
npx create-my-app
详细步骤
5 分钟
  1. 确保 Node.js >= 18
  2. 运行 npx create-my-app
  3. 按提示选择模板
  4. 进入目录运行 npm run dev
进阶配置
可选

如需自定义配置,可在项目根目录创建 my-app.config.js

js
export default {
  theme: 'default',
  plugins: ['@my-app/i18n']
}
:::panel

<!-- label: 快速上手 | 1 分钟 -->
创建项目只需一行命令:

```bash
npx create-my-app
```

<!-- label: 详细步骤 | 5 分钟 -->
1. 确保 Node.js >= 18
2. 运行 `npx create-my-app`

:::
  • <!-- label: 左边 | 右边 -->| 分隔左右标签
  • 若不需要右边标签,可省略 | 及之后内容

场景 6:多视角叙事

用户视角
痛点

界面突然卡住,刷新后数据全没了,心情很崩溃。

开发者视角
根因

前端在 onMount 时未做 Loading 态处理,接口 5s 超时导致用户以为页面死了,重复刷新引发竞态条件。

产品经理视角
方案

需要加 Loading 骨架屏 + 请求防抖 + 断网重试机制。

:::panel

<!-- label: 用户视角 | 痛点 -->
界面突然卡住,刷新后数据全没了。

<!-- label: 开发者视角 | 根因 -->
前端在 `onMount` 时未做 Loading 态处理。

:::

场景 7:正反观点对比

支持 TypeScript
优势

TypeScript 的严格类型让大型项目维护成本大幅降低,重构时信心十足,IDE 提示也能减少低级错误。

反对 TypeScript
劣势

小项目引入 TS 的 overhead 过高,类型体操反而增加了心智负担,配置复杂,不如直接用 JSDoc + 类型检查。

:::panel

<!-- label: 支持 TypeScript | 优势 -->
TypeScript 的严格类型让大型项目维护成本大幅降低。

<!-- label: 反对 TypeScript | 劣势 -->
小项目引入 TS 的 overhead 过高。

:::

场景 8:时间线对比

2023
Webpack 时代

当时使用 Webpack 5,构建一次要 30 秒,热更新也经常失败,开发体验很差。

2025
Vite 时代

迁移到 Vite 后,冷启动 < 1 秒,HMR 几乎无感知,开发效率提升了数倍。

展望
Rspack 未来

明年计划尝试 Rspack,在保持 Webpack 兼容的同时进一步提升构建性能。

:::panel

<!-- label: 2023 | Webpack 时代 -->
当时使用 Webpack 5,构建一次要 30 秒。

<!-- label: 2025 | Vite 时代 -->
迁移到 Vite 后,冷启动 < 1 秒。

:::

Private 私密内容

将敏感内容放入加密容器,读者需要输入正确密码才能查看。支持密码提示,支持重新锁定。

场景 1:加密文本内容

Private Content
This content is encrypted, please enter the password to view
Hint: 打招呼 + 年份
Incorrect password, please try again
:::private{password="hello2024" hint="打招呼 + 年份"}
这是加密的内容,只有知道密码的人才能看到。

- 敏感信息 1
- 敏感信息 2
:::
  • password必填):解密密码
  • hint(可选):密码提示,帮助读者回忆
  • 支持段落、列表、代码块等任意 Markdown 内容
  • 解密后显示 重新锁定 按钮,可再次隐藏

场景 2:加密代码片段

Private Content
This content is encrypted, please enter the password to view
Incorrect password, please try again
:::private{password="123456"}
```env
DATABASE_URL=postgresql://user:secret@localhost:5432/db
API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx
```
:::

Audio 音频播放器

在文章中插入音频,支持本地音频、网易云音乐和语音消息三种模式。

标准播放器(本地音频)

SoundHelix Song 1
T. Schürger
00:00
00:00
:::audio{src="https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3" title="SoundHelix Song 1" artist="T. Schürger" width="500px"}
:::
  • src必填):音频文件地址
  • title:歌曲标题
  • artist:艺术家
  • cover:封面图 URL(可选,不填则显示音乐图标)
  • align:对齐方式,可选 left(默认)、centerright
  • width:自定义宽度,如 width="400px"

居中对齐示例:

SoundHelix Song 1
T. Schürger
00:00
00:00

自定义宽度示例:

SoundHelix Song 1
T. Schürger
00:00
00:00

网易云音乐

迷你模式(默认):

:::audio{netease="1450008309" title="晴天" artist="周杰伦" width="300px"}
:::

卡片模式(带封面):

:::audio{netease="1450008309" title="晴天" artist="周杰伦" mode="card"}
:::
  • netease必填):网易云音乐歌曲 ID,从网易云音乐网页版分享链接中获取
  • mode:播放器样式,可选 mini(默认,窄条模式)或 card(带封面大卡片)
  • align:对齐方式,可选 left(默认)、centerright
  • width:自定义宽度,如 width="400px"

语音消息

15"
:::audio{voice="https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3" duration="15" width="200px"}
:::
  • voice必填):语音文件地址
  • duration:语音时长(秒),用于显示波形长度
  • align:对齐方式,可选 left(默认)、centerright
  • width:自定义宽度,如 width="400px"

Grid 多列步骤示例

01创建项目

Start by creating a new Vite project if you don’t have one set up already.

Terminal
npm create vite@latest my-projectcd my-project

02安装依赖

安装 tailwindcss@tailwindcss/vite via npm。

Terminal
npm install tailwindcss @tailwindcss/vite

03修改配置文件

vite.config.ts 中引入插件:

vite.config.ts
import { defineConfig } from 'vite'import tailwindcss from '@tailwindcss/vite' export default defineConfig({  plugins: [    tailwindcss(),  ],})

04显示行号的 Terminal

通过 linenos 属性让 terminal 显示行号。

安装依赖
npm install -D tailwindcss postcss autoprefixernpx tailwindcss init

Checkbox 复选框

默认未选中
已选中
绿色已选中
紫色加号
红色减号
青色叉号

行内用法:行内复选框

:checkbox[默认未选中]
:checkbox[已选中]{checked="true"}
:checkbox[绿色已选中]{checked="true" color="green"}
:checkbox[紫色加号]{checked="true" color="purple" symbol="plus"}
:checkbox[红色减号]{checked="true" color="red" symbol="minus"}
:checkbox[青色叉号]{checked="true" color="cyan" symbol="times"}

行内用法::checkbox[行内复选框]{inline="true" checked="true"}
  • 默认独占一行(块级),添加 inline="true" 可在段落中内联使用
  • :checkboxcheckedtrue 时显示选中态
  • :checkboxsymbol 可选值:plusminustimes
  • color 支持 bluegreenredcyanpurpleorange 等或任意色值

Radio 单选按钮

单选未选中
单选已选中
单选橙色

行内用法:行内单选

:radio[单选未选中]
:radio[单选已选中]{checked="true"}
:radio[单选橙色]{checked="true" color="orange"}

行内用法::radio[行内单选]{inline="true" checked="true"}
  • 默认独占一行(块级),添加 inline="true" 可在段落中内联使用
  • :radiocheckedtrue 时显示选中态
  • color 支持 bluegreenredcyanpurpleorange 等或任意色值

GHCard GitHub 卡片

:::ghcard{type="repo" repo="withastro/astro"}
:::

:::ghcard{type="user" user="octocat" bio="For all time, always."}
:::

:::ghcard{type="user" user="octocat" avatar="false"}
:::
  • typerepo(仓库卡片)或 user(用户卡片)
  • repo:仓库全名,格式为 owner/repotype="repo" 时必填)
  • user:GitHub 用户名(type="user" 时必填)
  • bio:自定义用户简介(可选,仅 user 类型有效)
  • avatarfalse 可隐藏用户头像(可选,仅 user 类型有效)
  • 数据通过 GitHub API 动态获取,自定义 bio 会在加载前作为占位展示

在右侧边栏中使用 GHCard

除了正文,你也可以通过 GhCard 组件把卡片放到页面右侧边栏。在 Astro 页面(如 src/pages/blog/[id].astro)中,向 BaseLayoutright-sidebar slot 传入组件即可:

---
import BaseLayout from '../../layouts/BaseLayout.astro';
import GhCard from '../../components/widgets/GhCard.astro';
---

<BaseLayout ...>
  <div slot="right-sidebar" class="p-4 pt-6">
    <GhCard mode="repo" repo="withastro/astro" />
    <GhCard mode="user" user="octocat" bio="For all time, always." avatar={false} />
  </div>
  <!-- 文章正文 -->
</BaseLayout>

GhCard 组件属性:

属性类型必填说明
mode'repo' | 'user'卡片类型
repostringmode=repo仓库全名 owner/repo
userstringmode=userGitHub 用户名
biostring用户简介(仅 user)
avatarboolean是否显示头像,默认 true(仅 user)

由于数据通过客户端 JS 获取,放在边栏也会自动填充 GitHub API 数据。


Emoji 表情包

今天是开心的一天 aini,代码终于跑通了!OK

Twemoji 风格的表情 1f600 1f389

贴吧表情 huaji bishi

Blobcat 表情 0_0

也可以直接使用默认源(省略 source):aini

自定义高度:party

今天是开心的一天 :emoji[aini]{source="qq"},代码终于跑通了!:emoji[OK]{source="qq"}

Twemoji 风格的表情 :emoji[1f600]{source="twemoji"} :emoji[1f389]{source="twemoji"}

贴吧表情 :emoji[huaji]{source="tieba"} :emoji[bishi]{source="tieba"}

Blobcat 表情 :emoji[0_0]{source="blobcat"}

也可以直接使用默认源(省略 source)::emoji[aini]

自定义高度::emoji[party]{source="blobcat" height="3em"}
  • :emoji 为行内指令,可在段落中直接使用
  • source 表情源,可选值:
    • qq — QQ 表情(GIF 格式)
    • twemoji — Twitter Emoji(SVG 格式)
    • aru — Aru 表情(GIF 格式)
    • tieba — 贴吧表情(PNG 格式)
    • blobcat — Blobcat 表情(GIF 格式)
    • default — 默认表情源(与 qq 相同)
    • 省略 source 时自动使用 default
  • height 自定义表情高度,默认 1.75em
  • 方括号内的内容为表情名称,会替换到 URL 中的 {name} 占位符


数字名片 (yoicard)

文章末尾的”数字名片”,1.75

横版比例,接近实体名片的厚纸质感。支持背景图/色/纹理/渐变、logo、Lucide icon、二维码、自定义字体和颜色。

Alex Chen
Web Developer · Blogger

折腾博客和摄影的开发者 — 记录每一次心动

全图背景
bg-image full

满配

+ 暗化遮罩 + 圆 logo + sparkles icon + 二维码

半图(右)
bg-mode right

图覆盖右半,文字在左侧白底

深色撞色
bg + accent

深底自动反白字 — 衬线名字 + 金色 accent

渐变温暖
warm gradient

文艺感渐变 + 自定义 name 颜色

:::yoicard{name="Alex Chen" role="Web Developer · Blogger"}

折腾博客和摄影的开发者 — *记录每一次心动*

<!-- contact -->

**alex.dev**
alex@example.com
:::

:::yoicard{name="全图背景" role="bg-image full" bg-image="..." bg-overlay="dark" accent="#fbbf24" icon="lucide:sparkles" logo="..." qr="https://alex.dev"}

满配:全图 + 暗化遮罩 + 圆 logo + sparkles icon + 二维码

<!-- contact -->

**alex.dev**
alex@example.com
:::

身份

  • name(必填)
  • role
    /简介(单行)

背景(四选一,优先级 image > gradient > pattern > color)

  • bg
    ,如 #1a3a2e
  • bg-image
    URL/路径
  • bg-pattern:diagonal | dots | grid | grain
  • bg-gradient
    渐变,如 "135deg, #fef3c7, #fed7aa"
  • bg-mode(图专属):full(默认) | left | right
  • bg-overlay(仅 full):dark(默认) | light | none | 自定义颜色

装饰

  • logo
    logo 图(默认圆形)
  • logo-shape:circle(默认) | square | rounded
  • icon
    Iconify 图标,如 lucide:sparkles
  • qr
    (URL),build 时生成 SVG
  • accent
    /icon 颜色

字体

  • font-name
    (完整 font-family 字符串)
  • font-body

配色

  • text:auto(默认按背景反转) | light | dark | #hex
  • name-color / role-color

Slot 写法

  • 开始标签和 <!-- contact --> 之间 = bio(自由 Markdown,以斜体小字呈现)
  • <!-- contact --> 之后 = 联系区,内部用 --- 分左右两栏
  • 不写 <!-- contact --> → 整个 slot 都是 bio
  • 开始标签后直接 <!-- contact --> → 跳过 bio

Video 视频播放器

在文章中插入视频,支持本地视频、Bilibili 和 YouTube 三种模式。本地视频支持画中画(PiP)浮动播放器。

本地视频(带封面)

:::video{src="https://example.com/video.mp4" poster="https://example.com/poster.jpg" ratio="16/9"}
:::
  • src必填):视频文件地址
  • poster:封面图,显示自定义播放按钮覆盖层,点击后播放
  • ratio:宽高比,默认 16/9,可选 4/31/1
  • width:最大宽度,如 width="600px"
  • align:对齐方式,可选 left(默认)、centerright
  • autoplaytrue 自动播放(静音)
  • pip:画中画模式,可选 auto(默认,滚动离开自动触发)、manual(手动触发)、off(关闭)

本地视频(原生 controls)

不指定 poster 时,直接使用原生 <video controls> 播放器。

:::video{src="https://example.com/video.mp4" ratio="16/9"}
:::
  • 不指定 poster 时,使用原生浏览器播放器控件
  • 其他参数与带封面模式相同

本地视频(画中画 auto)

视频播放中向下滚动离开视口时,自动弹出右下角浮动播放器。滚动回原位置时自动恢复。

:::video{src="..." poster="..." ratio="16/9" pip="auto"}
:::
  • pip="auto"(默认):播放中离开视口自动进入画中画
  • 浮动播放器支持拖动、播放/暂停、进度跳转
  • 点击 ↩ 回到原位并恢复播放,点击 × 直接关闭

本地视频(画中画 manual)

不自动触发,鼠标悬停视频右上角显示画中画按钮,点击后手动进入浮动播放。

:::video{src="..." poster="..." ratio="16/9" pip="manual"}
:::
  • pip="manual":鼠标悬停时右上角显示画中画按钮,点击手动触发
  • 适合不希望自动打扰读者的场景

本地视频(居中对齐)

:::video{src="..." poster="..." align="center" width="500px" ratio="4/3"}
:::
  • align="center":视频容器居中对齐
  • width="500px":限制最大宽度
  • ratio="4/3":4
    宽高比

Bilibili

:::video{bilibili="BV17VmcBJEZz"}
:::
  • bilibili必填):B 站 BV 号
  • ratiowidthalign 与本地视频相同
  • 不支持画中画(iframe 内视频无法控制)

YouTube

:::video{youtube="jfKfPfyJRdk"}
:::
  • youtube必填):YouTube 视频 ID
  • autoplaytrue 自动播放(自动静音,符合 YouTube 策略)
  • ratiowidthalign 与本地视频相同
  • 不支持画中画

网站卡片

Sites 网站卡片

:::sites{group="design"}
:::
  • group必填):对应 site-config.tslinks 配置的分组名
  • 数据在 site-config.tslinks 字段中配置
  • 支持封面图、图标、标题、描述和彩色标签
  • 封面图未指定时自动通过截图服务抓取(默认 thumio,可在 site-config.ts 中切换为 mshots

Posters 海报

竖向比例

:::posters{group="movies" cols="6"}
:::

正方形比例

:::posters{group="albums" ratio="square"}
:::
  • group必填):对应 site-config.tslinks 配置的分组名
  • ratio:比例,可选 portrait(竖向 2
    ,默认)或 square(正方形 1
  • cols:固定列数,可选 2 / 3 / 4 / 5 / 6 / 8,不传则自动填充
  • 海报卡片使用 covericon 字段作为封面图
  • 鼠标悬停时显示标题文字
  • 极小间隙的紧凑网格布局

数学公式

支持 LaTeX 语法的数学公式渲染。通过 frontmatter 选择引擎,构建时生成,无需客户端脚本。

行内公式

质能方程 揭示了质量与能量的等价关系。

欧拉公式 被誉为数学中最美的公式。

薛定谔方程 描述了量子系统的演化。

块级公式

麦克斯韦方程组(微分形式):

高斯积分:

傅里叶变换:


在文章 frontmatter 中声明要使用的引擎:

---
mathjax: true
---
---
katex: true
---
配置引擎输出特点
mathjax: trueMathJaxSVG兼容性好,支持几乎所有 LaTeX 宏包
katex: trueKaTeXHTML+CSS体积小、构建快、输出更紧凑
两个都不写原始文本$...$ 保持原样不渲染
两个都写MathJaxSVG优先 MathJax

何时用哪个:

  • 一般公式 → KaTeX(轻量、快速)
  • 复杂公式、AMS 宏包、化学式 → MathJax(兼容性更强)

质能方程 $E = mc^2$ 揭示了质量与能量的等价关系。

欧拉公式 $e^{i\pi} + 1 = 0$ 被誉为数学中最美的公式。

$$
\begin{aligned}
\nabla \cdot \mathbf{E} &= \frac{\rho}{\varepsilon_0} \\
\nabla \cdot \mathbf{B} &= 0 \\
\nabla \times \mathbf{E} &= -\frac{\partial \mathbf{B}}{\partial t} \\
\nabla \times \mathbf{B} &= \mu_0\mathbf{J} + \mu_0\varepsilon_0\frac{\partial \mathbf{E}}{\partial t}
\end{aligned}
$$

$$
\int_{-\infty}^{+\infty} e^{-x^2} \, dx = \sqrt{\pi}
$$
  • 行内公式:单个 $ 包裹,前后留空格
  • 块级公式:$$ 包裹,单独成行
  • 支持 alignedpmatrixbmatrix 等标准 LaTeX 环境

图表可视化

Mermaid 流程图

:::mermaid
flowchart TD
    A[用户访问] --> B{是否登录}
    B -->|是| C[进入首页]
    B -->|否| D[跳转登录页]
    C --> E[浏览文章]
    D --> F[输入账号密码]
    F --> G[验证成功]
    G --> C
:::
  • 支持 Mermaid 所有图表类型:flowchart、sequenceDiagram、gantt、classDiagram 等

ECharts 数据图表

:::echart
{
  "title": { "text": "月度访问量", "left": "center" },
  "tooltip": { "trigger": "axis" },
  "xAxis": {
    "type": "category",
    "data": ["1月", "2月", "3月", "4月", "5月", "6月"]
  },
  "yAxis": { "type": "value" },
  "series": [{
    "data": [820, 932, 901, 934, 1290, 1330],
    "type": "line",
    "smooth": true,
    "areaStyle": {}
  }]
}
:::

:::echart
{
  "title": { "text": "用户来源分布", "left": "center" },
  "tooltip": { "trigger": "item" },
  "series": [{
    "type": "pie",
    "radius": "50%",
    "data": [
      { "value": 1048, "name": "搜索引擎" },
      { "value": 735, "name": "直接访问" },
      { "value": 580, "name": "邮件营销" },
      { "value": 484, "name": "联盟广告" },
      { "value": 300, "name": "视频广告" }
    ]
  }]
}
:::
  • 内容需为合法 JSON,作为 ECharts 的 setOption 配置
  • 支持 height 属性自定义高度,如 :::echart{height="300px"},默认 400px
  • 支持 ECharts 所有图表类型:line、bar、pie、scatter、radar 等

OKR 目标管理

Vergil 主题 2026 Q2

2026 第二季度
整体完成度 43%
O1
提升主题易用性与覆盖度
易用性与覆盖度
正常 33%
KR1
新增 5 个 Markdown 内容指令
当前已实现 plan、okr,待完成 calendar 和 timeline 视图
正常 40%
KR2
文档站点覆盖全部指令用法
每个指令需包含语法说明、示例代码、效果演示
风险 60%
KR3
零配置启动体验优化
简化主题初始化流程,降低新用户上手门槛
滞后 0%
O2
扩大社区影响力
社区影响力
正常 52%
KR1
GitHub Stars 突破 500
通过技术博客和社交媒体持续推广
正常 64%
KR2
发布 3 篇主题使用教程
覆盖安装、自定义、部署全流程
正常 33%
KR3
收集并处理 20 条用户反馈
在 GitHub Issues 中追踪和响应
正常 60%
:::okr{title="Vergil 主题 2026 Q2" period="2026 第二季度"}

## 提升主题易用性与覆盖度

易用性与覆盖度

| key result | target | current | desc | status | link |
| ---------- | ------ | ------- | ---- | ------ | ---- |
| 新增 5 个 Markdown 内容指令 | 5 | 2 | 当前已实现 plan、okr... | 正常 | |
| 文档站点覆盖全部指令用法 | 30 | 18 | 每个指令需包含语法说明... | 风险 | https://github.com/... |
| 零配置启动体验优化 | 1 | 0 | 简化主题初始化流程... | 滞后 | |

## 扩大社区影响力

社区影响力

| key result | target | current | desc | status | link |
| ---------- | ------ | ------- | ---- | ------ | ---- |
| GitHub Stars 突破 500 | 500 | 320 | 通过技术博客和社交媒体推广 | 正常 | |
| 发布 3 篇主题使用教程 | 3 | 1 | 覆盖安装、自定义、部署全流程 | 正常 | https://github.com/... |
| 收集并处理 20 条用户反馈 | 20 | 12 | 在 GitHub Issues 中追踪和响应 | 正常 | |

:::
  • 使用 ## 标题定义 Objective(目标)
  • 每个 O 下方用 Markdown 表格定义 Key Results(关键结果)
  • 表格列:key result(名称)、target(目标值)、current(当前值)
  • 可选列:desc(详细说明)、status(状态:正常/风险/滞后/完成)、link(链接,带链接的 KR 整行可点击)
  • 支持 titleperiod 属性设置 OKR 标题与周期
  • 自动计算每个 KR、每个 O 以及整体完成度并渲染进度条

Calendar 日历

基于农历和法定节假日数据生成的高仿 macOS 日历组件,支持自定义事件、农历、节气、节假日、调休等信息。支持前后月份切换和「今天」快捷跳转。

2026年5月
初十 26日
十一 27日
十二 28日
十三 29日
十四 30日
十五 5月1日
劳动节(休)
劳动节
五一假期开始
劳动节(休)
劳动节
五一假期开始
十六 2日
劳动节(休)
十七 3日
劳动节(休)
十八 4日
劳动节(休)
十九 5日
立夏
补班调休
劳动节(休)
立夏
补班调休
二十 6日
廿一 7日
廿二 8日
廿三 9日
劳动节(班)
劳动节(班)
廿四 10日
廿五 11日
廿六 12日
廿七 13日
廿八 14日
廿九 15日
三十 16日
四月初一 17日
初二 18日
初三 19日
初四 20日
朋友聚会
朋友聚会
初五 21日
小满
小满
初六 22日
初七 23日
初八 24日
初九 25日
Vergil v1.0 发布
初十 26日
十一 27日
十二 28日
十三 29日
十四 30日
十五 31日
十六 6月1日
十七 2日
十八 3日
十九 4日
二十 5日
芒种
芒种
廿一 6日
:::calendar{month="2026-05"}

| date | type | content | color | link |
| ---- | ---- | ------- | ----- | ---- |
| 05-01 | 假期 | 五一假期开始 | red | |
| 05-05 | 工作 | 补班调休 | | |
| 05-20 | 生活 | 朋友聚会 | blue | |
| 05-25 | 项目 | Vergil v1.0 发布 | green | https://github.com/wsjz/vergil-astro-theme |

:::
  • month:指定月份,格式 YYYY-MM。不传则默认当前月份
  • 表格列(全部可选):
    • date:事件日期,支持 MM-DDYYYY-MM-DDD(当月)
    • type:事件类型,相同类型自动分配同一种颜色
    • content:事件文字内容
    • color:指定颜色(bluegreenredpurpleyellowcyanorangepink
    • link:可选链接,带链接的日程显示小箭头图标,点击可跳转
  • 自动功能(无需配置):
    • 农历日期(初一至三十)
    • 二十四节气(立春、雨水、惊蛰…)
    • 法定节假日(春节、国庆等,含连续休假日横条)
    • 调休补班标记(橙色「班」标签)
    • 传统节日(儿童节、建党节等)

Plan 任务计划

多视图数据指令,支持看板、列表、表格、时间轴、里程碑、进度、艾宾浩斯复习七种视图。数据通过 Markdown 表格输入,构建时静态渲染,视图切换使用纯 CSS :target

表头支持 name:type 格式声明列类型,不写 :type 时默认为 text

项目开发计划

待办 (1)
todo
进行中 (1)
doing
已完成 (2)
done
done
done
done
doing
todo
全部
done
doing
todo
全部
P0
P1
全部
Alice
Bob
Carol
Dave
状态任务优先级截止日期负责人完成度
需求分析● P02024-01-01Alice
100%
技术选型● P12024-01-10Bob
100%
前端开发● P02024-02-01Carol
65%
测试验收● P02024-03-10Dave
0%
:::plan{title="项目开发计划" views="board,list,table,timeline,milestone,progress" default="board" filters="状态,优先级,负责人"}

| 状态:status | 任务:text | 优先级:priority | 截止日期:date | 负责人:text | 完成度:progress |
|-------------|-----------|-----------------|---------------|-------------|-----------------|
| done        | 需求分析  | P0              | 2024-01-01    | Alice       | 100%            |
| done        | 技术选型  | P1              | 2024-01-10    | Bob         | 100%            |
| doing       | 前端开发  | P0              | 2024-02-01    | Carol       | 65%             |
| todo        | 测试验收  | P0              | 2024-03-10    | Dave        | 0%              |

:::
  • title:顶部标题
  • views:启用的视图,逗号分隔。默认 board,list,table,timeline,milestone,progress,ebbinghaus
  • default:默认显示的视图
  • filters:Table 视图的筛选列,逗号分隔(如 filters="状态,优先级")。不写则无筛选下拉,仅保留搜索框。写 filters="none" 显式关闭筛选

列类型:表头用 name:type 格式,支持的类型有 textstatusprioritydateprogressnumber(千分位格式化,Notion 风格标签)、checkboxselectlink。不写 :type 时默认 text

列映射属性

  • dateCol — timeline/milestone 使用的日期列
  • startDate / endDate — timeline 范围模式,指定后渲染为时间条
  • progressCol — progress 视图使用的进度列
  • statusCol — board/list/timeline 使用的状态列
  • titleCol — 指定标题列
  • ownerCol — board/list/milestone 使用的负责人列
  • priorityCol — board/list/milestone/progress 使用的优先级列
  • descCol — milestone 使用的描述列

视图所需列

视图所需列说明
table永远可渲染
list永远可渲染
board永远可渲染,默认按第一列分组
timelinedateColstartDateendDate单点模式显示圆点,范围模式显示条
milestonedateCol只支持单点模式
progressprogressCol必须显式指定进度列
ebbinghausdateCol艾宾浩斯复习计划,自动计算复习节点

© 本文著作权归作者所有,转载请注明出处。

Miki
Miki
未知标题
00:00
00:00
播放列表