搜尋

搜尋文章與日記…

元件設計測試

寫於 2026-10-21・寒露

這篇文章不是給讀者看的,是給元件看的:每一種區塊都在這裡出現一次,改樣式時一頁看完晝、夜讀與手機寬度。

文字與行內元素

一般段落裡會有粗體、斜體(中文不建議用)、刪除線、行內程式碼 useEffect 與 pnpm run dev、
外部連結 TanStack Start、GitHubGitHub 連結,
還有站內連結 回到文章列表。註腳也要能用1,同一個註腳可以引用兩次1,再來一個2。

按 Ctrl+K 開啟搜尋(小寫 Esc 也是同樣樣式)。
日文的漢字(かんじ)可以標振假名,冷僻字也能標注音:馨(ㄒㄧㄣ)。
這句話後面有一則旁註桌機顯示在段落右側;手機點編號才展開。,
再來一則旁註整篇連號,支援 markdown 與 code。看編號有沒有接著算。

用螢光筆畫重點,用朱筆劃底線、刪掉這句、
把關鍵字圈起來或框起來;也能換顏色、換筆色。
跨行也可以:這是一段比較長、在窄螢幕上會折成兩行以上的螢光筆標記,每一行都會各自畫上一筆,不會只畫在第一行。

清單

  • 無序清單第一項
  • 第二項,裡面有 code
    • 巢狀項目
  • 第三項
  1. 有序清單
  2. 第二步
  3. 第三步
  • 已完成的待辦
  • 還沒做的待辦

表格

元件用途狀態
Alert提示、警告✅
Tabs多語言程式碼切換✅
Benchmark效能比較✅

數學

行內公式 E=mc2E = mc^2,區塊公式:

∑i=1ni=n(n+1)2\sum_{i=1}^{n} i = \frac{n(n+1)}{2}

程式碼

單行指令(不顯示行號):

Bash
pnpm --filter tan-blog dev

高亮行 {2,4-5},第 4 行很長(測試自動換行與橫向捲動):

TypeScript
import { createServerFn } from '@tanstack/react-start'
const greet = createServerFn({ method: 'GET' })
  .handler(async () => {
    const message = 'hello from the server, this line is intentionally rather long so we can test wrapping behaviour on narrow screens'
    return { message }
  })

超過 15 行(預設收合、底部淡出、展開/收合後捲回區塊開頭):

