Horizon カラーパレットの3層カスケード構造

Horizon カラーパレット徹底解剖 ― 1色決めると何が自動導出され、どのパーツに適用されるのか

Shopify公式テーマ「Horizon」の v4系では、配色の仕組みがカラースキーム方式からカラーパレット方式へ全面刷新されました。旧方式は6つの固定スキームに対して約50項目の色を1つずつ手で指定するものでしたが、新方式は「パレット」を1つ決めるだけで、各UI要素の色が自動的に導出されます。

この記事では、その「1色決めると、何が自動で設定され、どのパーツに適用されるのか」という波及構造を、3つの層に分けて解剖します。(v4.1.1全体の変更点は「v4.1.1 アップデート解説」をご覧ください。)

まずは要点を1枚で。「パレットとは何か」「変更すると何が影響を受けるか」「自動で設定される色の正体」「旧方式から何が一番変わったか」「メリット・デメリット」の5つの疑問に沿って整理しました。

Horizonカラーパレット早わかり ― パレットの構造・変更の影響範囲・自動で設定される色・旧方式からの変化・メリットデメリットを5つの疑問で整理した解説図

▲ カラーパレットの早わかり。この5点を頭に入れてから、以下で仕組みを層ごとに見ていきます。

全体像 ― 3層のカスケード

カラーパレットは、上流から下流へ3段階で色が流れていきます。

  • ① あなたが設定する層 ― カラーパレット(背景・メインカラー+任意の色)。ここだけを触る
  • ② 自動で導出される層 ― 各要素の色を「パレット参照」で割り当て + color-palette.liquid が計算(コントラスト・ホバー色など)→ CSS変数に展開
  • ③ 適用されるUIパーツ ― ボタン・入力欄・バリアント・カートなど。各コンポーネントはCSS変数を参照するだけ

Horizonカラーパレットの3層カスケード:パレット→自動導出→適用パーツ

▲ ①パレット(狭い=少数)から、②導出・③パーツ(広い=多数)へと波及していくピラミッド構造。

層① ― カラーパレット(触る唯一の入口)

color_palette は v4 で追加された新しい設定型で、中身は名前付きの色の集合です。デフォルトは背景・メインカラーの2色だけで、必要に応じて color1 color2 …と足せます。

"color_palette": {
  "background": "#ffffff",
  "foreground": "#000000",
  "color1": "#333333",
  "color3": "#dfdfdf"
}

公式が「マーチャントが編集できる1つの色のグリッド」と表現しているのがこれです。マーチャントが触るのは原則この層だけになります。

補助色(color1〜)のルール ― 自動で使われるのはごく一部

誤解しやすいポイントですが、テーマが自動で参照するのはほぼ「背景」と「メインカラー」の2色です(テーマ内の参照回数を数えると、それぞれ約50箇所ずつに対し、補助色は各1箇所程度)。補助色にあらかじめ配線されているのは次の数カ所だけです。

パレットの色 自動で使われる場所
背景・メインカラー ページ・文字・ボタン・ドロワー・バリアント…ほぼすべて(各約50箇所)
color1 入力フィールドの文字
color2color3 入力欄・ドロワー・ポップオーバー等の枠線(どちらを使うかはバージョンにより異なる)
color4 カートページの小計ボックス背景

では「+」で追加した補助色はどこに使われるのかというと、どこにも自動適用されません。追加した色はテーマエディタのすべてのカラーピッカーに候補スウォッチとして並ぶようになり、セクションやブロックの色設定に手動で割り当てて使います。HEX直指定と違うのは、後からパレット側で色を変えると、割り当てた全箇所が一括で追従すること。つまり補助色の正体は「自動で使われる色」ではなく「名前付きのブランドカラー変数」です。

⚠️ 補助色を使う予定がなくても、入力欄の文字・枠線に配線されている分(color1〜color3あたり)は定義しておく必要があります。未定義だと入力欄の色が決まらず、エディタに「配色を定義する必要があります」と表示される一因になります。

層② ― 自動で導出される(参照 + 計算)

(1) 参照で割り当て ― 各要素の色はパレットを指す

