Floatplane System Theme Sync

Sync Floatplane theme with system theme based on system changes and page load

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey, Greasemonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

You will need to install an extension such as Tampermonkey to install this script.

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्क्रिप्ट व्यवस्थापक एक्स्टेंशन इंस्टॉल करावे लागेल.

(माझ्याकडे आधीच युझर स्क्रिप्ट व्यवस्थापक आहे, मला इंस्टॉल करू द्या!)

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

(माझ्याकडे आधीच युझर स्टाईल व्यवस्थापक आहे, मला इंस्टॉल करू द्या!)

// ==UserScript==
// @name         Floatplane System Theme Sync
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Sync Floatplane theme with system theme based on system changes and page load
// @author       EthanBezz
// @match        https://*.floatplane.com/*
// @grant        none
// @license      MIT
// ==/UserScript==

(() => {
    'use strict';

    const systemThemeQuery = window.matchMedia('(prefers-color-scheme: dark');
    const isSystemDark = () => systemThemeQuery.matches;
    const getFloatplaneTheme = () => JSON.parse(localStorage.getItem('fp:theme-preferred'));
    const isThemeMismatched = () => isSystemDark() !== (getFloatplaneTheme() === 'dark');
    const getThemeToggle = () =>
        [...document.querySelectorAll('a._dropdownItem_ouby8_1')]
            .find(menuItem => menuItem.textContent.includes('Mode'));

    new MutationObserver((_, observer) => {
        const themeToggle = getThemeToggle();
        if (themeToggle) {
            isThemeMismatched() && themeToggle.click();
            systemThemeQuery.addEventListener('change', () => isThemeMismatched() && getThemeToggle()?.click());
            observer.disconnect();
        }
    }).observe(document, { subtree: true, childList: true });
})();