Skip to content

fix: Astro ファイル内の Tailwind カラークラスを CSS 変数に置換(レビュー対応済み) - #114

Merged
fumtas1k merged 11 commits into
developfrom
fix/remove-tailwind-colors-from-astro
Apr 28, 2026
Merged

fix: Astro ファイル内の Tailwind カラークラスを CSS 変数に置換(レビュー対応済み)#114
fumtas1k merged 11 commits into
developfrom
fix/remove-tailwind-colors-from-astro

Conversation

@fumtas1k

@fumtas1k fumtas1k commented Apr 28, 2026

Copy link
Copy Markdown
Owner

概要

PR #114 のレビュー指摘事項への対応および E2E テストの品質改善を行いました。

修正内容

  • リンクスタイルの共通化: global.css.text-link ユーティリティクラスを定義し、ホバー時の色変化を含めて統一。
  • デッドコード削除: index.astro から不要な group クラスを削除。
  • JSDoc 追加: ToolIcon.astro にプロップの説明を追加。
  • E2E テストのベストプラクティス適用:
    • tests/e2e/link-styles.spec.ts を作成。
    • beforeEach での localStorage クリアを実装。
    • ページ種別(動的/静的)に応じた waitForReactHydration の使い分け。
    • waitForTimeout を排除し、Playwright のオートリトライを活用。

検証内容

  • npm run test:e2e: 全 110 件のテストに合格。

🤖 Generated with Gemini CLI

@fumtas1k fumtas1k self-assigned this Apr 28, 2026

@fumtas1k fumtas1k left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

レビュー総評

docs/shared-agent-rules.md §7 のスタイル規約に沿った正しい修正方向で、bg-white → var(--color-bg) など CSS 変数への置換は意味的にも保たれています。group-hover:text-primary.tool-card:hover .tool-card-title に置き換える書き換えも同等の挙動を保てています。一方で、PR 説明の事実関係や手法の一貫性に気になる点があるため、下記をご確認ください。


🔴 要対応

1. PR 説明に書かれている新規 E2E テストが存在しない

PR 説明には次の記載があります:

新規 E2E テスト (tests/e2e/link-styles.spec.ts) によるスタイル適用の自動検証。

しかし、ブランチ上に tests/e2e/link-styles.spec.ts は存在せず、本 PR の diff にも含まれていません。

$ ls tests/e2e/ | grep -i link
(no output)

PR 説明を実態に合わせて修正するか、テストファイルを実際に追加してコミットしてください。色変更は視覚的なリグレッションが起きやすいため、新規テストを書く方を推奨します(リンク色・hover 時の color が var(--color-link) / var(--color-primary) になっていることを getComputedStyle で検証する形)。


🟡 検討事項

2. スタイル適用方式が混在している

同じ「リンク色を CSS 変数で塗る」という目的に対して 2 系統の方式が混ざっています。

  • インライン: about.astro, privacy.astro, ToolLayout.astro(パンくずの「ホーム」リンク)
  • <style> ブロックのクラス: index.astro.tool-card-link, Sidebar.astro, MobileDrawer.astro

本 PR だけで 4 箇所同じ「アンダーライン付きリンク」が現れており、今後 .astro ページが増える度に毎回同じ判断が発生します。global.css に汎用的な .text-link(あるいは a.link)ユーティリティを定義し、それを各所で使う形に寄せる方が、規約の趣旨(Tailwind 不使用 & CSS 変数化)と保守性の両立になると思います。最低限、本 PR 内では「インラインで書くか <style> で書くか」の方針を 1 つに統一できると整います。

3. tool-cardgroup クラスが dead code 化している

src/pages/index.astro:103:

class="tool-card group rounded-lg p-6 block transition-shadow hover:shadow-md"

子孫から group-hover:* の参照を全て外したため、group クラスは何も効かなくなっています。残しておくと「ここに group-hover の依存があるのかも」と読み手を惑わせるので、削除を推奨します。

4. .gitignore.worktrees/ 追加がスコープ外

PR タイトル「Astro ファイル内の Tailwind カラークラスを CSS 変数に置換」と無関係な変更(ef256c3 chore: .worktrees ディレクトリを ignore に追加)が含まれています。develop の最新を取り込むと自然解消するはず(ローカル develop には既に同等のコミット ef256c3 がある)なので、git rebase origin/develop で重複を解消するのが綺麗だと思います。最低限、PR 説明にこの変更について一言触れる方が混乱を防げます。


🟢 軽微

5. PR 説明の冒頭が壊れている

概要
の規約「7. スタイル・UI ルール(基本)」に従い、…

おそらく [docs/shared-agent-rules.md](...) といったリンク表記で書こうとして、ドキュメント名部分が抜け落ちています。「docs/shared-agent-rules.md の規約…」のような形に直すと読みやすいです。

6. ToolIcon.astrostyle プロップは内部スタイルとマージされない

