k8ordo
  • UI
  • Form
  • State
  • Router
  • Static
  • Server
  • i18n
  • Color scheme
ダークモードに切り替え
k8ordo

Baselineに入った機能を、制限なく使うReactのライブラリ群。

パッケージ
  • @k8ordo/ui
  • @k8ordo/form
  • @k8ordo/state
  • @k8ordo/router
  • @k8ordo/static
  • @k8ordo/server
  • @k8ordo/i18n
  • @k8ordo/color-scheme
UI
  • Get Started
  • Theming
  • i18n
  • Components
  • Hooks
  • Helpers
  • AIチャット
  • Generative UI
  • AIエージェント
  • Storybook
リソース
  • GitHub
  • npm

© 2026 k8o — MIT License

組版 — Noto Sans JP / M PLUS 2

@k8ordo/color-scheme

アプリケーションのカラースキーム軸を持つ。訪問者の設定(light / dark / 未設定=システム追従)を localStorage に置き、システムの設定と突き合わせて `<html>` の `dark` クラスに解決する。ルートレイアウトに置く 1 つの Provider が、最初の描画の前に付けるインラインスクリプトの描画も、hydrate 後の追従も担い、hook はそれを読むだけ。

npmGitHub

このサイト自身が実演

ヘッダーの切替ボタンも、このページの選択肢も、同じ useColorScheme() です。「システム」に戻すと保存行が消え、OS の設定に追従します。

今の表示
light
設定
system

全体像

ルートレイアウトに Provider を 1 つ、切替に hook を 1 つ。それ以外に書くものはありません。

特徴

  • 最初の描画から正しい<ColorSchemeProvider> が先頭にインラインスクリプトを描く。Provider が書く行と同じ行を読み、React が読み込まれる前に dark を付けるので、ダークのページが一瞬ライトで光らない。<head> に置くものは無い。
  • 未設定はシステムに追従保存されるのは訪問者が選んだときだけ。選んでいなければ Provider の defaultPreference(既定は system)に従い、prefers-color-scheme の変化にその場で追従する。初回に見たシステムの値に固定されない。
  • 保存先は @k8ordo/statedefineLocalState('color-scheme') の 1 行が保存先。キーも JSON の形もここには書かれず、タブ間の同期も古い行のサルベージも state のもの。
  • 決めるのは 1 か所、読むのはどこでもクラスを書くのは Provider だけ。useColorScheme() は { scheme, preference, setPreference } を読むだけの hook なので、切替ボタンとプレビューがずれようがない。

設計ガイド

設計ガイドは npm パッケージに同梱されています。AIコーディングエージェントは node_modules/@k8ordo/color-scheme/docs/ からインストールした版そのものを読みます。

Home
// routes/layout.tsx — Provider を body の中で全部に被せる。
// 先頭にインラインスクリプトを描くので、最初の描画から dark が付いている
import { ColorSchemeProvider } from '@k8ordo/color-scheme';

<html suppressHydrationWarning>
  <body>
    <ColorSchemeProvider>{children}</ColorSchemeProvider>
  </body>
</html>

// components/scheme-switcher.tsx
'use client';
import { useColorScheme } from '@k8ordo/color-scheme';

const { scheme, preference, setPreference } = useColorScheme();
setPreference(scheme === 'dark' ? 'light' : 'dark'); // 切り替える
setPreference('system'); // 保存行を消してシステムに追従する

// 訪問者が選ぶまでダークで始めたいなら、1 回だけ言う
<ColorSchemeProvider defaultPreference="dark">