ボタン・バリアント・入力欄などの色設定は、固定のHEXではなくパレットへのLiquid参照で持ちます。

"palette_primary_button_background": "{{ settings.color_palette.foreground }}",
"palette_primary_button_text": "{{ settings.color_palette.background }}",
"palette_variant_background": "{{ settings.color_palette.background }}",
"palette_input_text": "{{ settings.color_palette.color1 }}"

つまり、パレットの foreground を1つ変えると、それを参照している全要素が一斉に変わる。これが「変更がテーマ全体に反映される」の正体です。

(2) 計算で生成 ― color-palette.liquid が"効いた色"を作る

ここが賢い部分です。単なる参照の展開ではなく、以下を自動計算します。

スマートコントラスト ― パレット内の全色をループし、color_brightness で最も明るい色・暗い色を1回だけ算出。ホバー時やフォールバックの文字色を、背景の明るさに応じて自動で選びます(明るさ128超なら暗い色、そうでなければ明るい色)。

for palette_color in settings.color_palette
  assign b = palette_color | color_brightness
  # 最大→palette_lightest / 最小→palette_darkest に記録
endfor

ホバー色の自動生成util-palette-hover-shift.liquid が、元の色の明るさ・透明度に応じて明度を機械的にシフトします。

元の色の状態 生成されるホバー色
透明度が高い(alpha < 0.4) 不透明度を +0.15
かなり暗い(明るさ ≤ 40) 15%明るく
暗い(≤ 128) 5%明るく
明るい(≤ 190) 10%暗く
かなり明るい(190 超) 5%暗く

「暗い色は明るく、明るい色は暗く」寄せるので、どんなパレットでも自然なホバーになります。加えて、muted / subdued などの薄い文字や disabled 状態も、メインカラー色に不透明度を掛けて自動生成されます。

最終的に、これらは :rootCSS変数として出力されます。

:root {
  --color-foreground: #000000;
  --color-primary-button-background: rgb(...);
  --color-variant-hover-text: rgb(...);   /* ←自動計算した色 */
  --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-muted-text));
}

層③ ― 適用されるUIパーツ

各コンポーネント(ボタン・入力欄・バリアントスウォッチ・カートドロワー・ポップオーバー・バッジ…)のCSSは、層②で出力された --color-* 変数を参照するだけです。色の決定ロジックはすべて層②に集約されているため、コンポーネント側は「どの変数を使うか」だけを知っていればよい構造になっています。

結果として、マーチャントが操作するのは数色のパレットだけで済みます。パレットを選び直すと、冒頭の早わかり図 Q2 で挙げた要素(ボタン・文字・背景・枠線・フォーム・バリアント・バッジ・カート…)が一斉に、調和を保ったまま色を変えます

旧「配色」(カラースキーム)はどこへ行ったか

v3系までの「配色」は、背景・見出し・テキスト・リンク・枠線・影・ボタン一式…といった項目色を詰めた「束(スキーム)」を最大6セット作り、セクションごとに束を当てる方式でした。一括で揃えられる便利さの半面、「枠線」や「影」が実際にどの要素に効くのか見えず、どのセクションがどのスキームを使っているかも一覧できない、という分かりにくさがありました。

v4 はこの束を3つに分解しました。

  • 色の値そのもの → カラーパレットに一元化
  • 項目ごとの割り当て → テーマ設定の要素別カテゴリ(ページ/ボタン/入力フィールド/ドロワー…)へ移動
  • ホバー色などの微調整項目 → 設定自体が消滅し、自動計算に置き換え

旧スキームの項目がそれぞれどこへ移ったかを対応表にすると、こうなります。

旧スキームの項目 v4 での場所
背景 ページ → 背景
見出し/テキスト ページ → テキスト(統合)
リンク/ホバー時のリンク 廃止(テキストに統合。ホバーは自動計算)
枠線 各要素に分散(入力フィールド → 枠線、バリエーションピッカー → 枠線 など)
ドロワー/ポップオーバー → 影
プライマリー/セカンダリーボタン一式 ボタン → プライマリ/セカンダリ
ボタンのホバー時 背景・テキスト・枠線 設定消滅(パレットから自動計算)

