MDX スタイルガイド
公開日:
記事を書くときのために、このサイトがサポートしている MDX 記法をまとめました。 書き方に迷ったらここを見る、新しいコンポーネントはここで試す — そんな場所です。
見出しと本文
見出しは h2 と h3 の 2 段構成です。 サイドバーの目次はこの見出し構造から自動生成され、見出し自体もアンカーリンクになっています。 クリックすれば、その章・節への直リンクを共有できます。
本文では 強調、イタリック、打ち消し線、インラインコード が使えます。
行間や文字サイズは、日本語の長文が読みやすいように調整しています。
リストとテーブル
リスト・タスクリスト・テーブルは GFM (GitHub Flavored Markdown) をそのまま使えます。
Velite が remark-gfm を内蔵しているため、追加の設定は不要です。
- 番号付きリスト
- 二番目の項目
- ネストした箇条書き
- 完了したタスク
- 未完了のタスク
| 記法 | 用途 |
|---|---|
| GFM テーブル | 比較表 |
| タスクリスト | TODO 管理 |
コードブロック
コードブロックは Shiki によってシンタックスハイライトされます。
type Post = {
title: string
emoji: string
tags: string[]
}
export function sortByDate(posts: Post[], order: "asc" | "desc" = "desc") {
return [...posts].sort((a, b) =>
order === "desc" ? b.date.localeCompare(a.date) : a.date.localeCompare(b.date),
)
}pnpm dev # 開発プレビュー
pnpm preview # 本番プレビュー (検索・API も動く)ファイル名と行ハイライト
フェンスに title と {行番号} を指定すると、ファイル名ラベルと行ハイライトが表示されます。
const posts = defineCollection({
pattern: "posts/*/index.mdx",
});図 (mermaid)
図は ```mermaid フェンスで書きます。ビルド時に SVG へ変換され、テーマに追従してライト版・ダーク版が切り替わります。
width で最大幅を指定できます:
引用とリンク
引用には左側にボーダーが付きます。 出典の提示や、自分の文章と区別したいときに使えます。
リンクは通常の Markdown 記法で書くだけです。 内部リンク はプリフェッチ付きのソフトナビゲーションに、外部リンク (example.com) は「新規タブで開く + 外部リンクアイコン」になります。 リンク先ごとの書き分けを意識する必要はありません。
区切り線
コールアウト
補足や注意事項を目立たせるためのボックスです。
Info Tip Warn Danger の 4 種類があり、title で見出しを変更できます。
キー表示
ショートカットは Cmd+Shift+P のようにインラインで書けます。 文中にそのまま書けるので、空行は不要です。
手順リスト
順序のある作業には Steps を使います。
依存をインストール
まず必要なパッケージを追加します。
pnpm add -D wrangler設定ファイルを書く
wrangler.jsoncにバインディングを追記します。 手順内の本文も、検索や関連記事計算の対象になります。デプロイ
最後にデプロイして完了です。
ファイルツリー
ディレクトリ構成は FileTree に Markdown の箇条書きを書くだけです。
子要素を持つ項目は自動的にフォルダーアイコンになります。
- contents/
- posts/
- mdx-style-guide/
- index.mdx
- mdx-style-guide/
- posts/
- src/
- components/
- mdx/
- mdx-content.tsx
- callout.tsx
- mdx/
- components/
- velite.config.ts
折りたたみ
長いログや余談は Details で折りたためます。
折りたたまれた内容も検索と関連記事計算の対象です。
ビルドログ (クリックで展開)
折りたたみの中でも、本文と同じ記法が使えます。
[related] all 26 embeddings cached
[related] wrote src/generated/related.json画像
画像は <Img> コンポーネントで表示します。
記事フォルダーに画像ファイルを配置し、相対パスで参照する方式です。
ビルド時に画像サイズを取得して width / height 属性を付与するため、読み込み中にレイアウトシフトが起きません。
クリックするとライトボックスで拡大表示されますが、これはネイティブの dialog 要素です。
幅指定とキャプションにも対応しています。 キャプションも、コールアウトと同様に前後を空行で囲んで書きます。
キャプションの例 / プロフィールのイラストを幅 320px で表示
なお、記法を統一するために Markdown 記法の ![]() はビルドエラーにしています。alt 属性の書き忘れも同様です。
ただし、生 JSX の <img> だけはガードできないため、規約として使わないように。
記事カード
内部記事へのリンクは LinkCard でカード表示できます。
デモとして、この記事自身のカードを配置しています。
このサイトで使える MDX 記法のリファレンスです。書き方に迷ったときのサンプルとして、またコンポーネントやスタイル変更時の回帰テストとして利用しています。
存在しない slug を書くとビルドエラーになるので、リンク切れのカードが公開されることはありません。
外部リンクカード
外部サイトへのリンクは OgpCard を使います。
OGP メタデータはビルド時に取得・キャッシュするため、閲覧時にメタデータ取得は発生しません (画像のみ配信元から直接読み込みます)。
Example Domainexample.com
og:image や description を持たないサイトは、2 枚目 (example.com) のようにタイトルとホスト名だけの表示になります。
取得に失敗した場合も同様のプレーンカードにフォールバックされます。
おわりに
以上が、このサイトでサポートしている MDX 記法です。
各コンポーネントの実装方針や、このサイト全体の仕組みはこちらの記事にまとめています。
WIEL の構成と主要機能の紹介です。MDX での記事執筆、検索サーバーを持たない全文検索、ローカル ML 推論による関連記事、クッキーを使わない自前のアクセス計測まで、このサイトがどう動いているのかを紹介します。