【必読】なぜ今、Aura ではなく LWR を選ぶべきなのか?

【完全保存版】Salesforce LWRサイトに「ノーコードで色調整可能なダークモード」を実装するLWC(GitHub公開)

DXforce Point for Developers

Salesforceの最新ランタイムである LWR (Lightning Web Runtime) は、高速で柔軟なカスタマイズが可能ですが、サイト全体のテーマカラーを動的に切り替える「ダークモード」の実装には工夫が必要です。

CSSカスタムプロパティ(スタイリングフック)をJavaScriptで操作するのが基本ですが、以下のような課題に直面しがちです。

  1. 管理が大変: 色コードをJavaScriptにハードコーディングすると、微調整のたびにデプロイが必要になる。
  2. 標準コンポーネントの癖: 検索バーやレコードリストなど、一部の標準コンポーネントがグローバル変数に従ってくれない。
  3. スタイリングフックの数が膨大: どこをどう変えればいいか特定が難しい。

これらの課題を解決し、「開発者が一度導入すれば、あとはアドミンがビルダー画面で自由に色を設定できる」 高機能なダークモード切り替えボタンを作成しました。ソースコードはGitHubで公開しています。

コンポーネント紹介

DXforce Point for Developers

今回の記事で作成した「ダークモード切り替えコンポーネント」の全ソースコードをGitHubで公開しています。 ぜひ Clone して、あなたの組織で動かしてみてください。

コンポーネントの概要: darkModeToggle

このLWCコンポーネントをヘッダーやフッターに配置するだけで、サイト訪問者はワンクリックで「ライトモード/ダークモード」を切り替えられるようになります。設定はブラウザに保存されるため、次回訪問時も好みのモードが維持されます。

ライトモード
ダークモード

最大の特徴:ビルダーのプロパティパネルですべて完結

js-meta.xml にLWRの主要なスタイリングフックを網羅的に定義しました。これにより、エクスペリエンスビルダーのプロパティパネルにカラーピッカーが表示され、コードを一行も書かずに詳細な色設定が可能になります。

設定可能な項目(一部抜粋)

LWRサイトの [テーマ] > [色] や [テーマ] > [ボタン]から設定する項目を網羅しています。
さらに、テーブルや画面フローなどの設定も可能です。

  • 基本: 背景色、テキスト色、ブランドカラー、アイコン色
  • テキスト: H1~H6、本文、リンク色(ホバー含む)
  • フォーム: 入力欄の背景・文字・枠線・フォーカス時の色、チェックボックス
  • ボタン: Primary, Secondary, Tertiary それぞれの通常・ホバー・フォーカス時
  • 高度な設定: レコードリストのヘッダー背景、テーブル行のホバー色、画面フローの背景など

技術的な実装ポイント

このコンポーネントには、LWRサイト開発で役立ついくつかのテクニックが詰め込まれています。

スタイリングフックのマッピング

基本的には、ビルダーで設定された色を document.documentElement.style.setProperty を使用して、LWR標準のCSS変数(例: --dxp-g-root)に適用しています。これにより、サイト全体の色が一括で切り替わります。

applyTheme() {
    const style = document.documentElement.style;
    ...

    if (this.isDark) {
        // ダークモード設定
        darkKeys.forEach(key => {
            if (darkVars[key]) style.setProperty(key, darkVars[key]);
        });
        ...
    }
    ...
}

頑固な標準コンポーネントへのスタイル注入

検索バー(Input要素)の背景色や、レコードリストのテーブルヘッダーなど、標準のスタイリングフックだけでは色が適用されない(または詳細度で負けてしまう)箇所があります。 これに対応するため、JavaScriptから動的に <style> タグを生成し、!important 付きのCSSルールをヘッダーに注入する「オーバーライド機能」を実装しています。

// 例:標準テーブルの行ホバー色を強制的に上書きする処理
injectOverrideStyles() {
    // ...
    if (this.recListRowHoverColor) {
        cssRules.push(`
            tr:hover > td,
            .slds-table tbody tr:hover > td {
                background-color: ${this.recListRowHoverColor} !important;
            }
        `);
    }
    // ...
}

画面の高さ100%問題の解消

LWRサイトでよくある「コンテンツが少ない時やスクロール時に、Bodyの背景色が途切れて白い隙間が見える」という問題も、htmlbody タグに対して動的に背景色と min-height: 100vh を適用することで解決しています。

インストールと使用方法

ソースコードは以下のGitHubリポジトリで公開しています。

GitHub: dxforce-site/darkModeToggle

  1. 上記リポジトリからソースコードを取得し、Salesforce組織にデプロイします。
  2. エクスペリエンスビルダーを開き、Theme Header(または任意の場所)に Theme Toggle コンポーネントをドラッグ&ドロップします。
  3. プロパティパネルで、ダークモード時の各要素の色を指定します。(指定しない箇所はデフォルト設定または透過が適用されます)
  4. サイトを公開します。

まとめ

このコンポーネントを使えば、ブランドイメージを損なうことなく、ユーザーに優しいダークモードを提供できます。また、季節ごとのキャンペーンなどで「夜のテーマカラー」を変更したい場合も、開発者に依頼することなく運用担当者だけで完結できます。

ぜひ、あなたのLWRサイトにも導入してみてください。

DXforceの管理人

福島 瑛二

2013年にJavaエンジニアとしてのキャリアをスタート。2019年にSalesforceと出会い、Salesforceエンジニアの道へ。

デザインや UI/UX の観点からもシステムを捉え、ユーザーにとって心地よい体験を実装することにやりがいを感じています。

CRM(顧客データ)や Data Cloud と連携した高度なサイトを目に見える形で表現できる Experience Cloud に大きな可能性を見出しており、バックエンドのデータ構造とフロントエンドの表現力を極めることがこれからの Salesforce エンジニアに求められるスキルだと確信しています。

Trailblazer: efukushima

福島 瑛二をフォローする

読者の声

タイトルとURLをコピーしました