<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Touchfish.blog</title><description>励志成为 AI 时代的前沿工程师</description><link>https://blog.fishai.top/</link><language>zh_CN</language><item><title>Shirone Authoring &amp; Usage Guide</title><link>https://blog.fishai.top/posts/guide/</link><guid isPermaLink="true">https://blog.fishai.top/posts/guide/</guid><description>A comprehensive guide to post authoring, frontmatter schema, Markdown extensions, encryption, and media in Shirone.</description><pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Welcome to &lt;strong&gt;Shirone&lt;/strong&gt; (白音) — an expressive, anime-inspired blog theme crafted around &lt;strong&gt;Astro 7&lt;/strong&gt;, &lt;strong&gt;Svelte 5&lt;/strong&gt;, and the &lt;strong&gt;Material 3 Expressive (M3E)&lt;/strong&gt; design system.&lt;/p&gt;
&lt;p&gt;This guide walks you through post creation, frontmatter specifications, directory structure, and the full suite of built-in Markdown and MDX extensions.&lt;/p&gt;
&lt;p&gt;:::tip
Shirone renders content server-side first (SSR-first). When navigating within the site, Swup seamlessly swaps the main container while preserving the outer application shell and continuous music playback.
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. Creating a New Post&lt;/h2&gt;
&lt;p&gt;You can quickly scaffold a new post with standard frontmatter using the built-in CLI command:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Create a single-file post
pnpm new-post my-first-post

