<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh_CN">
  <title>Lambent&apos;s Blog</title>
  <subtitle>基于 Shirone 的轻量化博客系统</subtitle>
  <link href="https://tncloud.fun/" rel="alternate" type="text/html"/>
  <link href="https://tncloud.fun/atom.xml" rel="self" type="application/atom+xml"/>
  <id>https://tncloud.fun/</id>
  <updated>2026-08-29T00:00:00.000Z</updated>
  <entry>
    <title>Shirone 编写与使用指南</title>
    <link href="https://tncloud.fun/posts/guide/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/guide/</id>
    <published>2026-08-26T00:00:00.000Z</published>
    <updated>2026-08-26T00:00:00.000Z</updated>
    <summary>全面介绍 Shirone 的文章编写、Frontmatter schema、Markdown 扩展、加密和媒体功能。</summary>
    <content type="html"><![CDATA[<p>欢迎使用 <strong>Shirone</strong>（白音）——一款以 <strong>Astro 7</strong>、<strong>Svelte 5</strong> 和 <strong>Material 3 Expressive (M3E)</strong> 设计系统为基础打造、富有表现力且受动画风格启发的博客主题。</p>
<p>本指南将介绍文章创建、Frontmatter 规范、目录结构，以及完整的内置 Markdown 和 MDX 扩展。</p>
<p>:::tip
Shirone 优先在服务器端渲染内容（SSR-first）。在站内导航时，Swup 会无缝替换主容器，同时保留外层应用框架和持续播放的音乐。
:::</p>
<hr />
<h2>1. 创建新文章</h2>
<p>使用内置 CLI 命令即可快速生成带有标准 Frontmatter 的新文章骨架：</p>
<pre><code># 创建单文件文章
pnpm new-post my-first-post

# 或在子目录中创建文章
pnpm new-post guides/getting-started
</code></pre>
<p>新文件会放在 <code>src/content/posts/</code> 中。</p>
<hr />
<h2>2. Frontmatter 规范</h2>
<p>每篇 Markdown（<code>.md</code>）或 MDX（<code>.mdx</code>）文章都以 YAML Frontmatter 块开头，用于定义元数据。</p>
<h3>示例</h3>
<pre><code>---
title: "探索 Material 3 Expressive 设计"
published: 2026-08-26
updated: 2026-08-27
publishedAt: 2026-08-26T10:00:00+08:00
updatedAt: 2026-08-27T09:30:00+08:00
pinned: true
description: "深入了解 Shirone 中的动态 HCT 色彩科学和流畅过渡效果。"
image: "./cover.webp"
tags: [M3E, 设计, 前端]
category: 指南
draft: false
comment: true
---
</code></pre>
<h3>支持的 Frontmatter 字段</h3>
<table>
<thead>
<tr>
<th>字段</th>
<th>类型</th>
<th>必填</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>title</code></td>
<td><code>string</code></td>
<td><strong>Yes</strong></td>
<td>文章的主标题。</td>
</tr>
<tr>
<td><code>published</code></td>
<td><code>Date</code></td>
<td><strong>Yes</strong></td>
<td><code>YYYY-MM-DD</code> 格式的发布日期。</td>
</tr>
<tr>
<td><code>publishedAt</code></td>
<td><code>Date</code></td>
<td>No</td>
<td>用于排列同一天发布的文章的精确发布时间。按配置的站点时区计算后，日期必须与 <code>published</code> 相同。</td>
</tr>
<tr>
<td><code>updated</code></td>
<td><code>Date</code></td>
<td>No</td>
<td>最后更新日期。填写后会显示更新提示徽标。</td>
</tr>
<tr>
<td><code>updatedAt</code></td>
<td><code>Date</code></td>
<td>No</td>
<td>Feed 和机器可读元数据使用的精确更新时间。必须与 <code>updated</code> 一起填写。</td>
</tr>
<tr>
<td><code>pinned</code></td>
<td><code>boolean</code></td>
<td>No</td>
<td>将文章置顶显示在文章列表顶部（默认值：<code>false</code>）。</td>
</tr>
<tr>
<td><code>description</code></td>
<td><code>string</code></td>
<td>No</td>
<td>显示在文章卡片、搜索结果和 OpenGraph 元数据中的文章摘要。</td>
</tr>
<tr>
<td><code>image</code></td>
<td><code>string</code></td>
<td>No</td>
<td>封面图片路径。支持相对路径（<code>./cover.webp</code>）、公共路径（<code>/images/cover.jpg</code>）或远程 URL。</td>
</tr>
<tr>
<td><code>tags</code></td>
<td><code>string[]</code></td>
<td>No</td>
<td>用于分类筛选和标签云的标签名称数组。</td>
</tr>
<tr>
<td><code>category</code></td>
<td><code>string</code></td>
<td>No</td>
<td>用于分类索引的主要分类名称。</td>
</tr>
<tr>
<td><code>draft</code></td>
<td><code>boolean</code></td>
<td>No</td>
<td>将文章标记为草稿。生产构建时会隐藏草稿文章（<code>pnpm build</code>）。</td>
</tr>
<tr>
<td><code>comment</code></td>
<td><code>boolean</code></td>
<td>No</td>
<td>为当前文章启用或禁用评论区（默认值：<code>true</code>）。</td>
</tr>
<tr>
<td><code>lang</code></td>
<td><code>string</code></td>
<td>No</td>
<td>语言代码（如 <code>en</code>、<code>zh_CN</code>、<code>ja</code>），仅在与站点默认语言不同时填写。</td>
</tr>
</tbody>
</table>
<hr />
<h2>3. 文章加密</h2>
<p>Shirone 提供客户端文章加密。这是一种静态密码门禁，并非服务器端访问控制：加密载荷和资源 URL 仍可公开下载，因此不要用它保护真正机密的文件或受监管的信息。若要限制日记或文章的访问，请在 Frontmatter 中设置密码：</p>
<pre><code>---
title: "私人研究笔记"
published: 2026-08-26
encrypted: true
password: "your-secret-passphrase"
passwordHint: "最喜欢的动画角色"
hideHomeContent: true
---
</code></pre>
<ul>
<li><code>encrypted</code>：设为 <code>true</code> 以启用加密；</li>
<li><code>password</code>：解锁文章所需的密码字符串或数字；</li>
<li><code>passwordHint</code>：显示在密码输入框上方的可选提示；</li>
<li><code>hideHomeContent</code>：在首页隐藏字数和内容预览，避免信息泄露。</li>
</ul>
<hr />
<h2>4. 组织文章文件</h2>
<p>Shirone 同时支持文章与资源共置于文件夹中，以及单文件布局：</p>
<h3>文件夹结构（推荐用于本地资源）</h3>
<p>将文章与媒体文件放在一起，可以简化资源管理：</p>
<pre><code>src/content/posts/
├── my-great-post/
│   ├── index.md           &lt;-- 文章内容
│   ├── cover.webp         &lt;-- 封面图片（image: "./cover.webp"）
│   └── diagram.png        &lt;-- Markdown 中引用的插图
</code></pre>
<h3>单文件结构（适用于简短文章）</h3>
<pre><code>src/content/posts/
├── hello-world.md
└── quick-thoughts.md
</code></pre>
<hr />
<h2>5. 丰富的 Markdown 和 MDX 扩展</h2>
<p>Shirone 开箱即用地集成了多种现代 Markdown 扩展：</p>
<h3>5.1 提示容器</h3>
<p>使用容器指令添加说明、提示、警告和提醒：</p>
<pre><code>:::tip
使用提示容器突出重点结论或最佳实践。
:::

:::warning
使用警告容器说明潜在问题或不兼容变更。
:::
</code></pre>
<h3>5.2 GitHub 仓库卡片</h3>
<p>使用指令语法嵌入实时更新、样式精美的 GitHub 仓库卡片：</p>
<pre><code>::github{repo="LyraVoid/Shirone"}
</code></pre>
<p>::github{repo="LyraVoid/Shirone"}</p>
<h3>5.3 Expressive Code 代码块</h3>
<p>增强型代码块支持语法高亮、文件名徽标、行号和指定行高亮：</p>
<pre><code>// 动态派生 HCT 颜色令牌
import { argbFromHex, themeFromSourceColor } from "@material/material-color-utilities";

const theme = themeFromSourceColor(argbFromHex("#f472b6"));
console.log("主色令牌：", theme.schemes.light.primary);
</code></pre>
<h3>5.4 数学公式排版（KaTeX）</h3>
<p>直接在 Markdown 中渲染优雅的 LaTeX 数学公式：</p>
<ul>
<li><strong>行内公式</strong>：$E = mc^2$ 或欧拉公式 $e^{i\pi} + 1 = 0$。</li>
<li><strong>块级公式</strong>：</li>
</ul>
<p>$$
\int_{-\infty}^{\infty} e^{-x^2} , dx = \sqrt{\pi}
$$</p>
<h3>5.5 Mermaid 图表</h3>
<p>使用纯文本创建流程图、时序图和架构图：</p>
<pre><code>sequenceDiagram
    autonumber
    actor Visitor as 访客
    participant Page as Shirone 页面
    participant Swup as Swup 容器
    participant Audio as 持久化外壳

    Visitor-&gt;&gt;Page: 点击导航链接
    Page-&gt;&gt;Swup: 触发无缝切换
    Swup-&gt;&gt;Page: 替换 #swup-container
    Note over Audio: 背景音乐持续播放
    Page--&gt;&gt;Visitor: 新页面已渲染
</code></pre>
<h3>5.6 图片画廊与 Fancybox 灯箱</h3>
<p>图片会自动集成 Fancybox，支持无损缩放、平移手势和全屏预览：</p>
<pre><code>![Cover preview](./cover.jpeg)
</code></pre>
<hr />
<h2>6. 后续步骤与自定义</h2>
<ul>
<li><strong>站点配置</strong>：在 <code>src/config/siteConfig.ts</code> 和 <a href="https://github.com/LyraVoid/Shirone/blob/main/src/config/README.md"><code>src/config/README.md</code></a> 中了解全局设置。</li>
<li><strong>设计令牌</strong>：在 <code>DESIGN.md</code> 和 <code>docs/m3e-standard.md</code> 中了解设计令牌和配色方案。</li>
<li><strong>反馈与社区</strong>：在 <a href="https://github.com/LyraVoid/Shirone/issues">GitHub Issues</a> 分享想法并提出问题。</li>
</ul>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="指南"/>
  </entry>
  <entry>
    <title>🔒 文章密码保护与加密演示</title>
    <link href="https://tncloud.fun/posts/encrypted-demo/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/encrypted-demo/</id>
    <published>2026-08-20T00:00:00.000Z</published>
    <updated>2026-08-20T00:00:00.000Z</updated>
    <summary>该文章内容已加密，请输入密码后查看。</summary>
    <content type="html"><![CDATA[<p><em>🔒 本文已加密保护，请访问博客网站输入密码阅读全文。</em></p>]]></content>
    <author><name>やわらかな光</name></author>
    <category term="示例"/>
  </entry>
  <entry>
    <title>Shirone Markdown 扩展功能</title>
    <link href="https://tncloud.fun/posts/markdown-enhancements/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/markdown-enhancements/</id>
    <published>2026-08-19T00:00:00.000Z</published>
    <updated>2026-08-19T00:00:00.000Z</updated>
    <summary>了解 Shirone 的自定义 Markdown 扩展、丰富组件和编写语法。</summary>
    <content type="html"><![CDATA[<p>Shirone 提供了一系列主题专属的 Markdown 扩展和自定义语法容器。这些扩展基于原生 unified AST 处理流程构建，会在站点构建期间渲染为语义清晰、易于访问的 HTML，<strong>不会产生客户端 JavaScript hydration 开销</strong>，并且<strong>完全遵循 M3E 设计令牌</strong>。</p>
<h2>文件树</h2>
<p>文件树可以将多层项目结构、源码层级和终端目录输出转换为紧凑的交互式树形视图，并自动提供扩展名图标、差异高亮和可折叠分支。</p>
<h3>1. 嵌套列表语法（<code>:::file-tree</code>）</h3>
<p>如果要直接使用 Markdown 嵌套列表书写文件层级，请使用 <code>:::file-tree</code> 块级指令。</p>
<pre><code>:::file-tree{title="Shirone 源码目录"}
- src
  - components/
    - ++ Navigation.svelte # 新增组件
    - -- Button.astro # 已移除组件
  - content
    - posts/
      - markdown-enhancements.md
  - layouts/
    - PostLayout.astro
  - plugins
    - markdown/
      - rehype-file-tree.mjs
  - styles
    - markdown/
      - trees.css
  - **content.config.ts** # 重要文件
- public/
  - favicon.svg
- package.json
:::
</code></pre>
<p>:::file-tree{title="Shirone 源码目录"}</p>
<ul>
<li>src
<ul>
<li>components/
<ul>
<li>++ Navigation.svelte # 新增组件</li>
<li>-- Button.astro # 已移除组件</li>
</ul>
</li>
<li>content
<ul>
<li>posts/
<ul>
<li>markdown-enhancements.md</li>
</ul>
</li>
</ul>
</li>
<li>layouts/
<ul>
<li>PostLayout.astro</li>
</ul>
</li>
<li>plugins
<ul>
<li>markdown/
<ul>
<li>rehype-file-tree.mjs</li>
</ul>
</li>
</ul>
</li>
<li>styles
<ul>
<li>markdown/
<ul>
<li>trees.css</li>
</ul>
</li>
</ul>
</li>
<li><strong>content.config.ts</strong> # 重要文件</li>
</ul>
</li>
<li>public/
<ul>
<li>favicon.svg</li>
</ul>
</li>
<li>package.json
:::</li>
</ul>
<h4>编写规则与标记</h4>
<ul>
<li><strong>差异状态</strong>：在条目前加上 <code>++</code>（绿色背景和徽标）或 <code>--</code>（红色背景和删除线），即可突出变更。</li>
<li><strong>注释</strong>：<code>#</code> 后的文本会作为弱化、右对齐的行内注释显示。</li>
<li><strong>强调</strong>：用 <code>**粗体**</code> 包裹名称，即可突出显示重要文件。</li>
<li><strong>可折叠文件夹</strong>：根据嵌套列表推断出的目录默认展开。添加尾随斜杠（如 <code>components/</code>）即可创建默认折叠的目录，读者可以点击或使用键盘导航展开。</li>
</ul>
<hr />
<h3>2. 终端输出语法（<code>```file-tree</code>）</h3>
<p>如果已使用 <code>tree</code> 等命令行工具生成目录树文本，可直接将其粘贴到 <code>file-tree</code> 围栏代码块中。Unicode 分支字符（<code>├──</code>、<code>└──</code>、<code>│</code>）和 ASCII 分支都会自动解析。</p>
<pre><code>```file-tree title="构建输出" icon="simple"
dist
├── _astro/
│   ├── index.css
│   └── page.js
└── favicon.ico
```
</code></pre>
<pre><code>dist
├── _astro/
│   ├── index.css
│   └── page.js
└── favicon.ico
</code></pre>
<h4>配置选项</h4>
<ul>
<li><code>title="string"</code>：设置自定义树标题和无障碍标签。</li>
<li><code>icon="colored" | "simple"</code>：选择多色扩展名图标（默认 <code>colored</code>）或简约单色图标（<code>simple</code>）。</li>
</ul>
<hr />
<h2>代码树</h2>
<p>交互式代码树在左侧提供多层文件导航，并可在右侧即时切换代码面板。对于多文件示例、模块或完整目录讲解，它能带来类似 IDE 的阅读体验。</p>
<h3>1. 容器语法（<code>:::code-tree</code>）</h3>
<p>在 <code>:::code-tree</code> 块级指令中组合多个围栏代码块。每个代码块都通过 <code>title="path/to/file"</code> 指定文件路径。</p>
<pre><code>:::code-tree{title="Shirone 组件示例" height="380px" entry="src/Button.svelte"}
```svelte title="src/Button.svelte"
&lt;script lang="ts"&gt;
  let { label = "点击我" } = $props();
&lt;/script&gt;

&lt;button class="m3-btn"&gt;{label}&lt;/button&gt;
```

```stylus title="src/styles/button.styl"
.m3-btn
  background: var(--primary)
  color: var(--on-primary)
  border-radius: var(--shape-corner-m)
```

```json title="package.json"
{
  "name": "button-demo",
  "version": "1.0.0"
}
```
:::
</code></pre>
<p>:::code-tree{title="Shirone Component Demo" height="380px" entry="src/Button.svelte"}</p>
<pre><code>&lt;script lang="ts"&gt;
  let { label = "Click me" } = $props();
&lt;/script&gt;

&lt;button class="m3-btn"&gt;{label}&lt;/button&gt;
</code></pre>
<pre><code>.m3-btn
  background: var(--primary)
  color: var(--on-primary)
  border-radius: var(--shape-corner-m)
</code></pre>
<pre><code>{
  "name": "button-demo",
  "version": "1.0.0"
}
</code></pre>
<p>:::</p>
<h4>配置与标记</h4>
<ul>
<li><code>title="string"</code>：设置代码树的标题和无障碍标签。</li>
<li><code>height="string"</code>：设置桌面视图的高度（默认 <code>420px</code>，例如 <code>380px</code>、<code>26rem</code>）。</li>
<li><code>entry="filepath"</code>：指定首次加载时激活的文件。</li>
<li><code>icon="colored" | "simple"</code>：在彩色文件图标和简约单色图标之间切换。</li>
<li><code>:active</code>：在任意围栏代码块上添加 <code>:active</code>，将其设为默认激活的选项卡。</li>
</ul>
<hr />
<h3>2. 本地目录自动导入（<code>@[code-tree]</code>）</h3>
<p>直接指定工作区中的本地目录路径，即可在构建时自动扫描并生成交互式代码树，无需手动复制文件内容。</p>
<pre><code>@[code-tree title="动画工具" entry="status.ts"](/src/utils/anime)
</code></pre>
<p>@<a href="/src/config">code-tree title="站点配置" entry="siteConfig.ts"</a></p>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="指南"/>
  </entry>
  <entry>
    <title>Audio Reader：日系动画神秘语音集</title>
    <link href="https://tncloud.fun/posts/audio-reader/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/audio-reader/</id>
    <published>2026-08-29T00:00:00.000Z</published>
    <updated>2026-08-29T00:00:00.000Z</updated>
    <summary>使用 Audio Reader 按需播放一组神秘的日语动画语音片段。</summary>
    <content type="html"><![CDATA[<p>这些简短的日语语音片段，仿佛从动画场景的一角拾取而来：俏皮的呼唤、明快的问候、轻轻的笑声，以及几句出处不明的话语。它们是用于营造氛围的声音片段，并非台词转录，不妨让声音本身传达情绪。</p>
<p>在你选择收听之前，Audio Reader 不会加载这些片段。点击每个语音按钮后，才会加载并播放对应音频。</p>
<pre><code>:audio-reader[音频标题]{src="/assets/audio/filename.wav"}
</code></pre>
<h2>语音片段</h2>
<ul>
<li><strong>Baka</strong>: :audio-reader[バカ]{src="/assets/audio/Baka.wav"}</li>
<li><strong>Ciallo</strong>: :audio-reader[Ciallo！！]{src="/assets/audio/Ciallo.wav"}</li>
<li><strong>Ehe</strong>: :audio-reader[开玩笑的语气]{src="/assets/audio/Ehe.wav"}</li>
<li><strong>Imoi</strong>: :audio-reader[イモい]{src="/assets/audio/Imoi.wav"}</li>
<li><strong>Zako</strong>: :audio-reader[雑魚じゃん、雑魚雑魚]{src="/assets/audio/Zako.wav"}</li>
</ul>
<p><code>src</code> 必须使用站点根路径或 HTTPS URL，指令标签也不能为空。无效或不完整的指令会保留为普通 Markdown，且不会加载 Audio Reader 资源。</p>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="示例"/>
  </entry>
  <entry>
    <title>Markdown 折叠面板</title>
    <link href="https://tncloud.fun/posts/collapse-panels/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/collapse-panels/</id>
    <published>2026-08-28T00:00:00.000Z</published>
    <updated>2026-08-28T00:00:00.000Z</updated>
    <summary>将可选的 Markdown 内容收纳到紧凑、易访问的 M3E 折叠面板中。</summary>
    <content type="html"><![CDATA[<p>折叠面板可以将相关的可选详情收纳在一起。标题和正文均支持 Markdown 行内语法与块级语法；借助浏览器原生的折叠语义，无需客户端 JavaScript 也能使用。</p>
<h2>独立面板</h2>
<p>默认情况下，各面板可以独立展开。标题前加上 <code>:+</code> 可让该面板初始展开；当分组使用 <code>expand</code> 时，标题前加上 <code>:-</code> 可让该面板保持收起。</p>
<p>::: collapse</p>
<ul>
<li>
<p><strong>软件包要求</strong></p>
<p>请使用 Node.js 22 或更高版本，并在安装软件包前启用 Corepack。</p>
</li>
<li>
<p>:+ 安装依赖</p>
<p>在仓库根目录运行工作区的软件包命令。</p>
<pre><code>pnpm.cmd install
</code></pre>
</li>
<li>
<p>验证命令</p>
<p>构建生产版本前，先检查内容处理流程。</p>
<ul>
<li><code>pnpm.cmd check:manifest</code></li>
<li><code>npx.cmd astro check</code>
:::</li>
</ul>
</li>
</ul>
<h2>手风琴模式</h2>
<p>如果希望一次只展开一个答案，请添加 <code>accordion</code>。浏览器会直接对原生折叠区域进行分组，因此展开另一个面板时，前一个会自动收起，无需进行 hydration。</p>
<p>::: collapse accordion expand</p>
<ul>
<li>
<p>这里的 <code>expand</code> 有什么作用？</p>
<p>如果没有面板使用 <code>:+</code> 标记，它会让第一个面板在初始状态下展开。</p>
</li>
<li>
<p>标题中可以使用 Markdown 吗？</p>
<p>可以。标题支持行内 <strong>强调</strong> 和 <code>code</code>，面板正文则支持完整的块级 Markdown。</p>
</li>
<li>
<p>窄屏上会怎样显示？</p>
<p>内容边距会缩小，长文本会自动换行，嵌入的代码也会保留独立的水平滚动区域。
:::</p>
</li>
</ul>
<h2>编写语法</h2>
<pre><code>::: collapse accordion
- :+ 第一个标题

  第一个面板的内容。

- 带有 `code` 的第二个标题

  第二个面板的内容。
:::
</code></pre>
<p>容器中必须恰好包含一个顶层无序列表。每个列表项都需要包含标题段落、一个空行和正文内容。无效或混杂的输入会保留为普通且可读的 Markdown 列表。</p>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="指南"/>
  </entry>
  <entry>
    <title>Markdown 缩写词</title>
    <link href="https://tncloud.fun/posts/markdown-abbreviations/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/markdown-abbreviations/</id>
    <published>2026-08-28T00:00:00.000Z</published>
    <updated>2026-08-28T00:00:00.000Z</updated>
    <summary>一次性定义常见缩写，并在文章中随时查看其完整含义。</summary>
    <content type="html"><![CDATA[<p>缩写词可以让技术文章更加简洁，同时也为有需要的读者保留完整释义。定义后的术语会渲染为原生 <code>abbr</code> 元素，读者将鼠标悬停其上或使用辅助技术时，都可以查看释义。</p>
<h2>正文示例</h2>
<p>SSR 优先的输出方式可以确保 JavaScript 运行前，初始文档就已可见。评估阅读体验时，LCP 和 CLS 可以反映首屏内容是否快速呈现且保持稳定。</p>
<p>缩写词也可以出现在普通 Markdown 内容中，例如 <strong>SSR</strong> 相关说明；但代码字面量（如 <code>SSR</code>）和链接（如 <a href="https://web.dev/articles/lcp">LCP 文档</a>）不会受到影响。</p>
<h2>定义术语</h2>
<p>定义可以放在同一 Markdown 文档的任意位置。定义本身不会显示为段落，只有本文中匹配的术语才会应用语义化缩写效果。</p>
<pre><code>*[SSR]: Server-Side Rendering
*[LCP]: Largest Contentful Paint
*[CLS]: Cumulative Layout Shift

SSR 会在客户端代码运行前提供 HTML 响应。
</code></pre>
<p>*[SSR]: Server-Side Rendering
*[LCP]: Largest Contentful Paint
*[CLS]: Cumulative Layout Shift</p>
<h2>编写规则</h2>
<p>术语必须以字母或数字开头，后续可以包含字母、数字、句点、下划线、加号和连字符。每条定义仅对当前文章生效；无效或重复的定义会保留为普通 Markdown，不会悄悄覆盖已有术语。</p>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="指南"/>
  </entry>
  <entry>
    <title>Markdown 文件包含</title>
    <link href="https://tncloud.fun/posts/markdown-includes/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/markdown-includes/</id>
    <published>2026-08-28T00:00:00.000Z</published>
    <updated>2026-08-28T00:00:00.000Z</updated>
    <summary>在构建时包含 Markdown 文件或其部分内容。</summary>
    <content type="html"><![CDATA[<p>Shirone 可以包含本地 Markdown 文件，或安全地截取其中一部分。</p>
<p>&lt;!-- @include: src/content/snippets/include-example.md#public-api --&gt;</p>
<p>同时也支持包含整个文件和指定行范围：</p>
<pre><code>&lt;!-- @include: src/content/snippets/include-example.md --&gt;
&lt;!-- @include: src/content/snippets/include-example.md{1-4} --&gt;
&lt;!-- @include: src/content/snippets/include-example.md{5-} --&gt;
&lt;!-- @include: src/content/snippets/include-example.md{-4} --&gt;
</code></pre>
<p>围栏代码中的包含注释会保持原样。</p>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="指南"/>
  </entry>
  <entry>
    <title>Markdown 标记高亮</title>
    <link href="https://tncloud.fun/posts/marker-highlights/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/marker-highlights/</id>
    <published>2026-08-28T00:00:00.000Z</published>
    <updated>2026-08-28T00:00:00.000Z</updated>
    <summary>在 Shirone Markdown 中使用基于设计令牌的标记语法突出关键词句。</summary>
    <content type="html"><![CDATA[<p>标记高亮可以突出某个短语，而无需将整段内容变成独立组件。构建时，它们会被渲染为原生 <code>&lt;mark&gt;</code> 元素，并继承当前启用的 M3E 配色系统。</p>
<h2>默认强调</h2>
<p>如果希望使用文章的主色来突出内容，请使用 <code>==text==</code>。例如，在普通段落中突出 ==读者应当记住的一项决定==。</p>
<p>如果需要更明显的层级，标记中也可以嵌套 ==<strong>Markdown 强调语法</strong>==。</p>
<h2>语义颜色</h2>
<p>如果需要表达不同的语义色调，可以添加后缀。可用变体包括 <code>primary</code>、<code>secondary</code>、<code>tertiary</code>、<code>error</code> 和 <code>tip</code>。</p>
<ul>
<li>==Primary 将短语与当前主题色关联起来=={.primary}</li>
<li>==Secondary 以较柔和的方式表达补充区分=={.secondary}</li>
<li>==Tertiary 添加另一种编辑提示色=={.tertiary}</li>
<li>==Error 标记需要修正的情况=={.error}</li>
<li>==Tip 突出实用建议=={.tip}</li>
</ul>
<h2>编写语法</h2>
<pre><code>==Primary marker==

==Secondary marker=={.secondary}
==Tertiary marker=={.tertiary}
==Error marker=={.error}
==Tip marker=={.tip}
</code></pre>
<p>行内代码（如 <code>==标记语法示例==</code>）和围栏代码示例会保持原样，因此文档可以讲解语法而不会实际触发高亮。</p>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="指南"/>
  </entry>
  <entry>
    <title>Markdown 选项组</title>
    <link href="https://tncloud.fun/posts/option-groups/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/option-groups/</id>
    <published>2026-08-28T00:00:00.000Z</published>
    <updated>2026-08-28T00:00:00.000Z</updated>
    <summary>使用紧凑且可同步的 M3E 选项组展示相关 Markdown 方案。</summary>
    <content type="html"><![CDATA[<p>选项组可以将功能相同的说明放在一起，而不必重复周围的解释。每个选项都支持完整的块级 Markdown；所选值也可以与同一页面上的其他选项组同步。</p>
<h2>选择包管理器</h2>
<p>使用 <code>@tab:active</code> 指定初始选项。标题后的 <code>#</code> 后缀可以设置稳定的值，同时不影响显示标题。</p>
<p>::: tabs#package-manager</p>
<p>@tab npm</p>
<p>使用 npm 安装软件包：</p>
<pre><code>npm install astro
</code></pre>
<p>@tab:active <strong>pnpm</strong>#pnpm</p>
<p>使用 pnpm 安装软件包：</p>
<pre><code>pnpm.cmd add astro
</code></pre>
<p>@tab Bun#bun</p>
<p>使用 Bun 安装软件包：</p>
<pre><code>bun add astro
</code></pre>
<p>:::</p>
<h2>运行项目</h2>
<p>此选项组使用 <code>package-manager</code> ID。选择上方的选项后，下方对应的命令也会更新，并且系统会记住该选择，供下次访问时使用。</p>
<p>::: tabs#package-manager</p>
<p>@tab npm</p>
<pre><code>npm run dev
</code></pre>
<p>@tab pnpm</p>
<pre><code>pnpm.cmd dev
</code></pre>
<p>@tab Bun#bun</p>
<pre><code>bun run dev
</code></pre>
<p>:::</p>
<h2>多个备选项</h2>
<p>较长的选项标题会保持在同一行，并在窄屏上于自身导航区域内滚动。</p>
<p>::: tabs</p>
<p>@tab 本地工作站</p>
<p>开发功能时使用本地工具链。</p>
<p>@tab 托管预览环境</p>
<p>发布临时预览版本以供审核。</p>
<p>@tab 持续集成</p>
<p>对每项变更执行稳定、可重复的验证。</p>
<p>@tab 生产环境部署</p>
<p>将已验证的构建产物部署到生产环境。</p>
<p>@tab 离线恢复流程</p>
<p>网络不可用时，从本地构建产物恢复。</p>
<p>:::</p>
<h2>编写语法</h2>
<pre><code>::: tabs#package-manager

@tab npm

在此填写 npm 相关说明。

@tab:active **pnpm**#pnpm

在此填写 pnpm 相关说明。

:::
</code></pre>
<p>每个选项组至少需要两个 <code>@tab</code> 区块，并且每个区块的标记与正文之间都需要有一个空行。无效或不完整的选项组会保留为可读的普通 Markdown。</p>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="指南"/>
  </entry>
  <entry>
    <title>Markdown 剧透内容</title>
    <link href="https://tncloud.fun/posts/spoilers/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/spoilers/</id>
    <published>2026-08-28T00:00:00.000Z</published>
    <updated>2026-08-28T00:00:00.000Z</updated>
    <summary>在 Shirone Markdown 中隐藏行内答案，同时确保剧透内容仍可访问。</summary>
    <content type="html"><![CDATA[<p>剧透语法可以隐藏简短答案或剧情细节，但不会将其从文档中移除。将鼠标悬停在原生控件上、聚焦控件或激活控件，即可显示内容。</p>
<h2>行内详情</h2>
<p>答案是 :spoiler[<strong>42</strong>]，周围的句子仍然是普通 Markdown。</p>
<p>剧透内容也可以包含 <code>行内代码</code>，例如 :spoiler[带有 <strong>强调</strong> 的较长细节]。</p>
<h2>编写语法</h2>
<pre><code>答案是 :spoiler[42]。
</code></pre>
<p>生成的 HTML 使用带有 <code>aria-expanded</code> 状态的原生按钮。即使没有 JavaScript，鼠标悬停和键盘聚焦仍可显示文本；可选运行时则会添加点击和键盘切换功能。</p>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="指南"/>
  </entry>
  <entry>
    <title>Markdown 提示容器</title>
    <link href="https://tncloud.fun/posts/admonitions/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/admonitions/</id>
    <published>2026-08-27T00:00:00.000Z</published>
    <updated>2026-08-27T00:00:00.000Z</updated>
    <summary>使用 Shirone 的 M3E Markdown 容器呈现说明、警告和可选详情。</summary>
    <content type="html"><![CDATA[<p>提示容器可以在不打断文章阅读节奏的前提下，突出显示补充信息。所有形式都会在服务器端渲染，并使用统一、紧凑的 M3E 组件。</p>
<h2>语义变体</h2>
<p>::: note 部署说明
带空格的写法支持普通自定义标题，同时兼容原有语法。
:::</p>
<p>:::info
使用信息块补充中性背景，帮助读者理解当前章节。
:::</p>
<p>:::tip[现有的 <strong>标签</strong> 写法]
原有的方括号标签写法仍然可用，其中也可以包含 Markdown 行内强调。
:::</p>
<blockquote>
<p>[!IMPORTANT]
GitHub Alert 语法也会进入同一渲染流程，因此现有文章仍能保持统一的视觉风格。</p>
</blockquote>
<p>:::warning
运行生产构建前，请检查环境变量。
:::</p>
<p>:::caution
请勿在示例中发布凭据、本地配置或私钥。
:::</p>
<h2>可选详情</h2>
<p>::: details 查看完整命令
此折叠区域使用浏览器原生语义，即使没有客户端 JavaScript，也可以通过键盘访问。</p>
<pre><code>npx.cmd astro check
pnpm.cmd build
</code></pre>
<ul>
<li>默认处于收起状态。</li>
<li>较长的代码可以在代码块内部滚动。</li>
<li>在窄屏上，容器宽度仍不会超出文章区域。
:::</li>
</ul>
<h2>编写语法</h2>
<pre><code>:::note[现有标题写法]
容器内容
:::

::: warning 兼容 Plume 的标题写法
容器内容
:::

&gt; [!TIP]
&gt; GitHub Alert 写法

::: details 可选内容
读者展开后显示。
:::
</code></pre>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="指南"/>
  </entry>
  <entry>
    <title>内容注释</title>
    <link href="https://tncloud.fun/posts/content-annotations/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/content-annotations/</id>
    <published>2026-08-27T00:00:00.000Z</published>
    <updated>2026-08-27T00:00:00.000Z</updated>
    <summary>在不中断阅读节奏的前提下，为 Shirone 文章添加紧凑、易访问的补充说明。</summary>
    <content type="html"><![CDATA[<p>内容注释可以将补充背景放在相关句子附近，而不直接插入正文阅读流。激活小型注释标记即可查看说明。</p>
<h2>基本语法</h2>
<p>在普通正文中添加 <code>[+label]</code> 引用，再在同一篇文章的其他位置定义对应注释。</p>
<pre><code>Astro 会预先渲染页面的大部分内容，只在 **交互岛屿** [+islands] 需要变为可交互状态时才对其进行 hydration。

[+islands]:
  交互岛屿是由静态 HTML 包围的交互式 UI 组件。这样既能让页面默认保持轻量，又能保留所需的局部交互。
</code></pre>
<p>Astro 会预先渲染页面的大部分内容，只在 <strong>交互岛屿</strong> [+islands] 需要变为可交互状态时才对其进行 hydration。</p>
<p>[+islands]:
交互岛屿是由静态 HTML 包围的交互式 UI 组件。这样既能让页面默认保持轻量，又能保留所需的局部交互。</p>
<h2>丰富内容</h2>
<p>注释定义可以包含段落、强调、链接、列表和行内代码 <a href="**%E7%BC%96%E5%86%99%E5%BB%BA%E8%AE%AE**">+rich-note</a>，周围句子的阅读仍会自然延续。</p>
<ul>
<li>确保第一句话本身完整清晰。</li>
<li>如果读者可能需要查看主要来源，请提供链接。</li>
<li>优先使用 <code>client:visible</code> 这类简洁示例。</li>
</ul>
<p>完整说明请参阅 <a href="https://docs.astro.build/en/concepts/islands/">Astro 交互岛屿文档</a>。</p>
<h2>多条注释</h2>
<p>重复使用同一个标签 <a href="%E5%85%88%E8%AF%B4%E6%98%8E%E4%BC%9A%E5%BD%B1%E5%93%8D%E8%AF%BB%E8%80%85%E4%B8%8B%E4%B8%80%E6%AD%A5%E8%A1%8C%E5%8A%A8%E7%9A%84%E5%86%B3%E5%AE%9A%E3%80%82">+review</a>，即可在一个标记后呈现一组相关的简短注释。</p>
<p>未定义的引用（例如 <code>[+missing]</code>）会保留为普通文本，因此尚未完成的定义不会生成空控件。</p>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="指南"/>
  </entry>
  <entry>
    <title>Markdown 步骤流</title>
    <link href="https://tncloud.fun/posts/steps/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/steps/</id>
    <published>2026-08-27T00:00:00.000Z</published>
    <updated>2026-08-27T00:00:00.000Z</updated>
    <summary>在 Shirone 中以紧凑、易访问的步骤流呈现有序说明。</summary>
    <content type="html"><![CDATA[<p>对于有严格先后顺序的流程，可以使用步骤流。该组件不会打断文章的阅读节奏：简洁的编号轨道帮助读者定位，而标题、段落、链接、列表和代码仍保留各自原生的 Markdown 语义。</p>
<h2>有序列表语法</h2>
<p>使用 <code>:::steps</code> 容器包裹一个 Markdown 有序列表。每个顶层列表项都会成为一个步骤。</p>
<pre><code>:::steps[部署到生产环境]
1. **克隆并准备工作区**

   克隆仓库并进入项目目录。

   ```powershell
   git clone https://github.com/LyraVoid/Shirone.git
   Set-Location Shirone
   ```

2. **安装依赖**

   使用仓库指定的包管理器。

   ```powershell
   pnpm.cmd install
   ```

3. **运行项目检查**

   确认 Astro 诊断和 TypeScript 检查均已通过。

   ```powershell
   npx.cmd astro check
   pnpm.cmd type-check
   ```

4. **构建生产站点**

   生成静态站点和搜索索引。

   ```powershell
   pnpm.cmd build
   ```
:::
</code></pre>
<p>:::steps[部署到生产环境]</p>
<ol>
<li>
<p><strong>克隆并准备工作区</strong></p>
<p>克隆仓库并进入项目目录。</p>
<pre><code>git clone https://github.com/LyraVoid/Shirone.git
Set-Location Shirone
</code></pre>
</li>
<li>
<p><strong>安装依赖</strong></p>
<p>使用仓库指定的包管理器。</p>
<pre><code>pnpm.cmd install
</code></pre>
</li>
<li>
<p><strong>运行项目检查</strong></p>
<p>确认 Astro 诊断和 TypeScript 检查均已通过。</p>
<pre><code>npx.cmd astro check
pnpm.cmd type-check
</code></pre>
</li>
<li>
<p><strong>构建生产站点</strong></p>
<p>生成静态站点和搜索索引。</p>
<pre><code>pnpm.cmd build
</code></pre>
</li>
</ol>
<p>:::</p>
<h2>选项</h2>
<ul>
<li><code>:::steps[标题]</code> 或 <code>title="标题"</code> 可以添加可见标题和无障碍名称。</li>
<li><code>start=4</code> 可以更改起始步骤编号。</li>
<li>容器中必须恰好包含一个有序列表。无效或混杂的输入会保留为普通且可读的 Markdown，不会被启发式地解析。</li>
<li>内容会在站点构建期间完成渲染，不会增加客户端 JavaScript 或网络请求。</li>
</ul>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="指南"/>
  </entry>
  <entry>
    <title>MDX 集成与 M3E 原子组件</title>
    <link href="https://tncloud.fun/posts/mdx-showcase/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/mdx-showcase/</id>
    <published>2026-08-20T00:00:00.000Z</published>
    <updated>2026-08-20T00:00:00.000Z</updated>
    <summary>全面介绍如何在 Shirone 中使用 MDX、Svelte 5 交互岛屿和 Material 3 Expressive 设计令牌，构建丰富的交互式文章。</summary>
    <content type="html"><![CDATA[<p>:::tip
**MDX（Markdown + JSX）**连接了静态写作与应用界面。在 Shirone 中，作者可以直接在文章内容中无缝组合动态逻辑、响应式 Svelte 5 组件和 Material 3 设计令牌。
:::</p>
<h2>1. Markdown 与 MDX 功能对比</h2>
<table>
<thead>
<tr>
<th>功能</th>
<th>标准 Markdown（<code>.md</code>）</th>
<th>Shirone MDX（<code>.mdx</code>）</th>
<th>执行模式</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>排版与结构</strong></td>
<td>完整支持</td>
<td>完整支持</td>
<td>静态 SSR</td>
</tr>
<tr>
<td><strong>代码高亮</strong></td>
<td>行号、框架、可折叠</td>
<td>行号、框架、可折叠</td>
<td>静态 SSR（Expressive Code）</td>
</tr>
<tr>
<td><strong>图表与数学公式</strong></td>
<td>Mermaid、KaTeX</td>
<td>Mermaid、KaTeX</td>
<td>客户端增强</td>
</tr>
<tr>
<td><strong>提示容器</strong></td>
<td>说明、提示、重要、警告、注意</td>
<td>说明、提示、重要、警告、注意</td>
<td>静态 SSR</td>
</tr>
<tr>
<td><strong>M3E 展示原子组件</strong></td>
<td>不支持</td>
<td>直接集成（``、<code>&lt;Skeleton&gt;</code>）</td>
<td>纯 SSR（无客户端 JS）</td>
</tr>
<tr>
<td><strong>Svelte 5 响应式岛屿</strong></td>
<td>不支持</td>
<td>按需 hydration（<code>&lt;Button&gt;</code>、<code>&lt;Switch&gt;</code>）</td>
<td>使用 <code>client:visible</code> 延迟 hydration</td>
</tr>
<tr>
<td><strong>反馈与加载原子组件</strong></td>
<td>不支持</td>
<td>动态变形（<code>&lt;LoadingIndicator&gt;</code>）</td>
<td><code>client:visible</code> 响应式</td>
</tr>
<tr>
<td><strong>动态 JSX 表达式</strong></td>
<td>不支持</td>
<td>原生求值（<code>{authorInfo.ui}</code>）</td>
<td>编译时／客户端</td>
</tr>
</tbody>
</table>
<hr />
<h2>2. 动态表达式与数据映射</h2>
<p>MDX 支持在文件顶部使用 <code>export const</code> 声明作用域内常量，并在正文中直接求值或映射到模板中：</p>
<ul>
<li><strong>Core Framework</strong>: {authorInfo.framework}</li>
<li><strong>UI Engine</strong>: {authorInfo.ui}</li>
<li><strong>Design Tokens</strong>: {authorInfo.tokens}</li>
<li><strong>Architecture Pattern</strong>: {authorInfo.architecture}</li>
</ul>
<p>数组和集合也可以动态渲染为网格布局：</p>
<p>&lt;div class="grid grid-cols-1 md:grid-cols-2 gap-4 my-6"&gt;
{showcaseItems.map((item, idx) =&gt; (
&lt;div key={item.name} class="p-4 rounded-xl border border-[var(--outline-variant)] bg-[var(--surface-container-low)]"&gt;
&lt;div class="flex items-center gap-2 mb-1"&gt;
&lt;span class="w-6 h-6 rounded-full bg-[var(--primary)] text-[var(--on-primary)] text-xs flex items-center justify-center font-bold"&gt;
{idx + 1}
&lt;/span&gt;
&lt;span class="font-bold text-[var(--on-surface)]"&gt;{item.name}&lt;/span&gt;
&lt;/div&gt;
&lt;p class="text-sm text-[var(--on-surface-variant)] m-0"&gt;{item.desc}&lt;/p&gt;
&lt;/div&gt;
))}
&lt;/div&gt;</p>
<hr />
<h2>3. M3E Display and Layout Primitives (SSR-Only)</h2>
<p>根据 Shirone 的组件架构（<code>docs/atomic-structure.md</code>），无状态展示组件会输出简洁、易访问的语义化 HTML，且不会附带客户端运行时负载。</p>
<h3>3.1 卡片容器（<code>Card.svelte</code>）</h3>
<p>&lt;div class="grid grid-cols-1 md:grid-cols-3 gap-4 my-6"&gt;
&lt;Card variant="filled" class="!p-5"&gt;
&lt;div class="font-bold text-[var(--primary)] mb-2"&gt;填充卡片&lt;/div&gt;
&lt;div class="text-sm text-[var(--on-surface-variant)]"&gt;使用默认容器背景，不带阴影。适合组合展示内容块。&lt;/div&gt;</p>
<pre><code>&lt;div class="font-bold text-[var(--primary)] mb-2"&gt;浮起卡片&lt;/div&gt;
&lt;div class="text-sm text-[var(--on-surface-variant)]"&gt;使用第 1 层容器高度，并通过交互状态叠层增强视觉焦点。&lt;/div&gt;



&lt;div class="font-bold text-[var(--primary)] mb-2"&gt;描边卡片&lt;/div&gt;
&lt;div class="text-sm text-[var(--on-surface-variant)]"&gt;清晰的 1px 描边可在中性色表面上形成明确分隔。&lt;/div&gt;
</code></pre>
<p>&lt;/div&gt;</p>
<h3>3.2 强调条与徽标（<code>AccentBar</code> 和 <code>Badge</code>）</h3>
<p>&lt;div class="flex items-center gap-4 my-4 p-4 rounded-lg bg-[var(--surface-container-high)]"&gt;</p>
<p>&lt;div class="flex-1"&gt;
&lt;span class="font-bold text-lg"&gt;系统公告&lt;/span&gt;
&lt;p class="text-xs text-[var(--on-surface-variant)] m-0"&gt;组合使用 AccentBar 和 Badge，构建醒目的视觉提示&lt;/p&gt;
&lt;/div&gt;
M3E v0.192
&lt;/div&gt;</p>
<h3>3.3 骨架屏占位符（<code>Skeleton.svelte</code>）</h3>
<p>用于预览布局骨架或模拟异步状态：</p>
<p>&lt;div class="flex flex-col gap-3 my-6 p-5 rounded-xl border border-[var(--outline-variant)] bg-[var(--surface-container-low)]"&gt;
&lt;div class="flex items-center gap-3"&gt;</p>
<pre><code>&lt;div class="flex flex-col gap-1.5 flex-1"&gt;
  
  
&lt;/div&gt;
</code></pre>
<p>&lt;/div&gt;</p>
<p>&lt;/div&gt;</p>
<hr />
<h2>4. 反馈与加载指示器</h2>
<p>Shirone 提供完整实现 Material 3 Expressive 动效规范的反馈原子组件：</p>
<h3>4.1 变形加载指示器（<code>LoadingIndicator.svelte</code>）</h3>
<p>该组件使用 <code>androidx.graphics.shapes</code> 实现多边形变形，提供流畅的弹簧插值七形态动画：</p>
<p>&lt;div class="grid grid-cols-1 md:grid-cols-3 gap-4 my-6 p-6 rounded-2xl bg-[var(--surface-container)] border border-[var(--outline-variant)] text-center"&gt;
&lt;div class="flex flex-col items-center gap-2"&gt;
&lt;div class="h-16 flex items-center justify-center"&gt;</p>
<pre><code>&lt;/div&gt;
&lt;span class="text-xs text-[var(--on-surface-variant)]"&gt;不确定进度形态变换&lt;/span&gt;
</code></pre>
<p>&lt;/div&gt;</p>
<p>&lt;div class="flex flex-col items-center gap-2"&gt;
&lt;div class="h-16 flex items-center justify-center"&gt;</p>
<pre><code>&lt;/div&gt;
&lt;span class="text-xs text-[var(--on-surface-variant)]"&gt;容器内圆形变体&lt;/span&gt;
</code></pre>
<p>&lt;/div&gt;</p>
<p>&lt;div class="flex flex-col items-center gap-2"&gt;
&lt;div class="h-16 flex items-center justify-center"&gt;</p>
<pre><code>&lt;/div&gt;
&lt;span class="text-xs text-[var(--on-surface-variant)]"&gt;确定进度（68%）&lt;/span&gt;
</code></pre>
<p>&lt;/div&gt;
&lt;/div&gt;</p>
<h3>4.2 线性与不确定进度（<code>ProgressIndicator.svelte</code>）</h3>
<p>&lt;div class="flex flex-col gap-4 my-6 p-6 rounded-2xl bg-[var(--surface-container)] border border-[var(--outline-variant)]"&gt;
&lt;div class="flex flex-col gap-2"&gt;
&lt;div class="flex justify-between text-xs text-[var(--on-surface-variant)]"&gt;
&lt;span&gt;流程编译&lt;/span&gt;
&lt;span&gt;80%&lt;/span&gt;
&lt;/div&gt;</p>
<p>&lt;/div&gt;</p>
<p>&lt;div class="flex flex-col gap-2 mt-2"&gt;
&lt;div class="text-xs text-[var(--on-surface-variant)]"&gt;连续双线动画&lt;/div&gt;</p>
<p>&lt;/div&gt;
&lt;/div&gt;</p>
<hr />
<h2>5. 交互式 Svelte 5 岛屿</h2>
<p>声明为 <code>client:visible</code> 的组件会在进入视口时通过 <code>IntersectionObserver</code> 延迟 hydration：</p>
<h3>5.1 按钮矩阵（<code>Button.svelte</code>）</h3>
<p>&lt;div class="flex flex-wrap items-center gap-3 my-6 p-4 rounded-xl border border-[var(--outline-variant)]"&gt;
填充按钮
浮起按钮
柔和按钮
描边按钮
文本按钮
&lt;/div&gt;</p>
<h3>5.2 筛选芯片与分段按钮（<code>Chips</code> 和 <code>SegmentedButton</code>）</h3>
<p>&lt;div class="flex flex-col gap-4 my-6 p-6 rounded-2xl bg-[var(--surface-container)] border border-[var(--outline-variant)]"&gt;
&lt;div&gt;
&lt;div class="text-xs font-bold text-[var(--on-surface-variant)] mb-2"&gt;M3E 筛选芯片&lt;/div&gt;</p>
<p>&lt;/div&gt;</p>
<p>&lt;div&gt;
&lt;div class="text-xs font-bold text-[var(--on-surface-variant)] mb-2"&gt;分段控件&lt;/div&gt;</p>
<p>&lt;/div&gt;
&lt;/div&gt;</p>
<h3>5.3 开关、复选框与滑块（<code>Switch</code>、<code>Checkbox</code>、<code>Slider</code>）</h3>
<p>&lt;div class="flex flex-col gap-4 my-6 p-6 rounded-2xl bg-[var(--surface-container)] border border-[var(--outline-variant)]"&gt;
&lt;div class="flex items-center justify-between"&gt;
&lt;span class="font-bold text-sm"&gt;带状态图标的开关&lt;/span&gt;</p>
<p>&lt;/div&gt;</p>
<p>&lt;div class="flex items-center justify-between"&gt;
&lt;span class="font-bold text-sm"&gt;复选框&lt;/span&gt;
&lt;div class="flex items-center gap-4"&gt;</p>
<pre><code>&lt;/div&gt;
</code></pre>
<p>&lt;/div&gt;</p>
<p>&lt;div class="flex flex-col gap-2"&gt;
&lt;span class="font-bold text-sm"&gt;色相光谱滑块&lt;/span&gt;</p>
<p>&lt;/div&gt;
&lt;/div&gt;</p>
<h3>5.4 输入控件（<code>TextField.svelte</code>）</h3>
<p>&lt;div class="grid grid-cols-1 md:grid-cols-2 gap-4 my-6"&gt;</p>
<p>&lt;/div&gt;</p>
<hr />
<h2>6. Markdown 扩展兼容性</h2>
<p>Shirone 的 SSOT unified 插件处理流程与所有 Markdown 扩展保持完整兼容：</p>
<h3>6.1 GitHub 仓库卡片</h3>
<p>::github{repo="saicaca/fuwari"}</p>
<h3>6.2 Mermaid 架构图</h3>
<pre><code>flowchart TD
    MDX[MDX Source Entry] --&gt; Compiler["@astrojs/mdx Compiler"]
    Compiler --&gt; Plugins["Remark / Rehype SSOT Pipeline"]
    Plugins --&gt; Islands["Svelte 5 Interactive Islands"]
    Islands --&gt; Swup["Swup Client Navigation Shell"]
    Swup --&gt; Screen["M3E Expressive Article View"]
</code></pre>
<h3>6.3 数学表达式（LaTeX / KaTeX）</h3>
<p>行内公式：质能等价关系 $E = mc^2$ 和高斯积分 $\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}$。</p>
<p>块级公式：</p>
<p>$$
\mathcal{L}<em>{M3E} = \sum</em>{i=1}^{N} \left( \text{Token}_i \cdot \text{ContrastRatio} \right) + \lambda |\text{MotionElegance}|
$$</p>
<hr />
<h2>7. 总结</h2>
<p>MDX 的原生集成让技术作者能够构建丰富的交互式文档，同时保留 Shirone 极快的静态性能。所有组件都遵循 Material 3 Expressive 设计令牌体系，确保一致性、无障碍性和视觉协调。</p>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="指南"/>
  </entry>
  <entry>
    <title>图片画廊网格：语法与完整示例</title>
    <link href="https://tncloud.fun/posts/image-grid-demo/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/image-grid-demo/</id>
    <published>2026-07-13T00:00:00.000Z</published>
    <updated>2026-07-13T00:00:00.000Z</updated>
    <summary>全面介绍图片画廊网格的语法、参数、裁剪、响应式行为、说明文字和灯箱导航。</summary>
    <content type="html"><![CDATA[<p><code>:::grid</code> 是博客的图片画廊容器指令。它会将普通 Markdown 图片排列为响应式网格，统一图片比例，并自动启用灯箱查看。可用于文章配图、屏幕截图、作品集或小型相册。</p>
<p>同一画廊中的图片使用相同的卡片比例。默认情况下，图片会从中心裁剪并填满卡片，让每一行保持整齐；点击图片即可在灯箱中查看完整原图。每个画廊都有独立的灯箱分组，不会与文章中的其他图片混在一起。</p>
<blockquote>
<p>本文既是功能文档，也是视觉测试页面。请分别在桌面、平板和手机宽度下查看示例，再点击图片验证灯箱分组。</p>
</blockquote>
<h2>最简语法</h2>
<p>直接在 <code>:::grid</code> 和结束标记 <code>:::</code> 之间编写 Markdown 图片：</p>
<pre><code>:::grid
![图片说明](./image-1.webp)

![图片说明](./image-2.webp)
:::
</code></pre>
<p>每张图片都必须单独占一个段落，图片之间以空行分隔。画廊中只能放图片；段落、列表和代码块应写在容器之外。</p>
<p>下面是最简语法的渲染结果。不设置参数时，网格默认使用三列、<code>16/10</code> 比例和 <code>cover</code> 模式。</p>
<p>:::grid
<img src="./landscape-1.webp" alt="最简语法效果：第一张图片" /></p>
<p><img src="./landscape-2.webp" alt="最简语法效果：第二张图片" />
:::</p>
<h2>参数一览</h2>
<p>在起始指令后面的花括号中填写所有参数：<code>:::grid{parameter="value"}</code>。</p>
<table>
<thead>
<tr>
<th>参数</th>
<th>可用值</th>
<th>默认值</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>columns</code></td>
<td>Integers from <code>1</code> to <code>6</code></td>
<td><code>3</code></td>
<td>桌面端每行的列数。无效值会回退为 <code>3</code>。</td>
</tr>
<tr>
<td><code>aspect</code></td>
<td>A positive ratio, such as <code>16/9</code>, <code>3/4</code>, or <code>1/1</code></td>
<td><code>16/10</code></td>
<td>卡片的显示比例，而非原图比例。</td>
</tr>
<tr>
<td><code>fit</code></td>
<td><code>cover</code>, <code>contain</code></td>
<td><code>cover</code></td>
<td>图片适配模式。<code>cover</code> 会裁剪并填满卡片；<code>contain</code> 会保留完整图片，但可能出现留白。</td>
</tr>
</tbody>
</table>
<p>完整示例：</p>
<pre><code>:::grid{columns="3" aspect="16/9" fit="cover"}
![第一张图片](./image-1.webp "可选说明")

![第二张图片](./image-2.webp "可选说明")

![第三张图片](./image-3.webp "可选说明")
:::
</code></pre>
<p>以下结果使用了上方的三列横图语法。请比较卡片比例、列数，以及标题优先于 alt 文本成为说明文字的效果：</p>
<p>:::grid{columns="3" aspect="16/9" fit="cover"}
<img src="./landscape-1.webp" alt="参数示例：第一张横图" title="横图说明 1" /></p>
<p><img src="./landscape-2.webp" alt="参数示例：第二张横图" title="横图说明 2" /></p>
<p><img src="./landscape-3.webp" alt="参数示例：第三张横图" title="横图说明 3" />
:::</p>
<h2>说明文字与 Alt 文本</h2>
<p>图片的 alt 文本既是无障碍替代文本，也是默认说明文字。如果图片设置了可选标题，则会优先使用该标题作为说明文字：</p>
<pre><code>![用于无障碍访问的文本](./image.webp "显示在图片下方的说明文字")
</code></pre>
<p>同一行中的说明文字会在每张卡片底部对齐。即使某条说明换行，也不会导致其他说明的高度错位。<code>3:4</code> 和 <code>16:9</code> 这样的比例可以直接写在正文、标题和 alt 文本中，无需转义。</p>
<p>此示例展示默认使用 alt 文本作为说明、显式设置标题说明，以及较长说明文字的底部对齐效果：</p>
<p>:::grid{columns="3" aspect="1/1"}
<img src="./square-1.webp" alt="这张图片没有标题，因此使用 alt 文本作为说明" /></p>
<p><img src="./square-2.webp" alt="带无障碍 alt 文本的第二张方图" title="此标题会显示为说明文字" /></p>
<p><img src="./square-3.webp" alt="3:4 海报的无障碍描述" title="这是一条较长说明，用于检查换行后所有说明是否仍在卡片底部对齐" />
:::</p>
<h2>布局与裁剪</h2>
<p>桌面布局使用 <code>columns</code> 指定的列数。视口宽度低于 <code>768px</code> 时，网格最多显示两列；低于 <code>480px</code> 时则切换为单列。卡片容器会固定 <code>aspect</code> 比例并裁切圆角；图片则填满卡片，不受主题默认图片边距影响。</p>
<ul>
<li>选择 <code>cover</code>：推荐的默认模式。图片会从中心裁剪并填满卡片，让整个画廊保持一致。</li>
<li>选择 <code>contain</code>：显示完整原图，不进行裁剪。如果原图比例与卡片不同，则会露出主题背景；适用于不能裁剪的图片。</li>
<li>如果希望完整显示图片且不留空白，可以将 <code>aspect</code> 设置为接近原图的比例，或将图片单独放在一个网格中。</li>
</ul>
<p>以下示例将相同的竖图放入 <code>16/9</code> 卡片，分别使用 <code>cover</code> 和 <code>contain</code>。前者会裁剪图片，后者保留完整图片并留出背景区域。</p>
<pre><code>:::grid{columns="3" aspect="16/9" fit="cover"}
![图片说明](./image-1.webp "可选说明")

![图片说明](./image-2.webp "可选说明")
:::

:::grid{columns="3" aspect="16/9" fit="contain"}
![图片说明](./image-1.webp "可选说明")

![图片说明](./image-2.webp "可选说明")
:::
</code></pre>
<p>:::grid{columns="3" aspect="16/9" fit="cover"}
<img src="./default-portrait-1.webp" alt="Cover 模式效果一" title="Cover：居中裁剪" /></p>
<p><img src="./default-portrait-2.webp" alt="Cover 模式效果二" title="Cover：填满卡片" /></p>
<p><img src="./default-portrait-3.webp" alt="Cover 模式效果三" title="Cover：让布局更加统一" />
:::</p>
<p>:::grid{columns="3" aspect="16/9" fit="contain"}
<img src="./default-portrait-1.webp" alt="Contain 模式效果一" title="Contain：保留完整原图" /></p>
<p><img src="./default-portrait-2.webp" alt="Contain 模式效果二" title="Contain：可能会出现留白" /></p>
<p><img src="./default-portrait-3.webp" alt="Contain 模式效果三" title="Contain：适合保留边缘细节" />
:::</p>
<h2>默认配置</h2>
<p>不设置属性时，默认使用三列、<code>16/10</code> 比例和 <code>cover</code> 裁剪。以下三张竖图用于验证默认裁剪和说明文字。</p>
<pre><code>:::grid
![图片说明](./image-1.webp)

![图片说明](./image-2.webp)

![图片说明](./image-3.webp)
:::
</code></pre>
<p>:::grid
<img src="./default-portrait-1.webp" alt="默认配置：竖图一" /></p>
<p><img src="./default-portrait-2.webp" alt="默认配置：竖图二" /></p>
<p><img src="./default-portrait-3.webp" alt="默认配置：竖图三" />
:::</p>
<h2>三列竖图：3:4</h2>
<p>设置 <code>aspect="3/4"</code> 后，三张竖图会填充比例统一的纵向卡片。如果原图比例不同，<code>cover</code> 会从中心向边缘裁剪。</p>
<pre><code>:::grid{columns="3" aspect="3/4"}
![竖图说明](./portrait-1.webp)

![竖图说明](./portrait-2.webp)

![竖图说明](./portrait-3.webp)
:::
</code></pre>
<p>:::grid{columns="3" aspect="3/4"}
<img src="./default-portrait-1.webp" alt="3:4 测试图片一" title="竖图 1" /></p>
<p><img src="./default-portrait-2.webp" alt="3:4 测试图片二" title="竖图 2" /></p>
<p><img src="./default-portrait-3.webp" alt="3:4 测试图片三" title="竖图 3" />
:::</p>
<h2>三列横图：16:9</h2>
<p>这组示例在三列布局中展示常见的视频封面比例。当横图比例接近卡片比例时，裁剪会很少。</p>
<pre><code>:::grid{columns="3" aspect="16/9"}
![横图说明](./landscape-1.webp)

![横图说明](./landscape-2.webp)

![横图说明](./landscape-3.webp)
:::
</code></pre>
<p>:::grid{columns="3" aspect="16/9"}
<img src="./feature-landscape-1.webp" alt="16:9 测试图片一" /></p>
<p><img src="./feature-landscape-2.webp" alt="16:9 测试图片二" /></p>
<p><img src="./feature-landscape-3.webp" alt="16:9 测试图片三" />
:::</p>
<h2>两列方图：1:1</h2>
<p>需要较大的预览卡片时，两列布局十分合适。第三张图片会移至下一行，最后一行保持网格轨道宽度，不会拉伸图片以填满整行。</p>
<pre><code>:::grid{columns="2" aspect="1/1"}
![方图说明](./square-1.webp)

![方图说明](./square-2.webp)

![方图说明](./square-3.webp)
:::
</code></pre>
<p>:::grid{columns="2" aspect="1/1"}
<img src="./mixed-square-1.webp" alt="1:1 测试图片一" /></p>
<p><img src="./mixed-square-2.webp" alt="1:1 测试图片二" /></p>
<p><img src="./mixed-square-3.webp" alt="1:1 测试图片三" />
:::</p>
<h2>使用 <code>contain</code> 的四列布局</h2>
<p><code>fit="contain"</code> 不会裁剪原图。当图片比例与卡片比例不同时，会露出主题背景。这是预期效果，并非布局问题。此示例还用于验证四列网格和独立灯箱分组互不干扰。</p>
<pre><code>:::grid{columns="4" aspect="16/9" fit="contain"}
![图片说明](./image-1.webp)

![图片说明](./image-2.webp)

![图片说明](./image-3.webp)
:::
</code></pre>
<p>:::grid{columns="4" aspect="16/9" fit="contain"}
<img src="./default-portrait-1.webp" alt="Contain：竖图一" /></p>
<p><img src="./default-portrait-2.webp" alt="Contain：竖图二" /></p>
<p><img src="./default-portrait-3.webp" alt="Contain：竖图三" />
:::</p>
<h2>单列细节图片</h2>
<p>图片需要更大的阅读尺寸时，适合使用单列布局。在桌面、平板和手机上都会保持单列，灯箱中仍可查看原图。</p>
<pre><code>:::grid{columns="1" aspect="16/9"}
![图片说明](./detail.webp)
:::
</code></pre>
<p>:::grid{columns="1" aspect="16/9"}
<img src="./feature-landscape-1.webp" alt="单列布局测试图片" />
:::</p>
<h2>稀疏五列布局</h2>
<p>五列布局用于验证较高的列数。只有三张图片时，最后一行会保持左对齐，而不会拉伸图片。</p>
<pre><code>:::grid{columns="5" aspect="1/1"}
![缩略图说明](./thumb-1.webp)

![缩略图说明](./thumb-2.webp)

![缩略图说明](./thumb-3.webp)
:::
</code></pre>
<p>:::grid{columns="5" aspect="1/1"}
<img src="./mixed-square-1.webp" alt="五列布局测试图片一" /></p>
<p><img src="./mixed-square-2.webp" alt="五列布局测试图片二" /></p>
<p><img src="./mixed-square-3.webp" alt="五列布局测试图片三" />
:::</p>
<h2>六列混合图片</h2>
<p>六列是当前支持的最大列数。混排横图和竖图，可以验证 <code>cover</code> 裁剪、窄卡片中的说明文字，以及桌面端的紧凑布局。为了保证文章易读，通常建议使用两到四列。</p>
<pre><code>:::grid{columns="6" aspect="1/1"}
![图片说明](./image-1.webp)

![图片说明](./image-2.webp)

![图片说明](./image-3.webp)

![图片说明](./image-4.webp)

![图片说明](./image-5.webp)

![图片说明](./image-6.webp)
:::
</code></pre>
<p>:::grid{columns="6" aspect="1/1"}
<img src="./default-portrait-1.webp" alt="六列布局测试图片一" /></p>
<p><img src="./default-portrait-2.webp" alt="六列布局测试图片二" /></p>
<p><img src="./default-portrait-3.webp" alt="六列布局测试图片三" /></p>
<p><img src="./feature-landscape-1.webp" alt="六列布局测试图片四" /></p>
<p><img src="./feature-landscape-2.webp" alt="六列布局测试图片五" /></p>
<p><img src="./feature-landscape-3.webp" alt="六列布局测试图片六" />
:::</p>
<h2>四列方图：1:1</h2>
<p>四张比例相同的方图适合典型的四列布局。桌面端会将四张图片排列在一行；平板端折叠为两列，手机端则为一列。</p>
<pre><code>:::grid{columns="4" aspect="1/1"}
![方图说明](./square-1.webp)

![方图说明](./square-2.webp)

![方图说明](./square-3.webp)

![方图说明](./square-4.webp)
:::
</code></pre>
<p>:::grid{columns="4" aspect="1/1"}
<img src="./square-1.webp" alt="方图一" /></p>
<p><img src="./square-2.webp" alt="方图二" /></p>
<p><img src="./square-3.webp" alt="方图三" /></p>
<p><img src="./square-4.webp" alt="方图四" />
:::</p>
<h2>六列横图：16:9</h2>
<p>六列横图适合缩略图预览、作品集和屏幕截图索引。即使原图比例略有不同，<code>cover</code> 也能一致地填满每个 <code>16/9</code> 卡片。</p>
<pre><code>:::grid{columns="6" aspect="16/9"}
![横图说明](./landscape-1.webp)

![横图说明](./landscape-2.webp)

![横图说明](./landscape-3.webp)

![横图说明](./landscape-4.webp)

![横图说明](./landscape-5.webp)

![横图说明](./landscape-6.webp)
:::
</code></pre>
<p>:::grid{columns="6" aspect="16/9"}
<img src="./landscape-1.webp" alt="横图一" /></p>
<p><img src="./landscape-2.webp" alt="横图二" /></p>
<p><img src="./landscape-3.webp" alt="横图三" /></p>
<p><img src="./landscape-4.webp" alt="横图四" /></p>
<p><img src="./landscape-5.webp" alt="横图五" /></p>
<p><img src="./landscape-6.webp" alt="横图六" />
:::</p>
<h2>三列竖图：3:4</h2>
<p>这组六张竖图展示人物图片、海报或手机截图的常见布局。图片分为两行、每行三张，说明文字在卡片底部对齐。</p>
<pre><code>:::grid{columns="3" aspect="3/4"}
![竖图说明](./portrait-1.webp)

![竖图说明](./portrait-2.webp)

![竖图说明](./portrait-3.webp)

![竖图说明](./portrait-4.webp)

![竖图说明](./portrait-5.webp)

![竖图说明](./portrait-6.webp)
:::
</code></pre>
<p>:::grid{columns="3" aspect="3/4"}
<img src="./portrait-1.webp" alt="竖图一" /></p>
<p><img src="./portrait-2.webp" alt="竖图二" /></p>
<p><img src="./portrait-3.webp" alt="竖图三" /></p>
<p><img src="./portrait-4.webp" alt="竖图四" /></p>
<p><img src="./portrait-5.webp" alt="竖图五" /></p>
<p><img src="./portrait-6.webp" alt="竖图六" />
:::</p>
<h2>边缘关键内容：<code>cover</code> 与灯箱</h2>
<p>这些图片的边缘处包含重要文字或细节。<code>cover</code> 可以让网格保持整齐，但可能裁掉边缘；点击图片即可在灯箱中查看未裁剪的原图。边缘细节重要时，请使用清晰的说明文字，或改用下方的 <code>contain</code> 模式。</p>
<pre><code>:::grid{columns="3" aspect="16/9" fit="cover"}
![边缘关键内容](./critical-1.webp "打开灯箱查看完整的边缘内容")

![边缘关键内容](./critical-2.webp "打开灯箱查看完整的边缘内容")

![边缘关键内容](./critical-3.webp "打开灯箱查看完整的边缘内容")
:::
</code></pre>
<p>:::grid{columns="3" aspect="16/9" fit="cover"}
<img src="./critical-1.webp" alt="边缘关键图片一" title="打开灯箱查看完整的边缘内容" /></p>
<p><img src="./critical-2.webp" alt="边缘关键图片二" title="打开灯箱查看完整的边缘内容" /></p>
<p><img src="./critical-3.webp" alt="边缘关键图片三" title="打开灯箱查看完整的边缘内容" />
:::</p>
<h2>使用 <code>contain</code> 处理极端比例</h2>
<p>对于横幅、长屏幕截图和其他比例极端的图片，<code>contain</code> 可以完整显示原图。与 <code>cover</code> 不同，它可能会露出主题背景，但不会裁剪图片内容。</p>
<pre><code>:::grid{columns="3" aspect="16/9" fit="contain"}
![完整屏幕截图说明](./wide-1.webp)

![完整屏幕截图说明](./wide-2.webp)

![完整屏幕截图说明](./wide-3.webp)
:::
</code></pre>
<p>:::grid{columns="3" aspect="16/9" fit="contain"}
<img src="./extreme-1.webp" alt="极端比例图片一" /></p>
<p><img src="./extreme-2.webp" alt="极端比例图片二" /></p>
<p><img src="./extreme-3.webp" alt="极端比例图片三" />
:::</p>
<h2>透明图片</h2>
<p>透明图片可以透出卡片的主题背景。此单列 <code>contain</code> 示例便于查看透明区域、原图边缘和灯箱效果。</p>
<pre><code>:::grid{columns="1" aspect="16/9" fit="contain"}
![透明图片说明](./transparent.webp)
:::
</code></pre>
<p>:::grid{columns="1" aspect="16/9" fit="contain"}
<img src="./transparent-1.webp" alt="透明背景测试图片" />
:::</p>
<h2>灯箱导航</h2>
<p>点击网格中的任意图片即可打开 Fancybox 灯箱。在灯箱中，你可以缩放、旋转、进入全屏、查看缩略图，或使用方向键切换图片。导航范围仅限于当前 <code>:::grid</code> 容器：例如，点击“16:9 测试图片一”只会显示该分组中的另外两张横图。</p>
<p>同一篇文章中的普通 Markdown 图片仍会单独处理，不会加入任何网格画廊。</p>
<h2>检查清单</h2>
<ol>
<li>每个网格中的图片尺寸一致，说明文字显示在卡片下方。</li>
<li>鼠标悬停时图片会轻微放大；点击后可以缩放、旋转，也可以使用键盘切换。</li>
<li>点击“16:9 测试图片一”后，灯箱只能浏览该分组中的另外两张横图。</li>
<li>视口宽度低于 768px 时，网格最多显示两列；低于 480px 时改为单列。</li>
<li>“使用 <code>contain</code> 的四列布局”中的竖图应完整显示，留有空白且不会被裁剪。</li>
<li>五列和六列网格在宽屏上保持指定列数，再根据响应式规则折叠为两列或一列。</li>
</ol>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="示例"/>
  </entry>
  <entry>
    <title>Mermaid 图表集</title>
    <link href="https://tncloud.fun/posts/markdown-mermaid/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/markdown-mermaid/</id>
    <published>2024-05-02T00:00:00.000Z</published>
    <updated>2024-05-02T00:00:00.000Z</updated>
    <summary>展示流程、交互、数据模型、日程安排和项目历史等 Mermaid 图表示例。</summary>
    <content type="html"><![CDATA[<p>Mermaid 可以将 Markdown 中的文本描述转换为图表。以下示例使用 Shirone 的内容工作流，展示技术文章和项目笔记中常见的图表类型。</p>
<h2>流程图</h2>
<p>流程图用于描述一个流程，包括决策分支以及返回前序步骤的路径。</p>
<pre><code>flowchart TD
    accTitle: 文章发布流程
    accDescr: 文章在发布前依次经过撰写、验证、预览和构建。验证失败时会返回修改。
    Draft[撰写 Markdown] --&gt; Check{验证通过？}
    Check --&gt;|否| Revise[修改文章]
    Revise --&gt; Check
    Check --&gt;|是| Preview[本地预览]
    Preview --&gt; Build[构建静态页面]
    Build --&gt; Publish[发布]
</code></pre>
<h2>时序图</h2>
<p>时序图按照时间顺序展示参与者之间的交互。此示例展示一次 Swup 导航从发起请求到渲染 Mermaid 图表的过程。</p>
<pre><code>sequenceDiagram
    accTitle: 站内导航后的图表渲染
    accDescr: 读者发起导航后，Swup 替换文章内容，Mermaid 渲染器再增强新页面中的图表。
    actor Reader as 读者
    participant Browser as 浏览器
    participant Swup
    participant Content as 文章区域
    participant Renderer as Mermaid 渲染器
    Reader-&gt;&gt;Browser: 打开另一篇文章
    Browser-&gt;&gt;Swup: 开始站内导航
    Swup-&gt;&gt;Content: 替换页面内容
    Swup--&gt;&gt;Renderer: 触发 content:replace
    Renderer-&gt;&gt;Content: 查找 Mermaid 容器
    Renderer--&gt;&gt;Browser: 插入主题化 SVG
</code></pre>
<h2>实体关系图</h2>
<p>实体关系图用于描述结构化数据及其关系，例如作者、文章、标签和评论之间的联系。</p>
<pre><code>erDiagram
    accTitle: 博客内容关系
    accDescr: 作者撰写文章，文章接收评论，关联记录则将文章与多个标签连接起来。
    AUTHOR ||--o{ POST : writes
    POST ||--o{ COMMENT : receives
    POST ||--o{ POST_TAG : classified_by
    TAG ||--o{ POST_TAG : groups
    AUTHOR {
        string id PK
        string display_name
    }
    POST {
        string slug PK
        string title
        datetime published_at
        string author_id FK
    }
    COMMENT {
        string id PK
        string post_slug FK
        string body
    }
    TAG {
        string id PK
        string label
    }
    POST_TAG {
        string post_slug FK
        string tag_id FK
    }
</code></pre>
<h2>类图</h2>
<p>类图用于展示软件设计中的职责、公共方法和依赖方向。</p>
<pre><code>classDiagram
    accTitle: Markdown 渲染模块
    accDescr: 内容处理流程使用 Mermaid 插件生成回退标记，客户端渲染器随后将其增强为 SVG。
    class ContentPipeline {
        +render(markdown)
        +collectMetadata()
    }
    class MermaidPlugin {
        +transform(codeFence)
        +createFallback()
    }
    class DiagramRenderer {
        +initialize()
        +renderAll()
        +refreshTheme()
    }
    class ThemeTokens {
        +primary
        +surface
        +outline
    }
    ContentPipeline --&gt; MermaidPlugin : 使用
    DiagramRenderer --&gt; MermaidPlugin : 增强输出
    DiagramRenderer --&gt; ThemeTokens : 读取
</code></pre>
<h2>状态图</h2>
<p>状态图展示对象的生命周期，以及使其在不同状态间转换的事件。</p>
<pre><code>stateDiagram-v2
    accTitle: 文章生命周期
    accDescr: 文章从草稿进入审核并发布，也可能退回修改，或最终归档。
    [*] --&gt; Draft
    Draft --&gt; InReview : 提交
    InReview --&gt; Draft : 要求修改
    InReview --&gt; Published : 批准
    Published --&gt; Draft : 撤回
    Published --&gt; Archived : 归档
    Archived --&gt; [*]
</code></pre>
<h2>XY 图表</h2>
<p>XY 图表将柱状图和折线图组合在一起，用于比较共享坐标轴上的数值和趋势。</p>
<pre><code>xychart-beta
    accTitle: 六周内容表现
    accDescr: 柱状图显示标准化后的每周发布量，折线显示标准化后的阅读完成率。
    title "六周内容表现"
    x-axis "周" [1, 2, 3, 4, 5, 6]
    y-axis "相对得分" 0 --&gt; 100
    bar [36, 52, 44, 68, 76, 84]
    line [48, 55, 62, 61, 73, 81]
</code></pre>
<h2>饼图</h2>
<p>饼图可以直观比较各类别在整体中所占的比例。</p>
<pre><code>pie showData
    accTitle: 文章主题占比
    accDescr: 工程占百分之四十，设计系统占百分之二十五，其余由指南和随笔构成。
    title 文章主题占比
    "工程" : 40
    "设计系统" : 25
    "指南" : 20
    "随笔" : 15
</code></pre>
<h2>甘特图</h2>
<p>甘特图沿日历时间轴排列任务、依赖关系和里程碑。</p>
<pre><code>gantt
    accTitle: 主题发布计划
    accDescr: 发布计划依次经过需求确认、交互设计、组件开发、测试和发布。
    title 主题发布计划
    dateFormat YYYY-MM-DD
    axisFormat %m/%d
    section 设计
    确认需求 :done, brief, 2024-05-06, 2d
    完善交互 :done, interaction, after brief, 3d
    section 实现
    开发组件 :active, components, after interaction, 6d
    编写示例 :examples, after interaction, 4d
    section 验证
    自动化测试 :tests, after components, 3d
    发布 :milestone, release, after tests, 0d
</code></pre>
<h2>思维导图</h2>
<p>思维导图以一个中心主题为起点，展开相关领域和支撑概念。</p>
<pre><code>mindmap
  root((Shirone))
    内容体验
      Markdown
      搜索
      图表
    界面系统
      M3E 令牌
      响应式布局
      配色方案
    工程质量
      Astro Check
      Playwright
      无障碍
</code></pre>
<h2>时间线</h2>
<p>时间线可以概括重要事件或阶段，无需提供精确的日历时长。</p>
<pre><code>timeline
    title Mermaid 支持的演进
    流程设计 : 检测 Mermaid 围栏代码
             : 保留源码回退内容
    客户端增强 : 按需加载运行时
              : 应用主题令牌
    稳定性 : 支持 Swup 导航
           : 验证响应式和无障碍输出
</code></pre>
<h2>用户旅程</h2>
<p>用户旅程图展示任务各阶段中的操作、参与者和体验评分。</p>
<pre><code>journey
    accTitle: 读者理解技术文章的过程
    accDescr: 读者发现一篇文章，通过结合正文和图表理解内容，然后继续探索相关主题。
    title 读者理解技术文章的过程
    section 发现
      浏览文章列表: 4: Reader
      选择主题: 5: Reader
    section 理解
      阅读文章: 4: Reader
      查看关系图: 5: Reader
    section 继续探索
      打开相关文章: 4: Reader
      收藏页面: 3: Reader
</code></pre>
<h2>Git 提交图</h2>
<p>Git 提交图展示功能分支上的工作进展，以及它最终如何合并回主分支。</p>
<pre><code>gitGraph
    accTitle: Mermaid 功能分支历史
    accDescr: 功能分支添加渲染器和测试后，合并到主分支并发布。
    commit id: "base"
    branch mermaid
    checkout mermaid
    commit id: "add-renderer"
    commit id: "add-tests"
    checkout main
    merge mermaid id: "merge-mermaid"
    commit id: "release"
</code></pre>
<h2>看板</h2>
<p>看板按照工作流状态对任务分组，方便快速查看当前进度。</p>
<pre><code>kanban
  backlog[待办]
    docs[编写作者文档]
    examples[扩展示例数据]
  active[进行中]
    themes[验证主题适配]
  complete[已完成]
    fallback[源码回退]
    rendering[客户端渲染]
</code></pre>
<h2>桑基图</h2>
<p>桑基图通过连线宽度表示流量或其他数值在不同节点之间的流动情况。</p>
<pre><code>sankey-beta
Landing,Reading,720
Discovery,Reading,430
Reading,Explore,360
Reading,Topics,210
Reading,Outbound,140
</code></pre>
<p>每个示例都使用标准的 <code>mermaid</code> 围栏代码。服务器会保留可读的源标记，浏览器则将其增强为符合当前主题的 SVG。切换主题或通过 Swup 导航至本文时，图表都会重新渲染。</p>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="示例"/>
  </entry>
  <entry>
    <title>Markdown 扩展功能</title>
    <link href="https://tncloud.fun/posts/markdown-extended/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/markdown-extended/</id>
    <published>2024-05-01T00:00:00.000Z</published>
    <updated>2024-11-29T00:00:00.000Z</updated>
    <summary>进一步了解 Fuwari 的 Markdown 功能。</summary>
    <content type="html"><![CDATA[<h2>GitHub 仓库卡片</h2>
<p>你可以添加指向 GitHub 仓库的动态卡片。页面加载时，系统会从 GitHub API 获取仓库信息。</p>
<p>::github{repo="Fabrizz/MMM-OnSpotify"}</p>
<p>使用 <code>::github{repo="&lt;owner&gt;/&lt;repo&gt;"}</code> 创建 GitHub 仓库卡片。</p>
<pre><code>::github{repo="saicaca/fuwari"}
</code></pre>
<h2>Mermaid 图表</h2>
<p>围栏代码块中的 <code>mermaid</code> 内容会渲染为图表，并跟随当前配色方案。</p>
<pre><code>flowchart LR
    accTitle: Markdown rendering pipeline
    accDescr: Markdown source is transformed into semantic HTML and then enhanced as a themed SVG diagram.
    A[Markdown source] --&gt; B[Astro content pipeline]
    B --&gt; C[Semantic HTML]
    C --&gt; D[Themed diagram]
</code></pre>
<h2>提示容器</h2>
<p>支持以下类型的提示容器：<code>note</code>、<code>tip</code>、<code>important</code>、<code>warning</code> 和 <code>caution</code>。</p>
<p>:::note
突出显示即使快速浏览时也值得注意的信息。
:::</p>
<p>:::tip
帮助读者更顺利完成任务的可选信息。
:::</p>
<p>:::important
读者成功完成任务所必需的重要信息。
:::</p>
<p>:::warning
因潜在风险而需要读者立即注意的关键信息。
:::</p>
<p>:::caution
说明某项操作可能造成的不良后果。
:::</p>
<h3>基本语法</h3>
<pre><code>:::note
突出显示即使快速浏览时也值得注意的信息。
:::

:::tip
帮助读者更顺利完成任务的可选信息。
:::
</code></pre>
<h3>自定义标题</h3>
<p>提示容器的标题可以自定义。</p>
<p>:::note[我的自定义标题]
这是一个带有自定义标题的说明容器。
:::</p>
<pre><code>:::note[我的自定义标题]
这是一个带有自定义标题的说明容器。
:::
</code></pre>
<h3>GitHub 语法</h3>
<blockquote>
<p>[!TIP]
同样支持 <a href="https://github.com/orgs/community/discussions/16925">GitHub 语法</a>。</p>
</blockquote>
<pre><code>&gt; [!NOTE]
&gt; 同样支持 GitHub 语法。

&gt; [!TIP]
&gt; 同样支持 GitHub 语法。
</code></pre>
<h3>剧透内容</h3>
<p>你可以在文本中添加剧透内容。剧透文本也支持 <strong>Markdown</strong> 语法。</p>
<p>内容 :spoiler[已隐藏 <strong>啦</strong>]！</p>
<pre><code>内容 :spoiler[已隐藏 **啦**]！

</code></pre>
<h2>图片宽度与说明文字</h2>
<p>独立图片的 alt 文本中可以包含可选的 <code>w-N%</code> 宽度标记；Markdown 标题则会显示为图片下方居中的说明文字：</p>
<p><img src="/images/albums/AcgExample/07.webp" alt="相册图片示例 w-50%" title="半宽图片及其说明文字" /></p>
<pre><code>![图片说明 w-50%](./image.webp "显示的说明文字")
</code></pre>
<p>有效宽度范围为 <code>w-1%</code> 至 <code>w-100%</code>；无效标记会保留在 alt 文本中。宽度和说明文字相互独立——仅填写标题也会显示说明文字：</p>
<p><img src="/images/albums/AcgExample/08.webp" alt="相册图片示例 w-75%" /></p>
<p><img src="/images/albums/AcgExample/09.webp" alt="相册图片示例" title="不带宽度标记的说明文字" /></p>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="Guides"/>
  </entry>
  <entry>
    <title>Expressive Code 示例</title>
    <link href="https://tncloud.fun/posts/expressive-code/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/expressive-code/</id>
    <published>2024-04-10T00:00:00.000Z</published>
    <updated>2024-04-10T00:00:00.000Z</updated>
    <summary>展示如何在 Markdown 中使用 Expressive Code 美化代码块。</summary>
    <content type="html"><![CDATA[<p>本文将介绍如何使用 <a href="https://expressive-code.com/">Expressive Code</a> 美化代码块。以下示例基于官方文档，更多详情请参阅该文档。</p>
<h2>Expressive Code</h2>
<h3>语法高亮</h3>
<p><a href="https://expressive-code.com/key-features/syntax-highlighting/">语法高亮</a></p>
<h4>常规语法高亮</h4>
<pre><code>console.log('This code is syntax highlighted!')
</code></pre>
<h4>渲染 ANSI 转义序列</h4>
<pre><code>ANSI colors:
- Regular: [31mRed[0m [32mGreen[0m [33mYellow[0m [34mBlue[0m [35mMagenta[0m [36mCyan[0m
- Bold:    [1;31mRed[0m [1;32mGreen[0m [1;33mYellow[0m [1;34mBlue[0m [1;35mMagenta[0m [1;36mCyan[0m
- Dimmed:  [2;31mRed[0m [2;32mGreen[0m [2;33mYellow[0m [2;34mBlue[0m [2;35mMagenta[0m [2;36mCyan[0m

256 colors (showing colors 160-177):
[38;5;160m160 [38;5;161m161 [38;5;162m162 [38;5;163m163 [38;5;164m164 [38;5;165m165[0m
[38;5;166m166 [38;5;167m167 [38;5;168m168 [38;5;169m169 [38;5;170m170 [38;5;171m171[0m
[38;5;172m172 [38;5;173m173 [38;5;174m174 [38;5;175m175 [38;5;176m176 [38;5;177m177[0m

Full RGB colors:
[38;2;34;139;34mForestGreen - RGB(34, 139, 34)[0m

Text formatting: [1mBold[0m [2mDimmed[0m [3mItalic[0m [4mUnderline[0m
</code></pre>
<h3>编辑器与终端框架</h3>
<p><a href="https://expressive-code.com/key-features/frames/">编辑器与终端框架</a></p>
<h4>代码编辑器框架</h4>
<pre><code>console.log('Title attribute example')
</code></pre>
<hr />
<pre><code>&lt;!-- src/content/index.html --&gt;
&lt;div&gt;File name comment example&lt;/div&gt;
</code></pre>
<h4>终端框架</h4>
<pre><code>echo "This terminal frame has no title"
</code></pre>
<hr />
<pre><code>Write-Output "This one has a title!"
</code></pre>
<h4>覆盖框架类型</h4>
<pre><code>echo "Look ma, no frame!"
</code></pre>
<hr />
<pre><code># Without overriding, this would be a terminal frame
function Watch-Tail { Get-Content -Tail 20 -Wait $args }
New-Alias tail Watch-Tail
</code></pre>
<h3>文本与行标记</h3>
<p><a href="https://expressive-code.com/key-features/text-markers/">文本与行标记</a></p>
<h4>标记整行与行范围</h4>
<pre><code>// Line 1 - targeted by line number
// Line 2
// Line 3
// Line 4 - targeted by line number
// Line 5
// Line 6
// Line 7 - targeted by range "7-8"
// Line 8 - targeted by range "7-8"
</code></pre>
<h4>选择行标记类型（mark、ins、del）</h4>
<pre><code>function demo() {
  console.log('this line is marked as deleted')
  // This line and the next one are marked as inserted
  console.log('this is the second inserted line')

  return 'this line uses the neutral default marker type'
}
</code></pre>
<h4>为行标记添加标签</h4>
<pre><code>// labeled-line-markers.jsx
&lt;button
  role="button"
  {...props}
  value={value}
  className={buttonClassName}
  disabled={disabled}
  active={active}
&gt;
  {children &amp;&amp;
    !active &amp;&amp;
    (typeof children === 'string' ? &lt;span&gt;{children}&lt;/span&gt; : children)}
&lt;/button&gt;
</code></pre>
<h4>将较长标签单独放在一行</h4>
<pre><code>// labeled-line-markers.jsx
&lt;button
  role="button"
  {...props}

  value={value}
  className={buttonClassName}

  disabled={disabled}
  active={active}
&gt;

  {children &amp;&amp;
    !active &amp;&amp;
    (typeof children === 'string' ? &lt;span&gt;{children}&lt;/span&gt; : children)}
&lt;/button&gt;
</code></pre>
<h4>使用类似 diff 的语法</h4>
<pre><code>+this line will be marked as inserted
-this line will be marked as deleted
this is a regular line
</code></pre>
<hr />
<pre><code>--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+this is an actual diff file
-all contents will remain unmodified
 no whitespace will be removed either
</code></pre>
<h4>将语法高亮与类似 diff 的语法结合使用</h4>
<pre><code>  function thisIsJavaScript() {
    // This entire block gets highlighted as JavaScript,
    // and we can still add diff markers to it!
-   console.log('Old code to be removed')
+   console.log('New and shiny code!')
  }
</code></pre>
<h4>标记行内的指定文本</h4>
<pre><code>function demo() {
  // Mark any given text inside lines
  return 'Multiple matches of the given text are supported';
}
</code></pre>
<h4>正则表达式</h4>
<pre><code>console.log('The words yes and yep will be marked.')
</code></pre>
<h4>转义正斜杠</h4>
<pre><code>echo "Test" &gt; /home/test.txt
</code></pre>
<h4>选择行内标记类型（mark、ins、del）</h4>
<pre><code>function demo() {
  console.log('These are inserted and deleted marker types');
  // The return statement uses the default marker type
  return true;
}
</code></pre>
<h3>自动换行</h3>
<p><a href="https://expressive-code.com/key-features/word-wrap/">自动换行</a></p>
<h4>为代码块配置自动换行</h4>
<pre><code>// Example with wrap
function getLongString() {
  return 'This is a very long string that will most probably not fit into the available space unless the container is extremely wide'
}
</code></pre>
<hr />
<pre><code>// Example with wrap=false
function getLongString() {
  return 'This is a very long string that will most probably not fit into the available space unless the container is extremely wide'
}
</code></pre>
<h4>配置换行后的缩进</h4>
<pre><code>// Example with preserveIndent (enabled by default)
function getLongString() {
  return 'This is a very long string that will most probably not fit into the available space unless the container is extremely wide'
}
</code></pre>
<hr />
<pre><code>// Example with preserveIndent=false
function getLongString() {
  return 'This is a very long string that will most probably not fit into the available space unless the container is extremely wide'
}
</code></pre>
<h2>可折叠区域</h2>
<p><a href="https://expressive-code.com/plugins/collapsible-sections/">可折叠区域</a></p>
<pre><code>// All this boilerplate setup code will be collapsed
import { someBoilerplateEngine } from '@example/some-boilerplate'
import { evenMoreBoilerplate } from '@example/even-more-boilerplate'

const engine = someBoilerplateEngine(evenMoreBoilerplate())

// This part of the code will be visible by default
engine.doSomething(1, 2, 3, calcFn)

function calcFn() {
  // You can have multiple collapsed sections
  const a = 1
  const b = 2
  const c = a + b

  // This will remain visible
  console.log(`Calculation result: ${a} + ${b} = ${c}`)
  return c
}

// All this code until the end of the block will be collapsed again
engine.closeConnection()
engine.freeMemory()
engine.shutdown({ reason: 'End of example boilerplate code' })
</code></pre>
<h2>行号</h2>
<p><a href="https://expressive-code.com/plugins/line-numbers/">行号</a></p>
<h3>为每个代码块显示行号</h3>
<pre><code>// This code block will show line numbers
console.log('Greetings from line 2!')
console.log('I am on line 3')
</code></pre>
<hr />
<pre><code>// Line numbers are disabled for this block
console.log('Hello?')
console.log('Sorry, do you know what line I am on?')
</code></pre>
<h3>更改起始行号</h3>
<pre><code>console.log('Greetings from line 5!')
console.log('I am on line 6')
</code></pre>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="示例"/>
  </entry>
  <entry>
    <title>Markdown 示例</title>
    <link href="https://tncloud.fun/posts/markdown/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/markdown/</id>
    <published>2023-10-01T00:00:00.000Z</published>
    <updated>2023-10-01T00:00:00.000Z</updated>
    <summary>一个简单的 Markdown 博客文章示例。</summary>
    <content type="html"><![CDATA[<h1>一级标题</h1>
<p>段落之间以空行分隔。</p>
<p>这是第二段。可以使用 <em>斜体</em>、<strong>粗体</strong>和 <code>等宽字体</code>。无序列表如下：</p>
<ul>
<li>第一项</li>
<li>第二项</li>
<li>第三项</li>
</ul>
<p>注意：不包括星号在内，正文从缩进 4 列的位置开始。</p>
<blockquote>
<p>引用块的写法如下。</p>
<p>需要时，引用块也可以包含多个段落。</p>
</blockquote>
<p>使用三个短横线表示破折号。使用两个短横线表示范围（例如“详见第 12--14 章”）。三个句点 <code>...</code> 会转换为省略号。支持 Unicode 字符。☺</p>
<h2>二级标题</h2>
<p>有序列表示例如下：</p>
<ol>
<li>第一项</li>
<li>第二项</li>
<li>第三项</li>
</ol>
<p>再次注意，正文从左侧起第 4 列（即缩进 4 个字符）开始。下面是一个代码示例：</p>
<pre><code># 再强调一次……
for i in 1 .. 10 { do-something(i) }
</code></pre>
<p>如你所料，这段代码缩进了 4 个空格。除此之外，也可以使用围栏代码块，而不必缩进整个代码块：</p>
<pre><code>define foobar() {
    print "欢迎来到风味之乡！";
}
</code></pre>
<p>（这种写法更便于复制和粘贴。）也可以为围栏代码块指定语言，让 Pandoc 为其添加语法高亮：</p>
<pre><code>import time
# 快速数到十！
for i in range(10):
    # （但也别*太*快）
    time.sleep(0.5)
    print i
</code></pre>
<h3>三级标题</h3>
<p>下面是一个嵌套列表：</p>
<ol>
<li>
<p>首先，准备以下材料：</p>
<ul>
<li>胡萝卜</li>
<li>芹菜</li>
<li>小扁豆</li>
</ul>
</li>
<li>
<p>烧一些水。</p>
</li>
<li>
<p>将所有材料放入锅中，并按以下步骤操作：</p>
<pre><code> 找一把木勺
 揭开锅盖
 搅拌
 盖上锅盖
 将木勺小心地架在锅柄上
 等待 10 分钟
 返回第一步（或完成后关闭炉火）
</code></pre>
<p>小心别碰到木勺，否则它会掉下来。</p>
</li>
</ol>
<p>再次注意，正文始终与 4 个空格的缩进对齐（包括上方延续第 3 项内容的最后一行）。</p>
<p>链接示例：<a href="http://foo.bar">网站</a>、<a href="local-doc.html">本地文档</a>和<a href="#%E4%BA%8C%E7%BA%A7%E6%A0%87%E9%A2%98">本文章节标题</a>。这里还有一个脚注<a href="%E8%84%9A%E6%B3%A8%E5%86%85%E5%AE%B9%E5%86%99%E5%9C%A8%E8%BF%99%E9%87%8C%E3%80%82">^1</a>。</p>
<p>表格可以这样编写：</p>
<p>尺寸 材质 颜色</p>
<hr />
<p>9 皮革 棕色
10 麻布 本色
11 玻璃 透明</p>
<p>表格：鞋子的尺寸与材质</p>
<p>（上方文字是表格标题。）Pandoc 也支持多行表格：</p>
<hr />
<p>关键词 说明</p>
<hr />
<p>红色 日落、苹果以及其他红色或偏红的事物。</p>
<p>绿色 树叶、青草、青蛙，以及其他呈绿色的事物。</p>
<hr />
<p>下面是一条水平分隔线。</p>
<hr />
<p>下面是一个定义列表：</p>
<p>苹果
: 适合用来制作苹果酱。
橙子
: 一种柑橘类水果！
西红柿
: tomato 这个词末尾没有字母“e”。</p>
<p>同样，正文缩进 4 个空格。（在每组术语和定义之间添加空行，可以让版面更疏朗。）</p>
<p>下面是一个“逐行引用块”：</p>
<p>| 第一行
| 第二行
| 第三行</p>
<p>图片可以这样指定：</p>
<p>行内数学公式可以这样写：$\omega = d\phi / dt$。块级公式应独占一行，并用一对双美元符号包裹：</p>
<p>$$I = \int \rho R^{2} dV$$</p>
<p>$$
\begin{equation*}
\pi
=3.1415926535
;8979323846;2643383279;5028841971;6939937510;5820974944
;5923078164;0628620899;8628034825;3421170679;\ldots
\end{equation*}
$$</p>
<p>注意：如果希望标点字符按原样显示，可以在前面添加反斜杠进行转义，例如：`foo`、*bar* 等。</p>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="示例"/>
  </entry>
  <entry>
    <title>在文章中嵌入视频</title>
    <link href="https://tncloud.fun/posts/video/" rel="alternate" type="text/html"/>
    <id>https://tncloud.fun/posts/video/</id>
    <published>2023-08-01T00:00:00.000Z</published>
    <updated>2023-08-01T00:00:00.000Z</updated>
    <summary>本文演示如何在博客文章中嵌入视频。</summary>
    <content type="html"><![CDATA[<p>只需从 YouTube 或其他平台复制嵌入代码，再粘贴到 Markdown 文件中即可。</p>
<pre><code>---
title: 在文章中嵌入视频
published: 2023-10-19
// ...
---

&lt;iframe width="100%" height="468" src="https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_" title="YouTube video player" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
</code></pre>
<h2>YouTube 视频</h2>
<p>::youtube{id="5gIf0_xpFPI" title="YouTube 视频" preload="auto"}</p>
<h2>Bilibili 视频</h2>
<p>::bilibili{bvid="BV1fK4y1s7Qf" title="Bilibili 视频" p=1 preload="auto"}</p>
<h2>AcFun 视频</h2>
<p>::acfun{acid="ac48649632" title="AcFun 视频" preload="auto"}</p>
<h2>ArtPlayer 视频</h2>
<p>::artplayer{src="https://www.pexels.com/download/video/38538991/" title="Sintel 预告片" preload="auto"}</p>
]]></content>
    <author><name>やわらかな光</name></author>
    <category term="示例"/>
  </entry>
</feed>
