<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>前端 on Chen Shungen</title><link>https://chenshungen.cn/tags/%E5%89%8D%E7%AB%AF/</link><description>Recent content in 前端 on Chen Shungen</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 22 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://chenshungen.cn/tags/%E5%89%8D%E7%AB%AF/index.xml" rel="self" type="application/rss+xml"/><item><title>给 Hugo 博客加上卡片式能力总览：Mermaid + 自定义 shortcode 实践</title><link>https://chenshungen.cn/blog/hugo-mermaid-capability-cards/</link><pubDate>Wed, 22 Apr 2026 00:00:00 +0000</pubDate><guid>https://chenshungen.cn/blog/hugo-mermaid-capability-cards/</guid><description>&lt;p>最近看到一个 AIQA 能力总览的 landing 页：顶部卡片阵列、中间带坐标的 SVG 流程图、配色和阴影都很克制。我想把这种表达力带进博客，但不想每次写文章都重画一遍 SVG。于是重新梳理了一下 Hugo 这边的做法，落地成两个 shortcode 和一段作用域化的 CSS。&lt;/p>
&lt;h2 id="一问题是什么">一、问题是什么&lt;/h2>
&lt;p>照搬示例页面有几个硬伤：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>硬坐标 SVG&lt;/strong>（&lt;code>x=&amp;quot;340&amp;quot; y=&amp;quot;230&amp;quot;&lt;/code> 那种）一改文案就要重算坐标，和 markdown 的轻量写作完全反着来。&lt;/li>
&lt;li>&lt;strong>样式耦合&lt;/strong>：示例把所有 CSS 变量都挂在 &lt;code>:root&lt;/code> 上，塞进 post 会污染全站命名空间。&lt;/li>
&lt;li>&lt;strong>Goldmark &lt;code>unsafe=true&lt;/code>&lt;/strong> 虽然已经开了，但直接在 md 里糊 200 行 HTML，语义层级乱掉。&lt;/li>
&lt;/ol>
&lt;p>所以目标是：流程图&lt;strong>文本化&lt;/strong>、卡片样式&lt;strong>作用域化&lt;/strong>、写作体验&lt;strong>仍然是 markdown&lt;/strong>。&lt;/p>
&lt;h2 id="二技术栈取舍">二、技术栈取舍&lt;/h2>
&lt;div class="cap-overview">
 &lt;div class="cap-grid cap-grid--3">
 

&lt;div class="cap-card cap-card--blue">&lt;div class="cap-card__icon">📊&lt;/div>&lt;h4 class="cap-card__title">Mermaid 代替 SVG&lt;/h4>&lt;div class="cap-card__body">流程图用文本语法描述，diff 友好，无需关心坐标。按需加载，不用 Mermaid 的页面零开销。&lt;/div>
&lt;/div>


&lt;div class="cap-card cap-card--green">&lt;div class="cap-card__icon">🎴&lt;/div>&lt;h4 class="cap-card__title">Shortcode 组合卡片&lt;/h4>&lt;div class="cap-card__body">&lt;code>capability-grid&lt;/code> + &lt;code>capability-card&lt;/code> 两级组合，cols 和 color 用参数控制，写法贴近 markdown。&lt;/div>
&lt;/div>


&lt;div class="cap-card cap-card--orange">&lt;div class="cap-card__icon">🎯&lt;/div>&lt;h4 class="cap-card__title">CSS 作用域隔离&lt;/h4>&lt;div class="cap-card__body">所有变量和类名挂在 &lt;code>.cap-overview&lt;/code> 下，不会污染主题的 &lt;code>:root&lt;/code>，未来换主题也不冲突。&lt;/div>
&lt;/div>



 &lt;/div>
&lt;/div>

&lt;h2 id="三流程图mermaid-代替手画-svg">三、流程图：Mermaid 代替手画 SVG&lt;/h2>
&lt;p>写作时只要这样：&lt;/p>
&lt;div class="highlight-wrapper">
 &lt;button class="copy-code-btn" type="button" aria-label="Copy code to clipboard">
 &lt;svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2">&lt;/rect>
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">&lt;/path>
 &lt;/svg>
 &lt;span class="copy-text">Copy&lt;/span>
 &lt;/button>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">{{&amp;lt; mermaid &amp;gt;}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">graph LR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> A[Markdown 源文件] --&amp;gt; B[Hugo 构建]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> B --&amp;gt; C[Shortcode 展开]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> C --&amp;gt; D[静态 HTML]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> D --&amp;gt; E[浏览器渲染]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> E --&amp;gt; F{含 Mermaid?}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> F -- 是 --&amp;gt; G[CDN 加载 mermaid.esm.min.mjs]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> F -- 否 --&amp;gt; H[零额外开销]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> G --&amp;gt; I[文本语法转 SVG]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{&amp;lt; /mermaid &amp;gt;}}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>
&lt;p>渲染结果：&lt;/p></description></item></channel></rss>