つまり項目リストは消えたのではなく、要素ベースの置き場所に再配置されました。「ボタンの色はどこ?」→「ボタン」の中、と設定名から引けるようになったのは大きな改善です。ただし1つだけ実損があります。セクション単位で束ごと当て替える使い方(このセクションだけ黒背景の反転配色にする等)は1操作ではできなくなり、セクション側の背景色設定+個別の色指定で作り込むことになります。

コントロールの要点 ― 「値・既定・個別」の3軸

ここまでを運用目線でまとめ直すと、v4 の配色は次の3層の継承構造で動いています。

① カラーパレット(色の値の置き場)
      ↓ 参照
② テーマ設定の要素別カテゴリ(サイト全体の既定)
      ↓ 継承 … ブロック側が空なら、この既定が効く
③ セクション/ブロックの色設定(個別の上書き)

「どこを触ればいいか」はやりたいことで決まります。

やりたいこと 触る場所
全体の配色をまとめて変える(衣替え) ① パレットの色だけを変える(参照は触らない)
全サイトのボタンだけ/入力欄だけ変える ② テーマ設定の該当カテゴリで参照先や色を変える
このセクション・ブロックだけ変える ③ ブロックの色設定で上書き

ポイントは③の上書き時にも、カラーピッカーにはパレットのスウォッチが候補として並ぶこと。スロット参照のまま個別化すればその箇所もパレット変更に追従し続け、固定色を指定すれば連動から切り離せます。旧スキームの「一括の便利さ」はパレットに引き継がれ、そのうえで個別の自由が加わった——というのが v4 の設計です。

💡 逆引きテク:どの色設定がどのスウォッチを参照しているかは、その要素のカラーピッカーを開けばその場で分かります(参照中のスウォッチに選択マークが付く)。「パレットを変えて結果から推測する」のではなく、「要素から参照先を逆引きする」のが配色をコントロールする基本動作です。

⚠️ パレットのスウォッチの並び順に固定の意味はありません(色の追加・削除で位置がズレることがあります)。「2番目だから文字色」と位置で覚えず、必ずピッカーの表示で参照先を確認してください。

「1色変えると何が波及するか」を見る

たとえばメインカラー(foreground=文字・見出し・ボタンに使われる主役の色)を1つ変えると、本文テキスト・プライマリボタン背景・バリアント文字・選択中バリアント背景・補助テキストまで、広範囲が一斉に変わります。下図はメインカラーを起点にした波及先をハイライトしたものです。

メインカラー(foreground)を変えたときの波及先ハイライト

▲ メインカラーを起点にした波及。背景専用のパーツ(クイック追加など)だけが対象外で、それ以外は広く影響を受ける。

逆に背景(background)は面の色、color1 以降は文字色や境界線の微調整に効きます。「どの色を変えると、どこまで波及するか」を把握しておくと、配色変更の見通しが立てやすくなります。

カスタムCSSへの示唆

この仕組みは、カスタムCSSの扱いにも影響します。

旧カラースキーム由来のCSS変数を直接参照している場合は要確認。 --color-primary-button-background のように新設された変数が多く、旧名の参照は効かなくなる可能性があります。移行前に開発テーマ(shopify theme dev)で配色を確認してください。

一方で、カスタムしやすくなった面もあります。custom.css--color-* 変数を上書きすれば、その変数を使う全パーツにまとめて効きます。狙って変数名を押さえれば、少ない記述で一括変更ができます。

まとめ

Horizon v4 のカラーパレットは、「①パレットを決める → ②参照+計算で自動導出 → ③各パーツが変数を参照」という3層のカスケードで動いています。

  • 手作業だった「調和・コントラスト・ホバー調整」がテーマ側に移り、マーチャントは色のグリッドを触るだけで統一感を保てる
  • メインカラーのような上流の色ほど波及範囲が広い。変更時は影響範囲を意識する
  • カスタムCSSは変数名の変化に注意しつつ、--color-* の上書きで一括変更もできる
  • 運用で触る軸は3つ ― 値(パレット)・既定(テーマ設定)・個別(ブロック上書き)。いまどの軸を触っているかを意識すると迷わない
  • 迷ったら逆引き ― 要素のカラーピッカーを開けば、参照先のスウォッチがその場で分かる

