概要
OS がダークモードでもサイトは常にライトのまま表示される。assets/styles/main.css の :root は color-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.ts の themeConstraints が 14 件のコントラスト条件を宣言しているが、これは AI 生成テーマを API 側が検証するための宣言であり、既定パレット自身の検証には使われていない(feat: SEO メタとコンテンツ管理を整理し品質チェックを CI に追加する #115 で既定パレットが自らの制約を破っていた前例がある)
nuxt.config.ts と public/manifest.webmanifest の theme-color は #0099ff 固定で、ライト・ダークいずれの背景とも一致しない
@media (display-mode: standalone) の AccentColor 追随(assets/styles/main.css)は、rgb(255 248 240) などライト前提の固定値と color-mix している
やりたいこと
@media (prefers-color-scheme: dark) にダーク用の色トークン 11 個を定義する
color-scheme: light を light dark に変更し、フォームコントロール・スクロールバー・<dialog> の既定描画を追従させる
ダークパレットが themeConstraints の 14 件をすべて満たすことを実測で確認する。--text-faint と --highlight は 3:1 の装飾用途という位置付け(AGENTS.md)を維持する
theme-color を media="(prefers-color-scheme: dark)" で出し分ける(PWA 側の整理は別 issue)
AccentColor 追随ブロックのベース色をダーク時にも成立する式へ直す
判断が必要な点
OS 追従のみにするか、明示的な切り替えを置くか。 既に ThemeChanger があるため、ライト / ダーク / OS 追従の 3 状態を持たせるなら UI の置き場所と永続化の設計が要る(テーマ生成結果自体が現状永続化されていない点とも絡む)
AI 生成テーマとの優先順位。 applyTheme は documentElement.style へインラインで書くためメディアクエリより常に強い。ダーク環境で生成したテーマをどう扱うか(生成テーマが常に勝つ / ダーク用に再生成させる)を決める必要がある
ダークパレットを誰が決めるか。 AI に生成させず手で決め、themeConstraints で機械検証するのが既存の方針と揃う
固定色のままにする箇所。 ImageLightbox の白 / 黒 rgba は任意のユーザー画像に対するコントラスト保証のための意図的な逸脱(fix: WCAG 2.2 AA の不適合を修正する #126 )なので据え置きでよいか
OG 画像 (public/og-image-2026.webp と public/og/)はライト配色のまま 1 種類でよいか
確認すること
axe と Lighthouse が見るのはデフォルトテーマだけ(AGENTS.md)。pnpm run a11y をダーク配色でも走らせる手段を用意するか検討する
ダーク時のコードブロック(libs/shiki-theme.ts 経由の --code-*)、::selection、フォーカスリングの見え方
概要
OS がダークモードでもサイトは常にライトのまま表示される。
assets/styles/main.cssの:rootはcolor-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.tsのthemeConstraintsが 14 件のコントラスト条件を宣言しているが、これは AI 生成テーマを API 側が検証するための宣言であり、既定パレット自身の検証には使われていない(feat: SEO メタとコンテンツ管理を整理し品質チェックを CI に追加する #115 で既定パレットが自らの制約を破っていた前例がある)nuxt.config.tsとpublic/manifest.webmanifestのtheme-colorは#0099ff固定で、ライト・ダークいずれの背景とも一致しない@media (display-mode: standalone)の AccentColor 追随(assets/styles/main.css)は、rgb(255 248 240)などライト前提の固定値とcolor-mixしているやりたいこと
@media (prefers-color-scheme: dark)にダーク用の色トークン 11 個を定義するcolor-scheme: lightをlight darkに変更し、フォームコントロール・スクロールバー・<dialog>の既定描画を追従させるthemeConstraintsの 14 件をすべて満たすことを実測で確認する。--text-faintと--highlightは 3:1 の装飾用途という位置付け(AGENTS.md)を維持するtheme-colorをmedia="(prefers-color-scheme: dark)"で出し分ける(PWA 側の整理は別 issue)判断が必要な点
applyThemeはdocumentElement.styleへインラインで書くためメディアクエリより常に強い。ダーク環境で生成したテーマをどう扱うか(生成テーマが常に勝つ / ダーク用に再生成させる)を決める必要があるthemeConstraintsで機械検証するのが既存の方針と揃うpublic/og-image-2026.webpとpublic/og/)はライト配色のまま 1 種類でよいか確認すること
pnpm run a11yをダーク配色でも走らせる手段を用意するか検討するlibs/shiki-theme.ts経由の--code-*)、::selection、フォーカスリングの見え方