From 97a667e422ea2336d5e4722fac9cc8a8ab9900f6 Mon Sep 17 00:00:00 2001 From: Kissa Ruokanen Date: Tue, 2 Jun 2026 17:57:47 +0900 Subject: [PATCH 1/8] =?UTF-8?q?fix:=20=E3=80=8CD=E3=80=8D=E3=82=AD?= =?UTF-8?q?=E3=83=BC=E3=81=A7=E3=83=A2=E3=83=BC=E3=83=89=E3=82=92=E5=88=87?= =?UTF-8?q?=E3=82=8A=E6=9B=BF=E3=81=88=E3=82=8B=E3=81=A8=E3=81=8D=E3=81=AB?= =?UTF-8?q?`syncDeviceDarkMode`=E3=81=AE=E3=83=81=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=82=92=E8=A1=8C=E3=81=86=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E3=81=99=E3=82=8B=20(#17526)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(frontend): Dキーショートカットでダークモード切り替え時にsyncDeviceDarkModeのチェックを行うように修正 設定ページのトグルではsyncDeviceDarkModeが有効な場合に確認ダイアログを表示し、 同意後にsyncDeviceDarkModeを無効化してからダークモードを切り替える挙動だったが、 Dキーショートカットではこのチェックがバイパスされていた。 ショートカットキー経由でも同じロジックを適用するように修正。 * fix(frontend): CHANGELOGにDキーのsyncDeviceDarkModeバイパス修正を追記 --- CHANGELOG.md | 1 + packages/frontend/src/boot/main-boot.ts | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b9957b1fd..d816a00c81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Fix: アクセストークン発行時のダイアログのタイトルが「確認コード」となっているのを修正 - Fix: 一部のUI要素の色が正しく表示されない問題を修正 (Cherry-picked from https://github.com/MisskeyIO/misskey/pull/1243) +- Fix: 「D」キーでダークモードを切り替える際にsyncDeviceDarkModeのチェックがバイパスされる問題を修正 ### Server - Enhance: リモートノートクリーニングジョブのスキップ処理のパフォーマンス改善 diff --git a/packages/frontend/src/boot/main-boot.ts b/packages/frontend/src/boot/main-boot.ts index 3d4ecbf75b..a1dc7ac006 100644 --- a/packages/frontend/src/boot/main-boot.ts +++ b/packages/frontend/src/boot/main-boot.ts @@ -380,8 +380,20 @@ export async function mainBoot() { if ($i == null) return; post(); }, - 'd': () => { - store.set('darkMode', !store.s.darkMode); + 'd': async () => { + const value = !store.s.darkMode; + if (prefer.s.syncDeviceDarkMode) { + const { canceled } = await confirm({ + type: 'question', + text: i18n.tsx.switchDarkModeManuallyWhenSyncEnabledConfirm({ x: i18n.ts.syncDeviceDarkMode }), + }); + if (canceled) return; + + prefer.commit('syncDeviceDarkMode', false); + store.set('darkMode', value); + } else { + store.set('darkMode', value); + } }, 's': () => { mainRouter.push('/search'); From d5ab42267cbc6fc638c2d07cf0666f5bf05997ac Mon Sep 17 00:00:00 2001 From: "SASAPIYO (SASAGAWA Kiyoshi)" Date: Wed, 3 Jun 2026 08:48:32 +0900 Subject: [PATCH 2/8] =?UTF-8?q?fix(backend):=20NSFW=E6=A4=9C=E5=87=BA?= =?UTF-8?q?=E3=83=A2=E3=83=87=E3=83=AB=E3=81=8C=20`file://`=20=E3=81=A7?= =?UTF-8?q?=E8=AA=AD=E3=81=BF=E8=BE=BC=E3=82=81=E3=81=AA=E3=81=84=E5=95=8F?= =?UTF-8?q?=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3=20(#17528)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix(backend): NSFW検出モデルがfile://スキームで読み込めない問題を修正 #17501 で `@tensorflow/tfjs-node` を bundle 外に出した結果、bundle 内の `nsfwjs` が抱える `@tensorflow/tfjs-core` と external な tfjs-node が使う tfjs-core が別インスタンスに分裂し、tfjs-node が登録する `file://` IOHandler を nsfwjs 側が共有できなくなった。このため nsfwjs のモデル読み込みが HTTP handler (node-fetch) にフォールバックし `URL scheme "file" is not supported` で失敗する。 `nsfwjs` と `@tensorflow/*` も external 化し、単一の tfjs-core インスタンスに 統一することで file:// IOHandler を共有させる。 Co-authored-by: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 1 + packages/backend/rolldown.config.ts | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d816a00c81..a97391c3db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ - Enhance: リモートノートクリーニングジョブのスキップ処理のパフォーマンス改善 - Enhance: リモートノートクリーニングジョブの削除対象検索処理のパフォーマンス改善 - Fix: backend バンドルで `@tensorflow/tfjs-node` を external に含めず、起動時に `@mapbox/node-pre-gyp` の `find()` が backend の package.json を誤検出して `is not node-pre-gyp ready` エラーを永続的に吐く問題を修正 +- Fix: センシティブメディア検出(NSFW)のモデルが `URL scheme "file" is not supported` エラーで読み込めず機能しない問題を修正 (bundle 内の `nsfwjs` と external な `@tensorflow/tfjs-node` で `@tensorflow/tfjs-core` インスタンスが分裂し `file://` IOHandler を共有できないため、`nsfwjs` と `@tensorflow/*` も external 化) - Fix: フォロワー限定投稿を指名投稿で引用した際に、引用した投稿の公開範囲が意図せず変更される問題を修正 ## 2026.5.4 diff --git a/packages/backend/rolldown.config.ts b/packages/backend/rolldown.config.ts index 4710e8adae..60c843dc61 100644 --- a/packages/backend/rolldown.config.ts +++ b/packages/backend/rolldown.config.ts @@ -66,7 +66,14 @@ export default defineConfig((args) => { '@nestjs/microservices/microservices-module', '@nestjs/microservices', /^@napi-rs\/.*/, - '@tensorflow/tfjs-node', + // @tensorflow/tfjs-node はネイティブバインディングを持つため external 必須 (#17501)。 + // あわせて nsfwjs と @tensorflow/* 全体を external にする。bundle 内の nsfwjs が + // 抱える @tensorflow/tfjs-core と、external な tfjs-node が使う tfjs-core が + // 別インスタンスに分裂すると、tfjs-node が登録する file:// IOHandler を nsfwjs 側が + // 共有できず、モデル読み込みが HTTP handler(node-fetch) にフォールバックして + // 「URL scheme "file" is not supported」で失敗するため。 + /^@tensorflow\/.*/, + 'nsfwjs', 'mock-aws-s3', 'aws-sdk', 'nock', From 9b362ca761d23c5c475f28fde621e12c12226207 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8B=E3=81=A3=E3=81=93=E3=81=8B=E3=82=8A?= <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Wed, 3 Jun 2026 08:50:05 +0900 Subject: [PATCH 3/8] Update CHANGELOG.md --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a97391c3db..63448a6ae5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,8 +16,7 @@ ### Server - Enhance: リモートノートクリーニングジョブのスキップ処理のパフォーマンス改善 - Enhance: リモートノートクリーニングジョブの削除対象検索処理のパフォーマンス改善 -- Fix: backend バンドルで `@tensorflow/tfjs-node` を external に含めず、起動時に `@mapbox/node-pre-gyp` の `find()` が backend の package.json を誤検出して `is not node-pre-gyp ready` エラーを永続的に吐く問題を修正 -- Fix: センシティブメディア検出(NSFW)のモデルが `URL scheme "file" is not supported` エラーで読み込めず機能しない問題を修正 (bundle 内の `nsfwjs` と external な `@tensorflow/tfjs-node` で `@tensorflow/tfjs-core` インスタンスが分裂し `file://` IOHandler を共有できないため、`nsfwjs` と `@tensorflow/*` も external 化) +- Fix: センシティブメディア自動検出周りの依存関係・ファイルの解決に失敗する問題を修正 - Fix: フォロワー限定投稿を指名投稿で引用した際に、引用した投稿の公開範囲が意図せず変更される問題を修正 ## 2026.5.4 From 2328ef3737dd9559c98ff2fb8a0059aa870c863d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8A=E3=81=95=E3=82=80=E3=81=AE=E3=81=B2=E3=81=A8?= <46447427+samunohito@users.noreply.github.com> Date: Wed, 3 Jun 2026 09:03:10 +0900 Subject: [PATCH 4/8] =?UTF-8?q?chore(llm/docs):=20.claude=E9=85=8D?= =?UTF-8?q?=E4=B8=8B=E3=81=AE=E5=86=8D=E6=A7=8B=E6=88=90=20(#17514)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(docs): .claude配下の再構成 * fix AGENTS.md * fix AGENTS.md * fix review * 行番号参照の除去 * docs: fix storybook note in vue reviewer agent * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * fix local review * fix --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../skills/shipping-misskey-change/SKILL.md | 10 + .agents/skills/working-on-backend/SKILL.md | 10 + .agents/skills/working-on-frontend/SKILL.md | 10 + .claude/THIRD_PARTY_LICENSES.md | 6 +- .claude/agents/README.md | 34 +- .claude/agents/misskey-api-reviewer.md | 10 +- .claude/agents/vue-component-reviewer.md | 16 +- .claude/commands/README.md | 38 +- .claude/commands/changelog-add.md | 49 --- .claude/commands/check-misskey-js.md | 42 -- .claude/commands/harness-audit.md | 8 +- .claude/commands/migrate-new.md | 81 ---- .claude/commands/quality-gate.md | 5 +- .claude/docs/README.md | 18 - .claude/docs/architecture.md | 47 -- .claude/docs/backend.md | 124 ------ .claude/docs/frontend.md | 76 ---- .claude/docs/plugins.md | 28 -- .claude/docs/testing.md | 69 --- .claude/skills/README.md | 41 +- .claude/skills/add-api-endpoint/SKILL.md | 253 ----------- .claude/skills/add-i18n-key/SKILL.md | 117 ----- .claude/skills/add-mk-component/SKILL.md | 174 -------- .claude/skills/create-migration/SKILL.md | 156 ------- .../skills/shipping-misskey-change/SKILL.md | 33 ++ .../references/tasks/changelog-update.md | 61 +++ .../references/tasks/regenerate-misskey-js.md | 78 ++++ .claude/skills/working-on-backend/SKILL.md | 35 ++ .../references/knowledge/api-meta-paramdef.md | 368 ++++++++++++++++ .../references/knowledge/backend-testing.md | 209 +++++++++ .../references/knowledge/endpoint-list.md | 50 +++ .../references/knowledge/nestjs-di.md | 97 +++++ .../references/knowledge/typeorm-patterns.md | 160 +++++++ .../references/tasks/adding-api-endpoint.md | 291 +++++++++++++ .../references/tasks/creating-migration.md | 180 ++++++++ .../scripts/prepare-generate.mjs | 66 +++ .claude/skills/working-on-frontend/SKILL.md | 36 ++ .../knowledge/component-conventions.md | 357 +++++++++++++++ .../references/knowledge/frontend-testing.md | 60 +++ .../references/knowledge/i18n-usage.md | 412 ++++++++++++++++++ .../references/knowledge/os-api.md | 96 ++++ .../references/knowledge/scss-modules.md | 135 ++++++ .../references/knowledge/storybook.md | 191 ++++++++ .../references/tasks/adding-i18n-key.md | 124 ++++++ .../references/tasks/adding-mk-component.md | 196 +++++++++ .github/copilot-instructions.md | 80 ++-- AGENTS.md | 179 +++----- 47 files changed, 3465 insertions(+), 1451 deletions(-) create mode 100644 .agents/skills/shipping-misskey-change/SKILL.md create mode 100644 .agents/skills/working-on-backend/SKILL.md create mode 100644 .agents/skills/working-on-frontend/SKILL.md delete mode 100644 .claude/commands/changelog-add.md delete mode 100644 .claude/commands/check-misskey-js.md delete mode 100644 .claude/commands/migrate-new.md delete mode 100644 .claude/docs/README.md delete mode 100644 .claude/docs/architecture.md delete mode 100644 .claude/docs/backend.md delete mode 100644 .claude/docs/frontend.md delete mode 100644 .claude/docs/plugins.md delete mode 100644 .claude/docs/testing.md delete mode 100644 .claude/skills/add-api-endpoint/SKILL.md delete mode 100644 .claude/skills/add-i18n-key/SKILL.md delete mode 100644 .claude/skills/add-mk-component/SKILL.md delete mode 100644 .claude/skills/create-migration/SKILL.md create mode 100644 .claude/skills/shipping-misskey-change/SKILL.md create mode 100644 .claude/skills/shipping-misskey-change/references/tasks/changelog-update.md create mode 100644 .claude/skills/shipping-misskey-change/references/tasks/regenerate-misskey-js.md create mode 100644 .claude/skills/working-on-backend/SKILL.md create mode 100644 .claude/skills/working-on-backend/references/knowledge/api-meta-paramdef.md create mode 100644 .claude/skills/working-on-backend/references/knowledge/backend-testing.md create mode 100644 .claude/skills/working-on-backend/references/knowledge/endpoint-list.md create mode 100644 .claude/skills/working-on-backend/references/knowledge/nestjs-di.md create mode 100644 .claude/skills/working-on-backend/references/knowledge/typeorm-patterns.md create mode 100644 .claude/skills/working-on-backend/references/tasks/adding-api-endpoint.md create mode 100644 .claude/skills/working-on-backend/references/tasks/creating-migration.md create mode 100644 .claude/skills/working-on-backend/scripts/prepare-generate.mjs create mode 100644 .claude/skills/working-on-frontend/SKILL.md create mode 100644 .claude/skills/working-on-frontend/references/knowledge/component-conventions.md create mode 100644 .claude/skills/working-on-frontend/references/knowledge/frontend-testing.md create mode 100644 .claude/skills/working-on-frontend/references/knowledge/i18n-usage.md create mode 100644 .claude/skills/working-on-frontend/references/knowledge/os-api.md create mode 100644 .claude/skills/working-on-frontend/references/knowledge/scss-modules.md create mode 100644 .claude/skills/working-on-frontend/references/knowledge/storybook.md create mode 100644 .claude/skills/working-on-frontend/references/tasks/adding-i18n-key.md create mode 100644 .claude/skills/working-on-frontend/references/tasks/adding-mk-component.md diff --git a/.agents/skills/shipping-misskey-change/SKILL.md b/.agents/skills/shipping-misskey-change/SKILL.md new file mode 100644 index 0000000000..700e6825e1 --- /dev/null +++ b/.agents/skills/shipping-misskey-change/SKILL.md @@ -0,0 +1,10 @@ +--- +name: shipping-misskey-change +description: Use at every finish moment of a Misskey change, before committing, opening a PR, merging, or handing work back, especially when validation, SPDX, locale safety, migrations, misskey-js generation, or CHANGELOG checks may apply. +--- + +# shipping-misskey-change + +This is the Codex entrypoint for the canonical Misskey pre-ship checklist. + +Read and follow [.claude/skills/shipping-misskey-change/SKILL.md](../../../.claude/skills/shipping-misskey-change/SKILL.md). Treat that file and its `references/` directory as the source of truth. diff --git a/.agents/skills/working-on-backend/SKILL.md b/.agents/skills/working-on-backend/SKILL.md new file mode 100644 index 0000000000..491b015185 --- /dev/null +++ b/.agents/skills/working-on-backend/SKILL.md @@ -0,0 +1,10 @@ +--- +name: working-on-backend +description: Use whenever editing or adding code under `packages/backend/`, including REST API endpoints, NestJS services/modules, TypeORM entities, migrations, backend tests, misskey-js generation, or backend validation commands. +--- + +# working-on-backend + +This is the Codex entrypoint for the canonical Misskey backend skill. + +Read and follow [.claude/skills/working-on-backend/SKILL.md](../../../.claude/skills/working-on-backend/SKILL.md). Treat that file and its `references/` directory as the source of truth. diff --git a/.agents/skills/working-on-frontend/SKILL.md b/.agents/skills/working-on-frontend/SKILL.md new file mode 100644 index 0000000000..59be8cfe99 --- /dev/null +++ b/.agents/skills/working-on-frontend/SKILL.md @@ -0,0 +1,10 @@ +--- +name: working-on-frontend +description: Use whenever editing or adding code under `packages/frontend/`, Vue SFCs, SCSS Modules, Storybook stories, or frontend-facing UI text in `locales/ja-JP.yml`. +--- + +# working-on-frontend + +This is the Codex entrypoint for the canonical Misskey frontend skill. + +Read and follow [.claude/skills/working-on-frontend/SKILL.md](../../../.claude/skills/working-on-frontend/SKILL.md). Treat that file and its `references/` directory as the source of truth. diff --git a/.claude/THIRD_PARTY_LICENSES.md b/.claude/THIRD_PARTY_LICENSES.md index 77b00507a2..0fc5df629c 100644 --- a/.claude/THIRD_PARTY_LICENSES.md +++ b/.claude/THIRD_PARTY_LICENSES.md @@ -15,7 +15,7 @@ ### 取り込んだファイル -| `.claude/` 内のパス | 上流パス | 上流 frontmatter `origin` | Misskey での改変 | +| `.claude/` 内のパス | 上流パス | 上流由来 | Misskey での改変 | |---|---|---|---| | `skills/context-budget/SKILL.md` | `skills/context-budget/SKILL.md` | ECC | description を日本語化、Misskey 固有メモを追記 | | `commands/harness-audit.md` | `commands/harness-audit.md` | ECC | scripts 依存の自動採点を、Claude が `pnpm`/`git`/`grep` で手動採点する版に書き換え。Misskey 固有の評価軸 (SPDX / endpoint-list / migration / locales) を組み込み | @@ -61,7 +61,7 @@ Misskey 本体は **AGPL-3.0-only** で配布されているが、`.claude/` 配 - MIT が要求する条件 (copyright notice + license text の保持) を本ファイル + 各ファイル冒頭の SPDX/出典コメントで満たしている - Misskey 全体の配布物としては AGPL-3.0-only で扱われるが、`.claude/` 配下の MIT ファイルは個別に MIT として識別可能 -`.ts` / `.js` / `.vue` / `.scss` の SPDX 義務化 ([AGENTS.md §1](../AGENTS.md#1-spdx-ヘッダー必須)) は Misskey 本体コード向けで、`.claude/` 配下の `.md` / `.sh` には適用されない。 +`.ts` / `.js` / `.vue` / `.scss` の SPDX 義務化 ([AGENTS.md](../AGENTS.md) の「絶対にやってはいけない事」§コード・データ関連) は Misskey 本体コード向けで、`.claude/` 配下の `.md` / `.sh` には適用されない。 --- @@ -73,4 +73,4 @@ Misskey 本体は **AGPL-3.0-only** で配布されているが、`.claude/` 配 2. 各ファイル冒頭に SPDX ヘッダ + 出典コメントを追加 3. 本ファイル §1 のテーブルに 1 行追記 4. 必要なら新しいセクションでライセンス全文を同梱 -5. AGENTS.md からの参照を確認 (現状の [AGENTS.md §ツール固有の補助ファイル](../AGENTS.md) で `THIRD_PARTY_LICENSES.md` を案内済。CLAUDE.md は `@AGENTS.md` 経由で読み込むので個別の追記は不要) +5. 本ファイルへの導線を確認 (`.claude/skills/README.md` / `.claude/commands/README.md` 等の各 README から本ファイルへリンクされている)。なお [CLAUDE.md](../CLAUDE.md) が `.claude/` 配下全体を「Claude Code 固有の補助」として案内しており本ファイルもそこに含まれる。CLAUDE.md は `@AGENTS.md` を取り込むだけなので AGENTS.md への個別追記は不要 diff --git a/.claude/agents/README.md b/.claude/agents/README.md index 92075d23e3..cf1032d632 100644 --- a/.claude/agents/README.md +++ b/.claude/agents/README.md @@ -2,22 +2,30 @@ Misskey の特定領域に特化したレビュー / 調査エージェントを `.claude/agents/.md` 形式で配置する。 -frontmatter (`name` + `description` + `tools`) は、Claude が **自動でエージェントを呼び出すか判断する** 唯一の手がかりになる。`description` には用途を具体的かつ網羅的に書くこと (動詞 + 対象 + トリガー条件)。 +frontmatter (`name` + `description` + `tools`) は、Claude が **自動でエージェントを呼び出すか判断する** 唯一の手がかりになる。`description` は **起動判断に効くドメイン・パス・ファイル種別・固有チェックに絞って簡潔に** 書く (動詞 + 対象 + トリガー条件)。本文 checklist 項目を網羅的に列挙するのではなく、他の reviewer と区別できる高シグナル語を選ぶ。 -## 実装済サブエージェント +実装済エージェントの一覧は本ファイルでは管理しない (腐敗するため)。各 `.md` の frontmatter が自己説明として機能する。 -| エージェント名 | 役割 | 優先度 | -|---|---|---| -| [misskey-api-reviewer](misskey-api-reviewer.md) | NestJS DI + meta/paramDef + UUID 重複 + endpoint-list.ts 登録 + ApiError throw + misskey-js 再生成 + e2e + CHANGELOG をチェック | 高 (登録漏れで 404 / autogen CI 落ち頻発) | -| [vue-component-reviewer](vue-component-reviewer.md) | Mk\* 命名 / ` - - -``` - -## 国際化 (i18n) - -- 文字列リテラルを直書きしない。 -- 引数なし: `i18n.ts.` で参照する (例: `i18n.ts.deleted`)。 -- 引数あり: `i18n.tsx.(...)` で関数呼び出しする (例: `i18n.tsx.takeOverConfirm({ name })`)。 -- 新規キーは **`locales/ja-JP.yml` のみ** に追加する (他言語は Crowdin で自動配信)。 -- `i18n` は `packages/frontend/src/i18n.ts` (または共有モジュール) から import する。 - -## モーダル / 通知 - -- `os.ts` (`packages/frontend/src/os.ts`) 経由で呼ぶ。 -- `os.alert(...)` / `os.confirm(...)` / `os.popup(...)` / `os.success(...)` など。 -- ブラウザ標準の `window.alert()` / `window.confirm()` を **直接呼ばない**。 - -## アクセシビリティ (PR レビューで指摘されやすい点) - -- クリックハンドラを付けるなら ` +``` + +- `_button` global class はボタンの装飾を除去するリセット (背景/枠線なし + `cursor: pointer` + disabled cursor)。focus ring や ripple は**付かない** — ripple 付きのボタンが要るなら `MkButton.vue` コンポーネントを使う +- ` +``` + +`aria-label` の値も i18n 経由にする (英語直書きは禁止)。 + +**実情:** 現状コードベースでは `aria-label` の使用例自体が乏しい (アイコンの hover ヒントには `:title="i18n.ts..."` が使われるが、`title` は tooltip でありスクリーンリーダー向けラベルの代替にはならない)。このため aria-label は確立した慣習というより a11y 上の推奨ベストプラクティスとして書いている。新規でアイコンのみのボタンを足すなら付けるのが望ましい。 + +### `:disabled` と `aria-disabled` の整合 + +- 本物の `