​​React​CSS,Playwright,ResizeObserver,TypeScript

Thumbnail of post image 003

高さの違うカードを、列の中ですき間なく並べる表示を、ライブラリを使わずに React で作りました。カードをいちばん短い列の下へ置いていく計算と、ResizeObserver で幅と高さを測り直す理由、CSS の段組みとの並び順の違い ...

​​React​Playwright,TypeScript,アクセシビリティ

Thumbnail of post image 016

Reactで表のセルをクリックすると入力欄に変わり、Enter で保存、Escape で取り消せるようにしました。変換を確定する Enter で保存しない書き方、編集後にフォーカスをセルへ戻す方法、間違った値のときに編集を続けさせる方 ...

​​React​Playwright,TypeScript,アクセシビリティ

Thumbnail of post image 055

一時停止と再開ができるカウントダウンタイマーを、React と TypeScript で作りました。残り時間は終わる時刻との差から出すので、タイマーの呼び出しが遅れても表示がずれたままになりません。秒の切り上げ方なども Chromiu ...

​​React​Intl,JavaScript,Playwright,TypeScript

Thumbnail of post image 129

投稿の日時を「3分前」「昨日」のように出すコンポーネントを TypeScript で作りました。言葉は Intl.RelativeTimeFormat に任せ、単位の選び方、「昨日」の数え方、表示の自動更新は Chromium で確か ...

​​React​CSS,dialog,Playwright,TypeScript,アクセシビリティ

Thumbnail of post image 089

一覧の画像を押すと、画面いっぱいに大きく表示するライトボックスを、ライブラリを使わずに React と dialog 要素で作りました。画面に収める CSS、矢印キーでの送り、前の画像を残さない key の使い方、先読み、閉じたあとの ...

​​React​Intl,JavaScript,Playwright,TypeScript,アクセシビリティ

Thumbnail of post image 013

月ごとのカレンダーを、ライブラリを使わずに React と TypeScript で作りました。日付を6行×7列に並べる計算、月をまたぐときの Date の扱い、今日と選んだ日の伝え方、矢印キーで日を移る動きを、Chromium で確 ...

​​React​dialog,localStorage,Playwright,scrollIntoView,TypeScript,useLayoutEffect

Thumbnail of post image 123

検索欄やボタンを1つずつ明るく残し、下か上に説明のカードを出す使い方ガイドを、ライブラリなしの TypeScript で作りました。部品の位置の測り方、画面の外にある部品へのスクロール、2回目から出さない仕組みを Chromium で ...

​​React​CSS,Playwright,ResizeObserver,TypeScript,アクセシビリティ,カスタムフック

Thumbnail of post image 129

記事をどこまで読んだかを画面の上のバーで示すフックを、React で作りました。割合はページ全体ではなく記事の要素から計算し、画像の読み込みで記事の高さが変わったときも ResizeObserver で計算し直します。CSS だけで作 ...

​​React​CSS,Playwright,Pointer Events,TypeScript,アクセシビリティ

Thumbnail of post image 126

加工前と加工後のような2枚の画像を重ね、つまみを左右に動かして見比べる表示を、ライブラリを使わずに React で作りました。clip-path で隠す理由、キーボードでの操作、pointerdown で preventDefault ...

​​React​IntersectionObserver,Playwright,TypeScript,カスタムフック

Thumbnail of post image 148

スクロールで動画が画面から外れたら一時停止し、戻ってきたら続きを再生するフックを作りました。ユーザーが自分で止めた動画は勝手に再生しないこと、play() が中断されたときのエラーの受け方も確かめています。