旧「配色」が束を選ぶ1軸だったのに対し、v4 は3軸の使い分けになりました。自由度が上がったぶん最初は戸惑いますが、「1色でテーマ全体が調和する」体験の裏側にあるこの構造を頭に入れておけば、配色は確実にコントロールできます。

付録:デフォルト Horizon のパレット配線図

参考資料として、デフォルトの Horizon v4.1.1 の配線を場所ごとに一覧化しました。各行グループの左に、そのセクション・ブロックのプレビュー(Horizon 標準デザイン)を添えています。名称はテーマエディタの日本語表示、グレーのカッコ内は内部キーです。

1. テーマ設定(「設定」の各色項目)― 30項目

サイト全体の既定です。ほとんどが背景かメインカラーを参照し、固定色の項目はパレットを変えても動きません。

プレビュー カテゴリ 設定項目 参照先
タイポグラフィ テキスト (page_text_color) メインカラー
ページ 背景 (page_background_color) 背景
バッジ セールバッジの背景 (badge_sale_background_color) 背景
セールバッジのテキスト (badge_sale_text_color) 固定色 #000000cf
売り切れバッジの背景 (badge_sold_out_background_color) 固定色 #eef1ea
売り切れバッジのテキスト (badge_sold_out_text_color) 固定色 #000000cf
ボタン 背景 (palette_primary_button_background) メインカラー
テキスト (palette_primary_button_text) 背景
枠線 (palette_primary_button_border) メインカラー
背景 (palette_secondary_button_background) 固定色 rgba(0,0,0,0)
テキスト (palette_secondary_button_text) メインカラー
枠線 (palette_secondary_button_border) メインカラー
ドロワー 背景色 (drawer_background_color) 背景
テキストの配色 (drawer_text_color) 固定色 #000000cf
枠線の色 (drawer_border_color) メインカラー
入力フィールド 背景 (palette_input_background) 固定色 #ffffffc7
テキスト (palette_input_text) 補助色 color1
枠線 (palette_input_border) 補助色 color3
ポップオーバーとモーダル 背景色 (popover_background_color) 背景
テキストの配色 (popover_text_color) 固定色 #000000cf
枠線の色 (popover_border_color) メインカラー
(popover_shadow_color) メインカラー
商品カード 背景 (quick_add_background) 背景
テキスト (quick_add_text) 固定色 #000000cf
バリエーションピッカー 背景 (palette_variant_background) 背景
テキスト (palette_variant_text) メインカラー
枠線 (palette_variant_border) 固定色 #00000021
背景 (palette_selected_variant_background) メインカラー
テキスト (palette_selected_variant_text) 背景
枠線 (palette_selected_variant_border) メインカラー

2. 各ページのセクション・ブロックが参照している色 ― 29箇所

テンプレートに保存されている配線をセクションごとにまとめました(固定色の指定は省略)。ほぼすべてがセクション背景で、背景スロットに繋がっています。

プレビュー セクション ページ › 設定項目 参照先
404 404ページ › 背景色 (background_color) 背景
おすすめ商品 商品ページ › 背景色 (background_color) 背景
カート カートページ › 背景色 (background_color) 背景
カートページ › サマリー › 背景色 (background_color) 補助色 color4
コレクション コレクションページ › 背景色 (background_color) 背景
コレクションリスト コレクション一覧 › 背景色 (background_color) 背景
セクション コレクションページ › 背景色 (background_color) 背景
お問い合わせページ › 背景色 (background_color) 背景
パスワードページ › 背景色 (background_color) 背景
ヒーロー トップページ › ボタン › テキスト (custom_button_text) 背景
トップページ › ボタン › 枠線 (custom_button_border) 背景
フッター フッターグループ › フッター › 背景色 (background_color) 背景
フッターグループ › ポリシーとリンク › 背景色 (background_color) 背景
ブログ記事 ブログ記事 › 背景色 (background_color) 背景
ブログ一覧 › 背景色 (background_color) 背景
ヘッダー ヘッダーグループ › 告知バー › 背景色 (background_color) 背景
ヘッダーグループ › ヘッダー › 上段の背景 (background_color_top) 背景
ヘッダーグループ › カスタムLiquid › background_color (background_color) 背景
ページ お問い合わせページ › 背景色 (background_color) 背景
固定ページ › 背景色 (background_color) 背景
商品情報 商品ページ › 背景色 (background_color) 背景
検索 検索ページ › 背景色 (background_color) 背景
検索結果 検索ページ › 背景色 (background_color) 背景
特集コレクション 404ページ › 背景色 (background_color) 背景
カートページ › 背景色 (background_color) 背景
トップページ › 背景色 (background_color) 背景
トップページ › ヘッダー › すべて表示ボタン › 背景 (custom_button_background) メインカラー
トップページ › ヘッダー › すべて表示ボタン › テキスト (custom_button_text) 背景
トップページ › ヘッダー › すべて表示ボタン › 枠線 (custom_button_border) 背景

