アクセシビリティテーマの追加(ハイコントラスト・Okabe-Ito など)
色覚の多様性や見えにくさに配慮したテーマを、本体の v2 テーマとして追加する設計メモです。本体の標準機能ではありません。 本体を改修せずに、拡張スクリプトで配色だけを切り替える方法は ナビゲーションとテーマ の「v2 テーマの配色モードとテーマを切り替える(統合 FAB)」にあります。調査は 1.5.1.0 で行い、前提にした部分を 1.5.8.1 のソースで確かめています。
テーマ改善でハイコントラストが標準になる予定です
2027 年 1 月予定のテーマ改善では、ハイコントラストのテーマ 3 種(紺 / 白・黄 / 黒・シアン / 黒)が標準で入り、テーマの CSS の構成も変わります。このメモの前提(custom.css の CSS 変数、ThemeVersion() による判定)は 1.5.8.1 のものです。変更点は テーマ改善(UI テーマの刷新)への備え にまとめています。
前提にした現行実装
テーマの世代
| 世代 | ThemeVersion() | テーマ | 仕組み |
|---|---|---|---|
| v1 | 1.0 | base・black-tie・sunny など 25 個 | jQuery UI のテーマ。CSS 変数を使わない |
| v2 | 2.0 | cerulean・green-tea・mandarin・midnight の 4 個 | custom.css の :root の CSS 変数で配色を決める |
v2 かどうかは Context.ThemeVersion() と ThemeVersionForCss() の switch にテーマ名を直接書いて判定しています(Context.cs#L1544-L1570)。
使うテーマの決まり方
図を読み込み中…
1.5.8.1 では、値が空でないだけでなくユーザーのテーマの選択肢(Users_Theme.json の ChoicesText)に含まれるかも確かめます(Context.cs#L1523-L1542)。テナントのテーマもこの選択肢で判定するので、新しいテーマは Users_Theme.json に必ず足します。1.5.1.0 では、空でなければそのまま使う CoalesceEmpty でした。
テーマのファイル
Implem.PleasanterFrontend/wwwroot/src/clone/assets/themes/{テーマ名}/
├─ custom.css CSS 変数の定義(cerulean で約 210 個)
├─ jquery-ui.min.css jQuery UI の CSS
└─ images/ jQuery UI のアイコン画像src/clone 以下はビルド時に Implem.Pleasanter/wwwroot へそのままコピーされ(vite.config.ts#L11-L17)、画面は assets/themes/{テーマ名}/jquery-ui.min.css と custom.css を読み込みます(HtmlStyles.cs#L119、#L152)。
custom.css の変数は、先頭の ColorScheme(--primaryColor・--commonColor01〜07・--nonColor01〜16 など)を、BaseSetting(--page-bg・--base-text・--link-text・--success-color・--warning-color など)やボタン・入力欄・グリッドの変数が var() で参照する形になっています。cerulean では --success-color が --commonColor07、--warning-color が --commonColor01(#e03e3e)です。そのため、ColorScheme を差し替えるだけで画面全体の配色を変えられます。
追加の手順
| # | 対象 | 変更 |
|---|---|---|
| 1 | themes/{テーマ名}/custom.css | 新しく作る。既存の v2 テーマをコピーして ColorScheme を変える |
| 2 | themes/{テーマ名}/jquery-ui.min.css | 既存の v2 テーマからコピー |
| 3 | themes/{テーマ名}/images/ | 同上(明るい背景なら cerulean、暗い背景なら midnight から) |
| 4 | Context.cs の ThemeVersion()・ThemeVersionForCss() | case にテーマ名を足す |
| 5 | Definition_Column/Users_Theme.json・Tenants_Theme.json | ChoicesText にテーマ名を足す |
| 6 | 表示名(任意) | 多言語の表示名を足す |
public decimal ThemeVersion()
{
switch (Theme())
{
case "cerulean":
case "green-tea":
case "mandarin":
case "midnight":
case "high-contrast": // 追加
case "okabe-ito": // 追加
case "dark-high-contrast": // 追加
case "monochrome": // 追加
return 2.0M;
default:
return 1.0M;
}
}追加するテーマの案
| テーマ名(内部名) | 目的 | 背景 |
|---|---|---|
ハイコントラスト(high-contrast) | WCAG 2.1 AAA(コントラスト比 7:1 以上)を狙う | 白 |
Okabe-Ito(okabe-ito) | 色覚のタイプにかかわらず見分けやすい配色 | 白 |
ダークハイコントラスト(dark-high-contrast) | 暗い背景で高コントラスト。まぶしさが苦手な人向け | 黒 |
モノクローム(monochrome) | 色を使わず明るさの差だけで区別する | 白 |
現行テーマで見分けにくくなりやすいのは、赤(--commonColor01)と緑(--commonColor07)で表す状態、成功色と警告色、リンクと本文の色です。どのテーマでも、色だけで情報を伝えず、文字や枠線の太さも併せて使うことが前提になります。
ハイコントラスト
| 項目 | 方針 |
|---|---|
| 背景・文字 | #ffffff と #000000(21:1) |
| 境界線 | 黒の 2px 以上の実線 |
| フォーカス | 3px 以上のアウトライン |
ColorScheme の案
:root {
--primaryColor: #0000cc;
--primaryDark: #000099;
--primarySub01: #6666ff;
--primarySub02: #9999ff;
--primarySub03: #ccccff;
--primarySub04: #e6e6ff;
--commonColor01: #cc0000;
--commonColor02: #ff3333;
--commonColor03: #ffcccc;
--commonColor04: #ffe6e6;
--commonColor05: #ffffcc;
--commonColor06: #cc6600;
--commonColor07: #006600;
--nonColor01: #000000;
--nonColor02: #1a1a1a;
--nonColor03: #333333;
--nonColor04: #4d4d4d;
--nonColor05: #666666;
--nonColor06: #808080;
--nonColor07: #999999;
--nonColor08: #b3b3b3;
--nonColor09: #cccccc;
--nonColor10: #d9d9d9;
--nonColor11: #e6e6e6;
--nonColor12: #f0f0f0;
--nonColor13: #f5f5f5;
--nonColor14: #fafafa;
--nonColor15: #fcfcfc;
--nonColor16: #ffffff;
--page-bg: #ffffff;
--base-text: #000000;
--base-bg: #ffffff;
--base-border: #000000;
--link-text: #0000cc;
--success-color: #006600;
--warning-color: #cc0000;
}| 要素 | 前景 | 背景 | コントラスト比 | WCAG |
|---|---|---|---|---|
| 本文 | #000000 | #ffffff | 21:1 | AAA |
| リンク | #0000cc | #ffffff | 9.4:1 | AAA |
| エラー | #cc0000 | #ffffff | 5.9:1 | AA |
| 成功 | #006600 | #ffffff | 7.1:1 | AAA |
Okabe-Ito
岡部・伊藤のカラーパレット(8 色)を使います。
| 色 | 値 | 使い道 |
|---|---|---|
| Black | #000000 | 文字・境界線 |
| Orange | #E69F00 | 注意・警告 |
| Sky Blue | #56B4E9 | 情報・補助 |
| Bluish Green | #009E73 | 成功・完了 |
| Yellow | #F0E442 | 強調 |
| Blue | #0072B2 | プライマリ・リンク |
| Vermillion | #D55E00 | エラー・削除 |
| Reddish Purple | #CC79A7 | アクセント |
ColorScheme の案
:root {
--primaryColor: #0072b2;
--primaryDark: #005a8e;
--primarySub01: #56b4e9;
--primarySub02: #a3d5f0;
--primarySub03: #d4eaf7;
--primarySub04: #eaf5fb;
--commonColor01: #d55e00;
--commonColor02: #e07a33;
--commonColor03: #f5cdb0;
--commonColor04: #fae6d5;
--commonColor05: #fdf8e0;
--commonColor06: #e69f00;
--commonColor07: #009e73;
}ダークハイコントラスト
midnight を元に、背景 #000000・文字 #ffffff、リンク #66ccff、フォーカスは黄色(#ffff00)のアウトラインにします。
ColorScheme の案
:root {
--primaryColor: #66ccff;
--primaryDark: #3399cc;
--primarySub01: #1a1a2e;
--primarySub02: #0d0d1a;
--primarySub03: #2a2a3e;
--primarySub04: #e6f5ff;
--commonColor01: #ff6666;
--commonColor02: #ff9999;
--commonColor03: #4d0000;
--commonColor04: #330000;
--commonColor05: #333300;
--commonColor06: #ffcc00;
--commonColor07: #66ff99;
--nonColor01: #000000;
--nonColor02: #0d0d0d;
--nonColor03: #1a1a1a;
--nonColor04: #262626;
--nonColor05: #333333;
--nonColor06: #4d4d4d;
--nonColor07: #666666;
--nonColor08: #999999;
--nonColor09: #b3b3b3;
--nonColor10: #cccccc;
--nonColor11: #d9d9d9;
--nonColor12: #e6e6e6;
--nonColor13: #f0f0f0;
--nonColor14: #f5f5f5;
--nonColor15: #fafafa;
--nonColor16: #ffffff;
--page-bg: #000000;
--base-text: #ffffff;
--base-bg: #000000;
--base-border: #cccccc;
--link-text: #66ccff;
--success-color: #66ff99;
--warning-color: #ff6666;
}モノクローム
グレーの濃淡だけを使い、状態は文字のラベルで区別します。
ColorScheme の案
:root {
--primaryColor: #333333;
--primaryDark: #1a1a1a;
--primarySub01: #999999;
--primarySub02: #b3b3b3;
--primarySub03: #d9d9d9;
--primarySub04: #f0f0f0;
--commonColor01: #1a1a1a;
--commonColor02: #333333;
--commonColor03: #e6e6e6;
--commonColor04: #f0f0f0;
--commonColor05: #fafafa;
--commonColor06: #4d4d4d;
--commonColor07: #808080;
--page-bg: #f5f5f5;
--base-text: #000000;
--base-bg: #ffffff;
--base-border: #333333;
--link-text: #000000;
--success-color: #808080;
--warning-color: #1a1a1a;
}OS の設定との連携
テーマとは別に、OS のハイコントラスト設定に合わせるメディアクエリを custom.css に足すこともできます。
@media (prefers-contrast: more) {
:root {
--base-border: #000000;
--control-border: #000000;
}
}
@media (forced-colors: active) {
:root {
--base-text: CanvasText;
--base-bg: Canvas;
--link-text: LinkText;
}
}優先順位
対象の人が多い high-contrast と okabe-ito を先に、dark-high-contrast と monochrome を後にします。1 テーマあたりの作業は、custom.css の作成、Context.cs の case 2 か所、選択肢の JSON 2 つです。