テーマのフォントインポートでGoogle Fonts構文をBunny Fonts構文へ置換

shoelace-style/webawesome

このPRは、テーマで使用されているフォントの @import URL を Google Fonts 構文 から Bunny Fonts 構文 へ置き換え、複数フォントを同時にロードできなかった不具合を解消します。変更はフォント定義だけでなく、CSS でのインポート文も対象となり、利用者がテーマをそのまま使用した際にフォント欠損が起きなくなります。

背景

複数フォントのロードが失敗する問題 は、テーマの @import で Google Fonts のクエリ形式(css2?family=...&family=...)を使用したことが原因でした。Bunny Fonts が提供するエンドポイントは同名の構文をサポートしていないため、クエリ文字列に複数フォントが含まれると最初のフォントだけが取得され、残りは無視されました。

この挙動は Web Awesome の各テーマで共通しており、特に Awesome テーマのデフォルトインポートで見られました。結果として、UI の見た目が期待通りにならず、開発者はフォントが欠落した状態でデザインを確認することになっていました。

修正が行われない限り、テーマ利用者は手動でフォント URL を分割する作業が必要となり、エクスペリエンスが大きく損なわれる点が問題でした。

技術的な変更

対象ファイルは三つ で、themer.jsawesome.css、そして changelog.md が更新されています。全ての変更は URL の構文を css2?family= 形式から css?family= 形式へ統一し、フォントとウェイトを :, で列挙する形に置き換えました。

packages/webawesome/docs/_data/themer.js

@@ -74,12 +74,12 @@ export const themes = [
   body: {
     name: 'Quicksand',
     css: 'Quicksand, sans-serif',
-    href: 'https://fonts.bunny.net/css2?family=Quicksand:wght@300..700&display=swap',
+    href: 'https://fonts.bunny.net/css?family=quicksand:300,400,500,600,700&display=swap',
   },
   heading: {
     name: 'Quicksand',
     css: 'Quicksand, sans-serif',
-    href: 'https://fonts.bunny.net/css2?family=Quicksand:wght@300..700&display=swap',
+    href: 'https://fonts.bunny.net/css?family=quicksand:300,400,500,600,700&display=swap',
   },
@@
   longform: {
     name: 'Crimson Pro',
     css: '"Crimson Pro", serif',
-    href: 'https://fonts.bunny.net/css2?family=Crimson+Pro:ital,wght@0,200..900;1,200..900&display=swap',
+    href: 'https://fonts.bunny.net/css?family=crimson-pro:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900,900i&display=swap',
   },

同様の置換が Inter, Geist Mono, Aleo など他のフォントでも行われ、すべて css?family= 形式に統一されています。

packages/webawesome/src/styles/themes/awesome.css

@@ -1,6 +1,6 @@
 @import url('../layers.css');
 @import url('../color/palettes/bright.css'); /* To use this palette, add class="wa-palette-bright" to the <html> element */
-@import url('https://fonts.bunny.net/css2?family=Crimson+Pro:ital,wght@0,200..900;1,200..900&family=Quicksand:wght@300..700&display=swap');
+@import url('https://fonts.bunny.net/css?family=crimson-pro:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900,900i|quicksand:300,400,500,600,700&display=swap');

この変更により、CSS でも同一の URL 形式が使用され、ビルド時にフォント取得が失敗するケースが排除されました。

packages/webawesome/docs/docs/resources/changelog.md

@@ -34,6 +34,7 @@ Web Awesome follows <a href="https://semver.org/" class="appearance-plain">Seman
  :::fixed

  - Fixed type resolution issues with `pro` components like `<wa-file-input>`, `<wa-combobox>`, etc. [pr:2577]
+- Fixed an issue where some fonts wouldn't load in themes that import multiple fonts [pr:2582]

  :::

変更点がリリースノートに明記されたことで、利用者はバージョンアップ時に影響範囲を把握しやすくなります。

設計判断

URL 構文の置換 を選択した理由は、既存のテーマロジックを改変せずに問題を根本的に解決できる点にあります。Bunny Fonts が公式に推奨する css?family= 形式は、単一・複数フォント共に同一エンドポイントで正しく解釈されるため、追加のフォールバック実装は不要です。

また、ドメインやクエリパラメータを変更しない ことで、CDN キャッシュや CSP ポリシーへの影響を最小限に抑えました。利用者がカスタム CSS を上書きしていた場合でも、URL の構文だけが変わるため破壊的変更にはなりません。

この設計は、後方互換性を保ちつつ すべてのテーマで一貫したフォントロードを保証するという、ライブラリ全体の安定性維持という方針と整合しています。

まとめ

今回の PR は、テーマのフォントインポートにおける URL 構文を Google Fonts 形式から Bunny Fonts 形式へ統一 することで、複数フォントのロード不具合を根本的に解消しました。変更は限定的かつ後方互換性を保持しているため、既存利用者への影響はほとんどなく、テーマの見た目が期待通りに表示されるようになりました。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
bb2381fe

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文が要旨を示し、背景・技術的変更・設計判断・まとめとセクションが揃っており、結論が繰り返しでない。全体が『総論→各論→結論』の構成になっている。

カスタムMarkdown構文 ✓ PASS

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

コードブロックは diff ハイライトで記載され、ファイル名付きハイライトは使用していないが不備はない。PR リンクは正しくマークダウン化されている。

対象読者への適合性 ✓ PASS

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

対象は実装に関心のあるエンジニアで、専門用語中心の記述で初心者向けの余計な解説はない。

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

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

各セクションは総論パラグラフ→各論パラグラフ→結論パラグラフで構成され、トピックセンテンスが冒頭にある。段落は 6 文以内で空行で区切られている。

Diff内容との照合 ✓ PASS

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

記事中の diff ブロックは提供された Diff と一致し、ファイル名・変更箇所・内容が正確に反映されている。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「Bunny Fonts」「Google Fonts」「URL 構文」などの用語は PR と一致し、誤用はない。

説明の技術的正確性 ✓ PASS

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

技術的説明は PR の背景・目的・実装内容と合致し、因果関係も明確で誤りがない。

事実の突合 ✓ PASS

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

すべての主張は PR タイトル、説明、Diff で裏付けられており、推測や外部知識の付加はない。

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

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

PR 番号 #2582、URL 中のフォントウェイト範囲など数値は正確。

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

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

記事タイトルは PR の内容「Google Fonts 構文を Bunny Fonts 構文へ置換」を正確に表現している。

外部知識の正確性 ✓ PASS

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

記事は PR に記載された情報以外の外部知識(LTS、リリース日程等)を含まない。

時間表現の正確性 ✓ PASS

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

時間表現は使用しておらず、PR の記述と食い違いはない。