Python
def fib(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a


def main():
    for i in range(10):
        print(i, fib(i))


if __name__ == "__main__":
    main()

# 下面多寫幾行讓它超過 15 行
x = 1
y = 2
z = x + y
print(z)

各語言圖示:

TSX
export const Hello = () => <p>Hello</p>
JSON
{ "name": "sao-blog", "private": true }
Rust
fn main() { println!("hello"); }
Go
package main
Dockerfile
FROM node:22-alpine
PowerShell
Get-ChildItem -Recurse
純文字
example.com { reverse_proxy localhost:3000 }
純文字
沒有標記語言的程式碼(顯示「純文字」)

檔名標題 title="...":

vite.config.ts
import { defineConfig } from 'vite'

export default defineConfig({ server: { port: 3004 } })

差異標記 // [!code ++]、// [!code --](複製時不含刪除行):

server.ts
const app = new Elysia()
  .use(cors())
  .use(cors({ origin: 'https://sao.blog' }))
  .listen(3000)

聚焦 // [!code focus](其餘行淡掉,滑過恢復)與 // [!code highlight]:

TypeScript
export async function loader() {
  const post = await getPost()
  if (!post) throw notFound()
  return post
}

提示

附註

沒有標題時顯示類型名稱。

小提醒

這裡可以寫 markdown,也可以放 code 與連結。

完成

建置完成。

注意

這個 API 在下一版會移除。

內文可以有好幾段,也可以放清單:

  • 第一點
  • 第二點

警告

不要在正式環境執行 rm -rf /。

引言

其實地上本沒有路,走的人多了,也便成了路。
—— 魯迅

沒有署名、info 語意色的引言。

warning 語意色的引言。

success 語意色的引言。

一般的 markdown 引言,不用斜體。

第二段。

折疊

共 3 項

一致的規則讓每個新元件都「長得像這個站」,不用每次重新決定顏色和邊框。

可同時展開多項:

共 2 項

第一項內容

第二項內容

問答模式 variant="faq":

共 3 項

可以,註明出處並附上原文連結即可。

分頁

只放一段程式碼時,程式碼貼齊外框、工具浮在右上角:

JavaScript
console.log('hi')

預設選第二個分頁、分頁很多(窄螢幕橫向捲動):

pnpm add sao-blog

圖片

預設外框(髮絲線+柔影),alt 當圖說並自動編號:

山谷裡的晨霧(預設外框)山谷裡的晨霧(預設外框)

截圖襯底:

桌上的筆電(截圖襯底)桌上的筆電(截圖襯底)

拍立得(直式照片):

午睡的小狗午睡的小狗

裝飾圖(alt 以 _ 開頭,不顯示圖說):

裝飾用

輪播

圖表

成功 失敗 撰寫 MDX 編譯 hast JSON 回傳行號 前台渲染

進度條

HTML90%
TypeScript70%
Go60%
Elixir50%
CSS40%
C30%
沒指定顏色(朱)55%
不顯示數值

效能比較

越低越好(自動找出最佳、其餘標倍數):

數值越低越好
Webpack4,200 ms×23
esbuild最佳180 ms
Vite620 ms×3.4

越高越好、手動標記:

數值越高越好
Express15,000 req/s
Elysia最佳255,000 req/s
Hono190,000 req/s

Playground

按鈕示範html
<button id="b">Click</button>
預覽
Console

執行後,console 的輸出會出現在這裡。

React 計數器react
import { useState } from 'react'

export default function App() {
  const [n, setN] = useState(0)
  return <button onClick={() => setN(n + 1)}>clicked {n} times</button>
}
預覽
Console

執行後,console 的輸出會出現在這裡。

步驟

  1. 安裝 Docker

    Bash
    curl -fsSL https://get.docker.com | sh
  2. 寫好 compose 檔

    建一個 compose.yaml,內容支援任意 markdown。

  3. 啟動服務

    執行 docker compose up -d,打開 http://localhost:3000。

檔案樹

  • apps/
    • tan-blog/
      • src/
        • components/
          • mdx/
            • blocks.css 文章區塊的共用樣式
            • DESIGN.md設計原則
            • renderers/
              • …
        • styles.css
      • vite.config.ts建置設定
  • packages/
    • mdx/
  • package.json
  • README.md

連結卡片

Ttanstack.comtanstack.com/start/latest Bbun.shbun.sh

github.com/owner/repo 會自動變成 GitHub 卡片(星星、語言、過去一年的 commit):

TanStack/router Eexample.com手動指定標題抓不到預覽時用 title / description 補上。example.com/no-preview

終端機

靜態(預設):指令前有提示字元,複製只會複製指令。

zsh
# 安裝相依套件
$ pnpm install
Lockfile is up to date, resolution step is skipped
Packages: +1287
Done in 4.2s
$ pnpm --filter tan-blog dev
  VITE v8.3.4  ready in 1830 ms
  ➜  Local:   http://localhost:3004/

animate:捲到才逐行打出來,點一下跳到結尾。

PowerShell
PS C:\code> git status
On branch main
nothing to commit, working tree clean
PS C:\code> git log --oneline -1
ace150b feat(tan-blog): Mark 手繪標記
$ 

推文

網址也會自動變成推文卡片(含影片封面):

便條紙

捲到這裡時,這個螢光筆標記和圈圈才會畫上去。

前後對比

拖動分隔線比較黑白與彩色(彩色)拖動分隔線比較黑白與彩色(黑白)
拖動分隔線比較黑白與彩色

影片

YouTube:點了才載入播放器
Bilibili(沒有縮圖,顯示紙色底)

註腳

  1. 這是一個註腳,文末的返回圖示會帶你回到引用的地方。 2

  2. 第二個註腳,內容可以比較長,也能放 markdown 與 code。

丙午年 寒露

唯一 書

載入留言區中...