上記の方法で確認できましたが、スクリーンショットからコードを入力しなければならなかったのは残念です
以下に、少し更新したものを記載します。
手順
- コメントのiframeのレンダリングが完了し、メインのブラウザウィンドウにその旨を伝えるメッセージを送信します。
- ブラウザは、ダーク/ライトモードの設定を照会し、その値をiframeに返します。
- iframeはメッセージを受信し、ダーク/ライトモードの設定に基づいてdata-attribute、classなどを設定します。
コード
- iframeが読み込まれたら、親ウィンドウに通知を送信します。これは、Discourse の
管理者 -> カスタマイズ -> (テーマを選択) -> CSS/HTMLの編集 -> 埋め込みヘッダーに入力する必要があります。
window.addEventListener("load", (event) => {
window.parent.postMessage("iframe loaded", "*");
}, false);
- メインウィンドウでこの受信したトリガーを処理します。このコードはブログサイトに配置します。
const discourse_url = "https://your.discourse-instance.org";
// ここでテーマを決定し、テーマが何であるかをiframeに知らせるメッセージを送信します
// notifyFrameStyle を設定する方法については、以下を参照してください
const notifyIFrameOfTheme = () => {
const iframe = document.getElementById("discourse-embed-frame");
if (iframe && iframe.contentWindow) {
iframe.contentWindow.postMessage(
{
// ダークモードの設定をどのように保存しているかに応じて、以下の行をダークモード設定を取得するように変更してください
theme: document.documentElement.getAttribute("data-theme")
},
discourse_url
);
}
};
// "iframe loaded" メッセージを受信したときに setFrameStyle を呼び出します
const handleMessageListener = (event) => {
var origin = event.origin;
if ((origin === discourse_url) && (event.data == "iframe loaded")) {
notifyIFrameOfTheme();
}
};
- (1) の
scriptブロックで、notifyFrameStyleによって送信されたテーマメッセージのリスナーを追加します。
window.addEventListener("message", (event) => {
const payload = event.data;
if (payload.theme) {
// テーマ設定で何かを行う。私はiframeの `html` に `data-theme` 属性を設定しましたが、
// class属性などを設定したい場合もあります
document.documentElement.setAttribute("data-theme", payload.theme);
}
}, false);
スタイリング
管理者 -> カスタマイズ -> (テーマを選択) -> CSS/HTMLの編集 -> 埋め込みCSS で、各モードのCSSを提供できるようになります。例えば、Discourseのスタイリング変数をオーバーライドできます。
html[data-theme="dark"] {
--primary: #ced6dd;
--primary-low: #48566b;
--secondary: #14181e;
--tertiary: #2b7e8d;
}
お役に立てれば幸いです!