# Or create a post in a sub-directory
pnpm new-post guides/getting-started
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The newly created file will be placed in &lt;code&gt;src/content/posts/&lt;/code&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2. Frontmatter Specification&lt;/h2&gt;
&lt;p&gt;Every Markdown (&lt;code&gt;.md&lt;/code&gt;) or MDX (&lt;code&gt;.mdx&lt;/code&gt;) post starts with a YAML frontmatter block defining its metadata.&lt;/p&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;---
title: &quot;Exploring Material 3 Expressive Design&quot;
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: &quot;A deep dive into dynamic HCT color science and fluid transitions in Shirone.&quot;
image: &quot;./cover.webp&quot;
tags: [M3E, Design, Frontend]
category: Guides
draft: false
comment: true
---
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Supported Frontmatter Fields&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The main title of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;published&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Date&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Publication date in &lt;code&gt;YYYY-MM-DD&lt;/code&gt; format.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;publishedAt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Date&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Precise publication instant used to order posts published on the same day. It must fall on &lt;code&gt;published&lt;/code&gt; in the configured site time zone.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;updated&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Date&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Last updated date. When provided, an update notice badge is displayed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;updatedAt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Date&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Precise update instant used by feeds and machine-readable metadata. It must be paired with &lt;code&gt;updated&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pinned&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Pin the post to the top of article lists (default: &lt;code&gt;false&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Post summary displayed in article cards, search results, and OpenGraph metadata.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Cover image path. Supports relative (&lt;code&gt;./cover.webp&lt;/code&gt;), public (&lt;code&gt;/images/cover.jpg&lt;/code&gt;), or remote URLs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Array of tag names for taxonomy filtering and tag clouds.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Primary category name for taxonomy indexing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Mark as draft. Draft posts are hidden during production build (&lt;code&gt;pnpm build&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;comment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Toggle comment section for this specific post (default: &lt;code&gt;true&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lang&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Language code (e.g. &lt;code&gt;en&lt;/code&gt;, &lt;code&gt;zh_CN&lt;/code&gt;, &lt;code&gt;ja&lt;/code&gt;) if different from site default.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Post Encryption&lt;/h2&gt;
&lt;p&gt;Shirone provides client-side post encryption. For private journals or restricted articles, specify a password in frontmatter:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: &quot;Private Research Notes&quot;
published: 2026-08-26
encrypted: true
password: &quot;your-secret-passphrase&quot;
passwordHint: &quot;Favorite anime character&quot;
hideHomeContent: true
---
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;encrypted&lt;/code&gt;: Set to &lt;code&gt;true&lt;/code&gt; to enable encryption;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;password&lt;/code&gt;: Passphrase string or number required to unlock the post;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;passwordHint&lt;/code&gt;: Optional hint shown above the password entry form;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hideHomeContent&lt;/code&gt;: Hide word counts and content previews on the homepage to prevent data leakage.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;4. Organizing Post Files&lt;/h2&gt;
&lt;p&gt;Shirone supports both folder-based co-location and single-file layouts:&lt;/p&gt;
&lt;h3&gt;Folder Structure (Recommended for Local Assets)&lt;/h3&gt;
&lt;p&gt;Co-locating your post and its media makes asset management straightforward:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/content/posts/
├── my-great-post/
│   ├── index.md           &amp;lt;-- Post content
│   ├── cover.webp         &amp;lt;-- Cover image (image: &quot;./cover.webp&quot;)
│   └── diagram.png        &amp;lt;-- Inline illustration referenced in markdown
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Single-File Structure (Lightweight Prose)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;src/content/posts/
├── hello-world.md
└── quick-thoughts.md
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;5. Rich Markdown &amp;amp; MDX Extensions&lt;/h2&gt;
&lt;p&gt;Shirone includes modern Markdown extensions out of the box:&lt;/p&gt;
&lt;h3&gt;5.1 Admonitions&lt;/h3&gt;
&lt;p&gt;Use container directives for notes, tips, warnings, and alerts:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::tip
Use admonition containers to highlight key takeaways or best practices.
:::

:::warning
Use warning containers to signal potential pitfalls or breaking changes.
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.2 GitHub Repository Cards&lt;/h3&gt;
&lt;p&gt;Embed live, beautifully styled GitHub repository cards using the directive syntax:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;::github{repo=&quot;LyraVoid/Shirone&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;::github{repo=&quot;LyraVoid/Shirone&quot;}&lt;/p&gt;
&lt;h3&gt;5.3 Expressive Code Blocks&lt;/h3&gt;
&lt;p&gt;Enhanced code blocks feature syntax highlighting, file name badges, line numbers, and selective line highlighting:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Dynamic HCT color token derivation
import { argbFromHex, themeFromSourceColor } from &quot;@material/material-color-utilities&quot;;

const theme = themeFromSourceColor(argbFromHex(&quot;#f472b6&quot;));
console.log(&quot;Primary color token:&quot;, theme.schemes.light.primary);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.4 Mathematical Typesetting (KaTeX)&lt;/h3&gt;
&lt;p&gt;Render elegant LaTeX mathematical notation directly in Markdown:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inline math&lt;/strong&gt;: $E = mc^2$ or Euler&apos;s formula $e^{i\pi} + 1 = 0$.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Block math&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
\int_{-\infty}^{\infty} e^{-x^2} , dx = \sqrt{\pi}
$$&lt;/p&gt;
&lt;h3&gt;5.5 Mermaid Diagrams&lt;/h3&gt;
&lt;p&gt;Create flowcharts, sequence diagrams, and architecture maps using plain text:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sequenceDiagram
    autonumber
    actor Visitor as Visitor
    participant Page as Shirone Page
    participant Swup as Swup Container
    participant Audio as Persistent Shell

    Visitor-&amp;gt;&amp;gt;Page: Click Navigation Link
    Page-&amp;gt;&amp;gt;Swup: Trigger Seamless Transition
    Swup-&amp;gt;&amp;gt;Page: Replace #swup-container
    Note over Audio: Background music plays continuously
    Page--&amp;gt;&amp;gt;Visitor: New Page Rendered
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.6 Image Galleries &amp;amp; Fancybox Lightbox&lt;/h3&gt;
&lt;p&gt;Images automatically integrate with Fancybox for lossless zoom, pan gestures, and full-screen preview:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![Cover preview](./cover.jpeg)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;6. Next Steps &amp;amp; Customization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Site Configuration&lt;/strong&gt;: Learn about global settings in &lt;code&gt;src/config/siteConfig.ts&lt;/code&gt; and &lt;a href=&quot;https://github.com/LyraVoid/Shirone/blob/main/src/config/README.md&quot;&gt;&lt;code&gt;src/config/README.md&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design Tokens&lt;/strong&gt;: Explore tokens and color palettes in &lt;code&gt;DESIGN.md&lt;/code&gt; and &lt;code&gt;docs/m3e-standard.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feedback &amp;amp; Community&lt;/strong&gt;: Share your ideas and questions on &lt;a href=&quot;https://github.com/LyraVoid/Shirone/issues&quot;&gt;GitHub Issues&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>🔒 Password Protection and Post Encryption Demo</title><link>https://blog.fishai.top/posts/encrypted-demo/</link><guid isPermaLink="true">https://blog.fishai.top/posts/encrypted-demo/</guid><description>该文章内容已加密，请输入密码后查看。</description><pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;🔒 本文已加密保护，请访问博客网站输入密码阅读全文。&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title>Shirone Markdown Enhancements</title><link>https://blog.fishai.top/posts/markdown-enhancements/</link><guid isPermaLink="true">https://blog.fishai.top/posts/markdown-enhancements/</guid><description>Explore Shirone&apos;s custom Markdown extensions, expressive components, and authoring syntax.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Shirone provides a collection of theme-exclusive Markdown extensions and custom syntax containers. Built on top of our native unified AST processing pipeline, all extensions render into accessible, semantic HTML during site build time with &lt;strong&gt;zero client JavaScript hydration overhead&lt;/strong&gt; and &lt;strong&gt;100% M3E design token alignment&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;File Trees&lt;/h2&gt;
&lt;p&gt;File Trees turn multi-level project structures, source hierarchies, and terminal directory outputs into compact, interactive tree views with automatic extension icons, diff highlighting, and collapsible branches.&lt;/p&gt;
&lt;h3&gt;1. Nested List Syntax (&lt;code&gt;:::file-tree&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Use the &lt;code&gt;:::file-tree&lt;/code&gt; block directive when writing the file hierarchy directly as a Markdown nested list.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::file-tree{title=&quot;Shirone source tree&quot;}
- src
  - components/
    - ++ Navigation.svelte # added component
    - -- Button.astro # removed component
  - content
    - posts/
      - markdown-enhancements.md
  - layouts/
    - PostLayout.astro
  - plugins
    - markdown/
      - rehype-file-tree.mjs
  - styles
    - markdown/
      - trees.css
  - **content.config.ts** # important file
- public/
  - favicon.svg
- package.json
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::file-tree{title=&quot;Shirone source tree&quot;}&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;src
&lt;ul&gt;
&lt;li&gt;components/
&lt;ul&gt;
&lt;li&gt;++ Navigation.svelte # added component&lt;/li&gt;
&lt;li&gt;-- Button.astro # removed component&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;content
&lt;ul&gt;
&lt;li&gt;posts/
&lt;ul&gt;
&lt;li&gt;markdown-enhancements.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;layouts/
&lt;ul&gt;
&lt;li&gt;PostLayout.astro&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;plugins
&lt;ul&gt;
&lt;li&gt;markdown/
&lt;ul&gt;
&lt;li&gt;rehype-file-tree.mjs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;styles
&lt;ul&gt;
&lt;li&gt;markdown/
&lt;ul&gt;
&lt;li&gt;trees.css&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;content.config.ts&lt;/strong&gt; # important file&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;public/
&lt;ul&gt;
&lt;li&gt;favicon.svg&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;package.json
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Authoring Rules &amp;amp; Markers&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Diff States&lt;/strong&gt;: Prefix an item with &lt;code&gt;++&lt;/code&gt; (green background &amp;amp; badge) or &lt;code&gt;--&lt;/code&gt; (red background &amp;amp; strikethrough) to highlight changes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comments&lt;/strong&gt;: Any text following a &lt;code&gt;#&lt;/code&gt; is rendered as a muted, right-aligned inline comment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Emphasis&lt;/strong&gt;: Wrap names in &lt;code&gt;**bold**&lt;/code&gt; to give key files prominent visual weight.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collapsible Folders&lt;/strong&gt;: Directories inferred from nested list items start expanded by default. Add a trailing slash (e.g. &lt;code&gt;components/&lt;/code&gt;) to create a collapsed directory that readers can expand on click or via keyboard navigation.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;2. Terminal Output Syntax (&lt;code&gt;```file-tree&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;When you already have directory tree text generated from command-line tools like &lt;code&gt;tree&lt;/code&gt;, paste it directly into a &lt;code&gt;file-tree&lt;/code&gt; fenced code block. Both Unicode branch characters (&lt;code&gt;├──&lt;/code&gt;, &lt;code&gt;└──&lt;/code&gt;, &lt;code&gt;│&lt;/code&gt;) and ASCII branches are automatically parsed.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```file-tree title=&quot;Build output&quot; icon=&quot;simple&quot;
dist
├── _astro/
│   ├── index.css
│   └── page.js
└── favicon.ico
```
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;dist
├── _astro/
│   ├── index.css
│   └── page.js
└── favicon.ico
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Configuration Options&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;title=&quot;string&quot;&lt;/code&gt;: Sets a custom header title and accessible label for the tree.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;icon=&quot;colored&quot; | &quot;simple&quot;&lt;/code&gt;: Choose between multi-color extension icons (&lt;code&gt;colored&lt;/code&gt;, default) or minimal monochrome icons (&lt;code&gt;simple&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Code Trees&lt;/h2&gt;
&lt;p&gt;Interactive Code Trees pair a multi-level file hierarchy navigation pane on the left with instant code panel switching on the right. They provide an IDE-like reading experience for multi-file examples, modules, or whole directory walk-throughs.&lt;/p&gt;
&lt;h3&gt;1. Container Syntax (&lt;code&gt;:::code-tree&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Combine multiple fenced code blocks within a &lt;code&gt;:::code-tree&lt;/code&gt; block directive. Each code block specifies its path via &lt;code&gt;title=&quot;path/to/file&quot;&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::code-tree{title=&quot;Shirone Component Demo&quot; height=&quot;380px&quot; entry=&quot;src/Button.svelte&quot;}
```svelte title=&quot;src/Button.svelte&quot;
&amp;lt;script lang=&quot;ts&quot;&amp;gt;
  let { label = &quot;Click me&quot; } = $props();
&amp;lt;/script&amp;gt;

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

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

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

&amp;lt;button class=&quot;m3-btn&quot;&amp;gt;{label}&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.m3-btn
  background: var(--primary)
  color: var(--on-primary)
  border-radius: var(--shape-corner-m)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;button-demo&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h4&gt;Configuration &amp;amp; Markers&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;title=&quot;string&quot;&lt;/code&gt;: Sets the header title and accessible label for the code tree.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;height=&quot;string&quot;&lt;/code&gt;: Sets the height for the desktop view (default &lt;code&gt;420px&lt;/code&gt;, e.g. &lt;code&gt;380px&lt;/code&gt;, &lt;code&gt;26rem&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;entry=&quot;filepath&quot;&lt;/code&gt;: Specifies which file is active upon first load.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;icon=&quot;colored&quot; | &quot;simple&quot;&lt;/code&gt;: Switch between colorful or minimal monochrome file icons.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:active&lt;/code&gt;: Place &lt;code&gt;:active&lt;/code&gt; on any fenced code block to designate it as the default active tab.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;2. Local Directory Auto-Import (&lt;code&gt;@[code-tree]&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Point directly to any local directory path in the workspace to automatically scan and generate an interactive code tree at build time without manually copying file contents.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@[code-tree title=&quot;Anime Utilities&quot; entry=&quot;status.ts&quot;](/src/utils/anime)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;@&lt;a href=&quot;/src/config&quot;&gt;code-tree title=&quot;Site Configuration&quot; entry=&quot;siteConfig.ts&quot;&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Audio Reader: Japanese Anime Mystery Voices</title><link>https://blog.fishai.top/posts/audio-reader/</link><guid isPermaLink="true">https://blog.fishai.top/posts/audio-reader/</guid><description>A small collection of mysterious Japanese anime voice fragments, played on demand with Audio Reader.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;These short Japanese voice fragments feel as though they were picked up from the edge of an anime scene: a teasing call, a bright greeting, a tiny laugh, and a few lines with no clear origin. They are mood samples rather than dialogue transcripts, so let the sound carry the meaning.&lt;/p&gt;
&lt;p&gt;Audio Reader keeps them quiet until you choose to listen. Each speaker button loads and plays its clip only after it is pressed.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:audio-reader[Clip title]{src=&quot;/assets/audio/filename.wav&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;The fragments&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Baka&lt;/strong&gt;: :audio-reader[バカ]{src=&quot;/assets/audio/Baka.wav&quot;}&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ciallo&lt;/strong&gt;: :audio-reader[Ciallo！！]{src=&quot;/assets/audio/Ciallo.wav&quot;}&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ehe&lt;/strong&gt;: :audio-reader[A joking sense]{src=&quot;/assets/audio/Ehe.wav&quot;}&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Imoi&lt;/strong&gt;: :audio-reader[イモい]{src=&quot;/assets/audio/Imoi.wav&quot;}&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zako&lt;/strong&gt;: :audio-reader[雑魚じゃん、雑魚雑魚]{src=&quot;/assets/audio/Zako.wav&quot;}&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;src&lt;/code&gt; must use a site-root path or an HTTPS URL, and the directive label cannot be empty. Invalid or incomplete directives remain ordinary Markdown and do not load Audio Reader resources.&lt;/p&gt;
</content:encoded></item><item><title>Markdown Collapse Panels</title><link>https://blog.fishai.top/posts/collapse-panels/</link><guid isPermaLink="true">https://blog.fishai.top/posts/collapse-panels/</guid><description>Group optional Markdown content into compact, accessible M3E disclosure panels.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Collapse panels keep related optional details in one compact group. Titles and bodies retain inline and block Markdown, while native disclosure semantics make every panel usable without client JavaScript.&lt;/p&gt;
&lt;h2&gt;Independent panels&lt;/h2&gt;
&lt;p&gt;Items open independently by default. Prefix a title with &lt;code&gt;:+&lt;/code&gt; to open that item initially or &lt;code&gt;:-&lt;/code&gt; to keep it closed when the group uses &lt;code&gt;expand&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;::: collapse&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Package requirements&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Use Node.js 22 or newer and enable Corepack before installing packages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;:+ Install dependencies&lt;/p&gt;
&lt;p&gt;Run the workspace package command from the repository root.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm.cmd install
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Validation commands&lt;/p&gt;
&lt;p&gt;Check the content pipeline before building the production output.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pnpm.cmd check:manifest&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npx.cmd astro check&lt;/code&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Accordion mode&lt;/h2&gt;
&lt;p&gt;Add &lt;code&gt;accordion&lt;/code&gt; when only one answer should remain open. The browser groups the native disclosures directly, so opening another item closes the previous one without hydration.&lt;/p&gt;
&lt;p&gt;::: collapse accordion expand&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;What does &lt;code&gt;expand&lt;/code&gt; do here?&lt;/p&gt;
&lt;p&gt;It opens the first item initially when no item has a &lt;code&gt;:+&lt;/code&gt; marker.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Can a title contain Markdown?&lt;/p&gt;
&lt;p&gt;Yes. Titles support inline &lt;strong&gt;emphasis&lt;/strong&gt; and &lt;code&gt;code&lt;/code&gt;, while panel bodies support full block Markdown.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What happens on a narrow screen?&lt;/p&gt;
&lt;p&gt;Content padding becomes compact, long text wraps, and embedded code keeps its own horizontal scrolling area.
:::&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Author syntax&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;::: collapse accordion
- :+ First title

  First panel content.

- Second title with `code`

  Second panel content.
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The container must contain exactly one top-level unordered list. Every item needs a title paragraph, a blank line, and body content. Invalid or mixed input remains an ordinary readable Markdown list.&lt;/p&gt;
</content:encoded></item><item><title>Markdown Abbreviations</title><link>https://blog.fishai.top/posts/markdown-abbreviations/</link><guid isPermaLink="true">https://blog.fishai.top/posts/markdown-abbreviations/</guid><description>Define common acronyms once and keep their full meaning available in normal article text.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Abbreviations keep technical writing compact while preserving the full term for readers who need it. A defined term renders as a native &lt;code&gt;abbr&lt;/code&gt; element with its meaning available on hover and to assistive technology.&lt;/p&gt;
&lt;h2&gt;In context&lt;/h2&gt;
&lt;p&gt;SSR-first output keeps the initial document visible before JavaScript runs. When measuring its reading experience, LCP and CLS reveal whether the first visible content is fast and stable.&lt;/p&gt;
&lt;p&gt;An abbreviation can also appear next to ordinary Markdown such as &lt;strong&gt;SSR&lt;/strong&gt; guidance, but literal code such as &lt;code&gt;SSR&lt;/code&gt; and links like &lt;a href=&quot;https://web.dev/articles/lcp&quot;&gt;LCP documentation&lt;/a&gt; remain untouched.&lt;/p&gt;
&lt;h2&gt;Define terms&lt;/h2&gt;
&lt;p&gt;Place definitions anywhere in the same Markdown document. They do not render as visible paragraphs, and only matching terms in that article receive the semantic abbreviation treatment.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*[SSR]: Server-Side Rendering
*[LCP]: Largest Contentful Paint
*[CLS]: Cumulative Layout Shift

SSR makes an HTML response available before client code runs.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;*[SSR]: Server-Side Rendering
*[LCP]: Largest Contentful Paint
*[CLS]: Cumulative Layout Shift&lt;/p&gt;
&lt;h2&gt;Authoring boundaries&lt;/h2&gt;
&lt;p&gt;Terms must begin with a letter or number and may contain letters, numbers, periods, underscores, plus signs, and hyphens. Each definition applies to the current article only; an invalid or duplicate definition remains ordinary Markdown instead of silently replacing another term.&lt;/p&gt;
</content:encoded></item><item><title>Markdown File Includes</title><link>https://blog.fishai.top/posts/markdown-includes/</link><guid isPermaLink="true">https://blog.fishai.top/posts/markdown-includes/</guid><description>Build-time Markdown file and slice includes.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Shirone can include a local Markdown file or a safe slice of one.&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- @include: src/content/snippets/include-example.md#public-api --&amp;gt;&lt;/p&gt;
&lt;p&gt;The full file and line-range forms are also supported:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- @include: src/content/snippets/include-example.md --&amp;gt;
&amp;lt;!-- @include: src/content/snippets/include-example.md{1-4} --&amp;gt;
&amp;lt;!-- @include: src/content/snippets/include-example.md{5-} --&amp;gt;
&amp;lt;!-- @include: src/content/snippets/include-example.md{-4} --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Include comments inside fenced code remain literal.&lt;/p&gt;
</content:encoded></item><item><title>Markdown Marker Highlights</title><link>https://blog.fishai.top/posts/marker-highlights/</link><guid isPermaLink="true">https://blog.fishai.top/posts/marker-highlights/</guid><description>Highlight key phrases with token-driven marker syntax in Shirone Markdown.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Marker highlights bring attention to a specific phrase without turning the surrounding paragraph into a separate component. They render as native &lt;code&gt;&amp;lt;mark&amp;gt;&lt;/code&gt; elements during the build and inherit the active M3E color system.&lt;/p&gt;
&lt;h2&gt;Default emphasis&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;==text==&lt;/code&gt; when the article&apos;s primary color should carry the emphasis. This is useful for ==one decision that readers should retain== while they continue through an ordinary paragraph.&lt;/p&gt;
&lt;p&gt;The marker may contain ==nested &lt;strong&gt;Markdown emphasis&lt;/strong&gt;== when the phrase needs a stronger hierarchy.&lt;/p&gt;
&lt;h2&gt;Semantic colors&lt;/h2&gt;
&lt;p&gt;Use a suffix when the meaning needs a different tonal role. The available variants are &lt;code&gt;primary&lt;/code&gt;, &lt;code&gt;secondary&lt;/code&gt;, &lt;code&gt;tertiary&lt;/code&gt;, &lt;code&gt;error&lt;/code&gt;, and &lt;code&gt;tip&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;==Primary connects the phrase to the active theme=={.primary}&lt;/li&gt;
&lt;li&gt;==Secondary keeps a supporting distinction quiet=={.secondary}&lt;/li&gt;
&lt;li&gt;==Tertiary adds a separate editorial signal=={.tertiary}&lt;/li&gt;
&lt;li&gt;==Error identifies a condition that needs correction=={.error}&lt;/li&gt;
&lt;li&gt;==Tip highlights practical guidance=={.tip}&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Author syntax&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;==Primary marker==

==Secondary marker=={.secondary}
==Tertiary marker=={.tertiary}
==Error marker=={.error}
==Tip marker=={.tip}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Inline code such as &lt;code&gt;==literal marker syntax==&lt;/code&gt; and fenced examples stay literal, so documentation can explain the syntax without triggering it.&lt;/p&gt;
</content:encoded></item><item><title>Markdown Option Groups</title><link>https://blog.fishai.top/posts/option-groups/</link><guid isPermaLink="true">https://blog.fishai.top/posts/option-groups/</guid><description>Present related Markdown alternatives in compact, synchronized M3E option groups.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Option groups keep equivalent instructions together without repeating the surrounding explanation. Each option accepts full block Markdown, while the selected value can synchronize with another group on the same page.&lt;/p&gt;
&lt;h2&gt;Choose a package manager&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;@tab:active&lt;/code&gt; to select the initial option. A suffix after &lt;code&gt;#&lt;/code&gt; supplies a stable value without changing the visible title.&lt;/p&gt;
&lt;p&gt;::: tabs#package-manager&lt;/p&gt;
&lt;p&gt;@tab npm&lt;/p&gt;
&lt;p&gt;Install the package with npm:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install astro
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;@tab:active &lt;strong&gt;pnpm&lt;/strong&gt;#pnpm&lt;/p&gt;
&lt;p&gt;Install the package with pnpm:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm.cmd add astro
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;@tab Bun#bun&lt;/p&gt;
&lt;p&gt;Install the package with Bun:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bun add astro
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;Run the project&lt;/h2&gt;
&lt;p&gt;This group shares the &lt;code&gt;package-manager&lt;/code&gt; id. Selecting an option above updates the matching command below and remembers that choice for the next visit.&lt;/p&gt;
&lt;p&gt;::: tabs#package-manager&lt;/p&gt;
&lt;p&gt;@tab npm&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;@tab pnpm&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm.cmd dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;@tab Bun#bun&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bun run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;Many alternatives&lt;/h2&gt;
&lt;p&gt;Longer option rows remain on one line and scroll within their own navigation area on narrow screens.&lt;/p&gt;
&lt;p&gt;::: tabs&lt;/p&gt;
&lt;p&gt;@tab Local workstation&lt;/p&gt;
&lt;p&gt;Use the local toolchain while developing a feature.&lt;/p&gt;
&lt;p&gt;@tab Hosted preview environment&lt;/p&gt;
&lt;p&gt;Publish a temporary preview for review.&lt;/p&gt;
&lt;p&gt;@tab Continuous integration&lt;/p&gt;
&lt;p&gt;Run deterministic validation for every change.&lt;/p&gt;
&lt;p&gt;@tab Production deployment&lt;/p&gt;
&lt;p&gt;Promote a verified artifact to production.&lt;/p&gt;
&lt;p&gt;@tab Offline recovery workflow&lt;/p&gt;
&lt;p&gt;Restore from a local artifact when the network is unavailable.&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;Author syntax&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;::: tabs#package-manager

@tab npm

Use npm instructions here.

@tab:active **pnpm**#pnpm

Use pnpm instructions here.

:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each group needs at least two &lt;code&gt;@tab&lt;/code&gt; sections, and every section needs body content separated from its marker by a blank line. Invalid or incomplete groups remain readable as ordinary Markdown.&lt;/p&gt;
</content:encoded></item><item><title>Markdown Spoilers</title><link>https://blog.fishai.top/posts/spoilers/</link><guid isPermaLink="true">https://blog.fishai.top/posts/spoilers/</guid><description>Hide inline answers while keeping spoiler content accessible in Shirone Markdown.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Spoilers conceal a short answer or plot detail without removing it from the document. Hover, focus, or activate the native control to reveal the content.&lt;/p&gt;
&lt;h2&gt;Inline details&lt;/h2&gt;
&lt;p&gt;The answer is :spoiler[&lt;strong&gt;42&lt;/strong&gt;], and this sentence remains ordinary Markdown around it.&lt;/p&gt;
&lt;p&gt;Spoilers can include &lt;code&gt;inline code&lt;/code&gt; and :spoiler[a longer detail with &lt;strong&gt;emphasis&lt;/strong&gt;].&lt;/p&gt;
&lt;h2&gt;Author syntax&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;The answer is :spoiler[42].
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The generated HTML uses a native button with an &lt;code&gt;aria-expanded&lt;/code&gt; state. Without JavaScript, hover and focus still reveal the text; the optional runtime adds click and keyboard toggling.&lt;/p&gt;
</content:encoded></item><item><title>Markdown Admonitions</title><link>https://blog.fishai.top/posts/admonitions/</link><guid isPermaLink="true">https://blog.fishai.top/posts/admonitions/</guid><description>Present notes, warnings, and optional details with Shirone&apos;s M3E Markdown containers.</description><pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Admonitions keep supporting information visually distinct while preserving the article&apos;s reading flow. Every form is rendered on the server and uses the same compact M3E component.&lt;/p&gt;
&lt;h2&gt;Semantic variants&lt;/h2&gt;
&lt;p&gt;::: note Deployment context
The spaced form accepts a plain custom title while remaining compatible with the reference syntax.
:::&lt;/p&gt;
&lt;p&gt;:::info
Use information blocks for neutral context that helps readers understand the surrounding section.
:::&lt;/p&gt;
&lt;p&gt;:::tip[Existing &lt;strong&gt;label&lt;/strong&gt; syntax]
The original bracket label remains available and can contain inline Markdown emphasis.
:::&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
GitHub Alert syntax enters the same renderer, so existing articles keep one visual language.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;:::warning
Check environment variables before running a production build.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Do not publish credentials, local configuration, or private keys with an example.
:::&lt;/p&gt;
&lt;h2&gt;Optional details&lt;/h2&gt;
&lt;p&gt;::: details Inspect the complete command
The disclosure uses native browser semantics and remains keyboard accessible without client JavaScript.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npx.cmd astro check
pnpm.cmd build
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;It starts closed.&lt;/li&gt;
&lt;li&gt;Long code can scroll inside its own code block.&lt;/li&gt;
&lt;li&gt;The container remains within the article width on narrow screens.
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Author syntax&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;:::note[Existing title syntax]
Content
:::

::: warning Plume-compatible title syntax
Content
:::

&amp;gt; [!TIP]
&amp;gt; GitHub Alert syntax

::: details Optional content
Hidden until the reader opens it.
:::
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Content Annotations</title><link>https://blog.fishai.top/posts/content-annotations/</link><guid isPermaLink="true">https://blog.fishai.top/posts/content-annotations/</guid><description>Add compact, accessible supporting notes to Shirone articles without interrupting the reading flow.</description><pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Content annotations keep supporting context close to a sentence without placing it directly in the reading flow. Activate the small note marker to reveal its content.&lt;/p&gt;
&lt;h2&gt;Basic syntax&lt;/h2&gt;
&lt;p&gt;Add a &lt;code&gt;[+label]&lt;/code&gt; reference in ordinary prose, then define the matching note elsewhere in the same article.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Astro renders most of a page ahead of time and hydrates **interactive islands** [+islands] only when they need to become interactive.

[+islands]:
  An island is an interactive UI component surrounded by static HTML. This keeps the default page lightweight while preserving focused interactivity.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Astro renders most of a page ahead of time and hydrates &lt;strong&gt;interactive islands&lt;/strong&gt; [+islands] only when they need to become interactive.&lt;/p&gt;
&lt;p&gt;[+islands]:
An island is an interactive UI component surrounded by static HTML. This keeps the default page lightweight while preserving focused interactivity.&lt;/p&gt;
&lt;h2&gt;Rich content&lt;/h2&gt;
&lt;p&gt;Definitions may contain paragraphs, emphasis, links, lists, and inline code [+rich-note] while the surrounding sentence continues normally.&lt;/p&gt;
&lt;p&gt;[+rich-note]:
&lt;strong&gt;Authoring guidance&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keep the first sentence self-contained.&lt;/li&gt;
&lt;li&gt;Use a link when readers may need the primary source.&lt;/li&gt;
&lt;li&gt;Prefer concise examples such as &lt;code&gt;client:visible&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See the &lt;a href=&quot;https://docs.astro.build/en/concepts/islands/&quot;&gt;Astro islands documentation&lt;/a&gt; for the full model.&lt;/p&gt;
&lt;h2&gt;Multiple definitions&lt;/h2&gt;
&lt;p&gt;Reuse a label [+review] to present a short sequence of related notes behind one marker.&lt;/p&gt;
&lt;p&gt;[+review]: Start with the decision that changes the reader&apos;s next action.
[+review]: Keep implementation evidence separate from background context.
[+review]: Remove details that belong in the main article instead of the annotation.&lt;/p&gt;
&lt;p&gt;Undefined references such as &lt;code&gt;[+missing]&lt;/code&gt; remain ordinary text, so an unfinished definition never creates an empty control.&lt;/p&gt;
</content:encoded></item><item><title>Markdown Steps</title><link>https://blog.fishai.top/posts/steps/</link><guid isPermaLink="true">https://blog.fishai.top/posts/steps/</guid><description>Present sequential instructions as a compact, accessible step flow in Shirone.</description><pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Use Steps for procedures whose order matters. The component keeps the article reading flow intact: a quiet numbered rail provides orientation while headings, paragraphs, links, lists, and code retain their native Markdown roles.&lt;/p&gt;
&lt;h2&gt;Ordered list syntax&lt;/h2&gt;
&lt;p&gt;Wrap one Markdown ordered list in a &lt;code&gt;:::steps&lt;/code&gt; container. Each top-level list item becomes one step.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::steps[Production deployment]
1. **Clone and prepare the workspace**

   Clone the repository and enter the project directory.

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

2. **Install dependencies**

   Use the repository&apos;s pinned package manager.

   ```powershell
   pnpm.cmd install
   ```

3. **Run project checks**

   Confirm Astro diagnostics and TypeScript checks pass.

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

4. **Build the production site**

   Generate the static site and search index.

   ```powershell
   pnpm.cmd build
   ```
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::steps[Production deployment]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Clone and prepare the workspace&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Clone the repository and enter the project directory.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/LyraVoid/Shirone.git
Set-Location Shirone
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install dependencies&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Use the repository&apos;s pinned package manager.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm.cmd install
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Run project checks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Confirm Astro diagnostics and TypeScript checks pass.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npx.cmd astro check
pnpm.cmd type-check
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Build the production site&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Generate the static site and search index.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm.cmd build
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;Options&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:::steps[Title]&lt;/code&gt; or &lt;code&gt;title=&quot;Title&quot;&lt;/code&gt; adds a visible label and accessible name.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start=4&lt;/code&gt; changes the first displayed step number.&lt;/li&gt;
&lt;li&gt;The container must contain exactly one ordered list. Invalid or mixed input remains ordinary readable Markdown instead of being interpreted heuristically.&lt;/li&gt;
&lt;li&gt;Rendering is completed during the site build and adds no client JavaScript or network requests.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>MDX Integration and M3E Atomic Components</title><link>https://blog.fishai.top/posts/mdx-showcase/</link><guid isPermaLink="true">https://blog.fishai.top/posts/mdx-showcase/</guid><description>A comprehensive guide to composing rich interactive articles in Shirone using MDX, Svelte 5 interactive islands, and Material 3 Expressive design tokens.</description><pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::tip
&lt;strong&gt;MDX (Markdown + JSX)&lt;/strong&gt; bridges the gap between static writing and application interfaces. In Shirone, authors can seamlessly mix dynamic logic, reactive Svelte 5 components, and Material 3 design tokens directly within post content.
:::&lt;/p&gt;
&lt;h2&gt;1. Markdown vs MDX Capability Matrix&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Standard Markdown (&lt;code&gt;.md&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Shirone MDX (&lt;code&gt;.mdx&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Execution Mode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Typography &amp;amp; Structure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full Support&lt;/td&gt;
&lt;td&gt;Full Support&lt;/td&gt;
&lt;td&gt;Static SSR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code Highlighting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Line Numbers, Frames, Collapsible&lt;/td&gt;
&lt;td&gt;Line Numbers, Frames, Collapsible&lt;/td&gt;
&lt;td&gt;Static SSR (Expressive Code)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Diagrams &amp;amp; Mathematics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mermaid, KaTeX&lt;/td&gt;
&lt;td&gt;Mermaid, KaTeX&lt;/td&gt;
&lt;td&gt;Client Enhanced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Callout Admonitions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Note, Tip, Important, Warning, Caution&lt;/td&gt;
&lt;td&gt;Note, Tip, Important, Warning, Caution&lt;/td&gt;
&lt;td&gt;Static SSR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;M3E Display Atoms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not Available&lt;/td&gt;
&lt;td&gt;Direct Integration (``, &lt;code&gt;&amp;lt;Skeleton&amp;gt;&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Pure SSR (Zero Client JS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Svelte 5 Reactive Islands&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not Available&lt;/td&gt;
&lt;td&gt;On-Demand Hydration (&lt;code&gt;&amp;lt;Button&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;Switch&amp;gt;&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;client:visible&lt;/code&gt; Lazy Hydrated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Feedback &amp;amp; Loading Atoms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not Available&lt;/td&gt;
&lt;td&gt;Animated Morph (&lt;code&gt;&amp;lt;LoadingIndicator&amp;gt;&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;client:visible&lt;/code&gt; Reactive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dynamic JSX Expressions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not Available&lt;/td&gt;
&lt;td&gt;Native Evaluation (&lt;code&gt;{authorInfo.ui}&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Compile-Time / Client&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;2. Dynamic Expressions and Data Mapping&lt;/h2&gt;
&lt;p&gt;MDX allows declaring scoped constants using &lt;code&gt;export const&lt;/code&gt; at the top of the file, which can be evaluated inline or mapped across templates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Core Framework&lt;/strong&gt;: {authorInfo.framework}&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI Engine&lt;/strong&gt;: {authorInfo.ui}&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design Tokens&lt;/strong&gt;: {authorInfo.tokens}&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Architecture Pattern&lt;/strong&gt;: {authorInfo.architecture}&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Arrays and collections can be rendered dynamically into grid layouts:&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;grid grid-cols-1 md:grid-cols-2 gap-4 my-6&quot;&amp;gt;
{showcaseItems.map((item, idx) =&amp;gt; (
&amp;lt;div key={item.name} class=&quot;p-4 rounded-xl border border-[var(--outline-variant)] bg-[var(--surface-container-low)]&quot;&amp;gt;
&amp;lt;div class=&quot;flex items-center gap-2 mb-1&quot;&amp;gt;
&amp;lt;span class=&quot;w-6 h-6 rounded-full bg-[var(--primary)] text-[var(--on-primary)] text-xs flex items-center justify-center font-bold&quot;&amp;gt;
{idx + 1}
&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;font-bold text-[var(--on-surface)]&quot;&amp;gt;{item.name}&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;p class=&quot;text-sm text-[var(--on-surface-variant)] m-0&quot;&amp;gt;{item.desc}&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
))}
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. M3E Display and Layout Primitives (SSR-Only)&lt;/h2&gt;
&lt;p&gt;In accordance with Shirone&apos;s component architecture (&lt;code&gt;docs/atomic-structure.md&lt;/code&gt;), stateless display components output clean, accessible semantic HTML with no client-side runtime payload.&lt;/p&gt;
&lt;h3&gt;3.1 Card Containers (&lt;code&gt;Card.svelte&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;&amp;lt;div class=&quot;grid grid-cols-1 md:grid-cols-3 gap-4 my-6&quot;&amp;gt;
&amp;lt;Card variant=&quot;filled&quot; class=&quot;!p-5&quot;&amp;gt;
&amp;lt;div class=&quot;font-bold text-[var(--primary)] mb-2&quot;&amp;gt;Filled Card&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;text-sm text-[var(--on-surface-variant)]&quot;&amp;gt;Default container background with no elevation shadow. Ideal for grouped content blocks.&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;font-bold text-[var(--primary)] mb-2&quot;&amp;gt;Elevated Card&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;text-sm text-[var(--on-surface-variant)]&quot;&amp;gt;Level 1 container elevation with interactive state layering for heightened visual focus.&amp;lt;/div&amp;gt;



&amp;lt;div class=&quot;font-bold text-[var(--primary)] mb-2&quot;&amp;gt;Outlined Card&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;text-sm text-[var(--on-surface-variant)]&quot;&amp;gt;A crisp 1px outline boundary providing clean separation on neutral surfaces.&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3&gt;3.2 Accent Bars and Badges (&lt;code&gt;AccentBar&lt;/code&gt; &amp;amp; &lt;code&gt;Badge&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;&amp;lt;div class=&quot;flex items-center gap-4 my-4 p-4 rounded-lg bg-[var(--surface-container-high)]&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;flex-1&quot;&amp;gt;
&amp;lt;span class=&quot;font-bold text-lg&quot;&amp;gt;System Announcement&amp;lt;/span&amp;gt;
&amp;lt;p class=&quot;text-xs text-[var(--on-surface-variant)] m-0&quot;&amp;gt;Combine AccentBar with Badge to build prominent visual callouts&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
M3E v0.192
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3&gt;3.3 Skeleton Placeholders (&lt;code&gt;Skeleton.svelte&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;For previewing layout skeletons or prototyping async states:&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;flex flex-col gap-3 my-6 p-5 rounded-xl border border-[var(--outline-variant)] bg-[var(--surface-container-low)]&quot;&amp;gt;
&amp;lt;div class=&quot;flex items-center gap-3&quot;&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;flex flex-col gap-1.5 flex-1&quot;&amp;gt;
  
  
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4. Feedback and Loading Indicators&lt;/h2&gt;
&lt;p&gt;Shirone features full-fidelity Material 3 Expressive motion and feedback atoms:&lt;/p&gt;
&lt;h3&gt;4.1 Morphing Loading Indicator (&lt;code&gt;LoadingIndicator.svelte&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Implemented with &lt;code&gt;androidx.graphics.shapes&lt;/code&gt; polygon morphing, providing smooth spring-interpolated 7-shape animations:&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;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&quot;&amp;gt;
&amp;lt;div class=&quot;flex flex-col items-center gap-2&quot;&amp;gt;
&amp;lt;div class=&quot;h-16 flex items-center justify-center&quot;&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;/div&amp;gt;
&amp;lt;span class=&quot;text-xs text-[var(--on-surface-variant)]&quot;&amp;gt;Indeterminate Shape Morph&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;flex flex-col items-center gap-2&quot;&amp;gt;
&amp;lt;div class=&quot;h-16 flex items-center justify-center&quot;&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;/div&amp;gt;
&amp;lt;span class=&quot;text-xs text-[var(--on-surface-variant)]&quot;&amp;gt;Contained Circular Variant&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;flex flex-col items-center gap-2&quot;&amp;gt;
&amp;lt;div class=&quot;h-16 flex items-center justify-center&quot;&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;/div&amp;gt;
&amp;lt;span class=&quot;text-xs text-[var(--on-surface-variant)]&quot;&amp;gt;Determinate Progress (68%)&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3&gt;4.2 Linear and Indeterminate Progress (&lt;code&gt;ProgressIndicator.svelte&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;&amp;lt;div class=&quot;flex flex-col gap-4 my-6 p-6 rounded-2xl bg-[var(--surface-container)] border border-[var(--outline-variant)]&quot;&amp;gt;
&amp;lt;div class=&quot;flex flex-col gap-2&quot;&amp;gt;
&amp;lt;div class=&quot;flex justify-between text-xs text-[var(--on-surface-variant)]&quot;&amp;gt;
&amp;lt;span&amp;gt;Pipeline Compilation&amp;lt;/span&amp;gt;
&amp;lt;span&amp;gt;80%&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;flex flex-col gap-2 mt-2&quot;&amp;gt;
&amp;lt;div class=&quot;text-xs text-[var(--on-surface-variant)]&quot;&amp;gt;Continuous Dual-Line Animation&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5. Interactive Svelte 5 Islands&lt;/h2&gt;
&lt;p&gt;Components declared with &lt;code&gt;client:visible&lt;/code&gt; are lazy-hydrated via &lt;code&gt;IntersectionObserver&lt;/code&gt; when entering the viewport:&lt;/p&gt;
&lt;h3&gt;5.1 Button Matrix (&lt;code&gt;Button.svelte&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;&amp;lt;div class=&quot;flex flex-wrap items-center gap-3 my-6 p-4 rounded-xl border border-[var(--outline-variant)]&quot;&amp;gt;
Filled Button
Elevated
Tonal Button
Outlined
Text Button
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3&gt;5.2 Filter Chips and Segmented Buttons (&lt;code&gt;Chips&lt;/code&gt; &amp;amp; &lt;code&gt;SegmentedButton&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;&amp;lt;div class=&quot;flex flex-col gap-4 my-6 p-6 rounded-2xl bg-[var(--surface-container)] border border-[var(--outline-variant)]&quot;&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;div class=&quot;text-xs font-bold text-[var(--on-surface-variant)] mb-2&quot;&amp;gt;M3E Filter Chips&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div&amp;gt;
&amp;lt;div class=&quot;text-xs font-bold text-[var(--on-surface-variant)] mb-2&quot;&amp;gt;Segmented Control&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3&gt;5.3 Switches, Checkboxes, and Sliders (&lt;code&gt;Switch&lt;/code&gt;, &lt;code&gt;Checkbox&lt;/code&gt;, &lt;code&gt;Slider&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;&amp;lt;div class=&quot;flex flex-col gap-4 my-6 p-6 rounded-2xl bg-[var(--surface-container)] border border-[var(--outline-variant)]&quot;&amp;gt;
&amp;lt;div class=&quot;flex items-center justify-between&quot;&amp;gt;
&amp;lt;span class=&quot;font-bold text-sm&quot;&amp;gt;Switch with Status Icons&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;flex items-center justify-between&quot;&amp;gt;
&amp;lt;span class=&quot;font-bold text-sm&quot;&amp;gt;Selection Checkboxes&amp;lt;/span&amp;gt;
&amp;lt;div class=&quot;flex items-center gap-4&quot;&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;flex flex-col gap-2&quot;&amp;gt;
&amp;lt;span class=&quot;font-bold text-sm&quot;&amp;gt;Hue Spectrum Slider&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3&gt;5.4 Input Controls (&lt;code&gt;TextField.svelte&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;&amp;lt;div class=&quot;grid grid-cols-1 md:grid-cols-2 gap-4 my-6&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;6. Markdown Extension Compatibility&lt;/h2&gt;
&lt;p&gt;Shirone&apos;s SSOT unified plugin pipeline preserves full compatibility with all Markdown extensions:&lt;/p&gt;
&lt;h3&gt;6.1 GitHub Repository Cards&lt;/h3&gt;
&lt;p&gt;::github{repo=&quot;saicaca/fuwari&quot;}&lt;/p&gt;
&lt;h3&gt;6.2 Mermaid Architecture Diagrams&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;flowchart TD
    MDX[MDX Source Entry] --&amp;gt; Compiler[&quot;@astrojs/mdx Compiler&quot;]
    Compiler --&amp;gt; Plugins[&quot;Remark / Rehype SSOT Pipeline&quot;]
    Plugins --&amp;gt; Islands[&quot;Svelte 5 Interactive Islands&quot;]
    Islands --&amp;gt; Swup[&quot;Swup Client Navigation Shell&quot;]
    Swup --&amp;gt; Screen[&quot;M3E Expressive Article View&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.3 Mathematical Expressions (LaTeX / KaTeX)&lt;/h3&gt;
&lt;p&gt;Inline equation: Mass-energy equivalence $E = mc^2$ and Gaussian integral $\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}$.&lt;/p&gt;
&lt;p&gt;Block equation:&lt;/p&gt;
&lt;p&gt;$$
\mathcal{L}&lt;em&gt;{M3E} = \sum&lt;/em&gt;{i=1}^{N} \left( \text{Token}_i \cdot \text{ContrastRatio} \right) + \lambda |\text{MotionElegance}|
$$&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;7. Summary&lt;/h2&gt;
&lt;p&gt;The native integration of MDX empowers technical writers to build rich, interactive documentation while preserving Shirone&apos;s ultra-fast static performance. All components adhere to the Material 3 Expressive token design system, ensuring consistency, accessibility, and visual harmony.&lt;/p&gt;
</content:encoded></item><item><title>Image Gallery Grid: Syntax and Complete Examples</title><link>https://blog.fishai.top/posts/image-grid-demo/</link><guid isPermaLink="true">https://blog.fishai.top/posts/image-grid-demo/</guid><description>A complete guide to image gallery grid syntax, parameters, cropping, responsive behavior, captions, and lightbox navigation.</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;:::grid&lt;/code&gt; is the blog&apos;s image gallery container directive. It arranges ordinary Markdown images in a responsive grid with a consistent aspect ratio and automatically enables lightbox viewing. Use it for article images, screenshots, portfolios, or small albums.&lt;/p&gt;
&lt;p&gt;Images in the same gallery use the same card ratio. By default, center cropping fills every card and keeps each row tidy; clicking an image opens the complete original in a lightbox. Every gallery has its own lightbox group and does not mix with other images in the post.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This post is both feature documentation and a visual test page. View the examples at desktop, tablet, and mobile widths, then click any image to verify lightbox grouping.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Minimal Syntax&lt;/h2&gt;
&lt;p&gt;Write Markdown images directly between &lt;code&gt;:::grid&lt;/code&gt; and the closing &lt;code&gt;:::&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid
![Image description](./image-1.webp)

![Image description](./image-2.webp)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each image must occupy its own paragraph, with a blank line between images. Keep only images in a gallery; write paragraphs, lists, and code blocks outside the container.&lt;/p&gt;
&lt;p&gt;Here is the result of the minimal syntax. Without parameters, the grid uses three columns, a &lt;code&gt;16/10&lt;/code&gt; ratio, and &lt;code&gt;cover&lt;/code&gt; by default.&lt;/p&gt;
&lt;p&gt;:::grid
&lt;img src=&quot;./landscape-1.webp&quot; alt=&quot;Minimal syntax result: first image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./landscape-2.webp&quot; alt=&quot;Minimal syntax result: second image&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Parameters at a Glance&lt;/h2&gt;
&lt;p&gt;Write all parameters in braces after the opening directive: &lt;code&gt;:::grid{parameter=&quot;value&quot;}&lt;/code&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Allowed values&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;columns&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Integers from &lt;code&gt;1&lt;/code&gt; to &lt;code&gt;6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number of columns per row on desktop. Invalid values fall back to &lt;code&gt;3&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aspect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A positive ratio, such as &lt;code&gt;16/9&lt;/code&gt;, &lt;code&gt;3/4&lt;/code&gt;, or &lt;code&gt;1/1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;16/10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The displayed card ratio, not the original image ratio.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cover&lt;/code&gt;, &lt;code&gt;contain&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cover&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Image fitting mode. &lt;code&gt;cover&lt;/code&gt; crops to fill; &lt;code&gt;contain&lt;/code&gt; preserves the complete image and may leave empty space.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Complete example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid{columns=&quot;3&quot; aspect=&quot;16/9&quot; fit=&quot;cover&quot;}
![First image](./image-1.webp &quot;Optional caption&quot;)

![Second image](./image-2.webp &quot;Optional caption&quot;)

![Third image](./image-3.webp &quot;Optional caption&quot;)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The following result uses the three-column landscape syntax above. Compare the card ratio, column count, and the way a title takes precedence over alt text as the caption:&lt;/p&gt;
&lt;p&gt;:::grid{columns=&quot;3&quot; aspect=&quot;16/9&quot; fit=&quot;cover&quot;}
&lt;img src=&quot;./landscape-1.webp&quot; alt=&quot;Parameter example: first landscape image&quot; title=&quot;Landscape caption 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./landscape-2.webp&quot; alt=&quot;Parameter example: second landscape image&quot; title=&quot;Landscape caption 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./landscape-3.webp&quot; alt=&quot;Parameter example: third landscape image&quot; title=&quot;Landscape caption 3&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Captions and Alt Text&lt;/h2&gt;
&lt;p&gt;An image&apos;s alt text serves both as accessible alternative text and as its default caption. When an image has an optional title, the title is used as the caption instead:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![Text used for accessibility](./image.webp &quot;Caption shown below the image&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the same row, captions align to the bottom of every card. A wrapping caption does not make the others float at a different height. Ratio text such as &lt;code&gt;3:4&lt;/code&gt; and &lt;code&gt;16:9&lt;/code&gt; can be written directly in body text, headings, and alt text without escaping.&lt;/p&gt;
&lt;p&gt;This example demonstrates the default alt-text caption, an explicit title caption, and bottom alignment for a longer caption:&lt;/p&gt;
&lt;p&gt;:::grid{columns=&quot;3&quot; aspect=&quot;1/1&quot;}
&lt;img src=&quot;./square-1.webp&quot; alt=&quot;This image has no title, so its alt text is the caption&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./square-2.webp&quot; alt=&quot;Second square image with accessible alt text&quot; title=&quot;This title is displayed as the caption&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./square-3.webp&quot; alt=&quot;Accessible description of a 3:4 poster&quot; title=&quot;This is a longer caption for checking that every caption remains aligned to the bottom of its card when it wraps&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Layout and Cropping&lt;/h2&gt;
&lt;p&gt;Desktop layouts use the number of columns specified by &lt;code&gt;columns&lt;/code&gt;. Below &lt;code&gt;768px&lt;/code&gt;, grids use at most two columns; below &lt;code&gt;480px&lt;/code&gt;, they switch to one column. The card wrapper fixes the &lt;code&gt;aspect&lt;/code&gt; ratio and clips rounded corners, while the image fills the card without the theme&apos;s default image margins.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Choose &lt;code&gt;cover&lt;/code&gt;: the recommended default. Images are cropped from the center to fill the card, making the gallery look consistent.&lt;/li&gt;
&lt;li&gt;Choose &lt;code&gt;contain&lt;/code&gt;: the full original image is shown without cropping. When its ratio differs from the card, the theme background remains visible; use this for images that cannot be cropped.&lt;/li&gt;
&lt;li&gt;To preserve the complete image without empty space, set &lt;code&gt;aspect&lt;/code&gt; close to the original image ratio or place the image in a grid of its own.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following examples place the same portrait images in &lt;code&gt;16/9&lt;/code&gt; cards with &lt;code&gt;cover&lt;/code&gt; and &lt;code&gt;contain&lt;/code&gt;. The first crops them; the second preserves the full image and leaves background space.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid{columns=&quot;3&quot; aspect=&quot;16/9&quot; fit=&quot;cover&quot;}
![Image description](./image-1.webp &quot;Optional caption&quot;)

![Image description](./image-2.webp &quot;Optional caption&quot;)
:::

:::grid{columns=&quot;3&quot; aspect=&quot;16/9&quot; fit=&quot;contain&quot;}
![Image description](./image-1.webp &quot;Optional caption&quot;)

![Image description](./image-2.webp &quot;Optional caption&quot;)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::grid{columns=&quot;3&quot; aspect=&quot;16/9&quot; fit=&quot;cover&quot;}
&lt;img src=&quot;./default-portrait-1.webp&quot; alt=&quot;First cover result&quot; title=&quot;Cover: center crop&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./default-portrait-2.webp&quot; alt=&quot;Second cover result&quot; title=&quot;Cover: fill the card&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./default-portrait-3.webp&quot; alt=&quot;Third cover result&quot; title=&quot;Cover: a more consistent layout&quot; /&gt;
:::&lt;/p&gt;
&lt;p&gt;:::grid{columns=&quot;3&quot; aspect=&quot;16/9&quot; fit=&quot;contain&quot;}
&lt;img src=&quot;./default-portrait-1.webp&quot; alt=&quot;First contain result&quot; title=&quot;Contain: preserve the complete original&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./default-portrait-2.webp&quot; alt=&quot;Second contain result&quot; title=&quot;Contain: empty space may appear&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./default-portrait-3.webp&quot; alt=&quot;Third contain result&quot; title=&quot;Contain: suitable for edge details&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Default Configuration&lt;/h2&gt;
&lt;p&gt;Without attributes, the default is three columns, a &lt;code&gt;16/10&lt;/code&gt; ratio, and &lt;code&gt;cover&lt;/code&gt; cropping. These three portrait images verify default cropping and captions.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid
![Image description](./image-1.webp)

![Image description](./image-2.webp)

![Image description](./image-3.webp)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::grid
&lt;img src=&quot;./default-portrait-1.webp&quot; alt=&quot;Default configuration: portrait image one&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./default-portrait-2.webp&quot; alt=&quot;Default configuration: portrait image two&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./default-portrait-3.webp&quot; alt=&quot;Default configuration: portrait image three&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Three-Column Portraits: 3:4&lt;/h2&gt;
&lt;p&gt;With &lt;code&gt;aspect=&quot;3/4&quot;&lt;/code&gt;, the three portrait images fill consistently proportioned vertical cards. If an original image has a different ratio, &lt;code&gt;cover&lt;/code&gt; crops its edges from the center.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid{columns=&quot;3&quot; aspect=&quot;3/4&quot;}
![Portrait image description](./portrait-1.webp)

![Portrait image description](./portrait-2.webp)

![Portrait image description](./portrait-3.webp)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::grid{columns=&quot;3&quot; aspect=&quot;3/4&quot;}
&lt;img src=&quot;./default-portrait-1.webp&quot; alt=&quot;3:4 test image one&quot; title=&quot;Portrait 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./default-portrait-2.webp&quot; alt=&quot;3:4 test image two&quot; title=&quot;Portrait 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./default-portrait-3.webp&quot; alt=&quot;3:4 test image three&quot; title=&quot;Portrait 3&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Three-Column Landscapes: 16:9&lt;/h2&gt;
&lt;p&gt;This set demonstrates a common video-cover ratio in a three-column layout. Cropping is minimal when the landscape images are close to the card ratio.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid{columns=&quot;3&quot; aspect=&quot;16/9&quot;}
![Landscape image description](./landscape-1.webp)

![Landscape image description](./landscape-2.webp)

![Landscape image description](./landscape-3.webp)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::grid{columns=&quot;3&quot; aspect=&quot;16/9&quot;}
&lt;img src=&quot;./feature-landscape-1.webp&quot; alt=&quot;16:9 test image one&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./feature-landscape-2.webp&quot; alt=&quot;16:9 test image two&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./feature-landscape-3.webp&quot; alt=&quot;16:9 test image three&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Two-Column Squares: 1:1&lt;/h2&gt;
&lt;p&gt;Two columns work well when larger preview cards are needed. The third image moves to the next row. The final row keeps its grid-track width instead of stretching images to fill the row.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid{columns=&quot;2&quot; aspect=&quot;1/1&quot;}
![Square image description](./square-1.webp)

![Square image description](./square-2.webp)

![Square image description](./square-3.webp)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::grid{columns=&quot;2&quot; aspect=&quot;1/1&quot;}
&lt;img src=&quot;./mixed-square-1.webp&quot; alt=&quot;1:1 test image one&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./mixed-square-2.webp&quot; alt=&quot;1:1 test image two&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./mixed-square-3.webp&quot; alt=&quot;1:1 test image three&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Four Columns with &lt;code&gt;contain&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;fit=&quot;contain&quot;&lt;/code&gt; does not crop the original image. When the image ratio differs from the card ratio, the theme background remains visible. This is intentional, not a layout issue. It also verifies that four-column grids and separate lightbox groups do not interfere with each other.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid{columns=&quot;4&quot; aspect=&quot;16/9&quot; fit=&quot;contain&quot;}
![Image description](./image-1.webp)

![Image description](./image-2.webp)

![Image description](./image-3.webp)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::grid{columns=&quot;4&quot; aspect=&quot;16/9&quot; fit=&quot;contain&quot;}
&lt;img src=&quot;./default-portrait-1.webp&quot; alt=&quot;Contain: portrait image one&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./default-portrait-2.webp&quot; alt=&quot;Contain: portrait image two&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./default-portrait-3.webp&quot; alt=&quot;Contain: portrait image three&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Single-Column Detail Image&lt;/h2&gt;
&lt;p&gt;One column is suitable when an image needs a larger reading size. It remains one column on desktop, tablet, and mobile, and the original is still available in the lightbox.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid{columns=&quot;1&quot; aspect=&quot;16/9&quot;}
![Image description](./detail.webp)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::grid{columns=&quot;1&quot; aspect=&quot;16/9&quot;}
&lt;img src=&quot;./feature-landscape-1.webp&quot; alt=&quot;Single-column test image&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Sparse Five-Column Row&lt;/h2&gt;
&lt;p&gt;Five columns verify a higher supported column count. With only three images, the final row remains left-aligned instead of stretching the images.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid{columns=&quot;5&quot; aspect=&quot;1/1&quot;}
![Thumbnail description](./thumb-1.webp)

![Thumbnail description](./thumb-2.webp)

![Thumbnail description](./thumb-3.webp)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::grid{columns=&quot;5&quot; aspect=&quot;1/1&quot;}
&lt;img src=&quot;./mixed-square-1.webp&quot; alt=&quot;Five-column test image one&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./mixed-square-2.webp&quot; alt=&quot;Five-column test image two&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./mixed-square-3.webp&quot; alt=&quot;Five-column test image three&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Mixed Images in Six Columns&lt;/h2&gt;
&lt;p&gt;Six columns are the current maximum. Mixing landscape and portrait images verifies &lt;code&gt;cover&lt;/code&gt; cropping, captions on narrow cards, and a dense desktop layout. For readable article content, two to four columns are usually preferable.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid{columns=&quot;6&quot; aspect=&quot;1/1&quot;}
![Image description](./image-1.webp)

![Image description](./image-2.webp)

![Image description](./image-3.webp)

![Image description](./image-4.webp)

![Image description](./image-5.webp)

![Image description](./image-6.webp)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::grid{columns=&quot;6&quot; aspect=&quot;1/1&quot;}
&lt;img src=&quot;./default-portrait-1.webp&quot; alt=&quot;Six-column test image one&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./default-portrait-2.webp&quot; alt=&quot;Six-column test image two&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./default-portrait-3.webp&quot; alt=&quot;Six-column test image three&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./feature-landscape-1.webp&quot; alt=&quot;Six-column test image four&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./feature-landscape-2.webp&quot; alt=&quot;Six-column test image five&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./feature-landscape-3.webp&quot; alt=&quot;Six-column test image six&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Four-Column Squares: 1:1&lt;/h2&gt;
&lt;p&gt;Four square images with the same ratio are a typical four-column layout. Desktop displays all four in one row; tablet collapses to two columns and mobile to one.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid{columns=&quot;4&quot; aspect=&quot;1/1&quot;}
![Square image description](./square-1.webp)

![Square image description](./square-2.webp)

![Square image description](./square-3.webp)

![Square image description](./square-4.webp)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::grid{columns=&quot;4&quot; aspect=&quot;1/1&quot;}
&lt;img src=&quot;./square-1.webp&quot; alt=&quot;Square image one&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./square-2.webp&quot; alt=&quot;Square image two&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./square-3.webp&quot; alt=&quot;Square image three&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./square-4.webp&quot; alt=&quot;Square image four&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Six-Column Landscapes: 16:9&lt;/h2&gt;
&lt;p&gt;Six landscape columns work well for thumbnail previews, portfolios, and screenshot indexes. Even if original ratios differ slightly, &lt;code&gt;cover&lt;/code&gt; fills every &lt;code&gt;16/9&lt;/code&gt; card consistently.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid{columns=&quot;6&quot; aspect=&quot;16/9&quot;}
![Landscape image description](./landscape-1.webp)

![Landscape image description](./landscape-2.webp)

![Landscape image description](./landscape-3.webp)

![Landscape image description](./landscape-4.webp)

![Landscape image description](./landscape-5.webp)

![Landscape image description](./landscape-6.webp)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::grid{columns=&quot;6&quot; aspect=&quot;16/9&quot;}
&lt;img src=&quot;./landscape-1.webp&quot; alt=&quot;Landscape image one&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./landscape-2.webp&quot; alt=&quot;Landscape image two&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./landscape-3.webp&quot; alt=&quot;Landscape image three&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./landscape-4.webp&quot; alt=&quot;Landscape image four&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./landscape-5.webp&quot; alt=&quot;Landscape image five&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./landscape-6.webp&quot; alt=&quot;Landscape image six&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Three-Column Portraits: 3:4&lt;/h2&gt;
&lt;p&gt;This group of six portrait images demonstrates a common layout for people, posters, or mobile screenshots. The images form two rows of three, with captions aligned to the bottom.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid{columns=&quot;3&quot; aspect=&quot;3/4&quot;}
![Portrait image description](./portrait-1.webp)

![Portrait image description](./portrait-2.webp)

![Portrait image description](./portrait-3.webp)

![Portrait image description](./portrait-4.webp)

![Portrait image description](./portrait-5.webp)

![Portrait image description](./portrait-6.webp)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::grid{columns=&quot;3&quot; aspect=&quot;3/4&quot;}
&lt;img src=&quot;./portrait-1.webp&quot; alt=&quot;Portrait image one&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./portrait-2.webp&quot; alt=&quot;Portrait image two&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./portrait-3.webp&quot; alt=&quot;Portrait image three&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./portrait-4.webp&quot; alt=&quot;Portrait image four&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./portrait-5.webp&quot; alt=&quot;Portrait image five&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./portrait-6.webp&quot; alt=&quot;Portrait image six&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Edge-Critical Content: &lt;code&gt;cover&lt;/code&gt; and Lightbox&lt;/h2&gt;
&lt;p&gt;These images contain important text or details near their edges. &lt;code&gt;cover&lt;/code&gt; keeps the grid tidy but may crop those edges; click an image to view the uncropped original in the lightbox. Use clear captions for edge-sensitive images, or use &lt;code&gt;contain&lt;/code&gt; below.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid{columns=&quot;3&quot; aspect=&quot;16/9&quot; fit=&quot;cover&quot;}
![Edge-critical content](./critical-1.webp &quot;Open the lightbox to view the complete edge content&quot;)

![Edge-critical content](./critical-2.webp &quot;Open the lightbox to view the complete edge content&quot;)

![Edge-critical content](./critical-3.webp &quot;Open the lightbox to view the complete edge content&quot;)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::grid{columns=&quot;3&quot; aspect=&quot;16/9&quot; fit=&quot;cover&quot;}
&lt;img src=&quot;./critical-1.webp&quot; alt=&quot;First edge-critical image&quot; title=&quot;Open the lightbox to view the complete edge content&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./critical-2.webp&quot; alt=&quot;Second edge-critical image&quot; title=&quot;Open the lightbox to view the complete edge content&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./critical-3.webp&quot; alt=&quot;Third edge-critical image&quot; title=&quot;Open the lightbox to view the complete edge content&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Extreme Ratios with &lt;code&gt;contain&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;For banners, long screenshots, and other extreme image ratios, &lt;code&gt;contain&lt;/code&gt; displays the complete original. Unlike &lt;code&gt;cover&lt;/code&gt;, it may leave theme-background space, but it never crops content.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid{columns=&quot;3&quot; aspect=&quot;16/9&quot; fit=&quot;contain&quot;}
![Complete screenshot description](./wide-1.webp)

![Complete screenshot description](./wide-2.webp)

![Complete screenshot description](./wide-3.webp)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::grid{columns=&quot;3&quot; aspect=&quot;16/9&quot; fit=&quot;contain&quot;}
&lt;img src=&quot;./extreme-1.webp&quot; alt=&quot;Extreme-ratio image one&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./extreme-2.webp&quot; alt=&quot;Extreme-ratio image two&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./extreme-3.webp&quot; alt=&quot;Extreme-ratio image three&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Transparent Images&lt;/h2&gt;
&lt;p&gt;Transparent images reveal the card&apos;s theme background. This single-column &lt;code&gt;contain&lt;/code&gt; example makes the transparent areas, original edges, and lightbox behavior easy to inspect.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::grid{columns=&quot;1&quot; aspect=&quot;16/9&quot; fit=&quot;contain&quot;}
![Transparent image description](./transparent.webp)
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::grid{columns=&quot;1&quot; aspect=&quot;16/9&quot; fit=&quot;contain&quot;}
&lt;img src=&quot;./transparent-1.webp&quot; alt=&quot;Transparent-background test image&quot; /&gt;
:::&lt;/p&gt;
&lt;h2&gt;Lightbox Navigation&lt;/h2&gt;
&lt;p&gt;Click any image in a grid to open the Fancybox lightbox. There you can zoom, rotate, enter fullscreen, view thumbnails, and navigate with the arrow keys. Navigation is limited to the current &lt;code&gt;:::grid&lt;/code&gt; container: for example, clicking &quot;16:9 test image one&quot; only opens the other two landscape images in that section.&lt;/p&gt;
&lt;p&gt;Ordinary Markdown images in the same post continue to be handled separately; they are not added to any grid gallery.&lt;/p&gt;
&lt;h2&gt;Checklist&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Images in each grid have consistent dimensions, with captions below the cards.&lt;/li&gt;
&lt;li&gt;Images scale slightly on hover; after clicking, they can be zoomed, rotated, and navigated with the keyboard.&lt;/li&gt;
&lt;li&gt;Clicking &quot;16:9 test image one&quot; lets the lightbox browse only the other two landscape images in that section.&lt;/li&gt;
&lt;li&gt;Below 768px, grids use at most two columns; below 480px, they use one column.&lt;/li&gt;
&lt;li&gt;Portrait images in &quot;Four Columns with &lt;code&gt;contain&lt;/code&gt;&quot; are fully visible with empty space and no cropping.&lt;/li&gt;
&lt;li&gt;Five- and six-column grids retain their specified column count on wide screens, then collapse to two or one column according to the responsive rules.&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Mermaid Diagram Gallery</title><link>https://blog.fishai.top/posts/markdown-mermaid/</link><guid isPermaLink="true">https://blog.fishai.top/posts/markdown-mermaid/</guid><description>A gallery of Mermaid diagrams for processes, interactions, data models, schedules, and project history.</description><pubDate>Thu, 02 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Mermaid turns text descriptions in Markdown into diagrams. The examples below use Shirone&apos;s content workflow to demonstrate diagram types commonly used in technical articles and project notes.&lt;/p&gt;
&lt;h2&gt;Flowchart&lt;/h2&gt;
&lt;p&gt;Flowcharts describe a process, including decisions and paths that return to an earlier step.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TD
    accTitle: Article publishing workflow
    accDescr: An article moves through writing, validation, preview, and build before publication. Failed validation returns it for revision.
    Draft[Write Markdown] --&amp;gt; Check{Validation passed?}
    Check --&amp;gt;|No| Revise[Revise article]
    Revise --&amp;gt; Check
    Check --&amp;gt;|Yes| Preview[Preview locally]
    Preview --&amp;gt; Build[Build static page]
    Build --&amp;gt; Publish[Publish]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Sequence Diagram&lt;/h2&gt;
&lt;p&gt;Sequence diagrams present collaboration between participants in chronological order. This example follows a Swup navigation from request to Mermaid rendering.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sequenceDiagram
    accTitle: Diagram rendering after in-site navigation
    accDescr: A reader starts navigation, Swup replaces the article content, and the Mermaid renderer enhances diagrams on the new page.
    actor Reader
    participant Browser
    participant Swup
    participant Content as Article region
    participant Renderer as Mermaid renderer
    Reader-&amp;gt;&amp;gt;Browser: Open another article
    Browser-&amp;gt;&amp;gt;Swup: Start in-site navigation
    Swup-&amp;gt;&amp;gt;Content: Replace page content
    Swup--&amp;gt;&amp;gt;Renderer: Emit content:replace
    Renderer-&amp;gt;&amp;gt;Content: Find Mermaid containers
    Renderer--&amp;gt;&amp;gt;Browser: Insert themed SVGs
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Entity Relationship Diagram&lt;/h2&gt;
&lt;p&gt;Entity relationship diagrams model structured data and the connections between authors, posts, tags, and comments.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;erDiagram
    accTitle: Blog content relationships
    accDescr: Authors write posts, posts receive comments, and join records connect posts to multiple tags.
    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
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Class Diagram&lt;/h2&gt;
&lt;p&gt;Class diagrams communicate responsibilities, public methods, and dependency directions in a software design.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;classDiagram
    accTitle: Markdown rendering modules
    accDescr: The content pipeline uses a Mermaid plugin to create fallback markup, which the client renderer later enhances into an SVG.
    class ContentPipeline {
        +render(markdown)
        +collectMetadata()
    }
    class MermaidPlugin {
        +transform(codeFence)
        +createFallback()
    }
    class DiagramRenderer {
        +initialize()
        +renderAll()
        +refreshTheme()
    }
    class ThemeTokens {
        +primary
        +surface
        +outline
    }
    ContentPipeline --&amp;gt; MermaidPlugin : uses
    DiagramRenderer --&amp;gt; MermaidPlugin : enhances output
    DiagramRenderer --&amp;gt; ThemeTokens : reads
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;State Diagram&lt;/h2&gt;
&lt;p&gt;State diagrams show the lifecycle of an object and the events that move it between states.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;stateDiagram-v2
    accTitle: Article lifecycle
    accDescr: An article moves from draft to review and publication. It may return for revision or eventually be archived.
    [*] --&amp;gt; Draft
    Draft --&amp;gt; InReview : submit
    InReview --&amp;gt; Draft : request changes
    InReview --&amp;gt; Published : approve
    Published --&amp;gt; Draft : retract
    Published --&amp;gt; Archived : archive
    Archived --&amp;gt; [*]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;XY Chart&lt;/h2&gt;
&lt;p&gt;XY charts combine bars and lines to compare values and trends over a shared axis.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;xychart-beta
    accTitle: Six weeks of content performance
    accDescr: Bars show normalized weekly publishing volume, while the line shows normalized reading completion.
    title &quot;Six weeks of content performance&quot;
    x-axis &quot;Week&quot; [1, 2, 3, 4, 5, 6]
    y-axis &quot;Relative score&quot; 0 --&amp;gt; 100
    bar [36, 52, 44, 68, 76, 84]
    line [48, 55, 62, 61, 73, 81]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Pie Chart&lt;/h2&gt;
&lt;p&gt;Pie charts provide a compact comparison of how categories contribute to a whole.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pie showData
    accTitle: Article topics by share
    accDescr: Engineering accounts for forty percent, design systems for twenty-five percent, and the remainder is split between guides and essays.
    title Article topics by share
    &quot;Engineering&quot; : 40
    &quot;Design systems&quot; : 25
    &quot;Guides&quot; : 20
    &quot;Essays&quot; : 15
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Gantt Chart&lt;/h2&gt;
&lt;p&gt;Gantt charts arrange tasks, dependencies, and milestones along a calendar timeline.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gantt
    accTitle: Theme release plan
    accDescr: The release plan moves from requirements and interaction design through component development, testing, and release.
    title Theme release plan
    dateFormat YYYY-MM-DD
    axisFormat %m/%d
    section Design
    Confirm requirements :done, brief, 2024-05-06, 2d
    Refine interactions :done, interaction, after brief, 3d
    section Implementation
    Develop components :active, components, after interaction, 6d
    Write examples :examples, after interaction, 4d
    section Validation
    Automated tests :tests, after components, 3d
    Release :milestone, release, after tests, 0d
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Mind Map&lt;/h2&gt;
&lt;p&gt;Mind maps expand a central topic into related areas and supporting concepts.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mindmap
  root((Shirone))
    Content experience
      Markdown
      Search
      Diagrams
    Interface system
      M3E tokens
      Responsive layout
      Color schemes
    Engineering quality
      Astro Check
      Playwright
      Accessibility
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;p&gt;Timelines summarize significant events or phases without requiring exact calendar durations.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;timeline
    title Mermaid support evolution
    Pipeline design : Detect Mermaid fences
                    : Preserve source fallback
    Client enhancement : Load the runtime on demand
                       : Apply theme tokens
    Reliability : Support Swup navigation
                : Verify responsive and accessible output
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;User Journey&lt;/h2&gt;
&lt;p&gt;User journey diagrams combine actions, participants, and experience scores across the stages of a task.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;journey
    accTitle: A reader understanding a technical article
    accDescr: The reader discovers an article, combines prose with diagrams to understand it, and then explores related topics.
    title A reader understanding a technical article
    section Discover
      Browse the article list: 4: Reader
      Choose a topic: 5: Reader
    section Understand
      Read the article: 4: Reader
      Inspect a relationship diagram: 5: Reader
    section Continue
      Open a related article: 4: Reader
      Bookmark the page: 3: Reader
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Git Graph&lt;/h2&gt;
&lt;p&gt;Git graphs show how work progresses on a feature branch before it merges into the main line.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gitGraph
    accTitle: Mermaid feature branch history
    accDescr: A feature branch adds the renderer and tests before merging into the main branch for release.
    commit id: &quot;base&quot;
    branch mermaid
    checkout mermaid
    commit id: &quot;add-renderer&quot;
    commit id: &quot;add-tests&quot;
    checkout main
    merge mermaid id: &quot;merge-mermaid&quot;
    commit id: &quot;release&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Kanban Board&lt;/h2&gt;
&lt;p&gt;Kanban boards group tasks by workflow state to make current progress easy to scan.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;kanban
  backlog[Backlog]
    docs[Write author documentation]
    examples[Expand example data]
  active[In progress]
    themes[Verify theme adaptation]
  complete[Complete]
    fallback[Source fallback]
    rendering[Client rendering]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Sankey Diagram&lt;/h2&gt;
&lt;p&gt;Sankey diagrams use link width to show how traffic or another quantity flows between nodes.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sankey-beta
Landing,Reading,720
Discovery,Reading,430
Reading,Explore,360
Reading,Topics,210
Reading,Outbound,140
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each example uses a standard &lt;code&gt;mermaid&lt;/code&gt; code fence. The server preserves readable source markup, and the browser enhances it into an SVG that follows the active theme. Diagrams render again when the theme changes or when Swup navigates to this article.&lt;/p&gt;
</content:encoded></item><item><title>Markdown Extended Features</title><link>https://blog.fishai.top/posts/markdown-extended/</link><guid isPermaLink="true">https://blog.fishai.top/posts/markdown-extended/</guid><description>Read more about Markdown features in Fuwari</description><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;GitHub Repository Cards&lt;/h2&gt;
&lt;p&gt;You can add dynamic cards that link to GitHub repositories, on page load, the repository information is pulled from the GitHub API.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;Fabrizz/MMM-OnSpotify&quot;}&lt;/p&gt;
&lt;p&gt;Create a GitHub repository card with the code &lt;code&gt;::github{repo=&quot;&amp;lt;owner&amp;gt;/&amp;lt;repo&amp;gt;&quot;}&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;::github{repo=&quot;saicaca/fuwari&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Mermaid Diagrams&lt;/h2&gt;
&lt;p&gt;Fenced &lt;code&gt;mermaid&lt;/code&gt; blocks are rendered as diagrams and follow the active color scheme.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;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] --&amp;gt; B[Astro content pipeline]
    B --&amp;gt; C[Semantic HTML]
    C --&amp;gt; D[Themed diagram]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Admonitions&lt;/h2&gt;
&lt;p&gt;Following types of admonitions are supported: &lt;code&gt;note&lt;/code&gt; &lt;code&gt;tip&lt;/code&gt; &lt;code&gt;important&lt;/code&gt; &lt;code&gt;warning&lt;/code&gt; &lt;code&gt;caution&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;:::note
Highlights information that users should take into account, even when skimming.
:::&lt;/p&gt;
&lt;p&gt;:::tip
Optional information to help a user be more successful.
:::&lt;/p&gt;
&lt;p&gt;:::important
Crucial information necessary for users to succeed.
:::&lt;/p&gt;
&lt;p&gt;:::warning
Critical content demanding immediate user attention due to potential risks.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Negative potential consequences of an action.
:::&lt;/p&gt;
&lt;h3&gt;Basic Syntax&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;:::note
Highlights information that users should take into account, even when skimming.
:::

:::tip
Optional information to help a user be more successful.
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Custom Titles&lt;/h3&gt;
&lt;p&gt;The title of the admonition can be customized.&lt;/p&gt;
&lt;p&gt;:::note[MY CUSTOM TITLE]
This is a note with a custom title.
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::note[MY CUSTOM TITLE]
This is a note with a custom title.
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;GitHub Syntax&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;a href=&quot;https://github.com/orgs/community/discussions/16925&quot;&gt;The GitHub syntax&lt;/a&gt; is also supported.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; [!NOTE]
&amp;gt; The GitHub syntax is also supported.

&amp;gt; [!TIP]
&amp;gt; The GitHub syntax is also supported.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Spoiler&lt;/h3&gt;
&lt;p&gt;You can add spoilers to your text. The text also supports &lt;strong&gt;Markdown&lt;/strong&gt; syntax.&lt;/p&gt;
&lt;p&gt;The content :spoiler[is hidden &lt;strong&gt;ayyy&lt;/strong&gt;]!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;The content :spoiler[is hidden **ayyy**]!

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Image Widths and Captions&lt;/h2&gt;
&lt;p&gt;A standalone image accepts an optional &lt;code&gt;w-N%&lt;/code&gt; width token in its alt text and a Markdown title rendered as a centered caption below the image:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/albums/AcgExample/07.webp&quot; alt=&quot;Album example image w-50%&quot; title=&quot;Half-width image with a caption&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![Image description w-50%](./image.webp &quot;Visible caption&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Valid widths range from &lt;code&gt;w-1%&lt;/code&gt; to &lt;code&gt;w-100%&lt;/code&gt;; invalid tokens stay in the alt text. The width and the caption are independent — a title alone also produces a caption:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/albums/AcgExample/08.webp&quot; alt=&quot;Album example image w-75%&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/albums/AcgExample/09.webp&quot; alt=&quot;Album example image&quot; title=&quot;Caption without a width token&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Expressive Code Example</title><link>https://blog.fishai.top/posts/expressive-code/</link><guid isPermaLink="true">https://blog.fishai.top/posts/expressive-code/</guid><description>How code blocks look in Markdown using Expressive Code.</description><pubDate>Wed, 10 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here, we&apos;ll explore how code blocks look using &lt;a href=&quot;https://expressive-code.com/&quot;&gt;Expressive Code&lt;/a&gt;. The provided examples are based on the official documentation, which you can refer to for further details.&lt;/p&gt;
&lt;h2&gt;Expressive Code&lt;/h2&gt;
&lt;h3&gt;Syntax Highlighting&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/syntax-highlighting/&quot;&gt;Syntax Highlighting&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Regular syntax highlighting&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;This code is syntax highlighted!&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Rendering ANSI escape sequences&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Editor &amp;amp; Terminal Frames&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/frames/&quot;&gt;Editor &amp;amp; Terminal Frames&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Code editor frames&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;Title attribute example&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- src/content/index.html --&amp;gt;
&amp;lt;div&amp;gt;File name comment example&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Terminal frames&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;This terminal frame has no title&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;Write-Output &quot;This one has a title!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Overriding frame types&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Look ma, no frame!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;# Without overriding, this would be a terminal frame
function Watch-Tail { Get-Content -Tail 20 -Wait $args }
New-Alias tail Watch-Tail
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Text &amp;amp; Line Markers&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/text-markers/&quot;&gt;Text &amp;amp; Line Markers&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Marking full lines &amp;amp; line ranges&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// 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 &quot;7-8&quot;
// Line 8 - targeted by range &quot;7-8&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Selecting line marker types (mark, ins, del)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  console.log(&apos;this line is marked as deleted&apos;)
  // This line and the next one are marked as inserted
  console.log(&apos;this is the second inserted line&apos;)

  return &apos;this line uses the neutral default marker type&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Adding labels to line markers&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// labeled-line-markers.jsx
&amp;lt;button
  role=&quot;button&quot;
  {...props}
  value={value}
  className={buttonClassName}
  disabled={disabled}
  active={active}
&amp;gt;
  {children &amp;amp;&amp;amp;
    !active &amp;amp;&amp;amp;
    (typeof children === &apos;string&apos; ? &amp;lt;span&amp;gt;{children}&amp;lt;/span&amp;gt; : children)}
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Adding long labels on their own lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// labeled-line-markers.jsx
&amp;lt;button
  role=&quot;button&quot;
  {...props}

  value={value}
  className={buttonClassName}

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

  {children &amp;amp;&amp;amp;
    !active &amp;amp;&amp;amp;
    (typeof children === &apos;string&apos; ? &amp;lt;span&amp;gt;{children}&amp;lt;/span&amp;gt; : children)}
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Using diff-like syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;+this line will be marked as inserted
-this line will be marked as deleted
this is a regular line
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;--- 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
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Combining syntax highlighting with diff-like syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;  function thisIsJavaScript() {
    // This entire block gets highlighted as JavaScript,
    // and we can still add diff markers to it!
-   console.log(&apos;Old code to be removed&apos;)
+   console.log(&apos;New and shiny code!&apos;)
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Marking individual text inside lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  // Mark any given text inside lines
  return &apos;Multiple matches of the given text are supported&apos;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Regular expressions&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;The words yes and yep will be marked.&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Escaping forward slashes&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Test&quot; &amp;gt; /home/test.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Selecting inline marker types (mark, ins, del)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  console.log(&apos;These are inserted and deleted marker types&apos;);
  // The return statement uses the default marker type
  return true;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Word Wrap&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/word-wrap/&quot;&gt;Word Wrap&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Configuring word wrap per block&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Example with wrap
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Example with wrap=false
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Configuring indentation of wrapped lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Example with preserveIndent (enabled by default)
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Example with preserveIndent=false
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Collapsible Sections&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/plugins/collapsible-sections/&quot;&gt;Collapsible Sections&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// All this boilerplate setup code will be collapsed
import { someBoilerplateEngine } from &apos;@example/some-boilerplate&apos;
import { evenMoreBoilerplate } from &apos;@example/even-more-boilerplate&apos;

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: &apos;End of example boilerplate code&apos; })
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Line Numbers&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/plugins/line-numbers/&quot;&gt;Line Numbers&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Displaying line numbers per block&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// This code block will show line numbers
console.log(&apos;Greetings from line 2!&apos;)
console.log(&apos;I am on line 3&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Line numbers are disabled for this block
console.log(&apos;Hello?&apos;)
console.log(&apos;Sorry, do you know what line I am on?&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Changing the starting line number&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;Greetings from line 5!&apos;)
console.log(&apos;I am on line 6&apos;)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Markdown Example</title><link>https://blog.fishai.top/posts/markdown/</link><guid isPermaLink="true">https://blog.fishai.top/posts/markdown/</guid><description>A simple example of a Markdown blog post.</description><pubDate>Sun, 01 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;An h1 header&lt;/h1&gt;
&lt;p&gt;Paragraphs are separated by a blank line.&lt;/p&gt;
&lt;p&gt;2nd paragraph. &lt;em&gt;Italic&lt;/em&gt;, &lt;strong&gt;bold&lt;/strong&gt;, and &lt;code&gt;monospace&lt;/code&gt;. Itemized lists
look like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;this one&lt;/li&gt;
&lt;li&gt;that one&lt;/li&gt;
&lt;li&gt;the other one&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that --- not considering the asterisk --- the actual text
content starts at 4-columns in.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Block quotes are
written like so.&lt;/p&gt;
&lt;p&gt;They can span multiple paragraphs,
if you like.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Use 3 dashes for an em-dash. Use 2 dashes for ranges (ex., &quot;it&apos;s all
in chapters 12--14&quot;). Three dots ... will be converted to an ellipsis.
Unicode is supported. ☺&lt;/p&gt;
&lt;h2&gt;An h2 header&lt;/h2&gt;
&lt;p&gt;Here&apos;s a numbered list:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;first item&lt;/li&gt;
&lt;li&gt;second item&lt;/li&gt;
&lt;li&gt;third item&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note again how the actual text starts at 4 columns in (4 characters
from the left side). Here&apos;s a code sample:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Let me re-iterate ...
for i in 1 .. 10 { do-something(i) }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As you probably guessed, indented 4 spaces. By the way, instead of
indenting the block, you can use delimited blocks, if you like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define foobar() {
    print &quot;Welcome to flavor country!&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(which makes copying &amp;amp; pasting easier). You can optionally mark the
delimited block for Pandoc to syntax highlight it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import time
# Quick, count to ten!
for i in range(10):
    # (but not *too* quick)
    time.sleep(0.5)
    print i
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;An h3 header&lt;/h3&gt;
&lt;p&gt;Now a nested list:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;First, get these ingredients:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;carrots&lt;/li&gt;
&lt;li&gt;celery&lt;/li&gt;
&lt;li&gt;lentils&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Boil some water.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dump everything in the pot and follow
this algorithm:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; find wooden spoon
 uncover pot
 stir
 cover pot
 balance wooden spoon precariously on pot handle
 wait 10 minutes
 goto first step (or shut off burner when done)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Do not bump wooden spoon or it will fall.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Notice again how text always lines up on 4-space indents (including
that last line which continues item 3 above).&lt;/p&gt;
&lt;p&gt;Here&apos;s a link to &lt;a href=&quot;http://foo.bar&quot;&gt;a website&lt;/a&gt;, to a &lt;a href=&quot;local-doc.html&quot;&gt;local
doc&lt;/a&gt;, and to a &lt;a href=&quot;#an-h2-header&quot;&gt;section heading in the current
doc&lt;/a&gt;. Here&apos;s a footnote [^1].&lt;/p&gt;
&lt;p&gt;[^1]: Footnote text goes here.&lt;/p&gt;
&lt;p&gt;Tables can look like this:&lt;/p&gt;
&lt;p&gt;size material color&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;9 leather brown
10 hemp canvas natural
11 glass transparent&lt;/p&gt;
&lt;p&gt;Table: Shoes, their sizes, and what they&apos;re made of&lt;/p&gt;
&lt;p&gt;(The above is the caption for the table.) Pandoc also supports
multi-line tables:&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;keyword text&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;red Sunsets, apples, and
other red or reddish
things.&lt;/p&gt;
&lt;p&gt;green Leaves, grass, frogs
and other things it&apos;s
not easy being.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;A horizontal rule follows.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Here&apos;s a definition list:&lt;/p&gt;
&lt;p&gt;apples
: Good for making applesauce.
oranges
: Citrus!
tomatoes
: There&apos;s no &quot;e&quot; in tomatoe.&lt;/p&gt;
&lt;p&gt;Again, text is indented 4 spaces. (Put a blank line between each
term/definition pair to spread things out more.)&lt;/p&gt;
&lt;p&gt;Here&apos;s a &quot;line block&quot;:&lt;/p&gt;
&lt;p&gt;| Line one
| Line too
| Line tree&lt;/p&gt;
&lt;p&gt;and images can be specified like so:&lt;/p&gt;
&lt;p&gt;Inline math equations go in like so: $\omega = d\phi / dt$. Display
math should get its own line and be put in in double-dollarsigns:&lt;/p&gt;
&lt;p&gt;$$I = \int \rho R^{2} dV$$&lt;/p&gt;
&lt;p&gt;$$
\begin{equation*}
\pi
=3.1415926535
;8979323846;2643383279;5028841971;6939937510;5820974944
;5923078164;0628620899;8628034825;3421170679;\ldots
\end{equation*}
$$&lt;/p&gt;
&lt;p&gt;And note that you can backslash-escape any punctuation characters
which you wish to be displayed literally, ex.: `foo`, *bar*, etc.&lt;/p&gt;
</content:encoded></item><item><title>Include Video in the Posts</title><link>https://blog.fishai.top/posts/video/</link><guid isPermaLink="true">https://blog.fishai.top/posts/video/</guid><description>This post demonstrates how to include embedded video in a blog post.</description><pubDate>Tue, 01 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Just copy the embed code from YouTube or other platforms, and paste it in the markdown file.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: Include Video in the Post
published: 2023-10-19
// ...
---

&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;YouTube&lt;/h2&gt;
&lt;p&gt;::youtube{id=&quot;5gIf0_xpFPI&quot; title=&quot;YouTube video&quot; preload=&quot;auto&quot;}&lt;/p&gt;
&lt;h2&gt;Bilibili&lt;/h2&gt;
&lt;p&gt;::bilibili{bvid=&quot;BV1fK4y1s7Qf&quot; title=&quot;Bilibili video&quot; p=1 preload=&quot;auto&quot;}&lt;/p&gt;
&lt;h2&gt;AcFun&lt;/h2&gt;
&lt;p&gt;::acfun{acid=&quot;ac48649632&quot; title=&quot;AcFun video&quot; preload=&quot;auto&quot;}&lt;/p&gt;
&lt;h2&gt;ArtPlayer&lt;/h2&gt;
&lt;p&gt;::artplayer{src=&quot;https://www.pexels.com/download/video/38538991/&quot; title=&quot;Sintel trailer&quot; preload=&quot;auto&quot;}&lt;/p&gt;
</content:encoded></item></channel></rss>