デザインシステム
このサイトで使っている色・文字・UI 部品を、実際の画面で動いているものそのまま並べています。 それぞれ、その形にした理由を添えました。どの技術を選んだかは使用技術に書いています。
色
グレーの階調
右上のボタンは「OS の設定に合わせる・ライト・ダーク」の3つを順に回ります。 選択は保存され、次に開いたときも維持されます。最初の描画より前にテーマを確定させているので、 読み込みの途中で一瞬ライトが見えることはありません。
既定値を変えたのは gray-400 だけ
ライトのグレーで、ほかの段はすべて Tailwind の既定値のままです。
既定の gray-400 は白地で 2.60:1 しかなく、これを当てていた補助文字(投稿日・短縮 ID・ISBN・注記)が WCAG AA の 4.5:1 を割っていました。文字はどれも 12px なので、大きい文字の緩和(3:1)も使えません。
計算した結果、AA を満たす最も薄いグレーは実質 gray-500 でした(白地 4.84:1)。400 と 500 の間に新しい値を置いても 4.5 をわずかに超える程度にしかならず、ブラウザ差で割れる余地が残ります。 そこで 400 を 500 と同じ値にしました。「薄いグレーの文字」という段は AA と両立しないと分かったので、段そのものを消しています。
淡いグレーが要る文字以外の用途(枠線・アイコン・区切り)には 200〜300 を使います。
色を付けた文字の下限
背景しだいで基準を割るので、色ごとに使ってよい下限を決めています。
- 赤は red-700 まで(red-600 は白地では通るが、赤い帯の上で割る)
- 緑は green-700 まで
- 青は blue-600 まで(リンクとして最も薄くできる段)
エラー文言のように、操作しなければ画面に出ない文字もあります。 こうした色は、状態を切り替えるテストの中で測っています。ページを開いて眺めるだけでは見つかりません。
エラーと成功の通知
文字
大きさの段
画面で使っているのはこの6段だけです。
- 見出しと本文
text-2xl(24px)一覧・案内・フォームの見出し - 見出しと本文
text-xl(20px)詳細ページ・管理画面・結果画面の見出し - 見出しと本文
text-lg(18px)節の見出し - 見出しと本文
text-base(16px)カード・フォームの小見出し - 見出しと本文
text-sm(14px)本文・入力欄・ボタン - 見出しと本文
text-xs(12px)補助(日付・短縮 ID・注記)
本文は 14px、補助的な文字は 12px です。12px は 4.5:1 を満たす色でしか使えないため、 このサイズに使えるグレーは上で決めた下限(gray-400 = 500 相当)までに限られます。 段の間は太さ(font-semibold / font-bold)で差を付け、段そのものは増やしていません。
書体
欧文は Geist、日本語は OS のゴシックに落とします。
日本語の Web フォントは軽いものでも数百 KB あり、読み込み終わるまで文字が入れ替わる代償の方が大きいと判断しました。
等幅(Geist Mono)は識別子だけに使います。ISBN・操作ログの ID・メールアドレス・ エラー画面の識別子が対象で、桁が縦に揃うと目視で照合できるためです。 書名や本文のような散文には使いません。
ISBN: 9784873115658(等幅の例)
フォームの部品
投稿・編集・追記・取り下げ・出版社からの回答という5つのフォームが、同じ部品を共有しています。 うち投稿と編集は入力欄の並びがそのまま同じなので、共有しているのは見た目だけではありません。入力の検証と、送信用の値への変換まで同じ関数を通します。
エラーのまとめ
最初の1件で打ち切らず、全部集めて画面の並び順に出します。
画面の並び順に出すのは、上から順に直していけるようにするためです。 検証の都合で順番が飛ぶと、読み手が直す順序を組み立て直すことになります。 実際のフォームでは各項目が該当の入力欄へのリンクになっています(この見本は表示だけです)。
文字数のカウンター
上限の8割に達してから出します。
0/40
最初から数字を見せると、上限そのものが目安になって「そこまで書いてよい」と読めてしまいます。 上限に近づいたときだけ出せば、警告としてだけ働きます(GOV.UK Design System の Character count が同じ理由で threshold を持っています)。
数値の入力欄
type="number" を使わず自前で作っています。
全角で「58」と打っても半角になります。文字を混ぜても値は消えません。
type="number" は不正な値が入ると、読み出せる値が空文字になります。 全角で「141」と打たれても、半角に直す対象そのものが取れません。 日本語入力の確定を合図にして直す方法もありますが、貼り付けではその合図が来ません。 実際に本番で、全角のまま「数字を入力してください」で止まる投稿が発生しています。
文字として受け取り、欄から離れた時点で半角へ直す形にしました。 失われる ▲▼ と上下キーでの増減は自前で補い、 代わりにホイールで値が勝手に変わる誤操作は起きなくなっています。
選択欄
矢印だけ自前にしています。
選んでいる値: all
ブラウザが標準で描く矢印は枠の右端に貼り付き、文字との間が空きます。 位置も形も CSS からは動かせないうえ、幅は最も長い選択肢で決まるので、 短い選択肢を選んでいるときほど間延びして見えます。標準の矢印を消し、 同じアイコン集の矢印を重ねて位置を揃えました。
重ねた矢印はクリックを受け取らないようにしてあります。そうしないと、矢印の上を押したときだけ開かないという、見た目では分からない壊れ方をします。
表示の部品
ステータス
運営が実際にできること以上を約束する語は使わないことを原則にしています。「対応中」のように、進んでいるように見えて中身の無いラベルは置きません。
各バッジは説明文を中に隠して持っています。hover で出るパネルとは別に読み上げ用の文があるので、 マウスを乗せられない環境でも意味が伝わります。
投稿の一覧(PC)
ヘッドレスのテーブルライブラリを使い、HTML と CSS は自前で書いています。
| 種別 | 書籍 | 内容 | 位置 | ステータス | 投稿 |
|---|---|---|---|---|---|
| 正誤情報 | リーダブルコード | 誤: 変数名は短かい方がよい 正: 変数名は短い方がよい 誤字の指摘(見本) | 第1版 第3刷 p.58 | 未対応(投稿を受け付けました。管理者が確認中です。) | |
| 改善提案 | 達人プログラマー | 第4章の演習に解答が付いていないので、巻末に追加してほしいです。 章末の演習に解答が無い(見本) | 第2版 p.120 | 連絡済み(管理者が出版社または著者へ連絡しました。出版社から回答があれば「出版社からの回答」に表示されます。) | |
| 正誤情報 | プログラミング TypeScript | 誤: const x: unknown = 1; x.toFixed(); 正: 型の絞り込みを挟む必要がある(本文の説明と一致していない) サンプルコードが動かない(見本) | 電子書籍 第3章 「型の絞り込み」の節 | 正誤表に掲載(出版社または著者が誤りと認め、公式の正誤表に掲載しました。) |
並べ替え・絞り込み・ページ送りの計算だけを借り、マークアップは自分で持っています。 画面幅が狭いときは、同じデータを次のカードに切り替えて出します。
投稿のカード(スマホ)
表を縮めるのではなく、優先順位を付け直した別の形です。
6つの列をそのまま縮めると、どの列も等しく読みにくくなります。 カードでは「どの本の・どこが・どう間違っているか」の順に積み直し、 書影(サムネイル)と誤/正を主役に置きました。表紙の無い本はアイコンに置き換えます (この見本がその状態です)。表では横に並ぶ値の優先順位が付いていませんが、 カードでは縦の順序がそのまま優先順位になります。
ここに書いた判断は、それぞれの実装のコメントに理由まで残しています。GitHub でソースを見る