テーマ設定
Lily のコンポーネントは安定したクラスフックを持ち、CSS は一切持ちません — だからテーマは単なるスタイルシートです。このチュートリアルでは、「ファイルを 1 つリンクする」ところから、「ユーザーが実行時にテーマを切り替えられ、それが保持される」ところまで進みます。
作るもの
ユーザーが見た目全体を変えられるアプリ — 1 つのスタイルシートをリンクするところから始めて、保持される実行時のテーマ切り替えで終わります — 約 15 分で作ります。
始める前に
先に、お使いのスタックの フレームワークチュートリアル を先に済ませて、テーマを付ける小さな Lily フォームを用意してください。ここでの内容は 7 つのフレームワークすべてで動きます。コードサンプルは Svelte とプレーンな HTML で示します。
ステップ 1 — 既成のテーマをリンクする
themes/ ディレクトリには、45 の独立したスタイルシートが入っています。アプリの静的アセットにコピーして、どれか 1 つをリンクします:
<link rel="stylesheet" href="/assets/themes/united-kingdom-national-health-service-england-for-patients.css" />
主なテーマ:
-
公共部門 — NHS England / Scotland / Wales(それぞれ患者向けと実務者向けのバリアント)、GOV.UK(
united-kingdom-government-digital-service)、USWDS(united-states-web-design-system). - ベンダー由来 —
adobe-spectrum,mozilla-protocol. -
汎用 —
light,dark,nord,dracula,wireframe,corporate,synthwave、ほかにも多数あります。
動作の確認: ページを再読み込みします。フレームワークのチュートリアルで作った同じマークアップが、ボタン、入力、ラベル、フォーカスリングまで、すっかりスタイル付きになりました。HTML をたった 1 行追加しただけで、すべてのコンポーネントは元のままです。
ステップ 2 — 何でも上書きする
テーマのセレクターは次で囲まれています: :where(...)詳細度がゼロなので、自分で書いたルールが必ず勝ちます。単純明快です:
/* After the theme link: your brand button, everything else themed */
.button {
background: #7c3aed;
border-radius: 9999px;
}
ステップ 3 — theme-picker による実行時の切り替え
theme-picker ヘルパーは、アイコンボタンとリストボックスを備えたヘッドレスのコンポーネントで、テーマのライフサイクル全体を受け持ちます。管理された 1 つの <link>
を差し替えて、選ばれたスタイルシートを読み込み(有効なテーマだけが取得されます)、ドキュメントに
data-theme="{slug}" を設定し、必要に応じて次に保持します: localStorage。ここでは Svelte で示します。React、Vue、Angular、HTML、Nunjucks、Blazor のポートも契約ごとに同じ内容です:
<script>
import ThemePicker from "@lilydesignsystem/svelte-theme-picker";
</script>
<ThemePicker
label="Theme"
themesUrl="/assets/themes/"
themes={["light", "dark", "nord", "wireframe"]}
storageKey="my-app-theme"
/>
これで連携は完了です。キーボード操作は WAI-ARIA APG のリストボックスのパターンに従い、コントロール自体はヘッドレス(クラスフック
.theme-picker)なので、有効なテーマがそのまま適用されます。
2026-08-29 に確認済み: このスニペットそのものを、公開済みの 0.1.1 パッケージに対して、次を通してコンパイルしました:
svelte/server.
ステップ 4 — 自分の CSS でテーマに反応する
ヘルパーがドキュメントのルートに data-theme を設定するので、自分のスタイルをそれに応じて分岐できます:
[data-theme="dark"] .site-logo { filter: invert(1); }
サーバーレンダリングに関する注意
このヘルパーはすべての DOM 書き込みをフレームワークのマウント/エフェクトのライフサイクル内で行うので、設計上 SSR 対応です。最初の描画でのちらつきを避けるには、サーバー側で(たとえばクッキーから)最初のテーマの <link> と
data-theme を描画してください。Svelte のヘルパーのリポジトリには実行できる SvelteKit のクッキーの例があり、ほかのカタログでもそれぞれのスタックに合わせた同じパターンを説明しています。
次のステップ
- 設定ヘルパー — 言語、テキストサイズ、共有、日付/時刻の入力にも同じパターンが使えます。
- テーマの投稿 — 各テーマは、クラスフックを対象にした 1 つの独立したスタイルシートです。次を参照してください: 貢献の手引き.
途中で疑問があれば、 ヘルプページ に答えがたくさんあります。もし手順がもっと分かりやすくできるなら、 お知らせください 。喜んでチュートリアルを改善します。