• #vitest
  • #keyboard
  • #dx
  • #regression-test
  • #claude-code
開発mdx-playgroundメモ

Alt+矢印キーのブラウザバック横取りバグ

矢印キーでページ内ナビゲーション(前後の問題に移動など)を実装しているページが複数ある。これらのキーボードハンドラで preventDefault() を呼んでいたため、ブラウザ標準の Alt+← (戻る)/ Alt+→ (進む)まで潰されていた。

影響範囲

design-principles、diagram-types、tax-patterns、basic-english-850、cashflow-worksheet、consolidated-worksheet、cashflow-statement など、矢印キーハンドラを持つ全ページ。

修正内容

各ハンドラの先頭に修飾キーガードを追加した。

if (e.altKey || e.ctrlKey || e.metaKey) return

これで Alt+矢印はブラウザに素通しされる。Ctrl や Meta もガードしておくと、ブラウザのタブ切り替え等のショートカットとも干渉しない。

vitest によるリグレッションテスト

同じバグが今後追加されるページで再発しないように、テストを書いた。

設計方針

関数名に依存しない検出方式にした。handleKeydown のような特定の関数名を前提にすると、別名で書かれたハンドラを見逃す。代わりに <script> セクション内で以下の2条件が共存するファイルを対象にしている。

  1. Arrow(Left|Right|Up|Down) にマッチする文字列がある
  2. preventDefault にマッチする文字列がある

該当ファイルそれぞれについて、.altKey のチェックが存在するかを検証する。

// keyboard-handler-guard.test.ts の核心部分
const hasArrowAndPreventDefault =
  /Arrow(Left|Right|Up|Down)/.test(script) &&
  /preventDefault/.test(script)

// 該当ファイルに altKey ガードがあるか
const hasAltGuard = /\.altKey/.test(script)
expect(hasAltGuard).toBe(true)

it.each で対象ファイルをパラメタライズしているので、新しいページが追加されても自動的にテスト対象になる。

Claude Code のフック設定(音声通知)

Claude Code の hooks 機能で、長いタスク完了時に音声通知を鳴らす設定を試した。

.claude/settings.local.json は Git 管理外(.gitignore 対象)なので、hooks の設定はマシンごとに入れる必要がある。現状、このプロジェクトでは hooks 設定はまだ入っていない。グローバル設定(~/.claude/settings.json)に入れるのが管理しやすそう。

モバイルアプリ開発の技術選定メモ

別記事(ネイティブ vs クロスプラットフォーム)に詳細を書いた。

要点だけまとめると:

  • React Native ではなく Swift + Kotlin のネイティブ開発を選ぶ
  • OS のメジャーアップデート直後に新 API が使える
  • Swift と Kotlin は文法が似ているので移植コストが低い
  • iOS を macOS で先に作り、Android への移植を Windows で行う流れ