يمكنني التأكيد على أن الطريقة المذكورة أعلاه لا تزال تعمل، ولكن كان من الجيد عدم الاضطرار إلى كتابة التعليمات البرمجية من لقطة شاشة
لذا، إليك هي، محدثة قليلاً:
الخطوات
- ينتهي عرض إطار iframe الخاص بالتعليقات ويُرسل رسالة إلى نافذة المتصفح الرئيسية، لإعلامها بذلك.
- يستعلم المتصفح عن إعداد الوضع الداكن/الفاتح ويرسل القيمة مرة أخرى إلى إطار iframe.
- يستقبل إطار iframe الرسالة، ويضبط سمة بيانات (data-attribute) أو فئة (class) أو ما شابه، بناءً على إعداد الوضع الداكن/الفاتح.
التعليمات البرمجية
- بمجرد تحميل إطار iframe، أرسل إشعارًا إلى النافذة الأصلية. يجب إدخال هذا على Discourse، ضمن
Admin -> Customize -> (select theme) -> Edit CSS/HTML -> Embedded Header.
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
);
}
};
// استدعاء setFrameStyle عند تلقي رسالة "iframe loaded"
const handleMessageListener = (event) => {
var origin = event.origin;
if ((origin === discourse_url) && (event.data == "iframe loaded")) {
notifyIFrameOfTheme();
}
};
- في كتلة
scriptمن (1)، أضف مستمعًا لرسالة السمة التي أرسلتهاnotifyFrameStyle:
window.addEventListener("message", (event) => {
const payload = event.data;
if (payload.theme) {
// افعل شيئًا بإعداد السمة؛ لقد قمت بتعيين السمة `data-theme` على `html` الخاص بإطار iframe،
// ولكن قد ترغب في تعيين سمة فئة أو ما شابه
document.documentElement.setAttribute("data-theme", payload.theme);
}
}, false);
التصميم
ضمن Admin -> Customize -> (select theme) -> Edit CSS/HTML -> Embedded CSS، يمكنك الآن توفير CSS لكل وضع. على سبيل المثال، يمكنك تجاوز متغيرات تصميم Discourse:
html[data-theme="dark"] {
--primary: #ced6dd;
--primary-low: #48566b;
--secondary: #14181e;
--tertiary: #2b7e8d;
}
آمل أن يساعد هذا!