3. ブロック・セクションを新規追加したときの初期配線 ― 50項目

エディタでブロックを新しく置いたとき、その「カスタム色」系の設定が最初から参照している先です。新規ブロックもパレットに追従した状態で生まれる、という本文の話の根拠がこれです。

プレビュー ブロック/セクション 設定項目 参照先
すべて表示ボタン(ブロック) 背景 (custom_button_background) メインカラー
テキスト (custom_button_text) 背景
枠線 (custom_button_border) 背景
カートに追加(ブロック) 背景 (custom_button_background) メインカラー
テキスト (custom_button_text) 背景
枠線 (custom_button_border) 背景
カート内の商品(ブロック) 背景 (input_background_color) 背景
テキスト (input_text_color) メインカラー
枠線 (input_border_color) メインカラー
コレクションのタイトル(ブロック) 背景色 (background_color) 背景
テキストの配色 (text_color) メインカラー
バリエーションピッカー(ブロック) 背景 (custom_variant_background) 背景
テキスト (custom_variant_text) メインカラー
枠線 (custom_variant_border) メインカラー
背景 (custom_selected_variant_background) メインカラー
テキスト (custom_selected_variant_text) 背景
枠線 (custom_selected_variant_border) メインカラー
フッター(セクション) 背景色 (background_color) メインカラー
ボタン(ブロック) 背景 (custom_button_background) メインカラー
テキスト (custom_button_text) 背景
枠線 (custom_button_border) 背景
ポリシーとリンク(セクション) 背景色 (background_color) メインカラー
メニュー(ブロック) 背景色 (background_color) 背景
メニューバーの背景色 (background_color_navigation_bar) 背景
メールマガジン登録(ブロック) 背景 (custom_button_background) メインカラー
テキスト (custom_button_text) 背景
枠線 (custom_button_border) 背景
問い合わせフォーム(ブロック) 背景 (input_background_color) 背景
テキスト (input_text_color) メインカラー
枠線 (input_border_color) メインカラー
数量(ブロック) 背景 (input_background_color) 背景
テキスト (input_text_color) メインカラー
枠線 (input_border_color) メインカラー
検索入力(ブロック) 背景 (input_background_color) 背景
テキスト (input_text_color) メインカラー
枠線 (input_border_color) メインカラー
比較スライダー(ブロック) 背景色 (text_background_color) 背景
テキストの配色 (text_color) メインカラー
購入ボタン(ブロック) 背景 (recipient_button_background) 背景
テキスト (recipient_button_text) メインカラー
枠線 (recipient_button_border) メインカラー
背景 (selected_recipient_button_background) メインカラー
テキスト (selected_recipient_button_text) 背景
枠線 (selected_recipient_button_border) メインカラー
背景 (input_background_color) 背景
テキスト (input_text_color) メインカラー
枠線 (input_border_color) メインカラー
送信ボタン(ブロック) 背景 (custom_button_background) メインカラー
テキスト (custom_button_text) 背景
枠線 (custom_button_border) 背景

▲ v4.1.1(2026年7月時点の upstream)の settings_data/templates/sections/blocks から抽出。名称は locales/ja.schema.json、プレビューは Horizon 標準デザイン(Figma)に基づく。

ブログに戻る