デザインシステム

このサイトで使っている色・文字・UI 部品を、実際の画面で動いているものそのまま並べています。 それぞれ、その形にした理由を添えました。どの技術を選んだかは使用技術に書いています。

色

グレーの階調

50
ページ背景
100
200
枠線
300
400
補助文字
500
600
700
本文
800
900
見出し・主ボタンの地

右上のボタンは「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(等幅の例)

ボタン

操作のボタン(4つの見た目)

見た目はこの4つから選び、呼び出し側は幅・余白・並びを足します。

  • その画面の主たる操作。原則1画面に1つ
  • 主たる操作の隣に置く、戻る側の操作
  • 取り消せない操作
  • 破壊的だが画面の主役ではない操作(管理画面)

右側は押せない状態です。色を薄くするだけでなく、カーソルの形も変えています。

主導線のリンク

青い塗りは「移動する」、黒い塗りは「ここで何かが起きる」。

投稿する

見た目はボタンでも、実体は <a> のままにしています。 新しいタブで開く・URL をコピーする・カーソルを乗せて遷移先を確かめるといったブラウザ標準の動作が そのまま使え、読み上げにも「リンク」として伝わるためです。<button> にして JavaScript で移動させると、これらは全部失われます。

フォームの部品

投稿・編集・追記・取り下げ・出版社からの回答という5つのフォームが、同じ部品を共有しています。 うち投稿と編集は入力欄の並びがそのまま同じなので、共有しているのは見た目だけではありません。入力の検証と、送信用の値への変換まで同じ関数を通します。

エラーのまとめ

最初の1件で打ち切らず、全部集めて画面の並び順に出します。

画面の並び順に出すのは、上から順に直していけるようにするためです。 検証の都合で順番が飛ぶと、読み手が直す順序を組み立て直すことになります。 実際のフォームでは各項目が該当の入力欄へのリンクになっています(この見本は表示だけです)。

文字数のカウンター

上限の8割に達してから出します。

最初から数字を見せると、上限そのものが目安になって「そこまで書いてよい」と読めてしまいます。 上限に近づいたときだけ出せば、警告としてだけ働きます(GOV.UK Design System の Character count が同じ理由で threshold を持っています)。

数値の入力欄

type="number" を使わず自前で作っています。

全角で「58」と打っても半角になります。文字を混ぜても値は消えません。

type="number" は不正な値が入ると、読み出せる値が空文字になります。 全角で「141」と打たれても、半角に直す対象そのものが取れません。 日本語入力の確定を合図にして直す方法もありますが、貼り付けではその合図が来ません。 実際に本番で、全角のまま「数字を入力してください」で止まる投稿が発生しています。

文字として受け取り、欄から離れた時点で半角へ直す形にしました。 失われる ▲▼ と上下キーでの増減は自前で補い、 代わりにホイールで値が勝手に変わる誤操作は起きなくなっています。

選択欄

矢印だけ自前にしています。

選んでいる値: all

ブラウザが標準で描く矢印は枠の右端に貼り付き、文字との間が空きます。 位置も形も CSS からは動かせないうえ、幅は最も長い選択肢で決まるので、 短い選択肢を選んでいるときほど間延びして見えます。標準の矢印を消し、 同じアイコン集の矢印を重ねて位置を揃えました。

重ねた矢印はクリックを受け取らないようにしてあります。そうしないと、矢印の上を押したときだけ開かないという、見た目では分からない壊れ方をします。

表示の部品

ステータス

未対応(投稿を受け付けました。管理者が確認中です。)連絡済み(管理者が出版社または著者へ連絡しました。出版社から回答があれば「出版社からの回答」に表示されます。)正誤表に掲載(出版社または著者が誤りと認め、公式の正誤表に掲載しました。)修正予定(出版社または著者が誤りを認め、今後の刷または改訂版で修正すると回答しました。)修正済み(実際の本で修正されました(重版・改訂版・電子版の更新)。どの版・刷で直ったかは詳細に表示されます。)修正なし(出版社または著者が修正を行わないと判断しました。)却下(管理者が無効な投稿と判断しました。)その他(上記のいずれにも当てはまらない事情があります。「運営者からの補足」をご覧ください。)

運営が実際にできること以上を約束する語は使わないことを原則にしています。「対応中」のように、進んでいるように見えて中身の無いラベルは置きません。

各バッジは説明文を中に隠して持っています。hover で出るパネルとは別に読み上げ用の文があるので、 マウスを乗せられない環境でも意味が伝わります。

投稿の一覧(PC)

ヘッドレスのテーブルライブラリを使い、HTML と CSS は自前で書いています。

3 件
1 / 1 ページ

並べ替え・絞り込み・ページ送りの計算だけを借り、マークアップは自分で持っています。 画面幅が狭いときは、同じデータを次のカードに切り替えて出します。

投稿のカード(スマホ)

表を縮めるのではなく、優先順位を付け直した別の形です。

6つの列をそのまま縮めると、どの列も等しく読みにくくなります。 カードでは「どの本の・どこが・どう間違っているか」の順に積み直し、 書影(サムネイル)と誤/正を主役に置きました。表紙の無い本はアイコンに置き換えます (この見本がその状態です)。表では横に並ぶ値の優先順位が付いていませんが、 カードでは縦の順序がそのまま優先順位になります。

ここに書いた判断は、それぞれの実装のコメントに理由まで残しています。GitHub でソースを見る