`:::pro` ディレクティブの拡張とProコールアウトスタイルの統合

shoelace-style/webawesome

ドキュメント全体に分散していた「Web Awesome Pro」告知用のコールアウトスタイルを utils.css の単一ルールに集約し、:::pro Markdownディレクティブがタイトルとアイコンのオーバーライドをサポートするよう拡張されました。

背景

Proコンポーネント紹介ページやShoelace移行ガイドで使われていたコールアウトのスタイルが、複数箇所に重複して定義されていました。具体的には、migrating-from-shoelace.md にインラインの <style> ブロックと外部スタイルシート (theme-site-embed.css) への <link> タグが存在し、:::pro ディレクティブが生成するコールアウトとは別の視覚スタイルを持っていました。

この状態では、スタイルを変更する際に複数箇所を修正する必要があり、見た目の一貫性も損なわれていました。本PRは wa-callout.pro ルールを utils.css の唯一の正規定義(source of truth)として確立することで、この重複を解消しています。

技術的な変更

utils.css へのスタイル集約

utils.csswa-callout.pro ルールが拡張され、これまで migrating-from-shoelace.md のインラインスタイルに分散していたプロパティが統合されました。

追加されたスタイルプロパティは以下のとおりです:

  • margin-block: calc(var(--wa-content-spacing) * 2) — 前後の余白
  • padding: var(--wa-space-l) — 内側の余白
  • &::part(icon)align-items: flex-start — アイコンを上揃えに
  • wa-icon[slot='icon']font-size: var(--wa-font-size-xl) — アイコンサイズ
  • strongdisplay: blockmargin-block-end: var(--wa-space-2xs) — タイトル用ブロック要素
  • strong acolor: inherit — タイトル内リンクの色継承

これにより migrating-from-shoelace.md はインライン <style> ブロックと <link rel="stylesheet"> タグの両方を削除でき、ページ固有のスタイル定義がなくなりました。

:::pro ディレクティブの拡張

markdown.jsmarkdownItContainer 設定が拡張され、:::pro ディレクティブがオプションのタイトルとアイコン指定を受け付けるようになりました。

変更前:

markdown.use(markdownItContainer, 'pro', {
  render: function (tokens, idx) {
    if (tokens[idx].nesting === 1) {
      return `
        <wa-callout class="pro">
          <wa-icon slot="icon" name="star-circle"></wa-icon>
      `;
    }
    return '</wa-callout>\n';
  }
});

変更後:

markdown.use(markdownItContainer, 'pro', {
  validate: params => /^pro(\s+.+)?$/.test(params.trim()),
  render: function (tokens, idx) {
    if (tokens[idx].nesting === 1) {
      const info = tokens[idx].info.trim().replace(/^pro\s*/, '');
      const iconMatch = info.match(/^\{([\w-]+)\}\s*(.*)$/);
      const iconName = iconMatch ? iconMatch[1] : 'hand-wave';
      const title = iconMatch ? iconMatch[2].trim() : info.trim();
      return `
        <wa-callout class="pro">
          <wa-icon slot="icon" name="${markdown.utils.escapeHtml(iconName)}"></wa-icon>
          ${title ? `<strong>${markdown.utils.escapeHtml(title)}</strong>` : ''}
      `;
    }
    return '</wa-callout>\n';
  }
});

新しいディレクティブ構文は以下の3パターンをサポートします:

  • :::pro — タイトルなし、デフォルトアイコン (hand-wave)
  • :::pro Using Web Awesome Pro? — タイトルあり、デフォルトアイコン
  • :::pro {star-circle} Using Web Awesome Pro? — タイトルとアイコンの両方を指定

アイコン名とタイトルテキストはいずれも markdown.utils.escapeHtml() でサニタイズされており、XSS対策が施されています。また、デフォルトアイコンが star-circle から hand-wave に変更されています。

ドキュメントページの更新

docs/index.mddocs/frameworks/react.md:::pro ディレクティブが新しい構文に更新されました。

変更前:

:::pro
Pro users: get installation instructions from <a href="/workspaces">your&nbsp;workspaces</a> instead.
:::

変更後:

:::pro Using Web Awesome Pro?
Get personalized installation instructions from <a href="/workspaces">your&nbsp;workspaces</a> instead.
:::

タイトルが <strong> タグとしてコールアウトの先頭に表示されるようになり、本文との視覚的な階層が明確になっています。

設計判断

--wa-brand-orange をデザイントークンとして直接参照する方式 が採用され、マーケティング用パレットの外部スタイルシートへの依存が排除されました。

移行前の migrating-from-shoelace.md--wa-color-brand トークンと theme-site-embed.css に依存していましたが、統合後の utils.css ルールは --wa-brand-orange を直接参照します。これにより、ページごとに外部スタイルシートを読み込む必要がなくなっています。

また、validate 関数の正規表現 /^pro(\s+.+)?$/ により、:::pro の後に任意テキストが続く構文を明示的に許容しています。この検証があることで、markdownItContainer がディレクティブを正しく認識し、追加情報を tokens[idx].info として render 関数に渡せるようになっています。

まとめ

スタイルの重複定義をインライン・外部CSSから utils.css の単一ルールへ集約したことで、Proコールアウトの見た目を変更する際の修正箇所が一か所になりました。:::pro ディレクティブがタイトルとアイコン指定をサポートしたことで、Markdownから直接リッチなコールアウトを記述できるようになり、生HTMLによるマークアップを排除する方向への一歩となっています。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
320359d7

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)→ 背景・技術詳細・設計判断(各論)→ まとめ(結論)という「総論→各論→結論」の構成が明確で、非常に分かりやすいです。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライトは正しく使用されていますが、記事末尾のPRリンクがガイドラインで推奨される形式([#123])と若干異なります([PR #2386])。ただし、機能的には問題ありません。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

CSSの集約やMarkdownパーサーの拡張といった内容が、専門知識を持つエンジニア向けに適切な技術レベルで解説されています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクション、各パラグラフが「総論→各論」の構造で書かれており、トピックセンテンスも明確です。1段落1トピックの原則が守られており、可読性が高いです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されているCSS、JavaScript、Markdownのコードブロックは、提供されたDiff情報と正確に一致しています。変更点の説明もDiffの内容に基づいています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「正規定義(source of truth)」「サニタイズ」「XSS対策」など、技術用語が正確かつ効果的に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

スタイルの集約、ディレクティブの拡張、デフォルトアイコンの変更など、すべての技術的な説明がDiffの内容によって正確に裏付けられています。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内の主張はすべてPRのDescriptionやDiff内のコードから裏付けられており、ハルシネーション(捏造)は見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#2386)、ファイルパス、CSS変数名など、記事に含まれる固有名詞や数値はすべて正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトルは、PRのタイトル「Consolidate Pro Callout Styles + Extend the :::pro Directive」の内容を的確に要約し、日本語で表現しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事の内容は提供されたPR情報に限定されており、LTSやリリース予定日といったPR外の外部知識を含んでいません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「これまで〜だった」「この変更により〜」といった時間的な前後関係や状態変化の表現は、PRの内容と一致しており正確です。