Color Mode
このページは テーマ作成の詳細 の一部で、Color Mode の指定と CSS での扱いを扱います。
5. Color Mode
Theme は3種類の Color Mode を扱えます。
type ThemeColorMode =
| "light"
| "dark"
| "system";
| Mode | 動作 |
|---|---|
light |
Light 配色 |
dark |
Dark 配色 |
system |
OS の設定に追従 |
Theme は data-theme と Semantic Token を使って配色を切り替えます。
個々の Component に Light / Dark の色を直接埋め込まないでください。
6. Color Mode の CSS
基本となる CSS は次の形です。
/* Light */
:is(:root, .rb-theme-root)
[data-theme-name="<name>"] {
/* ... */
}
/* Dark */
:is(:root, .rb-theme-root)
[data-theme-name="<name>"]
[data-theme="dark"] {
/* ... */
}
/* System */
@media (prefers-color-scheme: dark) {
:is(:root, .rb-theme-root)
[data-theme-name="<name>"]
:not([data-theme]) {
/* ... */
}
}
Server は colorMode が "system" 以外なら <html> に data-theme を出力します。
<html
data-theme-name="example"
data-theme="dark"
>
"system" の場合は data-theme を出力しません。
<html data-theme-name="example">
この違いは重要です。
7. system では Attribute を削除する
実行時に Color Mode を変更する場合は、
light
→ data-theme="light"
dark
→ data-theme="dark"
system
→ data-theme を削除
とします。
たとえば、
document.documentElement.dataset.theme =
"dark";
から System へ戻す場合は、
delete document.documentElement.dataset.theme;
とします。
次のように空文字へ変更してはいけません。
document.documentElement.dataset.theme = "";
これは、
<html data-theme="">
となり、依然として [data-theme] Selector に一致するためです。
その結果、
:not([data-theme])
が成立せず、System Mode の Media Query が機能しません。
@riebeckite/plugin-color-mode がこの Contract の参照実装です。