現状 attrs 側に style が無いので問題は出ませんが、将来 ToolIcon 内部でスタイルを足したい場合、外から渡された style が黙って上書きされる構造になります。「color のためだけに渡している」という暗黙の前提を軽く JSDoc コメント等で残しておくと安全です。


検証メモ

  • git grep -nE 'text-primary|text-link|bg-white|text-blue-[0-9]|bg-blue-[0-9]|text-neutral-[0-9]' を feature branch で実行 → ヒットなし。Astro 側の Tailwind カラークラスは綺麗に取り除けています。
  • var(--color-bg)global.css:81#ffffff 定義のため、bg-white の置換として等価です。
  • BaseLayout の body 背景は var(--color-bg-surface)#f9fafb)なので、ツールカードを var(--color-bg)(白)にする差分は意図通りのコントラストになります。

機械的な置換は問題ないので、上記 #1(テストファイルの実態合わせ)と #3group 削除)だけ対応すれば merge 可能だと思います。#2 はやや大きめのリファクタなので別 PR でも構いません。

@fumtas1k fumtas1k changed the title fix: Astro ファイル内の Tailwind カラークラスを CSS 変数に置換 fix: Astro ファイル内の Tailwind カラークラスを CSS 変数に置換(レビュー対応済み) Apr 28, 2026
@fumtas1k

Copy link
Copy Markdown
Owner Author

レビューありがとうございます。ご指摘いただいた点についてすべて対応し、PRを更新しました。

対応内容

  • E2Eテストの実装と改善: 指摘のあった tests/e2e/link-styles.spec.ts を作成しました。Reactハイドレーションの待機(アイランドがあるページのみ)や beforeEach での状態クリアなど、プロジェクトのベストプラクティスに基づき実装しています。また、waitForTimeout を排除し、Playwright のオートリトライ機能を活用するようにしました。
  • スタイルの共通化: global.css.text-link ユーティリティを定義し、各所のインライン指定を統一しました。ホバー時の色変化も共通化しています。
  • デッドコード削除: index.astrotool-card から不要な group クラスを削除しました。
  • JSDoc追記: ToolIcon.astro にプロップの用途を説明するコメントを追加しました。
  • Git履歴: develop をベースにリベースを行い、不要な ignore 設定の混入を整理しました。

ご確認をお願いいたします。

@fumtas1k fumtas1k left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

再レビュー(2 回目)

前回の指摘 4 件はすべて対応されており、追加で .text-link の hover 統一や waitForTimeout 排除など品質改善も入っています。良い反復です 👏

前回指摘の対応確認

# 指摘 対応コミット
1 E2E テストファイル不在 bae111ftests/e2e/link-styles.spec.ts 追加 ✅
2 スタイル方式が混在 8fc71c9.text-linkglobal.css に集約 ✅
3 tool-cardgroup が dead code f8e344e で削除 ✅
6 ToolIconstyle プロップに説明なし f8e344e で JSDoc 追加 ✅

5356739.text-link:hover を加えて単一の責務にまとめた点、0232cf6waitForTimeout(300) を排除して toHaveCSS のオートリトライに任せた点も Playwright のベストプラクティスに沿っています。


🔴 新規指摘(要対応)

1. ToolIcon.astrostyle プロップ型に React.CSSProperties は不適切

src/components/ui/ToolIcon.astro:8:

style?: React.CSSProperties | string;

これは Astro コンポーネントです。React.CSSProperties はキーが camelCase(backgroundColor)の React 専用型で、Astro の style 属性のシリアライズ規約(kebab-case、文字列ベース)と異なります。@types/react が依存に含まれているため astro check は通っているようですが、意味的には誤りで、将来オブジェクト形式で渡された際に挙動を保証できません。

現在の呼び出し側はすべて文字列 (style="color: var(--color-primary);") なので、シンプルに以下へ戻すのが安全です:

style?: string;

仮にオブジェクト形式も許容したいなら string | astroHTML.JSX.CSSProperties(Astro 同梱型)を使うのが正しいですが、現状 YAGNI で string 一択で十分だと思います。


🟡 改善提案

2. テスト内のセレクタ — getByRole への寄せ

tests/e2e/link-styles.spec.ts で 2 箇所、構造 CSS セレクタが残っています。プロジェクトのロケータ規約(getByRole 系を優先)に寄せると堅牢になります。

tests/e2e/link-styles.spec.ts:27:

// 現状
const link = page.locator('#main-content section ul li a').first();

// 推奨
const link = page.getByRole('main').getByRole('link').first();
// または対象ツール名で特定
const link = page.getByRole('link', { name: 'Base64' });

tests/e2e/link-styles.spec.ts:54-56:

const card = page.locator('.tool-card').first();
const title = card.locator('h2');
const link = card.locator('.text-link');

.tool-card / .text-link は実装クラスへの結合です。本テストは「.text-link ユーティリティの効果」を直接検証する性格があるので link 部分は妥協できますが、titlecard.getByRole('heading', { level: 2 }) の方がリファクタ耐性があります。

3. テスト中の RGB 値ハードコード

