Skip to content

ダークモード(prefers-color-scheme: dark)に対応する #151

Description

@newt239

概要

OS がダークモードでもサイトは常にライトのまま表示される。assets/styles/main.css:rootcolor-scheme: light を宣言しており、prefers-color-scheme による分岐はリポジトリ内に 1 箇所も存在しない。

ダークモードを持たないサイトは、iOS の「反転(スマート)」のような OS 側の色反転で代替されることがある。Smart Invert は画像とメディアを反転対象から外すため、地の色だけが暗転して画像はそのまま残る。#126 でピクセル実測して詰めたコントラスト(プロフィールカード、半透明ヘッダー)が、この環境では前提から崩れる。サイト側でダークを用意することが最も素直な解になる。

現状

  • :root の色トークンは 11 個(--text / --text-muted / --text-faint / --bg / --accent / --accent-dark / --highlight / --surface / --surface-hover / --border / --focus-ring)で、いずれもライト固定値
  • libs/theme.tsthemeConstraints が 14 件のコントラスト条件を宣言しているが、これは AI 生成テーマを API 側が検証するための宣言であり、既定パレット自身の検証には使われていない(feat: SEO メタとコンテンツ管理を整理し品質チェックを CI に追加する #115 で既定パレットが自らの制約を破っていた前例がある)
  • nuxt.config.tspublic/manifest.webmanifesttheme-color#0099ff 固定で、ライト・ダークいずれの背景とも一致しない
  • @media (display-mode: standalone) の AccentColor 追随(assets/styles/main.css)は、rgb(255 248 240) などライト前提の固定値と color-mix している

やりたいこと

  1. @media (prefers-color-scheme: dark) にダーク用の色トークン 11 個を定義する
  2. color-scheme: lightlight dark に変更し、フォームコントロール・スクロールバー・<dialog> の既定描画を追従させる
  3. ダークパレットが themeConstraints の 14 件をすべて満たすことを実測で確認する。--text-faint--highlight は 3:1 の装飾用途という位置付け(AGENTS.md)を維持する
  4. theme-colormedia="(prefers-color-scheme: dark)" で出し分ける(PWA 側の整理は別 issue)
  5. AccentColor 追随ブロックのベース色をダーク時にも成立する式へ直す

判断が必要な点

  • OS 追従のみにするか、明示的な切り替えを置くか。 既に ThemeChanger があるため、ライト / ダーク / OS 追従の 3 状態を持たせるなら UI の置き場所と永続化の設計が要る(テーマ生成結果自体が現状永続化されていない点とも絡む)
  • AI 生成テーマとの優先順位。 applyThemedocumentElement.style へインラインで書くためメディアクエリより常に強い。ダーク環境で生成したテーマをどう扱うか(生成テーマが常に勝つ / ダーク用に再生成させる)を決める必要がある
  • ダークパレットを誰が決めるか。 AI に生成させず手で決め、themeConstraints で機械検証するのが既存の方針と揃う
  • 固定色のままにする箇所。 ImageLightbox の白 / 黒 rgba は任意のユーザー画像に対するコントラスト保証のための意図的な逸脱(fix: WCAG 2.2 AA の不適合を修正する #126)なので据え置きでよいか
  • OG 画像public/og-image-2026.webppublic/og/)はライト配色のまま 1 種類でよいか

確認すること

  • axe と Lighthouse が見るのはデフォルトテーマだけ(AGENTS.md)。pnpm run a11y をダーク配色でも走らせる手段を用意するか検討する
  • ダーク時のコードブロック(libs/shiki-theme.ts 経由の --code-*)、::selection、フォーカスリングの見え方

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions