使っているノートPCはかなり古く、windows11の動作要件を満たしていなかった。ハードウェア的にはまだ使えるものなのでなんとか延命したく、せっかくなのでLinuxに変えた。
メールやブラウザはほぼそのままデータを移行でき、それなりに快適に使えていたのだが1点だけ困った点があった。それが年賀状印刷ソフトがないということだった。
宛名面のレイアウト調整などいちいち差し込み印刷で作ってられない。何か良いソフトはないかと探していたところaikige氏がHTML+CSSでうまく作られているのを見つけた。なるほど、cssはミリメートル単位でも大きさを指定できるので、実寸が重要なレイアウトには都合がよさそうだ。そしてメディアクエリーで印刷時のcssを指定できるので、印刷のときだけ表示したり非表示にしたりも思いのままである。このままでも十分便利だがせっかくなのでsvelteを使って住所の編集画面を追加してみた。
ソースコードはこちら。
ほとんどはスムーズに制作できたのだが、1点だけおや?と思うことがあった。それが編集画面の表のTABキーによるフォーカス移動である。普通のHTMLだと単純にtabindexを指定すればよいだけなのだが、svelteの画面更新のサイクルとうまくかみ合わない。TABキーを押してフォーカスを抜けると「入力の確定」と「次の要素へのフォーカス移動」が順番に行われるのだが、入力を確定した瞬間svelteの作用によってinput要素が書き換えられてしまい、次の要素を見失ってしまうことが分かった。
試しにAIに問題解決を提案させると長考のあげくとんでもない行数の大作を生成してくれた。いや、そうじゃなくて・・・と思い結局自分で解決してしまった。方法は単純で、svelteによる更新作用が終わった後に起こる$effect節に次のタブインデックスを持つ要素を検索してフォーカス移動せよ、と書き加えただけである。
どうやらAIは$effectの使用は控えめにせよという公式ドキュメントの警告に忠実に従っているようだ。私の書いたコードもフォーカスイベントでリアクティブな変数を更新するような副作用が定義されると崩壊してしまうので、コメントをしっかり書くなど開発の規模次第では対策した方が良いのだろう。AIの書いたコードと併せて考えることで学びがあったのは良かった。