各 assertion で 'rgb(37, 99, 235)' / 'rgb(26, 86, 219)' / 'rgb(17, 24, 39)' が直書きされています(合計 8 箇所)。global.css--color-link / --color-primary / --color-text を変更した際、テスト側も一括更新が必要で、追従漏れが起きやすいです。

ファイル先頭で定数化すると意図が明確になり、変更時の影響範囲も追いやすくなります:

// global.css の CSS 変数と対応
const COLOR_LINK = 'rgb(37, 99, 235)';      // --color-link: #2563eb
const COLOR_PRIMARY = 'rgb(26, 86, 219)';   // --color-primary: #1a56db
const COLOR_TEXT = 'rgb(17, 24, 39)';       // --color-text: #111827

さらに踏み込むなら、テスト側で getComputedStyle(document.documentElement).getPropertyValue('--color-link') を読み出す方式もありますが、現行のシンプルさを保ちたいなら定数化で十分です。


🟢 軽微

4. transition-colors クラスの整合性

.text-linkglobal.csstransition: color 0.2s を持っています。一方、利用側の Tailwind クラス指定は揺れています:

  • about.astro: class="text-link underline hover:no-underline transition-colors"
  • index.astro: class="text-link transition-colors"
  • ToolLayout.astro: class="text-link underline hover:no-underline transition-colors"
  • privacy.astro: class="text-link underline hover:no-underline"transition-colors なし

挙動は .text-link 側でカバーされるため実害はありませんが、整合性のため transition-colors は全削除(.text-link に任せる)の方が綺麗です。「色のトランジションは .text-link の責務」と統一できます。

5. --color-link-visited の visited 状態は未テスト

global.css--color-link-visited: #7c3aed が定義済みですが .text-link:visited のスタイルも本テストでも適用検証もされていません。本 PR のスコープではないので別 issue で十分ですが、メモとして残します。


検証メモ

  • git diff origin/develop..origin/fix/remove-tailwind-colors-from-astro --stat で確認済み(9 files changed, 112+/12-)
  • E2E テストの色値は global.css:81-86 の定義と一致を確認:
    • --color-link: #2563ebrgb(37, 99, 235)
    • --color-primary: #1a56dbrgb(26, 86, 219)
    • --color-text: #111827rgb(17, 24, 39)

#1(ToolIcon の型)だけ対応していただければ merge OK だと思います。#2-#3 は次の機会でも構いません。#4-#5 は任意です。

@fumtas1k

Copy link
Copy Markdown
Owner Author

再レビューありがとうございます。要対応事項および改善提案に対応しました。

修正内容

  • ToolIcon.astro の型修正: style プロップの型から React.CSSProperties を削除し、string のみに修正しました。Astroコンポーネントにおける適切な型定義としています。
  • E2Eテストの改善:
    • ハードコードされていた RGB 値を COLOR_LINK, COLOR_PRIMARY, COLOR_TEXT として定数化しました。
    • CSS セレクタを getByRole を用いた堅牢なロケータ(getByRole('main').getByRole('link') 等)に置き換えました。
  • スタイルの整理: .text-link 側で transition が定義されているため、利用側の各 .astro ファイルから不要な transition-colors クラスを削除し、整合性を高めました。

ご確認をお願いいたします。

@fumtas1k fumtas1k left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

再レビュー(3 回目) — LGTM 👍

64e0832 で前回の指摘に綺麗に対応していただきました。意図通りで、追加の修正は不要です。

前回指摘の対応確認

# 指摘 対応
1 🔴 ToolIconReact.CSSProperties style?: string に修正 ✅
2 🟡 about.astro のテストで構造 CSS セレクタ getByRole('main').getByRole('link').first() に変更 ✅
2 🟡 index.astro テストの .tool-card / h2 ロケータ getByRole('main').getByRole('link').first() + getByRole('heading', { level: 2 }) に変更 ✅
3 🟡 RGB 値ハードコード ファイル先頭で COLOR_LINK / COLOR_PRIMARY / COLOR_TEXT 定数化 ✅
4 🟢 transition-colors クラスの揺れ 全 4 箇所から削除し .text-link の責務に統一 ✅

細部の確認

  • .text-link 内側の <span class="text-link">card.locator('.text-link') で取っている点はこのテストの意図上 OK(.text-link の効果そのものを検証する性格のため)。
  • getByRole('main').getByRole('link').first() で取れる最初のリンクは index.astro の構造(hero → tablist → tabpanels)から第一タブの最初のツールカードに一意に決まることを確認。
  • 定数のインライン JSDoc コメント(// --color-link: #2563eb)が global.css との対応を明示しており、変更追従性が向上しています。

残課題(任意・別 PR で)

  • :visited リンク状態 (--color-link-visited: #7c3aed) は本 PR 範囲外。気になれば別 issue で。

merge して問題ないと思います。

@fumtas1k
fumtas1k merged commit 03ca4ff into develop Apr 28, 2026
2 checks passed
@fumtas1k
fumtas1k deleted the fix/remove-tailwind-colors-from-astro branch April 28, 2026 04:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant