diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ar/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ar/messages.json new file mode 100644 index 0000000..aabf92d --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ar/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "إضافة موقع إلى القائمة" + }, + "automation": { + "message": "التلقائية" + }, + "brightness": { + "message": "السطوع" + }, + "change_browser_theme": { + "message": "تغيير تنسيق المتصفح" + }, + "contrast": { + "message": "التباين" + }, + "custom_browser_theme_off": { + "message": "الافتراضي" + }, + "custom_browser_theme_on": { + "message": "مخصص" + }, + "dark": { + "message": "مظلم" + }, + "donate": { + "message": "التبرع" + }, + "engine_dynamic": { + "message": "ديناميكي" + }, + "engine_filter": { + "message": "فلتر" + }, + "engine_filter_plus": { + "message": "فلتر+" + }, + "engine_static": { + "message": "ثابت" + }, + "extension_description": { + "message": "الوضع المظلم لجميع المواقع. اعتن بعينيك، استعمل التنسيق الداكن للتصفح اليومي في الليل." + }, + "filter": { + "message": "الفلتر" + }, + "grayscale": { + "message": "التدرج الرمادي" + }, + "help": { + "message": "المساعدة" + }, + "invert_listed_only": { + "message": "عكس المدرجة فقط" + }, + "latitude": { + "message": "خط العرض" + }, + "light": { + "message": "فاتح" + }, + "loading_please_wait": { + "message": "جار التحميل، يرجى الانتظار" + }, + "longitude": { + "message": "خط الطول" + }, + "mode": { + "message": "الوضع" + }, + "more": { + "message": "المزيد" + }, + "news": { + "message": "الأخبار" + }, + "not_invert_listed": { + "message": "عدم عكس المدرجة" + }, + "off": { + "message": "معطّل" + }, + "on": { + "message": "مفعّل" + }, + "only_for": { + "message": "فقط لـ" + }, + "only_for_description": { + "message": "تطبيق الإعدادات للموقع الحالي فقط" + }, + "open_dev_tools": { + "message": "أدوات المطور" + }, + "page_in_dark_list": { + "message": "هذه الصفحة موجودة في قائمة\nالمواقع المظلمة العامة" + }, + "page_protected": { + "message": "هذه الصفحة محمية\nمن قبل المتصفح" + }, + "privacy": { + "message": "الخصوصية" + }, + "read_more": { + "message": "قراءة المزيد" + }, + "select_font": { + "message": "اختر الخط" + }, + "sepia": { + "message": "البني" + }, + "set_active_hours": { + "message": "تعيين الساعات النشطة" + }, + "set_location": { + "message": "تفعيل بعد غروب الشمس في الموقع" + }, + "setup_add_site_hotkey": { + "message": "تعيين مفتاح اختصار لإضافة المواقع" + }, + "setup_hotkey_toggle_extension": { + "message": "إعداد الإضافة\nمفتاح اختصار التبديل" + }, + "setup_hotkey_toggle_site": { + "message": "إعداد الموقع الحالي\nمفتاح اختصار التبديل" + }, + "site_list": { + "message": "قائمة المواقع" + }, + "store_listing": { + "message": "تقوم هذه الإضافة بتفعيل الوضع الليلي عن طريق إنشاء تنسيقات مظلمة للمواقع أثناء التنقل. يقوم Dark Reader بعكس الألوان الساطعة لجعلها عالية التباين وسهلة القراءة في الليل.\n\nبإمكانك ضبط السطوع، التباين، الفلتر البني، الوضع المظلم، إعدادات الخط وقائمة التجاهل.\n\nقد نطلب منك دعم تطوير التطبيق من خلال تبرع. قد ترى أخبارًا حول Dark Reader في قائمة الإعدادات المنبثقة. هناك أدوات المطور للمستخدمين ذوي الخبرة.\n\nلا يقوم Dark Reader بعرض إعلانات ولا يقوم بإرسال بيانات المستخدم إلى أي مكان. الإضافة مفتوحة المصدر بالكامل https://github.com/darkreader/darkreader\n\nقبل التثبيت قم بتعطيل الإضافات المماثلة. استمتع بالمشاهدة!" + }, + "system_dark_mode": { + "message": "استعمال نظام ألوان النظام" + }, + "system_dark_mode_description": { + "message": "تفعيل عندما يكون الوضع المظلم للنظام مفعّلاً" + }, + "text_stroke": { + "message": "عرض النص" + }, + "theme_generation_mode": { + "message": "وضع توليد التنسيق" + }, + "toggle_current_site": { + "message": "تبديل الموقع الحالي" + }, + "toggle_extension": { + "message": "تبديل الإضافة" + }, + "try_experimental_theme_engines": { + "message": "قم بتجربة محركات التنسيقات **التجريبية**:\n**فلتر+** يحتفظ بتشبع الألوان، يستعمل GPU\n**التنسيق الثابت** يقوم بتوليد تنسيق بسيط وسريع\n**التنسيق الديناميكي** يقوم بتحليل الألوان والصور" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/be/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/be/messages.json new file mode 100644 index 0000000..072b4ee --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/be/messages.json @@ -0,0 +1,155 @@ +{ + "extension_description": { + "message": "Цёмная Тэма для кожнага сайта. Беражыце свае вочы, карыстайцеся Дарк Рыдарам для начнога ці штодзённага прагляду вэб-старонак." + }, + "loading_please_wait": { + "message": "Ідзе загрузка, пачакайце" + }, + "on": { + "message": "Укл." + }, + "off": { + "message": "Выкл." + }, + "toggle_current_site": { + "message": "Пераключыць гэты сайт" + }, + "setup_hotkey_toggle_site": { + "message": "Усталюйце спалучэнне\nклавіш" + }, + "toggle_extension": { + "message": "Укл/выкл Дарк Рыдар" + }, + "setup_hotkey_toggle_extension": { + "message": "Уст. спалучэнне\nклавіш" + }, + "automation": { + "message": "Аўтаматызацыя" + }, + "set_active_hours": { + "message": "Усталюйце перыяд актыўнасці" + }, + "set_location": { + "message": "Уключыць пасля захода сонца" + }, + "longitude": { + "message": "Даўгата" + }, + "latitude": { + "message": "Шырата" + }, + "page_protected": { + "message": "Гэтая старонка ахоўваецца\nбраўзэрам" + }, + "page_in_dark_list": { + "message": "Гэтая старонка ў глаб.\nспісе Цёмных Сайтаў" + }, + "system_dark_mode": { + "message": "Выкарыстоўваць сістэмныя колеры" + }, + "system_dark_mode_description": { + "message": "Уключыць калі сістэмны начны рэжым актыўны" + }, + "filter": { + "message": "Фільтр" + }, + "mode": { + "message": "Рэжым" + }, + "dark": { + "message": "Цёмны" + }, + "light": { + "message": "Светлы" + }, + "brightness": { + "message": "Яркасць" + }, + "contrast": { + "message": "Кантраснасць" + }, + "grayscale": { + "message": "Адценні шэрага" + }, + "sepia": { + "message": "Сэпія" + }, + "only_for": { + "message": "Толькі для" + }, + "only_for_description": { + "message": "Прымяніць налады толькі да гэтага сайта" + }, + "site_list": { + "message": "Спіс" + }, + "invert_listed_only": { + "message": "Інверт. толькі гэтыя" + }, + "not_invert_listed": { + "message": "Ня інвертаваць" + }, + "add_site_to_list": { + "message": "Дадаць сайт у спіс" + }, + "setup_add_site_hotkey": { + "message": "Уст. спалуч. клавіш для даб. сайта ў спіс" + }, + "more": { + "message": "Яшчэ" + }, + "select_font": { + "message": "Выберыце шрыфт" + }, + "text_stroke": { + "message": "Абводка тэксту" + }, + "try_experimental_theme_engines": { + "message": "Апрабуйце **эксперыментальныя** рэжымы:\n**Фільтр+** зах. яркасць колераў, выкарыстоўвае GPU\n**Статычны рэжым** стварае простую тэму\n**Дынамічны** аналізуе колеры і карцінкі" + }, + "engine_filter": { + "message": "Фільтр" + }, + "engine_filter_plus": { + "message": "Фільтр+" + }, + "engine_static": { + "message": "Стат." + }, + "engine_dynamic": { + "message": "Дынам." + }, + "theme_generation_mode": { + "message": "Рэжым генерацыi тэмы" + }, + "custom_browser_theme_on": { + "message": "Асаблiвая" + }, + "custom_browser_theme_off": { + "message": "Агаданая" + }, + "change_browser_theme": { + "message": "Змяніць тэму браўзэра" + }, + "privacy": { + "message": "Пагад." + }, + "help": { + "message": "Даведка" + }, + "donate": { + "message": "Падтрымка" + }, + "news": { + "message": "Навіны" + }, + "read_more": { + "message": "Чытаць яшчэ" + }, + "open_dev_tools": { + "message": "Прылады" + }, + "store_listing": { + "message": "Гэта пашырэнне пераводзіць браўзэр у начны рэжым. Дарк Рыдар замяняе светлы фон цёмным, што зніжае стомленасць вачэй пры доўгай працы за кампутарам альбо пры праглядзе вэб-старонак ноччу.\n\nМаецца магчымасць наладжваць яркасць, кантраснасць, шрыфт, рэжым інверсіі, рэжым накладання жоўтага фільтра (сэпія).\n\nМы можам папрасіць вас падтрымаць распрацоўку прыкладання ахвяраваннем. Вы можаце ўбачыць навіны аб Dark Reader ва ўсплывальным акне налад. Ёсць інструменты распрацоўшчыка для вопытных карыстальнікаў.\n\nDark Reader ня ўбудоўвае рэкламу і не збірае дадзеныя карыстальніка, увесь зыходны код адкрыты https://github.com/darkreader/darkreader\n\nПерад усталёўкай адключыце падобныя пашырэнні. Прыемнага прагляду!" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/bn/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/bn/messages.json new file mode 100644 index 0000000..7341f41 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/bn/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "লিস্টে সাইট যোগ করুন" + }, + "automation": { + "message": "স্বয়ংক্রিয়করণ" + }, + "brightness": { + "message": "উজ্জ্বলতা" + }, + "change_browser_theme": { + "message": "ব্রাউজার থিম পরিবর্তন করুন" + }, + "contrast": { + "message": "কনট্রাস্ট" + }, + "custom_browser_theme_off": { + "message": "ডিফল্ট" + }, + "custom_browser_theme_on": { + "message": "কাস্টম" + }, + "dark": { + "message": "ডার্ক" + }, + "donate": { + "message": "অনুদান" + }, + "engine_dynamic": { + "message": "ডায়নামিক" + }, + "engine_filter": { + "message": "ফিল্টার" + }, + "engine_filter_plus": { + "message": "ফিল্টার+" + }, + "engine_static": { + "message": "স্ট্যাটিক" + }, + "extension_description": { + "message": "প্রত্যেক ওয়েবসাইটের জন্য ডার্কমোড। নিজ চোখের যত্ম নিন, নিত্যকার ব্রাউজিং এর জন্য ব্যবহার করুন ডার্ক থিম।" + }, + "filter": { + "message": "ফিল্টার" + }, + "grayscale": { + "message": "গ্রে-স্কেল" + }, + "help": { + "message": "সহায়তা" + }, + "invert_listed_only": { + "message": "কেবল ইনভার্ট লিস্টেড" + }, + "latitude": { + "message": "অক্ষাংশ" + }, + "light": { + "message": "লাইট" + }, + "loading_please_wait": { + "message": "লোড হচ্ছে, অনুগ্রহ করে অপেক্ষা করুন" + }, + "longitude": { + "message": "দ্রাঘিমা" + }, + "mode": { + "message": "মোড" + }, + "more": { + "message": "আরও" + }, + "news": { + "message": "বার্তা" + }, + "not_invert_listed": { + "message": "ইনভার্ট লিস্টেড নয়" + }, + "off": { + "message": "অফ" + }, + "on": { + "message": "অন" + }, + "only_for": { + "message": "অনলি ফর" + }, + "only_for_description": { + "message": "শুধু বর্তমান ওয়েবসাইটের জন্য সেটিংস কার্যকর করুন" + }, + "open_dev_tools": { + "message": "ডেভেলপার টুলস" + }, + "page_in_dark_list": { + "message": "এই সাইটটি গ্লোবাল\nডার্ক লিস্টে আছে" + }, + "page_protected": { + "message": "এই পেজটি প্রোটেক্টেড\nব্রাউজার দ্বারা" + }, + "privacy": { + "message": "গোপনীয়তা" + }, + "read_more": { + "message": "আরও পড়ুন" + }, + "select_font": { + "message": "ফন্ট বাছাই করুন" + }, + "sepia": { + "message": "সেপিয়া" + }, + "set_active_hours": { + "message": "সক্রিয় কাল সেট করুন" + }, + "set_location": { + "message": "সূর্যাস্তের পরে লোকেশনে সক্রিয় করুন" + }, + "setup_add_site_hotkey": { + "message": "সাইট অ্যাড করার হট-কী সেটাপ করুন" + }, + "setup_hotkey_toggle_extension": { + "message": "এক্সটেনসন ঠিক করুন\nটগল কী" + }, + "setup_hotkey_toggle_site": { + "message": "বর্তমান সাইট সেটাপ করুন\nটগল কী" + }, + "site_list": { + "message": "সাইট লিস্ট" + }, + "store_listing": { + "message": "এই আই-কেয়ার এক্সটেনশান কোন ব্যাঘাত ছাড়া ওয়েবসাইটের জন্য ডার্ক থিম তৈরি করে নাইট মোড এনাবলে সহায়তা করে। ডার্ক রিডার উজ্জ্বল রঙগুলিকে পাল্টে এগুলোর মধ্যে হাই কনট্রাস্ট তৈরি করে এবং রাতে পঠন সহজ করে তোলে।\n\nআপনি উজ্জ্বলতা, কনট্রাস্ট, সেপিয়া ফিল্টার, ডার্ক মোড, ফন্ট সেটিংস এবং ইগনোর-লিস্ট সমন্বয় করতে পারেন।\n\nআমরা আপনাকে অনুদান দিয়ে অ্যাপটির বিকাশে সহায়তা করতে বলতে পারি। আপনি সেটিংস পপআপে ডার্ক রিডার সম্পর্কে খবর দেখতে পারেন। অভিজ্ঞ ব্যবহারকারীদের জন্য বিকাশকারী সরঞ্জাম রয়েছে।\n\nDark Reader বিজ্ঞাপন দেখায় না এবং ব্যবহারকারীর ডেটা কোথাও প্রেরণ করে না। এটি সম্পূর্ণ ওপেন সোর্স https://github.com/darkreader/darkreader\n\nইনস্টল করার আগে অনুরূপ এক্সটেনশন ডিজ্যাবল করুন এবং এক্সটেনশনটি উপভোগ করুন!" + }, + "system_dark_mode": { + "message": "সিস্টেম কালার স্কিম ব্যবহার করুন" + }, + "system_dark_mode_description": { + "message": "যখন সিস্টেম মোড চালু আছে তখন চালু করুন" + }, + "text_stroke": { + "message": "টেক্সট স্ট্রোক" + }, + "theme_generation_mode": { + "message": "থিম জেনারেশন মোড" + }, + "toggle_current_site": { + "message": "বর্তমান সাইটে টগল করুন" + }, + "toggle_extension": { + "message": "এক্সটেনশন টগল করুন" + }, + "try_experimental_theme_engines": { + "message": "**পরীক্ষামূলক** থিম ইঞ্জিন টেস্ট করুন:\n**ফিল্টার+** কালার স্যাচুরেশন রক্ষা করে, GPU ব্যবহার করে\n**স্ট্যাটিক থিম** দ্রুত একটি সিম্পল থিম তৈরি করে\n**ডায়নামিক থিম** রঙ ও ছবি বিশ্লেষণ করে" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/cs/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/cs/messages.json new file mode 100644 index 0000000..e1e8aaa --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/cs/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Přidat stránku do seznamu" + }, + "automation": { + "message": "Automatizace" + }, + "brightness": { + "message": "Jas" + }, + "change_browser_theme": { + "message": "Změnit motiv prohlížeče" + }, + "contrast": { + "message": "Kontrast" + }, + "custom_browser_theme_off": { + "message": "Původní nastavení" + }, + "custom_browser_theme_on": { + "message": "Vlastní nastavení" + }, + "dark": { + "message": "Tmavý" + }, + "donate": { + "message": "Přispějte" + }, + "engine_dynamic": { + "message": "Dynamic." + }, + "engine_filter": { + "message": "Filtr" + }, + "engine_filter_plus": { + "message": "Filtr+" + }, + "engine_static": { + "message": "Statický" + }, + "extension_description": { + "message": "Tmavý motiv pro každou stránku. Používejte Dark Reader pro celodenní prohlížení webu a šetřete tak své oči." + }, + "filter": { + "message": "Filtr" + }, + "grayscale": { + "message": "Odstíny šedé" + }, + "help": { + "message": "Nápověda" + }, + "invert_listed_only": { + "message": "Invertovat stránky" + }, + "latitude": { + "message": "Zeměpisná šířka" + }, + "light": { + "message": "Světlý" + }, + "loading_please_wait": { + "message": "Načítání, prosím čekejte" + }, + "longitude": { + "message": "Zeměpisná délka" + }, + "mode": { + "message": "Režim" + }, + "more": { + "message": "Více" + }, + "news": { + "message": "Novinky" + }, + "not_invert_listed": { + "message": "Neinvertovat" + }, + "off": { + "message": "Vyp" + }, + "on": { + "message": "Zap" + }, + "only_for": { + "message": "Pouze pro" + }, + "only_for_description": { + "message": "Aplikovat nastavení pouze pro současnou stránku" + }, + "open_dev_tools": { + "message": "Nástroje" + }, + "page_in_dark_list": { + "message": "Tato stránka je v seznamu\nstránek s tmavým motivem" + }, + "page_protected": { + "message": "Tato stránka je chráněna\nprohlížečem" + }, + "privacy": { + "message": "Soukromí" + }, + "read_more": { + "message": "Více..." + }, + "select_font": { + "message": "Vybrat písmo" + }, + "sepia": { + "message": "Sépie" + }, + "set_active_hours": { + "message": "Změňte doby aktivního používání" + }, + "set_location": { + "message": "Aktivace po západu slunce na místě" + }, + "setup_add_site_hotkey": { + "message": "Nastavit klávesovou zkratku pro přidání stránky" + }, + "setup_hotkey_toggle_extension": { + "message": "Nastavit klávesovou\npro přepínání rozšíř." + }, + "setup_hotkey_toggle_site": { + "message": "Nastavit kláv. zkratku\npro přep. současné stránky" + }, + "site_list": { + "message": "Seznam" + }, + "store_listing": { + "message": "Toto k očím šetrné rozšíření přepíná stránky do nočního režimu tím, že je samo převádí do tmavého motivu. Dark Reader invertuje jasné barvy tak, aby byly kontrastní a lehce čitelné v noci.\n\nMůžete upravit jas, kontrast, sépiový filtr, tmavý mód, nastavení písma a seznam ignorovaných stránek.\n\nMůžeme vás požádat, abyste podpořili vývoj aplikace darem. Novinky o Dark Reader můžete vidět ve vyskakovacím okně nastavení. Pro zkušené uživatele existují nástroje pro vývojáře.\n\nDark Reader neobsahuje reklamy a nikam neodesílá data uživatele. Projekt je plně open-source a repositář je možné nalézt na https://github.com/darkreader/darkreader\n\nPřed instalací vypněte všechna podobná rozšíření. Přejeme příjemné surfování!" + }, + "system_dark_mode": { + "message": "Použít barevný systém schéma" + }, + "system_dark_mode_description": { + "message": "Aktivovat při zapnutém systému dark režim" + }, + "text_stroke": { + "message": "Tloušťka písma" + }, + "theme_generation_mode": { + "message": "Generátor motivů" + }, + "toggle_current_site": { + "message": "Přepnout současnou stránku" + }, + "toggle_extension": { + "message": "Přepnout rozšíření" + }, + "try_experimental_theme_engines": { + "message": "Vyzkoušejte **experimentální** generátory motivů:\n**Filter+** zachovává sytost barev, používá GPU\n**Statický motiv** generuje rychlý a jednoduchý motiv\n**Dynamický motiv** analyzuje barvy a obrázky" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/de/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/de/messages.json new file mode 100644 index 0000000..6479383 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/de/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Webseite zur Liste hinzufügen" + }, + "automation": { + "message": "Automatisierung" + }, + "brightness": { + "message": "Helligkeit" + }, + "change_browser_theme": { + "message": "Browserdesign" + }, + "contrast": { + "message": "Kontrast" + }, + "custom_browser_theme_off": { + "message": "Standard" + }, + "custom_browser_theme_on": { + "message": "Angepasst" + }, + "dark": { + "message": "Dunkel" + }, + "donate": { + "message": "Spenden" + }, + "engine_dynamic": { + "message": "Dynam." + }, + "engine_filter": { + "message": "Filter" + }, + "engine_filter_plus": { + "message": "Filter+" + }, + "engine_static": { + "message": "Statisch" + }, + "extension_description": { + "message": "Dunkles Design für jede Website. Schonen Sie Ihre Augen und verwenden Sie Dark Reader für die Nacht und das tägliche Surfen." + }, + "filter": { + "message": "Filter" + }, + "grayscale": { + "message": "Graustufen" + }, + "help": { + "message": "Hilfe" + }, + "invert_listed_only": { + "message": "Nur invertieren" + }, + "latitude": { + "message": "Breitengrad" + }, + "light": { + "message": "Hell" + }, + "loading_please_wait": { + "message": "Lädt, bitte warten" + }, + "longitude": { + "message": "Längengrad" + }, + "mode": { + "message": "Modus" + }, + "more": { + "message": "Mehr" + }, + "news": { + "message": "Neuigkeiten" + }, + "not_invert_listed": { + "message": "Nicht invertieren" + }, + "off": { + "message": "Aus" + }, + "on": { + "message": "Ein" + }, + "only_for": { + "message": "Nur für" + }, + "only_for_description": { + "message": "Einstellungen nur auf aktuelle Domain anwenden" + }, + "open_dev_tools": { + "message": "Erweitert" + }, + "page_in_dark_list": { + "message": "Seite befindet sich auf der\npermanenten Dunkel-Liste" + }, + "page_protected": { + "message": "Diese Seite ist durch\nden Browser geschützt" + }, + "privacy": { + "message": "Datenschutz" + }, + "read_more": { + "message": "Weiterlesen" + }, + "select_font": { + "message": "Schriftart auswählen" + }, + "sepia": { + "message": "Sepia" + }, + "set_active_hours": { + "message": "Nutzungszeit ändern" + }, + "set_location": { + "message": "Nach lokalem Sonnenuntergang aktivieren" + }, + "setup_add_site_hotkey": { + "message": "Hotkey zum Hinzufügen der Seite festlegen" + }, + "setup_hotkey_toggle_extension": { + "message": "Hotkey zum (de)aktivieren\nder Erweiterung" + }, + "setup_hotkey_toggle_site": { + "message": "Hotkey zum Umschalten der\naktuellen Webseite einrichten" + }, + "site_list": { + "message": "Websiteliste" + }, + "store_listing": { + "message": "Zum Schutz der Augen ermöglicht diese Erweiterung das Erstellen dunkler Farblayouts für Webseiten. Dabei invertiert Dark Reader helle Farben, macht sie kontrastreich und nachts gut lesbar.\n\nHelligkeit, Kontrast, Sepia-Filter, Dark-Modus, Schrifteinstellungen und Ignorier-Liste können manuell verwaltet und individuell eingestellt werden.\n\nWir können Sie bitten, die Entwicklung der App mit einer Spende zu unterstützen. Möglicherweise sehen Sie im Einstellungs-Popup Neuigkeiten über Dark Reader. Es gibt Entwicklertools für erfahrene Benutzer.\n\nDark Reader zeigt dabei keine Werbung und sendet keine Benutzerdaten irgendwohin. Es ist komplett quelloffen: https://github.com/darkreader/darkreader\n\nBeachten Sie, dass Sie ähnliche Erweiterungen deaktivieren sollen, bevor Sie Dark Reader installieren. Viel Spaß beim angenehmeren Surfen!" + }, + "system_dark_mode": { + "message": "Systemfarben verwenden" + }, + "system_dark_mode_description": { + "message": "Aktivieren, wenn das System dunkel ist" + }, + "text_stroke": { + "message": "Textstärke" + }, + "theme_generation_mode": { + "message": "Verfahren zur Stylegenerierung" + }, + "toggle_current_site": { + "message": "Aktuelle Seite umschalten" + }, + "toggle_extension": { + "message": "Erweiterung" + }, + "try_experimental_theme_engines": { + "message": "Probiere **experimentelle** Style-Engines aus:\n**Filter+** bewahrt die Farbsättigung, verwendet GPU\n**Statisches** generiert einfaches schnelles Design\n**Dynamisches Thema** analysiert Farben und Bilder" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/el/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/el/messages.json new file mode 100644 index 0000000..c16931b --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/el/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Προσθήκη σελίδας στη λίστα" + }, + "automation": { + "message": "Αυτοματοποίηση" + }, + "brightness": { + "message": "Φωτεινότητα" + }, + "change_browser_theme": { + "message": "Αλλαγή θέματος προγράμματος περιήγησης" + }, + "contrast": { + "message": "Αντίθεση" + }, + "custom_browser_theme_off": { + "message": "Προεπιλογή" + }, + "custom_browser_theme_on": { + "message": "Προσαρμοσμένη" + }, + "dark": { + "message": "Σκούρα" + }, + "donate": { + "message": "Δωρεά" + }, + "engine_dynamic": { + "message": "Δυναμικό" + }, + "engine_filter": { + "message": "Φίλτρο" + }, + "engine_filter_plus": { + "message": "Φίλτρο+" + }, + "engine_static": { + "message": "Στατικό" + }, + "extension_description": { + "message": "Σκούρα εμφάνιση για όλες τις ιστοσελίδες. Φροντίστε τα μάτια σας κάνοντας χρήση σκούρας εμφάνισης στο καθημερινό σας σερφάρισμα." + }, + "filter": { + "message": "Φίλτρο" + }, + "grayscale": { + "message": "Ασπρόμαυρο" + }, + "help": { + "message": "Βοήθεια" + }, + "invert_listed_only": { + "message": "Αντίστροφη λίστα" + }, + "latitude": { + "message": "Γεωγραφικό πλάτος" + }, + "light": { + "message": "Φωτεινή" + }, + "loading_please_wait": { + "message": "Φόρτωση, παρακαλώ περιμένετε" + }, + "longitude": { + "message": "Γεωγραφικό μήκος" + }, + "mode": { + "message": "Εμφάνιση" + }, + "more": { + "message": "Περισσότερα" + }, + "news": { + "message": "Νέα" + }, + "not_invert_listed": { + "message": "Όχι αντίστροφη" + }, + "off": { + "message": "Off" + }, + "on": { + "message": "On" + }, + "only_for": { + "message": "Μόνο για" + }, + "only_for_description": { + "message": "Ενεργοποίηση μόνο στην τρέχουσα σελίδα" + }, + "open_dev_tools": { + "message": "Εργαλεία" + }, + "page_in_dark_list": { + "message": "Περιλαμβάνεται στην\nκαθολική Σκούρα Λίστα" + }, + "page_protected": { + "message": "Η σελίδα αυτή\nπροστατεύεται" + }, + "privacy": { + "message": "Ιδιωτικότητα" + }, + "read_more": { + "message": "Διαβάστε περισσότερα" + }, + "select_font": { + "message": "Επιλογή γραμματοσειράς" + }, + "sepia": { + "message": "Sepia" + }, + "set_active_hours": { + "message": "Ορισμός ενεργών ωρών" + }, + "set_location": { + "message": "Ενεργοποιήστε μετά το ηλιοβασίλεμα στη θέση" + }, + "setup_add_site_hotkey": { + "message": "Ρυθμίσεις hotkey για προσθήκη σελίδας" + }, + "setup_hotkey_toggle_extension": { + "message": "Ρυθμίσεις πρόσθετου\nαλλαγή hotkey" + }, + "setup_hotkey_toggle_site": { + "message": "Ρυθμίσεις τρέχουσας σελίδας\nαλλαγή hotkey" + }, + "site_list": { + "message": "Λίστα" + }, + "store_listing": { + "message": "Αυτό το θεαματικό πρόσθετο, μετατρέπει ζωντανά τις ιστοσελίδες που επισκέπτεστε σε σκούρες. Το Dark Reader αντιστρέφει τα χρώματα δημιουργώντας έντονη αντίθεση για ευκολότερη ανάγνωση κατά τις βραδυνές ώρες.\n\nΜπορείτε να προσαρμόσετε φωτεινότητα, αντίθεση, φίλτρο sepia, σκούρα εμφάνιση και λίστα ιστσελίδων στις οποίες το πρόσθετο δεν θα παρεμβαίνει.\n\nΜπορεί να σας ζητήσουμε να υποστηρίξετε την ανάπτυξη της εφαρμογής με μια δωρεά. Μπορεί να δείτε νέα σχετικά με το Dark Reader στο αναδυόμενο παράθυρο ρυθμίσεων. Υπάρχουν Εργαλεία προγραμματιστών για έμπειρους χρήστες.\n\nΤο Dark Reader δεν εμφανίζει διαφιμήσεις ούτε κάνει οποιαδήποτε αποστολή στατιστικών/πληροφορίών του χρήστη. Είναι 100% ανοικτού κώδικά https://github.com/darkreader/darkreader\n\nΠριν εγκαταστήσετε το πρόσθετο αυτό θα πρέπει να αφαιρέσετε παρόμοια πρόσθετα. Καλό σερφάρισμα!" + }, + "system_dark_mode": { + "message": "Χρησιμοποιήστε το συνδυασμό χρωμάτων του συστήματος" + }, + "system_dark_mode_description": { + "message": "Ενεργοποιείται στη σκοτεινή λειτουργία συστήματος" + }, + "text_stroke": { + "message": "Σκιά γραμμάτων" + }, + "theme_generation_mode": { + "message": "Λειτουργία δημιουργίας θέματος" + }, + "toggle_current_site": { + "message": "Αλλαγή τρέχουσας σελίδας" + }, + "toggle_extension": { + "message": "Εναλλαγή πρόσθετου" + }, + "try_experimental_theme_engines": { + "message": "Δοκιμάστε τις **πειραματικές** μηχανές θεμάτων:\n**Φίλτρο+** διατήρηση κορεσμού χρωμάτων\n**Στατικό θέμα** χρήση απλού, γρήγορου θέματος\n**Δυναμικό θέμα** ανάλυση χρωμάτων και εικόνων" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/en/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/en/messages.json new file mode 100644 index 0000000..a85506e --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/en/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Add site to list" + }, + "automation": { + "message": "Automation" + }, + "brightness": { + "message": "Brightness" + }, + "change_browser_theme": { + "message": "Change the browser theme" + }, + "contrast": { + "message": "Contrast" + }, + "custom_browser_theme_off": { + "message": "Default" + }, + "custom_browser_theme_on": { + "message": "Custom" + }, + "dark": { + "message": "Dark" + }, + "donate": { + "message": "Donate" + }, + "engine_dynamic": { + "message": "Dynamic" + }, + "engine_filter": { + "message": "Filter" + }, + "engine_filter_plus": { + "message": "Filter+" + }, + "engine_static": { + "message": "Static" + }, + "extension_description": { + "message": "Dark mode for every website. Take care of your eyes, use dark theme for night and daily browsing." + }, + "filter": { + "message": "Filter" + }, + "grayscale": { + "message": "Grayscale" + }, + "help": { + "message": "Help" + }, + "invert_listed_only": { + "message": "Invert listed only" + }, + "latitude": { + "message": "Latitude" + }, + "light": { + "message": "Light" + }, + "loading_please_wait": { + "message": "Loading, please wait" + }, + "longitude": { + "message": "Longitude" + }, + "mode": { + "message": "Mode" + }, + "more": { + "message": "More" + }, + "news": { + "message": "News" + }, + "not_invert_listed": { + "message": "Not invert listed" + }, + "off": { + "message": "Off" + }, + "on": { + "message": "On" + }, + "only_for": { + "message": "Only for" + }, + "only_for_description": { + "message": "Apply settings to current website only" + }, + "open_dev_tools": { + "message": "Dev tools" + }, + "page_in_dark_list": { + "message": "This site is in global\nDark List" + }, + "page_protected": { + "message": "This page is protected\nby browser" + }, + "privacy": { + "message": "Privacy" + }, + "read_more": { + "message": "Read more" + }, + "select_font": { + "message": "Select a font" + }, + "sepia": { + "message": "Sepia" + }, + "set_active_hours": { + "message": "Set active hours" + }, + "set_location": { + "message": "Activate after sunset at location" + }, + "setup_add_site_hotkey": { + "message": "Setup a hotkey for adding site" + }, + "setup_hotkey_toggle_extension": { + "message": "Setup extension\ntoggle hotkey" + }, + "setup_hotkey_toggle_site": { + "message": "Setup current site\ntoggle hotkey" + }, + "site_list": { + "message": "Site list" + }, + "store_listing": { + "message": "This eye-care extension enables night mode by creating dark themes for websites on the fly. Dark Reader inverts bright colors, making them high contrast and easy to read at night.\n\nYou can adjust the brightness, contrast, sepia filter, dark mode, font settings and the ignore-list.\n\nWe may ask you to support the development of the app with a donation. You may see news about Dark Reader in the settings popup. There are Developer Tools for experienced users.\n\nDark Reader doesn't show ads and doesn't send users' data anywhere. It's fully open-source: https://github.com/darkreader/darkreader\n\nBefore you install it, disable similar extensions. Enjoy watching!" + }, + "system_dark_mode": { + "message": "Use system color scheme" + }, + "system_dark_mode_description": { + "message": "Activate when system dark mode is on" + }, + "text_stroke": { + "message": "Text stroke" + }, + "theme_generation_mode": { + "message": "Theme generation mode" + }, + "toggle_current_site": { + "message": "Toggle current site" + }, + "toggle_extension": { + "message": "Toggle extension" + }, + "try_experimental_theme_engines": { + "message": "Try out **experimental** theme engines:\n**Filter+** preserves colors saturation, uses GPU\n**Static theme** generates a simple fast theme\n**Dynamic theme** analyzes colors and images" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/en_GB/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/en_GB/messages.json new file mode 100644 index 0000000..d3bc172 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/en_GB/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Add site to list" + }, + "automation": { + "message": "Automation" + }, + "brightness": { + "message": "Brightness" + }, + "change_browser_theme": { + "message": "Change the browser theme" + }, + "contrast": { + "message": "Contrast" + }, + "custom_browser_theme_off": { + "message": "Default" + }, + "custom_browser_theme_on": { + "message": "Custom" + }, + "dark": { + "message": "Dark" + }, + "donate": { + "message": "Donate" + }, + "engine_dynamic": { + "message": "Dynamic" + }, + "engine_filter": { + "message": "Filter" + }, + "engine_filter_plus": { + "message": "Filter+" + }, + "engine_static": { + "message": "Static" + }, + "extension_description": { + "message": "Dark mode for every website. Take care of your eyes, use dark theme for night and daily browsing." + }, + "filter": { + "message": "Filter" + }, + "grayscale": { + "message": "Grayscale" + }, + "help": { + "message": "Help" + }, + "invert_listed_only": { + "message": "Invert listed only" + }, + "latitude": { + "message": "Latitude" + }, + "light": { + "message": "Light" + }, + "loading_please_wait": { + "message": "Loading, please wait" + }, + "longitude": { + "message": "Longitude" + }, + "mode": { + "message": "Mode" + }, + "more": { + "message": "More" + }, + "news": { + "message": "News" + }, + "not_invert_listed": { + "message": "Not invert listed" + }, + "off": { + "message": "Off" + }, + "on": { + "message": "On" + }, + "only_for": { + "message": "Only for" + }, + "only_for_description": { + "message": "Apply settings to current website only" + }, + "open_dev_tools": { + "message": "Dev tools" + }, + "page_in_dark_list": { + "message": "This site is in global\nDark List" + }, + "page_protected": { + "message": "This page is protected\nby browser" + }, + "privacy": { + "message": "Privacy" + }, + "read_more": { + "message": "Read more" + }, + "select_font": { + "message": "Select a font" + }, + "sepia": { + "message": "Sepia" + }, + "set_active_hours": { + "message": "Set active hours" + }, + "set_location": { + "message": "Activate after sunset at location" + }, + "setup_add_site_hotkey": { + "message": "Setup a hotkey for adding site" + }, + "setup_hotkey_toggle_extension": { + "message": "Setup extension\ntoggle hotkey" + }, + "setup_hotkey_toggle_site": { + "message": "Setup current site\ntoggle hotkey" + }, + "site_list": { + "message": "Site list" + }, + "store_listing": { + "message": "This eye-care extension enables night mode by creating dark themes for websites on the fly. Dark Reader inverts bright colours, making them high contrast and easy to read at night.\n\nYou can adjust the brightness, contrast, sepia filter, dark mode, font settings and the ignore-list.\n\nWe may ask you to support the development of the app with a donation. You may see news about Dark Reader in the settings popup. There are Developer Tools for experienced users.\n\nDark Reader doesn't show ads and doesn't send users' data anywhere. It's fully open-source: https://github.com/darkreader/darkreader\n\nBefore you install it, disable similar extensions. Enjoy watching!" + }, + "system_dark_mode": { + "message": "Use system colour scheme" + }, + "system_dark_mode_description": { + "message": "Activate when system dark mode is on" + }, + "text_stroke": { + "message": "Text stroke" + }, + "theme_generation_mode": { + "message": "Theme generation mode" + }, + "toggle_current_site": { + "message": "Toggle current site" + }, + "toggle_extension": { + "message": "Toggle extension" + }, + "try_experimental_theme_engines": { + "message": "Try out **experimental** theme engines:\n**Filter+** preserves colours saturation, uses GPU\n**Static theme** generates a simple fast theme\n**Dynamic theme** analyzes colours and images" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/en_US/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/en_US/messages.json new file mode 100644 index 0000000..a85506e --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/en_US/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Add site to list" + }, + "automation": { + "message": "Automation" + }, + "brightness": { + "message": "Brightness" + }, + "change_browser_theme": { + "message": "Change the browser theme" + }, + "contrast": { + "message": "Contrast" + }, + "custom_browser_theme_off": { + "message": "Default" + }, + "custom_browser_theme_on": { + "message": "Custom" + }, + "dark": { + "message": "Dark" + }, + "donate": { + "message": "Donate" + }, + "engine_dynamic": { + "message": "Dynamic" + }, + "engine_filter": { + "message": "Filter" + }, + "engine_filter_plus": { + "message": "Filter+" + }, + "engine_static": { + "message": "Static" + }, + "extension_description": { + "message": "Dark mode for every website. Take care of your eyes, use dark theme for night and daily browsing." + }, + "filter": { + "message": "Filter" + }, + "grayscale": { + "message": "Grayscale" + }, + "help": { + "message": "Help" + }, + "invert_listed_only": { + "message": "Invert listed only" + }, + "latitude": { + "message": "Latitude" + }, + "light": { + "message": "Light" + }, + "loading_please_wait": { + "message": "Loading, please wait" + }, + "longitude": { + "message": "Longitude" + }, + "mode": { + "message": "Mode" + }, + "more": { + "message": "More" + }, + "news": { + "message": "News" + }, + "not_invert_listed": { + "message": "Not invert listed" + }, + "off": { + "message": "Off" + }, + "on": { + "message": "On" + }, + "only_for": { + "message": "Only for" + }, + "only_for_description": { + "message": "Apply settings to current website only" + }, + "open_dev_tools": { + "message": "Dev tools" + }, + "page_in_dark_list": { + "message": "This site is in global\nDark List" + }, + "page_protected": { + "message": "This page is protected\nby browser" + }, + "privacy": { + "message": "Privacy" + }, + "read_more": { + "message": "Read more" + }, + "select_font": { + "message": "Select a font" + }, + "sepia": { + "message": "Sepia" + }, + "set_active_hours": { + "message": "Set active hours" + }, + "set_location": { + "message": "Activate after sunset at location" + }, + "setup_add_site_hotkey": { + "message": "Setup a hotkey for adding site" + }, + "setup_hotkey_toggle_extension": { + "message": "Setup extension\ntoggle hotkey" + }, + "setup_hotkey_toggle_site": { + "message": "Setup current site\ntoggle hotkey" + }, + "site_list": { + "message": "Site list" + }, + "store_listing": { + "message": "This eye-care extension enables night mode by creating dark themes for websites on the fly. Dark Reader inverts bright colors, making them high contrast and easy to read at night.\n\nYou can adjust the brightness, contrast, sepia filter, dark mode, font settings and the ignore-list.\n\nWe may ask you to support the development of the app with a donation. You may see news about Dark Reader in the settings popup. There are Developer Tools for experienced users.\n\nDark Reader doesn't show ads and doesn't send users' data anywhere. It's fully open-source: https://github.com/darkreader/darkreader\n\nBefore you install it, disable similar extensions. Enjoy watching!" + }, + "system_dark_mode": { + "message": "Use system color scheme" + }, + "system_dark_mode_description": { + "message": "Activate when system dark mode is on" + }, + "text_stroke": { + "message": "Text stroke" + }, + "theme_generation_mode": { + "message": "Theme generation mode" + }, + "toggle_current_site": { + "message": "Toggle current site" + }, + "toggle_extension": { + "message": "Toggle extension" + }, + "try_experimental_theme_engines": { + "message": "Try out **experimental** theme engines:\n**Filter+** preserves colors saturation, uses GPU\n**Static theme** generates a simple fast theme\n**Dynamic theme** analyzes colors and images" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/es/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/es/messages.json new file mode 100644 index 0000000..49439e4 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/es/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Agregar sitio a la lista" + }, + "automation": { + "message": "Automatización" + }, + "brightness": { + "message": "Brillo" + }, + "change_browser_theme": { + "message": "Cambiar el tema del navegador" + }, + "contrast": { + "message": "Contraste" + }, + "custom_browser_theme_off": { + "message": "Por defecto" + }, + "custom_browser_theme_on": { + "message": "Personalizado" + }, + "dark": { + "message": "Oscuro" + }, + "donate": { + "message": "Donar" + }, + "engine_dynamic": { + "message": "Dinámico" + }, + "engine_filter": { + "message": "Filtro" + }, + "engine_filter_plus": { + "message": "Filtro+" + }, + "engine_static": { + "message": "Estático" + }, + "extension_description": { + "message": "Tema oscuro para todos los sitios. Cuide sus ojos, utilice Dark Reader para navegar durante el día y la noche." + }, + "filter": { + "message": "Filtro" + }, + "grayscale": { + "message": "Escala de grises" + }, + "help": { + "message": "Ayuda" + }, + "invert_listed_only": { + "message": "Invertir sólo listados" + }, + "latitude": { + "message": "Latitud" + }, + "light": { + "message": "Claro" + }, + "loading_please_wait": { + "message": "Cargando, espere por favor" + }, + "longitude": { + "message": "Longitud" + }, + "mode": { + "message": "Modo" + }, + "more": { + "message": "Más" + }, + "news": { + "message": "Avisos" + }, + "not_invert_listed": { + "message": "No invertir listados" + }, + "off": { + "message": "No" + }, + "on": { + "message": "Sí" + }, + "only_for": { + "message": "Sólo para" + }, + "only_for_description": { + "message": "Aplicar configuración sólo al sitio actual" + }, + "open_dev_tools": { + "message": "Herramientas" + }, + "page_in_dark_list": { + "message": "Este sitio está en la\nlista global Dark List" + }, + "page_protected": { + "message": "Esta página está protegida\npor el navegador" + }, + "privacy": { + "message": "Privacidad" + }, + "read_more": { + "message": "Lea más" + }, + "select_font": { + "message": "Seleccione una fuente" + }, + "sepia": { + "message": "Sepia" + }, + "set_active_hours": { + "message": "Establece horas activas" + }, + "set_location": { + "message": "Activar después de la puesta del sol en la ubicación" + }, + "setup_add_site_hotkey": { + "message": "Configurar tecla de atajo para agregar un sitio" + }, + "setup_hotkey_toggle_extension": { + "message": "Configurar extensión\nTecla de atajo" + }, + "setup_hotkey_toggle_site": { + "message": "Configurar sitio actual\ntecla de alternancia" + }, + "site_list": { + "message": "Lista de sitios" + }, + "store_listing": { + "message": "Esta extensión que cuida los ojos habilita el modo nocturno, creando temas oscuros para sitios de internet en el momento. Dark Reader invierte los colores brillantes, haciéndolos contrastantes y fáciles de leer a la noche.\n\nPuede ajustar brillo, contraste, filtro sepia, modo oscuro, configuración de fuentes y lista de ignorados\n\nEs posible que le pidamos que apoye el desarrollo de la aplicación con una donación. Es posible que vea noticias sobre Dark Reader en la ventana emergente de configuración. Existen herramientas de desarrollo para usuarios experimentados.\n\nDark Reader no muestra publicidad y no envía la información del usuario a ningún lado. Es totalmente de código abierto https://github.com/darkreader/darkreader\n\nAntes de instalarlo, desactive extensiones similares. Disfrute mirando!" + }, + "system_dark_mode": { + "message": "Uso esquema de color del sistema" + }, + "system_dark_mode_description": { + "message": "Activar el modo oscuro cuando el sistema está encendido" + }, + "text_stroke": { + "message": "Trazo del texto" + }, + "theme_generation_mode": { + "message": "Modo de generación del tema" + }, + "toggle_current_site": { + "message": "Alternar sitio actual" + }, + "toggle_extension": { + "message": "Alternar extensión" + }, + "try_experimental_theme_engines": { + "message": "Pruebe motores de temas **experimentales**:\n**Filtro+** preserva la saturación de colores, usa GPU\n**Tema Estático** genera un tema simple y rápido\n**Tema Dinámico** analiza colores e imágenes" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/es_419/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/es_419/messages.json new file mode 100644 index 0000000..6d41ed7 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/es_419/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Agregar sitio a la lista" + }, + "automation": { + "message": "Automatización" + }, + "brightness": { + "message": "Brillo" + }, + "change_browser_theme": { + "message": "Cambiar el tema del navegador" + }, + "contrast": { + "message": "Contraste" + }, + "custom_browser_theme_off": { + "message": "Por defecto" + }, + "custom_browser_theme_on": { + "message": "Personalizado" + }, + "dark": { + "message": "Oscuro" + }, + "donate": { + "message": "Donar" + }, + "engine_dynamic": { + "message": "Dinámico" + }, + "engine_filter": { + "message": "Filtrar" + }, + "engine_filter_plus": { + "message": "Filtrar+" + }, + "engine_static": { + "message": "Estático" + }, + "extension_description": { + "message": "Modo oscuro para cada sitio web. Cuide sus ojos, use el tema oscuro para la navegación nocturna y diaria." + }, + "filter": { + "message": "Filtrar" + }, + "grayscale": { + "message": "Escala de grises" + }, + "help": { + "message": "Ayuda" + }, + "invert_listed_only": { + "message": "Invertir solo listado" + }, + "latitude": { + "message": "Latitud" + }, + "light": { + "message": "Claro" + }, + "loading_please_wait": { + "message": "Cargando por favor espere" + }, + "longitude": { + "message": "Longitud" + }, + "mode": { + "message": "Modo" + }, + "more": { + "message": "Más" + }, + "news": { + "message": "Noticias" + }, + "not_invert_listed": { + "message": "No invertir listado" + }, + "off": { + "message": "Apagado" + }, + "on": { + "message": "Encendido" + }, + "only_for": { + "message": "Solo para" + }, + "only_for_description": { + "message": "Aplicar la configuración solo al sitio web actual" + }, + "open_dev_tools": { + "message": "Herramientas de desarrollo" + }, + "page_in_dark_list": { + "message": "Este sitio está en la\nLista Oscura global" + }, + "page_protected": { + "message": "Esta página está protegida\npor el navegador" + }, + "privacy": { + "message": "Privacidad" + }, + "read_more": { + "message": "Leer más" + }, + "select_font": { + "message": "Seleccione una fuente" + }, + "sepia": { + "message": "Sepia" + }, + "set_active_hours": { + "message": "Establecer horas activas" + }, + "set_location": { + "message": "Activar después del atardecer en la ubicación" + }, + "setup_add_site_hotkey": { + "message": "Configure una tecla de acceso rápido para agregar un sitio" + }, + "setup_hotkey_toggle_extension": { + "message": "Extensión de configuración\nalternar tecla de acceso directo" + }, + "setup_hotkey_toggle_site": { + "message": "Configurar el sitio actual\nalternar tecla de acceso directo" + }, + "site_list": { + "message": "Lista de sitios" + }, + "store_listing": { + "message": "Esta extensión para el cuidado de la vista habilita el modo nocturno al crear temas oscuros para sitios web sobre la marcha. Dark Reader invierte los colores brillantes, haciéndolos de alto contraste y fáciles de leer por la noche.\n\nPuede ajustar el brillo, el contraste, el filtro sepia, el modo oscuro, la configuración de fuente y la lista de ignorados.\n\nEs posible que le pidamos que apoye el desarrollo de la aplicación con una donación. Es posible que vea noticias sobre Dark Reader en la ventana emergente de configuración. Existen herramientas de desarrollo para usuarios experimentados.\n\nDark Reader no muestra anuncios y no envía datos de los usuarios a ninguna parte. Es completamente de código abierto: https://github.com/darkreader/darkreader\n\nAntes de instalarlo, deshabilite las extensiones similares. ¡Disfruta mirando!" + }, + "system_dark_mode": { + "message": "Usar el esquema de colores del sistema" + }, + "system_dark_mode_description": { + "message": "Activar cuando el modo oscuro del sistema está encendido" + }, + "text_stroke": { + "message": "Trazo de texto" + }, + "theme_generation_mode": { + "message": "Modo de generación de temas" + }, + "toggle_current_site": { + "message": "Alternar sitio actual" + }, + "toggle_extension": { + "message": "Alternar extensión" + }, + "try_experimental_theme_engines": { + "message": "Pruebe motores de temas **experimentales**:\n**Filtro+** conserva la saturación de colores, usa GPU\n**Tema estático** genera un tema simple y rápido\n**Tema dinámico** analiza colores e imágenes" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/fa/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/fa/messages.json new file mode 100644 index 0000000..1b09a36 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/fa/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "اضافه کردن سایت به لیست" + }, + "automation": { + "message": "تغییر وضعیت خودکار" + }, + "brightness": { + "message": "روشنایی" + }, + "change_browser_theme": { + "message": "طرح زمینه مرورگر را تغییر میدهد" + }, + "contrast": { + "message": "کنتراست" + }, + "custom_browser_theme_off": { + "message": "پیش فرض" + }, + "custom_browser_theme_on": { + "message": "سفارشی" + }, + "dark": { + "message": "تاریک" + }, + "donate": { + "message": "کمک مالی" + }, + "engine_dynamic": { + "message": "پویا" + }, + "engine_filter": { + "message": "فیلتر" + }, + "engine_filter_plus": { + "message": "فیلتر+" + }, + "engine_static": { + "message": "ایستا" + }, + "extension_description": { + "message": "حالت تاریک برای همه سایت ها. مراقب چشمانتان باشید، برای وبگردی در شب یا روز از حالت تاریک استفاده کنید." + }, + "filter": { + "message": "فیلتر" + }, + "grayscale": { + "message": "مقیاس خاکستری" + }, + "help": { + "message": "کمک" + }, + "invert_listed_only": { + "message": "اعمال روی ذکرشده ها" + }, + "latitude": { + "message": "طول جغرافیایی" + }, + "light": { + "message": "روشن" + }, + "loading_please_wait": { + "message": "درحال بارگزاری، لطفا صبر کنید" + }, + "longitude": { + "message": "عرض جغرافیایی" + }, + "mode": { + "message": "حالت" + }, + "more": { + "message": "بیشتر" + }, + "news": { + "message": "اخبار" + }, + "not_invert_listed": { + "message": "اعمال روی ذکرنشده ها" + }, + "off": { + "message": "غیرفعال" + }, + "on": { + "message": "فعال" + }, + "only_for": { + "message": "فقط برای" + }, + "only_for_description": { + "message": "اعمال تنظیمات تنها به سایت کنونی" + }, + "open_dev_tools": { + "message": "ابزار توسعه دهنده" + }, + "page_in_dark_list": { + "message": "این سایت در لیست تاریک\nسراسری قرار دارد" + }, + "page_protected": { + "message": "این صفحه بوسیله مرورگر\nمحافظت شده است" + }, + "privacy": { + "message": "حریم خصوصی" + }, + "read_more": { + "message": "بیشتر بخوانید" + }, + "select_font": { + "message": "انتخاب قلم" + }, + "sepia": { + "message": "قرمز قهوه ای" + }, + "set_active_hours": { + "message": "تنظیم ساعات فعال" + }, + "set_location": { + "message": "فعال کردن پس از غروب در این موقعیت" + }, + "setup_add_site_hotkey": { + "message": "تنظیم میانبر برای اضافه کردن سایت" + }, + "setup_hotkey_toggle_extension": { + "message": "تنظیم افزونه\nکلید میانبر تغییر وضعیت" + }, + "setup_hotkey_toggle_site": { + "message": "تنظیم برای سایت کنونی\nکلید میانبر تغییر وضعیت" + }, + "site_list": { + "message": "لیست سایت ها" + }, + "store_listing": { + "message": "این افزونه مراقبت از چشم، حالت تاریک را با ایجاد طرح تیره به صورت زنده برای سایت ها، فعال میکند. دارک ریدر رنگ های روشن را معکوس میکند، اختلاف تیره و روشن را بیشتر میکند و باعث ساده خوانی متون میشود.\n\nشما میتوانید میزان روشنایی، کنتراست، فیلتر قرمز قهوه ای، حالت تاریک، نوع قلم و لیست سایت های نادیده گرفته شده را تنظیم کنید.\n\nممکن است از شما بخواهیم با کمک مالی از توسعه برنامه حمایت کنید. ممکن است اخبار مربوط به Dark Reader را در پنجره بازشو ببینید. ابزارهای توسعه دهنده برای کاربران با تجربه وجود دارد.\n\nدارک ریدر تبلیغات نشان نمیدهد و اطلاعات کاربران را برای جایی ارسال نمیکند. همچنین بصورت کامل متن باز است https://github.com/darkreader/darkreader\n\nقبل از نصب افزونه های مشابه را حذف کنید. از تماشا کردن لذت ببرید!" + }, + "system_dark_mode": { + "message": "استفاده از طرح رنگ سیستم" + }, + "system_dark_mode_description": { + "message": "فعال کردن زمانی که حالت تاریک سیستم روشن است" + }, + "text_stroke": { + "message": "حاشیه متن" + }, + "theme_generation_mode": { + "message": "حالت ایجاد طرح" + }, + "toggle_current_site": { + "message": "تغییر وضعیت سایت کنونی" + }, + "toggle_extension": { + "message": "تغییر وضعیت افزونه" + }, + "try_experimental_theme_engines": { + "message": "موتورهای **آزمایشی** طرح ها را امتحان کنید:\n**فیلتر+** خلوص رنگ ها را حفظ میکند، گرافیک مصرف میکند\n**طرح ایستا** طرح ساده و سریعی را ایجاد میکند\n**طرح پویا** رنگ ها و تصاویر را تحلیل میکند" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/fa_IR/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/fa_IR/messages.json new file mode 100644 index 0000000..1b09a36 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/fa_IR/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "اضافه کردن سایت به لیست" + }, + "automation": { + "message": "تغییر وضعیت خودکار" + }, + "brightness": { + "message": "روشنایی" + }, + "change_browser_theme": { + "message": "طرح زمینه مرورگر را تغییر میدهد" + }, + "contrast": { + "message": "کنتراست" + }, + "custom_browser_theme_off": { + "message": "پیش فرض" + }, + "custom_browser_theme_on": { + "message": "سفارشی" + }, + "dark": { + "message": "تاریک" + }, + "donate": { + "message": "کمک مالی" + }, + "engine_dynamic": { + "message": "پویا" + }, + "engine_filter": { + "message": "فیلتر" + }, + "engine_filter_plus": { + "message": "فیلتر+" + }, + "engine_static": { + "message": "ایستا" + }, + "extension_description": { + "message": "حالت تاریک برای همه سایت ها. مراقب چشمانتان باشید، برای وبگردی در شب یا روز از حالت تاریک استفاده کنید." + }, + "filter": { + "message": "فیلتر" + }, + "grayscale": { + "message": "مقیاس خاکستری" + }, + "help": { + "message": "کمک" + }, + "invert_listed_only": { + "message": "اعمال روی ذکرشده ها" + }, + "latitude": { + "message": "طول جغرافیایی" + }, + "light": { + "message": "روشن" + }, + "loading_please_wait": { + "message": "درحال بارگزاری، لطفا صبر کنید" + }, + "longitude": { + "message": "عرض جغرافیایی" + }, + "mode": { + "message": "حالت" + }, + "more": { + "message": "بیشتر" + }, + "news": { + "message": "اخبار" + }, + "not_invert_listed": { + "message": "اعمال روی ذکرنشده ها" + }, + "off": { + "message": "غیرفعال" + }, + "on": { + "message": "فعال" + }, + "only_for": { + "message": "فقط برای" + }, + "only_for_description": { + "message": "اعمال تنظیمات تنها به سایت کنونی" + }, + "open_dev_tools": { + "message": "ابزار توسعه دهنده" + }, + "page_in_dark_list": { + "message": "این سایت در لیست تاریک\nسراسری قرار دارد" + }, + "page_protected": { + "message": "این صفحه بوسیله مرورگر\nمحافظت شده است" + }, + "privacy": { + "message": "حریم خصوصی" + }, + "read_more": { + "message": "بیشتر بخوانید" + }, + "select_font": { + "message": "انتخاب قلم" + }, + "sepia": { + "message": "قرمز قهوه ای" + }, + "set_active_hours": { + "message": "تنظیم ساعات فعال" + }, + "set_location": { + "message": "فعال کردن پس از غروب در این موقعیت" + }, + "setup_add_site_hotkey": { + "message": "تنظیم میانبر برای اضافه کردن سایت" + }, + "setup_hotkey_toggle_extension": { + "message": "تنظیم افزونه\nکلید میانبر تغییر وضعیت" + }, + "setup_hotkey_toggle_site": { + "message": "تنظیم برای سایت کنونی\nکلید میانبر تغییر وضعیت" + }, + "site_list": { + "message": "لیست سایت ها" + }, + "store_listing": { + "message": "این افزونه مراقبت از چشم، حالت تاریک را با ایجاد طرح تیره به صورت زنده برای سایت ها، فعال میکند. دارک ریدر رنگ های روشن را معکوس میکند، اختلاف تیره و روشن را بیشتر میکند و باعث ساده خوانی متون میشود.\n\nشما میتوانید میزان روشنایی، کنتراست، فیلتر قرمز قهوه ای، حالت تاریک، نوع قلم و لیست سایت های نادیده گرفته شده را تنظیم کنید.\n\nممکن است از شما بخواهیم با کمک مالی از توسعه برنامه حمایت کنید. ممکن است اخبار مربوط به Dark Reader را در پنجره بازشو ببینید. ابزارهای توسعه دهنده برای کاربران با تجربه وجود دارد.\n\nدارک ریدر تبلیغات نشان نمیدهد و اطلاعات کاربران را برای جایی ارسال نمیکند. همچنین بصورت کامل متن باز است https://github.com/darkreader/darkreader\n\nقبل از نصب افزونه های مشابه را حذف کنید. از تماشا کردن لذت ببرید!" + }, + "system_dark_mode": { + "message": "استفاده از طرح رنگ سیستم" + }, + "system_dark_mode_description": { + "message": "فعال کردن زمانی که حالت تاریک سیستم روشن است" + }, + "text_stroke": { + "message": "حاشیه متن" + }, + "theme_generation_mode": { + "message": "حالت ایجاد طرح" + }, + "toggle_current_site": { + "message": "تغییر وضعیت سایت کنونی" + }, + "toggle_extension": { + "message": "تغییر وضعیت افزونه" + }, + "try_experimental_theme_engines": { + "message": "موتورهای **آزمایشی** طرح ها را امتحان کنید:\n**فیلتر+** خلوص رنگ ها را حفظ میکند، گرافیک مصرف میکند\n**طرح ایستا** طرح ساده و سریعی را ایجاد میکند\n**طرح پویا** رنگ ها و تصاویر را تحلیل میکند" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/fil/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/fil/messages.json new file mode 100644 index 0000000..1a5651b --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/fil/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Idagdag ang site sa listahan" + }, + "automation": { + "message": "Awtomasyon" + }, + "brightness": { + "message": "Liwanag" + }, + "change_browser_theme": { + "message": "Palitan ang tema ng browser" + }, + "contrast": { + "message": "Contrast" + }, + "custom_browser_theme_off": { + "message": "Default" + }, + "custom_browser_theme_on": { + "message": "Custom" + }, + "dark": { + "message": "Madilim" + }, + "donate": { + "message": "Mag-donate" + }, + "engine_dynamic": { + "message": "Dynamiko" + }, + "engine_filter": { + "message": "Filter" + }, + "engine_filter_plus": { + "message": "Filter+" + }, + "engine_static": { + "message": "Static" + }, + "extension_description": { + "message": "Dark mode para sa lahat ng website. Alagaan ang iyong mga mata, gamitin ang dark theme para sa gabi at pang-araw-araw na browsing." + }, + "filter": { + "message": "Filter" + }, + "grayscale": { + "message": "Grayscale" + }, + "help": { + "message": "Tulong" + }, + "invert_listed_only": { + "message": "I-invert ang mga nakalista lamang" + }, + "latitude": { + "message": "Latitud" + }, + "light": { + "message": "Maliwanag" + }, + "loading_please_wait": { + "message": "Ikinakarga, mangyaring maghintay" + }, + "longitude": { + "message": "Longhitud" + }, + "mode": { + "message": "Mode" + }, + "more": { + "message": "Higit pa" + }, + "news": { + "message": "Balita" + }, + "not_invert_listed": { + "message": "Huwag i-invert ang mga nakalista" + }, + "off": { + "message": "Sarado" + }, + "on": { + "message": "Bukas" + }, + "only_for": { + "message": "Para lang sa" + }, + "only_for_description": { + "message": "Ilapat ang mga setting sa kasalukuyang website lamang" + }, + "open_dev_tools": { + "message": "Mga kagamitan para sa mga developer" + }, + "page_in_dark_list": { + "message": "Ang site na ito ay nasa pandaigdigang\nDark List" + }, + "page_protected": { + "message": "Protektado ang pahinang ito\nng browser" + }, + "privacy": { + "message": "Pagkapribado" + }, + "read_more": { + "message": "Magbasa ng higit pa" + }, + "select_font": { + "message": "Pumili ng font" + }, + "sepia": { + "message": "Sepia" + }, + "set_active_hours": { + "message": "Itakda ang mga aktibong oras" + }, + "set_location": { + "message": "Buksan pagkatapos ng paglubog ng araw sa lokasyon" + }, + "setup_add_site_hotkey": { + "message": "Magtakda ng hotkey para sa pagdadagdag ng isang site" + }, + "setup_hotkey_toggle_extension": { + "message": "I-setup ang ekstensyon\nhotkey sa pag-toggle" + }, + "setup_hotkey_toggle_site": { + "message": "I-setup ang kasalukuyang site\nhotkey sa pag-toggle" + }, + "site_list": { + "message": "Listahan ng mga site" + }, + "store_listing": { + "message": "Mabilisang binubuksan ng ekstensyong ito ang night mode sa pamamagitan ng madilim na tema. Ini-invert ng Dark Reader ang matitingkad na kulay, ginagawa silang high contrast at madaling basahin sa gabi.\n\nPuwede mong i-adjust ang liwanag, contrast, sepia filter, dark mode, mga setting ng font at ang ignore-list.\n\nMaaari naming hilingin sa iyo na suportahan ang pagbuo ng app gamit ang isang donasyon. Maaari kang makakita ng mga balita tungkol sa Dark Reader sa popup ng mga setting. Mayroong Mga Tool ng Developer para sa mga may karanasang user.\n\nHindi nagpapakita ng mga ad ang Dark Reader o ipinapadala ang iyong data kung saan-saan. Open-source ito: https://github.com/darkreader/darkreader\n\nBago mo ikabit (i-install) ito, tanggalin muna ang mga katulad na ekstensyon. Magsaya sa panonood!" + }, + "system_dark_mode": { + "message": "Gamitin ang iskema ng kulay ng system" + }, + "system_dark_mode_description": { + "message": "Buksan kapag nakabukas ang dark mode ng system" + }, + "text_stroke": { + "message": "Stroke ng teksto" + }, + "theme_generation_mode": { + "message": "Mode ng paggawa ng tema" + }, + "toggle_current_site": { + "message": "I-toggle ang kasalukuyang site" + }, + "toggle_extension": { + "message": "I-toggle ang ekstensyon" + }, + "try_experimental_theme_engines": { + "message": "Subukan ang mga **ekspermintal** na mga engine ng tema:\n**Filter+** pinapanatili ang saturation ng mga kulay, gumagamit ng GPU\n**Static na tema** gumagawa ng simple at mabilis na tema\n**Dynamikong tema** sinusuri ang mga kulay at larawan" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/fr/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/fr/messages.json new file mode 100644 index 0000000..a4ebb4e --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/fr/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Ajouter un site à la liste" + }, + "automation": { + "message": "Réglage automatique" + }, + "brightness": { + "message": "Luminosité" + }, + "change_browser_theme": { + "message": "Modifier le thème du navigateur" + }, + "contrast": { + "message": "Contraste" + }, + "custom_browser_theme_off": { + "message": "Défaut" + }, + "custom_browser_theme_on": { + "message": "Custom." + }, + "dark": { + "message": "Sombre" + }, + "donate": { + "message": "Dons" + }, + "engine_dynamic": { + "message": "Dynamiq." + }, + "engine_filter": { + "message": "Filtre" + }, + "engine_filter_plus": { + "message": "Filtre+" + }, + "engine_static": { + "message": "Statiq." + }, + "extension_description": { + "message": "Thème sombre partout sur le net. Détendez vous et vos yeux, profitez d'un thème sombre sur internet jour et nuit." + }, + "filter": { + "message": "Filtrer" + }, + "grayscale": { + "message": "N/B" + }, + "help": { + "message": "Aide" + }, + "invert_listed_only": { + "message": "Inversé seul" + }, + "latitude": { + "message": "Latitude" + }, + "light": { + "message": "Clair" + }, + "loading_please_wait": { + "message": "Chargement en cours, veuillez patienter" + }, + "longitude": { + "message": "Longitude" + }, + "mode": { + "message": "Mode" + }, + "more": { + "message": "Plus" + }, + "news": { + "message": "Actus" + }, + "not_invert_listed": { + "message": "Non-inversé" + }, + "off": { + "message": "Inactif" + }, + "on": { + "message": "Actif" + }, + "only_for": { + "message": "Uniquement" + }, + "only_for_description": { + "message": "Appliquer les paramètres au site actuel uniquement" + }, + "open_dev_tools": { + "message": "Dévelop." + }, + "page_in_dark_list": { + "message": "Ce site est dans la\nliste noire de l'extension" + }, + "page_protected": { + "message": "Cette page est protégée\npar le navigateur" + }, + "privacy": { + "message": "Confid." + }, + "read_more": { + "message": "Lire la suite" + }, + "select_font": { + "message": "Choisir une police" + }, + "sepia": { + "message": "Sépia" + }, + "set_active_hours": { + "message": "Définir les heures d’activité" + }, + "set_location": { + "message": "Activer après le coucher du soleil à cet emplacement" + }, + "setup_add_site_hotkey": { + "message": "Configurer un raccourci pour ajouter un site" + }, + "setup_hotkey_toggle_extension": { + "message": "Configurer l'extension\nRaccourci clavier pour activer/désactiver" + }, + "setup_hotkey_toggle_site": { + "message": "Configurer le raccourci clavier\npour activer/désactiver sur le site actuel" + }, + "site_list": { + "message": "Liste des sites" + }, + "store_listing": { + "message": "Cette extension de navigateur implémente un thème sombre global en créant à la volée des thèmes sombres pour chaque site Web que vous visitez. Dark Reader augmente le contraste des couleurs vives pour les rendre plus agréables à la vue la nuit.\n\nVous pouvez également ajuster la luminosité, le contraste, le filtre sépia, le thème sombre, la police du texte ainsi que la liste des sites ignorés par l'extension.\n\nNous pouvons vous demander de soutenir le développement de l'application par un don. Vous pouvez voir des informations sur Dark Reader dans la fenêtre contextuelle des paramètres. Il existe des outils de développement pour les utilisateurs expérimentés.\n\nDark Reader n'intègre pas de publicités et ne partage vos données avec personne d'autre. Il est entièrement open-source. https://github.com/darkreader/darkreader\n\nIl est nécessaire de désactiver toute extension similaire à Dark Reader pour que celle-ci fonctionne correctement. Profitez-en et prenez soin de vos yeux!" + }, + "system_dark_mode": { + "message": "Utiliser les couleurs du système" + }, + "system_dark_mode_description": { + "message": "Actif lorsque le mode sombre du système est actif" + }, + "text_stroke": { + "message": "Trait du texte" + }, + "theme_generation_mode": { + "message": "Mode de génération de thème" + }, + "toggle_current_site": { + "message": "Activer/Désactiver sur le site actuel" + }, + "toggle_extension": { + "message": "Activer/Désactiver l'extension" + }, + "try_experimental_theme_engines": { + "message": "Essayez les moteurs de thème **expérimentaux**:\n**Filtre+** préserve la satur. des couleurs, utilise le GPU\n**Thème statique** génère un thème simple et rapide\n**Dynamique** analyse les couleurs et les images" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/he/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/he/messages.json new file mode 100644 index 0000000..ed5187c --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/he/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "הוסף אתר נוכחי לרשימה" + }, + "automation": { + "message": "הפעלה אוטומטית:" + }, + "brightness": { + "message": "בהירות" + }, + "change_browser_theme": { + "message": "שנה את ערכת נושא הדפדפן" + }, + "contrast": { + "message": "ניגודיות" + }, + "custom_browser_theme_off": { + "message": "ברירת מחדל" + }, + "custom_browser_theme_on": { + "message": "מותאם אישית" + }, + "dark": { + "message": "כהה" + }, + "donate": { + "message": "תרומה" + }, + "engine_dynamic": { + "message": "דינמי" + }, + "engine_filter": { + "message": "מסנן" + }, + "engine_filter_plus": { + "message": "מסנן+" + }, + "engine_static": { + "message": "סטטי" + }, + "extension_description": { + "message": "מצב אפל לכל אתר. תשמור על העיניים שלך, השתמש בעיצוב כהה לגלישה בלילה וגם ביום." + }, + "filter": { + "message": "מסנן" + }, + "grayscale": { + "message": "גווני אפור" + }, + "help": { + "message": "עזרה" + }, + "invert_listed_only": { + "message": "רק מה שברשימה" + }, + "latitude": { + "message": "קו רוחב" + }, + "light": { + "message": "בהיר" + }, + "loading_please_wait": { + "message": "טוען... נא המתן" + }, + "longitude": { + "message": "קו אורך" + }, + "mode": { + "message": "מצב" + }, + "more": { + "message": "עוד" + }, + "news": { + "message": "חדשות" + }, + "not_invert_listed": { + "message": "רק מה שלא ברשימה" + }, + "off": { + "message": "כבוי" + }, + "on": { + "message": "פעיל" + }, + "only_for": { + "message": "רק עבור" + }, + "only_for_description": { + "message": "החל הגדרות באתר הנוכחי בלבד" + }, + "open_dev_tools": { + "message": "Dev tools" + }, + "page_in_dark_list": { + "message": "אתר זה נמצא\nברשימת אתרים כהים" + }, + "page_protected": { + "message": "דף זה מוגן\nעל ידי הדפדפן" + }, + "privacy": { + "message": "פרטיות" + }, + "read_more": { + "message": "קרא עוד" + }, + "select_font": { + "message": "בחר גופן" + }, + "sepia": { + "message": "גווני חום-אדמדם" + }, + "set_active_hours": { + "message": "הגדר שעות פעילות" + }, + "set_location": { + "message": "הפעל לאחר השקיעה במיקום זה" + }, + "setup_add_site_hotkey": { + "message": "הגדר מקש קיצור להוספת אתר" + }, + "setup_hotkey_toggle_extension": { + "message": "הפעל/כבה את התוסף\nהגדר מקש קיצור" + }, + "setup_hotkey_toggle_site": { + "message": "הגדר מקש קיצור להוסיף/להסיר אתר נוכחי מהרשימה\nהגדר מקש קיצור" + }, + "site_list": { + "message": "רשימת אתרים" + }, + "store_listing": { + "message": "תוסף טיפוח לעיניים זה מאפשר למצב לילה ליצור ערכות נושא כהות לאתרי אינטרנט גלישה. Dark Reader ממיר צבעים בהירים מה שהופך אותם לניגודיות גבוהה וקל לקריאה בלילה.\n\nניתן להתאים את הבהירות, הניגודיות, מסנן חום-אדמדם, מצב כהה, הגדרות גופן ורשימת אתרים להתעלמות.\n\nאנו עשויים לבקש ממך לתמוך בפיתוח האפליקציה בתרומה. ייתכן שתראה חדשות על Dark Reader בחלון הקופץ של ההגדרות. ישנם כלים למפתחים למשתמשים מנוסים.\n\nDark Reader אינו מציג מודעות ואינו שולח את נתוני המשתמש לשום מקום. זהו פרוייקט קוד פתוח לחלוטין https://github.com/darkreader/darkreader\n\nלצורך פעולה תקינה, בטל תוספים דומים." + }, + "system_dark_mode": { + "message": "השתמש בערכת הצבעים של המערכת" + }, + "system_dark_mode_description": { + "message": "הפעל כאשר מצב החשכה של המערכת פועל" + }, + "text_stroke": { + "message": "מריחת טקסט" + }, + "theme_generation_mode": { + "message": "מצב יצירת ערכת נושא" + }, + "toggle_current_site": { + "message": "הוסף/הסר את האתר נוכחי מהרשימה" + }, + "toggle_extension": { + "message": "הפעל/כבה את התוסף" + }, + "try_experimental_theme_engines": { + "message": "נסה מנועי ערכת נושא ניסיוניים:\nפילטר + שומר על רוויה בצבעים, משתמש ב- GPU\nנושא סטטי מייצר נושא מהיר פשוט\nנושא דינמי מנתח צבעים ותמונות" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/hi/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/hi/messages.json new file mode 100644 index 0000000..c19f04b --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/hi/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "साइट को चलन सूची में दालें" + }, + "automation": { + "message": "स्वचालन" + }, + "brightness": { + "message": "चमक" + }, + "change_browser_theme": { + "message": "ब्राउज़र थीम बदलें" + }, + "contrast": { + "message": "कॉन्ट्रास्ट" + }, + "custom_browser_theme_off": { + "message": "डिफ़ॉल्ट द्वारा" + }, + "custom_browser_theme_on": { + "message": "बदला हुआ" + }, + "dark": { + "message": "अंधेरा" + }, + "donate": { + "message": "दान" + }, + "engine_dynamic": { + "message": "गतिशील" + }, + "engine_filter": { + "message": "फ़िल्टर" + }, + "engine_filter_plus": { + "message": "फ़िल्टर+" + }, + "engine_static": { + "message": "स्थिर" + }, + "extension_description": { + "message": "हर वेबसाइट के लिए डार्क थीम। अपनी आंखों की देखभाल करें, रात और हर रोज़ की ब्राउज़िंग के लिए डार्क रीडर का उपयोग करें।" + }, + "filter": { + "message": "फ़िल्टर" + }, + "grayscale": { + "message": "ग्रेस्केल" + }, + "help": { + "message": "सहायता" + }, + "invert_listed_only": { + "message": "केवल चलन साइट की सूची" + }, + "latitude": { + "message": "अक्षांश" + }, + "light": { + "message": "रोशनी" + }, + "loading_please_wait": { + "message": "लोड हो रहा है, कृपया प्रतीक्षा करें" + }, + "longitude": { + "message": "देशान्तर" + }, + "mode": { + "message": "स्थिति" + }, + "more": { + "message": "अधिक" + }, + "news": { + "message": "समाचार" + }, + "not_invert_listed": { + "message": "न चलन साइट की सूची" + }, + "off": { + "message": "बंद" + }, + "on": { + "message": "चालू" + }, + "only_for": { + "message": "केवल" + }, + "only_for_description": { + "message": "केवल मौजूदा वेबसाइट पर सेटिंग्स लागू हो" + }, + "open_dev_tools": { + "message": "डेवलपर टूल" + }, + "page_in_dark_list": { + "message": "यह साइट वैश्विक\nडार्क सूची में है" + }, + "page_protected": { + "message": "यह पृष्ठ ब्राउज़र\nके द्वारा संरक्षित है" + }, + "privacy": { + "message": "गोपनीयता" + }, + "read_more": { + "message": "और पढ़े" + }, + "select_font": { + "message": "फ़ॉन्ट का चयन करें" + }, + "sepia": { + "message": "सेपिया फ़िल्टर" + }, + "set_active_hours": { + "message": "उपयोग की अवधि को निश्चित करें" + }, + "set_location": { + "message": "सूर्यास्त के बाद उपयोग करने का स्थान निश्चित करें" + }, + "setup_add_site_hotkey": { + "message": "साइट को डालने के लिए हॉटकी सेटअप करें" + }, + "setup_hotkey_toggle_extension": { + "message": "एक्सटेंशन का उपयोग करने की हॉटकी\nसेटअप करें" + }, + "setup_hotkey_toggle_site": { + "message": "मौजूदा साइट के लिए उपयोग करने की हॉटकी\nसेटअप करें" + }, + "site_list": { + "message": "साइट की सूची" + }, + "store_listing": { + "message": "यह आंख-सहायक ब्राउज़र-एक्सटेंशन रात्रि स्थिति को अधिकृत करके वेबसाइटों के लिए अंधेरे थीम को बनाने में सक्षम बनाता है। डार्क रीडर चमकदार रंगों को उच्च विपरीत बना देता है इसलिए रात में पढ़ने में आसान होता है।\n\nआप चमक, कंट्रास्ट, सेपिया फ़िल्टर, डार्क मोड, फ़ॉन्ट सेटिंग्स और न चलन-सूची समायोजित कर सकते हैं।\n\nहम आपसे दान के साथ ऐप के विकास का समर्थन करने के लिए कह सकते हैं। आप सेटिंग पॉपअप में डार्क रीडर के बारे में समाचार देख सकते हैं। अनुभवी उपयोगकर्ताओं के लिए डेवलपर टूल हैं।\n\nडार्क रीडर विज्ञापन नहीं दिखाता है और कहीं भी उपयोगकर्ता का डेटा नहीं भेजता है। यह पूरी तरह से मुक्त-स्रोत है https://github.com/darkreader/darkreader\n\nडार्क रीडर का उपयोग करने से पहले इसी तरह की एक्सटेंशन अक्षम करें। देखने का मज़ा लें!" + }, + "system_dark_mode": { + "message": "प्रणाली रंग योजना का उपयोग करें" + }, + "system_dark_mode_description": { + "message": "उपयोग करें जब प्रणाली अंधेरे कि स्थिति में है" + }, + "text_stroke": { + "message": "पाठ स्ट्रोक" + }, + "theme_generation_mode": { + "message": "थीम निर्माण स्थिति" + }, + "toggle_current_site": { + "message": "वर्तमान साइट के लिए उपयोग" + }, + "toggle_extension": { + "message": "एक्सटेंशन का उपयोग" + }, + "try_experimental_theme_engines": { + "message": "**प्रयोगात्मक** थीम इंजन आज़माएं:\n**फ़िल्टर+** रंग संतृप्ति को संरक्षित करता है, जीपीयू का उपयोग करता है\n**स्थिर थीम** एक साधारण तेज़ थीम उत्पन्न करता है\n**गतिशील थीम** रंग और छवियों का विश्लेषण करता है" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/id/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/id/messages.json new file mode 100644 index 0000000..144fdfc --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/id/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Tambahkan situs ke daftar" + }, + "automation": { + "message": "Otomatisasi" + }, + "brightness": { + "message": "Kecerahan" + }, + "change_browser_theme": { + "message": "Ubah tema peramban" + }, + "contrast": { + "message": "Kontras" + }, + "custom_browser_theme_off": { + "message": "Bawaan" + }, + "custom_browser_theme_on": { + "message": "Khusus" + }, + "dark": { + "message": "Malam" + }, + "donate": { + "message": "Donasi" + }, + "engine_dynamic": { + "message": "Dinamis" + }, + "engine_filter": { + "message": "Filter" + }, + "engine_filter_plus": { + "message": "Filter+" + }, + "engine_static": { + "message": "Statis" + }, + "extension_description": { + "message": "Mode malam untuk semua situs web. Menjaga mata anda, menggunakan tema gelap untuk berselancar siang dan malam hari." + }, + "filter": { + "message": "Filter" + }, + "grayscale": { + "message": "Abu-abu" + }, + "help": { + "message": "Bantuan" + }, + "invert_listed_only": { + "message": "Diterapkan" + }, + "latitude": { + "message": "Garis lintang" + }, + "light": { + "message": "Siang" + }, + "loading_please_wait": { + "message": "Sedang memuat, harap menunggu" + }, + "longitude": { + "message": "Garis bujur" + }, + "mode": { + "message": "Mode" + }, + "more": { + "message": "Lainnya" + }, + "news": { + "message": "Berita" + }, + "not_invert_listed": { + "message": "Dikecualikan" + }, + "off": { + "message": "Off" + }, + "on": { + "message": "On" + }, + "only_for": { + "message": "Hanya untuk" + }, + "only_for_description": { + "message": "Terapkan hanya untuk situs yang terbuka" + }, + "open_dev_tools": { + "message": "Pengembang" + }, + "page_in_dark_list": { + "message": "Situs ini berada dalam daftar\nMode Malam" + }, + "page_protected": { + "message": "Halaman ini dilindungi\noleh peramban" + }, + "privacy": { + "message": "Privasi" + }, + "read_more": { + "message": "Baca lainnya" + }, + "select_font": { + "message": "Pilih fon" + }, + "sepia": { + "message": "Sepia" + }, + "set_active_hours": { + "message": "Ubah waktu aktif" + }, + "set_location": { + "message": "Aktifkan setelah matahari terbenam di lokasi" + }, + "setup_add_site_hotkey": { + "message": "Atur pintasan untuk menambahkan situs" + }, + "setup_hotkey_toggle_extension": { + "message": "Setelan ekstensi\nsaklar pintasan" + }, + "setup_hotkey_toggle_site": { + "message": "Setelan situs yang terbuka\nsaklar pintasan" + }, + "site_list": { + "message": "Daftar situs" + }, + "store_listing": { + "message": "Ekstensi ini mengaktifkan mode malam dengan membuat halaman situs web menjadi gelap. Dark Reader bekerja dengan membalik warna cerah dengan warna kontras sehingga nyaman di mata.\n\nAnda bisa mengatur kecerahan, kontras, filter sepia, mode malam, setelan fon dan pengecualian situs web.\n\nKami mungkin meminta Anda untuk mendukung pengembangan aplikasi dengan donasi. Anda mungkin melihat berita tentang Pembaca Gelap di sembulan pengaturan. Ada Alat Pengembang untuk pengguna berpengalaman.\n\nDark Reader tidak menampilkan iklan dan tidak mengirimkan data penggunan ke manapun. Sepenuhnya bersumber terbuka: https://github.com/darkreader/darkreader\n\nSebelum memasang, silakan nonaktifkan ekstensi serupa. Selamat berselancar!" + }, + "system_dark_mode": { + "message": "Gunakan skema warna sistem" + }, + "system_dark_mode_description": { + "message": "Aktif ketika mode gelap sistem diaktifkan" + }, + "text_stroke": { + "message": "Tebal teks" + }, + "theme_generation_mode": { + "message": "Mode penghasil tema" + }, + "toggle_current_site": { + "message": "Saklar situs yang terbuka" + }, + "toggle_extension": { + "message": "Saklar ekstensi" + }, + "try_experimental_theme_engines": { + "message": "Uji coba penghasil tema **eksperimental**:\n**Filter+** menjaga saturasi warna, mengggunakan GPU\n**Tema statis** menghasilkan tema cepat sederhana\n**Tema dinamis** menganalisa warna dan gambar" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/it/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/it/messages.json new file mode 100644 index 0000000..f0b44fc --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/it/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Aggiungi sito all'elenco" + }, + "automation": { + "message": "Automazione" + }, + "brightness": { + "message": "Luminosità" + }, + "change_browser_theme": { + "message": "Modifica il tema del browser" + }, + "contrast": { + "message": "Contrasto" + }, + "custom_browser_theme_off": { + "message": "Predefinito" + }, + "custom_browser_theme_on": { + "message": "Personalizzato" + }, + "dark": { + "message": "Scuro" + }, + "donate": { + "message": "Dona" + }, + "engine_dynamic": { + "message": "Dinamico" + }, + "engine_filter": { + "message": "Filtro" + }, + "engine_filter_plus": { + "message": "Filtro+" + }, + "engine_static": { + "message": "Statico" + }, + "extension_description": { + "message": "Tema scuro per ogni sito. Prenditi cura dei tuoi occhi, usa Dark Reader per navigare giorno e notte." + }, + "filter": { + "message": "Filtra" + }, + "grayscale": { + "message": "Scala di grigi" + }, + "help": { + "message": "Aiuto" + }, + "invert_listed_only": { + "message": "Inverti solo" + }, + "latitude": { + "message": "Latitudine" + }, + "light": { + "message": "Chiaro" + }, + "loading_please_wait": { + "message": "Sto caricando, attendere prego" + }, + "longitude": { + "message": "Longitudine" + }, + "mode": { + "message": "Modalità" + }, + "more": { + "message": "Di più" + }, + "news": { + "message": "Notizie" + }, + "not_invert_listed": { + "message": "Non invertire solo" + }, + "off": { + "message": "Spenta" + }, + "on": { + "message": "Accesa" + }, + "only_for": { + "message": "Solo per" + }, + "only_for_description": { + "message": "Applica le configurazioni solo al sito attuale" + }, + "open_dev_tools": { + "message": "Strumenti" + }, + "page_in_dark_list": { + "message": "Questo sito è nella\nDark List globale" + }, + "page_protected": { + "message": "Questa pagina è protetta\ndal browser" + }, + "privacy": { + "message": "Privacy" + }, + "read_more": { + "message": "Scopri di più" + }, + "select_font": { + "message": "Seleziona un font" + }, + "sepia": { + "message": "Seppia" + }, + "set_active_hours": { + "message": "Imposta l'orario di attività" + }, + "set_location": { + "message": "Attiva dopo il tramonto a posizione" + }, + "setup_add_site_hotkey": { + "message": "Tasti di scelta rapida per aggiungere un sito" + }, + "setup_hotkey_toggle_extension": { + "message": "Tasti di scelta rapida\ndell'estensione" + }, + "setup_hotkey_toggle_site": { + "message": "Tasti di scelta rapida\nper il sito attuale" + }, + "site_list": { + "message": "Lista dei siti" + }, + "store_listing": { + "message": "Questa estensione si prende cura dei tuoi occhi e ti consente di creare al volo un tema scuro in modalità nottura per ogni sito. Dark Reader inverte i colori più luminosi rendendoli ad alto contrato e più semplici da leggere la notte.\n\nPuoi modificare luminosità, contrasto, filtro seppia, modalità notturna, caratteri e lista di siti da ignorare.\n\nPotremmo chiederti di sostenere lo sviluppo dell'app con una donazione. Potresti vedere notizie su Dark Reader nel popup delle impostazioni. Sono disponibili strumenti per sviluppatori per utenti esperti.\n\nDark Reader non mostra pubblicità e non invia i dati dell'utente da nessuna parte. È pienamente open-source https://github.com/darkreader/darkreader\n\nPrima di installare disabilita altre estensioni simili. Buona lettura!" + }, + "system_dark_mode": { + "message": "Usa schema di colori del sistema" + }, + "system_dark_mode_description": { + "message": "Attiva quando la modalità scura sistema è acceso" + }, + "text_stroke": { + "message": "Contorno del testo" + }, + "theme_generation_mode": { + "message": "Modalità di generazione del tema" + }, + "toggle_current_site": { + "message": "Inverti il sito attuale" + }, + "toggle_extension": { + "message": "(Dis)abilita estensione" + }, + "try_experimental_theme_engines": { + "message": "Prova gli interpreti dei temi **sperimentali**:\n**Filtro+** preserva saturazione dei colori, usa la GPU\n**Tema statico** genera un semplice tema veloce\n**Tema dinamico** analizza i colori e le immagini" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ja/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ja/messages.json new file mode 100644 index 0000000..6369fc9 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ja/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "サイトをリストに追加する" + }, + "automation": { + "message": "自動化" + }, + "brightness": { + "message": "輝度" + }, + "change_browser_theme": { + "message": "ブラウザのテーマを変更する" + }, + "contrast": { + "message": "コントラスト" + }, + "custom_browser_theme_off": { + "message": "デフォルト" + }, + "custom_browser_theme_on": { + "message": "カスタム" + }, + "dark": { + "message": "ダーク" + }, + "donate": { + "message": "寄付する" + }, + "engine_dynamic": { + "message": "動的" + }, + "engine_filter": { + "message": "フィルタ" + }, + "engine_filter_plus": { + "message": "フィルタ+" + }, + "engine_static": { + "message": "静的" + }, + "extension_description": { + "message": "すべてのウェブサイトにダークテーマを適用します。夜間や毎日のブラウジングにDark Readerを使用し、あなたの目を気遣います。" + }, + "filter": { + "message": "フィルタ" + }, + "grayscale": { + "message": "グレースケール" + }, + "help": { + "message": "ヘルプ" + }, + "invert_listed_only": { + "message": "ホワイトリスト" + }, + "latitude": { + "message": "緯度" + }, + "light": { + "message": "ライト" + }, + "loading_please_wait": { + "message": "読み込み中…お待ちください" + }, + "longitude": { + "message": "経度" + }, + "mode": { + "message": "モード" + }, + "more": { + "message": "その他" + }, + "news": { + "message": "ニュース" + }, + "not_invert_listed": { + "message": "ブラックリスト" + }, + "off": { + "message": "オフ" + }, + "on": { + "message": "オン" + }, + "only_for": { + "message": "このサイトでのみ適用" + }, + "only_for_description": { + "message": "現在のウェブサイトのみに設定を適用する" + }, + "open_dev_tools": { + "message": "開発者ツール" + }, + "page_in_dark_list": { + "message": "このサイトはグローバル\nダークリストに含まれています" + }, + "page_protected": { + "message": "このページはブラウザに\nよって保護されています" + }, + "privacy": { + "message": "個人情報" + }, + "read_more": { + "message": "続きを読む" + }, + "select_font": { + "message": "フォントを選択" + }, + "sepia": { + "message": "セピア" + }, + "set_active_hours": { + "message": "アクティブ時間を設定する" + }, + "set_location": { + "message": "現地での日没後に有効に" + }, + "setup_add_site_hotkey": { + "message": "サイトを追加するためのホットキーを設定する" + }, + "setup_hotkey_toggle_extension": { + "message": "拡張機能の切替用の\nホットキーを設定する" + }, + "setup_hotkey_toggle_site": { + "message": "現在のサイト切替用の\nホットキーを設定する" + }, + "site_list": { + "message": "サイトリスト" + }, + "store_listing": { + "message": "このアイ・ケアの拡張機能は、オンザフライでウェブサイトのためのダークテーマを作成し、ナイトモードを有効にします。 Dark Readerは鮮やかな色を反転させてコントラストを高め、夜間に読みやすくします。\n\n明るさ、コントラスト、セピアフィルター、ダークモード、フォント設定、無視リストを調整することができます。\n\n寄付でアプリの開発をサポートするようお願いする場合があります。設定ポップアップにDarkReaderに関するニュースが表示される場合があります。経験豊富なユーザー向けの開発ツールがあります。\n\nDark Readerは広告を表示せず、ユーザーのデータをどこにも送信しません。 また完全にオープンソースです https://github.com/darkreader/darkreader\n\nインストールする前に、同様の拡張機能を無効にしてください。 ブラウジングをお楽しみください!" + }, + "system_dark_mode": { + "message": "システムの色のモードに従う" + }, + "system_dark_mode_description": { + "message": "システムがダークモードの設定なら有効に" + }, + "text_stroke": { + "message": "テキストストローク" + }, + "theme_generation_mode": { + "message": "テーマ生成モード" + }, + "toggle_current_site": { + "message": "現在のサイトの切替" + }, + "toggle_extension": { + "message": "拡張機能の切替" + }, + "try_experimental_theme_engines": { + "message": "**実験的**テーマエンジンを試してみてください:\n**フィルタ+**は色の彩度を維持します(GPUを使用)\n**静的テーマ**は簡単な高速テーマを生成します\n**動的テーマ**は色と画像を分析します" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ko/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ko/messages.json new file mode 100644 index 0000000..8a642db --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ko/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "목록에 웹사이트 추가" + }, + "automation": { + "message": "오토메이션" + }, + "brightness": { + "message": "밝기" + }, + "change_browser_theme": { + "message": "브라우저 테마 변경" + }, + "contrast": { + "message": "대비" + }, + "custom_browser_theme_off": { + "message": "기본값" + }, + "custom_browser_theme_on": { + "message": "맞춤 테마" + }, + "dark": { + "message": "어두운 테마" + }, + "donate": { + "message": "기부" + }, + "engine_dynamic": { + "message": "동적" + }, + "engine_filter": { + "message": "필터" + }, + "engine_filter_plus": { + "message": "필터+" + }, + "engine_static": { + "message": "정적" + }, + "extension_description": { + "message": "모든 웹사이트에 다크 모드를 적용합니다. 밤이나 일상적인 웹 브라우징을 할 때 어두운 테마를 사용하여 눈을 보호하십시오." + }, + "filter": { + "message": "필터" + }, + "grayscale": { + "message": "흑백 필터" + }, + "help": { + "message": "도움말" + }, + "invert_listed_only": { + "message": "포함 사이트 목록" + }, + "latitude": { + "message": "위도" + }, + "light": { + "message": "밝은 테마" + }, + "loading_please_wait": { + "message": "로딩 중... 잠시만 기다려 주십시오." + }, + "longitude": { + "message": "경도" + }, + "mode": { + "message": "모드" + }, + "more": { + "message": "기타" + }, + "news": { + "message": "뉴스" + }, + "not_invert_listed": { + "message": "제외 사이트 목록" + }, + "off": { + "message": "끔" + }, + "on": { + "message": "켬" + }, + "only_for": { + "message": "해당 웹사이트에만 적용" + }, + "only_for_description": { + "message": "현재 웹사이트에만 설정을 적용함" + }, + "open_dev_tools": { + "message": "개발자 도구" + }, + "page_in_dark_list": { + "message": "이 사이트는 이미\n전체 목록에 있습니다" + }, + "page_protected": { + "message": "이 페이지는\n브라우저에 의해 보호되어 있습니다." + }, + "privacy": { + "message": "개인 정보" + }, + "read_more": { + "message": "더 읽기" + }, + "select_font": { + "message": "글꼴 선택" + }, + "sepia": { + "message": "세피아 필터" + }, + "set_active_hours": { + "message": "사용 시간 설정" + }, + "set_location": { + "message": "위치에서 일몰 후 활성화" + }, + "setup_add_site_hotkey": { + "message": "웹사이트를 추가하는 단축키 설정" + }, + "setup_hotkey_toggle_extension": { + "message": "확장 기능 설정하기\n바로 가기 전환" + }, + "setup_hotkey_toggle_site": { + "message": "현재 웹 사이트 설정\n단축키 전환" + }, + "site_list": { + "message": "사이트 목록" + }, + "store_listing": { + "message": "이 눈 건강을 위한 확장 기능은 실시간으로 각 웹사이트에 어두운 테마를 적용해 야간 모드를 가능케 합니다. 다크 리더는 밝은 색상을 반전해 고대비로 만들어 밤에 읽기가 쉽도록 만듭니다.\n\n밝기, 대비, 세피아 필터, 어두운 모드, 폰트와 예외 목록을 설정할 수 있습니다.\n\n기부로 앱 개발 지원을 요청할 수 있습니다. 설정 팝업에서 Dark Reader에 대한 뉴스를 볼 수 있습니다. 숙련된 사용자를 위한 개발자 도구가 있습니다.\n\n다크 리더는 광고를 보여주지 않으며 사용자의 데이터를 어디에도 보내지 않습니다. 완전히 오픈 소스입니다. https://github.com/darkreader/darkreader\n\n설치하기 전에 비슷한 기능을 가진 확장 기능을 사용 해제하시기 바랍니다. 편하게 읽으십시오!" + }, + "system_dark_mode": { + "message": "사용 시스템 색 구성표" + }, + "system_dark_mode_description": { + "message": "시스템 어두운 모드가 켜져있을 때 활성화" + }, + "text_stroke": { + "message": "텍스트 획 굵기" + }, + "theme_generation_mode": { + "message": "테마 생성 모드" + }, + "toggle_current_site": { + "message": "현재 웹 사이트에 적용" + }, + "toggle_extension": { + "message": "확장 기능 적용" + }, + "try_experimental_theme_engines": { + "message": "**실험용** 테마 엔진들\n**필터+** 는 GPU를 사용하여 채도를 유지합니다\n**정적 테마** 는 간단하고 빠른 테마를 생성합니다\n**동적 테마** 는 색상 및 이미지를 분석합니다" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ms/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ms/messages.json new file mode 100644 index 0000000..0c231f5 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ms/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Tambahkan laman ke senarai" + }, + "automation": { + "message": "Otomatisasi" + }, + "brightness": { + "message": "Kecerahan" + }, + "change_browser_theme": { + "message": "Tukar tema pelayar" + }, + "contrast": { + "message": "Kontras" + }, + "custom_browser_theme_off": { + "message": "Lalai" + }, + "custom_browser_theme_on": { + "message": "Adat" + }, + "dark": { + "message": "Gelap" + }, + "donate": { + "message": "Derma" + }, + "engine_dynamic": { + "message": "Dinamis" + }, + "engine_filter": { + "message": "Penapis" + }, + "engine_filter_plus": { + "message": "Penapis+" + }, + "engine_static": { + "message": "Statis" + }, + "extension_description": { + "message": "Mod gelap untuk setiap laman web. Jaga mata anda, gunakan tema gelap untuk melayari laman web, malam dan siang." + }, + "filter": { + "message": "Penapis" + }, + "grayscale": { + "message": "Skala kelabu" + }, + "help": { + "message": "Bantuan" + }, + "invert_listed_only": { + "message": "Senarai songsang sahaja" + }, + "latitude": { + "message": "Lintang" + }, + "light": { + "message": "Terang" + }, + "loading_please_wait": { + "message": "Sedang dimuatkan, sila tunggu" + }, + "longitude": { + "message": "Tegak" + }, + "mode": { + "message": "Mode" + }, + "more": { + "message": "Lebih" + }, + "news": { + "message": "Berita" + }, + "not_invert_listed": { + "message": "Senarai tidak songsang" + }, + "off": { + "message": "Tutup" + }, + "on": { + "message": "Buka" + }, + "only_for": { + "message": "Hanya untuk" + }, + "only_for_description": { + "message": "Gunakan tetapan pada laman web semasa sahaja" + }, + "open_dev_tools": { + "message": "Alat Developer" + }, + "page_in_dark_list": { + "message": "Halamn in dalam senarai\ngelap global" + }, + "page_protected": { + "message": "Halaman ini telah dilindungi\noleh pelayar" + }, + "privacy": { + "message": "Privasi" + }, + "read_more": { + "message": "Baca lagi" + }, + "select_font": { + "message": "Pilihkan fon" + }, + "sepia": { + "message": "Sepia" + }, + "set_active_hours": { + "message": "Sediakan waktu aktif" + }, + "set_location": { + "message": "Aktifkan selepas asar di lokasi" + }, + "setup_add_site_hotkey": { + "message": "Sediakan hotkey untuk menambah laman" + }, + "setup_hotkey_toggle_extension": { + "message": "Menyiapkan ekstensi\ntoggel hotkey" + }, + "setup_hotkey_toggle_site": { + "message": "Menyiapkan laman terkini\ntoggel hotkey" + }, + "site_list": { + "message": "Senarai laman" + }, + "store_listing": { + "message": "Ekstensi penjagaan mata ini mendayakan mod malam dengan mencipta tema gelap untuk laman web dengan cepat. Dark Reader menyongsangkan warna terang, menjadikannya kontras tinggi dan mudah dibaca pada waktu malam.\n\nAnda boleh melaraskan kecerahan, kontras, penapis sepia, mod gelap, tetapan fon dan senarai abaikan.\n\nKami mungkin meminta anda menyokong pembangunan aplikasi dengan sumbangan. Anda mungkin melihat berita tentang Pembaca Gelap dalam pop timbul tetapan. Terdapat Alat Pembangun untuk pengguna berpengalaman.\n\nDark Reader tidak memaparkan iklan dan tidak menghantar data pengguna ke mana-mana sahaja. Ia adalah sumber terbuka sepenuhnya: https://github.com/darkreader/darkreader\n\nSebelum anda memasangnya, lumpuhkan sambungan yang serupa. Selamat menonton!" + }, + "system_dark_mode": { + "message": "Gunakan skema warna sistem" + }, + "system_dark_mode_description": { + "message": "Aktifkan semasa skema gelap sistem dibuka" + }, + "text_stroke": { + "message": "Lejang teks" + }, + "theme_generation_mode": { + "message": "Mod penjanaan tema" + }, + "toggle_current_site": { + "message": "Toggel laman terkini" + }, + "toggle_extension": { + "message": "Toggel ekstensi" + }, + "try_experimental_theme_engines": { + "message": "Cubakan enjin tema **percubaan**:\n**Penapis+** mengekalkan ketepuan warna, menggunakan GPU\n**Tema statik** menjana tema pantas yang ringkas\n**Tema dinamik** menganalisis warna dan imej" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/nl/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/nl/messages.json new file mode 100644 index 0000000..12783b6 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/nl/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Site aan lijst toevoegen" + }, + "automation": { + "message": "Automatisering" + }, + "brightness": { + "message": "Helderheid" + }, + "change_browser_theme": { + "message": "Browserthema wijzigen" + }, + "contrast": { + "message": "Contrast" + }, + "custom_browser_theme_off": { + "message": "Standaard" + }, + "custom_browser_theme_on": { + "message": "Aangepast" + }, + "dark": { + "message": "Donker" + }, + "donate": { + "message": "Doneren" + }, + "engine_dynamic": { + "message": "Dynamisch" + }, + "engine_filter": { + "message": "Filter" + }, + "engine_filter_plus": { + "message": "Filter+" + }, + "engine_static": { + "message": "Statisch" + }, + "extension_description": { + "message": "Donkere modus voor elke website. Zorg goed voor je ogen, gebruik donkere modus voor gebruik in de nacht of zelfs overdag." + }, + "filter": { + "message": "Filter" + }, + "grayscale": { + "message": "Grijswaarden" + }, + "help": { + "message": "Hulp" + }, + "invert_listed_only": { + "message": "Alleen deze omkeren" + }, + "latitude": { + "message": "Breedtegraad" + }, + "light": { + "message": "Licht" + }, + "loading_please_wait": { + "message": "Laden, even geduld" + }, + "longitude": { + "message": "Lengtegraad" + }, + "mode": { + "message": "Modus" + }, + "more": { + "message": "Meer" + }, + "news": { + "message": "Nieuws" + }, + "not_invert_listed": { + "message": "Deze niet omkeren" + }, + "off": { + "message": "Uit" + }, + "on": { + "message": "Aan" + }, + "only_for": { + "message": "Alleen op" + }, + "only_for_description": { + "message": "Instelling alleen voor deze site opslaan" + }, + "open_dev_tools": { + "message": "Tools" + }, + "page_in_dark_list": { + "message": "Deze site staat op\nde globale lijst" + }, + "page_protected": { + "message": "Deze pagina wordt beschermd\ndoor de browser" + }, + "privacy": { + "message": "Privacy" + }, + "read_more": { + "message": "Meer hierover" + }, + "select_font": { + "message": "Lettertype selecteren" + }, + "sepia": { + "message": "Sepia" + }, + "set_active_hours": { + "message": "Actieve uren instellen" + }, + "set_location": { + "message": "Activeren na zonsondergang op locatie" + }, + "setup_add_site_hotkey": { + "message": "Sneltoets instellen voor site toevoegen" + }, + "setup_hotkey_toggle_extension": { + "message": "Sneltoets instellen voor\nextensie schakelen" + }, + "setup_hotkey_toggle_site": { + "message": "Sneltoets instellen voor\nhuidige site schakelen" + }, + "site_list": { + "message": "Sitelijst" + }, + "store_listing": { + "message": "Deze oogzorgextensie heeft een nachtstand die automatisch donkere thema's maakt voor websites. Donkere modus keert lichte kleuren om voor goede leesbaarheid 's nachts.\n\nJe kunt de helderheid, het contrast, het kleurenfilter, de donkere modus, het lettertype en de lijst van te negeren websites geheel instellen naar wens.\n\nWe kunnen je vragen om de ontwikkeling van de app te ondersteunen met een donatie. Mogelijk ziet u nieuws over Dark Reader in de pop-up met instellingen. Er zijn Developer Tools voor ervaren gebruikers.\n\nDark Reader laat nooit advertenties zien en gebruikt nooit je gegevens. Deze extensie is volledig open-source op https://github.com/darkreader/darkreader\n\nVoor de installatie is het aangeraden soortgelijke extensies eerst uit te schakelen. Veel kijkplezier!" + }, + "system_dark_mode": { + "message": "Gebruik systeemkleurenschema" + }, + "system_dark_mode_description": { + "message": "Activeren bij donker systeemthema" + }, + "text_stroke": { + "message": "Tekstomlijning" + }, + "theme_generation_mode": { + "message": "Themageneratiemodus" + }, + "toggle_current_site": { + "message": "Huidige site schakelen" + }, + "toggle_extension": { + "message": "Extensie schakelen" + }, + "try_experimental_theme_engines": { + "message": "Probeer **experimentele** themas\n**Filter+** behoudt saturatie, videokaart vereist\n**Statisch thema** genereert snel een simpel thema\n**Dynamisch thema** analyseert kleuren en foto's" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/no/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/no/messages.json new file mode 100644 index 0000000..30685e3 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/no/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Legg til en side" + }, + "automation": { + "message": "Automasjon" + }, + "brightness": { + "message": "Lysstyrke" + }, + "change_browser_theme": { + "message": "Bytt nettleser tema" + }, + "contrast": { + "message": "Kontrast" + }, + "custom_browser_theme_off": { + "message": "Standard" + }, + "custom_browser_theme_on": { + "message": "Tilpasset" + }, + "dark": { + "message": "Mørk" + }, + "donate": { + "message": "Donere" + }, + "engine_dynamic": { + "message": "Dynamisk" + }, + "engine_filter": { + "message": "Filter" + }, + "engine_filter_plus": { + "message": "Filter+" + }, + "engine_static": { + "message": "Statisk" + }, + "extension_description": { + "message": "Mørkt tema for alle nettsteder. Ta vare på øynene, bruk Dark Reader for nettleseren, dag og kveld." + }, + "filter": { + "message": "Filter" + }, + "grayscale": { + "message": "Gråtone" + }, + "help": { + "message": "Hjelp" + }, + "invert_listed_only": { + "message": "Inverter bare" + }, + "latitude": { + "message": "Breddegrad" + }, + "light": { + "message": "Lys" + }, + "loading_please_wait": { + "message": "Laster, vennligst vent" + }, + "longitude": { + "message": "Lengdegrad" + }, + "mode": { + "message": "Modus" + }, + "more": { + "message": "Mer" + }, + "news": { + "message": "Nyheter" + }, + "not_invert_listed": { + "message": "Ikke inverter" + }, + "off": { + "message": "Av" + }, + "on": { + "message": "På" + }, + "only_for": { + "message": "Bare for" + }, + "only_for_description": { + "message": "Benytt instillingene bare for denne nettsiden" + }, + "open_dev_tools": { + "message": "Utvikler" + }, + "page_in_dark_list": { + "message": "Siden er i den globale\nmørk-modus listen" + }, + "page_protected": { + "message": "Denne siden er beskyttet\nav nettleseren" + }, + "privacy": { + "message": "Personvern" + }, + "read_more": { + "message": "Les mer" + }, + "select_font": { + "message": "Velg en skrifttype" + }, + "sepia": { + "message": "Bruntone" + }, + "set_active_hours": { + "message": "Angi aktivitetsperiode" + }, + "set_location": { + "message": "Aktiver etter solnedgang på stedet" + }, + "setup_add_site_hotkey": { + "message": "Legg til en hurtigtast for å legge til sider" + }, + "setup_hotkey_toggle_extension": { + "message": "Sett opp hurtigtast for\nå slå utvidelsen på/av" + }, + "setup_hotkey_toggle_site": { + "message": "Sett opp hurtigtast\nfor å invertere sider" + }, + "site_list": { + "message": "Side liste" + }, + "store_listing": { + "message": "Denne øye-beskyttelse utvidelsen aktiverer nattmodus og lager mørke temaer for nettsider. Dark Reader bytter ut lyse farger med mørke høy-kontrast farger og gjør lesing om kvelden enkelt.\n\nDu kan regulere lysstyrken, kontrasten, bruntone, nattmodus, skrifttype-instillinger og ignorer-liste.\n\nVi kan be deg om å støtte utviklingen av appen med en donasjon. Du kan se nyheter om Dark Reader i popup-vinduet for innstillinger. Det finnes utviklerverktøy for erfarne brukere.\n\nDark Reader viser ikke reklame og sender ikke ut brukerens data. Utvidelsen er åpen-kilde tilgjengelig på https://github.com/darkreader/darkreader\n\nDeaktiver lignende utvidelser før du installerer. Nyt opplevelsen!" + }, + "system_dark_mode": { + "message": "Bruk systemfargevalg" + }, + "system_dark_mode_description": { + "message": "Aktiveres når systemet mørk modus er på" + }, + "text_stroke": { + "message": "Tekst-tykkelse" + }, + "theme_generation_mode": { + "message": "Tema generering modus" + }, + "toggle_current_site": { + "message": "Inverter denne siden" + }, + "toggle_extension": { + "message": "Slå utvidelsen på/av" + }, + "try_experimental_theme_engines": { + "message": "Prøv ut **eksperimentell** tema motor:\n**Filter+** bevarer fargers metning og benytter GPUen\n**Statisk tema** genererer et enkelt, raskt tema\n**Dynamisk tema** analyserer farger og bilder" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/pl/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/pl/messages.json new file mode 100644 index 0000000..856d8f2 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/pl/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Dodaj stronę do listy" + }, + "automation": { + "message": "Automatyzacja" + }, + "brightness": { + "message": "Jasność" + }, + "change_browser_theme": { + "message": "Zmieniaj motyw przeglądarki" + }, + "contrast": { + "message": "Kontrast" + }, + "custom_browser_theme_off": { + "message": "Domyślny" + }, + "custom_browser_theme_on": { + "message": "Niestandardowy" + }, + "dark": { + "message": "Ciemny" + }, + "donate": { + "message": "Wspomóż" + }, + "engine_dynamic": { + "message": "Dynamicz." + }, + "engine_filter": { + "message": "Filtr" + }, + "engine_filter_plus": { + "message": "Filtr+" + }, + "engine_static": { + "message": "Statyczny" + }, + "extension_description": { + "message": "Tryb ciemny dla wszystkich stron internetowych. Zadbaj o swoje oczy, używaj ciemnego motywu przeglądając w dzień i w nocy." + }, + "filter": { + "message": "Filtr" + }, + "grayscale": { + "message": "Szarość" + }, + "help": { + "message": "Pomoc" + }, + "invert_listed_only": { + "message": "Odwróć tylko listę" + }, + "latitude": { + "message": "Szerokość" + }, + "light": { + "message": "Jasny" + }, + "loading_please_wait": { + "message": "Ładowanie, proszę czekać" + }, + "longitude": { + "message": "Długość" + }, + "mode": { + "message": "Tryb" + }, + "more": { + "message": "Więcej" + }, + "news": { + "message": "Aktualności" + }, + "not_invert_listed": { + "message": "Nie odwracaj listy" + }, + "off": { + "message": "Wyłącz." + }, + "on": { + "message": "Włącz." + }, + "only_for": { + "message": "Tylko dla" + }, + "only_for_description": { + "message": "Zastosuj ustawienia tylko dla bieżącej strony" + }, + "open_dev_tools": { + "message": "Narzędzia" + }, + "page_in_dark_list": { + "message": "Ta strona jest w globalnej\nczarnej liście" + }, + "page_protected": { + "message": "Ta strona jest chroniona\nprzez przeglądarkę" + }, + "privacy": { + "message": "Prywatność" + }, + "read_more": { + "message": "Więcej" + }, + "select_font": { + "message": "Wybierz czcionkę" + }, + "sepia": { + "message": "Sepia" + }, + "set_active_hours": { + "message": "Ustaw godziny aktywności" + }, + "set_location": { + "message": "Aktywuj po zmierzchu w danej lokacji" + }, + "setup_add_site_hotkey": { + "message": "Ustaw skrót dodający stronę" + }, + "setup_hotkey_toggle_extension": { + "message": "Ustaw rozszerzenie\nprzełącz przycisk" + }, + "setup_hotkey_toggle_site": { + "message": "Ustaw obecną stronę\nprzełącz przycisk" + }, + "site_list": { + "message": "Lista stron" + }, + "store_listing": { + "message": "To rozszerzenie dbające o zdrowie oczu aktywuje tryb nocny tworząc dynamiczne ciemne motywy dla stron internetowych. Dark Reader odwraca jasność kolorów, nadając im wysokiego kontrastu i ułatwiając czytanie w nocy.\n\nMożesz dopasować jasność, kontrast, filtr sepii, tryb ciemny, ustawienia czcionki i listę ignorowanych stron.\n\nMożemy poprosić Cię o wsparcie rozwoju aplikacji darowizną. Możesz zobaczyć wiadomości o Dark Reader w wyskakującym okienku ustawień. Istnieją narzędzia programistyczne dla doświadczonych użytkowników.\n\nDark reader nie wyświetla reklam ani nie wysyła nigdzie danych użytkowników. Jest oprogramowaniem o w pełni otwartym kodzie źródłowym https://github.com/darkreader/darkreader\n\nPrzed instalacją usuń podobne rozszerzenia. Miłego oglądania!" + }, + "system_dark_mode": { + "message": "Użyj systemowego schematu kolorów" + }, + "system_dark_mode_description": { + "message": "Aktywuj gdy systemowy tryb ciemny jest włączony" + }, + "text_stroke": { + "message": "Obrys tekstu" + }, + "theme_generation_mode": { + "message": "Tryb generowania motywu" + }, + "toggle_current_site": { + "message": "Przełącz dla obecnej strony" + }, + "toggle_extension": { + "message": "Przełącz rozszerzenie" + }, + "try_experimental_theme_engines": { + "message": "Wypróbuj **eksperymentalne** silniki motywów:\n**Filtr+** zachowuje nasycenie kolorów, wykorzystuje GPU\n**Statyczny motyw** generuje prosty, szybki motyw\n**Dynamiczny motyw** analizuje kolory i obrazy" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/pt_BR/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/pt_BR/messages.json new file mode 100644 index 0000000..ec0d38c --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/pt_BR/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Adicionar site à lista" + }, + "automation": { + "message": "Automatização" + }, + "brightness": { + "message": "Brilho" + }, + "change_browser_theme": { + "message": "Alterar o tema do navegador" + }, + "contrast": { + "message": "Contraste" + }, + "custom_browser_theme_off": { + "message": "Padrão" + }, + "custom_browser_theme_on": { + "message": "Personalizado" + }, + "dark": { + "message": "Escuro" + }, + "donate": { + "message": "Doar" + }, + "engine_dynamic": { + "message": "Dinâmico" + }, + "engine_filter": { + "message": "Filtro" + }, + "engine_filter_plus": { + "message": "Filtro+" + }, + "engine_static": { + "message": "Estático" + }, + "extension_description": { + "message": "Tema escuro para todos os sites. Mantenha os seus olhos relaxados usando o tema escuro em sua navegação diária." + }, + "filter": { + "message": "Filtro" + }, + "grayscale": { + "message": "Tons de cinza" + }, + "help": { + "message": "Ajuda" + }, + "invert_listed_only": { + "message": "Inverter listados" + }, + "latitude": { + "message": "Latitude" + }, + "light": { + "message": "Claro" + }, + "loading_please_wait": { + "message": "Carregando, aguarde" + }, + "longitude": { + "message": "Longitude" + }, + "mode": { + "message": "Modo" + }, + "more": { + "message": "Extras" + }, + "news": { + "message": "Notícias" + }, + "not_invert_listed": { + "message": "Não inverter listados" + }, + "off": { + "message": "Des." + }, + "on": { + "message": "Ati." + }, + "only_for": { + "message": "Somente para" + }, + "only_for_description": { + "message": "Aplicar configurações somente ao site atual" + }, + "open_dev_tools": { + "message": "Ferramentas" + }, + "page_in_dark_list": { + "message": "Este site está na\nlista negra global" + }, + "page_protected": { + "message": "Esta página é protegida\npelo navegador" + }, + "privacy": { + "message": "Privac." + }, + "read_more": { + "message": "Saiba mais" + }, + "select_font": { + "message": "Selecione uma fonte" + }, + "sepia": { + "message": "Tons de sépia" + }, + "set_active_hours": { + "message": "Definir o horário ativo" + }, + "set_location": { + "message": "Ativação automática após o pôr do sol" + }, + "setup_add_site_hotkey": { + "message": "Configurar um atalho para adicionar um site" + }, + "setup_hotkey_toggle_extension": { + "message": "Configurar atalho de\nalternância (extensão)" + }, + "setup_hotkey_toggle_site": { + "message": "Configurar atalho de\nalternância (site atual)" + }, + "site_list": { + "message": "Lista de sites" + }, + "store_listing": { + "message": "Esta extensão ajuda os seus olhos a relaxarem ao criar e aplicar o modo escuro aos sites que você visita. O Dark Reader inverte as cores brilhantes, tornando-as de alto contraste e deixando-as fáceis de serem lidas à noite.\n\nVocê pode ajustar o brilho, o contraste, os tons de sépia, o modo escuro, as configurações de fonte e a lista negra.\n\nPodemos solicitar que você apoie o desenvolvimento do aplicativo com uma doação. Notícias relacionadas à extensão podem ser exibidas no menu de configurações. Disponibilizamos ferramentas de desenvolvedor para usuários experientes.\n\nO Dark Reader não exibe anúncios e não compartilha os dados de seus usuários. O código-fonte é totalmente aberto (open-source): https://github.com/darkreader/darkreader\n\nAntes de instalar esta extensão, desative extensões semelhantes. Aprecie a vista!" + }, + "system_dark_mode": { + "message": "Usar o esquema de cores do sistema" + }, + "system_dark_mode_description": { + "message": "Ativar quando o sistema estiver no modo escuro" + }, + "text_stroke": { + "message": "Intensidade do texto" + }, + "theme_generation_mode": { + "message": "Modo de geração de tema" + }, + "toggle_current_site": { + "message": "Alternar (site atual)" + }, + "toggle_extension": { + "message": "Ativar/des. extensão" + }, + "try_experimental_theme_engines": { + "message": "Experimente os motores de temas **experimentais**:\n**Filtro+** preserva a saturação de cores (usa a GPU)\n**Tema estático** gera um tema simples rapidamente\n**Tema dinâmico** analisa cores e imagens" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/pt_PT/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/pt_PT/messages.json new file mode 100644 index 0000000..21614c8 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/pt_PT/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Adicionar site à lista" + }, + "automation": { + "message": "Automatização" + }, + "brightness": { + "message": "Brilho" + }, + "change_browser_theme": { + "message": "Alterar o tema do navegador" + }, + "contrast": { + "message": "Contraste" + }, + "custom_browser_theme_off": { + "message": "Predefinido" + }, + "custom_browser_theme_on": { + "message": "Personalizado" + }, + "dark": { + "message": "Escuro" + }, + "donate": { + "message": "Doar" + }, + "engine_dynamic": { + "message": "Dinâmico" + }, + "engine_filter": { + "message": "Filtro" + }, + "engine_filter_plus": { + "message": "Filtro+" + }, + "engine_static": { + "message": "Estático" + }, + "extension_description": { + "message": "Tema escuro para todos os websites. Cuide dos seus olhos, use o Dark Reader para navegação noturna e diária." + }, + "filter": { + "message": "Filtro" + }, + "grayscale": { + "message": "Tons de cinza" + }, + "help": { + "message": "Ajuda" + }, + "invert_listed_only": { + "message": "Inverter listado" + }, + "latitude": { + "message": "Latitude" + }, + "light": { + "message": "Claro" + }, + "loading_please_wait": { + "message": "A carregar, por favor aguarde" + }, + "longitude": { + "message": "Longitude" + }, + "mode": { + "message": "Modo" + }, + "more": { + "message": "Mais" + }, + "news": { + "message": "Notícias" + }, + "not_invert_listed": { + "message": "Não inverter listado" + }, + "off": { + "message": "Des." + }, + "on": { + "message": "Ligar" + }, + "only_for": { + "message": "Apenas para" + }, + "only_for_description": { + "message": "Aplicar definições apenas ao website atual" + }, + "open_dev_tools": { + "message": "Ferramentas" + }, + "page_in_dark_list": { + "message": "Este site está na lista\nnegra global" + }, + "page_protected": { + "message": "Esta página é protegida\npelo navegador" + }, + "privacy": { + "message": "Privac." + }, + "read_more": { + "message": "Saiba mais" + }, + "select_font": { + "message": "Selecionar um tipo de letra" + }, + "sepia": { + "message": "Sépia" + }, + "set_active_hours": { + "message": "Defina as horas de atividade" + }, + "set_location": { + "message": "Ativar após o pôr-do-sol no local" + }, + "setup_add_site_hotkey": { + "message": "Configurar uma tecla de atalho para adicionar site" + }, + "setup_hotkey_toggle_extension": { + "message": "Tecla de atalho de alternância\nda extensão de configuração" + }, + "setup_hotkey_toggle_site": { + "message": "Configurar o atalho de\nalternância do site atual" + }, + "site_list": { + "message": "Lista de sites" + }, + "store_listing": { + "message": "Esta extensão de cuidados com os olhos ativa o modo noturno ao criar temas escuros para sites. O Dark Reader inverte as cores brilhantes, tornando-as de alto contraste e fáceis de ler à noite.\n\nPode ajustar o brilho, o contraste, o filtro sépia, o modo escuro, as definições do tipo de letra e a lista de ignorados.\n\nPodemos pedir que você apoie o desenvolvimento do aplicativo com uma doação. Você pode ver notícias sobre o Dark Reader no pop-up de configurações. Existem Ferramentas de Desenvolvedor para usuários experientes.\n\nO Dark Reader não mostra anúncios e não envia os dados dos utilizadores para lado nenhum. É totalmente de código aberto: https://github.com/darkreader/darkreader\n\nAntes de o instalar, desative extensões semelhantes. Desfrute da visualização!" + }, + "system_dark_mode": { + "message": "Usar esquema de cores do sistema" + }, + "system_dark_mode_description": { + "message": "Ativar quando o modo escuro sistema está ligado" + }, + "text_stroke": { + "message": "Traço do texto" + }, + "theme_generation_mode": { + "message": "Modo de geração de tema" + }, + "toggle_current_site": { + "message": "Alternar o site atual" + }, + "toggle_extension": { + "message": "Alternar extensão" + }, + "try_experimental_theme_engines": { + "message": "Experimentar os motores de temas **experimental**:\n**Filtro+** preserva a saturação de cores, usa GPU\n**Tema estático** gera um tema rápido simples\n**Tema dinâmico** analisa cores e imagens" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ro/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ro/messages.json new file mode 100644 index 0000000..43acd13 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ro/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Adaugă siteul la listă" + }, + "automation": { + "message": "Automatizare" + }, + "brightness": { + "message": "Luminozitate" + }, + "change_browser_theme": { + "message": "Schimbă tema navigatorului" + }, + "contrast": { + "message": "Contrast" + }, + "custom_browser_theme_off": { + "message": "Implicită" + }, + "custom_browser_theme_on": { + "message": "Particularizată" + }, + "dark": { + "message": "Întunecat" + }, + "donate": { + "message": "Donează" + }, + "engine_dynamic": { + "message": "Dinamic" + }, + "engine_filter": { + "message": "Filtru" + }, + "engine_filter_plus": { + "message": "Filtru+" + }, + "engine_static": { + "message": "Static" + }, + "extension_description": { + "message": "Temă întunecată pentru orice site. Ai grijă de ochii tăi, folosește Dark Reader pentru cititul noaptea și de zi cu zi." + }, + "filter": { + "message": "Filtru" + }, + "grayscale": { + "message": "Scară de gri" + }, + "help": { + "message": "Ajutor" + }, + "invert_listed_only": { + "message": "Inversez doar lista" + }, + "latitude": { + "message": "Latitudine" + }, + "light": { + "message": "Luminos" + }, + "loading_please_wait": { + "message": "Se încarcă, vă rog așteptați" + }, + "longitude": { + "message": "Longitudine" + }, + "mode": { + "message": "Mod" + }, + "more": { + "message": "Mai mult" + }, + "news": { + "message": "Știri" + }, + "not_invert_listed": { + "message": "Nu inversez lista" + }, + "off": { + "message": "Oprit" + }, + "on": { + "message": "Pornit" + }, + "only_for": { + "message": "Doar pentru" + }, + "only_for_description": { + "message": "Aplică setările doar pentru siteul curent" + }, + "open_dev_tools": { + "message": "Instrumente" + }, + "page_in_dark_list": { + "message": "Acest site este în\nLista Întunecată globală" + }, + "page_protected": { + "message": "Această pagină este protejată\nde navigator" + }, + "privacy": { + "message": "Confidenț." + }, + "read_more": { + "message": "Citește mai mult" + }, + "select_font": { + "message": "Selectează un font" + }, + "sepia": { + "message": "Sepia" + }, + "set_active_hours": { + "message": "Setați orele de activitate" + }, + "set_location": { + "message": "Activați după apusul soarelui în locația" + }, + "setup_add_site_hotkey": { + "message": "Setează scurtătura pentru adăugare site" + }, + "setup_hotkey_toggle_extension": { + "message": "Setează extensia\nscurtătură comutare" + }, + "setup_hotkey_toggle_site": { + "message": "Setează siteul curent\nscurtătura de comutare" + }, + "site_list": { + "message": "Listă siteuri" + }, + "store_listing": { + "message": "Această extensie, care se îngrijește de ochii tăi, permite activarea modului de noapte creând pe loc o temă întunecată pentru siteuri. Dark Reader inversează culorile luminoase mărindu-le contrastul și făcându-le ușor de citit noptea.\n\nPoți ajusta luminozitatea, contrastul, filtrul sepia, modul întunecat, setările fontului si lista siteurilor de ignorat.\n\nVă putem cere să susțineți dezvoltarea aplicației printr-o donație. Este posibil să vedeți știri despre Dark Reader în fereastra pop-up de setări. Există instrumente pentru dezvoltatori pentru utilizatorii experimentați.\n\nDark Reader nu afișează reclame și nu trimite datele utilizatorului nicăieri. Este în întregime open-source https://github.com/darkreader/darkreader\n\nÎnainte de instalare dezactivează extensile similare. Vizionare plăcută!" + }, + "system_dark_mode": { + "message": "Utilizați schema de culori sistem" + }, + "system_dark_mode_description": { + "message": "Activați când modul întunecat sistem este pornit" + }, + "text_stroke": { + "message": "Contur text" + }, + "theme_generation_mode": { + "message": "Modul de generare teme" + }, + "toggle_current_site": { + "message": "Comută siteul curent" + }, + "toggle_extension": { + "message": "Comută extensia" + }, + "try_experimental_theme_engines": { + "message": "Încearcă motoarele cu teme **experimentale**:\n**Filtru+** păstrează saturația culorilor, folosește GPU\n**Tema statică** generează o temă simplă si rapidă\n**Tema dinamică** analizeză culorile si imamginile" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ru/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ru/messages.json new file mode 100644 index 0000000..9f007c3 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/ru/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Добавить сайт в список" + }, + "automation": { + "message": "Автоматизация" + }, + "brightness": { + "message": "Яркость" + }, + "change_browser_theme": { + "message": "Изменить тему браузера" + }, + "contrast": { + "message": "Контрастность" + }, + "custom_browser_theme_off": { + "message": "По умолчанию" + }, + "custom_browser_theme_on": { + "message": "Изменённая" + }, + "dark": { + "message": "Тёмный" + }, + "donate": { + "message": "Поддержка" + }, + "engine_dynamic": { + "message": "Динам." + }, + "engine_filter": { + "message": "Фильтр" + }, + "engine_filter_plus": { + "message": "Фильтр+" + }, + "engine_static": { + "message": "Стат." + }, + "extension_description": { + "message": "Тёмная тема для каждого сайта. Берегите зрение, используйте Дарк Ридер для ночного или ежедневного просмотра веб-страниц." + }, + "filter": { + "message": "Фильтр" + }, + "grayscale": { + "message": "Оттенки серого" + }, + "help": { + "message": "Справка" + }, + "invert_listed_only": { + "message": "Инверт. только эти" + }, + "latitude": { + "message": "широта" + }, + "light": { + "message": "Светлый" + }, + "loading_please_wait": { + "message": "Идёт загрузка, подождите" + }, + "longitude": { + "message": "Долгота" + }, + "mode": { + "message": "Режим" + }, + "more": { + "message": "Ещё" + }, + "news": { + "message": "Новости" + }, + "not_invert_listed": { + "message": "Не инвертировать" + }, + "off": { + "message": "Откл." + }, + "on": { + "message": "Вкл." + }, + "only_for": { + "message": "Только для" + }, + "only_for_description": { + "message": "Применить настройки только к тек. сайту" + }, + "open_dev_tools": { + "message": "Разраб." + }, + "page_in_dark_list": { + "message": "Эта страница в глоб\nсписке Тёмных Сайтов" + }, + "page_protected": { + "message": "Эта страница защищена\nбраузером" + }, + "privacy": { + "message": "Согл." + }, + "read_more": { + "message": "Читать ещё" + }, + "select_font": { + "message": "Выберите шрифт" + }, + "sepia": { + "message": "Сепия" + }, + "set_active_hours": { + "message": "Установите период активности" + }, + "set_location": { + "message": "Включить на закате" + }, + "setup_add_site_hotkey": { + "message": "Уст. сочет. клавиш для доб. сайта в список" + }, + "setup_hotkey_toggle_extension": { + "message": "Уст. сочетание\nклавиш" + }, + "setup_hotkey_toggle_site": { + "message": "Установите сочетание\nклавиш" + }, + "site_list": { + "message": "Список" + }, + "store_listing": { + "message": "Это расширение переводит браузер в ночной режим. Дарк Ридер заменяет светлый фон тёмным, что снижает усталость глаз при долгой работе за компьютером либо при просмотре веб-страниц ночью.\n\nИмеется возможность настраивать яркость, контрастность, шрифт, режим инверсии, режим наложения жёлтого фильтра (сепия).\n\nМы можем попросить вас поддержать разработку приложения пожертвованием. Вы можете увидеть новости о Dark Reader во всплывающем окне настроек. Есть инструменты разработчика для опытных пользователей.\n\nДарк Ридер не встраивает рекламу и не собирает пользовательские данные. Весь исходный код открыт https://github.com/darkreader/darkreader\n\nПеред установкой отключите подобные расширения. Приятного просмотра!" + }, + "system_dark_mode": { + "message": "Использовать системную цветовую схему" + }, + "system_dark_mode_description": { + "message": "Вкл., если системный ночной режим активен" + }, + "text_stroke": { + "message": "Обводка текста" + }, + "theme_generation_mode": { + "message": "Режим генерации темы" + }, + "toggle_current_site": { + "message": "Переключить тек. сайт" + }, + "toggle_extension": { + "message": "Вкл/откл расширен." + }, + "try_experimental_theme_engines": { + "message": "Попробуйте **экспериментальные** режимы:\n**Фильтр+** сохр. яркость цветов, использует GPU\n**Статический режим** создаёт простую тему\n**Динамический** анализирует цвета и картинки" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/si/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/si/messages.json new file mode 100644 index 0000000..b810d30 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/si/messages.json @@ -0,0 +1,155 @@ +{ + "extension_description": { + "message": "සෑම වෙබ් අඩවියක් සදහාම Dark mode. ඔබේ ඇස් සුරකින්න, රාත්‍රී සහ දිනපතා වෙබ් අඩවි ගවේෂණය කිරීමේදී Dark mode භාවිතා කරන්න." + }, + "loading_please_wait": { + "message": "පූරණය වෙමින්, කරුණාකර රැඳී සිටින්න" + }, + "on": { + "message": "සක්‍රියයි" + }, + "off": { + "message": "අක්‍රියයි" + }, + "toggle_current_site": { + "message": "මෙම අඩවිය Toggle කරන්න" + }, + "setup_hotkey_toggle_site": { + "message": "මෙම වෙබ් අඩවිය සකසන්න\nඉක්මන් ප්‍රවේශ යතුරු (hotkey) toggle කරන්න" + }, + "toggle_extension": { + "message": "Extension එක toggle කරන්න" + }, + "setup_hotkey_toggle_extension": { + "message": "Extension එක සකසන්න\nඉක්මන් ප්‍රවේශ යතුරු (hotkey) toggle කරන්න" + }, + "automation": { + "message": "ස්වයංක්රීයකරණය" + }, + "set_active_hours": { + "message": "ක්‍රියාකාරී වේලාවන් සකසන්න" + }, + "set_location": { + "message": "ස්ථානයක හිරු බැස යෑමෙන් පසු ක්රියාත්මක" + }, + "longitude": { + "message": "දේශාංශ" + }, + "latitude": { + "message": "අක්ෂාංශ" + }, + "page_protected": { + "message": "මෙම පිටුව ආරක්‍ෂා කර ඇත\nබ්‍රව්සරය මඟින්" + }, + "page_in_dark_list": { + "message": "මෙම වෙබ් අඩවිය ගෝලීය වේ\nඅඳුරු ලැයිස්තුව" + }, + "system_dark_mode": { + "message": "පද්ධතිය වර්ණ භාවිතා කරන්න" + }, + "system_dark_mode_description": { + "message": "පද්ධතිය අඳුරු මාදිලිය මත විට ක්රියාත්මක" + }, + "filter": { + "message": "Filter" + }, + "mode": { + "message": "මාදිලිය" + }, + "dark": { + "message": "Dark" + }, + "light": { + "message": "Light" + }, + "brightness": { + "message": "Brightness" + }, + "contrast": { + "message": "Contrast" + }, + "grayscale": { + "message": "Grayscale" + }, + "sepia": { + "message": "Sepia" + }, + "only_for": { + "message": "සඳහා පමණි" + }, + "only_for_description": { + "message": "සැකසුම් අදාළ වන්නේ වත්මන් වෙබ් අඩවියට පමණි" + }, + "site_list": { + "message": "වෙබ් අඩවි ලැයිස්තුව" + }, + "invert_listed_only": { + "message": "ප්‍රතිලෝම ලැයිස්තුව පමණයි" + }, + "not_invert_listed": { + "message": "ප්‍රතිලෝම ලැයිස්තුගත කර නැත" + }, + "add_site_to_list": { + "message": "වෙබ් අඩවිය ලැයිස්තුවට එක් කරන්න" + }, + "setup_add_site_hotkey": { + "message": "වෙබ් අඩවිය එක් කිරීම සඳහා ඉක්මන් ප්‍රවේශ යතුරක් (hotkey) සකසන්න" + }, + "more": { + "message": "තව" + }, + "select_font": { + "message": "Font එකක් තෝරන්න" + }, + "text_stroke": { + "message": "Text stroke" + }, + "try_experimental_theme_engines": { + "message": "**පර්යේෂණාත්මක** තේමා එන්ජින් අත්හදා බලන්න:\n**පෙරණය+** වර්ණ සන්තෘප්තිය ආරක්ෂා කරයි, GPU භාවිතා කරයි\n**ස්ථිතික තේමාව** සරල වේගවත් තේමාවක් ජනනය කරයි\n**ගතික තේමාව** වර්ණ හා රූප විශ්ලේෂණය කරයි" + }, + "engine_filter": { + "message": "පෙරහන" + }, + "engine_filter_plus": { + "message": "පෙරහන+" + }, + "engine_static": { + "message": "ස්ථිතික" + }, + "engine_dynamic": { + "message": "ගතික" + }, + "theme_generation_mode": { + "message": "තේමා උත්පාදන මාදිලිය" + }, + "custom_browser_theme_on": { + "message": "අභිරුචි (Custom)" + }, + "custom_browser_theme_off": { + "message": "පෙරනිමි (Default)" + }, + "change_browser_theme": { + "message": "බ්‍රව්සර් තේමාව වෙනස් කරන්න" + }, + "privacy": { + "message": "පෞද්ගලිකත්වය" + }, + "help": { + "message": "උදව්" + }, + "donate": { + "message": "පරිත්‍යාග කරන්න" + }, + "news": { + "message": "පුවත්" + }, + "read_more": { + "message": "වැඩිදුර කියවන්න" + }, + "open_dev_tools": { + "message": "Dev මෙවලම්" + }, + "store_listing": { + "message": "මෙම අක්ෂි ආරක්ෂණ දිගුව ඉතා ඉක්මණින් හා අවිධිමත් ආකාරයකින් වෙබ් අඩවි සඳහා අඳුරු තේමාවන් නිර්මාණය කිරීමට රාත්‍රී මාදිලිය සක්‍රීය කරයි. Dark Reader දීප්තිමත් වර්ණ ප්‍රතිලෝම (invert) කිරිමෙන් ඒවා high contrast සහ රාත්‍රියේදී කියවීමට පහසු කරයි.\n\nඔබට දීප්තිය (brightness), contrast, sepia ෆිල්ටරය, අඳුරු මාදිලිය, අකුරු (font) සැකසුම් සහ නොසලකා හැරීම් ලැයිස්තුව (ignore-list) සකස් කළ හැකිය.\n\nපරිත්‍යාගයක් සමඟ යෙදුමේ සංවර්ධනයට සහාය දෙන ලෙස අපි ඔබෙන් ඉල්ලා සිටිය හැක. ඔබට සැකසීම් උත්පතන තුළ Dark Reader පිළිබඳ පුවත් දැකිය හැක. පළපුරුදු පරිශීලකයින් සඳහා සංවර්ධක මෙවලම් තිබේ.\n\nDark Reader දැන්වීම් නොපෙන්වන අතර පරිශීලකයාගේ දත්ත කොතැනකටවත් යවන්නේ නැත. එය සම්පූර්ණයෙන්ම විවෘත මූලාශ්‍රයකි (open-source) https://github.com/darkreader/darkreader\n\nඔබ ස්ථාපනය කිරීමට පෙර සමාන දිගු (extensions) අක්‍රීය කරන්න. නැරඹීමෙන් විනෝද වන්න!" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/sk/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/sk/messages.json new file mode 100644 index 0000000..c107d29 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/sk/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Pridať stránku na zoznam" + }, + "automation": { + "message": "Automatizácia" + }, + "brightness": { + "message": "Jas" + }, + "change_browser_theme": { + "message": "Zmeniť motív prehliadača" + }, + "contrast": { + "message": "Kontrast" + }, + "custom_browser_theme_off": { + "message": "Predvolený" + }, + "custom_browser_theme_on": { + "message": "Vlastný" + }, + "dark": { + "message": "Tmavý" + }, + "donate": { + "message": "Prispejte" + }, + "engine_dynamic": { + "message": "Dynamický" + }, + "engine_filter": { + "message": "Filter" + }, + "engine_filter_plus": { + "message": "Filter+" + }, + "engine_static": { + "message": "Statický" + }, + "extension_description": { + "message": "Tmavý režim pre každú stránku. Šetrite svoje oči a používajte tmavý motív po celý deň." + }, + "filter": { + "message": "Filter" + }, + "grayscale": { + "message": "Odtiene sivej" + }, + "help": { + "message": "Pomocník" + }, + "invert_listed_only": { + "message": "Invertovať len" + }, + "latitude": { + "message": "Zemepisná šírka" + }, + "light": { + "message": "Svetlý" + }, + "loading_please_wait": { + "message": "Načítava sa, čakajte, prosím" + }, + "longitude": { + "message": "Zemepisná dĺžka" + }, + "mode": { + "message": "Režim" + }, + "more": { + "message": "Viac" + }, + "news": { + "message": "Novinky" + }, + "not_invert_listed": { + "message": "Neinvertovať" + }, + "off": { + "message": "Vyp." + }, + "on": { + "message": "Zap." + }, + "only_for": { + "message": "Len pre" + }, + "only_for_description": { + "message": "Použiť nastavenia len pre aktuálnu stránku" + }, + "open_dev_tools": { + "message": "Vývojárske nástroje" + }, + "page_in_dark_list": { + "message": "Táto stránka má\nvlastný tmavý režim" + }, + "page_protected": { + "message": "Táto stránka je nedostupná\npre toto rozlíšenie" + }, + "privacy": { + "message": "Súkromie" + }, + "read_more": { + "message": "Viac informácií" + }, + "select_font": { + "message": "Vybrať písmo" + }, + "sepia": { + "message": "Sépia" + }, + "set_active_hours": { + "message": "Nastaviť čas používania" + }, + "set_location": { + "message": "Aktivovať po západe slnka podľa polohy" + }, + "setup_add_site_hotkey": { + "message": "Nastaviť klávesovú skratku pre pridanie stránky" + }, + "setup_hotkey_toggle_extension": { + "message": "Nastaviť klávesovú skratku\npre prepnutie rozšírenia" + }, + "setup_hotkey_toggle_site": { + "message": "Nastaviť klávesovú skratku\npre prepnutie aktuálnej stránky" + }, + "site_list": { + "message": "Zoznam stránok" + }, + "store_listing": { + "message": "Toto rozšírenie je šetrné k očiam, vytvára nočný režim pre stránky za pochodu. Dark Reader invertuje jasné farby a robí ich kontrastnejšími, čím sa zlepšuje ich čitateľnosť v noci.\n\nUpravovať môžete jas, kontrast, sépiový filter, tmavý režim, nastavenia písma a zoznam ignorovaných stránok.\n\nMôžeme vás požiadať, aby ste podporili vývoj aplikácie darom. Novinky o Dark Reader môžete vidieť vo vyskakovacom okne nastavení. Pre skúsených používateľov existujú nástroje pre vývojárov.\n\nDark Reader je bez reklám a nikam neodosiela žiadne dáta užívateľov. Má plne otvorený zdrojový kód https://github.com/darkreader/darkreader\n\nPred inštaláciou zakážte podobné rozšírenia. Užite si sledovanie!" + }, + "system_dark_mode": { + "message": "Použiť farebnú schému systému" + }, + "system_dark_mode_description": { + "message": "Aktivovať pri zapnutom systémovom tmavom režime" + }, + "text_stroke": { + "message": "Obrys písma" + }, + "theme_generation_mode": { + "message": "Generované motívy" + }, + "toggle_current_site": { + "message": "Prepnúť aktuálnu stránku" + }, + "toggle_extension": { + "message": "Zap./Vyp. rozšírenie" + }, + "try_experimental_theme_engines": { + "message": "Vyskúšajte **experimenálne** motívy:\n**Filter+** zachováva sýtosť farieb, využíva GPU\n**Statický motív** generuje jednoduchý a rýchly motív\n**Dynamický motív** analyzuje farby a obrázky" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/sr/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/sr/messages.json new file mode 100644 index 0000000..fbff62a --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/sr/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Dodajte sajt na listu" + }, + "automation": { + "message": "Automatizacija" + }, + "brightness": { + "message": "Osvetljenje" + }, + "change_browser_theme": { + "message": "Promenite temu pregledača" + }, + "contrast": { + "message": "Kontrast" + }, + "custom_browser_theme_off": { + "message": "Difolt" + }, + "custom_browser_theme_on": { + "message": "Podešena" + }, + "dark": { + "message": "Tamni" + }, + "donate": { + "message": "Donirajte" + }, + "engine_dynamic": { + "message": "Dinamično" + }, + "engine_filter": { + "message": "Filter" + }, + "engine_filter_plus": { + "message": "Filter+" + }, + "engine_static": { + "message": "Statično" + }, + "extension_description": { + "message": "Tamni mod za svaki sajt. Pazite na svoje oči, koristite tamnu temu danju i noću." + }, + "filter": { + "message": "Filter" + }, + "grayscale": { + "message": "Sivi mod" + }, + "help": { + "message": "Pomoć" + }, + "invert_listed_only": { + "message": "Invertujte izlistane" + }, + "latitude": { + "message": "Geogr. širina" + }, + "light": { + "message": "Svetli" + }, + "loading_please_wait": { + "message": "Učitavanje, molimo sačekajte" + }, + "longitude": { + "message": "Geogr. dužina" + }, + "mode": { + "message": "Mod" + }, + "more": { + "message": "Više" + }, + "news": { + "message": "Vesti" + }, + "not_invert_listed": { + "message": "Ne invertujte izlistane" + }, + "off": { + "message": "Isklj." + }, + "on": { + "message": "Uklj." + }, + "only_for": { + "message": "Samo za" + }, + "only_for_description": { + "message": "Primenite podešavanja samo za trenutni sajt" + }, + "open_dev_tools": { + "message": "Alatke za razvoj" + }, + "page_in_dark_list": { + "message": "Ovaj sajt je u globalnoj\nlisti tamnih sajtova" + }, + "page_protected": { + "message": "Ovu stranicu štiti\nveb pregledač" + }, + "privacy": { + "message": "Privatnost" + }, + "read_more": { + "message": "Čitajte više" + }, + "select_font": { + "message": "Izaberite font" + }, + "sepia": { + "message": "Sepija" + }, + "set_active_hours": { + "message": "Podesite aktivne sate" + }, + "set_location": { + "message": "Aktivirajte po zalasku sunca" + }, + "setup_add_site_hotkey": { + "message": "Podesite dugme za dodavanje sajta" + }, + "setup_hotkey_toggle_extension": { + "message": "Podesite ekstenziju\nuklj. dugme" + }, + "setup_hotkey_toggle_site": { + "message": "Podesite trenutni sajt\nuklj. dugme" + }, + "site_list": { + "message": "Lista sajtova" + }, + "store_listing": { + "message": "Ova ekstenzija brine o vašim očima tako što omogućava tamnu temu za sajtove. Dark Reader invertuje svetle boje i pojačava kontrast, što omogućava lakše čitanje noću.\n\nMožete podesiti osvetljenje, kontrast, sepija filter, tamni mod, font i listu ignorisanih sajtova.\n\nMožemo vas zamoliti da podržite razvoj aplikacije donacijom. Možda ćete videti vesti o Dark Reader-u u iskačućem prozoru za podešavanja. Postoje alatke za programere za iskusne korisnike.\n\nDark Reader ne prikazuje reklame i nigde ne šalje podatke korisnika. Kod ekstenzije je u potpunosti otvoren: https://github.com/darkreader/darkreader\n\nPre instalacije, isključite druge slične ekstenzije. Uživajte!" + }, + "system_dark_mode": { + "message": "Koristite temu sistema" + }, + "system_dark_mode_description": { + "message": "Aktivacija kada sistem koristi tamni mod" + }, + "text_stroke": { + "message": "Debljina teksta" + }, + "theme_generation_mode": { + "message": "Mod generacije tema" + }, + "toggle_current_site": { + "message": "Uklj. trenutni sajt" + }, + "toggle_extension": { + "message": "Uklj. ekstenziju" + }, + "try_experimental_theme_engines": { + "message": "Probajte **eksperimentalne** teme:\n**Filter+** čuva saturaciju boja, koristi GPU\n**Statična tema** kreira prostu brzu temu\n**Dinamična tema** analizira boje i slike" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/sv/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/sv/messages.json new file mode 100644 index 0000000..2b7e189 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/sv/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Lägg till webbplats i listan" + }, + "automation": { + "message": "Automatisering" + }, + "brightness": { + "message": "Ljusstyrka" + }, + "change_browser_theme": { + "message": "Ändra webbläsarens tema" + }, + "contrast": { + "message": "Kontrast" + }, + "custom_browser_theme_off": { + "message": "Standard" + }, + "custom_browser_theme_on": { + "message": "Anpassad" + }, + "dark": { + "message": "Mörkt" + }, + "donate": { + "message": "Donera" + }, + "engine_dynamic": { + "message": "Dynamisk" + }, + "engine_filter": { + "message": "Filter" + }, + "engine_filter_plus": { + "message": "Filter+" + }, + "engine_static": { + "message": "Statisk" + }, + "extension_description": { + "message": "Mörkt läge på alla webbplatser. Ta hand om dina ögon och använd ett mörkt tema för att surfa på natten och dagen." + }, + "filter": { + "message": "Filter" + }, + "grayscale": { + "message": "Gråskala" + }, + "help": { + "message": "Hjälp" + }, + "invert_listed_only": { + "message": "Invertera endast" + }, + "latitude": { + "message": "Latitud" + }, + "light": { + "message": "Ljust" + }, + "loading_please_wait": { + "message": "Laddar, var god vänta" + }, + "longitude": { + "message": "Longitud" + }, + "mode": { + "message": "Läge" + }, + "more": { + "message": "Mer" + }, + "news": { + "message": "Nyheter" + }, + "not_invert_listed": { + "message": "Invertera inte" + }, + "off": { + "message": "Av" + }, + "on": { + "message": "På" + }, + "only_for": { + "message": "Endast för" + }, + "only_for_description": { + "message": "Använd inställningarna bara för aktuell webbplats" + }, + "open_dev_tools": { + "message": "Verktyg" + }, + "page_in_dark_list": { + "message": "Den här webbplatsen finns\ni den globala listan" + }, + "page_protected": { + "message": "Den här webbplatsen\nskyddas av webbläsaren" + }, + "privacy": { + "message": "Integritet" + }, + "read_more": { + "message": "Läs mer" + }, + "select_font": { + "message": "Välj ett typsnitt" + }, + "sepia": { + "message": "Sepia" + }, + "set_active_hours": { + "message": "Ange aktiva timmar" + }, + "set_location": { + "message": "Aktivera vid solnedgång vid position" + }, + "setup_add_site_hotkey": { + "message": "Ange kortkommando för att lägga till webbplatser" + }, + "setup_hotkey_toggle_extension": { + "message": "Konfigurera tillägg\nslå på/av kortkommando" + }, + "setup_hotkey_toggle_site": { + "message": "Konfigurera aktuell webbplats\nslå på/av kortkommando" + }, + "site_list": { + "message": "Webbplatslista" + }, + "store_listing": { + "message": "Detta ögonskonande tillägg aktiverar ett nattläge som skapar mörka teman på webbplatser. Dark Reader inverterar ljusa färger för att skapa hög kontrast och göra det enkelt att läsa på natten.\n\nDu kan justera ljusstyrkan, kontrasten, sepiafiltret, mörkerläget, typsnittet och ignoreringslistan.\n\nVi kan be dig att stödja utvecklingen av appen med en donation. Du kan se nyheter om Dark Reader i popup-fönstret för inställningar. Det finns utvecklarverktyg för erfarna användare.\n\nDark Reader visar inte reklam och skickar inte användardata någonstans. Den har helt öppen källkod https://github.com/darkreader/darkreader\n\nInaktivera liknande tillägg innan du installerar. Trevlig läsning!" + }, + "system_dark_mode": { + "message": "Använd systemets färgschema" + }, + "system_dark_mode_description": { + "message": "Aktivera när systemets mörka läge är på" + }, + "text_stroke": { + "message": "Textkontur" + }, + "theme_generation_mode": { + "message": "Genereringsläge för tema" + }, + "toggle_current_site": { + "message": "Slå på/av denna webbplats" + }, + "toggle_extension": { + "message": "Slå på/av tillägg" + }, + "try_experimental_theme_engines": { + "message": "Testa **experimentella** temamotorer:\n**Filter+** bevarar färgmättnaden, använder grafikprocessorn\n**Statiskt tema** genererar ett snabbt och enkelt tema\n**Dynamiskt tema** analyserar färger och bilder" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/te/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/te/messages.json new file mode 100644 index 0000000..7988385 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/te/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "జాబితాకు సైట్‌ను జోడించండి" + }, + "automation": { + "message": "స్వయంచాలకంగా పూర్తయింది" + }, + "brightness": { + "message": "ఎంత కాంతి" + }, + "change_browser_theme": { + "message": "బ్రౌజర్ థీమ్‌ను మార్చండి" + }, + "contrast": { + "message": "విరుద్ధంగా" + }, + "custom_browser_theme_off": { + "message": "డిఫాల్ట్" + }, + "custom_browser_theme_on": { + "message": "ఆచారం" + }, + "dark": { + "message": "నలుపు" + }, + "donate": { + "message": "దయచేసి దానం చేయండి" + }, + "engine_dynamic": { + "message": "చురుకుగా" + }, + "engine_filter": { + "message": "ఫిల్టర్" + }, + "engine_filter_plus": { + "message": "ఫిల్టర్+" + }, + "engine_static": { + "message": "స్థిరమైన" + }, + "extension_description": { + "message": "ప్రతి వెబ్‌సైట్‌కి ముదురు థీమ్. మీ కళ్లను కాపాడుకోండి, రాత్రి మరియు పగలు బ్రౌజింగ్ట్‌కి ముదురు థీమ్ ఉపయోగించండి." + }, + "filter": { + "message": "ఫిల్టర్" + }, + "grayscale": { + "message": "గ్రేస్కేల్" + }, + "help": { + "message": "సహాయం" + }, + "invert_listed_only": { + "message": "విలోమ జాబితా మాత్రమే" + }, + "latitude": { + "message": "అక్షాంశం" + }, + "light": { + "message": "కాంతి" + }, + "loading_please_wait": { + "message": "దయచేసి వేచి ఉండండి..." + }, + "longitude": { + "message": "రేఖాంశం" + }, + "mode": { + "message": "మోడ్" + }, + "more": { + "message": "మరింత" + }, + "news": { + "message": "వార్తలు" + }, + "not_invert_listed": { + "message": "విలోమ జాబితా కాదు" + }, + "off": { + "message": "ఆపండి" + }, + "on": { + "message": "ఆన్" + }, + "only_for": { + "message": "దీని కోసం మాత్రమే" + }, + "only_for_description": { + "message": "ప్రస్తుత సైట్ కోసం మాత్రమే ఎంపికలను వర్తించండి" + }, + "open_dev_tools": { + "message": "ఓపెన్ దేవ్ టూల్స్" + }, + "page_in_dark_list": { + "message": "ఈ పేజీ\nచీకటి థీమ్ జాబితాలో ఉంది" + }, + "page_protected": { + "message": "ఈ పేజీ\nబ్రౌజర్ ద్వారా రక్షించబడింది" + }, + "privacy": { + "message": "గోప్యత" + }, + "read_more": { + "message": "ఇంకా చదవండి" + }, + "select_font": { + "message": "ఫాంట్ ఎంచుకోండి" + }, + "sepia": { + "message": "సెపియా" + }, + "set_active_hours": { + "message": "మేల్కొనే గంటలను మార్చండి" + }, + "set_location": { + "message": "సూర్యాస్తమయం వద్ద ప్రారంభించండి" + }, + "setup_add_site_hotkey": { + "message": "సైట్‌ను జోడించడానికి హాట్‌కీని సెటప్ చేయండి" + }, + "setup_hotkey_toggle_extension": { + "message": "పొడిగింపు సెట్టింగులు\nహాట్‌కీని ప్రారంభించండి" + }, + "setup_hotkey_toggle_site": { + "message": "సైట్ మార్చడానికి పొడిగింపు సెటప్\nహాట్‌కీని ప్రారంభించండి" + }, + "site_list": { + "message": "సైట్ జాబితా" + }, + "store_listing": { + "message": "ఈ కంటి-సంరక్షణ పొడిగింపు ఫ్లైలో వెబ్‌సైట్ల కోసం చీకటి ఇతివృత్తాలను సృష్టించడం ద్వారా నైట్ మోడ్‌ను అనుమతిస్తుంది. డార్క్ రీడర్ ప్రకాశవంతమైన రంగులను విలోమం చేస్తుంది, అవి అధిక విరుద్ధంగా మరియు రాత్రి చదవడం సులభం చేస్తాడు.\n\nమీరు ప్రకాశం, కాంట్రాస్ట్, సెపియా ఫిల్టర్, డార్క్ మోడ్, ఫాంట్ సెట్టింగులు మరియు విస్మరించే-జాబితాను సర్దుబాటు చేయవచ్చు.\n\nమేము విరాళంతో యాప్ అభివృద్ధికి మద్దతు ఇవ్వమని మిమ్మల్ని అడగవచ్చు. మీరు సెట్టింగ్‌ల పాప్‌అప్‌లో డార్క్ రీడర్ గురించిన వార్తలను చూడవచ్చు. అనుభవజ్ఞులైన వినియోగదారుల కోసం డెవలపర్ సాధనాలు ఉన్నాయి.\n\nడార్క్ రీడర్ ప్రకటనలను చూపించదు మరియు వినియోగదారుల డేటాను ఎక్కడా పంపదు. ఇది పూర్తిగా ఓపెన్-సోర్స్: https://github.com/darkreader/darkreader\n\nమీరు దీన్ని ఇన్‌స్టాల్ చేయడానికి ముందు, ఇలాంటి పొడిగింపులను నిలిపివేయండి. చూడటం ఆనందించండి!" + }, + "system_dark_mode": { + "message": "సిస్టమ్ కలర్ స్కీమ్‌ను ఉపయోగించండి" + }, + "system_dark_mode_description": { + "message": "సిస్టమ్ కలర్ స్కీమ్ ఎనేబుల్ లో ఉంది" + }, + "text_stroke": { + "message": "టెక్స్ట్ స్ట్రోక్" + }, + "theme_generation_mode": { + "message": "థీమ్ యొక్క మోడ్‌ను మార్చండి" + }, + "toggle_current_site": { + "message": "సైట్ కోసం సక్రియం చేయండి" + }, + "toggle_extension": { + "message": "పొడిగింపును ప్రారంభించండి" + }, + "try_experimental_theme_engines": { + "message": "ప్రయత్నించండి ** ప్రయోగాత్మక ** థీమ్ ఇంజన్లు:\n** ఫిల్టర్+** రంగుల సంతృప్తతను సంరక్షిస్తుంది, GPU ని ఉపయోగిస్తుంది\n** స్టాటిక్ థీమ్ ** సరళమైన వేగవంతమైన థీమ్‌ను ఉత్పత్తి చేస్తుంది\n** డైనమిక్ థీమ్ ** రంగులు మరియు చిత్రాలను విశ్లేషిస్తుంది" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/th/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/th/messages.json new file mode 100644 index 0000000..62f7bef --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/th/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "เพิ่มเว็บลงในรายการ" + }, + "automation": { + "message": "การทำงานอัตโนมัติ" + }, + "brightness": { + "message": "ความสว่าง" + }, + "change_browser_theme": { + "message": "เปลี่ยนธีมชองเบราเซอร์" + }, + "contrast": { + "message": "คอนทราสต์" + }, + "custom_browser_theme_off": { + "message": "ค่าเริ่มต้น" + }, + "custom_browser_theme_on": { + "message": "ปรับเอง" + }, + "dark": { + "message": "มืด" + }, + "donate": { + "message": "สนับสนุน" + }, + "engine_dynamic": { + "message": "ไดนามิค" + }, + "engine_filter": { + "message": "ฟิลเตอร์" + }, + "engine_filter_plus": { + "message": "ฟิลเตอร์+" + }, + "engine_static": { + "message": "คงที่" + }, + "extension_description": { + "message": "เปลี่ยนเป็นโหมดมืดให้กับทุกๆเว็บเพื่อปกป้องสายตาของคุณ ใช้ธีมสีมืดสำหรับตอนกลางคืนและการท่องเว็บในชีวิตประจำวัน" + }, + "filter": { + "message": "ฟิลเตอร์" + }, + "grayscale": { + "message": "สีเทา" + }, + "help": { + "message": "ช่วยเหลือ" + }, + "invert_listed_only": { + "message": "เว็บที่จะสลับสี" + }, + "latitude": { + "message": "ละติจูด" + }, + "light": { + "message": "สว่าง" + }, + "loading_please_wait": { + "message": "กำลังโหลด กรุณารอสักครู่" + }, + "longitude": { + "message": "ลองจิจูด" + }, + "mode": { + "message": "โหมด" + }, + "more": { + "message": "อื่นๆ" + }, + "news": { + "message": "ข่าว" + }, + "not_invert_listed": { + "message": "เว็บที่ไม่อยากสลับสี" + }, + "off": { + "message": "ปิด" + }, + "on": { + "message": "เปิด" + }, + "only_for": { + "message": "เฉพาะสำหรับ" + }, + "only_for_description": { + "message": "ใช้การตั้งค่ากับเว็บปัจจุบันเท่านั้น" + }, + "open_dev_tools": { + "message": "เครื่องมือนักพัฒนา" + }, + "page_in_dark_list": { + "message": "เว็บนี้อยู่ในรายชื่อ\nที่มีธีมมืดให้ใช้" + }, + "page_protected": { + "message": "หน้านี้ถูกป้องกัน\nโดยเว็บเบราเซอร์" + }, + "privacy": { + "message": "ความเป็นส่วนตัว" + }, + "read_more": { + "message": "อ่านเพิ่มเติม" + }, + "select_font": { + "message": "เลือกฟอนต์" + }, + "sepia": { + "message": "สีซีเปีย" + }, + "set_active_hours": { + "message": "ตั้งเวลาที่เริ่มทำงาน" + }, + "set_location": { + "message": "เปิดใช้งานหลังจากพระอาทิตย์ตกดินที่สถานที่" + }, + "setup_add_site_hotkey": { + "message": "ตั้งค่าคีย์ลัดเพื่อเพิ่มเว็บ" + }, + "setup_hotkey_toggle_extension": { + "message": "ตั้งค่าคีย์ลัดสำหรับ\nสลับโหมดเปิด-ปิด" + }, + "setup_hotkey_toggle_site": { + "message": "ตั้งค่าคีย์ลัดสำหรับ\nสลับโหมดเว็บนี้" + }, + "site_list": { + "message": "รายชื่อเว็บ" + }, + "store_listing": { + "message": "นี้เป็นส่วนเสริมที่คอยดูแลสายตาของคุณด้วยการเปิดโหมดกลางคืน และสร้างธีมมืดให้กับทุกๆเว็บ Dark Reader จะสลับสีสว่างๆให้เป็นสีดำหรือสีมืด และทำให้ง่ายต่อการอ่านตอนกลางคืน\n\nคุณสามารถปรับแต่งความสว่าง, คอนทราสต์, สีซีเปีย, โหมดมืด, ตั้งค่าฟอนต์ และทำรายการยกเว้นได้\n\nเราอาจขอให้คุณสนับสนุนการพัฒนาแอพด้วยการบริจาค คุณอาจเห็นข่าวเกี่ยวกับ Dark Reader ในป๊อปอัปการตั้งค่า มีเครื่องมือสำหรับนักพัฒนาสำหรับผู้ใช้ที่มีประสบการณ์\n\nDark Reader ไม่แสดงโฆษณา และไม่ส่งข้อมูลของผู้ใช้เด็ดขาด ตัวส่วนเสริมเป็นโอเพนซอร์สโดยสมบูรณ์ดูได้ที่ https://github.com/darkreader/darkreader\n\nก่อนที่จะติดตั้ง ปิดส่วนเสริมที่ทำหน้าที่เหมือนๆกันก่อนนะ ขอให้สนุกกับธีมสีมืดนะ!" + }, + "system_dark_mode": { + "message": "ใช้โทนสีระบบ" + }, + "system_dark_mode_description": { + "message": "เปิดใช้งานเมื่อระบบโหมดมืดอยู่บน" + }, + "text_stroke": { + "message": "ขอบตัวหนังสือ" + }, + "theme_generation_mode": { + "message": "โหมดการสร้างธีม" + }, + "toggle_current_site": { + "message": "สลับโหมดในเว็บนี้" + }, + "toggle_extension": { + "message": "สลับโหมดเปิด-ปิด" + }, + "try_experimental_theme_engines": { + "message": "ลองใช้ธีมที่**อยู่ในระหว่างพัฒนา**:\n**ฟิลเตอร์+** เพิ่มความเข้มของสี มีการใช้ GPU\n**ธีมแบบคงที่** สร้างธีมสีได้ง่ายและรวดเร็ว\n**ธีมแบบไดนามิค** วิเคราะห์สีและภาพ" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/tr/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/tr/messages.json new file mode 100644 index 0000000..11b4d89 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/tr/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Siteyi listeye ekle" + }, + "automation": { + "message": "Otomasyon" + }, + "brightness": { + "message": "Parlaklık" + }, + "change_browser_theme": { + "message": "Tarayıcı temasını değiştir" + }, + "contrast": { + "message": "Kontrast" + }, + "custom_browser_theme_off": { + "message": "Varsayılan" + }, + "custom_browser_theme_on": { + "message": "Özel" + }, + "dark": { + "message": "Koyu" + }, + "donate": { + "message": "Bağış yap" + }, + "engine_dynamic": { + "message": "Dinamik" + }, + "engine_filter": { + "message": "Filtre" + }, + "engine_filter_plus": { + "message": "Filtre+" + }, + "engine_static": { + "message": "Statik" + }, + "extension_description": { + "message": "Her web sitesi için koyu mod. Gözlerinize iyi bakın, gece ve günlük gezinti için koyu renk tema kullanın." + }, + "filter": { + "message": "Filtre" + }, + "grayscale": { + "message": "Gri ton" + }, + "help": { + "message": "Yardım" + }, + "invert_listed_only": { + "message": "Sadece listedekiler" + }, + "latitude": { + "message": "Enlem" + }, + "light": { + "message": "Açık" + }, + "loading_please_wait": { + "message": "Yükleniyor, lütfen bekleyin" + }, + "longitude": { + "message": "Boylam" + }, + "mode": { + "message": "Mod" + }, + "more": { + "message": "Daha fazla" + }, + "news": { + "message": "Haberler" + }, + "not_invert_listed": { + "message": "Hariç tutulanlar" + }, + "off": { + "message": "Kapalı" + }, + "on": { + "message": "Açık" + }, + "only_for": { + "message": "Sadece:" + }, + "only_for_description": { + "message": "Ayarları sadece şu anki site için uygula" + }, + "open_dev_tools": { + "message": "Geliş. araçları" + }, + "page_in_dark_list": { + "message": "Bu site genel\nKoyu Listesinde" + }, + "page_protected": { + "message": "Bu sayfa tarayıcı\ntarafından korunuyor" + }, + "privacy": { + "message": "Gizlilik" + }, + "read_more": { + "message": "Daha fazla oku" + }, + "select_font": { + "message": "Yazı tipi seç" + }, + "sepia": { + "message": "Sepya" + }, + "set_active_hours": { + "message": "Etkin saatleri ayarla" + }, + "set_location": { + "message": "Güneş battıktan sonra etkinleştir" + }, + "setup_add_site_hotkey": { + "message": "Site eklemek için bir kısayol tuşu ayarla" + }, + "setup_hotkey_toggle_extension": { + "message": "Eklenti aç-kapat\nkısayol tuşu ayarla" + }, + "setup_hotkey_toggle_site": { + "message": "Şu anki site için\naç-kapat kısayol tuşu ayarla" + }, + "site_list": { + "message": "Site listesi" + }, + "store_listing": { + "message": "Bu göz bakım eklentisi web siteleri için anında koyu temalar oluşturarak gece modunu etkinleştirir. Dark Reader parlak renkleri ters çevirerek yüksek kontrast oluşturur ve geceleri okumayı kolaylaştırır.\n\nParlaklığı, kontrastı, sepya filtresini, koyu modu, yazı tipi ayarlarını ve yoksayma listesini ayarlayabilirsiniz.\n\nUygulamanın gelişimini bir bağışla desteklemenizi isteyebiliriz. Ayarlar açılır penceresinde Dark Reader ile ilgili haberleri görebilirsiniz. Deneyimli kullanıcılar için Geliştirici Araçları bulunmaktadır.\n\nDark Reader, reklam göstermez ve kullanıcının verilerini hiçbir yere göndermez. Tamamen açık kaynak kodludur. https://github.com/darkreader/darkreader\n\nYüklemeden önce benzer uzantıları devre dışı bırakın. Gezintinin tadını çıkarın!" + }, + "system_dark_mode": { + "message": "Sistem renk düzenini kullan" + }, + "system_dark_mode_description": { + "message": "Sistem koyu modu açıkken etkinleştir" + }, + "text_stroke": { + "message": "Yazı çizgisi" + }, + "theme_generation_mode": { + "message": "Tema oluşturma modu" + }, + "toggle_current_site": { + "message": "Şu anki siteyi aç-kapat" + }, + "toggle_extension": { + "message": "Eklentiyi aç-kapat" + }, + "try_experimental_theme_engines": { + "message": "**Deneysel** tema motorlarını deneyin:\n**Filtre+** renk doygunluğunu korur, GPU kullanır\n**Statik tema** basit, hızlı bir tema oluşturur\n**Dinamik tema** renkleri ve görüntüleri analiz eder" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/uk/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/uk/messages.json new file mode 100644 index 0000000..1accd1b --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/uk/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Додати сайт до списку" + }, + "automation": { + "message": "Автоматизація" + }, + "brightness": { + "message": "Яскравість" + }, + "change_browser_theme": { + "message": "Обрати вигляд браузера" + }, + "contrast": { + "message": "Контраст" + }, + "custom_browser_theme_off": { + "message": "За промовчанням" + }, + "custom_browser_theme_on": { + "message": "Користувацький" + }, + "dark": { + "message": "Темний" + }, + "donate": { + "message": "Пожертвувати" + }, + "engine_dynamic": { + "message": "Змінний" + }, + "engine_filter": { + "message": "Фільтр" + }, + "engine_filter_plus": { + "message": "Фільтр+" + }, + "engine_static": { + "message": "Сталий" + }, + "extension_description": { + "message": "Темний вигляд для кожного мережевого сайту. Піклуйтеся про свої очі, використовуйте темний вид для нічного та щоденного перегляду." + }, + "filter": { + "message": "Фільтр" + }, + "grayscale": { + "message": "Сірі відтінки" + }, + "help": { + "message": "Допомога" + }, + "invert_listed_only": { + "message": "Інвертувати лише у списку" + }, + "latitude": { + "message": "Широта" + }, + "light": { + "message": "Світлий" + }, + "loading_please_wait": { + "message": "Завантаження, будь ласка зачекайте..." + }, + "longitude": { + "message": "Довгота" + }, + "mode": { + "message": "Вид" + }, + "more": { + "message": "Більше" + }, + "news": { + "message": "Новини" + }, + "not_invert_listed": { + "message": "Не інвертувати у списку" + }, + "off": { + "message": "Вимк" + }, + "on": { + "message": "Увімк" + }, + "only_for": { + "message": "Лише для" + }, + "only_for_description": { + "message": "Лише для поточного сайту" + }, + "open_dev_tools": { + "message": "Інструменти розробника" + }, + "page_in_dark_list": { + "message": "Цей сайт у глобальному\n\"Темному Списку\"" + }, + "page_protected": { + "message": "Ця сторінка захищена\nбраузером" + }, + "privacy": { + "message": "Приватність" + }, + "read_more": { + "message": "Докладніше" + }, + "select_font": { + "message": "Обрати вид тексту" + }, + "sepia": { + "message": "Сепія" + }, + "set_active_hours": { + "message": "Встановити робочий час" + }, + "set_location": { + "message": "Активізувати після заходу сонця" + }, + "setup_add_site_hotkey": { + "message": "Встановити гарячу кнопку для додавання сайтів" + }, + "setup_hotkey_toggle_extension": { + "message": "Налаштувати гарячу клавішу\nдля розширення" + }, + "setup_hotkey_toggle_site": { + "message": "Налаштувати гарячу клавішу\nдля поточного сайту" + }, + "site_list": { + "message": "Список сайтів" + }, + "store_listing": { + "message": "Це розширення для догляду за очима дозволяє створювати темні вигляди для мережевих сайтів. Dark Reader інвертує яскраві барви, роблячи їх контрастними і такими що легко читаються вночі.\n\nВи можете налаштувати яскравість, контраст, сепію, темний вигляд, налаштування вигляду тексту та список нехтування.\n\nМи можемо попросити вас підтримати розробку програми пожертвуванням. Ви можете побачити новини про Dark Reader у спливаючому вікні налаштувань. Є інструменти розробника для досвідчених користувачів.\n\nDark Reader не містить рекламу і не надсилає дані користувача нікуди. Це розширення з відкритим кодом https://github.com/darkreader/darkreader\n\nПеред встановленням відімкніть подібні розширення. Насолоджуйтесь переглядом!" + }, + "system_dark_mode": { + "message": "Використовувати системну колірну схему" + }, + "system_dark_mode_description": { + "message": "Активізувати коли системний нічний режим включений" + }, + "text_stroke": { + "message": "Обведення тексту" + }, + "theme_generation_mode": { + "message": "Вид" + }, + "toggle_current_site": { + "message": "Перемкнути для поточного сайту" + }, + "toggle_extension": { + "message": "Перемкнути розширення" + }, + "try_experimental_theme_engines": { + "message": "Спробуйте **експериментальні** теми:\n**Фільтр+** зберігає насиченість барв, використовує GPU\n**Сталий** створює простий швидкмй вигляд\n**Змінний** розбирає барви та зображення" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/vi/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/vi/messages.json new file mode 100644 index 0000000..1e652f7 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/vi/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "Thêm trang web vào danh sách" + }, + "automation": { + "message": "Tự động hóa" + }, + "brightness": { + "message": "Độ sáng" + }, + "change_browser_theme": { + "message": "Thay đổi chủ đề trình duyệt" + }, + "contrast": { + "message": "Tương phản" + }, + "custom_browser_theme_off": { + "message": "Mặc định" + }, + "custom_browser_theme_on": { + "message": "Custom" + }, + "dark": { + "message": "Tối" + }, + "donate": { + "message": "Donate" + }, + "engine_dynamic": { + "message": "Động" + }, + "engine_filter": { + "message": "Bộ lọc" + }, + "engine_filter_plus": { + "message": "Bộ lọc+" + }, + "engine_static": { + "message": "Tĩnh" + }, + "extension_description": { + "message": "Chế độ tối cho mọi trang web. Chăm sóc đôi mắt của bạn, sử dụng chủ đề tối cho trình duyệt ban đêm và hàng ngày." + }, + "filter": { + "message": "Bộ lọc" + }, + "grayscale": { + "message": "Thang độ xám" + }, + "help": { + "message": "Trợ giúp" + }, + "invert_listed_only": { + "message": "Đảo ngược chỉ được liệt kê" + }, + "latitude": { + "message": "Vĩ độ" + }, + "light": { + "message": "Sáng" + }, + "loading_please_wait": { + "message": "Đang tải vui lòng đợi..." + }, + "longitude": { + "message": "Kinh độ" + }, + "mode": { + "message": "Chế độ" + }, + "more": { + "message": "Thêm" + }, + "news": { + "message": "Tin tức" + }, + "not_invert_listed": { + "message": "Không đảo ngược được liệt kê" + }, + "off": { + "message": "Tắt" + }, + "on": { + "message": "Bật" + }, + "only_for": { + "message": "Chỉ dành cho" + }, + "only_for_description": { + "message": "Chỉ áp dụng cài đặt cho trang web hiện tại" + }, + "open_dev_tools": { + "message": "Dev tools" + }, + "page_in_dark_list": { + "message": "Trang web này là trên toàn cầu\n\"Dark List\"" + }, + "page_protected": { + "message": "Trang này được bảo vệ\nbằng trình duyệt" + }, + "privacy": { + "message": "Riêng tư" + }, + "read_more": { + "message": "Đoc thêm..." + }, + "select_font": { + "message": "Chọn một phông chữ" + }, + "sepia": { + "message": "Nâu đỏ" + }, + "set_active_hours": { + "message": "Đặt giờ hoạt động" + }, + "set_location": { + "message": "Kích hoạt sau khi mặt trời lặn tại vị trí" + }, + "setup_add_site_hotkey": { + "message": "Thiết lập một phím nóng để thêm trang web" + }, + "setup_hotkey_toggle_extension": { + "message": "Mở rộng cài đặt\nChuyển đổi phím nóng" + }, + "setup_hotkey_toggle_site": { + "message": "Thiết lập trang web hiện tại\nChuyển đổi phím nóng" + }, + "site_list": { + "message": "Danh sách trang web" + }, + "store_listing": { + "message": "Tiện ích chăm sóc mắt này cho phép chế độ ban đêm tạo chủ đề tối cho các trang web đang hoạt động. Dark Reader đảo ngược màu sắc tươi sáng làm cho chúng có độ tương phản cao và dễ đọc vào ban đêm.\n\nBạn có thể điều chỉnh độ sáng, độ tương phản, bộ lọc màu nâu đỏ, chế độ tối, cài đặt phông chữ và danh sách bỏ qua.\n\nChúng tôi có thể yêu cầu bạn hỗ trợ sự phát triển của ứng dụng bằng một khoản đóng góp. Bạn có thể thấy tin tức về Dark Reader trong cửa sổ bật lên cài đặt. Có Công cụ dành cho nhà phát triển cho người dùng có kinh nghiệm.\n\nDark Reader không hiển thị quảng cáo và không gửi dữ liệu của người dùng ở bất cứ đâu. Nó hoàn toàn là mã nguồn mở https://github.com/darkreader/darkreader\n\nTrước khi bạn cài đặt vô hiệu hóa các phần mở rộng tương tự. Thích xem!" + }, + "system_dark_mode": { + "message": "Sử dụng bảng màu hệ thống" + }, + "system_dark_mode_description": { + "message": "Kích hoạt khi chế độ tối của hệ thống được bật" + }, + "text_stroke": { + "message": "Viền chữ" + }, + "theme_generation_mode": { + "message": "Chế độ tạo chủ đề" + }, + "toggle_current_site": { + "message": "Chuyển đổi trang web này" + }, + "toggle_extension": { + "message": "Chuyển đổi tiện ích mở rộng" + }, + "try_experimental_theme_engines": { + "message": "Hãy thử **thử nghiệm** công cụ chủ đề:\n** Bộ lọc+** giữ màu bão hòa màu, sử dụng GPU:\n** Chủ đề tĩnh ** tạo ra một chủ đề nhanh đơn giản\n** Chủ đề động ** phân tích màu sắc và hình ảnh" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/zh_CN/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/zh_CN/messages.json new file mode 100644 index 0000000..797c73f --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/zh_CN/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "将网站添加到列表" + }, + "automation": { + "message": "自动化" + }, + "brightness": { + "message": "亮度" + }, + "change_browser_theme": { + "message": "更改浏览器主题" + }, + "contrast": { + "message": "对比度" + }, + "custom_browser_theme_off": { + "message": "默认" + }, + "custom_browser_theme_on": { + "message": "自定义" + }, + "dark": { + "message": "黑暗" + }, + "donate": { + "message": "捐赠" + }, + "engine_dynamic": { + "message": "动态" + }, + "engine_filter": { + "message": "过滤" + }, + "engine_filter_plus": { + "message": "过滤+" + }, + "engine_static": { + "message": "静态" + }, + "extension_description": { + "message": "适用于任何网站的黑暗主题。关爱眼睛,就使用 Dark Reader 进行日常浏览。" + }, + "filter": { + "message": "滤镜" + }, + "grayscale": { + "message": "灰度" + }, + "help": { + "message": "帮助" + }, + "invert_listed_only": { + "message": "反色列表" + }, + "latitude": { + "message": "纬度" + }, + "light": { + "message": "明亮" + }, + "loading_please_wait": { + "message": "加载中,请稍候" + }, + "longitude": { + "message": "经度" + }, + "mode": { + "message": "模式" + }, + "more": { + "message": "更多" + }, + "news": { + "message": "新闻" + }, + "not_invert_listed": { + "message": "不反色列表" + }, + "off": { + "message": "关闭" + }, + "on": { + "message": "开启" + }, + "only_for": { + "message": "仅用于" + }, + "only_for_description": { + "message": "仅将设置应用于当前网站" + }, + "open_dev_tools": { + "message": "开发者工具" + }, + "page_in_dark_list": { + "message": "此网站位于全局\n黑暗列表中" + }, + "page_protected": { + "message": "此页面受\n浏览器保护" + }, + "privacy": { + "message": "隐私政策" + }, + "read_more": { + "message": "阅读更多" + }, + "select_font": { + "message": "选择字体" + }, + "sepia": { + "message": "棕褐色滤镜" + }, + "set_active_hours": { + "message": "设置使用时段" + }, + "set_location": { + "message": "日落位置之后激活" + }, + "setup_add_site_hotkey": { + "message": "设置添加网站的快捷键" + }, + "setup_hotkey_toggle_extension": { + "message": "设置扩展的\n开关快捷键" + }, + "setup_hotkey_toggle_site": { + "message": "设置当前网站的\n切换快捷键" + }, + "site_list": { + "message": "网站列表" + }, + "store_listing": { + "message": "这是一个护眼扩展程序,通过实时生成黑暗主题,为每一个网站启用夜间模式。 Dark Reader 反转明亮的颜色,使网页内容具有高对比度并易于在夜间阅读。\n\n您可以调整亮度、对比度,应用棕褐色滤镜、黑暗模式,设置字体和忽略的网站列表。\n\n我们可能会要求您通过捐款来支持应用程序的开发。您可能会在设置弹出窗口中看到有关 Dark Reader 的新闻。有针对经验丰富的用户的开发人员工具。\n\nDark Reader 无广告,也不会向任何地方发送用户的数据。它完全开源 https://github.com/darkreader/darkreader\n\n安装前请禁用类似的扩展。冲浪愉快!" + }, + "system_dark_mode": { + "message": "使用系统的配色方案" + }, + "system_dark_mode_description": { + "message": "系统黑暗模式开启时激活" + }, + "text_stroke": { + "message": "文字描边" + }, + "theme_generation_mode": { + "message": "主题生成模式" + }, + "toggle_current_site": { + "message": "切换当前网站" + }, + "toggle_extension": { + "message": "开关扩展" + }, + "try_experimental_theme_engines": { + "message": "试用**实验**主题引擎:\n**滤镜+**保留颜色饱和度,使用 GPU\n**静态主题**快速生成一个简单的主题\n**动态主题**分析颜色和图像" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/zh_TW/messages.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/zh_TW/messages.json new file mode 100644 index 0000000..427882d --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_locales/zh_TW/messages.json @@ -0,0 +1,155 @@ +{ + "add_site_to_list": { + "message": "將網站新增到列表" + }, + "automation": { + "message": "自動化" + }, + "brightness": { + "message": "亮度" + }, + "change_browser_theme": { + "message": "更改瀏覽器主題" + }, + "contrast": { + "message": "對比度" + }, + "custom_browser_theme_off": { + "message": "關閉自訂主題" + }, + "custom_browser_theme_on": { + "message": "自定主題" + }, + "dark": { + "message": "深色" + }, + "donate": { + "message": "贊助" + }, + "engine_dynamic": { + "message": "動態" + }, + "engine_filter": { + "message": "過濾" + }, + "engine_filter_plus": { + "message": "過濾+" + }, + "engine_static": { + "message": "靜態" + }, + "extension_description": { + "message": "黑色主題,適用於任何網站。關愛眼睛,使用Dark Reader進行夜間和日間瀏覽。" + }, + "filter": { + "message": "濾鏡" + }, + "grayscale": { + "message": "灰度" + }, + "help": { + "message": "說明" + }, + "invert_listed_only": { + "message": "反轉顏色列表" + }, + "latitude": { + "message": "緯度" + }, + "light": { + "message": "淺色" + }, + "loading_please_wait": { + "message": "載入中,請稍候" + }, + "longitude": { + "message": "經度" + }, + "mode": { + "message": "模式" + }, + "more": { + "message": "更多" + }, + "news": { + "message": "新聞" + }, + "not_invert_listed": { + "message": "不反轉顏色列表" + }, + "off": { + "message": "停用" + }, + "on": { + "message": "啟用" + }, + "only_for": { + "message": "僅適用於" + }, + "only_for_description": { + "message": "僅將設定套用於所在網站" + }, + "open_dev_tools": { + "message": "開發者工具" + }, + "page_in_dark_list": { + "message": "此網站位於全域\n深色主題列表中" + }, + "page_protected": { + "message": "此頁面受\n瀏覽器保護" + }, + "privacy": { + "message": "隱私政策" + }, + "read_more": { + "message": "閱讀更多" + }, + "select_font": { + "message": "選擇字體" + }, + "sepia": { + "message": "棕褐色濾鏡" + }, + "set_active_hours": { + "message": "設定啟用時間" + }, + "set_location": { + "message": "日落後啟動" + }, + "setup_add_site_hotkey": { + "message": "設定新增網站的快捷鍵" + }, + "setup_hotkey_toggle_extension": { + "message": "設定擴充套件的\n開關快捷鍵" + }, + "setup_hotkey_toggle_site": { + "message": "設定所在網站的\n切換快捷鍵" + }, + "site_list": { + "message": "網站列表" + }, + "store_listing": { + "message": "這是一個護眼擴充套件,通過即時產深深色主題,為每一個網站啟用夜間模式。 Dark Reader 反轉明亮的顏色,使其網頁內容具有高對比度並且易於在夜間閱讀。\n\n您可以調整亮度,對比度,套用棕褐色濾鏡,深色模式,設定字體和忽略的網站列表。\n\n我們可能會要求您通過捐款來支持應用程序的開發。您可能會在設置彈出窗口中看到有關 Dark Reader 的新聞。有針對經驗豐富的用戶的開發人員工具。\n\nDark Reader 沒有廣告,也不會在任何地方發送用戶的資料。它完全開源於 https://github.com/darkreader/darkreader\n\n安裝前請先停止使用類似的擴充套件,以避免衝突。瀏覽愉快!" + }, + "system_dark_mode": { + "message": "使用系統配色方案" + }, + "system_dark_mode_description": { + "message": "系統打開深色模式時啟用" + }, + "text_stroke": { + "message": "文字描邊" + }, + "theme_generation_mode": { + "message": "主題產生模式" + }, + "toggle_current_site": { + "message": "切換目前網站的設定" + }, + "toggle_extension": { + "message": "開關擴充套件" + }, + "try_experimental_theme_engines": { + "message": "試用 **實驗** 主題引擎:\n**濾鏡+** 保留顏色飽和度,將會使用GPU\n**靜態主題** 生成一個簡單快速的主題\n**動態主題** 分析顏色和圖像" + } +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_metadata/verified_contents.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_metadata/verified_contents.json new file mode 100644 index 0000000..cb27054 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/_metadata/verified_contents.json @@ -0,0 +1 @@ +[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJfbG9jYWxlcy9hci9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiTXZPdjREN1RibmpiYnNFbmhvcFJOT0RCcDdCZC12U0IwV1FFb3ZuLU03RSJ9LHsicGF0aCI6Il9sb2NhbGVzL2JlL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJ4NFBMUThGNFFobW1ySjlEdlp4eTIzOGJBOTFmXzctb1dSNUlDS25uZVdrIn0seyJwYXRoIjoiX2xvY2FsZXMvYm4vbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IkhscG9oYTI4Snp0NjBXSjdfcG1jRnpFSTJBd1dHRVAyeGExVERDYmRvb1kifSx7InBhdGgiOiJfbG9jYWxlcy9jcy9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoibnZoVXR5SUxYN3VmMGFlNDEzY0R1eFhMZ29XMklnNVZ3akdpcFhVSVJ0NCJ9LHsicGF0aCI6Il9sb2NhbGVzL2RlL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJJM0VzX2xQdlNCbVk0YV9LUk9VN00tbDZpMkVTUmdsSG9Bem1ycUtsazZRIn0seyJwYXRoIjoiX2xvY2FsZXMvZWwvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IjJ0bTRTTVQ5WG5hSjBFMS1tV1JsMF90RFM0UzJCb0NzdlI5R3ZZNl9Rb00ifSx7InBhdGgiOiJfbG9jYWxlcy9lbi9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiTWppZ1U4Ymg5VDQxNm5FM3RHTngzSTJQejdTcDdBNk0zaHZHaF9VU1RVVSJ9LHsicGF0aCI6Il9sb2NhbGVzL2VuX0dCL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJOTXVGUDAweUl3MGxES05rMDhMWVhoVENUWUZVa3RxaHozX3JzUGZnZjcwIn0seyJwYXRoIjoiX2xvY2FsZXMvZW5fVVMvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6Ik1qaWdVOGJoOVQ0MTZuRTN0R054M0kyUHo3U3A3QTZNM2h2R2hfVVNUVVUifSx7InBhdGgiOiJfbG9jYWxlcy9lcy9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoicDl5cDRoRFZ2T2ZrQTBiWW5wcHpuZkt6enA1cFpuZ192MGd5QVpwc0RYcyJ9LHsicGF0aCI6Il9sb2NhbGVzL2VzXzQxOS9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiZldjWU1SeGdUNktGYUxNcElzbW5EWlFON0NfQTFfanlzNVNQdS01RHg0ayJ9LHsicGF0aCI6Il9sb2NhbGVzL2ZhL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJsSlA3cnFNWjJ0M3V2RVVjOEtLZXktdm9OclZXQ0tGd0FGbXMtNUNkLUlZIn0seyJwYXRoIjoiX2xvY2FsZXMvZmFfSVIvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6ImxKUDdycU1aMnQzdXZFVWM4S0tleS12b05yVldDS0Z3QUZtcy01Q2QtSVkifSx7InBhdGgiOiJfbG9jYWxlcy9maWwvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6ImJ5OE9BVVdFZkxZa0Z4d0ZLRHRRSERqSFZjbDU3bm8tY0I5dTJXWTN3dUUifSx7InBhdGgiOiJfbG9jYWxlcy9mci9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiMGVxOXNEc1d2S0tFa0ZueEtHQy1wLXF4Y1BrMTVTQlVyUy1yclNPNE0wWSJ9LHsicGF0aCI6Il9sb2NhbGVzL2hlL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJxalJRVzNaOXYyV1hUSm9qTDVDb3B3bGwtaVkwVkxvTkJsZmpUM0hlWkRBIn0seyJwYXRoIjoiX2xvY2FsZXMvaGkvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6Ik9HSXBHbVRmbHVPa0JQRFprbmgzdDl6Z3N5a2dERU50RnRNWXpXVHZkX3MifSx7InBhdGgiOiJfbG9jYWxlcy9pZC9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiR0F5XzBfXzljTjE2Q2xpaktDUjB0cEZtVmtwTmYzSjdUT1dQN21BRV9tMCJ9LHsicGF0aCI6Il9sb2NhbGVzL2l0L21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiI5TGYtMUIyQVktTGxMNV9QOVBYdXdRbUNqdHVtSUNFZDZBa3BlY3FpeEdFIn0seyJwYXRoIjoiX2xvY2FsZXMvamEvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IjAyWVIyYmd1X2FVdGRvV3owVm9GOFBLLWxJZFZyelM1eWZpMjRwejlhQnMifSx7InBhdGgiOiJfbG9jYWxlcy9rby9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiRTJGUnltbi10LVcyWGJhbU41YzdhSVcta1FzT1JtZ2x5cXNKblhzYmVFVSJ9LHsicGF0aCI6Il9sb2NhbGVzL21zL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJwWEJYNkhsWDRWLVhPenBEU01IVkI5RGVGS0xjazJWcXhsYjRZejE1MDdNIn0seyJwYXRoIjoiX2xvY2FsZXMvbmwvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6Im1DVEttQUVkZzNVa1JNTWZzbWZnZHR1MzFxUFFOUnFVdnJ2RnVtV2l0bjgifSx7InBhdGgiOiJfbG9jYWxlcy9uby9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoidy1EdmNIVU5jMlR6X2dGekp1eVpUbnlPQTRSZHNKVGFXeUJwWkRIaHVMNCJ9LHsicGF0aCI6Il9sb2NhbGVzL3BsL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJwRC11Z1Q1RXlyNEF2TE14THBncjZwQkVwU0p4NXR3dWEtVEljYjdneEU0In0seyJwYXRoIjoiX2xvY2FsZXMvcHRfQlIvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IkZxOTBrdHlCME1RT0Z4TlVSalk3SDJQNU54Q2QzWDhlYWtRbzNnMXJtTEkifSx7InBhdGgiOiJfbG9jYWxlcy9wdF9QVC9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiSmNpZEt3a1phVHNXSFgzemtWV3kxaklySzRFUGt2alZRaElBN0VfaXJadyJ9LHsicGF0aCI6Il9sb2NhbGVzL3JvL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJ2dXhwYi1BTlZ5Ynk4VV9kbXRNSS1MTEpxU2Z0VE1XVTBaaWtsYUhma2l3In0seyJwYXRoIjoiX2xvY2FsZXMvcnUvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IlZkbi0xa3QtTFdGaHhCQTNkTVlSLTlndHBObHlITURseXFFNm83VlNza1UifSx7InBhdGgiOiJfbG9jYWxlcy9zaS9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiX3pNcHZIOFduX0lBZlcySzdpZjJwcjI1djBNczNpWmpDZlUtT1FHOURJSSJ9LHsicGF0aCI6Il9sb2NhbGVzL3NrL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJxbHRFLXIxNThjLWF0MWJVcEpTNXI3MTdVREJrNTdUaWFGRjlVU05XLWJzIn0seyJwYXRoIjoiX2xvY2FsZXMvc3IvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6Inc5OG13MXNWV3dVN2c3TjhDUWlWQ0ZyOG5LcVBhLVo4dUtJdXNDTkgyTDAifSx7InBhdGgiOiJfbG9jYWxlcy9zdi9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiVlNwbzNJdkl3V19QS1lCMm5JU3pYTUJtQXdPVl9KeEkwaXJncGNlM3d2NCJ9LHsicGF0aCI6Il9sb2NhbGVzL3RlL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJOZFlzNjVvR1NHejJ5MXhPRWhBWnRSZGtjd3dKZDd4QWwwZThqNWpCYVBVIn0seyJwYXRoIjoiX2xvY2FsZXMvdGgvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IjhRUmF3dFgycjFjd2FIVGF0YU8zcEp4Wno4dXJuTkhwTEdZeFd6Wnk5LTgifSx7InBhdGgiOiJfbG9jYWxlcy90ci9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoieGluNDdiY3VtX1B1NHVOOTZnUWZ3V3BlRFgzVVg2cFJjOV9Pa0UyRHlZayJ9LHsicGF0aCI6Il9sb2NhbGVzL3VrL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJUZ2gxTEV1ODdGSHBMZVJnYTJ1b0ZBUUVpaURtZjJkNHZTQW5jd3Z3U1NNIn0seyJwYXRoIjoiX2xvY2FsZXMvdmkvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6ImxoSmJMS0RPZklnMVJ2NkFZWWt4ZDBUV01zVkVCemk1ZjlWYk5XYmJVZlEifSx7InBhdGgiOiJfbG9jYWxlcy96aF9DTi9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiNnVGSEdESTQ0MTFQS3hlMkNJeVdaQ29VR0Y4eXJHQ1ZYbXBlT1paa1puZyJ9LHsicGF0aCI6Il9sb2NhbGVzL3poX1RXL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJGQWJFUmxSUEdsQXZTaC1CNHBBTmVJejlTZ0hmdTY3bFhrNFdDSWQ4cnh3In0seyJwYXRoIjoiYmFja2dyb3VuZC9pbmRleC5odG1sIiwicm9vdF9oYXNoIjoiaWdzUmJ0RFA3TXpMR1pub3F6aDUzakxobElKZW1rcnpBNTd5bXhfQ1VscyJ9LHsicGF0aCI6ImJhY2tncm91bmQvaW5kZXguanMiLCJyb290X2hhc2giOiI2NkdkM3lueGVTdEczWVhzdGsyZG4wZDhGamk2aW1ScTJsVDZDS0FEMTgwIn0seyJwYXRoIjoiY29uZmlnL2NvbG9yLXNjaGVtZXMuZHJjb25mIiwicm9vdF9oYXNoIjoiWFRyczdXZDA3SXpJOUZHcXZMc1BRbl9EN080VmU1TVhMaWs2ZWJ2UVZKZyJ9LHsicGF0aCI6ImNvbmZpZy9kYXJrLXNpdGVzLmNvbmZpZyIsInJvb3RfaGFzaCI6InJaUEwxWGd0R19YZEYyNGJESFdpbkw0VGh5NzhPeWk4dlZuR2NMajA4S3cifSx7InBhdGgiOiJjb25maWcvZHluYW1pYy10aGVtZS1maXhlcy5jb25maWciLCJyb290X2hhc2giOiJWcHROa1JwUVAwTmF3QnlFam9TZXYxOXVQRlNydFF1RlFDdWFlTjVYZGxNIn0seyJwYXRoIjoiY29uZmlnL2ludmVyc2lvbi1maXhlcy5jb25maWciLCJyb290X2hhc2giOiJsTTZvaHRuYjNsN212V0szTTJWX0hCdW5nSndqbW1UTWk5SWRNRV9KNzJVIn0seyJwYXRoIjoiY29uZmlnL3N0YXRpYy10aGVtZXMuY29uZmlnIiwicm9vdF9oYXNoIjoiRDFucHF1OGVYb2xXUlZ5aTktSVpJazlSV1c0eldYQmZLR1duYnBpSXNhMCJ9LHsicGF0aCI6Imljb25zL2RyXzEyOC5wbmciLCJyb290X2hhc2giOiJMdDFJcWpGMjVZb3hZVHZiY1QtSUozdk44TkVmQi1rNld5RmpUV1B5a1hNIn0seyJwYXRoIjoiaWNvbnMvZHJfMTYucG5nIiwicm9vdF9oYXNoIjoiUWcydVd1cDc2bHFSbmp5TlVyNzlMVnVfbGVLZ3IzMEdjbHBjdHFzV1JfTSJ9LHsicGF0aCI6Imljb25zL2RyXzQ4LnBuZyIsInJvb3RfaGFzaCI6IlJndHRFZGhOd3dPNHR5R0luMWNkU1ppMXRnaWZhZzkyYTVkdU9tWC1TbUUifSx7InBhdGgiOiJpY29ucy9kcl9hY3RpdmVfMTkucG5nIiwicm9vdF9oYXNoIjoiT0J0YkowcksyS1ZIZzFyVkFycVlEUllGWmEtZDQxT2g0LTB0RTFqLW5pcyJ9LHsicGF0aCI6Imljb25zL2RyX2FjdGl2ZV8zOC5wbmciLCJyb290X2hhc2giOiJyNjNNRFBnX3Bub2pDNXBkWGY1dzh0cDloLS1fN1QxS2hraEJXdXZmWmhnIn0seyJwYXRoIjoiaWNvbnMvZHJfaW5hY3RpdmVfMTkucG5nIiwicm9vdF9oYXNoIjoiNlVwcVJja3BHTTQtUloxdDVrU3UyRGFuc1djbmpVMjU3NHBJRk5QZ01SWSJ9LHsicGF0aCI6Imljb25zL2RyX2luYWN0aXZlXzM4LnBuZyIsInJvb3RfaGFzaCI6IkRxRUVEal9FSVpmWEVPREdtcnFQYkt1SjVLUUQwb09JSGI0ZTZjQ0JwbEEifSx7InBhdGgiOiJpbmplY3QvZmFsbGJhY2suanMiLCJyb290X2hhc2giOiJEZXIyQkhlMTZYZFo5MXJLa3pCNFU3OHpRekpWX1RFY0s4RXhyck90Mk00In0seyJwYXRoIjoiaW5qZWN0L2luZGV4LmpzIiwicm9vdF9oYXNoIjoiNEpBSWI4ZWFVTU9oME9ROURJNGhFcm1OYmJJeHZ2VjBETHhQNzVYRDNnTSJ9LHsicGF0aCI6Im1hbmlmZXN0Lmpzb24iLCJyb290X2hhc2giOiJoZDBIRDZwRFFORU53RTlTRDRPcWt1M0NvcVJpcUxoaHVjaE1WX3ZEQzNVIn0seyJwYXRoIjoidWkvYXNzZXRzL2ZvbnRzL0xJQ0VOU0UudHh0Iiwicm9vdF9oYXNoIjoibUpkZGluWEhHbm9RQUh2dzlPSXJQY256bDhhSDlmYlpfa1ZpWjhOdE1xbyJ9LHsicGF0aCI6InVpL2Fzc2V0cy9mb250cy9PcGVuU2Fucy1MaWdodC50dGYiLCJyb290X2hhc2giOiJQZ3ZLRm5XOEpLenBIX3Z2Q1ByWS1WTWE2bXVfWHFkZlgwVWZYeHhscm44In0seyJwYXRoIjoidWkvYXNzZXRzL2ZvbnRzL09wZW5TYW5zLVJlZ3VsYXIudHRmIiwicm9vdF9oYXNoIjoieXFxcTZQWmpBWG9lZlNYRkRWbEVvS2VMWGlKblltQ0RZSUVKUkFEc1A2dyJ9LHsicGF0aCI6InVpL2Fzc2V0cy9mb250cy9PcGVuU2Fucy1TZW1pQm9sZC50dGYiLCJyb290X2hhc2giOiJkZTk5X3VQcmxoRlRabGFZajN4SjdGRlR5R1RiMGptMUZDSGVhckQwVEJBIn0seyJwYXRoIjoidWkvYXNzZXRzL2ltYWdlcy9kYXJrcmVhZGVyLWljb24tMjU2eDI1Ni5wbmciLCJyb290X2hhc2giOiJkZXZYLTZacEhJSHBGVms3TVZxMktaa19KUi04WUkzMnFJODhaUkcwSlVvIn0seyJwYXRoIjoidWkvYXNzZXRzL2ltYWdlcy9kYXJrcmVhZGVyLXR5cGUuc3ZnIiwicm9vdF9oYXNoIjoiQ2NDNEtRUkYzVHNaeTdhakNSUmtsZDFyOW00VlBmVTRpdnNCUUJXaG1EOCJ9LHsicGF0aCI6InVpL2Fzc2V0cy9pbWFnZXMvbGFkeWJ1Zy0zMi5zdmciLCJyb290X2hhc2giOiIybVU5dFZ4c3RacFhtQmFOUkF5T0FQRDJpSjQtdWhhZ0ZneHNNNkJWVllvIn0seyJwYXRoIjoidWkvYXNzZXRzL2ltYWdlcy9tb2RlLWRhcmstMzIuc3ZnIiwicm9vdF9oYXNoIjoiU2V6c0QxQ1BxeHlwSjlGUjZfNmpzTUhHNjhQaTlpTGJpSndYVWNnZnB4MCJ9LHsicGF0aCI6InVpL2Fzc2V0cy9pbWFnZXMvbW9kZS1saWdodC0zMi5zdmciLCJyb290X2hhc2giOiJIazRhZE1ta21fR3I3SlBycTZ2ejl4MUhxOVJGUEJEUlJwV3RuNnJFcXJNIn0seyJwYXRoIjoidWkvZGV2dG9vbHMvaW5kZXguaHRtbCIsInJvb3RfaGFzaCI6IldCMGwwWkNQRUZCXzY5Y0FnRFphQkdHck9QLUh5OVRSdHBZQ1pJUklCNTgifSx7InBhdGgiOiJ1aS9kZXZ0b29scy9pbmRleC5qcyIsInJvb3RfaGFzaCI6IkpONWp5MklXWHppOXhZOEJxYU5oMzdjRUJoUTVqMGZDZ3JXQ0JkZ1BIeGcifSx7InBhdGgiOiJ1aS9kZXZ0b29scy9zdHlsZS5jc3MiLCJyb290X2hhc2giOiI0SEU5ZW9rZ3NJV08xa0tBSWRpVVdFRTVrR3FBT2NBVUxaeFdEVFJWZWpBIn0seyJwYXRoIjoidWkvcG9wdXAvY29tcGF0aWJpbGl0eS5qcyIsInJvb3RfaGFzaCI6Ik03LU5mYlc3UnRqUHZILVRjZVB3d0d1bGM2X0dlUDEyZE81cmV5enl0bVkifSx7InBhdGgiOiJ1aS9wb3B1cC9pbmRleC5odG1sIiwicm9vdF9oYXNoIjoiZG1QM3NwV2ZIUTVOSXZiQnU3RVVRQUh0NmlyM05GdkwxRVhKWGZLUi1DbyJ9LHsicGF0aCI6InVpL3BvcHVwL2luZGV4LmpzIiwicm9vdF9oYXNoIjoiR2kyWGZGTVE4SGlNeFY2Q2N4VlFqSUVhNll5LUg5ZHFVUE5hcTRjclo2cyJ9LHsicGF0aCI6InVpL3BvcHVwL3N0eWxlLmNzcyIsInJvb3RfaGFzaCI6IkU3Z083V3RkemJ5aVY1amxEMWpfeHVGLUoyVWVYeXpmTTJNRTZtbzNOLWcifSx7InBhdGgiOiJ1aS9zdHlsZXNoZWV0LWVkaXRvci9pbmRleC5odG1sIiwicm9vdF9oYXNoIjoiRHI4LVVTdkRIRXdjTHNBWUJhM0ZDNzFQSmpLZ0F2cjY4RGF5dFlZTGJaVSJ9LHsicGF0aCI6InVpL3N0eWxlc2hlZXQtZWRpdG9yL2luZGV4LmpzIiwicm9vdF9oYXNoIjoiVnZtVnloTWNxWkktRW9wN0ZjS3VvVlZRQ3p1Y19aZVBRN3RSRmNIZElfNCJ9LHsicGF0aCI6InVpL3N0eWxlc2hlZXQtZWRpdG9yL3N0eWxlLmNzcyIsInJvb3RfaGFzaCI6IjRIRTllb2tnc0lXTzFrS0FJZGlVV0VFNWtHcUFPY0FVTFp4V0RUUlZlakEifV0sImZvcm1hdCI6InRyZWVoYXNoIiwiaGFzaF9ibG9ja19zaXplIjo0MDk2fV0sIml0ZW1faWQiOiJlaW1hZHBiY2Jmbm1ia29wb29qZmVraG5raGRiaWVlaCIsIml0ZW1fdmVyc2lvbiI6IjQuOS41OCIsInByb3RvY29sX3ZlcnNpb24iOjF9","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"BAp5QhdFcUdZ4SDj2323dWsKl2_Y2V-kJBBFu1Ko69klb0srFgrV4f7upHZXPHa6HLIkaCo07PaTXfSV_BTxYxsEnypBQ2Pfzfcx4nWk89T2N86c4DQ2KcP2HVXjBCzzbVRY4hf1tTfqZTvbN8-Sccr8804OAuPIVlg13RBVXBjin-YywD5BlHf4P6pBdZtYio1JWsq3tp1vkyBizLs6CsIKGHKFy7HXvlH43BMgBSjqagymsD1Fm4HH_jZnQvZuZmC-9qTG_Iv0lzaDpjAE3Iq-9WW0hgLdTjo_pBN6QOMrvS6O7858HmjM7IsJ3W0pZmH2lJKrH2GwS6uqpq_wmg"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"DvJx22mmanNnZMXivVPkZmzwv5kFCsurqmaLUvIBCcWpIQyc9VxNrwH8SrM5sWZeyCZlqnlnimYbPHUwPxziNtEGqplh8otmiHVQNReFwcg_mBTVSDzMWd-mXgLj8jWdR7LL3WZHgbyrDg-ehwozhICxOI-qSX8-vhZoh4Osf_lEAz2rAwqdKDiDifnevIqxpaEBPVO0AawBy6WLEZ4ctnSRuPss25K5HweipCaBUs2SEaWaMpKPoFhOZwt5vuv36uLOOk8rnyFjw7PyuNulrTcBZN6Vc04FVrC_6XYoZuHxXI0yYbBXoUvZ1VQ-qXw8WkPNepzwJ0TJ8mWge_GE8Q"}]}}] \ No newline at end of file diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/background/index.html b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/background/index.html new file mode 100644 index 0000000..a4bd316 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/background/index.html @@ -0,0 +1,11 @@ + + + + + Dark Reader background + + + + + + diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/background/index.js b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/background/index.js new file mode 100644 index 0000000..d88590d --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/background/index.js @@ -0,0 +1,5844 @@ +(function () { + "use strict"; + + const isNavigatorDefined = typeof navigator !== "undefined"; + const userAgent = isNavigatorDefined + ? navigator.userAgentData && + Array.isArray(navigator.userAgentData.brands) + ? navigator.userAgentData.brands + .map( + (brand) => `${brand.brand.toLowerCase()} ${brand.version}` + ) + .join(" ") + : navigator.userAgent.toLowerCase() + : "some useragent"; + const platform = isNavigatorDefined + ? navigator.userAgentData && + typeof navigator.userAgentData.platform === "string" + ? navigator.userAgentData.platform.toLowerCase() + : navigator.platform.toLowerCase() + : "some platform"; + const isThunderbird = userAgent.includes("thunderbird"); + const isFirefox = + userAgent.includes("firefox") || + userAgent.includes("librewolf") || + isThunderbird; + userAgent.includes("vivaldi"); + userAgent.includes("yabrowser"); + const isOpera = userAgent.includes("opr") || userAgent.includes("opera"); + const isEdge = userAgent.includes("edg"); + const isWindows = platform.startsWith("win"); + const isMacOS = platform.startsWith("mac"); + isNavigatorDefined && navigator.userAgentData + ? navigator.userAgentData.mobile + : userAgent.includes("mobile"); + const isMatchMediaChangeEventListenerSupported = + typeof MediaQueryList === "function" && + typeof MediaQueryList.prototype.addEventListener === "function"; + const chromiumVersion = (() => { + const m = userAgent.match(/chrom(?:e|ium)(?:\/| )([^ ]+)/); + if (m && m[1]) { + return m[1]; + } + return ""; + })(); + const firefoxVersion = (() => { + const m = userAgent.match(/(?:firefox|librewolf)(?:\/| )([^ ]+)/); + if (m && m[1]) { + return m[1]; + } + return ""; + })(); + (() => { + try { + document.querySelector(":defined"); + return true; + } catch (err) { + return false; + } + })(); + function compareChromeVersions($a, $b) { + const a = $a.split(".").map((x) => parseInt(x)); + const b = $b.split(".").map((x) => parseInt(x)); + for (let i = 0; i < a.length; i++) { + if (a[i] !== b[i]) { + return a[i] < b[i] ? -1 : 1; + } + } + return 0; + } + const isXMLHttpRequestSupported = typeof XMLHttpRequest === "function"; + const isFetchSupported = typeof fetch === "function"; + const isCSSColorSchemePropSupported = (() => { + if (typeof document === "undefined") { + return false; + } + const el = document.createElement("div"); + el.setAttribute("style", "color-scheme: dark"); + return el.style && el.style.colorScheme === "dark"; + })(); + + async function getOKResponse(url, mimeType, origin) { + const response = await fetch(url, { + cache: "force-cache", + credentials: "omit", + referrer: origin + }); + if ( + isFirefox && + mimeType === "text/css" && + url.startsWith("moz-extension://") && + url.endsWith(".css") + ) { + return response; + } + if ( + mimeType && + !response.headers.get("Content-Type").startsWith(mimeType) + ) { + throw new Error(`Mime type mismatch when loading ${url}`); + } + if (!response.ok) { + throw new Error( + `Unable to load ${url} ${response.status} ${response.statusText}` + ); + } + return response; + } + async function loadAsDataURL(url, mimeType) { + const response = await getOKResponse(url, mimeType); + return await readResponseAsDataURL(response); + } + async function readResponseAsDataURL(response) { + const blob = await response.blob(); + const dataURL = await new Promise((resolve) => { + const reader = new FileReader(); + reader.onloadend = () => resolve(reader.result); + reader.readAsDataURL(blob); + }); + return dataURL; + } + async function loadAsText(url, mimeType, origin) { + const response = await getOKResponse(url, mimeType, origin); + return await response.text(); + } + + function parseArray(text) { + return text + .replace(/\r/g, "") + .split("\n") + .map((s) => s.trim()) + .filter((s) => s); + } + function formatArray(arr) { + return arr.concat("").join("\n"); + } + function getStringSize(value) { + return value.length * 2; + } + function getParenthesesRange(input, searchStartIndex = 0) { + const length = input.length; + let depth = 0; + let firstOpenIndex = -1; + for (let i = searchStartIndex; i < length; i++) { + if (depth === 0) { + const openIndex = input.indexOf("(", i); + if (openIndex < 0) { + break; + } + firstOpenIndex = openIndex; + depth++; + i = openIndex; + } else { + const closingIndex = input.indexOf(")", i); + if (closingIndex < 0) { + break; + } + const openIndex = input.indexOf("(", i); + if (openIndex < 0 || closingIndex < openIndex) { + depth--; + if (depth === 0) { + return {start: firstOpenIndex, end: closingIndex + 1}; + } + i = closingIndex; + } else { + depth++; + i = openIndex; + } + } + } + return null; + } + + function parse24HTime(time) { + return time.split(":").map((x) => parseInt(x)); + } + function compareTime(time1, time2) { + if (time1[0] === time2[0] && time1[1] === time2[1]) { + return 0; + } + if ( + time1[0] < time2[0] || + (time1[0] === time2[0] && time1[1] < time2[1]) + ) { + return -1; + } + return 1; + } + function nextTimeInterval(time0, time1, date = new Date()) { + const a = parse24HTime(time0); + const b = parse24HTime(time1); + const t = [date.getHours(), date.getMinutes()]; + if (compareTime(a, b) > 0) { + return nextTimeInterval(time1, time0, date); + } + if (compareTime(a, b) === 0) { + return null; + } + if (compareTime(t, a) < 0) { + date.setHours(a[0]); + date.setMinutes(a[1]); + date.setSeconds(0); + date.setMilliseconds(0); + return date.getTime(); + } + if (compareTime(t, b) < 0) { + date.setHours(b[0]); + date.setMinutes(b[1]); + date.setSeconds(0); + date.setMilliseconds(0); + return date.getTime(); + } + return new Date( + date.getFullYear(), + date.getMonth(), + date.getDate() + 1, + a[0], + a[1] + ).getTime(); + } + function isInTimeIntervalLocal(time0, time1, date = new Date()) { + const a = parse24HTime(time0); + const b = parse24HTime(time1); + const t = [date.getHours(), date.getMinutes()]; + if (compareTime(a, b) > 0) { + return compareTime(a, t) <= 0 || compareTime(t, b) < 0; + } + return compareTime(a, t) <= 0 && compareTime(t, b) < 0; + } + function isInTimeIntervalUTC(time0, time1, timestamp) { + if (time1 < time0) { + return timestamp <= time1 || time0 <= timestamp; + } + return time0 < timestamp && timestamp < time1; + } + function getDuration(time) { + let duration = 0; + if (time.seconds) { + duration += time.seconds * 1000; + } + if (time.minutes) { + duration += time.minutes * 60 * 1000; + } + if (time.hours) { + duration += time.hours * 60 * 60 * 1000; + } + if (time.days) { + duration += time.days * 24 * 60 * 60 * 1000; + } + return duration; + } + function getDurationInMinutes(time) { + return getDuration(time) / 1000 / 60; + } + function getSunsetSunriseUTCTime(latitude, longitude, date) { + const dec31 = Date.UTC(date.getUTCFullYear(), 0, 0, 0, 0, 0, 0); + const oneDay = getDuration({days: 1}); + const dayOfYear = Math.floor((date.getTime() - dec31) / oneDay); + const zenith = 90.83333333333333; + const D2R = Math.PI / 180; + const R2D = 180 / Math.PI; + const lnHour = longitude / 15; + function getTime(isSunrise) { + const t = dayOfYear + ((isSunrise ? 6 : 18) - lnHour) / 24; + const M = 0.9856 * t - 3.289; + let L = + M + + 1.916 * Math.sin(M * D2R) + + 0.02 * Math.sin(2 * M * D2R) + + 282.634; + if (L > 360) { + L -= 360; + } else if (L < 0) { + L += 360; + } + let RA = R2D * Math.atan(0.91764 * Math.tan(L * D2R)); + if (RA > 360) { + RA -= 360; + } else if (RA < 0) { + RA += 360; + } + const Lquadrant = Math.floor(L / 90) * 90; + const RAquadrant = Math.floor(RA / 90) * 90; + RA += Lquadrant - RAquadrant; + RA /= 15; + const sinDec = 0.39782 * Math.sin(L * D2R); + const cosDec = Math.cos(Math.asin(sinDec)); + const cosH = + (Math.cos(zenith * D2R) - sinDec * Math.sin(latitude * D2R)) / + (cosDec * Math.cos(latitude * D2R)); + if (cosH > 1) { + return { + alwaysDay: false, + alwaysNight: true, + time: 0 + }; + } else if (cosH < -1) { + return { + alwaysDay: true, + alwaysNight: false, + time: 0 + }; + } + const H = + (isSunrise + ? 360 - R2D * Math.acos(cosH) + : R2D * Math.acos(cosH)) / 15; + const T = H + RA - 0.06571 * t - 6.622; + let UT = T - lnHour; + if (UT > 24) { + UT -= 24; + } else if (UT < 0) { + UT += 24; + } + return { + alwaysDay: false, + alwaysNight: false, + time: Math.round(UT * getDuration({hours: 1})) + }; + } + const sunriseTime = getTime(true); + const sunsetTime = getTime(false); + if (sunriseTime.alwaysDay || sunsetTime.alwaysDay) { + return { + alwaysDay: true + }; + } else if (sunriseTime.alwaysNight || sunsetTime.alwaysNight) { + return { + alwaysNight: true + }; + } + return { + sunriseTime: sunriseTime.time, + sunsetTime: sunsetTime.time + }; + } + function isNightAtLocation(latitude, longitude, date = new Date()) { + const time = getSunsetSunriseUTCTime(latitude, longitude, date); + if (time.alwaysDay) { + return false; + } else if (time.alwaysNight) { + return true; + } + const sunriseTime = time.sunriseTime; + const sunsetTime = time.sunsetTime; + const currentTime = + date.getUTCHours() * getDuration({hours: 1}) + + date.getUTCMinutes() * getDuration({minutes: 1}) + + date.getUTCSeconds() * getDuration({seconds: 1}) + + date.getUTCMilliseconds(); + return isInTimeIntervalUTC(sunsetTime, sunriseTime, currentTime); + } + function nextTimeChangeAtLocation(latitude, longitude, date = new Date()) { + const time = getSunsetSunriseUTCTime(latitude, longitude, date); + if (time.alwaysDay) { + return date.getTime() + getDuration({days: 1}); + } else if (time.alwaysNight) { + return date.getTime() + getDuration({days: 1}); + } + const [firstTimeOnDay, lastTimeOnDay] = + time.sunriseTime < time.sunsetTime + ? [time.sunriseTime, time.sunsetTime] + : [time.sunsetTime, time.sunriseTime]; + const currentTime = + date.getUTCHours() * getDuration({hours: 1}) + + date.getUTCMinutes() * getDuration({minutes: 1}) + + date.getUTCSeconds() * getDuration({seconds: 1}) + + date.getUTCMilliseconds(); + if (currentTime <= firstTimeOnDay) { + return Date.UTC( + date.getUTCFullYear(), + date.getUTCMonth(), + date.getUTCDate(), + 0, + 0, + 0, + firstTimeOnDay + ); + } + if (currentTime <= lastTimeOnDay) { + return Date.UTC( + date.getUTCFullYear(), + date.getUTCMonth(), + date.getUTCDate(), + 0, + 0, + 0, + lastTimeOnDay + ); + } + return Date.UTC( + date.getUTCFullYear(), + date.getUTCMonth(), + date.getUTCDate() + 1, + 0, + 0, + 0, + firstTimeOnDay + ); + } + + async function readText(params) { + return new Promise((resolve, reject) => { + if (isXMLHttpRequestSupported) { + const request = new XMLHttpRequest(); + request.overrideMimeType("text/plain"); + request.open("GET", params.url, true); + request.onload = () => { + if (request.status >= 200 && request.status < 300) { + resolve(request.responseText); + } else { + reject( + new Error( + `${request.status}: ${request.statusText}` + ) + ); + } + }; + request.onerror = () => + reject( + new Error(`${request.status}: ${request.statusText}`) + ); + if (params.timeout) { + request.timeout = params.timeout; + request.ontimeout = () => + reject( + new Error("File loading stopped due to timeout") + ); + } + request.send(); + } else if (isFetchSupported) { + let abortController; + let signal; + let timedOut = false; + if (params.timeout) { + abortController = new AbortController(); + signal = abortController.signal; + setTimeout(() => { + abortController.abort(); + timedOut = true; + }, params.timeout); + } + fetch(params.url, {signal}) + .then((response) => { + if (response.status >= 200 && response.status < 300) { + resolve(response.text()); + } else { + reject( + new Error( + `${response.status}: ${response.statusText}` + ) + ); + } + }) + .catch((error) => { + if (timedOut) { + reject( + new Error("File loading stopped due to timeout") + ); + } else { + reject(error); + } + }); + } else { + reject( + new Error( + `Neither XMLHttpRequest nor Fetch API are accessible!` + ) + ); + } + }); + } + class LimitedCacheStorage { + constructor() { + this.bytesInUse = 0; + this.records = new Map(); + chrome.alarms.onAlarm.addListener(async (alarm) => { + if (alarm.name === LimitedCacheStorage.ALARM_NAME) { + LimitedCacheStorage.alarmIsActive = false; + this.removeExpiredRecords(); + } + }); + } + static ensureAlarmIsScheduled() { + if (!this.alarmIsActive) { + chrome.alarms.create(LimitedCacheStorage.ALARM_NAME, { + delayInMinutes: 1 + }); + this.alarmIsActive = true; + } + } + has(url) { + return this.records.has(url); + } + get(url) { + if (this.records.has(url)) { + const record = this.records.get(url); + record.expires = Date.now() + LimitedCacheStorage.TTL; + this.records.delete(url); + this.records.set(url, record); + return record.value; + } + return null; + } + set(url, value) { + LimitedCacheStorage.ensureAlarmIsScheduled(); + const size = getStringSize(value); + if (size > LimitedCacheStorage.QUOTA_BYTES) { + return; + } + for (const [url, record] of this.records) { + if (this.bytesInUse + size > LimitedCacheStorage.QUOTA_BYTES) { + this.records.delete(url); + this.bytesInUse -= record.size; + } else { + break; + } + } + const expires = Date.now() + LimitedCacheStorage.TTL; + this.records.set(url, {url, value, size, expires}); + this.bytesInUse += size; + } + removeExpiredRecords() { + const now = Date.now(); + for (const [url, record] of this.records) { + if (record.expires < now) { + this.records.delete(url); + this.bytesInUse -= record.size; + } else { + break; + } + } + if (this.records.size !== 0) { + LimitedCacheStorage.ensureAlarmIsScheduled(); + } + } + } + LimitedCacheStorage.QUOTA_BYTES = + (navigator.deviceMemory || 4) * 16 * 1024 * 1024; + LimitedCacheStorage.TTL = getDuration({minutes: 10}); + LimitedCacheStorage.ALARM_NAME = "network"; + LimitedCacheStorage.alarmIsActive = false; + function createFileLoader() { + const caches = { + "data-url": new LimitedCacheStorage(), + "text": new LimitedCacheStorage() + }; + const loaders = { + "data-url": loadAsDataURL, + "text": loadAsText + }; + async function get({url, responseType, mimeType, origin}) { + const cache = caches[responseType]; + const load = loaders[responseType]; + if (cache.has(url)) { + return cache.get(url); + } + const data = await load(url, mimeType, origin); + cache.set(url, data); + return data; + } + return {get}; + } + + function isIPV6(url) { + const openingBracketIndex = url.indexOf("["); + if (openingBracketIndex < 0) { + return false; + } + const queryIndex = url.indexOf("?"); + if (queryIndex >= 0 && openingBracketIndex > queryIndex) { + return false; + } + return true; + } + const ipV6HostRegex = /\[.*?\](\:\d+)?/; + function compareIPV6(firstURL, secondURL) { + const firstHost = firstURL.match(ipV6HostRegex)[0]; + const secondHost = secondURL.match(ipV6HostRegex)[0]; + return firstHost === secondHost; + } + + function getURLHostOrProtocol($url) { + const url = new URL($url); + if (url.host) { + return url.host; + } else if (url.protocol === "file:") { + return url.pathname; + } + return url.protocol; + } + function compareURLPatterns(a, b) { + return a.localeCompare(b); + } + function isURLInList(url, list) { + for (let i = 0; i < list.length; i++) { + if (isURLMatched(url, list[i])) { + return true; + } + } + return false; + } + function isURLMatched(url, urlTemplate) { + const isFirstIPV6 = isIPV6(url); + const isSecondIPV6 = isIPV6(urlTemplate); + if (isFirstIPV6 && isSecondIPV6) { + return compareIPV6(url, urlTemplate); + } else if (!isFirstIPV6 && !isSecondIPV6) { + const regex = createUrlRegex(urlTemplate); + return Boolean(url.match(regex)); + } + return false; + } + function createUrlRegex(urlTemplate) { + urlTemplate = urlTemplate.trim(); + const exactBeginning = urlTemplate[0] === "^"; + const exactEnding = urlTemplate[urlTemplate.length - 1] === "$"; + urlTemplate = urlTemplate + .replace(/^\^/, "") + .replace(/\$$/, "") + .replace(/^.*?\/{2,3}/, "") + .replace(/\?.*$/, "") + .replace(/\/$/, ""); + let slashIndex; + let beforeSlash; + let afterSlash; + if ((slashIndex = urlTemplate.indexOf("/")) >= 0) { + beforeSlash = urlTemplate.substring(0, slashIndex); + afterSlash = urlTemplate.replace(/\$/g, "").substring(slashIndex); + } else { + beforeSlash = urlTemplate.replace(/\$/g, ""); + } + let result = exactBeginning + ? "^(.*?\\:\\/{2,3})?" + : "^(.*?\\:\\/{2,3})?([^/]*?\\.)?"; + const hostParts = beforeSlash.split("."); + result += "("; + for (let i = 0; i < hostParts.length; i++) { + if (hostParts[i] === "*") { + hostParts[i] = "[^\\.\\/]+?"; + } + } + result += hostParts.join("\\."); + result += ")"; + if (afterSlash) { + result += "("; + result += afterSlash.replace("/", "\\/"); + result += ")"; + } + result += exactEnding ? "(\\/?(\\?[^/]*?)?)$" : "(\\/?.*?)$"; + return new RegExp(result, "i"); + } + function isPDF(url) { + if (url.includes(".pdf")) { + if (url.includes("?")) { + url = url.substring(0, url.lastIndexOf("?")); + } + if (url.includes("#")) { + url = url.substring(0, url.lastIndexOf("#")); + } + if ( + (url.match(/(wikipedia|wikimedia)\.org/i) && + url.match( + /(wikipedia|wikimedia)\.org\/.*\/[a-z]+\:[^\:\/]+\.pdf/i + )) || + (url.match(/timetravel\.mementoweb\.org\/reconstruct/i) && + url.match(/\.pdf$/i)) || + (url.match(/dropbox\.com\/s\//i) && url.match(/\.pdf$/i)) + ) { + return false; + } + if (url.endsWith(".pdf")) { + for (let i = url.length; i > 0; i--) { + if (url[i] === "=") { + return false; + } else if (url[i] === "/") { + return true; + } + } + } else { + return false; + } + } + return false; + } + function isURLEnabled( + url, + userSettings, + {isProtected, isInDarkList, isDarkThemeDetected} + ) { + if (isProtected && !userSettings.enableForProtectedPages) { + return false; + } + if (isPDF(url)) { + return userSettings.enableForPDF; + } + const isURLInUserList = isURLInList(url, userSettings.siteList); + const isURLInEnabledList = isURLInList( + url, + userSettings.siteListEnabled + ); + if (userSettings.applyToListedOnly) { + return isURLInEnabledList || isURLInUserList; + } + if (isURLInEnabledList) { + return true; + } + if ( + isInDarkList || + (userSettings.detectDarkTheme && isDarkThemeDetected) + ) { + return false; + } + return !isURLInUserList; + } + function isFullyQualifiedDomain(candidate) { + return /^[a-z0-9.-]+$/.test(candidate); + } + + function parseSitesFixesConfig(text, options) { + const sites = []; + const blocks = text.replace(/\r/g, "").split(/^\s*={2,}\s*$/gm); + blocks.forEach((block) => { + const lines = block.split("\n"); + const commandIndices = []; + lines.forEach((ln, i) => { + if (ln.match(/^[A-Z]+(\s[A-Z]+){0,2}$/)) { + commandIndices.push(i); + } + }); + if (commandIndices.length === 0) { + return; + } + const siteFix = { + url: parseArray(lines.slice(0, commandIndices[0]).join("\n")) + }; + commandIndices.forEach((commandIndex, i) => { + const command = lines[commandIndex].trim(); + const valueText = lines + .slice( + commandIndex + 1, + i === commandIndices.length - 1 + ? lines.length + : commandIndices[i + 1] + ) + .join("\n"); + const prop = options.getCommandPropName(command); + if (!prop) { + return; + } + const value = options.parseCommandValue(command, valueText); + siteFix[prop] = value; + }); + sites.push(siteFix); + }); + return sites; + } + function getDomain(url) { + try { + return new URL(url).hostname.toLowerCase(); + } catch (error) { + return url.split("/")[0].toLowerCase(); + } + } + function encodeOffsets(offsets) { + return offsets + .map(([offset, length]) => { + const stringOffset = offset.toString(36); + const stringLength = length.toString(36); + return ( + "0".repeat(4 - stringOffset.length) + + stringOffset + + "0".repeat(3 - stringLength.length) + + stringLength + ); + }) + .join(""); + } + function decodeOffset(offsets, index) { + const base = (4 + 3) * index; + const offset = parseInt(offsets.substring(base + 0, base + 4), 36); + const length = parseInt(offsets.substring(base + 4, base + 4 + 3), 36); + return [offset, offset + length]; + } + function indexSitesFixesConfig(text) { + const domains = {}; + const domainPatterns = {}; + const offsets = []; + function processBlock(recordStart, recordEnd, index) { + const block = text.substring(recordStart, recordEnd); + const lines = block.split("\n"); + const commandIndices = []; + lines.forEach((ln, i) => { + if (ln.match(/^[A-Z]+(\s[A-Z]+){0,2}$/)) { + commandIndices.push(i); + } + }); + if (commandIndices.length === 0) { + return; + } + const urls = parseArray( + lines.slice(0, commandIndices[0]).join("\n") + ); + for (const url of urls) { + const domain = getDomain(url); + if (isFullyQualifiedDomain(domain)) { + if (!domains[domain]) { + domains[domain] = index; + } else if ( + typeof domains[domain] === "number" && + domains[domain] !== index + ) { + domains[domain] = [domains[domain], index]; + } else if ( + typeof domains[domain] === "object" && + !domains[domain].includes(index) + ) { + domains[domain].push(index); + } + continue; + } + if (!domainPatterns[domain]) { + domainPatterns[domain] = index; + } else if ( + typeof domainPatterns[domain] === "number" && + domainPatterns[domain] !== index + ) { + domainPatterns[domain] = [domainPatterns[domain], index]; + } else if ( + typeof domainPatterns[domain] === "object" && + !domainPatterns[domain].includes(index) + ) { + domainPatterns[domain].push(index); + } + } + offsets.push([recordStart, recordEnd - recordStart]); + } + let recordStart = 0; + const delimiterRegex = /^\s*={2,}\s*$/gm; + let delimiter; + let count = 0; + while ((delimiter = delimiterRegex.exec(text))) { + const nextDelimiterStart = delimiter.index; + const nextDelimiterEnd = delimiter.index + delimiter[0].length; + processBlock(recordStart, nextDelimiterStart, count); + recordStart = nextDelimiterEnd; + count++; + } + processBlock(recordStart, text.length, count); + return { + offsets: encodeOffsets(offsets), + domains, + domainPatterns, + cache: {} + }; + } + function parseSiteFixConfig(text, options, recordStart, recordEnd) { + const block = text.substring(recordStart, recordEnd); + return parseSitesFixesConfig(block, options)[0]; + } + function getSitesFixesFor(url, text, index, options) { + const records = []; + let recordIds = []; + const domain = getDomain(url); + for (const pattern of Object.keys(index.domainPatterns)) { + if (isURLMatched(url, pattern)) { + recordIds = recordIds.concat(index.domainPatterns[pattern]); + } + } + const labels = domain.split("."); + for (let i = 0; i < labels.length; i++) { + const substring = labels.slice(i).join("."); + if (index.domains[substring] && isURLMatched(url, substring)) { + recordIds = recordIds.concat(index.domains[substring]); + } + } + const set = new Set(); + for (const id of recordIds) { + if (set.has(id)) { + continue; + } + set.add(id); + if (!index.cache[id]) { + const [start, end] = decodeOffset(index.offsets, id); + index.cache[id] = parseSiteFixConfig(text, options, start, end); + } + records.push(index.cache[id]); + } + return records; + } + + const SEPERATOR = "=".repeat(32); + const backgroundPropertyLength = "background: ".length; + const textPropertyLength = "text: ".length; + const humanizeNumber = (number) => { + if (number > 3) { + return `${number}th`; + } + switch (number) { + case 0: + return "0"; + case 1: + return "1st"; + case 2: + return "2nd"; + case 3: + return "3rd"; + } + }; + const isValidHexColor = (color) => { + return /^#([0-9a-fA-F]{3}){1,2}$/.test(color); + }; + function ParseColorSchemeConfig(config) { + const sections = config.split(`${SEPERATOR}\n\n`); + const definedColorSchemeNames = new Set(); + let lastDefinedColorSchemeName = ""; + const definedColorSchemes = { + light: {}, + dark: {} + }; + let interrupt = false; + let error = null; + const throwError = (message) => { + if (!interrupt) { + interrupt = true; + error = message; + } + }; + sections.forEach((section) => { + if (interrupt) { + return; + } + const lines = section.split("\n"); + const name = lines[0]; + if (!name) { + throwError("No color scheme name was found."); + return; + } + if (definedColorSchemeNames.has(name)) { + throwError( + `The color scheme name "${name}" is already defined.` + ); + return; + } + if ( + lastDefinedColorSchemeName && + lastDefinedColorSchemeName !== "Default" && + name.localeCompare(lastDefinedColorSchemeName) < 0 + ) { + throwError( + `The color scheme name "${name}" is not in alphabetical order.` + ); + return; + } + lastDefinedColorSchemeName = name; + definedColorSchemeNames.add(name); + if (lines[1]) { + throwError( + `The second line of the color scheme "${name}" is not empty.` + ); + return; + } + const checkVariant = (lineIndex, isSecondVariant) => { + const variant = lines[lineIndex]; + if (!variant) { + throwError( + `The third line of the color scheme "${name}" is not defined.` + ); + return; + } + if ( + variant !== "LIGHT" && + variant !== "DARK" && + isSecondVariant && + variant === "Light" + ) { + throwError( + `The ${humanizeNumber( + lineIndex + )} line of the color scheme "${name}" is not a valid variant.` + ); + return; + } + const firstProperty = lines[lineIndex + 1]; + if (!firstProperty) { + throwError( + `The ${humanizeNumber( + lineIndex + 1 + )} line of the color scheme "${name}" is not defined.` + ); + return; + } + if (!firstProperty.startsWith("background: ")) { + throwError( + `The ${humanizeNumber( + lineIndex + 1 + )} line of the color scheme "${name}" is not background-color property.` + ); + return; + } + const backgroundColor = firstProperty.slice( + backgroundPropertyLength + ); + if (!isValidHexColor(backgroundColor)) { + throwError( + `The ${humanizeNumber( + lineIndex + 1 + )} line of the color scheme "${name}" is not a valid hex color.` + ); + return; + } + const secondProperty = lines[lineIndex + 2]; + if (!secondProperty) { + throwError( + `The ${humanizeNumber( + lineIndex + 2 + )} line of the color scheme "${name}" is not defined.` + ); + return; + } + if (!secondProperty.startsWith("text: ")) { + throwError( + `The ${humanizeNumber( + lineIndex + 2 + )} line of the color scheme "${name}" is not text-color property.` + ); + return; + } + const textColor = secondProperty.slice(textPropertyLength); + if (!isValidHexColor(textColor)) { + throwError( + `The ${humanizeNumber( + lineIndex + 2 + )} line of the color scheme "${name}" is not a valid hex color.` + ); + return; + } + return { + backgroundColor, + textColor, + variant + }; + }; + const firstVariant = checkVariant(2, false); + const isFirstVariantLight = firstVariant.variant === "LIGHT"; + delete firstVariant.variant; + if (interrupt) { + return; + } + let secondVariant = null; + let isSecondVariantLight = false; + if (lines[6]) { + secondVariant = checkVariant(6, true); + isSecondVariantLight = secondVariant.variant === "LIGHT"; + delete secondVariant.variant; + if (interrupt) { + return; + } + if (lines.length > 11 || lines[9] || lines[10]) { + throwError( + `The color scheme "${name}" doesn't end with 1 new line.` + ); + return; + } + } else if (lines.length > 7) { + throwError( + `The color scheme "${name}" doesn't end with 1 new line.` + ); + return; + } + if (secondVariant) { + if (isFirstVariantLight === isSecondVariantLight) { + throwError( + `The color scheme "${name}" has the same variant twice.` + ); + return; + } + if (isFirstVariantLight) { + definedColorSchemes.light[name] = firstVariant; + definedColorSchemes.dark[name] = secondVariant; + } else { + definedColorSchemes.light[name] = secondVariant; + definedColorSchemes.dark[name] = firstVariant; + } + } else if (isFirstVariantLight) { + definedColorSchemes.light[name] = firstVariant; + } else { + definedColorSchemes.dark[name] = firstVariant; + } + }); + return {result: definedColorSchemes, error: error}; + } + + function logInfo(...args) {} + function logWarn(...args) {} + + var ThemeEngine; + (function (ThemeEngine) { + ThemeEngine["cssFilter"] = "cssFilter"; + ThemeEngine["svgFilter"] = "svgFilter"; + ThemeEngine["staticTheme"] = "staticTheme"; + ThemeEngine["dynamicTheme"] = "dynamicTheme"; + })(ThemeEngine || (ThemeEngine = {})); + + var AutomationMode; + (function (AutomationMode) { + AutomationMode["NONE"] = ""; + AutomationMode["TIME"] = "time"; + AutomationMode["SYSTEM"] = "system"; + AutomationMode["LOCATION"] = "location"; + })(AutomationMode || (AutomationMode = {})); + + const DEFAULT_COLORS = { + darkScheme: { + background: "#181a1b", + text: "#e8e6e3" + }, + lightScheme: { + background: "#dcdad7", + text: "#181a1b" + } + }; + const DEFAULT_THEME = { + mode: 1, + brightness: 100, + contrast: 100, + grayscale: 0, + sepia: 0, + useFont: false, + fontFamily: isMacOS + ? "Helvetica Neue" + : isWindows + ? "Segoe UI" + : "Open Sans", + textStroke: 0, + engine: ThemeEngine.dynamicTheme, + stylesheet: "", + darkSchemeBackgroundColor: DEFAULT_COLORS.darkScheme.background, + darkSchemeTextColor: DEFAULT_COLORS.darkScheme.text, + lightSchemeBackgroundColor: DEFAULT_COLORS.lightScheme.background, + lightSchemeTextColor: DEFAULT_COLORS.lightScheme.text, + scrollbarColor: isMacOS ? "" : "auto", + selectionColor: "auto", + styleSystemControls: !isCSSColorSchemePropSupported, + lightColorScheme: "Default", + darkColorScheme: "Default", + immediateModify: false + }; + const DEFAULT_COLORSCHEME = { + light: { + Default: { + backgroundColor: DEFAULT_COLORS.lightScheme.background, + textColor: DEFAULT_COLORS.lightScheme.text + } + }, + dark: { + Default: { + backgroundColor: DEFAULT_COLORS.darkScheme.background, + textColor: DEFAULT_COLORS.darkScheme.text + } + } + }; + const DEFAULT_SETTINGS = { + enabled: true, + fetchNews: true, + theme: DEFAULT_THEME, + presets: [], + customThemes: [], + siteList: [], + siteListEnabled: [], + applyToListedOnly: false, + changeBrowserTheme: false, + syncSettings: true, + syncSitesFixes: false, + automation: { + enabled: false, + mode: AutomationMode.NONE, + behavior: "OnOff" + }, + time: { + activation: "18:00", + deactivation: "9:00" + }, + location: { + latitude: null, + longitude: null + }, + previewNewDesign: false, + enableForPDF: true, + enableForProtectedPages: false, + enableContextMenus: false, + detectDarkTheme: false + }; + + const CONFIG_URLs = { + darkSites: { + remote: "https://raw.githubusercontent.com/darkreader/darkreader/main/src/config/dark-sites.config", + local: "../config/dark-sites.config" + }, + dynamicThemeFixes: { + remote: "https://raw.githubusercontent.com/darkreader/darkreader/main/src/config/dynamic-theme-fixes.config", + local: "../config/dynamic-theme-fixes.config" + }, + inversionFixes: { + remote: "https://raw.githubusercontent.com/darkreader/darkreader/main/src/config/inversion-fixes.config", + local: "../config/inversion-fixes.config" + }, + staticThemes: { + remote: "https://raw.githubusercontent.com/darkreader/darkreader/main/src/config/static-themes.config", + local: "../config/static-themes.config" + }, + colorSchemes: { + remote: "https://raw.githubusercontent.com/darkreader/darkreader/main/src/config/color-schemes.drconf", + local: "../config/color-schemes.drconf" + } + }; + const REMOTE_TIMEOUT_MS = getDuration({seconds: 10}); + class ConfigManager { + static async loadConfig({name, local, localURL, remoteURL}) { + let $config; + const loadLocal = async () => await readText({url: localURL}); + if (local) { + $config = await loadLocal(); + } else { + try { + $config = await readText({ + url: `${remoteURL}?nocache=${Date.now()}`, + timeout: REMOTE_TIMEOUT_MS + }); + } catch (err) { + console.error(`${name} remote load error`, err); + $config = await loadLocal(); + } + } + return $config; + } + static async loadColorSchemes({local}) { + const $config = await this.loadConfig({ + name: "Color Schemes", + local, + localURL: CONFIG_URLs.colorSchemes.local, + remoteURL: CONFIG_URLs.colorSchemes.remote + }); + this.raw.colorSchemes = $config; + this.handleColorSchemes(); + } + static async loadDarkSites({local}) { + const sites = await this.loadConfig({ + name: "Dark Sites", + local, + localURL: CONFIG_URLs.darkSites.local, + remoteURL: CONFIG_URLs.darkSites.remote + }); + this.raw.darkSites = sites; + this.handleDarkSites(); + } + static async loadDynamicThemeFixes({local}) { + const fixes = await this.loadConfig({ + name: "Dynamic Theme Fixes", + local, + localURL: CONFIG_URLs.dynamicThemeFixes.local, + remoteURL: CONFIG_URLs.dynamicThemeFixes.remote + }); + this.raw.dynamicThemeFixes = fixes; + this.handleDynamicThemeFixes(); + } + static async loadInversionFixes({local}) { + const fixes = await this.loadConfig({ + name: "Inversion Fixes", + local, + localURL: CONFIG_URLs.inversionFixes.local, + remoteURL: CONFIG_URLs.inversionFixes.remote + }); + this.raw.inversionFixes = fixes; + this.handleInversionFixes(); + } + static async loadStaticThemes({local}) { + const themes = await this.loadConfig({ + name: "Static Themes", + local, + localURL: CONFIG_URLs.staticThemes.local, + remoteURL: CONFIG_URLs.staticThemes.remote + }); + this.raw.staticThemes = themes; + this.handleStaticThemes(); + } + static async load(config) { + await Promise.all([ + this.loadColorSchemes(config), + this.loadDarkSites(config), + this.loadDynamicThemeFixes(config), + this.loadInversionFixes(config), + this.loadStaticThemes(config) + ]).catch((err) => console.error("Fatality", err)); + } + static handleColorSchemes() { + const $config = this.raw.colorSchemes; + const {result, error} = ParseColorSchemeConfig($config); + if (error) { + this.COLOR_SCHEMES_RAW = DEFAULT_COLORSCHEME; + return; + } + this.COLOR_SCHEMES_RAW = result; + } + static handleDarkSites() { + const $sites = this.overrides.darkSites || this.raw.darkSites; + this.DARK_SITES = parseArray($sites); + } + static handleDynamicThemeFixes() { + const $fixes = + this.overrides.dynamicThemeFixes || this.raw.dynamicThemeFixes; + this.DYNAMIC_THEME_FIXES_INDEX = indexSitesFixesConfig($fixes); + this.DYNAMIC_THEME_FIXES_RAW = $fixes; + } + static handleInversionFixes() { + const $fixes = + this.overrides.inversionFixes || this.raw.inversionFixes; + this.INVERSION_FIXES_INDEX = indexSitesFixesConfig($fixes); + this.INVERSION_FIXES_RAW = $fixes; + } + static handleStaticThemes() { + const $themes = + this.overrides.staticThemes || this.raw.staticThemes; + this.STATIC_THEMES_INDEX = indexSitesFixesConfig($themes); + this.STATIC_THEMES_RAW = $themes; + } + } + ConfigManager.raw = { + darkSites: null, + dynamicThemeFixes: null, + inversionFixes: null, + staticThemes: null, + colorSchemes: null + }; + ConfigManager.overrides = { + darkSites: null, + dynamicThemeFixes: null, + inversionFixes: null, + staticThemes: null + }; + + function isArrayLike(items) { + return items.length != null; + } + function forEach(items, iterator) { + if (isArrayLike(items)) { + for (let i = 0, len = items.length; i < len; i++) { + iterator(items[i]); + } + } else { + for (const item of items) { + iterator(item); + } + } + } + function push(array, addition) { + forEach(addition, (a) => array.push(a)); + } + + function formatSitesFixesConfig(fixes, options) { + const lines = []; + fixes.forEach((fix, i) => { + push(lines, fix.url); + options.props.forEach((prop) => { + const command = options.getPropCommandName(prop); + const value = fix[prop]; + if (options.shouldIgnoreProp(prop, value)) { + return; + } + lines.push(""); + lines.push(command); + const formattedValue = options.formatPropValue(prop, value); + if (formattedValue) { + lines.push(formattedValue); + } + }); + if (i < fixes.length - 1) { + lines.push(""); + lines.push("=".repeat(32)); + lines.push(""); + } + }); + lines.push(""); + return lines.join("\n"); + } + + function scale(x, inLow, inHigh, outLow, outHigh) { + return ((x - inLow) * (outHigh - outLow)) / (inHigh - inLow) + outLow; + } + function clamp(x, min, max) { + return Math.min(max, Math.max(min, x)); + } + function multiplyMatrices(m1, m2) { + const result = []; + for (let i = 0, len = m1.length; i < len; i++) { + result[i] = []; + for (let j = 0, len2 = m2[0].length; j < len2; j++) { + let sum = 0; + for (let k = 0, len3 = m1[0].length; k < len3; k++) { + sum += m1[i][k] * m2[k][j]; + } + result[i][j] = sum; + } + } + return result; + } + + function createFilterMatrix(config) { + let m = Matrix.identity(); + if (config.sepia !== 0) { + m = multiplyMatrices(m, Matrix.sepia(config.sepia / 100)); + } + if (config.grayscale !== 0) { + m = multiplyMatrices(m, Matrix.grayscale(config.grayscale / 100)); + } + if (config.contrast !== 100) { + m = multiplyMatrices(m, Matrix.contrast(config.contrast / 100)); + } + if (config.brightness !== 100) { + m = multiplyMatrices(m, Matrix.brightness(config.brightness / 100)); + } + if (config.mode === 1) { + m = multiplyMatrices(m, Matrix.invertNHue()); + } + return m; + } + function applyColorMatrix([r, g, b], matrix) { + const rgb = [[r / 255], [g / 255], [b / 255], [1], [1]]; + const result = multiplyMatrices(matrix, rgb); + return [0, 1, 2].map((i) => + clamp(Math.round(result[i][0] * 255), 0, 255) + ); + } + const Matrix = { + identity() { + return [ + [1, 0, 0, 0, 0], + [0, 1, 0, 0, 0], + [0, 0, 1, 0, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + invertNHue() { + return [ + [0.333, -0.667, -0.667, 0, 1], + [-0.667, 0.333, -0.667, 0, 1], + [-0.667, -0.667, 0.333, 0, 1], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + brightness(v) { + return [ + [v, 0, 0, 0, 0], + [0, v, 0, 0, 0], + [0, 0, v, 0, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + contrast(v) { + const t = (1 - v) / 2; + return [ + [v, 0, 0, 0, t], + [0, v, 0, 0, t], + [0, 0, v, 0, t], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + sepia(v) { + return [ + [ + 0.393 + 0.607 * (1 - v), + 0.769 - 0.769 * (1 - v), + 0.189 - 0.189 * (1 - v), + 0, + 0 + ], + [ + 0.349 - 0.349 * (1 - v), + 0.686 + 0.314 * (1 - v), + 0.168 - 0.168 * (1 - v), + 0, + 0 + ], + [ + 0.272 - 0.272 * (1 - v), + 0.534 - 0.534 * (1 - v), + 0.131 + 0.869 * (1 - v), + 0, + 0 + ], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + grayscale(v) { + return [ + [ + 0.2126 + 0.7874 * (1 - v), + 0.7152 - 0.7152 * (1 - v), + 0.0722 - 0.0722 * (1 - v), + 0, + 0 + ], + [ + 0.2126 - 0.2126 * (1 - v), + 0.7152 + 0.2848 * (1 - v), + 0.0722 - 0.0722 * (1 - v), + 0, + 0 + ], + [ + 0.2126 - 0.2126 * (1 - v), + 0.7152 - 0.7152 * (1 - v), + 0.0722 + 0.9278 * (1 - v), + 0, + 0 + ], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + } + }; + + function createTextStyle(config) { + const lines = []; + lines.push( + '*:not(pre, pre *, code, .far, .fa, .glyphicon, [class*="vjs-"], .fab, .fa-github, .fas, .material-icons, .icofont, .typcn, mu, [class*="mu-"], .glyphicon, .icon) {' + ); + if (config.useFont && config.fontFamily) { + lines.push(` font-family: ${config.fontFamily} !important;`); + } + if (config.textStroke > 0) { + lines.push( + ` -webkit-text-stroke: ${config.textStroke}px !important;` + ); + lines.push(` text-stroke: ${config.textStroke}px !important;`); + } + lines.push("}"); + return lines.join("\n"); + } + + var FilterMode; + (function (FilterMode) { + FilterMode[(FilterMode["light"] = 0)] = "light"; + FilterMode[(FilterMode["dark"] = 1)] = "dark"; + })(FilterMode || (FilterMode = {})); + function hasPatchForChromiumIssue501582() { + return Boolean( + compareChromeVersions(chromiumVersion, "81.0.4035.0") >= 0 + ); + } + function hasFirefoxNewRootBehavior() { + return Boolean( + isFirefox && compareChromeVersions(firefoxVersion, "102.0") >= 0 + ); + } + function createCSSFilterStyleSheet(config, url, frameURL, fixes, index) { + const filterValue = getCSSFilterValue(config); + const reverseFilterValue = "invert(100%) hue-rotate(180deg)"; + return cssFilterStyleSheetTemplate( + filterValue, + reverseFilterValue, + config, + url, + frameURL, + fixes, + index + ); + } + function cssFilterStyleSheetTemplate( + filterValue, + reverseFilterValue, + config, + url, + frameURL, + fixes, + index + ) { + const fix = getInversionFixesFor(frameURL || url, fixes, index); + const lines = []; + lines.push("@media screen {"); + if (filterValue && !frameURL) { + lines.push(""); + lines.push("/* Leading rule */"); + lines.push(createLeadingRule(filterValue)); + } + if (config.mode === FilterMode.dark) { + lines.push(""); + lines.push("/* Reverse rule */"); + lines.push(createReverseRule(reverseFilterValue, fix)); + } + if (config.useFont || config.textStroke > 0) { + lines.push(""); + lines.push("/* Font */"); + lines.push(createTextStyle(config)); + } + lines.push(""); + lines.push("/* Text contrast */"); + lines.push("html {"); + lines.push(" text-shadow: 0 0 0 !important;"); + lines.push("}"); + lines.push(""); + lines.push("/* Full screen */"); + [":-webkit-full-screen", ":-moz-full-screen", ":fullscreen"].forEach( + (fullScreen) => { + lines.push(`${fullScreen}, ${fullScreen} * {`); + lines.push(" -webkit-filter: none !important;"); + lines.push(" filter: none !important;"); + lines.push("}"); + } + ); + if (!frameURL) { + const light = [255, 255, 255]; + const bgColor = + !hasPatchForChromiumIssue501582() && + !hasFirefoxNewRootBehavior() && + config.mode === FilterMode.dark + ? applyColorMatrix(light, createFilterMatrix(config)).map( + Math.round + ) + : light; + lines.push(""); + lines.push("/* Page background */"); + lines.push("html {"); + lines.push(` background: rgb(${bgColor.join(",")}) !important;`); + lines.push("}"); + } + if (fix.css && fix.css.length > 0 && config.mode === FilterMode.dark) { + lines.push(""); + lines.push("/* Custom rules */"); + lines.push(fix.css); + } + lines.push(""); + lines.push("}"); + return lines.join("\n"); + } + function getCSSFilterValue(config) { + const filters = []; + if (config.mode === FilterMode.dark) { + filters.push("invert(100%) hue-rotate(180deg)"); + } + if (config.brightness !== 100) { + filters.push(`brightness(${config.brightness}%)`); + } + if (config.contrast !== 100) { + filters.push(`contrast(${config.contrast}%)`); + } + if (config.grayscale !== 0) { + filters.push(`grayscale(${config.grayscale}%)`); + } + if (config.sepia !== 0) { + filters.push(`sepia(${config.sepia}%)`); + } + if (filters.length === 0) { + return null; + } + return filters.join(" "); + } + function createLeadingRule(filterValue) { + return [ + "html {", + ` -webkit-filter: ${filterValue} !important;`, + ` filter: ${filterValue} !important;`, + "}" + ].join("\n"); + } + function joinSelectors(selectors) { + return selectors.map((s) => s.replace(/\,$/, "")).join(",\n"); + } + function createReverseRule(reverseFilterValue, fix) { + const lines = []; + if (fix.invert.length > 0) { + lines.push(`${joinSelectors(fix.invert)} {`); + lines.push(` -webkit-filter: ${reverseFilterValue} !important;`); + lines.push(` filter: ${reverseFilterValue} !important;`); + lines.push("}"); + } + if (fix.noinvert.length > 0) { + lines.push(`${joinSelectors(fix.noinvert)} {`); + lines.push(" -webkit-filter: none !important;"); + lines.push(" filter: none !important;"); + lines.push("}"); + } + if (fix.removebg.length > 0) { + lines.push(`${joinSelectors(fix.removebg)} {`); + lines.push(" background: white !important;"); + lines.push("}"); + } + return lines.join("\n"); + } + function getInversionFixesFor(url, fixes, index) { + const inversionFixes = getSitesFixesFor(url, fixes, index, { + commands: Object.keys(inversionFixesCommands), + getCommandPropName: (command) => inversionFixesCommands[command], + parseCommandValue: (command, value) => { + if (command === "CSS") { + return value.trim(); + } + return parseArray(value); + } + }); + const common = { + url: inversionFixes[0].url, + invert: inversionFixes[0].invert || [], + noinvert: inversionFixes[0].noinvert || [], + removebg: inversionFixes[0].removebg || [], + css: inversionFixes[0].css || "" + }; + if (url) { + const matches = inversionFixes + .slice(1) + .filter((s) => isURLInList(url, s.url)) + .sort((a, b) => b.url[0].length - a.url[0].length); + if (matches.length > 0) { + const found = matches[0]; + return { + url: found.url, + invert: common.invert.concat(found.invert || []), + noinvert: common.noinvert.concat(found.noinvert || []), + removebg: common.removebg.concat(found.removebg || []), + css: [common.css, found.css].filter((s) => s).join("\n") + }; + } + } + return common; + } + const inversionFixesCommands = { + "INVERT": "invert", + "NO INVERT": "noinvert", + "REMOVE BG": "removebg", + "CSS": "css" + }; + function parseInversionFixes(text) { + return parseSitesFixesConfig(text, { + commands: Object.keys(inversionFixesCommands), + getCommandPropName: (command) => inversionFixesCommands[command], + parseCommandValue: (command, value) => { + if (command === "CSS") { + return value.trim(); + } + return parseArray(value); + } + }); + } + function formatInversionFixes(inversionFixes) { + const fixes = inversionFixes + .slice() + .sort((a, b) => compareURLPatterns(a.url[0], b.url[0])); + return formatSitesFixesConfig(fixes, { + props: Object.values(inversionFixesCommands), + getPropCommandName: (prop) => + Object.entries(inversionFixesCommands).find( + ([, p]) => p === prop + )[0], + formatPropValue: (prop, value) => { + if (prop === "css") { + return value.trim().replace(/\n+/g, "\n"); + } + return formatArray(value).trim(); + }, + shouldIgnoreProp: (prop, value) => { + if (prop === "css") { + return !value; + } + return !(Array.isArray(value) && value.length > 0); + } + }); + } + + const dynamicThemeFixesCommands = { + "INVERT": "invert", + "CSS": "css", + "IGNORE INLINE STYLE": "ignoreInlineStyle", + "IGNORE IMAGE ANALYSIS": "ignoreImageAnalysis" + }; + function parseDynamicThemeFixes(text) { + return parseSitesFixesConfig(text, { + commands: Object.keys(dynamicThemeFixesCommands), + getCommandPropName: (command) => dynamicThemeFixesCommands[command], + parseCommandValue: (command, value) => { + if (command === "CSS") { + return value.trim(); + } + return parseArray(value); + } + }); + } + function formatDynamicThemeFixes(dynamicThemeFixes) { + const fixes = dynamicThemeFixes + .slice() + .sort((a, b) => compareURLPatterns(a.url[0], b.url[0])); + return formatSitesFixesConfig(fixes, { + props: Object.values(dynamicThemeFixesCommands), + getPropCommandName: (prop) => + Object.entries(dynamicThemeFixesCommands).find( + ([, p]) => p === prop + )[0], + formatPropValue: (prop, value) => { + if (prop === "css") { + return value.trim().replace(/\n+/g, "\n"); + } + return formatArray(value).trim(); + }, + shouldIgnoreProp: (prop, value) => { + if (prop === "css") { + return !value; + } + return !(Array.isArray(value) && value.length > 0); + } + }); + } + function getDynamicThemeFixesFor( + url, + frameURL, + text, + index, + enabledForPDF + ) { + const fixes = getSitesFixesFor(frameURL || url, text, index, { + commands: Object.keys(dynamicThemeFixesCommands), + getCommandPropName: (command) => dynamicThemeFixesCommands[command], + parseCommandValue: (command, value) => { + if (command === "CSS") { + return value.trim(); + } + return parseArray(value); + } + }); + if (fixes.length === 0 || fixes[0].url[0] !== "*") { + return null; + } + const genericFix = fixes[0]; + const common = { + url: genericFix.url, + invert: genericFix.invert || [], + css: genericFix.css || "", + ignoreInlineStyle: genericFix.ignoreInlineStyle || [], + ignoreImageAnalysis: genericFix.ignoreImageAnalysis || [] + }; + if (enabledForPDF) { + { + common.css += + '\nembed[type="application/pdf"][src="about:blank"] { filter: invert(100%) contrast(90%); }'; + } + } + const sortedBySpecificity = fixes + .slice(1) + .map((theme) => { + return { + specificity: isURLInList(frameURL || url, theme.url) + ? theme.url[0].length + : 0, + theme + }; + }) + .filter(({specificity}) => specificity > 0) + .sort((a, b) => b.specificity - a.specificity); + if (sortedBySpecificity.length === 0) { + return common; + } + const match = sortedBySpecificity[0].theme; + return { + url: match.url, + invert: common.invert.concat(match.invert || []), + css: [common.css, match.css].filter((s) => s).join("\n"), + ignoreInlineStyle: common.ignoreInlineStyle.concat( + match.ignoreInlineStyle || [] + ), + ignoreImageAnalysis: common.ignoreImageAnalysis.concat( + match.ignoreImageAnalysis || [] + ) + }; + } + + const darkTheme = { + neutralBg: [16, 20, 23], + neutralText: [167, 158, 139], + redBg: [64, 12, 32], + redText: [247, 142, 102], + greenBg: [32, 64, 48], + greenText: [128, 204, 148], + blueBg: [32, 48, 64], + blueText: [128, 182, 204], + fadeBg: [16, 20, 23, 0.5], + fadeText: [167, 158, 139, 0.5] + }; + const lightTheme = { + neutralBg: [255, 242, 228], + neutralText: [0, 0, 0], + redBg: [255, 85, 170], + redText: [140, 14, 48], + greenBg: [192, 255, 170], + greenText: [0, 128, 0], + blueBg: [173, 215, 229], + blueText: [28, 16, 171], + fadeBg: [0, 0, 0, 0.5], + fadeText: [0, 0, 0, 0.5] + }; + function rgb([r, g, b, a]) { + if (typeof a === "number") { + return `rgba(${r}, ${g}, ${b}, ${a})`; + } + return `rgb(${r}, ${g}, ${b})`; + } + function mix(color1, color2, t) { + return color1.map((c, i) => Math.round(c * (1 - t) + color2[i] * t)); + } + function createStaticStylesheet( + config, + url, + frameURL, + staticThemes, + staticThemesIndex + ) { + const srcTheme = config.mode === 1 ? darkTheme : lightTheme; + const theme = Object.entries(srcTheme).reduce((t, [prop, color]) => { + const [r, g, b, a] = color; + t[prop] = applyColorMatrix( + [r, g, b], + createFilterMatrix({...config, mode: 0}) + ); + if (a !== undefined) { + t[prop].push(a); + } + return t; + }, {}); + const commonTheme = getCommonTheme(staticThemes, staticThemesIndex); + const siteTheme = getThemeFor( + frameURL || url, + staticThemes, + staticThemesIndex + ); + const lines = []; + if (!siteTheme || !siteTheme.noCommon) { + lines.push("/* Common theme */"); + lines.push(...ruleGenerators.map((gen) => gen(commonTheme, theme))); + } + if (siteTheme) { + lines.push(`/* Theme for ${siteTheme.url.join(" ")} */`); + lines.push(...ruleGenerators.map((gen) => gen(siteTheme, theme))); + } + if (config.useFont || config.textStroke > 0) { + lines.push("/* Font */"); + lines.push(createTextStyle(config)); + } + return lines.filter((ln) => ln).join("\n"); + } + function createRuleGen( + getSelectors, + generateDeclarations, + modifySelector = (s) => s + ) { + return (siteTheme, themeColors) => { + const selectors = getSelectors(siteTheme); + if (selectors == null || selectors.length === 0) { + return null; + } + const lines = []; + selectors.forEach((s, i) => { + let ln = modifySelector(s); + if (i < selectors.length - 1) { + ln += ","; + } else { + ln += " {"; + } + lines.push(ln); + }); + const declarations = generateDeclarations(themeColors); + declarations.forEach((d) => lines.push(` ${d} !important;`)); + lines.push("}"); + return lines.join("\n"); + }; + } + const mx = { + bg: { + hover: 0.075, + active: 0.1 + }, + fg: { + hover: 0.25, + active: 0.5 + }, + border: 0.5 + }; + const ruleGenerators = [ + createRuleGen( + (t) => t.neutralBg, + (t) => [`background-color: ${rgb(t.neutralBg)}`] + ), + createRuleGen( + (t) => t.neutralBgActive, + (t) => [`background-color: ${rgb(t.neutralBg)}`] + ), + createRuleGen( + (t) => t.neutralBgActive, + (t) => [ + `background-color: ${rgb( + mix(t.neutralBg, [255, 255, 255], mx.bg.hover) + )}` + ], + (s) => `${s}:hover` + ), + createRuleGen( + (t) => t.neutralBgActive, + (t) => [ + `background-color: ${rgb( + mix(t.neutralBg, [255, 255, 255], mx.bg.active) + )}` + ], + (s) => `${s}:active, ${s}:focus` + ), + createRuleGen( + (t) => t.neutralText, + (t) => [`color: ${rgb(t.neutralText)}`] + ), + createRuleGen( + (t) => t.neutralTextActive, + (t) => [`color: ${rgb(t.neutralText)}`] + ), + createRuleGen( + (t) => t.neutralTextActive, + (t) => [ + `color: ${rgb( + mix(t.neutralText, [255, 255, 255], mx.fg.hover) + )}` + ], + (s) => `${s}:hover` + ), + createRuleGen( + (t) => t.neutralTextActive, + (t) => [ + `color: ${rgb( + mix(t.neutralText, [255, 255, 255], mx.fg.active) + )}` + ], + (s) => `${s}:active, ${s}:focus` + ), + createRuleGen( + (t) => t.neutralBorder, + (t) => [ + `border-color: ${rgb( + mix(t.neutralBg, t.neutralText, mx.border) + )}` + ] + ), + createRuleGen( + (t) => t.redBg, + (t) => [`background-color: ${rgb(t.redBg)}`] + ), + createRuleGen( + (t) => t.redBgActive, + (t) => [`background-color: ${rgb(t.redBg)}`] + ), + createRuleGen( + (t) => t.redBgActive, + (t) => [ + `background-color: ${rgb( + mix(t.redBg, [255, 0, 64], mx.bg.hover) + )}` + ], + (s) => `${s}:hover` + ), + createRuleGen( + (t) => t.redBgActive, + (t) => [ + `background-color: ${rgb( + mix(t.redBg, [255, 0, 64], mx.bg.active) + )}` + ], + (s) => `${s}:active, ${s}:focus` + ), + createRuleGen( + (t) => t.redText, + (t) => [`color: ${rgb(t.redText)}`] + ), + createRuleGen( + (t) => t.redTextActive, + (t) => [`color: ${rgb(t.redText)}`] + ), + createRuleGen( + (t) => t.redTextActive, + (t) => [ + `color: ${rgb(mix(t.redText, [255, 255, 0], mx.fg.hover))}` + ], + (s) => `${s}:hover` + ), + createRuleGen( + (t) => t.redTextActive, + (t) => [ + `color: ${rgb(mix(t.redText, [255, 255, 0], mx.fg.active))}` + ], + (s) => `${s}:active, ${s}:focus` + ), + createRuleGen( + (t) => t.redBorder, + (t) => [`border-color: ${rgb(mix(t.redBg, t.redText, mx.border))}`] + ), + createRuleGen( + (t) => t.greenBg, + (t) => [`background-color: ${rgb(t.greenBg)}`] + ), + createRuleGen( + (t) => t.greenBgActive, + (t) => [`background-color: ${rgb(t.greenBg)}`] + ), + createRuleGen( + (t) => t.greenBgActive, + (t) => [ + `background-color: ${rgb( + mix(t.greenBg, [128, 255, 182], mx.bg.hover) + )}` + ], + (s) => `${s}:hover` + ), + createRuleGen( + (t) => t.greenBgActive, + (t) => [ + `background-color: ${rgb( + mix(t.greenBg, [128, 255, 182], mx.bg.active) + )}` + ], + (s) => `${s}:active, ${s}:focus` + ), + createRuleGen( + (t) => t.greenText, + (t) => [`color: ${rgb(t.greenText)}`] + ), + createRuleGen( + (t) => t.greenTextActive, + (t) => [`color: ${rgb(t.greenText)}`] + ), + createRuleGen( + (t) => t.greenTextActive, + (t) => [ + `color: ${rgb(mix(t.greenText, [182, 255, 224], mx.fg.hover))}` + ], + (s) => `${s}:hover` + ), + createRuleGen( + (t) => t.greenTextActive, + (t) => [ + `color: ${rgb(mix(t.greenText, [182, 255, 224], mx.fg.active))}` + ], + (s) => `${s}:active, ${s}:focus` + ), + createRuleGen( + (t) => t.greenBorder, + (t) => [ + `border-color: ${rgb(mix(t.greenBg, t.greenText, mx.border))}` + ] + ), + createRuleGen( + (t) => t.blueBg, + (t) => [`background-color: ${rgb(t.blueBg)}`] + ), + createRuleGen( + (t) => t.blueBgActive, + (t) => [`background-color: ${rgb(t.blueBg)}`] + ), + createRuleGen( + (t) => t.blueBgActive, + (t) => [ + `background-color: ${rgb( + mix(t.blueBg, [0, 128, 255], mx.bg.hover) + )}` + ], + (s) => `${s}:hover` + ), + createRuleGen( + (t) => t.blueBgActive, + (t) => [ + `background-color: ${rgb( + mix(t.blueBg, [0, 128, 255], mx.bg.active) + )}` + ], + (s) => `${s}:active, ${s}:focus` + ), + createRuleGen( + (t) => t.blueText, + (t) => [`color: ${rgb(t.blueText)}`] + ), + createRuleGen( + (t) => t.blueTextActive, + (t) => [`color: ${rgb(t.blueText)}`] + ), + createRuleGen( + (t) => t.blueTextActive, + (t) => [ + `color: ${rgb(mix(t.blueText, [182, 224, 255], mx.fg.hover))}` + ], + (s) => `${s}:hover` + ), + createRuleGen( + (t) => t.blueTextActive, + (t) => [ + `color: ${rgb(mix(t.blueText, [182, 224, 255], mx.fg.active))}` + ], + (s) => `${s}:active, ${s}:focus` + ), + createRuleGen( + (t) => t.blueBorder, + (t) => [ + `border-color: ${rgb(mix(t.blueBg, t.blueText, mx.border))}` + ] + ), + createRuleGen( + (t) => t.fadeBg, + (t) => [`background-color: ${rgb(t.fadeBg)}`] + ), + createRuleGen( + (t) => t.fadeText, + (t) => [`color: ${rgb(t.fadeText)}`] + ), + createRuleGen( + (t) => t.transparentBg, + () => ["background-color: transparent"] + ), + createRuleGen( + (t) => t.noImage, + () => ["background-image: none"] + ), + createRuleGen( + (t) => t.invert, + () => ["filter: invert(100%) hue-rotate(180deg)"] + ) + ]; + const staticThemeCommands = { + "NO COMMON": "noCommon", + "NEUTRAL BG": "neutralBg", + "NEUTRAL BG ACTIVE": "neutralBgActive", + "NEUTRAL TEXT": "neutralText", + "NEUTRAL TEXT ACTIVE": "neutralTextActive", + "NEUTRAL BORDER": "neutralBorder", + "RED BG": "redBg", + "RED BG ACTIVE": "redBgActive", + "RED TEXT": "redText", + "RED TEXT ACTIVE": "redTextActive", + "RED BORDER": "redBorder", + "GREEN BG": "greenBg", + "GREEN BG ACTIVE": "greenBgActive", + "GREEN TEXT": "greenText", + "GREEN TEXT ACTIVE": "greenTextActive", + "GREEN BORDER": "greenBorder", + "BLUE BG": "blueBg", + "BLUE BG ACTIVE": "blueBgActive", + "BLUE TEXT": "blueText", + "BLUE TEXT ACTIVE": "blueTextActive", + "BLUE BORDER": "blueBorder", + "FADE BG": "fadeBg", + "FADE TEXT": "fadeText", + "TRANSPARENT BG": "transparentBg", + "NO IMAGE": "noImage", + "INVERT": "invert" + }; + function parseStaticThemes($themes) { + return parseSitesFixesConfig($themes, { + commands: Object.keys(staticThemeCommands), + getCommandPropName: (command) => staticThemeCommands[command], + parseCommandValue: (command, value) => { + if (command === "NO COMMON") { + return true; + } + return parseArray(value); + } + }); + } + function camelCaseToUpperCase(text) { + return text.replace(/([a-z])([A-Z])/g, "$1 $2").toUpperCase(); + } + function formatStaticThemes(staticThemes) { + const themes = staticThemes + .slice() + .sort((a, b) => compareURLPatterns(a.url[0], b.url[0])); + return formatSitesFixesConfig(themes, { + props: Object.values(staticThemeCommands), + getPropCommandName: camelCaseToUpperCase, + formatPropValue: (prop, value) => { + if (prop === "noCommon") { + return ""; + } + return formatArray(value).trim(); + }, + shouldIgnoreProp: (prop, value) => { + if (prop === "noCommon") { + return !value; + } + return !(Array.isArray(value) && value.length > 0); + } + }); + } + function getCommonTheme(staticThemes, staticThemesIndex) { + const length = parseInt( + staticThemesIndex.offsets.substring(4, 4 + 3), + 36 + ); + const staticThemeText = staticThemes.substring(0, length); + return parseStaticThemes(staticThemeText)[0]; + } + function getThemeFor(url, staticThemes, staticThemesIndex) { + const themes = getSitesFixesFor(url, staticThemes, staticThemesIndex, { + commands: Object.keys(staticThemeCommands), + getCommandPropName: (command) => staticThemeCommands[command], + parseCommandValue: (command, value) => { + if (command === "NO COMMON") { + return true; + } + return parseArray(value); + } + }); + const sortedBySpecificity = themes + .slice(1) + .map((theme) => { + return { + specificity: isURLInList(url, theme.url) + ? theme.url[0].length + : 0, + theme + }; + }) + .filter(({specificity}) => specificity > 0) + .sort((a, b) => b.specificity - a.specificity); + if (sortedBySpecificity.length === 0) { + return null; + } + return sortedBySpecificity[0].theme; + } + + class PersistentStorageWrapper { + constructor() { + this.cache = {}; + this.dataIsMigrated = false; + } + setDataIsMigratedForTesting(value) {} + async migrateFromLocalStorage() { + if (typeof localStorage === "undefined") { + this.dataIsMigrated = true; + return; + } + return new Promise((resolve) => { + chrome.storage.local.get( + [ + DevTools.KEY_DYNAMIC, + DevTools.KEY_FILTER, + DevTools.KEY_STATIC + ], + (data) => { + if (chrome.runtime.lastError) { + console.error( + "DevTools failed to migrate data", + chrome.runtime.lastError + ); + resolve(); + } + if ( + data[DevTools.KEY_DYNAMIC] || + data[DevTools.KEY_FILTER] || + data[DevTools.KEY_STATIC] + ) { + this.dataIsMigrated = true; + this.cache = data; + resolve(); + return; + } + this.cache = { + [DevTools.KEY_DYNAMIC]: localStorage.getItem( + DevTools.KEY_DYNAMIC + ), + [DevTools.KEY_FILTER]: localStorage.getItem( + DevTools.KEY_FILTER + ), + [DevTools.KEY_STATIC]: localStorage.getItem( + DevTools.KEY_STATIC + ) + }; + chrome.storage.local.set(this.cache, () => { + if (chrome.runtime.lastError) { + console.error( + "DevTools failed to migrate data", + chrome.runtime.lastError + ); + resolve(); + } + this.dataIsMigrated = true; + localStorage.removeItem(DevTools.KEY_DYNAMIC); + localStorage.removeItem(DevTools.KEY_FILTER); + localStorage.removeItem(DevTools.KEY_STATIC); + resolve(); + }); + } + ); + }); + } + async get(key) { + if (!this.dataIsMigrated) { + await this.migrateFromLocalStorage(); + } + if (key in this.cache) { + return this.cache[key]; + } + return new Promise((resolve) => { + chrome.storage.local.get(key, (result) => { + if (key in this.cache) { + resolve(this.cache[key]); + return; + } + if (chrome.runtime.lastError) { + console.error( + "Failed to query DevTools data", + chrome.runtime.lastError + ); + resolve(null); + return; + } + this.cache[key] = result[key]; + resolve(result[key]); + }); + }); + } + async set(key, value) { + this.cache[key] = value; + return new Promise((resolve) => + chrome.storage.local.set({[key]: value}, () => { + if (chrome.runtime.lastError) { + console.error( + "Failed to write DevTools data", + chrome.runtime.lastError + ); + } else { + resolve(); + } + }) + ); + } + async remove(key) { + this.cache[key] = undefined; + return new Promise((resolve) => + chrome.storage.local.remove(key, () => { + if (chrome.runtime.lastError) { + console.error( + "Failed to delete DevTools data", + chrome.runtime.lastError + ); + } else { + resolve(); + } + }) + ); + } + async has(key) { + return Boolean(await this.get(key)); + } + } + class LocalStorageWrapper { + setDataIsMigratedForTesting() {} + async get(key) { + try { + return localStorage.getItem(key); + } catch (err) { + console.error(err); + return null; + } + } + set(key, value) { + try { + localStorage.setItem(key, value); + } catch (err) { + console.error(err); + } + } + remove(key) { + try { + localStorage.removeItem(key); + } catch (err) { + console.error(err); + } + } + async has(key) { + try { + return localStorage.getItem(key) != null; + } catch (err) { + console.error(err); + return false; + } + } + } + class TempStorage { + constructor() { + this.map = new Map(); + } + setDataIsMigratedForTesting() {} + async get(key) { + return this.map.get(key); + } + set(key, value) { + this.map.set(key, value); + } + remove(key) { + this.map.delete(key); + } + async has(key) { + return this.map.has(key); + } + } + class DevTools { + static init(onChange) { + if ( + typeof chrome.storage.local !== "undefined" && + chrome.storage.local !== null && + !isFirefox + ) { + this.store = new PersistentStorageWrapper(); + } else if ( + typeof localStorage !== "undefined" && + localStorage != null + ) { + this.store = new LocalStorageWrapper(); + } else { + this.store = new TempStorage(); + } + this.loadConfigOverrides(); + this.onChange = onChange; + } + static setDataIsMigratedForTesting(value) { + this.store.setDataIsMigratedForTesting(value); + } + static async loadConfigOverrides() { + const [dynamicThemeFixes, inversionFixes, staticThemes] = + await Promise.all([ + this.getSavedDynamicThemeFixes(), + this.getSavedInversionFixes(), + this.getSavedStaticThemes() + ]); + ConfigManager.overrides.dynamicThemeFixes = + dynamicThemeFixes || null; + ConfigManager.overrides.inversionFixes = inversionFixes || null; + ConfigManager.overrides.staticThemes = staticThemes || null; + } + static async getSavedDynamicThemeFixes() { + return this.store.get(DevTools.KEY_DYNAMIC); + } + static saveDynamicThemeFixes(text) { + this.store.set(DevTools.KEY_DYNAMIC, text); + } + static async getDynamicThemeFixesText() { + const $fixes = await this.getSavedDynamicThemeFixes(); + const fixes = $fixes + ? parseDynamicThemeFixes($fixes) + : parseDynamicThemeFixes(ConfigManager.DYNAMIC_THEME_FIXES_RAW); + return formatDynamicThemeFixes(fixes); + } + static resetDynamicThemeFixes() { + this.store.remove(DevTools.KEY_DYNAMIC); + ConfigManager.overrides.dynamicThemeFixes = null; + ConfigManager.handleDynamicThemeFixes(); + this.onChange(); + } + static applyDynamicThemeFixes(text) { + try { + const formatted = formatDynamicThemeFixes( + parseDynamicThemeFixes(text) + ); + ConfigManager.overrides.dynamicThemeFixes = formatted; + ConfigManager.handleDynamicThemeFixes(); + this.saveDynamicThemeFixes(formatted); + this.onChange(); + return null; + } catch (err) { + return err; + } + } + static async getSavedInversionFixes() { + return this.store.get(DevTools.KEY_FILTER); + } + static saveInversionFixes(text) { + this.store.set(DevTools.KEY_FILTER, text); + } + static async getInversionFixesText() { + const $fixes = await this.getSavedInversionFixes(); + const fixes = $fixes + ? parseInversionFixes($fixes) + : parseInversionFixes(ConfigManager.INVERSION_FIXES_RAW); + return formatInversionFixes(fixes); + } + static resetInversionFixes() { + this.store.remove(DevTools.KEY_FILTER); + ConfigManager.overrides.inversionFixes = null; + ConfigManager.handleInversionFixes(); + this.onChange(); + } + static applyInversionFixes(text) { + try { + const formatted = formatInversionFixes( + parseInversionFixes(text) + ); + ConfigManager.overrides.inversionFixes = formatted; + ConfigManager.handleInversionFixes(); + this.saveInversionFixes(formatted); + this.onChange(); + return null; + } catch (err) { + return err; + } + } + static async getSavedStaticThemes() { + return this.store.get(DevTools.KEY_STATIC); + } + static saveStaticThemes(text) { + this.store.set(DevTools.KEY_STATIC, text); + } + static async getStaticThemesText() { + const $themes = await this.getSavedStaticThemes(); + const themes = $themes + ? parseStaticThemes($themes) + : parseStaticThemes(ConfigManager.STATIC_THEMES_RAW); + return formatStaticThemes(themes); + } + static resetStaticThemes() { + this.store.remove(DevTools.KEY_STATIC); + ConfigManager.overrides.staticThemes = null; + ConfigManager.handleStaticThemes(); + this.onChange(); + } + static applyStaticThemes(text) { + try { + const formatted = formatStaticThemes(parseStaticThemes(text)); + ConfigManager.overrides.staticThemes = formatted; + ConfigManager.handleStaticThemes(); + this.saveStaticThemes(formatted); + this.onChange(); + return null; + } catch (err) { + return err; + } + } + } + DevTools.KEY_DYNAMIC = "dev_dynamic_theme_fixes"; + DevTools.KEY_FILTER = "dev_inversion_fixes"; + DevTools.KEY_STATIC = "dev_static_themes"; + + class IconManager { + static onStartup() {} + static handleUpdate() { + { + return; + } + } + static setActive() { + if (!chrome.browserAction.setIcon) { + return; + } + IconManager.iconState.active = true; + chrome.browserAction.setIcon({ + path: IconManager.ICON_PATHS.active + }); + } + static setInactive() { + if (!chrome.browserAction.setIcon) { + return; + } + IconManager.iconState.active = false; + chrome.browserAction.setIcon({ + path: IconManager.ICON_PATHS.inactive + }); + } + static showBadge(text) { + IconManager.iconState.badgeText = text; + chrome.browserAction.setBadgeBackgroundColor({color: "#e96c4c"}); + chrome.browserAction.setBadgeText({text}); + } + static hideBadge() { + IconManager.iconState.badgeText = ""; + chrome.browserAction.setBadgeText({text: ""}); + } + } + IconManager.ICON_PATHS = { + active: { + 19: "../icons/dr_active_19.png", + 38: "../icons/dr_active_38.png" + }, + inactive: { + 19: "../icons/dr_inactive_19.png", + 38: "../icons/dr_inactive_38.png" + } + }; + IconManager.iconState = { + badgeText: "", + active: true + }; + + var MessageType; + (function (MessageType) { + MessageType["UI_GET_DATA"] = "ui-get-data"; + MessageType["UI_SUBSCRIBE_TO_CHANGES"] = "ui-subscribe-to-changes"; + MessageType["UI_UNSUBSCRIBE_FROM_CHANGES"] = + "ui-unsubscribe-from-changes"; + MessageType["UI_CHANGE_SETTINGS"] = "ui-change-settings"; + MessageType["UI_SET_THEME"] = "ui-set-theme"; + MessageType["UI_SET_SHORTCUT"] = "ui-set-shortcut"; + MessageType["UI_TOGGLE_ACTIVE_TAB"] = "ui-toggle-active-tab"; + MessageType["UI_MARK_NEWS_AS_READ"] = "ui-mark-news-as-read"; + MessageType["UI_MARK_NEWS_AS_DISPLAYED"] = "ui-mark-news-as-displayed"; + MessageType["UI_LOAD_CONFIG"] = "ui-load-config"; + MessageType["UI_APPLY_DEV_DYNAMIC_THEME_FIXES"] = + "ui-apply-dev-dynamic-theme-fixes"; + MessageType["UI_RESET_DEV_DYNAMIC_THEME_FIXES"] = + "ui-reset-dev-dynamic-theme-fixes"; + MessageType["UI_APPLY_DEV_INVERSION_FIXES"] = + "ui-apply-dev-inversion-fixes"; + MessageType["UI_RESET_DEV_INVERSION_FIXES"] = + "ui-reset-dev-inversion-fixes"; + MessageType["UI_APPLY_DEV_STATIC_THEMES"] = + "ui-apply-dev-static-themes"; + MessageType["UI_RESET_DEV_STATIC_THEMES"] = + "ui-reset-dev-static-themes"; + MessageType["UI_SAVE_FILE"] = "ui-save-file"; + MessageType["UI_REQUEST_EXPORT_CSS"] = "ui-request-export-css"; + MessageType["UI_COLOR_SCHEME_CHANGE"] = "ui-color-scheme-change"; + MessageType["BG_CHANGES"] = "bg-changes"; + MessageType["BG_ADD_CSS_FILTER"] = "bg-add-css-filter"; + MessageType["BG_ADD_STATIC_THEME"] = "bg-add-static-theme"; + MessageType["BG_ADD_SVG_FILTER"] = "bg-add-svg-filter"; + MessageType["BG_ADD_DYNAMIC_THEME"] = "bg-add-dynamic-theme"; + MessageType["BG_EXPORT_CSS"] = "bg-export-css"; + MessageType["BG_UNSUPPORTED_SENDER"] = "bg-unsupported-sender"; + MessageType["BG_CLEAN_UP"] = "bg-clean-up"; + MessageType["BG_RELOAD"] = "bg-reload"; + MessageType["BG_FETCH_RESPONSE"] = "bg-fetch-response"; + MessageType["BG_UI_UPDATE"] = "bg-ui-update"; + MessageType["BG_CSS_UPDATE"] = "bg-css-update"; + MessageType["CS_COLOR_SCHEME_CHANGE"] = "cs-color-scheme-change"; + MessageType["CS_FRAME_CONNECT"] = "cs-frame-connect"; + MessageType["CS_FRAME_FORGET"] = "cs-frame-forget"; + MessageType["CS_FRAME_FREEZE"] = "cs-frame-freeze"; + MessageType["CS_FRAME_RESUME"] = "cs-frame-resume"; + MessageType["CS_EXPORT_CSS_RESPONSE"] = "cs-export-css-response"; + MessageType["CS_FETCH"] = "cs-fetch"; + MessageType["CS_DARK_THEME_DETECTED"] = "cs-dark-theme-detected"; + MessageType["CS_DARK_THEME_NOT_DETECTED"] = + "cs-dark-theme-not-detected"; + MessageType["CS_LOG"] = "cs-log"; + })(MessageType || (MessageType = {})); + + class Messenger { + static init(adapter) { + this.adapter = adapter; + this.changeListenerCount = 0; + chrome.runtime.onMessage.addListener( + (message, sender, sendResponse) => + this.messageListener(message, sender, sendResponse) + ); + if (isFirefox) { + chrome.runtime.onConnect.addListener((port) => + this.firefoxPortListener(port) + ); + } + } + static messageListener(message, sender, sendResponse) { + const allowedSenderURL = [ + chrome.runtime.getURL("/ui/popup/index.html"), + chrome.runtime.getURL("/ui/devtools/index.html"), + chrome.runtime.getURL("/ui/stylesheet-editor/index.html") + ]; + if (allowedSenderURL.includes(sender.url)) { + this.onUIMessage(message, sendResponse); + return [MessageType.UI_GET_DATA].includes(message.type); + } + } + static firefoxPortListener(port) { + let promise; + switch (port.name) { + case MessageType.UI_GET_DATA: + promise = this.adapter.collect(); + break; + case MessageType.UI_APPLY_DEV_DYNAMIC_THEME_FIXES: + case MessageType.UI_APPLY_DEV_INVERSION_FIXES: + case MessageType.UI_APPLY_DEV_STATIC_THEMES: + promise = new Promise((resolve, reject) => { + port.onMessage.addListener((message) => { + const {data} = message; + let error; + switch (port.name) { + case MessageType.UI_APPLY_DEV_DYNAMIC_THEME_FIXES: + error = + this.adapter.applyDevDynamicThemeFixes( + data + ); + break; + case MessageType.UI_APPLY_DEV_INVERSION_FIXES: + error = + this.adapter.applyDevInversionFixes( + data + ); + break; + case MessageType.UI_APPLY_DEV_STATIC_THEMES: + error = + this.adapter.applyDevStaticThemes(data); + break; + default: + throw new Error( + `Unknown port name: ${port.name}` + ); + } + if (error) { + reject(error); + } else { + resolve(null); + } + }); + }); + break; + default: + return; + } + promise + .then((data) => port.postMessage({data})) + .catch((error) => port.postMessage({error})); + } + static onUIMessage({type, data}, sendResponse) { + switch (type) { + case MessageType.UI_GET_DATA: + this.adapter.collect().then((data) => sendResponse({data})); + break; + case MessageType.UI_SUBSCRIBE_TO_CHANGES: + this.changeListenerCount++; + break; + case MessageType.UI_UNSUBSCRIBE_FROM_CHANGES: + this.changeListenerCount--; + break; + case MessageType.UI_CHANGE_SETTINGS: + this.adapter.changeSettings(data); + break; + case MessageType.UI_SET_THEME: + this.adapter.setTheme(data); + break; + case MessageType.UI_SET_SHORTCUT: + this.adapter.setShortcut(data); + break; + case MessageType.UI_TOGGLE_ACTIVE_TAB: + this.adapter.toggleActiveTab(); + break; + case MessageType.UI_MARK_NEWS_AS_READ: + this.adapter.markNewsAsRead(data); + break; + case MessageType.UI_MARK_NEWS_AS_DISPLAYED: + this.adapter.markNewsAsDisplayed(data); + break; + case MessageType.UI_LOAD_CONFIG: + this.adapter.loadConfig(data); + break; + case MessageType.UI_APPLY_DEV_DYNAMIC_THEME_FIXES: { + const error = this.adapter.applyDevDynamicThemeFixes(data); + sendResponse({error: error ? error.message : null}); + break; + } + case MessageType.UI_RESET_DEV_DYNAMIC_THEME_FIXES: + this.adapter.resetDevDynamicThemeFixes(); + break; + case MessageType.UI_APPLY_DEV_INVERSION_FIXES: { + const error = this.adapter.applyDevInversionFixes(data); + sendResponse({error: error ? error.message : null}); + break; + } + case MessageType.UI_RESET_DEV_INVERSION_FIXES: + this.adapter.resetDevInversionFixes(); + break; + case MessageType.UI_APPLY_DEV_STATIC_THEMES: { + const error = this.adapter.applyDevStaticThemes(data); + sendResponse({error: error ? error.message : null}); + break; + } + case MessageType.UI_RESET_DEV_STATIC_THEMES: + this.adapter.resetDevStaticThemes(); + break; + } + } + static reportChanges(data) { + if (this.changeListenerCount > 0) { + chrome.runtime.sendMessage({ + type: MessageType.BG_CHANGES, + data + }); + } + } + } + + function getUILanguage() { + let code; + if ( + "i18n" in chrome && + "getUILanguage" in chrome.i18n && + typeof chrome.i18n.getUILanguage === "function" + ) { + code = chrome.i18n.getUILanguage(); + } else { + code = navigator.language.split("-")[0]; + } + if (code.endsWith("-mac")) { + return code.substring(0, code.length - 4); + } + return code; + } + + const BLOG_URL = "https://darkreader.org/blog/"; + const UNINSTALL_URL = "https://darkreader.org/goodluck/"; + const helpLocales = [ + "be", + "cs", + "de", + "en", + "es", + "fr", + "it", + "nl", + "pt", + "ru", + "sr", + "tr", + "zh-CN", + "zh-TW" + ]; + function getHelpURL() { + const locale = getUILanguage(); + const matchLocale = + helpLocales.find((hl) => hl === locale) || + helpLocales.find((hl) => locale.startsWith(hl)) || + "en"; + return `https://darkreader.org/help/${matchLocale}/`; + } + function getBlogPostURL(postId) { + return `${BLOG_URL}${postId}/`; + } + + function canInjectScript(url) { + if (isFirefox) { + return ( + url && + !url.startsWith("about:") && + !url.startsWith("moz") && + !url.startsWith("view-source:") && + !url.startsWith("resource:") && + !url.startsWith("chrome:") && + !url.startsWith("jar:") && + !url.startsWith("https://addons.mozilla.org/") && + !isPDF(url) + ); + } + if (isEdge) { + return ( + url && + !url.startsWith("chrome") && + !url.startsWith("data") && + !url.startsWith("devtools") && + !url.startsWith("edge") && + !url.startsWith("https://chrome.google.com/webstore") && + !url.startsWith("https://microsoftedge.microsoft.com/addons") && + !url.startsWith("view-source") + ); + } + return ( + url && + !url.startsWith("chrome") && + !url.startsWith("https://chrome.google.com/webstore") && + !url.startsWith("data") && + !url.startsWith("devtools") && + !url.startsWith("view-source") + ); + } + async function readSyncStorage(defaults) { + return new Promise((resolve) => { + chrome.storage.sync.get(null, (sync) => { + if (chrome.runtime.lastError) { + console.error(chrome.runtime.lastError.message); + resolve(null); + return; + } + for (const key in sync) { + if (!sync[key]) { + continue; + } + const metaKeysCount = sync[key].__meta_split_count; + if (!metaKeysCount) { + continue; + } + let string = ""; + for (let i = 0; i < metaKeysCount; i++) { + string += sync[`${key}_${i.toString(36)}`]; + delete sync[`${key}_${i.toString(36)}`]; + } + try { + sync[key] = JSON.parse(string); + } catch (error) { + console.error( + `sync[${key}]: Could not parse record from sync storage: ${string}` + ); + resolve(null); + return; + } + } + sync = { + ...defaults, + ...sync + }; + resolve(sync); + }); + }); + } + async function readLocalStorage(defaults) { + return new Promise((resolve) => { + chrome.storage.local.get(defaults, (local) => { + if (chrome.runtime.lastError) { + console.error(chrome.runtime.lastError.message); + resolve(defaults); + return; + } + resolve(local); + }); + }); + } + function prepareSyncStorage(values) { + for (const key in values) { + const value = values[key]; + const string = JSON.stringify(value); + const totalLength = string.length + key.length; + if (totalLength > chrome.storage.sync.QUOTA_BYTES_PER_ITEM) { + const maxLength = + chrome.storage.sync.QUOTA_BYTES_PER_ITEM - + key.length - + 1 - + 2; + const minimalKeysNeeded = Math.ceil(string.length / maxLength); + for (let i = 0; i < minimalKeysNeeded; i++) { + values[`${key}_${i.toString(36)}`] = string.substring( + i * maxLength, + (i + 1) * maxLength + ); + } + values[key] = { + __meta_split_count: minimalKeysNeeded + }; + } + } + return values; + } + async function writeSyncStorage(values) { + return new Promise(async (resolve, reject) => { + const packaged = prepareSyncStorage(values); + chrome.storage.sync.set(packaged, () => { + if (chrome.runtime.lastError) { + reject(chrome.runtime.lastError); + return; + } + resolve(); + }); + }); + } + async function writeLocalStorage(values) { + return new Promise(async (resolve) => { + chrome.storage.local.set(values, () => { + resolve(); + }); + }); + } + async function getCommands() { + return new Promise((resolve) => { + if (!chrome.commands) { + resolve([]); + return; + } + chrome.commands.getAll((commands) => { + if (commands) { + resolve(commands); + } else { + resolve([]); + } + }); + }); + } + function setShortcut(command, shortcut) { + if ( + typeof browser !== "undefined" && + browser.commands && + browser.commands.update + ) { + browser.commands.update({name: command, shortcut}); + } + } + + class PromiseBarrier { + constructor() { + this.resolves = []; + this.rejects = []; + this.wasResolved = false; + this.wasRejected = false; + } + async entry() { + if (this.wasResolved) { + return Promise.resolve(this.resolution); + } + if (this.wasRejected) { + return Promise.reject(this.reason); + } + return new Promise((resolve, reject) => { + this.resolves.push(resolve); + this.rejects.push(reject); + }); + } + async resolve(value) { + if (this.wasRejected || this.wasResolved) { + return; + } + this.wasResolved = true; + this.resolution = value; + this.resolves.forEach((resolve) => resolve(value)); + this.resolves = null; + this.rejects = null; + return new Promise((resolve) => setTimeout(() => resolve())); + } + async reject(reason) { + if (this.wasRejected || this.wasResolved) { + return; + } + this.wasRejected = true; + this.reason = reason; + this.rejects.forEach((reject) => reject(reason)); + this.resolves = null; + this.rejects = null; + return new Promise((resolve) => setTimeout(() => resolve())); + } + isPending() { + return !this.wasResolved && !this.wasRejected; + } + isFulfilled() { + return this.wasResolved; + } + isRejected() { + return this.wasRejected; + } + } + + var StateManagerImplState; + (function (StateManagerImplState) { + StateManagerImplState[(StateManagerImplState["INITIAL"] = 0)] = + "INITIAL"; + StateManagerImplState[(StateManagerImplState["LOADING"] = 1)] = + "LOADING"; + StateManagerImplState[(StateManagerImplState["READY"] = 2)] = "READY"; + StateManagerImplState[(StateManagerImplState["SAVING"] = 3)] = "SAVING"; + StateManagerImplState[(StateManagerImplState["SAVING_OVERRIDE"] = 4)] = + "SAVING_OVERRIDE"; + StateManagerImplState[(StateManagerImplState["ONCHANGE_RACE"] = 5)] = + "ONCHANGE_RACE"; + StateManagerImplState[(StateManagerImplState["RECOVERY"] = 6)] = + "RECOVERY"; + })(StateManagerImplState || (StateManagerImplState = {})); + + class StateManager { + constructor(localStorageKey, parent, defaults, logWarn) {} + async saveState() { + if (this.stateManager) { + return this.stateManager.saveState(); + } + } + async loadState() { + if (this.stateManager) { + return this.stateManager.loadState(); + } + } + } + + class Newsmaker { + constructor() { + if (Newsmaker.initialized) { + return; + } + Newsmaker.stateManager = new StateManager( + Newsmaker.LOCAL_STORAGE_KEY, + this, + {latest: [], latestTimestamp: null}, + logWarn + ); + Newsmaker.latest = []; + Newsmaker.latestTimestamp = null; + } + static onUpdate() { + const latestNews = + Newsmaker.latest.length > 0 && Newsmaker.latest[0]; + if ( + latestNews && + latestNews.badge && + !latestNews.read && + !latestNews.displayed + ) { + IconManager.showBadge(latestNews.badge); + return; + } + IconManager.hideBadge(); + } + static async getLatest() { + await Newsmaker.stateManager.loadState(); + return Newsmaker.latest; + } + static subscribe() { + if ( + Newsmaker.latestTimestamp === null || + Newsmaker.latestTimestamp + Newsmaker.UPDATE_INTERVAL < + Date.now() + ) { + Newsmaker.updateNews(); + } + chrome.alarms.onAlarm.addListener(Newsmaker.alarmListener); + chrome.alarms.create(Newsmaker.ALARM_NAME, { + periodInMinutes: Newsmaker.UPDATE_INTERVAL + }); + } + static unSubscribe() { + chrome.alarms.onAlarm.removeListener(Newsmaker.alarmListener); + chrome.alarms.clear(Newsmaker.ALARM_NAME); + } + static async updateNews() { + const news = await Newsmaker.getNews(); + if (Array.isArray(news)) { + Newsmaker.latest = news; + Newsmaker.latestTimestamp = Date.now(); + Newsmaker.onUpdate(); + await Newsmaker.stateManager.saveState(); + } + } + static async getReadNews() { + const [sync, local] = await Promise.all([ + readSyncStorage({readNews: []}), + readLocalStorage({readNews: []}) + ]); + return Array.from( + new Set([ + ...(sync ? sync.readNews : []), + ...(local ? local.readNews : []) + ]) + ); + } + static async getDisplayedNews() { + const [sync, local] = await Promise.all([ + readSyncStorage({displayedNews: []}), + readLocalStorage({displayedNews: []}) + ]); + return Array.from( + new Set([ + ...(sync ? sync.displayedNews : []), + ...(local ? local.displayedNews : []) + ]) + ); + } + static async getNews() { + try { + const response = await fetch( + `https://darkreader.github.io/blog/posts.json`, + {cache: "no-cache"} + ); + const $news = await response.json(); + const readNews = await Newsmaker.getReadNews(); + const displayedNews = await Newsmaker.getDisplayedNews(); + const news = $news.map((n) => { + const url = getBlogPostURL(n.id); + const read = Newsmaker.wasRead(n.id, readNews); + const displayed = Newsmaker.wasDisplayed( + n.id, + displayedNews + ); + return {...n, url, read, displayed}; + }); + for (let i = 0; i < news.length; i++) { + const date = new Date(news[i].date); + if (isNaN(date.getTime())) { + throw new Error(`Unable to parse date ${date}`); + } + } + return news; + } catch (err) { + console.error(err); + return null; + } + } + static async markAsRead(...ids) { + const readNews = await Newsmaker.getReadNews(); + const results = readNews.slice(); + let changed = false; + ids.forEach((id) => { + if (readNews.indexOf(id) < 0) { + results.push(id); + changed = true; + } + }); + if (changed) { + Newsmaker.latest = Newsmaker.latest.map((n) => { + const read = Newsmaker.wasRead(n.id, results); + return {...n, read}; + }); + Newsmaker.onUpdate(); + const obj = {readNews: results}; + await Promise.all([ + writeLocalStorage(obj), + writeSyncStorage(obj), + Newsmaker.stateManager.saveState() + ]); + } + } + static async markAsDisplayed(...ids) { + const displayedNews = await Newsmaker.getDisplayedNews(); + const results = displayedNews.slice(); + let changed = false; + ids.forEach((id) => { + if (displayedNews.indexOf(id) < 0) { + results.push(id); + changed = true; + } + }); + if (changed) { + Newsmaker.latest = Newsmaker.latest.map((n) => { + const displayed = Newsmaker.wasDisplayed(n.id, results); + return {...n, displayed}; + }); + Newsmaker.onUpdate(); + const obj = {displayedNews: results}; + await Promise.all([ + writeLocalStorage(obj), + writeSyncStorage(obj), + Newsmaker.stateManager.saveState() + ]); + } + } + static wasRead(id, readNews) { + return readNews.includes(id); + } + static wasDisplayed(id, displayedNews) { + return displayedNews.includes(id); + } + } + Newsmaker.UPDATE_INTERVAL = getDurationInMinutes({hours: 4}); + Newsmaker.ALARM_NAME = "newsmaker"; + Newsmaker.LOCAL_STORAGE_KEY = "Newsmaker-state"; + Newsmaker.alarmListener = (alarm) => { + if (alarm.name === Newsmaker.ALARM_NAME) { + Newsmaker.updateNews(); + } + }; + + function isPanel(sender) { + return ( + typeof sender === "undefined" || + typeof sender.tab === "undefined" || + (isOpera && sender.tab.index === -1) + ); + } + + async function queryTabs(query = {}) { + return new Promise((resolve) => chrome.tabs.query(query, resolve)); + } + var DocumentState; + (function (DocumentState) { + DocumentState[(DocumentState["ACTIVE"] = 0)] = "ACTIVE"; + DocumentState[(DocumentState["PASSIVE"] = 1)] = "PASSIVE"; + DocumentState[(DocumentState["HIDDEN"] = 2)] = "HIDDEN"; + DocumentState[(DocumentState["FROZEN"] = 3)] = "FROZEN"; + DocumentState[(DocumentState["TERMINATED"] = 4)] = "TERMINATED"; + DocumentState[(DocumentState["DISCARDED"] = 5)] = "DISCARDED"; + })(DocumentState || (DocumentState = {})); + class TabManager { + static init({ + getConnectionMessage, + onColorSchemeChange, + getTabMessage + }) { + this.stateManager = new StateManager( + TabManager.LOCAL_STORAGE_KEY, + this, + {tabs: {}, timestamp: 0}, + logWarn + ); + this.tabs = {}; + this.getTabMessage = getTabMessage; + chrome.runtime.onMessage.addListener( + async (message, sender, sendResponse) => { + switch (message.type) { + case MessageType.CS_FRAME_CONNECT: { + onColorSchemeChange(message.data.isDark); + await this.stateManager.loadState(); + const reply = (options) => { + getConnectionMessage(options).then( + (message) => { + message && + chrome.tabs.sendMessage( + sender.tab.id, + message, + {frameId: sender.frameId} + ); + } + ); + }; + if (isPanel(sender)) { + if (isFirefox) { + if ( + sender && + sender.tab && + typeof sender.tab.id === "number" + ) { + chrome.tabs.sendMessage( + sender.tab.id, + { + type: MessageType.BG_UNSUPPORTED_SENDER + }, + { + frameId: + sender && + typeof sender.frameId === + "number" + ? sender.frameId + : undefined + } + ); + } + } else { + sendResponse("unsupportedSender"); + } + return; + } + const tabId = sender.tab.id; + const {frameId} = sender; + const senderURL = sender.url; + const tabURL = sender.tab.url; + this.addFrame( + tabId, + frameId, + senderURL, + this.timestamp + ); + reply({ + url: tabURL, + frameURL: frameId === 0 ? null : senderURL + }); + this.stateManager.saveState(); + break; + } + case MessageType.CS_FRAME_FORGET: + if (!sender.tab) { + break; + } + this.removeFrame(sender.tab.id, sender.frameId); + break; + case MessageType.CS_FRAME_FREEZE: { + await this.stateManager.loadState(); + const info = + this.tabs[sender.tab.id][sender.frameId]; + info.state = DocumentState.FROZEN; + info.url = null; + this.stateManager.saveState(); + break; + } + case MessageType.CS_FRAME_RESUME: { + onColorSchemeChange(message.data.isDark); + await this.stateManager.loadState(); + const tabId = sender.tab.id; + const frameId = sender.frameId; + const frameURL = sender.url; + if ( + this.tabs[tabId][frameId].timestamp < + this.timestamp + ) { + const message = this.getTabMessage( + this.getTabURL(sender.tab), + frameURL + ); + chrome.tabs.sendMessage(tabId, message, { + frameId + }); + } + this.tabs[sender.tab.id][sender.frameId] = { + url: sender.url, + state: DocumentState.ACTIVE, + timestamp: this.timestamp + }; + this.stateManager.saveState(); + break; + } + case MessageType.CS_DARK_THEME_DETECTED: + this.tabs[sender.tab.id][ + sender.frameId + ].darkThemeDetected = true; + break; + case MessageType.CS_FETCH: { + const id = message.id; + const sendResponse = (response) => { + chrome.tabs.sendMessage( + sender.tab.id, + { + type: MessageType.BG_FETCH_RESPONSE, + id, + ...response + }, + {frameId: sender.frameId} + ); + }; + try { + const {url, responseType, mimeType, origin} = + message.data; + if (!this.fileLoader) { + this.fileLoader = createFileLoader(); + } + const response = await this.fileLoader.get({ + url, + responseType, + mimeType, + origin + }); + sendResponse({data: response}); + } catch (err) { + sendResponse({ + error: + err && err.message ? err.message : err + }); + } + break; + } + case MessageType.UI_COLOR_SCHEME_CHANGE: + case MessageType.CS_COLOR_SCHEME_CHANGE: + onColorSchemeChange(message.data.isDark); + break; + case MessageType.UI_SAVE_FILE: { + const {content, name} = message.data; + const a = document.createElement("a"); + a.href = URL.createObjectURL(new Blob([content])); + a.download = name; + a.click(); + break; + } + case MessageType.UI_REQUEST_EXPORT_CSS: { + const activeTab = await this.getActiveTab(); + chrome.tabs.sendMessage( + activeTab.id, + {type: MessageType.BG_EXPORT_CSS}, + {frameId: 0} + ); + break; + } + } + } + ); + chrome.tabs.onRemoved.addListener(async (tabId) => + this.removeFrame(tabId, 0) + ); + } + static addFrame(tabId, frameId, senderURL, timestamp) { + let frames; + if (this.tabs[tabId]) { + frames = this.tabs[tabId]; + } else { + frames = {}; + this.tabs[tabId] = frames; + } + frames[frameId] = { + url: senderURL, + state: DocumentState.ACTIVE, + timestamp + }; + } + static async removeFrame(tabId, frameId) { + await this.stateManager.loadState(); + if (frameId === 0) { + delete this.tabs[tabId]; + } + if (this.tabs[tabId] && this.tabs[tabId][frameId]) { + delete this.tabs[tabId][frameId]; + } + this.stateManager.saveState(); + } + static getTabURL(tab) { + return tab.url || "about:blank"; + } + static async updateContentScript(options) { + (await queryTabs()) + .filter( + (tab) => + options.runOnProtectedPages || canInjectScript(tab.url) + ) + .filter((tab) => !Boolean(this.tabs[tab.id])) + .forEach((tab) => { + if (!tab.discarded) { + { + chrome.tabs.executeScript(tab.id, { + runAt: "document_start", + file: "/inject/index.js", + allFrames: true, + matchAboutBlank: true + }); + } + } + }); + } + static async registerMailDisplayScript() { + await chrome.messageDisplayScripts.register({ + js: [{file: "/inject/fallback.js"}, {file: "/inject/index.js"}] + }); + } + static async sendMessage(onlyUpdateActiveTab = false) { + this.timestamp++; + const activeTabHostname = onlyUpdateActiveTab + ? getURLHostOrProtocol(await this.getActiveTabURL()) + : null; + (await queryTabs()) + .filter((tab) => Boolean(this.tabs[tab.id])) + .forEach((tab) => { + const frames = this.tabs[tab.id]; + Object.entries(frames) + .filter( + ([, {state}]) => + state === DocumentState.ACTIVE || + state === DocumentState.PASSIVE + ) + .forEach(([id, {url}]) => { + const frameId = Number(id); + const tabURL = this.getTabURL(tab); + if ( + onlyUpdateActiveTab && + getURLHostOrProtocol(tabURL) !== + activeTabHostname + ) { + return; + } + const message = this.getTabMessage( + tabURL, + frameId === 0 ? null : url + ); + if (tab.active && frameId === 0) { + chrome.tabs.sendMessage(tab.id, message, { + frameId + }); + } else { + setTimeout(() => { + chrome.tabs.sendMessage(tab.id, message, { + frameId + }); + }); + } + if (this.tabs[tab.id][frameId]) { + this.tabs[tab.id][frameId].timestamp = + this.timestamp; + } + }); + }); + } + static async canAccessActiveTab() { + const tab = await this.getActiveTab(); + return Boolean(this.tabs[tab.id]); + } + static async isActiveTabDarkThemeDetected() { + const tab = await this.getActiveTab(); + return ( + this.tabs[tab.id] && + this.tabs[tab.id][0] && + this.tabs[tab.id][0].darkThemeDetected + ); + } + static async getActiveTabURL() { + return this.getTabURL(await this.getActiveTab()); + } + static async getActiveTab() { + let tab = ( + await queryTabs({ + active: true, + lastFocusedWindow: true + }) + )[0]; + const isExtensionPage = (url) => + url.startsWith("chrome-extension:") || + url.startsWith("moz-extension:"); + if (!tab || isExtensionPage(tab.url)) { + const tabs = await queryTabs({active: true}); + tab = tabs.find((t) => !isExtensionPage(t.url)) || tab; + } + return tab; + } + } + TabManager.fileLoader = null; + TabManager.timestamp = null; + TabManager.LOCAL_STORAGE_KEY = "TabManager-state"; + + function debounce(delay, fn) { + let timeoutId = null; + return (...args) => { + if (timeoutId) { + clearTimeout(timeoutId); + } + timeoutId = setTimeout(() => { + timeoutId = null; + fn(...args); + }, delay); + }; + } + + function isBoolean(x) { + return typeof x === "boolean"; + } + function isPlainObject(x) { + return typeof x === "object" && x != null && !Array.isArray(x); + } + function isArray(x) { + return Array.isArray(x); + } + function isString(x) { + return typeof x === "string"; + } + function isNonEmptyString(x) { + return x && isString(x); + } + function isNonEmptyArrayOfNonEmptyStrings(x) { + return ( + Array.isArray(x) && + x.length > 0 && + x.every((s) => isNonEmptyString(s)) + ); + } + function isRegExpMatch(regexp) { + return (x) => { + return isString(x) && x.match(regexp) != null; + }; + } + const isTime = isRegExpMatch( + /^((0?[0-9])|(1[0-9])|(2[0-3])):([0-5][0-9])$/ + ); + function isNumber(x) { + return typeof x === "number" && !isNaN(x); + } + function isNumberBetween(min, max) { + return (x) => { + return isNumber(x) && x >= min && x <= max; + }; + } + function isOneOf(...values) { + return (x) => values.includes(x); + } + function hasRequiredProperties(obj, keys) { + return keys.every((key) => obj.hasOwnProperty(key)); + } + function createValidator() { + const errors = []; + function validateProperty(obj, key, validator, fallback) { + if (!obj.hasOwnProperty(key) || validator(obj[key])) { + return; + } + errors.push( + `Unexpected value for "${key}": ${JSON.stringify(obj[key])}` + ); + obj[key] = fallback[key]; + } + function validateArray(obj, key, validator) { + if (!obj.hasOwnProperty(key)) { + return; + } + const wrongValues = new Set(); + const arr = obj[key]; + for (let i = 0; i < arr.length; i++) { + if (!validator(arr[i])) { + wrongValues.add(arr[i]); + arr.splice(i, 1); + i--; + } + } + if (wrongValues.size > 0) { + errors.push( + `Array "${key}" has wrong values: ${Array.from(wrongValues) + .map((v) => JSON.stringify(v)) + .join("; ")}` + ); + } + } + return {validateProperty, validateArray, errors}; + } + function validateSettings(settings) { + if (!isPlainObject(settings)) { + return { + errors: ["Settings are not a plain object"], + settings: DEFAULT_SETTINGS + }; + } + const {validateProperty, validateArray, errors} = createValidator(); + const isValidPresetTheme = (theme) => { + if (!isPlainObject(theme)) { + return false; + } + const {errors: themeErrors} = validateTheme(theme); + return themeErrors.length === 0; + }; + validateProperty(settings, "enabled", isBoolean, DEFAULT_SETTINGS); + validateProperty(settings, "fetchNews", isBoolean, DEFAULT_SETTINGS); + validateProperty(settings, "theme", isPlainObject, DEFAULT_SETTINGS); + const {errors: themeErrors} = validateTheme(settings.theme); + errors.push(...themeErrors); + validateProperty(settings, "presets", isArray, DEFAULT_SETTINGS); + validateArray(settings, "presets", (preset) => { + const presetValidator = createValidator(); + if ( + !( + isPlainObject(preset) && + hasRequiredProperties(preset, [ + "id", + "name", + "urls", + "theme" + ]) + ) + ) { + return false; + } + presetValidator.validateProperty( + preset, + "id", + isNonEmptyString, + preset + ); + presetValidator.validateProperty( + preset, + "name", + isNonEmptyString, + preset + ); + presetValidator.validateProperty( + preset, + "urls", + isNonEmptyArrayOfNonEmptyStrings, + preset + ); + presetValidator.validateProperty( + preset, + "theme", + isValidPresetTheme, + preset + ); + return presetValidator.errors.length === 0; + }); + validateProperty(settings, "customThemes", isArray, DEFAULT_SETTINGS); + validateArray(settings, "customThemes", (custom) => { + if ( + !( + isPlainObject(custom) && + hasRequiredProperties(custom, ["url", "theme"]) + ) + ) { + return false; + } + const presetValidator = createValidator(); + presetValidator.validateProperty( + custom, + "url", + isNonEmptyArrayOfNonEmptyStrings, + custom + ); + presetValidator.validateProperty( + custom, + "theme", + isValidPresetTheme, + custom + ); + return presetValidator.errors.length === 0; + }); + validateProperty(settings, "siteList", isArray, DEFAULT_SETTINGS); + validateArray(settings, "siteList", isNonEmptyString); + validateProperty( + settings, + "siteListEnabled", + isArray, + DEFAULT_SETTINGS + ); + validateArray(settings, "siteListEnabled", isNonEmptyString); + validateProperty( + settings, + "applyToListedOnly", + isBoolean, + DEFAULT_SETTINGS + ); + validateProperty( + settings, + "changeBrowserTheme", + isBoolean, + DEFAULT_SETTINGS + ); + validateProperty(settings, "syncSettings", isBoolean, DEFAULT_SETTINGS); + validateProperty( + settings, + "syncSitesFixes", + isBoolean, + DEFAULT_SETTINGS + ); + validateProperty( + settings, + "automation", + (automation) => { + if (!isPlainObject(automation)) { + return false; + } + const automationValidator = createValidator(); + automationValidator.validateProperty( + automation, + "enabled", + isBoolean, + automation + ); + automationValidator.validateProperty( + automation, + "mode", + isOneOf( + AutomationMode.SYSTEM, + AutomationMode.TIME, + AutomationMode.LOCATION, + AutomationMode.NONE + ), + automation + ); + automationValidator.validateProperty( + automation, + "behavior", + isOneOf("OnOff", "Scheme"), + automation + ); + return automationValidator.errors.length === 0; + }, + DEFAULT_SETTINGS + ); + validateProperty( + settings, + AutomationMode.TIME, + (time) => { + if (!isPlainObject(time)) { + return false; + } + const timeValidator = createValidator(); + timeValidator.validateProperty( + time, + "activation", + isTime, + time + ); + timeValidator.validateProperty( + time, + "deactivation", + isTime, + time + ); + return timeValidator.errors.length === 0; + }, + DEFAULT_SETTINGS + ); + validateProperty( + settings, + AutomationMode.LOCATION, + (location) => { + if (!isPlainObject(location)) { + return false; + } + const locValidator = createValidator(); + const isValidLoc = (x) => x === null || isNumber(x); + locValidator.validateProperty( + location, + "latitude", + isValidLoc, + location + ); + locValidator.validateProperty( + location, + "longitude", + isValidLoc, + location + ); + return locValidator.errors.length === 0; + }, + DEFAULT_SETTINGS + ); + validateProperty( + settings, + "previewNewDesign", + isBoolean, + DEFAULT_SETTINGS + ); + validateProperty(settings, "enableForPDF", isBoolean, DEFAULT_SETTINGS); + validateProperty( + settings, + "enableForProtectedPages", + isBoolean, + DEFAULT_SETTINGS + ); + validateProperty( + settings, + "enableContextMenus", + isBoolean, + DEFAULT_SETTINGS + ); + validateProperty( + settings, + "detectDarkTheme", + isBoolean, + DEFAULT_SETTINGS + ); + return {errors, settings}; + } + function validateTheme(theme) { + if (!isPlainObject(theme)) { + return { + errors: ["Theme is not a plain object"], + theme: DEFAULT_THEME + }; + } + const {validateProperty, errors} = createValidator(); + validateProperty(theme, "mode", isOneOf(0, 1), DEFAULT_THEME); + validateProperty( + theme, + "brightness", + isNumberBetween(0, 200), + DEFAULT_THEME + ); + validateProperty( + theme, + "contrast", + isNumberBetween(0, 200), + DEFAULT_THEME + ); + validateProperty( + theme, + "grayscale", + isNumberBetween(0, 100), + DEFAULT_THEME + ); + validateProperty( + theme, + "sepia", + isNumberBetween(0, 100), + DEFAULT_THEME + ); + validateProperty(theme, "useFont", isBoolean, DEFAULT_THEME); + validateProperty(theme, "fontFamily", isNonEmptyString, DEFAULT_THEME); + validateProperty( + theme, + "textStroke", + isNumberBetween(0, 1), + DEFAULT_THEME + ); + validateProperty( + theme, + "engine", + isOneOf("dynamicTheme", "staticTheme", "cssFilter", "svgFilter"), + DEFAULT_THEME + ); + validateProperty(theme, "stylesheet", isString, DEFAULT_THEME); + validateProperty( + theme, + "darkSchemeBackgroundColor", + isRegExpMatch(/^#[0-9a-f]{6}$/i), + DEFAULT_THEME + ); + validateProperty( + theme, + "darkSchemeTextColor", + isRegExpMatch(/^#[0-9a-f]{6}$/i), + DEFAULT_THEME + ); + validateProperty( + theme, + "lightSchemeBackgroundColor", + isRegExpMatch(/^#[0-9a-f]{6}$/i), + DEFAULT_THEME + ); + validateProperty( + theme, + "lightSchemeTextColor", + isRegExpMatch(/^#[0-9a-f]{6}$/i), + DEFAULT_THEME + ); + validateProperty( + theme, + "scrollbarColor", + (x) => x === "" || isRegExpMatch(/^(auto)|(#[0-9a-f]{6})$/i)(x), + DEFAULT_THEME + ); + validateProperty( + theme, + "selectionColor", + isRegExpMatch(/^(auto)|(#[0-9a-f]{6})$/i), + DEFAULT_THEME + ); + validateProperty( + theme, + "styleSystemControls", + isBoolean, + DEFAULT_THEME + ); + validateProperty( + theme, + "lightColorScheme", + isNonEmptyString, + DEFAULT_THEME + ); + validateProperty( + theme, + "darkColorScheme", + isNonEmptyString, + DEFAULT_THEME + ); + validateProperty(theme, "immediateModify", isBoolean, DEFAULT_THEME); + return {errors, theme}; + } + + const SAVE_TIMEOUT = 1000; + class UserStorage { + static async loadSettings() { + UserStorage.settings = await UserStorage.loadSettingsFromStorage(); + } + static fillDefaults(settings) { + settings.theme = {...DEFAULT_THEME, ...settings.theme}; + settings.time = {...DEFAULT_SETTINGS.time, ...settings.time}; + settings.presets.forEach((preset) => { + preset.theme = {...DEFAULT_THEME, ...preset.theme}; + }); + settings.customThemes.forEach((site) => { + site.theme = {...DEFAULT_THEME, ...site.theme}; + }); + } + static migrateAutomationSettings(settings) { + if (typeof settings.automation === "string") { + const automationMode = settings.automation; + const automationBehavior = settings.automationBehaviour; + if (settings.automation === "") { + settings.automation = { + enabled: false, + mode: automationMode, + behavior: automationBehavior + }; + } else { + settings.automation = { + enabled: true, + mode: automationMode, + behavior: automationBehavior + }; + } + delete settings.automationBehaviour; + } + } + static async loadSettingsFromStorage() { + if (UserStorage.loadBarrier) { + return await UserStorage.loadBarrier.entry(); + } + UserStorage.loadBarrier = new PromiseBarrier(); + const local = await readLocalStorage(DEFAULT_SETTINGS); + const {errors: localCfgErrors} = validateSettings(local); + localCfgErrors.forEach((err) => logWarn(err)); + if (local.syncSettings == null) { + local.syncSettings = DEFAULT_SETTINGS.syncSettings; + } + if (!local.syncSettings) { + UserStorage.migrateAutomationSettings(local); + UserStorage.fillDefaults(local); + UserStorage.loadBarrier.resolve(local); + return local; + } + const $sync = await readSyncStorage(DEFAULT_SETTINGS); + if (!$sync) { + local.syncSettings = false; + UserStorage.set({syncSettings: false}); + UserStorage.saveSyncSetting(false); + UserStorage.loadBarrier.resolve(local); + UserStorage.migrateAutomationSettings($sync); + UserStorage.fillDefaults($sync); + return local; + } + const {errors: syncCfgErrors} = validateSettings($sync); + syncCfgErrors.forEach((err) => logWarn(err)); + UserStorage.migrateAutomationSettings($sync); + UserStorage.fillDefaults($sync); + UserStorage.loadBarrier.resolve($sync); + return $sync; + } + static async saveSettings() { + if (!UserStorage.settings) { + return; + } + await UserStorage.saveSettingsIntoStorage(); + } + static async saveSyncSetting(sync) { + const obj = {syncSettings: sync}; + await writeLocalStorage(obj); + try { + await writeSyncStorage(obj); + } catch (err) { + logWarn( + "Settings synchronization was disabled due to error:", + chrome.runtime.lastError + ); + UserStorage.set({syncSettings: false}); + } + } + static set($settings) { + if (!UserStorage.settings) { + return; + } + if ($settings.siteList) { + if (!Array.isArray($settings.siteList)) { + const list = []; + for (const key in $settings.siteList) { + const index = Number(key); + if (!isNaN(index)) { + list[index] = $settings.siteList[key]; + } + } + $settings.siteList = list; + } + const siteList = $settings.siteList.filter((pattern) => { + let isOK = false; + try { + isURLMatched("https://google.com/", pattern); + isURLMatched("[::1]:1337", pattern); + isOK = true; + } catch (err) {} + return isOK && pattern !== "/"; + }); + $settings = {...$settings, siteList}; + } + UserStorage.settings = {...UserStorage.settings, ...$settings}; + } + } + UserStorage.saveSettingsIntoStorage = debounce(SAVE_TIMEOUT, async () => { + if (UserStorage.saveStorageBarrier) { + await UserStorage.saveStorageBarrier.entry(); + return; + } + UserStorage.saveStorageBarrier = new PromiseBarrier(); + const settings = UserStorage.settings; + if (settings.syncSettings) { + try { + await writeSyncStorage(settings); + } catch (err) { + logWarn( + "Settings synchronization was disabled due to error:", + chrome.runtime.lastError + ); + UserStorage.set({syncSettings: false}); + await UserStorage.saveSyncSetting(false); + await writeLocalStorage(settings); + } + } else { + await writeLocalStorage(settings); + } + UserStorage.saveStorageBarrier.resolve(); + UserStorage.saveStorageBarrier = null; + }); + + function evalMath(expression) { + const rpnStack = []; + const workingStack = []; + let lastToken; + for (let i = 0, len = expression.length; i < len; i++) { + const token = expression[i]; + if (!token || token === " ") { + continue; + } + if (operators.has(token)) { + const op = operators.get(token); + while (workingStack.length) { + const currentOp = operators.get(workingStack[0]); + if (!currentOp) { + break; + } + if (op.lessOrEqualThan(currentOp)) { + rpnStack.push(workingStack.shift()); + } else { + break; + } + } + workingStack.unshift(token); + } else if (!lastToken || operators.has(lastToken)) { + rpnStack.push(token); + } else { + rpnStack[rpnStack.length - 1] += token; + } + lastToken = token; + } + rpnStack.push(...workingStack); + const stack = []; + for (let i = 0, len = rpnStack.length; i < len; i++) { + const op = operators.get(rpnStack[i]); + if (op) { + const args = stack.splice(0, 2); + stack.push(op.exec(args[1], args[0])); + } else { + stack.unshift(parseFloat(rpnStack[i])); + } + } + return stack[0]; + } + class Operator { + constructor(precedence, method) { + this.precendce = precedence; + this.execMethod = method; + } + exec(left, right) { + return this.execMethod(left, right); + } + lessOrEqualThan(op) { + return this.precendce <= op.precendce; + } + } + const operators = new Map([ + ["+", new Operator(1, (left, right) => left + right)], + ["-", new Operator(1, (left, right) => left - right)], + ["*", new Operator(2, (left, right) => left * right)], + ["/", new Operator(2, (left, right) => left / right)] + ]); + + const hslaParseCache = new Map(); + const rgbaParseCache = new Map(); + function parseColorWithCache($color) { + $color = $color.trim(); + if (rgbaParseCache.has($color)) { + return rgbaParseCache.get($color); + } + if ($color.includes("calc(")) { + $color = lowerCalcExpression($color); + } + const color = parse($color); + color && rgbaParseCache.set($color, color); + return color; + } + function parseToHSLWithCache(color) { + if (hslaParseCache.has(color)) { + return hslaParseCache.get(color); + } + const rgb = parseColorWithCache(color); + if (!rgb) { + return null; + } + const hsl = rgbToHSL(rgb); + hslaParseCache.set(color, hsl); + return hsl; + } + function hslToRGB({h, s, l, a = 1}) { + if (s === 0) { + const [r, b, g] = [l, l, l].map((x) => Math.round(x * 255)); + return {r, g, b, a}; + } + const c = (1 - Math.abs(2 * l - 1)) * s; + const x = c * (1 - Math.abs(((h / 60) % 2) - 1)); + const m = l - c / 2; + const [r, g, b] = ( + h < 60 + ? [c, x, 0] + : h < 120 + ? [x, c, 0] + : h < 180 + ? [0, c, x] + : h < 240 + ? [0, x, c] + : h < 300 + ? [x, 0, c] + : [c, 0, x] + ).map((n) => Math.round((n + m) * 255)); + return {r, g, b, a}; + } + function rgbToHSL({r: r255, g: g255, b: b255, a = 1}) { + const r = r255 / 255; + const g = g255 / 255; + const b = b255 / 255; + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + const c = max - min; + const l = (max + min) / 2; + if (c === 0) { + return {h: 0, s: 0, l, a}; + } + let h = + (max === r + ? ((g - b) / c) % 6 + : max === g + ? (b - r) / c + 2 + : (r - g) / c + 4) * 60; + if (h < 0) { + h += 360; + } + const s = c / (1 - Math.abs(2 * l - 1)); + return {h, s, l, a}; + } + function toFixed(n, digits = 0) { + const fixed = n.toFixed(digits); + if (digits === 0) { + return fixed; + } + const dot = fixed.indexOf("."); + if (dot >= 0) { + const zerosMatch = fixed.match(/0+$/); + if (zerosMatch) { + if (zerosMatch.index === dot + 1) { + return fixed.substring(0, dot); + } + return fixed.substring(0, zerosMatch.index); + } + } + return fixed; + } + function rgbToString(rgb) { + const {r, g, b, a} = rgb; + if (a != null && a < 1) { + return `rgba(${toFixed(r)}, ${toFixed(g)}, ${toFixed(b)}, ${toFixed( + a, + 2 + )})`; + } + return `rgb(${toFixed(r)}, ${toFixed(g)}, ${toFixed(b)})`; + } + function rgbToHexString({r, g, b, a}) { + return `#${(a != null && a < 1 + ? [r, g, b, Math.round(a * 255)] + : [r, g, b] + ) + .map((x) => { + return `${x < 16 ? "0" : ""}${x.toString(16)}`; + }) + .join("")}`; + } + const rgbMatch = /^rgba?\([^\(\)]+\)$/; + const hslMatch = /^hsla?\([^\(\)]+\)$/; + const hexMatch = /^#[0-9a-f]+$/i; + function parse($color) { + const c = $color.trim().toLowerCase(); + if (c.match(rgbMatch)) { + return parseRGB(c); + } + if (c.match(hslMatch)) { + return parseHSL(c); + } + if (c.match(hexMatch)) { + return parseHex(c); + } + if (knownColors.has(c)) { + return getColorByName(c); + } + if (systemColors.has(c)) { + return getSystemColor(c); + } + if ($color === "transparent") { + return {r: 0, g: 0, b: 0, a: 0}; + } + return null; + } + function getNumbers($color) { + const numbers = []; + let prevPos = 0; + let isMining = false; + const startIndex = $color.indexOf("("); + $color = $color.substring(startIndex + 1, $color.length - 1); + for (let i = 0; i < $color.length; i++) { + const c = $color[i]; + if ((c >= "0" && c <= "9") || c === "." || c === "+" || c === "-") { + isMining = true; + } else if (isMining && (c === " " || c === ",")) { + numbers.push($color.substring(prevPos, i)); + isMining = false; + prevPos = i + 1; + } else if (!isMining) { + prevPos = i + 1; + } + } + if (isMining) { + numbers.push($color.substring(prevPos, $color.length)); + } + return numbers; + } + function getNumbersFromString(str, range, units) { + const raw = getNumbers(str); + const unitsList = Object.entries(units); + const numbers = raw + .map((r) => r.trim()) + .map((r, i) => { + let n; + const unit = unitsList.find(([u]) => r.endsWith(u)); + if (unit) { + n = + (parseFloat(r.substring(0, r.length - unit[0].length)) / + unit[1]) * + range[i]; + } else { + n = parseFloat(r); + } + if (range[i] > 1) { + return Math.round(n); + } + return n; + }); + return numbers; + } + const rgbRange = [255, 255, 255, 1]; + const rgbUnits = {"%": 100}; + function parseRGB($rgb) { + const [r, g, b, a = 1] = getNumbersFromString($rgb, rgbRange, rgbUnits); + return {r, g, b, a}; + } + const hslRange = [360, 1, 1, 1]; + const hslUnits = {"%": 100, "deg": 360, "rad": 2 * Math.PI, "turn": 1}; + function parseHSL($hsl) { + const [h, s, l, a = 1] = getNumbersFromString($hsl, hslRange, hslUnits); + return hslToRGB({h, s, l, a}); + } + function parseHex($hex) { + const h = $hex.substring(1); + switch (h.length) { + case 3: + case 4: { + const [r, g, b] = [0, 1, 2].map((i) => + parseInt(`${h[i]}${h[i]}`, 16) + ); + const a = + h.length === 3 ? 1 : parseInt(`${h[3]}${h[3]}`, 16) / 255; + return {r, g, b, a}; + } + case 6: + case 8: { + const [r, g, b] = [0, 2, 4].map((i) => + parseInt(h.substring(i, i + 2), 16) + ); + const a = + h.length === 6 ? 1 : parseInt(h.substring(6, 8), 16) / 255; + return {r, g, b, a}; + } + } + return null; + } + function getColorByName($color) { + const n = knownColors.get($color); + return { + r: (n >> 16) & 255, + g: (n >> 8) & 255, + b: (n >> 0) & 255, + a: 1 + }; + } + function getSystemColor($color) { + const n = systemColors.get($color); + return { + r: (n >> 16) & 255, + g: (n >> 8) & 255, + b: (n >> 0) & 255, + a: 1 + }; + } + function lowerCalcExpression(color) { + let searchIndex = 0; + const replaceBetweenIndices = (start, end, replacement) => { + color = + color.substring(0, start) + replacement + color.substring(end); + }; + while ((searchIndex = color.indexOf("calc(")) !== -1) { + const range = getParenthesesRange(color, searchIndex); + if (!range) { + break; + } + let slice = color.slice(range.start + 1, range.end - 1); + const includesPercentage = slice.includes("%"); + slice = slice.split("%").join(""); + const output = Math.round(evalMath(slice)); + replaceBetweenIndices( + range.start - 4, + range.end, + output + (includesPercentage ? "%" : "") + ); + } + return color; + } + const knownColors = new Map( + Object.entries({ + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgrey: 0xa9a9a9, + darkgreen: 0x006400, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + grey: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgrey: 0xd3d3d3, + lightgreen: 0x90ee90, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 + }) + ); + const systemColors = new Map( + Object.entries({ + "ActiveBorder": 0x3b99fc, + "ActiveCaption": 0x000000, + "AppWorkspace": 0xaaaaaa, + "Background": 0x6363ce, + "ButtonFace": 0xffffff, + "ButtonHighlight": 0xe9e9e9, + "ButtonShadow": 0x9fa09f, + "ButtonText": 0x000000, + "CaptionText": 0x000000, + "GrayText": 0x7f7f7f, + "Highlight": 0xb2d7ff, + "HighlightText": 0x000000, + "InactiveBorder": 0xffffff, + "InactiveCaption": 0xffffff, + "InactiveCaptionText": 0x000000, + "InfoBackground": 0xfbfcc5, + "InfoText": 0x000000, + "Menu": 0xf6f6f6, + "MenuText": 0xffffff, + "Scrollbar": 0xaaaaaa, + "ThreeDDarkShadow": 0x000000, + "ThreeDFace": 0xc0c0c0, + "ThreeDHighlight": 0xffffff, + "ThreeDLightShadow": 0xffffff, + "ThreeDShadow": 0x000000, + "Window": 0xececec, + "WindowFrame": 0xaaaaaa, + "WindowText": 0x000000, + "-webkit-focus-ring-color": 0xe59700 + }).map(([key, value]) => [key.toLowerCase(), value]) + ); + + function getBgPole(theme) { + const isDarkScheme = theme.mode === 1; + const prop = isDarkScheme + ? "darkSchemeBackgroundColor" + : "lightSchemeBackgroundColor"; + return theme[prop]; + } + function getFgPole(theme) { + const isDarkScheme = theme.mode === 1; + const prop = isDarkScheme + ? "darkSchemeTextColor" + : "lightSchemeTextColor"; + return theme[prop]; + } + const colorModificationCache = new Map(); + const rgbCacheKeys = ["r", "g", "b", "a"]; + const themeCacheKeys = [ + "mode", + "brightness", + "contrast", + "grayscale", + "sepia", + "darkSchemeBackgroundColor", + "darkSchemeTextColor", + "lightSchemeBackgroundColor", + "lightSchemeTextColor" + ]; + function getCacheId(rgb, theme) { + let resultId = ""; + rgbCacheKeys.forEach((key) => { + resultId += `${rgb[key]};`; + }); + themeCacheKeys.forEach((key) => { + resultId += `${theme[key]};`; + }); + return resultId; + } + function modifyColorWithCache( + rgb, + theme, + modifyHSL, + poleColor, + anotherPoleColor + ) { + let fnCache; + if (colorModificationCache.has(modifyHSL)) { + fnCache = colorModificationCache.get(modifyHSL); + } else { + fnCache = new Map(); + colorModificationCache.set(modifyHSL, fnCache); + } + const id = getCacheId(rgb, theme); + if (fnCache.has(id)) { + return fnCache.get(id); + } + const hsl = rgbToHSL(rgb); + const pole = poleColor == null ? null : parseToHSLWithCache(poleColor); + const anotherPole = + anotherPoleColor == null + ? null + : parseToHSLWithCache(anotherPoleColor); + const modified = modifyHSL(hsl, pole, anotherPole); + const {r, g, b, a} = hslToRGB(modified); + const matrix = createFilterMatrix(theme); + const [rf, gf, bf] = applyColorMatrix([r, g, b], matrix); + const color = + a === 1 + ? rgbToHexString({r: rf, g: gf, b: bf}) + : rgbToString({r: rf, g: gf, b: bf, a}); + fnCache.set(id, color); + return color; + } + function modifyLightSchemeColor(rgb, theme) { + const poleBg = getBgPole(theme); + const poleFg = getFgPole(theme); + return modifyColorWithCache( + rgb, + theme, + modifyLightModeHSL, + poleFg, + poleBg + ); + } + function modifyLightModeHSL({h, s, l, a}, poleFg, poleBg) { + const isDark = l < 0.5; + let isNeutral; + if (isDark) { + isNeutral = l < 0.2 || s < 0.12; + } else { + const isBlue = h > 200 && h < 280; + isNeutral = s < 0.24 || (l > 0.8 && isBlue); + } + let hx = h; + let sx = l; + if (isNeutral) { + if (isDark) { + hx = poleFg.h; + sx = poleFg.s; + } else { + hx = poleBg.h; + sx = poleBg.s; + } + } + const lx = scale(l, 0, 1, poleFg.l, poleBg.l); + return {h: hx, s: sx, l: lx, a}; + } + const MAX_BG_LIGHTNESS = 0.4; + function modifyBgHSL({h, s, l, a}, pole) { + const isDark = l < 0.5; + const isBlue = h > 200 && h < 280; + const isNeutral = s < 0.12 || (l > 0.8 && isBlue); + if (isDark) { + const lx = scale(l, 0, 0.5, 0, MAX_BG_LIGHTNESS); + if (isNeutral) { + const hx = pole.h; + const sx = pole.s; + return {h: hx, s: sx, l: lx, a}; + } + return {h, s, l: lx, a}; + } + let lx = scale(l, 0.5, 1, MAX_BG_LIGHTNESS, pole.l); + if (isNeutral) { + const hx = pole.h; + const sx = pole.s; + return {h: hx, s: sx, l: lx, a}; + } + let hx = h; + const isYellow = h > 60 && h < 180; + if (isYellow) { + const isCloserToGreen = h > 120; + if (isCloserToGreen) { + hx = scale(h, 120, 180, 135, 180); + } else { + hx = scale(h, 60, 120, 60, 105); + } + } + if (hx > 40 && hx < 80) { + lx *= 0.75; + } + return {h: hx, s, l: lx, a}; + } + function modifyBackgroundColor(rgb, theme) { + if (theme.mode === 0) { + return modifyLightSchemeColor(rgb, theme); + } + const pole = getBgPole(theme); + return modifyColorWithCache( + rgb, + {...theme, mode: 0}, + modifyBgHSL, + pole + ); + } + const MIN_FG_LIGHTNESS = 0.55; + function modifyBlueFgHue(hue) { + return scale(hue, 205, 245, 205, 220); + } + function modifyFgHSL({h, s, l, a}, pole) { + const isLight = l > 0.5; + const isNeutral = l < 0.2 || s < 0.24; + const isBlue = !isNeutral && h > 205 && h < 245; + if (isLight) { + const lx = scale(l, 0.5, 1, MIN_FG_LIGHTNESS, pole.l); + if (isNeutral) { + const hx = pole.h; + const sx = pole.s; + return {h: hx, s: sx, l: lx, a}; + } + let hx = h; + if (isBlue) { + hx = modifyBlueFgHue(h); + } + return {h: hx, s, l: lx, a}; + } + if (isNeutral) { + const hx = pole.h; + const sx = pole.s; + const lx = scale(l, 0, 0.5, pole.l, MIN_FG_LIGHTNESS); + return {h: hx, s: sx, l: lx, a}; + } + let hx = h; + let lx; + if (isBlue) { + hx = modifyBlueFgHue(h); + lx = scale(l, 0, 0.5, pole.l, Math.min(1, MIN_FG_LIGHTNESS + 0.05)); + } else { + lx = scale(l, 0, 0.5, pole.l, MIN_FG_LIGHTNESS); + } + return {h: hx, s, l: lx, a}; + } + function modifyForegroundColor(rgb, theme) { + if (theme.mode === 0) { + return modifyLightSchemeColor(rgb, theme); + } + const pole = getFgPole(theme); + return modifyColorWithCache( + rgb, + {...theme, mode: 0}, + modifyFgHSL, + pole + ); + } + function modifyBorderHSL({h, s, l, a}, poleFg, poleBg) { + const isDark = l < 0.5; + const isNeutral = l < 0.2 || s < 0.24; + let hx = h; + let sx = s; + if (isNeutral) { + if (isDark) { + hx = poleFg.h; + sx = poleFg.s; + } else { + hx = poleBg.h; + sx = poleBg.s; + } + } + const lx = scale(l, 0, 1, 0.5, 0.2); + return {h: hx, s: sx, l: lx, a}; + } + function modifyBorderColor(rgb, theme) { + if (theme.mode === 0) { + return modifyLightSchemeColor(rgb, theme); + } + const poleFg = getFgPole(theme); + const poleBg = getBgPole(theme); + return modifyColorWithCache( + rgb, + {...theme, mode: 0}, + modifyBorderHSL, + poleFg, + poleBg + ); + } + + const themeColorTypes = { + accentcolor: "bg", + button_background_active: "text", + button_background_hover: "text", + frame: "bg", + icons: "text", + icons_attention: "text", + ntp_background: "bg", + ntp_text: "text", + popup: "bg", + popup_border: "bg", + popup_highlight: "bg", + popup_highlight_text: "text", + popup_text: "text", + sidebar: "bg", + sidebar_border: "border", + sidebar_text: "text", + tab_background_text: "text", + tab_line: "bg", + tab_loading: "bg", + tab_selected: "bg", + textcolor: "text", + toolbar: "bg", + toolbar_bottom_separator: "border", + toolbar_field: "bg", + toolbar_field_border: "border", + toolbar_field_border_focus: "border", + toolbar_field_focus: "bg", + toolbar_field_separator: "border", + toolbar_field_text: "text", + toolbar_field_text_focus: "text", + toolbar_text: "text", + toolbar_top_separator: "border", + toolbar_vertical_separator: "border" + }; + const $colors = { + accentcolor: "#111111", + frame: "#111111", + ntp_background: "white", + ntp_text: "black", + popup: "#cccccc", + popup_text: "black", + sidebar: "#cccccc", + sidebar_border: "#333", + sidebar_text: "black", + tab_background_text: "white", + tab_loading: "#23aeff", + textcolor: "white", + toolbar: "#707070", + toolbar_field: "lightgray", + toolbar_field_text: "black" + }; + function setWindowTheme(filter) { + const colors = Object.entries($colors).reduce((obj, [key, value]) => { + const type = themeColorTypes[key]; + const modify = { + bg: modifyBackgroundColor, + text: modifyForegroundColor, + border: modifyBorderColor + }[type]; + const rgb = parseColorWithCache(value); + const modified = modify(rgb, filter); + obj[key] = modified; + return obj; + }, {}); + if ( + typeof browser !== "undefined" && + browser.theme && + browser.theme.update + ) { + browser.theme.update({colors}); + } + } + function resetWindowTheme() { + if ( + typeof browser !== "undefined" && + browser.theme && + browser.theme.reset + ) { + browser.theme.reset(); + } + } + + function createSVGFilterStylesheet(config, url, frameURL, fixes, index) { + let filterValue; + let reverseFilterValue; + if (isFirefox) { + filterValue = getEmbeddedSVGFilterValue( + getSVGFilterMatrixValue(config) + ); + reverseFilterValue = getEmbeddedSVGFilterValue( + getSVGReverseFilterMatrixValue() + ); + } else { + filterValue = "url(#dark-reader-filter)"; + reverseFilterValue = "url(#dark-reader-reverse-filter)"; + } + return cssFilterStyleSheetTemplate( + filterValue, + reverseFilterValue, + config, + url, + frameURL, + fixes, + index + ); + } + function getEmbeddedSVGFilterValue(matrixValue) { + const id = "dark-reader-filter"; + const svg = [ + '', + ``, + ``, + "", + "" + ].join(""); + return `url(data:image/svg+xml;base64,${btoa(svg)}#${id})`; + } + function toSVGMatrix(matrix) { + return matrix + .slice(0, 4) + .map((m) => m.map((m) => m.toFixed(3)).join(" ")) + .join(" "); + } + function getSVGFilterMatrixValue(config) { + return toSVGMatrix(createFilterMatrix(config)); + } + function getSVGReverseFilterMatrixValue() { + return toSVGMatrix(Matrix.invertNHue()); + } + + let query = null; + const onChange = ({matches}) => + listeners.forEach((listener) => listener(matches)); + const listeners = new Set(); + function runColorSchemeChangeDetector(callback) { + listeners.add(callback); + if (query) { + return; + } + query = matchMedia("(prefers-color-scheme: dark)"); + if (isMatchMediaChangeEventListenerSupported) { + query.addEventListener("change", onChange); + } else { + query.addListener(onChange); + } + } + const isSystemDarkModeEnabled = () => + (query || matchMedia("(prefers-color-scheme: dark)")).matches; + + var ContentScriptManagerState; + (function (ContentScriptManagerState) { + ContentScriptManagerState[(ContentScriptManagerState["UNKNOWN"] = 0)] = + "UNKNOWN"; + ContentScriptManagerState[ + (ContentScriptManagerState["REGISTERING"] = 1) + ] = "REGISTERING"; + ContentScriptManagerState[ + (ContentScriptManagerState["REGISTERED"] = 2) + ] = "REGISTERED"; + ContentScriptManagerState[ + (ContentScriptManagerState["NOTREGISTERED"] = 3) + ] = "NOTREGISTERED"; + })(ContentScriptManagerState || (ContentScriptManagerState = {})); + + var _a; + class Extension { + static init() { + new Newsmaker(); + DevTools.init(async () => this.onSettingsChanged()); + Messenger.init(this.getMessengerAdapter()); + TabManager.init({ + getConnectionMessage: async ({url, frameURL}) => + this.getConnectionMessage(url, frameURL), + getTabMessage: this.getTabMessage, + onColorSchemeChange: this.onColorSchemeChange + }); + this.startBarrier = new PromiseBarrier(); + this.stateManager = new StateManager( + Extension.LOCAL_STORAGE_KEY, + this, + { + autoState: "", + wasEnabledOnLastCheck: null, + registeredContextMenus: null + }, + logWarn + ); + chrome.alarms.onAlarm.addListener(this.alarmListener); + if (chrome.commands) { + chrome.commands.onCommand.addListener(async (command) => + this.onCommand(command) + ); + } + if (chrome.permissions.onRemoved) { + chrome.permissions.onRemoved.addListener((permissions) => { + var _b; + if ( + !((_b = + permissions === null || permissions === void 0 + ? void 0 + : permissions.permissions) === null || + _b === void 0 + ? void 0 + : _b.includes("contextMenus")) + ) { + this.registeredContextMenus = false; + } + }); + } + } + static async MV3syncSystemColorStateManager(isDark) { + { + return; + } + } + static isExtensionSwitchedOn() { + return ( + this.autoState === "turn-on" || + this.autoState === "scheme-dark" || + this.autoState === "scheme-light" || + (this.autoState === "" && UserStorage.settings.enabled) + ); + } + static updateAutoState() { + const {mode, behavior, enabled} = UserStorage.settings.automation; + let isAutoDark; + let nextCheck; + switch (mode) { + case AutomationMode.TIME: { + const {time} = UserStorage.settings; + isAutoDark = isInTimeIntervalLocal( + time.activation, + time.deactivation + ); + nextCheck = nextTimeInterval( + time.activation, + time.deactivation + ); + break; + } + case AutomationMode.SYSTEM: + isAutoDark = + this.wasLastColorSchemeDark === null + ? isSystemDarkModeEnabled() + : this.wasLastColorSchemeDark; + if (isFirefox) { + runColorSchemeChangeDetector( + Extension.onColorSchemeChange + ); + } + break; + case AutomationMode.LOCATION: { + const {latitude, longitude} = UserStorage.settings.location; + if (latitude != null && longitude != null) { + isAutoDark = isNightAtLocation(latitude, longitude); + nextCheck = nextTimeChangeAtLocation( + latitude, + longitude + ); + } + break; + } + case AutomationMode.NONE: + break; + } + let state = ""; + if (enabled) { + if (behavior === "OnOff") { + state = isAutoDark ? "turn-on" : "turn-off"; + } else if (behavior === "Scheme") { + state = isAutoDark ? "scheme-dark" : "scheme-light"; + } + } + this.autoState = state; + if (nextCheck) { + if (nextCheck < Date.now()) { + logWarn( + `Alarm is set in the past: ${nextCheck}. The time is: ${new Date()}. ISO: ${new Date().toISOString()}` + ); + } else { + chrome.alarms.create(Extension.ALARM_NAME, { + when: nextCheck + }); + } + } + } + static async start() { + await Promise.all([ + ConfigManager.load({local: true}), + this.MV3syncSystemColorStateManager(null), + UserStorage.loadSettings() + ]); + if ( + UserStorage.settings.enableContextMenus && + !this.registeredContextMenus + ) { + chrome.permissions.contains( + {permissions: ["contextMenus"]}, + (permitted) => { + if (permitted) { + this.registerContextMenus(); + } + } + ); + } + if (UserStorage.settings.syncSitesFixes) { + await ConfigManager.load({local: false}); + } + this.updateAutoState(); + this.onAppToggle(); + logInfo("loaded", UserStorage.settings); + { + TabManager.updateContentScript({ + runOnProtectedPages: + UserStorage.settings.enableForProtectedPages + }); + } + UserStorage.settings.fetchNews && Newsmaker.subscribe(); + this.startBarrier.resolve(); + } + static getMessengerAdapter() { + return { + collect: async () => { + return await this.collectData(); + }, + changeSettings: (settings) => this.changeSettings(settings), + setTheme: (theme) => this.setTheme(theme), + setShortcut: ({command, shortcut}) => + this.setShortcut(command, shortcut), + toggleActiveTab: async () => this.toggleActiveTab(), + markNewsAsRead: async (ids) => + await Newsmaker.markAsRead(...ids), + markNewsAsDisplayed: async (ids) => + await Newsmaker.markAsDisplayed(...ids), + loadConfig: async (options) => + await ConfigManager.load(options), + applyDevDynamicThemeFixes: (text) => + DevTools.applyDynamicThemeFixes(text), + resetDevDynamicThemeFixes: () => + DevTools.resetDynamicThemeFixes(), + applyDevInversionFixes: (text) => + DevTools.applyInversionFixes(text), + resetDevInversionFixes: () => DevTools.resetInversionFixes(), + applyDevStaticThemes: (text) => + DevTools.applyStaticThemes(text), + resetDevStaticThemes: () => DevTools.resetStaticThemes() + }; + } + static registerContextMenus() { + chrome.contextMenus.onClicked.addListener( + async ({menuItemId, frameUrl, pageUrl}) => + this.onCommand(menuItemId, frameUrl || pageUrl) + ); + chrome.contextMenus.removeAll(() => { + this.registeredContextMenus = false; + chrome.contextMenus.create( + { + id: "DarkReader-top", + title: "Dark Reader" + }, + () => { + if (chrome.runtime.lastError) { + return; + } + const msgToggle = + chrome.i18n.getMessage("toggle_extension"); + const msgAddSite = chrome.i18n.getMessage( + "toggle_current_site" + ); + const msgSwitchEngine = chrome.i18n.getMessage( + "theme_generation_mode" + ); + chrome.contextMenus.create({ + id: "toggle", + parentId: "DarkReader-top", + title: msgToggle || "Toggle everywhere" + }); + chrome.contextMenus.create({ + id: "addSite", + parentId: "DarkReader-top", + title: msgAddSite || "Toggle for current site" + }); + chrome.contextMenus.create({ + id: "switchEngine", + parentId: "DarkReader-top", + title: msgSwitchEngine || "Switch engine" + }); + this.registeredContextMenus = true; + } + ); + }); + } + static async getShortcuts() { + const commands = await getCommands(); + return commands.reduce( + (map, cmd) => Object.assign(map, {[cmd.name]: cmd.shortcut}), + {} + ); + } + static setShortcut(command, shortcut) { + setShortcut(command, shortcut); + } + static async collectData() { + await this.loadData(); + const [ + news, + shortcuts, + dynamicFixesText, + filterFixesText, + staticThemesText, + activeTab + ] = await Promise.all([ + Newsmaker.getLatest(), + this.getShortcuts(), + DevTools.getDynamicThemeFixesText(), + DevTools.getInversionFixesText(), + DevTools.getStaticThemesText(), + this.getActiveTabInfo() + ]); + return { + isEnabled: this.isExtensionSwitchedOn(), + isReady: true, + settings: UserStorage.settings, + news, + shortcuts, + colorScheme: ConfigManager.COLOR_SCHEMES_RAW, + forcedScheme: + this.autoState === "scheme-dark" + ? "dark" + : this.autoState === "scheme-light" + ? "light" + : null, + devtools: { + dynamicFixesText, + filterFixesText, + staticThemesText + }, + activeTab + }; + } + static async getActiveTabInfo() { + await this.loadData(); + const url = await TabManager.getActiveTabURL(); + const info = this.getURLInfo(url); + info.isInjected = await TabManager.canAccessActiveTab(); + if (UserStorage.settings.detectDarkTheme) { + info.isDarkThemeDetected = + await TabManager.isActiveTabDarkThemeDetected(); + } + return info; + } + static async getConnectionMessage(url, frameURL) { + await this.loadData(); + return this.getTabMessage(url, frameURL); + } + static async loadData() { + const promises = [this.stateManager.loadState()]; + if (!UserStorage.settings) { + promises.push(UserStorage.loadSettings()); + } + await Promise.all(promises); + } + static changeSettings($settings, onlyUpdateActiveTab = false) { + const prev = {...UserStorage.settings}; + UserStorage.set($settings); + if ( + prev.enabled !== UserStorage.settings.enabled || + prev.automation.enabled !== + UserStorage.settings.automation.enabled || + prev.automation.mode !== UserStorage.settings.automation.mode || + prev.automation.behavior !== + UserStorage.settings.automation.behavior || + prev.time.activation !== UserStorage.settings.time.activation || + prev.time.deactivation !== + UserStorage.settings.time.deactivation || + prev.location.latitude !== + UserStorage.settings.location.latitude || + prev.location.longitude !== + UserStorage.settings.location.longitude + ) { + this.updateAutoState(); + this.onAppToggle(); + } + if (prev.syncSettings !== UserStorage.settings.syncSettings) { + UserStorage.saveSyncSetting(UserStorage.settings.syncSettings); + } + if ( + this.isExtensionSwitchedOn() && + $settings.changeBrowserTheme != null && + prev.changeBrowserTheme !== $settings.changeBrowserTheme + ) { + if ($settings.changeBrowserTheme) { + setWindowTheme(UserStorage.settings.theme); + } else { + resetWindowTheme(); + } + } + if (prev.fetchNews !== UserStorage.settings.fetchNews) { + UserStorage.settings.fetchNews + ? Newsmaker.subscribe() + : Newsmaker.unSubscribe(); + } + if ( + prev.enableContextMenus !== + UserStorage.settings.enableContextMenus + ) { + if (UserStorage.settings.enableContextMenus) { + this.registerContextMenus(); + } else { + chrome.contextMenus.removeAll(); + } + } + this.onSettingsChanged(onlyUpdateActiveTab); + } + static setTheme($theme) { + UserStorage.set({ + theme: {...UserStorage.settings.theme, ...$theme} + }); + if ( + this.isExtensionSwitchedOn() && + UserStorage.settings.changeBrowserTheme + ) { + setWindowTheme(UserStorage.settings.theme); + } + this.onSettingsChanged(); + } + static async reportChanges() { + const info = await this.collectData(); + Messenger.reportChanges(info); + } + static async toggleActiveTab() { + const settings = UserStorage.settings; + const tab = await this.getActiveTabInfo(); + const {url} = tab; + const isInDarkList = isURLInList(url, ConfigManager.DARK_SITES); + const host = getURLHostOrProtocol(url); + function getToggledList(sourceList) { + const list = sourceList.slice(); + const index = list.indexOf(host); + if (index < 0) { + list.push(host); + } else { + list.splice(index, 1); + } + return list; + } + const darkThemeDetected = + !settings.applyToListedOnly && + settings.detectDarkTheme && + tab.isDarkThemeDetected; + if ( + isInDarkList || + darkThemeDetected || + settings.siteListEnabled.includes(host) + ) { + const toggledList = getToggledList(settings.siteListEnabled); + this.changeSettings({siteListEnabled: toggledList}, true); + return; + } + const toggledList = getToggledList(settings.siteList); + this.changeSettings({siteList: toggledList}, true); + } + static onAppToggle() { + if (this.isExtensionSwitchedOn()) { + IconManager.setActive(); + } else { + IconManager.setInactive(); + } + if (UserStorage.settings.changeBrowserTheme) { + if ( + this.isExtensionSwitchedOn() && + this.autoState !== "scheme-light" + ) { + setWindowTheme(UserStorage.settings.theme); + } else { + resetWindowTheme(); + } + } + } + static async onSettingsChanged(onlyUpdateActiveTab = false) { + await this.loadData(); + this.wasEnabledOnLastCheck = this.isExtensionSwitchedOn(); + TabManager.sendMessage(onlyUpdateActiveTab); + this.saveUserSettings(); + this.reportChanges(); + this.stateManager.saveState(); + } + static getURLInfo(url) { + const {DARK_SITES} = ConfigManager; + const isInDarkList = isURLInList(url, DARK_SITES); + const isProtected = !canInjectScript(url); + return { + url, + isInDarkList, + isProtected, + isInjected: null, + isDarkThemeDetected: null + }; + } + static async saveUserSettings() { + await UserStorage.saveSettings(); + logInfo("saved", UserStorage.settings); + } + } + _a = Extension; + Extension.autoState = ""; + Extension.wasEnabledOnLastCheck = null; + Extension.registeredContextMenus = null; + Extension.wasLastColorSchemeDark = null; + Extension.startBarrier = null; + Extension.stateManager = null; + Extension.ALARM_NAME = "auto-time-alarm"; + Extension.LOCAL_STORAGE_KEY = "Extension-state"; + Extension.SYSTEM_COLOR_LOCAL_STORAGE_KEY = "system-color-state"; + Extension.alarmListener = (alarm) => { + if (alarm.name === Extension.ALARM_NAME) { + _a.loadData().then(() => _a.handleAutomationCheck()); + } + }; + Extension.onCommandInternal = async (command, frameURL) => { + if (_a.startBarrier.isPending()) { + await _a.startBarrier.entry(); + } + _a.stateManager.loadState(); + switch (command) { + case "toggle": + _a.changeSettings({ + enabled: !_a.isExtensionSwitchedOn(), + automation: { + ...UserStorage.settings.automation, + ...{enable: false} + } + }); + break; + case "addSite": { + const url = frameURL || (await TabManager.getActiveTabURL()); + if (isPDF(url)) { + _a.changeSettings({ + enableForPDF: !UserStorage.settings.enableForPDF + }); + } else { + _a.toggleActiveTab(); + } + break; + } + case "switchEngine": { + const engines = Object.values(ThemeEngine); + const index = engines.indexOf( + UserStorage.settings.theme.engine + ); + const next = engines[(index + 1) % engines.length]; + _a.setTheme({engine: next}); + break; + } + } + }; + Extension.onCommand = debounce(75, _a.onCommandInternal); + Extension.onColorSchemeChange = async (isDark) => { + if (_a.wasLastColorSchemeDark === isDark) { + return; + } + _a.wasLastColorSchemeDark = isDark; + _a.MV3syncSystemColorStateManager(isDark); + await _a.loadData(); + if (UserStorage.settings.automation.mode !== AutomationMode.SYSTEM) { + return; + } + _a.handleAutomationCheck(); + }; + Extension.handleAutomationCheck = () => { + _a.updateAutoState(); + const isSwitchedOn = _a.isExtensionSwitchedOn(); + if ( + _a.wasEnabledOnLastCheck === null || + _a.wasEnabledOnLastCheck !== isSwitchedOn || + _a.autoState === "scheme-dark" || + _a.autoState === "scheme-light" + ) { + _a.wasEnabledOnLastCheck = isSwitchedOn; + _a.onAppToggle(); + TabManager.sendMessage(); + _a.reportChanges(); + _a.stateManager.saveState(); + } + }; + Extension.getTabMessage = (url, frameURL) => { + const settings = UserStorage.settings; + const urlInfo = _a.getURLInfo(url); + if ( + _a.isExtensionSwitchedOn() && + isURLEnabled(url, settings, urlInfo) + ) { + const custom = settings.customThemes.find(({url: urlList}) => + isURLInList(url, urlList) + ); + const preset = custom + ? null + : settings.presets.find(({urls}) => isURLInList(url, urls)); + let theme = custom + ? custom.theme + : preset + ? preset.theme + : settings.theme; + if ( + _a.autoState === "scheme-dark" || + _a.autoState === "scheme-light" + ) { + const mode = _a.autoState === "scheme-dark" ? 1 : 0; + theme = {...theme, mode}; + } + const isIFrame = frameURL != null; + const detectDarkTheme = + !isIFrame && + settings.detectDarkTheme && + !isURLInList(url, settings.siteListEnabled) && + !isPDF(url); + logInfo(`Custom theme ${ + custom ? "was found" : "was not found" + }, Preset theme ${preset ? "was found" : "was not found"} + The theme(${ + custom ? "custom" : preset ? "preset" : "global" + } settings) used is: ${JSON.stringify(theme)}`); + switch (theme.engine) { + case ThemeEngine.cssFilter: { + return { + type: MessageType.BG_ADD_CSS_FILTER, + data: { + css: createCSSFilterStyleSheet( + theme, + url, + frameURL, + ConfigManager.INVERSION_FIXES_RAW, + ConfigManager.INVERSION_FIXES_INDEX + ), + detectDarkTheme + } + }; + } + case ThemeEngine.svgFilter: { + if (isFirefox) { + return { + type: MessageType.BG_ADD_CSS_FILTER, + data: { + css: createSVGFilterStylesheet( + theme, + url, + frameURL, + ConfigManager.INVERSION_FIXES_RAW, + ConfigManager.INVERSION_FIXES_INDEX + ), + detectDarkTheme + } + }; + } + return { + type: MessageType.BG_ADD_SVG_FILTER, + data: { + css: createSVGFilterStylesheet( + theme, + url, + frameURL, + ConfigManager.INVERSION_FIXES_RAW, + ConfigManager.INVERSION_FIXES_INDEX + ), + svgMatrix: getSVGFilterMatrixValue(theme), + svgReverseMatrix: getSVGReverseFilterMatrixValue(), + detectDarkTheme + } + }; + } + case ThemeEngine.staticTheme: { + return { + type: MessageType.BG_ADD_STATIC_THEME, + data: { + css: + theme.stylesheet && theme.stylesheet.trim() + ? theme.stylesheet + : createStaticStylesheet( + theme, + url, + frameURL, + ConfigManager.STATIC_THEMES_RAW, + ConfigManager.STATIC_THEMES_INDEX + ), + detectDarkTheme: settings.detectDarkTheme + } + }; + } + case ThemeEngine.dynamicTheme: { + const fixes = getDynamicThemeFixesFor( + url, + frameURL, + ConfigManager.DYNAMIC_THEME_FIXES_RAW, + ConfigManager.DYNAMIC_THEME_FIXES_INDEX, + UserStorage.settings.enableForPDF + ); + return { + type: MessageType.BG_ADD_DYNAMIC_THEME, + data: { + theme, + fixes, + isIFrame, + detectDarkTheme + } + }; + } + default: + throw new Error(`Unknown engine ${theme.engine}`); + } + } + return { + type: MessageType.BG_CLEAN_UP + }; + }; + + function makeChromiumHappy() { + chrome.runtime.onMessage.addListener( + (message, sender, sendResponse) => { + if ( + ![ + MessageType.UI_GET_DATA, + MessageType.UI_APPLY_DEV_DYNAMIC_THEME_FIXES, + MessageType.UI_APPLY_DEV_INVERSION_FIXES, + MessageType.UI_APPLY_DEV_STATIC_THEMES + ].includes(message.type) && + (message.type !== MessageType.CS_FRAME_CONNECT || + !isPanel(sender)) + ) { + sendResponse({type: "¯\\_(ツ)_/¯"}); + } + } + ); + } + + Extension.init(); + Extension.start(); + const welcome = ` /''''\\ + (0)==(0) +/__||||__\\ +Welcome to Dark Reader!`; + console.log(welcome); + { + chrome.runtime.onInstalled.addListener(({reason}) => { + if (reason === "install") { + chrome.tabs.create({url: getHelpURL()}); + } + }); + chrome.runtime.setUninstallURL(UNINSTALL_URL); + } + makeChromiumHappy(); +})(); diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/config/color-schemes.drconf b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/config/color-schemes.drconf new file mode 100644 index 0000000..6f77e9d --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/config/color-schemes.drconf @@ -0,0 +1,90 @@ +Default + +DARK +background: #181a1b +text: #e8e6e3 + +LIGHT +background: #181a1b +text: #e8e6e3 + +================================ + +Catppuccin + +DARK +background: #1e1e2e +text: #cdd6f4 + +LIGHT +background: #eff1f5 +text: #4c4f69 + +================================ + +Dracula + +DARK +background: #282b36 +text: #e8e6e3 + +================================ + +Gruvbox + +DARK +background: #282828 +text: #ebdbb2 + +LIGHT +background: #fbf1c7 +text: #3c3836 + +================================ + +Nord + +DARK +background: #2e3440 +text: #eceff4 + +LIGHT +background: #eceff4 +text: #3b4252 + +================================ + +Rosé Pine + +DARK +background: #191724 +text: #e0def4 + +LIGHT +background: #faf4ed +text: #575279 + +================================ + +Solarized + +DARK +background: #002b36 +text: #93a1a1 + +LIGHT +background: #fdf6e3 +text: #586e75 + +================================ + +Tokyo Night + +DARK +background: #1a1b26 +text: #a9b1d6 + +LIGHT +background: #d5d6db +text: #343b58 + diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/config/dark-sites.config b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/config/dark-sites.config new file mode 100644 index 0000000..064772f --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/config/dark-sites.config @@ -0,0 +1,937 @@ +0bin.net +0x00sec.org +12bytes.org +1337x.*/$ +1lighty.github.io/BetterDiscordStuff +1nf.me +2600.com +2bqueue.info +314n.org +5stardata.info +9anime.id +9anime.to +abletonbot.me +about.benjithatbluefox.eu +absolucy.moe +account.bhvr.com +aceship.github.io +addictinggames.com +adridoesthings.com +adventofcode.com +agent-stats.com +agfy.co +ajay.app +albony.xyz +alexkaehler.com +alfawal.dev +ameliorated.info +amp-what.com +andrewleguay.com +animepahe.com +animixplay.to +animk.info +anishde.dev +anitrack.co +anon.sx +antalbiztonsag.com +aonprd.com +app.destinyitemmanager.com +app.keeweb.info +app.plex.tv +app.pluralsight.com +app.revolt.chat +app.sqldbm.com +applesilicongames.com +application.security +aqtiongame.com +ara-ara-ufufu.herokuapp.com +archive.ragtag.moe +ardov.me +ari-web.xyz +arkenfox.github.io/TZP/ +armaforces.com +artixlinux.org +asciimation.co.nz +ashcam.xyz +ashishpanigrahi.xyz +asoftmurmur.com +assassins-creed.de +astronvim.github.io +atelier.net/virtual-economy +atresplayer.com +attackontitan.fandom.com +audiolove.club +audiomass.co +audioz.download +augmentedsteam.com +avengedsevenfold.com +axyl-os.github.io +azeria-labs.com +badboybill.com +battle.net +battlelog.battlefield.com +bbc.co.uk/iplayer +bdeditor.dev +beastskills.com +bedrocklinux.org +beepbox.co +bequiet.com +bestblackhatforum.com +beta.destinyitemmanager.com +betteranime.net +betterdiscord.app +betterttv.com +bherila.net +bin.disroot.org +birdie0.github.io +bitcoinity.org/markets +bithatch.co.uk +bittube.video +blackhat.com +blackhatsem.com +blackhatworld.com +blackhole.run +blackle.com +blackmod.net +blakthumb.com +blastpremier.com +blgn.dev +blink.sh +blizzard.com +blog.aractus.com +blog.counter-strike.net +blog.ja-ke.tech +blox.link +bogleech.com +bondoer.fr +botboy.snaz.in +bouncingdvdlogo.com +brawldb.com +brew.sh +bri.io +brianpmaher.com +broadcasthe.net +brodierobertson.xyz +browserslist.vercel.app +brunotome.dev +bugmenot.com +buildbot.orphis.net +bungie.net +bytebin.lucko.me +c-saccoccio.fr +cadence.moe +caesarshiba.com +caniuse.com +caracal.club +carbon.now.sh +carl.gg +cascadr.co +catvibers.me +cdkeys.com +cdn.minlor.net +cdnnow.pro +chat.ryzom.com +cheat.sh +checkra.in +chess.com +chitownhousemusic.com +chromatic-tuner.com +cider.sh +cl00e9ment.gitlab.io/kingdom-blazon-generator/ +clashofstats.com +clt.gg +cncnet.org +codepen.io +codesandbox.io +codestackr.com +codewars.com +colean.cc +comicextra.com +connect-4.xyz +coolmathgames.com +coriolis.io +countermail.com +cracked.to +crazygames.com +crontab.guru +cryptowat.ch +cs.rin.ru +cssbattle.dev +cswarzone.com +curiositystream.com +cxsecurity.com +cybercodeonline.com +cybercrime-tracker.net +cyberdrop.me +cyberpunk.net +cybersole.io +cyberspatial.com +cytu.be +daddyanity.com +daily-fire.com +daksh.eu.org +danidev.net +darckrepacks.com +daringfireball.net +dark.diatr.us +darkmodelist.com +darkreader.org +dartpad.dev +dash.cavebot.xyz +datomatic.no-intro.org +dbdicontoolbox.com/web +dblstatistics.com +deadbydaylight.com +deadbydaylight.fandom.com +deepweblinks.net +defcon.org +deltarune.com +demonforums.net +denims.tv +denshi.org +desktop.github.com +destiny.gg +destinytracker.com +devanbuggay.com +devart.withgoogle.com +developerinsider.co +di.fm +diablogame.de +diep.io +digi77.com +disasm.pro +disboard.org +discohook.org +discord.bots.gg +discord.com/app +discord.com/developers +discord.com/login +discord.com/register +discordbotlist.com +discourse.automationgame.com +discourse.cataclysmdda.org +discourse.disneyheroesgame.com +discuss.noisebridge.info +disneyplus.com +distro.tube +djflame.tech +dlive.tv +dodi-repacks.site +doesitarm.com +doodstream.com +dota2.ru +dotabuff.com +dotapicker.com +draculatheme.com +dragonage-game.de +drakewars.com +drunkenslug.com +drvortex.dev +dsa-drakensang.de +dsc.gg +duckychannel.com.tw +duelingnexus.com +dumpert.nl +dungeon-lords.de +dyno.gg +easypastes.tk +editor.method.ac +elderscrolls.fandom.com +eleaks.to +elitedangerous.com +ellie-app.com +elybeatmaker.com +emanuelemilella.com +emeraldchat.com/app +emkc.org +emoji.supply/kitchen/ +emuparadise.me +enig.ma.tum.de +enigame.de +enlightenment.org +entity.works +envs.net +epack.herokuapp.com +epack.js.org +epicgames.com/id +erai-raws.info +ericnl.com +escapefromtarkov.com +escapefromtarkov.fandom.com +esportal.com +etke.cc +etlegacy.com +evewho.com +evokemusic.ai +evowars.io +extrememusic.com +f.vision +faceit-enhancer.com +faceit.com +factorio.com +factoriobin.com +fallout-area.de +femto.dev +filmmakermode.com +filterblade.xyz +filterlists.com +fireship.io +fleepy.tv +florr.io +fluxpoint.dev +fmovies.to +food-le.co +forum.cswarzone.com +forum.lastos.org +forum.tribler.org +forum.xda-developers.com +forumplayer.dev +forums.launchbox-app.com +fox.com +fpn.firefox.com +frankerfacez.com/$ +freespeechextremist.com +frozensand.com +funnyjunk.com +fusengine.github.io/apaxy-v2 +galacticabot.vercel.app +gamebanana.com +gamejolt.com +gaming.amazon.com +garudalinux.org +geektyper.com +genshin.gg +geocities.restorativland.org +getaether.net +getdweb.net +gethalfmoon.com +getsharex.com +getwacup.com +gfl.matsuda.tips +gflcorner.com +ggapp.io +ghidra-sre.org +gianmarco.ga +giantbomb.com +gibber.cc +gibbu.github.io/ThemePreview/ +gifrun.com +gifyourgame.com +giggl.app +gikken.co +giphy.com +githubuniverse.com +gitkraken.com +gitmoji.kaki87.net +glow.phoesion.com +glowing-bear.org +glslsandbox.com +gog.com/forum +gogalaxy.com +goodfirstissue.dev +goosegame.io +graydon2.dreamwidth.org +grc.arikado.ru +greatview.video +greynoise.io +groovy.bot +gtaforums.com +gunshipmusic.com +gusted.xyz +hackaday.com +hackaday.io +hackertyper.com +hackforums.net +hackthebox.eu +hackthissite.org +hacktoberfest-projects.vercel.app +halowaypoint.com +hardforum.com +hardstuck.gg +hardwaretimes.com +hbomax.com +hdencode.com +heavybit.com +heliotrope.dk +hellofromhe.re +help.steampowered.com +herodamage.com +hexiro.me +hidive.com +himovies.to +hiserod.github.io +hitnmix.com +hiveon.com +hiveon.net +hostedtalk.net +hotstar.com +hpdevone.com +hrmspms.sicorax.mu +humblebundle.com/$ +humblebundle.com/accessibility +humblebundle.com/charities +humblebundle.com/refer +humblegames.com +hyper.is +hyperbeam.dev +i3wm.org +ieuan.xyz +imageglass.org +imgbox.com +imgur.com +impb.in +imperialb.in +indiexpo.net +infinitezoom.net +infocon.org +inker.co +intactphone.com +intothetrenches.1917.movie +isthereanydeal.com +jackdaniels.com +jakobneumann.com +jakubkaczor.com +jaxcore.app +jbzd.com.pl +jekyllrb.com +jellymar.io +jeusto.com +jhey.dev +jigsawpuzzles.io +jmoore.dev +joeydrewstudios.com +jonahsnider.com +jqbx.fm +jsben.ch +jsfiddle.net +jsitor.com +json-diff.com +justfive.news +kadantiscam.netlify.app +kaoskrew.org +kazimagazine.com +kbh.games +kbhgames.com +keezersquest.nl +kernel.fish +kfocus.org +kimbatt.github.io/js-Z +kingdom-leaks.com +kittybot.de +knockout.chat +kodenames.io +krisoneil.com/home +kristal.cc +krunker.io +ksp.mff.cuni.cz +kuik.li +kulbachny.com +kwejk.pl +kyleggiero.me +lagom.nl/lcd-test +lainchan.org +landchad.net +larbs.xyz +lbrynomics.com +lecantiche.com +lemmi.no +libreboot.org +lichess.org +lightweightpdf.com +limeshark.dev/editor +linux.org.ru +linuxgamingcentral.com +lipu-linku.github.io +liquidplus.com +listen.moe +livesplit.org +loadout.tf +loldle.net +lolesports.com +lollilol.xyz +looskie.com +lospec.com +lukesmith.xyz +lumina-desktop.org +lutris.net +m2v.ru +macbb.org +madiator.com +mango.pdf.zone +marte.dev +mastercomfig.com +mastodon.online +mastodon.social +mednafen.github.io +melody.ml +melonds.kuribo64.net +memory-alpha.fandom.com +metronom.us +mewho.com/starfield47 +migueldemoura.com +mikemaximus.github.io/gbm-web +minehut.com +minlor.net +misode.github.io +mixxx.org +mmorpg.com +monitoror.com +monkeytype.com +moonwiz.io +mouse-sensitivity.com +mrms.cz +music.com +music.youtube.com +mwittrien.github.io +mwomercs.com +my00stv.com +my60stv.com +my70stv.com +my80stv.com +my90stv.com +mynoise.net +mypodficacademia.com +mystere.dev +n-o-d-e.net +nanhu.ca +nationsglory.com +nationsglory.es +nationsglory.fr +neal.fun/size-of-space +nee.lv +netzhack.de +neundex.com +neurocore.xyz +newgrounds.com +nexusmods.com +nfs.fandom.com +nfspolska.pl +ngplus.net +nh-server.github.io/switch-guide/ +nheko-reborn.github.io +nicholemattera.com +nicholemattera.gay +nicholemattera.lgbt +niebezpiecznik.pl +nitter.42l.fr +nitter.dark.fail +nitter.fdn.fr +nitter.net +nitter.nixnet.services +nitter.pussthecat.org +nitter.snopyta.org +nomanssky.com +northward.info +nostv.pt +notebooks.quantumstat.com +notiger.xyz +nowplayi.ng +nulledbb.com +odysee.com +offshorecorptalk.com +oldfag.org +omcar.pl +omgwtfnzbs.me +onionplay.co +onlyformats.netlify.app +open.spotify.com +opendota.com +openemu.org +openrazer.github.io +orama-interactive.itch.io/pixelorama +orteil.dashnet.org/cookieclicker +osu.ppy.sh +osumatrix.me +otzdarva.com +ovagames.com +overcoder.dev +overdodactyl.github.io/ShadowFox +oxide.computer +paimon.moe +paper-io.com +parahumans.wordpress.com +paranoid.email +parrotbot.gg +parrotsec.org +passthepopcorn.me +pastes.dev +pathofexile.com +pathofexile.fandom.com +payday.fandom.com +peterlindbergh.obys.agency +petersalomonsen.com/webassemblymusic/livecodev2 +phineas.io +photomosh.com +pic.cleoold.com +pic8.co +ping.pe +piped.kavin.rocks +piped.mha.fi +piped.mint.lgbt +piped.moomoo.me +piped.privacy.com.de +piped.tokhmi.xyz +piracybank.org +piskelapp.com +pitokmm.it +planetneverwinter.de +plasticuproject.com +platinumgod.co.uk +play.geforcenow.com +playclassic.games +pluto.tv +poal.co +poe-racing.com +poe.ninja +poeapp.com +poelab.com +polsatboxgo.pl +polsatgo.pl +polychromatic.app +pony.tube +pool.pm +powercord.dev +ppluss.de +pr0gramm.com +pre.fyp.nl +premid.app +privacytools.io +progettosnaps.net +programsquared.com +projectdiscovery.io +projectevo.xyz +protondb.com +proxx.app +proxy.vulpes.one +psi.cynicaloptimist.me +psyoptions.io +pvplegacy.net +pxseu.com +pylon.bot +raidbots.com +raidcore.gg +raider.io +raidforums.com +raidplan.io +raidtime.net +rain-world-modding.github.io +randacek.dev +rapidheaven.com +rate.house +raunaksitoula.com +rawg.io +rawgiving.com +ray.so +raycast.com +razorsecure.com +rbt.asia +rdck.dev +redacted.ch +redasm.io +redbox.com +redditinvestigator.com +redeclipse.net +reelgood.com +refind.com +relay.firefox.com/faq +remixpacks.ru +removeddit.com +renderlab.net +residentevil.net +restream4me.com +resurrectionremix.com +retromusic.app +returnyoutubedislike.com +reveddit.com +revolt.chat +richup.io +ripped.guide +rl6mans.com +robofight.io +rocketleagueesports.com +roleypoly.com +roman.hn +romefrontend.dev +roosterteeth.fandom.com +router.asus.com +rtbyte.xyz +runechanger.stirante.com +runeforge.gg +runicgames.com +rust.facepunch.com +rust.nolt.io +rythm.fm +sa-mp.com +sacred-legends.de +sadh.life +sadistic.pl +sammcheese.net +sandervanderburg.blogspot.com +sauce420.github.io +sauce420.gitlab.io +sb.ltn.fi +science-news.co +seaofthieves.fandom.com +search.biboumail.fr +search.nebulacentre.net +secrethitler.io +serebii.net +settings.gg +seximal.net +sharkiller.ddns.net +shatteredpixel.com +sheet.host +shellshock.io +sherlock-project.github.io +showtimeanytime.com +shpposter.club +shrirambalaji.dev +shsh.host +shutov.by +siliconlottery.com +simkl.com +sinister.ly +sites.google.com/site/igotdemthingsyoulike/ +skeld.net +skeptikon.fr +skidrowreloaded.com +skiftos.org +sky.lea.moe +skyblocknetwork.com +skylabmusic.com +skynetsimulator.com +slay.one +slider.kz +slippi.gg +slither.io +snazzah.com +somafm.com +spacebattles.com +spacestationgaming.com +spacex.com +spark.lucko.me +speedrun.com +speedtest.net +splatoon.nintendo.com +sponsorshipshq.com +sportsurge.net +spyware.neocities.org +srrdb.com +star-made.org +starlink.com +starmadedock.net +statbot.net +stateofjs.com +steamcharts.com +steamchina.com +steamcommunity.com +steamdb.info +steamstat.us +steamtimeidler.com +stillu.cc +stitches.dev +stonestyle.co.th +store.steampowered.com +storyfire.com +stray.game +streamelements.com +studiomaertens.com +subspaceteati.me +sufficientvelocity.com +sumo.app +sunxdcc.com +supabase.io +supinic.com +supremacy1914.com +surrealdb.com +surviv.io +svtplay.se +sync-tube.de +szmarczak.com +tabstats.com +tacoanon.github.io +takethewalk.net +talentbrick.com +tallguysfree.com +tarkov-market.com +tauri.studio +tautulli.com +teambeyond.net +teaspeak.de +techwithalext.com +teddit.zaggy.nl +telecineplay.com.br +teleseer.com +televizeseznam.cz +telugucz.com +term.ooo +terminal.sexy +testfra.me +tetr.io +textfiles.com +tf2mart.net +tgw1916.net/bacteria_abis.html +the-eye.eu +thealiendrew.github.io +thegraph.com +thelinuxcast.org +themes.vscode.one +thetatoken.org +thinkwithportals.com +thiscatdoesnotexist.com +thispersondoesnotexist.com +throwbacks-music.com +thunix.net +tilde.club +tilde.team +tilde.town +tildegit.org +tildeverse.org +tinyzonetv.to +tio.run +title-case-converter.vercel.app +tmtheme-editor.herokuapp.com +tommytran.io +toneden.io +top.gg +totalwarwarhammer.gamepedia.com +tracker.fumik0.com +tracker.gg +tracr.co +training.azeria-labs.com +trblwlf.tk +trilon.io +tripleaughtdesign.com +trojansource.codes +trovo.live +truckersmp.com +truckspace.group +trustreaming.tv +tsssaver.1conan.com +ttf.tf +ttrms.io +tube.kdy.ch +tuner.ninja +tusharsadhwani.dev +twelvesmith.com +twist.moe +twnft.vercel.app +tycrek.com +tynker.com/ide +typing.works +ufplanets.com +ukui.org +unc0ver.dev +undergroundcellar.com +underlords.com +undertale.com +unlimiter.github.io/prime +userdiag.com +ussr.obys.agency +uwatchfree.ax +v15.studio +v3.wttr.in +v3rmillion.net +v7player.wostreaming.net +vakhtangov.ru +valvestore.forfansbyfans.com +vancedapp.com +vanillatweaks.net +vcjhwebdev.github.io/useless-translator/ +verify.bots.gg +vexbot.tk +victordarras.fr/cssgame +vid.puffyan.us +viddit.red +viduro.xyz +villains.fandom.com +vimm.net +vinesauce.com +virustotal.com/old-browsers +visualboxsite.com +vixlatio.com +vizality.com +vogons.org +vortetty.k3live.com +vrv.co +vscode.dev +vscodethemes.com +vtcdirectory.com +vuecinemas.nl +w0rp.com +w41k3r.com +wago.io +wallhaven.cc +wallpaperplay.com +wannabuy.biz +warcraftdaily.com +warcraftlogs.com +warezforums.com +warsow.net +wasm.continuation-labs.com/d3demo/ +watercss.kognise.dev +weavesilk.com +weboas.is +whirl.codes +widgetbot.io +wiki.step-project.com +windowsterminalthemes.dev +winget.run +wiocha.pl +wolfy.fr +worldofamalur.de +worldofcyberpunk.de +worldofgothic.de +worldofrisen.de +wormate.io +wormhole.app +wowaudit.com +wowhead.com +wowinterface.com +wtfast.com +wttr.in +www.ageofempires.com +www.benjidanecki.eu +www.canalplus.com +www.cc.com +www.chiefdelphi.com +www.deviantart.com +www.digikam.org +www.directvnow.com +www.gotimelinr.com +www.mechapower.eu +www.mrdemoapple.uk +www.mtv.com +www.netflix.com +www.razer.com +www.seebham.codes +www.siddharthray.com +www.teamfortress.com +www.tvnz.co.nz +www.wickeditor.com/editor/ +www.worldofplayers.de +x1337x.*/$ +x64dbg.com +xbins.org +xdox.me +xela.dev +xerolinux.xyz +xn--rpa.cc +xonotic.org +yande.re +yash-singh.herokuapp.com +yashsingh.us +yasio.pl +yohoho.io +you.dj +yt.is.nota.live +yts.* +yuzu-emu.org +zaufanatrzeciastrona.pl +zee5.com +zerodayinitiative.com +zombsroyale.io +zoomquilt.org +zoomquilt2.com +ztdp.ca +zunivers.zerator.com diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/config/dynamic-theme-fixes.config b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/config/dynamic-theme-fixes.config new file mode 100644 index 0000000..d4dbfdd --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/config/dynamic-theme-fixes.config @@ -0,0 +1,22875 @@ +* + +INVERT +.jfk-bubble.gtx-bubble +.captcheck_answer_label > input + img +span#closed_text > img[src^="https://www.gstatic.com/images/branding/googlelogo"] +span[data-href^="https://www.hcaptcha.com/"] > #icon +#bit-notification-bar-iframe +::-webkit-calendar-picker-indicator + +CSS +.vimvixen-hint { + background-color: ${#ffd76e} !important; + border-color: ${#c59d00} !important; + color: ${#302505} !important; +} +::placeholder { + opacity: 0.5 !important; +} +#edge-translate-panel-body, +.MuiTypography-body1, +.nfe-quote-text { + color: var(--darkreader-neutral-text) !important; +} +gr-main-header { + background-color: ${lightblue} !important; +} +.tou-z65h9k, +.tou-mignzq, +.tou-1b6i2ox, +.tou-lnqlqk { + background-color: var(--darkreader-neutral-background) !important; +} +.tou-75mvi { + background-color: ${rgb(207, 236, 245)} !important; +} +.tou-ta9e87, +.tou-1w3fhi0, +.tou-1b8t2us, +.tou-py7lfi, +.tou-1lpmd9d, +.tou-1frrtv8, +.tou-17ezmgn { + background-color: ${rgb(245, 245, 245)} !important; +} +.tou-uknfeu { + background-color: ${rgb(250, 237, 218)} !important; +} +.tou-6i3zyv { + background-color: ${rgb(133, 195, 216)} !important; +} + +IGNORE INLINE STYLE +.sr-wrapper * +.sr-reader * +.diigoHighlight + +================================ + +01net.com + +CSS +html, body { + color: ${#090702} !important; +} + +================================ + +10fastfingers.com + +CSS +#speedtest-main .hide-time { + color: transparent !important; +} +#inputfield { + background: var(--darkreader-neutral-background) !important; + color: var(--darkreader-neutral-text) !important; +} +body, +.container-modified > .row, +#practice-main, +#top1000-index-container, +#text-practice, +#content-bg { + background: var(--darkreader-neutral-background) !important; +} +#main-content-trenner { + background: var(--darkreader-neutral-background) !important; + border-bottom: 1px solid rgb(151, 141, 127) !important; +} + +================================ + +10minutemail.com + +CSS +#main_content { + background-image: none !important; +} + +================================ + +123-3d.nl +123accu.nl +123inkt.nl +123led.nl +123schoon.nl + +CSS +.main-panel-left, .main-panel-right { + background: var(--darkreader-neutral-background) !important; +} + +================================ + +123mathe.de + +INVERT +.entry-content img + +CSS +body, +.post-inner, +ul.sub-menu { + background-color: var(--darkreader-neutral-background) !important; +} +ul.sub-menu::after { + border-bottom-color: var(--darkreader-neutral-background) !important; +} +.progress-wrap { + box-shadow: var(--darkreader-neutral-background) 0px 0px 0px 3px inset !important; +} + +================================ + +1337x.gd +1337x.is +1337x.st +1337x.to +x1337x.eu +x1337x.se +x1337x.ws + +CSS +.torrent-tabs .tab-nav { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; + border-bottom-color: var(--darkreader-neutral-background) !important; +} + +================================ + +163.com + +INVERT +.m-playbar .wrap .btns + +CSS +body, +.s-bg, +.g-bd1, +.n-bilst, +.m-playbar .bg { + background: var(--darkreader-neutral-background) !important; +} + +================================ + +1917.com + +CSS +body { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +1fichier.com + +CSS +body { + background-image: none !important; +} + +================================ + +1mlsbd.com + +CSS +body { + background-image: none !important; +} + +================================ + +2gis.* + +INVERT +#map +path[d^="M34.8"] +._oow7vi +path[d^="M15.759"] + +CSS +a, abbr, acronym, address, applet, article, aside, audio, b, big, blockquote, body, canvas, caption, center, cite, code, dd, del, details, dfn, div, dl, dt, em, embed, fieldset, figcaption, figure, footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, html, i, iframe, img, ins, kbd, label, legend, li, main, mark, menu, nav, object, ol, output, p, pre, q, ruby, s, samp, section, small, span, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, time, tr, tt, u, ul, var, video { + color: var(--darkreader-neutral-text) !important; +} +div[style^="--bg-color"] { + --bg-color: var(--darkreader-neutral-background) !important; +} +div[style="transform:rotateX(0deg)"] > svg[width="38"] path { + fill: ${black} !important; +} +button[data-hamburger] span { + background-color: ${black} !important; +} + +IGNORE INLINE STYLE +a[href="/"] > svg * + +================================ + +3.basecamp.com + +CSS +body, .nav__main { + background-color: ${white}; +} +@media screen and (min-width: 768px){ + .panel--perma, .panel--project { + box-shadow: rgba(0, 0, 0, 0.05) 0px -1px 10px, rgba(0, 0, 0, 0.1) 0px 1px 4px, rgb(24, 26, 27) 0px 10px 30px; + } +} + +================================ + +300gospodarka.pl +300polityka.pl + +INVERT +#logo +img[alt="300Gospodarka"] +img[alt="Zespół 300Gospodarki"] + +================================ + +37.com + +INVERT +.logo37 + +================================ + +3dmark.com + +INVERT +.logo + +================================ + +40ton.net + +INVERT +.td-main-logo + +================================ + +4pda.ru + +CSS +.catend { + background: ${#e8e8e8} !important; +} +div.description > span { + display: none; +} + +================================ + +4t-niagara.com + +CSS +.download_link > h3, +.buy_link > h3 { + color: ${#88c1ff} !important; +} +.download_link li, +.buy_link li { + color: ${white} !important; +} + +================================ + +a11ywithlindsey.com + +INVERT +.logo + +CSS +:root { + --off-white: var(--darkreader-neutral-background) !important; +} + +================================ + +aad.org + +INVERT +.header-AAD-logo + +================================ + +abandonia.com + +CSS +.alt1G2 { + background-image: none !important; +} +.alt2G2 { + background-image: none !important; +} + +================================ + +abcnews.go.com + +INVERT +.navLogo +#sections +#search +#notifications + +================================ + +abiturma.de + +INVERT +div.formula +amp-img.latex-inline + +================================ + +ableton.com + +INVERT +.main-nav__logo +.main-footer__basics__logo +.main-footer__secondary__signature__logo + +================================ + +academic.microsoft.com + +INVERT +.loader + +CSS +.legend > rect:nth-child(1) { + fill: unset !important; +} + +================================ + +academy.abeka.com + +INVERT +.logo img +.center-align img + +================================ + +academy.dqlab.id + +INVERT +.menu img + +================================ + +access.ing.de + +CSS +.tile__info { + background-color: #fff !important; +} + +================================ + +access.wgu.edu +my.wgu.edu + +INVERT +img[alt="WGU Logo"] +.nav-hamburger + +================================ + +accessiblepalette.com + +INVERT +.swatch .hex + +IGNORE INLINE STYLE +.swatch + +================================ + +accesswire.com + +INVERT +.v2-nav-logo + +================================ + +account.live.com + +INVERT +.ms-Grid-col.ms-sm8.ms-lg4 +.ms-Grid-col.ms-sm4.ms-hiddenMdDown.pullout-textwrap +.ms-Grid-col.ms-sm2 img + +CSS +img[class="ShowMoreLoading"] { + filter: invert(93.7%) hue-rotate(180deg) contrast(90.6%) !important +} + +================================ + +account.microsoft.com/profile + +INVERT +.ms-StackItem div div img[src*="svg?n"] + +================================ + +account.orchid.com + +INVERT +.walletconnect-qrcode__image + +================================ + +account.proton.me +account.protonvpn.com + +INVERT +.sign-layout-bg +.sign-layout-bg > * + +CSS +.qr-code { + border: 5px solid white !important; +} + +IGNORE INLINE STYLE +.logo * +.qr-code * + +================================ + +account.ui.com + +CSS +div[class^="Toggle-module_switcher"] { + background-color: var(--darkreader-neutral-text) !important; +} +input[class^="Toggle-module_input"] { + background-color: initial; +} +div[class^="Modal-module_content"] form > div > canvas { + border: 5px solid white !important; +} + +================================ + +account.xiaomi.com + +CSS +.mi-profile-layout__profile { + background-image: none !important; +} + +================================ + +accounts.google.com + +INVERT +img[src$="signin_tapyes.gif"] + +CSS +#countryList div[role="option"][data-value] > div > div > div[style] { + background-image: url('//ssl.gstatic.com/i18n/flags/48x32/nobevel/66bdb7a1bbbdbf86a67de382fac49ecc/flags.png') !important; +} + +================================ + +accounts.zoho.com + +INVERT +div#product_img.tfa_totp_mode +span.zoho_logo +.zwHDots + +================================ + +accuweather.com + +INVERT +.allergy-icon +.icon-search +img[src$="arrow-right-black.svg"] + +================================ + +acer.com + +INVERT +.firstHeader .logos + +CSS +.contSectionBen img { + filter: brightness(50%) sepia(40%) !important; +} +.contSectionBen .textOverBen { + position: inherit !important; +} + +================================ + +acorn.utoronto.ca + +CSS +.acorn-classic.page-container .academic-history .sessionHeader, +.acorn-classic.page-container .academic-history .credit-earned-section, +.acorn-classic.page-container .academic-history .average-section, +.acorn-classic.page-container .academic-history .courses, +.acorn-classic.page-container .academic-history .coursesHeader, +.acorn-classic.page-container .academic-history .academic-history-report .gpa-listing, +.acorn-classic.page-container .academic-history-recent table .emph { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +actioncardapp.com + +INVERT +.logo + +================================ + +ad.nl + +CSS +.instanews-page-main-content { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +ada.org + +INVERT +.logo + +================================ + +adata.com + +INVERT +.logo-nav + +================================ + +addons.mozilla.org + +IGNORE IMAGE ANALYSIS +.Icon-youtube +span.Permission-description:before + +================================ + +adguard-dns.io + +INVERT +.animation__video +.footer__logo +.header__logo +.map__point-icon +.map__point-city +.servers-info__queries + +CSS +.animation__video { + z-index: 0 !important; +} +.map__point-city, +.servers-info__map { + filter: invert(1) hue-rotate(120deg) brightness(250%) !important; +} + +================================ + +adguard.com + +INVERT +a.header__logo +svg.reviews__icon-topic +.article__section--list-ico .md__list .md__img +.article__content--title-ico .article__section .md__title .md__img +.p-header-logo.p-header-logo--image img +.icon--gray-chrome +.icon--gray-edge +.icon--gray-opera +.icon--gray-firefox + +IGNORE IMAGE ANALYSIS +.icon--gray-opera +.icon--gray-firefox + +================================ + +admin.migadu.com + +CSS +.container { + background-image: none !important; +} + +================================ + +afterpay.com + +INVERT +div[class^="navigation_logo"] + +================================ + +aftonbladet.se + +CSS +a[href$="plus_plusikon"] > :nth-child(1) { + color: ${white} +} + +================================ + +ai2.appinventor.mit.edu + +CSS +.blocklyDraggable text { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +aiming.pro + +INVERT +#left_side_bar > div.logo > a > img + +================================ + +akademy.kde.org +edu.kde.org +dot.kde.org +forum.kde.org + +CSS +body, +#footer { + background: ${rgb(225, 227, 228)} !important; +} + +================================ + +akasa.com + +INVERT +.logo + +================================ + +akcemed.pl + +INVERT +.td-main-menu-logo +.footer-logo-wrap + +================================ + +akinator.com + +INVERT +.bubble +.bubble-body + +CSS +.bubble { + background-color: ${black} !important; + color: ${white} !important; +} +.bubble-body { + background-color: ${white} !important; + color: ${black} !important; +} +.question-number { + color: ${white} !important; +} + +================================ + +aldi.us + +IGNORE INLINE STYLE +.company-logo-content * + +================================ + +alertus.com + +INVERT +.Header-branding +[src^="https://images.squarespace-cdn.com"] + +================================ + +alexpage.de + +CSS +#page { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +alfredapp.com + +INVERT +[src*="macworld.png"] +[src*="tuaw.png"] +[src*="eddy_awards.png"] +[src*="appstorm.png"] +[src*="tnw.png"] +[src*="search.jpg"] +[src*="clipboard.jpg"] +[src*="control.jpg"] +[src*="konami-code.png"] +[src*="oatmeal404.jpg"] +[src*="query-history.png"] + +================================ + +algorithm-wiki.org + +INVERT +.thumbimage + +CSS +.thumbimage { + background-color: ${rgb(1, 4, 5)} !important; + border-color: ${rgb(48, 54, 57)} !important; +} + +================================ + +aliexpress.* + +IGNORE INLINE STYLE +svg[class^="ali-kit_Rating__star"] + +================================ + +alipay.com + +INVERT +#J_logoHomeUrl +.global-logo + +CSS +.qrcode-detail-img { + background-color: white !important; +} +.authcenter-background { + z-index: 0 !important; +} +.authcenter-head, +.authcenter-foot, +.authcenter-body-login, +.authcenter-body-logo > a { + z-index: 1 !important; +} + +================================ + +aljazeera.com + +INVERT +#site-logo > img +.navbar-brand > img +#navbar-hamburger-mobile + +================================ + +allconnect.com + +INVERT +.mininav-header__logo-image + +================================ + +allegro.pl + +INVERT +i[title="Smart!"] +[alt*="smart" i] +div[class="mpof_ki m389_6m"] +img[alt="Zakup z pakietem Smart"] +div.sob6jg.so1d89.mpof_ki +.so15i8 +._1e32a_sudoG +a[data-analytics-click-value="SellerAllListing"] +.mpof_ki.m389_6m > h6 + +CSS +#opbox-listing--base i, +article i { + background-size: 100% 100% !important; +} +.opbox-sheet-wrapper, +.opbox-sheet, +._k70df { + background-color: var(--darkreader-neutral-background) !important; +} + +IGNORE IMAGE ANALYSIS +._12h65 + +================================ + +allegrolokalnie.pl + +INVERT +.mlc-masthead__branding +.mlc-site-footer__branding + +================================ + +allestoringen.* +downdetector.* +downdetector.*.* +xn--allestrungen-9ib.* + +INVERT +#map_container +#map-card + +================================ + +allmacworld.com + +INVERT +.logo +.tie-appear.post-thumbnail +.tie-appear.post-thumbnail > [href="https://allmacworld.com/blocs-free-download/"] +.tie-appear.post-thumbnail > [href="https://allmacworld.com/waves-v11-complete-download-free/"] +.tie-appear.post-thumbnail > [href="https://allmacworld.com/3dequalizer-4-for-mac-free-download/"] +.tie-appear.post-thumbnail > [href="https://allmacworld.com/sylenth1-for-mac-free-download/"] +.tie-appear.post-thumbnail > [href="https://allmacworld.com/synapse-audio-legend-free-download/"] + +================================ + +allrecipes.com + +INVERT +.checkbox-list-checkmark::before +.external-link-icon +.icon-ellipsis > svg +.icon-email-outline +.icon-search +.icon-share-favorite +.rating-bar-wrapper +img[src="/img/profile.png"] + +================================ + +allspice.io + +INVERT +[data-mesh-id="SITE_HEADERinlineContent"] img + +================================ + +alphacoders.com + +INVERT +.main +.main > * +#page_header +#page_header > * + +================================ + +alphashooters.com + +CSS +.site-container { + --darkreader-bg--site-container-background: var(--darkreader-neutral-background) !important; +} + +================================ + +alpine.com + +INVERT +.alpsalpineLogo + +================================ + +alt.hololive.tv + +INVERT +video[src*="bg.mp4"] +video[src*="first.mp4"] +img[src*="logo_2line_gradient_color.svg"] +svg + +================================ + +altlinux.org + +INVERT +.mw-wiki-logo + +================================ + +amap.com + +INVERT +.amap-info +.amap-menu +.imgfeed[style*="place_default.jpg"] +.logo-img +#subway-svg +#themap +.title01-logo > a > img + +================================ + +amazingmarvin.com + +INVERT +.header-title + +================================ + +amazon.* +amazon.*.* + +INVERT +#banner-image +#ordersContainer .a-box.order-attributes img +div.a-section.vse-lb-video-metadata +div.vse-video-content +img[src*="smile-logo"] +.a-icon-arrow.a-icon-small.arrow-icon +.a-icon-close +.a-icon-extender-expand +.a-icon-popover +.a-link-nav-icon +.currencyINR +div.vse-video-title +div.vse-video-labels +i.a-icon-search + +CSS +.banner-border { + background-image: none !important; + background-color: ${white} !important; +} +div.milestone.notReached .milestone-marker::before { + border-color: var(--darkreader-neutral-text); +} +span.milestone-bar { + z-index: 0; +} +span.milestone-bar_foreground { + background-color: #4DC2B4; +} +span.milestone-bar_background { + background-image: linear-gradient(var(--darkreader-neutral-text) 40%, #181a1b00 0px); +} +img { + border-radius: 5% !important; +} + +================================ + +amazon.cn + +INVERT +#nav-logo + +CSS +#nav-main, +.nav-search-scope { + background-image: none !important; +} + +================================ + +ametek.com + +INVERT +.ametek_logo + +================================ + +ancient.eu + +INVERT +img#header_ahe_logo +img[alt="digitalmeetsculture.net"] +img[alt="EAGLE"] +img[alt="Save Ancient Studies in America"] +img[alt="Lithodomos VR"] +img[alt="USI / UNESCO / uniTwin Logo"] + +CSS +div#nav_bar { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +androidcentral.com + +INVERT +.site-logo + +CSS +.lazy-loaded { + mix-blend-mode: normal !important; +} + +================================ + +androidpolice.com + +INVERT +.header-logo svg + +================================ + +ang.pl + +CSS +body { + background-image: none !important; +} + +================================ + +angrymetalguy.com + +INVERT +.plbrand + +CSS +.thepage { + background-color: ${white} !important; +} +.content-pad { + background-color: ${white} !important; +} + +================================ + +anibrain.ai + +IGNORE INLINE STYLE +div[class^="style__HexagonDiv"] * +svg[class^="styles__SvgWithShadow"] * + +================================ + +anilibria.tv + +CSS +#oframeanilibriaPlayer pjsdiv:nth-child(12) pjsdiv:nth-child(2) pjsdiv, +#oframeanilibriaPlayer pjsdiv:nth-child(14) pjsdiv:nth-child(2) pjsdiv { + background-color: var(--darkreader-neutral-text) !important; +} + +================================ + +anilist.co + +CSS +:root { + --color-background: 39,44,56 !important; + --color-foreground: 31,35,45 !important; + --color-foreground-grey: 25,29,38 !important; + --color-foreground-grey-dark: 16,20,25 !important; + --color-foreground-blue: 25,29,38 !important; + --color-foreground-blue-dark: 19,23,29 !important; + --color-text: 159,173,189 !important; + --color-text-light: 129,140,153 !important; + --color-text-lighter: 133,150,165 !important; +} + +================================ + +animedigitalnetwork.fr + +CSS +.spoiler { + color: transparent !important; +} +.spoiler:hover { + color: unset !important; +} + +================================ + +ankiweb.net + +CSS +.sidebar { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +answers.opencv.org + +CSS +#header, +body, +#question-list, +.short-summary, +#ground { + background-image: none !important; +} + +================================ + +answers.unity.com + +IGNORE IMAGE ANALYSIS +header.section-header div.shard:before + +================================ + +antistorm.eu + +INVERT +#map-area +#map-controls-area +#controlPlayPauseIcon +#meteogram_temperature +#meteogram_dewPoint +#meteogram_cloudCover +#meteogram_precipitation +#meteogram_precipitationProbability +#meteogram_pressure +#meteogram_windSpeed +img[src*="data:image/png;base64,iVBORw"] + +================================ + +antywirus-nod32.pl + +CSS +.module.infolinia { + background-image: none !important; +} + +================================ + +anvaka.github.io + +CSS +text { + fill: var(--darkreader-neutral-text) !important; +} + +================================ + +anytype.io + +IGNORE IMAGE ANALYSIS +.img.home + +================================ + +aol.com + +INVERT +.logo + +================================ + +aosogrenci.anadolu.edu.tr + +CSS +.welcome { + background-image: none !important; +} + +================================ + +apartmentlist.com + +INVERT +div[class*="LogoContainer"] +div[class*="MenuButton"] + +================================ + +apartments.com + +INVERT +.logo + +================================ + +apclassroom.collegeboard.org + +INVERT +.overview-icon svg +.Zoom--expander svg +svg.icon--xmark +.RI_header__button svg.svg-icon + +CSS +.standalone_image img { + background-color: white; +} + +================================ + +api.kde.org + +INVERT +.center +.image + +CSS +.memdoc, .memproto { + background-image: initial !important; +} + +================================ + +apkpure.com + +INVERT +img[src$="gp_logo.png"] + +================================ + +apnews.com + +INVERT +.hamburger-box +.sticky-part > div svg +.LeftRail > div svg + +================================ + +app.betrybe.com + +INVERT +section.quiz-result__template summary +section.quiz-result__template summary .block-code + +CSS +.home-projects details, +.header button, +.header a, +.module-index-content { + background-color: transparent !important +} +.header button:hover, +.header a:hover, +.module-index-content summary:active, +.quiz-question label { + background-color: var(--darkreader-neutral-background) !important +} +.quiz-question label p { + color: rgb(180, 200, 255) !important +} +.quiz-question__alternatives label:hover, +.quiz-question__alternatives input[type=radio]:checked + label { + background: initial !important +} + +================================ + +app.codesignal.com + +CSS +.monaco-editor .cursor { + background-color: var(--darkreader-selection-text) !important; +} + +================================ + +app.corellium.com + +INVERT +.brand +.logo + +================================ + +app.daily.dev + +IGNORE INLINE STYLE +.h-logo * + +================================ + +app.datadoghq.com + +INVERT +.HostMap-canvas + +CSS +.log-dt-event.active, .log-dt-event.active:hover, .log-dt-event:hover { + background-color: rgb(37, 45, 58) !important; +} +svg text.time_cursor { + fill: ${black} !important; +} + +================================ + +app.grammarly.com + +CSS +use.valueCircle_f6otssy { + stroke: url(#pb-gradient-0); +} +:root { + --highlight-bg: ${rgba(0, 0, 0, 0.2)} +} +.alerts-clarity { + --highlight-bg: ${rgba(57, 93, 207, 0.2)}; +} +.alerts-engagement { + --highlight-bg: ${rgba(29, 203, 162, 0.2)}; +} +.alerts-correctness { + --highlight-bg: ${rgba(255, 69, 103, 0.2)}; +} +.alerts-delivery { + --highlight-bg: ${rgba(124, 58, 172, 0.2)}; +} +[class*="-alerts-markSelectedHigh"], span[class*="markSelectedFocused"] { + background-color: var(--highlight-bg) !important; +} +[class*="-navigation-counterWrapper"] [class*="-navigation-counterContent"], +[class*="-paidview-counter"] [class*="-paidview-counterContent"] { + fill: rgb(0, 0, 0, .9); +} + +IGNORE INLINE STYLE +use[class*="valueCircle_"] + +================================ + +app.kognity.com + +INVERT +img.KogCalculator +.content-image-figure > img[src*="png"] + +CSS +body, .KogDashboard-insideLoader { + background: none var(--darkreader-neutral-background) !important; +} +img:not([src*="png"]):not([src*="svg"]) { + background-color: white !important; +} + +================================ + +app.mysms.com + +CSS +.message a { + color: grey; +} + +================================ + +app.roll20.net + +INVERT +.sheet-hp +.sheet-ac +.sheet-textbox +.sheet-name-container +.sheet-attributes-container +.sheet-attr-container button +.sheet-hlabel-container +.sheet-vitals +.sheet-init button +.sheet-spell-level +.sheet-spell-level input +.sheet-textbox .sheet-options +.sheet-speed input +.sheet-part select +.sheet-resources .sheet-subcontainer +.sheet-resources .sheet-label +.sheet-subcontainer .sheet-top +.sheet-textbox .sheet-label +.sheet-attack .sheet-options + +CSS +.sheet-attributes-container, +.sheet-init, +.sheet-speed, +.sheet-trait, +.sheet-part, +.sheet-spell-level, +.sheet-details { + color: ${white} !important; +} + +================================ + +app.standardnotes.org + +INVERT +[aria-label="Challenge modal"] > svg > circle:first-child +input[id^="react-tag-"] + +CSS +search-options svg { + fill: var(--darkreader-neutral-text) !important; +} + +IGNORE INLINE STYLE +search-options svg + +================================ + +app.timelyapp.com + +INVERT +.Clock__clock_css_icon___LfBr6 +.Clock__stopwatch___2G-CB + +CSS +.Day__container___1Fpnl.Day__showBackground___3CXnw { + background-image: none; +} + +================================ + +app.traderepublic.com + +IGNORE INLINE STYLE +#chartPriceLine + +================================ + +app.youneedabudget.com + +CSS +[data-darkreader-inline-fill] { + fill: ${black} !important; +} + +================================ + +apple.com + +INVERT +.ac-slider-ax-track +.controls-progress-indicator +.rf-ccard-content-info + +================================ + +apple.com/leadership/ + +IGNORE IMAGE ANALYSIS +* + +================================ + +aprs.fi + +INVERT +img[src*="maps.googleapis.com/maps/"] +img[src*="tile.openstreetmap.org/"] + +CSS +#panel { + background-image: none !important; +} + +================================ + +apteka.ru + +INVERT +ymaps[class$="ground-pane"] +.icon--logo + +================================ + +aras.com + +CSS +.alternate_color.banner__title.display-2, +.alternate_color.banner__subtitle.display-5 { + color: var(--darkreader-neutral-text) !important;; +} +.banner__title.display-2, +.banner__subtitle.display-5 { + color: ${white} !important; +} + +================================ + +archive.org + +INVERT +p + fieldset a svg +.search-field svg +.ia-wordmark + +CSS +#search-input { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +ario-player.sourceforge.net + +INVERT +div.header + +CSS +div.main, +#menu li a, +#menu li { + background-image: none !important; +} + +================================ + +ars.particify.de + +CSS +body { + background-color: var(--darkreader-neutral-background) !important; +} +.mat-mini-fab { + box-shadow: none !important; +} +.mat-card { + background-color: #{gray} !important; + box-shadow: none !important; +} +.mat-chip { + background-color: var(--darkreader-neutral-background) !important; + color: var(--darkreader-neutral-text) !important; +} + +================================ + +arstechnica.com + +CSS +.listing, .video-thumbnail { + background-blend-mode: initial !important; +} +.article-single figure img { + mix-blend-mode: initial !important; +} + +================================ + +artofproblemsolving.com + +INVERT +.latex +.latexcenter + +================================ + +artsy.net + +CSS +[aria-checked="false"][role="checkbox"] svg path { + fill: transparent !important; +} + +IGNORE INLINE STYLE +[role="checkbox"] svg * + +================================ + +arxiv.org + +CSS +.abstract { + background-color: transparent !important; +} + +================================ + +asahichinese-j.com + +INVERT +#HeaderInner img +.SocialNav +.Tag li a + +CSS +.Tag li a { + color: ${grey} !important; +} +a, .LastUpdated, .Lead { + color: var(--darkreader-neutral-text) !important; +} +#Footer p, #FooterInner { + background-color: var(--darkreader-neutral-background) !important; +} +h1, .ArticleBody p, .ImagesHeightMod { + background-color: var(--darkreader-neutral-background) !important; + color: var(--darkreader-neutral-text) !important; +} + +================================ + +asana.com + +INVERT +.siteHeader__logo +.DatePickerCalendarDate--today .DatePickerCalendarDate-button::after + +CSS +.MultiColorIcon--unselected .MultiColorIcon-path--fadedBlack { + fill: var(--darkreader-bg--color-icon) !important; +} +.MultiColorIcon-path--white { + fill: var(--darkreader-text--color-icon-foreground) !important; +} +.DailySummaryInboxThread--selected, +.TaskAddedToPotInboxThread--selected, +.InboxExpandableThread.InboxExpandableThread--selected, +.PortfolioItemRow { + background: var(--darkreader-neutral-background) !important; +} +.PortfolioItemRow:hover { + background: ${#FFF} !important; +} + +================================ + +asciinema.org + +IGNORE INLINE STYLE +polygon +polyline + +================================ + +askjohnmackay.com + +INVERT +[src$="ask-john-mackay-logo.png"] +[src$="side-banner-05.gif"] +[src$="reasonwhy.jpg"] + +CSS +body, +header, +#site-footer, +#live-search { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +askvg.com + +INVERT +.site-header img + +================================ + +askwoody.com + +CSS +.banner, +.content { + background-image: none !important; +} + +================================ + +assetstore.unity.com + +CSS +div[style^="background-color:var(--color-bg-gray-5)"] { + --color-bg-gray-5: var(--darkreader-neutral-background) !important; +} +h2[style*="color:var(--color-font-header)"] { + --color-font-header: var(--darkreader-neutral-text) !important; +} + +================================ + +asus.com + +INVERT +span.mobile-menu-toggle.mobile +em#searchopen.icon-search +#af-header .af-inner .logo + +IGNORE IMAGE ANALYSIS +#af-header .af-inner .logo +li.nav-Rog a + +================================ + +atcoder.jp + +CSS +#fixed-server-timer { + color: #333; +} + +================================ + +atlas.herzen.spb.ru +guide.herzen.spb.ru +job.herzen.spb.ru + +INVERT +img[src="/images/logo.png"] +hr + +CSS +body, .body, table, tbody, tr, td, .corner_bottom { + background: none !important; +} + +================================ + +atlassian.net + +INVERT +img[src*="https://github.githubassets.com/favicon.ico"].smart-link-icon +.sc-jTzLTM +img[src^="https://latexmath.bolo-app.com/render/"] + +CSS +span.code, code.code { + background-color: rgba(240,246,252,0.15) !important; +} +.ghx-parent-group, +.ghx-issue { + background-color: rgba(119, 183, 255, 0.05) !important; +} +span.loader-wrapper a, +.css-s0tfqx, +.css-1vn31bx, +.css-1gx5gpx, +.css-wvfva4 { + background-color: rgba(240,246,252,0.1) !important; +} +.css-1yfnrso, +.aui-flag, +.aui-message { + box-shadow: 0 0 20px rgba(240,246,252,0.15) !important; +} +.css-1ua1xqz { + background-color: rgba(65, 65, 83, 0.6) !important; +} +code:first-of-type { + background-image: linear-gradient(to right, rgba(255,255,255,0.03),rgba(255,255,255,0.03)calc(1ch + 16px),transparent calc(1ch + 16px),transparent) !important; +} +.sc-1jjaulc-0 { + box-shadow: 0 0 4px ${rgba(3,9,15,0.15)} !important; + background-color: ${rgba(3, 9, 15, 0.02)} !important; +} +.sc-186t4q4-1 { + background-color: ${rgba(3, 9, 15, 0.02)} !important; +} +div.zgsxji-0.jMIyWM > div > div > div > div { + background-color: var(--darkreader-bg--ds-surface, #181a1b) !important; +} +#ak-main-content, .pfb8c3-0.dpzKHj, ._11q7vuon { + background-color: var(--darkreader-neutral-background) !important; +} +#jira-issue-header, #jira-issue-header-actions { + background-color: rgb(29, 32, 33) !important; +} +.ak-editor-panel[data-panel-type="note"] { + background-color: ${rgb(217, 200, 228)} !important; +} +.ak-editor-panel[data-panel-type="info"] { + background-color: ${rgb(172, 217, 242)} !important; +} +.ak-editor-panel[data-panel-type="error"] { + background-color: ${rgb(255, 220, 211)} !important; +} +.ak-editor-panel[data-panel-type="warning"] { + background-color: ${rgb(238, 229, 187)} !important; +} +.ak-renderer-document hr, .ProseMirror hr { + background-color: rgb(69, 70, 72) !important; +} +.ProseMirror hr.ak-editor-selected-node { + background-color: rgb(0, 101, 255) !important; +} + +IGNORE INLINE STYLE +.ak-editor-content-area * + +================================ + +audible.com + +INVERT +#adbl-cloud-player-controls + +================================ + +audio-technica.com + +INVERT +.o-header__logo + +================================ + +audycje.tokfm.pl/widget + +CSS +body { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +auth.adguard.com + +INVERT +.header__logo path[fill="#000"] + +================================ + +auth0.com + +INVERT +button[data-handler="authorise-github"] > img.icon.icon-default + +================================ + +autodesk.com + +INVERT +.uh-logo-container + +================================ + +autoweek.com + +INVERT +.nav-logo + +================================ + +avanti24.pl + +INVERT +.box-logo + +================================ + +avast.com + +INVERT +.avast-logo + +================================ + +avg.com + +INVERT +.bi-nav-toplink + +================================ + +avito.ru + +INVERT +a[class^="logo-logo"] > svg > g > path +a[class^="logo-logo"] > svg > g > g +div[class^="index-logo"] > a[class^="index-root"] +.item-extended-phone +.item-price-old::before +.contacts-phone-3KtSI +.button-content-phone_size_l-1O5VB +._39EVKDP-9p1BREJQ3fhILl._2sPEvPi-1aWpcq1ggVph1C._4wLX_6jxKYoWRyE1U1WcZ +[class^="suggest-graySuggestCategoryImg"] +ymaps[class$="ground-pane"] + +CSS +div[class^="item-preview-image"] { + z-index: 0 !important; +} + +================================ + +avlab.pl + +INVERT +img[src*="avlab-logo"] +img[alt*="logo"] +.elementor-widget-wrap div div a.elementor-icon svg +.elementor-social-icons-wrapper + +================================ + +aws.amazon.com + +INVERT +a.lb-trigger +.hover .axis-box rect +.img-wrapper +img[alt^="WEB_FreeTier"] +.lb-is-lazyloaded +.lb-none-v-margin.lb-img +.lb-tiny-iblock .cq-dd-image + +CSS +.header-background { + fill: none !important; +} + +================================ + +azuresynapse.net + +INVERT +.cursor + +================================ + +azurlane.koumakan.jp + +IGNORE IMAGE ANALYSIS +.mw-wiki-logo + +================================ + +bab.la + +INVERT +.logo-flash + +================================ + +babyem.co.uk + +INVERT +div.elementor-social-icons-wrapper a.elementor-icon +input::placeholder + +================================ + +babylonbee.com + +INVERT +.header-logo +.img-fluid.mb-2.d-none.d-sm-block + +================================ + +bahnhof.net + +CSS +.contact-form_section { + background-image: none !important; +} + +================================ + +baike.baidu.com + +INVERT +.formula + +IGNORE IMAGE ANALYSIS +.wiki-lemma .lemmaWgt-posterBg + +================================ + +bakabt.me + +INVERT +span.icon.hd +span.icon.lossless + +================================ + +balena.io + +INVERT +.Header__main-logo + +================================ + +bandcamp.com +allochiria.com + +INVERT +.bclogo.white +.vol-control +.progress +.buffer +.seek-control +#material-close + +CSS +.ui-dialog { + background-image: none !important; +} + +================================ + +bandshed.net + +CSS +#content { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +banki.ru + +INVERT +.header__logo + +CSS +.comment:nth-child(even) { + background-color: ${#f5f5f5} !important; +} + +================================ + +bankier.pl +bankier.tv + +INVERT +.o-home-smart-box__header > .a-anchor > .a-image > img[class="a-image__img"] +.hamburger +.icon > img +.menu-sidebar__close-menu > img +img[class="menu-sidebar__logo-img"] +img[alt*="Bankier.pl"] +img[src*="logo-smart.svg"] +a[href="https://www.bankier.pl/"] +img[alt="Bankier.TV"] +.m-quote-list__anchor img.a-image__img + +================================ + +bankofamerica.com + +INVERT +.main-nav-top-logo img + +CSS +.fsdnav-sub-nav-left { + background-color: var(--darkreader-neutral-background) !important; +} +.ad-acct-layout,.ad-acct-detail-card-layout, +.thrfwl-body, +.ad-summary-container,.olb-summary-widget-container { + background-image: none !important; +} + +================================ + +barnesandnoble.com + +INVERT +.logo-img + +================================ + +basecamp.com + +INVERT +.top-nav__logo + +================================ + +bayfiles.com + +INVERT +.img-responsive +.kopimi + +================================ + +bbb.* + +CSS +div[class^='scrollableList'] { + background: none !important; + box-shadow: none !important; +} + +================================ + +bbc.co.uk +bbc.co.uk/weather +bbc.com/weather + +INVERT +.orb-nav-section .orb-nav-blocks +.orb-icon .orb-icon-arrow +span[class*="LogoIconWrapper"] + +CSS +.wr-icon-weather-type__svg-background, +.wr-icon-rain__svg-background, +.wr-icon-wind-direction__svg-background, +.wr-icon-gel__svg-background { + opacity: 0% !important; +} +.wr-value--windspeed { + color: ${#dad7d2} !important; +} +.wr-c-environmental-data__icon-text { + color: ${#dcd9d4} !important; +} + +================================ + +bbc.com/news +bbc.com/sport +bbc.com/travel +bbc.com/capital +bbc.com/autos +bbc.com/culture +bbc.com/future +bbc.com/sounds +bbc.com/food +bbc.com/bitesize +bbc.com/earth + +INVERT +.orb-nav-section .orb-nav-blocks +.orb-icon .orb-icon-arrow +[class*="NavigationLink-LogoLink"] > span > svg + +================================ + +bbs.chinauos.com +bbs.deepin.org + +INVERT +.post_tip + +CSS +.post_edit p { + color: var(--darkreader-neutral-text) !important +} + +================================ + +bbs.thinkpad.com +club.lenovo.com.cn + +CSS +body[style] { + box-shadow: inset 0px 0px 0px 9999px var(--darkreader-neutral-background); +} + +================================ + +behance.net + +INVERT +div[class^="PrimaryNav-logoWrap"] + +================================ + +berlingske.dk + +INVERT +.site-header__logo + +================================ + +bestbuy.ca + +INVERT +.centerContainer +[class^="facetName"] +[class^="title"] +[class^="sortLabel"] +[class^="headerText"] +[class^="subTitle"] +[class^="price"] +[class^="soldByBestBuy"] +[class^="availabilityMessage"] +[class^="deliveryDate"] +[class^="storesNearCity"] +svg[class*="availabilityHeaderIcon"] + +CSS +div[class*="backgroundContainer"] { + z-index: 0 !important; +} +body { + background-image: initial; !important; +} + +================================ + +bestbuy.com + +CSS +input[type="radio" i] { + background-color: initial; +} + +================================ + +bestchange.ru + +INVERT +.tabs li a + +CSS +body, +.c-inner, +.c-block .c-wrap, +#content_table thead td, +.content .intro, +.c-block, +#content_table tbody td, +#content_reviews, +.review_header, +.review_middle, +.review_bottom { + background-image: none !important; +} + +================================ + +bet.com +cmt.com +logotv.com +paramountnetwork.com +southpark.cc.com +vh1.com + +CSS +body { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +betanews.com + +CSS +.sectionTop, +.editorial .header, +.tabbed .tabs li:not(.active), +.tabbed .tabs li:not(.active) a { + background-image: none !important; +} +.tabbed .tabs li:not(.active) a { + background-color: ${#d9d9ff} !important; +} + +================================ + +bettercap.org + +INVERT +.copy-to-clipboard +[src$="mitm.jpg"] +[src$="proxy.png"] +[src$="with-hsts.png"] +[src$="sslstrip2.png"] + +CSS +.copy-to-clipboard { + background-color: var(--darkreader-neutral-text) !important; +} + +================================ + +bfi.org.uk + +INVERT +img[src$="bfi_logo_transp.png"] +img[src$="national-lottery-logo-color.png"] +img[src*="sight-and-sound-logo-280x69.png"] + +CSS +body { + background-image: none !important; +} + +================================ + +bgp.he.net + +INVERT +img[src="/helogo.gif"] +img[src*="chart.googleapis.com"] +img[src^="/graphs/"] + +================================ + +bible.optina.ru + +CSS +body, +#left, +#right { + background-image: none !important; +} + +================================ + +bibliotecapleyades.net + +CSS +body { + background-image: none !important; +} + +================================ + +bienici.com + +INVERT +.section-header +.bv-form +.hpFeaturesRow +.hpContent + +================================ + +bigocheatsheet.com + +INVERT +.gray + +CSS +.green, +.orange, +.yellow, +.yellow-green { + color: black !important; +} + +================================ + +biletywielkopolskie.pl + +INVERT +.kw-logo + +================================ + +biliomask.com + +INVERT +div.header-title-logo + +================================ + +binance.com + +CSS +div.qr-code > canvas { + outline: solid 10px white !important; +} +div > input[type="checkbox"] + svg { + fill: transparent !important; +} +div > input[type="checkbox"]:checked + svg { + fill: var(--darkreader-neutral-text) !important; +} +label > svg circle { + fill: rgb(37, 40, 42) !important; +} + +================================ + +bing.com + +INVERT +canvas[id^="Microsoft.Maps"] + +CSS +.b_searchboxForm, +.b_searchboxForm:hover, +.b_focus .b_searchboxForm, +#sw_as #sa_ul:not(:empty) { + box-shadow: ${rgba(0, 0, 0, 0.1)} 0px 0px 0px 1px !important; +} +#b_results > li.b_ans.b_topborder, #b_results > li.b_ans.b_topborder.b_tophb.b_topshad { + box-shadow: ${rgba(13, 13, 13, 0.05)} 0px 0px 0px 1px !important; +} +.l_ecrd_imcolheader.gradient { + z-index: 2 !important; +} +#b_content { + background-image: none !important +} + +IGNORE INLINE STYLE +.b_header_bg +.sp-tpwebicons.WIKI * + +================================ + +biorxiv.org + +INVERT +.blood_logo +.logo-img +#czilogo + +CSS +body { + background-image: none !important; +} + +================================ + +bitbay.net + +INVERT +.navbar-brand +.logo +.full-page-preloader + +================================ + +bitbucket.org + +INVERT +a[href="/product"] +.registration-hero .form-prompt + +CSS +span[data-testid="file-tree-file__comments"] > span { + color: var(--darkreader-neutral-text) !important; +} +span > svg { + color: var(--icon-primary-color) !important; +} +[type="button"][tabindex="0"], +[data-testid="settingsButton"] { + background-color: ${rgba(33, 53, 89, 0.04)} !important; +} +code.code, +[type="button"][tabindex="0"]:hover, +[data-testid="settingsButton"]:hover { + background-color: ${rgba(33, 53, 89, 0.08)} !important; +} +.ak-navigation-resize-button { + box-shadow: ${rgba(33, 53, 89, 0.08)} 0px 0px 0px 1px, + ${rgba(33, 53, 89, 0.08)} 0px 2px 4px 1px !important; +} + +IGNORE INLINE STYLE +[role="presentation"] svg * +[aria-label="Bitbucket"] * + +================================ + +bitcoinprice.com + +CSS +.highcharts-button-box { + fill: var(--darkreader-neutral-background) !important; +} + +================================ + +bitcoinwisdom.com + +INVERT +.site-branding + +================================ + +bitly.com + +CSS +.hero-content { + background-image: none !important; +} + +================================ + +bitwarden.com + +INVERT +img[alt="Github Logo"] +img[src$="forbes.png"] +app-login img.logo + +IGNORE IMAGE ANALYSIS +blockquote .blockquote-header + +================================ + +bitwit.tech + +CSS +.svg-primary { + fill: #375D69 !important; +} +.svg-primary-light { + fill: #4A7F8F !important; +} +.svg-primary-dark { + fill: #28444D !important; +} +.svg-secondary { + fill: #B88399 !important; +} +.svg-secondary-light { + fill: #E8A9C4 !important; +} +.svg-secondary-dark { + fill: #825F6E !important; +} +.svg-light { + fill: #ADCED9 !important; +} +.svg-outline { + fill: none !important; + stroke: #000000 !important; +} +.svg-primary-outline { + fill: none !important; + stroke: #ADCED9 !important; +} +.svg-secondary-outline { + fill: none !important; + stroke: #375D69 !important; +} +.theme-light { + display: none !important; +} +.theme-dark { + display: none !important; +} +.theme-darkreader { + display: block !important; +} + +================================ + +biznes.pap.pl + +CSS +body, +#copy { + background-image: none !important; +} + +================================ + +blablacar.* +blablacar.*.* + +INVERT +.kirk-topBar-left + +================================ + +blackboard.com + +INVERT +li[class^="js-multiple-answer-answer"][class$="selected-answer"] +li[class^="js-answer"][class~="is-selected"][class$="answer-selected"]::before + +CSS +li[class^="js-multiple-answer-answer"][class$="selected-answer"]::before { + border-color: $var(--darkreader-neutral-background) !important; +} +li[class^="js-answer"][class~="is-selected"][class$="answer-selected"]::before { + border-color: $var(--darkreader-neutral-background) !important; +} + +================================ + +blahdns.com + +INVERT +[src="https://cdn.blahdns.com/logo.png"] +[src="https://cdn.blahdns.com/kofi4.png"] +.liberapay-btn > span +svg + +================================ + +blaupunkt.com + +INVERT +.fusion-standard-logo + +================================ + +blog.cloudflare.com + +CSS +body#main-body { + color: ${black} !important; + background-color: ${white} !important; +} +.dn { + color: ${white} !important; +} +#nav { + background-color: ${white} !important; +} +main#post { + background-color: ${white} !important; +} +article.post-full { + background-color: ${white} !important; +} +article p { + color: ${gray} !important; +} +code { + color: ${black} !important; +} +nav.pagination { + background-color: ${white} !important; +} + +================================ + +blog.doist.com + +INVERT +.db-header__logo-img + +================================ + +blog.mozilla.org + +INVERT +.content > .logo > [href^="https://www.mozilla.org/"] +.nav-global-donate > [href^="https://donate.mozilla.org/"] + +CSS +.nav-global-donate > [href^="https://donate.mozilla.org/"] { + color: ${white} !important; +} +#page { + background-image: none !important; +} + +================================ + +blog.nightly.mozilla.org + +INVERT +.content > .logo > [href^="https://www.mozilla.org/"] +.nav-global-twitter a::before +.nav-global-join a::before + +CSS +.nav-util-search .fm-search input { + border-color: ${#999} !important; +} + +================================ + +blog.scssoft.com + +CSS +body { + background: none !important; +} + +================================ + +blogger.com + +INVERT +.gb_ua +.feedflare + +================================ + +blogs.windows.com + +INVERT +.item-single__content ::before + +CSS +.c-logo .c-image { + background: ${white} !important; +} +.c-video__icon::before { + color: ${white} !important; +} + +================================ + +bloomberg.com + +INVERT +.navi-bar__button-icon +.navi-sections__item--LiveNow::before +.navi-sections__link--current::after + +CSS +.navi { + border-color: var(--darkreader-border--color-black) !important; +} + +================================ + +blueberryroasters.pl + +INVERT +div#logo + +================================ + +bluemic.com + +INVERT +.blue-logo + +================================ + +boardgamegeek.com + +CSS +.legacy button, +.legacy input, +.legacy optgroup, +.legacy select, +.legacy textarea{ + color: var(--darkreader-neutral-text) !important; +} + +================================ + +bol.com + +CSS +.skeleton-image[loaded] .skeleton-image__img, +.subcategory-entrances .image-card__image img, +.day-deal__image .img { + mix-blend-mode: normal !important; +} + +================================ + +bonfire.com + +INVERT +.sw-Logo + +================================ + +book.douban.com + +IGNORE IMAGE ANALYSIS +.bigstar50 +.bigstar45 +.bigstar40 +.bigstar35 +.bigstar30 +.bigstar25 +.bigstar20 +.bigstar15 +.bigstar10 +.bigstar05 +.bigstar00 +.allstar50 +.allstar45 +.allstar40 +.allstar35 +.allstar30 +.allstar25 +.allstar20 +.allstar15 +.allstar10 +.allstar05 +.allstar00 +.rating +.starb +.collectors + +================================ + +booking.com + +INVERT +.bui-calendar__control +.-iconset-close +.-iconset-navarrow_left +.-iconset-navarrow_right +.sort_more_options__button +.mb-ico +.-iconset-review_great +.-iconset-review_poor +.-iconset-chat_bubbles +.location_section_icon +.hp-date-picker-icon +.-streamline-info_sign +.-streamline-person +.-streamline-chat_bubbles +.hp-policies-calendar-icon +.-iconset-moon_crescent + +================================ + +books.google.* + +INVERT +.jfk-button-img + +================================ + +boredpanda.com + +INVERT +.logotype + +================================ + +boringcompany.com + +CSS +.tweak-overlay-parallax-enabled .Parallax-item { + z-index: 1 !important; +} + +================================ + +bostonacoustics.com + +INVERT +img[alt="logo"] + +================================ + +bowerswilkins.com + +INVERT +.logo + +================================ + +boxberry.ru + +INVERT +.slider__image +img[src$="cancel.png"] +.box_img_block +img[src$="Vector.png"] +ymaps[class$="ground-pane"] +ymaps[class$="svg-icon-content"] > ymaps + +================================ + +bpmn.io + +IGNORE INLINE STYLE +.djs-visual > *:not(text:not(rect + text)) + +================================ + +br.de + +CSS +article h4, article h3, article p, article .css-lip0i6, article h5, .asso-gtm, .css-18ckx31 { + color: ${#323232} !important; +} +article, article section, article footer, .css-1fzo8jw, .css-efdc07, article .css-fhbsai, main h3, section.css-3copat section { + background-color: ${white} !important; +} + +================================ + +brainly.com + +INVERT +.brn-rich-content > p > img + +================================ + +brainly.pl + +INVERT +[id^="TexFormula"] +div.brn-qpage-next-answer-box__content > div > div > div img:not(.brn-qpage-next-attachments-viewer-image-preview__image) + +================================ + +brave.com + +CSS +section + img { + display: none !important; +} + +================================ + +breadfinancial.com + +INVERT +.header-wrapper__logo + +================================ + +breitbart.com + +INVERT +#FootW #FWI p .parler + +================================ + +brightspace.avans.nl + +CSS +:root { + --darkreader-bg--d2l-dropdown-background-color: #1D1F20; +} + +================================ + +brightspace.rug.nl + +CSS +:root { + --d2l-menu-background-color: var(--darkreader-neutral-background) !important; + --d2l-dropdown-background-color: var(--darkreader-neutral-background) !important; + --darkreader-bg--d2l-dropdown-background-color: var(--darkreader-neutral-background) !important; + --darkreader-bg--d2l-menu-background-color-hover: var(--darkreader-selection-background) !important; + --darkreader-border--d2l-menu-border-color: var(--d2l-color-tungsten) !important; +} +d2l-card { + background-color: var(--darkreader-neutral-background) !important; + color: var(--darkreader-neutral-text) !important; + border-color: var(--d2l-color-tungsten) !important; +} +.d2l-msg-container { + border: none !important; +} + +================================ + +brilliant.org + +INVERT +[class*="b-sprite-landing"] +[class*="b-sprite-publishers"] +.logo + +================================ + +broadcom.com + +INVERT +#header .navBrand .navbar-brand + +================================ + +browserleaks.com + +CSS +body { + background-image: none !important; +} + +================================ + +bsi.bund.de + +INVERT +.c-branding__logo + +CSS +.c-intro { + z-index: 0 !important; +} + +================================ + +buffer.com + +IGNORE INLINE STYLE +div[class^="style__LogoWrapper"] * + +================================ + +bugreplay.com + +INVERT +.br-logo + +================================ + +bugs.chromium.org + +INVERT +.project-logo +.anchor +.menu + +CSS +:root { + --darkreader-fix--border: 1px solid ${#ccc} !important; +} +button[type="submit"] + mr-dropdown { + border-right: var(--darkreader-fix--border) !important; +} +:host { + --main-color: rgba(232, 230, 227, 0.87) !important; + --can-bg: #1c1c1c !important; + --mr-issue-bg: #121c14 !important; + --mr-search-bar-border: 1px solid var(--darkreader-bg--chops-gray-400) !important; + --chops-choice-bg: ${#eceff1} !important; + --chops-table-header-bg: ${#f1f3f4} !important; + --chops-card-details-bg: var(--darkreader-neutral-background) !important; + --chops-card-heading-bg: var(--darkreader-neutral-background) !important; + --chops-toggle-fix: rgba(255, 255, 255, 0.25) !important; +} +mr-header, mr-issue-header { + border-bottom: var(--darkreader-fix--border) !important; +} +.metadata-container { + border-right: var(--darkreader-fix--border) !important; +} +mr-issue-header, mr-issue-metadata { + background: var(--mr-issue-bg) !important; +} +mr-header, thead, .comment-header { + background: var(--chops-card-details-bg) !important; +} +mr-cue { + background: var(--darkreader-bg--chops-notice-bubble-bg) !important; + border: var(--darkreader-border--chops-notice-border) !important; +} +.byline { + color: var(--main-color) !important; +} +.select-container, .select-container optgroup { + color: var(--main-color) !important; + background: var(--can-bg) !important; +} +input#searchq, input#searchq + button, [label="Search options"] { + background: transparent !important; +} +.select-container, input#searchq, input#searchq + button, [label="Search options"] { + border-top: var(--darkreader-fix--border) !important; + border-bottom: var(--darkreader-fix--border) !important; +} +.select-container { + border-left: var(--darkreader-fix--border) !important; + border-right: var(--darkreader-fix--border) !important; +} +label[for="checkbox"] { + border: var(--darkreader-fix--border) !important; +} +input[type="checkbox"]:checked + label { + background: var(--chops-toggle-fix) !important; +} +.menu { + box-shadow: none !important; +} + +================================ + +bugs.mojang.com + +INVERT +#logo + +================================ + +bugs.python.org + +INVERT +img[title="has PR"] +img[title="GitHub"] + +================================ + +build-electronic-circuits.com + +INVERT +.tutorial-intro +.tutorial-intro > * + +CSS +.page-todo-list { + background-color: rgb(109, 85, 9) !important; +} + +================================ + +bulbagarden.net + +CSS +body { + background-image: none !important; +} + +================================ + +bulk.com + +INVERT +.swatch-attribute.bp_size .swatch-option::before + +CSS +.swatch-attribute.bp_size .swatch-option.selected::after { + filter: none !important; +} + +================================ + +bulldogjob.pl + +INVERT +img[alt~="Bulldogjob"] +img[src="/bulldog.guide.svg"] +img[src="/bulldog.tte.icon.svg"] + +================================ + +bulldogjob.pl/proxied/job-offers + +IGNORE IMAGE ANALYSIS +* + +================================ + +burmester.de + +INVERT +.header-logo + +================================ + +burnaware.com + +INVERT +img[alt="Burnaware"] + +================================ + +businessinsider.com +businessinsider.com.au +businessinsider.com.pl +businessinsider.co.za +businessinsider.es +businessinsider.jp +businessinsider.mx +insider.com +it.businessinsider.com + +INVERT +.account-text-not-logged-in +.article-share_buttons +.brand +.brands-logo +.drawer-heading.headline-bold +.f-footer-logo +.f-header-logo +.f-header-editionLabel +.footer_logo-bi +.footer_social-links +.header-logo +.ins-drawer-button-area +.ins-drawer-vertical-link +.logo +.logo-primary +.logo-pair-wrapper +.masthead-icon +.menu-search-icon +.menu-lang-icon +.navSocial-item +.navbar-brand +.net-social +.network-toggle +.new-menu-logo +.p-post-contentPrimeEntryPrice +.search-btn +.site-logo +.social-container +.social-icons > .social +.socialmedia-icon-list +.verticals-listitem-label +a[title="Business Insider España"] +a[id="menu-hamburger-button"] +a[href="/szukaj"] +button[class*="drawer-dropdown-button"] +button[class="unbutton"] > img +div[class*="footer__LogoWrapper"] +div[class*="footer__SocialWrapper"] +div[class*="header__Wrapper"] +section[class*="brands-social"] + +================================ + +businesswire.com + +INVERT +body > header div:first-child + +CSS +#bw-home { + background-image: none !important; +} + +================================ + +buzzsprout.com + +INVERT +.icon_edit +.icon_stats +.icon_share + +================================ + +c60.la.coocan.jp + +CSS +body { + background-image: none !important; +} + +================================ + +caddy.community + +INVERT +.logo-big + +================================ + +caddyserver.com + +INVERT +#logo +#zerossl-logo +#footer-logo + +CSS +.hero { + background-image: none !important; +} + +================================ + +cadence.com + +INVERT +.logo + +================================ + +caf.fr + +CSS +#theme-contenu-cnaf .row[class*="conteneur-"][class*="-cnaf"] > [class*="col-"], +#theme-contenu-menu-background-cnaf { + background-image: none !important; +} + +================================ + +caiyunapp.com + +INVERT +#icon_current +#logo-name[src="/imgs/logo/logo-website.png"] +#map_canvas + +================================ + +caldigit.com + +CSS +.elementor-widget-heading .elementor-heading-title[class*="elementor-size-"] > a { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +calendar.google.com + +INVERT +div[style*="gm_add_black"] + +CSS +div[role="checkbox"] > div > div > div { + border: 1px solid ${black} !important; +} +div[role="dialog"] div[role="slider"][data-saturation] div:nth-child(2) { + background-image: linear-gradient(to right,#fff 0%,rgba(255,255,255,0) 100%) !important; +} + +IGNORE INLINE STYLE +div[role="checkbox"] +div[role="dialog"] div[role="slider"] +div[role="dialog"] div[role="slider"] div[style] +div[role="dialog"] div[role="button"][data-contrast] + +================================ + +calibre-ebook.com + +IGNORE IMAGE ANALYSIS +.tooltip +#content-wrapper + +================================ + +calvinklein.us + +INVERT +.star:not(.star-active) +.star-half + +================================ + +canakit.com + +INVERT +#homePageIcon + +================================ + +candidates.ibo.org + +INVERT +img#ibLogo + +================================ + +canva.com + +INVERT +#__next > div > section > div[style^="background-color"] +img[src*="category-public.canva.com/icons/"] + +CSS +._8aslVA svg path { + fill: ${black} !important; +} + +================================ + +canvas.*.edu + +INVERT +.file_download_btn + +================================ + +canvas.usask.ca + +CSS +#questions .text img { + background-color: currentColor !important; +} + +================================ + +carmax.com + +CSS +.recall__placeholder, +.vehicle-history__placeholder { + background-color: ${yellow} !important; +} +#recall .recall__header *, +#recall .recall--link span { + color: #2a343d !important; +} +#recall svg, +.vehicle-history__placeholder .vehicle-history a svg { + fill: #053361 !important; +} +#recall a, +.vehicle-history__placeholder .vehicle-history a { + color: #004487 !important; +} + +================================ + +castbox.fm + +INVERT +.nav-item.right.msg +.nav-item.right.upload +.nav-item.right.search +.userNav-img[src="https://s3.castbox.fm/webstatic/images/userIcon.06c408dc.png"] +.heart +.playbackRate.timing.icon + +================================ + +castos.com/player/ + +INVERT +.playback__controls +button[class="player-btn__speed"][aria-label="Playback Speed"] +.play-pause-controls + +================================ + +catalog.update.microsoft.com + +CSS +#headerBox, +#searchButtonBox, +#searchGlowBottomBox, +#searchGlowPart4aBox, +#searchGlowPart4bBox, +#searchGlowPart8aBox, +#searchGlowPart8bBox, +#searchGlowTopBox, +.ResultsHeaderTD, +.dialogBody, +.mainBody, +.mainBodyHome, +.tabInactive { + background-image: none !important; +} + +================================ + +cbpp.org + +INVERT +.navbar-brand + +================================ + +cbsnews.com + +CSS +.content__read-more { + color: var(--darkreader-neutral-color) !important; +} + +================================ + +cdaction.pl + +INVERT +a[href="/"] svg +footer > div > svg + +================================ + +cdc.gov + +INVERT +.cdc-logo path[fill="#000"] +img[src="/niosh/images/si-no-left-vp4.png"] + +================================ + +cdimage.ubuntu.com + +INVERT +.p-navigation__logo + +CSS +#main { + background-image: none !important; +} + +================================ + +cdn77.com + +INVERT +a[class^="Nav_logo"] + +================================ + +cdp.contentdelivery.nu + +CSS +body { + background-image: none !important; +} + +================================ + +cdrtools.sourceforge.net + +CSS +body { + background-image: none !important; +} + +================================ + +ceneo.pl + +INVERT +[data-new-icon]::before +.cat-prod-row__product-link::after +.add-to-favorite::after + +================================ + +central.proxyvote.com + +INVERT +.custom-control-label::after + +================================ + +centrum24.pl + +INVERT +#mobile-applications .jumbotron +.headerLogo.bankLogo + +================================ + +centrumxp.pl + +INVERT +.badge-partner +.img-responsive + +================================ + +cfos-emobility.de + +CSS +.navbar { + background-image: none !important; +} + +================================ + +cfos.de + +CSS +div[style*="keyboard-light.jpg"], +div[style*="organizer-light.jpg"], +div[style*="data-center-light.jpg"], +div[style*="speed-dial-light.jpg"] { + background-image: none !important; +} + +================================ + +changkun.de + +CSS +.content h2, h3 { + z-index: 0 !important; +} + +================================ + +chase.com + +INVERT +.single-logo-icon + +CSS +.menu-button-item { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +cheapshark.com + +CSS +.header { + border-top: 10px solid #000 !important; +} + +================================ + +check.spamhaus.org + +INVERT +.gradient-yellow +header .curve +header .logo + +================================ + +checkout.minecraft.net + +IGNORE INLINE STYLE +symbol#esrb [fill="#000"] +symbol#esrb [fill="#fff"] + +================================ + +chem.libretexts.org + +INVERT +.internal + +================================ + +chessprogramming.org + +INVERT +.mw-parser-output div[class^='float'] > a > img:not(.thumbimage):not(.thumbborder) +.mw-wiki-logo + +IGNORE IMAGE ANALYSIS +.mw-wiki-logo + +================================ + +chilkatsoft.com + +CSS +body { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +chinadigitaltimes.net + +INVERT +.show-menu-button span + +CSS +#main-header-wrapper { + background-image: none !important; +} + +================================ + +chinauos.com + +INVERT +.brand + +CSS +.choose { + background-image: none !important; +} + +================================ + +chipotle.com + +INVERT +.banner-title +.banner-subtitle +.banner-legal + +================================ + +christinamin9-ancientromancivilisation.weebly.com + +CSS +.landing-page #main-wrap, +.tall-header-page #main-wrap, +.short-header-page #main-wrap, +.no-header-page #main-wrap { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +chtoes.li + +INVERT +.illustration +.menu-page +.menu-item + +================================ + +churchofjesuschrist.org + +INVERT +svg + +CSS +.container, +#PFmainFooter { + background: var(--darkreader-neutral-background) !important +} + +================================ + +ci.appveyor.com + +CSS +select { + background-image: none !important; +} + +================================ + +cinedrome.ch + +CSS +body { + background-image: none !important; +} + +================================ + +circleci.com/docs + +CSS +body { + background-image: none !important; +} + +================================ + +circt.llvm.org +mlir.llvm.org + +CSS +header { + background: none !important; +} + +================================ + +circuit-diagram.org + +INVERT +.components-list .item .image + +================================ + +cisce.org + +INVERT +.nav-wrapper +hgroup + +================================ + +citilink.ru + +INVERT +div[class$="RatingDetail__progress_active"] + +CSS +.OldPageLayout { + color: var(--darkreader-neutral-text) !important; +} + +IGNORE INLINE STYLE +.Icon + +================================ + +cityam.com + +INVERT +.site-logo__image +.menu-item a:before + +================================ + +citybuzz.pl + +INVERT +img[alt="CityBuzz"] + +================================ + +citymapper.com + +INVERT +#map + +================================ + +classroom.google.com + +INVERT +img[src$="dark_create_class_arrow.svg"] +img[aria-label="YouTube"] +div[role="dialog"] ~ div[role="menu"] > div[role="menuitem"] > div > div:not([style*="background-image"]) + +CSS +div[role="toolbar"] div[role="button"] > div[class*='-']:not([onclick]):not(:link):not(:visited):not([style*="background-image"]):first-child, +div[role="toolbar"] div[role="button"] > div[class*='-']:not([onclick]):not(:link):not(:visited) > :nth-child(2) > div, +div[style="bottom: 0px;"] > div[style^="opacity:"] div[role="button"] > div:not([onclick]):not(:link):not(:visited), +li[guidedhelpid="classworkTopicListGh"]:not(hover) > div { + opacity: 99% !important; +} + +================================ + +cleantechnica.com + +CSS +body { + background-image: none !important; + background-color: #1d1e1f !important; +} + +================================ + +clever.com + +CSS +img[alt="i-Ready icon"], img[alt="Google Meet icon"], img[alt="Google icon"] { + background-color: white !important; +} +.background-container { + z-index: 1 !important; +} + +================================ + +clients.servarica.com + +INVERT +.logo + +================================ + +cloud.databricks.com +pages.databricks.com +*.azuredatabricks.net + +INVERT +.figure +#sparkui-iframe-body #plan-viz-graph svg g.cluster rect +#sparkui-iframe-body #plan-viz-graph svg g.node rect + +CSS +text { + fill: ${black}; +} +.cm-string { + color: rgb(132, 179, 235) !important; +} +.cm-keyword { + color: rgb(232, 121, 172) !important; +} +.cm-variable-2 { + color: rgb(97, 215, 255) !important; +} +li.CodeMirror-hint { + font-family: Source Code Pro, Menlo, monospace; +} +span[role="presentation"] { + color: ${black} !important; +} +.CodeMirror-cursor { + border-left-color: ${black} !important; +} +.ansiout { + color: ${rgb(85, 85, 85)} !important; +} +.rm-modal { + background: var(--darkreader-neutral-background) !important; +} + +================================ + +cloud.google.com + +CSS +code, +pre, +th, +td, +.devsite-top-logo-row-middle, +nav.devsite-tabs-wrapper, +devsite-footer-linkboxes, +devsite-footer-utility { + background-color: var(--darkreader-neutral-background) !important; + color: var(--darkreader-neutral-text) !important; +} + +================================ + +cloudflare.com + +CSS +.cover { + background-image: none !important; +} + +IGNORE INLINE STYLE +.footer-bottom-row-margin > div > a > svg > path + +================================ + +cloudhostnews.com + +INVERT +.site-title + +================================ + +cloudinfrastructuremap.com + +INVERT +canvas.mapboxgl-canvas + +================================ + +cloudlinux.com + +INVERT +img.mega-menu-logo + +================================ + +cnbc.com + +INVERT +.RenderKeyPoints-list li::before +.WatchLiveRightRail-logo + +CSS +div[class^="FeaturedStories-styles-makeit-background"]::before { + opacity: 0.1 !important; +} + +================================ + +cnki.net + +INVERT +.hello-yx-box +.klogin_header_Logo +.search-main > .input-box > .search-btn +.Logo + +CSS +.foot-top { + background-image: none !important; +} +.hello-yx-box { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +cnn.com + +INVERT +[data-test="section-link"] > svg:not(.business-logo-icon) +img.metadata-header__logo + +CSS +#header-nav-container::before { + border-bottom-color: transparent !important; +} + +IGNORE INLINE STYLE +svg.cnn-badge-icon +svg.cnn-badge-icon > rect +svg.politics-logo-icon +svg.business-logo-icon + +================================ + +cobaltstrike.com +cobalt-strike.github.io + +INVERT +.navbar-brand + +================================ + +code.qt.io + +INVERT +td[class="logo"] +select +input + +================================ + +code.visualstudio.com + +CSS +.home.linux .jumbotron .screenshot { + background-image:url("/assets/home/home-screenshot-linux.png"); + padding-bottom:82.65802% +} +@media only screen and (min-width: 1200px) { + .home.linux .jumbotron .screenshot { + background-image:url("/assets/home/home-screenshot-linux-lg.png"); + padding-bottom:68% + } + +================================ + +codeberg.org +codeberg-test.org + +CSS +main header .header-background-image { + filter: brightness(50%) sepia(40%) !important; +} +main header .header-title { + z-index: 1 !important; +} + +================================ + +codecademy.com + +INVERT +.CodeMirror-cursors +.CodeMirror-selected +span[class^="burger"] + +================================ + +codeforces.com + +INVERT +#header > div:first-child img +#userActivityGraph rect[data-items=""] +.delete-resource-link +.action-link img +.non-decorated img[src$="tablesorter-bg.gif"] +.tex-formula + +CSS +.datatable, +.datatable > div, +.roundbox { + border-radius: 6px; +} +.lt, +.rt, +.lb, +.rb, +.ilt, +.irt, +.roundbox-lt, +.roundbox-rt, +.roundbox-lb, +.roundbox-rb { + display: none; +} +.backLava, +.leftLava { + border-radius: 4.5px; +} +.backLava, +.leftLava, +.bottomLava, +.cornerLava { + background: ${#BEBEBE} !important; +} +.sidebar-menu ul li { + border-color: transparent !important; +} +.highlighted-row td, +.highlighted-row th{ + background-color: ${rgb(195, 205, 215)} !important; +} +#footer img[alt="TON"] { + border-radius: 50%; +} + +IGNORE INLINE STYLE +#userActivityGraph rect + +================================ + +codewars.com + +INVERT +.logo + +================================ + +codingame.com/ide + +CSS +.cg-statement .statement-body span.var, +.cg-statement .statement-body var { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +coinbase.com + +CSS +.hjbuvQ, +.kfQbHv { + fill: ${black} !important; +} + +================================ + +coindesk.com + +INVERT +svg[class^="desktop-navigationstyles__StyledLogo"] + +================================ + +color-hex.com + +INVERT +img[src*="logo"] +.bgwhite +.bgwhite > .previewbox + +IGNORE INLINE STYLE +.colordvaline +.colordva +.palettecolordiv + +================================ + +colorhunt.co + +IGNORE INLINE STYLE +.palette > div + +================================ + +colorpicker.me + +IGNORE INLINE STYLE +html +body +button + +================================ + +colors.dopely.top + +INVERT +.footer +.color-selector-icon + +CSS +input.number-slider { + filter: invert(10%) saturate(0%) !important; +} +img[src*="svg"], .title { + filter: invert(50%) !important; +} +.accountDopely__letter, +.editProfile__changeProfilePicture { + filter: saturate(0%) brightness(50%) !important; +} +div[class*="text"], +a[class*="header"], +.navbar-dropdown-item__logo, +.navbar__listItem__button { + filter: saturate(0%) !important; +} + +IGNORE INLINE STYLE +.ExpandPalette * +.toner-colors-container * +.color-picker + +================================ + +comenius.susqu.edu + +CSS +body, +table, +td { + background-image: none !important; +} + +================================ + +comicfury.com + +CSS +#wrapper { + background-color: inherit !important; + padding-bottom: 10px !important; +} +#footer { + margin-top: 0px !important; +} + +================================ + +comixology.com + +INVERT +.comixology-logo +.primary-heading +.heading-content +.try-now +.unlimited-disclaimer + +================================ + +comma.ai + +INVERT +.comma-header-logo +.comma-two-benefit-icon +.comma-landing-reviews-logo + +================================ + +commons.wikimedia.org + +INVERT +.mw-mmv-filepage-buttons .mw-mmv-view-expanded .mw-ui-icon::before +.mw-mmv-filepage-buttons .mw-mmv-view-config .mw-ui-icon::before +.licensetpl td[style^="width"] +img[alt="audio speaker icon"] + +IGNORE IMAGE ANALYSIS +.mw-wiki-logo + +================================ + +commonvoice.mozilla.org + +INVERT +div:not(.logo-container) > .main-logo +.hero-box .fading +.waves +.mars + .screenshot +#help-links img +.button.outline.rounded.hidden-sm-down img +.text-button.contribute-more-button.secondary path + +CSS +.language-select .current { + --white: var(--darkreader-bg--white) !important; +} + +================================ + +commscope.com + +INVERT +.commscope-logo + +================================ + +community.cloudflare.com + +CSS +:root { + --darkreader-text--primary-medium: ${gray} !important; +} + +================================ + +community.notepad-plus-plus.org + +INVERT +.forum-logo + +================================ + +community.ntppool.org + +INVERT +#site-logo + +================================ + +community.progress.com + +CSS +:root { + --lwc-colorContentAreaBackground: var(--darkreader-neutral-background) !important; + --lwc-pageHeaderColorBackground: ${rgb(243, 243, 243)} !important; +} + +================================ + +compass.pressekompass.net + +INVERT +.logo-holder .brand-logo + +IGNORE INLINE STYLE +text + +================================ + +computerhope.com + +INVERT +#text-tool > p > img + +================================ + +confectioneryproduction.com + +INVERT +#mainLogo img + +================================ + +confluence.* + +INVERT +.gliffy-text-with-shape-parent-primary +.gliffy-text-with-shape-parent-secondary +.gliffy-text-with-shape-parent-tertiary +.gliffy-text-with-shape-parent-highlight + +CSS +.geDiagramContainer rect, +.geDiagramContainer path { + filter: brightness(60%); +} + +================================ + +consent.yahoo.com + +INVERT +.consent-wizard-body > .image-container > .image.yahoo + +================================ + +console-openshift-console.* + +CSS +.pf-c-dropdown__menu { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +console.cloud.google.com + +CSS +.cfc-ng2-region .cfc-text-title-3 { + color: var(--darkreader-neutral-text) !important; +} +.cfc-color-text-secondary { + color: ${#333} !important; +} + +================================ + +consumerlab.com + +INVERT +#overlay-toggle > .collapsed +.header-link-home + +CSS +span[style*="background-color: rgb(255, 255, 0)"] { + background-color: #550 !important; +} + +================================ + +contacts.google.com + +INVERT +img[src*="rotate"] + +================================ + +containertoolbx.org + +CSS +body, img, video, iframe { + filter: none !important; +} + +================================ + +convertio.co + +INVERT +.logo svg > :last-child + +================================ + +cookiepedia.co.uk + +INVERT +.main-logo +.footer-logo + +================================ + +coolblue.be +coolblue.nl +hotorangemedia.nl + +IGNORE INLINE STYLE +.header__logo-image > path + +================================ + +coolors.co + +CSS +.generator_color { + color: #fff !important; +} +.generator_color.is-light { + color: #000 !important; +} + +IGNORE INLINE STYLE +#generator * + +================================ + +coopgames.eu + +INVERT +img[alt="Online Co-Op"] +img[alt="Local Co-Op"] +img[title="PS2"] +img[title="PS3"] +img[title="PS4"] +img[title="PSP"] +img[title="PS Vita"] +img[title="DS"] +img[title="3DS"] +img[title="Switch"] + +================================ + +copitosystem.com + +CSS +body { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +corriere.it + +INVERT +.footer__content div div img + +================================ + +corsair.com + +INVERT +img.desktop +img[src="/_ui/responsive/common/images/icon_cart_empty.png"] +a.cart-close +input#search-btn + +================================ + +costplusdrugs.com + +INVERT +img[src$="MCCP-wordmark-denim.png"] + +================================ + +courses.fit.cvut.cz + +CSS +body { + color: #909090; +} +.App.in-search { + background-color: #212121 !important; +} +.UserMenu .user-initials { + background-color: #616161 !important; +} +.CoursesItem .column-info > a:hover { + color: #58c1ffba; +} +header { + background-color: #212121 !important; +} +pre { + color: #a8a6ab +} +.header { + background: none; + border-bottom: 1px solid #676767; +} +main img { + opacity: 0.8; +} +a { + color: #58c1ffba +} + +================================ + +covims.org + +INVERT +img[alt="Covims Logo.png"] + +================================ + +cowkrakowie.pl + +INVERT +.logo +.nav-logo + +================================ + +cplusplus.com + +CSS +#I_mid, #I_top { + background-image: none; +} +img[src$=".png"] { + background-color: white; +} + +================================ + +cppm3144.itdhosting.de + +CSS +.ppm_button { + background: ${white} !important; +} +.tableContent img { + background-image: url("https://cppm3144.itdhosting.de/niku/ui/uitk/images/odf.png") !important; +} + +================================ + +cqksy.cn + +INVERT +td[background="image/Index_QI_CenterBar.gif"] + +CSS +table { + background-color: var(--darkreader-neutral-background) !important; +} +td[background="image/Index_QI_CenterBar.gif"], +td[background="image/Index_QI_CenterBar.gif"] a { + color: ${white} !important; +} + +================================ + +creative.com + +INVERT +div.small-logo img.creative-logo +body:not(body[class^="storepage"]) div#all img.creative-logo +.sb-upgrade > h3 +.sb-upgrade > p +.tws-series > h3 +.tws-series > p + +CSS +.input::placeholder { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +creditkarma.com + +INVERT +.navi-logo + +================================ + +crowdin.com + +INVERT +.crowdin-navbar__logo +svg.logo-icon-projects +.file_type.file_folder.file_branch +#master-loader > .master-loader-logo +#master-loader-progress.bar + +================================ + +crunchbase.com + +INVERT +.identifier-nav +.tab-label + +CSS +.mat-tab-label-active { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +crutchfield.com + +INVERT +.logo-module svg + +================================ + +cryptostorm.is + +INVERT +img[src*="lock.png"] +img[src*="storm.png"] + +CSS +body > div { + background-image: none !important; +} + +================================ + +cs61a.org + +CSS +table#calendar td { + border-color: var(--darkreader-neutral-background) !important; +} + +================================ + +css-tricks.com + +CSS +.article-article { + background: ${white} !important; +} + +================================ + +cubawiki.com.ar + +INVERT +.mwe-math-fallback-image-inline +.mwe-math-fallback-image-display + +================================ + +curseforge.com + +IGNORE IMAGE ANALYSIS +.e-generic-header + +================================ + +cxp.cengage.com + +INVERT +.owl_item_container img[src*=".gif"] +.ci-feedback img[src*=".gif"] +label img[src*=".gif"] +span.MathJax_SVG g[stroke="black"] + +CSS +.owl_item_container img[src*=".GIF"] { + background-color: ${black}; +} +font[color="white"] { + color: transparent !important; +} +div.tool-container.gradient > .controlButtons { + background-image: none; +} +div.tool-container.gradient { + box-shadow: none; +} + +IGNORE INLINE STYLE +span.MathJax_SVG g + +================================ + +cyberlink.com + +INVERT +.logo_pc + +================================ + +cynkra.com + +INVERT +.btn-outline-dark +.shadow +.navbar-dark .navbar-brand +.cynkra-logo-font + +CSS +.btn-outline-secondary { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +cyprus-mail.com + +INVERT +.custom-logo-link + +================================ + +czasnastopy.pl + +INVERT +.brandinglogo-wrap + +================================ + +czypada.pl + +INVERT +#map + +================================ + +czyztak.pl + +INVERT +img[alt*="Logo"] + +================================ + +d2l.ai + +INVERT +img[src$=".svg"] + +================================ + +daily.afisha.ru + +INVERT +svg[class^="Logo"] +.headline__open +.search-icon +.sprite-search-black-26 +mark + +================================ + +dailydot.com + +INVERT +h1.u-about-pitch + +CSS +svg.main-logo.inline-flex g g[fill="#110133"] { + --darkreader-inline-fill: ${#110133} !important; +} + +================================ + +dailyexpose.uk + +INVERT +.header-image + +================================ + +dailymotion.com + +IGNORE INLINE STYLE +div[class*="logoContainer"] a svg path + +================================ + +dailywritingtips.com + +CSS +blockquote { + z-index: 0 !important; +} + +================================ + +daltonmaag.com + +INVERT +#panel-3 img + +================================ + +danyk.cz + +CSS +body { + background-image: none !important; +} + +================================ + +darcs.net + +INVERT +#header > a > img + +================================ + +darksky.net + +INVERT +.currentLocationButton +.searchButton +span[class^="skycon swip"] +#right-arrow +#left-arrow + +================================ + +dash.cloudflare.com + +INVERT +a[data-testid^="link-homepage"] + +CSS +.monaco-editor-background, .monaco-editor .margin { + background-color: ${rgb(226 229 231)} !important; +} + +================================ + +dashboard.thechurchapp.org + +INVERT +#ember62 + +================================ + +datacamp.com + +CSS +video#vjs_video_3_html5_api.vjs-tech { + transform: translate(0px, 0px) !important; + background-color: rgb(175, 175, 175, 0.5); +} + +================================ + +daum.net + +CSS +.txt_pctop, +.bg_login { + background-image: none !important; +} + +================================ + +dawn.com + +INVERT +img[alt="Dawn Logo"] + +================================ + +deadpixeltest.org + +CSS +html { + background-color: transparent !important; +} + +IGNORE INLINE STYLE +body + +================================ + +debian.org + +INVERT +.community img +#logo +.os-dl-btn +.os-img-container img + +CSS +body { + background-image: none !important; +} + +IGNORE IMAGE ANALYSIS +#splash h1 + +================================ + +debijbel.nl + +INVERT +.siteLogo +.filter-item__link > img + +================================ + +decathlon.in + +CSS +img { + mix-blend-mode: normal !important; +} + +================================ + +decathlon.pl + +INVERT +.dkt_logo +.benefit-icon + +IGNORE IMAGE ANALYSIS +* + +================================ + +deccanchronicle.com + +INVERT +img[src$="logo.png"] + +================================ + +decisionproblem.com + +INVERT +.qChip + +CSS +#giftShopDiv { + color: ${white} !important; +} +.projectButton:disabled { + color: ${gray} !important; +} + +================================ + +deepl.com + +INVERT +.dl_translator_link_container > img +.dl_ad_pro__features_item::before +.dl_logo_text +img[class^="productNavigation-module--logoText"] +img#languageSelectorIcon +footer > div > div > div > div > a > img[alt="DeepL"] +div[class^="socialMediaLinks"] > a +div[class^="pageFooterV2-module--socialMediaLinks"] > a + +================================ + +deeplearningbook.org + +INVERT +.opened > img[src] + +CSS +body { + background-color: transparent !important; +} +#page-container { + background-image: none !important; +} + +================================ + +deezer.com + +CSS +.slider-track .gradient-default { + background-image: linear-gradient(1deg, var(--color-dark-grey-800) 13%, var(--color-white)); +} + +================================ + +dell.com + +INVERT +.breadcrumbs +.cat-banner-text +.cfsf-ba-content-wrap +.hpg-cat-item-wrap svg + +================================ + +delphipraxis.net + +CSS +.ipsNavBar_secondary { + background-color: var(--darkreader-neutral-background) !important; +} +.ipsNavBar_secondary::before { + border-bottom-color: var(--darkreader-neutral-background) !important; +} + +================================ + +dennisbareis.com + +CSS +body { + background-image: none !important; +} + +================================ + +deno.land + +INVERT +img[src="/logo.svg"] + +================================ + +designobserver.com + +INVERT +.dologo + +================================ + +deskmodder.de + +CSS +#secondary { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +desmos.com + +INVERT +.dcg-grapher + +CSS +.dcg-container.dcg-inverted-colors { + filter: hue-rotate(180deg) !important; +} + +================================ + +detexify.kirelabs.org + +INVERT +.symbol + +================================ + +dev.azure.com + +CSS +:root { + --nav-header-background: var(--darkreader-neutral-background) !important; +} + +================================ + +dev.dota2.com + +CSS +.navtabs li a.navtab:hover, +.navtabs li.selected a.navtab { + color: black !important; +} + +================================ + +dev.to + +INVERT +img[src$=".svg"] +path[d^="M19.099 23.508c0"] + +CSS +body, h1, h2, h3, +h4, h5, h6, a, +.content-classification-text { + color: #e8e6e3 !important; +} + +================================ + +developer.android.com +developer.android.google.cn +tensorflow.org +quantumai.google +cloud.google.com + +INVERT +.devsite-site-logo + +CSS +:root { + --devsite-header-color-upper: var(--darkreader-neutral-background); + --devsite-footer-background: var(--darkreader-neutral-background); + --devsite-table-heading-background: var(--darkreader-neutral-background); + --devsite-search-form-background-active: rgba(255, 255, 255, 0.05); + --devsite-searchbox-inactive: rgba(255, 255, 255, 0.05); + --devsite-searchbox-hover: rgba(255, 255, 255, 0.1); + --devsite-searchbox-active: rgba(255, 255, 255, 0.05); + --devsite-inline-code-background: ${#f1f3f4} +} +devsite-search .devsite-searchbox::before { + background-color: unset; +} +.devsite-wrapper, +button { + background-color: inherit; +} +code { + background-color: rgba(255, 255, 255, 0.05); +} +.devsite-breadcrumb-list { + background: none !important; +} + +================================ + +developer.apple.com + +INVERT +.icon + +CSS +.disabled { + color: ${gray} !important; +} +pre, +.code-listing { + background-color: var(--darkreader-neutral-background) !important; +} + +IGNORE IMAGE ANALYSIS +.screen-hero +.screen-fonts +.screen-tabs +.screen-completion +.screen-swiftui + +================================ + +developer.chrome.com + +CSS +.featured-card__title-bar > svg, +.card-title-bar > svg, +.navigation-rail__icon > svg { + fill: ${black} !important; +} +.search-box__btn > svg { + fill: ${white} !important; +} + +================================ + +developer.mozilla.org + +INVERT +.copy-icon +.bc-browsers > th > span::before +.bc-platforms > th::before +a.external::after +.bc-has-history > .bc-history-link +.ic-footnote +.ic-non-standard +.breadcrumbs-container li .breadcrumb-penultimate::after +.breadcrumbs-container li .breadcrumb::after +ul.main-menu .top-level-entry::before +span.icon + +CSS +.logo-text, +.search-results-list mark { + color: var(--darkreader-neutral-text) !important; +} + +IGNORE IMAGE ANALYSIS +.main-page-content .code-example .copy-icon + +================================ + +developer.roblox.com + +INVERT +.logo + +================================ + +developer.salesforce.com + +CSS +.slds-tabs_card { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +developers.arcgis.com + +CSS +a { + text-shadow: none !important; +} + +================================ + +developers.google.com + +INVERT +.devsite-google-wordmark + +CSS +:root { + --devsite-header-color-upper: var(--darkreader-neutral-background) !important; + --devsite-searchbox-inactive: var(--darkreader-neutral-background) !important; + --devsite-button-background: var(--darkreader-neutral-background) !important; + --devsite-footer-background: var(--darkreader-neutral-background) !important; + --devsite-breadcrumb-list-background: var(--darkreader-neutral-background) !important; + --devsite-background-3: ${rgb(198, 198, 198)} !important; +} +button, +a.button, +.devsite-landing-row-item { + border-color: var(--darkreader-border--devsite-select-border) !important; +} +.pre-style, +code, +pre { + background: var(--darkreader-neutral-background) !important; +} +.devsite-table-wrapper > table > thead > tr > th { + color: var(--darkreader-neutral-text) !important; + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +devuan.org + +INVERT +#logo + +================================ + +dexie.org + +INVERT +a[href="Download"] +img[src$="logo-dexie-black.svg"] + +================================ + +dhmo.org + +CSS +body { + background-image: none !important; +} + +================================ + +di.com.pl + +INVERT +img[alt*="Dziennik Internautów"] + +CSS +div#naglowek { + background-image: none !important; +} + +================================ + +diamondsdirect.com + +INVERT +[alt="Diamonds Direct Logo"] + +================================ + +dianping.com + +INVERT +.logo + +================================ + +dicetower.com + +CSS +body { + background-image: none !important; +} + +================================ + +dict.cc + +CSS +#langbar { + background-image: none !important; +} + +================================ + +dictionary.cambridge.org + +INVERT +.cb.hao.lpt-2 +.cb.hv-2.lmr-10 + +================================ + +differencebetween.net + +CSS +body, +#page-wrapper { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +digg.com + +CSS +.digg-story__title-link { + color: ${black} !important; +} +.digg-story__description { + color: ${black} !important; +} + +================================ + +disconnect.me + +INVERT +img[src*="vpnCoverageMap"] +img[alt="Toolbar button"] +#press-strip > div > img + +CSS +#accordion { + background-image: none !important; +} + +================================ + +discord.com + +INVERT +div[class^="botPermissions"] > ul > li > div > div > span::after + +CSS +div[class^="pill"][class*="wrapper"] > span[class^="item"], +div[class*="modeUnread"] > div[class^="unread"] { + background-color: var(--darkreader-neutral-text) !important; +} +nav[aria-label="Servers sidebar"] foreignObject { + mask: none !important; + border-radius: 100% !important; + transition: all .5s; +} +nav[aria-label="Servers sidebar"] foreignObject:hover { + border-radius: 30% !important; +} +path[class^="wavePath"] { + fill: ${rgb(226, 224, 220)} !important; +} +:root { + --page-max-width: 1260px !important; + --num-grid-columns: 4 !important; + --page-gutter: 24px !important; + --section-spacing: 56px !important; +} +@media screen and (min-width: 768px) { + :root { + --num-grid-columns: 8 !important; + --page-gutter: 40px !important; + --section-spacing: 80px !important; + } +} +@media screen and (min-width: 1024px) { + :root { + --num-grid-columns: 12 !important; + --section-spacing: 120px !important; + } +} + +================================ + +discourse.haskell.org + +INVERT +.logo-big + +================================ + +discover.com + +INVERT +img#flag +i.icon-help +i.icon-search +i.lock-icon +div.welcome-text-wrapper +div.slide--img.credit-card +div.slide--img.personal-loan +div.slide--img.home-loan + +================================ + +discover.forem.com + +INVERT +body > div:nth-child(1) > svg:nth-child(1) + +================================ + +discuss.pixls.us + +INVERT +#site-logo.logo-big + +================================ + +disk.yandex.* +docviewer.yandex.* + +INVERT +.logo + +================================ + +disney.* + +INVERT +.disney-img + +================================ + +distrowatch.com + +INVERT +img[src="images/cpxtu/dwbanner.png"] + +CSS +input, +.NavMenu, +select, +td:not(.NewsDate):not(.NewsHeadline) { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +ditu.baidu.com +map.baidu.com +maps.baidu.com + +INVERT +#activity-banner-panel +.BMap_bubble_pop +.BMap_contextMenu +.BMap_cpyCtrl +.BMap_scaleBarBG +.BMap_scaleTxt +.BMap_simple_bubble_pop +.BMap_stdMpZoom +.BMapLabel +#bt_trafficCtrl +.cbtlinetop +.cbtToolBar +.icon +#iw_tool_icon +.jump_back +#map-operate +#maps +.message-banner +#message-panel +.more-device +#nearby-searchbox-hint +#nearby-searchbox-hint-center +.route-button +.tang-pass-qrcode-title +#userSignPanel + +CSS +#newuilogo { + filter: brightness(80%); +} +#sole-input { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +djrankings.org + +CSS +body, +li a, +.moduleContentInner { + background-image: none !important; +} + +================================ + +dlagentlemana.pl + +INVERT +div.f-grid-3.logo-column > a > img +div.opineo-side-slider-widget > button +.logo-bar img + +================================ + +dle.rae.es + +CSS +.bloque_publi DE, +.spr_fundacionlacaixa, +.spr_dle90x110, +.spr_logo-enclave-rae, +.spr_google-play-badge-100x39, +.spr_badge-appstore-lrg-96x28, +.spr_edtri, +.spr_ay, +.spr_cita, +.spr_unidrae, +.spr_consultas, +.spr_pnwe2, +img[src="/images/logos/ASALE2.png"], +img[src="/images/logos/rae.png"], +img[src="/images/LibroDeEstilo_300.jpg"], +img[src="/app/doc/es/img/dle.jpg"], +a[href="https://dej.rae.es"] > img.img-responsive.b-lazy.b-loaded, +img[src="/images/logos/BCRAEl.jpg"] { + filter: invert(93.7%) hue-rotate(180deg) contrast(90.6%) !important +} + +================================ + +dmit.io + +INVERT +.logo + +================================ + +dnd.su + +CSS +input, +select, +textarea, +.input-cast_time, +.input-style, +.input-select, +.button, +button:not(.lg-icon), +.workshop__checkbox .workshop__label::before, +.card-type, +.paper-1, +.desc .additionalInfo, +.subsection .additionalInfo, +.trumbowyg-editor .additionalInfo, +.social-menu ul, +#ya-site-form0 .ya-site-form__form .ya-site-form__input-text, +#ya-site-form0 .ya-site-form__submit { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +dnd5e.wikidot.com + +CSS +.feature { + background-color: var(--darkreader-neutral-background) !important; +} +.feature.offcolor { + background-color: ${rgb(255, 250, 180)} !important; +} +th { + background-color: ${rgb(230, 216, 170)} !important; +} + +================================ + +dndbeyond.com + +CSS +.mon-stat-block, +.mon-stat-block::before, +.mon-stat-block::after, +body { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} +.read-aloud-text, +.more-info::after, +.details-container::after { + border-image: none !important; +} +::selection { + background-color: var(--darkreader-selection-background) !important; +} + +================================ + +dnscrypt.pl + +INVERT +.logo + +================================ + +dnsleaktest.com + +INVERT +img[src$="logo.png"] +img[src$="what-is-a-dns-leak.png"] +img[src$="transparent-dns-proxy.png"] + +================================ + +dnslytics.com + +INVERT +img[src*="logo.png"] + +================================ + +doba.pl + +INVERT +.social +img[src*="logo.png"] +img[src*="/img/powiaty/"] + +================================ + +dobreprogramy.pl + +CSS +header a[href="/"] svg { + fill: #fff !important; +} + +================================ + +doc.qt.io + +CSS +:root { + --content-bg-color: var(--darkreader-neutral-background) !important; +} + +================================ + +docs.codacy.com + +INVERT +div.footer-logo > img[alt="Codacy"] + +================================ + +docs.expo.dev + +IGNORE INLINE STYLE +tr svg * + +================================ + +docs.google.com + +INVERT +.docs-icon +.goog-flat-menu-button-caption +.punch-filmstrip-controls-icon +#docs-editor canvas +.docs-homescreen-icon +.kix-equation-toolbar-icon +.kix-equation-toolbar-palette-icon +.cell-input +.formula-content +.docs-instant-button-bubble-icon-container +.docs-gm .docs-dialog .modal-dialog-title-close::after +.docs-preview-palette-item +.goog-menuitem-checkbox +.goog-dimension-picker-unhighlighted +.goog-dimension-picker-highlighted +#docs-star +.rs-role-icon +.toggle-link-icon +.link-management-drop-down-icon +.vs-icon +.vpc-icon +.docs-analytics-img +.share-butter-copy-icon +.doc-previews-indicator-popover .docs-link-bubble-mime-icon +img[src$="googlelogo_dark_clr_74x24px.svg"] +.exportUnderline +.freebirdMaterialIconIconEl +.quantumWizTogglePapercheckboxCheckMark +#docs-titlebar-share-client-button .scb-button-icon:not([class*="white"]) +body[itemtype*="PresentationObject"] #docs-titlebar-share-client-button .scb-button-icon +g.punch-filmstrip-indicator > image +.docs-gm .docos-icon-overflow-three-dots-size + +CSS +.docs-preview-palette-item { + border: transparent !important +} +.cell-input { + background-color: ${black} !important; + color: ${white} !important; +} +.cell-input > span, .cell-input > font { + --darkreader-inline-color: ${white} !important; +} +.kix-cursor-caret { + border-color: ${black} !important; +} +.kix-selection-overlay { + background-color: var(--darkreader-selection-background) !important; + border: var(--darkreader-selection-background) !important; +} +.ia-invite-controls-area { + background-color: transparent !important +} +.docs-gm .docs-revisions-switch .apps-ui-material-slide-toggle-thumb { + background-color: rgb(43, 46, 48) !important; +} +.docs-gm .docs-revisions-switch.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-thumb { + background-color: rgb(9, 64, 155) !important; +} +.docs-text-ui-cursor-blink { + fill: ${black} !important; +} +.docs-title-input-label:not([style*="pointer-events: auto"]) > #docs-title-input-label-inner { + visibility: hidden !important; +} +input.docs-title-input { + color: var(--darkreader-neutral-text) !important; + background-color: var(--darkreader-neutral-background) !important; +} +.sketchy-text-background + g g rect { + fill: var(--darkreader-selection-background) !important; +} + +================================ + +docs.google.com/picker + +INVERT +#doclist div > div + div div[style="user-select: none;"]:not([role="tab"]):not([role="menuitemradio"]):not([role^="menu"]) > div:not([aria-pressed]):not([role="tab"]):not([class$="highlightsgrid"]):first-of-type +#doclist div > div + div div[role="menu"] div[role="menuitem"][style="user-select: none;"] div[aria-label] div[data-tooltip] + div +#doclist div > div + div label + input + div[style] +img[src$="search-black.png"] + +================================ + +docs.manim.community + +CSS +.toc-drawer { + background: var(--darkreader-bg--color-background-primary); +} +.sidebar-search-container { + background: var(--darkreader-bg--color-admonition-background); +} +.sidebar-tree .current > .reference { + background: var(--darkreader-bg--color-admonition-title-background--admonition-todo); +} + +================================ + +docs.sentry.io + +CSS +.document-wrapper { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +docs.soliditylang.org + +CSS +.wy-body-for-nav { + background-color: unset; +} + +================================ + +dominos.* + +INVERT +.card--overlay > .card__header .card--overlay__close + +CSS +svg.trackerbarimage:not(.complete svg.trackerbarimage) { + fill: var(--darkreader-neutral-background) !important; +} +.stage:not(.complete) > .title > span { + color: var(--darkreader-neutral-background) !important; +} +.tracker-page-container div.tracker-module.pizza-tracker .tracker-container > div.stage.complete [class^="chevron-"] { + fill: #689d30 !important; +} +.tracker-page-container div.tracker-module.pizza-tracker .tracker-container > div.stage [class^="chevron"] { + stroke: var(--darkreader-neutral-text) !important; +} + +================================ + +donald.pl + +INVERT +a[href="/"] + +================================ + +doodle.com + +INVERT +svg.d-checkmark .d-background + +================================ + +doordash.com + +INVERT +input[kind="RADIO"][id^="Toggle"]::after + +================================ + +dotaunderlords.gamepedia.com +dota2.gamepedia.com +dota2.fandom.com + +CSS +#right-navigation { + background-image: none !important; +} + +IGNORE IMAGE ANALYSIS +#left-navigation + +================================ + +dou.ua + +CSS +.g-right-shadowed, +.img::before, .img::after { + background-image: none !important; +} + +================================ + +downloads.khinsider.com + +CSS +body { + background: none !important; +} +#faux { + background-image: none !important; +} + +================================ + +dribbble.com + +INVERT +.site-nav-desktop-logo + +================================ + +drive.google.com + +INVERT +img[src$="google_gsuite"] +div[role="menuitem"] svg +div[role="dialog"][style^="width: 350px;"] div[role="button"][tabindex="0"] +div[role="dialog"] ~ div[role="menu"] > div[role="menuitem"] > div > div:not([style*="background-image"]) +img[src$="type/audio/mp3"] +div[role="listitem"] > div > div > div > svg[fill="#000000"] > path +div[role="menu"] > div > div[role="menuitem"] > div > div > div +div[data-label="nd"] > div > div > svg > path[fill="#000000"] +div[role="document"] > div[role="button"] .a-b-c +div > svg > circle[fill="white"] +img[src*="empty_state_trash"] + +CSS +span[data-type="spelling"] { + mix-blend-mode: normal !important; +} +div[role="menu"] div[role="menuitem"][class*=" "] > div > div > div, +div[role="button"][aria-disabled="true"] > div { + filter: invert(50%) !important; +} +#request-access-icon { + filter: invert(93.7%) hue-rotate(180deg) contrast(90.6%) !important +} +:root { + --dt-secondary-container: ${#f1f3f4} !important; +} +button[guidedhelpid="new_menu_button"] { + background-color: ${#dbdde0} !important; +} +div[data-target="autopurgebanner"] > section { + background: ${#dbdde0} !important; +} +div[role="toolbar"] div[role="button"], +div[role="toolbar"] div[role="presentation"][data-active="true"] > div[role="presentation"] { + mix-blend-mode: normal !important; +} + +IGNORE INLINE STYLE +div[role="presentation"] svg +div[data-label="nd"] > div > div > svg > path[fill="#000000"] + +================================ + +drive.google.com/file + +INVERT +div[role="menu"] > div[role="menuitem"] > div > div > div +div[role="menu"] > div[role="menuitem"] > div > div + +CSS +#request-access-icon { + filter: invert(93.7%) hue-rotate(180deg) contrast(90.6%) !important +} + +================================ + +drive.google.com/picker + +INVERT +div[role="menu"] div[role="menuitem"]:not([class*=" "]) > div > div > div +div[role="button"][tabindex="0"] + +CSS +div[role="menu"] div[role="menuitem"][class*=" "] > div > div > div, +div[role="button"][aria-disabled="true"] > div { + filter: invert(50%) !important; +} + +IGNORE INLINE STYLE +svg[class=""] +svg[class=""] * + +================================ + +droid-life.com + +CSS +.collection-posts__list .preview__picture { + mix-blend-mode: normal !important; +} + +================================ + +dropbox.com + +INVERT +.dl-dropbox +.drops-empty-page-header-image +.restorations-education__df-help__image +.search__view--empty img +.plan-status-section__icon img +.dropbox-logo__type +iframe[class^="previewhtml _previewContent"] +.toggle.toggle-block__toggle.dig-Toggle +.toggle.toggle-block__toggle.dig-Toggle.dig-Toggle--isToggled > span::after +.shared-with-members.audience-box.u-pad-top-xs.u-pad-bottom-s.u-mar-bottom-xs > .c-loader +.hp-card-carousel-dots +.loading-loading > .loading-img + +CSS +.rc-inline-action-bar-container.brws-file-row-inline-action-bar { + background: var(--darkreader-bg--color__core__secondary) !important; +} +svg.dig-GlyphLogo.dig-Waffle-row-logo path[fill="var(--color__glyph__accent)"] { + --darkreader-inline-fill: var(--color__glyph__accent) !important; +} +svg.dig-GlyphLogo.dig-Waffle-row-logo path[fill="var(--color__glyph__primary)"] { + --darkreader-inline-fill: var(--darkreader-text--color__standard__text) !important; +} +.dig-LabelGroup > div > input[aria-checked="false"] { + background-color: var(--darkreader-bg--color__core__secondary) !important; +} +.dig-LabelGroup > div > input[aria-checked="true"] { + background-color: var(--darkreader-text--color__core__secondary) !important; +} + +IGNORE INLINE STYLE +.home__suggest_image path +.selection-preview-pane__icon path +.dig-WordmarkLogo path + +================================ + +drupal.org + +CSS +input[type="image"] { + background: none; +} + +================================ + +dsausa.org + +INVERT +.navbar-toggler-icon + +================================ + +dspguide.com + +CSS +#divPage { + background-image: none !important; +} + +================================ + +dtf.ru + +INVERT +mark + +================================ + +duckduckgo.com + +INVERT +.is-active.js-tw-card.bg-clr--white.tw-card > .tw-card__footer > a.js-tweet-action.tw-card__action.tw-card__link > [src="/assets/common/slider/twitter-like.svg"] +[src="https://duckduckgo.com/assets/icons/thirdparty/wikipedia.svg"] + +CSS +.justify-content-center.align-items-center.flex-lg-column.flex-md-row.card-1.card > .card-body > h3, +.justify-content-center.align-items-center.flex-lg-column.flex-md-row.card-2.card > .card-body > h3, +.justify-content-center.align-items-center.flex-lg-column.flex-md-row.card-3.card > .card-body > h3, +.justify-content-center.align-items-center.flex-lg-column.flex-md-row.card-1.card > .card-body > p, +.justify-content-center.align-items-center.flex-lg-column.flex-md-row.card-2.card > .card-body > p, +.justify-content-center.align-items-center.flex-lg-column.flex-md-row.card-3.card > .card-body > p, +.js-hiring-open-pos.join__btn.mt-5.btn.col-sm-auto.col{ + color: var(--darkreader-neutral-background) !important; +} +.logo_homepage { + background-image: url("https://duckduckgo.com/assets/logo_homepage.alt.v108.svg") !important; +} +.header__logo { + background: no-repeat center url("https://duckduckgo.com/assets/logo_header.alt.v108.svg") !important; +} + +IGNORE INLINE STYLE +#color_picker_container .sample +.zci--color_codes .circle + +================================ + +duo.google.com + +INVERT +.gb_se .gb_ye:not(.gb_Ae) + +================================ + +duolingo.com + +INVERT +.Z392z +._24NNT +[data-test="skill-icon"] + div img + +CSS +button[aria-disabled="true"] { + opacity: 0.3 !important; +} + +IGNORE INLINE STYLE +div[data-test="challenge-translate-prompt"] svg * +div[data-test="challenge challenge-translate"] svg * + +================================ + +dvizhcom.ru + +INVERT +.mobile-header-icon:nth-last-of-type(3) +.mobile-header-icon:nth-last-of-type(2) +.mobile-header-icon:nth-last-of-type(1) + +================================ + +dw.com + +CSS +#bodyMover { + background-image: none !important; +} + +================================ + +dynadot.com + +INVERT +img[data-src="/tc/navbar-logo.png"] +#navigation-shopping-cart + +================================ + +dziennik.pl + +INVERT +img[alt="Dziennik"] + +================================ + +dzienniknaukowy.pl + +INVERT +.top-logo + +================================ + +dziennikprawny.pl + +INVERT +a[href="/"] +.fullba + +CSS +.fullba { + background-image: none !important; +} + +================================ + +e.foundation + +INVERT +img.attachment-full.size-full + +================================ + +ea.com + +INVERT +.left_context .context dl dd.select +.modifyMobilePhoneBtn + +CSS +img[src*="white-bg-ea-bg-global-white"] { + display: none !important; +} +body.origin-com, +.left_context .context { + background-image: none !important; +} +.body_foot .language .select_language .languageText, +.buttonstyle_3 span, +.origin-ux-drop-down-selection > span, +.origin-ux-button-primary > span, +.origin-ux-button-secondary > span { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +eapteka.ru + +INVERT +ymaps[class$="ground-pane"] +ymaps[class$="svg-icon-content"] > ymaps + +================================ + +easypost.com + +INVERT +.logo +.progress-bar + +================================ + +eatthis.com + +INVERT +svg.site-logo + +CSS +.header-leading-authority { + background-color: var(--darkreader-neutral-background); +} + +================================ + +eblocker.org + +INVERT +.site-logo-img +figure[class="aligncenter size-large is-resized"] + +================================ + +ebok.pgnig.pl + +INVERT +img[src*="logo"] + +================================ + +ebok.vectra.pl + +CSS +.side-floater { + background-image: none !important; +} + +================================ + +ebooks.cpm.org + +INVERT +img[alt="Review and Preview problems below"] + +================================ + +economist.com + +INVERT +#ds-wordmark-1843 path:nth-child(5) + +IGNORE INLINE STYLE +#ds-economist-logo > path +.ds-share-link > svg > g > circle + +================================ + +edmworldmagazine.com + +INVERT +.q_logo + +================================ + +edmworldshop.com + +INVERT +.site-nav__link--burger +.site-header__logo-image + +================================ + +edstem.org + +CSS +.tab-bar-dark .active .tbb-tab-side .fill { + fill: rgb(34, 37, 38) !important; +} +.tab-bar-dark .tbb-tab-side .fill { + fill: rgb(26, 28, 29) !important; +} + +================================ + +education.github.com + +INVERT +img[alt="GitHub Education"] +.octicon-logo-github + +================================ + +eduke32.com + +CSS +.main { + background-image: none !important; +} + +================================ + +edulastic.com + +INVERT +img.keyboardButton + +================================ + +eduserver.ru + +CSS +section.content { + background: var(--darkreader-neutral-background) !important; +} + +================================ + +eevblog.com + +CSS +#main_content_section > div > span, +#quickModForm > div > span, +#main_content_section > span { + mix-blend-mode: color !important; +} +.frame, +.plainbox, +#header, +#content_section, +#footer_section { + background: var(--darkreader-neutral-background) !important; + color: var(--darkreader-neutral-text) !important; +} + +================================ + +eff.org + +INVERT +#masthead #main-menu-nav form.search-site button[type="submit"] + +CSS +select > optgroup, +select > optgroup > option { + background-color: var(--darkreader-neutral-background) !important; +} +#masthead #main-menu-nav .pane-main-nav-menu > ul > li a::before { + background-color: var(--darkreader-neutral-text) !important; +} + +================================ + +elearning.utdallas.edu + +INVERT +.contentBox.contentBox-edit +.content.clearfix + +================================ + +electrical-symbols.com + +INVERT +.table-striped img + +================================ + +electrical4u.com + +INVERT +img[src*="equation"] + +================================ + +electricitymap.org + +INVERT +.name +.circular-gauge +img[alt="logo"] +.capacity +.mapboxgl-canvas + +================================ + +element.io + +INVERT +.header--logo--img +.ems-nav__logo + +================================ + +elementalmatter.info + +INVERT +[src$="atom.gif"] +[src$="periodic-atomic.gif"] + +CSS +td { + background: var(--darkreader-neutral-background) !important; +} + +================================ + +elementary.io + +IGNORE INLINE STYLE +.logotype-svg + +================================ + +eletimes.com + +INVERT +.tdb-logo-img + +================================ + +elp.northumbria.ac.uk + +INVERT +.selected-answer + +================================ + +emacswiki.org + +CSS +body { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +endeavouros.com + +INVERT +.navbar-brand + +================================ + +endoflife.date + +CSS +.bg-green-000, .bg-yellow-200, .bg-red-000 { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +endomondo.com + +INVERT +.header-shop-logo +.footer-shop-logo +.eoFeedWorkout-map-image +.workoutMap img[src*="maps"] + +CSS +.highcharts-background{ + fill: rgb(24, 26, 27) !important; +} +.highcharts-data-labels text{ + text-shadow: none !important; +} + +================================ + +enduhub.com + +CSS +.navbar .nav > li > a { + text-shadow: rgb(40, 43, 54) 0px 1px 0px !important; +} +.blurme, .blurme a { + filter: unset; + color: inherit; +} + +================================ + +enea.pl + +INVERT +.menu__logo +.navbar-brand +.slider-content > .slider-title + +CSS +.col-lg-12.col-md-12 > div > div > p { + color: var(--darkreader-neutral-background) !important; +} +.bkg-icon, +.left-bkg-icon { + color: ${white} !important; +} + +================================ + +enjen.net + +CSS +body { + background-image: none !important; +} +input.input-medium { + background-image: none !important; +} +select.input-small { + background-image: none !important; +} + +================================ + +ernestjones.co.uk + +INVERT +.logo__img + +================================ + +eshop-switch.com + +INVERT +.logo + +================================ + +eshot.gov.tr + +CSS +a.navbar-brand img { + filter: hue-rotate(90deg) invert(1) hue-rotate(90deg) saturate(15); +} +#heading .left, #heading .sub-menu .left-xs, #heading .sub-menu .right-xs { + background-color: transparent !important; + background-image: none !important; +} +section#announcements-area .container { + background-image: none; +} + +================================ + +esphome.io + +INVERT +img.component-image + +================================ + +esquire.com + +INVERT +.nav-logo + +CSS +.marquee-logo-link > svg { + background-color: ${black} !important; +} + +================================ + +etherrag.blogspot.com + +CSS +body { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +etsy.com + +INVERT +.banner-container +.secondary-banner-title +.wt-radio label:before +.review-star.rating:not(.lit) +div.rating.nolit:not(:hover) > .ss-star + +================================ + +eukhost.com + +INVERT +.navbar-brand + +================================ + +evernote.com + +INVERT +.global-logo svg + +================================ + +evga.com + +INVERT +.evga-logo-box + +CSS +.product-specs .RadTabStrip .rtsLI .rtsLink { + background-image: none !important; +} + +================================ + +ewybory.eu + +INVERT +.navbar-brand + +================================ + +exmo.me + +INVERT +canvas + +================================ + +expedia.com + +INVERT +.uitk-header-brand-logo + +================================ + +experian.com + +INVERT +.logo + +================================ + +experiencia.xpi.com.br + +INVERT +#yield-portal-header a.xpi__header__logo svg path +#yield-portal-header a.xpi__error__logo svg path +#chart-profitability > div:nth-child(2) > svg > g > g:nth-child(2) > g:nth-child(1) > g > g > g > g:nth-child(2) > g > g:nth-child(1) > g:nth-child(2) > g:nth-child(2) > g > text > tspan + +CSS +#chart-patrimony g[role='menu'] ~ g tspan { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +explainxkcd.com + +INVERT +.mwe-math-fallback-image-inline +.mwe-math-fallback-image-display +.mw-ext-score +.main-footer-menuToggle +img[src*="Loudspeaker.svg"] +img[alt="The Signpost"] + +CSS +.diff-addedline .diffchange { + background-color: ${lightblue} !important; +} +.diff-deletedline .diffchange { + background-color: ${#feeec8} !important; +} + +IGNORE INLINE STYLE +.legend-color +.infobox > tbody > tr > td[style*="background-color"] + +================================ + +expressjs.com + +CSS +body { + background-image: none !important; +} + +================================ + +ezgif.com + +INVERT +#logo + +================================ + +f-droid.org + +INVERT +.anti-feature-icon + +================================ + +facebook.com + +INVERT +._2o89 +._2q08 +.sx_af7fe0 +.sx_7ed17e +.sx_a4a936 +.sx_4d607f +.sx_aca067 +.sx_77228a +.sx_51302f +._2yu5 +._3iiv +._3pao +.kv0qyzoi +.sx_426ea6 +.sx_b77acf +._2gb3 +._7sjb +.sx_b9f33b +.sx_2e7846 +.sx_6d18f4 +.monochrome +.repliedLast +.sx_73ef60 +._81u_ .img +._3ffs li +#profile_intro_card_bio i +.uiScrollableAreaWrap .uiList button[type="submit"] i._3-8_ +.editPhoto i._3-8_ +.sx_08856a +.sx_ac12f7 +.sp_hk4DJV_EEeW +.sp_V53xxlprDHX_1_5x +.sp_V53xxlprDHX_2x +#pagelet_ego_pane button .img._3-8_ +#homepage_panel_promote_footer_pagelet button .img._3-8_ +#event_tabs #reaction_units span img +.fbPlaceFlyoutWrap img +._83aj +._7xv1 +._83ak +._8g4q + +CSS +.fbNubButton { + background-image: none !important; +} +.jewelItemNew ._33e { + background-color: ${#d0d1d3} !important; +} +.sx_cf4e6b { + filter: brightness(250%) !important; +} +._34k2 { + filter: brightness(1000%) !important; +} +._3hx- ._4tdt, +._3hx- ._5wd4, +._3hx- ._6vu5 ._5w-5, +._3hx- ._1aa6::after, +._3hx- ._6vu5 ._31o4, +._3hx- ._2cnu:only-of-type ._5wdf, +._3hx- ._5w0o, +._3hx- ._5z-5, +._3hx- ._16ys._3e7u, +._3hx- ._49or .__6j, +._3hx- ._324d .__6j, +._llj { + border-color: ${#eee} !important; +} +._3hx- ._ua1, +._3hx- ._40qi, +._3hx- ._5ye6, +._3hx- ._llj, +._3hx- ._1a6y, +._31o4, +._3_bp, +._4gd0, +._49or, +._40fu { + background-color: ${#eee} !important; +} +.fbNub._50mz .fbNubFlyoutFooter::after { + background-color: ${rgba(0, 0, 0, .15)} !important; +} +.fbNub._50mz .fbNubFlyoutInner, +._4cd8 ._69pt, +._4mq3 .fbNubFlyout, +._4mq3 .fbNubButton { + box-shadow: 0 0 0 1px ${rgba(0, 0, 0, .15)} !important; +} +:root, .__fb-light-mode { + --filter-disabled-icon: invert(100%) opacity(30%) !important; + --filter-placeholder-icon: invert(59%) sepia(11%) saturate(200%) saturate(135%) hue-rotate(176deg) brightness(96%) contrast(94%) !important; + --filter-primary-icon: invert(100%) !important; + --filter-secondary-icon: invert(62%) sepia(98%) saturate(12%) hue-rotate(175deg) brightness(90%) contrast(96%) !important; + --filter-warning-icon: invert(77%) sepia(29%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(128%) hue-rotate(359deg) brightness(102%) contrast(107%) !important; + --filter-blue-link-icon: invert(73%) sepia(29%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(103.25%) hue-rotate(189deg) brightness(101%) contrast(101%) !important; + --filter-positive: invert(37%) sepia(61%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(115%) hue-rotate(91deg) brightness(97%) contrast(105%) !important; + --filter-negative: invert(25%) sepia(33%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(110%) hue-rotate(345deg) brightness(132%) contrast(96%) !important; +} +div[role=article] div.k4urcfbm[aria-hidden="true"] { + background-color: rgba(0, 0, 0, 0.25); + background-blend-mode: color; + --darkreader-inline-bgcolor: none !important; +} +div[data-pagelet="Stories"] .ha302278 { + background-color: rgba(0, 0, 0, 0.4) !important; +} +div[aria-label="Change volume"] .ha302278, +div[aria-label="Change Position"] .ha302278, +._3paq { + background-color: rgba(255, 255, 255, 0.4) !important; +} +.r4vyqqch { + background-color: var(--fds-white-alpha-50) !important; +} +.lyi53s4r { + background-color: rgba(88,144,255,.9) !important; +} +.tdjehn4e, .oo1teu6h { + background-color: rgba(255, 255, 255, 0.1) !important; +} +.tdjehn4e:hover, .ovq5dppa:hover { + background-color: rgba(255, 255, 255, 0.2) !important; +} +.k19f6yf2 { + background-color: var(--press-overlay) !important; +} +.cxbav39q { + background-color: rbga(0, 0, 0, 0.8) !important; +} +.rnr61an3 { + background-color: var(--hover-overlay) !important; +} +.qbubdy2e { + fill: none !important; +} +.s1i5eluu { + background-color: var(--primary-button-background) !important; +} +.q66pz984 { + color: var(--accent); +} +.esnais5j, ._8bb_ img, ._8bb_ i, +._8bb_ video, ._8bb_ ._w80, ._8bb_ ._7umt ._47yj, +._8bb_ [style*='background-image: url'] { + filter: none !important; +} +div[role="button"] > i.hu5pjgll:not(.sp_Jc8OKpJq5NW, .sp_T89CCTT7d9Z), +a[role="link"] > i.hu5pjgll, ._3w97 { + filter: var(--filter-secondary-icon) !important; +} +._2yua, ._3pas { + background-color: #888 !important; +} +._2yu8 { + background-color: rgba(255, 255, 255, .5) !important; +} +.leaflet-map-pane img[src*="theme=default"], [style*="map"][style*="theme=default"], +._8bb_ img[src*="/map"], ._8bb_ [style*="map"], +img[src*="mapy.cz"], ._8bb_ img[src*="mapy.cz"], +img[src*="%2Fmap"], ._8bb_ img[src*="%2Fmap"], +img[src*="map.php"], ._8bb_ img[src*="map.php"], +img[src*="www.traseo.pl%2Froute"], ._8bb_ img[src*="www.traseo.pl%2Froute"] { + filter: invert(100%) hue-rotate(180deg) !important; +} +.j7vl6m33 { + fill: var(--always-white) !important; +} +::after { + border-left-color: #1c1e20 !important; + border-bottom-color: #1c1e20 !important; + border-top-color: #1c1e20 !important; + border-right-color: #1c1e20 !important; +} +.cetpsuna { + fill: none !important; +} +div[id*="jsc_c_"] { + text-shadow: rgb(40, 43, 54) 0px 0px 3px !important; +} + +IGNORE INLINE STYLE +[role="button"] svg +[role="button"] svg line +div svg[viewBox="0 0 36 36"] mask path +mask > rect +mask > circle +g > rect + +IGNORE IMAGE ANALYSIS +* + +================================ + +fairtradeoriginal.* + +INVERT +.SiteLayout +.SiteLayout > * +.Inset-image + +================================ + +fakespot.com + +INVERT +.logo +.fs-logo +img[alt="Header menu"] +.app-button > img + +================================ + +fakt.pl + +INVERT +.header-links + +================================ + +fanatical.com + +INVERT +.trustpilot > .logo-container > a > img + +IGNORE INLINE STYLE +div.drm-container svg g + +================================ + +fandom.com + +INVERT +.wds-global-navigation__logo-fandom + +CSS +body { + background-color: var(--theme-body-background-color) !important; +} +#mixed-content-footer, +.community-header-wrapper, +.top-ads-container, +.bottom-ads-container, +.global-footer { + z-index: 1 !important; +} +.fandom-community-header__background.cover { + z-index: 0 !important; +} + +IGNORE INLINE STYLE +.wds-global-navigation__logo-image g path +.wds-global-footer__header-logo g path +.wds-global-footer__link svg g path +symbol[id^="wds-brand-other"] * + +================================ + +fantasy.premierleague.com + +INVERT +.ism-table + +================================ + +farside.ph.utexas.edu +mathpages.com +mathprofi.ru +mathprofi.net +mathworld.wolfram.com +reference.wolfram.com +terrytao.wordpress.com +wolframalpha.com + +INVERT +img:not([src^="/_next/static/images/"]) + +================================ + +fast.com + +INVERT +div.logo +div.powered-by + +IGNORE IMAGE ANALYSIS +div.logo +div.powered-by + +================================ + +fastmail.com + +INVERT +.logo svg + +================================ + +fastmail.com/mail + +CSS +.app-listItem.is-focused, +.app-source.is-selected { + background-color: ${lightgray} !important; +} +.app-source.is-focused { + background-color: ${lightblue} !important; + color: ${black} !important; +} +.v-MailboxItem-unreadbadge { + background-color: ${darkblue} !important; +} +.v-Message-body { + border-color: transparent !important; +} + +================================ + +fau.de + +INVERT +.baselogo + +CSS +.accordion-toggle:not(.active) { + background-color: ${lightgrey} !important; +} +.accordion-toggle.active, +.accordion-toggle:hover { + background-color: #032755 !important; +} + +================================ + +fckng-serious.de + +INVERT +.logo + +================================ + +fcmed.pl + +INVERT +.mkd-logo-wrapper +a[href*="tel"] +.mkd-sidearea > .textwidget > a > img +.owl-wrapper + +================================ + +fedex.com + +CSS +.fx-global-prelog-link.fx-showlogin span { + background-image: none !important; +} + +================================ + +fedoraforum.org + +INVERT +.logo-image + +================================ + +feedly.com + +CSS +.entry.u0:hover, +.entry--selected.u0, +.entry--selected.u0:hover, +.entry--selected.u4, +.entry--selected.u5, +button.secondary:hover { + background-color: ${#ccc} !important; +} + +================================ + +feynmanlectures.caltech.edu + +INVERT +.figure > img[src$=".svgz"] + +================================ + +ffmpeg.zeranoe.com + +INVERT +.active + +================================ + +fibermap.it + +INVERT +img[src$="assets/images/bg-cloud.png"] + +================================ + +figma.com + +IGNORE INLINE STYLE +div[class*="paint_panels--chit"] +div[class*="modal--modalShadow"] div + +================================ + +fileformat.info + +INVERT +[src$="logo_wide.png"] +.thumbnail + +CSS +body { + background-color: var(--darkreader-neutral-background) !important; + background-image: none !important; +} + +================================ + +filetransfer.io + +INVERT +a.logo + +================================ + +filmweb.pl + +INVERT +.ribbonLbl +.isInit.ribbon[data-state="1"]::after +.isInit.ribbon[data-state="2"]::after +.isInit.ribbon[data-state="3"]::after +.isInit.ribbon[data-state="4"]::after +.isInit.ribbon[data-state="5"]::after +.isInit.ribbon[data-state="6"]::after +.isInit.ribbon[data-state="7"]::after +.isInit.ribbon[data-state="8"]::after +.isInit.ribbon[data-state="9"]::after +.isInit.ribbon[data-state="10"]::after + +CSS +.filmInfo__info { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +filterlists.com + +IGNORE INLINE STYLE +header.ant-layout-header img + +================================ + +finn.no + +INVERT +finn-footer +article.ads__unit overflowmenu-active + +IGNORE INLINE STYLE +svg * + +================================ + +fio.fnar.net + +INVERT +.chartjs-render-monitor + +================================ + +firebase.google.com + +INVERT +.devsite-site-logo + +================================ + +firefox.com + +INVERT +.fx-bento-app-link.fx-bento-link.fx-mobile > span::before + +================================ + +firefox.net.cn + +CSS +.btn, +.core_follow, +.pop_deep .ct dt.reward, +.pages a, .pages strong, +.design_mode_edit, +.pop_showmsg { + background-image: none; +} + +================================ + +firstcontributions.github.io + +CSS +.App, +.topnav { + background-color: ${CornflowerBlue}; +} + +================================ + +fiverr.com + +IGNORE INLINE STYLE +.site-logo * + +================================ + +fivethirtyeight.com + +INVERT +.logo +.site-logo +#searchform +.header-espn-link + +================================ + +flashscore.com.tr + +INVERT +.header__logo + +================================ + +flightfinder.fi + +INVERT +.logo + +================================ + +flipslibrary.com + +CSS +:root { + --main-background: var(--darkreader-neutral-background) !important; + --sidebar-background: var(--darkreader-neutral-background) !important; +} + +================================ + +flow.polar.com + +INVERT +.brand +.detail-data-panel__icon +.sleep-chart-yaxis.end +.supergraph-canvas + +CSS +.highcharts-container svg { + fill: ${#3f3f3f} !important; +} +.card__item-icon--rounded img { + background-color: rgba(255, 255, 255, 0.15) !important; + background-blend-mode: color; +} +.altitudetitle, .altdescmax, .altdescmin, +.zonedesctitle, .zonedescmax, .zonedesclight, +.maxhighlightval, .maxhighlightname { + color: rgb(0, 0, 0) !important; +} +.highcharts-background{ + fill: none !important; +} + +IGNORE INLINE STYLE +.zonebox +.zonestartbox +stop + +================================ + +flowkey.com + +INVERT +body.front #zone-branding-wrapper + +CSS +body.html #page.page #subslogan { + color: ${white} !important; +} + +================================ + +flyzipline.com + +INVERT +#logo + +IGNORE IMAGE ANALYSIS +#logo + +================================ + +follow.it + +INVERT +.header-logo +.logo + +================================ + +fontawesome.com + +CSS +#icons-header, #docs-header, +#hero > div:not(.container), +.app-content.docs { + background-color: var(--darkreader-neutral-background) !important; +} +.doc-nav > div { + background-color: var(--darkreader-bg--background-norm) !important; +} + +================================ + +fontsinuse.com + +INVERT +.fiu-header__branding +.fiu-sample-list__item img +.fiu-gallery-head__text img + +================================ + +fontspring.com + +INVERT +.grid6 .fullwidth + +================================ + +fontsquirrel.com + +INVERT +.fontlistitem + +CSS +#main_content_container { + background-image: none !important; +} + +================================ + +foobar2000.org + +INVERT +img[src="/foobarlogo.png"] + +================================ + +food4less.com + +INVERT +img[alt="Food4less logo"] + +================================ + +foolcontrol.org + +CSS +html { + background-color: transparent !important; +} + +================================ + +forem.com + +INVERT +nav a > img[alt="Home"] +#cta > section > div > div > img + +================================ + +forms.reform.app + +INVERT +.logo + +CSS +svg.text-white { + color: var(--darkreader-neutral-background); +} + +================================ + +forms.yandex.ru + +INVERT +.header2__service-logo +.header2__logo-wrap + +================================ + +forsal.pl + +INVERT +.serviceLogo +.homePageUrl + +CSS +.mini-tabs { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +forum.dobreprogramy.pl + +INVERT +#site-logo + +================================ + +forum.donanimhaber.com + +CSS +body { + background-color: var(--darkreader-neutral-background) +} + +================================ + +forum.eset.com +forum.ithardware.pl +forums.getpaint.net +forums.laptopvideo2go.com +nieidealny.pl/forum + +INVERT +.ipsBadge_highlightedGroup +.ipsBadge_icon +.ipsBadge_popular +.ipsComment_authorBadge +.ipsItemStatus.ipsItemStatus_custom.ipsItemStatus_read +.ipsReact_button +img[alt="Forum komputerowe ITHardware"] +img[alt="paint.net Forum"] + +CSS +.ipsBadge { + --darkreader-bg--badge--background: var(--darkreader-neutral-background) !important; +} +.ipsReact_reactCount > a, +.ipsReact_reactCount > span, +.elFullInbox_menu, +.ipsHovercard, +.ipsList_reset, +.ipsMenu_auto, +.ipsMenu_footerBar, +.ipsMenu_headerBar, +.ipsMenu_innerContent, +.ipsMenu_item, +.ipsMenu_sep, +.ipsMenu_title, +.ipsPadding, +.cUserHovercard, +a[data-mentionid] { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +forum.ivao.aero + +INVERT +.buttonlist + +CSS +.cat_bar, .cat_bar > *, .catbg > * { + background-color: var(--darkreader-neutral-background) !important; + color: var(--darkreader-neutral-text) !important; + background-image: none !important; +} +:not(a) > span, :not(a) > span > *, #footer { + background: none !important; +} +.buttonlist a:not(.active) { + color: var(--darkreader-neutral-background) !important; +} +ul.dropmenu li { + border: none !important; + background: var(--darkreader-neutral-background) !important; +} +ul.dropmenu ul { + border: 1px solid var(--darkreader-neutral-text) !important; + background: var(--darkreader-neutral-background) !important; +} + +IGNORE INLINE STYLE +#header + +================================ + +forum.kaosx.us + +INVERT +.Header-logo + +CSS +.Dropdown-toggle, +.item-refresh > Button, +.DiscussionList-loadMore > Button, +.LogInButton--github, +.Button--icon { + color: ${black} !important; + background: ${#6f7f92} !important; +} + +================================ + +forum.manjaro.org + +CSS +.custom-footer { + background-image: none !important; +} + +================================ + +forum.miranda-ng.org + +CSS +.firstlevel { + color: ${#666666} !important; +} + +================================ + +forum.p300.it + +CSS +.ipsReact_reactCount > a { + background-color: var(--darkreader-neutral-background); + border-color: var(--darkreader-neutral-text); !important; +} +.ipsType_normal { + border-color: rgb(48,52,54); +} +.ipsMenu_headerBar, +.ipsMenu_footerBar, +.ipsEmoticons_category, +.ipsMenu_innerContent, +ul.ipsMenu, .ipsMenu > ul, +a[data-mentionid], +.cUserHovercard { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +forums.comodo.com + +INVERT +.windowbg span.topslice +.windowbg span.botslice +.windowbg2 span.topslice +.windowbg2 span.botslice + +CSS +body { + background-image: none !important; +} +.buttonlist ul li a span:not(:hover) { + color: ${white} !important; +} + +================================ + +forums.gearsofwar.com + +IGNORE IMAGE ANALYSIS +body + +================================ + +forums.mydigitallife.net + +IGNORE INLINE STYLE +#TotpQrCode + +================================ + +forums.opera.com + +INVERT +.forum-logo-wrapper + +================================ + +forums.tomshardware.com + +INVERT +img[src="/styles/tomshardware/tomshardware/toms-hardware-logo.png"] +div.trophyShowcase.trophyShowcase--postbit + +================================ + +forvo.com + +INVERT +img[src$="layout/logo.svg"] + +================================ + +fotor.com + +INVERT +div[style^="background-image: url(\"https://imgv3.fotor.com/images/background/background-image.png\");"] +div[style^="background-image: url(\"https://imgv3.fotor.com/images/background/background-image.png\");"] > * + +================================ + +fotw.info + +CSS +body { + background-image: none !important; +} + +================================ + +frame.work + +INVERT +a[title="Framework Home"] > img[alt="Framework"] +#site-logo + +================================ + +fredmeyerjewelers.com + +INVERT +#header1_mainlogo +.mobileNavIcons img +.mobileNavIcons input:not(.searchdesktop) + +================================ + +freebsdfoundation.org + +CSS +.content-wrapper { + background-image: none !important; +} + +================================ + +freecodecamp.org + +CSS +.video-quiz-selected-input { + background-color: var(--darkreader-neutral-text) !important; +} +.progress-bar-percent { + background-color: ${gray} !important; +} +.map-title polygon { + fill: var(--darkreader-neutral-text) !important; +} +.map-badge circle { + fill: var(--darkreader-neutral-background) !important; +} + +================================ + +freecommander.com + +CSS +.am-body, +#subsilver-nav-topic { + background-image: none !important; +} +.header > .row-item, +.body-blok-h3 h3 { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +freedom.press + +INVERT +.logo-heading-text + +================================ + +freelancer.com + +INVERT +.LogoImg[src*="freelancer-logo.svg"] + +================================ + +freemaptools.com + +INVERT +img[src="images/freemaptools-logo.jpg"] + +CSS +body { + background-image: none !important; +} + +================================ + +freesound.org + +CSS +#search input:not(#search_submit) { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +freetp.org + +CSS +html, +body, +.wmid, +.wfoot { + background-image: none !important; +} +html, +body { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +fritz.box + +INVERT +div.formular input[type="radio"] +div.formular input[type="checkbox"] + +CSS +div.formular input[type="radio"], +div.formular input[type="checkbox"] { + background-color: transparent !important; +} + +================================ + +fs.blog + +INVERT +.shared-counts-icon + +CSS +body, +.header-box { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +fsfe.org + +INVERT +#logo + +CSS +body { + background-image: none !important; +} + +================================ + +ftp.nluug.nl + +INVERT +img[alt="[NLUUG]"] + +================================ + +fullstackopen.com + +CSS +.gatsby-highlight-code-line { + background-color: ${hsla(0,0%,48.2%,.3)} !important; +} + +================================ + +funpay.ru + +INVERT +.logo-color +.logo + +================================ + +furrychina.com + +INVERT +.main_logo + +================================ + +fusoya.eludevisibility.org + +CSS +body { + background-image: none !important; +} +td { + color: var(--darkreader-neutral-text) !important; + background-image: none !important; +} + +================================ + +futureplc.com + +INVERT +img[src$="future-logo.svg"] + +================================ + +fz-juelich.de + +CSS +body { + background-image: none !important; +} + +================================ + +g1.com.br +g1.globo.com + +CSS +.multicontent { + background-color: var(--darkreader-neutral-background) !important; + color: var(--darkreader-neutral-text) !important; +} +span.bstn-hl-summary { + color: var(--darkreader-neutral-text) !important; +} +.bar-fill-1, +.bar-scrubber-icon { + background-color: var(--darkreader-neutral-text) !important; +} + +================================ + +gadzetomania.pl + +CSS +a svg path[d^="M12.881 14.785v-"] { + fill: #fff !important; +} + +================================ + +gain.tv + +CSS +.body-new-index .hero-img-container { + z-index: 0 !important; +} + +================================ + +gameinformer.com + +INVERT +.site-logo + +================================ + +gamepress.gg + +CSS +.TLW-tier-charname { + color: ${black} !important; +} + +================================ + +gameranx.com + +CSS +body { + background-color: var(--darkreader-neutral-background) !important; +} +.mai-toc__listitem, +.mai-toc__details, +.mai-toc-default .mai-toc__summary { + background-color: ${#f7f7f7} !important; +} + +================================ + +gamestop.com + +INVERT +.nav-logo + +================================ + +garmin.com + +INVERT +.gh__logo +.map-controls.player .pause span + +================================ + +gasbuddy.com + +INVERT +.pin +.pin-small + +================================ + +gat.no + +INVERT +figure.logo > img + +CSS +main.container .every_board > .row:not(.row--takeover) { + --front-background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +gazeta.pl +plotek.pl +sport.pl +edziecko.pl +moto.pl +ukrayina.pl + +INVERT +img[alt^="logo"] +.vs__actions +a.item.noSwiper img + +CSS +.top_section_bg, .bottom_section_bg { + background-color: ${#e5e5e5} !important; +} +svg [id="Group_242"], +svg [id="Path_9914"] { + fill: ${black} !important; +} + +================================ + +gazetaprawna.pl + +INVERT +.bubbleMenuHamburger +.homePageUrl +.serviceLogo +.servicesMenu #menuTrigger span + +================================ + +gazetaswietokrzyska.pl + +INVERT +.logo + +CSS +.elementor-column-wrap.elementor-element-populated { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +ge.globo.com + +CSS +.glb-grid .tabela-body { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +geekflare.com + +INVERT +.logo + +================================ + +geeksforgeeks.org + +CSS +.gsc-input-box { + box-shadow: ${rgba(0, 0, 0, 0.3)} 0px 0px 2px !important; +} + +================================ + +geizhals.* +skinflint.co.uk +cenowarka.pl + +CSS +img, +.mocat-item__image, +.primary-nav .nav-item-type-cat-image { + mix-blend-mode: normal !important; +} + +================================ + +genius.com + +INVERT +.texmath + +================================ + +genshin-impact-map.appsample.com + +INVERT +.bg-secondary.px-1.py-0.input-group-text > .icon +.border-top2.text-center.w-100.sidebar-footer +.gm-ui-hover-effect + +================================ + +gentoo.org + +INVERT +.site-logo + +================================ + +geogebra.org + +INVERT +.icon-m +.elemText canvas +.gwt-Image +.gwt-StackPanelItem img +.GeoGebraMenuImage.menuImg +.menuImg +.buttonContent.stylebarButton +.EuclidianPanel > canvas + +================================ + +get.google.* +get.google.*.* + +INVERT +a[href*="about/products"] +span[aria-label="Settings"][role="menuitem"] path +span[aria-label="About Album Archive"][role="menuitem"] path +span[aria-label="Download photo"][role="menuitem"] path +span[aria-label="Manage in Google Photos"][role="menuitem"] path + +================================ + +getalt.org + +INVERT +.site-title + +================================ + +getfedora.org + +INVERT +img[alt="globe"] + +================================ + +getlektor.com + +CSS +.body-wrapper .container { + background-color: var(--darkreader-neutral-background) !important; +} +pre { + background-image: none !important; +} + +================================ + +getmimo.com + +INVERT +a[title="Home"][href] > svg +div[class^="FifthSection___StyledDiv8"] > svg +div[class^="Footer__Row"] > :nth-child(1) svg + +CSS +login-container { + background: var(--darkreader-neutral-background) !important; +} + +================================ + +getpocket.com + +CSS +p a[rel="noopener noreferrer"] { + text-shadow: none !important; + background-image: linear-gradient(to top,transparent,transparent 1px,var(--darkreader-text--color-canvas) 1px,var(--darkreader-text--color-canvas) 2px,transparent 2px) !important; +} + +================================ + +getsol.us + +INVERT +img[alt="Logo"] + +================================ + +gg.pl + +INVERT +.chat-btns +.profile-close i +.settings-close i + +CSS +.sr-contact-name span { + background-image: none !important; +} + +================================ + +ggmania.com + +CSS +body { + background-image: none !important; +} + +================================ + +gigabyte.com + +INVERT +.kf-vision +.kf-vision > * +.creator-vision +.creator-vision > * +.InnerGIGABYTEContent .scroll_bg_01 +.InnerGIGABYTEContent .scroll_bg_01 > * +.InnerGIGABYTEContent .eagle_build_strong +.InnerGIGABYTEContent .eagle_build_strong > * + +================================ + +git-scm.com + +INVERT +img[alt="Git"] + +CSS +body, #masthead { + background-image: none !important; +} + +================================ + +github.blog + +INVERT +a[href="https://github.com"] +.site-branding > svg +.icon-logo-github +.aligncenter +.wp-image-56594 +.wp-image-56590 +[src^="https://github.blog/wp-content/uploads/2019/03/BlogHeaders_Aligned_CHANGELOG"] +[src^="https://i0.wp.com/user-images.githubusercontent.com/"] +[src^="https://i1.wp.com/user-images.githubusercontent.com/"] +[src^="https://i2.wp.com/user-images.githubusercontent.com/"] + +================================ + +github.com +github.*.* + +INVERT +[src="https://github.githubassets.com/images/modules/site/icons/footer/github-logo.svg"] +[src^="https://github.githubassets.com/images/modules/site/home/community-sponsor-"] +[src^="https://github.githubassets.com/images/modules/site/home/community-readme-"] +[src^="https://github.githubassets.com/images/modules/site/home/community-discussions-"] +[src="https://github.githubassets.com/images/modules/site/home/dependabot-merge.png"] +[src="https://github.githubassets.com/images/modules/site/home/dependabot-pr.png"] +[src="https://github.githubassets.com/images/modules/site/home/gh-desktop.png"] +[src="https://github.githubassets.com/images/modules/site/home/pr-merge.png"] +[src="https://github.githubassets.com/images/modules/site/home/pr-comment.png"] +[src="https://github.githubassets.com/images/modules/site/home/pr-description.png"] +[src="https://github.githubassets.com/images/modules/site/home/pr-screen.png"] +[src="https://github.githubassets.com/images/modules/site/home/enterprise-city-w-logos.jpg"] +[src="https://github.githubassets.com/images/modules/site/codespaces/codespaces-icon.png"] +[src="https://github.githubassets.com/images/modules/site/codespaces/dependency-rust.png"] +[src="https://github.githubassets.com/images/modules/site/codespaces/dependency-3.png"] +[src^="https://github.githubassets.com/images/modules/site/codespaces/dependencies-"] +[src="https://github.githubassets.com/images/modules/site/codespaces/commit-3.png"] +[src="https://github.githubassets.com/images/modules/site/codespaces/extensions-1.png"] +[src="https://github.githubassets.com/images/modules/site/codespaces/extensions-2.png"] +[src="https://github.githubassets.com/images/modules/site/codespaces/commit-workflow.png"] +[src="https://github.githubassets.com/images/modules/site/codespaces/workflow-view.png"] +[src="https://github.githubassets.com/images/modules/site/codespaces/code.png"] +[src="https://github.githubassets.com/images/email/explore/explore-gradient-icon.png"] +[src="https://raw.githubusercontent.com/github/explore/80688e429a7d4ef2fca1e82350fe8e3517d3494d/collections/learn-to-code/learn-to-code.png"] +.js-viewport-aware-video.color-bg-primary.width-full.d-block.codespaces-hero-video +.build-in-animate.position-relative.mb-6-fluid.box-shadow-active-mktg.mx-auto.home-mobile-iphone.build-in-slideY.js-build-in > .js-viewport-aware-video.width-full +.overflow-hidden.position-relative.box-shadow-active-border-mktg.rounded-2-fluid.color-bg-primary.build-in-scale-fade.js-build-in-item +.build-in-animate.overflow-hidden.box-shadow-active-border-mktg.rounded-2-fluid.position-relative.home-workflow-comp.js-build-in-item +.mx-lg-auto.col-lg-7.col-12 + +CSS +.markdown-body code, +.markdown-body pre, +.markdown-title code { + background-color: ${rgba(27, 31, 35, 0.1)} !important; +} +.markdown-body pre code { + background-color: transparent !important; +} +.refined-github .dashboard .js-all-activity-header + div { + background-color: ${#e4e5e9} !important; + border-color: ${#bbc1c9} !important; +} +.refined-github .dashboard-rollup-items .body { + border-top-color: ${#bbc1c9} !important; +} +.refined-github .reaction-summary-item a { + box-shadow: 0 0 0 2px ${white} !important; +} +.refined-github button.reaction-summary-item { + border-top-color: rgb(52, 59, 68) !important; + border-bottom: rgb(77, 172, 253) !important; +} +.js-site-search-form { + background-color: #ffffff1a !important; + border-radius: 2pt !important; +} +.blob-num:not(.cc-coverage-covered-border):not(.cc-coverage-missed-border) { + border-right: 0 !important; +} +.cc-issue-description { + color: #24292e !important; +} +.cc-readup-background { + background-color: rgb(28, 30, 31) !important +} +.cc-readup-content { + border-left: 1px solid grey !important; + color: rgb(216, 214, 208) !important; +} +.cc-readup-content blockquote { + border-left: 3px solid dimgrey !important; +} +.cc-pr__link-text { + color: darkgrey !important; +} +.cc-pr__tooltip { + background-color: rgb(28, 30, 31) !important; + color: darkgrey !important; +} +.jfk-bubble, .octotree-sidebar, .cc-pr__logo, .cc-octicon, #network canvas, img.network-tree { + filter: invert(94.4%) hue-rotate(180deg) contrast(90%) !important; +} +.blob-code-inner, .blob-code-inner > *, .CodeMirror pre > span, .CodeMirror-linenumber { + font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace !important; +} +#commit-activity-detail > svg { + fill: ${black} !important; +} +.ContributionCalendar-day, +.ContributionCalendar-day[data-level="0"] { + fill: var(--color-calendar-graph-day-bg) !important; +} +.ContributionCalendar-day[data-level="1"] { + fill: var(--color-calendar-graph-day-L1-bg) !important; +} +.ContributionCalendar-day[data-level="2"] { + fill: var(--color-calendar-graph-day-L2-bg) !important; +} +.ContributionCalendar-day[data-level="3"] { + fill: var(--color-calendar-graph-day-L3-bg) !important; +} +.ContributionCalendar-day[data-level="4"] { + fill: var(--color-calendar-graph-day-L4-bg) !important; +} +.day, +.day[data-Count="0"] { + fill: var(--color-calendar-graph-day-bg) !important; +} +.day[data-Count="1"] { + fill: var(--color-calendar-graph-day-L1-bg) !important; +} +.day[data-Count="2"] { + fill: var(--color-calendar-graph-day-L2-bg) !important; +} +.day[data-Count="3"] { + fill: var(--color-calendar-graph-day-L3-bg) !important; +} +.day[data-Count="4"] { + fill: var(--color-calendar-graph-day-L4-bg) !important; +} +:root { + --color-previewable-comment-form-bg: var(--darkreader-neutral-background) !important; + --color-calendar-graph-day-bg: ${#ebedf0} !important; + --color-calendar-graph-day-L1-bg: ${#9be9a8} !important; + --color-calendar-graph-day-L2-bg: ${#40c463} !important; + --color-calendar-graph-day-L3-bg: ${#30a14e} !important; + --color-calendar-graph-day-L4-bg: ${#216e39} !important; +} +.Box-row--yellow { + background-color: ${#fffbdd} !important; +} +.merge-status-list { + border-color: ${#c0c5c7} !important; +} +.user-has-reacted { + background-color: rgba(17, 88, 199, 0.2) !important; +} +.hx_IssueLabel { + background: rgb(var(--label-r),var(--label-g),var(--label-b)) !important; + color: hsl(0,0%,calc(var(--lightness-switch)*100%)) !important; + border-color: hsla(var(--label-h),calc(var(--label-s)*1%),calc((var(--label-l) - 25)*1%),var(--border-alpha)) !important; +} +.header-search-input { + border: 0 !important; +} +.HeaderMenu-link--sign-in { + border: 0 !important; +} +.timeline-comment--caret.current-user::after { + --color-current-user-tip-bg: var(--darkreader-bg--color-box-bg-info) !important; +} +.timeline-comment--caret.current-user::before { + background-color: var(--darkreader-border--color-box-border-info) !important; +} +@media screen and (min-width: 1012px) { + markdown-toolbar.border-lg-top-0 { + border-top: 1px solid var(--darkreader-border--color-border-primary) !important; + } +} +@media screen and (max-width: 767px) { + div.tabnav--responsive button.tabnav-tab { + --color-border-primary: var(--darkreader-border--color-border-primary) !important; + } +} +.TimelineItem-badge[style^="background-color: var(--color-timeline-merged-bg)"] { + background-color: var(--color-timeline-merged-bg) !important; +} +.ContributionCalendar-label { + --color-text-primary: var(--darkreader-neutral-text) !important; +} +article div[style^="background: linear-gradient"] { + background: linear-gradient(to top, var(--darkreader-bg--color-bg-primary), transparent) !important; +} + +IGNORE INLINE STYLE +a[href^="https://apps.apple.com/app/"] g +a[href^="https://apps.apple.com/app/"] path +tracked-issues-progress svg * +div#user-repositories-list .tooltipped svg * +div#org-repositories .tooltipped svg * + +================================ + +github.myshopify.com + +INVERT +.site-header__logo-image +.column-gh.column-full>svg + +================================ + +githubstatus.com + +CSS +.illo-desktop-header { + z-index: 0 !important; +} + +================================ + +gitlab.com +gitlab.*.* +gitlab.*.*.* +code.videolan.org +framagit.org + +INVERT +.js-contrib-calendar + +CSS +:root { + --svg-status-bg: #181a1b; +} +.avatar, .avatar-container { + border: none !important; +} +table.code .line_content *:not(pre), +.job-log *:not(pre) { + font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace !important; +} +.gl-drawer-close-button, +.js-reply-button, +.dropdown.more-actions > button, +.js-note-edit, +.btn-default-tertiary { + mix-blend-mode: unset !important; +} +.board-inner { + --gray-10: ${#e1e3e4} !important; + --darkreader-border--gray-100: ${#d1cdc7} !important; +} + +================================ + +gittigidiyor.com + +CSS +img[data-testid="productImage"] { + mix-blend-mode: normal !important; +} + +================================ + +giveawayoftheday.com + +INVERT +.header_lang .curr_lang::before +.header_logo +.header_nav_trig +.header_search +.header_search .button + +IGNORE IMAGE ANALYSIS +.countdown-amount .diggit + +================================ + +giveaways.cavebot.xyz + +CSS +.respon1.p-r-50.p-l-50.p-b-22.p-t-42.bor1.cd100.flex-sa-m.flex-w { + border: none !important; +} +.overlay1::after { + background: unset !important; +} +.overlay1::before { + opacity: 0.8 !important; + background-color: unset !impotant; + background-image: unset !impotant; +} +.overlay1::before { + background-color: unset !important; + background-image: unset !important; +} + +================================ + +gizmodo.com + +INVERT +[aria-label="Gizmodo logo"] + +================================ + +glasswire.com + +INVERT +.download-n-marks div img +.menu + +CSS +.head-menu .menu a { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +global.gotomeeting.com/join/* + +IGNORE IMAGE ANALYSIS +body + +================================ + +globo.com + +CSS +.bar-scrubber .bar-scrubber-icon, +.bar-background .bar-fill-2 { + background-color: var(--darkreader-neutral-text) !important; +} +.bar-background .bar-fill-1 { + background-color: rgba(255, 255, 255, .3) !important; +} + +IGNORE INLINE STYLE +.poster__play-wrapper * + +================================ + +gloswielkopolski.pl + +INVERT +.componentsNavigationNavbar__brand + +================================ + +gls-pakete.de + +CSS +.tracking--status .status-box::before, .tracking--status .status-box::after { + z-index: 0 !important; +} +.tracking--status .status-box.status--complete.status--lastcomplete .status-box--tooltip, .tracking--status .status-box.status--current .status-box--tooltip { + transform: none !important; + position: absolute !important; + margin-bottom: 0px !important; + margin-top: -10px !important; + bottom: 0 !important; +} + +================================ + +gnc.com + +IGNORE INLINE STYLE +a[id^="powered_by_pixlee"] + +================================ + +gnu.org + +INVERT +#gnu-banner img +#search-icon + +================================ + +godaddy.com + +INVERT +.logo-mark + +================================ + +godfathers.com + +INVERT +.header .top-bar .top-bar-wrapper .page-header-branding img + +================================ + +godoc.org + +CSS +.banner { + background-color: ${rgb(225, 190, 130)} !important; +} + +================================ + +godzinyotwarcia24.pl + +INVERT +.mbdtr +.mpktr +form[action="/szukaj"] +div[id="suchfeldlabels"] + +================================ + +gog-games.com/game + +INVERT +img[src*="hoster_logos"] +div.close + +CSS +#game-details > .container::before { + background-image: none !important; +} + +================================ + +gog.com + +INVERT +i.icn.icn--close +svg.icon-wrapper-icon +svg.big-spot__add-to-cart-icon +svg.ic-svg:not(.button__icon):not(.productcard-slider__nav-icon) +.productcard-thumbnails-slider-pagination +.carousel-pagination__page +.big-spot__carousel-pages-container +.big-spots__arrow-icon +.discover-games-more__icon + +CSS +.product-tile__info:hover { + background-color: var(--darkreader-neutral-background) !important; +} +a.product-tile__content { + background-color: var(--darkreader-neutral-background) !important; +} +.galaxy-tooltip__layer { + background: ${#d9d9d9} !important; + color: var(--darkreader-neutral-text) !important; +} +.big-spot__content, .big-spot__text, .big-spot__action { + backdrop-filter: brightness(50%) !important; +} +.big-spot__title, .big-spot__super-title, .big-spot__action { + filter: brightness(130%) !important; +} +.wishlist-button, .review__read-more, .review-new__add-button, .review-new__guideline-button { + background-image: none !important; +} +.productcard-thumbnails-slider__play-btn { + border-color: rgb(220, 218, 215) !important; +} +.productcard-thumbnails-slider__play-btn::before { + border-left-color: rgb(220, 218, 215) !important; +} + +IGNORE IMAGE ANALYSIS +.menu-anonymous__shelf + +================================ + +gog.com/promo +gog.com/partner + +CSS +.wrapper.cf > .content.cf::before { + position: fixed; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: rgba(0,0,0,0.5); +} +.container.promo-page-header.cf { + filter: brightness(100%) !important; +} + +================================ + +gokulv.netlify.app + +IGNORE IMAGE ANALYSIS +body + +================================ + +golang.org + +INVERT +.Footer-gopher +.gopher + +CSS +#file-editor .CodeMirror, +#file-editor .CodeMirror-lines, +#file-editor .CodeMirror-gutters, +#wrap { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +google.*/chrome + +INVERT +[src$="slate.png"] +[src$="articles.png"] +[src$="phone_desktop.png"] +[src$="homepage_tools.png"] +[src$="chrome-ui-sync.png"] +[src$="password-check.png"] +[src$="big_pixel_phone.png"] +[src=$"homepage_privacy.png"] +[src$="big_phone_desktop.png"] +[src$="chrome-ui_desktop.png"] +[src$="pixel_slate_port_desktop.png"] +[src^="/chrome/static/images/productivity/"] +[src^="/chrome/static/images/be-more-productive/"] +[src^="/chrome/static/images/download-browser/pixel"] +[src^="/chrome/static/images/google-translate/screen-"] + +================================ + +google.*/maps +google.*.*/maps + +INVERT +#app-container.vasquette:not(.app-imagery-mode):not(.app-globe-mode) .widget-scene-canvas +#app-container.vasquette:not(.app-imagery-mode):not(.app-globe-mode) .canvas-container > canvas +#app-container.vasquette:not(.app-imagery-mode):not(.app-globe-mode) .full-screen > img +.widget-settings-button-icon +.searchbox-button +.searchbox-searchbutton +.searchbox-hamburger::before +.maps-sprite-settings-chevron-left +a.ita-kd-icon-button > span +li.ita-kd-menuitem > span.ita-kd-menuitem-inputtool-icon +li.ita-kd-menuitem > span.ita-kd-checkbox +div.maps-sprite-common-chevron-left +span.maps-sprite-common-chevron-right +span.section-destination-via-line-icon +div.section-directions-trip-travel-mode-icon +button.searchbox-hamburger.white-foreground +label.kd-radio-label:before +label.kd-checkbox-label:before +label.kd-checkbox-label:after +button.section-directions-details-action-button +div.section-loading-spinner +a.gb_b > div +a.gb_xc +.gm-style img[role="presentation"]:not([src*="v="]) +.i4ewOd-xl07Ob +.i4ewOd-LQLjdd li::before +.un1lmc-j4gsHd +.maps-sprite-settings-languages +a[href*="about/products"] +.google-logo +.watermark +.section-review-action-menu +.section-review-interaction-button +.section-directions-trip-travel-mode-icon +.renderable-component-icon +.cards-rating-star +.maps-sprite-common-chevron-right +[role="region"] button[jsaction^="pane.list-item.add"] [class*="icon-background"] [class*="icon"][src*="black"] +.top-activity-icon +.activity-icon +img[src$="menu_black_24dp.png"] +#assistive-chips .e2moi img +button[guidedhelpid="searchbutton"] +a[href^="//myaccount.google.com/yourdata/maps"] > div +img[src^="//www.google.com/images/branding/lockups/"][alt="Google Maps"] +div[role="checkbox"] > div +div[aria-label="Toggle star"][role="checkbox"] +#legendPanel > div > div > div > div > div > div > div > div > div[jsaction^="keydown"][jsshadow=""][role="checkbox"][style=""] +#legendPanel > div > div > div > div > div > div > div > div > div > div > div > div[jsaction^="keydown"][jsshadow=""][role="checkbox"] +#map-canvas > div > #watermark +body.vsc-initialized > #app > #map-container > #map > .map-outer.map-extent +body.vsc-initialized > #app > #map-container > #map > div > div > div > button[jsaction="map.toggle-map-control"] > img +body.vsc-initialized > #app > #map-container > #map > div > div > div > div > div > button[jsaction="map.zoom-out"] > img +body.vsc-initialized > #app > #map-container > #map > div > div > div > div > div > button[jsaction="map.zoom-in"] > img +#app-container > #modal-dialog > div > div > div > div > button[jsaction="modal.close"] +#map-canvas div[data-tooltip] +div[style="top: 0px;"] > div > div > div > :first-child +div[style="top: 0px;"] > div > :last-child > div > :nth-child(2) +div[style="top: 0px;"] > div:first-child:not([style^="background"]) > :last-child + +CSS +#app-container > #modal-dialog > div > div > div > div > button[jsaction="modal.close"] { + background-color: $var(--darkreader-neutral-background) !important; +} + +IGNORE IMAGE ANALYSIS +.widget-settings-map +.widget-settings-satellite +.widget-settings-terrain +.widget-settings-globe +.widget-settings-traffic +.widget-settings-transit +.widget-settings-bike +.widget-settings-street-view +.widget-settings-covid-info-icon +.widget-settings-location-sharing +.widget-settings-your-places +.widget-settings-rate-review +.widget-settings-timeline +.widget-settings-link +.widget-settings-print + +================================ + +googleprojectzero.blogspot.com + +CSS +.c5 a img { + background-color: white !important; +} + +================================ + +goplay.anontpp.com + +INVERT +img[src*="download.svg"] +img[src*="cast.png"] +img[src*="bookmark.png"] +.jw-slider-container +.jw-time-tip::after + +================================ + +gorod.gov.spb.ru + +INVERT +.header__logo +.reason__icon +.map-with-address +.problem-details__map +.problem-map-page__map + +================================ + +gorod.mos.ru + +INVERT +.scene__logo +div[id^="map"] > div > div > div +div[style^="text-align: center; margin"] > div > div:first-of-type + +CSS +#footer { + background: ${#CCECE8} !important; +} + +================================ + +gosuslugi.ru + +INVERT +ymaps[class$="ground-pane"] +ymaps[class$="places-pane"] span + +================================ + +gotquestions.org + +CSS +.gradient-to-b { + --color-start: var(--darkreader-neutral-background) !important; + --color-end: var(--darkreader-neutral-background) !important; +} + +================================ + +gov.pl/web/bip + +INVERT +.banner-promo +.banner-promo__text + +================================ + +gowork.pl + +INVERT +.city__img .city__text + +================================ + +grammarly.com + +INVERT +img[alt="Grammarly logo"] + +IGNORE INLINE STYLE +div[data-qa="heroSectionAnimationContainer"] path + +================================ + +gramota.ru + +INVERT +img[src*="logo-gramota"] +.caret +td > strong + +================================ + +gravatar.com + +INVERT +a.g-home +.g-user-menu > svg +body#page > div > div > nav > ul > li > a > svg.g-logo.g-logo--name-gravatar + +CSS +a[class="g-sign-in"] > svg > path { + fill: white !important; +} +body { + background-image: none !important; +} + +================================ + +grc.com + +INVERT +img[src*="gif"] + +================================ + +greatergood.com + +INVERT +.ctg-logo +.logo-ggc-color +#site-logo + +================================ + +grocy.info + +INVERT +.navbar-brand +.carousel-control-prev-icon +.carousel-control-next-icon + +================================ + +grubhub.com + +CSS +.s-checkbox-filler { + color: rgb(24, 26, 27) !important; +} +label, h5, h6, header, .h5 { + color: ${black}; +} + +================================ + +gsmchoice.com +mgsm.pl + +INVERT +.promo-sticky__item--small +.promo-sticky__item--large +img[alt="mGSM.pl"] +img[alt="GSMchoice.com"] + +================================ + +gsuite.google.com + +INVERT +.header--logo img + +================================ + +gu.spb.ru + +INVERT +ymaps[class$="ground-pane"] + +CSS +.bg { + background-image: var(--darkreader-neutral-background) !important; +} + +================================ + +guiott.com + +CSS +.Section1 > div { + background-image: none !important; +} + +================================ + +guitarcenter.pl + +INVERT +tr > td > img +p.standard_price +p.promo_price + +================================ + +guitarworld.com + +INVERT +.site-logo + +================================ + +gumroad.com + +INVERT +.mega-gum-logo + +================================ + +gurushots.com + +CSS +.c-challenges-speed-item__countdown > .round-progress-wrapper, +.challengesItemSuggested__timer .round-progress-wrapper { + background-color: transparent !important; +} +.modal-vote__exposure-meter__arrow, +.modal-vote__exposure-meter__arrow:after { + background-color: var(--darkreader-neutral-text) !important; +} + +================================ + +habitica.com + +INVERT +.logo path:nth-child(2) + +IGNORE IMAGE ANALYSIS +* + +================================ + +habr.com + +INVERT +img[src*="//tex.s2cms.ru/"] +img[data-tex] + +CSS +html { + text-shadow: none !important; +} +.main-navbar .icon-svg { + fill: ${#929ca5} !important; +} + +================================ + +hacdias.com + +CSS +:root { + --background: var(--darkreader-neutral-background) !important; +} + +================================ + +hackerone.com + +INVERT +.app__logo + +================================ + +hackerrank.com + +INVERT +.badge-title +.badge-star +.CodeMirror-cursors +.CodeMirror-selected + +CSS +.monaco-editor .cursor { + background-color: ${black} !important; +} + +================================ + +handshake.org + +INVERT +[src*="logo-dark.svg"] +[src*="blocks.svg"] + +CSS +ul.notes li::before { + background-color: var(--darkreader-neutral-text) !important; +} + +================================ + +handwiki.org + +CSS +#mw-content { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +haokan.baidu.com + +INVERT +.header-logo-icon + +================================ + +hbo.com + +INVERT +img[alt="HBO Logo"] + +================================ + +hbr.org + +INVERT +.hamburger-icon +.top-header--logo +.search-icon +.footer-logo + +================================ + +hdgo.cc +vio.to + +INVERT +.hdplayer .big_play_button div +.hdplayer .hdgo_controls div.hdgo_pause_control div +.hdplayer .hdgo_controls div.hdgo_play_control div + +================================ + +hdlbits.01xz.net + +CSS +img.image, .image > img { + background-color: white !important; + filter: brightness(50%) sepia(40%) !important; +} + +================================ + +heise.de + +INVERT +.heise-online-logo + +================================ + +helix.ru + +INVERT +.Site-Header-Logo + +================================ + +help.nextdns.io + +INVERT +.logo-desktop +.logo-mobile + +================================ + +helzberg.com + +INVERT +.logo +.footer.content +.footer.content > div +.footer__column--logo + +IGNORE INLINE STYLE +a[id^="powered_by_pixleee"] + +================================ + +heraldscotland.com + +INVERT +.brand + +================================ + +heritage.org/index + +INVERT +.bar + +CSS +.content-container { + background-image: none !important; +} + +================================ + +hex-rays.com + +INVERT +#logo +.footer-logo + +================================ + +hh.ru + +CSS +html { + text-shadow: none !important; +} + +================================ + +hindustantimes.com + +INVERT +.menu.noti-dot +.searchHolder .search +img[src$="logo-big-cm.png"] +img[src$="logo-ht.png"] +img[src$="htlogo.png"] + +================================ + +history.state.gov + +CSS +body { + background-image: none !important; +} + +IGNORE IMAGE ANALYSIS +body + +================================ + +hmong.* +wikihmong.com + +INVERT +span.mwe-math-element + +================================ + +homebrewery.naturalcrit.com + +CSS +.CodeMirror-scroll { + background-color: #444; +} +span[role="presentation"] { + color: white; +} +span[role="presentation"] > .cm-header { + color: rgb(50, 150, 250); +} +span[role="presentation"] > .cm-variable-2 { + color: rgb(50, 150, 250); +} +.phb blockquote { + background-color: #e0e5c1 !important; +} +.phb h3, .phb h2, .phb h1 { + color: #58180D; +} +.phb p { + color: black; +} +.cm-link,.cm-attribute { + color: rgb(90, 140, 255) !important; +} +.cm-url,.cm-string { + color: rgb(200, 50, 50) !important; +} +.cm-quote,.cm-tag { + color: rgb(50, 200, 50) !important; +} + +================================ + +hootsuite.com + +INVERT +img[src$="hootsuite_white_form3.png"] + +================================ + +hotel.meituan.com + +INVERT +.poi-hotellbs-map +.small-map + +================================ + +howbuy.com + +INVERT +.bottomStar +.cpBottomWord +.logo +.navList dt +.phCon +.title +#valuationChar + +================================ + +hp.com + +INVERT +#g-nav .c-logo + +CSS +.pdp-bg { + background-image: none !important; +} + +================================ + +hs.fi + +CSS +article, +article > article { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +huawei.com + +INVERT +.logo + +================================ + +huba.news + +INVERT +img[alt="Huba"] +img[alt="INTERIA.PL"] +.most-interesting-topics-header:before + +================================ + +hubs.mozilla.com + +INVERT +svg.hmc-logo + +================================ + +hvdic.thivien.net + +INVERT +img.hvres-variant-img.lazy + +CSS +body { + background-image: none !important; +} + +================================ + +hyperphysics.phy-astr.gsu.edu + +INVERT +tbody td > img +tbody center > img +tbody center > a > img + +================================ + +hyperskill.org + +INVERT +.html-preview + +CSS +.monaco-editor .margin, +.monaco-editor-background { + background-color: #181A1B !important; +} +.monaco-editor .cursor { + background-color: ${#000000} !important; +} + +================================ + +hypixel.net + +INVERT +.p-nav-inner +.message-avatar::after + +CSS +.p-navEl-link, .p-header-playNow .p-header-playNow-button, .p-navgroup-link--search { + color: ${rgb(214, 210, 205)} !important; +} + +================================ + +hypothes.is + +INVERT +a[href="https://hypothes.is"] > svg[aria-labelledby="logo-title"] > g > path[fill-rule="nonzero"] +img[class="fusion-standard-logo"] + +================================ + +i-item.jd.com + +CSS +.itemInfo-wrap .summary-price-wrap .summary-top .summary-promotion { + background-image: none !important; +} + +================================ + +icloud.com + +INVERT +.rm-list-body +.note-list-item-attachment +.sc-iujRgT.jxLrRl +.icloud-text.image +.img.app-icon-icloud +#cloudos-loading-spinner +.editor-container +.light > svg + +CSS +.cw-pane-container, +.reminders { + background-image: none !important; +} + +================================ + +icofont.com + +INVERT +.logo + +================================ + +iconfinder.com + +INVERT +.logo + +================================ + +iconify.design + +IGNORE INLINE STYLE +svg.iconify * +svg#footer-icon-name * +svg#icon-nav-prev * +svg#icon-nav-next * +.si-svg-wrapper svg * +.block-container .icons svg * + +================================ + +icons8.com + +CSS +.main-page .gradient { + background-image: none !important; +} + +================================ + +icrc.org + +CSS +.logo, +.logo img { + background-color: #fff !important; +} + +================================ + +ieee.org + +INVERT +.logo-left + +================================ + +iett.istanbul + +CSS +#routedesc p:nth-child(2) { + font-size: 0; +} +#routedesc p:nth-child(2)::after { + font-size: 20px; + content: "Kırmızı renkli seferler ÖHO ve OAŞ; beyaz renkli seferler İETT’ye aittir." +} + +================================ + +ifixit.com + +INVERT +a[aria-label="home page"] + +================================ + +iflscience.com + +INVERT +.header-primary div a svg +.footer-branding a svg +.footer-subscribeBox div span a svg + +================================ + +ifood.com.br + +CSS +.responsive-header__logo svg { + --darkreader-inline-fill: rgb(212, 45, 58) !important; +} + +================================ + +igurublog.wordpress.com + +CSS +body, +.entry, +#content, +#container { + background-image: none !important; +} + +================================ + +ikea.* + +CSS +.range-revamp-ratings-bar__star--empty path, +.range-revamp-ratings-bar__star--half path:first-child { + fill: ${rgb(246, 245, 244)} !important; +} +.hnf-svg-icon { + fill: var(--darkreader-neutral-text) !important; +} +.card, +.card-header, +.card-footer { + background-color: var(--darkreader-neutral-background) !important; +} + +IGNORE INLINE STYLE +.gpr__color-dot + +================================ + +iliad.it + +IGNORE IMAGE ANALYSIS +.background + +================================ + +ilovepdf.com + +INVERT +.brand__logo +.ico--down +.ico--desk +.ico--hamburger + +================================ + +ilyabirman.* + +INVERT +img[src*="layout-win"] + +CSS +body { + background: none !important; +} + +================================ + +imap: +pop3: + +CSS +table[class|="moz-header"] { + background: none; +} + +================================ + +imdb.com + +INVERT +.a-icon +.jw-slider-volume + +CSS +#wrapper { + background: ${#e3e2dd} !important; +} +.ipc-page-section--base { + --ipc-pageSection-base-bg: var(--darkreader-neutral-background) !important; +} +:root: { + --darkreader-bg--ipt-baseAlt-shade1-bg: var(--darkreader-neutral-background) !important; +} +.imdb-header__nav-drawer div, +.ipc-menu--on-baseAlt, +.imdb-header__search-menu, +.ipc-promptable-base__panel { + background-color: var(--darkreader-neutral-background) !important; +} +.ipc-promptable-base__content { + background-color: #171a1b !important; +} +div[class^="SubNav__SubNavContainer"], +div[class^="Media__ButtonContainer"] > a, +div[class*="WatchlistButton__ButtonParent"] > button, +a[class*="EmptyState__FYWStateButton"], +a[class*="EmptyState__FromYourWatchlistRibbon"] > svg, +.ipc-poster-card, +.ipc-poster-card__actions > .ipc-button { + background: rgba( var(--ipt-on-baseAlt-rgb,255,255,255),var(--ipt-baseAlt-hover-opacity,0.08) ) !important; +} +div[class^="SubNav__ShareButtonWrapper"]::before, +div[class^="Root__Separator"] { + background: rgba(var(--ipt-base-rgb,255,255,255),0.2); !important; +} +.ipc-title__text::before, +.ipc-tabs__indicator { + background: #f5c518 !important; +} +.ipc-signpost--accent1 { + background: var(--darkreader-bg--mdc-theme-ipt-accent1-color, #bb9508) !important; +} +hgroup[class*="ipc-title--category-title"] > .ipc-title__text, +.ipc-title-prompt__title { + color: #f5c518 !important; +} +.boxOfficeTitle:nth-of-type(2n) { + background: linear-gradient( to right,rgba(var(--ipt-on-baseAlt-rgb),0),rgba(var(--ipt-on-baseAlt-rgb),0.06) ) !important; +} +div[class^="VideoInfostyles__VideoDescriptionOverlay"] { + background: linear-gradient(transparent 50%,var(--ipt-baseAlt-bg)) !important; +} +main { + background: var(--ipc-pageSection-baseAlt-bg) !important; +} +.ipc-watchlist-ribbon__bg-ribbon { + fill: rgba(var(--ipt-baseAlt-shade1-rgb), 0.75) !important; +} +.ipc-watchlist-ribbon--inWatchlist .ipc-watchlist-ribbon__bg-ribbon { + fill: #BB9508 !important; +} +.ipc-switch__slider::before, +.ipc-switch__slider::after { + background: #5799ef !important; +} +.aux-content-widget-2 { + background: none !important; +} + +================================ + +immobilienscout24.de + +INVERT +img[alt^="ImmobilienScout24"] +.topnavigation__sso-login__plus-logo +.button-primary +.main-search__content--rent--from-0 +.result-list-entry__new-flag +.product-teaser__image +.no-of-results-highlighter + +CSS +.result-list__listing { + background-color: transparent !important; +} + +================================ + +inc.com + +INVERT +svg[class*="logo"] + +================================ + +ind.ie + +INVERT +.three-rs .three-rs-list p + +================================ + +independent.co.uk + +INVERT +.logo-text +#MegaMenuButton +.search-toggle +.jw-slider-horizontal +.jw-slider-volume + +IGNORE INLINE STYLE +.logo-svg-cls-2 + +================================ + +inet.se + +INVERT +.h1yh8nho +a.item-button span[class*="icon"] + +CSS +:root { + --svg-icon-default-color: #e8e6e3 !important; +} + +================================ + +infinitysearch.co + +INVERT +img[src$="github.ico"] +img[src$="unsplash.png"] +img[src$="boardreader.ico"] +#logo_img_home[src$="logo_text_black.png"] + +================================ + +info.wyborcza.biz + +INVERT +.imgw + +================================ + +inforlex.pl + +INVERT +div[class="content -dark"] +div[class="loginLogo"] +img[src*="infor-lex_2020.jpg"] +a[class="client-logo-entry"] + +================================ + +informa.com + +INVERT +.header-logo + +================================ + +informatech.com + +INVERT +.log-img + +================================ + +inoreader.com + +CSS +.article_expanded { + background-color: rgb(31, 35, 38) !important; +} + +================================ + +instagram.com + +INVERT +.s4Iyt +.coreSpriteActivityHeart +.coreSpriteAppStoreButton +.coreSpriteCall +.coreSpriteCheck +.coreSpriteCi +.coreSpriteClose +.coreSpriteDesktopNavDirect +.coreSpriteDesktopProfileSaveActive +.coreSpriteDesktopProfileTaggedActive +.coreSpriteDirectHeart +.coreSpriteDownload +.coreSpriteDropdownArrowGrey9 +.coreSpriteGallery +.coreSpriteGooglePlayButton +.coreSpriteKeyhole +.coreSpriteLockSmall +.coreSpriteLoggedOutWordmark +.coreSpriteMobileNavDirect +.coreSpriteMobileNavTypeLogo +.coreSpriteNavBack +.coreSpriteNotificationLeftChevron +.coreSpriteNullProfile +.coreSpriteOptionsEllipsis +.coreSpritePagingChevron +.coreSpriteProfileCamera +.coreSpriteReload +.coreSpriteSaveNull +.coreSpriteSpinstaStory +.coreSpriteStoryCreation +.coreSpriteTaggedNull +.coreSpriteVideoNux +.coreSpriteWindowsStoreButton +.coreSpriteWordmark +.glyphsSpriteAdd__outline__24__grey_9 +.glyphsSpriteAdd_friend__outline__96 +.glyphsSpriteApp_instagram__outline__24__grey_9 +.glyphsSpriteApp_messenger__outline__24__grey_9 +.glyphsSpriteApp_twitter__outline__24__grey_9 +.glyphsSpriteApp_whatsapp__outline__24__grey_9 +.glyphsSpriteCall__outline__24__grey_9 +.glyphsSpriteCamera__outline__24__grey_9 +.glyphsSpriteChevron_down__outline__24__grey_9 +.glyphsSpriteChevron_left__outline__24__grey_9 +.glyphsSpriteChevron_up__outline__24__grey_9 +.glyphsSpriteCircle_add__outline__24__grey_9 +.glyphsSpriteComment__outline__24__grey_9 +.glyphsSpriteContact_import +.glyphsSpriteContact_import_sm +.glyphsSpriteDirect__outline__24__grey_9 +.glyphsSpriteDirect__outline__96 +.glyphsSpriteDownload_2FAC +.glyphsSpriteError__outline__24__grey_9 +.glyphsSpriteError__outline__96 +.glyphsSpriteFacebook__outline__24__grey_9 +.glyphsSpriteFb_brand_center_grey +.glyphsSpriteForward__outline__24__grey_9 +.glyphsSpriteFriend_Follow +.glyphsSpriteGlyph_chevron_right +.glyphsSpriteHashtag__outline__24__grey_9 +.glyphsSpriteHeart__filled__16__grey_9 +.glyphsSpriteHeart__filled__24__grey_9 +.glyphsSpriteHeart__outline__24__grey_9 +.glyphsSpriteHome__filled__24__grey_9 +.glyphsSpriteHome__outline__24__grey_9 +.glyphsSpriteInfo__filled__16__grey_9 +.glyphsSpriteLink__outline__24__grey_9 +.glyphsSpriteLocation__outline__24__grey_9 +.glyphsSpriteLock__outline__24__grey_9 +.glyphsSpriteLock__outline__96 +.glyphsSpriteMail__outline__24__grey_9 +.glyphsSpriteMenu__outline__24__grey_9 +.glyphsSpriteMore_horizontal__outline__24__grey_9 +.glyphsSpriteNew_post__outline__24__grey_9 +.glyphsSpritePaging_chevron +.glyphsSpritePlay__filled__16__grey_9 +.glyphsSpriteSave__filled__24__grey_9 +.glyphsSpriteSave__outline__24__grey_9 +.glyphsSpriteSearch__filled__24__grey_9 +.glyphsSpriteSearch__outline__24__grey_9 +.glyphsSpriteSettings__outline__24__grey_9 +.glyphsSpriteShare__outline__24__grey_9 +.glyphsSpriteShopping__outline__16__grey_9 +.glyphsSpriteStar_filled_24 +.glyphsSpriteStar_half_filled_24 +.glyphsSpriteStory__outline__24__grey_9 +.glyphsSpriteUser__filled__24__grey_9 +.glyphsSpriteUser__outline__24__grey_9 +.glyphsSpriteUser_follow__filled__24__grey_9 +.glyphsSpriteUser_follow__outline__24__grey_9 +.glyphsSpriteUsers__outline__24__grey_9 +.glyphsSpriteVideo_chat__outline__24__grey_9 +.glyphsSpriteWhatsapp__outline__24__grey_9 +.glyphsSpriteX__outline__24__grey_9 +span.LikeSprite.embedSpriteHeartOpen +span.hideText.embedSpriteComment +span.hideText.embedSpriteShare +span.hideText.embedSpriteSaveOpen +span.Sprite.embedSpriteGlyph.hideText +.-Nmqg +svg[aria-label*="Facebook"] +a[role="link"][href="/"] i[role="img"] + +CSS +div > a[tabindex], +div > span > a[tabindex] { + border-color: transparent !important; +} +._ac3p { + background-color: rgb(180, 180, 180) !important; +} +._ac3o { + background-color: rgb(68, 68, 68) !important; +} + +================================ + +instructure.com + +INVERT +.equation_image +.Page-container + +================================ + +interaktywnie.com + +INVERT +img[alt="Interaktywnie.com"] +img[src*="companym/"] + +================================ + +interia.pl + +INVERT +.interia-logo +.search-submit + +CSS +.calendar-date, +.calendar-body { + background-color: var(--darkreader-neutral-background) !important; + background-image: none !important; +} + +================================ + +internetexchangemap.com + +INVERT +div[aria-label="Map"] > div:first-child +div.fade + +================================ + +internetowa.tv + +INVERT +img[src*="/img/"] + +CSS +.star-on-png::before { + color: #FCAD03 !important; +} + +================================ + +interpride.org + +INVERT +.logo .img-responsive + +================================ + +investopedia.com + +INVERT +.widget-ticker-container +.mntl-dotdash-universal-nav__logo + +================================ + +invisioncommunity.com + +INVERT +img[src*="customer_logos.png"] +img[src*="logo_dark.png"] +img[src*="footer"] +.cDownloadsCategoryCount + +CSS +.ipsBadge { + --darkreader-bg--badge--background: var(--darkreader-neutral-background) !important; +} +.ipsReact_reactCount > a, +.ipsReact_reactCount > span, +.elFullInbox_menu, +.ipsMenu_auto, +.ipsMenu_footerBar, +.ipsMenu_headerBar, +.ipsMenu_innerContent, +.ipsMenu_item, +.ipsMenu_sep, +.ipsMenu_title, +.ipsPadding { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +inwestomat.eu + +CSS +main { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +iopscience.iop.org + +INVERT +.article-text img[alt^="$"] + +================================ + +ipinfo.io + +INVERT +.navbar-brand + +================================ + +ipko.pl + +INVERT +.NB3WM + +CSS +._1IGN3 { + background-size: 75px 56px !important; +} +._3cnGx::before { + background-size: 112px 80px !important; +} +._3o8il { + background-size: 48px 48px !important; +} + +================================ + +iplocation.net + +INVERT +img[src="/assets/images/logo.png"] + +================================ + +iqiyi.com + +INVERT +.qy-micro-bg + +================================ + +irishtimes.com + +INVERT +.masthead-block-logo img + +================================ + +is.muni.cz + +INVERT +.isElInput_label_latex +.se-tex-img + +================================ + +isbgpsafeyet.com + +CSS +h1, h2, h3, +h4, h5, h6 { + color: rgb(255, 255, 255) !important; +} +.Hero, .Footer { + background: None !important; +} +.Button-is-primary { + background: var(--primary-background-color); +} + +================================ + +ising.pl + +CSS +body.grey-gui-bg #content, +div.grey-gui-bg, +.small-navy-heading, +.small-blue-heading, +.small-purple-heading, +.small-navy2-heading { + background-image: none !important; +} + +================================ + +istanbulfm.com.tr + +CSS +#jarallax-container-0 { + z-index: 0 !important; +} + +================================ + +itbiznes.pl + +INVERT +.custom-logo + +================================ + +itch.io + +INVERT +.header_widget .mobile_nav_btn + +CSS +.index_page .app_banner .outline_button, +.youtube_game_promo_banner_widget .game_information .cta_button { + border-color: var(--darkreader-neutral-text) !important; +} + +================================ + +item.jd.com + +IGNORE IMAGE ANALYSIS +* + +================================ + +itemfix.com + +INVERT +.logo-outer +.footer-logo +a[href="ll"] + +================================ + +ithardware.pl + +INVERT +.navbar-brand +a[href*="uzywki.expert"] +a[href*="rankingi"] +a[href*="feed"] + +================================ + +iu-fernstudium.de + +INVERT +.cp-logo +.cp-contact-bubble__svg-open +svg[class$="transform"] + +================================ + +iubenda.com + +INVERT +img[alt="Iubenda logo"] + +================================ + +ixbt.com + +CSS +body { + background-color: var(--darkreader-neutral-background) !important; + color: var(--darkreader-neutral-text); +} + +================================ + +jacobinmag.com + +INVERT +.si-hr-nv__icon--menu + +================================ + +jailbreak.fce365.info + +CSS +body { + background-image: none !important; +} + +================================ + +jakdojade.pl + +INVERT +#main-map + +================================ + +jamboard.google.com + +INVERT +.docs-icon-img-container +.jam-button-content +.jam-icon-palette-black +.jam-icon-sticky-note-black + +================================ + +jamendo.com + +INVERT +.player-volume_range_track +.player-volume_range_fill + +================================ + +jared.com +kay.com +banter.com +peoplesjewellers.com +zales.com + +INVERT +.company-logo + +================================ + +java.com + +INVERT +html #jvc0v2.bg1 .jvc0w1 +html #jvc0v2.bg3 .jvc0w1 +html #jvc0v2.bg5 .jvc0w1 + +================================ + +jbl.com + +CSS +.product-tile .product-image .thumb-link img { + mix-blend-mode: normal !important; +} +.search-refinement, +i[class^="icon"].hidden-xs { + color: var(--darkreader-neutral-text) !important; +} +.product-tile .product-image { + background-color: white !important; +} +.product-tile .product-swatches .swatch-list li.selected img, +.product-tile .product-swatches .swatch-list li.selected:hover img { + border-color: white !important; +} + +================================ + +jenkins.io + +IGNORE INLINE STYLE +.logo-jenkins * + +================================ + +jewishcurrents.org + +INVERT +img[alt="Jewish Currents"] + +================================ + +jira.*.com + +INVERT +.aui-dropdown2-trigger::after + +================================ + +jisho.org + +INVERT +h1.logo +.stage + +================================ + +jobs.github.com + +CSS +#page { + background-image: none !important; +} + +================================ + +joemonster.org + +INVERT +#commentHeader +.art-details span +.item-vote-down +.logo +.moderb +.mtv-item-not-working +.vote-down +.vote-up + +CSS +body { + background-image: none !important; +} + +================================ + +joplinapp.org + +CSS +#in-the-press-section { + background-image: none !important; +} + +================================ + +journal.tinkoff.ru + +INVERT +._17-LK > span +._3aEco +._1Dhxk +.uVy35.V6dif::before +._38Vkx.FrrKu::after +._3LO60._4GqdT::after +.PwECA +.best-authors__arrow.best-authors__arrow--active +.best-authors__arrow +label[class^="hamburgerMenu"] + +================================ + +jpl.nasa.gov + +CSS +.brand_area { + background-image: url("https://www.jpl.nasa.gov/assets/images/logo_nasa_trio_white@2x.png") !important; +} + +================================ + +jpmorgan.com + +INVERT +.first-logo + +================================ + +jpost.com + +INVERT +img[alt*="The Jerusalem Post"] +img[class*="header"] +.btn-digital-library-header > img + +================================ + +jsdelivr.com + +INVERT +.navbar-brand > img + +================================ + +juejin.cn + +INVERT +.equation + +================================ + +jumia.* +jumia.*.* +zando.co.za + +INVERT +svg.ic[role="img"]:not([aria-label="Zando logo"]) +.logo > a > img +.inbox > a:not(:nth-of-type(1)) > svg +img[src*="jumia-group-logo.png"] +img[src*="jumia_logo_small_checkout.png"] +img[src*="/Jumia-Pay"] +li.logo:nth-child(1) > .-i-jumia-logo +.-ecosystem > a.-category.-inlineblock.-vatop:not([href*="mall"]) > img +img[src*="empty-cart.png"] +.-header > img:nth-child(1) +.-gy5 > .-fs0 > .vent-link[title*="Rewards"] +.-gy5 > .-fs0 > .vent-link[title*="Pay"] +.-gy5 > .-fs0 > .vent-link[title*="Primo"] +.-gy5 > .-fs0 > .vent-link[title*="Food"] +.-gy5 > .-fs0 > .vent-link[title*="Party"] +.-gy5 > .-fs0 > .vent-link[title*="Now"] +.col4 > .s-menu > a:not(:nth-child(1)):not(:nth-child(3)):not(:nth-child(7)) > svg +div.-fw-w:nth-child(1) > a.-fs0 > img +article.-df > svg > use +svg.ic.xprss +div.-df.-d-co.-c-bet > h3.-fw > svg.ic +a.fk-cb.-me-start.-fsh0 > svg.ic.-h-24 + +================================ + +justhost.ru + +INVERT +.header__logo + +================================ + +justtherecipe.com + +INVERT +flt-glass-pane + +================================ + +juwai.com + +INVERT +.c-header__logo +.c-responsive-navigation__logo + +================================ + +jvc.net + +INVERT +img[src="img/logo.jpg"] + +================================ + +k-report.net + +CSS +.dfzlu1 div, +#diskuse_zahlavi a, +.dfprofil, +#diskuse_zahlavi td { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +kaggle.com +kaggleusercontent.com + +CSS +div.output_png img { + background-color: ${black} !important; +} + +IGNORE INLINE STYLE +div.output_png img + +================================ + +kahoot.it + +INVERT +main[data-functional-selector="correct-answer"] > div > div > div > svg > g > path +main[data-functional-selector="incorrect-answer"] > div > div > div > svg > g > path +main[data-functional-selector="time-up-answer"] > div > div > div > svg > g > path +div[data-functional-selector="kahoot-settings__language-picker"] > div > div > div > div > img +.sc-iqxcLP.klWCeb +g#Background +g#Greyscale +span[data-functional-selector="kahoot-logo"] > svg > g > path + +IGNORE INLINE STYLE +[data-functional-selector^="answer"] +[data-functional-selector="intro-animation-animation_pre-question-animation"] * + +IGNORE IMAGE ANALYSIS +* + +================================ + +kali.org + +CSS +#kali-platforms .card > div { + background-image: none !important; +} + +IGNORE IMAGE ANALYSIS +#banner-logo + +================================ + +kaos-community-packages.github.io + +INVERT +.Header-brand + +================================ + +kaosx.us + +INVERT +.Header-brand img + +================================ + +katahiromz.web.fc2.com + +CSS +body { + background-image: none !important; +} + +================================ + +kaytrip.com + +INVERT +.date +.jd_ss +.liuchengt +.nApp +.nTel +.n_app +.tt_t +.wmap + +CSS +#imageField { + background-color: transparent !important; +} +.jd_xl { + filter: none !important; +} + +================================ + +kbb.com + +IGNORE INLINE STYLE +svg[class*="LogoText"] g + +================================ + +kcsoftwares.com + +CSS +.status-10-fg { + color: #FF14FF !important; +} +.status-20-fg { + color: #FF2190 !important; +} +.status-30-fg { + color: #FFF719 !important; +} +.status-40-fg { + color: #FF1919 !important; +} +.status-50-fg { + color: #0062FF !important; +} +.status-80-fg { + color: #47FF19 !important; +} +.status-90-fg { + color: #727985 !important; +} + +================================ + +keep.google.com + +INVERT +.gb_hc + +================================ + +keepa.com + +INVERT +div#loadingIcon +div.pLText + +================================ + +keepass.info + +INVERT +img[src="help/images/trans.png"] + +CSS +body { + background-image: none !important; +} + +================================ + +keepassxc.org + +CSS +.btn-primary { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +kenh14.vn + +CSS +.kbwcb-left, .kbwcb-left::before { + background-image: none !important; +} + +================================ + +kenmore.com + +INVERT +.navbar-brand + +================================ + +kenwood.com + +INVERT +.logo01 + +================================ + +keyserver.pgp.com + +INVERT +a.button-text +#ImPGPComHelp +#ImPGPComHome +[src="images/crystal_button_left.gif"] +[src="images/crystal_button_left-dark.gif"] +[src="images/crystal_button_right.gif"] +[src="images/crystal_button_right-dark.gif"] +[src="images/global_dir_logo_web.gif"] +[background="images/crystal_button_fill.gif"] +[background="images/crystal_button_fill-dark.gif"] + +CSS +.card-top, .card-top-left-corner, .card-top-right-corner, +.divide-fill, +.header-bar-left, .header-bar-right, +.title-left, .title-right { + background-image: none !important; +} + +================================ + +kfccoupons.co.nz + +CSS +.img-container { + z-index: 0 !important; +} +.img-container > img { + filter: brightness(50%) sepia(40%) !important; +} + +================================ + +khanacademy.org + +INVERT +.svg-image +.graphie-label + +================================ + +khronos.org + +INVERT +.navbar-brand + +================================ + +kiedyprzyjedzie.pl + +INVERT +.cluster-marker div +.leaflet-pane > .leaflet-layer + +CSS +.cluster-marker div span { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +killedbygoogle.com + +INVERT +img[src*="e.svg"] +img[src*="-logo"] + +================================ + +kingston.com + +INVERT +.s-kt-navigation .nav-logo img + +================================ + +kinoart.ru + +INVERT +main > div > svg +header > a > svg +footer > div > svg +header > div > a > svg + +================================ + +kinopoisk.ru + +CSS +input[name="kp_query"]::placeholder { + background-image: linear-gradient(45deg, var(--darkreader-neutral-text) 70%, transparent 100%) !important; +} +input[name="kp_query"] { + background-color: ${lightgray}; +} +input[name="kp_query"]:focus { + background-color: ${rgb(195, 195, 195)}; +} + +================================ + +kinsta.com + +INVERT +.wp-block-kinsta-hero-title +.wp-block-kinsta-hero-title > * + +================================ + +kinzhal.media + +INVERT +img[src$="logo.svg"] +img[src$="search.svg"] +img[src$="close.svg"] +.footer-soc +.footer__18 +.kinzhal-icon + +================================ + +kioxia.com + +INVERT +.header__logo + +================================ + +klubjagiellonski.pl + +INVERT +.logo +.site_hamb svg + +================================ + +knife.media + +INVERT +svg[class$="logo-image"] +.explorer__header-close + +================================ + +knowyourmeme.com + +INVERT +.enlargeNavigation > #enlargeNav-prev +.enlargeNavigation > #enlargeNav-next + +================================ + +ko-fi.com + +INVERT +img[alt="Ko-fi Logo"] +.ui-mobile-nav-toggle + +================================ + +kohls.com + +INVERT +.top-global-header #logo + +================================ + +komorkomat.pl + +INVERT +.navbar-brand > img +.owl-wrapper +.result-item-logo + +================================ + +komputerswiat.pl + +INVERT +.serviceLogoImg +.serviceIcon +.secondaryLogoImg + +================================ + +konkret24.tvn24.pl + +INVERT +.header-left-corner__logo +.menu-button__bars +.report-toggle-button__icon +.search-panel-toggle-button__icon + +================================ + +kopalniawiedzy.pl + +INVERT +img[alt="Patronite"] + +================================ + +korso24.pl +korsosanockie.pl + +INVERT +img.weather-box__img +.nav-top__logo-wrapper +.nav-top__footer-burger > div > span +a.footer__logo + +================================ + +kraken.com + +CSS +header > nav > ul > li > a::after, +span[data-testid^="asset-pair"][data-testid$="-low"] + div > :last-child { + background-color: var(--darkreader-neutral-text) !important; +} + +================================ + +krew.info + +INVERT +a[class*="kropla"] + +================================ + +krita.org + +CSS +.container { + background: none !important; +} + +================================ + +krytykapolityczna.pl + +INVERT +img[src*="logo"] + +================================ + +ksiegowawsieci.pl + +INVERT +.logo + +================================ + +kubuntu.org + +INVERT +.logo + +================================ + +kulinarnyblog.pl + +INVERT +.logo-img + +================================ + +kyivindependent.com + +INVERT +.custom-logo-link +.donate__patreon::before + +================================ + +labfolder.com + +CSS +:root { + --secondary-color: ${#002b56} !important; +} + +================================ + +laczynasnapiecie.pl + +INVERT +.navbar-brand +.tim-power +.row-partners-logo a + +================================ + +lajtmobile.pl + +CSS +body > * { + --background: var(--darkreader-neutral-background) !important; +} +.ls-bg-wrap > img, +.generatorTemplate > .columnsBlockGeneratorBlock.mobileHide { + filter: brightness(50%) sepia(40%) !important; +} +.columnsBlockGeneratorBlock .offertBlock:not(.highlightOffert), +.generatorTemplate > .columnsBlockGeneratorBlock.mobileHide, +.summaryModule, +.formModule, +input[type="text"] { + background: var(--darkreader-neutral-background) !important; +} +.generatorTemplate > .columnsBlockGeneratorBlock.mobileHide > *{ + background: ${#FEF} !important; +} + +================================ + +lambda-the-ultimate.org + +CSS +a { + color: #3391ff !important; +} + +================================ + +lambdalabs.com + +INVERT +.lambda-logo + +================================ + +languagetool.org + +INVERT +#checktext_ifr + +================================ + +laptopmag.com + +INVERT +div#publisherDetails.logo +.qc-cmp-publisher-logo + +================================ + +laravel.com + +CSS +.bg-gray-100, +aside > div { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +last.fm + +INVERT +.resource-external-link--homepage::before +.share-option + +CSS +.user-dashboard-loved-tracks .user-dashboard-big-datapoint-value a { + color: ${#666666} !important; +} +.user-dashboard-catalogue-item-total a { + color: ${#666666} !important; +} +.highcharts-text-outline { + stroke: none !important; +} +.user-dashboard-scalable-content span { + color: ${#666666} !important; +} +.linkfire-button { + --darkreader-border--play-arrow-color: var(--gray-50) !important; +} + +IGNORE IMAGE ANALYSIS +.masthead-logo-loading +.masthead-logo + +================================ + +lastpass.com + +INVERT +.lp-header__logo--link + +================================ + +latex.wikia.org + +INVERT +.mwe-math-fallback-image-inline +.mwe-math-fallback-image-display + +================================ + +latimes.com + +INVERT +.page-logo +.page-header-logo + +================================ + +launchpad.net + +INVERT +.edit-controls +#launchpad-logo-and-name + +CSS +.footer .lp-arcana { + background-image: none !important; +} + +================================ + +leagueoflegends.com + +INVERT +[data-testid="featurednews"] div[class^="style__ItemWrapper"] div[class^="style__Container"] canvas + +CSS +article > div > canvas[class^="style__Canvas"] { + display: none !important; +} +div[class^="style__NavContent"] { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +lear.com + +INVERT +.logo + +================================ + +learnopengl.com + +CSS +#hover { + background-image: none !important; + opacity: 1 !important; +} + +================================ + +leetcode.com +leetcode-cn.com + +INVERT +img[alt="logo"] +.cursor +.CodeMirror-cursor +.user-story-chapter-base .companies-showcase-base .logo + +CSS +div[class^="data-structure-viewer"] g[class^="node"] > circle { + fill: var(--darkreader-neutral-background) !important; +} +[class^=question-picker-detail] { + background: none !important; +} +.monaco-editor, .monaco-editor-background, .monaco-editor .margin { + background-color: var(--darkreader-neutral-background) !important; +} +div#solution img { + background-color: ${black}; +} + +================================ + +legacy.com + +CSS +.Directory { + background-image: none !important; +} + +================================ + +lenovo.com + +INVERT +.m-megaMenu + +CSS +.m-mastheadUtilityLinks { + background: none !important; +} + +================================ + +lesbonscomptes.com + +CSS +.important { + background-color: rgb(92, 92, 61) !important; +} + +================================ + +letters.gov.spb.ru + +INVERT +.leaflet-map-pane + +================================ + +letyshops.com + +INVERT +.header-logo-image + +================================ + +lever.co + +INVERT +a.main-header-logo +div.site-branding + +================================ + +lexar.com + +INVERT +.page_header_wrapper a.logo img + +================================ + +lg.com + +INVERT +.logo +img[src*="/features/"] + +================================ + +liberte.pl +sklep.liberte.pl + +INVERT +img[src*="liberte_logo.svg"] +img[src*="libertesklep.svg"] +.hamburger + +================================ + +libravatar.org + +INVERT +footer::before +.hero::before + +================================ + +libretexts.org + +CSS +.mt-content-container img:hover { + background-color: rgba(255, 255, 255, 0.75) !important; + background-blend-mode: normal; +} + +================================ + +librewolf-community.gitlab.io + +INVERT +[src="/images/search.svg"] +[src="/images/no-looking.png"] + +================================ + +librewolf.com + +CSS +.docs-container .max-w-screen-md .screenshot + .inner { + background-image: linear-gradient( 180deg, rgba(255, 255, 255, 0) 0%, rgba(26, 24, 26, var(--darkreader-bg--tw-bg-opacity)) 50% ) !important; +} + +================================ + +licensing.biz + +INVERT +.logo + +================================ + +lichess.org + +CSS +.time { + z-index: 0 !important; +} + +IGNORE INLINE STYLE +cg-container > svg > line + +IGNORE IMAGE ANALYSIS +.is2d .bishop.black +.is2d .king.black +.is2d .knight.black +.is2d .pawn.black +.is2d .queen.black +.is2d .rook.black +.brown .is2d cg-board + +================================ + +life360.com + +INVERT +.site-header .header-brand img + +================================ + +lifelock.com + +INVERT +.c-topnav__logo-link + +================================ + +lightning.force.com + +CSS +.slds-brand-band, +.slds-brand-band:after, +.slds-brand-band_cover, +.slds-brand-band_medium, +.slds-page-header, +.slds-utility-bar, +.slds-tabs_card, +.slds-card-wrapper, +.slds-grid, +.slds-clearfix { + background-color: var(--darkreader-neutral-background) !important; +} +.slds-card { + background-color: #333333 !important; +} +.slds-button_neutral, +.slds-button--neutral { + color: rgb(20, 150, 20) !important; +} + +================================ + +lightningmaps.org + +INVERT +.bo_map_realtime +.live_ctrl > img + +================================ + +lingvoforum.net + +INVERT +div#header +div#header img.avatar +span.topslice +span.botslice + +CSS +body { + background-image: none !important; +} +div#header { + color: black !important; +} +div#header a:link, +div#header a:visited { + color: black !important; +} + +================================ + +linkedin.com + +CSS +:root { + --color-text-low-emphasis: ${rgba(0,0,0,0.6)}; +} +.js-job-card-company-logo { + background-color: rgba(255, 255, 255, 0.20); + background-blend-mode: color; +} +.global-footer-compact__linkedin-logo, +li-icon[type="linkedin-logo"], +.bug-text-color { + fill: ${black} !important; +} +.pds-ge-entry-card__card { + background: linear-gradient(to bottom, var(--color-action, var(--blue-70, #0073b1)), var(--color-action, var(--blue-70, #0073b1)) 4px, var(--darkreader-neutral-background, #fff) 4px, var(--darkreader-neutral-background, #fff)) !important; +} +.vjs-load-progress { + background-color: hsla(0,0%,100%,.3) !important; +} +.vjs-play-progress, .vjs-play-progress::before, +.vjs-volume-level::before, .vjs-volume-level { + background-color: #fff !important; +} +.vjs-volume-bar { + background-color: hsla(0,0%,100%,.4) !important; +} +img[class*="ghost-"], div[class*="ghost-"] { + background-size: 100% 100% !important; +} +.artdeco-pill { + background-color: ${#ccc} !important; +} +img { + background-color: transparent !important; +} +img[src*="logo"] { + filter: brightness(75%); +} + +================================ + +linode.com + +INVERT +.c-identity__image + +CSS +.o-form__input { + background-color: rgb(41, 44, 46) !important; + border-color: rgb(232, 230, 227) !important; + color: rgb(232, 230, 227) !important; +} +.o-form__input:hover { + background: transparent !important; +} +.o-form__icon::before { + color: rgb(232, 230, 227) !important; +} +.o-form__input::placeholder { + color: rgb(232, 230, 227) !important; +} +.o-button, o-button--secondary { + background-color: rgb(41, 44, 46) !important; + border-color: rgb(232, 230, 227) !important; + color: rgb(232, 230, 227) !important; +} +.o-button:hover { + background: transparent !important; +} + +================================ + +linotype.com + +INVERT +#logo + +================================ + +linustechtips.com + +INVERT +.ipsMenu + +CSS +:root { + --darkreader-bg--badge--background: ${white} linear-gradient(rgba(0,0,0,0.9), rgba(0,0,0,0.9)) !important +} +.ipsHovercard { + background-color: ${#fff} !important; +} + +================================ + +linux-hardware.org + +CSS +#ezcGraphChart > path:first-of-type { + fill: var(--darkreader-neutral-background) !important; +} + +================================ + +linuxfoundation.org + +INVERT +.logo img + +================================ + +linuxgrandma.blogspot.com + +CSS +body { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +linuxuprising.com + +INVERT +.logo + +================================ + +lirc.org + +CSS +body { + background: none !important; +} + +================================ + +literia.pl + +INVERT +.icon-svg-pinterest +.icons-icon-facebook +.sec-logo +.slick-arrow +a::after +a#logo +span.as-label::before +img[alt="ringier axel springer"] + +================================ + +live.com + +INVERT +.ewr-sheettable + +================================ + +live.myvrspot.com + +INVERT +.img-logo + +CSS +.wrap { + background: var(--darkreader-neutral-background); +} + +================================ + +livemint.com + +INVERT +div.icoMenu +a.icoSearch.iconSprite +a.icoBell.iconSprite +a.icoBookmark2.iconSprite +a.icoBookmark3.iconSprite +a.icoTwit.iconSprite +div.icoShare.iconSprite + +================================ + +liveuamap.com + +INVERT +.comment-link::after +.leaflet-pane > .leaflet-layer +.logo +.top-bright > label::after + +CSS +.head-news { + background-image: none !important; +} + +================================ + +lkml.org + +INVERT +img[src*="corner"] + +CSS +body { + background-image: none !important; +} +td.c { + color: ${white} !important; +} +pre[itemprop="articleBody"] a { + color: ${lightblue}; +} + +================================ + +loepenshop.com +bonjourfoto.nl + +CSS +body { + background-image: none !important; +} + +IGNORE IMAGE ANALYSIS +div.art-Header-jpeg + +================================ + +login.assetpanda.com + +CSS +tr, +.main-container { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +login.live.com + +INVERT +div[id$="Proofs"] .tile-img +div.promoted-fed-cred-content > div > div > div > div > img +div#credentialList.form-group > div > div > div > div > div > img +div.pagination-view.has-identity-banner.animate.slide-in-next > div > div > div > img +span.help-button > img +button.backButton > img + +================================ + +login.yahoo.com + +INVERT +.social-login +label[for=persistent]::before +#password-toggle-button + +IGNORE IMAGE ANALYSIS +.social-login + +================================ + +logowanie.edukacja.olsztyn.eu + +INVERT +img[alt="Nagłówek strony"] +img#logo +img[src="/Resources/wylogowano-plansza.jpg"] + +CSS +body { + background-image: none !important; +} + +================================ + +lol.fandom.com + +CSS +.bracket-line:not(.l-down)::after, +.bracket-line::before, +.bracket-spacer.horizontal::before { + border-width: 0 0 2px 0 !important; +} +.bracket-line.z-down::after { + border-width: 0 0 2px 2px !important; +} +.bracket-line.z-down::before { + border-width: 2px 2px 0 0 !important; +} +.bracket-line.z-up::before { + border-width: 0 2px 2px 0 !important; +} +.bracket-line.z-up::after { + border-width: 2px 0 0 2px !important; +} + +================================ + +lovekrakow.pl + +INVERT +.brand + +================================ + +lowendtalk.com + +INVERT +.MeMenu > :last-child +.SpBookmarks + +================================ + +lowes.com + +CSS +img { + mix-blend-mode: normal !important; +} + +================================ + +lsa.umich.edu + +IGNORE IMAGE ANALYSIS +.header-wrap +.giving-wrap + +================================ + +lunapic.com + +INVERT +.toolbar-button +.square-toolbar-button + +IGNORE INLINE STYLE +.color-well-color + +================================ + +lux.camera + +CSS +.u-content-background { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +m.dianping.com + +INVERT +.flash-screen +.header-download-img + +================================ + +m.genk.vn + +CSS +.news .li { + background-image: none !important; +} + +================================ + +m.motonet.fi + +CSS +form#haku input[type="text"], #select_my_motonet { + color: var(--darkreader-neutral-text); +} + +================================ + +m.slashdot.org + +CSS +.slashbar, +.story-prop, +#discussion, +#filler { + background-image: none !important; +} + +================================ + +machinelearningmastery.com + +INVERT +img.size-full.wp-image-7676 + +================================ + +madshi.net + +CSS +body, +tr, +td { + background-image: none !important; +} + +================================ + +magazine.skyeng.ru + +INVERT +.header__logo__img + +================================ + +magazynbieganie.pl + +INVERT +.logo-box + +================================ + +magic.freizeitspieler.de + +INVERT +img[src="pics/MtG-Freizeitspieler.gif"] + +CSS +body { + background-image: none !important +} + +================================ + +magister.net + +INVERT +.bottom > img + +CSS +.splash-container { + z-index: 0 !important; +} +.cijfers-k-grid.k-grid .grade.empty { + background-image: none !important; + background-color: ${#cfcfcf} !important; +} + +================================ + +mail.google.com + +INVERT +.asor_t0 +.asor_i4 +.d-Na-Jo.d-Na-N-ax3 +.RK-QJ-Jk +.RK-Mo.RK-Qq-LF +#ita-st-id-cs +.d-Na-N-M7-JX.d-Na-J3 +.gb_df +img[src$="google_gsuite"] +img[src$="profile_mask2.png"] +.rY>.sa +.buh +.n3 .qr +.aii + .qj +.aih + .qj +.asor +.mixmax-flyout__wrapper +div[aria-label="Hangouts"] > div[role="tablist"] > div[tabid="chat"] > div +form[method="POST"] ~ table div[style] > div > :first-child button:not([string]):not([id]) +img[src^="//ssl.gstatic.com/ui/v1/icons/common/x"] +div[style$="gm_add_black_24dp.png)"] + +CSS +@media (min-resolution: 144dpi), (-webkit-min-device-pixel-ratio: 1.5) { + .buk { + background-image: url(//ssl.gstatic.com/ui/v1/icons/mail/rfr/density_default_v1_2x.png) !important; + } + .bui { + background-image: url(//ssl.gstatic.com/ui/v1/icons/mail/rfr/density_comfortable_v1_2x.png) !important; + } + .buj { + background-image: url(//ssl.gstatic.com/ui/v1/icons/mail/rfr/density_compact_v1_2x.png) !important; + } +} +.buk { + background-image: url(//ssl.gstatic.com/ui/v1/icons/mail/rfr/density_default_v1_1x.png) !important; +} +.bui { + background-image: url(//ssl.gstatic.com/ui/v1/icons/mail/rfr/density_comfortable_v1_1x.png) !important; +} +.buj { + background-image: url(//ssl.gstatic.com/ui/v1/icons/mail/rfr/density_compact_v1_1x.png) !important; +} +div[class*="bym"][role="navigation"] { + background-color: var(--darkreader-neutral-background) !important; +} +.ain .TO, +.TO.ol { + background-color: rgba(255,255,255,0.05) !important; +} +::-webkit-scrollbar-thumb { + background-color: #424242 !important; +} +::-webkit-scrollbar { + background-color: transparent !important +} +.aRg, +.aRj { + color: ${white} !important; +} + +IGNORE INLINE STYLE +.at +.au +.av +.qj +.hU.hM +.hV.hM +.ajZ-Jt +.aH5 +.JA-Kn-Jr-Kw-Jt + +================================ + +mail.jwpub.org/owa + +IGNORE IMAGE ANALYSIS +.image-font-png +.image-font_size-png +.image-bold-png +.image-italic-png +.image-underline-png +.image-backcolor-png +.image-forecolor-png +.image-insertunorderedlist-png +.image-insertorderedlist-png +.image-outdent-png +.image-indent-png +.image-justifyleft-png +.image-justifycenter-png +.image-justifyright-png +.image-createlink-png +.image-unlink-png +.image-superscript-png +.image-subscript-png +.image-strikethrough-png +.image-alttext-png +.image-blockdirltr-png +.image-blockdirrtl-png +.image-undo-png +.image-redo-png +.image-removeformat-png +.image-table_icon-png +.image-insertpicture-png +.image-emoji-png +.image-format-png + +================================ + +mail.qq.com + +INVERT +.listbg +.navbar +.topline +.topbg +.todaybar_ad_bg +.navbottom +.search_subject .smartsearch +#searchIcon + +CSS +.fdbody, .tipstitle { + background-color: ${#9bbb59} !important; +} +.fdbody { + border-left-color: var(--darkreader-neutral-background) !important; +} +.readmailinfo, .settingtable, .tabtitle td.selected, .biginfo, .tipstitle, .colorsure { + background-color: ${#ebf4d8} !important; +} +.toolbgline, .tabtitle td, .readmailinfo, .settingtd, .addr_line, .filtertd1, .bartools { + border-bottom-color: ${#87a34d} !important; +} +.toolbg, .toolbg1, .tabtitle, .addrsort { + background-color: ${#bed393}; +} +.attbg { + background-color: ${#dceac0} !important; +} +body[module="qmReadMail"] { + background-color: var(--darkreader-neutral-background) !important; + color: var(--darkreader-neutral-color) !important; +} +.selbar_bt { + background-color: var(--darkreader-neutral-background) !important; + border-top-color: var(--darkreader-neutral-background) !important; + border-bottom-color: var(--darkreader-neutral-background) !important; +} +table.O2 td { + border-bottom-color: ${#c1c8d2} !important; +} +body[accesskey], +.cpright { + background-color: var(--darkreader-neutral-background) !important; +} +.B, .nomail, .colortitle { + background-color: ${#a9b3b6} !important; +} +.settingTitle .selected { + color: ${#ebf4d8} !important; +} + +================================ + +mail.tutanota.com + +CSS +div.mb > div > svg > path { + fill: black !important; +} + +================================ + +mailbox.org + +CSS +body.bg-blog { + background-image: none !important; +} +.common .mod_article > .inside { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +makeuseof.com + +IGNORE IMAGE ANALYSIS +.header-logo + +================================ + +manage.buyvm.net + +INVERT +.legend-container + +================================ + +manjaro.org + +CSS +.bg-teal-accent-400, +.bg-teal-accent-400 path { + background-color: ${rgb(29,233,182)} !important; + fill: ${rgb(29,233,182)} !important; +} + +IGNORE INLINE STYLE +.bg-teal-accent-400 path + +================================ + +manualslib.com + +IGNORE IMAGE ANALYSIS +div.pdf + +================================ + +map.qq.com + +INVERT +#FullScreen +#Logo +#Map +.MenuPanelCheckbox +.MenuPanelContent +.nextStep +.prevStep +.textInput +.titleText +.traffic_next +.traffic_rightbg_b2 +.traffic_rightbg_m +.traffic_rightbg_m3 +.traffic_rightbg_t2 + +================================ + +mapa-turystyczna.pl + +INVERT +.ts-map svg + +================================ + +maps.metager.de + +INVERT +.map canvas + +================================ + +marginalrevolution.com + +INVERT +.logo-mobile +.logo-desktop +img[src$="mru-logo-450.png"] + +CSS +nav { + background-color: #288d73 !important; +} + +================================ + +mariadb.org + +INVERT +.featured-header-image + +================================ + +marinij.com + +INVERT +.custom-logo.logo > a > img + +================================ + +market.yandex.* + +INVERT +ymaps[class$="ground-pane"] +ymaps[class$="svg-icon-content"] > ymaps + +================================ + +marketplace.visualstudio.com + +CSS +.ux-updated-date { + color: ${rgb(55, 255, 0)} !important; +} +.ms-Grid-row { + color: ${rgba(0, 0, 0, .8)} !important; +} + +================================ + +markmcgranaghan.com + +CSS +body { + background-color: transparent !important; +} + +================================ + +marktplaats.nl + +INVERT +.mp-Header-logo +.mp-svg-messages +.mp-svg-notification +.mp-svg-profile +.svg-icon-block + +================================ + +mastarti.com +streamguard.cc + +INVERT +.fp-play-icon div +.fp-pause-icon .fp-pause-block div +.fp-volumebar em.fp-color +.fp-fullscreen-line +.fp-fullscreen-dot + +================================ + +math.semestr.ru + +INVERT +.img-online + +================================ + +math.tamu.edu + +INVERT +div[align="center"] > p + p > img + +================================ + +mathsisfun.com + +CSS +#searchFld { + background-color: var(--darkreader-neutral-background) !important; + border-color: black !important; +} +#searchBtn { + border-color: black !important; + background-color: var(--darkreader-neutral-background) !important; +} +#content h1 { + color: var(--darkreader-neutral-text) !important; +} +#hdr { + opacity: 0.2; +} +#menuWide li{ + background-color: rgb(64, 99, 255) !important; + color: white !important; +} +#menuWide li:hover { + background-color: rgb(18, 35, 112) !important; +} + +================================ + +matomo.org + +INVERT +img[alt*="WordPress"] +img[src*="Mailfence"] +img[src*="sampling"] +img[src*="logo"] +img.mega-menu-logo + +CSS +select, .elementor-text-editor, .elementor-text-editor *, +.elementor-blockquote *, .elementor-testimonial *, +.elementor-price-table * { + color: var(--darkreader-neutral-text) !important; +} +.elementor-card-shadow-yes .elementor-post__card:hover { + box-shadow: rgb(76 75 75 / 42%) 0px 0px 30px 0px; +} +.elementor-card-shadow-yes .elementor-post__card { + box-shadow: rgb(0 0 0 / 23%) 0px 0px 10px 0px; +} + +================================ + +matrix.org + +INVERT +.mxnavbar__logo +.mxnavsection__icon +.mxgrid__item__bg__img +.mxblock__explore__item__img +a[aria-label="matrix live permalink"] > svg +a > svg + +================================ + +matrix.to + +INVERT +div.footer > p > img + +================================ + +matsci.org + +INVERT +.d-header #site-logo + +CSS +.category-logo.aspect-image img { + background-color: white !important; +} + +================================ + +matters.news + +INVERT +.splash-screen .icon +.logo .icon + +CSS +section[class$="container"][style^="background-image"] { + background-image: none !important; +} + +================================ + +mcbsys.com + +INVERT +.site-branding +.icon-image + +================================ + +mcdonalds.com + +INVERT +.cmp-global-header__logo + +================================ + +mediawiki.org + +INVERT +#p-logo-text +.mw-logo-wordmark +img[alt="audio speaker icon"] + +IGNORE IMAGE ANALYSIS +.mw.wiki-logo + +================================ + +medium.com + +INVERT +.svgIcon +.svgIcon-use +div[role="separator"] + +================================ + +medium.freecodecamp.org + +CSS +span.markup--quote.markup--p-quote.is-other { + background-image: linear-gradient(rgba(14, 255, 167, 0.2), rgba(14, 255, 167, 0.2)) !important; +} + +================================ + +medrxiv.org + +INVERT +.blood_logo +.logo-img + +================================ + +meet.google.com + +IGNORE INLINE STYLE +svg[preserveAspectRatio*="meet"] * + +================================ + +meet.jit.si + +IGNORE INLINE STYLE +.jitsi-icon * + +================================ + +mega.nz + +INVERT +a.fm-files-view-icon +a.top-icon.menu +div.checkdiv.megaapp-download.checkboxOff.switches +div.fm-dialog-close.medium +div.nw-tree-panel-arrows.icons-sprite +i.small-icon.context +i.small-icon.dialog-sprite.arrows-to-bottom +i.small-icon.dialog-sprite.arrows-to-top +i.small-icon.download-as-zip +i.small-icon.icons-sprite.tiny-grey-tick +i.small-icon.import-to-cloud +i.top-menu-icon.menus-sprite +i.transfer-progress-icon +span.top-icon.language + +CSS +.grid-wrapper { + outline-color: var(--darkreader-bg--surface-main); +} +.topbar-searcher { + background: var(--darkreader-bg--surface-grey-2) !important; +} + +================================ + +meituan.com + +INVERT +.dpLogo +.header-title +.site-logo + +================================ + +mendeley.com + +CSS +.highlightLayer * { + background-color: var(--darkreader-selection-text) !important; +} + +================================ + +mercury.postlight.com + +INVERT +.SVGInline-svg path +#merc-logo +[src^="/_/src/components/images/reader_kindle_image"] +[href="https://postlight.com/"] > svg > g > path +[src^="/_/src/components/images/reader_tout_image"] +[src^="/_/src/components/images/phone"] +.w-0-m.db-l.dn.cover.w-50 + +================================ + +merriam-webster.com + +INVERT +circle.outline.Oval + +CSS +.logo-cnt path[fill="#004990"] { + fill: ${#0085e0} !important; +} + +================================ + +mesa3d.org + +INVERT +[data-bs-toggle="collapse"] > a > svg + +================================ + +messages.android.com + +INVERT +.x4Tquc +.QrWqSe +.XCHXxd +.pXeIKc + +================================ + +messages.google.com + +INVERT +.x4Tquc +.QrWqSe +.XCHXxd +.pXeIKc + +CSS +.input-background { + --input-bg-fade-color: #202124 !important; +} + +================================ + +messenger.com + +INVERT +._4rv6 +a._4ce_ +div[aria-label="Change Position"] +div[role="slider"] + +CSS +._8rsr { + fill: #0098ff !important; +} +._576q mask path { + fill: white !important; +} +._576q mask rect { + fill: black !important; +} +._576q div { + background-color: transparent !important; +} +.j7vl6m33, .a8c37x1j, .bp9cbjyn, mask[id*="jsc_c"] > circle { + fill: var(--always-white) !important; +} +.a8c37x1j > rect { + fill: var(--darkreader-bg--fds-white) !important; +} +:root, .__fb-light-mode { + --filter-disabled-icon: invert(100%) opacity(30%) !important; + --filter-placeholder-icon: invert(59%) sepia(11%) saturate(200%) saturate(135%) hue-rotate(176deg) brightness(96%) contrast(94%) !important; + --filter-primary-icon: invert(100%) !important; + --filter-secondary-icon: invert(62%) sepia(98%) saturate(12%) hue-rotate(175deg) brightness(90%) contrast(96%) !important; + --filter-warning-icon: invert(77%) sepia(29%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(128%) hue-rotate(359deg) brightness(102%) contrast(107%) !important; + --filter-blue-link-icon: invert(73%) sepia(29%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(103.25%) hue-rotate(189deg) brightness(101%) contrast(101%) !important; + --filter-positive: invert(37%) sepia(61%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(115%) hue-rotate(91deg) brightness(97%) contrast(105%) !important; + --filter-negative: invert(25%) sepia(33%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(200%) saturate(110%) hue-rotate(345deg) brightness(132%) contrast(96%) !important; +} +.qbubdy2e { + fill: none !important; +} +.tdjehn4e, .oo1teu6h { + background-color: rgba(255, 255, 255, 0.1) !important; +} +.tdjehn4e:hover, .ovq5dppa:hover { + background-color: rgba(255, 255, 255, 0.2) !important; +} +::after { + border-left-color: #1c1e20 !important; + border-bottom-color: #1c1e20 !important; + border-top-color: #1c1e20 !important; + border-right-color: #1c1e20 !important; +} +i.eb18blue { + filter: none; +} +div[style][title] > div[style^="transform"] { + z-index: 0 !important; +} +.cetpsuna { + fill: none !important; +} + +IGNORE INLINE STYLE +[role="button"] svg +[role="button"] svg line +div svg[viewBox="0 0 36 36"] mask path +mask > rect +g > rect + +================================ + +metacareers.com + +INVERT +a[href="/"] img.img +#careersContentContainer div[style^="background-image: "] +#careersContentContainer div[style^="background-image: "] > * + +================================ + +metal.equinix.com + +INVERT +.tw-logo + +================================ + +meteo.imgw.pl + +INVERT +.meteo-chart > div > canvas + +CSS +.menu-close img { + filter: none !important; +} + +IGNORE IMAGE ANALYSIS +.gory-imgw a + +================================ + +metrics.torproject.org + +INVERT +img[src^="/images/flags/"] +g > text +g > line + +CSS +.dot { + fill: var(--darkreader-neutral-background) !important; +} +div > img[src] { + filter: invert(90%) !important; +} + +================================ + +metrobyt-mobile.com + +INVERT +#digital-header-logo-img + +CSS +#Desktop-img { + z-index: 0 !important; +} + +================================ + +mewe.com + +CSS +body > .ember-view { + background-color: ${#ebf0f3} !important; +} +body > .ember-view.dialog_wrapper { + background-color: transparent !important; +} + +================================ + +microsoft.com + +INVERT +.m-updated-quicklinks .c-carousel.f-single-slide ul > li > a.c-hyperlink > img.large-icon +.carousel-inner .card-background +.key-message .card-background +.animated-hero-media + +CSS +#announce picture + div h3, +#announce picture + div p, +.edgeconsumer.features .m-hero h1, +.edgeconsumer.features .m-hero p { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +microsoftedge.microsoft.com + +INVERT +rect[x="7.5"] +text[text-anchor="middle"] + +================================ + +midkar.com + +CSS +body { + background-image: unset !important; +} + +================================ + +miktex.org + +INVERT +.icon-bar + +CSS +body, +.site-footer { + background-image: none !important; +} + +================================ + +mikufan.com + +IGNORE IMAGE ANALYSIS +#header-container + +================================ + +minecraftskins.com + +CSS +.farbtastic .overlay { + background-image: url("https://www.minecraftskins.com/bundles/app/images/mask.png") !important; +} + +IGNORE INLINE STYLE +.color +#color + +IGNORE IMAGE ANALYSIS +.farbtastic .overlay + +================================ + +minesweeper.online + +IGNORE IMAGE ANALYSIS +* + +================================ + +minsu.dianping.com + +INVERT +.zg-map + +================================ + +mint.intuit.com + +INVERT +.recharts-cartesian-axis-ticks + +CSS +[class*="ExpandableCard-wrapper"] { + background: none !important; +} + +IGNORE INLINE STYLE +.recharts-sector + +================================ + +miro.com + +INVERT +#pixiCanvasContainer > :nth-child(1) +.b-icon + +================================ + +mit.edu + +INVERT +.mit-logo + +================================ + +mitx.* + +CSS +img { + background-color: white !important; +} + +================================ + +mixcloud.com + +INVERT +.cQABPj + +IGNORE INLINE STYLE +path[fill="none"] +path[fill-rule="evenodd"] + +================================ + +mjtnet.com + +INVERT +.navbar-brand + +================================ + +mlb.com + +CSS +#percentile-rank text, +.legend { + fill: var(--darkreader-neutral-text) !important; +} + +================================ + +mnt.ee + +CSS +#zone-content-wrapper { + color: var(--darkreader-neutral-text) !important; +} +#zone-content { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +mobiel.nl + +INVERT +.credit-warning__image +.dt-carousel-home__dots +.spec__network +img[alt="Tele2"] +img[alt="hollandsnieuwe"] +.header-main__icon +.spec__network-ready + +IGNORE INLINE STYLE +.version-without-subscription-row__color +.gEJLdA + +================================ + +moegirl.org.cn + +CSS +span.heimu a.external, +span.heimu a.external:visited, +span.heimu a.extiw, +span.heimu a.extiw:visited { + color: #dadada !important; +} +.heimu, +.heimu a, +a .heimu, +.heimu a.new { + background-color: #dadada !important; + color: #dadada !important; +} +body:not(.heimu_toggle_on) .heimu:hover, +body:not(.heimu_toggle_on) .heimu:active, +body:not(.heimu_toggle_on) .heimu.off { + color: black !important; +} +body:not(.heimu_toggle_on) .heimu:hover a, +body:not(.heimu_toggle_on) a:hover .heimu, +body:not(.heimu_toggle_on) .heimu.off a, +body:not(.heimu_toggle_on) a:hover .heimu.off { + color: darkblue !important; +} +body:not(.heimu_toggle_on) .heimu.off .new, +body:not(.heimu_toggle_on) .heimu.off .new:hover, +body:not(.heimu_toggle_on) .new:hover .heimu.off, +body:not(.heimu_toggle_on) .heimu.off .new, +body:not(.heimu_toggle_on) .heimu.off .new:hover, +body:not(.heimu_toggle_on) .new:hover .heimu.off { + color: #BA0000 !important; +} + +================================ + +mojosoft.com.pl + +INVERT +img[src*="logo16"] +img[src*="img/iko"] +img[src*="img/ideabank"] +img[src*="img/logo"] +img[src*="img_logo"] +#searchbox + +CSS +#viewsh, +#view, +#szukajka, +header, +header.smaller #szukajka .inputsearch, +#search_query, +#mainMenusmall { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} +#searchbox, +select { + color: var(--darkreader-neutral-background) !important; +} + +IGNORE INLINE STYLE +header.smaller + +================================ + +moluch.ru + +INVERT +.logo + +CSS +body { + background-image: var(--darkreader-neutral-background) !important; +} + +================================ + +money.pl + +CSS +.dynks { + color: ${#666666} !important; +} +a[href$="twitter.com/money_pl"] path:first-of-type { + --darkreader-inline-fill: transparent !important; +} + +================================ + +mongodb.com + +INVERT +img[alt="MongoDB logo"] + +================================ + +monitor.firefox.com + +INVERT +svg[class="Mozilla-logo"] > path[fill="#ffffff"] +.fx-bento-app-link.fx-bento-link.fx-mobile > span::before +img[src="/img/svg/laptop.svg"] +img[src="/img/svg/globe.svg"] +img[src="/img/svg/vpn.svg"] +button[class="vpn-banner-close"] + +================================ + +monokai.pro + +INVERT +.c-icon-process + +================================ + +monstercat.com + +CSS +.volume-slider-outer { + z-index: -99999999999; + background-color: ${#4d4d4d} !important; +} +.volume-slider-inner{ + background-color: ${#1873cc} !important; +} +.volume-slider-handle { + background-color: ${#1d1d1d} !important; +} +.title, h3, .line-bottom, .line-top, a, .one-line-ellipsis { + color: ${#4b4e50} !important; +} + +================================ + +monta.ir + +INVERT +.floatLeft +.formula-pack > img +.m--content-panel > div > div > canvas +.highcharts-background +.customized-field +.source +.choice > .layoutImageInline +.choice > img +.choice > div > img +.navbar-item > img +.empty_state_student +progress +td > img +.notice > div > img +td > div > img +.extrapractice > div > img +.extrapractice > div > div > img +.empty_teacher +.GO5O4PB-gc-b +.GO5O4PB-gc-i +.GO5O4PB-gc-e +.GO5O4PB-gc-i > div +.GO5O4PB-gc-Eb > div > a +img.is-rounded +img.is-128x128 + +CSS +.GO5O4PB-gc-n { + background-image: none !important; +} + +================================ + +moodle.herzen.spb.ru + +INVERT +.img-responsive + +================================ + +moovitapp.com + +INVERT +.map +.logo + +================================ + +morele.net + +INVERT +.h-logo.col +.h-control-btn > [src="/static/img/shop/icon-bezpieczna-dostawa.svg"] +.swiper-slide-visible.mx-auto.swiper-slide > .d-flex.img-container +div.cn-different-frontend.cn-menu-item-hover.cn-shop > .cn-main-name.cn-name > .cn-name-value > span:nth-of-type(1) + +================================ + +morningstar.com + +INVERT +.mbc-legend-top +.mbc-legend-bottom +.mbc-legend-item-date +.mdc-medal +.mdc-icon +.legend-group +.legend-box-text +.mbc-chart-group +.square-text +.min-max +.axis .tick +.axis .name +.mbc-axis .tick +.mbc-chart-legend-inner +.mbc-layers .tick + +================================ + +mos.ru + +INVERT +div[class^="src-components-Map-___styles-module__map_container"] +div[class^="src-components-Map-___styles-module__control"]::before +div[class^="src-components-Map-___styles-module__control"]::after +#map_div_container +#points_layer > text + +================================ + +motherjones.com + +INVERT +.logo +.footer-logo +.menu-button + +================================ + +moto.pl + +INVERT +img[src="https://bi.im-g.pl/im/0/24525/m24525630.png"] + +CSS +.main_wrapper, +.top_section_bg, .bottom_section_bg { + background-color: ${#e5e5e5} !important; +} + +================================ + +motorsport.com + +CSS +.ms-schedule-table__cell { + background-color: var(--darkreader-neutral-dark) !important; +} + +================================ + +mozilla.net + +INVERT +.css-editor-container header h4::before + +================================ + +mp.weixin.qq.com + +INVERT +.audio_card_progress +.audio_card_progress_handle + +================================ + +msi.com + +INVERT +a.logo +.site-logo +.site-header-menu-toggle--button span +.flickity-button-icon +.homeLink__logo + +CSS +#MSI_Support .top-headBg, +#MSI_Support .top-head, +#MSI_Support .main-contact-support { + background-image: none !important; +} +.related__link > .related__title, +.service__link > .service__head { + z-index: 1 !important; +} + +================================ + +msmgtoolkit.in + +CSS +.cid-r89gzwx5mR .mbr-section-title { + color: ${white}; +} +.cid-r89gzwx5mR .mbr-section-subtitle { + color: ${white}; +} + +================================ + +msn.com + +INVERT +.logowrapper + +================================ + +msys2.org + +CSS +body { + background-image: none !important; +} + +================================ + +mt.lv + +CSS +.graph > text { + fill: var(--darkreader-neutral-text) !important; +} + +================================ + +mturk.com + +INVERT +[src="/assets/images/how-it-works.png"] +[src="/assets/images/requester_signup.svg"] +[src="/assets/images/worker_signup.svg"] +.lb-mid-8.lb-tiny-24.lb-col > .lb-img > div + +================================ + +mullvad.net + +CSS +#bg { + fill: #192E45; +} + +================================ + +multitran.com + +CSS +body { + background-image: none !important; +} + +================================ + +mumble.info + +INVERT +.os +.suggested-download-button-caption + +================================ + +muratordom.pl + +INVERT +.logo + +================================ + +murena.com + +INVERT +picture.wordmark--link + +================================ + +musclewiki.com + +INVERT +img[src="/static/images/logo.png"] + +================================ + +music.163.com + +INVERT +.btns +.cor +#g_backtop +#g_player +.hot +.logo +.m-playbar +.m-table thead +.u-btn2 +.u-lv +.u-btn +.m-tabs +.n-srch .pgsrch +.n-srch .pgsrch .btn +.n-srch .pgsrch .srch + +CSS +.n-myinfo { + background-image: none !important; +} + +================================ + +music.amazon.* + +CSS +.listViewStatusButtonInLibrary .add, +.listViewStatusButtonInLibrary .added { + background-color: ${black} !important; +} +.slider .scrubber, +.slider .scrubberHandle, +.slider .sliderTrackRemainder { + background-color: ${black} !important; +} + +================================ + +music.apple.com + +INVERT +body:not(.dark-mode) .web-navigation__logo-link.button-reset.ember-view +body:not(.dark-mode) .native-upsell__logo +body:not(.dark-mode) .native-upsell__action +body:not(.dark-mode) .dt-search-box__icon +.web-chrome-playback-controls +.dt-media-contextual-menu +.web-chrome-playback-lcd__contextual-badge--non-marquee.web-chrome-playback-lcd__contextual-badge +.love-or-popular__popular.love-or-popular__glyph +.web-chrome-playback-lcd__progress-bar-container +.web-chrome-playback-lcd__volume + +================================ + +musictheory.net + +INVERT +[data-musictheory-id="lesson"] canvas + +================================ + +my.bible.com + +CSS +.nav-title { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +my.cofc.edu + +CSS +.container { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +my.contabo.com + +CSS +#mainmenu > div, +#submenu > div, +.button, +.ui-button { + background-image: none !important; +} +.ui-button { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +my.frantech.ca + +INVERT +.logo + +================================ + +my.nextdns.io + +INVERT +.mt-2.mb-4.text-center +img[src*="/static/media/logo-large"] +img[src*="/static/media/samsung"] +img[src*="/static/media/sonos"] +.d-md-inline > img +.settings-button +.stream-button +.tooltipParent > img +.list-group-item > div > img +.d-flex > .text-break > img +.d-flex > .flex-grow-1 > div > img +.d-flex.align-items-center.flex-wrap a img + +CSS +.text-right[style*="opacity: 0.3"] { + opacity: 0.6 !important; +} +g.rsm-geographies { + filter: invert(1) hue-rotate(180deg) brightness(130%) !important; +} +img[src*="/misc/flags/"] { + filter: revert !important; +} + +================================ + +my.nintendo.com + +CSS +.Layout-app, +.signUpButton { + background-image: none !important; +} + +================================ + +myaccount.google.com + +INVERT +c-wiz ul img + +================================ + +myaccount.suse.com + +INVERT +.auth-org-logo +.logo + +================================ + +myanimelist.net + +CSS +body:not(.ownlist) { + background-color: var(--darkreader-neutral-background) !important; +} +body { + background-image: none !important; + background-color: var(--dakreader-neutral-background) !important; +} + +================================ + +mybrandnewlogo.com + +IGNORE INLINE STYLE +.b-logo-wrap * + +================================ + +myfood4less.com + +INVERT +.elementor-widget-theme-site-logo + +================================ + +mymenu.be + +INVERT +.close-icon + +CSS +.uix-steps .item.active .number { + color: ${darkred} !important; +} + +IGNORE INLINE STYLE +.uix-tracking .information .step .number + +================================ + +myunidays.com + +INVERT +.title +.menu-btn-icon + +================================ + +mywikis.com + +INVERT +.heading-primary +.heading-subtext +.hero + +================================ + +n.maps.yandex.ru +mapeditor.yandex.com + +INVERT +span[class*="nk-icon_id_commit-"] > svg > g > path +span[class*="nk-icon_id_business-feedback-task"] > svg > g > path + +================================ + +nalog.ru + +INVERT +.header__logo + +================================ + +naps2.com + +CSS +.os-icon[title="Linux"] { + background-color: white !important; +} + +================================ + +narimiran.github.io/nim-basics + +CSS +body, +#toc.toc2 { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +nasa.gov + +IGNORE IMAGE ANALYSIS +.vjs-has-started .vjs-control-bar .vjs-control.vjs-logo-image + +================================ + +naszemiasto.pl +strefabiznesu.pl + +INVERT +.componentsNavigationNavbar__logo +.atomsNavigationFooterLinks__logo + +================================ + +natemat.pl +aszdziennik.pl +innpoland.pl +dadhero.pl +mamadu.pl + +INVERT +img[src*="/static/media/"] +img[alt="close icon"] +a[href="#comments"] +.st1 + +CSS +img[class*="Footer--Logo"] { + background-color: #fff !important; +} + +================================ + +nationalgeographic.com + +INVERT +.NavBar__Logo__Container + +================================ + +nature.com + +INVERT +.c-header__logo +[href="#search-menu"] > svg +.c-header__link--chevron > svg +img[alt="Nature Careers"] + +================================ + +nauka.rocks + +INVERT +.navigation-branding + +================================ + +navalnews.com + +INVERT +.logo + +================================ + +nba.com + +INVERT +.nlProgressBar + +================================ + +nbc12.com + +INVERT +div.logo.logo-slim +div.logo.logo-large.logo-footer + +IGNORE IMAGE ANALYSIS +.logo + +================================ + +nbcphiladelphia.com + +INVERT +.site-footer__social-list-item .icon + +================================ + +nbi.ku.dk + +CSS +.tile-link { + color: var(--darkreader-neutral-color) !important; +} + +================================ + +nec.com + +INVERT +.logo + +================================ + +nejm.org + +INVERT +a[href="/"] svg + +================================ + +neonet.pl + +INVERT +div[class^="newsSingleBar"] > div[class^="newsSingleBarHeaderWidescreen-category"] + +CSS +div[class^="newsSingleBar"] > div[class^="newsSingleBarHeaderWidescreen-category"] { + color: ${white} !important; +} + +================================ + +neowin.net + +INVERT +.comment-link +.news-view-switcher span +.author a.twitter-link +.meta-comments +.comment-link::before +.select-wrap::after +#report-article::before +#comment-help::before + +CSS +.select option { + background-color: #1c1e1f !important; + color: white !important; +} + +================================ + +nerdschalk.com + +INVERT +.logo-default + +================================ + +nerdwallet.com + +IGNORE INLINE STYLE +#global-nav * + +================================ + +nero.com + +INVERT +.navbar-brand + +================================ + +netlify.com + +INVERT +.masthead-home-logo + +CSS +[data-darkreader-inline-fill] { + fill: var(--scrim-icon-color) !important; +} + +================================ + +netzpolitik.org + +INVERT +img[src*="/wp-content/themes/liebefeld/images/netzpolitik_logo.svg"] +img[src*="/wp-content/themes/liebefeld/images/palasthotel.svg"] +a.menu__canvas--toggle + +================================ + +newegg.com + +CSS +.show-img-bg .goods-img:not(.bg-lightgray), +.show-img-bg .goods-img > img { + mix-blend-mode: normal !important; +} + +================================ + +news.mit.edu + +INVERT +.logo > .mit-news + +================================ + +news.mynavi.jp + +INVERT +.itsearch-head .logo +.site-header__bnr +.site-header__logo + +================================ + +news.yahoo.com + +INVERT +#uh-logo +.vp-handle + +================================ + +news.ycombinator.com + +INVERT +.votearrow + +================================ + +newyorker.com + +INVERT +[data-testid="Logo"] +[class*="Logo__logo"] + +================================ + +nexojornal.com.br + +INVERT +.g-aiImg + +================================ + +nextdns.io + +CSS +.index .key-features .feature.blocklists { + background-image: none !important; +} + +IGNORE INLINE STYLE +path.rsm-geography + +IGNORE IMAGE ANALYSIS +.index .hero .content .logo + +================================ + +nextjs.org + +IGNORE INLINE STYLE +.banner * + +================================ + +ngrok.com + +INVERT +.customer-logos + +CSS +.browser path[fill="#BBB"], .browser g[fill="#BBB"] { + fill: #BBB !important; +} +.terminal tspan[fill="#FFF"] { + fill: #FFF !important; +} +.terminal tspan[fill="#BBB"] { + fill: #BBB !important; +} + +================================ + +nicehash.com + +INVERT +.chart +img[src*="hashpower@2x] + +================================ + +niestatystyczny.pl + +INVERT +div#logo > h1 > a > img + +================================ + +nirsoft.net + +CSS +.menub1 a:link, .menub1 a:visited{ + color: #0040ff; +} +.menub1 a:hover { + color: #ffffd0; +} + +================================ + +niser.ac.in + +CSS +body, +#main-content, +#page { + background-image: none !important; +} + +================================ + +nixos.org + +INVERT +header a[href="/"]::after + +CSS +.demo-preview > .thumbnail svg .background { + fill: var(--darkreader-neutral-background) !important; +} +.packages-searchbox::before, +.packages-searchbox::after { + background-image: none !important; +} + +================================ + +nlnet.nl + +INVERT +.header_logo + +================================ + +nnmclub.to +nnm-club.me + +INVERT +img[src$="images/icon_arrow.gif"] +img[src$="images/freeleech.gif"] + +================================ + +nokia.com + +CSS +.pds-background-cover > .pds-background-image-set { + background-color: var(--darkreader-neutral-background) !important; +} +.pds-background-cover video { + filter: brightness(50%) sepia(40%) !important; +} + +================================ + +norton.com + +INVERT +.c-topnav__wrap a + +================================ + +nos.nl + +INVERT +.npo-button + +IGNORE IMAGE ANALYSIS +.npo-button + +================================ + +notebooks.githubusercontent.com/view/ipynb* + +CSS +.jp-CodeConsole .CodeMirror.cm-s-jupyter, +.jp-Notebook .CodeMirror.cm-s-jupyter, +.highlight { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +notion.so + +INVERT +img[alt="People using Notion"] +.global-margin-s .logos +.persona-grid > .persona-grid-item > .persona-grid-image +.desktop-illustration +.illustration .next-image +.api-section-image .next-image +.visual .next-image +.logo svg > :first-child + +CSS +body { + background-color: var(--darkreader-neutral-background) !important; +} +.notion-divider-block div div { + border-bottom: 1px solid ${rgba(55, 53, 47, 0.4)} !important; +} + +================================ + +novartis.com + +INVERT +#logo + +================================ + +novelgames.com + +CSS +a#commonLogo { + background-image: url("https://staticz.novelgames.com/style/default/common_e.5.png"), linear-gradient(rgb(255, 255, 255), rgb(255, 255, 255)), url("https://staticz.novelgames.com/style/default/common.8.png") !important; +} + +================================ + +nowafarmacja.pl + +INVERT +.icon-chevron-down +.payment-banners +.hheader::after + +================================ + +nowemedium.pl + +INVERT +.logo-tagline-group +.menu_toggle + +================================ + +nperf.com + +INVERT +.SpeedTest > .resultPanel + +CSS +.SpeedTest > .resultPanel { + background-color: transparent !important; +} + +================================ + +npmjs.com + +INVERT +header a[href="/"] svg +#orgs_panel img.h2 +#enterprise_detail_panel img.h2 +#customers_panel img[src*="adobe.full.png"] +#customers_panel img[src*="bbc.full.png"] +#customers_panel img[src*="conde-nast.full.png"] +#customers_panel img[src*="netflix.full.png"] +#customers_panel img[src*="visa.full.png"] +._5532dff2 +._93bbf0b4 + +CSS +a title + g[data-darkreader-inline-fill] { + fill: var(--darkreader-neutral-text) !important; +} + +================================ + +ns.nl + +CSS +.section--nsYellow { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +ntlite.com + +CSS +.fr-wrapper *::selection { + background-color: dodgerblue !important; +} + +================================ + +nvidia.com +nvidia.in + +INVERT +svg.global-footer__logo +a.brandLink +img[src*="Experience"] +a[href*="facebook"] +a[href*="twitter"] +a[href*="youtube"] +a[href*="flickr"] + +CSS +div.nvidia a svg { + fill: ${black} !important; +} +div.brand-container a svg { + fill: ${black} !important; +} +.taboff { + background-image: none !important; +} +.mid-gray { + fill: #999 !important; + background-color: #999 !important; +} +.dark .green40 { + fill: #3b5d00 !important; + background-color: #3b5d00 !important; +} +.green50 { + fill: #598b00 !important; + background-color: #598b00 !important; +} +.dark .green100 { + fill: #76b900 !important; + background-color: #76b900 !important; +} + +================================ + +nvidia.pl + +INVERT +.brand-container +img[src*="Experience"] +a[href*="facebook"] +a[href*="twitter"] + +CSS +body, +.taboff { + background-image: none !important; +} + +================================ + +nxos.org + +INVERT +#logo +a[href^="#sidewidgetarea"] + +================================ + +nymag.com + +INVERT +.article-feed-header svg +.article-nav-top-center +#latest-feed-title +.logo-svg +#site-feed-curbed-title > .feed-title-wrapper +.tab-trigger > svg +.tab-trigger > svg > circle +.tab-trigger > svg > g > circle +.title-logo +#vulture-trigger > svg > g > path:nth-child(1) +#wwwthecut-trigger > svg > .active > path + +CSS +.collection-articles-lede_first-featured .lede-item[data-track-index="0"] .lede-image-wrap { + z-index: 0 !important; +} +.collection-articles-lede_first-featured .lede-item[data-track-index="0"] .lede-text-wrap { + z-index: 1 !important; + position: absolute !important; +} + +================================ + +nytimes.com + +INVERT +div#live-country-map.live-country-map-embed +div#live-us-map.live-us-map-embed +g > text +.svelte-1v1dl99 +.vmap-zoom-buttons +#xwd-board + +CSS +.css-oylsik, +.css-nhjhh0 svg, +.css-18z7m18 svg, +.css-1q2j1fr svg, +a[data-testid] > svg { + fill: ${black} !important; +} +.headline-link div { + color: ${black} !important; +} +.headline-link div:hover { + color: ${#555} !important; +} +.svelte-15nnlbj { + font-weight: bold !important; +} +#xwd-board rect[class^="Cell-block--"] { + fill: ${black} !important; +} +#xwd-board text[class^="Cell-hidden--"] { + color: ${black} !important; +} +#xwd-board rect[class^="Cell-cell--"] { + fill: ${darkgrey} !important; +} +#xwd-board rect[class^="Cell-highlighted--"] { + fill: ${lightgrey} !important; +} +#xwd-board rect[class^="Cell-selected--"] { + fill: ${white} !important; +} +#xwd-board rect[class^="Cell-related--"] { + fill: ${goldenrod} !important; +} +#xwd-board rect[class^="xwd__cell--cell"] { + fill: ${darkgrey} !important; +} +#xwd-board rect[class^="xwd__cell--highlighted"] { + fill: ${lightgrey} !important; +} +#xwd-board rect[class^="xwd__cell--selected"] { + fill: ${white} !important; +} +#xwd-board rect[class^="xwd__cell--related"] { + fill: ${khaki} !important; +} +#xwd-board rect[class*="xwd__cell--penciled"] ~ text[text-anchor^="middle"] { + fill: ${blue} !important; +} + +================================ + +nzbget.* + +INVERT +.icon-top +.icon-bottom +.icon-up +.icon-down + +================================ + +nzz.ch + +INVERT +.logo + +CSS +.logo { + background-color: unset !important; + color: ${white} !important; +} + +================================ + +o2.co.uk + +INVERT +.brandLogo + +================================ + +oalevelsolutions.com + +INVERT +p > span > img + +================================ + +obserwatorgospodarczy.pl + +INVERT +.logo-img + +================================ + +oclc.org + +IGNORE INLINE STYLE +.chart-key + +================================ + +odysee.com + +INVERT +.header__navigation-logo +[data-vjs-player] .vjs-control-bar > [title="Autoplay Next Off"] +[data-vjs-player] .vjs-control-bar > [title="Autoplay Next On"]::after + +CSS +.content__viewer { + border: none !important; +} + +================================ + +oferteo.pl + +INVERT +img[src*="oferteo-color"] +ul.logo-box.text-center +span.icon-gray.quotation-mark + +================================ + +office.com + +INVERT +.ms-ohp-svg-Icon.ms-ohp-Icon--privacyLogo + +IGNORE IMAGE ANALYSIS +.ms-ohp-svg-Icon.ms-ohp-Icon--privacyLogo +.ms-ohp-svg-Icon.ms-ohp-Icon--calendarLogo::before +.ms-ohp-svg-Icon.ms-ohp-Icon--flowLogo::before + +================================ + +oisd.nl + +INVERT +img[alt="logo"] + +================================ + +okonto.pl + +INVERT +.imageWidget + +================================ + +okta.com + +INVERT +.chiclet--container +.chiclet--article +.chiclet--footer + +================================ + +old.reddit.com + +INVERT +.volume-slider-bar +.volume-slider-thumb +.reddit-video-seek-bar-root + +CSS +.seek-bar-progress { + background-color: ${#004daa} !important; +} + +================================ + +oleole.pl + +INVERT +#logo::after +div[id="brands-carousel"] +div[id="footer-logo-brands"] +img[src*="main_menu"] +img[src*="SG/icon"] + +================================ + +olx.pl + +CSS +.searchmain { + background-color: var(--darkreader-inline-bgcolor) !important; +} +.wrapper, .footer-bottom { + background-color: var(--darkreader-neutral-background) !important; +} + +IGNORE IMAGE ANALYSIS +.cat-icon-628 +.cat-icon-87 +.maincategories .maincategories-list .li .item a[data-id="promo"] .category-1.cat-icon-promo + +================================ + +omgubuntu.co.uk + +CSS +.header { + background: var(--header-background) !important; +} + +================================ + +omni.se + +CSS +.article, +.resource, +.component--storyLink, +.component--storyHeading, +.btn--secondary, +.starbox-star { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +omnicalculator.com + +INVERT +.GenericText + +================================ + +omnivox.ca + +INVERT +td[style*="/cvir/UI"] +img[src^="/cvir/UI/Theme/Lea_Defaut/Images/Accueil_LEA"] +img[src="/cvir/UI/Theme/Lea_Defaut/Images/mesclasses_cg_subtop.jpg"] +img[src^="/cvir/UI/Theme/Lea_Defaut/Images/accueil_"] +img[src$="/bas_du_menu.jpg"] +img[src$="tile.jpg"] +.cgSelect +.mioLinks +.calendrier +.servLinks +.descSection + +CSS +.cgSelect > table > tbody > tr > td:nth-child(1) > a > font { + color: green !important; +} +.calendrier > table > tbody > tr, +.calendrier > table > tbody > tr > td > img, +.calendrier > table > tbody > tr > td > table > tbody > tr > td > img +{ + filter: invert(100%) hue-rotate(180deg) contrast(100%) !important; +} +table[style*="/cvir/UI"], +.cgBg +{ + background-image: none !important +} + +================================ + +one.uf.edu + +CSS +body { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +onelook.com + +INVERT +img[alt="OneLook"] + +================================ + +onet.pl +plejada.pl + +INVERT +[class*="WeatherDay_tempIcon"] +._3ZySwSLi_pur0unnAQO2No +.forecast img +.icon-shareIcon svg +.locationName svg +.logo-cls-1 +.logoImageRight +.serviceIcon +.sheet +.weatherBox .iconNow +[class*="weatherIcon"] +.websiteLogo +a.serviceLogo img +img[alt="O!Konto"] +img[alt="Plejada.pl"] +ul.contentList img.icon +svg[class*="MenuIcon"] +svg[class*="LoginIcon"] +.weatherExtrasWidget__category-image img +[class*="SponsorImage"] + +CSS +.mainBoxBgHolder { + background-color: rgba(0, 0, 0, 0.25); + background-blend-mode: color; +} +.weatherMap .mapLayer .fil0, #weatherChartsHolder .chartValue { + fill: rgb(128, 128, 128) !important; +} +svg path[d^="M50.315,89"] { + fill: ${white} !important; +} + +================================ + +online.noordhoff.nl + +INVERT +#EAGABA img + +================================ + +online.rbb.bg + +INVERT +.has-context:hover +.active +.btn + +================================ + +onlinelibrary.wiley.com + +INVERT +#mainLogo + +================================ + +onlinetrade.ru + +INVERT +.drawCats__item__name + +CSS +.drawCats__item__image { + filter: brightness(50%) sepia(40%) !important; +} + +================================ + +onlineuniversities.com + +CSS +body { + background-image: none !important; +} + +================================ + +onlyoffice.com + +INVERT +.logo + +================================ + +op.gg + +INVERT +.Level +.ranking-highest__icon .ranking-highest__level + +================================ + +openai.com + +INVERT +figure.release-cover>div:first-of-type>img +.math + +CSS +body { + background: initial !important; +} +header[style*="background-image"], +.bg-cover[style*="background-image"] { + background: none !important; +} +.is-below-fold .header--cover .nav, +.is-below-fold .post-header--cover .nav { + background: ${white} !important; + color: ${black} !important; +} +span.token.comment { + color: ${#aaa} !important; +} +span.token.punctuation { + color: ${#777} !important; +} +a.btn:not(.fade), button.btn { + background: ${rgba(5, 5, 38, 0.05)} !important; + color: ${#050526} !important; +} +button.btn:hover { + color: ${#b0b0b0} !important; +} +figcaption, .caption { + color: ${rgba(5,5,38,0.5)} !important; +} +.content .timeline > li::before, .timeline > li::before { + color: ${black} !important; +} +.content .timeline > li::after, .timeline > li::after { + background-color: ${black} !important; +} +.switch-input:checked + .switch-label { + color: ${rgba(0, 0, 0, 0.7)} !important; +} + +================================ + +openanolis.org + +INVERT +.logo + +================================ + +openbenchmarking.org + +INVERT +g[font-size]:not(g[font-size][fill^="#fff" i]:not(.oborg_expandable_result g)) +g[font-size]:not(g[font-size][fill^="#fff" i]) > text[fill="#005a00"] + +IGNORE INLINE STYLE +g[font-size][fill^="#fff" i] + +================================ + +opencollective.com + +INVERT +img[alt="Open Collective"] + +CSS +#section-contributors > div { + background-image: none !important; +} + +================================ + +openebooks.net + +INVERT +img[src="images/home_banner.png"] + +================================ + +openenglishbible.org + +INVERT +#logo +img[src="html-logo.png"] + +================================ + +opengeofiction.net +openstreetmap.org + +INVERT +.map-layout #map +.ideditor g.vertex .icon +.ideditor g.point .icon +.ideditor .icon.areaicon-halo + +CSS +div[dir="ltr", id="map"] { + filter: none !important; + background: #000 !important; +} +.ideditor .labels-group.halo text { + stroke: var(--darkreader-neutral-background) !important; +} +.map-layout #map { + background-color: ${#1b1b1b} !important; +} +img.loader { + filter: invert(93.7%) hue-rotate(180deg) contrast(90.6%) !important +} + +IGNORE INLINE STYLE +.ideditor .main-content * + +================================ + +openoffice.org + +INVERT +#ooo-logo + +================================ + +openreview.net + +CSS +#__next { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +openvpn.net + +IGNORE INLINE STYLE +.navbar-brand > svg * + +================================ + +openwall.com + +INVERT +.logo + +================================ + +openwrt.org + +CSS +#dw__pagetools .menuitem svg { + fill: var(--darkreader-neutral-text) !important; +} + +================================ + +orf.at/corona/* + +INVERT +.bg +.annotation +.sparkline--fill + +================================ + +osu.edu +ohio-state.edu + +CSS +#osu_navbar { + background-image: linear-gradient(rgb(40, 43, 45) 0%, rgb(63, 69, 71) 100%); + border-bottom: 5px solid rgb(187, 0, 0); +} +body.sidebar-layout #page #content, +#page #content { + background-image: none; +} + +================================ + +otomoto.pl + +INVERT +.seller-card__links__link__icon + +================================ + +overleaf.com + +INVERT +.canvasWrapper + +================================ + +overreacted.io + +CSS +:root { + --bg: var(--darkreader-neutral-background) !important; +} + +================================ + +overwatchleague.com + +CSS +div[class^="dynamic-bracketstyles__Container"] .connector { + z-index: 0 !important; +} + +================================ + +ovhcloud.com + +INVERT +.oof-content-group-line-item + +================================ + +owncube.com + +INVERT +[src="/assets/img/logo.png"] + +CSS +h1, h2, h3, h4, h5 { + color: var(--darkreader-neutral-color); +} + +================================ + +ozbargain.com.au + +CSS +div.comment-op { + background-image: linear-gradient(#000000, #212121) !important; +} + +================================ + +ozon.ru + +INVERT +ymaps[class$="ground-pane"] + +================================ + +p30download.com + +CSS +.article-wrapper { + color: ${#090702} !important; +} + +================================ + +pacjent.gov.pl + +CSS +.hero-content { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +packages.ubuntu.com + +CSS +body { + background-image: none !important; +} + +================================ + +palshovon.wixsite.com + +INVERT +#BACKGROUND_GROUP +[alt="Marble Surface"] + +CSS +[data-mesh-id="SITE_FOOTERinlineContent-gridContainer"] { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +pan.baidu.com + +INVERT +.module-header-wrapper dt + +================================ + +panapply.org + +INVERT +.logo + +================================ + +panerabread.com + +INVERT +.pds-h-logo + +================================ + +panthema.net + +CSS +body { + background-image: none !important; +} + +================================ + +papaya.rocks + +INVERT +.favorite.js-open-login +.header__title +.js-logo +.js-logo-big +.js-menu-toggle +.js-open-search +.nav__item--profile +.search__button +.search__close + +================================ + +park-in.gr + +CSS +.div-background { + z-index: 0 !important; +} +.container { + z-index: 1 !important; + position: relative !important; +} + +================================ + +partitionwizard.com + +CSS +.pw-banner { + background-image: none !important; +} + +================================ + +passport.baidu.com + +INVERT +.pass-header-logo +.right-icon + +================================ + +paste.rs + +CSS +pre { + --darkreader-inline-bgcolor: var(--darkreader-neutral-background) !important; +} + +================================ + +patreon.com + +INVERT +a[href^="https://docs.google.com"] img +a[href^="https://forms.gle"] img + +CSS +div[data-tag="comment-actions"] svg { + fill: var(--darkreader-neutral-text) !important; +} + +IGNORE IMAGE ANALYSIS +* + +================================ + +patriotmemory.com + +INVERT +.w-nav a[href="/"] img +.w-nav-brand + +================================ + +patuscada.bar + +INVERT +.topo +.topo > * +.patuscada-logo +.botoes-topo a:last-child img +.logo + +IGNORE IMAGE ANALYSIS +.etiqueta-vermelha + +================================ + +paulgraham.com + +CSS +body { + background-image: none !important; +} + +================================ + +paypal-doladowania.pl + +INVERT +img[src*="/img/bank-logos/"] + +================================ + +payu.com + +CSS +img[src$="PayU-Map_Homepage_World.svg"] { + filter: invert(90%) hue-rotate(180deg) contrast(90%) !important; +} + +================================ + +pbs.org + +CSS +BODY.normal td.bodyarea, +body[background] { + background-image: none !important; +} + +IGNORE INLINE STYLE +.page-header__brand > svg > path + +================================ + +pcdiga.com + +CSS +.data { + background-color: var(--darkreader-neutral-background) !important; +} +input, textarea { + background-color: var(--darkreader-neutral-background) !important; + color: var(--darkreader-neutral-text) !important; +} +li.level0 > a { + color: var(--darkreader-neutral-text) !important; +} +li.level0 > a:hover { + color: #ff4d23 !important; +} + +================================ + +pcgamer.com + +INVERT +img[alt="Best Buy"] +img[alt="Amazon"] + +CSS +img { + mix-blend-mode: normal !important; +} + +================================ + +pch24.pl + +INVERT +a[href="https://pch24.pl"] svg + +CSS +a[href="https://pch24.pl"] svg path[fill="#1d1e1d"] { + --darkreader-inline-fill: ${white} !important; +} + +================================ + +pcloud.com + +INVERT +.logo + +================================ + +pcpartpicker.com + +IGNORE INLINE STYLE +.price-history-legend-color + +================================ + +peardeck.com + +INVERT +.boxy-svg +.mc-answer__check-inner +.check-svg + +================================ + +pennylane.ai + +INVERT +div[style*="xanadu-background.png"] +div[style*="xanadu-background.png"] > div +div[style*="banner.png"] +div[style*="banner.png"] > div + +================================ + +peonaviveu.blogspot.com + +CSS +body { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +perfekcyjnawdomu.pl + +INVERT +img[src*="logo"] + +================================ + +petco.com/shop/en/petcostore + +INVERT +a[class^="LogoAnchor__Container"] +button[class^="HamburgerButton"] +img.center-block.margin-top-sm +h1.pals-header +img.center-block + +================================ + +petri.com + +INVERT +.logo + +================================ + +pgatour.com + +CSS +.score-card tr td.birdie { + background-image: initial; + background-color: rgb(1, 76, 181); +} + +================================ + +phonescoop.com + +INVERT +#sitelogo + +CSS +div#outer.wide, +#socpage, +div#top.top-lg, +div#outer { + background-image: none !important; +} + +================================ + +photofeeler.com + +INVERT +.navbar-brand + +================================ + +phys.nagoya-u.ac.jp + +INVERT +img[src="img/top_94.gif"] + +CSS +#wrap table { + background-image: none !important; +} + +================================ + +physics.gmu.edu + +INVERT +img.math-display + +================================ + +piazza.com + +CSS +.dashboard_toolbar, .page_feed_bucket_header { + background: linear-gradient(to bottom, ${#c5c7cd} 0%, ${#dfe1e2} 100%) !important; +} + +================================ + +picknsave.com + +INVERT +.KrogerHeader-Logo--inner + +================================ + +picrew.me + +IGNORE INLINE STYLE +.imagemaker_colorpalette li + +================================ + +pilot.wp.pl + +INVERT +.logo +div > button > svg + +================================ + +ping.sx + +INVERT +.ring-0 + +CSS +#headlessui-switch-1 { + filter: brightness(70%) !important; +} + +================================ + +pipewire.org + +CSS +body, img, video, iframe { + filter: none !important; +} + +================================ + +pipiwiki.com + +INVERT +.mwe-math-fallback-image-display +.mwe-math-fallback-image-inline +#logo_img + +================================ + +pixabay.com + +INVERT +#logo + +================================ + +pixaful.com + +CSS +body { + background-image: none !important; +} + +================================ + +pixiv.net + +CSS +.jAENWx, +.iYRMgo { + color: ${aliceblue} !important; +} + +================================ + +pixlab.pl + +INVERT +img[src*="trust_us"] + +================================ + +pl.glosbe.com + +INVERT +footer > div > div > a > img + +================================ + +planet.gnome.org + +CSS +div.post { + background-image: none !important; +} + +================================ + +planetagracza.pl + +INVERT +p.site-title +#footer .site-title a + +================================ + +planetminecraft.com + +CSS +#container, +.forum_replies_container, +.forum_reply, +.contents, +.spoiler_header, +#resource-log, +.tag, +.view_more:not(:hover), +#popup, +code { + background: var(--darkreader-neutral-background) !important; +} + +================================ + +plannedparenthood.org + +INVERT +a.top-level-nav-link::after +a.top-level-nav-link::before +a.top-level-nav-link > span::after + +================================ + +plantuml.com + +INVERT +.scale + +================================ + +play.google.com + +INVERT +.bUWb7c +.WF1WQd +img[src="https://www.gstatic.com/android/market_images/web/play_prism_hlock_2x.png"] +a[href*="about/products"] + +================================ + +play.google.com/apps/publish + +INVERT +.IXNAUGB-u-e +.IXNAUGB-U-g img +.IXNAUGB-U-g +img[src^="data:image/png;"] +.LTMPNY-u-e + +================================ + +play.google.com/books/listen + +INVERT +a[href*="books/audiobooks"] + +CSS +.chapter-item:not(.iron-selected) .chapter-title { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +play.google.com/music + +INVERT +.music-logo +a[title="Google apps"] +.song-row .rating-container + +================================ + +plotkibiznesowe.pl + +INVERT +#logo + +================================ + +plumbingforums.com + +INVERT +.node-icon::before + +CSS +div, +.node-icon { + background-color: var(--darkreader-neutral-background) !important; +} +.input:focus, +.input.is-focused::placeholder { + background: var(--darkreader-neutral-background) !important; +} + +================================ + +plus.google.com + +INVERT +a.gb_b > div +a[href*="about/products"] + +================================ + +pochta.ru + +INVERT +ymaps[class$="ground-pane"] + +================================ + +podium.com + +INVERT +.logoWrap + +================================ + +poeditor.com + +INVERT +.chart img + +================================ + +polar.com + +INVERT +.logo + +================================ + +polarion* + +INVERT +.polarion-dle-toolbar-Button img +.polarion-dle-toolbar-ButtonWithMenu img +.polarion-MenuButton img +.polarion-rp-column-configure-layout img + +================================ + +polsatnews.pl + +CSS +.news--over .news__category, .news--over .news__time, .news--over .news__title, .sent__title { + filter: none !important; +} + +================================ + +polskabiega.sport.pl + +CSS +.main_wrapper { + background-color: #181a1b !important; +} + +================================ + +polskatimes.pl + +INVERT +.componentsNavigationNavbar__logo + +================================ + +polskiemarki.info + +INVERT +a[id="powrot"] > img +img[src*="logo_fakro"] + +CSS +#katalog .container { + background-image: none !important; +} + +================================ + +polymc.org +polymc.github.io + +IGNORE INLINE STYLE +svg.home * + +================================ + +poradnikzdrowie.pl + +INVERT +.logo + +================================ + +porkbun.com + +INVERT +img[src="/images/handshake-icon.svg"] + +================================ + +portal.edukacja.olsztyn.eu + +INVERT +div.main +div#welcome-img +#pageheader +div#ctl00_TheFooter img +a.link-gray > p + +================================ + +portal.qiniu.com + +INVERT +.global-loading-content img + +================================ + +portal.saltyfish.io + +INVERT +.logo-img + +================================ + +portswigger.net + +INVERT +img[alt="Web Security Academy"] +img[alt="The Daily Swig"] + +================================ + +postani-student.hr + +CSS +body { + background-image: none !important; +} + +================================ + +postnauka.ru + +INVERT +.m-header__logo + +================================ + +poszukiwania.pl + +INVERT +.header-logo +.footer-logo-address + +================================ + +potplayer.daum.net + +INVERT +.promotion_potplayer + +================================ + +praca.pl + +INVERT +img[alt="Praca.pl"] + +CSS +.app-offer__content { + background-color: rgb(25, 26, 27) !important; +} +.szcont .f1top, +.szcont .f1template_content { + background-color: rgba(0, 0, 0, 0.25) !important; + background-blend-mode: color; +} +.company__img { + padding: 0 0 !important; +} +.listing__logo, +.app-offer__logo-img, +.company__img, +.employer-profile-header .logo img, +.company-job-list .logo img, +.epc-other-employers .logo img, +.home__partner-logo { + filter: brightness(0.75) +} + +IGNORE IMAGE ANALYSIS +.szcont .f1top +.szcont .f1template_content + +================================ + +practicum.yandex.* + +INVERT +.logo__img + +================================ + +prajwalkoirala.com + +INVERT +svg + +================================ + +pressgazette.co.uk + +INVERT +.site-logo + +================================ + +primatelabs.com + +INVERT +.logo + +================================ + +pro-run.pl + +INVERT +.td-main-logo + +================================ + +processon.com + +INVERT +#view_container canvas + +================================ + +procyclingstats.com + +IGNORE IMAGE ANALYSIS +.flag +.flag.w32 +.flag.c16 + +================================ + +producthunt.com + +INVERT +[class="icon_f5f81"] + +================================ + +profiler.firefox.com + +INVERT +.chartCanvas + +================================ + +projectstream.it + +CSS +body { + background: none !important; +} + +================================ + +pronote.toutatice.fr + +INVERT +.ObjetGrille +.Cours +.Insecable +.Calendrier_Jour_Selection + +CSS +body, +.ie-chips.tag-style { + background: linear-gradient(90deg, #282c2d 0, #282C2D calc(100% - 0.8rem), transparent calc(100% - 0.8rem), transparent 100%); +} + +================================ + +pronto.io + +CSS +input.btn-new-group.pointer { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +prospectmagazine.co.uk + +INVERT +.header__logo + +================================ + +prostovpn.org + +CSS +body { + background: none !important; +} + +================================ + +proton.me + +INVERT +img[src$="hero-2x.png"] + +================================ + +protonvpn.com + +INVERT +.navbar-brand +.protonmail-link +#page_home .parallax +#page_home .parallax > * + +================================ + +provantage.com + +CSS +body, +body.HOME { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +proxmox.com + +INVERT +#logo +.uix_logo + +================================ + +psemu.pl + +CSS +.menu-item { + text-shadow: rgb(40, 43, 54) 0px 1px 0px !important; +} + +================================ + +psprices.com + +INVERT +.store-logo +.highcharts-label text +.game--description::after + +================================ + +psychonautwiki.org + +INVERT +#mw-panel > a > svg +.mw-headline > a > svg +a[href="http://www.emcdda.europa.eu/about"] > svg +img[alt="Tasks.svg"] +img[alt="Star-o.svg"] +img[alt="Pencil.svg"] +#InfoTable > tbody > tr > .Image > div > div > .image +.dosechart + +CSS +.dosechart, +.thumbimage, +.mwe-popups-discreet > svg { + background-color: ${black} !important; +} + +================================ + +publica.fraunhofer.de + +INVERT +img[src="/pub09img/logo-fraunhofer.gif"] + +================================ + +publicwww.com + +CSS +body { + background-image: none !important; +} + +================================ + +pulumi.com + +CSS +:host { + --neutral-fill-stealth-rest: var(--darkreader-neutral-background) !important; +} + +================================ + +pureinfotech.com + +INVERT +.pureinfotech-logo + +CSS +.article-type-standard-css .entry-content:before { + color: ${gray} !important; +} + +================================ + +purerave.com + +CSS +:root { + --darkreader-border--border: 1px solid rgba(0, 90, 155, 1) !important; +} +div.form-buttons textarea { + background-color: var(--darkreader-neutral-background) !important; + border-color: #005a9b !important; +} +textarea { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +pushsquare.com + +CSS +.page { + background-image: none !important; +} + +================================ + +pyszne.pl +lieferando.* +justeat.* +just-eat.* +takeaway.com +thuisbezorgd.nl + +INVERT +.gm-style + +CSS +.cover img, .logowrapper, +.orderoverview__restaurant-image-container-inner, +div[data-qa="avatar"] { + background-color: rgba(255, 255, 255, 0.5) !important; + background-blend-mode: color; +} + +IGNORE INLINE STYLE +svg > circle +svg > text > tspan + +================================ + +pythonanywhere.com + +INVERT +#id_logo +img[src^="/static/glyphicons/"] + +================================ + +pytorch.org + +INVERT +#site-logo +.header-holder:not(.homepage-header) > div.container > div.header-container > .header-logo + +================================ + +pz.gov.pl + +CSS +.banner-text { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +qcc.com + +INVERT +.app-login-insert +.logo +.pay-insert + +================================ + +quantrimang.com + +CSS +.taxonomyList .navigation a { + color: var(--darkreader-neutral-text) !important; +} +.taxonomyList .navigation a:hover { + color: ${orange} !important; +} + +================================ + +qubes-os.org + +INVERT +[src$="xen-logo.svg"] +[src$="whonix-tor.svg"] + +================================ + +quickbase.com + +CSS +td.cell, td.label { + border-color: rgb(24, 26, 27) !important; +} + +================================ + +quizlet.com + +CSS +.UIKeyboardHint { + background-color: transparent !important; +} + +IGNORE INLINE STYLE +.FeedbackHeading-emoji > svg * + +================================ + +quora.com + +CSS +.logo_fill { + fill: rgb(219, 87, 83) !important; +} +body { + background-color: var(--darkreader-neutral-background) !important; +} +div.q-box.qu-bg--white { + background-color: #181a1b !important; + background-image: none !important; +} + +IGNORE INLINE STYLE +#upvote +#downvote + +================================ + +qwant.com + +INVERT +.background-home__logo +.home__logo__container .home__logo +canvas.mapboxgl-canvas + +================================ + +rachel53461.wordpress.com + +CSS +#grad { + background-image: none !important; +} + +================================ + +racketboy.com + +CSS +#rb-split, +#rb-split > div { + background-image: none !important; +} + +================================ + +radar-opadow.pl + +INVERT +#chase-map +.ro_tooltip + +================================ + +radareu.cz + +INVERT +#radarMap .leaflet-map-pane + +================================ + +radeonramdisk.com + +INVERT +#logo + +================================ + +radio17.pl + +INVERT +.main-title + +================================ + +radiokolor.pl + +INVERT +.nav-brand +.buttons-1 +a.logo-1 + +CSS +.content-box-1 { + background-image: none !important; +} + +================================ + +railwaygazette.com + +INVERT +.mastheadLogo + +================================ + +rain.thecomicseries.com + +CSS +body { + background-color: var(--darkreader-neutral-background) !important; + background-image: none !important; + margin: 0px !important; + padding: 8px !important; +} +#comicimage { + background-color: #ffffff !important; +} + +================================ + +rakuten.com + +INVERT +.chakra-image + +================================ + +rapidtables.com + +IGNORE INLINE STYLE +td[style^="background:"] + +================================ + +raspberrypi.com + +INVERT +.__rptl-header-logo path[fill="#000"] + +CSS +body { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +raspberrypi.org + +INVERT +.site-header__home-link + +IGNORE IMAGE ANALYSIS +.c-at-home__container + +================================ + +rateyourmusic.com + +IGNORE IMAGE ANALYSIS +* + +================================ + +rationalwiki.org + +INVERT +.mw-wiki-logo + +================================ + +read.amazon.* + +INVERT +.header_bar_icon:not(#kindleReader_button_close) +.header_bar_button +#kindleReader_content + +================================ + +readme.io + +CSS +.rm-PlaygroundRequest, +.CodeTabs-toolbar { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +readpaper.com/pdf-annotate/note + +INVERT +.page + +================================ + +readthedocs.io + +CSS +.toc-drawer, +.sig, code.literal, +.sidebar-search-container, +.sidebar-tree .current > .reference { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +realmadridfin.net + +CSS +.button_submit, +#content_section, +#shoutbox_b, +#shoutbox_color, +#shoutbox_face, +#shoutbox_i, +#shoutbox_nosound, +#shoutbox_u, +#shoutbox_u + img { + background-image: none !important; +} +#shoutbox_message { + background-color: none !important; +} + +================================ + +realmicentral.com + +INVERT +img[itemprop="logo"] +div.fly-but-wrap.left.relative > span + +================================ + +redbubble.com + +INVERT +[data-testid="ds-wordmark"] + +================================ + +reddit.com + +INVERT +[role="slider"] +video ~ div [style^="height"] + +CSS +[role="slider"] > div:nth-child(4) { + background-color: ${#0079d3} !important; +} +[style^="--background"] { + --background: ${#FFFFFF} !important; +} +[style^="--canvas"] { + --canvas: ${#DAE0E6} !important; +} +[style^="--pseudo-before-background"] { + --pseudo-before-background: ${#DAE0E6} !important; +} +[style^="--comments-overlay-background"] { + --comments-overlay-background: ${#DAE0E6} !important; +} +[style^="--commentswrapper-gradient-color"] { + --comments-overlay-background: ${#DAE0E6} !important; +} +[style^="--fakelightbox-overlay-background"] { + --fakelightbox-overlay-background: ${#DAE0E6} !important; +} +.md p>a[href="#s"]::after, a[href="#s"]::after { + color: #000; +} +header a[aria-label="Home"] svg:last-child g, +header > div > div + div a[href] *, +header > div > div + div button[aria-label] * { + fill: var(--darkreader-neutral-text) !important; +} +#COIN_PURCHASE_DROPDOWN_ID > div { + background: linear-gradient(180deg,hsla(0,0%,100%,.1) 45.96%,hsla(0,0%,100%,.57) 46%,hsla(0,0%,100%,0) 130%),${gold} !important; +} +#COIN_PURCHASE_DROPDOWN_ID > div > span { + color: ${white} !important; +} +.md-spoiler-text:not([data-revealed])::selection { + color: transparent !important; + background-color: var(--darkreader-bg--newCommunityTheme-metaText) !important; +} +div[role="menu"][style^="position: fixed"] button button[role="switch"][aria-checked="false"] { + background-color: ${gray} !important; +} +div[role="menu"][style^="position: fixed"] button button[role="switch"] > div { + background-color: ${black} !important; +} + +================================ + +reddit.zendesk.com + +INVERT +header > div.logo > a > img +img.hero-inner-image + +================================ + +redditstatus.com + +INVERT +.logo-container + +================================ + +redgamingtech.com + +CSS +body { + background-image: none !important; +} + +================================ + +redhat.com + +CSS +p, li { + color: ${black} !important; +} +.PFElement { + background-color: ${white} !important; +} + +IGNORE INLINE STYLE +.redhat-logo * + +================================ + +redis.io + +CSS +.bg-gradient-to-bl { + background-image: none !important; +} + +================================ + +redpenreviews.org + +CSS +header a { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +refactoring.guru + +CSS +.recipe { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +referentiemateriaalvo.noordhoff.nl + +CSS +body { + background-image: none !important; +} + +================================ + +regex101.com + +INVERT +canvas + +================================ + +reheader.glitch.me + +INVERT +[src=$"GitHub-Mark.png"] +[src=*"header-image-readme-gen.gif] +[src=*"Screen%20Shot%202020-07-17%20at%205.19.18%20PM.png"] + +CSS +#add-to-github { + background-color: #96943f !important; +} +#upload-github { + border: 1px solid #dddddd; +} + +================================ + +relay.firefox.com + +INVERT +img.c-landing-hero-brands +img.c-brand-title +.fx-bento-app-link.fx-bento-link.fx-mobile > span::before +.fx-bento-app-link.fx-bento-link.fx-vpn > span::before +div.glocal-site-options > a > img +div.glocal-site-options > form > button::before + +================================ + +relive.cc + +INVERT +img[src*="logo-relive"] + +IGNORE IMAGE ANALYSIS +.email-button i + +================================ + +rememberthemilk.com + +CSS +div[contenteditable="true"] { + border: transparent !important; +} + +================================ + +render.com + +INVERT +.rm-section.rm-hero +.rm-section.rm-hero > *:not(.rm-back-bottom) +.rm-back-top +.rm-back-large + +================================ + +render.githubusercontent.com/view/ipynb + +INVERT +img.math + +================================ + +replit.com + +CSS +.monaco-editor .cursor { + background-color: ${#000}; +} + +================================ + +reproducible.archlinux.org + +INVERT +img[src*="icons/"] + +================================ + +repubblica.it + +INVERT +.page-header__logo + +================================ + +resetera.com + +CSS +.bbc-spoiler:not(:hover):not(:active), +.bbc-spoiler:not(:hover):not(:active) * { + background-color: ${black} !important; + color: ${black} !important; +} + +================================ + +resmigazete.gov.tr + +CSS +img[src="/assets/img/arma.png"] { + filter: hue-rotate(180deg) invert(1) brightness(2); +} + +================================ + +respekt.cz + +INVERT +.sitelogo-link + +================================ + +restaurantji.com + +INVERT +.logo_sticky + +================================ + +restoreprivacy.com + +CSS +body { + background-color: var(--darkreader-bg--color-body) !important; +} + +================================ + +retracmirrors.com + +CSS +body, #app > div { + background-image: none !important; +} + +================================ + +reuters.com + +INVERT +path[d^="M121.865 50.29c0"] + +================================ + +rfi.fr + +INVERT +.o-header__site-nav-link + +================================ + +rg-adguard.net + +INVERT +img[src*="info"] +img[src*="like"] +img[src*="donate"] +img[src*="faq"] + +CSS +body, +.tftable th { + background: none !important; +} + +================================ + +richie-bendall.ml + +CSS +.content--card { + background-color: #303030; +} +::-webkit-scrollbar { + width: 0; + color: transparent; +} +body { + background-color: #5c6bc0; +} +.app--bar, .drawer--content :not(.mdc-list--non-interactive) > :not(.mdc-list-item--disabled) .mdc-list-item--activated:after, :not(.mdc-list--non-interactive) > :not(.mdc-list-item--disabled) .mdc-list-item--activated:before { + background-color: #3f51b5; +} +.btc-dialog .mdc-button { + color: #3f51b5; +} +.btc-dialog svg { + fill: white; +} + +================================ + +richiebendallstatus.ml + +CSS +#page-container { + background-image: none; +} +.success-bg { + background-color: #80BA27; +} +.warning-bg { + background-color: #f7921e; +} +.success { + color: #80BA27; +} +.warning { + color: #f7921e; +} +.danger-bg { + background-color: #ff0000; +} +.paused-bg, .info-bg, .black-bg { + background-color: #17252e; +} + +================================ + +riptutorial.com + +CSS +.whole-container { + background-image: none !important; +} + +================================ + +roblox.com + +CSS +.checkbox input[type=checkbox]:checked + label::before { + background-color: var(--darkreader-neutral-text) !important; +} + +================================ + +rocksbox.com + +INVERT +.nav_logo + +================================ + +rockylinux.org + +INVERT +img[alt="Rocky Linux"] + +================================ + +rog.asus.com + +IGNORE IMAGE ANALYSIS +.rog-header .nav-menu .nav-bar + +================================ + +ros.org + +CSS +.bg-ros-dots-grid { + background-image: none !important; +} + +================================ + +roscidus.com + +CSS +span.caption-wrapper img { + background-color: white !important; +} + +================================ + +roskomsvoboda.org + +INVERT +img[src="/static/core/images/logo.svg"] + +================================ + +rostov.tele2.ru + +INVERT +.header-navbar-logo + +================================ + +rottentomatoes.com + +IGNORE IMAGE ANALYSIS +.icon__fresh +.fresh +.icon + +================================ + +royalbank.com + +CSS +.rbc-select-input { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +rp.pl + +INVERT +a[href="/"] +.burger--menu span +.icon-logo::before +.footer--logo +.footer--copyright--content div + +================================ + +rpcs3.net + +CSS +p, +.compat-types, +.compat-hdr-left, +.compat-status-container { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +rpm.org + +IGNORE IMAGE ANALYSIS +body + +================================ + +rpo.gov.pl + +INVERT +.view-content .field-content > img +#etykieta_szukaj a + +IGNORE IMAGE ANALYSIS +#bip_kontener + +================================ + +rt.ru + +INVERT +#logo_text + +================================ + +rte.ie + +INVERT +.masthead .nav-btn.menu + +CSS +.masthead .weather-widget .icon { + filter: none !important; +} +.theoplayer-skin .theo-control-bar-shadow { + background-image: linear-gradient(transparent var(--darkreader-neutral-background)) !important; +} + +================================ + +rtlnieuws.nl + +CSS +section { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +rubenfixit.com + +CSS +.shape-top-left::after, +.nav-btn::after { + border-color: transparent transparent transparent var(--darkreader-neutral-background) !important; +} +.shape-top-right::after, +.nav-btn::before { + border-color: transparent transparent var(--darkreader-neutral-background) transparent !important; +} +.shape-bottom-left::after { + border-color: var(--darkreader-neutral-background) transparent transparent transparent !important; +} +.shape-bottom-right::after { + border-color: transparent var(--darkreader-neutral-background) transparent transparent !important; +} +#blog-isotope-masonry article, +.shape-top-left, +.shape-top-right, +.shape-bottom-left, +.shape-bottom-right { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +rubjo.github.io + +CSS +select { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +rudeiczarne.pl + +INVERT +#logo +#footer-logo + +================================ + +runkit.com + +INVERT +.CodeMirror div.CodeMirror-cursor + +================================ + +runtothefinish.com + +CSS +:root { + --body-background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +rynek-kolejowy.pl + +INVERT +.logoTK +.partnerNaglowka +.pasekbocznynaglowek span +.portalLogo +.tagLogo +.zawartoscPartner +img[alt="współpraca"] +img[class="wspolpraca"] +img[src*="img/firma"] +img[src*="katalogkolejowy"] + +================================ + +rynekzdrowia.pl + +INVERT +img[src*="rynekzdrowia.svg"] +img[alt*="partner"] +.search +.copyright > img + +================================ + +rytmy.pl + +INVERT +.logo-rytmy-a + +================================ + +sadanduseless.com + +INVERT +.logo1 + +================================ + +saladelcembalo.org + +INVERT +#PageDiv td + +CSS +html, +body, +input, +textarea, +select, +button { + background-color: transparent !important; + color: var(--darkreader-neutral-text) !important; +} + +================================ + +salsa.debian.org + +INVERT +a#logo +img.brand-header-logo + +================================ + +samcodes.co.uk + +INVERT +.logo + +================================ + +samsung.* + +INVERT +.icon +.gnb__logo + +CSS +.feature-full-bleed-text img { + filter: brightness(50%) sepia(40%) !important; +} +.feature-full-bleed-text__content { + z-index: 1 !important; +} + +================================ + +santander.pl + +INVERT +img[src*="/santander/footer/"] +.topVisual__text span +.topVisual__content.topVisual__content--nobutton + +================================ + +savannah.gnu.org + +CSS +.boxtitle { + background-image: none !important; +} + +================================ + +sbermegamarket.ru + +INVERT +ymaps[class$="ground-pane"] + +================================ + +scholar.google.* +scholar.google.*.* + +INVERT +a[role="checkbox"] > :nth-child(2) +div[role="banner"] > a > span +a[aria-label="Homepage"] +.gs_ico +img[src*="scholar_logo"] +a#gs_hdr_lgo +a#gs_hdr_drw_lgo + +================================ + +sci-hub.* + +IGNORE IMAGE ANALYSIS +#raven +#logo + +================================ + +science.fandom.com + +INVERT +.mwe-math-fallback-image-inline + +================================ + +science.org + +INVERT +.navbar-brand > .hidden-on-dark +.main-header__secondary__logo > img + +CSS +h1.news-article__hero__title { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +sciencebasedmedicine.org + +INVERT +.site-logo + +================================ + +scipy-lectures.org + +INVERT +img.math + +================================ + +scmp.com + +INVERT +.header-menu-container__menu-top-left-wrapper +.global-menu-features__menu-icon +.global-menu-features__search-icon +.global-menu-features__close-icon +.social-button__twitter--active +.social-button__email--active +.footer-wrapper__logo + +================================ + +scpclassic.wikidot.com +scpexplained.wikidot.com +scpfoundation.net +scp-wiki.net +scp-wiki.wikidot.com +scp-wiki-cn.wikidot.com +scpwiki.com +scp-ru.wikidot.com +scpfoundation.net + +CSS +div#container-wrap, .panel-body, .content-panel { + background-image: none !important; +} +div#container-wrap::before { + content: ""; + position: absolute; + top: 0; left: 0; + width: 100%; height: 162px; + background-image: url(http://www.scp-wiki.net/local--files/component:theme/body_bg.png) !important; +} +.yui-navset .yui-nav a { + background-image: none !important; +} + +================================ + +scratch-wiki.info + +INVERT +.sb3-comment-label +.sb3-literal-string +.sb3-literal-number + +================================ + +scratch.mit.edu/projects/editor + +CSS +path.blocklyFlyoutBackground { + fill: rgb(32, 32, 32); +} + +================================ + +screenconnect.com + +CSS +.OuterPanel .MainPanel .MasterPanel .MasterListContainer ul li.HasChildren > div > p { + filter: brightness(100%) !important; +} + +================================ + +scribd.com + +INVERT +.logo +.document_container + +================================ + +scribe.rip +scribe.nixnet.services +scribe.citizen4.eu +scribe.bus-hit.me +scribe.froth.zone + +CSS +body { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +scribus.net + +INVERT +#site-header img + +================================ + +script.google.com + +INVERT +.docs-icon +.icon +.monaco-editor .cursors-layer > .cursor + +IGNORE INLINE STYLE +mask > * + +================================ + +scroll.com + +INVERT +#content > div > div > header > div > div > div > a.Titlebar__wordMark___2U8-r.display__desktop___1Cfo7 > div > div > svg +#content > div > div > footer > div > div > div > div.layout__column___diAE2.layout__span-12___2a4Fw.layout__span___31pR0.layout__portrait-span-3___A34nc.layout__span___31pR0.layout__landscape-span-2___30F_p.layout__order-3___3WFlS.layout__portrait-order-0___108js.space__stack-xl___1oKsQ.flex__column___JnBPu.flex__flex___1N4XU.flex__align-stretch___2HAV3.flex__direction-column___fSYwh > div > div > div > svg + +CSS +.Careers__logo___1kLq6 { + z-index: 1 !important; +} + +================================ + +scroll.morele.net + +INVERT +.navbar-logo +.social-link + +================================ + +se.pl + +INVERT +.mobile-bars + +================================ + +sea.playblackdesert.com + +INVERT +.original .characteristic .desc +.original .characteristic h3 +.original .characteristic .feature li span + +================================ + +seamonkey-project.org + +INVERT +img[src*="logo.png"] + +CSS +#breadcrumbs { + background-image: none !important; +} + +================================ + +sec.sangfor.com +sec.sangfor.com.cn + +INVERT +.en-logo + +================================ + +secure.ally.com + +INVERT +.nobd-aob-day +#lp_invite +#manageNonAllyAccountsFrame .third-party-iframe +#billPayFrame + +================================ + +secure.fanboy.co.nz + +CSS +html { + background-image: none !important; +} + +================================ + +secureage.com + +INVERT +.logo-block + +================================ + +segmentfault.com + +INVERT +.sf-header-logo +.sf-header__logo +.sf-logo +.navbar-brand + +================================ + +sejm.gov.pl + +CSS +.main { + background-image: none !important; +} + +================================ + +sematext.com + +INVERT +#logo +.sematext-clients-gamma figure + +================================ + +sembr.org + +CSS +mark { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +seminka-chilli.cz +chilli-shop.sk + +CSS +#pannelWrapper { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +semmle.com + +CSS +#Header-logo * { + fill: #ffffff !important; +} + +================================ + +senscritique.com + +INVERT +.d-media-videos::before +.eins-wish.black +.eins-logo-small +.header-navigation-main-item a img +.eins-search-header +.eins-poll +.eins-compass +.eins-compass-xl +.eins-notification +.eins-tv +.eins-ticket +.eins-current.black +.eins-done.green +.eins-done.white +.eins-newspaper +.juyLRn + +CSS +.ecap-products-next, .ecap-products-prev { + background-color: hsla(100, 20%, 50%, .8) !important; + color: ${black} !important; +} +.d-chevron3-b, .d-chevron3-l, .d-chevron3-r, .d-chevron3-t { + background-image: -webkit-image-set(url(https://static.senscritique.com/img/layout/icons/chevrons/chevron-size3.png?201710121789416) 1x,url(https://static.senscritique.com/img/layout/icons/chevrons/chevron-size3@2x.png?201710121789416) 2x); +} + +================================ + +sephora.com + +INVERT +img[alt="Sephora"] +img[src="/img/ufe/icons/stores.svg"] +img[src="/img/ufe/icons/community.svg"] +img[src="/img/ufe/icons/me32.svg"] +svg[data-at="basket_icon_large"] +div[aria-label$="stars"] + +================================ + +server.pro + +INVERT +svg.server-pro-logo + +================================ + +servercat.net + +INVERT +.theme-header-logo + +================================ + +setupbits.com + +INVERT +.td-header-logo +.td-main-logo + +================================ + +sf-express.com + +INVERT +.home-icon +.map +.order-btn + +================================ + +shaneco.com + +INVERT +.logo-full + +================================ + +share.dmhy.org + +CSS +.jmd_base td a { + color: ${#3391ff}; +} +.jmd .today a { + color: ${#fff}; +} + +================================ + +sharepoint.com + +INVERT +img.WACPageImg + +CSS +.ms-FocusZone, +.ms-DetailsRow-cell, +.ms-Button { + background-color: var(--darkreader-neutral-background) !important; +} +.ms-DetailsRow-cell, +.ms-FocusZone, +.ms-Button, +.od-ItemContent-title, +.ms-DetailsHeader-cellName { + color: var(--darkreader-neutral-text) !important; +} +.ms-Button { + border-color: ${#F0F0F0} !important; +} + +================================ + +shells.com + +INVERT +img[alt="Shells Logo"] + +================================ + +shields.io + +INVERT +#app a +object + +================================ + +shimadzu.com + +INVERT +.header-logo + +================================ + +shop.dr-rath.com + +CSS +.colored-header-desktop { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +shop.surfboard.com + +INVERT +img.header-logo-image + +CSS +.homepage { + background-image: none !important; +} +.sb-searchpro .input-group .btn { + background-color: ${#fee9a4} !important; +} + +================================ + +shopify.com +shopify.dev + +INVERT +.marketing-nav--skin-light > .marketing-nav__logo +.shopify-logo +.header-country-select__trigger +.lia-message-count::before +.DateTime::before + +================================ + +shoppy.gg + +INVERT +.footer-profile__logo + +================================ + +shorthistory.org + +INVERT +.td-logo > .td-main-logo > .td-retina-data + +================================ + +signal.org + +INVERT +.navbar-item .icon +.signal-logo + +================================ + +signin.nianticlabs.com + +INVERT +img[alt="Niantic"] + +================================ + +signulous.com + +INVERT +.checkbox input:checked + +CSS +.checkbox input:checked { + background-color: white; +} + +================================ + +simepar.br + +CSS +.highcharts-text-outline { + display: none !important; +} + +================================ + +similarweb.com + +INVERT +.app-header__logo + +================================ + +simplemachines.org + +CSS +#header div.frame, +#header, +span.botslice span, +span.botslice, +span.topslice, +span.topslice span, +#content_section, +#content_section div.frame, +span.lowerframe, +span.lowerframe span, +div.title_bar, +h4.titlebg, +h3.titlebg, +h4.catbg, +h4.catbg2, +h3.catbg, +h3.catbg2, +.table_list tbody.header td.catbg { + background-image: none !important; +} + +================================ + +simply-v.de + +CSS +body { + background-image: none !important; +} + +================================ + +singularlabs.com + +INVERT +img[alt="SingularLabs"] + +================================ + +sio2.staszic.waw.pl + +INVERT +.texmath + +================================ + +sklepbiegacza.pl + +INVERT +.header__logo +.button__icon +.main-slider__nav-item +.homepage__brand-logo +.footer__list-image +img.footer__image[src*=cash] +.product__brand-logo +.paypo-info__button + +================================ + +skycash.com + +CSS +.c-hero__newsletter { + background-image: none !important; +} + +================================ + +skyscanner.* +skyscanner.*.* +backpack.github.io +tianxun.cn +whoflies.com + +CSS +body { + background: ${white} !important; +} +[class*=bpk-flare-bar__curve] { + fill: ${white} !important; +} + +================================ + +slack.com + +CSS +.c-slacklogo svg path:first-child { + fill: var(--darkreader-selection-text) !important; +} +.c-button:not(.v--primary, .v--secondary) { + background: inherit !important; + color: inherit !important; +} +.c-button:not(.v--primary, .v--secondary):hover { + text-decoration: underline !important; +} + +================================ + +slackware.com + +CSS +body { + background-image: none !important; +} +td[bgcolor="#000000"] { + border: 1px solid !important; +} + +================================ + +slader.com + +INVERT +.navigation__logo +.explanation +.solution-cell img +.solution-content img +.answer img + +================================ + +slashnet.wordpress.com + +CSS +#container, +.entry, +body { + background-image: none !important; +} + +================================ + +slazag.pl + +INVERT +.logo__wrapper +.triangle-slazag-svg +img.section-bg-absolute +.footer__logo__section +.focus__portals__banner__single + +================================ + +smap.uthm.edu.my + +CSS +.slider-background { + background: none !important; +} +.backstretch { + opacity: 0.5 !important; +} + +================================ + +smcdsb.elearningontario.ca + +CSS +:host([no-padding-footer]) .d2l-dropdown-content-footer, :host([no-padding-header]) .d2l-dropdown-content-header, :host([no-padding]) .d2l-dropdown-content-container { + background: var(--darkreader-neutral-background); +} + +================================ + +smithsonianmag.com + +INVERT +.site-logo +.footerLogo > a > img +#mobile-icon > span + +================================ + +smoglab.pl + +CSS +.main-nav, +.footer, +.module-title .main-title { + background-image: none !important; +} + +================================ + +smtp2go.com + +INVERT +canvas + +================================ + +smzdm.com + +INVERT +#logo +.logo-left + +================================ + +snack.expo.io + +CSS +#root > div > div > div:nth-child(2) > div:nth-child(2) > div:nth-child(2) > div > div:nth-child(2) { + background-color: white !important; +} + +================================ + +snapcraft.io + +CSS +.snapcraft-banner-background { + background-image: none !important; +} + +================================ + +snapeda.com + +INVERT +img[title="SnapEDA"] +img.part-organization +canvas:not(#firstfootprint) + +================================ + +softorage.com + +CSS +.tg { + background-image: linear-gradient(36deg,#fc466b,#3f5efb) !important; +} + +================================ + +softpedia.com + +IGNORE IMAGE ANALYSIS +.menubar-hp span.logov +h1.logov + +================================ + +sony.* + +IGNORE INLINE STYLE +.brand-logo-svg > g + +================================ + +soundcloud.com + +INVERT +.notificationIcon.messages::before + +CSS +.listenEngagement, .commentForm__wrapper { + border: none !important; +} +body, +.commentForm__wrapper, +.searchTitle { + background: none !important; +} +.sc-classic .header__navMenu > li > a { + border-right-color: #454545 !important; +} +.headerSearch__input { + background: ${#f1f4f6} !important; +} + +================================ + +souq.com + +INVERT +img[src*="/souqAmazon-logo-v2"] +li.fashion-menu-link[aria-expanded="false"] +.userNameField::after +.filter-icon.deals +.cart-icon + +================================ + +source.dot.net + +CSS +.r { + border-style: none !important; +} + +================================ + +sourceforge.net + +CSS +.intro, +.audience { + background-image: none !important; +} +.all-facets, .m-project-search-results { + background-color: ${white} !important; +} + +================================ + +sourcegraph.com + +INVERT +.header__logo + +CSS +body { + background-image: none !important; +} + +================================ + +soylent.com + +INVERT +.header-logo__image +.d-header #site-logo + +================================ + +space.bilibili.com + +INVERT +.count::before + +================================ + +spaceweather.com + +INVERT +[src$="current_conditions.jpg"] +[src$="center_tablebg_top_r2_c1.jpg"] + +CSS +[background] { + background-image: none !important; +} + +================================ + +spanish.kwiziq.com + +CSS +.bg-clouds { + background-image: none !important; +} +.table-scroll-shadow-wrapper table td, +.table-scroll-shadow-wrapper table th, +.table-scroll-shadow-wrapper table tr { + mix-blend-mode: normal !important; +} + +================================ + +spc.noaa.gov + +CSS +body { + background-image: none !important; +} + +================================ + +spectrum.com + +INVERT +img[src$="spectrum-logo.svg"] + +CSS +.sp-background-image { + background-image: none !important; +} + +================================ + +spectrum.ieee.org + +INVERT +a[title="Spectrum Logo"] > svg + +================================ + +spectrum.net + +INVERT +.banner-wrapper > .image-container +img[src$="spectrum-logo.svg"] + +CSS +.unauthenticated-homepage { + background-image: none !important; +} + +================================ + +speed.cloudflare.com + +INVERT +img[src*="speedrabbit-animate.gif"] +img[src*="speedrabbit-static.png"] + +================================ + +speeddial2.com + +INVERT +img[src*="images/"] + +================================ + +spidersweb.pl + +INVERT +.amp-site-title +img[alt="logo bizBlog"] +img[alt="bizblog to ludzie"] + +================================ + +spidersweb.pl/plus + +INVERT +a[href="/plus"] svg + +================================ + +spidersweb.pl/rozrywka + +INVERT +a[href="/rozrywka"] svg + +CSS +a[href="/rozrywka"] svg path[fill="#211D26"] { + --darkreader-inline-fill: ${white} !important; +} + +================================ + +sports.ru + +INVERT +.nav-top-line__logo + +================================ + +sporza.be + +CSS +.sc-score, +.sc-score__away, +.bouton:hover { + color: ${#222} !important; +} +.sc-score__wrapper { + background-color: ${#BBB} !important; +} +.bouton { + color: ${#fff} !important; +} +.sc-epg--live .sc-epg__program { + background-color: ${#CCC} !important; +} +.vrt-newsletter { + background-color: ${#EEE} !important; +} +.vrt-site-footer .vrt-newsletter .vrt-link--newsletter { + background-color: ${#AAA} !important; +} +.logo__letters { + fill: var(--darkreader-neutral-background) !important; +} +.vrt-link { + background-color: ${rgba(255, 165, 0, 0)} !important; + color: ${rgba(50, 50, 50)} !important; +} +.vrt-link:hover { + background-color: ${rgb(100, 100, 100)} !important; +} +.vrt-site-footer__navigation--green { + background-color: ${#AAA} !important; + color: var(--darkreader-neutral-background) !important; +} + +================================ + +spreadprivacy.com + +INVERT +[src^="https://spreadprivacy.com/content/images/2017/07/linux"] +[src^="https://spreadprivacy.com/content/images/2017/11/Significant-Actions"] +[src^="https://spreadprivacy.com/content/images/2018/09/ddg-traffic"] +[src^="https://openclipart.org/image/24px/svg_to_png/28768/qubodup-Cubikopp-smilies"] +[src="https://spreadprivacy.com/content/images/2017/10/smiley.png"] +[src="https://spreadprivacy.com/content/images/2018/09/private-browsing4.png"] +[src="https://spreadprivacy.com/content/images/2017/10/https-in-address-bar26.png"] +[src="https://spreadprivacy.com/content/images/2018/01/private-browsing-reasons-1.png"] +[src="https://spreadprivacy.com/content/images/2020/05/search-preference-menu_heatmap.jpg"] +[src="https://spreadprivacy.com/content/images/2020/10/trilateral-invitation_header-1.png"] +[src="https://spreadprivacy.com/content/images/2020/05/search-preference-menu_comparison-1.jpg"] +[src="https://spreadprivacy.com/content/images/2020/05/search-preference-menu_screen-sizes-1.jpg"] +[src="https://spreadprivacy.com/content/images/2020/02/Awareness-of-Privacy-Risk-of-Public-USB-Charging-.jpg"] +[src="https://spreadprivacy.com/content/images/2018/02/DuckDuckGo-Extension_Desktop-OnDevice.jpg"] + +================================ + +sqlitebrowser.org/stats + +IGNORE INLINE STYLE +.plot-container.plotly * + +================================ + +squareup.com + +INVERT +.logo + +================================ + +ssllabs.com + +INVERT +#logo + +================================ + +sso.qiniu.com + +INVERT +.navbar-brand + +================================ + +stackage.org + +INVERT +.logo + +================================ + +stackexchange.com +askubuntu.com +mathoverflow.net +serverfault.com +stackapps.com +stackexchange.com +stackoverflow.com +superuser.com + +INVERT +._glyph:not(.top-bar .-logo ._glyph) +.favicon-mathoverflow +.favicon-mathoverflowmeta +.favicon-stackoverflowmeta +.h-auto[alt="Academia"] +.h-auto[alt="Anime & Manga"] +.h-auto[alt="Ask Different"] +.h-auto[alt="Aviation"] +.h-auto[alt="Code Review"] +.h-auto[alt="Electrical Engineering"] +.h-auto[alt="English Language Learners"] +.h-auto[alt="Japanese Language"] +.h-auto[alt="MathOverflow"] +.h-auto[alt="Mathematics"] +.h-auto[alt="Server Fault"] +.h-auto[alt="Skeptics"] +.h-auto[alt="Software Engineering"] +.h-auto[alt="Stack Apps"] +.h-auto[alt="Super User"] +.h-auto[alt="The Workplace"] +.h-auto[alt="Theoretical Computer Science"] +.h-auto[alt="Unix & Linux"] +.h-auto[alt="Web Applications"] +.h-auto[alt="Role-playing Games"] +a.js-gps-track::before +img[alt="The Stack Exchange Network"] + +CSS +body, +#content { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} +.profile-cards--graph { + background-image: repeating-linear-gradient(0deg, transparent, transparent 13px, ${#e4e6e8} -13px, ${#e4e6e8} 21px) !important; +} +.c-pointer { + color: grey; +} +.js-accepted-answer-indicator.fc-green-500 { + color: var(--green) !important; +} +#newuser-box { + background-color: ${#FFF8DC} !important; +} +.topbar .icon-site-switcher-bubble { + background-repeat: no-repeat !important; +} + +IGNORE INLINE STYLE +.chess-replayer-board td + +================================ + +standards.ieee.org + +INVERT +.logo-link + +================================ + +stardewvalleywiki.com + +CSS +html { + background: none !important; +} + +================================ + +stardock.com + +INVERT +.mid +.careers + +================================ + +start64.com + +INVERT +img[alt="logo"] + +================================ + +startech.com.bd + +INVERT +#nav-toggler + +================================ + +startpage.com + +INVERT +.hamburger-menu .hamburger-button + +IGNORE IMAGE ANALYSIS +.home__section__search-logo +.header__logo +.header-settings__logo +.hamburger-menu .hamburger-button + +================================ + +station-drivers.com + +INVERT +img[src*="/topic_icons/"] +img[src*="/folder_icons/"] +img[src*="/images/bios_firmware"] +img[src*="/images/driver.jpg"] +img[src*="/images/utile"] +img[src*="/images/rating"] +img[src*="/images/star"] +img[src*="/images/downl"] +img[src*="/components/com_remository/images/file_icons/"] +img[src*="/images/gohome.gif"] + +================================ + +stats.stackexchange.com + +CSS +.site-header { + background-image: none !important; +} + +================================ + +status.aws.amazon.com + +INVERT +.logo +.tabStandard +td > img +td > a > img +th > a > img +th > div > a > img + +CSS +.tabStandard a { + color: ${white} !important; +} +.tabStandard, +.selected a { + color: ${white} !important; + background-color: ${black} !important; +} +tbody > tr > th { + background: transparent !important; +} +table > tbody > tr > td { + background: transparent !important; +} +.gradient { + background: transparent !important; +} + +================================ + +status.epicgames.com + +INVERT +div.eg-shield.white + +================================ + +status.npmjs.org + +INVERT +.logo-container > a > img + +================================ + +statusinvest.com.br + +INVERT +div.indice-list div.ml-1 +div.indice-list div.mt-2 +i.ml-1 + +================================ + +steamdeck.com + +IGNORE INLINE STYLE +#header-logo-arc ~ * + +================================ + +stevendoesstuffs.dev + +INVERT +.post-img-wrapper img + +================================ + +stine.uni-hamburg.de + +CSS +.appointment { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +stm.info + +INVERT +.map-OSM + +================================ + +stockbit.com + +INVERT +#plotplace canvas +#landing-logo img +#header-logo img +.footer-logo img +.trending-chart img +.widget-ihsg-chart img +.konvajs-content canvas +.flotcompanychart canvas +.analyst-title img +.card-calendar-title img +.calendar-more span +.save-orderbook img +.company-navigation-more span +.dropmenu-more span +.navmore span +.stream-more-wrap span +.stream-more span +.trading-menu-img +.securities-input-pass-wrapper img +.styled__PasswordContainer-w16pvr-2 img +.connectwrap_slim-off +.searchstream +.ssnlogo + +CSS +.highlight { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +stolichki.ru + +INVERT +.logoBig__img +ymaps[class$="ground-pane"] +ymaps[class$="svg-icon-content"] > ymaps +ymaps[class$="placemark__content-inner"] > ymaps > ymaps + +================================ + +stooq.pl + +CSS +a[href="//stooq.pl"] path:not([fill]) { + fill: var(--darkreader-neutral-text) !important; +} + +================================ + +store.google.* + +CSS +[style*="background-image"] { + filter: brightness(50%) sepia(40%) !important; +} + +================================ + +store.playstation.com + +INVERT +.psw-brand-text--playstation-store + +================================ + +store.ubi.com + +INVERT +div.primary-logo + +CSS +.pt_storefront-homepage #main .homepage-slider-wrapper .homepage-custom-slide > a:not(a[href$="/deals"]) .homepage-custom-slide__content .custom-slide-inner h2, +.pt_storefront-homepage #main .homepage-slider-wrapper .homepage-custom-slide > a:not(a[href$="/deals"]) .homepage-custom-slide__content .custom-slide-inner h3, +.pt_storefront-homepage #main .homepage-slider-wrapper .homepage-custom-slide a { + color: var(--darkreader-neutral-background) !important; +} +.pt_storefront-homepage #main .homepage-slider-wrapper .homepage-custom-slide > a[href$="/deals"] .homepage-custom-slide__content .custom-slide-inner h3 { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +strava.com + +INVERT +.labelGroup +#effort-box +.week.clearfix svg +#compare-graph svg +#compare-graph canvas +.nav-item a::after +.weekly-goal svg .sport-type +footer img[alt="Strava"] +.activity-indicator +.icon-other +#open-global-search-button +.icon-caret-down +.icon-share +.icon-kudo +.icon-comment +.icon-collapse +.icon-star + +CSS +.base-chart .grid-line, +#athlete-history-chart .vgrid { + stroke: #555555; +} +#athlete-history-chart #effort-box { + fill: #3e3e3e; + stroke: black; +} +#basic-analysis .xaxis-container .background, +#basic-analysis rect.static-info-box, +#basic-analysis rect.static-label-box { + fill: #2c2c2c; +} +.base-chart rect.simple-bar.segmentbar { + opacity: 1; +} +.base-chart rect.simple-bar { + fill: #444444; + stroke: #252627; +} +.current-week-label { fill: black; } +.sum.no-rest { fill: black; } +.options img { + filter: invert(40%); +} +#infoBox text { + color: black; +} +.weekly-goal svg .sport-type { + opacity: 0.5 !important; +} +svg { + fill: currentColor; +} + +IGNORE IMAGE ANALYSIS +.app-icon.icon-fb +.app-icon.icon-rowing +.app-icon.icon-nordicski + +================================ + +streamable.com + +INVERT +.customer-logos +.landing .features-pane .feature > span > svg +.landing .logo +.landing .start-pane .start-form .try-arrow > img +.swoosh +#player.container .actions-section .logo +#player-play-pause-button +#player-progress-track +#player-progress-value + +================================ + +student.ladok.se + +CSS +#sidomeny .middle { + background: var(--darkreader-neutral-background) !important; +} + +================================ + +studio.youtube.com + +INVERT +paper-radio-button +.ytcp-home-button img + +================================ + +studip.uni-passau.de + +CSS +#layout_container > div { + background-image: none; +} + +================================ + +studyflix.de + +INVERT +img[title='Rendered by QuickLaTeX.com'] + +================================ + +subdivx.com + +INVERT +#cabecera img +#contenedor_foro .cita img +#contenedor_foro .datos img[src*="/img/"] +#perfil_izq img[src*="img/"] + +CSS +BODY * { + color: ${#333}; +} +A { + color: ${#0366d6} !important; +} +input[type="text"], +input[type="password"], +input[type="button"], +input[type="submit"] { + background: ${#bbb}; + border: 1px solid #999; +} +input[type="submit"]:hover { + background: ${#999}; + border: 1px solid #999; +} +mark { + background: ${#f00} !important; + color: ${#fff} !important; +} +#barra a, +#menu_largo a, +#menu_largo_chat a, +#foro_tema_menu a, +#ultimos_foros_renglon .link_foro_tema, +.titulo_menu_izq { + color: #ddd !important; +} +#wrapper { + background-image: none !important; +} +#contenedor_gral { + display: table; + background: ${#e0e0e0} !important; + box-shadow: rgba(0, 0, 0, 0.7) 0px 0px 8px; + height: -webkit-fill-available !important; + width: fit-content !important; +} +#cabecera { + background: ${#e4e4e4}; +} +#barra, +#menu_top, +#menu_detalle_buscador, +#menu_detalle, +#menu_largo, +#menu_largo_chat, +#prog_menu_detalle, +#primer_msg_voto, +#reg_menu_detalle, +#drdivx_menu_detalle, +#contenedor_foro .fecha, +#perfil_menu, +#foro_tema_menu { + background: ${rgb(153,173,206)} !important; + background: linear-gradient(to bottom, ${rgb(153,173,206)} 0%, ${rgb(75,110,171)} 100%) !important; +} +#foro_home, +#foro_home_renglon, +#cuadrados_izq, +#cuadrados_izq_reng, +#chat_reng, +#contenedor_foro, +#contenedor_foro .datos, +#contenedor_foro .cita, +#contenedor_foro .mensaje { + background: ${#fff} !important; +} +#foro_home_datos, +#cuadrados_izq { + color: ${#999} !important; +} +#foro_home_datos a { + color: ${#669} !important; +} + +================================ + +subiektywnieofinansach.pl + +INVERT +.logo + +================================ + +submarinecablemap.com + +INVERT +div[aria-label="Map"] > div:first-child + +================================ + +subscene.com + +CSS +body { + background-image: none !important; +} + +================================ + +suckless.org + +INVERT +[src="dwm.svg"] +[src="st.svg"] +[src="core.svg"] +[src="surf.svg"] +[src="blind.svg"] +[src="farbfeld.svg"] +[src="quark.svg"] +[src="sent-bullets-s.png"] +[src="slstatus.svg"] + +================================ + +sugaroutfitters.com + +CSS +.clearfix { + display: none !important; +} + +================================ + +suite.smarttech-prod.com + +INVERT +.smart-wbp-canvas-layer + +================================ + +suno.com.br + +INVERT +#logoSuno > a > svg + +================================ + +superbuy.com + +INVERT +.header-logo +.logo img + +================================ + +support.discord.com + +INVERT +.logo img +ol.breadcrumbs li:first-child:before + +================================ + +support.eset.com + +INVERT +i.table-icon.product + +================================ + +support.mozilla.org + +INVERT +.card--topic .card--icon +.card--icon-sm +div.sumo-nav--logo + +================================ + +surveymonkey.com + +CSS +.is-high-contrast .radio-button-display, +.is-high-contrast .checkbox-button-display { + opacity: 1 !important; +} +.modern-browser .radio-button-display::after, +.modern-browser .checkbox-button-display::after { + border-color: var(--darkreader-neutral-text) !important; +} + +================================ + +sverigesradio.se + +INVERT +#sprite-check +#sprite-facebook +#sprite-instagram +#sprite-reddit +#sprite-twitter +#sprite-whatsapp +.circle +.cross +.default +.episode-list-item__controls svg +.external-link-with-icon__icon +.gallery-button .icon +.gallery-button svg g +.info-teaser-container__title h2 +.link-icon .icon +.local-weather-item__wind-icon +.logo +.menu-icon.icon +.play-icon__pause-symbol +.play-icon__play-symbol +.progress.queue-progress .bar +.sr-link__svg svg +.sr-logo-wrapper +.sound-bars .bar +.support-info__icon svg +[data-require="modules/custom-click-tracking"] svg +[data-require="modules/listen-later"] svg +[data-require="modules/share-button"] svg +button.reset +input[type="range"]::-moz-range-thumb +input[type="range"]::-moz-range-track +input[type="range"]::-webkit-slider-runnable-track +input[type="range"]::-webkit-slider-thumb + +CSS +.weather-icon { + filter: invert(1) hue-rotate(180deg) !important; +} +.live-marker .dot, +.live-label::before, +.active::before { + background-color: var(--darkreader-neutral-text) !important; +} +.search-page em, .search-result em, .info-teaser-container__title { + color: var(--darkreader-neutral-background) !important; +} +#sprite-home path, #sprite-news path, #sprite-podcast path, #sprite-direct path, #sprite-profile path { + fill: var(--darkreader-neutral-text); +} + +================================ + +svt.se + +INVERT +header img[src*=svt] +.nyh_navigation__menu-toggle +[class^="VideoPlayerTheme__play-pause-button-simple"]::before +[class^="_play-pause-button-simple"]::before + +CSS +.nyh_breaking__top-prefix, +.nyh_teaser__live-text { + color: var(--darkreader-neutral-background) !important; +} +button[class^="PaginationButton"], +a[class^="PaginationButton"], +.nyh_screamer, +[class^="_RightNowTeaser__title"], +[class^="_RightNowTeaser__root"] { + background: var(--darkreader-bg--nyh-color-white) !important; + border-left-color: var(--darkreader-bg--nyh-color-news); +} +button[class^="PaginationButton"]:hover, +a[class^="PaginationButton"]:hover { + background: var(--darkreader-border--color-play-white) !important; +} +.flexbox .nyh_teaser.nyh_teaser--group-secondary { + border-right: none !important; +} +[class*="GroupSecondaryTeasers__container___"], +.nyh_feedbox-item+.nyh_feedbox-item, +.nyh_teaser.nyh_teaser--no-border-top { + border-top: none !important; +} +.nyh_navigation .nyh_submenu::before { + border-bottom-color: var(--darkreader-bg--nyh-color-white) !important; +} +.nyh_teaser.nyh_teaser--story-grid, +.nyh_icons_caret--factbox { + border: none; +} +.nyh_submenu-menucard, +[class*="_Post__contentVisitor___"]::after { + border-right-color: var(--darkreader-bg--nyh-color-grey-lighter) !important; +} +[class*="CurrentTopics__item___"], +[class*="GroupSecondaryTeasers__showMoreButton___"], +.nyh_mobile-menu__list-item, +.nyh_menu-card__submenu-item, +.nyh_submenu-menucard, +.nyh_submenu { + border-color: var(--darkreader-border--nyh-color-grey-lighter) !important; +} +.nyh_fact-box { + border-bottom: 1px solid var(--darkreader-border--nyh-color-grey-lighter); + border-top: 1px solid var(--darkreader-border--nyh-color-grey-lighter); +} +.nyh_fact-box__body--closed::after { + background: linear-gradient(to bottom, #1e202180 0%, #1e2021 100%); +} +.nyh_regional-widget-regions { + background: var(--darkreader-bg--nyh-color-grey-lightest); +} +.nyh_submenu-menucard { + background-color: var(--darkreader-bg--nyh-color-white); +} + +================================ + +sw.kovidgoyal.net + +CSS +.sidebar-drawer, +.sidebar-search, +.toc-drawer { + background: var(--darkreader-neutral-background) !important; +} +.sidebar-tree a.current, +.sidebar-tree label:hover { + background: var(--darkreader-selection-background) !important; +} + +================================ + +swiatrolnika.info + +INVERT +img[alt*="logo"] +img[src*="/images/images2/icons/"] + +================================ + +system76.com + +INVERT +svg[class^="sys-logo"] + +================================ + +systemd.io + +INVERT +.page-logo img + +================================ + +t.bilibili.com + +CSS +#app, .fixed-bg { + background-image: none !important; +} + +================================ + +t.me +telegram.me + +INVERT +.tgme_logo + +================================ + +tableau.com + +INVERT +.feature-list__icon +.mobile-nav-button__icon +.site-logo + +CSS +section { + background-image: none !important; +} + +================================ + +tablesgenerator.com + +INVERT +.icon-all-borders.toolbar-icon +.icon-no-borders.toolbar-icon +.icon-edit-borders.toolbar-icon +.icon-merge-cells.toolbar-icon +.icon-split-cells.toolbar-icon +.icon-no-colors.toolbar-icon + +IGNORE INLINE STYLE +.sp-thumb-inner +.sp-preview-inner + +================================ + +tabletochki.org + +INVERT +.perekaz__list img + +================================ + +tails.boum.org + +INVERT +.laptop + +CSS +body { + background-image: none !important; +} +#donate-banner p { + color: var(--darkreader-neutral-background) !important; +} +#donate-banner u { + border-bottom-color: var(--darkreader-neutral-background) !important; +} + +IGNORE IMAGE ANALYSIS +#donate-banner + +================================ + +tailwindcss.com + +CSS +.bg-white:not(#docsearch), .bg-gray-100 { + --bg-opacity: none !important; +} +.text-gray-900, .hover\:text-gray-900:hover, +h1, h2, h3, +h4, h5, h6 { + --text-opacity: none !important; +} +.bg-center { + background: none !important; +} + +================================ + +take-a-screenshot.org + +INVERT +.switch-window span::before + +================================ + +taobao.com + +INVERT +#J_SearchIcon +.J_MyShopCoupon +.J_BtnEditSKU +.cart-checkbox + +CSS +.tbh-member.J_Module { + background-image: none !important; +} +#q.search-combobox-input { + background-color: var(--darkreader-neutral-background); +} + +================================ + +tapology.com + +INVERT +.logo +ul.feedCats + +CSS +ul.feedCats li a:link, ul.feedCats li a:visited { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +tarnogorski.info + +INVERT +.td-main-logo + +================================ + +tasks.google.com + +INVERT +div[role="listitem"] > div > div > div[role="presentation"] + +================================ + +tastoid.com/ + +CSS +.jumbotron.jumbotron-no-bg { + background: var(--darkreader-neutral-background) !important; +} + +================================ + +tcrf.net + +CSS +body { + background-image: none !important; +} + +================================ + +teamtrees.org + +CSS +.hypeTemplate_tano { + background-color: ${white} !important; +} + +================================ + +techmaniak.pl +activemaniak.pl +agdmaniak.pl +appmaniak.pl +blogomaniak.pl +fotomaniak.pl +gizmaniak.pl +gsmmaniak.pl +luxmaniak.pl +mobimaniak.pl +rtvmaniak.pl +tabletmaniak.pl + +CSS +body, +#headerNavBlogomaniak, +#header, +#top, +#bottom, +#footer, +#footer_menu, +.wrapper, +#search input.search { + background-color: var(--darkreader-neutral-background) !important; + background-image: none !important; +} + +================================ + +technologyreview.com + +INVERT +a[class^="headerTemplate__logo"] + +================================ + +techpowerup.com + +INVERT +.page-header__logo + +================================ + +telegeography.com + +INVERT +.map-tile-loaded +div#globe-start > canvas +div#globe-end > canvas +div.leaflet-map-pane +img.map-banner +div.mapboxgl-map +span.hamburger-box +a > img[src^="https://www2.telegeography.com/hubfs/"] +img[alt="TeleGeography"] + +================================ + +teleman.pl + +INVERT +.movieRank + +================================ + +telerik.com + +INVERT +a.TK-Aside-Menu-Link +a.TK-Aside-Menu-Button +#ContentPlaceholder1_C377_Col00 > img + +CSS +a.TK-TLRK-Logo svg path[fill="#7c878e"] { + --darkreader-inline-fill: ${black} !important; +} +a.TK-TLRK-Logo svg path[fill="#4b4e52"] { + --darkreader-inline-fill: ${black} !important; +} +a.TK-PRGS-Logo-Footer svg path[fill="#4b4e52"] { + --darkreader-inline-fill: ${black} !important; +} +#ContentPlaceholder1_C418_Col00 > footer { + background-image: none !important; +} + +================================ + +teltarif.de + +CSS +body, +.ttColBack, +#tthdrbox { + background: var(--darkreader-neutral-background); + color: var(--darkreader-neutral-text); +} + +================================ + +tenforums.com + +CSS +.garhead { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; + border-left-color: var(--darkreader-neutral-background) !important; + border-right-color: var(--darkreader-neutral-background) !important; +} + +================================ + +tenor.com + +INVERT +.FlagIcon +.ShareIcon + +================================ + +terazwy.pl + +INVERT +img[src*="img/loga"] +img[src*="img/logotr.png"] + +================================ + +terraform.io + +IGNORE INLINE STYLE +.text + +================================ + +terraria.wiki.gg + +CSS +#mw-head { + background: var(--theme-navbar-background); +} +#mw-panel .portal h3::after { + border-color: var(--theme-sidebar-heading-arrow-color) transparent; +} +#mw-panel .portal h3:hover::after { + border-color: var(--theme-sidebar-heading-arrow-color-hover) transparent; +} +#simpleSearch::before, #simpleSearch::after { + border-color: var(--theme-navbar-search-botton-text-color); +} +#simpleSearch:hover::before, #simpleSearch:hover::after { + border-color: var(--theme-navbar-search-botton-text-color-active); +} + +================================ + +tesco.com + +CSS +.ui-components-library .nav-dropdown .dropdown a.nav-toggle h1, +.ui-components-library .nav-dropdown .dropdown a.nav-toggle h2, +.ui-components-library .nav-dropdown .dropdown a.nav-toggle h3, +.ui-components-library .nav-dropdown .dropdown a.nav-toggle h4, +.ui-components-library .nav-dropdown .dropdown a.nav-toggle h5, +.ui-components-library .nav-dropdown .dropdown a.nav-toggle h6 { + z-index: 0 !important; +} + +================================ + +tesla.com + +INVERT +.tds-modal-close-icon +.tds-menu-header-legacy [id*="tds-menu-header-main--trigger"]:checked ~ [for*="tds-menu-header-main--trigger"] .tds-menu-header-main--cross_hatch + +CSS +.tcl-hero-parallax__heading, +.tcl-hero-parallax__subheading a, +.tcl-hero-parallax__additional-link { + color: ${gray} !important; +} +#block-mainheadernavigation .tds-menu-header-nav--list_link { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +testudo.umd.edu + +CSS +#secondary-side, +#widgetbox_widget_parent_0 { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +the-race.com + +INVERT +.img-fluid + +================================ + +theatlantic.com + +INVERT +[class^="NavHamburgerButton_root"] +[class^="NudgeShared_chevron"] +[class^="NonMeteredNudge_desktopTextContainer"]::after + +================================ + +theatlas.com + +CSS +.d4 .axis .tick text { + fill: var(--darkreader-neutral-text) !important; +} +.d4 .axis .tick rect { + fill: var(--darkreader-neutral-background) !important; +} + +================================ + +thecamels.org + +INVERT +.block-tags +.block-client-group-list +.slider-content-list-item-opinion-logo +.slider-testimonials-list-item + +CSS +.slider-testimonials-content { + background-color: var(--darkreader-neutral-background) !important; + background-image: none !important; +} + +================================ + +thecanadianencyclopedia.ca + +INVERT +.edit +.citation +.share +.print +.dot-1.dot +.dot-2.dot +.dot-3.dot +.accordion-toggler.dropdown-toggler.nav-submenu-toggler + +================================ + +thecode.media + +INVERT +img[src$="/logo.svg"] +.post-item__arrow +li::before + +================================ + +thedailybeast.com + +INVERT +.Logo +.NavSubDesktop__hamburger-bars + +================================ + +thefreedictionary.com + +INVERT +strong.i.logo +a.i.keyboard-link.mobile-hidden +#regButton::before +ul.social-networks +a.i.icon-notif +div.box > a.i +div.cprh > span.i.A.cpr +a.i.popup-opener +ul.logos-list + +================================ + +theguardian.com + +INVERT +.inline-the-guardian-logo__svg +a[data-link-name$="logo"] > svg +.crossword__grid .crossword__cell-text + +================================ + +theinformation.com + +INVERT +.logo + +IGNORE IMAGE ANALYSIS +header.locked .logo + +================================ + +theins.ru + +INVERT +header > div > a > svg + +================================ + +thejakartapost.com + +INVERT +.logo-jakartapost + +================================ + +thelancet.com + +INVERT +.journal-logos +.footer__logo + +================================ + +themoscowtimes.com +moscowtimes.ru + +INVERT +.site-header__logo +.footer__logo +.contribute-teaser__button + +================================ + +themoviedb.org + +INVERT +.glyphicons_v2.link +.glyphicons_v2.keyboard +.glyphicons_v2.speech-bubble-alert +.glyphicons_v2.arrow-thin-right +.glyphicons_v2.arrow-thin-left + +CSS +.card { + background-color: ${#dfe1e2} !important; +} + +================================ + +thenounproject.com + +INVERT +div[class^="styles__Image"] +a[class^="styles__HeaderLogoLink"] + +================================ + +theoatmeal.com + +INVERT +img.d-inline-block.align-bottom + +================================ + +theonion.com + +INVERT +a[href="//www.theonion.com"] .theonion + +================================ + +thepaper.cn + +INVERT +.head_logo + +================================ + +thereader.mitpress.mit.edu + +INVERT +#logo + +================================ + +theregister.* +theregister.*.* + +INVERT +.row_label.title_rhs_line +.blocksandfiles_logo +.devclass_logo +#sitpub_logo + +================================ + +theverge.com + +INVERT +.c-global-header__logo +.c-tab-bar__logo +.c-footer__logo-link + +================================ + +thewindowsclub.com + +INVERT +.custom-logo + +================================ + +thompsonstein.com + +INVERT +a.logo + +================================ + +thriftbooks.com + +INVERT +.DesktopHeader-logo + +================================ + +thronemaster.net + +INVERT +.head-info-wild + +================================ + +thunderbird.net + +INVERT +.w-48 +a[title="Thunderbird"] > svg + +================================ + +ti.com + +INVERT +.ti_p-responsiveHeader-top-logo + +================================ + +tianocore.org + +INVERT +.tcLogoArea + +================================ + +tieba.baidu.com + +INVERT +.add-more-forum +.all-wraper +.core_title_btns +.day_rcmd > .class_title +.fengchao-wrap-box span +.focus_btn +img[src*="sign_err.png"] +.save_face_bg +.search_bright .nav_wrap_add_border +.share_btn_wrapper +.sub_nav_wrap +.threadlist_rep_num +.u-f-item + +CSS +.card_banner { + filter: brightness(50%); +} +.class_title, +.content-sec, +.f-d-item, +.left-sec, +.page-container, +.pb_footer, +.sub_nav_wrap, +.tb_footer { + background-image: none !important; +} +.u-f-item { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +time.com + +INVERT +nav.main .menu-btn .menu-btn-box + +================================ + +tinder.com + +CSS +svg > path[style*="--rewind"] { + fill: ${black} !important; +} +svg > path[style*="--nope"] { + fill: ${red} !important; +} +svg > path[style*="--super-like"] { + fill: ${cyan} !important; +} +svg > path[style*="--like"] { + fill: ${#22ebc0} !important; +} +svg > path[style*="--boost"] { + fill: ${purple} !important; +} + +================================ + +tizen.org + +INVERT +#header #logo + +================================ + +tjournal.ru + +INVERT +mark + +CSS +mark a { + color: ${#346eb8} !important; +} +.main.layout { + background: var(--darkreader-neutral-background) !important; +} + +================================ + +tns-e.ru + +INVERT +img[title*="ТНС энерго"] +img[src="/img/refresh.png"] +img[src="/img/logout-black.png"] + +================================ + +to-do.live.com + +INVERT +span[class^="ms-Toggle-thumb"] + +CSS +.backgroundLines { + background-image: linear-gradient(180deg, var(--darkreader-bg--bg-primary), var(--darkreader-bg--bg-primary) 52px, var(--darkreader-bg--bg-separator) 52px, var(--darkreader-bg--bg-separator) 52px) !important; +} + +================================ + +todoist.com + +INVERT +.ist_button_apple > img +#td-help-logo_svg__a ~ g:last-of-type + +CSS +main > section:first-of-type > div { + z-index: 1 !important; +} +img[src^="/_next/static/images/"], +[style*="/_next/static/images/"] { + filter: brightness(50%) sepia(40%) !important; +} +option, +.oT9NU, +footer { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +tokfm.pl + +INVERT +.controls span.play svg + +CSS +div.top_section_bg, +div.bottom_section_bg { + background-color: ${#e7e5e4} !important; +} +body.desk #content { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +tonsky.me + +CSS +body { + background-image: none !important; + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +torguard.net + +INVERT +img[src$="statusok.gif"] +img[src$="statusfailed.gif"] + +================================ + +tosdr.org + +INVERT +img[src*="tosdr-logo-128.svg"] +img[src*="/img/news/"] +img[src*="guidelines.svg"] + +================================ + +totylkoteoria.pl + +INVERT +.site-branding +.header__socials + +CSS +.hero { + background-image: none !important; +} + +================================ + +toutatice.fr + +INVERT +.img-responsive +.banner + +================================ + +towersemi.com + +INVERT +.Logo + +================================ + +towhee.io + +INVERT +.logo-wrapper + +================================ + +town-of-salem.fandom.com + +IGNORE INLINE STYLE +span[style^="text-shadow"] + +================================ + +track.toggl.com + +CSS +#root, +.content-wrapper > * { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +trailhead.salesforce.com + +INVERT +lwc-tds-header + +CSS +.search-input__input { + background-color: var(--darkreader-neutral-background) !important; +} +.user-info__name { + color: inherit !important; +} +.progress-ring__content { + background-color: white !important; +} +[data-layout="desktop"] .nav-list-item__link:hover, +[data-layout="desktop"] .nav-list-item__button[aria-expanded="true"] { + background: inherit !important; +} + +================================ + +transifex.com + +INVERT +img.close_image + +================================ + +translate.google.* +translate.google.*.* + +INVERT +.ttsbutton +.tlid-copy-translation-button +.starbutton +.speech-button +.clear +.swap > .jfk-button-img +.morebutton +.close-button +.ita-kd-icon-button +.ita-kd-menuitem-inputtool-icon +.ita-kd-checkbox +.vk-t-btn +.vk-sf-b +.ita-hwt-backspace-img +.ita-hwt-enter-img +.ita-hwt-grip +.gt-ex-quote + +CSS +.trans-verified-button { + background-size: cover; +} + +IGNORE IMAGE ANALYSIS +.ita-kd-img + +================================ + +translate.yandex.* + +INVERT +.button.button_tab.state-selected::before +#optionsButton::after +#clearButton::after +#textNativeSpeaker +#textSpeaker +#microphone::after +#keyboardButton::after +#spellerButton::after +.button.button_icon.button_icon_swap::after +#favButton::after +#translatorSpeaker +#translatorNativeSpeaker +#copyButton::after +#shareButton::after +#goodVoteButton::after +#badVoteButton::after +#editorButton::after +.toggler::after +.button.button_icon.button_icon_speaker +.dictionary-example_toggler::after +.dictionary-example_meta__vote-buttons +.icon.button.button_icon.button_icon_sync::after +.message.message_yellow.message_replace +.placeholder +.button.header-button.button_icon.button_icon_clear2::after +#shareCopyLink::after + +================================ + +translate.yandex.*/collections + +INVERT +.button.header-button.button_icon.button_icon_clear2::after +.record-line_speaker.button.button_icon.button_icon_speaker::after +.button.button_icon.button_icon_lines::after +.button.button_icon.button_icon_trash::after +#shareCollectionCopy::after + +================================ + +translate.yandex.*/doc + +INVERT +.button.button_tab.state-selected::before +.listbox-option::after + +================================ + +translate.yandex.*/ocr + +INVERT +.button.button_tab.state-selected::before +.button.button_icon.button_icon_swap::after +.button.button_icon.button_icon_plus::after +.button.button_icon.button_icon_minus::after +.button.button_icon.button_icon_lines::after +.button.button_icon.button_icon_words::after +.button button_icon.button_icon_blocks::after +.button.button_icon.button_icon_blocks::after +.button.button_icon.button_icon_reset::after + +================================ + +translate.yandex.*/translate + +INVERT +.button.button_tab.state-selected::before +#shareButton::after +.listbox-option::after +#shareCopyLink::after + +================================ + +transport.orgp.spb.ru + +INVERT +#map + +================================ + +trendmicro.com + +INVERT +.logo + +================================ + +trezor.io + +INVERT +.hero-image + +================================ + +tribunemag.co.uk + +INVERT +.si-hr-nv__toggle--menu +.si-hr-sm__item + +================================ + +trip101.com + +INVERT +.logo +.name +.partner-logo +img.partner-img + +================================ + +trojmiasto.pl + +INVERT +img[alt*="Trojmiasto.pl"] + +================================ + +truestory.pl + +INVERT +.tdb-logo-img + +================================ + +truity.com + +INVERT +.navbar-btn.logo +.footer-logo.logo + +================================ + +tug.org/FontCatalogue + +INVERT +img + +================================ + +tutorialspoint.com + +INVERT +i.fa +i.fab +i.fal +img.tp-logo +button.slick-prev.slick-arrow::before +button.slick-next.slick-arrow::before + +================================ + +tuwroclaw.com + +INVERT +.navigation i[class^="ico"] +.portal-logo +.partners a img +.hamburger-wrapper +img[src*="gfx/ico"] + +================================ + +tuxcare.com + +INVERT +.navbar__logo + +================================ + +tuxedocomputers.com + +INVERT +#logo + +================================ + +tv.yandex.* + +INVERT +.icon_location::after +.icon_location::before +.button_arrow_down::after + +IGNORE IMAGE ANALYSIS +.icon_location::after +.icon_location::before +.button_arrow_down::after + +================================ + +tvland.com + +CSS +body, +.header-container { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +tvn24.pl + +INVERT +.header-menu__more-button +.hamburger-icon + +================================ + +tvrain.ru + +INVERT +.menu3__logo + +================================ + +tvtropes.org + +INVERT +body.darthWiki > i +body.wmgWiki > i +.spi.darthwiki +.spi.sugarwiki +.spi.film +.spi.headscratchers +.spi.laconic-icon +.spi.lightnovel +.spi.manga +.spi.nightmarefuel +.spi.radar +.spi.recap +.spi.shoutout +.spi.webcomic +.spi.wmg +.spi.ymmv +img[src="/img/loading-alt.gif"] + +IGNORE IMAGE ANALYSIS +body.sugarWiki #header-spacer-left::after +body.sugarWiki #header-spacer-right::after + +================================ + +tweakers.net + +INVERT +.infoBox > .title:before +#userbar li.icon.selected > a + +CSS +#logo a { + background: url("https://tweakers.net/g/if/v3/framework/tweakers_logo_full.svg") no-repeat center !important;; +} +@media screen and (max-width: 1000px) { + #logo a { + background: url("https://tweakers.net/g/if/v3/framework/menu_icons_responsive_v6.png") no-repeat -8px -220px !important; + } +} +.ankeiler > a.commentCount { + background-image: url("https://tweakers.net/g/icons/commentcounter_small_bg.svg") !important; + text-decoration: none !important; +} +#userbar li.icon a { + background-image: url("https://tweakers.net/g/if/v3/framework/menu_icons_v2.png") !important; +} +#userbar li.icon.flag.nl::after { + border-top-color: #e7184c !important; + background-color: #fff !important; + border-bottom-color: #014a93 !important; +} +#userbar li.icon.flag.be::after { + border-left-color: #000 !important; + background-color: #ffff1a !important; + border-right-color: #e7184c !important; +} +.thumb.category { + border: none !important; +} +.ctaButton.play::after { + background-color: #FFF !important; +} +.relatedContentContainer .relatedContentItems .itemContainer { + border-top-color: ${#d9d9d9} !important; + border-bottom-color: ${#d9d9d9} !important; +} +#categoryBrowser li a { + background-color: initial !important; + background-image: none !important; +} +#categoryBrowser li.more { + background-image: url("https://tweakers.net/g/if/categories/arrows.png") !important; +} +#categoryBrowser li.more:not(li.active.more) { + background-position-y: -17px !important; +} +#categoryBrowser li.more.active { + background-image: url("https://tweakers.net/g/if/categories/arrows.png"), linear-gradient(rgb(131, 24, 46), rgb(148, 15, 49)) !important; +} +#tracker .fakeTop .toggleVisibility .corner::before, +#tracker .fakeTop .toggleVisibility .corner::after { + border-color: ${#ccc} !important; +} +@media screen and (max-width: 767px) { + #userbar li.icon a { + background-image: url("https://tweakers.net/g/if/v3/framework/menu_icons_responsive_v6.png") !important; + } + #categoryBrowser li.more.active { + background-image: none !important; + box-shadow: none !important; + } +} +#contentArea, +#categoryBrowser, +#categoryBrowser .sublist, +#categoryBrowser .mainlist, +#categoryBrowser ul, +#categoryBrowser li { + border-color: ${#b2b9bd} !important; +} + +IGNORE IMAGE ANALYSIS +#categoryBrowser li a +table.highlights .title a.showMoreItems + +================================ + +twit.tv + +INVERT +.logo-large + +================================ + +twitch.tv + +INVERT +.volume-slider__slider-container +.seekbar-bar + +CSS +.seekbar-segment { + background-color: rgb(169, 112, 255) !important; +} + +================================ + +twitter.com + +INVERT +[role="slider"] +[style^="flex-grow"] + +CSS +main, +header { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +twosigma.com + +INVERT +.homepage-video-desktop video +.homepage-video-desktop img + +================================ + +tygodnikkrag.pl + +INVERT +#header-logo-image + +================================ + +typescriptlang.org + +CSS +.dark-theme .markdown pre { + filter: none !important; +} +:root { + --darkreader-bg--raised-background-color: #1c1f21 !important; +} + +================================ + +ubereats.com + +INVERT +img[alt*='Home'] +div[class^='c5'] .gm-style +#main-content > h1 + div +#wrapper > div:nth-of-type(2) +#wrapper > div:nth-of-type(2) > header +#wrapper > div:nth-of-type(2) > footer +#wrapper > div:nth-of-type(2) > #main-content > div:first-child + +================================ + +ubuntu.com + +INVERT +.cls-2 +.global-nav__header-logo-anchor + +CSS +header[style$="image-background-paper.png);"] { + background-image: none !important; +} +.chart-key text { + fill: var(--darkreader-neutral-text) !important; +} + +IGNORE INLINE STYLE +g#ubuntu-logo > path + +================================ + +ubuntubudgie.org + +INVERT +.custom-logo + +================================ + +udemy.com + +CSS +.radio:not(.radio-button) input[type="radio"]:checked + .radio-label::before, +.radio-inline:not(.radio-button) input[type="radio"]:checked + .radio-label::before { + background-color: var(--darkreader-neutral-text) !important; +} + +IGNORE INLINE STYLE +[data-purpose="star-rating-mask"] > rect + +================================ + +ultimate-guitar.com + +INVERT +form[action$="/search.php"] > button +form[action$="/search.php"] > button:not(:hover) > span +canvas[style^="height: 72px; width: 84px;"] +canvas[style^="height: 42px; width: 141px;"] + +================================ + +umweltinstitut.org + +CSS +.streifenBg { + background-image: none !important; +} + +================================ + +un.org + +INVERT +a.logo[title="United Nations"] + +================================ + +understandingwar.org + +CSS +#edit-search-block-form--2, +#nice-menu-1 > li > a { + color: var(--darkreader-neutral-background) !important; + text-shadow: none !important; +} +#mainwrap, +.secondarybox, +.content, +.view-filters { + background-image: none !important; +} +img[src*="ISW\%20LOGO"], +img[src*="ISW\%20Logo"] { + background-color: white !important; +} + +IGNORE IMAGE ANALYSIS +* + +================================ + +uokik.gov.pl + +INVERT +.a-press-office +.abgLong +h1[id="logo"] +p a +p.nav img +span[class="number"] +ul[class="tabs"] + +CSS +#subpage, +.sWrapper1, +.sWrapper2, +.tabs, +body#page, +div#right, +div#top, +div.fWrapper, +div[class="b1"], +h2#here { + background-image: none !important; +} +#footer .active { + color: #000000 !important; +} + +================================ + +uol.com.br + +CSS +.text a { + text-decoration: underline; +} + +================================ + +ups.com + +CSS +#ups-alertsWrap, +#ups-skipNav { + background: ${#FE9} !important; +} + +================================ + +uptimerobot.com + +INVERT +.normal-logo +.socialWrapper > ul > li +.feature-icon +[src$="godaddy-logo.svg"] +[src$="moodys-logo.svg"] +[src$="ibm-logo.svg"] +[src$="expedia-logo.svg"] +[src$="creditcards.svg"] + +CSS +.page-head, +.sidebar { + background-image: none !important; +} + +================================ + +upwork.com + +CSS +.profile-completeness-nudges-tiles-alternative .carousel-wrapper .up-icon svg { + filter: drop-shadow(0 0 0px var(--white)) drop-shadow(0 0 0px var(--white)); +} +.up-skill-container .up-btn.up-btn-next::before, +.up-skill-container .up-btn.up-btn-prev::before { + opacity: 0 !important; +} +.up-tab-scroll-hint:after { + background: none !important; +} +.up-d-skeleton { + color: transparent !important; + background-color: var(--darkreader-bg--skeleton-color) !important; + background-image: linear-gradient(90deg, var(--darkreader-bg--skeleton-color), #24242400, var(--darkreader-bg--skeleton-color)) !important; +} + +================================ + +urbandecay.com + +IGNORE INLINE STYLE +.c-select__icon +.c-swatch + +================================ + +urbandictionary.com + +INVERT +nav a span > span +nav a[href="/"] svg > g > path:first-child + +================================ + +urpredditodicittadinanza.lavoro.gov.it + +CSS +:root { + --lwc-colorContentAreaBackground : transparent !important; +} + +================================ + +usbank.com + +INVERT +.logo + +================================ + +userstyles.world + +INVERT +nav .menu-icon .i + +================================ + +uspassporthelpguide.com + +CSS +body { + background: none !important; +} + +================================ + +usps.com + +INVERT +img[src$="hamburger.svg"] +img[src$="search.svg"] +ul.nav-list > li.menuheader::after +ul.nav-list > li.qt-nav > div > ul > li > a > img +#usps-logo + +================================ + +uteka.ru + +INVERT +img[src^="/static/img/logo.svg"] +ymaps[class$="ground-pane"] + +================================ + +v.qq.com + +INVERT +.page_user_center .link_logo + +================================ + +v2ex.com + +CSS +#Wrapper { + background-image: none !important; +} + +================================ + +vaccines.gov +vacunas.gov + +INVERT +.accIcon +.Button +img[src$="/images/bch-logo.svg"] +img[src$="/images/en-US/wcdt.svg"] +img[src$="/images/es-US/wcdt.svg"] +img[src$="/images/hhs-logo.svg"] + +================================ + +vaccines.procon.org + +INVERT +#right-sidebar > aside.widget_media_image > a > img + +================================ + +valgrind.org + +CSS +p { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +vandale.nl + +INVERT +#content-top.form + +================================ + +vanguard.com + +INVERT +.vgn-accordionIcon +.vgn-arrow::after +#vgn-searchToggleButtonButton--long-form +#vgn-searchToggleButtonButton--small-form +input[id^="buysellForm:"] +input[id^="HoldingDetailForm:"] + +CSS +.hidePageIfJSdisabled { + display: block !important; +} + +================================ + +vbulletin.com + +CSS +.std { + background-color: var(--darkreader-neutral-background) !important; +} +.hero-text, +#hometext li, +#hometext h4, +#hometext_buttons div p { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +vc.ru + +INVERT +mark + +CSS +.main.layout, +#page_wrapper { + background: var(--darkreader-neutral-background) !important; +} + +================================ + +vcb-s.com + +CSS +html { + background-color: transparent !important; +} + +================================ + +vechevoikolokol.ru + +INVERT +.map +.main-page-about .img-responsive +.header-menu__mobile .img-responsive + +CSS +.main-page-about, .main-suggestions, .i-about, .issues-page__content{ + background: none !important; +} + +================================ + +vendors.paddle.com + +INVERT +svg.datamap + +CSS +:host(pui-tabs) { + background-color: var(--darkreader-neutral-background) !important; + border-bottom: var(--darkreader-neutral-background) !important; + color: ${black} !important; +} +:host(pui-tabs) ::slotted(button), +:host(pui-tabs) ::slotted(a) { + background-color: var(--darkreader-neutral-background) !important; + color: ${black} !important; +} +#line-chart .tick { + fill: ${black} !important; +} + +================================ + +ventusky.com + +CSS +.qo { + color: ${white} !important; +} + +================================ + +vercel.com + +INVERT +[alt="optimized-frameworks"] +[class^="features_logo"] +button[class^="header_logo"] + +CSS +:root { + --geist-foreground: var(--darkreader-neutral-text) !important; +} +div[style="background:var(--accents-1);"] { + background-color: var(--darkreader-neutral-background) !important; +} +.geist-text-center { + color: ${#333} !important; +} + +================================ + +vfsglobal.cn + +INVERT +.covid-icon +.logo + +================================ + +vg24.pl + +INVERT +img[alt="VG24.PL logo"] + +================================ + +vice.com + +INVERT +img[src*="article-logo"] +div.nav-bar__hamburger-button__hamburger +a.page-footer__logo-vice-link + +IGNORE INLINE STYLE +.logo-vice * + +================================ + +videolan.org + +CSS +ul { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +videoman.gr + +INVERT +#logo-custom span +.logo-single + +================================ + +vimeo.com + +INVERT +svg[alt="Vimeo"] +#header-vimeo-logo +footer > div > div > a > svg > path[d^="M89.05 23.658a12.087 12.087"] + +================================ + +virtualbox.org + +CSS +body { + background-image: none !important; +} + +================================ + +virustotal.com + +CSS +:root { + --darkreader-bg--vt-grey-50: ${#eee} !important; + --darkreader-bg--vt-grey-700: ${#666} !important; + --vt-white: var(--darkreader-neutral-background) !important; +} +:host(.filled) .chip { + --vt-ui-chips-color: var(--darkreader-bg--vt-grey-200) !important; +} +.range-wrapper svg { + --vt-grey-200: var(--darkreader-bg--vt-grey-200) !important; +} +vt-ui-main-footer { + --vt-grey-25: var(--darkreader-bg--vt-grey-200) !important; + --darkreader-bg--vt-grey-700: ${#a0a6b4} !important; +} +.logo { + z-index: 1 !important; +} +:host > a:not(.item), +:host > span { + border: var(--vt-ui-button-border, 1px solid black) !important; + color: var(--vt-ui-button-color-text, var(--darkreader-text--vt-grey-800, #e8e6e3)) !important; +} +:host(vt-ui-text-input) { + border: var(--vt-ui-text-input-border, 1px solid var(--darkreader-border--vt-grey-200)) !important; +} +.detections[clean], +.detections[clean] svg { + fill: var(--vt-green-500) !important; + color: var(--vt-green-500) !important; +} +.detections { + color: var(--vt-red-500) !important; +} +#detections .detection, +#detections { + --darkreader-border--vt-grey-100: var(--darkreader-border--vt-grey-200) !important; +} +.avatar-section { + background: var(--darkreader-border--vt-grey-200) !important; +} + +IGNORE INLINE STYLE +.circle-progressbar circle + +================================ + +vitaexpress.ru + +INVERT +ymaps[class$="ground-pane"] +ymaps[class$="default-cluster"] > ymaps + +================================ + +vivaldi.com + +INVERT +.hero-cover +.hero-cover p + +================================ + +vjudge.net + +CSS +body { + background-image: none !important; +} +#contest-rank-table td.accepted { + background-color: ${#b8ffb8} !important; +} +#contest-rank-table td.prob.fb { + background-color: ${#c8ffc8} !important; +} + +================================ + +vk.com + +CSS +body[scheme="vkcom_dark"] ._im_dialog_unread_ct { + background: var(--counter_primary_background) !important; +} + +================================ + +vmware.com + +INVERT +h1.banner-title +div.banner + +================================ + +vod.tvp.pl + +INVERT +img[alt="serwisy tvp"] + +================================ + +votecompass.mzalendo.com + +INVERT +.content_wrapper_2 +.content_wrapper_2 > * + +================================ + +vox.com + +INVERT +.c-app-nav__logo +.c-footer__logo-link + +================================ + +vpn.getadblock.com + +CSS +body { + background-image: none !important; +} + +================================ + +vrt.be/vrtnws + +INVERT +.vrt-header__logo +.vrt-nav-toggle-btn + +================================ + +vshojo.com + +CSS +.elementor-section, +.elementor-heading-title { + background: var(--darkreader-neutral-background) !important; + color: var(--darkreader-neutral-text) !important; +} + +================================ + +vtimes.io + +INVERT +.site-header__logo +.sticky-nav__logo +.article__block__disclaimer__close::after +.article__block__disclaimer__close::before + +================================ + +vultr.com + +CSS +.svg-banner-shape { + fill: var(--darkreader-neutral-background) !important; +} + +IGNORE INLINE STYLE +.icon-ui * +.icon-user * +.icon-sm * +.svg-logo * +.svg-illustration * +.svg-product * +.svg-shape * + +================================ + +w.atwiki.jp + +CSS +.atwiki-contents-shadow, +.main_wrapper { + background-color: var(--darkreader-neutral-background) !important; +} +.atwiki-jp-bg2 { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +w3.org + +INVERT +img[alt*="equation" i] + +================================ + +wacom.com + +INVERT +img.full-size-logo +a.logo +div.minicart-wrapper +a.footer-brand + +CSS +img, div.bg-layer, div.flickity-viewport, canvas { + filter: brightness(50%) sepia(40%) !important; +} + +================================ + +wakamaifondue.com + +CSS +.upload-button > strong, .upload-button > span { + color: ${white} !important; +} + +================================ + +walbrzych24.com + +INVERT +a.social-icons__icon img +img.page-header__logo +img.page-footer__img + +================================ + +wallet.myalgo.com + +IGNORE INLINE STYLE +.export-qr-code > * + +================================ + +wanikani.com + +CSS +#question-type.meaning { + color: var(--darkreader-neutral-color) !important; + background-image: linear-gradient(rgb(98, 98, 98), rgb(41, 44, 46)) !important; +} + +================================ + +warframe.com + +CSS +.wrapper { + background-image: none !important; +} + +================================ + +washingtonpost.com + +INVERT +.hp-masthead +.switch +.switch::after + +CSS +.flex * { + border: none !important; +} + +IGNORE INLINE STYLE +.center > svg > path[fill="white"] + +================================ + +waze.com + +INVERT +.wm-map__leaflet +.leaflet-bottom +.leaflet-popup-content-wrapper + +================================ + +weather.com + +INVERT +div[class*="DynamicMap"] +svg[name="arrow-up"] +svg[name="arrow-down"] +text[class*="DonutChart"] + +IGNORE INLINE STYLE +[id^="svg-symbol"] * +svg[class*="alerts--"] * +#svg-symbol-sun + +================================ + +weather.com.cn + +INVERT +.w_logo +#hourHolder + +CSS +.lv1, +.lv2, +.weatherBg01, +.weatherBgAll, +.weatherBgAll01, +.weatherBgAll02, +.weatherBgAll03 { + background-image: none !important; +} + +================================ + +web.archive.org + +INVERT +.sparkline-canvas +.sparkline-mouse-highlight +.search-toolbar-logo +.ia-wordmark + +CSS +.measure { + z-index: 0 !important; +} + +IGNORE IMAGE ANALYSIS +.search-toolbar-logo + +================================ + +web.dev + +CSS +.w-aside--gotchas, +.w-aside--key-term { + color: #b98fff; +} +.w-aside--gotchas::after, +.w-aside--key-term::after { + background-color: #b98fff; +} + +================================ + +web.microsoftstream.com + +INVERT +.vjs-progress-holder +.vjs-volume-bar + +================================ + +web.telegram.org + +INVERT +.composer_emoji_tooltip_category +.nano-slider +.divider + +CSS +.progress-bar { + background-color: rgba(255,255,255,.9) !important; +} + +================================ + +webaim.org + +CSS +body { + background-image: none !important +} + +================================ + +webassign.net + +CSS +body { + color: var(--darkreader-neutral-text); +} +#webAssign { + background-color: var(--darkreader-neutral-background) !important; +} +#webAssignMain, +#webAssignContent { + background-color: var(--darkreader-neutral-background) !important; +} +img[alt~="key"] { + background-color: ${black} !important; +} + +================================ + +webbrowsertools.com + +CSS +.tile { + background-color: var(--darkreader-neutral-background); +} + +================================ + +webkitgtk.org + +CSS +#main_wrapper { + background-image: none !important; +} + +================================ + +weblate.org + +INVERT +h5.list-group-item-heading > svg +img[src="/static/state/lock.svg"] +img[src="/static/state/link.svg"] +img[src="/static/state/source.svg"] +img[src="/static/auth/password.svg"] +img[src="/static/auth/email.svg"] +img[src="/static/auth/github.svg"] +path[d^="M12,4V2A10,10"] +img[src="/static/state/link.svg"] + +================================ + +webmd.com + +INVERT +.global-nav-logo + +================================ + +webpagetest.org + +CSS +.scrollableTable table, +.results-filmstrip-container img, +div:not(.compare_contain_wrap) > div.waterfall-container img, +div.overflow-container > *, +.breakdownFrame_item > div > *, +.experiment_opportunities-resolved ol > *, +.experiments_details_desc > ul li { + mix-blend-mode: normal !important; +} + +================================ + +webroot.com + +INVERT +.logo + +================================ + +webtoons.com + +CSS +.info { + color: rgb(0,0,0) !important; +} + +================================ + +wego.here.com + +INVERT +#map +.route_card_left +.route_tooltip_icon +.btn_directions + +================================ + +weightwatchers.com + +INVERT +span[class*="NavigationSlice_logo"] + +================================ + +wenxuecity.com + +INVERT +.logo + +================================ + +wepe.com.cn + +INVERT +#u0_img + +================================ + +wesbos.com + +CSS +footer > div > div:not(.bottom) { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +westerndigital.com + +INVERT +#Header_Main_Logo + +================================ + +westlaw.com + +CSS +.co_hl.blue, +.highlightBox.blueBox { + background-color: ${lightblue} !important; +} +.co_hl.purple, +.highlightBox.purpleBox { + background-color: ${#bd73bd} !important; +} + +================================ + +what-if.xkcd.com + +INVERT +.illustration +.archive-image +.logo + +================================ + +whatsapp.com + +INVERT +span[data-icon="audio-download"] +.landing-main .invisible-space > span +div.landing-header > span > svg +#wafaq_search_input + +CSS +[data-asset-intro-image], [data-asset-intro-image-light] { + background-image: url(/img/intro-connection_c98cc75f2aa905314d74375a975d2cf2.jpg) !important; +} +html[dir] .landing-main > :first-child > :nth-child(2) > :first-child { + border: 16px solid white !important; +} +span[data-icon="tail-in"] { + color: rgb(30, 36, 39) !important; +} +span[data-icon="tail-out"] { + color: rgb(4, 57, 51) !important; +} +div#subheader { + background-image: url(https://static.whatsapp.net/rsrc.php/v1/yQ/r/dPFl9fRFF9u.jpg) !important; + background-size: 100% !important; +} + +IGNORE INLINE STYLE +path[fill="currentColor"] +.landing-main svg path + +================================ + +whitemad.pl + +INVERT +#logo +#cb-nav-logo + +================================ + +who.int + +INVERT +.background-url-holder > picture > img + +================================ + +whois.com + +INVERT +img[src^="logo.gif"] + +================================ + +wiadomoscihandlowe.pl + +INVERT +.dropdown-portal__link +.hamburger__button span +.search__icon + +================================ + +wielkopolskiebilety.pl + +INVERT +.KW__headerContainer +.logo +.map-container +img[src*="carriers/"] + +================================ + +wiemy.to + +INVERT +img.site-logo +.content-font__icon +.font-dropdown__item + +================================ + +wiesci24.pl + +INVERT +.tdb-logo-img + +================================ + +wiki.facepunch.com + +CSS +body { + background-color: transparent !important; +} +.content { + background-image: none !important; +} + +================================ + +wiki.mozilla.org + +CSS +body { + background-image: none !important; +} + +================================ + +wiki.teamfortress.com + +INVERT +.mw-wiki-logo + +CSS +body, +#mw-page-base, +#p-logo, +#content, +#footer { + background-image: none !important; +} +div.vectorTabs ul li.selected a, +#searchInput::placeholder { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +wiki.ubuntuusers.de + +CSS +table:not([class]), +table[class^="zebra"] { + background-image: none !important; +} + +================================ + +wiki.unity3d.com + +CSS +div#content, +#pt-login, +div.vectorTabs, +div.vectorTabs *, +.portal *, +div.vectorMenu, +div.vectorMenu h5 a, +div#footer, +div#footer * { + background-image: none !important; +} + +================================ + +wikibooks.org + +INVERT +.bookend +.mwe-math-fallback-image-inline +.mwe-math-fallback-image-display +img[alt="audio speaker icon"] + +IGNORE INLINE STYLE +.infobox td + +================================ + +wikidata.org + +INVERT +.wd-mp-headerimage +img[alt="audio speaker icon"] + +IGNORE IMAGE ANALYSIS +.mw-wiki-logo + +================================ + +wikimapia.org + +INVERT +#map + +================================ + +wikimedia.de + +INVERT +.logo + +================================ + +wikimedia.org + +INVERT +img.graphite-graph +img[src="images/black.png"] +img[alt="audio speaker icon"] + +CSS +div.mw-warning-with-logexcerpt, +div.mw-lag-warn-high, +div.mw-cascadeprotectedwarning, +div#mw-protect-cascadeon, +div.titleblacklist-warning, +div.locked-warning { + background-color: ${#ffa9a9} !important; + border-color: ${#ffa1a1} !important; +} + +================================ + +wikimediafoundation.org + +INVERT +.nav-logo + +================================ + +wikimediastatus.net + +INVERT +.logo-container + +================================ + +wikinews.org +wikiquote.org + +INVERT +.bookend +img[alt="audio speaker icon"] + +================================ + +wikipedia.org +wikiless.org + +INVERT +.mwe-math-fallback-image-inline +.mwe-math-fallback-image-display +.mw-ext-score +.mw-logo-wordmark +.mw-logo-tagline +.mw-wiki-logo +.central-textlogo__image +.svg-Wikimedia-logo_black +header .branding-box > a > span > img +.main-footer-menuToggle +div.post-content.footer-content > h2 > img +.mw-hiero-outer.mw-hiero-table +#p-logo-text +body > .oo-ui-windowManager .vega .marks +.minerva-footer-logo img +.music-symbol img +.tool.tool-button[src$="background-image:"] +.mw-kartographer-map +.mw-kartographer-mapDialog-map +img[alt="audio speaker icon"] + +CSS +.mwe-popups-discreet > svg, +div .thumbimage[src$=".png"], +div .thumbimage img[src$=".png"], +.image-carousel .image-loaded{ + background-color: white; +} +.mw-mmv-image .svg, +.fullImageLink [src*=".svg"], +a[href$=".svg"]:hover > img, +a[href*=".gif"]:hover > img { + background-color: rgba(255, 255, 255, 0.75) !important; + background-blend-mode: color; +} +.diff-addedline .diffchange { + background-color: ${lightblue} !important; +} +.diff-deletedline .diffchange { + background-color: ${#feeec8} !important; +} +@keyframes unseen-fadeout-to-unread { + from { + background-color: ${#dce8ff} !important; + } + to { + background-color: ${#ffffff} !important; + } +} +@keyframes unseen-fadeout-to-read { + from { + background-color: ${#dce8ff} !important; + } + to { + background-color: ${#eaecf0} !important; + } +} +.main-top { + background: none !important; +} +ol.references li:target, +sup.reference:target { + background-color: ${lightblue} !important; +} +.control-bar { + background-color: var(--darkreader-neutral-background) !important; + background-image: none !important; +} +.k-player, +body.mediawiki, +#dialogEngineContainer #dialogEngineDialog { + background-color: var(--darkreader-neutral-background) !important; +} +.template-facttext { + background-color: #eaecf0 !important; +} + +IGNORE INLINE STYLE +.legend-color:not(table.wikitable .legend-color) +#on_image_elements span + +IGNORE IMAGE ANALYSIS +.k-player .k-menu-bar li a + +================================ + +wikisource.org +wikiversity.org +wikivoyage.org + +INVERT +.mwe-math-fallback-image-inline +.mwe-math-fallback-image-display +img[alt="audio speaker icon"] + +================================ + +wikitech.wikimedia.org + +INVERT +img[alt="audio speaker icon"] + +IGNORE IMAGE ANALYSIS +.mw.wiki-logo + +================================ + +wikiwand.com + +INVERT +img.mwe-math-fallback-image-inline +img.mwe-math-fallback-image-display +img.immediate:not(.ntmb) +.title_icon +img.logo_img +td.icon +li.menu-tooltip:not(.lang_btn) +#main_menu > li:not(.lang_btn) > img.logo_img ~ i +.article_btn .drop_down li a > i +.feedback_btn .drop_down li a > i + +================================ + +wiktionary.org + +INVERT +.bookend +.central-featured-logo-text +.zh-glyph img +img[alt="audio speaker icon"] + +CSS +div.NavFrame div.NavHead { + background-image: none !important; +} + +================================ + +wildberries.ru + +INVERT +ymaps[class$="ground-pane"] +ymaps[class$="svg-icon-content"] > ymaps + +================================ + +willthompson.co.uk + +INVERT +body +body > * + +================================ + +windows.php.net + +CSS +#content-columns .block, +#page-area .content { + background-image: none !important; +} +#content-columns .block .corners-top, +#content-columns .block .corners-bottom, +#page-area .content .corners-top, +#page-area .content .corners-bottom { + filter: invert(91%) !important; +} + +IGNORE IMAGE ANALYSIS +#content-columns .block .corners-top +#content-columns .block .corners-bottom +#page-area .content .corners-top +#page-area .content .corners-bottom +#content-columns .block .corners-top span +#content-columns .block .corners-bottom span +#page-area .content .corners-top span +#page-area .content .corners-bottom span +#main-column .innerbox .corners-top +#main-column .innerbox .corners-bottom +#mid-column .innerbox .corners-top +#mid-column .innerbox .corners-bottom +#main-column .innerbox .corners-top span +#main-column .innerbox .corners-bottom span +#mid-column .innerbox .corners-top span +#mid-column .innerbox .corners-bottom span + +================================ + +windscribe.com + +CSS +#body_wrap > div.blue-bg.blue-top > div.twinkling-blue { + background-image: none; +} + +================================ + +winzip.com + +INVERT +.navbar-brand + +================================ + +wired.co.uk +wired.com + +INVERT +body a svg +a[data-testid="Logo"] +.c-nav__open-icon +.c-nav__close-icon +.standard-navigation__logo-image > img + +================================ + +wireshark.org + +INVERT +.navbar-brand + +================================ + +wirtualnemedia.pl + +INVERT +img[src$="logo-black.gif"] + +================================ + +wmar2news.com + +INVERT +.PageLogo-image +.wx-nav > img + +================================ + +word-view.officeapps.live.com + +INVERT +img.WACPageImg + +================================ + +wordnik.com + +INVERT +img[alt="wordnik logo"] +.footer-logo + +================================ + +wordpress.com + +INVERT +svg.masterbar__wpcom-wordmark +div.wp-login__footer.wp-login__footer--jetpack > img + +CSS +svg.social-icons.social-icons__apple.social-icons--enabled { + fill: white !important; +} +.p2020-sidebar { + background-image: none !important; + background: var(--darkreader-neutral-background); +} +.block-editor-rich-text__editable { + color: var(--darkreader-neutral-text); +} +.block-editor-block-list__layout .block-editor-block-list__block::after { + box-shadow: none !important; +} + +================================ + +worldcubeassociation.org + +CSS +.event-checkbox input[type="checkbox"] + i.cubing-icon, +.event-checkbox input[type="radio"] + i.cubing-icon, +.event-radio input[type="checkbox"] + i.cubing-icon, +.event-radio input[type="radio"] + i.cubing-icon { + color: rgba(0, 0, 0, 1) !important; +} + +IGNORE IMAGE ANALYSIS +.flag-icon-pl +.flag-icon-kr +.flag-icon-fi +.flag-icon-jp +.flag-icon-ru +.flag-icon-si +.flag-icon-co +.flag-icon-lt +.flag-icon-sk +.flag-icon-bg +.flag-icon-ve +.flag-icon-ge +.flag-icon-ec +.flag-icon-pk +.flag-icon-uy +.flag-icon-mg +.flag-icon-pa +.flag-icon-cy +.flag-icon-bh +.flag-icon-mt +.flag-icon-bt +.flag-icon-jm + +================================ + +worldometers.info + +INVERT +#coronavirus-cases-log.active .highcharts-background +#coronavirus-deaths-log.active .highcharts-background +#coronavirus-cases-linear.active .highcharts-background +#coronavirus-deaths-linear.active .highcharts-background + +================================ + +worldtimebuddy.com + +CSS +body, +.clientarea > :first-child { + background-image: none !important; +} + +================================ + +wowturkey.com + +CSS +body { + background: none !important; +} +.cevapButton { + background-image: none !important; +} +span.postdetails span.name a { + background: transparent !important; +} + +IGNORE INLINE STYLE +.cevapButton +span.name a + +================================ + +wpshout.com + +INVERT +a[rel="home"] > img + +CSS +.site-title { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +writefreely.org + +INVERT +img[src*="writefreely.svg"] +img[src*="icon.svg"] +img[src*="i.snap.as/"] +span + +================================ + +wszystkoconajwazniejsze.pl + +CSS +#papier img { + mix-blend-mode: normal !important; +} + +================================ + +wuffs.org + +CSS +.heavyShower { + background-color: ${#e4b849} !important; +} +.lightShower { + background-color: ${#ff9} !important; +} +.wday-0, .wday-6 { + background: ${#ccc} !important; +} +.wday-0 .mWeekday, +.wday-6 .mWeekday { + color: ${#000059} !important; +} +select:focus { + color: var(--darkreader-selection-text) !important; +} + +================================ + +wunderground.com + +CSS +.bar-on { + fill: rgba(0, 0, 0, 0.4) !important; +} + +================================ + +wvpublic.org + +INVERT +.Page-header-logo +.chevron + +================================ + +www.123cha.com + +INVERT +.logo + +================================ + +www.adjust.com + +INVERT +.homepage .a-section:first-child::before + +CSS +.a-section.bg-gradient { + --bg-gradient-end: ${white} !important; + --bg-gradient-start: var(--darkreader-neutral-background) !important; +} + +================================ + +www.androidauthority.com + +INVERT +header > a > svg +header > div > button > svg +footer > div > div > a > svg + +CSS +footer { + background-image: none !important; +} + +================================ + +www.baidu.com + +INVERT +#s_lg_img + +================================ + +www.bilibili.com + +INVERT +.bpx-player-sending-area +.bpx-player-video-info + +================================ + +www.bromite.org + +CSS +body, +#container { + background-image: none !important; +} + +================================ + +www.documentfoundation.org + +INVERT +a img[alt*="Logo"] + +================================ + +www.ebay.* +www.ebay.*.* + +CSS +html, +body { + background-image: none !important; +} + +================================ + +www.encyclopedia-titanica.org + +CSS +body { + background-color: var(--darkreader-neutral-background) !important; + background-image: none !important; +} + +================================ + +www.flickr.com + +IGNORE INLINE STYLE +#icon-flickr_logo_dots path + +================================ + +www.freepascal.org/docs-html + +INVERT +img + +================================ + +www.gamer.com.tw + +CSS +body { + background-image: none !important; +} + +================================ + +www.google.* +www.google.*.* + +INVERT +.gb_hc +.gb_ec +.gb_x.gb_Vb +.gb_x.gb_Ub +.gb_0b +#dictionary-modules img[src*="png"] +a.gb_b > div +a[href*="about/products"][title] +.JOmIqc +.hLcKi +#EcMbV +#wrap a[href="/mobile/"] +.vk-sf-b +.vk-t-btn +.ChZgtd div::before +.ChZgtd div::after +.yPHXsc div +.mn-dwn-arw +img.act-icon-dark-gray +.YsGUOb +img[src^="https://www.google.com/maps"] +[data-attrid="formula-image"] +[data-attrid^="variable"] img +[src^="/chrome/static/images/thank-you/"] +[src^="/chrome/static/images/reversible/"] +[src="/chrome/static/images/gpay/slate.png"] +[src^="/chrome/static/images/productivity/"] +[src^="/chrome/static/images/features/phone"] +[src^="/chrome/static/images/features/big_phone"] +[src^="/chrome/static/images/be-more-productive/"] +[src^="/chrome/static/images/search-bar/chrome-ui"] +[src="/chrome/static/images/go-mobile/qr-code.png"] +[src^="/chrome/static/images/download-browser/pixel"] +[src^="/chrome/static/images/browser-by-google/pixel"] +[src^="/chrome/static/images/sync-incognito/chrome-ui"] +[src^="/chrome/static/images/download-browser/big_pixel"] +[src="/chrome/static/images/homepage/homepage_tools.png"] +[src="/chrome/static/images/homepage/homepage_privacy.png"] +[src="/chrome/static/images/google-translate/screen-english.png"] + +CSS +.RNNXgb, +.aajZCb { + box-shadow: 0 0 2px 0 ${rgba(0,0,0,0.16)}, 0 0 0 1px ${rgba(0,0,0,0.08)} !important; +} +.Gor6zc { + background-color: white !important; +} +img[id^="platop"] { + background-color: white !important; +} +.chr-full-bleed-hero { + background-image: none !important; +} +html, +body, +img, [role="img"], video, iframe, +#gb, +a[href^="https://shopping.google.com"][href*="/lists"] > span { + filter: none !important; +} + +IGNORE INLINE STYLE +.kdPwrb +.rnt3Ze +.NYcQFd + +================================ + +www.hapo.org + +INVERT +.section__overlap[style*="/new-site/background-swoosh.png"] + +================================ + +www.jetbrains.com + +IGNORE INLINE STYLE +linearGradient[id*="svg"] > stop +radialGradient[id*="svg"] > stop +svg[class*="logo"] +#__SVG_SPRITE_NODE__ > symbol > path +#__SVG_SPRITE_NODE__ > symbol > g + +================================ + +www.jiqizhixin.com + +INVERT +.header__logo + +================================ + +www.khirevich.com + +INVERT +.fig > img + +================================ + +www.mayoclinic.org + +INVERT +.mc-logo +.logo > a > img[alt="Mayo Clinic"] +img[src="/-/media/images/mayologo.png"] +img[src="/styles/img/gbs/logo-mayoclinic-mobile.png"] + +CSS +ul#nav.nav > li.no-image > a, +ul#nav.nav > li.current > a { + background-image: url("/UniversalNav/Styles/img/sprite-globalnavarrows.png") !important; +} + +================================ + +www.menti.com + +INVERT +div#__next svg[role="img"] > title ~ g +img[src^="https://images.mentimeter.com/themes/832111/tyett7pf-brand-light.svg"] + +================================ + +www.minecraft.net + +INVERT +.feature-details img +.ms-accordion .shade +.ms-accordion td.platform-data +.nav-links__tab-icon + +CSS +.ms-accordion td.platform-data { + background-color: white !important; +} +div[style*="background-image: url("][style*="/background-images/bg-wool-white.png"], +.promo-area .bg-wool-light { + background-image: none !important; +} + +IGNORE IMAGE ANALYSIS +.promo-area .trans-top-dark + +================================ + +www.mozilla.org + +INVERT +img.sidebar-icon +h1.c-logo + +CSS +div.mzp-c-navigation-logo { + background: ${black} !important; +} + +IGNORE IMAGE ANALYSIS +.c-logo.t-browser-word-hor-white-xs +.c-logo.t-browser-word-hor-xs +.noodle-browser + +================================ + +www.msn.cn + +CSS +.heading span, +msft-attribution span { + color: var(--darkreader-neutral-background) !important; +} +.heading + .abstract { + color: ${rgb(247, 244, 241)} !important; +} + +IGNORE INLINE STYLE +.article +msft-ad-label + +================================ + +www.oschina.net + +INVERT +.logo > svg > g > path + +================================ + +www.physics.utoronto.ca/~aephraim/aephraim.html + +CSS +body { + --darkreader-inline-bgcolor: var(--darkreader-neutral-background) !important; +} + +================================ + +www.pixivision.net + +INVERT +.hdc__logo +.ghdsp__logo +.sidebar-visible-button +._search-field-visible-button + +================================ + +www.qt.io + +CSS +.b-background__wrapper .b-background__asset[style^="background-image"] { + filter: brightness(50%) sepia(40%) !important; +} +div[class*="frontpage"] .scheme--default p { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +www.realtek.com + +CSS +#t3-header, +body > div.t3-wrapper > div > div.section-wrap.bg-wrap1 > div > div > div.custom > div > a { + background: var(--darkreader-neutral-background) !important; +} +#t3-header > div > div.col-xs-3.visible-xs-block > button.search-toggle, +#t3-header > div > div.col-xs-3.visible-xs-block > button.globe-toggle { + background-color: inherit !important; +} + +================================ + +www.scien.cx + +CSS +body.custom-background { + background-image: none !important; +} + +================================ + +www.searchenginejournal.com + +INVERT +.sej-footer-logo +.sej-mobile-logo +.whitelogo + +================================ + +www.soepub.com/discuzx34 + +CSS +.c_l, +.c_r, +.c_yb, +.c_yc, +.c_ycr, +.c_yt { + background-image: none !important; +} + +================================ + +www.songsterr.com + +INVERT +use[href^="#rest"] +use[href^="#dot"] + +CSS +#tablature svg text { + fill: var(--darkreader-neutral-text) !important; +} +#tablature svg path { + stroke: var(--darkreader-neutral-text) !important; +} +section[role="main"] div[style^="transform"] { + mix-blend-mode: normal !important; +} + +================================ + +www.sport5.co.il + +INVERT +.news-room-placeholder .container-message-in .newsroom-row .newsroom-spitz + +================================ + +www.statshunters.com + +INVERT +.logo + +CSS +.highcharts-background { + fill: none !important; +} +.highcharts-text-outline { + stroke: none !important; +} + +================================ + +www.stern.de + +CSS +.page { + --page-background: var(--darkreader-neutral-background) !important; +} +.slide-navigation { + background: var(--darkreader-neutral-background) !important; +} + +================================ + +www.storm.mg + +INVERT +.footer_logo_img +#logo_img + +================================ + +www.tandfonline.com + +INVERT +img.no-mml-formula + +================================ + +www.thisoldhouse.com + +INVERT +.c-masthead__main[style^="background-image"] + +IGNORE INLINE STYLE +.c-footer__logo-link * + +================================ + +www.thivien.net + +CSS +body { + background-image: none !important; +} + +================================ + +www.tiktok.com + +INVERT +.like-container .icon +.logo-link +div[class*="DivSeekBarContainer"] +div[class*="DivVolumeControlContainer"] +.video-control-container-browser +.volume-control-container-browser +.seek-bar-container +.volume-control-container +svg[class*="StyledLinkLogo"] +svg[class*="SvgPlayIcon"] +#svg-music-note > path + +CSS +[data-e2e="like-icon"] svg, +[data-e2e="comment-icon"] svg, +[data-e2e="share-icon"] svg { + fill: var(--darkreader-neutral-text) !important; +} + +================================ + +www.tinkoff.ru + +INVERT +a[title="Tinkoff"] + +================================ + +www.tumblr.com + +INVERT +.QnWzN > div +div[role="progressbar"] + +CSS +a[data-testid="google-login-button"], +a[data-testid="apple-login-button"] { + background-color: var(--darkreader-neutral-background) !important; +} +footer[role="contentinfo"] > ul > li > a { + filter: invert(0%) hue-rotate(180deg) contrast(200%) !important; +} +:root { + --darkreader-bg--white: 23, 23, 23 !important; + --darkreader-text--black: 228, 224, 218 !important; + --darkreader-bg--secondary-accent: 31, 32, 34 !important; +} + +================================ + +www.w3schools.com + +IGNORE INLINE STYLE +.colorbox .innerbox + +================================ + +www.wikihow.com + +INVERT +.qa_obscured_answer_overlay :last-child:not(strong *) + +================================ + +www.windy.com + +INVERT +.data-table > .forecast-table.progress-bar > canvas + +================================ + +wx.qq.com +wx2.qq.com + +CSS +body { + background-image: none !important; +} + +================================ + +wxwidgets.org + +INVERT +img[src$="header-logo.png"] + +================================ + +wyborcza.pl +wyborcza.biz + +INVERT +#wH_username_wrap img +.account-cap--logo +.cap-navigation--back +.cap-vignette--logo-image +.header-cap-holder a img +.nmk_avatar-icon +.partners-list-item +.partners-list-item-text +.podcast-player-control ::after +.podcast-player-time-progress +.return-back img +.wyborcza-logo +a[title="Aplikacja wyborcza.pl"] +img.logo +.button svg +.btn.pull-right.dismiss + +================================ + +wysokieobcasy.pl + +INVERT +.vin-img-link-pic.vin-local-img-link-pic + +================================ + +x-kom.pl + +INVERT +a[href="/"] img +a[href="https://x-kom.pl"] img +a[href="https://www.x-kom.pl"] img +div[title*="panel"] svg +img[alt="Menu"] +img[alt*="Logo"] +img[src*="Logo_strefy_marek"] +img[src*="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iM"] +img[src*="data:image/svg+xml;base64,PHN2ZyB4bWxucz0ia"] +.geex a img +a[href="https://geex.x-kom.pl/"] img +img[alt="Geex logotyp"] + +CSS +.ePVVIv { + filter: brightness(0.8); +} + +================================ + +xcite.com + +INVERT +li.xc-product-slider-item__actions-bar__express.xcf.xcf--Rocket3-012222 +li.xc-product-slider-item__actions-bar__express.xcf.xcf--express-delivery +li.xc-product-slider-item__actions-bar__pickup.xcf.xcf--bag +li.xc-product-slider-item__actions-bar__secret-deal.xcf.xcf--secret-deal +div > a.xc-product-slider-item__name +div.titleFyler > span.weeklyTitle + +CSS +div.algolia-instant-results-wrapper { + background-color: var(--darkreader-neutral-background); +} + +================================ + +xda-developers.com + +INVERT +.hb-trigger + +CSS +body.tag { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +xfree86.org + +INVERT +img[src*=".png"] + +================================ + +y.qq.com + +INVERT +.popup_guide__logo +.qqmusic_logo + +================================ + +yadi.sk + +INVERT +span.logo.burger-sidebar__logo +span.logo.burger-sidebar__sidebar-logo + +================================ + +yamicsoft.com + +CSS +.slider-wrapper .slide-secound-detail, +.slider-wrapper .slide-secound-title { + color: var(--darkreader-neutral-background) !important; +} + +================================ + +yandex.*/internet + +INVERT +a[href="/internet"] + +================================ + +yandex.*/maps +yandex.*/web-maps + +INVERT +.content-panel-header__logo path[d^="M39.64 22.32"] +.whats-here-preview__control-search-icon +.close-button._color_black._circle +.business-social-links-view__icon +.social-share-view_discovery-small +.social-share-view_discovery-large +.orgpage-social-links-view__icon +.promo-button__promo-image-container +.orgpage-photos-view__empty +.map-container > ymaps > ymaps > canvas + +CSS +span[class$="business-reactions-view__icon"], +div[class$="business-reactions-view__counter"], +span[class$="business-reactions-view__icon _dislike"] { + color: ${#aba8a8} !important; +} + +================================ + +yandex.*/pogoda + +INVERT +.maps-widget-nowcast__map-link +.weather-maps__map > ymaps > ymaps > ymaps > ymaps +.color-scale__line +.weather-table__wind-direction > .icon_wind +.icon_color_black + +================================ + +yandex.*/support + +INVERT +.header2__logo + +================================ + +yandex.ru/blog/narod-karta + +INVERT +.y-header_club__logo +.y-header_club__service + +================================ + +yandex.ru/q + +INVERT +header a[href="/q/"] svg + +================================ + +yelp.com + +INVERT +#logo:not(.homepage-hero_logo) +img[src$="40x40_food_v2.svg"] +.gm-style img[role="presentation"]:not([src*="v="]) + +================================ + +yeniakit.com.tr + +CSS +.photo-news-detail-cover .article-header > .image { + z-index: 0 !important; +} +.photo-news-detail-cover .article-header > .black-shadow { + z-index: 1 !important; +} +.photo-news-detail-cover .article-header > .social-box, +.photo-news-detail-cover .article-header > .category { + z-index: 2 !important; +} + +================================ + +yettel.rs + +INVERT +.header-container + +================================ + +yle.fi + +INVERT +[class*="AreenaHeader"] +[class*="TheEndIsDelight__Svg"] + +IGNORE IMAGE ANALYSIS +.yle-header figure.yle-header-logo + +================================ + +yougetsignal.com + +INVERT +img[src^="img/"] + +================================ + +youla.ru + +INVERT +section[data-test-component="HeaderActionMenu"] a > svg > path:nth-child(2n+2) +#map-1 canvas + +================================ + +youmath.it +*.youmath.it + +INVERT +.ltximg + +================================ + +youtube.com + +INVERT +#tube-mount .b img +#ytd-player + .efyt-control-bar > button + +CSS +::-webkit-scrollbar { + background-color: var(--darkreader-bg--yt-spec-general-background-a); +} +html[hide-scrollbar] ::-webkit-scrollbar { + display: none !important; +} +#search-icon-legacy.ytd-searchbox { + border: 1px solid var(--ytd-searchbox-legacy-border-color) !important; +} +html:not(.style-scope) { + --primary-text-color: ${#212121} !important; + --primary-background-color: ${#ffffff} !important; + --disabled-text-color: ${#9b9b9b} !important; + --divider-color: ${#dbdbdb} !important; + --error-color: ${#dd2c00} !important; + --primary-color: ${#3f51b5} !important; + --accent-color: ${#ff4081} !important; + --yt-live-chat-action-panel-background-color: ${hsla(0, 0%, 93.3%, .4)} !important; + --yt-live-chat-action-panel-background-color-transparent: ${hsla(0, 0%, 97%, .8)} !important; + --yt-live-chat-background-color: ${hsl(0, 0%, 100%)} !important; + --yt-live-chat-primary-text-color: ${hsl(0, 0%, 6.7%)} !important; + --yt-live-chat-secondary-background-color: ${hsl(0, 0%, 93.3%)} !important; + --yt-live-chat-secondary-text-color: ${hsla(0, 0%, 6.7%, .6)} !important; + --yt-live-chat-tertiary-text-color: ${hsla(0, 0%, 6.7%, .4)} !important; + --yt-live-chat-disabled-icon-button-color: ${hsla(0, 0%, 6.7%, .2)} !important; + --yt-live-chat-picker-button-color: ${hsla(0, 0%, 6.7%, .4)} !important; + --yt-live-chat-text-input-field-suggestion-background-color: ${hsl(0, 0%, 100%)} !important; + --yt-live-chat-text-input-field-suggestion-background-color-hover: ${#eee} !important; + --yt-live-chat-text-input-field-suggestion-text-color: ${#666} !important; + --yt-live-chat-text-input-field-suggestion-text-color-hover: ${#333} !important; + --yt-live-chat-vem-background-color: ${hsl(0, 0, 93.3%)} !important; + --yt-emoji-picker-search-background-color: ${hsla(0, 0%, 100%, .6)} !important; + --yt-emoji-picker-search-color: ${hsla(0, 0%, 6.7%, .8)} !important; + --yt-emoji-picker-search-placeholder-color: ${hsla(0, 0%, 6.7%, .6)} !important; + --ytd-searchbox-border-color: ${hsla(0, 0%, 53.3%, .2)} !important; + --ytd-searchbox-legacy-border-color: ${#ccc} !important; + --ytd-searchbox-legacy-border-shadow-color: ${#eee} !important; + --ytd-searchbox-legacy-button-color: ${#f8f8f8} !important; + --ytd-searchbox-legacy-button-border-color: ${#d3d3d3} !important; + --ytd-searchbox-legacy-button-focus-color: ${#e9e9e9} !important; + --ytd-searchbox-legacy-button-hover-color: ${#f0f0f0} !important; + --ytd-searchbox-legacy-button-hover-border-color: ${#c6c6c6} !important; + --ytd-searchbox-legacy-button-icon-color: ${#333} !important; + --ytd-moderation-panel-background: ${hsla(0, 0%, 93.3%, .6)} !important; + --ytd-moderation-panel-hover: ${hsla(0, 0%, 93.3%, .8)} !important; + --ytd-moderation-panel-comment-text: ${hsl(0, 0%, 6.7%)} !important; + --ytd-moderation-panel-comment-metadata-text: ${hsla(0, 0%, 6.7%, .6)} !important; + --ytd-moderation-icon-color: ${hsla(0, 0%, 6.7%, .6)} !important; + --ytd-moderation-icon-hover-color: ${hsl(0, 0%, 6.7%)} !important; + --ytd-comment-text-color: ${hsl(0, 0%, 6.7%)} !important; + --ytd-watch-card-secondary-text-color: ${hsl(0, 0%, 53.3%)} !important; + --ytd-watch-card-album-header-background: ${hsl(0, 0%, 100%)} !important; + --ytd-backstage-metadata-text-color: ${hsl(0, 0%, 53.3%)} !important; + --ytd-backstage-video-link-background-color: ${hsla(0, 0%, 93.3%, .4)} !important; + --ytd-backstage-image-alert-color: ${hsla(0, 0%, 6.7%, .6)} !important; + --ytd-backstage-cancel-background-color: ${hsl(0, 0%, 100%)} !important; + --ytd-backstage-cancel-color: ${hsla(0, 0%, 6.7%, .4)} !important; + --ytd-backstage-attachment-background-color: ${hsl(0, 0%, 100%)} !important; + --ytd-backstage-creationbox-background-color: ${hsl(0, 0%, 98%)} !important; + --ytd-backstage-creationbox-background-color-focus: ${hsl(0, 0%, 96%)} !important; + --ytd-backstage-creationbox-inactive-color: ${hsla(0, 0%, 0%, .26)} !important; + --ytd-backstage-creationbox-text-color: ${hsla(0, 0%, 0%, .54)} !important; + --ytd-backstage-creationbox-input-text-color: ${hsla(0, 0%, 0%, .87)} !important; + --ytd-backstage-creationbox-disabled-button-color: ${hsla(0, 0%, 0%, .04)} !important; + --ytd-backstage-creationbox-disabled-button-text-color: ${hsl(0, 0%, 100%)} !important; + --ytd-backstage-attachment-icon-hover-color: ${hsla(0, 0%, 0%, .74)} !important; + --ytd-sponsorships-background-color-focus: ${hsla(0, 0%, 93.3%, .4)} !important; + --ytd-badge-disabled-color: ${hsla(0, 0%, 53.3%, .4)} !important; + --ytd-collection-badge-color: ${hsla(0, 0%, 6.7%, .8)} !important; + --ytd-owner-badge-color: ${hsla(0, 0%, 6.7%, .4)} !important; + --ytd-simple-badge-color: ${hsla(0, 0%, 6.7%, .6)} !important; + --ytd-shopping-product-info: ${hsla(0, 0%, 6.7%, .8)} !important; + --ytd-transcript-cue-hover-background-color: ${hsl(0, 0%, 93.3%)} !important; + --ytd-transcript-toolbar-background-color: ${hsl(0, 0%, 93.3%)} !important; + --ytd-transcript-toolbar-text: ${hsl(0, 0%, 6.7%)} !important; + --ytd-video-publish-date-color: ${hsla(0, 0%, 6.7%, .6)} !important; + --ytd-vat-notice-text: ${hsla(0, 0%, 6.7%, .6)} !important; + --ytd-offer-background-color: ${hsla(0, 0%, 93.3%, .4)} !important; + --ytd-video-game-watch-card-logo-color: ${hsl(0, 0%, 6.7%)} !important; + --ytd-watch-split-pane-sidebar-background-color: ${hsl(0, 0%, 98%)} !important; + --yt-swatch-icon-color: ${hsla(0, 0%, 6.7%, .4)} !important; + --yt-swatch-primary: ${hsl(0, 0%, 100%)} !important; + --yt-swatch-primary-darker: ${rgb(230, 230, 230)} !important; + --yt-swatch-text: ${hsla(0, 0%, 6.7%, .4)} !important; + --yt-swatch-input-text: ${hsl(0, 0%, 6.7%)} !important; + --yt-swatch-textbox-bg: ${rgb(255, 255, 255)} !important; + --yt-spec-brand-background-solid: ${#FFFFFF} !important; + --yt-spec-brand-background-primary: ${rgba(255, 255, 255, 0.98)} !important; + --yt-spec-brand-background-secondary: ${rgba(255, 255, 255, 0.95)} !important; + --yt-spec-feed-background-a: ${#F9F9F9} !important; + --yt-spec-feed-background-b: ${#F3F3F3} !important; + --yt-spec-feed-background-c: ${#EDEDED} !important; + --yt-spec-error-background: ${#1F1F1F} !important; + --yt-spec-text-primary: ${#0A0A0A} !important; + --yt-spec-text-primary-inverse: ${#FFFFFF} !important; + --yt-spec-text-secondary: ${#606060} !important; + --yt-spec-text-disabled: ${#909090} !important; + --yt-spec-call-to-action: ${#065FD4} !important; + --yt-spec-icon-active-other: ${#606060} !important; + --yt-spec-icon-inactive: ${#909090} !important; + --yt-spec-icon-disabled: ${#CCCCCC} !important; + --yt-spec-badge-chip-background: ${rgba(0, 0, 0, 0.05)} !important; + --yt-spec-suggested-action: ${#F2F8FF} !important; + --yt-spec-button-chip-background-hover: ${rgba(0, 0, 0, 0.10)} !important; + --yt-spec-touch-response: ${#000000} !important; + --yt-spec-filled-button-text: ${#FFFFFF} !important; + --yt-spec-call-to-action-inverse: ${#3EA6FF} !important; + --yt-spec-brand-icon-inactive: ${#606060} !important; + --yt-spec-filled-button-focus-outline: ${rgba(0, 0, 0, 0.60)} !important; + --yt-spec-call-to-action-button-focus-outline: ${rgba(6, 95, 212, 0.30)} !important; + --yt-spec-brand-text-button-focus-outline: ${rgba(204, 0, 0, 0.30)} !important; + --yt-spec-inactive-text-button-focus-outline: ${#CCCCCC} !important; + --yt-spec-brand-subscribe-button-background: ${#FF0000} !important; + --yt-spec-wordmark-text: ${#282828} !important; + --yt-spec-10-percent-layer: ${rgba(0, 0, 0, 0.10)} !important; + --yt-spec-selected-nav-text: ${#CC0000} !important; + --yt-spec-themed-blue: ${#065FD4} !important; + --yt-spec-themed-green: ${#107516} !important; + --yt-std-body-300: ${hsla(0, 0%, 0%, .54)} !important; + --yt-std-surface-200: ${hsl(0, 0%, 98%)} !important; + --yt-std-surface-300: ${hsl(0, 0%, 96%)} !important; + --yt-std-surface-400: ${hsl(0, 0%, 93%)} !important; + --yt-primary-color: ${hsl(0, 0%, 6.7%)} !important; + --yt-primary-text-color: ${hsl(0, 0%, 6.7%)} !important; + --yt-hovered-text-color: ${hsla(0, 0%, 6.7%, .8)} !important; + --yt-secondary-text-color: ${hsla(0, 0%, 6.7%, .8)} !important; + --yt-tertiary-text-color: ${hsla(0, 0%, 6.7%, .6)} !important; + --yt-placeholder-text-color: ${hsla(0, 0%, 6.7%, .6)} !important; + --yt-border-color: ${hsl(0, 0%, 93.3%)} !important; + --yt-commentbox-border-inactive: ${hsl(0, 0%, 93.3%)} !important; + --yt-commentbox-border-active: ${hsla(0, 0%, 6.7%, .6)} !important; + --yt-primary-disabled-button-text-color: ${hsl(0, 0%, 100%)} !important; + --yt-paper-button-ink-color: ${hsl(0, 0%, 53.3%)} !important; + --yt-icon-color: ${hsla(0, 0%, 6.7%, .4)} !important; + --yt-icon-hover-color: ${hsla(0, 0%, 6.7%, .8)} !important; + --yt-icon-disabled-color: ${hsla(0, 0%, 6.7%, .6)} !important; + --yt-icon-active-color: ${hsl(0, 0%, 6.7%)} !important; + --yt-expand-color: ${hsla(0, 0%, 6.7%, .6)} !important; + --yt-placeholder-text: ${hsla(0, 0%, 6.7%, .6)} !important; + --yt-playlist-background-header: ${hsl(0, 0%, 93.3%)} !important; + --yt-playlist-background-item: ${hsla(0, 0%, 93.3%, .6)} !important; + --yt-playlist-title-text: ${hsl(0, 0%, 6.7%)} !important; + --yt-playlist-message-text: ${hsla(0, 0%, 6.7%, .6)} !important; + --yt-playlist-message-text-hover: ${hsl(0, 0%, 6.7%)} !important; + --yt-button-active-color: ${hsl(0, 0%, 6.7%)} !important; + --yt-copyright-text: ${hsla(0, 0%, 6.7%, .6)} !important; + --yt-guide-entry-text-color: ${hsla(0, 0%, 6.7%, .8)} !important; + --yt-thumbnail-placeholder-color: ${hsl(0, 0%, 89%)} !important; + --yt-featured-channel-title-text-color: ${hsla(0, 0%, 0%, .54)} !important; + --yt-formatted-string-deemphasize-color: ${hsl(0, 0%, 53.3%)} !important; + --yt-alert-background: ${hsla(0, 0%, 93.3%, .4)} !important; + --yt-video-secondary-info-description-background: ${hsla(0, 0%, 93.3%, .6)} !important; + --yt-material-searchbox-inactive: ${hsla(0, 0%, 93.3%, .6)} !important; + --yt-material-searchbox-active: ${hsl(0, 0%, 100%)} !important; + --yt-material-searchbox-inactive-shadow: ${hsla(0, 0%, 53.3%, .2)} !important; + --yt-material-searchbox-active-shadow: ${hsla(0, 0%, 0%, .26)} !important; + --yt-material-searchbox-inset: ${hsla(0, 0%, 0%, .04)} !important; + --yt-simple-menu-header-background: ${hsl(0, 0%, 93.3%)} !important; + --yt-item-section-header-color: ${hsla(0, 0%, 6.7%, .6)} !important; + --yt-menu-hover-backgound-color: ${hsl(0, 0%, 93.3%)} !important; + --yt-menu-focus-background-color: ${hsla(0, 0%, 6.7%, .2)} !important; + --yt-chat-bubble-other-border-color: ${#CCCCCC} !important; + --yt-chat-bubble-other-background-color: ${#F9F9F9} !important; + --yt-chat-bubble-self-border-color: ${#CCCCCC} !important; + --yt-chat-bubble-self-background-color: ${#EDEDED} !important; + --yt-app-background: ${hsl(0, 0%, 100%)} !important; + --yt-main-app-background: ${hsl(0, 0%, 98%)} !important; + --yt-main-app-background-tmp: ${hsl(0, 0%, 100%)} !important; + --yt-guide-background: ${hsl(0, 0%, 96%)} !important; + --yt-dialog-background: ${hsl(0, 0%, 100%)} !important; + --yt-searchbox-background: ${hsl(0, 0%, 100%)} !important; + --yt-channel-header-background: ${hsl(0, 0%, 98%)} !important; + --yt-sidebar-background: ${hsl(0, 0%, 98%)} !important; + --yt-transcript-background: ${hsl(0, 0%, 100%)} !important; + --yt-spec-general-background-a: ${white} !important; + --yt-spec-general-background-b: ${#f1f1f1} !important; + --yt-spec-general-background-c: ${#e9e9e9} !important; + --yt-spec-brand-icon-active: #{rgb(255, 0, 0)} !important; +} +.ytp-hover-progress-light { + background-color: rgba(255,255,255,.5) !important; +} +.ytp-progress-list { + background-color: rgba(255,255,255,.2) !important; +} +.ytp-volume-slider-handle { + background-color: white !important; +} +.ytp-volume-slider-handle::before { + background-color: white !important; +} +.ytp-volume-slider-handle::after { + background-color: rgba(255,255,255,.2) !important; +} +button[aria-pressed="true"] > yt-icon:not(#guide-icon.ytd-app):not(#guide-icon.ytd-masthead), +[id$="-replies"].ytd-comment-replies-renderer > .ytd-button-renderer > paper-button, +[id$="-replies"].ytd-comment-replies-renderer > .ytd-button-renderer > paper-button > yt-icon { + fill: var(--yt-spec-call-to-action) !important; + color: var(--yt-spec-call-to-action) !important; +} +.ytp-menuitem-toggle-checkbox { + background: rgba(255, 255, 255, 0.3) !important; +} +.ytp-menuitem[aria-checked="true"] .ytp-menuitem-toggle-checkbox { + background: #f00 !important; +} +.ytp-menuitem-toggle-checkbox::after { + background-color: #bdbdbd !important; +} +.ytp-menuitem[aria-checked="true"] .ytp-menuitem-toggle-checkbox::after { + background-color: white !important; +} +#date yt-formatted-string.ytd-video-primary-info-renderer, .yt-view-count-renderer { + color: var(--yt-spec-text-secondary) !important; +} +.ytp-contextmenu .ytp-menuitem .ytp-menuitem-toggle-checkbox { + background: none !important; +} +.ytp-contextmenu .ytp-menuitem[aria-checked="true"] .ytp-menuitem-toggle-checkbox { + background: url('data:image/svg+xml;utf8,') !important; +} +#metadata-line.ytd-video-meta-block span.ytd-video-meta-block { + color: var(--ytd-metadata-line-color, var(--yt-spec-text-secondary)) !important; +} +yt-formatted-string[has-link-only_]:not([force-default-style]) a.yt-simple-endpoint.yt-formatted-string { + color: var(--yt-endpoint-color, var(--yt-spec-text-primary)) !important; +} +paper-button.ytd-subscribe-button-renderer[subscribed] { + background-color: var(--yt-spec-10-percent-layer) !important +} +.badge-style-type-live-now.ytd-badge-supported-renderer { + border: 1px solid rgb(255, 78, 69) !important; +} +.ytp-load-progress { + background: rgba(255,255,255,0.3) !important; +} +yt-chip-cloud-chip-renderer[chip-style="STYLE_DEFAULT"] { + background-color: rgba(255,255,255,0.05); +} +yt-chip-cloud-chip-renderer[chip-style="STYLE_DEFAULT"].iron-selected { + background-color: rgba(255,255,255,0.2); +} +paper-item[aria-selected="true"] { + background-color: rgba(255,255,255,0.2) !important; +} +iron-input.paper-input > input.paper-input, +.input-content.paper-input-container > label, +.input-content.paper-input-container > .paper-input-label { + color: var(--paper-input-container-shared-input-style_-_color) !important; +} +ytd-compact-autoplay-renderer, +ytd-video-primary-info-renderer, +#sections.ytd-guide-renderer > .ytd-guide-renderer:not(first-child), +ytd-video-secondary-info-renderer, +#placeholder-area.ytd-comment-simplebox-renderer { + border-bottom-color: var(--yt-spec-10-percent-layer) !important; +} +ytd-guide-collapsible-section-entry-renderer.ytd-guide-section-renderer:not(:first-child), +ytd-metadata-row-header-renderer[has-divider-line] { + border-top-color: var(--yt-spec-10-percent-layer) !important; +} +ytd-guide-entry-renderer[active] .guide-icon.ytd-guide-entry-renderer { + fill: ${black} !important; +} +#hearted.ytd-creator-heart-renderer { + fill: var(--yt-spec-static-brand-red) !important; +} +#hearted-border.ytd-creator-heart-renderer { + fill: ${white} !important; +} +.guide-entry-badge.ytd-guide-entry-renderer { + fill: var(--yt-spec-static-brand-red) !important; +} +#endpoint.yt-simple-endpoint.ytd-guide-entry-renderer:hover, +#endpoint.yt-simple-endpoint.ytd-guide-entry-renderer:focus { + background-color: var(--yt-spec-badge-chip-background) !important; +} +a.yt-simple-endpoint.yt-formatted-string { + color: var(--yt-endpoint-color, var(--yt-spec-call-to-action)) !important; +} +a.yt-simple-endpoint.yt-formatted-string:hover { + color: var(--yt-endpoint-hover-color, var(--yt-spec-call-to-action)) !important; +} +.ytp-cards-button-icon .ytp-svg-shadow { + fill: var(--darkreader-neutral-background) !important; +} +.ytp-doubletap-ui-legacy[data-side="back"] .ytp-doubletap-base-arrow { + border-right-color: var(--darkreader-neutral-color) !important; +} +.ytp-doubletap-ui-legacy[data-side="forward"] .ytp-doubletap-base-arrow { + border-left-color: var(--darkreader-neutral-color) !important; +} + +IGNORE INLINE STYLE +yt-live-chat-ticker-paid-message-item-renderer * +#ytd-player + .efyt-control-bar > button path + +================================ + +yscec.yonsei.ac.kr + +INVERT +iframe +#page-sidebar + +================================ + +yuque.com + +INVERT +.lake-math-content-preview-img > img +.lake-math-container > img +div[data-lake-card="mindmap"] > div > div > div + +================================ + +zacznijzyc.net + +INVERT +.logo_container + +================================ + +zadania.info + +INVERT +img.math +img.math-display + +================================ + +zaid-ajaj.github.io + +CSS +:root { + --main-background: var(--darkreader-neutral-background) !important; + --sidebar-background: var(--darkreader-neutral-background) !important; +} + +================================ + +zdic.net + +INVERT +li a img +.kxtimg +.zipic img +.zx img + +CSS +.nr-box-header { + background-image: none !important; +} + +================================ + +zdw.krakow.pl + +CSS +#kw-alert p, +#kw-alert a { + color: initial !important; +} + +================================ + +zendesk.com + +CSS +.zendesk-editor--rich-text-container { + background-image: none !important; +} + +================================ + +zenn.dev + +INVERT +a[class^="AppHeader_homeLink"] + +================================ + +zeptovm.com + +INVERT +.logo + +================================ + +zerossl.com + +INVERT +.logo + +================================ + +zfsbootmenu.org + +CSS +body { + background-image: none !important; +} + +================================ + +zhihu.com + +INVERT +img[eeimg="1"] + +CSS +div.css-vurnku > div > div.css-1bi2006 { + background-color: ${darkgray} !important; +} +div.css-vurnku button { + color: ${darkblue} !important; +} +div.css-vurnku button svg { + fill: ${darkblue} !important; +} + +================================ + +zippyshare.com + +INVERT +img#browse + +CSS +.inner_main > table { + background-image: none !important; +} + +================================ + +znanium.com + +INVERT +.bookreadimgs + +================================ + +zorin.com + +INVERT +.logotype +.social +img[alt="GOG logo"] +img[alt="Windows to Zorin OS"] + +================================ + +zrzutka.pl + +INVERT +.navbar-logo +.rounded-circle + +================================ + +zybooks.com + +CSS +.image-content-resource img, +.zyimage { + background-color: var(--darkreader-neutral-text) !important; +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/config/inversion-fixes.config b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/config/inversion-fixes.config new file mode 100644 index 0000000..6db5d73 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/config/inversion-fixes.config @@ -0,0 +1,2788 @@ +* + +INVERT +img +video +:not(object):not(body)>embed +object +svg image +[style*="background:url"] +[style*="background-image:url"] +[style*="background: url"] +[style*="background-image: url"] +[background] +twitterwidget +.sr-reader +.sr-backdrop + +NO INVERT +[style*="background:url"] * +[style*="background-image:url"] * +[style*="background: url"] * +[style*="background-image: url"] * +input +[background] * +img[src^="https://s0.wp.com/latex.php"] +twitterwidget .NaturalImage-image + +REMOVE BG +.compatibility-with-darkreader-below-4-3-3 + +CSS +.compatibility-with-darkreader-below-4-3-3 { + background: white !important; +} + +================================ + +1fichier.com + +INVERT +#oby_na +#mkdir +#rename +#rmdir +#share +.file_link +.file_info +.file_at +.file_export +.file_desc +.file_rename +.file_password +.file_acl +.file_ddl +.file_inline +.file_remove + +================================ + +airbnb.com + +INVERT +.background-cover +#footer +#photo-modal + +NO INVERT +#footer * +#photo-modal * + +================================ + +algassert.com + +NO INVERT +img + +================================ + +aliexpress.com + +CSS +#j-qrcode-img, #J_QRCodeImg { + background-color: white !important; +} + +================================ + +amazon.com + +INVERT +#navbar +#nav-subnav +#navFooter +.dv-storefront-page +.av-hero-background-size +.av-detail-bottom-bar +.webPlayerContainer +.avu-content +.avu-section-alt +.av-badges +.controlsOverlayTopRight +.pausedOverlay +.nav-flyout + +NO INVERT +.DigitalVideoWebNodeLists_Item__itemImage +.av-hero-background +.avu-content img +.dv-tile img +video + +CSS +#nav-flyout-ewc { + margin-right: -220px; +} +.nav-flyout-body { + height: 100% !important; +} + +================================ + +anankeiot.com + +INVERT +#sidebar-left +.page-header +.add-button +.panel-footer + +================================ + +androidpolice.com + +INVERT +.ap-nav-wrapper +.footer +.logo + +NO INVERT +.ap-nav-wrapper * +.footer * + +================================ + +answers.unity.com + +INVERT +.header-wrapper +.navbar + +================================ + +askubuntu.com + +REMOVE BG +body + +================================ + +atlassian.net + +INVERT +.EditPage_withPanels_3Hr +.aui-toolbar +.editor +.toolbar-item +.conf-macro.output-inline +.conf-macro.output-display +.latexmath-center.confluenceTd + +================================ + +audible.com + +NO INVERT +img.adbl-cp-cursor + +================================ + +avisendanmark.dk + +INVERT +.logo + +================================ + +aws.amazon.com + +INVERT +#consoleNavHeader +.m-nav-header +.m-nav-panel-wrapper + +================================ + +baike.baidu.com + +INVERT +.formula + +================================ + +bart.gov/schedules + +NO INVERT +img + +================================ + +basho.com + +INVERT +#site-navigation +footer +header +.featured-news-wrapper +:not(.lang):not(#foot-logo)>img + +================================ + +bbc.com + +INVERT +div.orb-nav-section.orb-nav-blocks > a > img + +================================ + +berlingske.dk + +INVERT +.site-header__logo + +================================ + +bestbuy.com + +INVERT +#None > div > section > div.comparison-container.comparison-container-l.legacy-variant +.product-container + +================================ + +betterexplained.com + +NO INVERT +img.tex + +================================ + +bit-tech.net +forums.bit-tech.net + +INVERT +div#subNav +div#anotherSubNav +.footerContainer +div.footer +#bitFooter +.nodeIcon +li.navTab.forums.selected +li.navTab.xengallery.selected +li.navTab.members.selected + +REMOVE BG +#blurBackground +.background-image +#headerMover +#loginBar + +================================ + +buxfer.com + +INVERT +.UIDesktopAppHeader +.UISidebarDrawer +.UISidebar + +================================ + +bytesloader.com + +INVERT +.footer-distributed +.navbar-inverse + +================================ + +central.bitdefender.com + +INVERT +#left_nav +.top_nav +#user_avatar + +NO INVERT +.logo +#left_nav * +.top_nav * + +================================ + +circleci.com + +INVERT +.css-1ibtrcs +.css-1lflngw + +================================ + +cloud-catcher.squiddev.cc + +INVERT +button[class*="styles_action-button"] + +CSS +button[title*="computer off"] svg path { + fill: green !important; +} + +================================ + +cloud.digitalocean.com + +INVERT +.aurora-container-left + +================================ + +codebasehq.com + +INVERT +a.Project__link + +================================ + +codecombat.com + +INVERT +.modal-content +.map-background +.game-controls +.level-content +.modal-backdrop + +================================ + +coursera.org + +NO INVERT +.vjs-tech +.js-video + +================================ + +dailymail.co.uk + +NO INVERT +.masthead #logo + +================================ + +dash.cloudflare.com + +NO INVERT +.c_bt > div:nth-child(1) > svg:nth-child(1) +.c_k + +================================ + +dedication.pl + +INVERT +.wwzing + +================================ + +deezer.com + +INVERT +.page-sidebar + +NO INVERT +.player-cover * + +================================ + +detexify.kirelabs.org + +INVERT +.symbol img + +================================ + +devdocs.io + +NO INVERT +._theme-dark + +================================ + +developer.chrome.com + +CSS +mark, pre b { + background-color: ${#fe7} !important; +} + +================================ + +developer.mozilla.org + +INVERT +#nav-footer +.highlight-span +.readOnlyInline +#nav-sec +#toc +.socialaccount-providers +.toggle-container .current + +================================ + +developer.playfab.com + +INVERT +header + +================================ + +deviantart.com + +INVERT +#navbar-menu +#overhead-collect +.text-wrap +.thumb > .info +.mobileMenuWrapper +.tv150-tag +.hero +.hero-thumb +.hero-thumb > .info +.loggedOut +.minibrowse-mobile-paddles-container + +NO INVERT +.extra-info .avatar +.tt-crop > .tinythumb + +================================ + +disqus.com/embed/ + +INVERT +body.dark + +NO INVERT +body.dark * + +================================ + +docs.gamesparks.com + +INVERT +.side-menu +.home-menu +.hljs + +================================ + +docs.google.com + +INVERT +.jfk-palette-colorswatch +[aria-label^="Google Account"] +div[title="Profile"] +.kix-embeddedobject-image + +================================ + +docs.microsoft.com + +NO INVERT +.theme-dark +.theme_night + +================================ + +docs.unity3d.com + +INVERT +.header +.navbar-inverse + +================================ + +doodle.com + +INVERT +.d-footerContentContainer + +================================ + +drive.google.com + +INVERT +[aria-label^="Showing viewer"] > [aria-label^="Displaying"] +[aria-label^="Showing viewer"] > [role="toolbar"] +[aria-label^="Showing viewer"] [role="button"][data-tooltip="Previous"] +[aria-label^="Showing viewer"] [role="button"][data-tooltip="Next"] +[aria-label^="Showing viewer"] [aria-label^="Page"] +[aria-label^="Showing viewer"] [aria-label^="Page"] + div +[aria-label^="No preview available"] +[aria-label^="No preview available"] ~ div +[aria-label^="There was a problem previewing"] +[aria-label^="There was a problem previewing"] ~ div +[aria-label^="Google Account"] +div[title="Profile"] + +================================ + +dsl.sk + +NO INVERT +#header img +#title_bar img +#bg > table > tbody > tr:nth-of-type(1) > td:nth-of-type(1) +img[src="images/article_perex.gif"] +img[src="/images/design/feedback_pos.png"] +img[src="/images/design/feedback_neg.png"] + +REMOVE BG +#menu +#bg > table > tbody > tr:nth-of-type(1) > td:nth-of-type(1) + +================================ + +duckduckgo.com + +INVERT +html:not(.dark-bg) #logo_homepage_link +html:not(.dark-bg) span.header__logo.js-logo-ddg + +NO INVERT +html.dark-bg +html.dark-bg * + +================================ + +ebay.* + +INVERT +body[style*="background-image: url"] img +body[style*="background-image: url"] video +body[style*="background-image: url"] [style*="background-image: url"] + +NO INVERT +body[style*="background-image: url"] + +================================ + +electronics-tutorials.ws + +REMOVE BG +img + +================================ + +electronjs.org + +INVERT +header +.jumbotron-home +.highlight-dark + +================================ + +exhentai.org +e-hentai.org + +INVERT +#gd1 +.gdtm > div + +================================ + +facebook.com + +INVERT +._3ixn +._2teu +.userContentWrapper canvas +._4lqu +._4lqt +._24ws +._1z0- +._19eb +._5rpb +._5rpu +._3t54 +._1-h1 +._3pit +._5asn +._1e8c +._2b-0 +._2w_u +._4who +._4g9v +._3s6x +._5b-_ +._2r86 +._2r84 ._62jm +._3ekx +._3uzm +._4-lv +._6m3 +._2t_q +._4-lv [role="button"] +._2ph- +._39n +._3u15 +.snowliftOverlay +.coverNoImage +.fbTimelineProfilePicSelector +.uiTooltipX +body.UIPage_LoggedOut #blueBarDOMInspector +body.UIPage_LoggedOut #blueBarDOMInspector .inputtext +canvas + +NO INVERT +.uiStreamStory video +.inputtext + +REMOVE BG +._4d3w .stageWrapper +._4lpe +.stage +.videoStage + +CSS +._2s1x ._2s1y { + background: #9BB5E8 !important; + border-bottom-color: #92A6CA !important; + color: black !important; +} +.uiContextualLayerParent { + box-shadow: none !important; +} + +================================ + +farside.ph.utexas.edu + +NO INVERT +img + +================================ + +feedback.unity3d.com + +INVERT +.header-wrapper +.navbar +.bg-ud + +================================ + +feedly.com + +INVERT +.people .photo +#feedlyUndoSign +#feedlySignPart +.pinContainer +.visual-overlay + +CSS +.entry-overlay { + background-color: rgba(220,220,220,0.5); +} + +================================ + +feynmanlectures.caltech.edu + +NO INVERT +img + +================================ + +fontspring.com + +NO INVERT +.grid6 .fullwidth + +================================ + +forum.unity.com + +INVERT +.main-navigation +.sub-nav +.unity-logo +.icon +.sub-nav + +================================ + +gadgety.co.il + +INVERT +iframe[src^="https://www.youtube.com/embed"] + +================================ + +gamesparks.com + +INVERT +.main_header +.block_compatibility +.grid_overlay +.block_insights +.main_footer +.docs-hero + +================================ + +genk.vn + +INVERT +.ghw-bottom-header +.ghw-top-header + +================================ + +gigaom.com + +INVERT +.bg + +================================ + +github.com + +INVERT +.jumbotron-codelines +.bg-gray-dark +.bg-gray-dark .form-group +.js-project-header +.header-logo-invertocat +.notification-indicator +.label +.label-color +.tooltipped:not(.notification-indicator)::before +.tooltipped:not(.notification-indicator)::after +.HeaderNavlink [data-ga-click*="(Logged out)"] + +CSS +header { + background-color: #dae1e7 !important; +} +.markdown-body img { + background-color: transparent !important; +} +.Header .header-search-wrapper { + background-color: rgba(0, 0, 0, 0.125) !important; +} +.js-selected-navigation-item { + color: rgba(0, 0, 0, 0.75) !important; +} +header, +.HeaderNavlink, +.Header .header-search-input, +.Header .header-search-input::placeholder { + color: rgba(0, 0, 0, 0.75) !important; +} +.Header .header-search-scope { + border-right-color: #ccd7e1 !important; + color: rgba(0, 0, 0, 0.75) !important; +} +.select-menu-item.navigation-focus, +.select-menu-item.navigation-focus.selected, +.select-menu-item.navigation-focus.select-menu-action, +.select-menu-item.navigation-focus .description-inline { + background: #93c6ff !important; + color: black !important; +} +.HeaderMenu-link, +.select-menu-item.navigation-focus > .octicon, +.select-menu-item.navigation-focus.selected > .octicon, +.select-menu-item.navigation-focus.select-menu-action > .octicon, +.select-menu-item.navigation-focus .description-inline > .octicon { + color: black !important; +} + +================================ + +gitlab.* + +INVERT +gl-emoji +.navbar +.code.dark +.code.dark .notes_holder +.code.solarized-dark +.code.solarized-dark .notes_holder +.code.monokai +.code.monokai .notes_holder +.blame-commit + +NO INVERT +.ui_light .navbar + +CSS +#build-trace { + background: rgba(255, 255, 255, 0.7) !important; +} +pre code { + color: #777777 !important; +} + +================================ + +gls-pakete.de + +CSS +.tracking--status .status-box::before, .tracking--status .status-box::after { + z-index: 0 !important; +} +.tracking--status .status-box.status--complete.status--lastcomplete .status-box--tooltip, .tracking--status .status-box.status--current .status-box--tooltip { + transform: none !important; + position: absolute !important; + margin-bottom: 0px !important; + margin-top: -10px !important; + bottom: 0 !important; +} + +================================ + +google.* +google.*.* + +INVERT +.gb_2 +.gb_M +.gsri_a +.gbii +.gbip +.azp +.aLF-aPX-KP +.irc_bg +.RY3tic +canvas.circle +#app-container.vasquette.app-imagery-mode .widget-scene-canvas +#app-container.vasquette.app-globe-mode .widget-scene-canvas + +NO INVERT +.irc_mi +.irc_rii +.irc_mut +.act-icon-dark-gray +.amI +.amJ +.adk +.adj +[src*="ic_"] +[src*="black"] +.mL +.ajT +.hB +.hA +.mK +.mI +input[style*="data:image"] +img[src*="/books/content?"] + +CSS +.pI { + background: rgba(255, 255, 255, 0.7) !important; +} +.eB { + background: rgba(255, 255, 255, 0.4) !important; +} + +================================ + +granttree.co.uk + +INVERT +img +video +embed +.photo + +================================ + +habitica.com + +INVERT +nav.navbar +#app-header +.header +.quest-boss +.character-sprites +.item-content +.drawer-container .item +.npc_matt +.npc +.seasonal .background +.image +.habitica-emoji +.daniel_front +.world-boss +.dropdown-menu +.dropdown-menu .notification +.fade.show +.modal-content +.drawer-container + +NO INVERT +#app-header .character-sprites +.seasonal .background .npc + +================================ + +habr.com + +NO INVERT +img[src*="//tex.s2cms.ru/"] + +================================ + +hangouts.google.com + +INVERT +.g-Ue-ad +.g-Ue-v0h5Oe +.bdXzDb .pTh3n +.gb_Hc +.Ik +.gbii +.vm +.Ce1Y1c +.mUbCce + +NO INVERT +#gbq1 + +REMOVE BG +.g-Qx-eb + +CSS +.kFx1Ae-xdwExf-eb-m, +.g-Qx-r4m2rf-wZVHld { + display: none; +} + +================================ + +homestuck.com + +INVERT +.read-link +body.scratch +body.sweet +body:not(.scratch):not(.sweet) #animation_container +body:not(.scratch):not(.sweet) .nav-btn--center +body:not(.scratch):not(.sweet) #nav-container +body:not(.scratch):not(.sweet) #game_overlay +body.scratch #overlay +body.sweet #overlay +body.sweet #gamenav-container +body.scratch #site-search +body.sweet #site-search +body.scratch .o_chat-log-btn + +NO INVERT +body.scratch img +body.sweet img + +REMOVE BG +body:not(.scratch):not(.sweet) +body:not(.scratch):not(.sweet) .o_site-footer + +================================ + +html5rocks.com + +INVERT +.prettyprint + +================================ + +hysterical-amusement.surge.sh + +INVERT +body +.instructionsContainer +#liveOutput + +================================ + +ign.com + +INVERT +.video_embed_content-poster +.video_embed_content-poster-play-button + +REMOVE BG +#review-promo + +================================ + +imdb.com + +INVERT +#nb20 > div +#navbar-suggestionsearch +.caption_overlay +.vital +.slate_wrapper > .poster +.slate +.slate_fade_top +.slate_fade_bottom +.ab_hero +.ab_hero .ninja_image +.sub_nav +.app-links +#navMenuPro img +#proAd +.rec_default_image +#photo-container +#video-container + +NO INVERT +#navMenuPro +#photo-container img +#video-container img +#video-container video + +REMOVE BG +#nb20 + +================================ + +immutables.github.io + +INVERT +.illustration +.documentation .highlight + +================================ + +instagram.com + +INVERT +._mli86 +._cqw45._2pnef + +CSS +[role="dialog"] { + background-color: rgba(255, 255, 255, 0.5) !important; +} +._sxolz { + background-color: #fff !important; +} + +================================ + +io9.com + +CSS +html { + height: auto !important; +} + +================================ + +iopscience.iop.org + +NO INVERT +img[alt*="Equation"] + +================================ + +java.com + +INVERT +html #jvc0v2.bg1 .jvc0w1 +html #jvc0v2.bg2 .jvc0w1 +html #jvc0v2.bg3 .jvc0w1 +html #jvc0v2.bg4 .jvc0w1 +html #jvc0v2.bg5 .jvc0w1 + +================================ + +javarepl.com + +INVERT +.terminal-content + +REMOVE BG +body + +================================ + +jcrew.com + +CSS +.c-filters__refinement--label .refinement--label__checkbox svg path { + fill: transparent !important +} +.c-filters__refinement--label.is-selected .refinement--label__checkbox svg path { + fill: #fff !important +} + +================================ + +jeremykun.com + +NO INVERT +img[src*=".gif"] +img[src*=".png"] + +================================ + +jira.* +jira.*.* + +INVERT +.chart img + +================================ + +journalisten.dk + +INVERT +.top-logo + +================================ + +juejin.im + +NO INVERT +.equation + +================================ + +jyllands-posten.dk + +INVERT +.c-icon:not(.c-icon--fill-white) + +================================ + +khanacademy.org + +INVERT +.task-container .modal-backdrop + +================================ + +kinopoisk.ru + +INVERT +#GOWrapper +#external_header_wrapper +.header-fresh-search-partial-component_theme_default +.header-fresh-partial-component_theme_light +.footer-v2-partial-component__navigation-wrapper +.footer-v2-partial-component__bottom-navigation +.header-fresh-partial-component_theme_default .header-fresh-partial-component__dropdown +.info_title .gradient +.info_title .gradient_director +.movie-ticket-button +.movie-trailer-button +.randomMovie .name +.picAndNums +.promo-special +.flag +.main_info__quote +.feedback_img +.main_slider_arrow +#top_3banners +.yearsBox +.bottom_bg +.insert +.trailer_descr +.arrow +.play +.kp2-authapi-overlay +.kp2-authapi-paranja +.app__sticky-header +.search-suggest__content +.video-snippet__inner:after +.video-snippet__content +.tabs__tab_selected + +NO INVERT +.right-slider p +#top_3banners img +.zod img +.peopleInfo table img +.date img +.rating img + +REMOVE BG +#content_block +.box_block table table * + +CSS +.discovery-trailers-overlay { + background: rgba(255, 255, 255, 0.8) !important; +} +#popup_info_wrapper * { + color: #bbb !important; +} + +================================ + +kubernetes.io + +INVERT +section.header-hero +footer + +================================ + +last.fm + +INVERT +div.masthead-logo +ul.navlist-items +div.navlist-more-wrap +div.header-title-label-wrap +div.grid-items-cover-image-image::after +div.grid-items-item-details +div.featured-item-details +div.top-bar +div.features-footer-cover-image::after +p.features-footer-content +button.btn-primary +a.btn-primary +footer + +================================ + +launchpad.net + +INVERT +body + +NO INVERT +html +#launchpad-logo-and-name + +================================ + +lazada.com.my + +INVERT +.lzd-logo-content + +================================ + +learningsuite.byu.edu + +INVERT +.sidebarCalendar +.calendarEmpty +.white + +================================ + +libretexts.org + +NO INVERT +img + +================================ + +lifehacker.com + +INVERT +.videoCube a .thumbBlock + +CSS +html { + height: auto !important; +} + +================================ + +linerad.io + +INVERT +.header h1 img + +================================ + +linkedin.com + +INVERT +#top-header +#responsive-nav-scrollable + +NO INVERT +#top-header * +#responsive-nav-scrollable * + +================================ + +linternaute.fr + +INVERT +.dico_liste.grid_line > li + +CSS +.dico_liste_greyandwhite .dico_liste li a { + color: var(--darkreader-neutral-background); +} + +================================ + +mail.live.com + +INVERT +img:not([src="https://a.gfx.ms/rte_metro2.png"]) +video +object +.ComposeContent + +REMOVE BG +.ComposeContent + +================================ + +mail.protonmail.com + +CSS +.angular-squire-iframe body, +.angular-squire-iframe body div { + background: #0D0E12 !important; + color: #fff !important; +} + +================================ + +mailchimp.com + +INVERT +svg + +NO INVERT +.cke_button_icon + +================================ + +mathpages.com + +NO INVERT +img + +================================ + +mathprofi.ru +mathprofi.net + +NO INVERT +p img + +================================ + +mathworld.wolfram.com + +NO INVERT +img + +================================ + +matsci.org + +NO INVERT +.d-header #site-logo + +CSS +.category-logo.aspect-image img { + background-color: white !important; +} + +================================ + +medium.com + +NO INVERT +.canvas-renderer + +================================ + +meduza.io + +INVERT +.Header-root +.Footer-root + +================================ + +messenger.com + +INVERT +._4tsk + +================================ + +minhaclaro.claro.com.br + +INVERT +.header-black +.header-red-desktop-logada +#txt-busca-header-desktop + +================================ + +mixtape.moe/$ + +INVERT +body +.top > .menu +#upload-filelist +.file-url + +================================ + +mspaintadventures.ru + +INVERT +.row +.row img +.row object +.mspa_content_inner > .mspa_page_pictures +.adv_content_inner > .adv_page_pictures +.sidebar +.content +.footer +.copyright +.row:nth-of-type(1) > .header +.row:nth-of-type(1) > .header > .banner +.row:nth-of-type(1)[style*='width:940px'] div:not(.nav) + +NO INVERT +.nav img +#page > .content +.row > .row +.content > .content +.mspa_content_inner > .mspa_page_text img +.adv_content_inner > .adv_page_text img + +CSS +body { + background-color: #fff !important; +} +.sidebar { + border-color: #fff !important; +} +html, +.banner, +.row:nth-of-type(2), +.row:nth-of-type(4) { + background-color: #000 !important; +} + +================================ + +mullvad.net + +INVERT +#Logo + +================================ + +my.mail.ru/(music|mail|vk|ok|bk|list|gmail.com|inbox) + +INVERT +.b-head-layer_music +.b-head__menu__logo +.b-head__portal-navigation-wrapper +.b-history-event__videoevent-name +.b-music__genre__header__info +.b-music__playlists--tile__item__controls +.b-music__playlists--tile__item__stats +.b-music__section__content +.b-music__section__footer +.b-music__section__row +.b-music__top-artists__item__cover +.b-music__top-artists__item__info +.b-music__user-header__content +.b-music__user-header__controls +.b-music__user-header__title +.b-popup__fade +.btn-import +.filed-images +.l-music__menu-main +.l-music__portal-navigation +.l-music__search-form +.l-music__sidebar__playlist-playing > .cover +.playlists-block +.smiles +.songs-table__row__col__cover +.ui-button-main + +NO INVERT +html +.b-music__artist-header__content +.b-music__artist-header__cover +.b-music__section__cell +.fixed-menu > .b-music__section__footer +.l-mm__avatar +.l-music__player__song__cover +.playlists-block + +REMOVE BG +.b-music__user-header__bg--no-profile-cover + +CSS +.l-music { + background: #111; +} + +================================ + +myaccounts.capitalone.com + +INVERT +c1-ease-core-features-hero-bar + +================================ + +mydealz.de + +INVERT +.nav +.search +.threadTempBadge-icon +.emoji +.comment-image +.avatar +#footer +#thread-comments +.cept-action-user-profile +.popover--mainNav +.supportImage +.profileHeader +.cept-thread-image-link +.cept-thread-image-clickout + +NO INVERT +.cept-userProfile-avatar +.imgFrame-img + +CSS +.cept-dealBtn, .btn--facebook{ + letter-spacing: 0.5px; +} +.twitter-share-button{ + letter-spacing: 1.5px; +} +.text--color-red, .vote-temp--hot, .vote-temp--burn, .icon--plus{ + color: #ff3d00; +} + +================================ + +myfitnesspal.com + +INVERT +#fancybox-overlay + +================================ + +neopets.com + +INVERT +#ban +#header + +================================ + +nodejs.org + +INVERT +#column2 +footer +header + +CSS +#column2.interior { + background: #212121; +} +#column2 ul { + background-color: #212121; +} + +================================ + +nvidia.com + +INVERT +.sub-brand-nav +.brandLink + +================================ + +onliner.by + +INVERT +.b-tile-main +.b-teasers-2__teaser +.news-tiles__subtitle +.b-opinions-main-2__tile +.news-header__top > .news-header__title +.b-tile-grad + +NO INVERT +.b-opinions-main-2__tile * +.b-teasers-2__teaser-i + +================================ + +op.gg + +INVERT +.__sprite + +================================ + +openclassrooms.com + +INVERT +code.ace + +NO INVERT +[class*=ace] * + +================================ + +opencollective.com + +INVERT +.CollectiveCover +.Footer +.MailChimpInputSection +.PublicFooter + +NO INVERT +.CollectiveCover * +.Footer * +.MailChimpInputSection * +.PublicFooter * + +================================ + +otakumode.com + +INVERT +.c-slick-image-viewer__main-image img + +================================ + +outlook.live.com + +INVERT +#O365_NavHeader +span.ms-Pivot-text +span.ms-Pivot-icon +.ms-FocusZone.ms-CommandBar + +================================ + +pagerduty.com + +REMOVE BG +body + +================================ + +pandora.com + +INVERT +#body +.contentbox +#detailContainer +#mainContent +.slidesBackground +.slidesForeground + +CSS +.skinContainer, +.slidesBackground, +.slidesForeground, +#trackDetail, +.track_detail_close { + background-color: black !important; +} +.fxCol-cont-1, +.jspContainer, +#trackInfoButtons { + background-color: white !important; +} +#brandingBar, +.contentnav, +.top { + background-color: #3d4043 !important; +} +#playerBar { + background-color: #0d0d0d !important; +} + +================================ + +paper.dropbox.com + +INVERT +.attrcomment.attrcomment + +================================ + +perforce.com + +INVERT +.title-bar +.sidenav-wrapper + +================================ + +photos.google.com + +INVERT +.DwJIde .QtDoYb svg + +CSS +.ZSTBVb, .DwJIde .NRbSyd { + background: white !important; +} + +================================ + +play.afreecatv.com + +INVERT +#afreecatv_player + +================================ + +playfab.com + +INVERT +.hero + +================================ + +poeaffix.net + +INVERT +#header + +NO INVERT +img + +================================ + +politiken.dk + +INVERT +.pol-logo + +================================ + +practice.geeksforgeeks.org + +INVERT +.ace_dark + +================================ + +prntscr.com +prnt.sc + +INVERT +.header + +================================ + +producthunt.com + +INVERT +.backgroundImage_1hK9M +.v-image + +NO INVERT +.backgroundImage_1hK9M * +.v-image * + +CSS +.post-detail--body--gallery-fullscreen--image { + background-color: black; +} + +================================ + +python.org + +INVERT +nav ul li > a +nav .tier-2 +#site-navigation +header +.featured-news-wrapper +:not(.lang):not(#foot-logo) > img + +NO INVERT +:not(.lang):not(#foot-logo) > img +#content > div > section > div + +================================ + +quora.com + +INVERT +.section_photo + +================================ + +reactjs.org + +INVERT +.gatsby-highlight +.css-mlkfzr +.css-17t02fm + +================================ + +readthedocs.io + +INVERT +.wy-nav-side +.rst-versions +li.current + +================================ + +reddit.com/r/(homestuck|Undertale) + +INVERT +#header +#header-bottom-right +#sr-header-area +.md h4 + +NO INVERT +#header-img + +REMOVE BG +body + +================================ + +reddit.com/r/europe + +INVERT +.flair + +================================ + +reddit.com/r/firefox + +INVERT +#header +#header-bottom-right + +================================ + +reddit.com/r/GlobalOffensive + +INVERT +#header +.side + +NO INVERT +#header * +.side * + +CSS +#mail::before { + display: none !important; +} + +================================ + +reddit.com/r/grandorder + +INVERT +#header +.flair + +================================ + +reddit.com/r/Paranormal + +INVERT +#header +#sr-header-area +#header-bottom-right + +================================ + +reddit.com/r/skyrimmods + +INVERT +#header +.infobar + +================================ + +reference.wolfram.com + +NO INVERT +img + +================================ + +regexr.com + +INVERT +canvas.highlights + +================================ + +rijnijssel.elo.education-online.nl + +NO INVERT +.app-left-sidebar + +================================ + +roblox.com + +INVERT +.thumbnail-span +.color-dot +.avatar-back + +NO INVERT +.thumbnail-span * +.avatar-back * + +CSS +.avatar-thumbnail .enable-three-dee { + background-color: #000000; + color: #FFFFFF; +} + +================================ + +ruby.sketchup.com +rubydoc.info + +INVERT +#navbar + +NO INVERT +#navbar a > img +#nav + +================================ + +scotch.io + +INVERT +.language-js +.language-javascript + +================================ + +script.google.com + +INVERT +.docs-icon-img-container + +================================ + +sellercentral.amazon.com + +CSS +.sc-header { + background: #5c00ff !important; +} +.small,.account-switch-icon{ + fill: black !important; +} +.locale-icon-wrapper{ + color: black !important; +} +.logo-container { + filter: brightness(0%) !important; +} + +================================ + +semlar.com + +INVERT +.thumbnail +.col-sm-2 +.img-rounded +#alert-list +.background-texture + +NO INVERT +img + +================================ + +shiyanlou.com + +INVERT +#display + +================================ + +shop.ubi.com + +INVERT +#topNavbar +#UplayHeader + +================================ + +signin.aws.amazon.com/saml + +INVERT +body + +NO INVERT +html + +================================ + +slack.com + +INVERT +.client_channels_list_container +figure +.member_preview_link.member_image + +NO INVERT +.client_channels_list_container * +figure * + +CSS +.emoji { + background-color: white; +} + +================================ + +slushpool.com + +INVERT +.siteHeader +.contentHeader +.contentSlider + +================================ + +spotify.com + +INVERT +img +video +embed +.hero +.header-main +.search-bar +#bg-wrap +#main + +================================ + +stackexchange.com +*.stackexchange.com +askubuntu.com +mathoverflow.net +serverfault.com +stackapps.com +superuser.com + +INVERT +.top-bar + +================================ + +stackexchange.com +askubuntu.com +mathoverflow.com +serverfault.com +stackapps.com +stackoverflow.com +superuser.com + +CSS +#hlogo a { + text-indent: -256em !important; +} + +================================ + +statlect.com + +NO INVERT +span.displayed > img +span.inm > img +#lensDIV img +.gs-image-box img.gs-image +img[alt="Table of Contents"] + +================================ + +stiften.dk + +INVERT +.logo + +================================ + +studio.restlet.com +cloud.rest-let.com + +INVERT +.left-panel +.header +.editor-ace + +NO INVERT +.avatar + +================================ + +subscene.com + +INVERT +#logo + +================================ + +subscription.packtpub.com + +INVERT +.sidebar +.navbar +.cover-info-overlay + +================================ + +symfony.com + +INVERT +#sln +.header__top :not(img) +.highlighttable + +NO INVERT +[class^="sln-visible-"] > img:first-child + +================================ + +systemuicons.com + +INVERT +img + +================================ + +techpowerup.com + +CSS +.page-is-loading { + display: none !important; +} + +================================ + +teddit.net +teddit.ggc-project.de +teddit.kavin.rocks + +INVERT +.preview + +================================ + +terraform.io + +INVERT +.mega-nav-banner + +================================ + +terrytao.wordpress.com + +NO INVERT +img + +================================ + +thomann.de + +CSS +.fx-mix-blend-mode--multiply, +.product__image { + mix-blend-mode: unset !important; +} + +================================ + +tianchi.aliyun.com + +NO INVERT +img + +================================ + +tn.gov + +INVERT +img[src$="tn-seal.png"] + +================================ + +toggl.com + +INVERT +.left-nav + +================================ + +tpondemand.com + +INVERT +.tau-cover-view__overlay +.tau-app-secondary-pane +.app-header +.uv-popover-content + +NO INVERT +.tau-app-secondary-pane * +.app-header * + +================================ + +tproger.ru + +INVERT +.top-duft-punk +#colophon + +NO INVERT +.text_logo img +.tmenu_icon + +================================ + +translate.yandex.ru + +CSS +.application.state-new .container_main, +.application.state-new .container_main[style], +.application.state-new .header { + border-bottom-color: transparent; +} + +================================ + +travis-ci.org + +INVERT +.job-log + +================================ + +trip101.com + +INVERT +#homeaway-searchbox-searchtext +.footer +.hero-full-screen +.hero-section +.name +.tabs +.tabs-content + +NO INVERT +.banner-img * +.logo * +.partners * +.partner-logo * +.tab-carrental * +.tab-hotel * +.tab-pa * +.tab-skyscanner * + +================================ + +tvtime.com + +NO INVERT +.page-sidebar * +.page-left * + +================================ + +tweakers.net + +INVERT +#menubar +#bottom +#tracker +#imageOverlay +#thumbContainer +.button +.hr + +NO INVERT +#thumbContainer * +#bottom .button + +================================ + +twitch.tv + +INVERT +#site_footer +#carousel_background::after +#left_col +.player +.badge +.social-column +.top-nav +.anon-front__featured-section +.side-nav +.footer + +NO INVERT +.player * +.social-column * +.top-nav * +.anon-front__featured-section * +.side-nav * +.footer * + +REMOVE BG +#carousel +.chat-container +.conversations-list-header +.dark_wrapper ul +html +.nav +.js-conversations-list +.js-conversations-list-bottom-bar +.rightcol-content > .top + +CSS +.chat_text_input, +.colon, +.dark_wrapper *, +.message, +.room-title, +.selected > a { + color:black !important; +} +.chat_text_input { + border: 1px solid black !important; +} + +================================ + +twitter.com + +INVERT +.tcu-textEllipse--multiline +.GalleryTweet .tweet +.Gallery-media +.DashboardProfileCard-bg +.SummaryCard-content + +NO INVERT +.Gallery-media * + +CSS +.gallery-overlay, +#permalink-overlay { + background: rgba(255, 255, 255, 0.7) !important; +} + +================================ + +ubi.com + +REMOVE BG +html +body + +================================ + +unicode.org + +INVERT +.chars + +================================ + +unicodelookup.com + +CSS +body { + background-color: #FFF !important; +} + +================================ + +unity3d.com + +INVERT +.main-navigation +.sub-nav +.wrapper +.unity-logo +.icon +.main-footer + +================================ + +unity3d.com/learn + +INVERT +.main-navigation +.sub-nav +.wrapper +.unity-logo +.bg-instructors +.hero +.bg-workflow + +================================ + +unityhacks.com + +INVERT +#unityhacks_sidebar +#exposeMask +#logoBlock +#navigation +#moderatorBar +.xenOverlay .sectionMain .heading overlayOnly +.banner_owner +.banner_staff +.banner_supportleader +.banner_supporter +.banner_partner +.banner_designer +.banner_promoter +.banner_honorable +.banner_premium +.messageHeading +.subHeading +.ToggleTrigger +.prefix +.PopupOpen +.categoryStrip +.secondaryContent h3 +.LTR +.callToAction +.xenOverlay .section .heading +.xenTooltip +.redactor_dropdown +.errorOverlay +.sectionHeaders +.button +[title="Unread messages"] +footer + +NO INVERT +#logo * +#taigachat_toolbar * +.listItemText h3 +.pollBlock .pollResult div +.pollBlock .pollResult h3 + +================================ + +vergil.chemistry.gatech.edu/notes + +NO INVERT +img + +================================ + +virtua.speedtestcustom.com + +NO INVERT +.branding + +================================ + +vk.com + +INVERT +.videoplayer +.videoplayer_media +.videoplayer_timeline_preview +.mv_chat +.mv_playlist +.mv_playlist_controls +#VideoLayerInfo__topControls +.page_album_title +.article_snippet__fade +.article_snippet__info +.article_snippet__read_btn +#layer_bg +#box_layer_bg +#pv_more_acts_tt +.login_app_devices +.friends_import_icon +.articleSnippet__inner +.articleSnippet_button +#z_photoview +.vv_summary +.thumb_map:after +.input_back_wrap[style*=none] ~ #ts_input +.audio_page_player_play .icon +.page_video_play_icon +.apps_featured_thumb_content +[class^=apps_featured]:before +.apps_frtt_photo +.apps_frtt_level +.settings_separated_row_iconed:before +.owner_photo_bubble_wrap +.tt_black +.tt_w.tt_black +.box_title +.box_layer_wrap +#box_loader +.chat_tab_close +#notifiers_wrap +.notifier_image_wrap +.doc_ext +.doc_title +.like_tt::after +.audio_row__cover_back +.poster__text +.emoji_smiles_row +.Reaction + +NO INVERT +.mv_chat * +.mv_playlist * +#z_photoview img +.box_grey .box_title + +REMOVE BG +.mv_layer_bg +.pv_bottom_info +.pv_img_area_wrap +.vv_body +.like_tt + +CSS +.pv_bottom_info *, +.like_tt { + color: #000 !important; +} +#pv_more_acts_tt * { + color: #eee !important; +} +#top_notify_wrap, +#audio_layer_tt { + box-shadow: none; +} +.chat_onl_inner { + background-color: #dae1e8 !important; +} +.chat_tab_wrap:hover { + background-color: #ccd5de !important; +} +.photos_row { + background-color: #000 !important; + border-color: #000 !important; +} + +================================ + +vocabolario.sns.it + +INVERT +img[src] + +NO INVERT +body[background] + +================================ + +vuejs.org + +INVERT +.content +pre +h3 +p + +NO INVERT +img + +================================ + +w3schools.com + +INVERT +#topnav + +================================ + +wallet.trezor.io + +INVERT +.page-header +.qr-code + +REMOVE BG +.qr-code + +================================ + +web.telegram.org + +INVERT +.im_dialog_unread +.icon-message-status +.dropdown-toggle +.icon-tg-title + +================================ + +web.whatsapp.com + +INVERT +.qrcode .icon-logo + +CSS +.qrcode { + border: 8px solid black; +} + +================================ + +wikipedia.org + +INVERT +.mwe-popups-discreet > svg +.mw-ext-score +.mw-mmv-overlay +#Vorlage_Infobox_Chemikalie > tbody > tr:nth-child(2) > td > a + +NO INVERT +.mwe-math-fallback-image-inline +.mwe-math-fallback-image-display +.mwe-popups image +img[src*="svg.png"] +img[alt^="Skeletal" i] +img[alt^="Structural" i] + +================================ + +wikiwand.com + +REMOVE BG +img + +================================ + +wolfram.com + +NO INVERT +.numberedequation +.displayformula +.inlineformula + +================================ + +wolframalpha.com + +NO INVERT +img + +================================ + +xfree86.org + +NO INVERT +img[src*=".png"] + +================================ + +yandex.* + +INVERT +body.b-page_theme_pure_night +[class*="icon_moon_"] +.favicon +.weather__icon +.traffic__icon +.dist-popup__image +.footer_distro_yes +.serp-footer +.distro__icon +.services-big__item_icon +.services-all__icon +.popup2:before +html.i-ua_swipe_yes .informers7__icon +html.i-ua_swipe_yes .zen__item-domain +html.i-ua_swipe_yes .zen__item-title +html.i-ua_swipe_yes .teaser__service-bg +html.i-ua_swipe_yes .stream-intro +html.i-ua_swipe_yes .edadeal +html.i-ua_swipe_yes .afisha +html.i-ua_swipe_yes .services__icon +html.i-ua_swipe_yes .menu2__list + +NO INVERT +body.b-page_theme_pure_night * +html.i-ua_swipe_yes .stream-intro__vod-preview +html.i-ua_swipe_yes .edadeal__item-img +html.i-ua_swipe_yes .afisha__film-image + +REMOVE BG +html.i-ua_swipe_yes .mini-suggest__popup-spacer +html.i-ua_swipe_yes .menu2__container + +================================ + +youtube.com + +INVERT +html[dark=true] #scrim +.html5-video-player +.has-custom-banner +#theater-background +#watch-appbar-playlist +html:not([dark=true]) #header > #background +html:not([dark=true]) #links-holder yt-formatted-string +html:not([dark=true]) #subscribe-button +ytd-thumbnail-overlay-time-status-renderer +ytd-thumbnail-overlay-toggle-button-renderer +paper-toast +ytd-masthead[dark] +html:not([dark=true]) ytd-masthead[dark] #avatar-btn + +NO INVERT +html[dark=true] +html[dark=true] * +.html5-video-player * +.has-custom-banner * +#watch-appbar-playlist * + +CSS +#scrim.app-drawer { + background: rgba(255, 255, 255, 0.5); +} +#player-theater-container { + background: none !important; +} + +================================ + +yscec.yonsei.ac.kr + +INVERT +iframe +#page-sidebar diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/config/static-themes.config b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/config/static-themes.config new file mode 100644 index 0000000..c8f3c17 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/config/static-themes.config @@ -0,0 +1,174 @@ +* + +NEUTRAL BG +html +body +:not([style*="background-color:"]):not(iframe) + +NEUTRAL TEXT +html +body +:not([style*="color:"]) +.sr-reader *:not([class*='sr-pivot']) + +RED TEXT +h1:not([style*="color:"]) +h2:not([style*="color:"]) +h3:not([style*="color:"]) +h4:not([style*="color:"]) +h5:not([style*="color:"]) +h6:not([style*="color:"]) + +GREEN TEXT +cite:not([style*="color:"]) + +BLUE BG ACTIVE +input:not([style*="background-color:"]) +textarea:not([style*="background-color:"]) +button:not([style*="background-color:"]) +[role="button"] + +BLUE TEXT ACTIVE +a:not([style*="color:"]) + +BLUE BORDER +:not([style*="border-color:"]) +::before +::after + +FADE BG +div:empty +.sr-reader * +.sr-backdrop + +FADE TEXT +input::placeholder +textarea::placeholder + +NO IMAGE +input:not([style*="background-image:"]) +textarea:not([style*="background-image:"]) + +================================ + +github.com + +RED TEXT +.pl-k + +GREEN BG ACTIVE +.btn-primary + +GREEN TEXT +.pl-c + +BLUE TEXT +.pl-s +.pl-pds +.pl-c1 + +NO IMAGE +.btn +.btn-primary + +================================ + +imdb.com + +RED BG +.jw-progress:empty +.jw-knob:empty + +FADE BG +.MediaSheetstyles__MediaContainer-sc-1warcg6-0 +.MediaSheetstyles__MediaContentContainer-sc-1warcg6-1 + +TRANSPARENT BG +.ipc-lockup-overlay +.ipc-lockup-overlay__content * +.jw-captions +.jw-controls +.jw-controls * +.jw-controls-backdrop:empty +.jw-overlays +.MediaSheetstyles__MediaContentContainer-sc-1warcg6-1 div +.Slate__VideoPreviewContainer-ss6ccs-3 +.styles__MediaViewerTouchHandler-sc-6t1jw8-5 + +================================ + +mail.google.com + +RED BG ACTIVE +.T-I-KE + +NO IMAGE +.T-I-KE + +================================ + +nationstates.net + +TRANSPARENT BG +.paperclip + +================================ + +opencollective.com + +BLUE BG ACTIVE +.TierCard .action + +TRANSPARENT BG +.CollectiveCover .content + +================================ + +reddit.com + +RED BG +.reddit-video-player-root .seek-bar-progress +.reddit-video-player-root .volume-slider-progress +.reddit-video-player-root .volume-slider-thumb + +BLUE BG +.reddit-video-player-root .seek-bar-buffered +.reddit-video-player-root .volume-slider-track + +FADE BG +.reddit-video-player-root .ended-controls +.reddit-video-player-root .playback-controls + +TRANSPARENT BG +.reddit-video-player-root video + div +.reddit-video-player-root .ended-controls :not(button) +.reddit-video-seek-bar-root +.reddit-video-player-root .playback-controls .control-button + +================================ + +youtube.com + +RED BG +.ytp-swatch-background-color.ytp-swatch-background-color + +BLUE BG +.ytp-load-progress:empty + +FADE BG +.ytp-chrome-top +.ytp-chrome-bottom +.ytp-pause-overlay + +TRANSPARENT BG +#previewbar +.ytp-button.ytp-button +.ytp-chrome-bottom * +.ytp-chrome-top * +.ytp-gradient-bottom:empty +.ytp-gradient-top:empty +.ytp-pause-overlay * +.ytp-progress-bar-padding:empty +.ytp-scrubber-container +.ytp-timed-markers-container:empty +.ytp-tooltip-text-wrapper diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_128.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_128.png new file mode 100644 index 0000000..576e864 Binary files /dev/null and b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_128.png differ diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_16.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_16.png new file mode 100644 index 0000000..1e2d1b7 Binary files /dev/null and b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_16.png differ diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_48.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_48.png new file mode 100644 index 0000000..c2e3737 Binary files /dev/null and b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_48.png differ diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_active_19.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_active_19.png new file mode 100644 index 0000000..99184c8 Binary files /dev/null and b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_active_19.png differ diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_active_38.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_active_38.png new file mode 100644 index 0000000..c684bb4 Binary files /dev/null and b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_active_38.png differ diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_inactive_19.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_inactive_19.png new file mode 100644 index 0000000..cc30623 Binary files /dev/null and b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_inactive_19.png differ diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_inactive_38.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_inactive_38.png new file mode 100644 index 0000000..985fbca Binary files /dev/null and b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/icons/dr_inactive_38.png differ diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/inject/fallback.js b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/inject/fallback.js new file mode 100644 index 0000000..e65d628 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/inject/fallback.js @@ -0,0 +1,32 @@ +(function () { + "use strict"; + + if ( + document.documentElement instanceof HTMLHtmlElement && + matchMedia("(prefers-color-scheme: dark)").matches && + !document.querySelector(".darkreader--fallback") + ) { + const css = + 'html, body, body :not(iframe):not(div[style^="position:absolute;top:0;left:-"]) { background-color: #181a1b !important; border-color: #776e62 !important; color: #e8e6e3 !important; } html, body { opacity: 1 !important; transition: none !important; }'; + const fallback = document.createElement("style"); + fallback.classList.add("darkreader"); + fallback.classList.add("darkreader--fallback"); + fallback.media = "screen"; + fallback.textContent = css; + if (document.head) { + document.head.append(fallback); + } else { + const root = document.documentElement; + root.append(fallback); + const observer = new MutationObserver(() => { + if (document.head) { + observer.disconnect(); + if (fallback.isConnected) { + document.head.append(fallback); + } + } + }); + observer.observe(root, {childList: true}); + } + } +})(); diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/inject/index.js b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/inject/index.js new file mode 100644 index 0000000..1d18120 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/inject/index.js @@ -0,0 +1,6475 @@ +(function () { + "use strict"; + + var MessageType; + (function (MessageType) { + MessageType["UI_GET_DATA"] = "ui-get-data"; + MessageType["UI_SUBSCRIBE_TO_CHANGES"] = "ui-subscribe-to-changes"; + MessageType["UI_UNSUBSCRIBE_FROM_CHANGES"] = + "ui-unsubscribe-from-changes"; + MessageType["UI_CHANGE_SETTINGS"] = "ui-change-settings"; + MessageType["UI_SET_THEME"] = "ui-set-theme"; + MessageType["UI_SET_SHORTCUT"] = "ui-set-shortcut"; + MessageType["UI_TOGGLE_ACTIVE_TAB"] = "ui-toggle-active-tab"; + MessageType["UI_MARK_NEWS_AS_READ"] = "ui-mark-news-as-read"; + MessageType["UI_MARK_NEWS_AS_DISPLAYED"] = "ui-mark-news-as-displayed"; + MessageType["UI_LOAD_CONFIG"] = "ui-load-config"; + MessageType["UI_APPLY_DEV_DYNAMIC_THEME_FIXES"] = + "ui-apply-dev-dynamic-theme-fixes"; + MessageType["UI_RESET_DEV_DYNAMIC_THEME_FIXES"] = + "ui-reset-dev-dynamic-theme-fixes"; + MessageType["UI_APPLY_DEV_INVERSION_FIXES"] = + "ui-apply-dev-inversion-fixes"; + MessageType["UI_RESET_DEV_INVERSION_FIXES"] = + "ui-reset-dev-inversion-fixes"; + MessageType["UI_APPLY_DEV_STATIC_THEMES"] = + "ui-apply-dev-static-themes"; + MessageType["UI_RESET_DEV_STATIC_THEMES"] = + "ui-reset-dev-static-themes"; + MessageType["UI_SAVE_FILE"] = "ui-save-file"; + MessageType["UI_REQUEST_EXPORT_CSS"] = "ui-request-export-css"; + MessageType["UI_COLOR_SCHEME_CHANGE"] = "ui-color-scheme-change"; + MessageType["BG_CHANGES"] = "bg-changes"; + MessageType["BG_ADD_CSS_FILTER"] = "bg-add-css-filter"; + MessageType["BG_ADD_STATIC_THEME"] = "bg-add-static-theme"; + MessageType["BG_ADD_SVG_FILTER"] = "bg-add-svg-filter"; + MessageType["BG_ADD_DYNAMIC_THEME"] = "bg-add-dynamic-theme"; + MessageType["BG_EXPORT_CSS"] = "bg-export-css"; + MessageType["BG_UNSUPPORTED_SENDER"] = "bg-unsupported-sender"; + MessageType["BG_CLEAN_UP"] = "bg-clean-up"; + MessageType["BG_RELOAD"] = "bg-reload"; + MessageType["BG_FETCH_RESPONSE"] = "bg-fetch-response"; + MessageType["BG_UI_UPDATE"] = "bg-ui-update"; + MessageType["BG_CSS_UPDATE"] = "bg-css-update"; + MessageType["CS_COLOR_SCHEME_CHANGE"] = "cs-color-scheme-change"; + MessageType["CS_FRAME_CONNECT"] = "cs-frame-connect"; + MessageType["CS_FRAME_FORGET"] = "cs-frame-forget"; + MessageType["CS_FRAME_FREEZE"] = "cs-frame-freeze"; + MessageType["CS_FRAME_RESUME"] = "cs-frame-resume"; + MessageType["CS_EXPORT_CSS_RESPONSE"] = "cs-export-css-response"; + MessageType["CS_FETCH"] = "cs-fetch"; + MessageType["CS_DARK_THEME_DETECTED"] = "cs-dark-theme-detected"; + MessageType["CS_DARK_THEME_NOT_DETECTED"] = + "cs-dark-theme-not-detected"; + MessageType["CS_LOG"] = "cs-log"; + })(MessageType || (MessageType = {})); + + function logInfo(...args) {} + function logWarn(...args) {} + + function throttle(callback) { + let pending = false; + let frameId = null; + let lastArgs; + const throttled = (...args) => { + lastArgs = args; + if (frameId) { + pending = true; + } else { + callback(...lastArgs); + frameId = requestAnimationFrame(() => { + frameId = null; + if (pending) { + callback(...lastArgs); + pending = false; + } + }); + } + }; + const cancel = () => { + cancelAnimationFrame(frameId); + pending = false; + frameId = null; + }; + return Object.assign(throttled, {cancel}); + } + function createAsyncTasksQueue() { + const tasks = []; + let frameId = null; + function runTasks() { + let task; + while ((task = tasks.shift())) { + task(); + } + frameId = null; + } + function add(task) { + tasks.push(task); + if (!frameId) { + frameId = requestAnimationFrame(runTasks); + } + } + function cancel() { + tasks.splice(0); + cancelAnimationFrame(frameId); + frameId = null; + } + return {add, cancel}; + } + + function isArrayLike(items) { + return items.length != null; + } + function forEach(items, iterator) { + if (isArrayLike(items)) { + for (let i = 0, len = items.length; i < len; i++) { + iterator(items[i]); + } + } else { + for (const item of items) { + iterator(item); + } + } + } + function push(array, addition) { + forEach(addition, (a) => array.push(a)); + } + function toArray(items) { + const results = []; + for (let i = 0, len = items.length; i < len; i++) { + results.push(items[i]); + } + return results; + } + + function getDuration(time) { + let duration = 0; + if (time.seconds) { + duration += time.seconds * 1000; + } + if (time.minutes) { + duration += time.minutes * 60 * 1000; + } + if (time.hours) { + duration += time.hours * 60 * 60 * 1000; + } + if (time.days) { + duration += time.days * 24 * 60 * 60 * 1000; + } + return duration; + } + + function createNodeAsap({ + selectNode, + createNode, + updateNode, + selectTarget, + createTarget, + isTargetMutation + }) { + const target = selectTarget(); + if (target) { + const prev = selectNode(); + if (prev) { + updateNode(prev); + } else { + createNode(target); + } + } else { + const observer = new MutationObserver((mutations) => { + const mutation = mutations.find(isTargetMutation); + if (mutation) { + unsubscribe(); + const target = selectTarget(); + selectNode() || createNode(target); + } + }); + const ready = () => { + if (document.readyState !== "complete") { + return; + } + unsubscribe(); + const target = selectTarget() || createTarget(); + selectNode() || createNode(target); + }; + const unsubscribe = () => { + document.removeEventListener("readystatechange", ready); + observer.disconnect(); + }; + if (document.readyState === "complete") { + ready(); + } else { + document.addEventListener("readystatechange", ready); + observer.observe(document, {childList: true, subtree: true}); + } + } + } + function removeNode(node) { + node && node.parentNode && node.parentNode.removeChild(node); + } + function watchForNodePosition(node, mode, onRestore = Function.prototype) { + const MAX_ATTEMPTS_COUNT = 10; + const RETRY_TIMEOUT = getDuration({seconds: 2}); + const ATTEMPTS_INTERVAL = getDuration({seconds: 10}); + const prevSibling = node.previousSibling; + let parent = node.parentNode; + if (!parent) { + throw new Error( + "Unable to watch for node position: parent element not found" + ); + } + if (mode === "prev-sibling" && !prevSibling) { + throw new Error( + "Unable to watch for node position: there is no previous sibling" + ); + } + let attempts = 0; + let start = null; + let timeoutId = null; + const restore = throttle(() => { + if (timeoutId) { + return; + } + attempts++; + const now = Date.now(); + if (start == null) { + start = now; + } else if (attempts >= MAX_ATTEMPTS_COUNT) { + if (now - start < ATTEMPTS_INTERVAL) { + timeoutId = setTimeout(() => { + start = null; + attempts = 0; + timeoutId = null; + restore(); + }, RETRY_TIMEOUT); + return; + } + start = now; + attempts = 1; + } + if (mode === "parent") { + if (prevSibling && prevSibling.parentNode !== parent) { + stop(); + return; + } + } + if (mode === "prev-sibling") { + if (prevSibling.parentNode == null) { + stop(); + return; + } + if (prevSibling.parentNode !== parent) { + updateParent(prevSibling.parentNode); + } + } + parent.insertBefore( + node, + prevSibling ? prevSibling.nextSibling : parent.firstChild + ); + observer.takeRecords(); + onRestore && onRestore(); + }); + const observer = new MutationObserver(() => { + if ( + (mode === "parent" && node.parentNode !== parent) || + (mode === "prev-sibling" && + node.previousSibling !== prevSibling) + ) { + restore(); + } + }); + const run = () => { + observer.observe(parent, {childList: true}); + }; + const stop = () => { + clearTimeout(timeoutId); + observer.disconnect(); + restore.cancel(); + }; + const skip = () => { + observer.takeRecords(); + }; + const updateParent = (parentNode) => { + parent = parentNode; + stop(); + run(); + }; + run(); + return {run, stop, skip}; + } + function iterateShadowHosts(root, iterator) { + if (root == null) { + return; + } + const walker = document.createTreeWalker( + root, + NodeFilter.SHOW_ELEMENT, + { + acceptNode(node) { + return node.shadowRoot == null + ? NodeFilter.FILTER_SKIP + : NodeFilter.FILTER_ACCEPT; + } + } + ); + for ( + let node = root.shadowRoot ? walker.currentNode : walker.nextNode(); + node != null; + node = walker.nextNode() + ) { + if (node.classList.contains("surfingkeys_hints_host")) { + continue; + } + iterator(node); + iterateShadowHosts(node.shadowRoot, iterator); + } + } + let isDOMReady = () => { + return ( + document.readyState === "complete" || + document.readyState === "interactive" + ); + }; + function setIsDOMReady(newFunc) { + isDOMReady = newFunc; + } + const readyStateListeners = new Set(); + function addDOMReadyListener(listener) { + isDOMReady() ? listener() : readyStateListeners.add(listener); + } + function removeDOMReadyListener(listener) { + readyStateListeners.delete(listener); + } + function isReadyStateComplete() { + return document.readyState === "complete"; + } + const readyStateCompleteListeners = new Set(); + function addReadyStateCompleteListener(listener) { + isReadyStateComplete() + ? listener() + : readyStateCompleteListeners.add(listener); + } + function cleanReadyStateCompleteListeners() { + readyStateCompleteListeners.clear(); + } + if (!isDOMReady()) { + const onReadyStateChange = () => { + if (isDOMReady()) { + readyStateListeners.forEach((listener) => listener()); + readyStateListeners.clear(); + if (isReadyStateComplete()) { + document.removeEventListener( + "readystatechange", + onReadyStateChange + ); + readyStateCompleteListeners.forEach((listener) => + listener() + ); + readyStateCompleteListeners.clear(); + } + } + }; + document.addEventListener("readystatechange", onReadyStateChange); + } + const HUGE_MUTATIONS_COUNT = 1000; + function isHugeMutation(mutations) { + if (mutations.length > HUGE_MUTATIONS_COUNT) { + return true; + } + let addedNodesCount = 0; + for (let i = 0; i < mutations.length; i++) { + addedNodesCount += mutations[i].addedNodes.length; + if (addedNodesCount > HUGE_MUTATIONS_COUNT) { + return true; + } + } + return false; + } + function getElementsTreeOperations(mutations) { + const additions = new Set(); + const deletions = new Set(); + const moves = new Set(); + mutations.forEach((m) => { + forEach(m.addedNodes, (n) => { + if (n instanceof Element && n.isConnected) { + additions.add(n); + } + }); + forEach(m.removedNodes, (n) => { + if (n instanceof Element) { + if (n.isConnected) { + moves.add(n); + additions.delete(n); + } else { + deletions.add(n); + } + } + }); + }); + const duplicateAdditions = []; + const duplicateDeletions = []; + additions.forEach((node) => { + if (additions.has(node.parentElement)) { + duplicateAdditions.push(node); + } + }); + deletions.forEach((node) => { + if (deletions.has(node.parentElement)) { + duplicateDeletions.push(node); + } + }); + duplicateAdditions.forEach((node) => additions.delete(node)); + duplicateDeletions.forEach((node) => deletions.delete(node)); + return {additions, moves, deletions}; + } + const optimizedTreeObservers = new Map(); + const optimizedTreeCallbacks = new WeakMap(); + function createOptimizedTreeObserver(root, callbacks) { + let observer; + let observerCallbacks; + let domReadyListener; + if (optimizedTreeObservers.has(root)) { + observer = optimizedTreeObservers.get(root); + observerCallbacks = optimizedTreeCallbacks.get(observer); + } else { + let hadHugeMutationsBefore = false; + let subscribedForReadyState = false; + observer = new MutationObserver((mutations) => { + if (isHugeMutation(mutations)) { + if (!hadHugeMutationsBefore || isDOMReady()) { + observerCallbacks.forEach(({onHugeMutations}) => + onHugeMutations(root) + ); + } else if (!subscribedForReadyState) { + domReadyListener = () => + observerCallbacks.forEach(({onHugeMutations}) => + onHugeMutations(root) + ); + addDOMReadyListener(domReadyListener); + subscribedForReadyState = true; + } + hadHugeMutationsBefore = true; + } else { + const elementsOperations = + getElementsTreeOperations(mutations); + observerCallbacks.forEach(({onMinorMutations}) => + onMinorMutations(elementsOperations) + ); + } + }); + observer.observe(root, {childList: true, subtree: true}); + optimizedTreeObservers.set(root, observer); + observerCallbacks = new Set(); + optimizedTreeCallbacks.set(observer, observerCallbacks); + } + observerCallbacks.add(callbacks); + return { + disconnect() { + observerCallbacks.delete(callbacks); + if (domReadyListener) { + removeDOMReadyListener(domReadyListener); + } + if (observerCallbacks.size === 0) { + observer.disconnect(); + optimizedTreeCallbacks.delete(observer); + optimizedTreeObservers.delete(root); + } + } + }; + } + + function createOrUpdateStyle$1(css, type) { + createNodeAsap({ + selectNode: () => document.getElementById("dark-reader-style"), + createNode: (target) => { + document.documentElement.setAttribute( + "data-darkreader-mode", + type + ); + const style = document.createElement("style"); + style.id = "dark-reader-style"; + style.classList.add("darkreader"); + style.type = "text/css"; + style.textContent = css; + target.appendChild(style); + }, + updateNode: (existing) => { + if ( + css.replace(/^\s+/gm, "") !== + existing.textContent.replace(/^\s+/gm, "") + ) { + existing.textContent = css; + } + }, + selectTarget: () => document.head, + createTarget: () => { + const head = document.createElement("head"); + document.documentElement.insertBefore( + head, + document.documentElement.firstElementChild + ); + return head; + }, + isTargetMutation: (mutation) => + mutation.target.nodeName.toLowerCase() === "head" + }); + } + function removeStyle() { + removeNode(document.getElementById("dark-reader-style")); + document.documentElement.removeAttribute("data-darkreader-mode"); + } + + function createOrUpdateSVGFilter(svgMatrix, svgReverseMatrix) { + createNodeAsap({ + selectNode: () => document.getElementById("dark-reader-svg"), + createNode: (target) => { + const SVG_NS = "http://www.w3.org/2000/svg"; + const createMatrixFilter = (id, matrix) => { + const filter = document.createElementNS(SVG_NS, "filter"); + filter.id = id; + filter.style.colorInterpolationFilters = "sRGB"; + filter.setAttribute("x", "0"); + filter.setAttribute("y", "0"); + filter.setAttribute("width", "99999"); + filter.setAttribute("height", "99999"); + filter.appendChild(createColorMatrix(matrix)); + return filter; + }; + const createColorMatrix = (matrix) => { + const colorMatrix = document.createElementNS( + SVG_NS, + "feColorMatrix" + ); + colorMatrix.setAttribute("type", "matrix"); + colorMatrix.setAttribute("values", matrix); + return colorMatrix; + }; + const svg = document.createElementNS(SVG_NS, "svg"); + svg.id = "dark-reader-svg"; + svg.style.height = "0"; + svg.style.width = "0"; + svg.appendChild( + createMatrixFilter("dark-reader-filter", svgMatrix) + ); + svg.appendChild( + createMatrixFilter( + "dark-reader-reverse-filter", + svgReverseMatrix + ) + ); + target.appendChild(svg); + }, + updateNode: (existing) => { + const existingMatrix = existing.firstChild.firstChild; + if (existingMatrix.getAttribute("values") !== svgMatrix) { + existingMatrix.setAttribute("values", svgMatrix); + const style = document.getElementById("dark-reader-style"); + const css = style.textContent; + style.textContent = ""; + style.textContent = css; + } + }, + selectTarget: () => document.head, + createTarget: () => { + const head = document.createElement("head"); + document.documentElement.insertBefore( + head, + document.documentElement.firstElementChild + ); + return head; + }, + isTargetMutation: (mutation) => + mutation.target.nodeName.toLowerCase() === "head" + }); + } + function removeSVGFilter() { + removeNode(document.getElementById("dark-reader-svg")); + } + + function evalMath(expression) { + const rpnStack = []; + const workingStack = []; + let lastToken; + for (let i = 0, len = expression.length; i < len; i++) { + const token = expression[i]; + if (!token || token === " ") { + continue; + } + if (operators.has(token)) { + const op = operators.get(token); + while (workingStack.length) { + const currentOp = operators.get(workingStack[0]); + if (!currentOp) { + break; + } + if (op.lessOrEqualThan(currentOp)) { + rpnStack.push(workingStack.shift()); + } else { + break; + } + } + workingStack.unshift(token); + } else if (!lastToken || operators.has(lastToken)) { + rpnStack.push(token); + } else { + rpnStack[rpnStack.length - 1] += token; + } + lastToken = token; + } + rpnStack.push(...workingStack); + const stack = []; + for (let i = 0, len = rpnStack.length; i < len; i++) { + const op = operators.get(rpnStack[i]); + if (op) { + const args = stack.splice(0, 2); + stack.push(op.exec(args[1], args[0])); + } else { + stack.unshift(parseFloat(rpnStack[i])); + } + } + return stack[0]; + } + class Operator { + constructor(precedence, method) { + this.precendce = precedence; + this.execMethod = method; + } + exec(left, right) { + return this.execMethod(left, right); + } + lessOrEqualThan(op) { + return this.precendce <= op.precendce; + } + } + const operators = new Map([ + ["+", new Operator(1, (left, right) => left + right)], + ["-", new Operator(1, (left, right) => left - right)], + ["*", new Operator(2, (left, right) => left * right)], + ["/", new Operator(2, (left, right) => left / right)] + ]); + + function getMatches(regex, input, group = 0) { + const matches = []; + let m; + while ((m = regex.exec(input))) { + matches.push(m[group]); + } + return matches; + } + function formatCSS(text) { + function trimLeft(text) { + return text.replace(/^\s+/, ""); + } + function getIndent(depth) { + if (depth === 0) { + return ""; + } + return " ".repeat(4 * depth); + } + if (text.length < 50000) { + const emptyRuleRegexp = /[^{}]+{\s*}/; + while (emptyRuleRegexp.test(text)) { + text = text.replace(emptyRuleRegexp, ""); + } + } + const css = text + .replace(/\s{2,}/g, " ") + .replace(/\{/g, "{\n") + .replace(/\}/g, "\n}\n") + .replace(/\;(?![^\(|\"]*(\)|\"))/g, ";\n") + .replace(/\,(?![^\(|\"]*(\)|\"))/g, ",\n") + .replace(/\n\s*\n/g, "\n") + .split("\n"); + let depth = 0; + const formatted = []; + for (let x = 0, len = css.length; x < len; x++) { + const line = `${css[x]}\n`; + if (line.includes("{")) { + formatted.push(getIndent(depth++) + trimLeft(line)); + } else if (line.includes("}")) { + formatted.push(getIndent(--depth) + trimLeft(line)); + } else { + formatted.push(getIndent(depth) + trimLeft(line)); + } + } + return formatted.join("").trim(); + } + function getParenthesesRange(input, searchStartIndex = 0) { + const length = input.length; + let depth = 0; + let firstOpenIndex = -1; + for (let i = searchStartIndex; i < length; i++) { + if (depth === 0) { + const openIndex = input.indexOf("(", i); + if (openIndex < 0) { + break; + } + firstOpenIndex = openIndex; + depth++; + i = openIndex; + } else { + const closingIndex = input.indexOf(")", i); + if (closingIndex < 0) { + break; + } + const openIndex = input.indexOf("(", i); + if (openIndex < 0 || closingIndex < openIndex) { + depth--; + if (depth === 0) { + return {start: firstOpenIndex, end: closingIndex + 1}; + } + i = closingIndex; + } else { + depth++; + i = openIndex; + } + } + } + return null; + } + + const hslaParseCache = new Map(); + const rgbaParseCache = new Map(); + function parseColorWithCache($color) { + $color = $color.trim(); + if (rgbaParseCache.has($color)) { + return rgbaParseCache.get($color); + } + if ($color.includes("calc(")) { + $color = lowerCalcExpression($color); + } + const color = parse($color); + color && rgbaParseCache.set($color, color); + return color; + } + function parseToHSLWithCache(color) { + if (hslaParseCache.has(color)) { + return hslaParseCache.get(color); + } + const rgb = parseColorWithCache(color); + if (!rgb) { + return null; + } + const hsl = rgbToHSL(rgb); + hslaParseCache.set(color, hsl); + return hsl; + } + function clearColorCache() { + hslaParseCache.clear(); + rgbaParseCache.clear(); + } + function hslToRGB({h, s, l, a = 1}) { + if (s === 0) { + const [r, b, g] = [l, l, l].map((x) => Math.round(x * 255)); + return {r, g, b, a}; + } + const c = (1 - Math.abs(2 * l - 1)) * s; + const x = c * (1 - Math.abs(((h / 60) % 2) - 1)); + const m = l - c / 2; + const [r, g, b] = ( + h < 60 + ? [c, x, 0] + : h < 120 + ? [x, c, 0] + : h < 180 + ? [0, c, x] + : h < 240 + ? [0, x, c] + : h < 300 + ? [x, 0, c] + : [c, 0, x] + ).map((n) => Math.round((n + m) * 255)); + return {r, g, b, a}; + } + function rgbToHSL({r: r255, g: g255, b: b255, a = 1}) { + const r = r255 / 255; + const g = g255 / 255; + const b = b255 / 255; + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + const c = max - min; + const l = (max + min) / 2; + if (c === 0) { + return {h: 0, s: 0, l, a}; + } + let h = + (max === r + ? ((g - b) / c) % 6 + : max === g + ? (b - r) / c + 2 + : (r - g) / c + 4) * 60; + if (h < 0) { + h += 360; + } + const s = c / (1 - Math.abs(2 * l - 1)); + return {h, s, l, a}; + } + function toFixed(n, digits = 0) { + const fixed = n.toFixed(digits); + if (digits === 0) { + return fixed; + } + const dot = fixed.indexOf("."); + if (dot >= 0) { + const zerosMatch = fixed.match(/0+$/); + if (zerosMatch) { + if (zerosMatch.index === dot + 1) { + return fixed.substring(0, dot); + } + return fixed.substring(0, zerosMatch.index); + } + } + return fixed; + } + function rgbToString(rgb) { + const {r, g, b, a} = rgb; + if (a != null && a < 1) { + return `rgba(${toFixed(r)}, ${toFixed(g)}, ${toFixed(b)}, ${toFixed( + a, + 2 + )})`; + } + return `rgb(${toFixed(r)}, ${toFixed(g)}, ${toFixed(b)})`; + } + function rgbToHexString({r, g, b, a}) { + return `#${(a != null && a < 1 + ? [r, g, b, Math.round(a * 255)] + : [r, g, b] + ) + .map((x) => { + return `${x < 16 ? "0" : ""}${x.toString(16)}`; + }) + .join("")}`; + } + function hslToString(hsl) { + const {h, s, l, a} = hsl; + if (a != null && a < 1) { + return `hsla(${toFixed(h)}, ${toFixed(s * 100)}%, ${toFixed( + l * 100 + )}%, ${toFixed(a, 2)})`; + } + return `hsl(${toFixed(h)}, ${toFixed(s * 100)}%, ${toFixed(l * 100)}%)`; + } + const rgbMatch = /^rgba?\([^\(\)]+\)$/; + const hslMatch = /^hsla?\([^\(\)]+\)$/; + const hexMatch = /^#[0-9a-f]+$/i; + function parse($color) { + const c = $color.trim().toLowerCase(); + if (c.match(rgbMatch)) { + return parseRGB(c); + } + if (c.match(hslMatch)) { + return parseHSL(c); + } + if (c.match(hexMatch)) { + return parseHex(c); + } + if (knownColors.has(c)) { + return getColorByName(c); + } + if (systemColors.has(c)) { + return getSystemColor(c); + } + if ($color === "transparent") { + return {r: 0, g: 0, b: 0, a: 0}; + } + return null; + } + function getNumbers($color) { + const numbers = []; + let prevPos = 0; + let isMining = false; + const startIndex = $color.indexOf("("); + $color = $color.substring(startIndex + 1, $color.length - 1); + for (let i = 0; i < $color.length; i++) { + const c = $color[i]; + if ((c >= "0" && c <= "9") || c === "." || c === "+" || c === "-") { + isMining = true; + } else if (isMining && (c === " " || c === ",")) { + numbers.push($color.substring(prevPos, i)); + isMining = false; + prevPos = i + 1; + } else if (!isMining) { + prevPos = i + 1; + } + } + if (isMining) { + numbers.push($color.substring(prevPos, $color.length)); + } + return numbers; + } + function getNumbersFromString(str, range, units) { + const raw = getNumbers(str); + const unitsList = Object.entries(units); + const numbers = raw + .map((r) => r.trim()) + .map((r, i) => { + let n; + const unit = unitsList.find(([u]) => r.endsWith(u)); + if (unit) { + n = + (parseFloat(r.substring(0, r.length - unit[0].length)) / + unit[1]) * + range[i]; + } else { + n = parseFloat(r); + } + if (range[i] > 1) { + return Math.round(n); + } + return n; + }); + return numbers; + } + const rgbRange = [255, 255, 255, 1]; + const rgbUnits = {"%": 100}; + function parseRGB($rgb) { + const [r, g, b, a = 1] = getNumbersFromString($rgb, rgbRange, rgbUnits); + return {r, g, b, a}; + } + const hslRange = [360, 1, 1, 1]; + const hslUnits = {"%": 100, "deg": 360, "rad": 2 * Math.PI, "turn": 1}; + function parseHSL($hsl) { + const [h, s, l, a = 1] = getNumbersFromString($hsl, hslRange, hslUnits); + return hslToRGB({h, s, l, a}); + } + function parseHex($hex) { + const h = $hex.substring(1); + switch (h.length) { + case 3: + case 4: { + const [r, g, b] = [0, 1, 2].map((i) => + parseInt(`${h[i]}${h[i]}`, 16) + ); + const a = + h.length === 3 ? 1 : parseInt(`${h[3]}${h[3]}`, 16) / 255; + return {r, g, b, a}; + } + case 6: + case 8: { + const [r, g, b] = [0, 2, 4].map((i) => + parseInt(h.substring(i, i + 2), 16) + ); + const a = + h.length === 6 ? 1 : parseInt(h.substring(6, 8), 16) / 255; + return {r, g, b, a}; + } + } + return null; + } + function getColorByName($color) { + const n = knownColors.get($color); + return { + r: (n >> 16) & 255, + g: (n >> 8) & 255, + b: (n >> 0) & 255, + a: 1 + }; + } + function getSystemColor($color) { + const n = systemColors.get($color); + return { + r: (n >> 16) & 255, + g: (n >> 8) & 255, + b: (n >> 0) & 255, + a: 1 + }; + } + function lowerCalcExpression(color) { + let searchIndex = 0; + const replaceBetweenIndices = (start, end, replacement) => { + color = + color.substring(0, start) + replacement + color.substring(end); + }; + while ((searchIndex = color.indexOf("calc(")) !== -1) { + const range = getParenthesesRange(color, searchIndex); + if (!range) { + break; + } + let slice = color.slice(range.start + 1, range.end - 1); + const includesPercentage = slice.includes("%"); + slice = slice.split("%").join(""); + const output = Math.round(evalMath(slice)); + replaceBetweenIndices( + range.start - 4, + range.end, + output + (includesPercentage ? "%" : "") + ); + } + return color; + } + const knownColors = new Map( + Object.entries({ + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgrey: 0xa9a9a9, + darkgreen: 0x006400, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + grey: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgrey: 0xd3d3d3, + lightgreen: 0x90ee90, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 + }) + ); + const systemColors = new Map( + Object.entries({ + "ActiveBorder": 0x3b99fc, + "ActiveCaption": 0x000000, + "AppWorkspace": 0xaaaaaa, + "Background": 0x6363ce, + "ButtonFace": 0xffffff, + "ButtonHighlight": 0xe9e9e9, + "ButtonShadow": 0x9fa09f, + "ButtonText": 0x000000, + "CaptionText": 0x000000, + "GrayText": 0x7f7f7f, + "Highlight": 0xb2d7ff, + "HighlightText": 0x000000, + "InactiveBorder": 0xffffff, + "InactiveCaption": 0xffffff, + "InactiveCaptionText": 0x000000, + "InfoBackground": 0xfbfcc5, + "InfoText": 0x000000, + "Menu": 0xf6f6f6, + "MenuText": 0xffffff, + "Scrollbar": 0xaaaaaa, + "ThreeDDarkShadow": 0x000000, + "ThreeDFace": 0xc0c0c0, + "ThreeDHighlight": 0xffffff, + "ThreeDLightShadow": 0xffffff, + "ThreeDShadow": 0x000000, + "Window": 0xececec, + "WindowFrame": 0xaaaaaa, + "WindowText": 0x000000, + "-webkit-focus-ring-color": 0xe59700 + }).map(([key, value]) => [key.toLowerCase(), value]) + ); + function getSRGBLightness(r, g, b) { + return (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255; + } + + function hasBuiltInDarkTheme() { + const drStyles = document.querySelectorAll(".darkreader"); + drStyles.forEach((style) => (style.disabled = true)); + const rootColor = parseColorWithCache( + getComputedStyle(document.documentElement).backgroundColor + ); + const bodyColor = document.body + ? parseColorWithCache( + getComputedStyle(document.body).backgroundColor + ) + : {r: 0, g: 0, b: 0, a: 0}; + const rootLightness = + 1 - + rootColor.a + + rootColor.a * + getSRGBLightness(rootColor.r, rootColor.g, rootColor.b); + const finalLightness = + (1 - bodyColor.a) * rootLightness + + bodyColor.a * + getSRGBLightness(bodyColor.r, bodyColor.g, bodyColor.b); + const darkThemeDetected = finalLightness < 0.5; + drStyles.forEach((style) => (style.disabled = false)); + return darkThemeDetected; + } + function runCheck(callback) { + const darkThemeDetected = hasBuiltInDarkTheme(); + callback(darkThemeDetected); + } + function hasSomeStyle() { + if ( + document.documentElement.style.backgroundColor || + (document.body && document.body.style.backgroundColor) + ) { + return true; + } + for (const style of document.styleSheets) { + if ( + style && + style.ownerNode && + !style.ownerNode.classList.contains("darkreader") + ) { + return true; + } + } + return false; + } + let observer$1; + let readyStateListener; + function runDarkThemeDetector(callback) { + stopDarkThemeDetector(); + if (document.body && hasSomeStyle()) { + runCheck(callback); + return; + } + observer$1 = new MutationObserver(() => { + if (document.body && hasSomeStyle()) { + stopDarkThemeDetector(); + runCheck(callback); + } + }); + observer$1.observe(document.documentElement, {childList: true}); + if (document.readyState !== "complete") { + readyStateListener = () => { + if (document.readyState === "complete") { + stopDarkThemeDetector(); + runCheck(callback); + } + }; + document.addEventListener("readystatechange", readyStateListener); + } + } + function stopDarkThemeDetector() { + if (observer$1) { + observer$1.disconnect(); + observer$1 = null; + } + if (readyStateListener) { + document.removeEventListener( + "readystatechange", + readyStateListener + ); + readyStateListener = null; + } + } + + const isNavigatorDefined = typeof navigator !== "undefined"; + const userAgent = isNavigatorDefined + ? navigator.userAgentData && + Array.isArray(navigator.userAgentData.brands) + ? navigator.userAgentData.brands + .map( + (brand) => `${brand.brand.toLowerCase()} ${brand.version}` + ) + .join(" ") + : navigator.userAgent.toLowerCase() + : "some useragent"; + const platform = isNavigatorDefined + ? navigator.userAgentData && + typeof navigator.userAgentData.platform === "string" + ? navigator.userAgentData.platform.toLowerCase() + : navigator.platform.toLowerCase() + : "some platform"; + const isThunderbird = userAgent.includes("thunderbird"); + const isFirefox = + userAgent.includes("firefox") || + userAgent.includes("librewolf") || + isThunderbird; + userAgent.includes("vivaldi"); + userAgent.includes("yabrowser"); + userAgent.includes("opr") || userAgent.includes("opera"); + userAgent.includes("edg"); + const isSafari = !true; + platform.startsWith("win"); + platform.startsWith("mac"); + isNavigatorDefined && navigator.userAgentData + ? navigator.userAgentData.mobile + : userAgent.includes("mobile"); + const isShadowDomSupported = typeof ShadowRoot === "function"; + const isMatchMediaChangeEventListenerSupported = + typeof MediaQueryList === "function" && + typeof MediaQueryList.prototype.addEventListener === "function"; + (() => { + const m = userAgent.match(/chrom(?:e|ium)(?:\/| )([^ ]+)/); + if (m && m[1]) { + return m[1]; + } + return ""; + })(); + (() => { + const m = userAgent.match(/(?:firefox|librewolf)(?:\/| )([^ ]+)/); + if (m && m[1]) { + return m[1]; + } + return ""; + })(); + const isDefinedSelectorSupported = (() => { + try { + document.querySelector(":defined"); + return true; + } catch (err) { + return false; + } + })(); + const isCSSColorSchemePropSupported = (() => { + if (typeof document === "undefined") { + return false; + } + const el = document.createElement("div"); + el.setAttribute("style", "color-scheme: dark"); + return el.style && el.style.colorScheme === "dark"; + })(); + + let anchor; + const parsedURLCache = new Map(); + function fixBaseURL($url) { + if (!anchor) { + anchor = document.createElement("a"); + } + anchor.href = $url; + return anchor.href; + } + function parseURL($url, $base = null) { + const key = `${$url}${$base ? `;${$base}` : ""}`; + if (parsedURLCache.has(key)) { + return parsedURLCache.get(key); + } + if ($base) { + const parsedURL = new URL($url, fixBaseURL($base)); + parsedURLCache.set(key, parsedURL); + return parsedURL; + } + const parsedURL = new URL(fixBaseURL($url)); + parsedURLCache.set($url, parsedURL); + return parsedURL; + } + function getAbsoluteURL($base, $relative) { + if ($relative.match(/^data\\?\:/)) { + return $relative; + } + if (/^\/\//.test($relative)) { + return `${location.protocol}${$relative}`; + } + const b = parseURL($base); + const a = parseURL($relative, b.href); + return a.href; + } + function isRelativeHrefOnAbsolutePath(href) { + if (href.startsWith("data:")) { + return true; + } + const url = parseURL(href); + if (url.protocol !== location.protocol) { + return false; + } + if (url.hostname !== location.hostname) { + return false; + } + if (url.port !== location.port) { + return false; + } + return url.pathname === location.pathname; + } + + function iterateCSSRules(rules, iterate, onMediaRuleError) { + forEach(rules, (rule) => { + if (rule.selectorText) { + iterate(rule); + } else if (rule.href) { + try { + iterateCSSRules( + rule.styleSheet.cssRules, + iterate, + onMediaRuleError + ); + } catch (err) { + onMediaRuleError && onMediaRuleError(); + } + } else if (rule.media) { + const media = Array.from(rule.media); + const isScreenOrAllOrQuery = media.some( + (m) => + m.startsWith("screen") || + m.startsWith("all") || + m.startsWith("(") + ); + const isPrintOrSpeech = media.some( + (m) => m.startsWith("print") || m.startsWith("speech") + ); + if (isScreenOrAllOrQuery || !isPrintOrSpeech) { + iterateCSSRules(rule.cssRules, iterate, onMediaRuleError); + } + } else if (rule.conditionText) { + if (CSS.supports(rule.conditionText)) { + iterateCSSRules(rule.cssRules, iterate, onMediaRuleError); + } + } else; + }); + } + const shorthandVarDependantProperties = [ + "background", + "border", + "border-color", + "border-bottom", + "border-left", + "border-right", + "border-top", + "outline", + "outline-color" + ]; + function iterateCSSDeclarations(style, iterate) { + forEach(style, (property) => { + const value = style.getPropertyValue(property).trim(); + if (!value) { + return; + } + iterate(property, value); + }); + const cssText = style.cssText; + if (cssText.includes("var(")) { + { + shorthandVarDependantProperties.forEach((prop) => { + const val = style.getPropertyValue(prop); + if (val && val.includes("var(")) { + iterate(prop, val); + } + }); + } + } + } + const cssURLRegex = /url\((('.*?')|(".*?")|([^\)]*?))\)/g; + const cssImportRegex = + /@import\s*(url\()?(('.+?')|(".+?")|([^\)]*?))\)? ?(screen)?;?/gi; + function getCSSURLValue(cssURL) { + return cssURL + .trim() + .replace(/[\n\r\\]+/g, "") + .replace(/^url\((.*)\)$/, "$1") + .trim() + .replace(/^"(.*)"$/, "$1") + .replace(/^'(.*)'$/, "$1") + .replace(/(?:\\(.))/g, "$1"); + } + function getCSSBaseBath(url) { + const cssURL = parseURL(url); + return `${cssURL.origin}${cssURL.pathname + .replace(/\?.*$/, "") + .replace(/(\/)([^\/]+)$/i, "$1")}`; + } + function replaceCSSRelativeURLsWithAbsolute($css, cssBasePath) { + return $css.replace(cssURLRegex, (match) => { + const pathValue = getCSSURLValue(match); + try { + return `url('${getAbsoluteURL(cssBasePath, pathValue)}')`; + } catch (err) { + return match; + } + }); + } + const cssCommentsRegex = /\/\*[\s\S]*?\*\//g; + function removeCSSComments($css) { + return $css.replace(cssCommentsRegex, ""); + } + const fontFaceRegex = /@font-face\s*{[^}]*}/g; + function replaceCSSFontFace($css) { + return $css.replace(fontFaceRegex, ""); + } + + function scale(x, inLow, inHigh, outLow, outHigh) { + return ((x - inLow) * (outHigh - outLow)) / (inHigh - inLow) + outLow; + } + function clamp(x, min, max) { + return Math.min(max, Math.max(min, x)); + } + function multiplyMatrices(m1, m2) { + const result = []; + for (let i = 0, len = m1.length; i < len; i++) { + result[i] = []; + for (let j = 0, len2 = m2[0].length; j < len2; j++) { + let sum = 0; + for (let k = 0, len3 = m1[0].length; k < len3; k++) { + sum += m1[i][k] * m2[k][j]; + } + result[i][j] = sum; + } + } + return result; + } + + function createFilterMatrix(config) { + let m = Matrix.identity(); + if (config.sepia !== 0) { + m = multiplyMatrices(m, Matrix.sepia(config.sepia / 100)); + } + if (config.grayscale !== 0) { + m = multiplyMatrices(m, Matrix.grayscale(config.grayscale / 100)); + } + if (config.contrast !== 100) { + m = multiplyMatrices(m, Matrix.contrast(config.contrast / 100)); + } + if (config.brightness !== 100) { + m = multiplyMatrices(m, Matrix.brightness(config.brightness / 100)); + } + if (config.mode === 1) { + m = multiplyMatrices(m, Matrix.invertNHue()); + } + return m; + } + function applyColorMatrix([r, g, b], matrix) { + const rgb = [[r / 255], [g / 255], [b / 255], [1], [1]]; + const result = multiplyMatrices(matrix, rgb); + return [0, 1, 2].map((i) => + clamp(Math.round(result[i][0] * 255), 0, 255) + ); + } + const Matrix = { + identity() { + return [ + [1, 0, 0, 0, 0], + [0, 1, 0, 0, 0], + [0, 0, 1, 0, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + invertNHue() { + return [ + [0.333, -0.667, -0.667, 0, 1], + [-0.667, 0.333, -0.667, 0, 1], + [-0.667, -0.667, 0.333, 0, 1], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + brightness(v) { + return [ + [v, 0, 0, 0, 0], + [0, v, 0, 0, 0], + [0, 0, v, 0, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + contrast(v) { + const t = (1 - v) / 2; + return [ + [v, 0, 0, 0, t], + [0, v, 0, 0, t], + [0, 0, v, 0, t], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + sepia(v) { + return [ + [ + 0.393 + 0.607 * (1 - v), + 0.769 - 0.769 * (1 - v), + 0.189 - 0.189 * (1 - v), + 0, + 0 + ], + [ + 0.349 - 0.349 * (1 - v), + 0.686 + 0.314 * (1 - v), + 0.168 - 0.168 * (1 - v), + 0, + 0 + ], + [ + 0.272 - 0.272 * (1 - v), + 0.534 - 0.534 * (1 - v), + 0.131 + 0.869 * (1 - v), + 0, + 0 + ], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + grayscale(v) { + return [ + [ + 0.2126 + 0.7874 * (1 - v), + 0.7152 - 0.7152 * (1 - v), + 0.0722 - 0.0722 * (1 - v), + 0, + 0 + ], + [ + 0.2126 - 0.2126 * (1 - v), + 0.7152 + 0.2848 * (1 - v), + 0.0722 - 0.0722 * (1 - v), + 0, + 0 + ], + [ + 0.2126 - 0.2126 * (1 - v), + 0.7152 - 0.7152 * (1 - v), + 0.0722 + 0.9278 * (1 - v), + 0, + 0 + ], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + } + }; + + function getBgPole(theme) { + const isDarkScheme = theme.mode === 1; + const prop = isDarkScheme + ? "darkSchemeBackgroundColor" + : "lightSchemeBackgroundColor"; + return theme[prop]; + } + function getFgPole(theme) { + const isDarkScheme = theme.mode === 1; + const prop = isDarkScheme + ? "darkSchemeTextColor" + : "lightSchemeTextColor"; + return theme[prop]; + } + const colorModificationCache = new Map(); + function clearColorModificationCache() { + colorModificationCache.clear(); + } + const rgbCacheKeys = ["r", "g", "b", "a"]; + const themeCacheKeys$1 = [ + "mode", + "brightness", + "contrast", + "grayscale", + "sepia", + "darkSchemeBackgroundColor", + "darkSchemeTextColor", + "lightSchemeBackgroundColor", + "lightSchemeTextColor" + ]; + function getCacheId(rgb, theme) { + let resultId = ""; + rgbCacheKeys.forEach((key) => { + resultId += `${rgb[key]};`; + }); + themeCacheKeys$1.forEach((key) => { + resultId += `${theme[key]};`; + }); + return resultId; + } + function modifyColorWithCache( + rgb, + theme, + modifyHSL, + poleColor, + anotherPoleColor + ) { + let fnCache; + if (colorModificationCache.has(modifyHSL)) { + fnCache = colorModificationCache.get(modifyHSL); + } else { + fnCache = new Map(); + colorModificationCache.set(modifyHSL, fnCache); + } + const id = getCacheId(rgb, theme); + if (fnCache.has(id)) { + return fnCache.get(id); + } + const hsl = rgbToHSL(rgb); + const pole = poleColor == null ? null : parseToHSLWithCache(poleColor); + const anotherPole = + anotherPoleColor == null + ? null + : parseToHSLWithCache(anotherPoleColor); + const modified = modifyHSL(hsl, pole, anotherPole); + const {r, g, b, a} = hslToRGB(modified); + const matrix = createFilterMatrix(theme); + const [rf, gf, bf] = applyColorMatrix([r, g, b], matrix); + const color = + a === 1 + ? rgbToHexString({r: rf, g: gf, b: bf}) + : rgbToString({r: rf, g: gf, b: bf, a}); + fnCache.set(id, color); + return color; + } + function noopHSL(hsl) { + return hsl; + } + function modifyColor(rgb, theme) { + return modifyColorWithCache(rgb, theme, noopHSL); + } + function modifyLightSchemeColor(rgb, theme) { + const poleBg = getBgPole(theme); + const poleFg = getFgPole(theme); + return modifyColorWithCache( + rgb, + theme, + modifyLightModeHSL, + poleFg, + poleBg + ); + } + function modifyLightModeHSL({h, s, l, a}, poleFg, poleBg) { + const isDark = l < 0.5; + let isNeutral; + if (isDark) { + isNeutral = l < 0.2 || s < 0.12; + } else { + const isBlue = h > 200 && h < 280; + isNeutral = s < 0.24 || (l > 0.8 && isBlue); + } + let hx = h; + let sx = l; + if (isNeutral) { + if (isDark) { + hx = poleFg.h; + sx = poleFg.s; + } else { + hx = poleBg.h; + sx = poleBg.s; + } + } + const lx = scale(l, 0, 1, poleFg.l, poleBg.l); + return {h: hx, s: sx, l: lx, a}; + } + const MAX_BG_LIGHTNESS = 0.4; + function modifyBgHSL({h, s, l, a}, pole) { + const isDark = l < 0.5; + const isBlue = h > 200 && h < 280; + const isNeutral = s < 0.12 || (l > 0.8 && isBlue); + if (isDark) { + const lx = scale(l, 0, 0.5, 0, MAX_BG_LIGHTNESS); + if (isNeutral) { + const hx = pole.h; + const sx = pole.s; + return {h: hx, s: sx, l: lx, a}; + } + return {h, s, l: lx, a}; + } + let lx = scale(l, 0.5, 1, MAX_BG_LIGHTNESS, pole.l); + if (isNeutral) { + const hx = pole.h; + const sx = pole.s; + return {h: hx, s: sx, l: lx, a}; + } + let hx = h; + const isYellow = h > 60 && h < 180; + if (isYellow) { + const isCloserToGreen = h > 120; + if (isCloserToGreen) { + hx = scale(h, 120, 180, 135, 180); + } else { + hx = scale(h, 60, 120, 60, 105); + } + } + if (hx > 40 && hx < 80) { + lx *= 0.75; + } + return {h: hx, s, l: lx, a}; + } + function modifyBackgroundColor(rgb, theme) { + if (theme.mode === 0) { + return modifyLightSchemeColor(rgb, theme); + } + const pole = getBgPole(theme); + return modifyColorWithCache( + rgb, + {...theme, mode: 0}, + modifyBgHSL, + pole + ); + } + const MIN_FG_LIGHTNESS = 0.55; + function modifyBlueFgHue(hue) { + return scale(hue, 205, 245, 205, 220); + } + function modifyFgHSL({h, s, l, a}, pole) { + const isLight = l > 0.5; + const isNeutral = l < 0.2 || s < 0.24; + const isBlue = !isNeutral && h > 205 && h < 245; + if (isLight) { + const lx = scale(l, 0.5, 1, MIN_FG_LIGHTNESS, pole.l); + if (isNeutral) { + const hx = pole.h; + const sx = pole.s; + return {h: hx, s: sx, l: lx, a}; + } + let hx = h; + if (isBlue) { + hx = modifyBlueFgHue(h); + } + return {h: hx, s, l: lx, a}; + } + if (isNeutral) { + const hx = pole.h; + const sx = pole.s; + const lx = scale(l, 0, 0.5, pole.l, MIN_FG_LIGHTNESS); + return {h: hx, s: sx, l: lx, a}; + } + let hx = h; + let lx; + if (isBlue) { + hx = modifyBlueFgHue(h); + lx = scale(l, 0, 0.5, pole.l, Math.min(1, MIN_FG_LIGHTNESS + 0.05)); + } else { + lx = scale(l, 0, 0.5, pole.l, MIN_FG_LIGHTNESS); + } + return {h: hx, s, l: lx, a}; + } + function modifyForegroundColor(rgb, theme) { + if (theme.mode === 0) { + return modifyLightSchemeColor(rgb, theme); + } + const pole = getFgPole(theme); + return modifyColorWithCache( + rgb, + {...theme, mode: 0}, + modifyFgHSL, + pole + ); + } + function modifyBorderHSL({h, s, l, a}, poleFg, poleBg) { + const isDark = l < 0.5; + const isNeutral = l < 0.2 || s < 0.24; + let hx = h; + let sx = s; + if (isNeutral) { + if (isDark) { + hx = poleFg.h; + sx = poleFg.s; + } else { + hx = poleBg.h; + sx = poleBg.s; + } + } + const lx = scale(l, 0, 1, 0.5, 0.2); + return {h: hx, s: sx, l: lx, a}; + } + function modifyBorderColor(rgb, theme) { + if (theme.mode === 0) { + return modifyLightSchemeColor(rgb, theme); + } + const poleFg = getFgPole(theme); + const poleBg = getBgPole(theme); + return modifyColorWithCache( + rgb, + {...theme, mode: 0}, + modifyBorderHSL, + poleFg, + poleBg + ); + } + function modifyShadowColor(rgb, filter) { + return modifyBackgroundColor(rgb, filter); + } + function modifyGradientColor(rgb, filter) { + return modifyBackgroundColor(rgb, filter); + } + + function createTextStyle(config) { + const lines = []; + lines.push( + '*:not(pre, pre *, code, .far, .fa, .glyphicon, [class*="vjs-"], .fab, .fa-github, .fas, .material-icons, .icofont, .typcn, mu, [class*="mu-"], .glyphicon, .icon) {' + ); + if (config.useFont && config.fontFamily) { + lines.push(` font-family: ${config.fontFamily} !important;`); + } + if (config.textStroke > 0) { + lines.push( + ` -webkit-text-stroke: ${config.textStroke}px !important;` + ); + lines.push(` text-stroke: ${config.textStroke}px !important;`); + } + lines.push("}"); + return lines.join("\n"); + } + + var FilterMode; + (function (FilterMode) { + FilterMode[(FilterMode["light"] = 0)] = "light"; + FilterMode[(FilterMode["dark"] = 1)] = "dark"; + })(FilterMode || (FilterMode = {})); + function getCSSFilterValue(config) { + const filters = []; + if (config.mode === FilterMode.dark) { + filters.push("invert(100%) hue-rotate(180deg)"); + } + if (config.brightness !== 100) { + filters.push(`brightness(${config.brightness}%)`); + } + if (config.contrast !== 100) { + filters.push(`contrast(${config.contrast}%)`); + } + if (config.grayscale !== 0) { + filters.push(`grayscale(${config.grayscale}%)`); + } + if (config.sepia !== 0) { + filters.push(`sepia(${config.sepia}%)`); + } + if (filters.length === 0) { + return null; + } + return filters.join(" "); + } + + function toSVGMatrix(matrix) { + return matrix + .slice(0, 4) + .map((m) => m.map((m) => m.toFixed(3)).join(" ")) + .join(" "); + } + function getSVGFilterMatrixValue(config) { + return toSVGMatrix(createFilterMatrix(config)); + } + + let counter = 0; + const resolvers$1 = new Map(); + const rejectors = new Map(); + async function bgFetch(request) { + return new Promise((resolve, reject) => { + const id = ++counter; + resolvers$1.set(id, resolve); + rejectors.set(id, reject); + chrome.runtime.sendMessage({ + type: MessageType.CS_FETCH, + data: request, + id + }); + }); + } + chrome.runtime.onMessage.addListener(({type, data, error, id}) => { + if (type === MessageType.BG_FETCH_RESPONSE) { + const resolve = resolvers$1.get(id); + const reject = rejectors.get(id); + resolvers$1.delete(id); + rejectors.delete(id); + if (error) { + reject && reject(error); + } else { + resolve && resolve(data); + } + } + }); + + async function getOKResponse(url, mimeType, origin) { + const response = await fetch(url, { + cache: "force-cache", + credentials: "omit", + referrer: origin + }); + if ( + isFirefox && + mimeType === "text/css" && + url.startsWith("moz-extension://") && + url.endsWith(".css") + ) { + return response; + } + if ( + mimeType && + !response.headers.get("Content-Type").startsWith(mimeType) + ) { + throw new Error(`Mime type mismatch when loading ${url}`); + } + if (!response.ok) { + throw new Error( + `Unable to load ${url} ${response.status} ${response.statusText}` + ); + } + return response; + } + async function loadAsDataURL(url, mimeType) { + const response = await getOKResponse(url, mimeType); + return await readResponseAsDataURL(response); + } + async function readResponseAsDataURL(response) { + const blob = await response.blob(); + const dataURL = await new Promise((resolve) => { + const reader = new FileReader(); + reader.onloadend = () => resolve(reader.result); + reader.readAsDataURL(blob); + }); + return dataURL; + } + + class AsyncQueue { + constructor() { + this.queue = []; + this.timerId = null; + this.frameDuration = 1000 / 60; + } + addToQueue(entry) { + this.queue.push(entry); + this.startQueue(); + } + stopQueue() { + if (this.timerId !== null) { + cancelAnimationFrame(this.timerId); + this.timerId = null; + } + this.queue = []; + } + startQueue() { + if (this.timerId) { + return; + } + this.timerId = requestAnimationFrame(() => { + this.timerId = null; + const start = Date.now(); + let cb; + while ((cb = this.queue.shift())) { + cb(); + if (Date.now() - start >= this.frameDuration) { + this.startQueue(); + break; + } + } + }); + } + } + + const imageManager = new AsyncQueue(); + async function getImageDetails(url) { + return new Promise(async (resolve, reject) => { + let dataURL; + if (url.startsWith("data:")) { + dataURL = url; + } else { + try { + dataURL = await getImageDataURL(url); + } catch (error) { + reject(error); + return; + } + } + try { + const image = await urlToImage(dataURL); + imageManager.addToQueue(() => { + resolve({ + src: url, + dataURL, + width: image.naturalWidth, + height: image.naturalHeight, + ...analyzeImage(image) + }); + }); + } catch (error) { + reject(error); + } + }); + } + async function getImageDataURL(url) { + const parsedURL = new URL(url); + if (parsedURL.origin === location.origin) { + return await loadAsDataURL(url); + } + return await bgFetch({url, responseType: "data-url"}); + } + async function urlToImage(url) { + return new Promise((resolve, reject) => { + const image = new Image(); + image.onload = () => resolve(image); + image.onerror = () => reject(`Unable to load image ${url}`); + image.src = url; + }); + } + const MAX_ANALIZE_PIXELS_COUNT = 32 * 32; + let canvas; + let context; + function createCanvas() { + const maxWidth = MAX_ANALIZE_PIXELS_COUNT; + const maxHeight = MAX_ANALIZE_PIXELS_COUNT; + canvas = document.createElement("canvas"); + canvas.width = maxWidth; + canvas.height = maxHeight; + context = canvas.getContext("2d"); + context.imageSmoothingEnabled = false; + } + function removeCanvas() { + canvas = null; + context = null; + } + const MAX_IMAGE_SIZE = 5 * 1024 * 1024; + function analyzeImage(image) { + if (!canvas) { + createCanvas(); + } + const {naturalWidth, naturalHeight} = image; + if (naturalHeight === 0 || naturalWidth === 0) { + logWarn(`logWarn(Image is empty ${image.currentSrc})`); + return null; + } + const size = naturalWidth * naturalHeight * 4; + if (size > MAX_IMAGE_SIZE) { + return { + isDark: false, + isLight: false, + isTransparent: false, + isLarge: false, + isTooLarge: true + }; + } + const naturalPixelsCount = naturalWidth * naturalHeight; + const k = Math.min( + 1, + Math.sqrt(MAX_ANALIZE_PIXELS_COUNT / naturalPixelsCount) + ); + const width = Math.ceil(naturalWidth * k); + const height = Math.ceil(naturalHeight * k); + context.clearRect(0, 0, width, height); + context.drawImage( + image, + 0, + 0, + naturalWidth, + naturalHeight, + 0, + 0, + width, + height + ); + const imageData = context.getImageData(0, 0, width, height); + const d = imageData.data; + const TRANSPARENT_ALPHA_THRESHOLD = 0.05; + const DARK_LIGHTNESS_THRESHOLD = 0.4; + const LIGHT_LIGHTNESS_THRESHOLD = 0.7; + let transparentPixelsCount = 0; + let darkPixelsCount = 0; + let lightPixelsCount = 0; + let i, x, y; + let r, g, b, a; + let l; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + i = 4 * (y * width + x); + r = d[i + 0]; + g = d[i + 1]; + b = d[i + 2]; + a = d[i + 3]; + if (a / 255 < TRANSPARENT_ALPHA_THRESHOLD) { + transparentPixelsCount++; + } else { + l = getSRGBLightness(r, g, b); + if (l < DARK_LIGHTNESS_THRESHOLD) { + darkPixelsCount++; + } + if (l > LIGHT_LIGHTNESS_THRESHOLD) { + lightPixelsCount++; + } + } + } + } + const totalPixelsCount = width * height; + const opaquePixelsCount = totalPixelsCount - transparentPixelsCount; + const DARK_IMAGE_THRESHOLD = 0.7; + const LIGHT_IMAGE_THRESHOLD = 0.7; + const TRANSPARENT_IMAGE_THRESHOLD = 0.1; + const LARGE_IMAGE_PIXELS_COUNT = 800 * 600; + return { + isDark: darkPixelsCount / opaquePixelsCount >= DARK_IMAGE_THRESHOLD, + isLight: + lightPixelsCount / opaquePixelsCount >= LIGHT_IMAGE_THRESHOLD, + isTransparent: + transparentPixelsCount / totalPixelsCount >= + TRANSPARENT_IMAGE_THRESHOLD, + isLarge: naturalPixelsCount >= LARGE_IMAGE_PIXELS_COUNT, + isTooLarge: false + }; + } + function getFilteredImageDataURL({dataURL, width, height}, theme) { + const matrix = getSVGFilterMatrixValue(theme); + const svg = [ + ``, + "", + '', + ``, + "", + "", + ``, + "" + ].join(""); + return `data:image/svg+xml;base64,${btoa(svg)}`; + } + function cleanImageProcessingCache() { + imageManager && imageManager.stopQueue(); + removeCanvas(); + } + + const gradientLength = "gradient".length; + const conicGradient = "conic-"; + const conicGradientLength = conicGradient.length; + const radialGradient = "radial-"; + const linearGradient = "linear-"; + function parseGradient(value) { + const result = []; + let index = 0; + let startIndex = conicGradient.length; + while ((index = value.indexOf("gradient", startIndex)) !== -1) { + let typeGradient; + [linearGradient, radialGradient, conicGradient].find( + (possibleType) => { + if (index - possibleType.length >= 0) { + const possibleGradient = value.substring( + index - possibleType.length, + index + ); + if (possibleGradient === possibleType) { + if ( + value.slice( + index - possibleType.length - 10, + index - possibleType.length - 1 + ) === "repeating" + ) { + typeGradient = `repeating-${possibleType}gradient`; + return true; + } + if ( + value.slice( + index - possibleType.length - 8, + index - possibleType.length - 1 + ) === "-webkit" + ) { + typeGradient = `-webkit-${possibleType}gradient`; + return true; + } + typeGradient = `${possibleType}gradient`; + return true; + } + } + } + ); + if (!typeGradient) { + break; + } + const {start, end} = getParenthesesRange( + value, + index + gradientLength + ); + const match = value.substring(start + 1, end - 1); + startIndex = end + 1 + conicGradientLength; + result.push({ + typeGradient, + match, + offset: typeGradient.length + 2, + index: index - typeGradient.length + gradientLength, + hasComma: true + }); + } + if (result.length) { + result[result.length - 1].hasComma = false; + } + return result; + } + + function getPriority(ruleStyle, property) { + return Boolean(ruleStyle && ruleStyle.getPropertyPriority(property)); + } + function getModifiableCSSDeclaration( + property, + value, + rule, + variablesStore, + ignoreImageSelectors, + isCancelled + ) { + if (property.startsWith("--")) { + const modifier = getVariableModifier( + variablesStore, + property, + value, + rule, + ignoreImageSelectors, + isCancelled + ); + if (modifier) { + return { + property, + value: modifier, + important: getPriority(rule.style, property), + sourceValue: value + }; + } + } else if (value.includes("var(")) { + const modifier = getVariableDependantModifier( + variablesStore, + property, + value + ); + if (modifier) { + return { + property, + value: modifier, + important: getPriority(rule.style, property), + sourceValue: value + }; + } + } else if (property === "color-scheme") { + return null; + } else if ( + (property.includes("color") && + property !== "-webkit-print-color-adjust") || + property === "fill" || + property === "stroke" || + property === "stop-color" + ) { + const modifier = getColorModifier(property, value, rule); + if (modifier) { + return { + property, + value: modifier, + important: getPriority(rule.style, property), + sourceValue: value + }; + } + } else if ( + property === "background-image" || + property === "list-style-image" + ) { + const modifier = getBgImageModifier( + value, + rule, + ignoreImageSelectors, + isCancelled + ); + if (modifier) { + return { + property, + value: modifier, + important: getPriority(rule.style, property), + sourceValue: value + }; + } + } else if (property.includes("shadow")) { + const modifier = getShadowModifier(value); + if (modifier) { + return { + property, + value: modifier, + important: getPriority(rule.style, property), + sourceValue: value + }; + } + } + return null; + } + function joinSelectors(...selectors) { + return selectors.filter(Boolean).join(", "); + } + function getModifiedUserAgentStyle(theme, isIFrame, styleSystemControls) { + const lines = []; + if (!isIFrame) { + lines.push("html {"); + lines.push( + ` background-color: ${modifyBackgroundColor( + {r: 255, g: 255, b: 255}, + theme + )} !important;` + ); + lines.push("}"); + } + if (isCSSColorSchemePropSupported) { + lines.push("html {"); + lines.push( + ` color-scheme: ${ + theme.mode === 1 ? "dark" : "dark light" + } !important;` + ); + lines.push("}"); + } + const bgSelectors = joinSelectors( + isIFrame ? "" : "html, body", + styleSystemControls ? "input, textarea, select, button, dialog" : "" + ); + if (bgSelectors) { + lines.push(`${bgSelectors} {`); + lines.push( + ` background-color: ${modifyBackgroundColor( + {r: 255, g: 255, b: 255}, + theme + )};` + ); + lines.push("}"); + } + lines.push( + `${joinSelectors( + "html, body", + styleSystemControls ? "input, textarea, select, button" : "" + )} {` + ); + lines.push( + ` border-color: ${modifyBorderColor( + {r: 76, g: 76, b: 76}, + theme + )};` + ); + lines.push( + ` color: ${modifyForegroundColor({r: 0, g: 0, b: 0}, theme)};` + ); + lines.push("}"); + lines.push("a {"); + lines.push( + ` color: ${modifyForegroundColor({r: 0, g: 64, b: 255}, theme)};` + ); + lines.push("}"); + lines.push("table {"); + lines.push( + ` border-color: ${modifyBorderColor( + {r: 128, g: 128, b: 128}, + theme + )};` + ); + lines.push("}"); + lines.push("::placeholder {"); + lines.push( + ` color: ${modifyForegroundColor( + {r: 169, g: 169, b: 169}, + theme + )};` + ); + lines.push("}"); + lines.push("input:-webkit-autofill,"); + lines.push("textarea:-webkit-autofill,"); + lines.push("select:-webkit-autofill {"); + lines.push( + ` background-color: ${modifyBackgroundColor( + {r: 250, g: 255, b: 189}, + theme + )} !important;` + ); + lines.push( + ` color: ${modifyForegroundColor( + {r: 0, g: 0, b: 0}, + theme + )} !important;` + ); + lines.push("}"); + if (theme.scrollbarColor) { + lines.push(getModifiedScrollbarStyle(theme)); + } + if (theme.selectionColor) { + lines.push(getModifiedSelectionStyle(theme)); + } + return lines.join("\n"); + } + function getSelectionColor(theme) { + let backgroundColorSelection; + let foregroundColorSelection; + if (theme.selectionColor === "auto") { + backgroundColorSelection = modifyBackgroundColor( + {r: 0, g: 96, b: 212}, + {...theme, grayscale: 0} + ); + foregroundColorSelection = modifyForegroundColor( + {r: 255, g: 255, b: 255}, + {...theme, grayscale: 0} + ); + } else { + const rgb = parseColorWithCache(theme.selectionColor); + const hsl = rgbToHSL(rgb); + backgroundColorSelection = theme.selectionColor; + if (hsl.l < 0.5) { + foregroundColorSelection = "#FFF"; + } else { + foregroundColorSelection = "#000"; + } + } + return {backgroundColorSelection, foregroundColorSelection}; + } + function getModifiedSelectionStyle(theme) { + const lines = []; + const modifiedSelectionColor = getSelectionColor(theme); + const backgroundColorSelection = + modifiedSelectionColor.backgroundColorSelection; + const foregroundColorSelection = + modifiedSelectionColor.foregroundColorSelection; + ["::selection", "::-moz-selection"].forEach((selection) => { + lines.push(`${selection} {`); + lines.push( + ` background-color: ${backgroundColorSelection} !important;` + ); + lines.push(` color: ${foregroundColorSelection} !important;`); + lines.push("}"); + }); + return lines.join("\n"); + } + function getModifiedScrollbarStyle(theme) { + const lines = []; + let colorTrack; + let colorIcons; + let colorThumb; + let colorThumbHover; + let colorThumbActive; + let colorCorner; + if (theme.scrollbarColor === "auto") { + colorTrack = modifyBackgroundColor({r: 241, g: 241, b: 241}, theme); + colorIcons = modifyForegroundColor({r: 96, g: 96, b: 96}, theme); + colorThumb = modifyBackgroundColor({r: 176, g: 176, b: 176}, theme); + colorThumbHover = modifyBackgroundColor( + {r: 144, g: 144, b: 144}, + theme + ); + colorThumbActive = modifyBackgroundColor( + {r: 96, g: 96, b: 96}, + theme + ); + colorCorner = modifyBackgroundColor( + {r: 255, g: 255, b: 255}, + theme + ); + } else { + const rgb = parseColorWithCache(theme.scrollbarColor); + const hsl = rgbToHSL(rgb); + const isLight = hsl.l > 0.5; + const lighten = (lighter) => ({ + ...hsl, + l: clamp(hsl.l + lighter, 0, 1) + }); + const darken = (darker) => ({ + ...hsl, + l: clamp(hsl.l - darker, 0, 1) + }); + colorTrack = hslToString(darken(0.4)); + colorIcons = hslToString(isLight ? darken(0.4) : lighten(0.4)); + colorThumb = hslToString(hsl); + colorThumbHover = hslToString(lighten(0.1)); + colorThumbActive = hslToString(lighten(0.2)); + } + lines.push("::-webkit-scrollbar {"); + lines.push(` background-color: ${colorTrack};`); + lines.push(` color: ${colorIcons};`); + lines.push("}"); + lines.push("::-webkit-scrollbar-thumb {"); + lines.push(` background-color: ${colorThumb};`); + lines.push("}"); + lines.push("::-webkit-scrollbar-thumb:hover {"); + lines.push(` background-color: ${colorThumbHover};`); + lines.push("}"); + lines.push("::-webkit-scrollbar-thumb:active {"); + lines.push(` background-color: ${colorThumbActive};`); + lines.push("}"); + lines.push("::-webkit-scrollbar-corner {"); + lines.push(` background-color: ${colorCorner};`); + lines.push("}"); + if (isFirefox) { + lines.push("* {"); + lines.push(` scrollbar-color: ${colorThumb} ${colorTrack};`); + lines.push("}"); + } + return lines.join("\n"); + } + function getModifiedFallbackStyle(filter, {strict}) { + const lines = []; + const isMicrosoft = ["microsoft.com", "docs.microsoft.com"].includes( + location.hostname + ); + lines.push( + `html, body, ${ + strict + ? `body :not(iframe)${ + isMicrosoft + ? ':not(div[style^="position:absolute;top:0;left:-"]' + : "" + }` + : "body > :not(iframe)" + } {` + ); + lines.push( + ` background-color: ${modifyBackgroundColor( + {r: 255, g: 255, b: 255}, + filter + )} !important;` + ); + lines.push( + ` border-color: ${modifyBorderColor( + {r: 64, g: 64, b: 64}, + filter + )} !important;` + ); + lines.push( + ` color: ${modifyForegroundColor( + {r: 0, g: 0, b: 0}, + filter + )} !important;` + ); + lines.push("}"); + return lines.join("\n"); + } + const unparsableColors = new Set([ + "inherit", + "transparent", + "initial", + "currentcolor", + "none", + "unset" + ]); + function getColorModifier(prop, value, rule) { + if (unparsableColors.has(value.toLowerCase())) { + return value; + } + const rgb = parseColorWithCache(value); + if (!rgb) { + return null; + } + if (prop.includes("background")) { + if ( + (rule.style.webkitMaskImage && + rule.style.webkitMaskImage !== "none") || + (rule.style.webkitMask && + !rule.style.webkitMask.startsWith("none")) || + (rule.style.mask && rule.style.mask !== "none") || + (rule.style.getPropertyValue("mask-image") && + rule.style.getPropertyValue("mask-image") !== "none") + ) { + return (filter) => modifyForegroundColor(rgb, filter); + } + return (filter) => modifyBackgroundColor(rgb, filter); + } + if (prop.includes("border") || prop.includes("outline")) { + return (filter) => modifyBorderColor(rgb, filter); + } + return (filter) => modifyForegroundColor(rgb, filter); + } + const imageDetailsCache = new Map(); + const awaitingForImageLoading = new Map(); + function shouldIgnoreImage(selectorText, selectors) { + if (!selectorText || selectors.length === 0) { + return false; + } + if (selectors.some((s) => s === "*")) { + return true; + } + const ruleSelectors = selectorText.split(/,\s*/g); + for (let i = 0; i < selectors.length; i++) { + const ignoredSelector = selectors[i]; + if (ruleSelectors.some((s) => s === ignoredSelector)) { + return true; + } + } + return false; + } + function getBgImageModifier( + value, + rule, + ignoreImageSelectors, + isCancelled + ) { + try { + const gradients = parseGradient(value); + const urls = getMatches(cssURLRegex, value); + if (urls.length === 0 && gradients.length === 0) { + return value; + } + const getIndices = (matches) => { + let index = 0; + return matches.map((match) => { + const valueIndex = value.indexOf(match, index); + index = valueIndex + match.length; + return {match, index: valueIndex}; + }); + }; + const matches = gradients + .map((i) => ({type: "gradient", ...i})) + .concat( + getIndices(urls).map((i) => ({ + type: "url", + offset: 0, + ...i + })) + ) + .sort((a, b) => (a.index > b.index ? 1 : -1)); + const getGradientModifier = (gradient) => { + const {typeGradient, match, hasComma} = gradient; + const partsRegex = + /([^\(\),]+(\([^\(\)]*(\([^\(\)]*\)*[^\(\)]*)?\))?([^\(\), ]|( (?!calc)))*),?/g; + const colorStopRegex = + /^(from|color-stop|to)\(([^\(\)]*?,\s*)?(.*?)\)$/; + const parts = getMatches(partsRegex, match, 1).map((part) => { + part = part.trim(); + let rgb = parseColorWithCache(part); + if (rgb) { + return (filter) => modifyGradientColor(rgb, filter); + } + const space = part.lastIndexOf(" "); + rgb = parseColorWithCache(part.substring(0, space)); + if (rgb) { + return (filter) => + `${modifyGradientColor( + rgb, + filter + )} ${part.substring(space + 1)}`; + } + const colorStopMatch = part.match(colorStopRegex); + if (colorStopMatch) { + rgb = parseColorWithCache(colorStopMatch[3]); + if (rgb) { + return (filter) => + `${colorStopMatch[1]}(${ + colorStopMatch[2] + ? `${colorStopMatch[2]}, ` + : "" + }${modifyGradientColor(rgb, filter)})`; + } + } + return () => part; + }); + return (filter) => { + return `${typeGradient}(${parts + .map((modify) => modify(filter)) + .join(", ")})${hasComma ? ", " : ""}`; + }; + }; + const getURLModifier = (urlValue) => { + var _a; + if ( + shouldIgnoreImage(rule.selectorText, ignoreImageSelectors) + ) { + return null; + } + let url = getCSSURLValue(urlValue); + const isURLEmpty = url.length === 0; + const {parentStyleSheet} = rule; + const baseURL = + parentStyleSheet && parentStyleSheet.href + ? getCSSBaseBath(parentStyleSheet.href) + : ((_a = parentStyleSheet.ownerNode) === null || + _a === void 0 + ? void 0 + : _a.baseURI) || location.origin; + url = getAbsoluteURL(baseURL, url); + const absoluteValue = `url("${url}")`; + return async (filter) => { + if (isURLEmpty) { + return "url('')"; + } + let imageDetails; + if (imageDetailsCache.has(url)) { + imageDetails = imageDetailsCache.get(url); + } else { + try { + if (awaitingForImageLoading.has(url)) { + const awaiters = + awaitingForImageLoading.get(url); + imageDetails = await new Promise((resolve) => + awaiters.push(resolve) + ); + if (!imageDetails) { + return null; + } + } else { + awaitingForImageLoading.set(url, []); + imageDetails = await getImageDetails(url); + imageDetailsCache.set(url, imageDetails); + awaitingForImageLoading + .get(url) + .forEach((resolve) => + resolve(imageDetails) + ); + awaitingForImageLoading.delete(url); + } + if (isCancelled()) { + return null; + } + } catch (err) { + logWarn(err); + if (awaitingForImageLoading.has(url)) { + awaitingForImageLoading + .get(url) + .forEach((resolve) => resolve(null)); + awaitingForImageLoading.delete(url); + } + return absoluteValue; + } + } + const bgImageValue = + getBgImageValue(imageDetails, filter) || absoluteValue; + return bgImageValue; + }; + }; + const getBgImageValue = (imageDetails, filter) => { + const { + isDark, + isLight, + isTransparent, + isLarge, + isTooLarge, + width + } = imageDetails; + let result; + if (isTooLarge) { + result = `url("${imageDetails.src}")`; + } else if ( + isDark && + isTransparent && + filter.mode === 1 && + !isLarge && + width > 2 + ) { + logInfo(`Inverting dark image ${imageDetails.src}`); + const inverted = getFilteredImageDataURL(imageDetails, { + ...filter, + sepia: clamp(filter.sepia + 10, 0, 100) + }); + result = `url("${inverted}")`; + } else if (isLight && !isTransparent && filter.mode === 1) { + if (isLarge) { + result = "none"; + } else { + logInfo(`Dimming light image ${imageDetails.src}`); + const dimmed = getFilteredImageDataURL( + imageDetails, + filter + ); + result = `url("${dimmed}")`; + } + } else if (filter.mode === 0 && isLight && !isLarge) { + logInfo(`Applying filter to image ${imageDetails.src}`); + const filtered = getFilteredImageDataURL(imageDetails, { + ...filter, + brightness: clamp(filter.brightness - 10, 5, 200), + sepia: clamp(filter.sepia + 10, 0, 100) + }); + result = `url("${filtered}")`; + } else { + result = null; + } + return result; + }; + const modifiers = []; + let matchIndex = 0; + let prevHasComma = false; + matches.forEach( + ({type, match, index, typeGradient, hasComma, offset}, i) => { + const matchStart = index; + const prefixStart = matchIndex; + const matchEnd = matchStart + match.length + offset; + matchIndex = matchEnd; + if (prefixStart !== matchStart) { + if (prevHasComma) { + modifiers.push(() => { + let betweenValue = value.substring( + prefixStart, + matchStart + ); + if (betweenValue[0] === ",") { + betweenValue = betweenValue.substring(1); + } + return betweenValue; + }); + } else { + modifiers.push(() => + value.substring(prefixStart, matchStart) + ); + } + } + prevHasComma = hasComma || false; + if (type === "url") { + modifiers.push(getURLModifier(match)); + } else if (type === "gradient") { + modifiers.push( + getGradientModifier({ + match, + index, + typeGradient, + hasComma, + offset + }) + ); + } + if (i === matches.length - 1) { + modifiers.push(() => value.substring(matchEnd)); + } + } + ); + return (filter) => { + const results = modifiers + .filter(Boolean) + .map((modify) => modify(filter)); + if (results.some((r) => r instanceof Promise)) { + return Promise.all(results).then((asyncResults) => { + return asyncResults.filter(Boolean).join(""); + }); + } + const combinedResult = results.join(""); + if (combinedResult.endsWith(", initial")) { + return combinedResult.slice(0, -9); + } + return combinedResult; + }; + } catch (err) { + return null; + } + } + function getShadowModifierWithInfo(value) { + try { + let index = 0; + const colorMatches = getMatches( + /(^|\s)(?!calc)([a-z]+\(.+?\)|#[0-9a-f]+|[a-z]+)(.*?(inset|outset)?($|,))/gi, + value, + 2 + ); + let notParsed = 0; + const modifiers = colorMatches.map((match, i) => { + const prefixIndex = index; + const matchIndex = value.indexOf(match, index); + const matchEnd = matchIndex + match.length; + index = matchEnd; + const rgb = parseColorWithCache(match); + if (!rgb) { + notParsed++; + return () => value.substring(prefixIndex, matchEnd); + } + return (filter) => + `${value.substring( + prefixIndex, + matchIndex + )}${modifyShadowColor(rgb, filter)}${ + i === colorMatches.length - 1 + ? value.substring(matchEnd) + : "" + }`; + }); + return (filter) => { + const modified = modifiers + .map((modify) => modify(filter)) + .join(""); + return { + matchesLength: colorMatches.length, + unparseableMatchesLength: notParsed, + result: modified + }; + }; + } catch (err) { + return null; + } + } + function getShadowModifier(value) { + const shadowModifier = getShadowModifierWithInfo(value); + if (!shadowModifier) { + return null; + } + return (theme) => shadowModifier(theme).result; + } + function getVariableModifier( + variablesStore, + prop, + value, + rule, + ignoredImgSelectors, + isCancelled + ) { + return variablesStore.getModifierForVariable({ + varName: prop, + sourceValue: value, + rule, + ignoredImgSelectors, + isCancelled + }); + } + function getVariableDependantModifier(variablesStore, prop, value) { + return variablesStore.getModifierForVarDependant(prop, value); + } + function cleanModificationCache() { + clearColorModificationCache(); + imageDetailsCache.clear(); + cleanImageProcessingCache(); + awaitingForImageLoading.clear(); + } + + const VAR_TYPE_BGCOLOR = 1 << 0; + const VAR_TYPE_TEXTCOLOR = 1 << 1; + const VAR_TYPE_BORDERCOLOR = 1 << 2; + const VAR_TYPE_BGIMG = 1 << 3; + class VariablesStore { + constructor() { + this.varTypes = new Map(); + this.rulesQueue = []; + this.definedVars = new Set(); + this.varRefs = new Map(); + this.unknownColorVars = new Set(); + this.unknownBgVars = new Set(); + this.undefinedVars = new Set(); + this.initialVarTypes = new Map(); + this.changedTypeVars = new Set(); + this.typeChangeSubscriptions = new Map(); + this.unstableVarValues = new Map(); + } + clear() { + this.varTypes.clear(); + this.rulesQueue.splice(0); + this.definedVars.clear(); + this.varRefs.clear(); + this.unknownColorVars.clear(); + this.unknownBgVars.clear(); + this.undefinedVars.clear(); + this.initialVarTypes.clear(); + this.changedTypeVars.clear(); + this.typeChangeSubscriptions.clear(); + this.unstableVarValues.clear(); + } + isVarType(varName, typeNum) { + return ( + this.varTypes.has(varName) && + (this.varTypes.get(varName) & typeNum) > 0 + ); + } + addRulesForMatching(rules) { + this.rulesQueue.push(rules); + } + matchVariablesAndDependants() { + this.changedTypeVars.clear(); + this.initialVarTypes = new Map(this.varTypes); + this.collectRootVariables(); + this.collectVariablesAndVarDep(this.rulesQueue); + this.rulesQueue.splice(0); + this.collectRootVarDependants(); + this.varRefs.forEach((refs, v) => { + refs.forEach((r) => { + if (this.varTypes.has(v)) { + this.resolveVariableType(r, this.varTypes.get(v)); + } + }); + }); + this.unknownColorVars.forEach((v) => { + if (this.unknownBgVars.has(v)) { + this.unknownColorVars.delete(v); + this.unknownBgVars.delete(v); + this.resolveVariableType(v, VAR_TYPE_BGCOLOR); + } else if ( + this.isVarType( + v, + VAR_TYPE_BGCOLOR | + VAR_TYPE_TEXTCOLOR | + VAR_TYPE_BORDERCOLOR + ) + ) { + this.unknownColorVars.delete(v); + } else { + this.undefinedVars.add(v); + } + }); + this.unknownBgVars.forEach((v) => { + const hasColor = + this.findVarRef(v, (ref) => { + return ( + this.unknownColorVars.has(ref) || + this.isVarType( + ref, + VAR_TYPE_TEXTCOLOR | VAR_TYPE_BORDERCOLOR + ) + ); + }) != null; + if (hasColor) { + this.itarateVarRefs(v, (ref) => { + this.resolveVariableType(ref, VAR_TYPE_BGCOLOR); + }); + } else if ( + this.isVarType(v, VAR_TYPE_BGCOLOR | VAR_TYPE_BGIMG) + ) { + this.unknownBgVars.delete(v); + } else { + this.undefinedVars.add(v); + } + }); + this.changedTypeVars.forEach((varName) => { + if (this.typeChangeSubscriptions.has(varName)) { + this.typeChangeSubscriptions + .get(varName) + .forEach((callback) => { + callback(); + }); + } + }); + this.changedTypeVars.clear(); + } + getModifierForVariable(options) { + return (theme) => { + const { + varName, + sourceValue, + rule, + ignoredImgSelectors, + isCancelled + } = options; + const getDeclarations = () => { + const declarations = []; + const addModifiedValue = ( + typeNum, + varNameWrapper, + colorModifier + ) => { + if (!this.isVarType(varName, typeNum)) { + return; + } + const property = varNameWrapper(varName); + let modifiedValue; + if (isVarDependant(sourceValue)) { + if (isConstructedColorVar(sourceValue)) { + let value = insertVarValues( + sourceValue, + this.unstableVarValues + ); + if (!value) { + value = + typeNum === VAR_TYPE_BGCOLOR + ? "#ffffff" + : "#000000"; + } + modifiedValue = colorModifier(value, theme); + } else { + modifiedValue = replaceCSSVariablesNames( + sourceValue, + (v) => varNameWrapper(v), + (fallback) => colorModifier(fallback, theme) + ); + } + } else { + modifiedValue = colorModifier(sourceValue, theme); + } + declarations.push({ + property, + value: modifiedValue + }); + }; + addModifiedValue( + VAR_TYPE_BGCOLOR, + wrapBgColorVariableName, + tryModifyBgColor + ); + addModifiedValue( + VAR_TYPE_TEXTCOLOR, + wrapTextColorVariableName, + tryModifyTextColor + ); + addModifiedValue( + VAR_TYPE_BORDERCOLOR, + wrapBorderColorVariableName, + tryModifyBorderColor + ); + if (this.isVarType(varName, VAR_TYPE_BGIMG)) { + const property = wrapBgImgVariableName(varName); + let modifiedValue = sourceValue; + if (isVarDependant(sourceValue)) { + modifiedValue = replaceCSSVariablesNames( + sourceValue, + (v) => wrapBgColorVariableName(v), + (fallback) => tryModifyBgColor(fallback, theme) + ); + } + const bgModifier = getBgImageModifier( + modifiedValue, + rule, + ignoredImgSelectors, + isCancelled + ); + modifiedValue = + typeof bgModifier === "function" + ? bgModifier(theme) + : bgModifier; + declarations.push({ + property, + value: modifiedValue + }); + } + return declarations; + }; + const callbacks = new Set(); + const addListener = (onTypeChange) => { + const callback = () => { + const decs = getDeclarations(); + onTypeChange(decs); + }; + callbacks.add(callback); + this.subscribeForVarTypeChange(varName, callback); + }; + const removeListeners = () => { + callbacks.forEach((callback) => { + this.unsubscribeFromVariableTypeChanges( + varName, + callback + ); + }); + }; + return { + declarations: getDeclarations(), + onTypeChange: {addListener, removeListeners} + }; + }; + } + getModifierForVarDependant(property, sourceValue) { + if (sourceValue.match(/^\s*(rgb|hsl)a?\(/)) { + const isBg = property.startsWith("background"); + const isText = isTextColorProperty(property); + return (theme) => { + let value = insertVarValues( + sourceValue, + this.unstableVarValues + ); + if (!value) { + value = isBg ? "#ffffff" : "#000000"; + } + const modifier = isBg + ? tryModifyBgColor + : isText + ? tryModifyTextColor + : tryModifyBorderColor; + return modifier(value, theme); + }; + } + if (property === "background-color") { + return (theme) => { + return replaceCSSVariablesNames( + sourceValue, + (v) => wrapBgColorVariableName(v), + (fallback) => tryModifyBgColor(fallback, theme) + ); + }; + } + if (isTextColorProperty(property)) { + return (theme) => { + return replaceCSSVariablesNames( + sourceValue, + (v) => wrapTextColorVariableName(v), + (fallback) => tryModifyTextColor(fallback, theme) + ); + }; + } + if ( + property === "background" || + property === "background-image" || + property === "box-shadow" + ) { + return (theme) => { + const unknownVars = new Set(); + const modify = () => { + const variableReplaced = replaceCSSVariablesNames( + sourceValue, + (v) => { + if (this.isVarType(v, VAR_TYPE_BGCOLOR)) { + return wrapBgColorVariableName(v); + } + if (this.isVarType(v, VAR_TYPE_BGIMG)) { + return wrapBgImgVariableName(v); + } + unknownVars.add(v); + return v; + }, + (fallback) => tryModifyBgColor(fallback, theme) + ); + if (property === "box-shadow") { + const shadowModifier = + getShadowModifierWithInfo(variableReplaced); + const modifiedShadow = shadowModifier(theme); + if ( + modifiedShadow.unparseableMatchesLength !== + modifiedShadow.matchesLength + ) { + return modifiedShadow.result; + } + } + return variableReplaced; + }; + const modified = modify(); + if (unknownVars.size > 0) { + return new Promise((resolve) => { + const firstUnknownVar = unknownVars + .values() + .next().value; + const callback = () => { + this.unsubscribeFromVariableTypeChanges( + firstUnknownVar, + callback + ); + const newValue = modify(); + resolve(newValue); + }; + this.subscribeForVarTypeChange( + firstUnknownVar, + callback + ); + }); + } + return modified; + }; + } + if ( + property.startsWith("border") || + property.startsWith("outline") + ) { + return (theme) => { + return replaceCSSVariablesNames( + sourceValue, + (v) => wrapBorderColorVariableName(v), + (fallback) => tryModifyBorderColor(fallback, theme) + ); + }; + } + return null; + } + subscribeForVarTypeChange(varName, callback) { + if (!this.typeChangeSubscriptions.has(varName)) { + this.typeChangeSubscriptions.set(varName, new Set()); + } + const rootStore = this.typeChangeSubscriptions.get(varName); + if (!rootStore.has(callback)) { + rootStore.add(callback); + } + } + unsubscribeFromVariableTypeChanges(varName, callback) { + if (this.typeChangeSubscriptions.has(varName)) { + this.typeChangeSubscriptions.get(varName).delete(callback); + } + } + collectVariablesAndVarDep(ruleList) { + ruleList.forEach((rules) => { + iterateCSSRules(rules, (rule) => { + rule.style && + iterateCSSDeclarations( + rule.style, + (property, value) => { + if (isVariable(property)) { + this.inspectVariable(property, value); + } + if (isVarDependant(value)) { + this.inspectVarDependant(property, value); + } + } + ); + }); + }); + } + collectRootVariables() { + iterateCSSDeclarations( + document.documentElement.style, + (property, value) => { + if (isVariable(property)) { + this.inspectVariable(property, value); + } + } + ); + } + inspectVariable(varName, value) { + this.unstableVarValues.set(varName, value); + if (isVarDependant(value) && isConstructedColorVar(value)) { + this.unknownColorVars.add(varName); + this.definedVars.add(varName); + } + if (this.definedVars.has(varName)) { + return; + } + this.definedVars.add(varName); + const color = parseColorWithCache(value); + if (color) { + this.unknownColorVars.add(varName); + } else if ( + value.includes("url(") || + value.includes("linear-gradient(") || + value.includes("radial-gradient(") + ) { + this.resolveVariableType(varName, VAR_TYPE_BGIMG); + } + } + resolveVariableType(varName, typeNum) { + const initialType = this.initialVarTypes.get(varName) || 0; + const currentType = this.varTypes.get(varName) || 0; + const newType = currentType | typeNum; + this.varTypes.set(varName, newType); + if (newType !== initialType || this.undefinedVars.has(varName)) { + this.changedTypeVars.add(varName); + this.undefinedVars.delete(varName); + } + this.unknownColorVars.delete(varName); + this.unknownBgVars.delete(varName); + } + collectRootVarDependants() { + iterateCSSDeclarations( + document.documentElement.style, + (property, value) => { + if (isVarDependant(value)) { + this.inspectVarDependant(property, value); + } + } + ); + } + inspectVarDependant(property, value) { + if (isVariable(property)) { + this.iterateVarDeps(value, (ref) => { + if (!this.varRefs.has(property)) { + this.varRefs.set(property, new Set()); + } + this.varRefs.get(property).add(ref); + }); + } else if ( + property === "background-color" || + property === "box-shadow" + ) { + this.iterateVarDeps(value, (v) => + this.resolveVariableType(v, VAR_TYPE_BGCOLOR) + ); + } else if (isTextColorProperty(property)) { + this.iterateVarDeps(value, (v) => + this.resolveVariableType(v, VAR_TYPE_TEXTCOLOR) + ); + } else if ( + property.startsWith("border") || + property.startsWith("outline") + ) { + this.iterateVarDeps(value, (v) => + this.resolveVariableType(v, VAR_TYPE_BORDERCOLOR) + ); + } else if ( + property === "background" || + property === "background-image" + ) { + this.iterateVarDeps(value, (v) => { + if (this.isVarType(v, VAR_TYPE_BGCOLOR | VAR_TYPE_BGIMG)) { + return; + } + const isBgColor = + this.findVarRef(v, (ref) => { + return ( + this.unknownColorVars.has(ref) || + this.isVarType( + ref, + VAR_TYPE_TEXTCOLOR | VAR_TYPE_BORDERCOLOR + ) + ); + }) != null; + this.itarateVarRefs(v, (ref) => { + if (isBgColor) { + this.resolveVariableType(ref, VAR_TYPE_BGCOLOR); + } else { + this.unknownBgVars.add(ref); + } + }); + }); + } + } + iterateVarDeps(value, iterator) { + const varDeps = new Set(); + iterateVarDependencies(value, (v) => varDeps.add(v)); + varDeps.forEach((v) => iterator(v)); + } + findVarRef(varName, iterator, stack = new Set()) { + if (stack.has(varName)) { + return null; + } + stack.add(varName); + const result = iterator(varName); + if (result) { + return varName; + } + const refs = this.varRefs.get(varName); + if (!refs || refs.size === 0) { + return null; + } + for (const ref of refs) { + const found = this.findVarRef(ref, iterator, stack); + if (found) { + return found; + } + } + return null; + } + itarateVarRefs(varName, iterator) { + this.findVarRef(varName, (ref) => { + iterator(ref); + return false; + }); + } + setOnRootVariableChange(callback) { + this.onRootVariableDefined = callback; + } + putRootVars(styleElement, theme) { + const sheet = styleElement.sheet; + if (sheet.cssRules.length > 0) { + sheet.deleteRule(0); + } + const declarations = new Map(); + iterateCSSDeclarations( + document.documentElement.style, + (property, value) => { + if (isVariable(property)) { + if (this.isVarType(property, VAR_TYPE_BGCOLOR)) { + declarations.set( + wrapBgColorVariableName(property), + tryModifyBgColor(value, theme) + ); + } + if (this.isVarType(property, VAR_TYPE_TEXTCOLOR)) { + declarations.set( + wrapTextColorVariableName(property), + tryModifyTextColor(value, theme) + ); + } + if (this.isVarType(property, VAR_TYPE_BORDERCOLOR)) { + declarations.set( + wrapBorderColorVariableName(property), + tryModifyBorderColor(value, theme) + ); + } + this.subscribeForVarTypeChange( + property, + this.onRootVariableDefined + ); + } + } + ); + const cssLines = []; + cssLines.push(":root {"); + for (const [property, value] of declarations) { + cssLines.push(` ${property}: ${value};`); + } + cssLines.push("}"); + const cssText = cssLines.join("\n"); + sheet.insertRule(cssText); + } + } + const variablesStore = new VariablesStore(); + function getVariableRange(input, searchStart = 0) { + const start = input.indexOf("var(", searchStart); + if (start >= 0) { + const range = getParenthesesRange(input, start + 3); + if (range) { + return {start, end: range.end}; + } + return null; + } + } + function getVariablesMatches(input) { + const ranges = []; + let i = 0; + let range; + while ((range = getVariableRange(input, i))) { + const {start, end} = range; + ranges.push({start, end, value: input.substring(start, end)}); + i = range.end + 1; + } + return ranges; + } + function replaceVariablesMatches(input, replacer) { + const matches = getVariablesMatches(input); + const matchesCount = matches.length; + if (matchesCount === 0) { + return input; + } + const inputLength = input.length; + const replacements = matches.map((m) => replacer(m.value)); + const parts = []; + parts.push(input.substring(0, matches[0].start)); + for (let i = 0; i < matchesCount; i++) { + parts.push(replacements[i]); + const start = matches[i].end; + const end = + i < matchesCount - 1 ? matches[i + 1].start : inputLength; + parts.push(input.substring(start, end)); + } + return parts.join(""); + } + function getVariableNameAndFallback(match) { + const commaIndex = match.indexOf(","); + let name; + let fallback; + if (commaIndex >= 0) { + name = match.substring(4, commaIndex).trim(); + fallback = match.substring(commaIndex + 1, match.length - 1).trim(); + } else { + name = match.substring(4, match.length - 1).trim(); + fallback = ""; + } + return {name, fallback}; + } + function replaceCSSVariablesNames(value, nameReplacer, fallbackReplacer) { + const matchReplacer = (match) => { + const {name, fallback} = getVariableNameAndFallback(match); + const newName = nameReplacer(name); + if (!fallback) { + return `var(${newName})`; + } + let newFallback; + if (isVarDependant(fallback)) { + newFallback = replaceCSSVariablesNames( + fallback, + nameReplacer, + fallbackReplacer + ); + } else if (fallbackReplacer) { + newFallback = fallbackReplacer(fallback); + } else { + newFallback = fallback; + } + return `var(${newName}, ${newFallback})`; + }; + return replaceVariablesMatches(value, matchReplacer); + } + function iterateVarDependencies(value, iterator) { + replaceCSSVariablesNames(value, (varName) => { + iterator(varName); + return varName; + }); + } + function wrapBgColorVariableName(name) { + return `--darkreader-bg${name}`; + } + function wrapTextColorVariableName(name) { + return `--darkreader-text${name}`; + } + function wrapBorderColorVariableName(name) { + return `--darkreader-border${name}`; + } + function wrapBgImgVariableName(name) { + return `--darkreader-bgimg${name}`; + } + function isVariable(property) { + return property.startsWith("--"); + } + function isVarDependant(value) { + return value.includes("var("); + } + function isConstructedColorVar(value) { + return value.match(/^\s*(rgb|hsl)a?\(/); + } + function isTextColorProperty(property) { + return ( + property === "color" || + property === "caret-color" || + property === "-webkit-text-fill-color" + ); + } + const rawValueRegex = /^\d{1,3}, ?\d{1,3}, ?\d{1,3}$/; + function parseRawValue(color) { + if (rawValueRegex.test(color)) { + const splitted = color.split(","); + let resultInRGB = "rgb("; + splitted.forEach((number) => { + resultInRGB += `${number.trim()}, `; + }); + resultInRGB = resultInRGB.substring(0, resultInRGB.length - 2); + resultInRGB += ")"; + return {isRaw: true, color: resultInRGB}; + } + return {isRaw: false, color: color}; + } + function handleRawValue(color, theme, modifyFunction) { + const {isRaw, color: newColor} = parseRawValue(color); + const rgb = parseColorWithCache(newColor); + if (rgb) { + const outputColor = modifyFunction(rgb, theme); + if (isRaw) { + const outputInRGB = parseColorWithCache(outputColor); + return outputInRGB + ? `${outputInRGB.r}, ${outputInRGB.g}, ${outputInRGB.b}` + : outputColor; + } + return outputColor; + } + return newColor; + } + function tryModifyBgColor(color, theme) { + return handleRawValue(color, theme, modifyBackgroundColor); + } + function tryModifyTextColor(color, theme) { + return handleRawValue(color, theme, modifyForegroundColor); + } + function tryModifyBorderColor(color, theme) { + return handleRawValue(color, theme, modifyBorderColor); + } + function insertVarValues(source, varValues, stack = new Set()) { + let containsUnresolvedVar = false; + const matchReplacer = (match) => { + const {name, fallback} = getVariableNameAndFallback(match); + if (stack.has(name)) { + containsUnresolvedVar = true; + return null; + } + stack.add(name); + const varValue = varValues.get(name) || fallback; + let inserted = null; + if (varValue) { + if (isVarDependant(varValue)) { + inserted = insertVarValues(varValue, varValues, stack); + } else { + inserted = varValue; + } + } + if (!inserted) { + containsUnresolvedVar = true; + return null; + } + return inserted; + }; + const replaced = replaceVariablesMatches(source, matchReplacer); + if (containsUnresolvedVar) { + return null; + } + return replaced; + } + + const overrides = { + "background-color": { + customProp: "--darkreader-inline-bgcolor", + cssProp: "background-color", + dataAttr: "data-darkreader-inline-bgcolor" + }, + "background-image": { + customProp: "--darkreader-inline-bgimage", + cssProp: "background-image", + dataAttr: "data-darkreader-inline-bgimage" + }, + "border-color": { + customProp: "--darkreader-inline-border", + cssProp: "border-color", + dataAttr: "data-darkreader-inline-border" + }, + "border-bottom-color": { + customProp: "--darkreader-inline-border-bottom", + cssProp: "border-bottom-color", + dataAttr: "data-darkreader-inline-border-bottom" + }, + "border-left-color": { + customProp: "--darkreader-inline-border-left", + cssProp: "border-left-color", + dataAttr: "data-darkreader-inline-border-left" + }, + "border-right-color": { + customProp: "--darkreader-inline-border-right", + cssProp: "border-right-color", + dataAttr: "data-darkreader-inline-border-right" + }, + "border-top-color": { + customProp: "--darkreader-inline-border-top", + cssProp: "border-top-color", + dataAttr: "data-darkreader-inline-border-top" + }, + "box-shadow": { + customProp: "--darkreader-inline-boxshadow", + cssProp: "box-shadow", + dataAttr: "data-darkreader-inline-boxshadow" + }, + "color": { + customProp: "--darkreader-inline-color", + cssProp: "color", + dataAttr: "data-darkreader-inline-color" + }, + "fill": { + customProp: "--darkreader-inline-fill", + cssProp: "fill", + dataAttr: "data-darkreader-inline-fill" + }, + "stroke": { + customProp: "--darkreader-inline-stroke", + cssProp: "stroke", + dataAttr: "data-darkreader-inline-stroke" + }, + "outline-color": { + customProp: "--darkreader-inline-outline", + cssProp: "outline-color", + dataAttr: "data-darkreader-inline-outline" + }, + "stop-color": { + customProp: "--darkreader-inline-stopcolor", + cssProp: "stop-color", + dataAttr: "data-darkreader-inline-stopcolor" + } + }; + const overridesList = Object.values(overrides); + const normalizedPropList = {}; + overridesList.forEach( + ({cssProp, customProp}) => (normalizedPropList[customProp] = cssProp) + ); + const INLINE_STYLE_ATTRS = [ + "style", + "fill", + "stop-color", + "stroke", + "bgcolor", + "color" + ]; + const INLINE_STYLE_SELECTOR = INLINE_STYLE_ATTRS.map( + (attr) => `[${attr}]` + ).join(", "); + function getInlineOverrideStyle() { + return overridesList + .map(({dataAttr, customProp, cssProp}) => { + return [ + `[${dataAttr}] {`, + ` ${cssProp}: var(${customProp}) !important;`, + "}" + ].join("\n"); + }) + .join("\n"); + } + function getInlineStyleElements(root) { + const results = []; + if (root instanceof Element && root.matches(INLINE_STYLE_SELECTOR)) { + results.push(root); + } + if ( + root instanceof Element || + (isShadowDomSupported && root instanceof ShadowRoot) || + root instanceof Document + ) { + push(results, root.querySelectorAll(INLINE_STYLE_SELECTOR)); + } + return results; + } + const treeObservers = new Map(); + const attrObservers = new Map(); + function watchForInlineStyles(elementStyleDidChange, shadowRootDiscovered) { + deepWatchForInlineStyles( + document, + elementStyleDidChange, + shadowRootDiscovered + ); + iterateShadowHosts(document.documentElement, (host) => { + deepWatchForInlineStyles( + host.shadowRoot, + elementStyleDidChange, + shadowRootDiscovered + ); + }); + } + function deepWatchForInlineStyles( + root, + elementStyleDidChange, + shadowRootDiscovered + ) { + if (treeObservers.has(root)) { + treeObservers.get(root).disconnect(); + attrObservers.get(root).disconnect(); + } + const discoveredNodes = new WeakSet(); + function discoverNodes(node) { + getInlineStyleElements(node).forEach((el) => { + if (discoveredNodes.has(el)) { + return; + } + discoveredNodes.add(el); + elementStyleDidChange(el); + }); + iterateShadowHosts(node, (n) => { + if (discoveredNodes.has(node)) { + return; + } + discoveredNodes.add(node); + shadowRootDiscovered(n.shadowRoot); + deepWatchForInlineStyles( + n.shadowRoot, + elementStyleDidChange, + shadowRootDiscovered + ); + }); + } + const treeObserver = createOptimizedTreeObserver(root, { + onMinorMutations: ({additions}) => { + additions.forEach((added) => discoverNodes(added)); + }, + onHugeMutations: () => { + discoverNodes(root); + } + }); + treeObservers.set(root, treeObserver); + let attemptCount = 0; + let start = null; + const ATTEMPTS_INTERVAL = getDuration({seconds: 10}); + const RETRY_TIMEOUT = getDuration({seconds: 2}); + const MAX_ATTEMPTS_COUNT = 50; + let cache = []; + let timeoutId = null; + const handleAttributeMutations = throttle((mutations) => { + mutations.forEach((m) => { + if (INLINE_STYLE_ATTRS.includes(m.attributeName)) { + elementStyleDidChange(m.target); + } + }); + }); + const attrObserver = new MutationObserver((mutations) => { + if (timeoutId) { + cache.push(...mutations); + return; + } + attemptCount++; + const now = Date.now(); + if (start == null) { + start = now; + } else if (attemptCount >= MAX_ATTEMPTS_COUNT) { + if (now - start < ATTEMPTS_INTERVAL) { + timeoutId = setTimeout(() => { + start = null; + attemptCount = 0; + timeoutId = null; + const attributeCache = cache; + cache = []; + handleAttributeMutations(attributeCache); + }, RETRY_TIMEOUT); + cache.push(...mutations); + return; + } + start = now; + attemptCount = 1; + } + handleAttributeMutations(mutations); + }); + attrObserver.observe(root, { + attributes: true, + attributeFilter: INLINE_STYLE_ATTRS.concat( + overridesList.map(({dataAttr}) => dataAttr) + ), + subtree: true + }); + attrObservers.set(root, attrObserver); + } + function stopWatchingForInlineStyles() { + treeObservers.forEach((o) => o.disconnect()); + attrObservers.forEach((o) => o.disconnect()); + treeObservers.clear(); + attrObservers.clear(); + } + const inlineStyleCache = new WeakMap(); + const filterProps = [ + "brightness", + "contrast", + "grayscale", + "sepia", + "mode" + ]; + function getInlineStyleCacheKey(el, theme) { + return INLINE_STYLE_ATTRS.map( + (attr) => `${attr}="${el.getAttribute(attr)}"` + ) + .concat(filterProps.map((prop) => `${prop}="${theme[prop]}"`)) + .join(" "); + } + function shouldIgnoreInlineStyle(element, selectors) { + for (let i = 0, len = selectors.length; i < len; i++) { + const ingnoredSelector = selectors[i]; + if (element.matches(ingnoredSelector)) { + return true; + } + } + return false; + } + function overrideInlineStyle( + element, + theme, + ignoreInlineSelectors, + ignoreImageSelectors + ) { + const cacheKey = getInlineStyleCacheKey(element, theme); + if (cacheKey === inlineStyleCache.get(element)) { + return; + } + const unsetProps = new Set(Object.keys(overrides)); + function setCustomProp(targetCSSProp, modifierCSSProp, cssVal) { + const isPropertyVariable = targetCSSProp.startsWith("--"); + const {customProp, dataAttr} = isPropertyVariable + ? {} + : overrides[targetCSSProp]; + const mod = getModifiableCSSDeclaration( + modifierCSSProp, + cssVal, + {style: element.style}, + variablesStore, + ignoreImageSelectors, + null + ); + if (!mod) { + return; + } + let value = mod.value; + if (typeof value === "function") { + value = value(theme); + } + if (isPropertyVariable && typeof value === "object") { + const typedValue = value; + typedValue.declarations.forEach(({property, value}) => { + !(value instanceof Promise) && + element.style.setProperty(property, value); + }); + } else { + element.style.setProperty(customProp, value); + if (!element.hasAttribute(dataAttr)) { + element.setAttribute(dataAttr, ""); + } + unsetProps.delete(targetCSSProp); + } + } + if (ignoreInlineSelectors.length > 0) { + if (shouldIgnoreInlineStyle(element, ignoreInlineSelectors)) { + unsetProps.forEach((cssProp) => { + element.removeAttribute(overrides[cssProp].dataAttr); + }); + return; + } + } + if (element.hasAttribute("bgcolor")) { + let value = element.getAttribute("bgcolor"); + if ( + value.match(/^[0-9a-f]{3}$/i) || + value.match(/^[0-9a-f]{6}$/i) + ) { + value = `#${value}`; + } + setCustomProp("background-color", "background-color", value); + } + if (element.hasAttribute("color") && element.rel !== "mask-icon") { + let value = element.getAttribute("color"); + if ( + value.match(/^[0-9a-f]{3}$/i) || + value.match(/^[0-9a-f]{6}$/i) + ) { + value = `#${value}`; + } + setCustomProp("color", "color", value); + } + if (element instanceof SVGElement) { + if (element.hasAttribute("fill")) { + const SMALL_SVG_LIMIT = 32; + const value = element.getAttribute("fill"); + if (value !== "none") { + if (!(element instanceof SVGTextElement)) { + const handleSVGElement = () => { + const {width, height} = + element.getBoundingClientRect(); + const isBg = + width > SMALL_SVG_LIMIT || + height > SMALL_SVG_LIMIT; + setCustomProp( + "fill", + isBg ? "background-color" : "color", + value + ); + }; + if (isReadyStateComplete()) { + handleSVGElement(); + } else { + addReadyStateCompleteListener(handleSVGElement); + } + } else { + setCustomProp("fill", "color", value); + } + } + } + if (element.hasAttribute("stop-color")) { + setCustomProp( + "stop-color", + "background-color", + element.getAttribute("stop-color") + ); + } + } + if (element.hasAttribute("stroke")) { + const value = element.getAttribute("stroke"); + setCustomProp( + "stroke", + element instanceof SVGLineElement || + element instanceof SVGTextElement + ? "border-color" + : "color", + value + ); + } + element.style && + iterateCSSDeclarations(element.style, (property, value) => { + if (property === "background-image" && value.includes("url")) { + return; + } + if ( + overrides.hasOwnProperty(property) || + (property.startsWith("--") && !normalizedPropList[property]) + ) { + setCustomProp(property, property, value); + } else { + const overridenProp = normalizedPropList[property]; + if ( + overridenProp && + !element.style.getPropertyValue(overridenProp) && + !element.hasAttribute(overridenProp) + ) { + if ( + overridenProp === "background-color" && + element.hasAttribute("bgcolor") + ) { + return; + } + element.style.setProperty(property, ""); + } + } + }); + if ( + element.style && + element instanceof SVGTextElement && + element.style.fill + ) { + setCustomProp( + "fill", + "color", + element.style.getPropertyValue("fill") + ); + } + forEach(unsetProps, (cssProp) => { + element.removeAttribute(overrides[cssProp].dataAttr); + }); + inlineStyleCache.set(element, getInlineStyleCacheKey(element, theme)); + } + + const metaThemeColorName = "theme-color"; + const metaThemeColorSelector = `meta[name="${metaThemeColorName}"]`; + let srcMetaThemeColor = null; + let observer = null; + function changeMetaThemeColor(meta, theme) { + srcMetaThemeColor = srcMetaThemeColor || meta.content; + const color = parseColorWithCache(srcMetaThemeColor); + if (!color) { + return; + } + meta.content = modifyBackgroundColor(color, theme); + } + function changeMetaThemeColorWhenAvailable(theme) { + const meta = document.querySelector(metaThemeColorSelector); + if (meta) { + changeMetaThemeColor(meta, theme); + } else { + if (observer) { + observer.disconnect(); + } + observer = new MutationObserver((mutations) => { + loop: for (let i = 0; i < mutations.length; i++) { + const {addedNodes} = mutations[i]; + for (let j = 0; j < addedNodes.length; j++) { + const node = addedNodes[j]; + if ( + node instanceof HTMLMetaElement && + node.name === metaThemeColorName + ) { + observer.disconnect(); + observer = null; + changeMetaThemeColor(node, theme); + break loop; + } + } + } + }); + observer.observe(document.head, {childList: true}); + } + } + function restoreMetaThemeColor() { + if (observer) { + observer.disconnect(); + observer = null; + } + const meta = document.querySelector(metaThemeColorSelector); + if (meta && srcMetaThemeColor) { + meta.content = srcMetaThemeColor; + } + } + + const themeCacheKeys = [ + "mode", + "brightness", + "contrast", + "grayscale", + "sepia", + "darkSchemeBackgroundColor", + "darkSchemeTextColor", + "lightSchemeBackgroundColor", + "lightSchemeTextColor" + ]; + function getThemeKey(theme) { + let resultKey = ""; + themeCacheKeys.forEach((key) => { + resultKey += `${key}:${theme[key]};`; + }); + return resultKey; + } + const asyncQueue = createAsyncTasksQueue(); + function createStyleSheetModifier() { + let renderId = 0; + const rulesTextCache = new Set(); + const rulesModCache = new Map(); + const varTypeChangeCleaners = new Set(); + let prevFilterKey = null; + let hasNonLoadedLink = false; + let wasRebuilt = false; + function shouldRebuildStyle() { + return hasNonLoadedLink && !wasRebuilt; + } + function modifySheet(options) { + const rules = options.sourceCSSRules; + const { + theme, + ignoreImageAnalysis, + force, + prepareSheet, + isAsyncCancelled + } = options; + let rulesChanged = rulesModCache.size === 0; + const notFoundCacheKeys = new Set(rulesModCache.keys()); + const themeKey = getThemeKey(theme); + const themeChanged = themeKey !== prevFilterKey; + if (hasNonLoadedLink) { + wasRebuilt = true; + } + const modRules = []; + iterateCSSRules( + rules, + (rule) => { + let cssText = rule.cssText; + let textDiffersFromPrev = false; + notFoundCacheKeys.delete(cssText); + if (rule.parentRule instanceof CSSMediaRule) { + cssText += `;${rule.parentRule.media.mediaText}`; + } + if (!rulesTextCache.has(cssText)) { + rulesTextCache.add(cssText); + textDiffersFromPrev = true; + } + if (textDiffersFromPrev) { + rulesChanged = true; + } else { + modRules.push(rulesModCache.get(cssText)); + return; + } + const modDecs = []; + rule.style && + iterateCSSDeclarations( + rule.style, + (property, value) => { + const mod = getModifiableCSSDeclaration( + property, + value, + rule, + variablesStore, + ignoreImageAnalysis, + isAsyncCancelled + ); + if (mod) { + modDecs.push(mod); + } + } + ); + let modRule = null; + if (modDecs.length > 0) { + const parentRule = rule.parentRule; + modRule = { + selector: rule.selectorText, + declarations: modDecs, + parentRule + }; + modRules.push(modRule); + } + rulesModCache.set(cssText, modRule); + }, + () => { + hasNonLoadedLink = true; + } + ); + notFoundCacheKeys.forEach((key) => { + rulesTextCache.delete(key); + rulesModCache.delete(key); + }); + prevFilterKey = themeKey; + if (!force && !rulesChanged && !themeChanged) { + return; + } + renderId++; + function setRule(target, index, rule) { + const {selector, declarations} = rule; + const getDeclarationText = (dec) => { + const {property, value, important, sourceValue} = dec; + return `${property}: ${ + value == null ? sourceValue : value + }${important ? " !important" : ""};`; + }; + let cssRulesText = ""; + declarations.forEach((declarations) => { + cssRulesText += `${getDeclarationText(declarations)} `; + }); + const ruleText = `${selector} { ${cssRulesText} }`; + target.insertRule(ruleText, index); + } + const asyncDeclarations = new Map(); + const varDeclarations = new Map(); + let asyncDeclarationCounter = 0; + let varDeclarationCounter = 0; + const rootReadyGroup = {rule: null, rules: [], isGroup: true}; + const groupRefs = new WeakMap(); + function getGroup(rule) { + if (rule == null) { + return rootReadyGroup; + } + if (groupRefs.has(rule)) { + return groupRefs.get(rule); + } + const group = {rule, rules: [], isGroup: true}; + groupRefs.set(rule, group); + const parentGroup = getGroup(rule.parentRule); + parentGroup.rules.push(group); + return group; + } + varTypeChangeCleaners.forEach((clear) => clear()); + varTypeChangeCleaners.clear(); + modRules + .filter((r) => r) + .forEach(({selector, declarations, parentRule}) => { + const group = getGroup(parentRule); + const readyStyleRule = { + selector, + declarations: [], + isGroup: false + }; + const readyDeclarations = readyStyleRule.declarations; + group.rules.push(readyStyleRule); + function handleAsyncDeclaration( + property, + modified, + important, + sourceValue + ) { + const asyncKey = ++asyncDeclarationCounter; + const asyncDeclaration = { + property, + value: null, + important, + asyncKey, + sourceValue + }; + readyDeclarations.push(asyncDeclaration); + const currentRenderId = renderId; + modified.then((asyncValue) => { + if ( + !asyncValue || + isAsyncCancelled() || + currentRenderId !== renderId + ) { + return; + } + asyncDeclaration.value = asyncValue; + asyncQueue.add(() => { + if ( + isAsyncCancelled() || + currentRenderId !== renderId + ) { + return; + } + rebuildAsyncRule(asyncKey); + }); + }); + } + function handleVarDeclarations( + property, + modified, + important, + sourceValue + ) { + const {declarations: varDecs, onTypeChange} = modified; + const varKey = ++varDeclarationCounter; + const currentRenderId = renderId; + const initialIndex = readyDeclarations.length; + let oldDecs = []; + if (varDecs.length === 0) { + const tempDec = { + property, + value: sourceValue, + important, + sourceValue, + varKey + }; + readyDeclarations.push(tempDec); + oldDecs = [tempDec]; + } + varDecs.forEach((mod) => { + if (mod.value instanceof Promise) { + handleAsyncDeclaration( + mod.property, + mod.value, + important, + sourceValue + ); + } else { + const readyDec = { + property: mod.property, + value: mod.value, + important, + sourceValue, + varKey + }; + readyDeclarations.push(readyDec); + oldDecs.push(readyDec); + } + }); + onTypeChange.addListener((newDecs) => { + if ( + isAsyncCancelled() || + currentRenderId !== renderId + ) { + return; + } + const readyVarDecs = newDecs.map((mod) => { + return { + property: mod.property, + value: mod.value, + important, + sourceValue, + varKey + }; + }); + const index = readyDeclarations.indexOf( + oldDecs[0], + initialIndex + ); + readyDeclarations.splice( + index, + oldDecs.length, + ...readyVarDecs + ); + oldDecs = readyVarDecs; + rebuildVarRule(varKey); + }); + varTypeChangeCleaners.add(() => + onTypeChange.removeListeners() + ); + } + declarations.forEach( + ({property, value, important, sourceValue}) => { + if (typeof value === "function") { + const modified = value(theme); + if (modified instanceof Promise) { + handleAsyncDeclaration( + property, + modified, + important, + sourceValue + ); + } else if (property.startsWith("--")) { + handleVarDeclarations( + property, + modified, + important, + sourceValue + ); + } else { + readyDeclarations.push({ + property, + value: modified, + important, + sourceValue + }); + } + } else { + readyDeclarations.push({ + property, + value, + important, + sourceValue + }); + } + } + ); + }); + const sheet = prepareSheet(); + function buildStyleSheet() { + function createTarget(group, parent) { + const {rule} = group; + if (rule instanceof CSSMediaRule) { + const {media} = rule; + const index = parent.cssRules.length; + parent.insertRule( + `@media ${media.mediaText} {}`, + index + ); + return parent.cssRules[index]; + } + return parent; + } + function iterateReadyRules(group, target, styleIterator) { + group.rules.forEach((r) => { + if (r.isGroup) { + const t = createTarget(r, target); + iterateReadyRules(r, t, styleIterator); + } else { + styleIterator(r, target); + } + }); + } + iterateReadyRules(rootReadyGroup, sheet, (rule, target) => { + const index = target.cssRules.length; + rule.declarations.forEach(({asyncKey, varKey}) => { + if (asyncKey != null) { + asyncDeclarations.set(asyncKey, { + rule, + target, + index + }); + } + if (varKey != null) { + varDeclarations.set(varKey, {rule, target, index}); + } + }); + setRule(target, index, rule); + }); + } + function rebuildAsyncRule(key) { + const {rule, target, index} = asyncDeclarations.get(key); + target.deleteRule(index); + setRule(target, index, rule); + asyncDeclarations.delete(key); + } + function rebuildVarRule(key) { + const {rule, target, index} = varDeclarations.get(key); + target.deleteRule(index); + setRule(target, index, rule); + } + buildStyleSheet(); + } + return {modifySheet, shouldRebuildStyle}; + } + + const STYLE_SELECTOR = 'style, link[rel*="stylesheet" i]:not([disabled])'; + function isFontsGoogleApiStyle(element) { + if (!element.href) { + return false; + } + try { + const elementURL = new URL(element.href); + return elementURL.hostname === "fonts.googleapis.com"; + } catch (err) { + logInfo(`Couldn't construct ${element.href} as URL`); + return false; + } + } + function shouldManageStyle(element) { + return ( + (element instanceof HTMLStyleElement || + element instanceof SVGStyleElement || + (element instanceof HTMLLinkElement && + element.rel && + element.rel.toLowerCase().includes("stylesheet") && + element.href && + !element.disabled && + (isFirefox + ? !element.href.startsWith("moz-extension://") + : true) && + !isFontsGoogleApiStyle(element))) && + !element.classList.contains("darkreader") && + element.media.toLowerCase() !== "print" && + !element.classList.contains("stylus") + ); + } + function getManageableStyles(node, results = [], deep = true) { + if (shouldManageStyle(node)) { + results.push(node); + } else if ( + node instanceof Element || + (isShadowDomSupported && node instanceof ShadowRoot) || + node === document + ) { + forEach(node.querySelectorAll(STYLE_SELECTOR), (style) => + getManageableStyles(style, results, false) + ); + if (deep) { + iterateShadowHosts(node, (host) => + getManageableStyles(host.shadowRoot, results, false) + ); + } + } + return results; + } + const syncStyleSet = new WeakSet(); + const corsStyleSet = new WeakSet(); + let canOptimizeUsingProxy$1 = false; + document.addEventListener("__darkreader__inlineScriptsAllowed", () => { + canOptimizeUsingProxy$1 = true; + }); + let loadingLinkCounter = 0; + const rejectorsForLoadingLinks = new Map(); + function cleanLoadingLinks() { + rejectorsForLoadingLinks.clear(); + } + function manageStyle(element, {update, loadingStart, loadingEnd}) { + const prevStyles = []; + let next = element; + while ( + (next = next.nextElementSibling) && + next.matches(".darkreader") + ) { + prevStyles.push(next); + } + let corsCopy = + prevStyles.find( + (el) => el.matches(".darkreader--cors") && !corsStyleSet.has(el) + ) || null; + let syncStyle = + prevStyles.find( + (el) => el.matches(".darkreader--sync") && !syncStyleSet.has(el) + ) || null; + let corsCopyPositionWatcher = null; + let syncStylePositionWatcher = null; + let cancelAsyncOperations = false; + let isOverrideEmpty = true; + const sheetModifier = createStyleSheetModifier(); + const observer = new MutationObserver(() => { + update(); + }); + const observerOptions = { + attributes: true, + childList: true, + subtree: true, + characterData: true + }; + function containsCSSImport() { + return ( + element instanceof HTMLStyleElement && + element.textContent.trim().match(cssImportRegex) + ); + } + function hasImports(cssRules, checkCrossOrigin) { + let result = false; + if (cssRules) { + let rule; + cssRulesLoop: for ( + let i = 0, len = cssRules.length; + i < len; + i++ + ) { + rule = cssRules[i]; + if (rule.href) { + if (checkCrossOrigin) { + if ( + rule.href.startsWith("http") && + !rule.href.startsWith(location.origin) + ) { + result = true; + break cssRulesLoop; + } + } else { + result = true; + break cssRulesLoop; + } + } + } + } + return result; + } + function getRulesSync() { + if (corsCopy) { + return corsCopy.sheet.cssRules; + } + if (containsCSSImport()) { + return null; + } + const cssRules = safeGetSheetRules(); + if ( + element instanceof HTMLLinkElement && + !isRelativeHrefOnAbsolutePath(element.href) && + hasImports(cssRules, false) + ) { + return null; + } + if (hasImports(cssRules, true)) { + return null; + } + return cssRules; + } + function insertStyle() { + if (corsCopy) { + if (element.nextSibling !== corsCopy) { + element.parentNode.insertBefore( + corsCopy, + element.nextSibling + ); + } + if (corsCopy.nextSibling !== syncStyle) { + element.parentNode.insertBefore( + syncStyle, + corsCopy.nextSibling + ); + } + } else if (element.nextSibling !== syncStyle) { + element.parentNode.insertBefore(syncStyle, element.nextSibling); + } + } + function createSyncStyle() { + syncStyle = + element instanceof SVGStyleElement + ? document.createElementNS( + "http://www.w3.org/2000/svg", + "style" + ) + : document.createElement("style"); + syncStyle.classList.add("darkreader"); + syncStyle.classList.add("darkreader--sync"); + syncStyle.media = "screen"; + if (element.title) { + syncStyle.title = element.title; + } + syncStyleSet.add(syncStyle); + } + let isLoadingRules = false; + let wasLoadingError = false; + const loadingLinkId = ++loadingLinkCounter; + async function getRulesAsync() { + let cssText; + let cssBasePath; + if (element instanceof HTMLLinkElement) { + let [cssRules, accessError] = getRulesOrError(); + if ( + (!cssRules && !accessError && !isSafari) || + isSafari || + isStillLoadingError(accessError) + ) { + try { + logInfo( + `Linkelement ${loadingLinkId} is not loaded yet and thus will be await for`, + element + ); + await linkLoading(element, loadingLinkId); + } catch (err) { + wasLoadingError = true; + } + if (cancelAsyncOperations) { + return null; + } + [cssRules, accessError] = getRulesOrError(); + } + if (cssRules) { + if (!hasImports(cssRules, false)) { + return cssRules; + } + } + cssText = await loadText(element.href); + cssBasePath = getCSSBaseBath(element.href); + if (cancelAsyncOperations) { + return null; + } + } else if (containsCSSImport()) { + cssText = element.textContent.trim(); + cssBasePath = getCSSBaseBath(location.href); + } else { + return null; + } + if (cssText) { + try { + const fullCSSText = await replaceCSSImports( + cssText, + cssBasePath + ); + corsCopy = createCORSCopy(element, fullCSSText); + } catch (err) {} + if (corsCopy) { + corsCopyPositionWatcher = watchForNodePosition( + corsCopy, + "prev-sibling" + ); + return corsCopy.sheet.cssRules; + } + } + return null; + } + function details(options) { + const rules = getRulesSync(); + if (!rules) { + if (options.secondRound) { + return null; + } + if (isLoadingRules || wasLoadingError) { + return null; + } + isLoadingRules = true; + loadingStart(); + getRulesAsync() + .then((results) => { + isLoadingRules = false; + loadingEnd(); + if (results) { + update(); + } + }) + .catch((err) => { + isLoadingRules = false; + loadingEnd(); + }); + return null; + } + return {rules}; + } + let forceRenderStyle = false; + function render(theme, ignoreImageAnalysis) { + const rules = getRulesSync(); + if (!rules) { + return; + } + cancelAsyncOperations = false; + function removeCSSRulesFromSheet(sheet) { + for (let i = sheet.cssRules.length - 1; i >= 0; i--) { + sheet.deleteRule(i); + } + } + function prepareOverridesSheet() { + if (!syncStyle) { + createSyncStyle(); + } + syncStylePositionWatcher && syncStylePositionWatcher.stop(); + insertStyle(); + if (syncStyle.sheet == null) { + syncStyle.textContent = ""; + } + const sheet = syncStyle.sheet; + removeCSSRulesFromSheet(sheet); + if (syncStylePositionWatcher) { + syncStylePositionWatcher.run(); + } else { + syncStylePositionWatcher = watchForNodePosition( + syncStyle, + "prev-sibling", + () => { + forceRenderStyle = true; + buildOverrides(); + } + ); + } + return syncStyle.sheet; + } + function buildOverrides() { + const force = forceRenderStyle; + forceRenderStyle = false; + sheetModifier.modifySheet({ + prepareSheet: prepareOverridesSheet, + sourceCSSRules: rules, + theme, + ignoreImageAnalysis, + force, + isAsyncCancelled: () => cancelAsyncOperations + }); + isOverrideEmpty = syncStyle.sheet.cssRules.length === 0; + if (sheetModifier.shouldRebuildStyle()) { + addReadyStateCompleteListener(() => update()); + } + } + buildOverrides(); + } + function getRulesOrError() { + try { + if (element.sheet == null) { + return [null, null]; + } + return [element.sheet.cssRules, null]; + } catch (err) { + return [null, err]; + } + } + function isStillLoadingError(error) { + return error && error.message && error.message.includes("loading"); + } + function safeGetSheetRules() { + const [cssRules, err] = getRulesOrError(); + if (err) { + return null; + } + return cssRules; + } + function watchForSheetChanges() { + watchForSheetChangesUsingProxy(); + if (!(canOptimizeUsingProxy$1 && element.sheet)) { + watchForSheetChangesUsingRAF(); + } + } + let rulesChangeKey = null; + let rulesCheckFrameId = null; + function getRulesChangeKey() { + const rules = safeGetSheetRules(); + return rules ? rules.length : null; + } + function didRulesKeyChange() { + return getRulesChangeKey() !== rulesChangeKey; + } + function watchForSheetChangesUsingRAF() { + rulesChangeKey = getRulesChangeKey(); + stopWatchingForSheetChangesUsingRAF(); + const checkForUpdate = () => { + if (didRulesKeyChange()) { + rulesChangeKey = getRulesChangeKey(); + update(); + } + if (canOptimizeUsingProxy$1 && element.sheet) { + stopWatchingForSheetChangesUsingRAF(); + return; + } + rulesCheckFrameId = requestAnimationFrame(checkForUpdate); + }; + checkForUpdate(); + } + function stopWatchingForSheetChangesUsingRAF() { + cancelAnimationFrame(rulesCheckFrameId); + } + let areSheetChangesPending = false; + function onSheetChange() { + canOptimizeUsingProxy$1 = true; + stopWatchingForSheetChangesUsingRAF(); + if (areSheetChangesPending) { + return; + } + function handleSheetChanges() { + areSheetChangesPending = false; + if (cancelAsyncOperations) { + return; + } + update(); + } + areSheetChangesPending = true; + if (typeof queueMicrotask === "function") { + queueMicrotask(handleSheetChanges); + } else { + requestAnimationFrame(handleSheetChanges); + } + } + function watchForSheetChangesUsingProxy() { + element.addEventListener( + "__darkreader__updateSheet", + onSheetChange + ); + } + function stopWatchingForSheetChangesUsingProxy() { + element.removeEventListener( + "__darkreader__updateSheet", + onSheetChange + ); + } + function stopWatchingForSheetChanges() { + stopWatchingForSheetChangesUsingProxy(); + stopWatchingForSheetChangesUsingRAF(); + } + function pause() { + observer.disconnect(); + cancelAsyncOperations = true; + corsCopyPositionWatcher && corsCopyPositionWatcher.stop(); + syncStylePositionWatcher && syncStylePositionWatcher.stop(); + stopWatchingForSheetChanges(); + } + function destroy() { + pause(); + removeNode(corsCopy); + removeNode(syncStyle); + loadingEnd(); + if (rejectorsForLoadingLinks.has(loadingLinkId)) { + const reject = rejectorsForLoadingLinks.get(loadingLinkId); + rejectorsForLoadingLinks.delete(loadingLinkId); + reject && reject(); + } + } + function watch() { + observer.observe(element, observerOptions); + if (element instanceof HTMLStyleElement) { + watchForSheetChanges(); + } + } + const maxMoveCount = 10; + let moveCount = 0; + function restore() { + if (!syncStyle) { + return; + } + moveCount++; + if (moveCount > maxMoveCount) { + return; + } + insertStyle(); + corsCopyPositionWatcher && corsCopyPositionWatcher.skip(); + syncStylePositionWatcher && syncStylePositionWatcher.skip(); + if (!isOverrideEmpty) { + forceRenderStyle = true; + update(); + } + } + return { + details, + render, + pause, + destroy, + watch, + restore + }; + } + async function linkLoading(link, loadingId) { + return new Promise((resolve, reject) => { + const cleanUp = () => { + link.removeEventListener("load", onLoad); + link.removeEventListener("error", onError); + rejectorsForLoadingLinks.delete(loadingId); + }; + const onLoad = () => { + cleanUp(); + resolve(); + }; + const onError = () => { + cleanUp(); + reject( + `Linkelement ${loadingId} couldn't be loaded. ${link.href}` + ); + }; + rejectorsForLoadingLinks.set(loadingId, () => { + cleanUp(); + reject(); + }); + link.addEventListener("load", onLoad); + link.addEventListener("error", onError); + if (!link.href) { + onError(); + } + }); + } + function getCSSImportURL(importDeclaration) { + return getCSSURLValue( + importDeclaration + .substring(7) + .trim() + .replace(/;$/, "") + .replace(/screen$/, "") + ); + } + async function loadText(url) { + if (url.startsWith("data:")) { + return await (await fetch(url)).text(); + } + return await bgFetch({ + url, + responseType: "text", + mimeType: "text/css", + origin: window.location.origin + }); + } + async function replaceCSSImports(cssText, basePath, cache = new Map()) { + cssText = removeCSSComments(cssText); + cssText = replaceCSSFontFace(cssText); + cssText = replaceCSSRelativeURLsWithAbsolute(cssText, basePath); + const importMatches = getMatches(cssImportRegex, cssText); + for (const match of importMatches) { + const importURL = getCSSImportURL(match); + const absoluteURL = getAbsoluteURL(basePath, importURL); + let importedCSS; + if (cache.has(absoluteURL)) { + importedCSS = cache.get(absoluteURL); + } else { + try { + importedCSS = await loadText(absoluteURL); + cache.set(absoluteURL, importedCSS); + importedCSS = await replaceCSSImports( + importedCSS, + getCSSBaseBath(absoluteURL), + cache + ); + } catch (err) { + importedCSS = ""; + } + } + cssText = cssText.split(match).join(importedCSS); + } + cssText = cssText.trim(); + return cssText; + } + function createCORSCopy(srcElement, cssText) { + if (!cssText) { + return null; + } + const cors = document.createElement("style"); + cors.classList.add("darkreader"); + cors.classList.add("darkreader--cors"); + cors.media = "screen"; + cors.textContent = cssText; + srcElement.parentNode.insertBefore(cors, srcElement.nextSibling); + cors.sheet.disabled = true; + corsStyleSet.add(cors); + return cors; + } + + const observers = []; + let observedRoots; + const undefinedGroups = new Map(); + let elementsDefinitionCallback; + function collectUndefinedElements(root) { + if (!isDefinedSelectorSupported) { + return; + } + forEach(root.querySelectorAll(":not(:defined)"), (el) => { + let tag = el.tagName.toLowerCase(); + if (!tag.includes("-")) { + const extendedTag = el.getAttribute("is"); + if (extendedTag) { + tag = extendedTag; + } else { + return; + } + } + if (!undefinedGroups.has(tag)) { + undefinedGroups.set(tag, new Set()); + customElementsWhenDefined(tag).then(() => { + if (elementsDefinitionCallback) { + const elements = undefinedGroups.get(tag); + undefinedGroups.delete(tag); + elementsDefinitionCallback(Array.from(elements)); + } + }); + } + undefinedGroups.get(tag).add(el); + }); + } + let canOptimizeUsingProxy = false; + document.addEventListener("__darkreader__inlineScriptsAllowed", () => { + canOptimizeUsingProxy = true; + }); + const resolvers = new Map(); + function handleIsDefined(e) { + canOptimizeUsingProxy = true; + if (resolvers.has(e.detail.tag)) { + const resolve = resolvers.get(e.detail.tag); + resolve(); + } + } + async function customElementsWhenDefined(tag) { + return new Promise((resolve) => { + if ( + window.customElements && + typeof customElements.whenDefined === "function" + ) { + customElements.whenDefined(tag).then(() => resolve()); + } else if (canOptimizeUsingProxy) { + resolvers.set(tag, resolve); + document.dispatchEvent( + new CustomEvent("__darkreader__addUndefinedResolver", { + detail: {tag} + }) + ); + } else { + const checkIfDefined = () => { + const elements = undefinedGroups.get(tag); + if (elements && elements.size > 0) { + if ( + elements.values().next().value.matches(":defined") + ) { + resolve(); + } else { + requestAnimationFrame(checkIfDefined); + } + } + }; + requestAnimationFrame(checkIfDefined); + } + }); + } + function watchWhenCustomElementsDefined(callback) { + elementsDefinitionCallback = callback; + } + function unsubscribeFromDefineCustomElements() { + elementsDefinitionCallback = null; + undefinedGroups.clear(); + document.removeEventListener( + "__darkreader__isDefined", + handleIsDefined + ); + } + function watchForStyleChanges(currentStyles, update, shadowRootDiscovered) { + stopWatchingForStyleChanges(); + const prevStyles = new Set(currentStyles); + const prevStyleSiblings = new WeakMap(); + const nextStyleSiblings = new WeakMap(); + function saveStylePosition(style) { + prevStyleSiblings.set(style, style.previousElementSibling); + nextStyleSiblings.set(style, style.nextElementSibling); + } + function forgetStylePosition(style) { + prevStyleSiblings.delete(style); + nextStyleSiblings.delete(style); + } + function didStylePositionChange(style) { + return ( + style.previousElementSibling !== prevStyleSiblings.get(style) || + style.nextElementSibling !== nextStyleSiblings.get(style) + ); + } + currentStyles.forEach(saveStylePosition); + function handleStyleOperations(operations) { + const {createdStyles, removedStyles, movedStyles} = operations; + createdStyles.forEach((s) => saveStylePosition(s)); + movedStyles.forEach((s) => saveStylePosition(s)); + removedStyles.forEach((s) => forgetStylePosition(s)); + createdStyles.forEach((s) => prevStyles.add(s)); + removedStyles.forEach((s) => prevStyles.delete(s)); + if ( + createdStyles.size + removedStyles.size + movedStyles.size > + 0 + ) { + update({ + created: Array.from(createdStyles), + removed: Array.from(removedStyles), + moved: Array.from(movedStyles), + updated: [] + }); + } + } + function handleMinorTreeMutations({additions, moves, deletions}) { + const createdStyles = new Set(); + const removedStyles = new Set(); + const movedStyles = new Set(); + additions.forEach((node) => + getManageableStyles(node).forEach((style) => + createdStyles.add(style) + ) + ); + deletions.forEach((node) => + getManageableStyles(node).forEach((style) => + removedStyles.add(style) + ) + ); + moves.forEach((node) => + getManageableStyles(node).forEach((style) => + movedStyles.add(style) + ) + ); + handleStyleOperations({createdStyles, removedStyles, movedStyles}); + additions.forEach((n) => { + iterateShadowHosts(n, subscribeForShadowRootChanges); + collectUndefinedElements(n); + }); + } + function handleHugeTreeMutations(root) { + const styles = new Set(getManageableStyles(root)); + const createdStyles = new Set(); + const removedStyles = new Set(); + const movedStyles = new Set(); + styles.forEach((s) => { + if (!prevStyles.has(s)) { + createdStyles.add(s); + } + }); + prevStyles.forEach((s) => { + if (!styles.has(s)) { + removedStyles.add(s); + } + }); + styles.forEach((s) => { + if ( + !createdStyles.has(s) && + !removedStyles.has(s) && + didStylePositionChange(s) + ) { + movedStyles.add(s); + } + }); + handleStyleOperations({createdStyles, removedStyles, movedStyles}); + iterateShadowHosts(root, subscribeForShadowRootChanges); + collectUndefinedElements(root); + } + function handleAttributeMutations(mutations) { + const updatedStyles = new Set(); + const removedStyles = new Set(); + mutations.forEach((m) => { + const {target} = m; + if (target.isConnected) { + if (shouldManageStyle(target)) { + updatedStyles.add(target); + } else if ( + target instanceof HTMLLinkElement && + target.disabled + ) { + removedStyles.add(target); + } + } + }); + if (updatedStyles.size + removedStyles.size > 0) { + update({ + updated: Array.from(updatedStyles), + created: [], + removed: Array.from(removedStyles), + moved: [] + }); + } + } + function observe(root) { + const treeObserver = createOptimizedTreeObserver(root, { + onMinorMutations: handleMinorTreeMutations, + onHugeMutations: handleHugeTreeMutations + }); + const attrObserver = new MutationObserver(handleAttributeMutations); + attrObserver.observe(root, { + attributes: true, + attributeFilter: ["rel", "disabled", "media", "href"], + subtree: true + }); + observers.push(treeObserver, attrObserver); + observedRoots.add(root); + } + function subscribeForShadowRootChanges(node) { + const {shadowRoot} = node; + if (shadowRoot == null || observedRoots.has(shadowRoot)) { + return; + } + observe(shadowRoot); + shadowRootDiscovered(shadowRoot); + } + observe(document); + iterateShadowHosts( + document.documentElement, + subscribeForShadowRootChanges + ); + watchWhenCustomElementsDefined((hosts) => { + const newStyles = []; + hosts.forEach((host) => + push(newStyles, getManageableStyles(host.shadowRoot)) + ); + update({created: newStyles, updated: [], removed: [], moved: []}); + hosts.forEach((host) => { + const {shadowRoot} = host; + if (shadowRoot == null) { + return; + } + subscribeForShadowRootChanges(host); + iterateShadowHosts(shadowRoot, subscribeForShadowRootChanges); + collectUndefinedElements(shadowRoot); + }); + }); + document.addEventListener("__darkreader__isDefined", handleIsDefined); + collectUndefinedElements(document); + } + function resetObservers() { + observers.forEach((o) => o.disconnect()); + observers.splice(0, observers.length); + observedRoots = new WeakSet(); + } + function stopWatchingForStyleChanges() { + resetObservers(); + unsubscribeFromDefineCustomElements(); + } + + function hexify(number) { + return (number < 16 ? "0" : "") + number.toString(16); + } + function generateUID() { + if ("randomUUID" in crypto) { + const uuid = crypto.randomUUID(); + return ( + uuid.substring(0, 8) + + uuid.substring(9, 13) + + uuid.substring(14, 18) + + uuid.substring(19, 23) + + uuid.substring(24) + ); + } + return Array.from(crypto.getRandomValues(new Uint8Array(16))) + .map((x) => hexify(x)) + .join(""); + } + + const adoptedStyleOverrides = new WeakMap(); + const overrideList = new WeakSet(); + function createAdoptedStyleSheetOverride(node) { + let cancelAsyncOperations = false; + function injectSheet(sheet, override) { + const newSheets = [...node.adoptedStyleSheets]; + const sheetIndex = newSheets.indexOf(sheet); + const existingIndex = newSheets.indexOf(override); + if (sheetIndex === existingIndex - 1) { + return; + } + if (existingIndex >= 0) { + newSheets.splice(existingIndex, 1); + } + newSheets.splice(sheetIndex + 1, 0, override); + node.adoptedStyleSheets = newSheets; + } + function destroy() { + cancelAsyncOperations = true; + const newSheets = [...node.adoptedStyleSheets]; + node.adoptedStyleSheets.forEach((adoptedStyleSheet) => { + if (overrideList.has(adoptedStyleSheet)) { + const existingIndex = newSheets.indexOf(adoptedStyleSheet); + if (existingIndex >= 0) { + newSheets.splice(existingIndex, 1); + } + adoptedStyleOverrides.delete(adoptedStyleSheet); + overrideList.delete(adoptedStyleSheet); + } + }); + node.adoptedStyleSheets = newSheets; + } + function render(theme, ignoreImageAnalysis) { + node.adoptedStyleSheets.forEach((sheet) => { + if (overrideList.has(sheet)) { + return; + } + const rules = sheet.rules; + const override = new CSSStyleSheet(); + function prepareOverridesSheet() { + for (let i = override.cssRules.length - 1; i >= 0; i--) { + override.deleteRule(i); + } + injectSheet(sheet, override); + adoptedStyleOverrides.set(sheet, override); + overrideList.add(override); + return override; + } + const sheetModifier = createStyleSheetModifier(); + sheetModifier.modifySheet({ + prepareSheet: prepareOverridesSheet, + sourceCSSRules: rules, + theme, + ignoreImageAnalysis, + force: false, + isAsyncCancelled: () => cancelAsyncOperations + }); + }); + } + return { + render, + destroy + }; + } + + function injectProxy(enableStyleSheetsProxy) { + document.dispatchEvent( + new CustomEvent("__darkreader__inlineScriptsAllowed") + ); + const addRuleDescriptor = Object.getOwnPropertyDescriptor( + CSSStyleSheet.prototype, + "addRule" + ); + const insertRuleDescriptor = Object.getOwnPropertyDescriptor( + CSSStyleSheet.prototype, + "insertRule" + ); + const deleteRuleDescriptor = Object.getOwnPropertyDescriptor( + CSSStyleSheet.prototype, + "deleteRule" + ); + const removeRuleDescriptor = Object.getOwnPropertyDescriptor( + CSSStyleSheet.prototype, + "removeRule" + ); + const documentStyleSheetsDescriptor = enableStyleSheetsProxy + ? Object.getOwnPropertyDescriptor(Document.prototype, "styleSheets") + : null; + const shouldWrapHTMLElement = [ + "baidu.com", + "baike.baidu.com", + "ditu.baidu.com", + "map.baidu.com", + "maps.baidu.com", + "haokan.baidu.com", + "pan.baidu.com", + "passport.baidu.com", + "tieba.baidu.com", + "www.baidu.com" + ].includes(location.hostname); + const getElementsByTagNameDescriptor = shouldWrapHTMLElement + ? Object.getOwnPropertyDescriptor( + Element.prototype, + "getElementsByTagName" + ) + : null; + const cleanUp = () => { + Object.defineProperty( + CSSStyleSheet.prototype, + "addRule", + addRuleDescriptor + ); + Object.defineProperty( + CSSStyleSheet.prototype, + "insertRule", + insertRuleDescriptor + ); + Object.defineProperty( + CSSStyleSheet.prototype, + "deleteRule", + deleteRuleDescriptor + ); + Object.defineProperty( + CSSStyleSheet.prototype, + "removeRule", + removeRuleDescriptor + ); + document.removeEventListener("__darkreader__cleanUp", cleanUp); + document.removeEventListener( + "__darkreader__addUndefinedResolver", + addUndefinedResolver + ); + if (enableStyleSheetsProxy) { + Object.defineProperty( + Document.prototype, + "styleSheets", + documentStyleSheetsDescriptor + ); + } + if (shouldWrapHTMLElement) { + Object.defineProperty( + Element.prototype, + "getElementsByTagName", + getElementsByTagNameDescriptor + ); + } + }; + const addUndefinedResolver = (e) => { + customElements.whenDefined(e.detail.tag).then(() => { + document.dispatchEvent( + new CustomEvent("__darkreader__isDefined", { + detail: {tag: e.detail.tag} + }) + ); + }); + }; + document.addEventListener("__darkreader__cleanUp", cleanUp); + document.addEventListener( + "__darkreader__addUndefinedResolver", + addUndefinedResolver + ); + const updateSheetEvent = new Event("__darkreader__updateSheet"); + function proxyAddRule(selector, style, index) { + addRuleDescriptor.value.call(this, selector, style, index); + if ( + this.ownerNode && + !this.ownerNode.classList.contains("darkreader") + ) { + this.ownerNode.dispatchEvent(updateSheetEvent); + } + return -1; + } + function proxyInsertRule(rule, index) { + const returnValue = insertRuleDescriptor.value.call( + this, + rule, + index + ); + if ( + this.ownerNode && + !this.ownerNode.classList.contains("darkreader") + ) { + this.ownerNode.dispatchEvent(updateSheetEvent); + } + return returnValue; + } + function proxyDeleteRule(index) { + deleteRuleDescriptor.value.call(this, index); + if ( + this.ownerNode && + !this.ownerNode.classList.contains("darkreader") + ) { + this.ownerNode.dispatchEvent(updateSheetEvent); + } + } + function proxyRemoveRule(index) { + removeRuleDescriptor.value.call(this, index); + if ( + this.ownerNode && + !this.ownerNode.classList.contains("darkreader") + ) { + this.ownerNode.dispatchEvent(updateSheetEvent); + } + } + function proxyDocumentStyleSheets() { + const getCurrentValue = () => { + const docSheets = documentStyleSheetsDescriptor.get.call(this); + const filteredSheets = [...docSheets].filter((styleSheet) => { + return !styleSheet.ownerNode.classList.contains( + "darkreader" + ); + }); + filteredSheets.item = (item) => { + return filteredSheets[item]; + }; + return Object.setPrototypeOf( + filteredSheets, + StyleSheetList.prototype + ); + }; + let elements = getCurrentValue(); + const styleSheetListBehavior = { + get: function (_, property) { + return getCurrentValue()[property]; + } + }; + elements = new Proxy(elements, styleSheetListBehavior); + return elements; + } + function proxyGetElementsByTagName(tagName) { + if (tagName !== "style") { + return getElementsByTagNameDescriptor.value.call(this, tagName); + } + const getCurrentElementValue = () => { + const elements = getElementsByTagNameDescriptor.value.call( + this, + tagName + ); + return Object.setPrototypeOf( + [...elements].filter((element) => { + return !element.classList.contains("darkreader"); + }), + NodeList.prototype + ); + }; + let elements = getCurrentElementValue(); + const nodeListBehavior = { + get: function (_, property) { + return getCurrentElementValue()[ + Number(property) || property + ]; + } + }; + elements = new Proxy(elements, nodeListBehavior); + return elements; + } + Object.defineProperty( + CSSStyleSheet.prototype, + "addRule", + Object.assign({}, addRuleDescriptor, {value: proxyAddRule}) + ); + Object.defineProperty( + CSSStyleSheet.prototype, + "insertRule", + Object.assign({}, insertRuleDescriptor, {value: proxyInsertRule}) + ); + Object.defineProperty( + CSSStyleSheet.prototype, + "deleteRule", + Object.assign({}, deleteRuleDescriptor, {value: proxyDeleteRule}) + ); + Object.defineProperty( + CSSStyleSheet.prototype, + "removeRule", + Object.assign({}, removeRuleDescriptor, {value: proxyRemoveRule}) + ); + if (enableStyleSheetsProxy) { + Object.defineProperty( + Document.prototype, + "styleSheets", + Object.assign({}, documentStyleSheetsDescriptor, { + get: proxyDocumentStyleSheets + }) + ); + } + if (shouldWrapHTMLElement) { + Object.defineProperty( + Element.prototype, + "getElementsByTagName", + Object.assign({}, getElementsByTagNameDescriptor, { + value: proxyGetElementsByTagName + }) + ); + } + } + + const INSTANCE_ID = generateUID(); + const styleManagers = new Map(); + const adoptedStyleManagers = []; + let filter = null; + let fixes = null; + let isIFrame = null; + let ignoredImageAnalysisSelectors = null; + let ignoredInlineSelectors = null; + function createOrUpdateStyle(className, root = document.head || document) { + let element = root.querySelector(`.${className}`); + if (!element) { + element = document.createElement("style"); + element.classList.add("darkreader"); + element.classList.add(className); + element.media = "screen"; + element.textContent = ""; + } + return element; + } + function createOrUpdateScript(className, root = document.head || document) { + let element = root.querySelector(`.${className}`); + if (!element) { + element = document.createElement("script"); + element.classList.add("darkreader"); + element.classList.add(className); + } + return element; + } + const nodePositionWatchers = new Map(); + function setupNodePositionWatcher(node, alias) { + nodePositionWatchers.has(alias) && + nodePositionWatchers.get(alias).stop(); + nodePositionWatchers.set(alias, watchForNodePosition(node, "parent")); + } + function stopStylePositionWatchers() { + forEach(nodePositionWatchers.values(), (watcher) => watcher.stop()); + nodePositionWatchers.clear(); + } + function createStaticStyleOverrides() { + const fallbackStyle = createOrUpdateStyle( + "darkreader--fallback", + document + ); + fallbackStyle.textContent = getModifiedFallbackStyle(filter, { + strict: true + }); + document.head.insertBefore(fallbackStyle, document.head.firstChild); + setupNodePositionWatcher(fallbackStyle, "fallback"); + const userAgentStyle = createOrUpdateStyle("darkreader--user-agent"); + userAgentStyle.textContent = getModifiedUserAgentStyle( + filter, + isIFrame, + filter.styleSystemControls + ); + document.head.insertBefore(userAgentStyle, fallbackStyle.nextSibling); + setupNodePositionWatcher(userAgentStyle, "user-agent"); + const textStyle = createOrUpdateStyle("darkreader--text"); + if (filter.useFont || filter.textStroke > 0) { + textStyle.textContent = createTextStyle(filter); + } else { + textStyle.textContent = ""; + } + document.head.insertBefore(textStyle, fallbackStyle.nextSibling); + setupNodePositionWatcher(textStyle, "text"); + const invertStyle = createOrUpdateStyle("darkreader--invert"); + if (fixes && Array.isArray(fixes.invert) && fixes.invert.length > 0) { + invertStyle.textContent = [ + `${fixes.invert.join(", ")} {`, + ` filter: ${getCSSFilterValue({ + ...filter, + contrast: + filter.mode === 0 + ? filter.contrast + : clamp(filter.contrast - 10, 0, 100) + })} !important;`, + "}" + ].join("\n"); + } else { + invertStyle.textContent = ""; + } + document.head.insertBefore(invertStyle, textStyle.nextSibling); + setupNodePositionWatcher(invertStyle, "invert"); + const inlineStyle = createOrUpdateStyle("darkreader--inline"); + inlineStyle.textContent = getInlineOverrideStyle(); + document.head.insertBefore(inlineStyle, invertStyle.nextSibling); + setupNodePositionWatcher(inlineStyle, "inline"); + const overrideStyle = createOrUpdateStyle("darkreader--override"); + overrideStyle.textContent = + fixes && fixes.css ? replaceCSSTemplates(fixes.css) : ""; + document.head.appendChild(overrideStyle); + setupNodePositionWatcher(overrideStyle, "override"); + const variableStyle = createOrUpdateStyle("darkreader--variables"); + const selectionColors = getSelectionColor(filter); + const { + darkSchemeBackgroundColor, + darkSchemeTextColor, + lightSchemeBackgroundColor, + lightSchemeTextColor, + mode + } = filter; + let schemeBackgroundColor = + mode === 0 ? lightSchemeBackgroundColor : darkSchemeBackgroundColor; + let schemeTextColor = + mode === 0 ? lightSchemeTextColor : darkSchemeTextColor; + schemeBackgroundColor = modifyBackgroundColor( + parseColorWithCache(schemeBackgroundColor), + filter + ); + schemeTextColor = modifyForegroundColor( + parseColorWithCache(schemeTextColor), + filter + ); + variableStyle.textContent = [ + `:root {`, + ` --darkreader-neutral-background: ${schemeBackgroundColor};`, + ` --darkreader-neutral-text: ${schemeTextColor};`, + ` --darkreader-selection-background: ${selectionColors.backgroundColorSelection};`, + ` --darkreader-selection-text: ${selectionColors.foregroundColorSelection};`, + `}` + ].join("\n"); + document.head.insertBefore(variableStyle, inlineStyle.nextSibling); + setupNodePositionWatcher(variableStyle, "variables"); + const rootVarsStyle = createOrUpdateStyle("darkreader--root-vars"); + document.head.insertBefore(rootVarsStyle, variableStyle.nextSibling); + const injectProxyArg = !(fixes && fixes.disableStyleSheetsProxy); + { + const proxyScript = createOrUpdateScript("darkreader--proxy"); + proxyScript.append(`(${injectProxy})(${injectProxyArg})`); + document.head.insertBefore(proxyScript, rootVarsStyle.nextSibling); + proxyScript.remove(); + } + } + const shadowRootsWithOverrides = new Set(); + function createShadowStaticStyleOverrides(root) { + const inlineStyle = createOrUpdateStyle("darkreader--inline", root); + inlineStyle.textContent = getInlineOverrideStyle(); + root.insertBefore(inlineStyle, root.firstChild); + const overrideStyle = createOrUpdateStyle("darkreader--override", root); + overrideStyle.textContent = + fixes && fixes.css ? replaceCSSTemplates(fixes.css) : ""; + root.insertBefore(overrideStyle, inlineStyle.nextSibling); + const invertStyle = createOrUpdateStyle("darkreader--invert", root); + if (fixes && Array.isArray(fixes.invert) && fixes.invert.length > 0) { + invertStyle.textContent = [ + `${fixes.invert.join(", ")} {`, + ` filter: ${getCSSFilterValue({ + ...filter, + contrast: + filter.mode === 0 + ? filter.contrast + : clamp(filter.contrast - 10, 0, 100) + })} !important;`, + "}" + ].join("\n"); + } else { + invertStyle.textContent = ""; + } + root.insertBefore(invertStyle, overrideStyle.nextSibling); + shadowRootsWithOverrides.add(root); + } + function replaceCSSTemplates($cssText) { + return $cssText.replace(/\${(.+?)}/g, (_, $color) => { + const color = parseColorWithCache($color); + if (color) { + return modifyColor(color, filter); + } + return $color; + }); + } + function cleanFallbackStyle() { + const fallback = document.querySelector(".darkreader--fallback"); + if (fallback) { + fallback.textContent = ""; + } + } + function createDynamicStyleOverrides() { + cancelRendering(); + const allStyles = getManageableStyles(document); + const newManagers = allStyles + .filter((style) => !styleManagers.has(style)) + .map((style) => createManager(style)); + newManagers + .map((manager) => manager.details({secondRound: false})) + .filter((detail) => detail && detail.rules.length > 0) + .forEach((detail) => { + variablesStore.addRulesForMatching(detail.rules); + }); + variablesStore.matchVariablesAndDependants(); + variablesStore.setOnRootVariableChange(() => { + variablesStore.putRootVars( + document.head.querySelector(".darkreader--root-vars"), + filter + ); + }); + variablesStore.putRootVars( + document.head.querySelector(".darkreader--root-vars"), + filter + ); + styleManagers.forEach((manager) => + manager.render(filter, ignoredImageAnalysisSelectors) + ); + if (loadingStyles.size === 0) { + cleanFallbackStyle(); + } + newManagers.forEach((manager) => manager.watch()); + const inlineStyleElements = toArray( + document.querySelectorAll(INLINE_STYLE_SELECTOR) + ); + iterateShadowHosts(document.documentElement, (host) => { + createShadowStaticStyleOverrides(host.shadowRoot); + const elements = host.shadowRoot.querySelectorAll( + INLINE_STYLE_SELECTOR + ); + if (elements.length > 0) { + push(inlineStyleElements, elements); + } + }); + inlineStyleElements.forEach((el) => + overrideInlineStyle( + el, + filter, + ignoredInlineSelectors, + ignoredImageAnalysisSelectors + ) + ); + handleAdoptedStyleSheets(document); + } + let loadingStylesCounter = 0; + const loadingStyles = new Set(); + function createManager(element) { + const loadingStyleId = ++loadingStylesCounter; + function loadingStart() { + if (!isDOMReady() || !didDocumentShowUp) { + loadingStyles.add(loadingStyleId); + logInfo( + `Current amount of styles loading: ${loadingStyles.size}` + ); + const fallbackStyle = document.querySelector( + ".darkreader--fallback" + ); + if (!fallbackStyle.textContent) { + fallbackStyle.textContent = getModifiedFallbackStyle( + filter, + {strict: false} + ); + } + } + } + function loadingEnd() { + loadingStyles.delete(loadingStyleId); + logInfo( + `Removed loadingStyle ${loadingStyleId}, now awaiting: ${loadingStyles.size}` + ); + if (loadingStyles.size === 0 && isDOMReady()) { + cleanFallbackStyle(); + } + } + function update() { + const details = manager.details({secondRound: true}); + if (!details) { + return; + } + variablesStore.addRulesForMatching(details.rules); + variablesStore.matchVariablesAndDependants(); + manager.render(filter, ignoredImageAnalysisSelectors); + } + const manager = manageStyle(element, { + update, + loadingStart, + loadingEnd + }); + styleManagers.set(element, manager); + return manager; + } + function removeManager(element) { + const manager = styleManagers.get(element); + if (manager) { + manager.destroy(); + styleManagers.delete(element); + } + } + const throttledRenderAllStyles = throttle((callback) => { + styleManagers.forEach((manager) => + manager.render(filter, ignoredImageAnalysisSelectors) + ); + adoptedStyleManagers.forEach((manager) => + manager.render(filter, ignoredImageAnalysisSelectors) + ); + callback && callback(); + }); + const cancelRendering = function () { + throttledRenderAllStyles.cancel(); + }; + function onDOMReady() { + if (loadingStyles.size === 0) { + cleanFallbackStyle(); + return; + } + } + let documentVisibilityListener = null; + let didDocumentShowUp = !document.hidden; + function watchForDocumentVisibility(callback) { + const alreadyWatching = Boolean(documentVisibilityListener); + documentVisibilityListener = () => { + if (!document.hidden) { + stopWatchingForDocumentVisibility(); + callback(); + didDocumentShowUp = true; + } + }; + if (!alreadyWatching) { + document.addEventListener( + "visibilitychange", + documentVisibilityListener + ); + } + } + function stopWatchingForDocumentVisibility() { + document.removeEventListener( + "visibilitychange", + documentVisibilityListener + ); + documentVisibilityListener = null; + } + function createThemeAndWatchForUpdates() { + createStaticStyleOverrides(); + function runDynamicStyle() { + createDynamicStyleOverrides(); + watchForUpdates(); + } + if (document.hidden && !filter.immediateModify) { + watchForDocumentVisibility(runDynamicStyle); + } else { + runDynamicStyle(); + } + changeMetaThemeColorWhenAvailable(filter); + } + function handleAdoptedStyleSheets(node) { + try { + if (Array.isArray(node.adoptedStyleSheets)) { + if (node.adoptedStyleSheets.length > 0) { + const newManger = createAdoptedStyleSheetOverride(node); + adoptedStyleManagers.push(newManger); + newManger.render(filter, ignoredImageAnalysisSelectors); + } + } + } catch (err) {} + } + function watchForUpdates() { + const managedStyles = Array.from(styleManagers.keys()); + watchForStyleChanges( + managedStyles, + ({created, updated, removed, moved}) => { + const stylesToRemove = removed; + const stylesToManage = created + .concat(updated) + .concat(moved) + .filter((style) => !styleManagers.has(style)); + const stylesToRestore = moved.filter((style) => + styleManagers.has(style) + ); + stylesToRemove.forEach((style) => removeManager(style)); + const newManagers = stylesToManage.map((style) => + createManager(style) + ); + newManagers + .map((manager) => manager.details({secondRound: false})) + .filter((detail) => detail && detail.rules.length > 0) + .forEach((detail) => { + variablesStore.addRulesForMatching(detail.rules); + }); + variablesStore.matchVariablesAndDependants(); + newManagers.forEach((manager) => + manager.render(filter, ignoredImageAnalysisSelectors) + ); + newManagers.forEach((manager) => manager.watch()); + stylesToRestore.forEach((style) => + styleManagers.get(style).restore() + ); + }, + (shadowRoot) => { + createShadowStaticStyleOverrides(shadowRoot); + handleAdoptedStyleSheets(shadowRoot); + } + ); + watchForInlineStyles( + (element) => { + overrideInlineStyle( + element, + filter, + ignoredInlineSelectors, + ignoredImageAnalysisSelectors + ); + if (element === document.documentElement) { + const styleAttr = element.getAttribute("style") || ""; + if (styleAttr.includes("--")) { + variablesStore.matchVariablesAndDependants(); + variablesStore.putRootVars( + document.head.querySelector( + ".darkreader--root-vars" + ), + filter + ); + } + } + }, + (root) => { + createShadowStaticStyleOverrides(root); + const inlineStyleElements = root.querySelectorAll( + INLINE_STYLE_SELECTOR + ); + if (inlineStyleElements.length > 0) { + forEach(inlineStyleElements, (el) => + overrideInlineStyle( + el, + filter, + ignoredInlineSelectors, + ignoredImageAnalysisSelectors + ) + ); + } + } + ); + addDOMReadyListener(onDOMReady); + } + function stopWatchingForUpdates() { + styleManagers.forEach((manager) => manager.pause()); + stopStylePositionWatchers(); + stopWatchingForStyleChanges(); + stopWatchingForInlineStyles(); + removeDOMReadyListener(onDOMReady); + cleanReadyStateCompleteListeners(); + } + let metaObserver; + function addMetaListener() { + metaObserver = new MutationObserver(() => { + if (document.querySelector('meta[name="darkreader-lock"]')) { + metaObserver.disconnect(); + removeDynamicTheme(); + } + }); + metaObserver.observe(document.head, {childList: true, subtree: true}); + } + function createDarkReaderInstanceMarker() { + const metaElement = document.createElement("meta"); + metaElement.name = "darkreader"; + metaElement.content = INSTANCE_ID; + document.head.appendChild(metaElement); + } + function isAnotherDarkReaderInstanceActive() { + if (document.querySelector('meta[name="darkreader-lock"]')) { + return true; + } + const meta = document.querySelector('meta[name="darkreader"]'); + if (meta) { + if (meta.content !== INSTANCE_ID) { + return true; + } + return false; + } + createDarkReaderInstanceMarker(); + addMetaListener(); + return false; + } + function createOrUpdateDynamicTheme( + filterConfig, + dynamicThemeFixes, + iframe + ) { + filter = filterConfig; + fixes = dynamicThemeFixes; + if (fixes) { + ignoredImageAnalysisSelectors = Array.isArray( + fixes.ignoreImageAnalysis + ) + ? fixes.ignoreImageAnalysis + : []; + ignoredInlineSelectors = Array.isArray(fixes.ignoreInlineStyle) + ? fixes.ignoreInlineStyle + : []; + } else { + ignoredImageAnalysisSelectors = []; + ignoredInlineSelectors = []; + } + if (filter.immediateModify) { + setIsDOMReady(() => { + return true; + }); + } + isIFrame = iframe; + if (document.head) { + if (isAnotherDarkReaderInstanceActive()) { + return; + } + document.documentElement.setAttribute( + "data-darkreader-mode", + "dynamic" + ); + document.documentElement.setAttribute( + "data-darkreader-scheme", + filter.mode ? "dark" : "dimmed" + ); + createThemeAndWatchForUpdates(); + } else { + if (!isFirefox) { + const fallbackStyle = createOrUpdateStyle( + "darkreader--fallback" + ); + document.documentElement.appendChild(fallbackStyle); + fallbackStyle.textContent = getModifiedFallbackStyle(filter, { + strict: true + }); + } + const headObserver = new MutationObserver(() => { + if (document.head) { + headObserver.disconnect(); + if (isAnotherDarkReaderInstanceActive()) { + removeDynamicTheme(); + return; + } + createThemeAndWatchForUpdates(); + } + }); + headObserver.observe(document, {childList: true, subtree: true}); + } + } + function removeProxy() { + document.dispatchEvent(new CustomEvent("__darkreader__cleanUp")); + removeNode(document.head.querySelector(".darkreader--proxy")); + } + function removeDynamicTheme() { + document.documentElement.removeAttribute(`data-darkreader-mode`); + document.documentElement.removeAttribute(`data-darkreader-scheme`); + cleanDynamicThemeCache(); + removeNode(document.querySelector(".darkreader--fallback")); + if (document.head) { + restoreMetaThemeColor(); + removeNode(document.head.querySelector(".darkreader--user-agent")); + removeNode(document.head.querySelector(".darkreader--text")); + removeNode(document.head.querySelector(".darkreader--invert")); + removeNode(document.head.querySelector(".darkreader--inline")); + removeNode(document.head.querySelector(".darkreader--override")); + removeNode(document.head.querySelector(".darkreader--variables")); + removeNode(document.head.querySelector(".darkreader--root-vars")); + removeNode(document.head.querySelector('meta[name="darkreader"]')); + removeProxy(); + } + shadowRootsWithOverrides.forEach((root) => { + removeNode(root.querySelector(".darkreader--inline")); + removeNode(root.querySelector(".darkreader--override")); + }); + shadowRootsWithOverrides.clear(); + forEach(styleManagers.keys(), (el) => removeManager(el)); + loadingStyles.clear(); + cleanLoadingLinks(); + forEach(document.querySelectorAll(".darkreader"), removeNode); + adoptedStyleManagers.forEach((manager) => { + manager.destroy(); + }); + adoptedStyleManagers.splice(0); + metaObserver && metaObserver.disconnect(); + } + function cleanDynamicThemeCache() { + variablesStore.clear(); + parsedURLCache.clear(); + stopWatchingForDocumentVisibility(); + cancelRendering(); + stopWatchingForUpdates(); + cleanModificationCache(); + clearColorCache(); + } + + let query = null; + const onChange = ({matches}) => + listeners.forEach((listener) => listener(matches)); + const listeners = new Set(); + function runColorSchemeChangeDetector(callback) { + listeners.add(callback); + if (query) { + return; + } + query = matchMedia("(prefers-color-scheme: dark)"); + if (isMatchMediaChangeEventListenerSupported) { + query.addEventListener("change", onChange); + } else { + query.addListener(onChange); + } + } + function stopColorSchemeChangeDetector() { + if (!query || !onChange) { + return; + } + if (isMatchMediaChangeEventListenerSupported) { + query.removeEventListener("change", onChange); + } else { + query.removeListener(onChange); + } + listeners.clear(); + query = null; + } + const isSystemDarkModeEnabled = () => + (query || matchMedia("(prefers-color-scheme: dark)")).matches; + + const blobRegex = /url\(\"(blob\:.*?)\"\)/g; + async function replaceBlobs(text) { + const promises = []; + getMatches(blobRegex, text, 1).forEach((url) => { + const promise = loadAsDataURL(url); + promises.push(promise); + }); + const data = await Promise.all(promises); + return text.replace(blobRegex, () => `url("${data.shift()}")`); + } + const banner = `/* + _______ + / \\ + .==. .==. + (( ))==(( )) + / "==" "=="\\ + /____|| || ||___\\ + ________ ____ ________ ___ ___ + | ___ \\ / \\ | ___ \\ | | / / + | | \\ \\ / /\\ \\ | | \\ \\| |_/ / + | | ) / /__\\ \\ | |__/ /| ___ \\ + | |__/ / ______ \\| ____ \\| | \\ \\ +_______|_______/__/ ____ \\__\\__|___\\__\\__|___\\__\\____ +| ___ \\ | ____/ / \\ | ___ \\ | ____| ___ \\ +| | \\ \\| |___ / /\\ \\ | | \\ \\| |___| | \\ \\ +| |__/ /| ____/ /__\\ \\ | | ) | ____| |__/ / +| ____ \\| |__/ ______ \\| |__/ /| |___| ____ \\ +|__| \\__\\____/__/ \\__\\_______/ |______|__| \\__\\ + https://darkreader.org +*/ + +/*! Dark reader generated CSS | Licensed under MIT https://github.com/darkreader/darkreader/blob/main/LICENSE */ +`; + async function collectCSS() { + const css = [banner]; + function addStaticCSS(selector, comment) { + const staticStyle = document.querySelector(selector); + if (staticStyle && staticStyle.textContent) { + css.push(`/* ${comment} */`); + css.push(staticStyle.textContent); + css.push(""); + } + } + addStaticCSS(".darkreader--fallback", "Fallback Style"); + addStaticCSS(".darkreader--user-agent", "User-Agent Style"); + addStaticCSS(".darkreader--text", "Text Style"); + addStaticCSS(".darkreader--invert", "Invert Style"); + addStaticCSS(".darkreader--variables", "Variables Style"); + const modifiedCSS = []; + document.querySelectorAll(".darkreader--sync").forEach((element) => { + forEach(element.sheet.cssRules, (rule) => { + rule && rule.cssText && modifiedCSS.push(rule.cssText); + }); + }); + if (modifiedCSS.length) { + const formattedCSS = formatCSS(modifiedCSS.join("\n")); + css.push("/* Modified CSS */"); + css.push(await replaceBlobs(formattedCSS)); + css.push(""); + } + addStaticCSS(".darkreader--override", "Override Style"); + return css.join("\n"); + } + + let unloaded = false; + function cleanup() { + unloaded = true; + removeEventListener("pagehide", onPageHide); + removeEventListener("freeze", onFreeze); + removeEventListener("resume", onResume); + cleanDynamicThemeCache(); + stopDarkThemeDetector(); + stopColorSchemeChangeDetector(); + } + function sendMessage(message) { + if (unloaded) { + return; + } + const responseHandler = (response) => { + if (response === "unsupportedSender") { + removeStyle(); + removeSVGFilter(); + removeDynamicTheme(); + cleanup(); + } + }; + try { + if (false); + else { + chrome.runtime.sendMessage(message, responseHandler); + } + } catch (error) { + if (error.message === "Extension context invalidated.") { + console.log( + "Dark Reader: instance of old CS detected, clening up." + ); + cleanup(); + } else { + console.log( + "Dark Reader: unexpected error during message passing." + ); + } + } + } + function onMessage({type, data}) { + switch (type) { + case MessageType.BG_ADD_CSS_FILTER: + case MessageType.BG_ADD_STATIC_THEME: { + const {css, detectDarkTheme} = data; + removeDynamicTheme(); + createOrUpdateStyle$1( + css, + type === MessageType.BG_ADD_STATIC_THEME + ? "static" + : "filter" + ); + if (detectDarkTheme) { + runDarkThemeDetector((hasDarkTheme) => { + if (hasDarkTheme) { + removeStyle(); + onDarkThemeDetected(); + } + }); + } + break; + } + case MessageType.BG_ADD_SVG_FILTER: { + const {css, svgMatrix, svgReverseMatrix, detectDarkTheme} = + data; + removeDynamicTheme(); + createOrUpdateSVGFilter(svgMatrix, svgReverseMatrix); + createOrUpdateStyle$1(css, "filter"); + if (detectDarkTheme) { + runDarkThemeDetector((hasDarkTheme) => { + if (hasDarkTheme) { + removeStyle(); + removeSVGFilter(); + onDarkThemeDetected(); + } + }); + } + break; + } + case MessageType.BG_ADD_DYNAMIC_THEME: { + const {theme, fixes, isIFrame, detectDarkTheme} = data; + removeStyle(); + createOrUpdateDynamicTheme(theme, fixes, isIFrame); + if (detectDarkTheme) { + runDarkThemeDetector((hasDarkTheme) => { + if (hasDarkTheme) { + removeDynamicTheme(); + onDarkThemeDetected(); + } + }); + } + break; + } + case MessageType.BG_EXPORT_CSS: + collectCSS().then((collectedCSS) => + sendMessage({ + type: MessageType.CS_EXPORT_CSS_RESPONSE, + data: collectedCSS + }) + ); + break; + case MessageType.BG_UNSUPPORTED_SENDER: + case MessageType.BG_CLEAN_UP: + removeStyle(); + removeSVGFilter(); + removeDynamicTheme(); + stopDarkThemeDetector(); + break; + case MessageType.BG_RELOAD: + cleanup(); + break; + } + } + runColorSchemeChangeDetector((isDark) => + sendMessage({type: MessageType.CS_COLOR_SCHEME_CHANGE, data: {isDark}}) + ); + chrome.runtime.onMessage.addListener(onMessage); + sendMessage({ + type: MessageType.CS_FRAME_CONNECT, + data: {isDark: isSystemDarkModeEnabled()} + }); + function onPageHide(e) { + if (e.persisted === false) { + sendMessage({type: MessageType.CS_FRAME_FORGET}); + } + } + function onFreeze() { + sendMessage({type: MessageType.CS_FRAME_FREEZE}); + } + function onResume() { + sendMessage({ + type: MessageType.CS_FRAME_RESUME, + data: {isDark: isSystemDarkModeEnabled()} + }); + } + function onDarkThemeDetected() { + sendMessage({type: MessageType.CS_DARK_THEME_DETECTED}); + } + { + addEventListener("pagehide", onPageHide); + addEventListener("freeze", onFreeze); + addEventListener("resume", onResume); + } +})(); diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/manifest.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/manifest.json new file mode 100644 index 0000000..d413cd0 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/manifest.json @@ -0,0 +1,53 @@ +{ + "author": "Alexander Shutau", + "background": { + "page": "background/index.html", + "persistent": true + }, + "browser_action": { + "default_icon": { + "19": "icons/dr_active_19.png", + "38": "icons/dr_active_38.png" + }, + "default_popup": "ui/popup/index.html", + "default_title": "Dark Reader" + }, + "commands": { + "addSite": { + "description": "__MSG_toggle_current_site__", + "suggested_key": { + "default": "Alt+Shift+A" + } + }, + "switchEngine": { + "description": "__MSG_theme_generation_mode__" + }, + "toggle": { + "description": "__MSG_toggle_extension__", + "suggested_key": { + "default": "Alt+Shift+D" + } + } + }, + "content_scripts": [ { + "all_frames": true, + "js": [ "inject/fallback.js", "inject/index.js" ], + "match_about_blank": true, + "matches": [ "\u003Call_urls>" ], + "run_at": "document_start" + } ], + "default_locale": "en", + "description": "__MSG_extension_description__", + "icons": { + "128": "icons/dr_128.png", + "16": "icons/dr_16.png", + "48": "icons/dr_48.png" + }, + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqBY2tfTtJYiVMirbII2r3WofqCDaxS2zwPddSsgxUWKRm/MW/ymL2ZaP24MmwnegGIoxHkBVyi4cps4/q76c98ViyijoQvdJjAv3ZtUOwbWlYnZ5pU6gPCeZrScHxoTJdxxJJ30DZpMc6qsc3yJVQJlABG2FQFPrhPEGFLP9sCq/M7pY1xH++KsG+jYLB6cU3ItvZ4zntUXRwG2ZBx+XZelsd6FdkVXbDXj/47TNk2Qq8PAqyiK45GgQ+KJjuISAo89ip1xI4tONLCjSHPinD3nz6HiMikQzwn4L8SsB4Wy7rBhMhPRGIWbwHed+L+W3LXhB05Lhwk0YxuOb7QNWRQIDAQAB", + "manifest_version": 2, + "name": "Dark Reader", + "optional_permissions": [ "contextMenus" ], + "permissions": [ "alarms", "fontSettings", "storage", "tabs", "\u003Call_urls>" ], + "update_url": "https://clients2.google.com/service/update2/crx", + "version": "4.9.58" +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/fonts/LICENSE.txt b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/fonts/LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/fonts/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/fonts/OpenSans-Light.ttf b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/fonts/OpenSans-Light.ttf new file mode 100644 index 0000000..6580d3a Binary files /dev/null and b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/fonts/OpenSans-Light.ttf differ diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/fonts/OpenSans-Regular.ttf b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/fonts/OpenSans-Regular.ttf new file mode 100644 index 0000000..29bfd35 Binary files /dev/null and b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/fonts/OpenSans-Regular.ttf differ diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/fonts/OpenSans-SemiBold.ttf b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/fonts/OpenSans-SemiBold.ttf new file mode 100644 index 0000000..54e7059 Binary files /dev/null and b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/fonts/OpenSans-SemiBold.ttf differ diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/images/darkreader-icon-256x256.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/images/darkreader-icon-256x256.png new file mode 100644 index 0000000..e6c1d71 Binary files /dev/null and b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/images/darkreader-icon-256x256.png differ diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/images/darkreader-type.svg b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/images/darkreader-type.svg new file mode 100644 index 0000000..5b6fbf9 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/images/darkreader-type.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/images/ladybug-32.svg b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/images/ladybug-32.svg new file mode 100644 index 0000000..95d8546 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/images/ladybug-32.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/images/mode-dark-32.svg b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/images/mode-dark-32.svg new file mode 100644 index 0000000..29be670 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/images/mode-dark-32.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/images/mode-light-32.svg b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/images/mode-light-32.svg new file mode 100644 index 0000000..6374304 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/assets/images/mode-light-32.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/devtools/index.html b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/devtools/index.html new file mode 100644 index 0000000..f77cb51 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/devtools/index.html @@ -0,0 +1,17 @@ + + + + + Dark Reader developer tools + + + + + + + + + diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/devtools/index.js b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/devtools/index.js new file mode 100644 index 0000000..e422434 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/devtools/index.js @@ -0,0 +1,2862 @@ +(function () { + "use strict"; + + /* malevic@0.19.1 - Jan 8, 2022 */ + function m$1(tagOrComponent, props, ...children) { + props = props || {}; + if (typeof tagOrComponent === "string") { + const tag = tagOrComponent; + return {type: tag, props, children}; + } + if (typeof tagOrComponent === "function") { + const component = tagOrComponent; + return {type: component, props, children}; + } + throw new Error("Unsupported spec type"); + } + + /* malevic@0.19.1 - Jan 8, 2022 */ + function createPluginsStore() { + const plugins = []; + return { + add(plugin) { + plugins.push(plugin); + return this; + }, + apply(props) { + let result; + let plugin; + const usedPlugins = new Set(); + for (let i = plugins.length - 1; i >= 0; i--) { + plugin = plugins[i]; + if (usedPlugins.has(plugin)) { + continue; + } + result = plugin(props); + if (result != null) { + return result; + } + usedPlugins.add(plugin); + } + return null; + }, + delete(plugin) { + for (let i = plugins.length - 1; i >= 0; i--) { + if (plugins[i] === plugin) { + plugins.splice(i, 1); + break; + } + } + return this; + }, + empty() { + return plugins.length === 0; + } + }; + } + function iterateComponentPlugins(type, pairs, iterator) { + pairs + .filter(([key]) => type[key]) + .forEach(([key, plugins]) => { + return type[key].forEach((plugin) => iterator(plugins, plugin)); + }); + } + function addComponentPlugins(type, pairs) { + iterateComponentPlugins(type, pairs, (plugins, plugin) => + plugins.add(plugin) + ); + } + function deleteComponentPlugins(type, pairs) { + iterateComponentPlugins(type, pairs, (plugins, plugin) => + plugins.delete(plugin) + ); + } + + const XHTML_NS = "http://www.w3.org/1999/xhtml"; + const SVG_NS = "http://www.w3.org/2000/svg"; + const PLUGINS_CREATE_ELEMENT = Symbol(); + const pluginsCreateElement = createPluginsStore(); + function createElement(spec, parent) { + const result = pluginsCreateElement.apply({spec, parent}); + if (result) { + return result; + } + const tag = spec.type; + if (tag === "svg") { + return document.createElementNS(SVG_NS, "svg"); + } + const namespace = parent.namespaceURI; + if (namespace === XHTML_NS || namespace == null) { + return document.createElement(tag); + } + return document.createElementNS(namespace, tag); + } + + function classes$1(...args) { + const classes = []; + args.filter((c) => Boolean(c)).forEach((c) => { + if (typeof c === "string") { + classes.push(c); + } else if (typeof c === "object") { + classes.push( + ...Object.keys(c).filter((key) => Boolean(c[key])) + ); + } + }); + return classes.join(" "); + } + function setInlineCSSPropertyValue(element, prop, $value) { + if ($value != null && $value !== "") { + let value = String($value); + let important = ""; + if (value.endsWith("!important")) { + value = value.substring(0, value.length - 10); + important = "important"; + } + element.style.setProperty(prop, value, important); + } else { + element.style.removeProperty(prop); + } + } + + function isObject(value) { + return value != null && typeof value === "object"; + } + + const eventListeners = new WeakMap(); + function addEventListener(element, event, listener) { + let listeners; + if (eventListeners.has(element)) { + listeners = eventListeners.get(element); + } else { + listeners = new Map(); + eventListeners.set(element, listeners); + } + if (listeners.get(event) !== listener) { + if (listeners.has(event)) { + element.removeEventListener(event, listeners.get(event)); + } + element.addEventListener(event, listener); + listeners.set(event, listener); + } + } + function removeEventListener(element, event) { + if (!eventListeners.has(element)) { + return; + } + const listeners = eventListeners.get(element); + element.removeEventListener(event, listeners.get(event)); + listeners.delete(event); + } + + function setClassObject(element, classObj) { + const cls = Array.isArray(classObj) + ? classes$1(...classObj) + : classes$1(classObj); + if (cls) { + element.setAttribute("class", cls); + } else { + element.removeAttribute("class"); + } + } + function mergeValues(obj, old) { + const values = new Map(); + const newProps = new Set(Object.keys(obj)); + const oldProps = Object.keys(old); + oldProps + .filter((prop) => !newProps.has(prop)) + .forEach((prop) => values.set(prop, null)); + newProps.forEach((prop) => values.set(prop, obj[prop])); + return values; + } + function setStyleObject(element, styleObj, prev) { + let prevObj; + if (isObject(prev)) { + prevObj = prev; + } else { + prevObj = {}; + element.removeAttribute("style"); + } + const declarations = mergeValues(styleObj, prevObj); + declarations.forEach(($value, prop) => + setInlineCSSPropertyValue(element, prop, $value) + ); + } + function setEventListener(element, event, listener) { + if (typeof listener === "function") { + addEventListener(element, event, listener); + } else { + removeEventListener(element, event); + } + } + const specialAttrs = new Set([ + "key", + "oncreate", + "onupdate", + "onrender", + "onremove" + ]); + const PLUGINS_SET_ATTRIBUTE = Symbol(); + const pluginsSetAttribute = createPluginsStore(); + function getPropertyValue(obj, prop) { + return obj && obj.hasOwnProperty(prop) ? obj[prop] : null; + } + function syncAttrs(element, attrs, prev) { + const values = mergeValues(attrs, prev || {}); + values.forEach((value, attr) => { + if (!pluginsSetAttribute.empty()) { + const result = pluginsSetAttribute.apply({ + element, + attr, + value, + get prev() { + return getPropertyValue(prev, attr); + } + }); + if (result != null) { + return; + } + } + if (attr === "class" && isObject(value)) { + setClassObject(element, value); + } else if (attr === "style" && isObject(value)) { + const prevValue = getPropertyValue(prev, attr); + setStyleObject(element, value, prevValue); + } else if (attr.startsWith("on")) { + const event = attr.substring(2); + setEventListener(element, event, value); + } else if (specialAttrs.has(attr)); + else if (value == null || value === false) { + element.removeAttribute(attr); + } else { + element.setAttribute(attr, value === true ? "" : String(value)); + } + }); + } + + class LinkedList { + constructor(...items) { + this.nexts = new WeakMap(); + this.prevs = new WeakMap(); + this.first = null; + this.last = null; + items.forEach((item) => this.push(item)); + } + empty() { + return this.first == null; + } + push(item) { + if (this.empty()) { + this.first = item; + this.last = item; + } else { + this.nexts.set(this.last, item); + this.prevs.set(item, this.last); + this.last = item; + } + } + insertBefore(newItem, refItem) { + const prev = this.before(refItem); + this.prevs.set(newItem, prev); + this.nexts.set(newItem, refItem); + this.prevs.set(refItem, newItem); + prev && this.nexts.set(prev, newItem); + refItem === this.first && (this.first = newItem); + } + delete(item) { + const prev = this.before(item); + const next = this.after(item); + prev && this.nexts.set(prev, next); + next && this.prevs.set(next, prev); + item === this.first && (this.first = next); + item === this.last && (this.last = prev); + } + before(item) { + return this.prevs.get(item) || null; + } + after(item) { + return this.nexts.get(item) || null; + } + loop(iterator) { + if (this.empty()) { + return; + } + let current = this.first; + do { + if (iterator(current)) { + break; + } + } while ((current = this.after(current))); + } + copy() { + const list = new LinkedList(); + this.loop((item) => { + list.push(item); + return false; + }); + return list; + } + forEach(iterator) { + this.loop((item) => { + iterator(item); + return false; + }); + } + find(iterator) { + let result = null; + this.loop((item) => { + if (iterator(item)) { + result = item; + return true; + } + return false; + }); + return result; + } + map(iterator) { + const results = []; + this.loop((item) => { + results.push(iterator(item)); + return false; + }); + return results; + } + } + + function matchChildren(vnode, old) { + const oldChildren = old.children(); + const oldChildrenByKey = new Map(); + const oldChildrenWithoutKey = []; + oldChildren.forEach((v) => { + const key = v.key(); + if (key == null) { + oldChildrenWithoutKey.push(v); + } else { + oldChildrenByKey.set(key, v); + } + }); + const children = vnode.children(); + const matches = []; + const unmatched = new Set(oldChildren); + const keys = new Set(); + children.forEach((v) => { + let match = null; + let guess = null; + const key = v.key(); + if (key != null) { + if (keys.has(key)) { + throw new Error("Duplicate key"); + } + keys.add(key); + if (oldChildrenByKey.has(key)) { + guess = oldChildrenByKey.get(key); + } + } else if (oldChildrenWithoutKey.length > 0) { + guess = oldChildrenWithoutKey.shift(); + } + if (v.matches(guess)) { + match = guess; + } + matches.push([v, match]); + if (match) { + unmatched.delete(match); + } + }); + return {matches, unmatched}; + } + + function execute(vnode, old, vdom) { + const didMatch = vnode && old && vnode.matches(old); + if (didMatch && vnode.parent() === old.parent()) { + vdom.replaceVNode(old, vnode); + } else if (vnode) { + vdom.addVNode(vnode); + } + const context = vdom.getVNodeContext(vnode); + const oldContext = vdom.getVNodeContext(old); + if (old && !didMatch) { + old.detach(oldContext); + old.children().forEach((v) => execute(null, v, vdom)); + old.detached(oldContext); + } + if (vnode && !didMatch) { + vnode.attach(context); + vnode.children().forEach((v) => execute(v, null, vdom)); + vnode.attached(context); + } + if (didMatch) { + const result = vnode.update(old, context); + if (result !== vdom.LEAVE) { + const {matches, unmatched} = matchChildren(vnode, old); + unmatched.forEach((v) => execute(null, v, vdom)); + matches.forEach(([v, o]) => execute(v, o, vdom)); + vnode.updated(context); + } + } + } + + function m(tagOrComponent, props, ...children) { + props = props || {}; + if (typeof tagOrComponent === "string") { + const tag = tagOrComponent; + return {type: tag, props, children}; + } + if (typeof tagOrComponent === "function") { + const component = tagOrComponent; + return {type: component, props, children}; + } + throw new Error("Unsupported spec type"); + } + function isSpec(x) { + return isObject(x) && x.type != null && x.nodeType == null; + } + function isNodeSpec(x) { + return isSpec(x) && typeof x.type === "string"; + } + function isComponentSpec(x) { + return isSpec(x) && typeof x.type === "function"; + } + + class VNodeBase { + constructor(parent) { + this.parentVNode = parent; + } + key() { + return null; + } + parent(vnode) { + if (vnode) { + this.parentVNode = vnode; + return; + } + return this.parentVNode; + } + children() { + return []; + } + attach(context) {} + detach(context) {} + update(old, context) { + return null; + } + attached(context) {} + detached(context) {} + updated(context) {} + } + function nodeMatchesSpec(node, spec) { + return ( + node instanceof Element && spec.type === node.tagName.toLowerCase() + ); + } + const refinedElements = new WeakMap(); + function markElementAsRefined(element, vdom) { + let refined; + if (refinedElements.has(vdom)) { + refined = refinedElements.get(vdom); + } else { + refined = new WeakSet(); + refinedElements.set(vdom, refined); + } + refined.add(element); + } + function isElementRefined(element, vdom) { + return ( + refinedElements.has(vdom) && refinedElements.get(vdom).has(element) + ); + } + class ElementVNode extends VNodeBase { + constructor(spec, parent) { + super(parent); + this.spec = spec; + } + matches(other) { + return ( + other instanceof ElementVNode && + this.spec.type === other.spec.type + ); + } + key() { + return this.spec.props.key; + } + children() { + return [this.child]; + } + getExistingElement(context) { + const parent = context.parent; + const existing = context.node; + let element; + if (nodeMatchesSpec(existing, this.spec)) { + element = existing; + } else if ( + !isElementRefined(parent, context.vdom) && + context.vdom.isDOMNodeCaptured(parent) + ) { + const sibling = context.sibling; + const guess = sibling + ? sibling.nextElementSibling + : parent.firstElementChild; + if (guess && !context.vdom.isDOMNodeCaptured(guess)) { + if (nodeMatchesSpec(guess, this.spec)) { + element = guess; + } else { + parent.removeChild(guess); + } + } + } + return element; + } + attach(context) { + let element; + const existing = this.getExistingElement(context); + if (existing) { + element = existing; + } else { + element = createElement(this.spec, context.parent); + markElementAsRefined(element, context.vdom); + } + syncAttrs(element, this.spec.props, null); + this.child = createDOMVNode( + element, + this.spec.children, + this, + false + ); + } + update(prev, context) { + const prevContext = context.vdom.getVNodeContext(prev); + const element = prevContext.node; + syncAttrs(element, this.spec.props, prev.spec.props); + this.child = createDOMVNode( + element, + this.spec.children, + this, + false + ); + } + attached(context) { + const {oncreate, onrender} = this.spec.props; + if (oncreate) { + oncreate(context.node); + } + if (onrender) { + onrender(context.node); + } + } + detached(context) { + const {onremove} = this.spec.props; + if (onremove) { + onremove(context.node); + } + } + updated(context) { + const {onupdate, onrender} = this.spec.props; + if (onupdate) { + onupdate(context.node); + } + if (onrender) { + onrender(context.node); + } + } + } + const symbols = { + CREATED: Symbol(), + REMOVED: Symbol(), + UPDATED: Symbol(), + RENDERED: Symbol(), + ACTIVE: Symbol(), + DEFAULTS_ASSIGNED: Symbol() + }; + const domPlugins = [ + [PLUGINS_CREATE_ELEMENT, pluginsCreateElement], + [PLUGINS_SET_ATTRIBUTE, pluginsSetAttribute] + ]; + class ComponentVNode extends VNodeBase { + constructor(spec, parent) { + super(parent); + this.lock = false; + this.spec = spec; + this.prev = null; + this.store = {}; + this.store[symbols.ACTIVE] = this; + } + matches(other) { + return ( + other instanceof ComponentVNode && + this.spec.type === other.spec.type + ); + } + key() { + return this.spec.props.key; + } + children() { + return [this.child]; + } + createContext(context) { + const {parent} = context; + const {spec, prev, store} = this; + return { + spec, + prev, + store, + get node() { + return context.node; + }, + get nodes() { + return context.nodes; + }, + parent, + onCreate: (fn) => (store[symbols.CREATED] = fn), + onUpdate: (fn) => (store[symbols.UPDATED] = fn), + onRemove: (fn) => (store[symbols.REMOVED] = fn), + onRender: (fn) => (store[symbols.RENDERED] = fn), + refresh: () => { + const activeVNode = store[symbols.ACTIVE]; + activeVNode.refresh(context); + }, + leave: () => context.vdom.LEAVE, + getStore: (defaults) => { + if (defaults && !store[symbols.DEFAULTS_ASSIGNED]) { + Object.entries(defaults).forEach(([prop, value]) => { + store[prop] = value; + }); + store[symbols.DEFAULTS_ASSIGNED] = true; + } + return store; + } + }; + } + unbox(context) { + const Component = this.spec.type; + const props = this.spec.props; + const children = this.spec.children; + this.lock = true; + const prevContext = ComponentVNode.context; + ComponentVNode.context = this.createContext(context); + let unboxed = null; + try { + unboxed = Component(props, ...children); + } finally { + ComponentVNode.context = prevContext; + this.lock = false; + } + return unboxed; + } + refresh(context) { + if (this.lock) { + throw new Error( + "Calling refresh during unboxing causes infinite loop" + ); + } + this.prev = this.spec; + const latestContext = context.vdom.getVNodeContext(this); + const unboxed = this.unbox(latestContext); + if (unboxed === context.vdom.LEAVE) { + return; + } + const prevChild = this.child; + this.child = createVNode(unboxed, this); + context.vdom.execute(this.child, prevChild); + this.updated(context); + } + addPlugins() { + addComponentPlugins(this.spec.type, domPlugins); + } + deletePlugins() { + deleteComponentPlugins(this.spec.type, domPlugins); + } + attach(context) { + this.addPlugins(); + const unboxed = this.unbox(context); + const childSpec = unboxed === context.vdom.LEAVE ? null : unboxed; + this.child = createVNode(childSpec, this); + } + update(prev, context) { + this.store = prev.store; + this.prev = prev.spec; + this.store[symbols.ACTIVE] = this; + const prevContext = context.vdom.getVNodeContext(prev); + this.addPlugins(); + const unboxed = this.unbox(prevContext); + let result = null; + if (unboxed === context.vdom.LEAVE) { + result = unboxed; + this.child = prev.child; + context.vdom.adoptVNode(this.child, this); + } else { + this.child = createVNode(unboxed, this); + } + return result; + } + handle(event, context) { + const fn = this.store[event]; + if (fn) { + const nodes = + context.nodes.length === 0 ? [null] : context.nodes; + fn(...nodes); + } + } + attached(context) { + this.deletePlugins(); + this.handle(symbols.CREATED, context); + this.handle(symbols.RENDERED, context); + } + detached(context) { + this.handle(symbols.REMOVED, context); + } + updated(context) { + this.deletePlugins(); + this.handle(symbols.UPDATED, context); + this.handle(symbols.RENDERED, context); + } + } + ComponentVNode.context = null; + function getComponentContext() { + return ComponentVNode.context; + } + class TextVNode extends VNodeBase { + constructor(text, parent) { + super(parent); + this.text = text; + } + matches(other) { + return other instanceof TextVNode; + } + children() { + return [this.child]; + } + getExistingNode(context) { + const {parent} = context; + let node; + if (context.node instanceof Text) { + node = context.node; + } else if ( + !isElementRefined(parent, context.vdom) && + context.vdom.isDOMNodeCaptured(parent) + ) { + const sibling = context.sibling; + const guess = sibling ? sibling.nextSibling : parent.firstChild; + if ( + guess && + !context.vdom.isDOMNodeCaptured(guess) && + guess instanceof Text + ) { + node = guess; + } + } + return node; + } + attach(context) { + const existing = this.getExistingNode(context); + let node; + if (existing) { + node = existing; + node.textContent = this.text; + } else { + node = document.createTextNode(this.text); + } + this.child = createVNode(node, this); + } + update(prev, context) { + const prevContext = context.vdom.getVNodeContext(prev); + const {node} = prevContext; + if (this.text !== prev.text) { + node.textContent = this.text; + } + this.child = createVNode(node, this); + } + } + class InlineFunctionVNode extends VNodeBase { + constructor(fn, parent) { + super(parent); + this.fn = fn; + } + matches(other) { + return other instanceof InlineFunctionVNode; + } + children() { + return [this.child]; + } + call(context) { + const fn = this.fn; + const inlineFnContext = { + parent: context.parent, + get node() { + return context.node; + }, + get nodes() { + return context.nodes; + } + }; + const result = fn(inlineFnContext); + this.child = createVNode(result, this); + } + attach(context) { + this.call(context); + } + update(prev, context) { + const prevContext = context.vdom.getVNodeContext(prev); + this.call(prevContext); + } + } + class NullVNode extends VNodeBase { + matches(other) { + return other instanceof NullVNode; + } + } + class DOMVNode extends VNodeBase { + constructor(node, childSpecs, parent, isNative) { + super(parent); + this.node = node; + this.childSpecs = childSpecs; + this.isNative = isNative; + } + matches(other) { + return other instanceof DOMVNode && this.node === other.node; + } + wrap() { + this.childVNodes = this.childSpecs.map((spec) => + createVNode(spec, this) + ); + } + insertNode(context) { + const {parent, sibling} = context; + const shouldInsert = !( + parent === this.node.parentElement && + sibling === this.node.previousSibling + ); + if (shouldInsert) { + const target = sibling + ? sibling.nextSibling + : parent.firstChild; + parent.insertBefore(this.node, target); + } + } + attach(context) { + this.wrap(); + this.insertNode(context); + } + detach(context) { + context.parent.removeChild(this.node); + } + update(prev, context) { + this.wrap(); + this.insertNode(context); + } + cleanupDOMChildren(context) { + const element = this.node; + for (let current = element.lastChild; current != null; ) { + if (context.vdom.isDOMNodeCaptured(current)) { + current = current.previousSibling; + } else { + const prev = current.previousSibling; + element.removeChild(current); + current = prev; + } + } + } + refine(context) { + if (!this.isNative) { + this.cleanupDOMChildren(context); + } + const element = this.node; + markElementAsRefined(element, context.vdom); + } + attached(context) { + const {node} = this; + if ( + node instanceof Element && + !isElementRefined(node, context.vdom) && + context.vdom.isDOMNodeCaptured(node) + ) { + this.refine(context); + } + } + children() { + return this.childVNodes; + } + } + function isDOMVNode(v) { + return v instanceof DOMVNode; + } + function createDOMVNode(node, childSpecs, parent, isNative) { + return new DOMVNode(node, childSpecs, parent, isNative); + } + class ArrayVNode extends VNodeBase { + constructor(items, key, parent) { + super(parent); + this.items = items; + this.id = key; + } + matches(other) { + return other instanceof ArrayVNode; + } + key() { + return this.id; + } + children() { + return this.childVNodes; + } + wrap() { + this.childVNodes = this.items.map((spec) => + createVNode(spec, this) + ); + } + attach() { + this.wrap(); + } + update() { + this.wrap(); + } + } + function createVNode(spec, parent) { + if (isNodeSpec(spec)) { + return new ElementVNode(spec, parent); + } + if (isComponentSpec(spec)) { + if (spec.type === Array) { + return new ArrayVNode(spec.children, spec.props.key, parent); + } + return new ComponentVNode(spec, parent); + } + if (typeof spec === "string") { + return new TextVNode(spec, parent); + } + if (spec == null) { + return new NullVNode(parent); + } + if (typeof spec === "function") { + return new InlineFunctionVNode(spec, parent); + } + if (spec instanceof Node) { + return createDOMVNode(spec, [], parent, true); + } + if (Array.isArray(spec)) { + return new ArrayVNode(spec, null, parent); + } + throw new Error("Unable to create virtual node for spec"); + } + + function createVDOM(rootNode) { + const contexts = new WeakMap(); + const hubs = new WeakMap(); + const parentNodes = new WeakMap(); + const passingLinks = new WeakMap(); + const linkedParents = new WeakSet(); + const LEAVE = Symbol(); + function execute$1(vnode, old) { + execute(vnode, old, vdom); + } + function creatVNodeContext(vnode) { + const parentNode = parentNodes.get(vnode); + contexts.set(vnode, { + parent: parentNode, + get node() { + const linked = passingLinks + .get(vnode) + .find((link) => link.node != null); + return linked ? linked.node : null; + }, + get nodes() { + return passingLinks + .get(vnode) + .map((link) => link.node) + .filter((node) => node); + }, + get sibling() { + if (parentNode === rootNode.parentElement) { + return passingLinks.get(vnode).first.node + .previousSibling; + } + const hub = hubs.get(parentNode); + let current = passingLinks.get(vnode).first; + while ((current = hub.links.before(current))) { + if (current.node) { + return current.node; + } + } + return null; + }, + vdom + }); + } + function createRootVNodeLinks(vnode) { + const parentNode = + rootNode.parentElement || document.createDocumentFragment(); + const node = rootNode; + const links = new LinkedList({ + parentNode, + node + }); + passingLinks.set(vnode, links.copy()); + parentNodes.set(vnode, parentNode); + hubs.set(parentNode, { + node: parentNode, + links + }); + } + function createVNodeLinks(vnode) { + const parent = vnode.parent(); + const isBranch = linkedParents.has(parent); + const parentNode = isDOMVNode(parent) + ? parent.node + : parentNodes.get(parent); + parentNodes.set(vnode, parentNode); + const vnodeLinks = new LinkedList(); + passingLinks.set(vnode, vnodeLinks); + if (isBranch) { + const newLink = { + parentNode, + node: null + }; + let current = vnode; + do { + passingLinks.get(current).push(newLink); + current = current.parent(); + } while (current && !isDOMVNode(current)); + hubs.get(parentNode).links.push(newLink); + } else { + linkedParents.add(parent); + const links = isDOMVNode(parent) + ? hubs.get(parentNode).links + : passingLinks.get(parent); + links.forEach((link) => vnodeLinks.push(link)); + } + } + function connectDOMVNode(vnode) { + if (isDOMVNode(vnode)) { + const {node} = vnode; + hubs.set(node, { + node, + links: new LinkedList({ + parentNode: node, + node: null + }) + }); + passingLinks.get(vnode).forEach((link) => (link.node = node)); + } + } + function addVNode(vnode) { + const parent = vnode.parent(); + if (parent == null) { + createRootVNodeLinks(vnode); + } else { + createVNodeLinks(vnode); + } + connectDOMVNode(vnode); + creatVNodeContext(vnode); + } + function getVNodeContext(vnode) { + return contexts.get(vnode); + } + function getAncestorsLinks(vnode) { + const parentNode = parentNodes.get(vnode); + const hub = hubs.get(parentNode); + const allLinks = []; + let current = vnode; + while ((current = current.parent()) && !isDOMVNode(current)) { + allLinks.push(passingLinks.get(current)); + } + allLinks.push(hub.links); + return allLinks; + } + function replaceVNode(old, vnode) { + if (vnode.parent() == null) { + addVNode(vnode); + return; + } + const oldContext = contexts.get(old); + const {parent: parentNode} = oldContext; + parentNodes.set(vnode, parentNode); + const oldLinks = passingLinks.get(old); + const newLink = { + parentNode, + node: null + }; + getAncestorsLinks(vnode).forEach((links) => { + const nextLink = links.after(oldLinks.last); + oldLinks.forEach((link) => links.delete(link)); + if (nextLink) { + links.insertBefore(newLink, nextLink); + } else { + links.push(newLink); + } + }); + const vnodeLinks = new LinkedList(newLink); + passingLinks.set(vnode, vnodeLinks); + creatVNodeContext(vnode); + } + function adoptVNode(vnode, parent) { + const vnodeLinks = passingLinks.get(vnode); + const parentLinks = passingLinks.get(parent).copy(); + vnode.parent(parent); + getAncestorsLinks(vnode).forEach((links) => { + vnodeLinks.forEach((link) => + links.insertBefore(link, parentLinks.first) + ); + parentLinks.forEach((link) => links.delete(link)); + }); + } + function isDOMNodeCaptured(node) { + return hubs.has(node) && node !== rootNode.parentElement; + } + const vdom = { + execute: execute$1, + addVNode, + getVNodeContext, + replaceVNode, + adoptVNode, + isDOMNodeCaptured, + LEAVE + }; + return vdom; + } + + const roots = new WeakMap(); + const vdoms = new WeakMap(); + function realize(node, vnode) { + const old = roots.get(node) || null; + roots.set(node, vnode); + let vdom; + if (vdoms.has(node)) { + vdom = vdoms.get(node); + } else { + vdom = createVDOM(node); + vdoms.set(node, vdom); + } + vdom.execute(vnode, old); + return vdom.getVNodeContext(vnode); + } + function render$1(element, spec) { + const vnode = createDOMVNode( + element, + Array.isArray(spec) ? spec : [spec], + null, + false + ); + realize(element, vnode); + return element; + } + function sync(node, spec) { + const vnode = createVNode(spec, null); + const context = realize(node, vnode); + const {nodes} = context; + if (nodes.length !== 1 || nodes[0] !== node) { + throw new Error("Spec does not match the node"); + } + return nodes[0]; + } + + function normalize(attrsOrChild, ...otherChildren) { + const attrs = + isObject(attrsOrChild) && !isSpec(attrsOrChild) + ? attrsOrChild + : null; + const children = + attrs == null + ? [attrsOrChild].concat(otherChildren) + : otherChildren; + return {attrs, children}; + } + function createTagFunction(tag) { + return (attrsOrChild, ...otherChildren) => { + const {attrs, children} = normalize(attrsOrChild, otherChildren); + return m(tag, attrs, children); + }; + } + new Proxy( + {}, + { + get: (_, tag) => { + return createTagFunction(tag); + } + } + ); + + /* malevic@0.19.1 - Jan 8, 2022 */ + + let currentUseStateFn = null; + function useState(initialState) { + if (!currentUseStateFn) { + throw new Error("`useState()` should be called inside a component"); + } + return currentUseStateFn(initialState); + } + function withState(type) { + const Stateful = (props, ...children) => { + const context = getComponentContext(); + const useState = (initial) => { + if (!context) { + return {state: initial, setState: null}; + } + const {store, refresh} = context; + store.state = store.state || initial; + const setState = (newState) => { + if (lock) { + throw new Error( + "Setting state during unboxing causes infinite loop" + ); + } + store.state = Object.assign( + Object.assign({}, store.state), + newState + ); + refresh(); + }; + return { + state: store.state, + setState + }; + }; + let lock = true; + const prevUseStateFn = currentUseStateFn; + currentUseStateFn = useState; + let result; + try { + result = type(props, ...children); + } finally { + currentUseStateFn = prevUseStateFn; + lock = false; + } + return result; + }; + return Stateful; + } + + var MessageType; + (function (MessageType) { + MessageType["UI_GET_DATA"] = "ui-get-data"; + MessageType["UI_SUBSCRIBE_TO_CHANGES"] = "ui-subscribe-to-changes"; + MessageType["UI_UNSUBSCRIBE_FROM_CHANGES"] = + "ui-unsubscribe-from-changes"; + MessageType["UI_CHANGE_SETTINGS"] = "ui-change-settings"; + MessageType["UI_SET_THEME"] = "ui-set-theme"; + MessageType["UI_SET_SHORTCUT"] = "ui-set-shortcut"; + MessageType["UI_TOGGLE_ACTIVE_TAB"] = "ui-toggle-active-tab"; + MessageType["UI_MARK_NEWS_AS_READ"] = "ui-mark-news-as-read"; + MessageType["UI_MARK_NEWS_AS_DISPLAYED"] = "ui-mark-news-as-displayed"; + MessageType["UI_LOAD_CONFIG"] = "ui-load-config"; + MessageType["UI_APPLY_DEV_DYNAMIC_THEME_FIXES"] = + "ui-apply-dev-dynamic-theme-fixes"; + MessageType["UI_RESET_DEV_DYNAMIC_THEME_FIXES"] = + "ui-reset-dev-dynamic-theme-fixes"; + MessageType["UI_APPLY_DEV_INVERSION_FIXES"] = + "ui-apply-dev-inversion-fixes"; + MessageType["UI_RESET_DEV_INVERSION_FIXES"] = + "ui-reset-dev-inversion-fixes"; + MessageType["UI_APPLY_DEV_STATIC_THEMES"] = + "ui-apply-dev-static-themes"; + MessageType["UI_RESET_DEV_STATIC_THEMES"] = + "ui-reset-dev-static-themes"; + MessageType["UI_SAVE_FILE"] = "ui-save-file"; + MessageType["UI_REQUEST_EXPORT_CSS"] = "ui-request-export-css"; + MessageType["UI_COLOR_SCHEME_CHANGE"] = "ui-color-scheme-change"; + MessageType["BG_CHANGES"] = "bg-changes"; + MessageType["BG_ADD_CSS_FILTER"] = "bg-add-css-filter"; + MessageType["BG_ADD_STATIC_THEME"] = "bg-add-static-theme"; + MessageType["BG_ADD_SVG_FILTER"] = "bg-add-svg-filter"; + MessageType["BG_ADD_DYNAMIC_THEME"] = "bg-add-dynamic-theme"; + MessageType["BG_EXPORT_CSS"] = "bg-export-css"; + MessageType["BG_UNSUPPORTED_SENDER"] = "bg-unsupported-sender"; + MessageType["BG_CLEAN_UP"] = "bg-clean-up"; + MessageType["BG_RELOAD"] = "bg-reload"; + MessageType["BG_FETCH_RESPONSE"] = "bg-fetch-response"; + MessageType["BG_UI_UPDATE"] = "bg-ui-update"; + MessageType["BG_CSS_UPDATE"] = "bg-css-update"; + MessageType["CS_COLOR_SCHEME_CHANGE"] = "cs-color-scheme-change"; + MessageType["CS_FRAME_CONNECT"] = "cs-frame-connect"; + MessageType["CS_FRAME_FORGET"] = "cs-frame-forget"; + MessageType["CS_FRAME_FREEZE"] = "cs-frame-freeze"; + MessageType["CS_FRAME_RESUME"] = "cs-frame-resume"; + MessageType["CS_EXPORT_CSS_RESPONSE"] = "cs-export-css-response"; + MessageType["CS_FETCH"] = "cs-fetch"; + MessageType["CS_DARK_THEME_DETECTED"] = "cs-dark-theme-detected"; + MessageType["CS_DARK_THEME_NOT_DETECTED"] = + "cs-dark-theme-not-detected"; + MessageType["CS_LOG"] = "cs-log"; + })(MessageType || (MessageType = {})); + + const isNavigatorDefined = typeof navigator !== "undefined"; + const userAgent = isNavigatorDefined + ? navigator.userAgentData && + Array.isArray(navigator.userAgentData.brands) + ? navigator.userAgentData.brands + .map( + (brand) => `${brand.brand.toLowerCase()} ${brand.version}` + ) + .join(" ") + : navigator.userAgent.toLowerCase() + : "some useragent"; + const platform = isNavigatorDefined + ? navigator.userAgentData && + typeof navigator.userAgentData.platform === "string" + ? navigator.userAgentData.platform.toLowerCase() + : navigator.platform.toLowerCase() + : "some platform"; + const isThunderbird = userAgent.includes("thunderbird"); + const isFirefox = + userAgent.includes("firefox") || + userAgent.includes("librewolf") || + isThunderbird; + userAgent.includes("vivaldi"); + userAgent.includes("yabrowser"); + userAgent.includes("opr") || userAgent.includes("opera"); + userAgent.includes("edg"); + platform.startsWith("win"); + platform.startsWith("mac"); + isNavigatorDefined && navigator.userAgentData + ? navigator.userAgentData.mobile + : userAgent.includes("mobile"); + (() => { + const m = userAgent.match(/chrom(?:e|ium)(?:\/| )([^ ]+)/); + if (m && m[1]) { + return m[1]; + } + return ""; + })(); + (() => { + const m = userAgent.match(/(?:firefox|librewolf)(?:\/| )([^ ]+)/); + if (m && m[1]) { + return m[1]; + } + return ""; + })(); + (() => { + try { + document.querySelector(":defined"); + return true; + } catch (err) { + return false; + } + })(); + (() => { + if (typeof document === "undefined") { + return false; + } + const el = document.createElement("div"); + el.setAttribute("style", "color-scheme: dark"); + return el.style && el.style.colorScheme === "dark"; + })(); + + function classes(...args) { + const classes = []; + args.filter((c) => Boolean(c)).forEach((c) => { + if (typeof c === "string") { + classes.push(c); + } else if (typeof c === "object") { + classes.push( + ...Object.keys(c).filter((key) => Boolean(c[key])) + ); + } + }); + return classes.join(" "); + } + function throttle(callback) { + let frameId = null; + return (...args) => { + if (!frameId) { + callback(...args); + frameId = requestAnimationFrame(() => (frameId = null)); + } + }; + } + function onSwipeStart(startEventObj, startHandler) { + const isTouchEvent = + typeof TouchEvent !== "undefined" && + startEventObj instanceof TouchEvent; + const touchId = isTouchEvent + ? startEventObj.changedTouches[0].identifier + : null; + const pointerMoveEvent = isTouchEvent ? "touchmove" : "mousemove"; + const pointerUpEvent = isTouchEvent ? "touchend" : "mouseup"; + if (!isTouchEvent) { + startEventObj.preventDefault(); + } + function getSwipeEventObject(e) { + const {clientX, clientY} = isTouchEvent ? getTouch(e) : e; + return {clientX, clientY}; + } + const startSE = getSwipeEventObject(startEventObj); + const {move: moveHandler, up: upHandler} = startHandler( + startSE, + startEventObj + ); + function getTouch(e) { + return Array.from(e.changedTouches).find( + ({identifier: id}) => id === touchId + ); + } + const onPointerMove = throttle((e) => { + const se = getSwipeEventObject(e); + moveHandler(se, e); + }); + function onPointerUp(e) { + unsubscribe(); + const se = getSwipeEventObject(e); + upHandler(se, e); + } + function unsubscribe() { + window.removeEventListener(pointerMoveEvent, onPointerMove); + window.removeEventListener(pointerUpEvent, onPointerUp); + } + window.addEventListener(pointerMoveEvent, onPointerMove, { + passive: true + }); + window.addEventListener(pointerUpEvent, onPointerUp, {passive: true}); + } + function createSwipeHandler(startHandler) { + return (e) => onSwipeStart(e, startHandler); + } + + function toArray(x) { + return Array.isArray(x) ? x : [x]; + } + function mergeClass(cls, propsCls) { + const normalized = toArray(cls).concat(toArray(propsCls)); + return classes(...normalized); + } + function omitAttrs(omit, attrs) { + const result = {}; + Object.keys(attrs).forEach((key) => { + if (omit.indexOf(key) < 0) { + result[key] = attrs[key]; + } + }); + return result; + } + function isElementHidden(element) { + return element.offsetParent === null; + } + + function Button(props, ...children) { + const cls = mergeClass("button", props.class); + const attrs = omitAttrs(["class"], props); + return m$1( + "button", + {class: cls, ...attrs}, + m$1("span", {class: "button__wrapper"}, ...children) + ); + } + + function evalMath(expression) { + const rpnStack = []; + const workingStack = []; + let lastToken; + for (let i = 0, len = expression.length; i < len; i++) { + const token = expression[i]; + if (!token || token === " ") { + continue; + } + if (operators.has(token)) { + const op = operators.get(token); + while (workingStack.length) { + const currentOp = operators.get(workingStack[0]); + if (!currentOp) { + break; + } + if (op.lessOrEqualThan(currentOp)) { + rpnStack.push(workingStack.shift()); + } else { + break; + } + } + workingStack.unshift(token); + } else if (!lastToken || operators.has(lastToken)) { + rpnStack.push(token); + } else { + rpnStack[rpnStack.length - 1] += token; + } + lastToken = token; + } + rpnStack.push(...workingStack); + const stack = []; + for (let i = 0, len = rpnStack.length; i < len; i++) { + const op = operators.get(rpnStack[i]); + if (op) { + const args = stack.splice(0, 2); + stack.push(op.exec(args[1], args[0])); + } else { + stack.unshift(parseFloat(rpnStack[i])); + } + } + return stack[0]; + } + class Operator { + constructor(precedence, method) { + this.precendce = precedence; + this.execMethod = method; + } + exec(left, right) { + return this.execMethod(left, right); + } + lessOrEqualThan(op) { + return this.precendce <= op.precendce; + } + } + const operators = new Map([ + ["+", new Operator(1, (left, right) => left + right)], + ["-", new Operator(1, (left, right) => left - right)], + ["*", new Operator(2, (left, right) => left * right)], + ["/", new Operator(2, (left, right) => left / right)] + ]); + + function getParenthesesRange(input, searchStartIndex = 0) { + const length = input.length; + let depth = 0; + let firstOpenIndex = -1; + for (let i = searchStartIndex; i < length; i++) { + if (depth === 0) { + const openIndex = input.indexOf("(", i); + if (openIndex < 0) { + break; + } + firstOpenIndex = openIndex; + depth++; + i = openIndex; + } else { + const closingIndex = input.indexOf(")", i); + if (closingIndex < 0) { + break; + } + const openIndex = input.indexOf("(", i); + if (openIndex < 0 || closingIndex < openIndex) { + depth--; + if (depth === 0) { + return {start: firstOpenIndex, end: closingIndex + 1}; + } + i = closingIndex; + } else { + depth++; + i = openIndex; + } + } + } + return null; + } + + const rgbaParseCache = new Map(); + function parseColorWithCache($color) { + $color = $color.trim(); + if (rgbaParseCache.has($color)) { + return rgbaParseCache.get($color); + } + if ($color.includes("calc(")) { + $color = lowerCalcExpression($color); + } + const color = parse($color); + color && rgbaParseCache.set($color, color); + return color; + } + function hslToRGB({h, s, l, a = 1}) { + if (s === 0) { + const [r, b, g] = [l, l, l].map((x) => Math.round(x * 255)); + return {r, g, b, a}; + } + const c = (1 - Math.abs(2 * l - 1)) * s; + const x = c * (1 - Math.abs(((h / 60) % 2) - 1)); + const m = l - c / 2; + const [r, g, b] = ( + h < 60 + ? [c, x, 0] + : h < 120 + ? [x, c, 0] + : h < 180 + ? [0, c, x] + : h < 240 + ? [0, x, c] + : h < 300 + ? [x, 0, c] + : [c, 0, x] + ).map((n) => Math.round((n + m) * 255)); + return {r, g, b, a}; + } + function rgbToHSL({r: r255, g: g255, b: b255, a = 1}) { + const r = r255 / 255; + const g = g255 / 255; + const b = b255 / 255; + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + const c = max - min; + const l = (max + min) / 2; + if (c === 0) { + return {h: 0, s: 0, l, a}; + } + let h = + (max === r + ? ((g - b) / c) % 6 + : max === g + ? (b - r) / c + 2 + : (r - g) / c + 4) * 60; + if (h < 0) { + h += 360; + } + const s = c / (1 - Math.abs(2 * l - 1)); + return {h, s, l, a}; + } + function toFixed(n, digits = 0) { + const fixed = n.toFixed(digits); + if (digits === 0) { + return fixed; + } + const dot = fixed.indexOf("."); + if (dot >= 0) { + const zerosMatch = fixed.match(/0+$/); + if (zerosMatch) { + if (zerosMatch.index === dot + 1) { + return fixed.substring(0, dot); + } + return fixed.substring(0, zerosMatch.index); + } + } + return fixed; + } + function rgbToHexString({r, g, b, a}) { + return `#${(a != null && a < 1 + ? [r, g, b, Math.round(a * 255)] + : [r, g, b] + ) + .map((x) => { + return `${x < 16 ? "0" : ""}${x.toString(16)}`; + }) + .join("")}`; + } + function hslToString(hsl) { + const {h, s, l, a} = hsl; + if (a != null && a < 1) { + return `hsla(${toFixed(h)}, ${toFixed(s * 100)}%, ${toFixed( + l * 100 + )}%, ${toFixed(a, 2)})`; + } + return `hsl(${toFixed(h)}, ${toFixed(s * 100)}%, ${toFixed(l * 100)}%)`; + } + const rgbMatch = /^rgba?\([^\(\)]+\)$/; + const hslMatch = /^hsla?\([^\(\)]+\)$/; + const hexMatch = /^#[0-9a-f]+$/i; + function parse($color) { + const c = $color.trim().toLowerCase(); + if (c.match(rgbMatch)) { + return parseRGB(c); + } + if (c.match(hslMatch)) { + return parseHSL(c); + } + if (c.match(hexMatch)) { + return parseHex(c); + } + if (knownColors.has(c)) { + return getColorByName(c); + } + if (systemColors.has(c)) { + return getSystemColor(c); + } + if ($color === "transparent") { + return {r: 0, g: 0, b: 0, a: 0}; + } + return null; + } + function getNumbers($color) { + const numbers = []; + let prevPos = 0; + let isMining = false; + const startIndex = $color.indexOf("("); + $color = $color.substring(startIndex + 1, $color.length - 1); + for (let i = 0; i < $color.length; i++) { + const c = $color[i]; + if ((c >= "0" && c <= "9") || c === "." || c === "+" || c === "-") { + isMining = true; + } else if (isMining && (c === " " || c === ",")) { + numbers.push($color.substring(prevPos, i)); + isMining = false; + prevPos = i + 1; + } else if (!isMining) { + prevPos = i + 1; + } + } + if (isMining) { + numbers.push($color.substring(prevPos, $color.length)); + } + return numbers; + } + function getNumbersFromString(str, range, units) { + const raw = getNumbers(str); + const unitsList = Object.entries(units); + const numbers = raw + .map((r) => r.trim()) + .map((r, i) => { + let n; + const unit = unitsList.find(([u]) => r.endsWith(u)); + if (unit) { + n = + (parseFloat(r.substring(0, r.length - unit[0].length)) / + unit[1]) * + range[i]; + } else { + n = parseFloat(r); + } + if (range[i] > 1) { + return Math.round(n); + } + return n; + }); + return numbers; + } + const rgbRange = [255, 255, 255, 1]; + const rgbUnits = {"%": 100}; + function parseRGB($rgb) { + const [r, g, b, a = 1] = getNumbersFromString($rgb, rgbRange, rgbUnits); + return {r, g, b, a}; + } + const hslRange = [360, 1, 1, 1]; + const hslUnits = {"%": 100, "deg": 360, "rad": 2 * Math.PI, "turn": 1}; + function parseHSL($hsl) { + const [h, s, l, a = 1] = getNumbersFromString($hsl, hslRange, hslUnits); + return hslToRGB({h, s, l, a}); + } + function parseHex($hex) { + const h = $hex.substring(1); + switch (h.length) { + case 3: + case 4: { + const [r, g, b] = [0, 1, 2].map((i) => + parseInt(`${h[i]}${h[i]}`, 16) + ); + const a = + h.length === 3 ? 1 : parseInt(`${h[3]}${h[3]}`, 16) / 255; + return {r, g, b, a}; + } + case 6: + case 8: { + const [r, g, b] = [0, 2, 4].map((i) => + parseInt(h.substring(i, i + 2), 16) + ); + const a = + h.length === 6 ? 1 : parseInt(h.substring(6, 8), 16) / 255; + return {r, g, b, a}; + } + } + return null; + } + function getColorByName($color) { + const n = knownColors.get($color); + return { + r: (n >> 16) & 255, + g: (n >> 8) & 255, + b: (n >> 0) & 255, + a: 1 + }; + } + function getSystemColor($color) { + const n = systemColors.get($color); + return { + r: (n >> 16) & 255, + g: (n >> 8) & 255, + b: (n >> 0) & 255, + a: 1 + }; + } + function lowerCalcExpression(color) { + let searchIndex = 0; + const replaceBetweenIndices = (start, end, replacement) => { + color = + color.substring(0, start) + replacement + color.substring(end); + }; + while ((searchIndex = color.indexOf("calc(")) !== -1) { + const range = getParenthesesRange(color, searchIndex); + if (!range) { + break; + } + let slice = color.slice(range.start + 1, range.end - 1); + const includesPercentage = slice.includes("%"); + slice = slice.split("%").join(""); + const output = Math.round(evalMath(slice)); + replaceBetweenIndices( + range.start - 4, + range.end, + output + (includesPercentage ? "%" : "") + ); + } + return color; + } + const knownColors = new Map( + Object.entries({ + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgrey: 0xa9a9a9, + darkgreen: 0x006400, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + grey: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgrey: 0xd3d3d3, + lightgreen: 0x90ee90, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 + }) + ); + const systemColors = new Map( + Object.entries({ + "ActiveBorder": 0x3b99fc, + "ActiveCaption": 0x000000, + "AppWorkspace": 0xaaaaaa, + "Background": 0x6363ce, + "ButtonFace": 0xffffff, + "ButtonHighlight": 0xe9e9e9, + "ButtonShadow": 0x9fa09f, + "ButtonText": 0x000000, + "CaptionText": 0x000000, + "GrayText": 0x7f7f7f, + "Highlight": 0xb2d7ff, + "HighlightText": 0x000000, + "InactiveBorder": 0xffffff, + "InactiveCaption": 0xffffff, + "InactiveCaptionText": 0x000000, + "InfoBackground": 0xfbfcc5, + "InfoText": 0x000000, + "Menu": 0xf6f6f6, + "MenuText": 0xffffff, + "Scrollbar": 0xaaaaaa, + "ThreeDDarkShadow": 0x000000, + "ThreeDFace": 0xc0c0c0, + "ThreeDHighlight": 0xffffff, + "ThreeDLightShadow": 0xffffff, + "ThreeDShadow": 0x000000, + "Window": 0xececec, + "WindowFrame": 0xaaaaaa, + "WindowText": 0x000000, + "-webkit-focus-ring-color": 0xe59700 + }).map(([key, value]) => [key.toLowerCase(), value]) + ); + + function TextBox(props) { + const cls = mergeClass("textbox", props.class); + const attrs = omitAttrs(["class", "type"], props); + const type = props.type || "text"; + return m$1("input", { + class: cls, + type: type, + spellcheck: "false", + ...attrs + }); + } + + function scale(x, inLow, inHigh, outLow, outHigh) { + return ((x - inLow) * (outHigh - outLow)) / (inHigh - inLow) + outLow; + } + function clamp(x, min, max) { + return Math.min(max, Math.max(min, x)); + } + + const hsbPickerDefaults = { + wasPrevHidden: true, + hueCanvasRendered: false, + activeHSB: null, + activeChangeHandler: null, + hueTouchStartHandler: null, + sbTouchStartHandler: null + }; + function rgbToHSB({r, g, b}) { + const min = Math.min(r, g, b); + const max = Math.max(r, g, b); + return { + h: rgbToHSL({r, g, b}).h, + s: max === 0 ? 0 : 1 - min / max, + b: max / 255 + }; + } + function hsbToRGB({h: hue, s: sat, b: br}) { + let c; + if (hue < 60) { + c = [1, hue / 60, 0]; + } else if (hue < 120) { + c = [(120 - hue) / 60, 1, 0]; + } else if (hue < 180) { + c = [0, 1, (hue - 120) / 60]; + } else if (hue < 240) { + c = [0, (240 - hue) / 60, 1]; + } else if (hue < 300) { + c = [(hue - 240) / 60, 0, 1]; + } else { + c = [1, 0, (360 - hue) / 60]; + } + const max = Math.max(...c); + const [r, g, b] = c + .map((v) => v + (max - v) * (1 - sat)) + .map((v) => v * br) + .map((v) => Math.round(v * 255)); + return {r, g, b, a: 1}; + } + function hsbToString(hsb) { + const rgb = hsbToRGB(hsb); + return rgbToHexString(rgb); + } + function render(canvas, getPixel) { + const {width, height} = canvas; + const context = canvas.getContext("2d"); + const imageData = context.getImageData(0, 0, width, height); + const d = imageData.data; + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + const i = 4 * (y * width + x); + const c = getPixel(x, y); + for (let j = 0; j < 4; j++) { + d[i + j] = c[j]; + } + } + } + context.putImageData(imageData, 0, 0); + } + function renderHue(canvas) { + const {height} = canvas; + render(canvas, (_, y) => { + const hue = scale(y, 0, height, 0, 360); + const {r, g, b} = hsbToRGB({h: hue, s: 1, b: 1}); + return new Uint8ClampedArray([r, g, b, 255]); + }); + } + function renderSB(hue, canvas) { + const {width, height} = canvas; + render(canvas, (x, y) => { + const sat = scale(x, 0, width - 1, 0, 1); + const br = scale(y, 0, height - 1, 1, 0); + const {r, g, b} = hsbToRGB({h: hue, s: sat, b: br}); + return new Uint8ClampedArray([r, g, b, 255]); + }); + } + function HSBPicker(props) { + const context = getComponentContext(); + const store = context.getStore(hsbPickerDefaults); + store.activeChangeHandler = props.onChange; + const prevColor = context.prev && context.prev.props.color; + const prevActiveColor = store.activeHSB + ? hsbToString(store.activeHSB) + : null; + const didColorChange = + props.color !== prevColor && props.color !== prevActiveColor; + let activeHSB; + if (didColorChange) { + const rgb = parseColorWithCache(props.color); + activeHSB = rgbToHSB(rgb); + store.activeHSB = activeHSB; + } else { + activeHSB = store.activeHSB; + } + function onSBCanvasRender(canvas) { + if (isElementHidden(canvas)) { + return; + } + const hue = activeHSB.h; + const prevHue = + prevColor && rgbToHSB(parseColorWithCache(prevColor)).h; + if (store.wasPrevHidden || hue !== prevHue) { + renderSB(hue, canvas); + } + store.wasPrevHidden = false; + } + function onHueCanvasRender(canvas) { + if (store.hueCanvasRendered || isElementHidden(canvas)) { + return; + } + store.hueCanvasRendered = true; + renderHue(canvas); + } + function createHSBSwipeHandler(getEventHSB) { + return createSwipeHandler((startEvt, startNativeEvt) => { + const rect = + startNativeEvt.currentTarget.getBoundingClientRect(); + function onPointerMove(e) { + store.activeHSB = getEventHSB({...e, rect}); + props.onColorPreview(hsbToString(store.activeHSB)); + context.refresh(); + } + function onPointerUp(e) { + const hsb = getEventHSB({...e, rect}); + store.activeHSB = hsb; + props.onChange(hsbToString(hsb)); + } + store.activeHSB = getEventHSB({...startEvt, rect}); + context.refresh(); + return { + move: onPointerMove, + up: onPointerUp + }; + }); + } + const onSBPointerDown = createHSBSwipeHandler( + ({clientX, clientY, rect}) => { + const sat = clamp((clientX - rect.left) / rect.width, 0, 1); + const br = clamp(1 - (clientY - rect.top) / rect.height, 0, 1); + return {...activeHSB, s: sat, b: br}; + } + ); + const onHuePointerDown = createHSBSwipeHandler(({clientY, rect}) => { + const hue = clamp((clientY - rect.top) / rect.height, 0, 1) * 360; + return {...activeHSB, h: hue}; + }); + const hueCursorStyle = { + "background-color": hslToString({ + h: activeHSB.h, + s: 1, + l: 0.5, + a: 1 + }), + "left": "0%", + "top": `${(activeHSB.h / 360) * 100}%` + }; + const sbCursorStyle = { + "background-color": rgbToHexString(hsbToRGB(activeHSB)), + "left": `${activeHSB.s * 100}%`, + "top": `${(1 - activeHSB.b) * 100}%` + }; + return m$1( + "span", + {class: "hsb-picker"}, + m$1( + "span", + { + class: "hsb-picker__sb-container", + onmousedown: onSBPointerDown, + onupdate: (el) => { + if (store.sbTouchStartHandler) { + el.removeEventListener( + "touchstart", + store.sbTouchStartHandler + ); + } + el.addEventListener("touchstart", onSBPointerDown, { + passive: true + }); + store.sbTouchStartHandler = onSBPointerDown; + } + }, + m$1("canvas", { + class: "hsb-picker__sb-canvas", + onrender: onSBCanvasRender + }), + m$1("span", { + class: "hsb-picker__sb-cursor", + style: sbCursorStyle + }) + ), + m$1( + "span", + { + class: "hsb-picker__hue-container", + onmousedown: onHuePointerDown, + onupdate: (el) => { + if (store.hueTouchStartHandler) { + el.removeEventListener( + "touchstart", + store.hueTouchStartHandler + ); + } + el.addEventListener("touchstart", onHuePointerDown, { + passive: true + }); + store.hueTouchStartHandler = onHuePointerDown; + } + }, + m$1("canvas", { + class: "hsb-picker__hue-canvas", + onrender: onHueCanvasRender + }), + m$1("span", { + class: "hsb-picker__hue-cursor", + style: hueCursorStyle + }) + ) + ); + } + + function isValidColor(color) { + return Boolean(parseColorWithCache(color)); + } + const colorPickerFocuses = new WeakMap(); + function focusColorPicker(node) { + const focus = colorPickerFocuses.get(node); + focus(); + } + function ColorPicker(props) { + const context = getComponentContext(); + context.onRender((node) => colorPickerFocuses.set(node, focus)); + const store = context.store; + const isColorValid = isValidColor(props.color); + function onColorPreview(previewColor) { + store.previewNode.style.backgroundColor = previewColor; + store.textBoxNode.value = previewColor; + store.textBoxNode.blur(); + } + function onColorChange(rawValue) { + const value = rawValue.trim(); + if (isValidColor(value)) { + props.onChange(value); + } else { + props.onChange(props.color); + } + } + function focus() { + if (store.isFocused) { + return; + } + store.isFocused = true; + context.refresh(); + window.addEventListener("mousedown", onOuterClick); + } + function blur() { + if (!store.isFocused) { + return; + } + window.removeEventListener("mousedown", onOuterClick); + store.isFocused = false; + context.refresh(); + } + function toggleFocus() { + if (store.isFocused) { + blur(); + } else { + focus(); + } + } + function onOuterClick(e) { + if (!e.composedPath().some((el) => el === context.node)) { + blur(); + } + } + const textBox = m$1(TextBox, { + class: "color-picker__input", + onrender: (el) => { + store.textBoxNode = el; + store.textBoxNode.value = isColorValid ? props.color : ""; + }, + onkeypress: (e) => { + const input = e.target; + if (e.key === "Enter") { + const {value} = input; + onColorChange(value); + blur(); + onColorPreview(value); + } + }, + onfocus: focus + }); + const previewElement = m$1("span", { + class: "color-picker__preview", + onclick: toggleFocus, + onrender: (el) => { + store.previewNode = el; + el.style.backgroundColor = isColorValid + ? props.color + : "transparent"; + } + }); + const resetButton = props.canReset + ? m$1("span", { + role: "button", + class: "color-picker__reset", + onclick: () => { + props.onReset(); + blur(); + } + }) + : null; + const textBoxLine = m$1( + "span", + {class: "color-picker__textbox-line"}, + textBox, + previewElement, + resetButton + ); + const hsbLine = isColorValid + ? m$1( + "span", + {class: "color-picker__hsb-line"}, + m$1(HSBPicker, { + color: props.color, + onChange: onColorChange, + onColorPreview: onColorPreview + }) + ) + : null; + return m$1( + "span", + { + class: [ + "color-picker", + store.isFocused && "color-picker--focused", + props.class + ] + }, + m$1("span", {class: "color-picker__wrapper"}, textBoxLine, hsbLine) + ); + } + Object.assign(ColorPicker, {focus: focusColorPicker}); + + const DEFAULT_OVERLAY_KEY = Symbol(); + const overlayNodes = new Map(); + const clickListeners = new WeakMap(); + function getOverlayDOMNode(key) { + if (key == null) { + key = DEFAULT_OVERLAY_KEY; + } + if (!overlayNodes.has(key)) { + const node = document.createElement("div"); + node.classList.add("overlay"); + node.addEventListener("click", (e) => { + if (clickListeners.has(node) && e.currentTarget === node) { + const listener = clickListeners.get(node); + listener(); + } + }); + overlayNodes.set(key, node); + } + return overlayNodes.get(key); + } + function Overlay(props) { + return getOverlayDOMNode(props.key); + } + function Portal(props, ...content) { + const context = getComponentContext(); + context.onRender(() => { + const node = getOverlayDOMNode(props.key); + if (props.onOuterClick) { + clickListeners.set(node, props.onOuterClick); + } else { + clickListeners.delete(node); + } + render$1(node, content); + }); + context.onRemove(() => { + const container = getOverlayDOMNode(props.key); + render$1(container, null); + }); + return context.leave(); + } + var Overlay$1 = Object.assign(Overlay, {Portal}); + + function MessageBox(props) { + return m$1( + Overlay$1.Portal, + {key: props.portalKey, onOuterClick: props.onCancel}, + m$1( + "div", + {class: "message-box"}, + m$1("label", {class: "message-box__caption"}, props.caption), + m$1( + "div", + {class: "message-box__buttons"}, + m$1( + Button, + { + class: "message-box__button message-box__button-ok", + onclick: props.onOK + }, + "OK" + ), + m$1( + Button, + { + class: "message-box__button message-box__button-cancel", + onclick: props.onCancel + }, + "Cancel" + ) + ) + ) + ); + } + + var ThemeEngine; + (function (ThemeEngine) { + ThemeEngine["cssFilter"] = "cssFilter"; + ThemeEngine["svgFilter"] = "svgFilter"; + ThemeEngine["staticTheme"] = "staticTheme"; + ThemeEngine["dynamicTheme"] = "dynamicTheme"; + })(ThemeEngine || (ThemeEngine = {})); + + const DEVTOOLS_DOCS_URL = + "https://github.com/darkreader/darkreader/blob/main/CONTRIBUTING.md"; + + function isIPV6(url) { + const openingBracketIndex = url.indexOf("["); + if (openingBracketIndex < 0) { + return false; + } + const queryIndex = url.indexOf("?"); + if (queryIndex >= 0 && openingBracketIndex > queryIndex) { + return false; + } + return true; + } + const ipV6HostRegex = /\[.*?\](\:\d+)?/; + function compareIPV6(firstURL, secondURL) { + const firstHost = firstURL.match(ipV6HostRegex)[0]; + const secondHost = secondURL.match(ipV6HostRegex)[0]; + return firstHost === secondHost; + } + + function isURLInList(url, list) { + for (let i = 0; i < list.length; i++) { + if (isURLMatched(url, list[i])) { + return true; + } + } + return false; + } + function isURLMatched(url, urlTemplate) { + const isFirstIPV6 = isIPV6(url); + const isSecondIPV6 = isIPV6(urlTemplate); + if (isFirstIPV6 && isSecondIPV6) { + return compareIPV6(url, urlTemplate); + } else if (!isFirstIPV6 && !isSecondIPV6) { + const regex = createUrlRegex(urlTemplate); + return Boolean(url.match(regex)); + } + return false; + } + function createUrlRegex(urlTemplate) { + urlTemplate = urlTemplate.trim(); + const exactBeginning = urlTemplate[0] === "^"; + const exactEnding = urlTemplate[urlTemplate.length - 1] === "$"; + urlTemplate = urlTemplate + .replace(/^\^/, "") + .replace(/\$$/, "") + .replace(/^.*?\/{2,3}/, "") + .replace(/\?.*$/, "") + .replace(/\/$/, ""); + let slashIndex; + let beforeSlash; + let afterSlash; + if ((slashIndex = urlTemplate.indexOf("/")) >= 0) { + beforeSlash = urlTemplate.substring(0, slashIndex); + afterSlash = urlTemplate.replace(/\$/g, "").substring(slashIndex); + } else { + beforeSlash = urlTemplate.replace(/\$/g, ""); + } + let result = exactBeginning + ? "^(.*?\\:\\/{2,3})?" + : "^(.*?\\:\\/{2,3})?([^/]*?\\.)?"; + const hostParts = beforeSlash.split("."); + result += "("; + for (let i = 0; i < hostParts.length; i++) { + if (hostParts[i] === "*") { + hostParts[i] = "[^\\.\\/]+?"; + } + } + result += hostParts.join("\\."); + result += ")"; + if (afterSlash) { + result += "("; + result += afterSlash.replace("/", "\\/"); + result += ")"; + } + result += exactEnding ? "(\\/?(\\?[^/]*?)?)$" : "(\\/?.*?)$"; + return new RegExp(result, "i"); + } + + function getCurrentThemePreset(props) { + const custom = props.data.settings.customThemes.find(({url}) => + isURLInList(props.data.activeTab.url, url) + ); + const preset = custom + ? null + : props.data.settings.presets.find(({urls}) => + isURLInList(props.data.activeTab.url, urls) + ); + let theme = custom + ? custom.theme + : preset + ? preset.theme + : props.data.settings.theme; + if (props.data.forcedScheme) { + const mode = props.data.forcedScheme === "dark" ? 1 : 0; + theme = {...theme, mode}; + } + function setTheme(config) { + if (custom) { + custom.theme = {...custom.theme, ...config}; + props.actions.changeSettings({ + customThemes: props.data.settings.customThemes + }); + } else if (preset) { + preset.theme = {...preset.theme, ...config}; + props.actions.changeSettings({ + presets: props.data.settings.presets + }); + } else { + props.actions.setTheme(config); + } + if ( + config.mode != null && + props.data.settings.automation.behavior === "Scheme" + ) { + props.actions.changeSettings({ + automation: { + ...props.data.settings.automation, + ...{enabled: false} + } + }); + } + } + return { + theme, + change: setTheme + }; + } + + function Body({data, actions}) { + const context = getComponentContext(); + const {state, setState} = useState({errorText: null}); + let textNode; + const previewButtonText = data.settings.previewNewDesign + ? "Switch to old design" + : "Preview new design"; + const {theme} = getCurrentThemePreset({data, actions}); + const wrapper = + theme.engine === ThemeEngine.staticTheme + ? { + header: "Static Theme Editor", + fixesText: data.devtools.staticThemesText, + apply: (text) => actions.applyDevStaticThemes(text), + reset: () => actions.resetDevStaticThemes() + } + : theme.engine === ThemeEngine.cssFilter || + theme.engine === ThemeEngine.svgFilter + ? { + header: "Inversion Fix Editor", + fixesText: data.devtools.filterFixesText, + apply: (text) => actions.applyDevInversionFixes(text), + reset: () => actions.resetDevInversionFixes() + } + : { + header: "Dynamic Theme Editor", + fixesText: data.devtools.dynamicFixesText, + apply: (text) => actions.applyDevDynamicThemeFixes(text), + reset: () => actions.resetDevDynamicThemeFixes() + }; + function onTextRender(node) { + textNode = node; + if (!state.errorText) { + textNode.value = wrapper.fixesText; + } + node.addEventListener("keydown", (e) => { + if (e.key === "Tab") { + e.preventDefault(); + const indent = " ".repeat(4); + if (isFirefox) { + const start = node.selectionStart; + const end = node.selectionEnd; + const before = node.value.substring(0, start); + const after = node.value.substring(end); + node.focus(); + node.value = `${before}${indent}${after}`; + const cursorPos = start + indent.length; + node.setSelectionRange(cursorPos, cursorPos); + } else { + document.execCommand("insertText", false, indent); + } + } + }); + } + async function apply() { + const text = textNode.value; + try { + await wrapper.apply(text); + setState({errorText: null}); + } catch (err) { + setState({ + errorText: String(err) + }); + } + } + function showDialog() { + context.store.isDialogVisible = true; + context.refresh(); + } + function hideDialog() { + context.store.isDialogVisible = false; + context.refresh(); + } + const dialog = + context && context.store.isDialogVisible + ? m$1(MessageBox, { + caption: + "Are you sure you want to remove current changes? You cannot restore them later.", + onOK: reset, + onCancel: hideDialog + }) + : null; + function reset() { + context.store.isDialogVisible = false; + wrapper.reset(); + setState({errorText: null}); + } + function toggleDesign() { + actions.changeSettings({ + previewNewDesign: !data.settings.previewNewDesign + }); + } + return m$1( + "body", + null, + m$1( + "header", + null, + m$1("img", { + id: "logo", + src: "../assets/images/darkreader-type.svg", + alt: "Dark Reader" + }), + m$1("h1", {id: "title"}, "Developer Tools") + ), + m$1("h3", {id: "sub-title"}, wrapper.header), + m$1("textarea", { + id: "editor", + onrender: onTextRender, + spellcheck: "false", + autocorrect: "off", + autocomplete: "off", + autocapitalize: "off" + }), + m$1("label", {id: "error-text"}, state.errorText), + m$1( + "div", + {id: "buttons"}, + m$1(Button, {onclick: showDialog}, "Reset changes", dialog), + m$1(Button, {onclick: apply}, "Apply"), + m$1( + Button, + {class: "preview-design-button", onclick: toggleDesign}, + previewButtonText + ) + ), + m$1( + "p", + {id: "description"}, + "Read about this tool ", + m$1( + "strong", + null, + m$1( + "a", + { + href: DEVTOOLS_DOCS_URL, + target: "_blank", + rel: "noopener noreferrer" + }, + "here" + ) + ), + ". If a ", + m$1("strong", null, "popular"), + " website looks incorrect e-mail to ", + m$1("strong", null, "DarkReaderApp@gmail.com") + ), + m$1(Overlay$1, null) + ); + } + var Body$1 = withState(Body); + + class Connector { + constructor() { + this.onChangesReceived = ({type, data}) => { + if (type === MessageType.BG_CHANGES) { + this.changeSubscribers.forEach((callback) => + callback(data) + ); + } + }; + this.changeSubscribers = new Set(); + } + async sendRequest(type, data) { + return new Promise((resolve, reject) => { + chrome.runtime.sendMessage({type, data}, ({data, error}) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + }); + } + async firefoxSendRequestWithResponse(type, data) { + return new Promise((resolve, reject) => { + const dataPort = chrome.runtime.connect({name: type}); + dataPort.onDisconnect.addListener(() => reject()); + dataPort.onMessage.addListener(({data, error}) => { + if (error) { + reject(error); + } else { + resolve(data); + } + dataPort.disconnect(); + }); + data && dataPort.postMessage({data}); + }); + } + async getData() { + if (isFirefox) { + return await this.firefoxSendRequestWithResponse( + MessageType.UI_GET_DATA + ); + } + return await this.sendRequest(MessageType.UI_GET_DATA); + } + subscribeToChanges(callback) { + this.changeSubscribers.add(callback); + if (this.changeSubscribers.size === 1) { + chrome.runtime.onMessage.addListener(this.onChangesReceived); + chrome.runtime.sendMessage({ + type: MessageType.UI_SUBSCRIBE_TO_CHANGES + }); + } + } + setShortcut(command, shortcut) { + chrome.runtime.sendMessage({ + type: MessageType.UI_SET_SHORTCUT, + data: {command, shortcut} + }); + } + changeSettings(settings) { + chrome.runtime.sendMessage({ + type: MessageType.UI_CHANGE_SETTINGS, + data: settings + }); + } + setTheme(theme) { + chrome.runtime.sendMessage({ + type: MessageType.UI_SET_THEME, + data: theme + }); + } + toggleActiveTab() { + chrome.runtime.sendMessage({ + type: MessageType.UI_TOGGLE_ACTIVE_TAB, + data: {} + }); + } + markNewsAsRead(ids) { + chrome.runtime.sendMessage({ + type: MessageType.UI_MARK_NEWS_AS_READ, + data: ids + }); + } + markNewsAsDisplayed(ids) { + chrome.runtime.sendMessage({ + type: MessageType.UI_MARK_NEWS_AS_DISPLAYED, + data: ids + }); + } + loadConfig(options) { + chrome.runtime.sendMessage({ + type: MessageType.UI_LOAD_CONFIG, + data: options + }); + } + async applyDevDynamicThemeFixes(text) { + if (isFirefox) { + return await this.firefoxSendRequestWithResponse( + MessageType.UI_APPLY_DEV_DYNAMIC_THEME_FIXES, + text + ); + } + return await this.sendRequest( + MessageType.UI_APPLY_DEV_DYNAMIC_THEME_FIXES, + text + ); + } + resetDevDynamicThemeFixes() { + chrome.runtime.sendMessage({ + type: MessageType.UI_RESET_DEV_DYNAMIC_THEME_FIXES + }); + } + async applyDevInversionFixes(text) { + if (isFirefox) { + return await this.firefoxSendRequestWithResponse( + MessageType.UI_APPLY_DEV_INVERSION_FIXES, + text + ); + } + return await this.sendRequest( + MessageType.UI_APPLY_DEV_INVERSION_FIXES, + text + ); + } + resetDevInversionFixes() { + chrome.runtime.sendMessage({ + type: MessageType.UI_RESET_DEV_INVERSION_FIXES + }); + } + async applyDevStaticThemes(text) { + if (isFirefox) { + return await this.firefoxSendRequestWithResponse( + MessageType.UI_APPLY_DEV_STATIC_THEMES, + text + ); + } + return await this.sendRequest( + MessageType.UI_APPLY_DEV_STATIC_THEMES, + text + ); + } + resetDevStaticThemes() { + chrome.runtime.sendMessage({ + type: MessageType.UI_RESET_DEV_STATIC_THEMES + }); + } + disconnect() { + if (this.changeSubscribers.size > 0) { + this.changeSubscribers.clear(); + chrome.runtime.onMessage.removeListener(this.onChangesReceived); + chrome.runtime.sendMessage({ + type: MessageType.UI_UNSUBSCRIBE_FROM_CHANGES + }); + } + } + } + + function renderBody(data, actions) { + sync(document.body, m$1(Body$1, {data: data, actions: actions})); + } + async function start() { + const connector = new Connector(); + window.addEventListener("unload", () => connector.disconnect()); + const data = await connector.getData(); + renderBody(data, connector); + connector.subscribeToChanges((data) => renderBody(data, connector)); + } + start(); +})(); diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/devtools/style.css b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/devtools/style.css new file mode 100644 index 0000000..2281bb4 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/devtools/style.css @@ -0,0 +1,1077 @@ +@font-face { + font-family: "Open Sans"; + src: url("../assets/fonts/OpenSans-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: "Open Sans"; + src: url("../assets/fonts/OpenSans-SemiBold.ttf") format("truetype"); + font-weight: bold; + font-style: normal; +} +@font-face { + font-family: "Open Sans"; + src: url("../assets/fonts/OpenSans-Light.ttf") format("truetype"); + font-weight: 100; + font-style: normal; +} +.button { + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: content-box; + color: #ffffff; + cursor: pointer; + display: inline-block; + height: 1.5rem; + line-height: 0.75rem; + min-width: 1.5rem; + outline: none; + overflow: hidden; + padding: 0; + text-align: center; + transition: background-color 250ms; + -moz-user-select: none; + user-select: none; +} +.button:hover { + background-color: #193945; + transition: background-color 125ms; +} +.button:active { + background-color: #316e7d; +} +.button__wrapper { + height: 100%; + width: 100%; +} +.checkbox { + align-items: stretch; + background-color: #141e24; + border: 0.125rem solid #316e7d; + cursor: pointer; + display: inline-flex; + flex: none; + flex-direction: row; + height: 1.5rem; + transition: background-color 250ms; + width: 1.5rem; +} +.checkbox:hover { + background-color: #193945; + transition: background-color 125ms; +} +.checkbox__input { + display: none; +} +.checkbox__checkmark { + display: inline-block; + height: 100%; + position: relative; + width: 1.5rem; +} +.checkbox__checkmark::before, +.checkbox__checkmark::after { + background-color: #316e7d; + content: ""; + display: inline-block; + height: 0.1875rem; + left: 0.1875rem; + position: absolute; + top: 0.6375rem; + transition: all 125ms; + width: 1.125rem; +} +.checkbox__checkmark::before { + transform: skewY(45deg); +} +.checkbox__checkmark::after { + transform: skewY(-45deg); +} +.checkbox__input:checked + .checkbox__checkmark::before, +.checkbox__input:checked + .checkbox__checkmark::after { + background-color: #ffffff; +} +.checkbox__input:checked + .checkbox__checkmark::before { + top: 0.825rem; + width: 0.375rem; +} +.checkbox__input:checked + .checkbox__checkmark::after { + left: 0.5625rem; + width: 0.75rem; +} +.dropdown { + display: inline-block; + height: 1.5rem; + position: relative; + -moz-user-select: none; + user-select: none; + width: 100%; +} +.dropdown__selected { + align-items: center; + background-color: #316e7d; + background-image: url('data:image/svg+xml;utf8,'); + background-position: center right 0.25rem; + background-repeat: no-repeat; + background-size: 1rem; + color: #ffffff; + display: inline-flex; + height: 1.25rem; + justify-content: center; + line-height: 1.25rem; + margin-top: 0.125rem; + position: absolute; + text-align: center; + width: 100%; +} +.dropdown__selected__text { + display: inline-block; + max-width: calc(100% - 2.5rem); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.dropdown__list { + background-color: #141e24; + border: 0.125rem solid #316e7d; + border-top: none; + box-shadow: 0 0 0.25rem black; + box-sizing: border-box; + display: none; + margin-top: 0.125rem; + overflow: hidden; + position: absolute; + width: 100%; +} +.dropdown__list__item { + align-items: center; + background-color: #141e24; + color: #ffffff; + display: inline-flex; + justify-content: center; + min-height: 1.25rem; + text-align: center; + width: 100%; +} +.dropdown__list__item:hover { + background-color: #193945; + transition: background-color 125ms; +} +.dropdown__list__item--selected { + overflow: hidden; + visibility: hidden; + white-space: nowrap; +} +.dropdown--open .dropdown__list { + display: inline-block; + margin-top: 0rem; + z-index: 1; +} +.dropdown--open .dropdown__list__item { + min-height: 1.5rem; +} +.dropdown--open .dropdown__selected { + height: 1.5rem; + margin-top: 0rem; + z-index: 2; +} +.preview .dropdown { + cursor: pointer; +} +.message-box { + background-color: #141e24; + border-bottom: 0.125rem solid #316e7d; + border-top: 0.125rem solid #316e7d; + display: flex; + flex-direction: column; + padding: 0.75rem; +} +.message-box__caption { + text-align: center; +} +.message-box__buttons { + display: flex; + flex-direction: row; + justify-content: center; + margin-top: 0.5rem; +} +.message-box__button { + min-width: 4rem; +} +.message-box__button:not(:first-child) { + margin-left: 0.5rem; +} +.message-box__button-ok { + border-color: gray; +} +.multi-switch { + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: content-box; + color: #ffffff; + display: inline-flex; + height: 1.5rem; + position: relative; + -moz-user-select: none; + user-select: none; +} +.multi-switch__option { + align-items: center; + cursor: pointer; + display: inline-flex; + justify-content: center; + height: 100%; + overflow: hidden; + position: relative; + transition: background-color 250ms; + white-space: nowrap; + width: 50%; +} +.multi-switch__option:hover:not(.multi-switch__option--selected) { + background-color: #193945; +} +.multi-switch__highlight { + background-color: #316e7d; + display: inline-block; + height: 100%; + left: 0; + position: absolute; + top: 0; + transition: left 125ms, width 125ms; + width: 0; +} +.overlay { + align-items: center; + background-color: rgba(20, 30, 36, 0.5); + flex-direction: column; + display: inline-flex; + height: 100%; + justify-content: center; + left: 0; + position: fixed; + top: 0; + width: 100%; + z-index: 2; +} +.overlay:empty { + display: none; +} +.shortcut { + color: #53a1b3; + cursor: pointer; + display: inline-block; + font-size: 0.625rem; + line-height: 0.875rem; + outline: none; + text-align: center; + text-decoration: none; + white-space: pre; +} +.shortcut:hover { + text-decoration: underline; +} +.shortcut--edit { + color: #ffffff; +} +.shortcut::before { + content: "✎"; + direction: rtl; + display: inline-block; + line-height: 0.875rem; + visibility: hidden; + width: 0; +} +.shortcut:hover::before, +.shortcut--edit::before { + visibility: visible; +} +.tab-panel { + align-items: stretch; + display: flex; + flex-direction: column; + min-height: 0; +} +.tab-panel__button { + border-bottom: 0.125rem solid #316e7d; + border-left: none; + border-right: none; + border-top: none; + box-sizing: border-box; + color: #316e7d; + font-size: 0.875rem; + font-weight: bold; + height: 1.625rem; + padding: 0 0.625rem; + white-space: pre; +} +.tab-panel__button:hover { + color: #53a1b3; +} +.tab-panel__button:active { + background-color: #193945; +} +.tab-panel__button--active { + border-bottom: none; + border-left: 0.125rem solid #316e7d; + border-right: 0.125rem solid #316e7d; + border-top: 0.125rem solid #316e7d; + color: #e96c4c; + padding: 0 0.5rem; +} +.tab-panel__button--active:hover { + color: #e96c4c; +} +.tab-panel__buttons { + display: flex; + flex: none; + flex-direction: row; + justify-content: center; +} +.tab-panel__buttons::before, +.tab-panel__buttons::after { + border-bottom: 0.125rem solid #316e7d; + content: ""; + flex: auto; +} +.tab-panel__tabs { + display: flex; + flex: auto; + flex-direction: row; + margin-top: 0.75rem; + min-height: 0; +} +.tab-panel__tab { + background-color: #141e24; + display: flex; + opacity: 0; + overflow: hidden; + pointer-events: none; + transition: width 250ms, opacity 125ms; + width: 0; +} +.tab-panel__tab--active { + opacity: 1; + pointer-events: all; + transition: width 250ms, opacity 250ms; + width: 100%; +} +.select { + display: inline-flex; + flex-direction: column; + position: relative; +} +.select__line { + display: inline-flex; + flex-direction: row; +} +.select__textbox.textbox { + border-right: none; + flex: auto; + width: 100%; +} +.select__expand { + border-left: none; + flex: none; +} +.select__expand__icon { + display: inline-block; + height: 100%; + position: relative; + width: 100%; +} +.select__expand__icon::before, +.select__expand__icon::after { + background-color: #ffffff; + content: ""; + display: inline-block; + height: 0.1875rem; + position: absolute; + top: 0.75rem; + width: 0.5625rem; + z-index: 1; +} +.select__expand__icon::before { + left: 0.1875rem; + transform: skewY(45deg); +} +.select__expand__icon::after { + left: 0.75rem; + transform: skewY(-45deg); +} +.select__list { + background-color: #141e24; + border-bottom: 0.125rem solid #316e7d; + border-left: 0.125rem solid #316e7d; + border-right: 0.125rem solid #316e7d; + box-sizing: border-box; + left: 0; + max-height: 0; + overflow-x: hidden; + overflow-y: auto; + position: absolute; + top: calc(100% - 0.125rem); + transition: max-height 125ms; + width: 100%; + z-index: 999; +} +.select__list--expanded { + max-height: 12rem; + transition: max-height 500ms; +} +.select__list--short { + overflow: hidden; +} +.select__option { + align-items: center; + background-color: #141e24; + cursor: pointer; + display: flex; + flex: none; + height: 1.5rem; + flex-direction: row; + padding-left: 0.375rem; +} +.select__option:hover { + background-color: #193945; +} +.slider { + display: inline-block; + height: 1.5rem; + position: relative; + width: 100%; +} +.slider__track { + background-color: #193945; + display: inline-block; + height: 0.625rem; + margin-left: 0.25rem; + margin-top: 0.4375rem; + position: absolute; + width: calc(100% - 0.5rem); +} +.slider__track__fill { + background-color: #316e7d; + display: inline-block; + height: 100%; + position: absolute; +} +.slider__track__fill::before { + background-color: #316e7d; + content: ""; + height: 100%; + position: absolute; + right: 100%; + width: 0.25rem; +} +.slider__track::before, +.slider__track::after { + background-color: #193945; + content: ""; + height: 100%; + position: absolute; + width: 0.25rem; +} +.slider__track::before { + right: 100%; +} +.slider__track::after { + left: 100%; +} +.slider__thumb-wrapper { + margin-left: 0.25rem; + position: absolute; + width: calc(100% - 0.5rem); +} +.slider__thumb { + background-color: #ffffff; + cursor: pointer; + display: inline-block; + height: 1.25rem; + margin-left: -0.25rem; + margin-top: 0.125rem; + position: absolute; + width: 0.5rem; +} +.slider__thumb__value { + color: #ffffff; + cursor: default; + left: calc(100% + 0.75rem / 2); + line-height: 1.25rem; + position: absolute; + -moz-user-select: none; + user-select: none; +} +.slider__thumb__value--flip { + left: initial; + right: calc(100% + 0.75rem / 2); +} +.slider--active .slider__thumb { + box-shadow: 0 0 0.25rem black; + height: 1.5rem; + margin-top: 0rem; +} +.slider--active .slider__thumb__value { + line-height: 1.5rem; +} +.slider--active .slider__track { + height: 0.75rem; + margin-top: 0.375rem; +} +.text-list { + border-top: 0.125rem solid #316e7d; + margin-bottom: 0.0625rem; + min-width: 1.5rem; + overflow-x: hidden; + overflow-y: auto; +} +.text-list__textbox.textbox { + border-bottom: 0.0625rem solid #316e7d; + border-left: 0.125rem solid #316e7d; + border-right: 0.125rem solid #316e7d; + border-top: none; + box-sizing: border-box; + flex: none; + height: 1.5625rem; + width: 100%; +} +.text-list__textbox.textbox:last-child { + border-bottom: 0.125rem solid #316e7d; +} +.text-list::-webkit-scrollbar { + width: 1.25rem; +} +.text-list::-webkit-scrollbar-thumb { + border-left: 0.5rem solid #141e24; +} +.textbox { + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: content-box; + color: #53a1b3; + height: 1.5rem; + line-height: 1.5rem; + outline: none; + overflow: hidden; + padding: 0; + text-indent: 0.375rem; + transition: background-color 250ms; +} +.textbox:hover, +.textbox:focus { + background-color: #193945; + transition: background-color 125ms; +} +.textbox:focus { + color: #ffffff; +} +.textbox::placeholder { + color: #316e7d; +} +input[type="time"]::-webkit-calendar-picker-indicator { + filter: invert(54%) sepia(3%) saturate(3931%) hue-rotate(153deg) + brightness(115%) contrast(75%); +} +.time-range-picker { + display: inline-flex; + flex: auto; +} +.time-range-picker__input { + text-align: center; + text-indent: 0; + width: 100%; + background-color: #141e24; +} +.time-range-picker__input--start { + border-right: none; +} +.time-range-picker__input--end { + border-left: 0.0625rem solid #316e7d; +} +.toggle { + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: content-box; + color: #ffffff; + display: inline-flex; + height: 1.5rem; + position: relative; + -moz-user-select: none; + user-select: none; +} +.toggle__btn { + align-items: center; + cursor: pointer; + display: inline-flex; + justify-content: center; + height: 100%; + overflow: hidden; + position: relative; + transition: background-color 250ms; + white-space: nowrap; + width: 50%; +} +.toggle__btn:hover:not(.toggle__btn--active) { + background-color: #193945; +} +.toggle::before { + background-color: #316e7d; + content: ""; + display: inline-block; + height: 100%; + left: 50%; + position: absolute; + top: 0; + transition: left 125ms; + width: 50%; +} +.toggle--checked::before { + left: 0; +} +.updown { + align-items: stretch; + display: flex; + flex-direction: column; + -moz-user-select: none; + user-select: none; +} +.updown__line { + display: flex; + flex-direction: row; +} +.updown__line > :not(:first-child) { + margin-left: 0.5rem; +} +.updown__icon { + display: inline-block; + height: 100%; + position: relative; + width: 100%; +} +.updown__icon::before, +.updown__icon::after { + background-color: #ffffff; + content: ""; + display: inline-block; + height: 0.5625rem; + position: absolute; + width: 0.1875rem; +} +.updown__icon::before { + top: 0.1875rem; +} +.updown__icon::after { + top: 0.75rem; +} +.updown__icon-up::before { + left: 0.75rem; + transform: skewX(45deg); +} +.updown__icon-up::after { + left: 0.75rem; + transform: skewX(-45deg); +} +.updown__icon-down::before { + left: 0.5625rem; + transform: skewX(-45deg); +} +.updown__icon-down::after { + left: 0.5625rem; + transform: skewX(45deg); +} +.updown__button--disabled { + pointer-events: none; +} +.updown__button--disabled:hover, +.updown__button--disabled:active { + background-color: #141e24; +} +.updown__button--disabled .updown__icon::before, +.updown__button--disabled .updown__icon::after { + background-color: #316e7d; +} +.updown__value-text { + font-size: 0.625rem; + line-height: 0.875rem; + text-align: center; + white-space: nowrap; +} +.track { + align-items: center; + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: content-box; + display: inline-flex; + flex: auto; + flex-direction: row; + height: 1.5rem; + justify-content: center; + overflow: hidden; + position: relative; + transition: background-color 250ms; + -moz-user-select: none; + user-select: none; +} +.track:hover { + background-color: #193945; + transition: background-color 125ms; +} +.track--clickable { + cursor: pointer; +} +.track__value { + background-color: #316e7d; + height: 100%; + left: 0; + position: absolute; + top: 0; + transition: width 125ms; +} +.track__label { + color: #ffffff; + display: inline-block; + line-height: 0.75rem; + pointer-events: none; + position: relative; + white-space: nowrap; + z-index: 1; +} +.hsb-picker { + display: flex; + flex-direction: row; + padding: 0.5rem; + touch-action: none; +} +.hsb-picker__sb-container { + cursor: pointer; + height: 7.5rem; + position: relative; + -webkit-tap-highlight-color: transparent; + width: 7.5rem; +} +.hsb-picker__hue-container { + cursor: pointer; + height: 7.5rem; + margin-left: 0.5rem; + position: relative; + -webkit-tap-highlight-color: transparent; + width: 0.75rem; +} +.hsb-picker__sb-canvas { + height: 100%; + width: 100%; +} +.hsb-picker__hue-canvas { + height: 100%; + width: 100%; +} +.hsb-picker__hue-cursor, +.hsb-picker__sb-cursor { + border-radius: 50%; + box-shadow: 0 0 0 0.125rem #ffffff; + display: inline-block; + height: 0.75rem; + margin-top: -0.375rem; + position: absolute; + width: 0.75rem; + z-index: 2; +} +.hsb-picker__sb-cursor { + margin-left: -0.375rem; +} +.color-picker { + height: 1.5rem; + position: relative; + width: 100%; +} +.color-picker__wrapper { + background-color: #141e24; + display: inline-flex; + flex-direction: column; + left: 0; + overflow: hidden; + position: absolute; + top: 0; + width: 100%; +} +.color-picker--focused .color-picker__wrapper { + border: 0.125rem solid #316e7d; + box-sizing: border-box; + z-index: 1; +} +.color-picker__input { + background-color: #316e7d; + border: none; + box-sizing: border-box; + color: #ffffff; + height: 1.25rem; + margin-top: 0.125rem; + text-align: center; + width: 100%; +} +.color-picker--focused .color-picker__input { + margin-top: 0; +} +.color-picker__preview { + cursor: pointer; + display: inline-block; + height: 1rem; + left: 0.25rem; + position: absolute; + top: 0.25rem; + width: 1rem; +} +.color-picker--focused .color-picker__preview { + left: 0.125rem; + top: 0.125rem; +} +.color-picker__reset { + background-image: url('data:image/svg+xml;utf8,'); + background-position: 0 0; + background-repeat: no-repeat; + background-size: 1rem; + cursor: pointer; + display: inline-block; + height: 1rem; + position: absolute; + right: 0.25rem; + top: 0.25rem; + width: 1rem; +} +.color-picker--focused .color-picker__reset { + right: 0.125rem; + top: 0.125rem; +} +.color-picker__textbox-line { + width: 100%; +} +.color-picker__hsb-line { + display: none; + width: 100%; +} +.color-picker--focused .color-picker__hsb-line { + border-color: #316e7d; + display: block; +} +.color-dropdown { + height: 1.5rem; + position: relative; + width: 100%; +} +.color-dropdown__options { + width: 100%; +} +.color-dropdown__picker { + height: 100%; + position: absolute; + right: 0; + top: 0; + width: 100%; +} +.color-dropdown__picker--hidden { + display: none; +} +.nav-button { + background-image: url('data:image/svg+xml;utf8,'); + background-position: center right 0.25rem; + background-repeat: no-repeat; + background-size: 1rem; + width: calc(100% - 2 * 0.125rem); +} +.nav-button__content { + align-items: center; + display: inline-flex; + flex-direction: row; + height: 100%; +} +.reset-button { + width: calc(100% - 2 * 0.125rem); +} +.reset-button__content { + align-items: center; + display: inline-flex; + flex-direction: row; + height: 100%; +} +.reset-button__icon { + background-image: url('data:image/svg+xml;utf8,'); + background-position: 0 0; + background-size: 1rem; + display: inline-block; + height: 1rem; + margin-right: 0.125rem; + width: 1rem; +} +html { + background-color: #141e24; + color: #53a1b3; + color-scheme: dark; + font-family: Open Sans, Segoe UI, Helvetica Neue, Ubuntu, sans-serif; + font-size: 16px; +} +body { + font-family: Open Sans, Segoe UI, Helvetica Neue, Ubuntu, sans-serif; + font-size: 0.75rem; +} +input, +button { + font-family: Open Sans, Segoe UI, Helvetica Neue, Ubuntu, sans-serif; + font-size: 0.75rem; +} +::-moz-selection { + background-color: #e96c4c; + color: #ffffff; +} +::selection { + background-color: #e96c4c; + color: #ffffff; +} +::-webkit-scrollbar { + background-color: #141e24; + width: 0.75rem; +} +::-webkit-scrollbar-thumb { + background-color: #193945; +} +::-webkit-scrollbar-thumb:hover { + background-color: #255461; +} +::-webkit-scrollbar-thumb:active { + background-color: #316e7d; +} +::-webkit-scrollbar-corner { + background-color: #141e24; +} +* { + scrollbar-color: #193945 #141e24; +} +html { + height: 100%; +} +body { + align-items: center; + display: flex; + flex-direction: column; + height: 100%; + margin: 0 auto; +} +header { + align-items: stretch; + display: flex; + flex: none; + flex-direction: row; + flex-wrap: nowrap; + justify-content: center; + margin-top: 0.75rem; +} +#logo { + display: inline-block; + font-size: 0.875rem; + height: 1.5rem; + width: 15rem; +} +#title { + align-items: stretch; + display: inline-flex; + flex-direction: row; + font-size: 2rem; + font-weight: 100; + line-height: 1.5rem; + height: 1.5rem; + margin: 0 0 0 0.5rem; + text-transform: uppercase; + transform: translateY(-0.0625rem); +} +#sub-title { + font-size: 0.75rem; + font-weight: normal; + margin: 0.75rem 0 0 0; + text-transform: uppercase; +} +#editor { + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: border-box; + color: #53a1b3; + flex: auto; + font-family: monospace; + font-size: 0.75rem; + min-width: 9rem; + outline: none; + padding: 0.375rem; + resize: none; + white-space: pre; + width: 100%; +} +#editor::placeholder { + color: #316e7d; +} +#editor:hover { + background-color: #15252c; +} +#editor:hover::-webkit-scrollbar, +#editor:hover::-webkit-scrollbar-corner { + background-color: #15252c; +} +#editor:focus { + background-color: #15252c; + color: #7eb9c6; +} +#editor:focus::-webkit-scrollbar, +#editor:focus::-webkit-scrollbar-corner { + background-color: #15252c; +} +#error-text { + color: #db4245; + font-family: monospace; + white-space: pre; +} +#buttons { + display: flex; + flex: none; + flex-direction: row; + justify-content: center; + margin-bottom: 0.75rem; + margin-top: 0.5rem; + width: 100%; +} +#buttons > :not(:first-child) { + margin-left: 0.5rem; +} +#buttons .button { + min-width: 3rem; + max-width: 6rem; + width: 100%; +} +#buttons .preview-design-button { + border-color: gray; + max-width: 8rem; +} +#description { + margin: 0 0 0.75rem 0; + text-align: center; + white-space: wrap; +} +#description a { + color: #53a1b3; +} +@media screen and (max-width: 33rem) { + #title { + display: none; + } +} +@media screen and (max-height: 33rem) { + header, + #description { + display: none; + } + #sub-title { + margin-top: 0.5rem; + } + #buttons { + margin-bottom: 0.5rem; + } +} +.message-box { + border: 0.125rem solid #316e7d; +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/popup/compatibility.js b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/popup/compatibility.js new file mode 100644 index 0000000..2626db0 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/popup/compatibility.js @@ -0,0 +1,49 @@ +(function () { + if ("userAgentData" in navigator) { + return; + } + var match = navigator.userAgent + .toLowerCase() + .match(/chrom[e|ium]\/([^ \.]+)/); + if (!match) { + return; + } + var version = parseInt(match[1]); + var minChromeVersion = 63; + if (version >= minChromeVersion) { + return; + } + var warning = document.createElement("div"); + warning.className = "compatibility-warning"; + var text = document.createTextNode( + [ + "Your Google Chrome (or Chromium) version " + + version + + " is out of date.", + "In order to use this extension update your Google Chrome.", + "If you cannot update, install the old Dark Reader version, which works for at least Chrome 49, from " + ].join(" ") + ); + var link = document.createElement("a"); + link.href = + "https://chrome.google.com/webstore/detail/oibheihomapbjogmoabgfbkchjchpdfp"; + link.target = "_blank"; + link.textContent = "here"; + warning.appendChild(text); + warning.appendChild(link); + warning.style.backgroundColor = "#00222b"; + warning.style.boxSizing = "border-box"; + warning.style.color = "#e96c4c"; + warning.style.height = "100%"; + warning.style.left = "0"; + warning.style.padding = "40% 1rem 0 1rem"; + warning.style.position = "fixed"; + warning.style.textAlign = "justify"; + warning.style.textAlignLast = "center"; + warning.style.top = "0"; + warning.style.width = "100%"; + warning.style.zIndex = "2014"; + link.style.color = "#e96c4c"; + link.style.outline = "none"; + document.body.appendChild(warning); +})(); diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/popup/index.html b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/popup/index.html new file mode 100644 index 0000000..cd47799 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/popup/index.html @@ -0,0 +1,22 @@ + + + + + Dark Reader settings + + + + + + + + + +
+ +
+ + diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/popup/index.js b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/popup/index.js new file mode 100644 index 0000000..81fce00 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/popup/index.js @@ -0,0 +1,7765 @@ +(function () { + "use strict"; + + /* malevic@0.19.1 - Jan 8, 2022 */ + function m$1(tagOrComponent, props, ...children) { + props = props || {}; + if (typeof tagOrComponent === "string") { + const tag = tagOrComponent; + return {type: tag, props, children}; + } + if (typeof tagOrComponent === "function") { + const component = tagOrComponent; + return {type: component, props, children}; + } + throw new Error("Unsupported spec type"); + } + + /* malevic@0.19.1 - Jan 8, 2022 */ + function createPluginsStore() { + const plugins = []; + return { + add(plugin) { + plugins.push(plugin); + return this; + }, + apply(props) { + let result; + let plugin; + const usedPlugins = new Set(); + for (let i = plugins.length - 1; i >= 0; i--) { + plugin = plugins[i]; + if (usedPlugins.has(plugin)) { + continue; + } + result = plugin(props); + if (result != null) { + return result; + } + usedPlugins.add(plugin); + } + return null; + }, + delete(plugin) { + for (let i = plugins.length - 1; i >= 0; i--) { + if (plugins[i] === plugin) { + plugins.splice(i, 1); + break; + } + } + return this; + }, + empty() { + return plugins.length === 0; + } + }; + } + function iterateComponentPlugins(type, pairs, iterator) { + pairs + .filter(([key]) => type[key]) + .forEach(([key, plugins]) => { + return type[key].forEach((plugin) => iterator(plugins, plugin)); + }); + } + function addComponentPlugins(type, pairs) { + iterateComponentPlugins(type, pairs, (plugins, plugin) => + plugins.add(plugin) + ); + } + function deleteComponentPlugins(type, pairs) { + iterateComponentPlugins(type, pairs, (plugins, plugin) => + plugins.delete(plugin) + ); + } + function createPluginsAPI(key) { + const api = { + add(type, plugin) { + if (!type[key]) { + type[key] = []; + } + type[key].push(plugin); + return api; + } + }; + return api; + } + + const XHTML_NS = "http://www.w3.org/1999/xhtml"; + const SVG_NS = "http://www.w3.org/2000/svg"; + const PLUGINS_CREATE_ELEMENT = Symbol(); + const pluginsCreateElement = createPluginsStore(); + function createElement(spec, parent) { + const result = pluginsCreateElement.apply({spec, parent}); + if (result) { + return result; + } + const tag = spec.type; + if (tag === "svg") { + return document.createElementNS(SVG_NS, "svg"); + } + const namespace = parent.namespaceURI; + if (namespace === XHTML_NS || namespace == null) { + return document.createElement(tag); + } + return document.createElementNS(namespace, tag); + } + + function classes$1(...args) { + const classes = []; + args.filter((c) => Boolean(c)).forEach((c) => { + if (typeof c === "string") { + classes.push(c); + } else if (typeof c === "object") { + classes.push( + ...Object.keys(c).filter((key) => Boolean(c[key])) + ); + } + }); + return classes.join(" "); + } + function setInlineCSSPropertyValue(element, prop, $value) { + if ($value != null && $value !== "") { + let value = String($value); + let important = ""; + if (value.endsWith("!important")) { + value = value.substring(0, value.length - 10); + important = "important"; + } + element.style.setProperty(prop, value, important); + } else { + element.style.removeProperty(prop); + } + } + + function isObject(value) { + return value != null && typeof value === "object"; + } + + const eventListeners = new WeakMap(); + function addEventListener$1(element, event, listener) { + let listeners; + if (eventListeners.has(element)) { + listeners = eventListeners.get(element); + } else { + listeners = new Map(); + eventListeners.set(element, listeners); + } + if (listeners.get(event) !== listener) { + if (listeners.has(event)) { + element.removeEventListener(event, listeners.get(event)); + } + element.addEventListener(event, listener); + listeners.set(event, listener); + } + } + function removeEventListener(element, event) { + if (!eventListeners.has(element)) { + return; + } + const listeners = eventListeners.get(element); + element.removeEventListener(event, listeners.get(event)); + listeners.delete(event); + } + + function setClassObject(element, classObj) { + const cls = Array.isArray(classObj) + ? classes$1(...classObj) + : classes$1(classObj); + if (cls) { + element.setAttribute("class", cls); + } else { + element.removeAttribute("class"); + } + } + function mergeValues(obj, old) { + const values = new Map(); + const newProps = new Set(Object.keys(obj)); + const oldProps = Object.keys(old); + oldProps + .filter((prop) => !newProps.has(prop)) + .forEach((prop) => values.set(prop, null)); + newProps.forEach((prop) => values.set(prop, obj[prop])); + return values; + } + function setStyleObject(element, styleObj, prev) { + let prevObj; + if (isObject(prev)) { + prevObj = prev; + } else { + prevObj = {}; + element.removeAttribute("style"); + } + const declarations = mergeValues(styleObj, prevObj); + declarations.forEach(($value, prop) => + setInlineCSSPropertyValue(element, prop, $value) + ); + } + function setEventListener(element, event, listener) { + if (typeof listener === "function") { + addEventListener$1(element, event, listener); + } else { + removeEventListener(element, event); + } + } + const specialAttrs = new Set([ + "key", + "oncreate", + "onupdate", + "onrender", + "onremove" + ]); + const PLUGINS_SET_ATTRIBUTE = Symbol(); + const pluginsSetAttribute = createPluginsStore(); + function getPropertyValue(obj, prop) { + return obj && obj.hasOwnProperty(prop) ? obj[prop] : null; + } + function syncAttrs(element, attrs, prev) { + const values = mergeValues(attrs, prev || {}); + values.forEach((value, attr) => { + if (!pluginsSetAttribute.empty()) { + const result = pluginsSetAttribute.apply({ + element, + attr, + value, + get prev() { + return getPropertyValue(prev, attr); + } + }); + if (result != null) { + return; + } + } + if (attr === "class" && isObject(value)) { + setClassObject(element, value); + } else if (attr === "style" && isObject(value)) { + const prevValue = getPropertyValue(prev, attr); + setStyleObject(element, value, prevValue); + } else if (attr.startsWith("on")) { + const event = attr.substring(2); + setEventListener(element, event, value); + } else if (specialAttrs.has(attr)); + else if (value == null || value === false) { + element.removeAttribute(attr); + } else { + element.setAttribute(attr, value === true ? "" : String(value)); + } + }); + } + + class LinkedList { + constructor(...items) { + this.nexts = new WeakMap(); + this.prevs = new WeakMap(); + this.first = null; + this.last = null; + items.forEach((item) => this.push(item)); + } + empty() { + return this.first == null; + } + push(item) { + if (this.empty()) { + this.first = item; + this.last = item; + } else { + this.nexts.set(this.last, item); + this.prevs.set(item, this.last); + this.last = item; + } + } + insertBefore(newItem, refItem) { + const prev = this.before(refItem); + this.prevs.set(newItem, prev); + this.nexts.set(newItem, refItem); + this.prevs.set(refItem, newItem); + prev && this.nexts.set(prev, newItem); + refItem === this.first && (this.first = newItem); + } + delete(item) { + const prev = this.before(item); + const next = this.after(item); + prev && this.nexts.set(prev, next); + next && this.prevs.set(next, prev); + item === this.first && (this.first = next); + item === this.last && (this.last = prev); + } + before(item) { + return this.prevs.get(item) || null; + } + after(item) { + return this.nexts.get(item) || null; + } + loop(iterator) { + if (this.empty()) { + return; + } + let current = this.first; + do { + if (iterator(current)) { + break; + } + } while ((current = this.after(current))); + } + copy() { + const list = new LinkedList(); + this.loop((item) => { + list.push(item); + return false; + }); + return list; + } + forEach(iterator) { + this.loop((item) => { + iterator(item); + return false; + }); + } + find(iterator) { + let result = null; + this.loop((item) => { + if (iterator(item)) { + result = item; + return true; + } + return false; + }); + return result; + } + map(iterator) { + const results = []; + this.loop((item) => { + results.push(iterator(item)); + return false; + }); + return results; + } + } + + function matchChildren(vnode, old) { + const oldChildren = old.children(); + const oldChildrenByKey = new Map(); + const oldChildrenWithoutKey = []; + oldChildren.forEach((v) => { + const key = v.key(); + if (key == null) { + oldChildrenWithoutKey.push(v); + } else { + oldChildrenByKey.set(key, v); + } + }); + const children = vnode.children(); + const matches = []; + const unmatched = new Set(oldChildren); + const keys = new Set(); + children.forEach((v) => { + let match = null; + let guess = null; + const key = v.key(); + if (key != null) { + if (keys.has(key)) { + throw new Error("Duplicate key"); + } + keys.add(key); + if (oldChildrenByKey.has(key)) { + guess = oldChildrenByKey.get(key); + } + } else if (oldChildrenWithoutKey.length > 0) { + guess = oldChildrenWithoutKey.shift(); + } + if (v.matches(guess)) { + match = guess; + } + matches.push([v, match]); + if (match) { + unmatched.delete(match); + } + }); + return {matches, unmatched}; + } + + function execute(vnode, old, vdom) { + const didMatch = vnode && old && vnode.matches(old); + if (didMatch && vnode.parent() === old.parent()) { + vdom.replaceVNode(old, vnode); + } else if (vnode) { + vdom.addVNode(vnode); + } + const context = vdom.getVNodeContext(vnode); + const oldContext = vdom.getVNodeContext(old); + if (old && !didMatch) { + old.detach(oldContext); + old.children().forEach((v) => execute(null, v, vdom)); + old.detached(oldContext); + } + if (vnode && !didMatch) { + vnode.attach(context); + vnode.children().forEach((v) => execute(v, null, vdom)); + vnode.attached(context); + } + if (didMatch) { + const result = vnode.update(old, context); + if (result !== vdom.LEAVE) { + const {matches, unmatched} = matchChildren(vnode, old); + unmatched.forEach((v) => execute(null, v, vdom)); + matches.forEach(([v, o]) => execute(v, o, vdom)); + vnode.updated(context); + } + } + } + + function m(tagOrComponent, props, ...children) { + props = props || {}; + if (typeof tagOrComponent === "string") { + const tag = tagOrComponent; + return {type: tag, props, children}; + } + if (typeof tagOrComponent === "function") { + const component = tagOrComponent; + return {type: component, props, children}; + } + throw new Error("Unsupported spec type"); + } + function isSpec(x) { + return isObject(x) && x.type != null && x.nodeType == null; + } + function isNodeSpec(x) { + return isSpec(x) && typeof x.type === "string"; + } + function isComponentSpec(x) { + return isSpec(x) && typeof x.type === "function"; + } + + class VNodeBase { + constructor(parent) { + this.parentVNode = parent; + } + key() { + return null; + } + parent(vnode) { + if (vnode) { + this.parentVNode = vnode; + return; + } + return this.parentVNode; + } + children() { + return []; + } + attach(context) {} + detach(context) {} + update(old, context) { + return null; + } + attached(context) {} + detached(context) {} + updated(context) {} + } + function nodeMatchesSpec(node, spec) { + return ( + node instanceof Element && spec.type === node.tagName.toLowerCase() + ); + } + const refinedElements = new WeakMap(); + function markElementAsRefined(element, vdom) { + let refined; + if (refinedElements.has(vdom)) { + refined = refinedElements.get(vdom); + } else { + refined = new WeakSet(); + refinedElements.set(vdom, refined); + } + refined.add(element); + } + function isElementRefined(element, vdom) { + return ( + refinedElements.has(vdom) && refinedElements.get(vdom).has(element) + ); + } + class ElementVNode extends VNodeBase { + constructor(spec, parent) { + super(parent); + this.spec = spec; + } + matches(other) { + return ( + other instanceof ElementVNode && + this.spec.type === other.spec.type + ); + } + key() { + return this.spec.props.key; + } + children() { + return [this.child]; + } + getExistingElement(context) { + const parent = context.parent; + const existing = context.node; + let element; + if (nodeMatchesSpec(existing, this.spec)) { + element = existing; + } else if ( + !isElementRefined(parent, context.vdom) && + context.vdom.isDOMNodeCaptured(parent) + ) { + const sibling = context.sibling; + const guess = sibling + ? sibling.nextElementSibling + : parent.firstElementChild; + if (guess && !context.vdom.isDOMNodeCaptured(guess)) { + if (nodeMatchesSpec(guess, this.spec)) { + element = guess; + } else { + parent.removeChild(guess); + } + } + } + return element; + } + attach(context) { + let element; + const existing = this.getExistingElement(context); + if (existing) { + element = existing; + } else { + element = createElement(this.spec, context.parent); + markElementAsRefined(element, context.vdom); + } + syncAttrs(element, this.spec.props, null); + this.child = createDOMVNode( + element, + this.spec.children, + this, + false + ); + } + update(prev, context) { + const prevContext = context.vdom.getVNodeContext(prev); + const element = prevContext.node; + syncAttrs(element, this.spec.props, prev.spec.props); + this.child = createDOMVNode( + element, + this.spec.children, + this, + false + ); + } + attached(context) { + const {oncreate, onrender} = this.spec.props; + if (oncreate) { + oncreate(context.node); + } + if (onrender) { + onrender(context.node); + } + } + detached(context) { + const {onremove} = this.spec.props; + if (onremove) { + onremove(context.node); + } + } + updated(context) { + const {onupdate, onrender} = this.spec.props; + if (onupdate) { + onupdate(context.node); + } + if (onrender) { + onrender(context.node); + } + } + } + const symbols = { + CREATED: Symbol(), + REMOVED: Symbol(), + UPDATED: Symbol(), + RENDERED: Symbol(), + ACTIVE: Symbol(), + DEFAULTS_ASSIGNED: Symbol() + }; + const domPlugins = [ + [PLUGINS_CREATE_ELEMENT, pluginsCreateElement], + [PLUGINS_SET_ATTRIBUTE, pluginsSetAttribute] + ]; + class ComponentVNode extends VNodeBase { + constructor(spec, parent) { + super(parent); + this.lock = false; + this.spec = spec; + this.prev = null; + this.store = {}; + this.store[symbols.ACTIVE] = this; + } + matches(other) { + return ( + other instanceof ComponentVNode && + this.spec.type === other.spec.type + ); + } + key() { + return this.spec.props.key; + } + children() { + return [this.child]; + } + createContext(context) { + const {parent} = context; + const {spec, prev, store} = this; + return { + spec, + prev, + store, + get node() { + return context.node; + }, + get nodes() { + return context.nodes; + }, + parent, + onCreate: (fn) => (store[symbols.CREATED] = fn), + onUpdate: (fn) => (store[symbols.UPDATED] = fn), + onRemove: (fn) => (store[symbols.REMOVED] = fn), + onRender: (fn) => (store[symbols.RENDERED] = fn), + refresh: () => { + const activeVNode = store[symbols.ACTIVE]; + activeVNode.refresh(context); + }, + leave: () => context.vdom.LEAVE, + getStore: (defaults) => { + if (defaults && !store[symbols.DEFAULTS_ASSIGNED]) { + Object.entries(defaults).forEach(([prop, value]) => { + store[prop] = value; + }); + store[symbols.DEFAULTS_ASSIGNED] = true; + } + return store; + } + }; + } + unbox(context) { + const Component = this.spec.type; + const props = this.spec.props; + const children = this.spec.children; + this.lock = true; + const prevContext = ComponentVNode.context; + ComponentVNode.context = this.createContext(context); + let unboxed = null; + try { + unboxed = Component(props, ...children); + } finally { + ComponentVNode.context = prevContext; + this.lock = false; + } + return unboxed; + } + refresh(context) { + if (this.lock) { + throw new Error( + "Calling refresh during unboxing causes infinite loop" + ); + } + this.prev = this.spec; + const latestContext = context.vdom.getVNodeContext(this); + const unboxed = this.unbox(latestContext); + if (unboxed === context.vdom.LEAVE) { + return; + } + const prevChild = this.child; + this.child = createVNode(unboxed, this); + context.vdom.execute(this.child, prevChild); + this.updated(context); + } + addPlugins() { + addComponentPlugins(this.spec.type, domPlugins); + } + deletePlugins() { + deleteComponentPlugins(this.spec.type, domPlugins); + } + attach(context) { + this.addPlugins(); + const unboxed = this.unbox(context); + const childSpec = unboxed === context.vdom.LEAVE ? null : unboxed; + this.child = createVNode(childSpec, this); + } + update(prev, context) { + this.store = prev.store; + this.prev = prev.spec; + this.store[symbols.ACTIVE] = this; + const prevContext = context.vdom.getVNodeContext(prev); + this.addPlugins(); + const unboxed = this.unbox(prevContext); + let result = null; + if (unboxed === context.vdom.LEAVE) { + result = unboxed; + this.child = prev.child; + context.vdom.adoptVNode(this.child, this); + } else { + this.child = createVNode(unboxed, this); + } + return result; + } + handle(event, context) { + const fn = this.store[event]; + if (fn) { + const nodes = + context.nodes.length === 0 ? [null] : context.nodes; + fn(...nodes); + } + } + attached(context) { + this.deletePlugins(); + this.handle(symbols.CREATED, context); + this.handle(symbols.RENDERED, context); + } + detached(context) { + this.handle(symbols.REMOVED, context); + } + updated(context) { + this.deletePlugins(); + this.handle(symbols.UPDATED, context); + this.handle(symbols.RENDERED, context); + } + } + ComponentVNode.context = null; + function getComponentContext() { + return ComponentVNode.context; + } + class TextVNode extends VNodeBase { + constructor(text, parent) { + super(parent); + this.text = text; + } + matches(other) { + return other instanceof TextVNode; + } + children() { + return [this.child]; + } + getExistingNode(context) { + const {parent} = context; + let node; + if (context.node instanceof Text) { + node = context.node; + } else if ( + !isElementRefined(parent, context.vdom) && + context.vdom.isDOMNodeCaptured(parent) + ) { + const sibling = context.sibling; + const guess = sibling ? sibling.nextSibling : parent.firstChild; + if ( + guess && + !context.vdom.isDOMNodeCaptured(guess) && + guess instanceof Text + ) { + node = guess; + } + } + return node; + } + attach(context) { + const existing = this.getExistingNode(context); + let node; + if (existing) { + node = existing; + node.textContent = this.text; + } else { + node = document.createTextNode(this.text); + } + this.child = createVNode(node, this); + } + update(prev, context) { + const prevContext = context.vdom.getVNodeContext(prev); + const {node} = prevContext; + if (this.text !== prev.text) { + node.textContent = this.text; + } + this.child = createVNode(node, this); + } + } + class InlineFunctionVNode extends VNodeBase { + constructor(fn, parent) { + super(parent); + this.fn = fn; + } + matches(other) { + return other instanceof InlineFunctionVNode; + } + children() { + return [this.child]; + } + call(context) { + const fn = this.fn; + const inlineFnContext = { + parent: context.parent, + get node() { + return context.node; + }, + get nodes() { + return context.nodes; + } + }; + const result = fn(inlineFnContext); + this.child = createVNode(result, this); + } + attach(context) { + this.call(context); + } + update(prev, context) { + const prevContext = context.vdom.getVNodeContext(prev); + this.call(prevContext); + } + } + class NullVNode extends VNodeBase { + matches(other) { + return other instanceof NullVNode; + } + } + class DOMVNode extends VNodeBase { + constructor(node, childSpecs, parent, isNative) { + super(parent); + this.node = node; + this.childSpecs = childSpecs; + this.isNative = isNative; + } + matches(other) { + return other instanceof DOMVNode && this.node === other.node; + } + wrap() { + this.childVNodes = this.childSpecs.map((spec) => + createVNode(spec, this) + ); + } + insertNode(context) { + const {parent, sibling} = context; + const shouldInsert = !( + parent === this.node.parentElement && + sibling === this.node.previousSibling + ); + if (shouldInsert) { + const target = sibling + ? sibling.nextSibling + : parent.firstChild; + parent.insertBefore(this.node, target); + } + } + attach(context) { + this.wrap(); + this.insertNode(context); + } + detach(context) { + context.parent.removeChild(this.node); + } + update(prev, context) { + this.wrap(); + this.insertNode(context); + } + cleanupDOMChildren(context) { + const element = this.node; + for (let current = element.lastChild; current != null; ) { + if (context.vdom.isDOMNodeCaptured(current)) { + current = current.previousSibling; + } else { + const prev = current.previousSibling; + element.removeChild(current); + current = prev; + } + } + } + refine(context) { + if (!this.isNative) { + this.cleanupDOMChildren(context); + } + const element = this.node; + markElementAsRefined(element, context.vdom); + } + attached(context) { + const {node} = this; + if ( + node instanceof Element && + !isElementRefined(node, context.vdom) && + context.vdom.isDOMNodeCaptured(node) + ) { + this.refine(context); + } + } + children() { + return this.childVNodes; + } + } + function isDOMVNode(v) { + return v instanceof DOMVNode; + } + function createDOMVNode(node, childSpecs, parent, isNative) { + return new DOMVNode(node, childSpecs, parent, isNative); + } + class ArrayVNode extends VNodeBase { + constructor(items, key, parent) { + super(parent); + this.items = items; + this.id = key; + } + matches(other) { + return other instanceof ArrayVNode; + } + key() { + return this.id; + } + children() { + return this.childVNodes; + } + wrap() { + this.childVNodes = this.items.map((spec) => + createVNode(spec, this) + ); + } + attach() { + this.wrap(); + } + update() { + this.wrap(); + } + } + function createVNode(spec, parent) { + if (isNodeSpec(spec)) { + return new ElementVNode(spec, parent); + } + if (isComponentSpec(spec)) { + if (spec.type === Array) { + return new ArrayVNode(spec.children, spec.props.key, parent); + } + return new ComponentVNode(spec, parent); + } + if (typeof spec === "string") { + return new TextVNode(spec, parent); + } + if (spec == null) { + return new NullVNode(parent); + } + if (typeof spec === "function") { + return new InlineFunctionVNode(spec, parent); + } + if (spec instanceof Node) { + return createDOMVNode(spec, [], parent, true); + } + if (Array.isArray(spec)) { + return new ArrayVNode(spec, null, parent); + } + throw new Error("Unable to create virtual node for spec"); + } + + function createVDOM(rootNode) { + const contexts = new WeakMap(); + const hubs = new WeakMap(); + const parentNodes = new WeakMap(); + const passingLinks = new WeakMap(); + const linkedParents = new WeakSet(); + const LEAVE = Symbol(); + function execute$1(vnode, old) { + execute(vnode, old, vdom); + } + function creatVNodeContext(vnode) { + const parentNode = parentNodes.get(vnode); + contexts.set(vnode, { + parent: parentNode, + get node() { + const linked = passingLinks + .get(vnode) + .find((link) => link.node != null); + return linked ? linked.node : null; + }, + get nodes() { + return passingLinks + .get(vnode) + .map((link) => link.node) + .filter((node) => node); + }, + get sibling() { + if (parentNode === rootNode.parentElement) { + return passingLinks.get(vnode).first.node + .previousSibling; + } + const hub = hubs.get(parentNode); + let current = passingLinks.get(vnode).first; + while ((current = hub.links.before(current))) { + if (current.node) { + return current.node; + } + } + return null; + }, + vdom + }); + } + function createRootVNodeLinks(vnode) { + const parentNode = + rootNode.parentElement || document.createDocumentFragment(); + const node = rootNode; + const links = new LinkedList({ + parentNode, + node + }); + passingLinks.set(vnode, links.copy()); + parentNodes.set(vnode, parentNode); + hubs.set(parentNode, { + node: parentNode, + links + }); + } + function createVNodeLinks(vnode) { + const parent = vnode.parent(); + const isBranch = linkedParents.has(parent); + const parentNode = isDOMVNode(parent) + ? parent.node + : parentNodes.get(parent); + parentNodes.set(vnode, parentNode); + const vnodeLinks = new LinkedList(); + passingLinks.set(vnode, vnodeLinks); + if (isBranch) { + const newLink = { + parentNode, + node: null + }; + let current = vnode; + do { + passingLinks.get(current).push(newLink); + current = current.parent(); + } while (current && !isDOMVNode(current)); + hubs.get(parentNode).links.push(newLink); + } else { + linkedParents.add(parent); + const links = isDOMVNode(parent) + ? hubs.get(parentNode).links + : passingLinks.get(parent); + links.forEach((link) => vnodeLinks.push(link)); + } + } + function connectDOMVNode(vnode) { + if (isDOMVNode(vnode)) { + const {node} = vnode; + hubs.set(node, { + node, + links: new LinkedList({ + parentNode: node, + node: null + }) + }); + passingLinks.get(vnode).forEach((link) => (link.node = node)); + } + } + function addVNode(vnode) { + const parent = vnode.parent(); + if (parent == null) { + createRootVNodeLinks(vnode); + } else { + createVNodeLinks(vnode); + } + connectDOMVNode(vnode); + creatVNodeContext(vnode); + } + function getVNodeContext(vnode) { + return contexts.get(vnode); + } + function getAncestorsLinks(vnode) { + const parentNode = parentNodes.get(vnode); + const hub = hubs.get(parentNode); + const allLinks = []; + let current = vnode; + while ((current = current.parent()) && !isDOMVNode(current)) { + allLinks.push(passingLinks.get(current)); + } + allLinks.push(hub.links); + return allLinks; + } + function replaceVNode(old, vnode) { + if (vnode.parent() == null) { + addVNode(vnode); + return; + } + const oldContext = contexts.get(old); + const {parent: parentNode} = oldContext; + parentNodes.set(vnode, parentNode); + const oldLinks = passingLinks.get(old); + const newLink = { + parentNode, + node: null + }; + getAncestorsLinks(vnode).forEach((links) => { + const nextLink = links.after(oldLinks.last); + oldLinks.forEach((link) => links.delete(link)); + if (nextLink) { + links.insertBefore(newLink, nextLink); + } else { + links.push(newLink); + } + }); + const vnodeLinks = new LinkedList(newLink); + passingLinks.set(vnode, vnodeLinks); + creatVNodeContext(vnode); + } + function adoptVNode(vnode, parent) { + const vnodeLinks = passingLinks.get(vnode); + const parentLinks = passingLinks.get(parent).copy(); + vnode.parent(parent); + getAncestorsLinks(vnode).forEach((links) => { + vnodeLinks.forEach((link) => + links.insertBefore(link, parentLinks.first) + ); + parentLinks.forEach((link) => links.delete(link)); + }); + } + function isDOMNodeCaptured(node) { + return hubs.has(node) && node !== rootNode.parentElement; + } + const vdom = { + execute: execute$1, + addVNode, + getVNodeContext, + replaceVNode, + adoptVNode, + isDOMNodeCaptured, + LEAVE + }; + return vdom; + } + + const roots = new WeakMap(); + const vdoms = new WeakMap(); + function realize(node, vnode) { + const old = roots.get(node) || null; + roots.set(node, vnode); + let vdom; + if (vdoms.has(node)) { + vdom = vdoms.get(node); + } else { + vdom = createVDOM(node); + vdoms.set(node, vdom); + } + vdom.execute(vnode, old); + return vdom.getVNodeContext(vnode); + } + function render$1(element, spec) { + const vnode = createDOMVNode( + element, + Array.isArray(spec) ? spec : [spec], + null, + false + ); + realize(element, vnode); + return element; + } + function sync(node, spec) { + const vnode = createVNode(spec, null); + const context = realize(node, vnode); + const {nodes} = context; + if (nodes.length !== 1 || nodes[0] !== node) { + throw new Error("Spec does not match the node"); + } + return nodes[0]; + } + + function normalize(attrsOrChild, ...otherChildren) { + const attrs = + isObject(attrsOrChild) && !isSpec(attrsOrChild) + ? attrsOrChild + : null; + const children = + attrs == null + ? [attrsOrChild].concat(otherChildren) + : otherChildren; + return {attrs, children}; + } + function createTagFunction(tag) { + return (attrsOrChild, ...otherChildren) => { + const {attrs, children} = normalize(attrsOrChild, otherChildren); + return m(tag, attrs, children); + }; + } + new Proxy( + {}, + { + get: (_, tag) => { + return createTagFunction(tag); + } + } + ); + + const plugins = { + createElement: createPluginsAPI(PLUGINS_CREATE_ELEMENT), + setAttribute: createPluginsAPI(PLUGINS_SET_ATTRIBUTE) + }; + + const isNavigatorDefined = typeof navigator !== "undefined"; + const userAgent = isNavigatorDefined + ? navigator.userAgentData && + Array.isArray(navigator.userAgentData.brands) + ? navigator.userAgentData.brands + .map( + (brand) => `${brand.brand.toLowerCase()} ${brand.version}` + ) + .join(" ") + : navigator.userAgent.toLowerCase() + : "some useragent"; + const platform = isNavigatorDefined + ? navigator.userAgentData && + typeof navigator.userAgentData.platform === "string" + ? navigator.userAgentData.platform.toLowerCase() + : navigator.platform.toLowerCase() + : "some platform"; + const isThunderbird = userAgent.includes("thunderbird"); + const isFirefox = + userAgent.includes("firefox") || + userAgent.includes("librewolf") || + isThunderbird; + const isVivaldi = userAgent.includes("vivaldi"); + const isYaBrowser = userAgent.includes("yabrowser"); + const isOpera = userAgent.includes("opr") || userAgent.includes("opera"); + const isEdge = userAgent.includes("edg"); + const isWindows = platform.startsWith("win"); + const isMacOS = platform.startsWith("mac"); + const isMobile = + isNavigatorDefined && navigator.userAgentData + ? navigator.userAgentData.mobile + : userAgent.includes("mobile"); + const chromiumVersion = (() => { + const m = userAgent.match(/chrom(?:e|ium)(?:\/| )([^ ]+)/); + if (m && m[1]) { + return m[1]; + } + return ""; + })(); + (() => { + const m = userAgent.match(/(?:firefox|librewolf)(?:\/| )([^ ]+)/); + if (m && m[1]) { + return m[1]; + } + return ""; + })(); + (() => { + try { + document.querySelector(":defined"); + return true; + } catch (err) { + return false; + } + })(); + function compareChromeVersions($a, $b) { + const a = $a.split(".").map((x) => parseInt(x)); + const b = $b.split(".").map((x) => parseInt(x)); + for (let i = 0; i < a.length; i++) { + if (a[i] !== b[i]) { + return a[i] < b[i] ? -1 : 1; + } + } + return 0; + } + const isCSSColorSchemePropSupported = (() => { + if (typeof document === "undefined") { + return false; + } + const el = document.createElement("div"); + el.setAttribute("style", "color-scheme: dark"); + return el.style && el.style.colorScheme === "dark"; + })(); + + var MessageType; + (function (MessageType) { + MessageType["UI_GET_DATA"] = "ui-get-data"; + MessageType["UI_SUBSCRIBE_TO_CHANGES"] = "ui-subscribe-to-changes"; + MessageType["UI_UNSUBSCRIBE_FROM_CHANGES"] = + "ui-unsubscribe-from-changes"; + MessageType["UI_CHANGE_SETTINGS"] = "ui-change-settings"; + MessageType["UI_SET_THEME"] = "ui-set-theme"; + MessageType["UI_SET_SHORTCUT"] = "ui-set-shortcut"; + MessageType["UI_TOGGLE_ACTIVE_TAB"] = "ui-toggle-active-tab"; + MessageType["UI_MARK_NEWS_AS_READ"] = "ui-mark-news-as-read"; + MessageType["UI_MARK_NEWS_AS_DISPLAYED"] = "ui-mark-news-as-displayed"; + MessageType["UI_LOAD_CONFIG"] = "ui-load-config"; + MessageType["UI_APPLY_DEV_DYNAMIC_THEME_FIXES"] = + "ui-apply-dev-dynamic-theme-fixes"; + MessageType["UI_RESET_DEV_DYNAMIC_THEME_FIXES"] = + "ui-reset-dev-dynamic-theme-fixes"; + MessageType["UI_APPLY_DEV_INVERSION_FIXES"] = + "ui-apply-dev-inversion-fixes"; + MessageType["UI_RESET_DEV_INVERSION_FIXES"] = + "ui-reset-dev-inversion-fixes"; + MessageType["UI_APPLY_DEV_STATIC_THEMES"] = + "ui-apply-dev-static-themes"; + MessageType["UI_RESET_DEV_STATIC_THEMES"] = + "ui-reset-dev-static-themes"; + MessageType["UI_SAVE_FILE"] = "ui-save-file"; + MessageType["UI_REQUEST_EXPORT_CSS"] = "ui-request-export-css"; + MessageType["UI_COLOR_SCHEME_CHANGE"] = "ui-color-scheme-change"; + MessageType["BG_CHANGES"] = "bg-changes"; + MessageType["BG_ADD_CSS_FILTER"] = "bg-add-css-filter"; + MessageType["BG_ADD_STATIC_THEME"] = "bg-add-static-theme"; + MessageType["BG_ADD_SVG_FILTER"] = "bg-add-svg-filter"; + MessageType["BG_ADD_DYNAMIC_THEME"] = "bg-add-dynamic-theme"; + MessageType["BG_EXPORT_CSS"] = "bg-export-css"; + MessageType["BG_UNSUPPORTED_SENDER"] = "bg-unsupported-sender"; + MessageType["BG_CLEAN_UP"] = "bg-clean-up"; + MessageType["BG_RELOAD"] = "bg-reload"; + MessageType["BG_FETCH_RESPONSE"] = "bg-fetch-response"; + MessageType["BG_UI_UPDATE"] = "bg-ui-update"; + MessageType["BG_CSS_UPDATE"] = "bg-css-update"; + MessageType["CS_COLOR_SCHEME_CHANGE"] = "cs-color-scheme-change"; + MessageType["CS_FRAME_CONNECT"] = "cs-frame-connect"; + MessageType["CS_FRAME_FORGET"] = "cs-frame-forget"; + MessageType["CS_FRAME_FREEZE"] = "cs-frame-freeze"; + MessageType["CS_FRAME_RESUME"] = "cs-frame-resume"; + MessageType["CS_EXPORT_CSS_RESPONSE"] = "cs-export-css-response"; + MessageType["CS_FETCH"] = "cs-fetch"; + MessageType["CS_DARK_THEME_DETECTED"] = "cs-dark-theme-detected"; + MessageType["CS_DARK_THEME_NOT_DETECTED"] = + "cs-dark-theme-not-detected"; + MessageType["CS_LOG"] = "cs-log"; + })(MessageType || (MessageType = {})); + + class Connector { + constructor() { + this.onChangesReceived = ({type, data}) => { + if (type === MessageType.BG_CHANGES) { + this.changeSubscribers.forEach((callback) => + callback(data) + ); + } + }; + this.changeSubscribers = new Set(); + } + async sendRequest(type, data) { + return new Promise((resolve, reject) => { + chrome.runtime.sendMessage({type, data}, ({data, error}) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + }); + } + async firefoxSendRequestWithResponse(type, data) { + return new Promise((resolve, reject) => { + const dataPort = chrome.runtime.connect({name: type}); + dataPort.onDisconnect.addListener(() => reject()); + dataPort.onMessage.addListener(({data, error}) => { + if (error) { + reject(error); + } else { + resolve(data); + } + dataPort.disconnect(); + }); + data && dataPort.postMessage({data}); + }); + } + async getData() { + if (isFirefox) { + return await this.firefoxSendRequestWithResponse( + MessageType.UI_GET_DATA + ); + } + return await this.sendRequest(MessageType.UI_GET_DATA); + } + subscribeToChanges(callback) { + this.changeSubscribers.add(callback); + if (this.changeSubscribers.size === 1) { + chrome.runtime.onMessage.addListener(this.onChangesReceived); + chrome.runtime.sendMessage({ + type: MessageType.UI_SUBSCRIBE_TO_CHANGES + }); + } + } + setShortcut(command, shortcut) { + chrome.runtime.sendMessage({ + type: MessageType.UI_SET_SHORTCUT, + data: {command, shortcut} + }); + } + changeSettings(settings) { + chrome.runtime.sendMessage({ + type: MessageType.UI_CHANGE_SETTINGS, + data: settings + }); + } + setTheme(theme) { + chrome.runtime.sendMessage({ + type: MessageType.UI_SET_THEME, + data: theme + }); + } + toggleActiveTab() { + chrome.runtime.sendMessage({ + type: MessageType.UI_TOGGLE_ACTIVE_TAB, + data: {} + }); + } + markNewsAsRead(ids) { + chrome.runtime.sendMessage({ + type: MessageType.UI_MARK_NEWS_AS_READ, + data: ids + }); + } + markNewsAsDisplayed(ids) { + chrome.runtime.sendMessage({ + type: MessageType.UI_MARK_NEWS_AS_DISPLAYED, + data: ids + }); + } + loadConfig(options) { + chrome.runtime.sendMessage({ + type: MessageType.UI_LOAD_CONFIG, + data: options + }); + } + async applyDevDynamicThemeFixes(text) { + if (isFirefox) { + return await this.firefoxSendRequestWithResponse( + MessageType.UI_APPLY_DEV_DYNAMIC_THEME_FIXES, + text + ); + } + return await this.sendRequest( + MessageType.UI_APPLY_DEV_DYNAMIC_THEME_FIXES, + text + ); + } + resetDevDynamicThemeFixes() { + chrome.runtime.sendMessage({ + type: MessageType.UI_RESET_DEV_DYNAMIC_THEME_FIXES + }); + } + async applyDevInversionFixes(text) { + if (isFirefox) { + return await this.firefoxSendRequestWithResponse( + MessageType.UI_APPLY_DEV_INVERSION_FIXES, + text + ); + } + return await this.sendRequest( + MessageType.UI_APPLY_DEV_INVERSION_FIXES, + text + ); + } + resetDevInversionFixes() { + chrome.runtime.sendMessage({ + type: MessageType.UI_RESET_DEV_INVERSION_FIXES + }); + } + async applyDevStaticThemes(text) { + if (isFirefox) { + return await this.firefoxSendRequestWithResponse( + MessageType.UI_APPLY_DEV_STATIC_THEMES, + text + ); + } + return await this.sendRequest( + MessageType.UI_APPLY_DEV_STATIC_THEMES, + text + ); + } + resetDevStaticThemes() { + chrome.runtime.sendMessage({ + type: MessageType.UI_RESET_DEV_STATIC_THEMES + }); + } + disconnect() { + if (this.changeSubscribers.size > 0) { + this.changeSubscribers.clear(); + chrome.runtime.onMessage.removeListener(this.onChangesReceived); + chrome.runtime.sendMessage({ + type: MessageType.UI_UNSUBSCRIBE_FROM_CHANGES + }); + } + } + } + + /* malevic@0.19.1 - Jan 8, 2022 */ + + function withForms(type) { + plugins.setAttribute.add(type, ({element, attr, value}) => { + if (attr === "value" && element instanceof HTMLInputElement) { + const text = (element.value = value == null ? "" : value); + element.value = text; + return true; + } + return null; + }); + return type; + } + + /* malevic@0.19.1 - Jan 8, 2022 */ + + let currentUseStateFn = null; + function useState(initialState) { + if (!currentUseStateFn) { + throw new Error("`useState()` should be called inside a component"); + } + return currentUseStateFn(initialState); + } + function withState(type) { + const Stateful = (props, ...children) => { + const context = getComponentContext(); + const useState = (initial) => { + if (!context) { + return {state: initial, setState: null}; + } + const {store, refresh} = context; + store.state = store.state || initial; + const setState = (newState) => { + if (lock) { + throw new Error( + "Setting state during unboxing causes infinite loop" + ); + } + store.state = Object.assign( + Object.assign({}, store.state), + newState + ); + refresh(); + }; + return { + state: store.state, + setState + }; + }; + let lock = true; + const prevUseStateFn = currentUseStateFn; + currentUseStateFn = useState; + let result; + try { + result = type(props, ...children); + } finally { + currentUseStateFn = prevUseStateFn; + lock = false; + } + return result; + }; + return Stateful; + } + + function classes(...args) { + const classes = []; + args.filter((c) => Boolean(c)).forEach((c) => { + if (typeof c === "string") { + classes.push(c); + } else if (typeof c === "object") { + classes.push( + ...Object.keys(c).filter((key) => Boolean(c[key])) + ); + } + }); + return classes.join(" "); + } + function compose(type, ...wrappers) { + return wrappers.reduce((t, w) => w(t), type); + } + function openFile(options, callback) { + const input = document.createElement("input"); + input.type = "file"; + input.style.display = "none"; + if (options.extensions && options.extensions.length > 0) { + input.accept = options.extensions.map((ext) => `.${ext}`).join(","); + } + const reader = new FileReader(); + reader.onloadend = () => callback(reader.result); + input.onchange = () => { + if (input.files[0]) { + reader.readAsText(input.files[0]); + document.body.removeChild(input); + } + }; + document.body.appendChild(input); + input.click(); + } + function saveFile(name, content) { + if (isFirefox) { + const a = document.createElement("a"); + a.href = URL.createObjectURL(new Blob([content])); + a.download = name; + a.click(); + } else { + chrome.runtime.sendMessage({ + type: MessageType.UI_SAVE_FILE, + data: {name, content} + }); + } + } + function throttle$1(callback) { + let frameId = null; + return (...args) => { + if (!frameId) { + callback(...args); + frameId = requestAnimationFrame(() => (frameId = null)); + } + }; + } + function onSwipeStart(startEventObj, startHandler) { + const isTouchEvent = + typeof TouchEvent !== "undefined" && + startEventObj instanceof TouchEvent; + const touchId = isTouchEvent + ? startEventObj.changedTouches[0].identifier + : null; + const pointerMoveEvent = isTouchEvent ? "touchmove" : "mousemove"; + const pointerUpEvent = isTouchEvent ? "touchend" : "mouseup"; + if (!isTouchEvent) { + startEventObj.preventDefault(); + } + function getSwipeEventObject(e) { + const {clientX, clientY} = isTouchEvent ? getTouch(e) : e; + return {clientX, clientY}; + } + const startSE = getSwipeEventObject(startEventObj); + const {move: moveHandler, up: upHandler} = startHandler( + startSE, + startEventObj + ); + function getTouch(e) { + return Array.from(e.changedTouches).find( + ({identifier: id}) => id === touchId + ); + } + const onPointerMove = throttle$1((e) => { + const se = getSwipeEventObject(e); + moveHandler(se, e); + }); + function onPointerUp(e) { + unsubscribe(); + const se = getSwipeEventObject(e); + upHandler(se, e); + } + function unsubscribe() { + window.removeEventListener(pointerMoveEvent, onPointerMove); + window.removeEventListener(pointerUpEvent, onPointerUp); + } + window.addEventListener(pointerMoveEvent, onPointerMove, { + passive: true + }); + window.addEventListener(pointerUpEvent, onPointerUp, {passive: true}); + } + function createSwipeHandler(startHandler) { + return (e) => onSwipeStart(e, startHandler); + } + async function getFontList() { + return new Promise((resolve) => { + if (!chrome.fontSettings) { + resolve([ + "serif", + "sans-serif", + "monospace", + "cursive", + "fantasy", + "system-ui" + ]); + return; + } + chrome.fontSettings.getFontList((list) => { + const fonts = list.map((f) => f.fontId); + resolve(fonts); + }); + }); + } + async function getExtensionPageObject(path) { + if (isMobile) { + return new Promise((resolve) => { + chrome.tabs.query({}, (t) => { + for (const tab of t) { + if (tab.url.endsWith(path)) { + resolve(tab); + return; + } + } + resolve(null); + }); + }); + } + return new Promise((resolve) => { + chrome.windows.getAll( + { + populate: true, + windowTypes: ["popup"] + }, + (w) => { + for (const window of w) { + if (window.tabs[0].url.endsWith(path)) { + resolve(window); + return; + } + } + resolve(null); + } + ); + }); + } + async function openExtensionPage(path) { + const cssEditorObject = await getExtensionPageObject(path); + if (isMobile) { + if (cssEditorObject) { + chrome.tabs.update(cssEditorObject.id, {active: true}); + window.close(); + } else { + chrome.tabs.create({ + url: `../${path}` + }); + window.close(); + } + } else if (cssEditorObject) { + chrome.windows.update(cssEditorObject.id, {focused: true}); + } else { + chrome.windows.create({ + type: "popup", + url: isFirefox ? `../${path}` : `ui/${path}`, + width: 600, + height: 600 + }); + } + } + + function toArray(x) { + return Array.isArray(x) ? x : [x]; + } + function mergeClass(cls, propsCls) { + const normalized = toArray(cls).concat(toArray(propsCls)); + return classes(...normalized); + } + function omitAttrs(omit, attrs) { + const result = {}; + Object.keys(attrs).forEach((key) => { + if (omit.indexOf(key) < 0) { + result[key] = attrs[key]; + } + }); + return result; + } + function isElementHidden(element) { + return element.offsetParent === null; + } + + function Button(props, ...children) { + const cls = mergeClass("button", props.class); + const attrs = omitAttrs(["class"], props); + return m$1( + "button", + {class: cls, ...attrs}, + m$1("span", {class: "button__wrapper"}, ...children) + ); + } + + function CheckBox(props, ...children) { + const cls = mergeClass("checkbox", props.class); + const attrs = omitAttrs(["class", "checked", "onchange"], props); + const check = (domNode) => (domNode.checked = Boolean(props.checked)); + return m$1( + "label", + {class: cls, ...attrs}, + m$1("input", { + class: "checkbox__input", + type: "checkbox", + checked: props.checked, + onchange: props.onchange, + onrender: check + }), + m$1("span", {class: "checkbox__checkmark"}), + m$1("span", {class: "checkbox__content"}, children) + ); + } + + function evalMath(expression) { + const rpnStack = []; + const workingStack = []; + let lastToken; + for (let i = 0, len = expression.length; i < len; i++) { + const token = expression[i]; + if (!token || token === " ") { + continue; + } + if (operators.has(token)) { + const op = operators.get(token); + while (workingStack.length) { + const currentOp = operators.get(workingStack[0]); + if (!currentOp) { + break; + } + if (op.lessOrEqualThan(currentOp)) { + rpnStack.push(workingStack.shift()); + } else { + break; + } + } + workingStack.unshift(token); + } else if (!lastToken || operators.has(lastToken)) { + rpnStack.push(token); + } else { + rpnStack[rpnStack.length - 1] += token; + } + lastToken = token; + } + rpnStack.push(...workingStack); + const stack = []; + for (let i = 0, len = rpnStack.length; i < len; i++) { + const op = operators.get(rpnStack[i]); + if (op) { + const args = stack.splice(0, 2); + stack.push(op.exec(args[1], args[0])); + } else { + stack.unshift(parseFloat(rpnStack[i])); + } + } + return stack[0]; + } + class Operator { + constructor(precedence, method) { + this.precendce = precedence; + this.execMethod = method; + } + exec(left, right) { + return this.execMethod(left, right); + } + lessOrEqualThan(op) { + return this.precendce <= op.precendce; + } + } + const operators = new Map([ + ["+", new Operator(1, (left, right) => left + right)], + ["-", new Operator(1, (left, right) => left - right)], + ["*", new Operator(2, (left, right) => left * right)], + ["/", new Operator(2, (left, right) => left / right)] + ]); + + function getParenthesesRange(input, searchStartIndex = 0) { + const length = input.length; + let depth = 0; + let firstOpenIndex = -1; + for (let i = searchStartIndex; i < length; i++) { + if (depth === 0) { + const openIndex = input.indexOf("(", i); + if (openIndex < 0) { + break; + } + firstOpenIndex = openIndex; + depth++; + i = openIndex; + } else { + const closingIndex = input.indexOf(")", i); + if (closingIndex < 0) { + break; + } + const openIndex = input.indexOf("(", i); + if (openIndex < 0 || closingIndex < openIndex) { + depth--; + if (depth === 0) { + return {start: firstOpenIndex, end: closingIndex + 1}; + } + i = closingIndex; + } else { + depth++; + i = openIndex; + } + } + } + return null; + } + + const rgbaParseCache = new Map(); + function parseColorWithCache($color) { + $color = $color.trim(); + if (rgbaParseCache.has($color)) { + return rgbaParseCache.get($color); + } + if ($color.includes("calc(")) { + $color = lowerCalcExpression($color); + } + const color = parse($color); + color && rgbaParseCache.set($color, color); + return color; + } + function hslToRGB({h, s, l, a = 1}) { + if (s === 0) { + const [r, b, g] = [l, l, l].map((x) => Math.round(x * 255)); + return {r, g, b, a}; + } + const c = (1 - Math.abs(2 * l - 1)) * s; + const x = c * (1 - Math.abs(((h / 60) % 2) - 1)); + const m = l - c / 2; + const [r, g, b] = ( + h < 60 + ? [c, x, 0] + : h < 120 + ? [x, c, 0] + : h < 180 + ? [0, c, x] + : h < 240 + ? [0, x, c] + : h < 300 + ? [x, 0, c] + : [c, 0, x] + ).map((n) => Math.round((n + m) * 255)); + return {r, g, b, a}; + } + function rgbToHSL({r: r255, g: g255, b: b255, a = 1}) { + const r = r255 / 255; + const g = g255 / 255; + const b = b255 / 255; + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + const c = max - min; + const l = (max + min) / 2; + if (c === 0) { + return {h: 0, s: 0, l, a}; + } + let h = + (max === r + ? ((g - b) / c) % 6 + : max === g + ? (b - r) / c + 2 + : (r - g) / c + 4) * 60; + if (h < 0) { + h += 360; + } + const s = c / (1 - Math.abs(2 * l - 1)); + return {h, s, l, a}; + } + function toFixed(n, digits = 0) { + const fixed = n.toFixed(digits); + if (digits === 0) { + return fixed; + } + const dot = fixed.indexOf("."); + if (dot >= 0) { + const zerosMatch = fixed.match(/0+$/); + if (zerosMatch) { + if (zerosMatch.index === dot + 1) { + return fixed.substring(0, dot); + } + return fixed.substring(0, zerosMatch.index); + } + } + return fixed; + } + function rgbToHexString({r, g, b, a}) { + return `#${(a != null && a < 1 + ? [r, g, b, Math.round(a * 255)] + : [r, g, b] + ) + .map((x) => { + return `${x < 16 ? "0" : ""}${x.toString(16)}`; + }) + .join("")}`; + } + function hslToString(hsl) { + const {h, s, l, a} = hsl; + if (a != null && a < 1) { + return `hsla(${toFixed(h)}, ${toFixed(s * 100)}%, ${toFixed( + l * 100 + )}%, ${toFixed(a, 2)})`; + } + return `hsl(${toFixed(h)}, ${toFixed(s * 100)}%, ${toFixed(l * 100)}%)`; + } + const rgbMatch = /^rgba?\([^\(\)]+\)$/; + const hslMatch = /^hsla?\([^\(\)]+\)$/; + const hexMatch = /^#[0-9a-f]+$/i; + function parse($color) { + const c = $color.trim().toLowerCase(); + if (c.match(rgbMatch)) { + return parseRGB(c); + } + if (c.match(hslMatch)) { + return parseHSL(c); + } + if (c.match(hexMatch)) { + return parseHex(c); + } + if (knownColors.has(c)) { + return getColorByName(c); + } + if (systemColors.has(c)) { + return getSystemColor(c); + } + if ($color === "transparent") { + return {r: 0, g: 0, b: 0, a: 0}; + } + return null; + } + function getNumbers($color) { + const numbers = []; + let prevPos = 0; + let isMining = false; + const startIndex = $color.indexOf("("); + $color = $color.substring(startIndex + 1, $color.length - 1); + for (let i = 0; i < $color.length; i++) { + const c = $color[i]; + if ((c >= "0" && c <= "9") || c === "." || c === "+" || c === "-") { + isMining = true; + } else if (isMining && (c === " " || c === ",")) { + numbers.push($color.substring(prevPos, i)); + isMining = false; + prevPos = i + 1; + } else if (!isMining) { + prevPos = i + 1; + } + } + if (isMining) { + numbers.push($color.substring(prevPos, $color.length)); + } + return numbers; + } + function getNumbersFromString(str, range, units) { + const raw = getNumbers(str); + const unitsList = Object.entries(units); + const numbers = raw + .map((r) => r.trim()) + .map((r, i) => { + let n; + const unit = unitsList.find(([u]) => r.endsWith(u)); + if (unit) { + n = + (parseFloat(r.substring(0, r.length - unit[0].length)) / + unit[1]) * + range[i]; + } else { + n = parseFloat(r); + } + if (range[i] > 1) { + return Math.round(n); + } + return n; + }); + return numbers; + } + const rgbRange = [255, 255, 255, 1]; + const rgbUnits = {"%": 100}; + function parseRGB($rgb) { + const [r, g, b, a = 1] = getNumbersFromString($rgb, rgbRange, rgbUnits); + return {r, g, b, a}; + } + const hslRange = [360, 1, 1, 1]; + const hslUnits = {"%": 100, "deg": 360, "rad": 2 * Math.PI, "turn": 1}; + function parseHSL($hsl) { + const [h, s, l, a = 1] = getNumbersFromString($hsl, hslRange, hslUnits); + return hslToRGB({h, s, l, a}); + } + function parseHex($hex) { + const h = $hex.substring(1); + switch (h.length) { + case 3: + case 4: { + const [r, g, b] = [0, 1, 2].map((i) => + parseInt(`${h[i]}${h[i]}`, 16) + ); + const a = + h.length === 3 ? 1 : parseInt(`${h[3]}${h[3]}`, 16) / 255; + return {r, g, b, a}; + } + case 6: + case 8: { + const [r, g, b] = [0, 2, 4].map((i) => + parseInt(h.substring(i, i + 2), 16) + ); + const a = + h.length === 6 ? 1 : parseInt(h.substring(6, 8), 16) / 255; + return {r, g, b, a}; + } + } + return null; + } + function getColorByName($color) { + const n = knownColors.get($color); + return { + r: (n >> 16) & 255, + g: (n >> 8) & 255, + b: (n >> 0) & 255, + a: 1 + }; + } + function getSystemColor($color) { + const n = systemColors.get($color); + return { + r: (n >> 16) & 255, + g: (n >> 8) & 255, + b: (n >> 0) & 255, + a: 1 + }; + } + function lowerCalcExpression(color) { + let searchIndex = 0; + const replaceBetweenIndices = (start, end, replacement) => { + color = + color.substring(0, start) + replacement + color.substring(end); + }; + while ((searchIndex = color.indexOf("calc(")) !== -1) { + const range = getParenthesesRange(color, searchIndex); + if (!range) { + break; + } + let slice = color.slice(range.start + 1, range.end - 1); + const includesPercentage = slice.includes("%"); + slice = slice.split("%").join(""); + const output = Math.round(evalMath(slice)); + replaceBetweenIndices( + range.start - 4, + range.end, + output + (includesPercentage ? "%" : "") + ); + } + return color; + } + const knownColors = new Map( + Object.entries({ + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgrey: 0xa9a9a9, + darkgreen: 0x006400, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + grey: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgrey: 0xd3d3d3, + lightgreen: 0x90ee90, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 + }) + ); + const systemColors = new Map( + Object.entries({ + "ActiveBorder": 0x3b99fc, + "ActiveCaption": 0x000000, + "AppWorkspace": 0xaaaaaa, + "Background": 0x6363ce, + "ButtonFace": 0xffffff, + "ButtonHighlight": 0xe9e9e9, + "ButtonShadow": 0x9fa09f, + "ButtonText": 0x000000, + "CaptionText": 0x000000, + "GrayText": 0x7f7f7f, + "Highlight": 0xb2d7ff, + "HighlightText": 0x000000, + "InactiveBorder": 0xffffff, + "InactiveCaption": 0xffffff, + "InactiveCaptionText": 0x000000, + "InfoBackground": 0xfbfcc5, + "InfoText": 0x000000, + "Menu": 0xf6f6f6, + "MenuText": 0xffffff, + "Scrollbar": 0xaaaaaa, + "ThreeDDarkShadow": 0x000000, + "ThreeDFace": 0xc0c0c0, + "ThreeDHighlight": 0xffffff, + "ThreeDLightShadow": 0xffffff, + "ThreeDShadow": 0x000000, + "Window": 0xececec, + "WindowFrame": 0xaaaaaa, + "WindowText": 0x000000, + "-webkit-focus-ring-color": 0xe59700 + }).map(([key, value]) => [key.toLowerCase(), value]) + ); + + function TextBox(props) { + const cls = mergeClass("textbox", props.class); + const attrs = omitAttrs(["class", "type"], props); + const type = props.type || "text"; + return m$1("input", { + class: cls, + type: type, + spellcheck: "false", + ...attrs + }); + } + + function scale(x, inLow, inHigh, outLow, outHigh) { + return ((x - inLow) * (outHigh - outLow)) / (inHigh - inLow) + outLow; + } + function clamp(x, min, max) { + return Math.min(max, Math.max(min, x)); + } + + const hsbPickerDefaults = { + wasPrevHidden: true, + hueCanvasRendered: false, + activeHSB: null, + activeChangeHandler: null, + hueTouchStartHandler: null, + sbTouchStartHandler: null + }; + function rgbToHSB({r, g, b}) { + const min = Math.min(r, g, b); + const max = Math.max(r, g, b); + return { + h: rgbToHSL({r, g, b}).h, + s: max === 0 ? 0 : 1 - min / max, + b: max / 255 + }; + } + function hsbToRGB({h: hue, s: sat, b: br}) { + let c; + if (hue < 60) { + c = [1, hue / 60, 0]; + } else if (hue < 120) { + c = [(120 - hue) / 60, 1, 0]; + } else if (hue < 180) { + c = [0, 1, (hue - 120) / 60]; + } else if (hue < 240) { + c = [0, (240 - hue) / 60, 1]; + } else if (hue < 300) { + c = [(hue - 240) / 60, 0, 1]; + } else { + c = [1, 0, (360 - hue) / 60]; + } + const max = Math.max(...c); + const [r, g, b] = c + .map((v) => v + (max - v) * (1 - sat)) + .map((v) => v * br) + .map((v) => Math.round(v * 255)); + return {r, g, b, a: 1}; + } + function hsbToString(hsb) { + const rgb = hsbToRGB(hsb); + return rgbToHexString(rgb); + } + function render(canvas, getPixel) { + const {width, height} = canvas; + const context = canvas.getContext("2d"); + const imageData = context.getImageData(0, 0, width, height); + const d = imageData.data; + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + const i = 4 * (y * width + x); + const c = getPixel(x, y); + for (let j = 0; j < 4; j++) { + d[i + j] = c[j]; + } + } + } + context.putImageData(imageData, 0, 0); + } + function renderHue(canvas) { + const {height} = canvas; + render(canvas, (_, y) => { + const hue = scale(y, 0, height, 0, 360); + const {r, g, b} = hsbToRGB({h: hue, s: 1, b: 1}); + return new Uint8ClampedArray([r, g, b, 255]); + }); + } + function renderSB(hue, canvas) { + const {width, height} = canvas; + render(canvas, (x, y) => { + const sat = scale(x, 0, width - 1, 0, 1); + const br = scale(y, 0, height - 1, 1, 0); + const {r, g, b} = hsbToRGB({h: hue, s: sat, b: br}); + return new Uint8ClampedArray([r, g, b, 255]); + }); + } + function HSBPicker(props) { + const context = getComponentContext(); + const store = context.getStore(hsbPickerDefaults); + store.activeChangeHandler = props.onChange; + const prevColor = context.prev && context.prev.props.color; + const prevActiveColor = store.activeHSB + ? hsbToString(store.activeHSB) + : null; + const didColorChange = + props.color !== prevColor && props.color !== prevActiveColor; + let activeHSB; + if (didColorChange) { + const rgb = parseColorWithCache(props.color); + activeHSB = rgbToHSB(rgb); + store.activeHSB = activeHSB; + } else { + activeHSB = store.activeHSB; + } + function onSBCanvasRender(canvas) { + if (isElementHidden(canvas)) { + return; + } + const hue = activeHSB.h; + const prevHue = + prevColor && rgbToHSB(parseColorWithCache(prevColor)).h; + if (store.wasPrevHidden || hue !== prevHue) { + renderSB(hue, canvas); + } + store.wasPrevHidden = false; + } + function onHueCanvasRender(canvas) { + if (store.hueCanvasRendered || isElementHidden(canvas)) { + return; + } + store.hueCanvasRendered = true; + renderHue(canvas); + } + function createHSBSwipeHandler(getEventHSB) { + return createSwipeHandler((startEvt, startNativeEvt) => { + const rect = + startNativeEvt.currentTarget.getBoundingClientRect(); + function onPointerMove(e) { + store.activeHSB = getEventHSB({...e, rect}); + props.onColorPreview(hsbToString(store.activeHSB)); + context.refresh(); + } + function onPointerUp(e) { + const hsb = getEventHSB({...e, rect}); + store.activeHSB = hsb; + props.onChange(hsbToString(hsb)); + } + store.activeHSB = getEventHSB({...startEvt, rect}); + context.refresh(); + return { + move: onPointerMove, + up: onPointerUp + }; + }); + } + const onSBPointerDown = createHSBSwipeHandler( + ({clientX, clientY, rect}) => { + const sat = clamp((clientX - rect.left) / rect.width, 0, 1); + const br = clamp(1 - (clientY - rect.top) / rect.height, 0, 1); + return {...activeHSB, s: sat, b: br}; + } + ); + const onHuePointerDown = createHSBSwipeHandler(({clientY, rect}) => { + const hue = clamp((clientY - rect.top) / rect.height, 0, 1) * 360; + return {...activeHSB, h: hue}; + }); + const hueCursorStyle = { + "background-color": hslToString({ + h: activeHSB.h, + s: 1, + l: 0.5, + a: 1 + }), + "left": "0%", + "top": `${(activeHSB.h / 360) * 100}%` + }; + const sbCursorStyle = { + "background-color": rgbToHexString(hsbToRGB(activeHSB)), + "left": `${activeHSB.s * 100}%`, + "top": `${(1 - activeHSB.b) * 100}%` + }; + return m$1( + "span", + {class: "hsb-picker"}, + m$1( + "span", + { + class: "hsb-picker__sb-container", + onmousedown: onSBPointerDown, + onupdate: (el) => { + if (store.sbTouchStartHandler) { + el.removeEventListener( + "touchstart", + store.sbTouchStartHandler + ); + } + el.addEventListener("touchstart", onSBPointerDown, { + passive: true + }); + store.sbTouchStartHandler = onSBPointerDown; + } + }, + m$1("canvas", { + class: "hsb-picker__sb-canvas", + onrender: onSBCanvasRender + }), + m$1("span", { + class: "hsb-picker__sb-cursor", + style: sbCursorStyle + }) + ), + m$1( + "span", + { + class: "hsb-picker__hue-container", + onmousedown: onHuePointerDown, + onupdate: (el) => { + if (store.hueTouchStartHandler) { + el.removeEventListener( + "touchstart", + store.hueTouchStartHandler + ); + } + el.addEventListener("touchstart", onHuePointerDown, { + passive: true + }); + store.hueTouchStartHandler = onHuePointerDown; + } + }, + m$1("canvas", { + class: "hsb-picker__hue-canvas", + onrender: onHueCanvasRender + }), + m$1("span", { + class: "hsb-picker__hue-cursor", + style: hueCursorStyle + }) + ) + ); + } + + function isValidColor(color) { + return Boolean(parseColorWithCache(color)); + } + const colorPickerFocuses = new WeakMap(); + function focusColorPicker(node) { + const focus = colorPickerFocuses.get(node); + focus(); + } + function ColorPicker(props) { + const context = getComponentContext(); + context.onRender((node) => colorPickerFocuses.set(node, focus)); + const store = context.store; + const isColorValid = isValidColor(props.color); + function onColorPreview(previewColor) { + store.previewNode.style.backgroundColor = previewColor; + store.textBoxNode.value = previewColor; + store.textBoxNode.blur(); + } + function onColorChange(rawValue) { + const value = rawValue.trim(); + if (isValidColor(value)) { + props.onChange(value); + } else { + props.onChange(props.color); + } + } + function focus() { + if (store.isFocused) { + return; + } + store.isFocused = true; + context.refresh(); + window.addEventListener("mousedown", onOuterClick); + } + function blur() { + if (!store.isFocused) { + return; + } + window.removeEventListener("mousedown", onOuterClick); + store.isFocused = false; + context.refresh(); + } + function toggleFocus() { + if (store.isFocused) { + blur(); + } else { + focus(); + } + } + function onOuterClick(e) { + if (!e.composedPath().some((el) => el === context.node)) { + blur(); + } + } + const textBox = m$1(TextBox, { + class: "color-picker__input", + onrender: (el) => { + store.textBoxNode = el; + store.textBoxNode.value = isColorValid ? props.color : ""; + }, + onkeypress: (e) => { + const input = e.target; + if (e.key === "Enter") { + const {value} = input; + onColorChange(value); + blur(); + onColorPreview(value); + } + }, + onfocus: focus + }); + const previewElement = m$1("span", { + class: "color-picker__preview", + onclick: toggleFocus, + onrender: (el) => { + store.previewNode = el; + el.style.backgroundColor = isColorValid + ? props.color + : "transparent"; + } + }); + const resetButton = props.canReset + ? m$1("span", { + role: "button", + class: "color-picker__reset", + onclick: () => { + props.onReset(); + blur(); + } + }) + : null; + const textBoxLine = m$1( + "span", + {class: "color-picker__textbox-line"}, + textBox, + previewElement, + resetButton + ); + const hsbLine = isColorValid + ? m$1( + "span", + {class: "color-picker__hsb-line"}, + m$1(HSBPicker, { + color: props.color, + onChange: onColorChange, + onColorPreview: onColorPreview + }) + ) + : null; + return m$1( + "span", + { + class: [ + "color-picker", + store.isFocused && "color-picker--focused", + props.class + ] + }, + m$1("span", {class: "color-picker__wrapper"}, textBoxLine, hsbLine) + ); + } + var ColorPicker$1 = Object.assign(ColorPicker, {focus: focusColorPicker}); + + function DropDown(props) { + const context = getComponentContext(); + const store = context.store; + if (context.prev) { + const currOptions = props.options.map((o) => o.id); + const prevOptions = context.prev.props.options.map((o) => o.id); + if ( + currOptions.length !== prevOptions.length || + currOptions.some((o, i) => o !== prevOptions[i]) + ) { + store.isOpen = false; + } + } + function saveListNode(el) { + store.listNode = el; + } + function saveSelectedNode(el) { + store.selectedNode = el; + } + function onSelectedClick() { + store.isOpen = !store.isOpen; + context.refresh(); + if (store.isOpen) { + const onOuterClick = (e) => { + window.removeEventListener( + "mousedown", + onOuterClick, + false + ); + const listRect = store.listNode.getBoundingClientRect(); + const ex = e.clientX; + const ey = e.clientY; + if ( + ex < listRect.left || + ex > listRect.right || + ey < listRect.top || + ey > listRect.bottom + ) { + store.isOpen = false; + context.refresh(); + } + }; + window.addEventListener("mousedown", onOuterClick, false); + } + } + function createListItem(value) { + return m$1( + "span", + { + class: { + "dropdown__list__item": true, + "dropdown__list__item--selected": + value.id === props.selected, + [props.class]: props.class != null + }, + onclick: () => { + store.isOpen = false; + context.refresh(); + props.onChange(value.id); + } + }, + value.content + ); + } + const selectedContent = props.options.find( + (value) => value.id === props.selected + ).content; + return m$1( + "span", + { + class: { + "dropdown": true, + "dropdown--open": store.isOpen, + [props.class]: Boolean(props.class) + } + }, + m$1( + "span", + {class: "dropdown__list", oncreate: saveListNode}, + props.options + .slice() + .sort((a, b) => + a.id === props.selected + ? -1 + : b.id === props.selected + ? 1 + : 0 + ) + .map(createListItem) + ), + m$1( + "span", + { + class: "dropdown__selected", + oncreate: saveSelectedNode, + onclick: onSelectedClick + }, + m$1( + "span", + {class: "dropdown__selected__text"}, + selectedContent + ) + ) + ); + } + + function ColorDropDown(props) { + const context = getComponentContext(); + const store = context.store; + const labels = { + DEFAULT: "Default", + AUTO: "Auto", + CUSTOM: "Custom" + }; + const dropDownOptions = [ + props.hasDefaultOption + ? {id: "default", content: labels.DEFAULT} + : null, + props.hasAutoOption ? {id: "auto", content: labels.AUTO} : null, + {id: "custom", content: labels.CUSTOM} + ].filter((v) => v); + const selectedDropDownValue = + props.value === "" + ? "default" + : props.value === "auto" + ? "auto" + : "custom"; + function onDropDownChange(value) { + const result = { + default: "", + auto: "auto", + custom: props.colorSuggestion + }[value]; + props.onChange(result); + } + const isPickerVisible = Boolean(parseColorWithCache(props.value)); + const prevValue = context.prev ? context.prev.props.value : null; + const shouldFocusOnPicker = + props.value !== "" && + props.value !== "auto" && + prevValue != null && + (prevValue === "" || prevValue === "auto"); + function onRootRender(root) { + if (shouldFocusOnPicker) { + const pickerNode = root.querySelector( + ".color-dropdown__picker" + ); + ColorPicker$1.focus(pickerNode); + } + } + return m$1( + "span", + { + class: { + "color-dropdown": true, + "color-dropdown--open": store.isOpen, + [props.class]: Boolean(props.class) + }, + onrender: onRootRender + }, + m$1(DropDown, { + class: "color-dropdown__options", + options: dropDownOptions, + selected: selectedDropDownValue, + onChange: onDropDownChange + }), + m$1(ColorPicker$1, { + class: { + "color-dropdown__picker": true, + "color-dropdown__picker--hidden": !isPickerVisible + }, + color: props.value, + onChange: props.onChange, + canReset: true, + onReset: props.onReset + }) + ); + } + + const DEFAULT_OVERLAY_KEY = Symbol(); + const overlayNodes = new Map(); + const clickListeners = new WeakMap(); + function getOverlayDOMNode(key) { + if (key == null) { + key = DEFAULT_OVERLAY_KEY; + } + if (!overlayNodes.has(key)) { + const node = document.createElement("div"); + node.classList.add("overlay"); + node.addEventListener("click", (e) => { + if (clickListeners.has(node) && e.currentTarget === node) { + const listener = clickListeners.get(node); + listener(); + } + }); + overlayNodes.set(key, node); + } + return overlayNodes.get(key); + } + function Overlay(props) { + return getOverlayDOMNode(props.key); + } + function Portal(props, ...content) { + const context = getComponentContext(); + context.onRender(() => { + const node = getOverlayDOMNode(props.key); + if (props.onOuterClick) { + clickListeners.set(node, props.onOuterClick); + } else { + clickListeners.delete(node); + } + render$1(node, content); + }); + context.onRemove(() => { + const container = getOverlayDOMNode(props.key); + render$1(container, null); + }); + return context.leave(); + } + var Overlay$1 = Object.assign(Overlay, {Portal}); + + function MessageBox(props) { + return m$1( + Overlay$1.Portal, + {key: props.portalKey, onOuterClick: props.onCancel}, + m$1( + "div", + {class: "message-box"}, + m$1("label", {class: "message-box__caption"}, props.caption), + m$1( + "div", + {class: "message-box__buttons"}, + m$1( + Button, + { + class: "message-box__button message-box__button-ok", + onclick: props.onOK + }, + "OK" + ), + m$1( + Button, + { + class: "message-box__button message-box__button-cancel", + onclick: props.onCancel + }, + "Cancel" + ) + ) + ) + ); + } + + function MultiSwitch(props, ...children) { + return m$1( + "span", + {class: ["multi-switch", props.class]}, + m$1("span", { + class: "multi-switch__highlight", + style: { + left: `${ + (props.options.indexOf(props.value) / + props.options.length) * + 100 + }%`, + width: `${(1 / props.options.length) * 100}%` + } + }), + props.options.map((option) => + m$1( + "span", + { + class: { + "multi-switch__option": true, + "multi-switch__option--selected": + option === props.value + }, + onclick: () => + option !== props.value && props.onChange(option) + }, + option + ) + ), + ...children + ); + } + + function ResetButton$1(props, ...content) { + return m$1( + Button, + {class: ["nav-button", props.class], onclick: props.onClick}, + m$1("span", {class: "nav-button__content"}, ...content) + ); + } + + function ResetButton(props, ...content) { + return m$1( + Button, + {class: "reset-button", onclick: props.onClick}, + m$1( + "span", + {class: "reset-button__content"}, + m$1("span", {class: "reset-button__icon"}), + ...content + ) + ); + } + + function VirtualScroll(props) { + if (props.items.length === 0) { + return props.root; + } + const {store} = getComponentContext(); + function renderContent(root, scrollToIndex) { + if (root.clientWidth === 0) { + return; + } + if (store.itemHeight == null) { + const tempItem = { + ...props.items[0], + props: { + ...props.items[0].props, + oncreate: null, + onupdate: null, + onrender: null + } + }; + const tempNode = render$1(root, tempItem).firstElementChild; + store.itemHeight = tempNode.getBoundingClientRect().height; + } + const {itemHeight} = store; + const wrapper = render$1( + root, + m$1("div", { + style: { + flex: "none", + height: `${props.items.length * itemHeight}px`, + overflow: "hidden", + position: "relative" + } + }) + ).firstElementChild; + if (scrollToIndex >= 0) { + root.scrollTop = scrollToIndex * itemHeight; + } + const containerHeight = + document.documentElement.clientHeight - + root.getBoundingClientRect().top; + let focusedIndex = -1; + if (document.activeElement) { + let current = document.activeElement; + while (current && current.parentElement !== wrapper) { + current = current.parentElement; + } + if (current) { + focusedIndex = store.nodesIndices.get(current); + } + } + store.nodesIndices = store.nodesIndices || new WeakMap(); + const saveNodeIndex = (node, index) => + store.nodesIndices.set(node, index); + const items = props.items + .map((item, index) => { + return {item, index}; + }) + .filter(({index}) => { + const eTop = index * itemHeight; + const eBottom = (index + 1) * itemHeight; + const rTop = root.scrollTop; + const rBottom = root.scrollTop + containerHeight; + const isTopBoundVisible = eTop >= rTop && eTop <= rBottom; + const isBottomBoundVisible = + eBottom >= rTop && eBottom <= rBottom; + return ( + isTopBoundVisible || + isBottomBoundVisible || + focusedIndex === index + ); + }) + .map(({item, index}) => + m$1( + "div", + { + key: index, + onrender: (node) => saveNodeIndex(node, index), + style: { + left: "0", + position: "absolute", + top: `${index * itemHeight}px`, + width: "100%" + } + }, + item + ) + ); + render$1(wrapper, items); + } + let rootNode; + let prevScrollTop; + const rootDidMount = props.root.props.oncreate; + const rootDidUpdate = props.root.props.onupdate; + const rootDidRender = props.root.props.onrender; + return { + ...props.root, + props: { + ...props.root.props, + oncreate: rootDidMount, + onupdate: rootDidUpdate, + onrender: (node) => { + rootNode = node; + rootDidRender && rootDidRender(rootNode); + renderContent( + rootNode, + isNaN(props.scrollToIndex) ? -1 : props.scrollToIndex + ); + }, + onscroll: () => { + if (rootNode.scrollTop === prevScrollTop) { + return; + } + prevScrollTop = rootNode.scrollTop; + renderContent(rootNode, -1); + } + }, + children: [] + }; + } + + function Select(props) { + const {state, setState} = useState({ + isExpanded: false, + focusedIndex: null + }); + const values = Object.keys(props.options); + const {store} = getComponentContext(); + const valueNodes = store.valueNodes || (store.valueNodes = new Map()); + const nodesValues = + store.nodesValues || (store.nodesValues = new WeakMap()); + function onRender(node) { + store.rootNode = node; + } + function onOuterClick(e) { + const r = store.rootNode.getBoundingClientRect(); + if ( + e.clientX < r.left || + e.clientX > r.right || + e.clientY < r.top || + e.clientY > r.bottom + ) { + window.removeEventListener("click", onOuterClick); + collapseList(); + } + } + function onTextInput(e) { + const text = e.target.value.toLowerCase().trim(); + expandList(); + values.some((value) => { + if (value.toLowerCase().indexOf(text) === 0) { + scrollToValue(value); + return true; + } + }); + } + function onKeyPress(e) { + const input = e.target; + if (e.key === "Enter") { + const value = input.value; + input.blur(); + collapseList(); + props.onChange(value); + } + } + function scrollToValue(value) { + setState({focusedIndex: values.indexOf(value)}); + } + function onExpandClick() { + if (state.isExpanded) { + collapseList(); + } else { + expandList(); + } + } + function expandList() { + setState({isExpanded: true}); + scrollToValue(props.value); + window.addEventListener("click", onOuterClick); + } + function collapseList() { + setState({isExpanded: false}); + } + function onSelectOption(e) { + let current = e.target; + while (current && !nodesValues.has(current)) { + current = current.parentElement; + } + if (current) { + const value = nodesValues.get(current); + props.onChange(value); + } + collapseList(); + } + function saveValueNode(value, domNode) { + valueNodes.set(value, domNode); + nodesValues.set(domNode, value); + } + function removeValueNode(value) { + const el = valueNodes.get(value); + valueNodes.delete(value); + nodesValues.delete(el); + } + return m$1( + "span", + { + class: [ + "select", + state.isExpanded && "select--expanded", + props.class + ], + onrender: onRender + }, + m$1( + "span", + {class: "select__line"}, + m$1(TextBox, { + class: "select__textbox", + value: props.value, + oninput: onTextInput, + onkeypress: onKeyPress + }), + m$1( + Button, + {class: "select__expand", onclick: onExpandClick}, + m$1("span", {class: "select__expand__icon"}) + ) + ), + m$1(VirtualScroll, { + root: m$1("span", { + class: { + "select__list": true, + "select__list--expanded": state.isExpanded, + "select__list--short": + Object.keys(props.options).length <= 7 + }, + onclick: onSelectOption + }), + items: Object.entries(props.options).map(([value, content]) => + m$1( + "span", + { + class: "select__option", + data: value, + onrender: (domNode) => + saveValueNode(value, domNode), + onremove: () => removeValueNode(value) + }, + content + ) + ), + scrollToIndex: state.focusedIndex + }) + ); + } + var Select$1 = withState(Select); + + function ShortcutLink(props) { + const cls = mergeClass("shortcut", props.class); + const shortcut = props.shortcuts[props.commandName]; + const shortcutMessage = props.textTemplate(shortcut); + let enteringShortcutInProgress = false; + function startEnteringShortcut(node) { + if (enteringShortcutInProgress) { + return; + } + enteringShortcutInProgress = true; + const initialText = node.textContent; + node.textContent = "...⌨"; + function onKeyDown(e) { + e.preventDefault(); + const ctrl = e.ctrlKey; + const alt = e.altKey; + const command = e.metaKey; + const shift = e.shiftKey; + let key = null; + if (e.code.startsWith("Key")) { + key = e.code.substring(3); + } else if (e.code.startsWith("Digit")) { + key = e.code.substring(5); + } + const shortcut = `${ + ctrl ? "Ctrl+" : alt ? "Alt+" : command ? "Command+" : "" + }${shift ? "Shift+" : ""}${key ? key : ""}`; + node.textContent = shortcut; + if ((ctrl || alt || command || shift) && key) { + removeListeners(); + props.onSetShortcut(shortcut); + node.blur(); + setTimeout(() => { + enteringShortcutInProgress = false; + node.classList.remove("shortcut--edit"); + node.textContent = props.textTemplate(shortcut); + }, 500); + } + } + function onBlur() { + removeListeners(); + node.classList.remove("shortcut--edit"); + node.textContent = initialText; + enteringShortcutInProgress = false; + } + function removeListeners() { + window.removeEventListener("keydown", onKeyDown, true); + window.removeEventListener("blur", onBlur, true); + } + window.addEventListener("keydown", onKeyDown, true); + window.addEventListener("blur", onBlur, true); + node.classList.add("shortcut--edit"); + } + function onClick(e) { + e.preventDefault(); + if (isFirefox) { + startEnteringShortcut(e.target); + return; + } + if (isEdge) { + chrome.tabs.create({ + url: `edge://extensions/shortcuts`, + active: true + }); + return; + } + chrome.tabs.create({ + url: `chrome://extensions/configureCommands#command-${chrome.runtime.id}-${props.commandName}`, + active: true + }); + } + function onRender(node) { + node.textContent = shortcutMessage; + } + return m$1("a", { + class: cls, + href: "#", + onclick: onClick, + oncreate: onRender + }); + } + + function throttle(callback) { + let pending = false; + let frameId = null; + let lastArgs; + const throttled = (...args) => { + lastArgs = args; + if (frameId) { + pending = true; + } else { + callback(...lastArgs); + frameId = requestAnimationFrame(() => { + frameId = null; + if (pending) { + callback(...lastArgs); + pending = false; + } + }); + } + }; + const cancel = () => { + cancelAnimationFrame(frameId); + pending = false; + frameId = null; + }; + return Object.assign(throttled, {cancel}); + } + + function stickToStep(x, step) { + const s = Math.round(x / step) * step; + const exp = Math.floor(Math.log10(step)); + if (exp >= 0) { + const m = 10 ** exp; + return Math.round(s / m) * m; + } + const m = 10 ** -exp; + return Math.round(s * m) / m; + } + function Slider(props) { + const context = getComponentContext(); + const store = context.store; + store.activeProps = props; + function onRootCreate(rootNode) { + rootNode.addEventListener("touchstart", onPointerDown, { + passive: true + }); + } + function saveTrackNode(el) { + store.trackNode = el; + } + function getTrackNode() { + return store.trackNode; + } + function saveThumbNode(el) { + store.thumbNode = el; + } + function getThumbNode() { + return store.thumbNode; + } + function onPointerDown(startEvt) { + if (store.isActive) { + return; + } + const {getClientX, pointerMoveEvent, pointerUpEvent} = (() => { + const isTouchEvent = + typeof TouchEvent !== "undefined" && + startEvt instanceof TouchEvent; + const touchId = isTouchEvent + ? startEvt.changedTouches[0].identifier + : null; + function getTouch(e) { + const find = (touches) => + Array.from(touches).find( + (t) => t.identifier === touchId + ); + return find(e.changedTouches) || find(e.touches); + } + function getClientX(e) { + const {clientX} = isTouchEvent ? getTouch(e) : e; + return clientX; + } + const pointerMoveEvent = isTouchEvent + ? "touchmove" + : "mousemove"; + const pointerUpEvent = isTouchEvent ? "touchend" : "mouseup"; + return {getClientX, pointerMoveEvent, pointerUpEvent}; + })(); + const dx = (() => { + const thumbRect = getThumbNode().getBoundingClientRect(); + const startClientX = getClientX(startEvt); + const isThumbPressed = + startClientX >= thumbRect.left && + startClientX <= thumbRect.right; + return isThumbPressed + ? thumbRect.left + thumbRect.width / 2 - startClientX + : 0; + })(); + function getEventValue(e) { + const {min, max} = store.activeProps; + const clientX = getClientX(e); + const rect = getTrackNode().getBoundingClientRect(); + const scaled = scale( + clientX + dx, + rect.left, + rect.right, + min, + max + ); + const clamped = clamp(scaled, min, max); + return clamped; + } + function onPointerMove(e) { + const value = getEventValue(e); + store.activeValue = value; + context.refresh(); + } + function onPointerUp(e) { + unsubscribe(); + const value = getEventValue(e); + store.isActive = false; + context.refresh(); + store.activeValue = null; + const {onChange, step} = store.activeProps; + onChange(stickToStep(value, step)); + } + function onKeyPress(e) { + if (e.key === "Escape") { + unsubscribe(); + store.isActive = false; + store.activeValue = null; + context.refresh(); + } + } + function subscribe() { + window.addEventListener(pointerMoveEvent, onPointerMove, { + passive: true + }); + window.addEventListener(pointerUpEvent, onPointerUp, { + passive: true + }); + window.addEventListener("keypress", onKeyPress); + } + function unsubscribe() { + window.removeEventListener(pointerMoveEvent, onPointerMove); + window.removeEventListener(pointerUpEvent, onPointerUp); + window.removeEventListener("keypress", onKeyPress); + } + subscribe(); + store.isActive = true; + store.activeValue = getEventValue(startEvt); + context.refresh(); + } + function getValue() { + return store.activeValue == null ? props.value : store.activeValue; + } + const percent = scale(getValue(), props.min, props.max, 0, 100); + const thumbPositionStyleValue = `${percent}%`; + const shouldFlipText = percent > 75; + const formattedValue = props.formatValue( + stickToStep(getValue(), props.step) + ); + function scaleWheelDelta(delta) { + return scale(delta, 0, -1000, 0, props.max - props.min); + } + const refreshOnWheel = throttle(() => { + store.activeValue = stickToStep(store.wheelValue, props.step); + store.wheelTimeoutId = setTimeout(() => { + const {onChange} = store.activeProps; + onChange(store.activeValue); + store.isActive = false; + store.activeValue = null; + store.wheelValue = null; + }, 400); + context.refresh(); + }); + function onWheel(event) { + if (store.wheelValue == null) { + store.wheelValue = getValue(); + } + store.isActive = true; + clearTimeout(store.wheelTimeoutId); + event.preventDefault(); + const accumulatedValue = + store.wheelValue + scaleWheelDelta(event.deltaY); + store.wheelValue = clamp(accumulatedValue, props.min, props.max); + refreshOnWheel(); + } + return m$1( + "span", + { + class: {"slider": true, "slider--active": store.isActive}, + oncreate: onRootCreate, + onmousedown: onPointerDown, + onwheel: onWheel + }, + m$1( + "span", + {class: "slider__track", oncreate: saveTrackNode}, + m$1("span", { + class: "slider__track__fill", + style: {width: thumbPositionStyleValue} + }) + ), + m$1( + "span", + {class: "slider__thumb-wrapper"}, + m$1( + "span", + { + class: "slider__thumb", + oncreate: saveThumbNode, + style: {left: thumbPositionStyleValue} + }, + m$1( + "span", + { + class: { + "slider__thumb__value": true, + "slider__thumb__value--flip": shouldFlipText + } + }, + formattedValue + ) + ) + ) + ); + } + + function Tab({isActive}, ...children) { + const tabCls = { + "tab-panel__tab": true, + "tab-panel__tab--active": isActive + }; + return m$1("div", {class: tabCls}, children); + } + + function TabPanel(props) { + const tabsNames = Object.keys(props.tabs); + function isActiveTab(name, index) { + return name == null ? index === 0 : name === props.activeTab; + } + const buttons = tabsNames.map((name, i) => { + const btnCls = { + "tab-panel__button": true, + "tab-panel__button--active": isActiveTab(name, i) + }; + return m$1( + Button, + {class: btnCls, onclick: () => props.onSwitchTab(name)}, + props.tabLabels[name] + ); + }); + const tabs = tabsNames.map((name, i) => + m$1(Tab, {isActive: isActiveTab(name, i)}, props.tabs[name]) + ); + return m$1( + "div", + {class: "tab-panel"}, + m$1("div", {class: "tab-panel__buttons"}, buttons), + m$1("div", {class: "tab-panel__tabs"}, tabs) + ); + } + + function TextList(props) { + const context = getComponentContext(); + context.store.indices = context.store.indices || new WeakMap(); + function onTextChange(e) { + const index = context.store.indices.get(e.target); + const values = props.values.slice(); + const value = e.target.value.trim(); + if (values.includes(value)) { + return; + } + if (!value) { + values.splice(index, 1); + } else if (index === values.length) { + values.push(value); + } else { + values.splice(index, 1, value); + } + props.onChange(values); + } + function createTextBox(text, index) { + const saveIndex = (node) => context.store.indices.set(node, index); + return m$1(TextBox, { + class: "text-list__textbox", + value: text, + onrender: saveIndex, + placeholder: props.placeholder + }); + } + let shouldFocus = false; + const node = context.node; + const prevProps = context.prev ? context.prev.props : null; + if ( + node && + props.isFocused && + (!prevProps || + !prevProps.isFocused || + prevProps.values.length < props.values.length) + ) { + focusLastNode(); + } + function didMount(node) { + context.store.node = node; + if (props.isFocused) { + focusLastNode(); + } + } + function focusLastNode() { + const node = context.store.node; + shouldFocus = true; + requestAnimationFrame(() => { + const inputs = node.querySelectorAll(".text-list__textbox"); + const last = inputs.item(inputs.length - 1); + last.focus(); + }); + } + return m$1(VirtualScroll, { + root: m$1("div", { + class: ["text-list", props.class], + onchange: onTextChange, + oncreate: didMount + }), + items: props.values + .map(createTextBox) + .concat(createTextBox("", props.values.length)), + scrollToIndex: shouldFocus ? props.values.length : -1 + }); + } + + function parseTime($time) { + const parts = $time.split(":").slice(0, 2); + const lowercased = $time.trim().toLowerCase(); + const isAM = lowercased.endsWith("am") || lowercased.endsWith("a.m."); + const isPM = lowercased.endsWith("pm") || lowercased.endsWith("p.m."); + let hours = parts.length > 0 ? parseInt(parts[0]) : 0; + if (isNaN(hours) || hours > 23) { + hours = 0; + } + if (isAM && hours === 12) { + hours = 0; + } + if (isPM && hours < 12) { + hours += 12; + } + let minutes = parts.length > 1 ? parseInt(parts[1]) : 0; + if (isNaN(minutes) || minutes > 59) { + minutes = 0; + } + return [hours, minutes]; + } + function isInTimeIntervalUTC(time0, time1, timestamp) { + if (time1 < time0) { + return timestamp <= time1 || time0 <= timestamp; + } + return time0 < timestamp && timestamp < time1; + } + function getDuration(time) { + let duration = 0; + if (time.seconds) { + duration += time.seconds * 1000; + } + if (time.minutes) { + duration += time.minutes * 60 * 1000; + } + if (time.hours) { + duration += time.hours * 60 * 60 * 1000; + } + if (time.days) { + duration += time.days * 24 * 60 * 60 * 1000; + } + return duration; + } + function getSunsetSunriseUTCTime(latitude, longitude, date) { + const dec31 = Date.UTC(date.getUTCFullYear(), 0, 0, 0, 0, 0, 0); + const oneDay = getDuration({days: 1}); + const dayOfYear = Math.floor((date.getTime() - dec31) / oneDay); + const zenith = 90.83333333333333; + const D2R = Math.PI / 180; + const R2D = 180 / Math.PI; + const lnHour = longitude / 15; + function getTime(isSunrise) { + const t = dayOfYear + ((isSunrise ? 6 : 18) - lnHour) / 24; + const M = 0.9856 * t - 3.289; + let L = + M + + 1.916 * Math.sin(M * D2R) + + 0.02 * Math.sin(2 * M * D2R) + + 282.634; + if (L > 360) { + L -= 360; + } else if (L < 0) { + L += 360; + } + let RA = R2D * Math.atan(0.91764 * Math.tan(L * D2R)); + if (RA > 360) { + RA -= 360; + } else if (RA < 0) { + RA += 360; + } + const Lquadrant = Math.floor(L / 90) * 90; + const RAquadrant = Math.floor(RA / 90) * 90; + RA += Lquadrant - RAquadrant; + RA /= 15; + const sinDec = 0.39782 * Math.sin(L * D2R); + const cosDec = Math.cos(Math.asin(sinDec)); + const cosH = + (Math.cos(zenith * D2R) - sinDec * Math.sin(latitude * D2R)) / + (cosDec * Math.cos(latitude * D2R)); + if (cosH > 1) { + return { + alwaysDay: false, + alwaysNight: true, + time: 0 + }; + } else if (cosH < -1) { + return { + alwaysDay: true, + alwaysNight: false, + time: 0 + }; + } + const H = + (isSunrise + ? 360 - R2D * Math.acos(cosH) + : R2D * Math.acos(cosH)) / 15; + const T = H + RA - 0.06571 * t - 6.622; + let UT = T - lnHour; + if (UT > 24) { + UT -= 24; + } else if (UT < 0) { + UT += 24; + } + return { + alwaysDay: false, + alwaysNight: false, + time: Math.round(UT * getDuration({hours: 1})) + }; + } + const sunriseTime = getTime(true); + const sunsetTime = getTime(false); + if (sunriseTime.alwaysDay || sunsetTime.alwaysDay) { + return { + alwaysDay: true + }; + } else if (sunriseTime.alwaysNight || sunsetTime.alwaysNight) { + return { + alwaysNight: true + }; + } + return { + sunriseTime: sunriseTime.time, + sunsetTime: sunsetTime.time + }; + } + function isNightAtLocation(latitude, longitude, date = new Date()) { + const time = getSunsetSunriseUTCTime(latitude, longitude, date); + if (time.alwaysDay) { + return false; + } else if (time.alwaysNight) { + return true; + } + const sunriseTime = time.sunriseTime; + const sunsetTime = time.sunsetTime; + const currentTime = + date.getUTCHours() * getDuration({hours: 1}) + + date.getUTCMinutes() * getDuration({minutes: 1}) + + date.getUTCSeconds() * getDuration({seconds: 1}) + + date.getUTCMilliseconds(); + return isInTimeIntervalUTC(sunsetTime, sunriseTime, currentTime); + } + + function toLong24HTime($time) { + const [hours, minutes] = parseTime($time); + const hh = `${hours < 10 ? "0" : ""}${hours}`; + const mm = `${minutes < 10 ? "0" : ""}${minutes}`; + return `${hh}:${mm}`; + } + function to24HTime($time) { + const [hours, minutes] = parseTime($time); + const mm = `${minutes < 10 ? "0" : ""}${minutes}`; + return `${hours}:${mm}`; + } + function TimeRangePicker(props) { + function onStartTimeChange($startTime) { + props.onChange([to24HTime($startTime), props.endTime]); + } + function onEndTimeChange($endTime) { + props.onChange([props.startTime, to24HTime($endTime)]); + } + function setStartTime(node) { + node.value = toLong24HTime(props.startTime); + } + function setEndTime(node) { + node.value = toLong24HTime(props.endTime); + } + return m$1( + "span", + {class: "time-range-picker"}, + m$1(TextBox, { + class: "time-range-picker__input time-range-picker__input--start", + type: "time", + placeholder: "18:00", + onrender: setStartTime, + onchange: (e) => onStartTimeChange(e.target.value), + onkeypress: (e) => { + if (e.key === "Enter") { + const input = e.target; + input.blur(); + onStartTimeChange(input.value); + } + } + }), + m$1(TextBox, { + class: "time-range-picker__input time-range-picker__input--end", + type: "time", + placeholder: "09:00", + onrender: setEndTime, + onchange: (e) => onEndTimeChange(e.target.value), + onkeypress: (e) => { + if (e.key === "Enter") { + const input = e.target; + input.blur(); + onEndTimeChange(input.value); + } + } + }) + ); + } + + function Toggle(props) { + const {checked, onChange} = props; + const cls = ["toggle", checked ? "toggle--checked" : null, props.class]; + const clsOn = { + "toggle__btn": true, + "toggle__on": true, + "toggle__btn--active": checked + }; + const clsOff = { + "toggle__btn": true, + "toggle__off": true, + "toggle__btn--active": !checked + }; + return m$1( + "span", + {class: cls}, + m$1( + "span", + { + class: clsOn, + onclick: onChange ? () => !checked && onChange(true) : null + }, + props.labelOn + ), + m$1( + "span", + { + class: clsOff, + onclick: onChange ? () => checked && onChange(false) : null + }, + props.labelOff + ) + ); + } + + function Track(props) { + const valueStyle = {width: `${props.value * 100}%`}; + const isClickable = props.onChange != null; + function onMouseDown(e) { + const targetNode = e.currentTarget; + const valueNode = targetNode.firstElementChild; + targetNode.classList.add("track--active"); + function getValue(clientX) { + const rect = targetNode.getBoundingClientRect(); + return (clientX - rect.left) / rect.width; + } + function setWidth(value) { + valueNode.style.width = `${value * 100}%`; + } + function onMouseMove(e) { + const value = getValue(e.clientX); + setWidth(value); + } + function onMouseUp(e) { + const value = getValue(e.clientX); + props.onChange(value); + cleanup(); + } + function onKeyPress(e) { + if (e.key === "Escape") { + setWidth(props.value); + cleanup(); + } + } + function cleanup() { + window.removeEventListener("mousemove", onMouseMove); + window.removeEventListener("mouseup", onMouseUp); + window.removeEventListener("keypress", onKeyPress); + targetNode.classList.remove("track--active"); + } + window.addEventListener("mousemove", onMouseMove); + window.addEventListener("mouseup", onMouseUp); + window.addEventListener("keypress", onKeyPress); + const value = getValue(e.clientX); + setWidth(value); + } + return m$1( + "span", + { + class: { + "track": true, + "track--clickable": Boolean(props.onChange) + }, + onmousedown: isClickable ? onMouseDown : null + }, + m$1("span", {class: "track__value", style: valueStyle}), + m$1("label", {class: "track__label"}, props.label) + ); + } + + function getLocalMessage(messageName) { + return chrome.i18n.getMessage(messageName); + } + function getUILanguage() { + let code; + if ( + "i18n" in chrome && + "getUILanguage" in chrome.i18n && + typeof chrome.i18n.getUILanguage === "function" + ) { + code = chrome.i18n.getUILanguage(); + } else { + code = navigator.language.split("-")[0]; + } + if (code.endsWith("-mac")) { + return code.substring(0, code.length - 4); + } + return code; + } + + function UpDown(props) { + const buttonDownCls = { + "updown__button": true, + "updown__button--disabled": props.value === props.min + }; + const buttonUpCls = { + "updown__button": true, + "updown__button--disabled": props.value === props.max + }; + function normalize(x) { + const s = Math.round(x / props.step) * props.step; + const exp = Math.floor(Math.log10(props.step)); + if (exp >= 0) { + const m = 10 ** exp; + return Math.round(s / m) * m; + } + const m = 10 ** -exp; + return Math.round(s * m) / m; + } + function clamp(x) { + return Math.max(props.min, Math.min(props.max, x)); + } + function onButtonDownClick() { + props.onChange(clamp(normalize(props.value - props.step))); + } + function onButtonUpClick() { + props.onChange(clamp(normalize(props.value + props.step))); + } + function onTrackValueChange(trackValue) { + props.onChange( + clamp( + normalize(trackValue * (props.max - props.min) + props.min) + ) + ); + } + const trackValue = (props.value - props.min) / (props.max - props.min); + const valueText = + props.value === props.default + ? getLocalMessage("off").toLocaleLowerCase() + : props.value > props.default + ? `+${normalize(props.value - props.default)}` + : `-${normalize(props.default - props.value)}`; + return m$1( + "div", + {class: "updown"}, + m$1( + "div", + {class: "updown__line"}, + m$1( + Button, + {class: buttonDownCls, onclick: onButtonDownClick}, + m$1("span", {class: "updown__icon updown__icon-down"}) + ), + m$1(Track, { + value: trackValue, + label: props.name, + onChange: onTrackValueChange + }), + m$1( + Button, + {class: buttonUpCls, onclick: onButtonUpClick}, + m$1("span", {class: "updown__icon updown__icon-up"}) + ) + ), + m$1("label", {class: "updown__value-text"}, valueText) + ); + } + + function isIPV6(url) { + const openingBracketIndex = url.indexOf("["); + if (openingBracketIndex < 0) { + return false; + } + const queryIndex = url.indexOf("?"); + if (queryIndex >= 0 && openingBracketIndex > queryIndex) { + return false; + } + return true; + } + const ipV6HostRegex = /\[.*?\](\:\d+)?/; + function compareIPV6(firstURL, secondURL) { + const firstHost = firstURL.match(ipV6HostRegex)[0]; + const secondHost = secondURL.match(ipV6HostRegex)[0]; + return firstHost === secondHost; + } + + function getURLHostOrProtocol($url) { + const url = new URL($url); + if (url.host) { + return url.host; + } else if (url.protocol === "file:") { + return url.pathname; + } + return url.protocol; + } + function isURLInList(url, list) { + for (let i = 0; i < list.length; i++) { + if (isURLMatched(url, list[i])) { + return true; + } + } + return false; + } + function isURLMatched(url, urlTemplate) { + const isFirstIPV6 = isIPV6(url); + const isSecondIPV6 = isIPV6(urlTemplate); + if (isFirstIPV6 && isSecondIPV6) { + return compareIPV6(url, urlTemplate); + } else if (!isFirstIPV6 && !isSecondIPV6) { + const regex = createUrlRegex(urlTemplate); + return Boolean(url.match(regex)); + } + return false; + } + function createUrlRegex(urlTemplate) { + urlTemplate = urlTemplate.trim(); + const exactBeginning = urlTemplate[0] === "^"; + const exactEnding = urlTemplate[urlTemplate.length - 1] === "$"; + urlTemplate = urlTemplate + .replace(/^\^/, "") + .replace(/\$$/, "") + .replace(/^.*?\/{2,3}/, "") + .replace(/\?.*$/, "") + .replace(/\/$/, ""); + let slashIndex; + let beforeSlash; + let afterSlash; + if ((slashIndex = urlTemplate.indexOf("/")) >= 0) { + beforeSlash = urlTemplate.substring(0, slashIndex); + afterSlash = urlTemplate.replace(/\$/g, "").substring(slashIndex); + } else { + beforeSlash = urlTemplate.replace(/\$/g, ""); + } + let result = exactBeginning + ? "^(.*?\\:\\/{2,3})?" + : "^(.*?\\:\\/{2,3})?([^/]*?\\.)?"; + const hostParts = beforeSlash.split("."); + result += "("; + for (let i = 0; i < hostParts.length; i++) { + if (hostParts[i] === "*") { + hostParts[i] = "[^\\.\\/]+?"; + } + } + result += hostParts.join("\\."); + result += ")"; + if (afterSlash) { + result += "("; + result += afterSlash.replace("/", "\\/"); + result += ")"; + } + result += exactEnding ? "(\\/?(\\?[^/]*?)?)$" : "(\\/?.*?)$"; + return new RegExp(result, "i"); + } + function isPDF(url) { + if (url.includes(".pdf")) { + if (url.includes("?")) { + url = url.substring(0, url.lastIndexOf("?")); + } + if (url.includes("#")) { + url = url.substring(0, url.lastIndexOf("#")); + } + if ( + (url.match(/(wikipedia|wikimedia)\.org/i) && + url.match( + /(wikipedia|wikimedia)\.org\/.*\/[a-z]+\:[^\:\/]+\.pdf/i + )) || + (url.match(/timetravel\.mementoweb\.org\/reconstruct/i) && + url.match(/\.pdf$/i)) || + (url.match(/dropbox\.com\/s\//i) && url.match(/\.pdf$/i)) + ) { + return false; + } + if (url.endsWith(".pdf")) { + for (let i = url.length; i > 0; i--) { + if (url[i] === "=") { + return false; + } else if (url[i] === "/") { + return true; + } + } + } else { + return false; + } + } + return false; + } + function isURLEnabled( + url, + userSettings, + {isProtected, isInDarkList, isDarkThemeDetected} + ) { + if (isProtected && !userSettings.enableForProtectedPages) { + return false; + } + if (isPDF(url)) { + return userSettings.enableForPDF; + } + const isURLInUserList = isURLInList(url, userSettings.siteList); + const isURLInEnabledList = isURLInList( + url, + userSettings.siteListEnabled + ); + if (userSettings.applyToListedOnly) { + return isURLInEnabledList || isURLInUserList; + } + if (isURLInEnabledList) { + return true; + } + if ( + isInDarkList || + (userSettings.detectDarkTheme && isDarkThemeDetected) + ) { + return false; + } + return !isURLInUserList; + } + + function CustomSettingsToggle({data, actions}) { + const tab = data.activeTab; + const host = getURLHostOrProtocol(tab.url); + const isCustom = data.settings.customThemes.some(({url}) => + isURLInList(tab.url, url) + ); + const urlText = host + .split(".") + .reduce( + (elements, part, i) => + elements.concat( + m$1("wbr", null), + `${i > 0 ? "." : ""}${part}` + ), + [] + ); + return m$1( + Button, + { + class: { + "custom-settings-toggle": true, + "custom-settings-toggle--checked": isCustom, + "custom-settings-toggle--disabled": tab.isProtected + }, + onclick: (e) => { + if (isCustom) { + const filtered = data.settings.customThemes.filter( + ({url}) => !isURLInList(tab.url, url) + ); + actions.changeSettings({customThemes: filtered}); + } else { + const extended = data.settings.customThemes.concat({ + url: [host], + theme: {...data.settings.theme} + }); + actions.changeSettings({customThemes: extended}); + e.currentTarget.classList.add( + "custom-settings-toggle--checked" + ); + } + } + }, + m$1( + "span", + {class: "custom-settings-toggle__wrapper"}, + getLocalMessage("only_for"), + " ", + m$1("span", {class: "custom-settings-toggle__url"}, urlText) + ) + ); + } + + function ModeToggle({mode, onChange}) { + return m$1( + "div", + {class: "mode-toggle"}, + m$1( + "div", + {class: "mode-toggle__line"}, + m$1( + Button, + { + class: {"mode-toggle__button--active": mode === 1}, + onclick: () => onChange(1) + }, + m$1("span", {class: "icon icon--dark-mode"}) + ), + m$1(Toggle, { + checked: mode === 1, + labelOn: getLocalMessage("dark"), + labelOff: getLocalMessage("light"), + onChange: (checked) => onChange(checked ? 1 : 0) + }), + m$1( + Button, + { + class: {"mode-toggle__button--active": mode === 0}, + onclick: () => onChange(0) + }, + m$1("span", {class: "icon icon--light-mode"}) + ) + ), + m$1("label", {class: "mode-toggle__label"}, getLocalMessage("mode")) + ); + } + + function FilterSettings({data, actions}) { + const custom = data.settings.customThemes.find(({url}) => + isURLInList(data.activeTab.url, url) + ); + const filterConfig = custom ? custom.theme : data.settings.theme; + function setConfig(config) { + if (custom) { + custom.theme = {...custom.theme, ...config}; + actions.changeSettings({ + customThemes: data.settings.customThemes + }); + } else { + actions.setTheme(config); + } + } + const brightness = m$1(UpDown, { + value: filterConfig.brightness, + min: 50, + max: 150, + step: 5, + default: 100, + name: getLocalMessage("brightness"), + onChange: (value) => setConfig({brightness: value}) + }); + const contrast = m$1(UpDown, { + value: filterConfig.contrast, + min: 50, + max: 150, + step: 5, + default: 100, + name: getLocalMessage("contrast"), + onChange: (value) => setConfig({contrast: value}) + }); + const grayscale = m$1(UpDown, { + value: filterConfig.grayscale, + min: 0, + max: 100, + step: 5, + default: 0, + name: getLocalMessage("grayscale"), + onChange: (value) => setConfig({grayscale: value}) + }); + const sepia = m$1(UpDown, { + value: filterConfig.sepia, + min: 0, + max: 100, + step: 5, + default: 0, + name: getLocalMessage("sepia"), + onChange: (value) => setConfig({sepia: value}) + }); + return m$1( + "section", + {class: "filter-settings"}, + m$1(ModeToggle, { + mode: filterConfig.mode, + onChange: (mode) => setConfig({mode}) + }), + brightness, + contrast, + sepia, + grayscale, + m$1(CustomSettingsToggle, {data: data, actions: actions}) + ); + } + + function SunMoonIcon({date, latitude, longitude}) { + if (latitude == null || longitude == null) { + return m$1( + "svg", + {viewBox: "0 0 16 16"}, + m$1( + "text", + { + "fill": "white", + "font-size": "16", + "font-weight": "bold", + "text-anchor": "middle", + "x": "8", + "y": "14" + }, + "?" + ) + ); + } + if (isNightAtLocation(latitude, longitude, date)) { + return m$1( + "svg", + {viewBox: "0 0 16 16"}, + m$1("path", { + fill: "white", + stroke: "none", + d: "M 6 3 Q 10 8 6 13 Q 12 13 12 8 Q 12 3 6 3" + }) + ); + } + return m$1( + "svg", + {viewBox: "0 0 16 16"}, + m$1("circle", { + fill: "white", + stroke: "none", + cx: "8", + cy: "8", + r: "3" + }), + m$1( + "g", + { + "fill": "none", + "stroke": "white", + "stroke-linecap": "round", + "stroke-width": "1.5" + }, + ...Array.from({length: 8}).map((_, i) => { + const cx = 8; + const cy = 8; + const angle = (i * Math.PI) / 4 + Math.PI / 8; + const pt = [5, 6].map((l) => [ + cx + l * Math.cos(angle), + cy + l * Math.sin(angle) + ]); + return m$1("line", { + x1: pt[0][0], + y1: pt[0][1], + x2: pt[1][0], + y2: pt[1][1] + }); + }) + ) + ); + } + + function SystemIcon() { + return m$1( + "svg", + {viewBox: "0 0 16 16"}, + m$1("path", { + fill: "white", + stroke: "none", + d: "M3,3 h10 v7 h-3 v2 h1 v1 h-6 v-1 h1 v-2 h-3 z M4.5,4.5 v4 h7 v-4 z" + }) + ); + } + + function WatchIcon({hours, minutes}) { + const cx = 8; + const cy = 8.5; + const lenHour = 3; + const lenMinute = 4; + const clockR = 5.5; + const btnSize = 2; + const btnPad = 1.5; + const ah = + (((hours > 11 ? hours - 12 : hours) + minutes / 60) / 12) * + Math.PI * + 2; + const am = (minutes / 60) * Math.PI * 2; + const hx = cx + lenHour * Math.sin(ah); + const hy = cy - lenHour * Math.cos(ah); + const mx = cx + lenMinute * Math.sin(am); + const my = cy - lenMinute * Math.cos(am); + return m$1( + "svg", + {viewBox: "0 0 16 16"}, + m$1("circle", { + "fill": "none", + "stroke": "white", + "stroke-width": "1.5", + "cx": cx, + "cy": cy, + "r": clockR + }), + m$1("line", { + "stroke": "white", + "stroke-width": "1.5", + "x1": cx, + "y1": cy, + "x2": hx, + "y2": hy + }), + m$1("line", { + "stroke": "white", + "stroke-width": "1.5", + "opacity": "0.67", + "x1": cx, + "y1": cy, + "x2": mx, + "y2": my + }), + [30, -30].map((angle) => { + return m$1("path", { + "fill": "white", + "transform": `rotate(${angle})`, + "transform-origin": `${cx} ${cy}`, + "d": `M${cx - btnSize},${ + cy - clockR - btnPad + } a${btnSize},${btnSize} 0 0 1 ${2 * btnSize},0 z` + }); + }) + ); + } + + function CheckmarkIcon({isChecked}) { + return m$1( + "svg", + {viewBox: "0 0 8 8"}, + m$1("path", { + d: isChecked + ? "M1,4 l2,2 l4,-4 v1 l-4,4 l-2,-2 Z" + : "M2,2 l4,4 v1 l-4,-4 Z M2,6 l4,-4 v1 l-4,4 Z" + }) + ); + } + + function SiteToggleButton({data, actions}) { + const tab = data.activeTab; + function onSiteToggleClick() { + if (pdf) { + actions.changeSettings({ + enableForPDF: !data.settings.enableForPDF + }); + } else { + actions.toggleActiveTab(); + } + } + const pdf = isPDF(tab.url); + const toggleHasEffect = + data.settings.enableForProtectedPages || + (!tab.isProtected && !pdf) || + tab.isInjected; + const isSiteEnabled = + isURLEnabled(tab.url, data.settings, tab) && tab.isInjected; + const host = getURLHostOrProtocol(tab.url); + const urlText = host + .split(".") + .reduce( + (elements, part, i) => + elements.concat( + m$1("wbr", null), + `${i > 0 ? "." : ""}${part}` + ), + [] + ); + return m$1( + Button, + { + class: { + "site-toggle": true, + "site-toggle--active": isSiteEnabled, + "site-toggle--disabled": !toggleHasEffect + }, + onclick: onSiteToggleClick + }, + m$1( + "span", + {class: "site-toggle__mark"}, + m$1(CheckmarkIcon, {isChecked: isSiteEnabled}) + ), + " ", + m$1("span", {class: "site-toggle__url"}, pdf ? "PDF" : urlText) + ); + } + + var AutomationMode; + (function (AutomationMode) { + AutomationMode["NONE"] = ""; + AutomationMode["TIME"] = "time"; + AutomationMode["SYSTEM"] = "system"; + AutomationMode["LOCATION"] = "location"; + })(AutomationMode || (AutomationMode = {})); + + function MoreToggleSettings({data, actions, isExpanded, onClose}) { + const isSystemAutomation = + data.settings.automation.mode === AutomationMode.SYSTEM; + const locationSettings = data.settings.location; + const values = { + latitude: { + min: -90, + max: 90 + }, + longitude: { + min: -180, + max: 180 + } + }; + function getLocationString(location) { + if (location == null) { + return ""; + } + return `${location}°`; + } + function locationChanged(inputElement, newValue, type) { + if (newValue.trim() === "") { + inputElement.value = ""; + actions.changeSettings({ + location: { + ...locationSettings, + [type]: null + } + }); + return; + } + const min = values[type].min; + const max = values[type].max; + newValue = newValue.replace(",", ".").replace("°", ""); + let num = Number(newValue); + if (isNaN(num)) { + num = 0; + } else if (num > max) { + num = max; + } else if (num < min) { + num = min; + } + inputElement.value = getLocationString(num); + actions.changeSettings({ + location: { + ...locationSettings, + [type]: num + } + }); + } + function changeAutomationMode(mode) { + actions.changeSettings({ + automation: { + ...data.settings.automation, + ...{mode, enabled: Boolean(mode)} + } + }); + } + return m$1( + "div", + { + class: { + "header__app-toggle__more-settings": true, + "header__app-toggle__more-settings--expanded": isExpanded + } + }, + m$1( + "div", + {class: "header__app-toggle__more-settings__top"}, + m$1( + "span", + {class: "header__app-toggle__more-settings__top__text"}, + getLocalMessage("automation") + ), + m$1( + "span", + { + class: "header__app-toggle__more-settings__top__close", + role: "button", + onclick: onClose + }, + "\u2715" + ) + ), + m$1( + "div", + {class: "header__app-toggle__more-settings__content"}, + m$1( + "div", + {class: "header__app-toggle__more-settings__line"}, + m$1(CheckBox, { + checked: + data.settings.automation.mode === + AutomationMode.TIME, + onchange: (e) => + changeAutomationMode( + e.target.checked + ? AutomationMode.TIME + : AutomationMode.NONE + ) + }), + m$1(TimeRangePicker, { + startTime: data.settings.time.activation, + endTime: data.settings.time.deactivation, + onChange: ([start, end]) => + actions.changeSettings({ + time: {activation: start, deactivation: end} + }) + }) + ), + m$1( + "p", + {class: "header__app-toggle__more-settings__description"}, + getLocalMessage("set_active_hours") + ), + m$1( + "div", + { + class: "header__app-toggle__more-settings__line header__app-toggle__more-settings__location" + }, + m$1(CheckBox, { + checked: + data.settings.automation.mode === + AutomationMode.LOCATION, + onchange: (e) => + changeAutomationMode( + e.target.checked + ? AutomationMode.LOCATION + : AutomationMode.NONE + ) + }), + m$1(TextBox, { + class: "header__app-toggle__more-settings__location__latitude", + placeholder: getLocalMessage("latitude"), + onchange: (e) => + locationChanged( + e.target, + e.target.value, + "latitude" + ), + oncreate: (node) => + (node.value = getLocationString( + locationSettings.latitude + )), + onkeypress: (e) => { + if (e.key === "Enter") { + e.target.blur(); + } + } + }), + m$1(TextBox, { + class: "header__app-toggle__more-settings__location__longitude", + placeholder: getLocalMessage("longitude"), + onchange: (e) => + locationChanged( + e.target, + e.target.value, + "longitude" + ), + oncreate: (node) => + (node.value = getLocationString( + locationSettings.longitude + )), + onkeypress: (e) => { + if (e.key === "Enter") { + e.target.blur(); + } + } + }) + ), + m$1( + "p", + { + class: "header__app-toggle__more-settings__location-description" + }, + getLocalMessage("set_location") + ), + m$1( + "div", + { + class: [ + "header__app-toggle__more-settings__line", + "header__app-toggle__more-settings__system-dark-mode" + ] + }, + m$1(CheckBox, { + class: "header__app-toggle__more-settings__system-dark-mode__checkbox", + checked: isSystemAutomation, + onchange: (e) => + changeAutomationMode( + e.target.checked + ? AutomationMode.SYSTEM + : AutomationMode.NONE + ) + }), + m$1( + Button, + { + class: { + "header__app-toggle__more-settings__system-dark-mode__button": true, + "header__app-toggle__more-settings__system-dark-mode__button--active": + isSystemAutomation + }, + onclick: () => + changeAutomationMode( + isSystemAutomation + ? AutomationMode.NONE + : AutomationMode.SYSTEM + ) + }, + getLocalMessage("system_dark_mode") + ) + ), + m$1( + "p", + {class: "header__app-toggle__more-settings__description"}, + getLocalMessage("system_dark_mode_description") + ) + ) + ); + } + + function multiline(...lines) { + return lines.join("\n"); + } + function Header({data, actions, onMoreToggleSettingsClick}) { + function toggleExtension(enabled) { + actions.changeSettings({ + enabled, + automation: {...data.settings.automation, ...{enabled: false}} + }); + } + const tab = data.activeTab; + const isAutomation = data.settings.automation.enabled; + const isTimeAutomation = + data.settings.automation.mode === AutomationMode.TIME; + const isLocationAutomation = + data.settings.automation.mode === AutomationMode.LOCATION; + const now = new Date(); + return m$1( + "header", + {class: "header"}, + m$1( + "a", + { + class: "header__logo", + href: "https://darkreader.org/", + target: "_blank", + rel: "noopener noreferrer" + }, + "Dark Reader" + ), + m$1( + "div", + {class: "header__control header__site-toggle"}, + m$1(SiteToggleButton, {data: data, actions: actions}), + tab.isProtected || !tab.isInjected + ? m$1( + "span", + {class: "header__site-toggle__unable-text"}, + getLocalMessage("page_protected") + ) + : tab.isInDarkList + ? m$1( + "span", + {class: "header__site-toggle__unable-text"}, + getLocalMessage("page_in_dark_list") + ) + : m$1(ShortcutLink, { + commandName: "addSite", + shortcuts: data.shortcuts, + textTemplate: (hotkey) => + hotkey + ? multiline( + getLocalMessage("toggle_current_site"), + hotkey + ) + : getLocalMessage("setup_hotkey_toggle_site"), + onSetShortcut: (shortcut) => + actions.setShortcut("addSite", shortcut) + }) + ), + m$1( + "div", + {class: "header__control header__app-toggle"}, + m$1(Toggle, { + checked: data.isEnabled, + labelOn: getLocalMessage("on"), + labelOff: getLocalMessage("off"), + onChange: toggleExtension + }), + m$1(ShortcutLink, { + commandName: "toggle", + shortcuts: data.shortcuts, + textTemplate: (hotkey) => + hotkey + ? multiline( + getLocalMessage("toggle_extension"), + hotkey + ) + : getLocalMessage("setup_hotkey_toggle_extension"), + onSetShortcut: (shortcut) => + actions.setShortcut("toggle", shortcut) + }), + m$1("span", { + class: "header__app-toggle__more-button", + onclick: onMoreToggleSettingsClick + }), + m$1( + "span", + { + class: { + "header__app-toggle__time": true, + "header__app-toggle__time--active": isAutomation + } + }, + isTimeAutomation + ? m$1(WatchIcon, { + hours: now.getHours(), + minutes: now.getMinutes() + }) + : isLocationAutomation + ? m$1(SunMoonIcon, { + date: now, + latitude: data.settings.location.latitude, + longitude: data.settings.location.longitude + }) + : m$1(SystemIcon, null) + ) + ) + ); + } + + function Loader({complete = false}) { + const context = getComponentContext(); + const {state, setState} = useState({ + finished: false, + errorOccured: false + }); + if (!state.errorOccured && !complete) { + context.store.loaderTimeoutID = setTimeout(() => { + setState({errorOccured: true}); + context.refresh(); + }, 3000); + } + if (complete) { + clearTimeout(context.store.loaderTimeoutID); + } + const labelMessage = state.errorOccured + ? "A unknown error has occured, the UI couldn't be loaded" + : getLocalMessage("loading_please_wait"); + return m$1( + "div", + { + class: { + "loader": true, + "loader--complete": complete, + "loader--transition-end": state.finished + }, + ontransitionend: () => setState({finished: true}) + }, + m$1( + "label", + { + class: { + loader__message: true, + loader__error: state.errorOccured + } + }, + labelMessage + ) + ); + } + var Loader$1 = withState(Loader); + + const BLOG_URL = "https://darkreader.org/blog/"; + const DONATE_URL = "https://opencollective.com/darkreader/donate"; + const GITHUB_URL = "https://github.com/darkreader/darkreader"; + const PRIVACY_URL = "https://darkreader.org/privacy/"; + const TWITTER_URL = "https://twitter.com/darkreaderapp"; + const helpLocales = [ + "be", + "cs", + "de", + "en", + "es", + "fr", + "it", + "nl", + "pt", + "ru", + "sr", + "tr", + "zh-CN", + "zh-TW" + ]; + function getHelpURL() { + const locale = getUILanguage(); + const matchLocale = + helpLocales.find((hl) => hl === locale) || + helpLocales.find((hl) => locale.startsWith(hl)) || + "en"; + return `https://darkreader.org/help/${matchLocale}/`; + } + + function AutomationPage(props) { + const isSystemAutomation = + props.data.settings.automation.mode === AutomationMode.SYSTEM; + const locationSettings = props.data.settings.location; + const values = { + latitude: { + min: -90, + max: 90 + }, + longitude: { + min: -180, + max: 180 + } + }; + function getLocationString(location) { + if (location == null) { + return ""; + } + return `${location}°`; + } + function locationChanged(inputElement, newValue, type) { + if (newValue.trim() === "") { + inputElement.value = ""; + props.actions.changeSettings({ + location: { + ...locationSettings, + [type]: null + } + }); + return; + } + const min = values[type].min; + const max = values[type].max; + newValue = newValue.replace(",", ".").replace("°", ""); + let num = Number(newValue); + if (isNaN(num)) { + num = 0; + } else if (num > max) { + num = max; + } else if (num < min) { + num = min; + } + inputElement.value = getLocationString(num); + props.actions.changeSettings({ + location: { + ...locationSettings, + [type]: num + } + }); + } + function changeAutomationMode(mode) { + props.actions.changeSettings({ + automation: { + ...props.data.settings.automation, + ...{mode, enabled: Boolean(mode)} + } + }); + } + function changeAutomationBehavior(behavior) { + props.actions.changeSettings({ + automation: {...props.data.settings.automation, ...{behavior}} + }); + } + return m$1( + "div", + {class: "automation-page"}, + m$1( + "div", + {class: "automation-page__line"}, + m$1(CheckBox, { + checked: + props.data.settings.automation.mode === + AutomationMode.TIME, + onchange: (e) => + changeAutomationMode( + e.target.checked + ? AutomationMode.TIME + : AutomationMode.NONE + ) + }), + m$1(TimeRangePicker, { + startTime: props.data.settings.time.activation, + endTime: props.data.settings.time.deactivation, + onChange: ([start, end]) => + props.actions.changeSettings({ + time: {activation: start, deactivation: end} + }) + }) + ), + m$1( + "p", + {class: "automation-page__description"}, + getLocalMessage("set_active_hours") + ), + m$1( + "div", + {class: "automation-page__line automation-page__location"}, + m$1(CheckBox, { + checked: + props.data.settings.automation.mode === + AutomationMode.LOCATION, + onchange: (e) => + changeAutomationMode( + e.target.checked + ? AutomationMode.LOCATION + : AutomationMode.NONE + ) + }), + m$1(TextBox, { + class: "automation-page__location__latitude", + placeholder: getLocalMessage("latitude"), + onchange: (e) => + locationChanged(e.target, e.target.value, "latitude"), + oncreate: (node) => + (node.value = getLocationString( + locationSettings.latitude + )), + onkeypress: (e) => { + if (e.key === "Enter") { + e.target.blur(); + } + } + }), + m$1(TextBox, { + class: "automation-page__location__longitude", + placeholder: getLocalMessage("longitude"), + onchange: (e) => + locationChanged(e.target, e.target.value, "longitude"), + oncreate: (node) => + (node.value = getLocationString( + locationSettings.longitude + )), + onkeypress: (e) => { + if (e.key === "Enter") { + e.target.blur(); + } + } + }) + ), + m$1( + "p", + {class: "automation-page__location-description"}, + getLocalMessage("set_location") + ), + m$1( + "div", + { + class: [ + "automation-page__line", + "automation-page__system-dark-mode" + ] + }, + m$1(CheckBox, { + class: "automation-page__system-dark-mode__checkbox", + checked: isSystemAutomation, + onchange: (e) => + changeAutomationMode( + e.target.checked + ? AutomationMode.SYSTEM + : AutomationMode.NONE + ) + }), + m$1( + Button, + { + class: { + "automation-page__system-dark-mode__button": true, + "automation-page__system-dark-mode__button--active": + isSystemAutomation + }, + onclick: () => { + changeAutomationMode( + isSystemAutomation + ? AutomationMode.NONE + : AutomationMode.SYSTEM + ); + } + }, + getLocalMessage("system_dark_mode") + ) + ), + m$1( + "p", + {class: "automation-page__description"}, + getLocalMessage("system_dark_mode_description") + ), + m$1(DropDown, { + onChange: (selected) => changeAutomationBehavior(selected), + selected: props.data.settings.automation.behavior, + options: [ + {id: "OnOff", content: "Toggle on/off"}, + {id: "Scheme", content: "Toggle dark/light"} + ] + }), + m$1( + "p", + {class: "automation-page__description"}, + "Automation behavior" + ) + ); + } + + function ControlGroup(props, control, description) { + return m$1( + "span", + {class: ["control-group", props.class]}, + control, + description + ); + } + function Control(props, control) { + return m$1( + "span", + {class: ["control-group__control", props.class]}, + control + ); + } + function Description(props, description) { + return m$1( + "span", + {class: ["control-group__description", props.class]}, + description + ); + } + var ControlGroup$1 = Object.assign(ControlGroup, {Control, Description}); + + function AppSwitch(props) { + const isOn = + props.data.settings.enabled === true && + !props.data.settings.automation.enabled; + const isOff = + props.data.settings.enabled === false && + !props.data.settings.automation.enabled; + const isAutomation = props.data.settings.automation.enabled; + const isTimeAutomation = + props.data.settings.automation.mode === AutomationMode.TIME; + const isLocationAutomation = + props.data.settings.automation.mode === AutomationMode.LOCATION; + const now = new Date(); + const values = [getLocalMessage("on"), "Auto", getLocalMessage("off")]; + const value = isOn ? values[0] : isOff ? values[2] : values[1]; + function onSwitchChange(v) { + const index = values.indexOf(v); + if (index === 0) { + props.actions.changeSettings({ + enabled: true, + automation: { + ...props.data.settings.automation, + ...{enabled: false} + } + }); + } else if (index === 2) { + props.actions.changeSettings({ + enabled: false, + automation: { + ...props.data.settings.automation, + ...{enabled: false} + } + }); + } else if (index === 1) { + props.actions.changeSettings({ + automation: { + ...props.data.settings.automation, + ...{mode: AutomationMode.SYSTEM, enabled: true} + } + }); + } + } + const descriptionText = isOn + ? "Extension is enabled" + : isOff + ? "Extension is disabled" + : isTimeAutomation + ? "Switches according to specified time" + : isLocationAutomation + ? "Switched according to location" + : "Switches according to system dark mode"; + const description = m$1( + "span", + { + class: { + "app-switch__description": true, + "app-switch__description--on": props.data.isEnabled, + "app-switch__description--off": !props.data.isEnabled + } + }, + descriptionText + ); + return m$1( + ControlGroup$1, + {class: "app-switch"}, + m$1( + ControlGroup$1.Control, + null, + m$1( + MultiSwitch, + { + class: "app-switch__control", + options: values, + value: value, + onChange: onSwitchChange + }, + m$1( + "span", + { + class: { + "app-switch__time": true, + "app-switch__time--active": isAutomation + } + }, + isTimeAutomation + ? m$1(WatchIcon, { + hours: now.getHours(), + minutes: now.getMinutes() + }) + : isLocationAutomation + ? m$1(SunMoonIcon, { + date: now, + latitude: + props.data.settings.location.latitude, + longitude: + props.data.settings.location.longitude + }) + : m$1(SystemIcon, null) + ) + ) + ), + m$1(ControlGroup$1.Description, null, description) + ); + } + + function HelpGroup() { + return m$1( + ControlGroup$1, + null, + m$1( + ControlGroup$1.Control, + null, + m$1( + "a", + { + class: "m-help-button", + href: getHelpURL(), + target: "_blank", + rel: "noopener noreferrer" + }, + m$1( + "span", + {class: "m-help-button__text"}, + getLocalMessage("help") + ) + ) + ) + ); + } + + function SiteToggleGroup(props) { + const tab = props.data.activeTab; + const isPageEnabled = isURLEnabled(tab.url, props.data.settings, tab); + const {isDarkThemeDetected} = tab; + const descriptionText = isPDF(tab.url) + ? isPageEnabled + ? "Enabled for PDF files" + : "Disabled for PDF files" + : isDarkThemeDetected + ? "Dark theme detected on page" + : isPageEnabled + ? "Enabled for current website" + : "Disabled for current website"; + const description = m$1( + "span", + { + class: { + "site-toggle-group__description": true, + "site-toggle-group__description--on": isPageEnabled, + "site-toggle-group__description--off": !isPageEnabled + } + }, + descriptionText + ); + return m$1( + ControlGroup$1, + {class: "site-toggle-group"}, + m$1( + ControlGroup$1.Control, + {class: "site-toggle-group__control"}, + m$1(SiteToggleButton, {...props}) + ), + m$1(ControlGroup$1.Description, null, description) + ); + } + + function ThemeControl(props, controls) { + return m$1( + "span", + {class: "theme-control"}, + m$1("label", {class: "theme-control__label"}, props.label), + controls + ); + } + + function BackgroundColorEditor(props) { + return m$1( + ThemeControl, + {label: "Background"}, + m$1(ColorPicker$1, { + color: props.value, + onChange: props.onChange, + canReset: props.canReset, + onReset: props.onReset + }) + ); + } + + function formatPercent(v) { + return `${v}%`; + } + + function Brightness(props) { + return m$1( + ThemeControl, + {label: getLocalMessage("brightness")}, + m$1(Slider, { + value: props.value, + min: 50, + max: 150, + step: 1, + formatValue: formatPercent, + onChange: props.onChange + }) + ); + } + + function Contrast(props) { + return m$1( + ThemeControl, + {label: getLocalMessage("contrast")}, + m$1(Slider, { + value: props.value, + min: 50, + max: 150, + step: 1, + formatValue: formatPercent, + onChange: props.onChange + }) + ); + } + + function ColorSchemeDropDown(props) { + function onColorSchemeChange(value) { + props.onChange(value); + } + return m$1( + ThemeControl, + {label: "Color Scheme"}, + m$1(DropDown, { + selected: props.selected, + options: props.values, + onChange: onColorSchemeChange + }) + ); + } + + function FontPicker(props) { + return m$1( + ThemeControl, + {label: "Font name"}, + m$1(Select$1, { + class: { + "font-picker": true, + "font-picker--disabled": !props.theme.useFont + }, + value: props.theme.fontFamily, + onChange: props.onChange, + options: props.fonts.reduce((map, font) => { + map[font] = m$1( + "div", + {style: {"font-family": font}}, + font + ); + return map; + }, {}) + }) + ); + } + + function Grayscale(props) { + return m$1( + ThemeControl, + {label: getLocalMessage("grayscale")}, + m$1(Slider, { + value: props.value, + min: 0, + max: 100, + step: 1, + formatValue: formatPercent, + onChange: props.onChange + }) + ); + } + + function ImmediateModify(props) { + const options = [ + {id: true, content: "Yes"}, + {id: false, content: "No"} + ]; + return m$1( + ThemeControl, + {label: "Immediate modify"}, + m$1(DropDown, { + options: options, + onChange: props.onChange, + selected: props.value + }) + ); + } + + var ThemeEngine; + (function (ThemeEngine) { + ThemeEngine["cssFilter"] = "cssFilter"; + ThemeEngine["svgFilter"] = "svgFilter"; + ThemeEngine["staticTheme"] = "staticTheme"; + ThemeEngine["dynamicTheme"] = "dynamicTheme"; + })(ThemeEngine || (ThemeEngine = {})); + + function Mode(props) { + async function openCSSEditor() { + await openExtensionPage("stylesheet-editor/index.html"); + } + const modes = [ + { + id: ThemeEngine.dynamicTheme, + content: getLocalMessage("engine_dynamic") + }, + { + id: ThemeEngine.cssFilter, + content: getLocalMessage("engine_filter") + }, + { + id: ThemeEngine.svgFilter, + content: getLocalMessage("engine_filter_plus") + }, + { + id: ThemeEngine.staticTheme, + content: getLocalMessage("engine_static") + } + ]; + return m$1( + ThemeControl, + {label: "Mode"}, + m$1( + "div", + {class: "mode-control-container"}, + m$1(DropDown, { + selected: modes.find((m) => m.id === props.mode).id, + options: modes, + onChange: props.onChange + }), + m$1("span", { + class: { + "static-edit-button": true, + "static-edit-button--hidden": + props.mode !== ThemeEngine.staticTheme + }, + onclick: openCSSEditor + }) + ) + ); + } + + const DEFAULT_COLORS = { + darkScheme: { + background: "#181a1b", + text: "#e8e6e3" + }, + lightScheme: { + background: "#dcdad7", + text: "#181a1b" + } + }; + const DEFAULT_THEME = { + mode: 1, + brightness: 100, + contrast: 100, + grayscale: 0, + sepia: 0, + useFont: false, + fontFamily: isMacOS + ? "Helvetica Neue" + : isWindows + ? "Segoe UI" + : "Open Sans", + textStroke: 0, + engine: ThemeEngine.dynamicTheme, + stylesheet: "", + darkSchemeBackgroundColor: DEFAULT_COLORS.darkScheme.background, + darkSchemeTextColor: DEFAULT_COLORS.darkScheme.text, + lightSchemeBackgroundColor: DEFAULT_COLORS.lightScheme.background, + lightSchemeTextColor: DEFAULT_COLORS.lightScheme.text, + scrollbarColor: isMacOS ? "" : "auto", + selectionColor: "auto", + styleSystemControls: !isCSSColorSchemePropSupported, + lightColorScheme: "Default", + darkColorScheme: "Default", + immediateModify: false + }; + const DEFAULT_SETTINGS = { + enabled: true, + fetchNews: true, + theme: DEFAULT_THEME, + presets: [], + customThemes: [], + siteList: [], + siteListEnabled: [], + applyToListedOnly: false, + changeBrowserTheme: false, + syncSettings: true, + syncSitesFixes: false, + automation: { + enabled: false, + mode: AutomationMode.NONE, + behavior: "OnOff" + }, + time: { + activation: "18:00", + deactivation: "9:00" + }, + location: { + latitude: null, + longitude: null + }, + previewNewDesign: false, + enableForPDF: true, + enableForProtectedPages: false, + enableContextMenus: false, + detectDarkTheme: false + }; + + function ResetButtonGroup$1(props) { + function reset() { + props.actions.setTheme(DEFAULT_SETTINGS.theme); + } + return m$1( + ControlGroup$1, + null, + m$1( + ControlGroup$1.Control, + null, + m$1(ResetButton, {onClick: reset}, "Reset to defaults") + ), + m$1( + ControlGroup$1.Description, + null, + "Restore current theme values to defaults" + ) + ); + } + + function Scheme(props) { + return m$1( + ThemeControl, + {label: "Scheme"}, + m$1(DropDown, { + selected: props.isDark, + options: [ + {id: true, content: getLocalMessage("dark")}, + {id: false, content: getLocalMessage("light")} + ], + onChange: props.onChange + }) + ); + } + + function ScrollbarEditor(props) { + return m$1( + ThemeControl, + {label: "Scrollbar"}, + m$1(ColorDropDown, { + value: props.value, + colorSuggestion: "#959799", + onChange: props.onChange, + onReset: props.onReset, + hasAutoOption: true, + hasDefaultOption: true + }) + ); + } + + function SelectionColorEditor(props) { + return m$1( + ThemeControl, + {label: "Selection"}, + m$1(ColorDropDown, { + value: props.value, + colorSuggestion: "#005ccc", + onChange: props.onChange, + onReset: props.onReset, + hasAutoOption: true, + hasDefaultOption: true + }) + ); + } + + function Sepia(props) { + return m$1( + ThemeControl, + {label: getLocalMessage("sepia")}, + m$1(Slider, { + value: props.value, + min: 0, + max: 100, + step: 1, + formatValue: formatPercent, + onChange: props.onChange + }) + ); + } + + function StyleSystemControls(props) { + const options = [ + {id: true, content: "Yes"}, + {id: false, content: "No"} + ]; + return m$1( + ThemeControl, + {label: "Style system controls"}, + m$1(DropDown, { + options: options, + onChange: props.onChange, + selected: props.value + }) + ); + } + + function TextColorEditor(props) { + return m$1( + ThemeControl, + {label: "Text"}, + m$1(ColorPicker$1, { + color: props.value, + onChange: props.onChange, + canReset: props.canReset, + onReset: props.onReset + }) + ); + } + + function TextStroke(props) { + return m$1( + ThemeControl, + {label: "Text stroke"}, + m$1(Slider, { + value: props.value, + min: 0, + max: 1, + step: 0.1, + formatValue: String, + onChange: props.onChange + }) + ); + } + + function UseFont(props) { + const options = [ + {id: true, content: "Yes"}, + {id: false, content: "No"} + ]; + return m$1( + ThemeControl, + {label: "Change font"}, + m$1(DropDown, { + options: options, + onChange: props.onChange, + selected: props.value + }) + ); + } + + function hexify(number) { + return (number < 16 ? "0" : "") + number.toString(16); + } + function generateUID() { + if ("randomUUID" in crypto) { + const uuid = crypto.randomUUID(); + return ( + uuid.substring(0, 8) + + uuid.substring(9, 13) + + uuid.substring(14, 18) + + uuid.substring(19, 23) + + uuid.substring(24) + ); + } + return Array.from(crypto.getRandomValues(new Uint8Array(16))) + .map((x) => hexify(x)) + .join(""); + } + + function PresetItem(props) { + const context = getComponentContext(); + const store = context.store; + function onRemoveClick(e) { + e.stopPropagation(); + store.isConfirmationVisible = true; + context.refresh(); + } + function onConfirmRemoveClick() { + const filtered = props.data.settings.presets.filter( + (p) => p.id !== props.preset.id + ); + props.actions.changeSettings({presets: filtered}); + } + function onCancelRemoveClick() { + store.isConfirmationVisible = false; + context.refresh(); + } + const confirmation = store.isConfirmationVisible + ? m$1(MessageBox, { + caption: `Are you sure you want to remove ${props.preset.name}?`, + onOK: onConfirmRemoveClick, + onCancel: onCancelRemoveClick + }) + : null; + return m$1( + "span", + {class: "theme-preset-picker__preset"}, + m$1( + "span", + {class: "theme-preset-picker__preset__name"}, + props.preset.name + ), + m$1("span", { + class: "theme-preset-picker__preset__remove-button", + onclick: onRemoveClick + }), + confirmation + ); + } + const MAX_ALLOWED_PRESETS = 3; + function PresetPicker(props) { + const tab = props.data.activeTab; + const host = getURLHostOrProtocol(tab.url); + const preset = props.data.settings.presets.find(({urls}) => + isURLInList(tab.url, urls) + ); + const custom = props.data.settings.customThemes.find(({url}) => + isURLInList(tab.url, url) + ); + const selectedPresetId = custom + ? "custom" + : preset + ? preset.id + : "default"; + const defaultOption = { + id: "default", + content: "Theme for all websites" + }; + const addNewPresetOption = + props.data.settings.presets.length < MAX_ALLOWED_PRESETS + ? {id: "add-preset", content: "\uff0b Create new theme"} + : null; + const userPresetsOptions = props.data.settings.presets.map((preset) => { + if (preset.id === selectedPresetId) { + return {id: preset.id, content: preset.name}; + } + return { + id: preset.id, + content: m$1(PresetItem, {...props, preset: preset}) + }; + }); + const customSitePresetOption = { + id: "custom", + content: `${ + selectedPresetId === "custom" ? "\u2605" : "\u2606" + } Theme for ${host}` + }; + const dropdownOptions = [ + defaultOption, + ...userPresetsOptions, + addNewPresetOption, + customSitePresetOption + ].filter(Boolean); + function onPresetChange(id) { + const filteredCustomThemes = + props.data.settings.customThemes.filter( + ({url}) => !isURLInList(tab.url, url) + ); + const filteredPresets = props.data.settings.presets.map( + (preset) => { + return { + ...preset, + urls: preset.urls.filter( + (template) => !isURLMatched(tab.url, template) + ) + }; + } + ); + if (id === "default") { + props.actions.changeSettings({ + customThemes: filteredCustomThemes, + presets: filteredPresets + }); + } else if (id === "custom") { + const extended = filteredCustomThemes.concat({ + url: [host], + theme: {...props.data.settings.theme} + }); + props.actions.changeSettings({ + customThemes: extended, + presets: filteredPresets + }); + } else if (id === "add-preset") { + let newPresetName; + for (let i = 0; i <= props.data.settings.presets.length; i++) { + newPresetName = `Theme ${i + 1}`; + if ( + props.data.settings.presets.every( + (p) => p.name !== newPresetName + ) + ) { + break; + } + } + const extended = filteredPresets.concat({ + id: `preset-${generateUID()}`, + name: newPresetName, + urls: [host], + theme: {...props.data.settings.theme} + }); + props.actions.changeSettings({ + customThemes: filteredCustomThemes, + presets: extended + }); + } else { + const chosenPresetId = id; + const extended = filteredPresets.map((preset) => { + if (preset.id === chosenPresetId) { + return { + ...preset, + urls: preset.urls.concat(host) + }; + } + return preset; + }); + props.actions.changeSettings({ + customThemes: filteredCustomThemes, + presets: extended + }); + } + } + return m$1(DropDown, { + class: "theme-preset-picker", + selected: selectedPresetId, + options: dropdownOptions, + onChange: onPresetChange + }); + } + + function getCurrentThemePreset(props) { + const custom = props.data.settings.customThemes.find(({url}) => + isURLInList(props.data.activeTab.url, url) + ); + const preset = custom + ? null + : props.data.settings.presets.find(({urls}) => + isURLInList(props.data.activeTab.url, urls) + ); + let theme = custom + ? custom.theme + : preset + ? preset.theme + : props.data.settings.theme; + if (props.data.forcedScheme) { + const mode = props.data.forcedScheme === "dark" ? 1 : 0; + theme = {...theme, mode}; + } + function setTheme(config) { + if (custom) { + custom.theme = {...custom.theme, ...config}; + props.actions.changeSettings({ + customThemes: props.data.settings.customThemes + }); + } else if (preset) { + preset.theme = {...preset.theme, ...config}; + props.actions.changeSettings({ + presets: props.data.settings.presets + }); + } else { + props.actions.setTheme(config); + } + if ( + config.mode != null && + props.data.settings.automation.behavior === "Scheme" + ) { + props.actions.changeSettings({ + automation: { + ...props.data.settings.automation, + ...{enabled: false} + } + }); + } + } + return { + theme, + change: setTheme + }; + } + + function ThemeControls(props) { + const {theme, onChange} = props; + return m$1( + "section", + {class: "m-section m-theme-controls"}, + m$1(Brightness, { + value: theme.brightness, + onChange: (v) => onChange({brightness: v}) + }), + m$1(Contrast, { + value: theme.contrast, + onChange: (v) => onChange({contrast: v}) + }), + m$1(Scheme, { + isDark: theme.mode === 1, + onChange: (isDark) => onChange({mode: isDark ? 1 : 0}) + }), + m$1(Mode, { + mode: theme.engine, + onChange: (mode) => onChange({engine: mode}) + }) + ); + } + function ThemeGroup(props) { + const preset = getCurrentThemePreset(props); + return m$1( + "div", + {class: "theme-group"}, + m$1( + "div", + {class: "theme-group__presets-wrapper"}, + m$1(PresetPicker, {...props}) + ), + m$1( + "div", + {class: "theme-group__controls-wrapper"}, + m$1(ThemeControls, { + theme: preset.theme, + onChange: preset.change + }), + m$1( + Button, + { + class: "theme-group__more-button", + onclick: props.onThemeNavClick + }, + "See all options" + ) + ), + m$1("label", {class: "theme-group__description"}, "Configure theme") + ); + } + + function SwitchGroup(props) { + return m$1( + Array, + null, + m$1(AppSwitch, {...props}), + m$1(SiteToggleGroup, {...props}) + ); + } + function SettingsNavButton(props) { + return m$1( + ResetButton$1, + {onClick: props.onClick}, + m$1("span", {class: "settings-button-icon"}), + "Settings" + ); + } + function MainPage(props) { + return m$1( + Array, + null, + m$1("section", {class: "m-section"}, m$1(SwitchGroup, {...props})), + m$1("section", {class: "m-section"}, m$1(ThemeGroup, {...props})), + m$1( + "section", + {class: "m-section"}, + m$1(SettingsNavButton, {onClick: props.onSettingsNavClick}), + m$1(HelpGroup, null) + ) + ); + } + + function isFresh(n) { + try { + const now = Date.now(); + const date = new Date(n.date).getTime(); + return now - date < getDuration({days: 30}); + } catch (err) { + return false; + } + } + function NewsLink(props) { + const {news} = props; + return m$1( + "a", + { + href: news.url, + class: { + "news-section__news": true, + "news-section__news--highlight": + !news.read && isFresh(news), + "news-section__news--has-icon": news.icon, + "news-section__news--small": props.isSmall + }, + onclick: props.onClick, + target: "_blank", + rel: "noopener noreferrer" + }, + news.icon + ? m$1("span", { + class: "news-section__news__icon", + style: {"background-image": `url('${news.icon}')`} + }) + : null, + m$1("span", {class: "news-section__news__text"}, news.headline) + ); + } + function NewsSection(props) { + const context = getComponentContext(); + const store = context.getStore({ + expanded: false, + didNewsSlideIn: false + }); + const {expanded, didNewsSlideIn} = store; + const news = props.data.news; + const latest = news && news.length > 0 ? news[0] : null; + function markLatestAsRead() { + if (latest) { + props.actions.markNewsAsRead([latest.id]); + } + } + function toggleNews() { + if (expanded) { + markLatestAsRead(); + } + store.expanded = !expanded; + store.didNewsSlideIn = didNewsSlideIn || !store.expanded; + context.refresh(); + } + context.onRender(() => { + if ( + latest && + !latest.read && + !store.expanded && + !store.didNewsSlideIn + ) { + setTimeout(toggleNews, 750); + } + }); + return m$1( + "div", + {class: {"news-section": true, "news-section--expanded": expanded}}, + latest + ? m$1(NewsLink, { + isSmall: true, + news: latest, + onClick: markLatestAsRead + }) + : null, + m$1( + "div", + {class: "news-section__popover"}, + m$1( + "div", + {class: "news-section__popover__top"}, + m$1("div", {class: "news-section__title"}, "What's New"), + m$1( + "span", + { + role: "button", + class: "news-section__close", + onclick: toggleNews + }, + "\u2715" + ) + ), + latest + ? m$1(NewsLink, {news: latest, onClick: markLatestAsRead}) + : null + ) + ); + } + + function Page(props, content) { + return m$1( + "div", + {class: {"page": true, "page--active": props.active}}, + m$1("div", {class: "page__content"}, content), + props.first + ? null + : m$1( + Button, + { + class: "page__back-button", + onclick: props.onBackButtonClick + }, + "Back" + ) + ); + } + function PageViewer(props, ...pages) { + return m$1( + "div", + {class: "page-viewer"}, + pages.map((pageSpec, i) => { + return { + ...pageSpec, + props: { + ...pageSpec.props, + active: props.activePage === pageSpec.props.id, + first: i === 0, + onBackButtonClick: props.onBackButtonClick + } + }; + }) + ); + } + + function AutomationButton(props) { + const now = new Date(); + return m$1( + ControlGroup$1, + null, + m$1( + ControlGroup$1.Control, + null, + m$1( + ResetButton$1, + {onClick: props.onClick}, + m$1( + "span", + {class: "automation-button-icon"}, + m$1(WatchIcon, { + hours: now.getHours(), + minutes: now.getMinutes() + }) + ), + "Automation" + ) + ), + m$1( + ControlGroup$1.Description, + null, + "Configure when app is enabled" + ) + ); + } + + async function openDevTools$1() { + await openExtensionPage("devtools/index.html"); + } + function DevToolsGroup() { + return m$1( + ControlGroup$1, + null, + m$1( + ControlGroup$1.Control, + null, + m$1( + ResetButton$1, + {onClick: openDevTools$1, class: "dev-tools-button"}, + "\uD83D\uDEE0 ", + getLocalMessage("open_dev_tools") + ) + ), + m$1(ControlGroup$1.Description, null, "Make a fix for a website") + ); + } + + function ManageSettingsButton(props) { + return m$1( + ControlGroup$1, + null, + m$1( + ControlGroup$1.Control, + null, + m$1(ResetButton$1, {onClick: props.onClick}, "Manage settings") + ), + m$1( + ControlGroup$1.Description, + null, + "Reset, export or import settings" + ) + ); + } + + function SiteListButton(props) { + return m$1( + ControlGroup$1, + null, + m$1( + ControlGroup$1.Control, + null, + m$1( + ResetButton$1, + {onClick: props.onClick}, + m$1("span", {class: "site-list-button-icon"}), + "Site list" + ) + ), + m$1( + ControlGroup$1.Description, + null, + "Enable or disable on listed websites" + ) + ); + } + + function CheckButton(props) { + return m$1( + ControlGroup$1, + {class: "check-button"}, + m$1( + ControlGroup$1.Control, + null, + m$1( + CheckBox, + { + class: "check-button__checkbox", + checked: props.checked, + onchange: (e) => props.onChange(e.target.checked) + }, + props.label + ) + ), + m$1( + ControlGroup$1.Description, + {class: "check-button__description"}, + props.description + ) + ); + } + + function EnabledByDefaultGroup(props) { + function onEnabledByDefaultChange(checked) { + props.actions.changeSettings({applyToListedOnly: !checked}); + } + return m$1(CheckButton, { + checked: !props.data.settings.applyToListedOnly, + label: "Enable by default", + description: props.data.settings.applyToListedOnly + ? "Disabled on all websites by default" + : "Enabled on all websites by default", + onChange: onEnabledByDefaultChange + }); + } + + function DetectDarkTheme(props) { + function onDetectDarkThemeChange(checked) { + props.actions.changeSettings({detectDarkTheme: checked}); + } + return m$1(CheckButton, { + checked: props.data.settings.detectDarkTheme, + label: "Detect dark theme", + description: props.data.settings.detectDarkTheme + ? `Will not override website's dark theme` + : `Will override website's dark theme`, + onChange: onDetectDarkThemeChange + }); + } + + function ChangeBrowserTheme(props) { + function onBrowserThemeChange(checked) { + props.actions.changeSettings({changeBrowserTheme: checked}); + } + return m$1(CheckButton, { + checked: props.data.settings.changeBrowserTheme, + label: "Change browser theme", + description: props.data.settings.changeBrowserTheme + ? "Custom browser theme is active" + : "Default browser theme is active", + onChange: onBrowserThemeChange + }); + } + + function ContextMenusGroup(props) { + function onContextMenusChange(checked) { + if (checked) { + if (isFirefox) { + props.actions.changeSettings({enableContextMenus: true}); + return; + } + chrome.permissions.request( + {permissions: ["contextMenus"]}, + (hasPermission) => { + if (hasPermission) { + props.actions.changeSettings({ + enableContextMenus: true + }); + } else { + console.warn( + "User declined contextMenus permission prompt." + ); + } + } + ); + } else { + props.actions.changeSettings({enableContextMenus: false}); + } + } + return isMobile + ? null + : m$1(CheckButton, { + checked: props.data.settings.enableContextMenus, + label: "Use context menus", + description: props.data.settings.enableContextMenus + ? "Context menu integration is enabled" + : "Context menu integration is disabled", + onChange: onContextMenusChange + }); + } + + let appVersion; + function AppVersion() { + if (!appVersion) { + appVersion = chrome.runtime.getManifest().version; + } + return m$1( + "label", + {class: "darkreader-version"}, + "Version 5 Preview (", + appVersion, + ")" + ); + } + + function SettingsPage(props) { + return m$1( + "section", + {class: "m-section"}, + m$1(EnabledByDefaultGroup, {...props}), + isFirefox ? m$1(ChangeBrowserTheme, {...props}) : null, + m$1(SiteListButton, {onClick: props.onSiteListNavClick}), + m$1(DevToolsGroup, null), + m$1(AutomationButton, {onClick: props.onAutomationNavClick}), + m$1(ContextMenusGroup, {...props}), + m$1(ManageSettingsButton, {onClick: props.onManageSettingsClick}), + m$1(DetectDarkTheme, {...props}), + m$1(AppVersion, null) + ); + } + + function SiteList(props) { + const context = getComponentContext(); + const store = context.store; + if (!context.prev) { + store.indices = new WeakMap(); + store.shouldFocusAtIndex = -1; + store.wasVisible = false; + } + context.onRender((node) => { + const isVisible = node.clientWidth > 0; + const {wasVisible} = store; + store.wasVisible = isVisible; + if (!wasVisible && isVisible) { + store.shouldFocusAtIndex = props.siteList.length; + context.refresh(); + } + }); + function onTextChange(e) { + const index = store.indices.get(e.target); + const values = props.siteList.slice(); + const value = e.target.value.trim(); + if (values.includes(value)) { + return; + } + if (!value) { + values.splice(index, 1); + store.shouldFocusAtIndex = index; + } else if (index === values.length) { + values.push(value); + store.shouldFocusAtIndex = index + 1; + } else { + values.splice(index, 1, value); + store.shouldFocusAtIndex = index + 1; + } + props.onChange(values); + } + function removeValue(event) { + const previousSibling = event.target.previousSibling; + const index = store.indices.get(previousSibling); + const filtered = props.siteList.slice(); + filtered.splice(index, 1); + store.shouldFocusAtIndex = index; + props.onChange(filtered); + } + function createTextBox(text, index) { + const onRender = (node) => { + store.indices.set(node, index); + if (store.shouldFocusAtIndex === index) { + store.shouldFocusAtIndex = -1; + node.focus(); + } + }; + return m$1( + "div", + {class: "site-list__item"}, + m$1(TextBox, { + class: "site-list__textbox", + value: text, + onrender: onRender, + placeholder: "google.com/maps" + }), + text + ? m$1("span", { + class: "site-list__item__remove", + role: "button", + onclick: removeValue + }) + : null + ); + } + return m$1( + "div", + {class: "site-list"}, + m$1(VirtualScroll, { + root: m$1("div", { + class: "site-list__v-scroll-root", + onchange: onTextChange + }), + items: props.siteList + .map((site, index) => createTextBox(site, index)) + .concat(createTextBox("", props.siteList.length)), + scrollToIndex: store.shouldFocusAtIndex + }) + ); + } + + function SiteListPage(props) { + function onSiteListChange(sites) { + props.actions.changeSettings({siteList: sites}); + } + function onInvertPDFChange(checked) { + props.actions.changeSettings({enableForPDF: checked}); + } + function onEnableForProtectedPages(value) { + props.actions.changeSettings({enableForProtectedPages: value}); + } + const label = props.data.settings.applyToListedOnly + ? "Enable on these websites" + : "Disable on these websites"; + return m$1( + "div", + {class: "site-list-page"}, + m$1("label", {class: "site-list-page__label"}, label), + m$1(SiteList, { + siteList: props.data.settings.siteList, + onChange: onSiteListChange + }), + m$1( + "label", + {class: "site-list-page__description"}, + "Enter website name and press Enter" + ), + isFirefox + ? null + : m$1(CheckButton, { + checked: props.data.settings.enableForPDF, + label: "Enable for PDF files", + description: props.data.settings.enableForPDF + ? "Enabled for PDF documents" + : "Disabled for PDF documents", + onChange: onInvertPDFChange + }), + m$1(CheckButton, { + checked: props.data.settings.enableForProtectedPages, + onChange: onEnableForProtectedPages, + label: "Enable on restricted pages", + description: props.data.settings.enableForProtectedPages + ? "You should enable it in browser flags too" + : "Disabled for web store and other pages" + }) + ); + } + + function CollapsiblePanel({}, ...groups) { + const context = getComponentContext(); + const store = context.store; + if (store.activeGroup == null) { + store.activeGroup = groups[0].props.id; + } + return m$1( + "div", + {class: "collapsible-panel"}, + ...groups.map((spec, i) => { + const activeIndex = groups.findIndex( + (g) => store.activeGroup === g.props.id + ); + const collapsed = i !== activeIndex; + const collapseTop = i < activeIndex; + const collapseBottom = i > activeIndex; + const onExpand = () => { + store.activeGroup = spec.props.id; + context.refresh(); + }; + return { + ...spec, + props: { + ...spec.props, + collapsed, + collapseBottom, + collapseTop, + onExpand + } + }; + }) + ); + } + function Group(props, content) { + return m$1( + "div", + { + class: { + "collapsible-panel__group": true, + "collapsible-panel__group--collapsed": props.collapsed, + "collapsible-panel__group--collapse-top": props.collapseTop, + "collapsible-panel__group--collapse-bottom": + props.collapseBottom + } + }, + m$1("div", {class: "collapsible-panel__group__content"}, content), + m$1( + "span", + { + role: "button", + class: "collapsible-panel__group__expand-button", + onclick: props.onExpand + }, + props.label + ) + ); + } + var Collapsible = Object.assign(CollapsiblePanel, {Group}); + + function MainGroup({theme, change}) { + return m$1( + Array, + null, + m$1(Brightness, { + value: theme.brightness, + onChange: (v) => change({brightness: v}) + }), + m$1(Contrast, { + value: theme.contrast, + onChange: (v) => change({contrast: v}) + }), + m$1(Sepia, { + value: theme.sepia, + onChange: (v) => change({sepia: v}) + }), + m$1(Grayscale, { + value: theme.grayscale, + onChange: (v) => change({grayscale: v}) + }), + m$1(Scheme, { + isDark: theme.mode === 1, + onChange: (isDark) => change({mode: isDark ? 1 : 0}) + }), + m$1(Mode, { + mode: theme.engine, + onChange: (mode) => change({engine: mode}) + }) + ); + } + function ColorsGroup({theme, change, colorSchemes}) { + const isDarkScheme = theme.mode === 1; + const csProp = isDarkScheme ? "darkColorScheme" : "lightColorScheme"; + const bgProp = isDarkScheme + ? "darkSchemeBackgroundColor" + : "lightSchemeBackgroundColor"; + const fgProp = isDarkScheme + ? "darkSchemeTextColor" + : "lightSchemeTextColor"; + const defaultSchemeColors = isDarkScheme + ? DEFAULT_COLORS.darkScheme + : DEFAULT_COLORS.lightScheme; + const defaultMatrixValues = { + brightness: DEFAULT_THEME.brightness, + contrast: DEFAULT_THEME.contrast, + sepia: DEFAULT_THEME.sepia, + grayscale: DEFAULT_THEME.grayscale + }; + const currentColorScheme = isDarkScheme + ? theme.darkColorScheme + : theme.lightColorScheme; + const currentSchemeColors = isDarkScheme + ? colorSchemes.dark + : colorSchemes.light; + const sortedColorSchemeValues = Object.keys(currentSchemeColors) + .sort((a, b) => a.localeCompare(b)) + .map((value) => { + return {id: value, content: value}; + }); + function onColorSchemeChange(newColor) { + change({[csProp]: newColor}); + change({[bgProp]: currentSchemeColors[newColor].backgroundColor}); + change({[fgProp]: currentSchemeColors[newColor].textColor}); + } + return m$1( + Array, + null, + m$1(BackgroundColorEditor, { + value: + theme[bgProp] === "auto" + ? defaultSchemeColors.background + : theme[bgProp], + onChange: (v) => + change({ + [bgProp]: v, + ...defaultMatrixValues, + [csProp]: "Default" + }), + canReset: theme[bgProp] !== defaultSchemeColors.background, + onReset: () => + change({ + [bgProp]: DEFAULT_SETTINGS.theme[bgProp], + [csProp]: "Default" + }) + }), + m$1(TextColorEditor, { + value: + theme[fgProp] === "auto" + ? defaultSchemeColors.text + : theme[fgProp], + onChange: (v) => + change({ + [fgProp]: v, + ...defaultMatrixValues, + [csProp]: "Default" + }), + canReset: theme[fgProp] !== defaultSchemeColors.text, + onReset: () => + change({ + [fgProp]: DEFAULT_SETTINGS.theme[fgProp], + [csProp]: "Default" + }) + }), + m$1(ScrollbarEditor, { + value: theme.scrollbarColor, + onChange: (v) => change({scrollbarColor: v}), + onReset: () => + change({ + scrollbarColor: DEFAULT_SETTINGS.theme.scrollbarColor + }) + }), + m$1(SelectionColorEditor, { + value: theme.selectionColor, + onChange: (v) => change({selectionColor: v}), + onReset: () => + change({ + selectionColor: DEFAULT_SETTINGS.theme.selectionColor + }) + }), + m$1(ColorSchemeDropDown, { + selected: currentColorScheme, + values: sortedColorSchemeValues, + onChange: (v) => onColorSchemeChange(v) + }) + ); + } + function FontGroup({theme, fonts, change}) { + return m$1( + Array, + null, + m$1(UseFont, { + value: theme.useFont, + onChange: (useFont) => change({useFont}) + }), + m$1(FontPicker, { + theme: theme, + fonts: fonts, + onChange: (fontFamily) => change({fontFamily}) + }), + m$1(TextStroke, { + value: theme.textStroke, + onChange: (textStroke) => change({textStroke}) + }), + m$1(StyleSystemControls, { + value: theme.styleSystemControls, + onChange: (styleSystemControls) => change({styleSystemControls}) + }), + m$1(ImmediateModify, { + value: theme.immediateModify, + onChange: (immediateModify) => change({immediateModify}) + }) + ); + } + function ThemePage(props) { + const {theme, change} = getCurrentThemePreset(props); + return m$1( + "section", + {class: "m-section theme-page"}, + m$1(PresetPicker, {...props}), + m$1( + Collapsible, + null, + m$1( + Collapsible.Group, + {id: "main", label: "Brightness, contrast, mode"}, + m$1(MainGroup, {theme: theme, change: change}) + ), + m$1( + Collapsible.Group, + {id: "colors", label: "Colors"}, + m$1(ColorsGroup, { + theme: theme, + change: change, + colorSchemes: props.data.colorScheme + }) + ), + m$1( + Collapsible.Group, + {id: "font", label: "Font & more"}, + m$1(FontGroup, { + theme: theme, + fonts: props.fonts, + change: change + }) + ) + ), + m$1(ResetButtonGroup$1, {...props}) + ); + } + + function ResetButtonGroup(props) { + const context = getComponentContext(); + function showDialog() { + context.store.isDialogVisible = true; + context.refresh(); + } + function hideDialog() { + context.store.isDialogVisible = false; + context.refresh(); + } + function reset() { + context.store.isDialogVisible = false; + props.actions.changeSettings(DEFAULT_SETTINGS); + } + const dialog = context.store.isDialogVisible + ? m$1(MessageBox, { + caption: + "Are you sure you want to remove all your settings? You cannot restore them later", + onOK: reset, + onCancel: hideDialog + }) + : null; + return m$1( + ControlGroup$1, + null, + m$1( + ControlGroup$1.Control, + null, + m$1( + ResetButton, + {onClick: showDialog}, + "Reset settings", + dialog + ) + ), + m$1( + ControlGroup$1.Description, + null, + "Restore settings to defaults" + ) + ); + } + + function ImportButton(props) { + const context = getComponentContext(); + function getValidatedObject(source, compare) { + const result = {}; + if ( + source == null || + typeof source !== "object" || + Array.isArray(source) + ) { + return null; + } + Object.keys(source).forEach((key) => { + const value = source[key]; + if (value == null || compare[key] == null) { + return; + } + const array1 = Array.isArray(value); + const array2 = Array.isArray(compare[key]); + if (array1 || array2) { + if (array1 && array2) { + result[key] = value; + } + } else if ( + typeof value === "object" && + typeof compare[key] === "object" + ) { + result[key] = getValidatedObject(value, compare[key]); + } else if (typeof value === typeof compare[key]) { + result[key] = value; + } + }); + return result; + } + function showDialog() { + context.store.isDialogVisible = true; + context.refresh(); + } + function hideDialog() { + context.store.isDialogVisible = false; + context.refresh(); + } + const dialog = + context && context.store.isDialogVisible + ? m$1(MessageBox, { + caption: "The given file has incorrect JSON.", + onOK: hideDialog, + onCancel: hideDialog + }) + : null; + function importSettings() { + openFile({extensions: ["json"]}, (result) => { + try { + const content = JSON.parse(result); + const result2 = getValidatedObject( + content, + DEFAULT_SETTINGS + ); + props.actions.changeSettings({...result2}); + } catch (err) { + console.error(err); + showDialog(); + } + }); + } + return m$1( + ControlGroup$1, + null, + m$1( + ControlGroup$1.Control, + null, + m$1( + Button, + {onclick: importSettings, class: "settings-button"}, + "Import Settings", + dialog + ) + ), + m$1( + ControlGroup$1.Description, + null, + "Open settings from a JSON file" + ) + ); + } + + function ExportButton(props) { + function exportSettings() { + saveFile( + "Dark-Reader-Settings.json", + JSON.stringify(props.data.settings, null, 4) + ); + } + return m$1( + ControlGroup$1, + null, + m$1( + ControlGroup$1.Control, + null, + m$1( + Button, + {onclick: exportSettings, class: "settings-button"}, + "Export Settings" + ) + ), + m$1( + ControlGroup$1.Description, + null, + "Save settings to a JSON file" + ) + ); + } + + function SyncSettings(props) { + function onSyncSettingsChange(checked) { + props.actions.changeSettings({syncSettings: checked}); + } + return m$1(CheckButton, { + checked: props.data.settings.syncSettings, + label: "Enable settings sync", + description: props.data.settings.syncSettings + ? "Synchronized across devices" + : "Not synchronized across devices", + onChange: onSyncSettingsChange + }); + } + + function ExportTheme() { + const listener = ({type, data}, sender) => { + if (type === MessageType.CS_EXPORT_CSS_RESPONSE) { + const url = getURLHostOrProtocol(sender.tab.url).replace( + /[^a-z0-1\-]/g, + "-" + ); + saveFile(`DarkReader-${url}.css`, data); + chrome.runtime.onMessage.removeListener(listener); + } + }; + function exportCSS() { + chrome.runtime.onMessage.addListener(listener); + chrome.runtime.sendMessage({ + type: MessageType.UI_REQUEST_EXPORT_CSS + }); + } + return m$1( + ControlGroup$1, + null, + m$1( + ControlGroup$1.Control, + null, + m$1( + Button, + {onclick: exportCSS, class: "settings-button"}, + "Export Dynamic Theme" + ) + ), + m$1( + ControlGroup$1.Description, + null, + "Save generated CSS to a file" + ) + ); + } + + function SyncConfigButton(props) { + function syncConfig(syncSitesFixes) { + props.actions.changeSettings({syncSitesFixes}); + props.actions.loadConfig({local: !syncSitesFixes}); + } + return m$1(CheckButton, { + checked: props.data.settings.syncSitesFixes, + label: "Synchronize sites fixes", + description: "Load the latest sites fixes from a remote server", + onChange: syncConfig + }); + } + + function FetchNews(props) { + function onFetchNewsChange(checked) { + props.actions.changeSettings({fetchNews: checked}); + } + return m$1(CheckButton, { + checked: props.data.settings.fetchNews, + label: "Notify of news", + description: props.data.settings.fetchNews + ? "Notifying of Dark Reader's news" + : "Not Notifying of Dark Reader's news", + onChange: onFetchNewsChange + }); + } + + function ManageSettingsPage(props) { + const custom = props.data.settings.customThemes.find(({url}) => + isURLInList(props.data.activeTab.url, url) + ); + const engine = custom + ? custom.theme.engine + : props.data.settings.theme.engine; + return m$1( + "section", + {class: "m-section"}, + m$1(SyncSettings, {...props}), + m$1(SyncConfigButton, {...props}), + m$1(FetchNews, {...props}), + m$1(ImportButton, {...props}), + m$1(ExportButton, {...props}), + engine === ThemeEngine.dynamicTheme ? m$1(ExportTheme, null) : null, + m$1(ResetButtonGroup, {...props}) + ); + } + + function Logo() { + return m$1( + "a", + { + class: "m-logo", + href: "https://darkreader.org/", + target: "_blank", + rel: "noopener noreferrer" + }, + "Dark Reader" + ); + } + function Pages(props) { + const context = getComponentContext(); + const store = context.store; + if (store.activePage == null) { + store.activePage = "main"; + } + function onThemeNavClick() { + store.activePage = "theme"; + context.refresh(); + } + function onSettingsNavClick() { + store.activePage = "settings"; + context.refresh(); + } + function onAutomationNavClick() { + store.activePage = "automation"; + context.refresh(); + } + function onManageSettingsClick() { + store.activePage = "manage-settings"; + context.refresh(); + } + function onSiteListNavClick() { + store.activePage = "site-list"; + context.refresh(); + } + function onBackClick() { + const activePage = store.activePage; + const settingsPageSubpages = [ + "automation", + "manage-settings", + "site-list" + ]; + if (settingsPageSubpages.includes(activePage)) { + store.activePage = "settings"; + } else { + store.activePage = "main"; + } + context.refresh(); + } + return m$1( + PageViewer, + {activePage: store.activePage, onBackButtonClick: onBackClick}, + m$1( + Page, + {id: "main"}, + m$1(MainPage, { + ...props, + onThemeNavClick: onThemeNavClick, + onSettingsNavClick: onSettingsNavClick + }) + ), + m$1(Page, {id: "theme"}, m$1(ThemePage, {...props})), + m$1( + Page, + {id: "settings"}, + m$1(SettingsPage, { + ...props, + onAutomationNavClick: onAutomationNavClick, + onManageSettingsClick: onManageSettingsClick, + onSiteListNavClick: onSiteListNavClick + }) + ), + m$1(Page, {id: "site-list"}, m$1(SiteListPage, {...props})), + m$1(Page, {id: "automation"}, m$1(AutomationPage, {...props})), + m$1( + Page, + {id: "manage-settings"}, + m$1(ManageSettingsPage, {...props}) + ) + ); + } + function DonateGroup() { + return m$1( + "div", + {class: "m-donate-group"}, + m$1( + "a", + { + class: "m-donate-button", + href: DONATE_URL, + target: "_blank", + rel: "noopener noreferrer" + }, + m$1("span", {class: "m-donate-button__icon"}), + m$1( + "span", + {class: "m-donate-button__text"}, + getLocalMessage("donate") + ) + ), + m$1( + "label", + {class: "m-donate-description"}, + "This project is sponsored by you" + ) + ); + } + function Body$2(props) { + const context = getComponentContext(); + context.onCreate(() => { + if (isMobile) { + window.addEventListener("contextmenu", (e) => + e.preventDefault() + ); + } + }); + context.onRemove(() => { + document.documentElement.classList.remove("preview"); + }); + return m$1( + "body", + null, + m$1("section", {class: "m-section"}, m$1(Logo, null)), + m$1( + "section", + {class: "m-section pages-section"}, + m$1(Pages, {...props}) + ), + m$1("section", {class: "m-section"}, m$1(DonateGroup, null)), + m$1(NewsSection, {...props}), + m$1(Overlay$1, null) + ); + } + + const engineNames = [ + [ThemeEngine.cssFilter, getLocalMessage("engine_filter")], + [ThemeEngine.svgFilter, getLocalMessage("engine_filter_plus")], + [ThemeEngine.staticTheme, getLocalMessage("engine_static")], + [ThemeEngine.dynamicTheme, getLocalMessage("engine_dynamic")] + ]; + function openCSSEditor() { + chrome.windows.create({ + type: "panel", + url: isFirefox + ? "../stylesheet-editor/index.html" + : "ui/stylesheet-editor/index.html", + width: 600, + height: 600 + }); + } + function EngineSwitch({engine, onChange}) { + return m$1( + "div", + {class: "engine-switch"}, + m$1(MultiSwitch, { + value: engineNames.find(([code]) => code === engine)[1], + options: engineNames.map(([, name]) => name), + onChange: (value) => + onChange(engineNames.find(([, name]) => name === value)[0]) + }), + m$1("span", { + class: { + "engine-switch__css-edit-button": true, + "engine-switch__css-edit-button_active": + engine === ThemeEngine.staticTheme + }, + onclick: openCSSEditor + }), + m$1( + "label", + {class: "engine-switch__description"}, + getLocalMessage("theme_generation_mode") + ) + ); + } + + function FontSettings({config, fonts, onChange}) { + return m$1( + "section", + {class: "font-settings"}, + m$1( + "div", + {class: "font-settings__font-select-container"}, + m$1( + "div", + {class: "font-settings__font-select-container__line"}, + m$1(CheckBox, { + checked: config.useFont, + onchange: (e) => onChange({useFont: e.target.checked}) + }), + m$1(Select$1, { + value: config.fontFamily, + onChange: (value) => onChange({fontFamily: value}), + options: fonts.reduce((map, font) => { + map[font] = m$1( + "div", + {style: {"font-family": font}}, + font + ); + return map; + }, {}) + }) + ), + m$1( + "label", + {class: "font-settings__font-select-container__label"}, + getLocalMessage("select_font") + ) + ), + m$1(UpDown, { + value: config.textStroke, + min: 0, + max: 1, + step: 0.1, + default: 0, + name: getLocalMessage("text_stroke"), + onChange: (value) => onChange({textStroke: value}) + }) + ); + } + + function compileMarkdown(markdown) { + return markdown + .split("**") + .map((text, i) => (i % 2 ? m$1("strong", null, text) : text)); + } + + function MoreSettings({data, actions, fonts}) { + const tab = data.activeTab; + const custom = data.settings.customThemes.find(({url}) => + isURLInList(tab.url, url) + ); + const filterConfig = custom ? custom.theme : data.settings.theme; + function setConfig(config) { + if (custom) { + custom.theme = {...custom.theme, ...config}; + actions.changeSettings({ + customThemes: data.settings.customThemes + }); + } else { + actions.setTheme(config); + } + } + return m$1( + "section", + {class: "more-settings"}, + m$1( + "div", + {class: "more-settings__section"}, + m$1(FontSettings, { + config: filterConfig, + fonts: fonts, + onChange: setConfig + }) + ), + m$1( + "div", + {class: "more-settings__section"}, + isFirefox + ? null + : m$1( + "p", + {class: "more-settings__description"}, + compileMarkdown( + getLocalMessage("try_experimental_theme_engines") + ) + ), + m$1(EngineSwitch, { + engine: filterConfig.engine, + onChange: (engine) => setConfig({engine}) + }) + ), + m$1( + "div", + {class: "more-settings__section"}, + m$1(CustomSettingsToggle, {data: data, actions: actions}), + tab.isProtected + ? m$1( + "p", + { + class: "more-settings__description more-settings__description--warning" + }, + getLocalMessage("page_protected").replace(/\n/g, " ") + ) + : tab.isInDarkList + ? m$1( + "p", + { + class: "more-settings__description more-settings__description--warning" + }, + getLocalMessage("page_in_dark_list").replace( + /\n/g, + " " + ) + ) + : m$1( + "p", + {class: "more-settings__description"}, + getLocalMessage("only_for_description") + ) + ), + isFirefox + ? m$1( + "div", + {class: "more-settings__section"}, + m$1(Toggle, { + checked: data.settings.changeBrowserTheme, + labelOn: getLocalMessage("custom_browser_theme_on"), + labelOff: getLocalMessage("custom_browser_theme_off"), + onChange: (checked) => + actions.changeSettings({ + changeBrowserTheme: checked + }) + }), + m$1( + "p", + {class: "more-settings__description"}, + getLocalMessage("change_browser_theme") + ) + ) + : null + ); + } + + const NEWS_COUNT = 2; + function NewsGroup({news, expanded, onNewsOpen, onClose}) { + return m$1( + "div", + {class: {"news": true, "news--expanded": expanded}}, + m$1( + "div", + {class: "news__header"}, + m$1( + "span", + {class: "news__header__text"}, + getLocalMessage("news") + ), + m$1( + "span", + {class: "news__close", role: "button", onclick: onClose}, + "\u2715" + ) + ), + m$1( + "div", + {class: "news__list"}, + news.slice(0, NEWS_COUNT).map((event) => { + const date = new Date(event.date); + let formattedDate; + try { + const locale = getUILanguage(); + formattedDate = date.toLocaleDateString(locale, { + month: "short", + day: "numeric" + }); + } catch (err) { + formattedDate = date.toISOString().substring(0, 10); + } + return m$1( + "div", + { + class: { + "news__event": true, + "news__event--unread": !event.read, + "news__event--has-icon": event.icon + } + }, + m$1( + "a", + { + class: "news__event__link", + onclick: () => onNewsOpen(event), + href: event.url, + target: "_blank", + rel: "noopener noreferrer" + }, + event.icon + ? m$1("span", { + class: "news__event__icon", + style: { + "background-image": `url('${event.icon}')` + } + }) + : null, + m$1( + "span", + {class: "news__event__date"}, + formattedDate + ), + event.headline + ) + ); + }), + news.length <= NEWS_COUNT + ? null + : m$1( + "a", + { + class: { + "news__read-more": true, + "news__read-more--unread": news + .slice(NEWS_COUNT) + .find(({read}) => !read) + }, + href: BLOG_URL, + target: "_blank", + onclick: () => onNewsOpen(...news), + rel: "noopener noreferrer" + }, + getLocalMessage("read_more") + ) + ) + ); + } + function NewsButton({active, count, onClick}) { + return m$1( + Button, + { + "class": {"news-button": true, "news-button--active": active}, + "href": "#news", + "data-count": count > 0 && !active ? count : null, + "onclick": (e) => { + e.currentTarget.blur(); + onClick(); + } + }, + getLocalMessage("news") + ); + } + + function SiteListSettings({data, actions, isFocused}) { + function isSiteUrlValid(value) { + return /^([^\.\s]+?\.?)+$/.test(value); + } + return m$1( + "section", + {class: "site-list-settings"}, + m$1(Toggle, { + class: "site-list-settings__toggle", + checked: data.settings.applyToListedOnly, + labelOn: getLocalMessage("invert_listed_only"), + labelOff: getLocalMessage("not_invert_listed"), + onChange: (value) => + actions.changeSettings({applyToListedOnly: value}) + }), + m$1(TextList, { + class: "site-list-settings__text-list", + placeholder: "google.com/maps", + values: data.settings.siteList, + isFocused: isFocused, + onChange: (values) => { + if (values.every(isSiteUrlValid)) { + actions.changeSettings({siteList: values}); + } + } + }), + m$1(ShortcutLink, { + class: "site-list-settings__shortcut", + commandName: "addSite", + shortcuts: data.shortcuts, + textTemplate: (hotkey) => + hotkey + ? `${getLocalMessage("add_site_to_list")}: ${hotkey}` + : getLocalMessage("setup_add_site_hotkey"), + onSetShortcut: (shortcut) => + actions.setShortcut("addSite", shortcut) + }) + ); + } + + function openDevTools() { + chrome.windows.create({ + type: "panel", + url: isFirefox + ? "../devtools/index.html" + : "ui/devtools/index.html", + width: 600, + height: 600 + }); + } + function Body(props) { + const context = getComponentContext(); + const {state, setState} = useState({ + activeTab: "Filter", + newsOpen: false, + didNewsSlideIn: false, + moreToggleSettingsOpen: false + }); + if (!props.data.isReady) { + return m$1("body", null, m$1(Loader$1, {complete: false})); + } + if (isMobile || props.data.settings.previewNewDesign) { + return m$1(Body$2, {...props, fonts: props.fonts}); + } + const unreadNews = props.data.news.filter(({read}) => !read); + const latestNews = + props.data.news.length > 0 ? props.data.news[0] : null; + const isFirstNewsUnread = latestNews && !latestNews.read; + context.onRender(() => { + if ( + props.data.settings.fetchNews && + isFirstNewsUnread && + !state.newsOpen && + !state.didNewsSlideIn + ) { + setTimeout(toggleNews, 750); + } + }); + function toggleNews() { + if (state.newsOpen && unreadNews.length > 0) { + props.actions.markNewsAsRead(unreadNews.map(({id}) => id)); + } + setState({ + newsOpen: !state.newsOpen, + didNewsSlideIn: state.didNewsSlideIn || !state.newsOpen + }); + } + function onNewsOpen(...news) { + const unread = news.filter(({read}) => !read); + if (unread.length > 0) { + props.actions.markNewsAsRead(unread.map(({id}) => id)); + } + } + let displayedNewsCount = unreadNews.length; + if (unreadNews.length > 0) { + const latest = new Date(unreadNews[0].date); + const today = new Date(); + const newsWereLongTimeAgo = + latest.getTime() < today.getTime() - getDuration({days: 14}); + if (newsWereLongTimeAgo) { + displayedNewsCount = 0; + } + } + function toggleMoreToggleSettings() { + setState({moreToggleSettingsOpen: !state.moreToggleSettingsOpen}); + } + return m$1( + "body", + {class: {"ext-disabled": !props.data.isEnabled}}, + m$1(Loader$1, {complete: true}), + m$1(Header, { + data: props.data, + actions: props.actions, + onMoreToggleSettingsClick: toggleMoreToggleSettings + }), + m$1(TabPanel, { + activeTab: state.activeTab, + onSwitchTab: (tab) => setState({activeTab: tab}), + tabs: { + "Filter": m$1(FilterSettings, { + data: props.data, + actions: props.actions + }), + "Site list": m$1(SiteListSettings, { + data: props.data, + actions: props.actions, + isFocused: state.activeTab === "Site list" + }), + "More": m$1(MoreSettings, { + data: props.data, + actions: props.actions, + fonts: props.fonts + }) + }, + tabLabels: { + "Filter": getLocalMessage("filter"), + "Site list": getLocalMessage("site_list"), + "More": getLocalMessage("more") + } + }), + m$1( + "footer", + null, + m$1( + "div", + {class: "footer-links"}, + m$1( + "a", + { + class: "footer-links__link", + href: PRIVACY_URL, + target: "_blank", + rel: "noopener noreferrer" + }, + getLocalMessage("privacy") + ), + m$1( + "a", + { + class: "footer-links__link", + href: TWITTER_URL, + target: "_blank", + rel: "noopener noreferrer" + }, + "Twitter" + ), + m$1( + "a", + { + class: "footer-links__link", + href: GITHUB_URL, + target: "_blank", + rel: "noopener noreferrer" + }, + "GitHub" + ), + m$1( + "a", + { + class: "footer-links__link", + href: getHelpURL(), + target: "_blank", + rel: "noopener noreferrer" + }, + getLocalMessage("help") + ) + ), + m$1( + "div", + {class: "footer-buttons"}, + m$1( + "a", + { + class: "donate-link", + href: DONATE_URL, + target: "_blank", + rel: "noopener noreferrer" + }, + m$1( + "span", + {class: "donate-link__text"}, + getLocalMessage("donate") + ) + ), + m$1(NewsButton, { + active: state.newsOpen, + count: displayedNewsCount, + onClick: toggleNews + }), + m$1( + Button, + {onclick: openDevTools, class: "dev-tools-button"}, + "\uD83D\uDEE0 ", + getLocalMessage("open_dev_tools") + ) + ) + ), + m$1(NewsGroup, { + news: props.data.news, + expanded: state.newsOpen, + onNewsOpen: onNewsOpen, + onClose: toggleNews + }), + m$1(MoreToggleSettings, { + data: props.data, + actions: props.actions, + isExpanded: state.moreToggleSettingsOpen, + onClose: toggleMoreToggleSettings + }) + ); + } + var Body$1 = compose(Body, withState, withForms); + + function popupHasBuiltInBorders() { + return Boolean( + chromiumVersion && + !isVivaldi && + !isYaBrowser && + !isOpera && + isWindows && + compareChromeVersions(chromiumVersion, "62.0.3167.0") < 0 + ); + } + function popupHasBuiltInHorizontalBorders() { + return Boolean( + chromiumVersion && + !isVivaldi && + !isYaBrowser && + !isEdge && + !isOpera && + ((isWindows && + compareChromeVersions(chromiumVersion, "62.0.3167.0") >= + 0 && + compareChromeVersions(chromiumVersion, "74.0.0.0") < 0) || + (isMacOS && + compareChromeVersions(chromiumVersion, "67.0.3373.0") >= + 0 && + compareChromeVersions(chromiumVersion, "73.0.3661.0") < + 0)) + ); + } + function fixNotClosingPopupOnNavigation() { + document.addEventListener("click", (e) => { + if (e.defaultPrevented || e.button === 2) { + return; + } + let target = e.target; + while (target && !(target instanceof HTMLAnchorElement)) { + target = target.parentElement; + } + if (target && target.hasAttribute("href")) { + chrome.tabs.create({url: target.getAttribute("href")}); + e.preventDefault(); + { + window.close(); + } + } + }); + } + + function renderBody(data, fonts, actions) { + if (data.settings.previewNewDesign) { + if (!document.documentElement.classList.contains("preview")) { + document.documentElement.classList.add("preview"); + } + } else if (document.documentElement.classList.contains("preview")) { + document.documentElement.classList.remove("preview"); + } + if (data.news && data.news.length > 0) { + const latest = data.news[0]; + if (latest && !latest.displayed) { + actions.markNewsAsDisplayed([latest.id]); + } + } + sync( + document.body, + m$1(Body$1, {data: data, actions: actions, fonts: fonts}) + ); + } + async function start() { + const connector = new Connector(); + window.addEventListener("unload", () => connector.disconnect()); + const [data, fonts] = await Promise.all([ + connector.getData(), + getFontList() + ]); + renderBody(data, fonts, connector); + connector.subscribeToChanges((data) => + renderBody(data, fonts, connector) + ); + } + addEventListener("load", start); + document.documentElement.classList.toggle("mobile", isMobile); + document.documentElement.classList.toggle("firefox", isFirefox); + document.documentElement.classList.toggle( + "built-in-borders", + popupHasBuiltInBorders() + ); + document.documentElement.classList.toggle( + "built-in-horizontal-borders", + popupHasBuiltInHorizontalBorders() + ); + if (isFirefox) { + fixNotClosingPopupOnNavigation(); + } +})(); diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/popup/style.css b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/popup/style.css new file mode 100644 index 0000000..1369467 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/popup/style.css @@ -0,0 +1,2876 @@ +@font-face { + font-family: "Open Sans"; + src: url("../assets/fonts/OpenSans-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: "Open Sans"; + src: url("../assets/fonts/OpenSans-SemiBold.ttf") format("truetype"); + font-weight: bold; + font-style: normal; +} +@font-face { + font-family: "Open Sans"; + src: url("../assets/fonts/OpenSans-Light.ttf") format("truetype"); + font-weight: 100; + font-style: normal; +} +.button { + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: content-box; + color: #ffffff; + cursor: pointer; + display: inline-block; + height: 1.5rem; + line-height: 0.75rem; + min-width: 1.5rem; + outline: none; + overflow: hidden; + padding: 0; + text-align: center; + transition: background-color 250ms; + -moz-user-select: none; + user-select: none; +} +.button:hover { + background-color: #193945; + transition: background-color 125ms; +} +.button:active { + background-color: #316e7d; +} +.button__wrapper { + height: 100%; + width: 100%; +} +.checkbox { + align-items: stretch; + background-color: #141e24; + border: 0.125rem solid #316e7d; + cursor: pointer; + display: inline-flex; + flex: none; + flex-direction: row; + height: 1.5rem; + transition: background-color 250ms; + width: 1.5rem; +} +.checkbox:hover { + background-color: #193945; + transition: background-color 125ms; +} +.checkbox__input { + display: none; +} +.checkbox__checkmark { + display: inline-block; + height: 100%; + position: relative; + width: 1.5rem; +} +.checkbox__checkmark::before, +.checkbox__checkmark::after { + background-color: #316e7d; + content: ""; + display: inline-block; + height: 0.1875rem; + left: 0.1875rem; + position: absolute; + top: 0.6375rem; + transition: all 125ms; + width: 1.125rem; +} +.checkbox__checkmark::before { + transform: skewY(45deg); +} +.checkbox__checkmark::after { + transform: skewY(-45deg); +} +.checkbox__input:checked + .checkbox__checkmark::before, +.checkbox__input:checked + .checkbox__checkmark::after { + background-color: #ffffff; +} +.checkbox__input:checked + .checkbox__checkmark::before { + top: 0.825rem; + width: 0.375rem; +} +.checkbox__input:checked + .checkbox__checkmark::after { + left: 0.5625rem; + width: 0.75rem; +} +.dropdown { + display: inline-block; + height: 1.5rem; + position: relative; + -moz-user-select: none; + user-select: none; + width: 100%; +} +.dropdown__selected { + align-items: center; + background-color: #316e7d; + background-image: url('data:image/svg+xml;utf8,'); + background-position: center right 0.25rem; + background-repeat: no-repeat; + background-size: 1rem; + color: #ffffff; + display: inline-flex; + height: 1.25rem; + justify-content: center; + line-height: 1.25rem; + margin-top: 0.125rem; + position: absolute; + text-align: center; + width: 100%; +} +.dropdown__selected__text { + display: inline-block; + max-width: calc(100% - 2.5rem); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.dropdown__list { + background-color: #141e24; + border: 0.125rem solid #316e7d; + border-top: none; + box-shadow: 0 0 0.25rem black; + box-sizing: border-box; + display: none; + margin-top: 0.125rem; + overflow: hidden; + position: absolute; + width: 100%; +} +.dropdown__list__item { + align-items: center; + background-color: #141e24; + color: #ffffff; + display: inline-flex; + justify-content: center; + min-height: 1.25rem; + text-align: center; + width: 100%; +} +.dropdown__list__item:hover { + background-color: #193945; + transition: background-color 125ms; +} +.dropdown__list__item--selected { + overflow: hidden; + visibility: hidden; + white-space: nowrap; +} +.dropdown--open .dropdown__list { + display: inline-block; + margin-top: 0rem; + z-index: 1; +} +.dropdown--open .dropdown__list__item { + min-height: 1.5rem; +} +.dropdown--open .dropdown__selected { + height: 1.5rem; + margin-top: 0rem; + z-index: 2; +} +.preview .dropdown { + cursor: pointer; +} +.message-box { + background-color: #141e24; + border-bottom: 0.125rem solid #316e7d; + border-top: 0.125rem solid #316e7d; + display: flex; + flex-direction: column; + padding: 0.75rem; +} +.message-box__caption { + text-align: center; +} +.message-box__buttons { + display: flex; + flex-direction: row; + justify-content: center; + margin-top: 0.5rem; +} +.message-box__button { + min-width: 4rem; +} +.message-box__button:not(:first-child) { + margin-left: 0.5rem; +} +.message-box__button-ok { + border-color: gray; +} +.multi-switch { + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: content-box; + color: #ffffff; + display: inline-flex; + height: 1.5rem; + position: relative; + -moz-user-select: none; + user-select: none; +} +.multi-switch__option { + align-items: center; + cursor: pointer; + display: inline-flex; + justify-content: center; + height: 100%; + overflow: hidden; + position: relative; + transition: background-color 250ms; + white-space: nowrap; + width: 50%; +} +.multi-switch__option:hover:not(.multi-switch__option--selected) { + background-color: #193945; +} +.multi-switch__highlight { + background-color: #316e7d; + display: inline-block; + height: 100%; + left: 0; + position: absolute; + top: 0; + transition: left 125ms, width 125ms; + width: 0; +} +.overlay { + align-items: center; + background-color: rgba(20, 30, 36, 0.5); + flex-direction: column; + display: inline-flex; + height: 100%; + justify-content: center; + left: 0; + position: fixed; + top: 0; + width: 100%; + z-index: 2; +} +.overlay:empty { + display: none; +} +.shortcut { + color: #53a1b3; + cursor: pointer; + display: inline-block; + font-size: 0.625rem; + line-height: 0.875rem; + outline: none; + text-align: center; + text-decoration: none; + white-space: pre; +} +.shortcut:hover { + text-decoration: underline; +} +.shortcut--edit { + color: #ffffff; +} +.shortcut::before { + content: "✎"; + direction: rtl; + display: inline-block; + line-height: 0.875rem; + visibility: hidden; + width: 0; +} +.shortcut:hover::before, +.shortcut--edit::before { + visibility: visible; +} +.tab-panel { + align-items: stretch; + display: flex; + flex-direction: column; + min-height: 0; +} +.tab-panel__button { + border-bottom: 0.125rem solid #316e7d; + border-left: none; + border-right: none; + border-top: none; + box-sizing: border-box; + color: #316e7d; + font-size: 0.875rem; + font-weight: bold; + height: 1.625rem; + padding: 0 0.625rem; + white-space: pre; +} +.tab-panel__button:hover { + color: #53a1b3; +} +.tab-panel__button:active { + background-color: #193945; +} +.tab-panel__button--active { + border-bottom: none; + border-left: 0.125rem solid #316e7d; + border-right: 0.125rem solid #316e7d; + border-top: 0.125rem solid #316e7d; + color: #e96c4c; + padding: 0 0.5rem; +} +.tab-panel__button--active:hover { + color: #e96c4c; +} +.tab-panel__buttons { + display: flex; + flex: none; + flex-direction: row; + justify-content: center; +} +.tab-panel__buttons::before, +.tab-panel__buttons::after { + border-bottom: 0.125rem solid #316e7d; + content: ""; + flex: auto; +} +.tab-panel__tabs { + display: flex; + flex: auto; + flex-direction: row; + margin-top: 0.75rem; + min-height: 0; +} +.tab-panel__tab { + background-color: #141e24; + display: flex; + opacity: 0; + overflow: hidden; + pointer-events: none; + transition: width 250ms, opacity 125ms; + width: 0; +} +.tab-panel__tab--active { + opacity: 1; + pointer-events: all; + transition: width 250ms, opacity 250ms; + width: 100%; +} +.select { + display: inline-flex; + flex-direction: column; + position: relative; +} +.select__line { + display: inline-flex; + flex-direction: row; +} +.select__textbox.textbox { + border-right: none; + flex: auto; + width: 100%; +} +.select__expand { + border-left: none; + flex: none; +} +.select__expand__icon { + display: inline-block; + height: 100%; + position: relative; + width: 100%; +} +.select__expand__icon::before, +.select__expand__icon::after { + background-color: #ffffff; + content: ""; + display: inline-block; + height: 0.1875rem; + position: absolute; + top: 0.75rem; + width: 0.5625rem; + z-index: 1; +} +.select__expand__icon::before { + left: 0.1875rem; + transform: skewY(45deg); +} +.select__expand__icon::after { + left: 0.75rem; + transform: skewY(-45deg); +} +.select__list { + background-color: #141e24; + border-bottom: 0.125rem solid #316e7d; + border-left: 0.125rem solid #316e7d; + border-right: 0.125rem solid #316e7d; + box-sizing: border-box; + left: 0; + max-height: 0; + overflow-x: hidden; + overflow-y: auto; + position: absolute; + top: calc(100% - 0.125rem); + transition: max-height 125ms; + width: 100%; + z-index: 999; +} +.select__list--expanded { + max-height: 12rem; + transition: max-height 500ms; +} +.select__list--short { + overflow: hidden; +} +.select__option { + align-items: center; + background-color: #141e24; + cursor: pointer; + display: flex; + flex: none; + height: 1.5rem; + flex-direction: row; + padding-left: 0.375rem; +} +.select__option:hover { + background-color: #193945; +} +.slider { + display: inline-block; + height: 1.5rem; + position: relative; + width: 100%; +} +.slider__track { + background-color: #193945; + display: inline-block; + height: 0.625rem; + margin-left: 0.25rem; + margin-top: 0.4375rem; + position: absolute; + width: calc(100% - 0.5rem); +} +.slider__track__fill { + background-color: #316e7d; + display: inline-block; + height: 100%; + position: absolute; +} +.slider__track__fill::before { + background-color: #316e7d; + content: ""; + height: 100%; + position: absolute; + right: 100%; + width: 0.25rem; +} +.slider__track::before, +.slider__track::after { + background-color: #193945; + content: ""; + height: 100%; + position: absolute; + width: 0.25rem; +} +.slider__track::before { + right: 100%; +} +.slider__track::after { + left: 100%; +} +.slider__thumb-wrapper { + margin-left: 0.25rem; + position: absolute; + width: calc(100% - 0.5rem); +} +.slider__thumb { + background-color: #ffffff; + cursor: pointer; + display: inline-block; + height: 1.25rem; + margin-left: -0.25rem; + margin-top: 0.125rem; + position: absolute; + width: 0.5rem; +} +.slider__thumb__value { + color: #ffffff; + cursor: default; + left: calc(100% + 0.75rem / 2); + line-height: 1.25rem; + position: absolute; + -moz-user-select: none; + user-select: none; +} +.slider__thumb__value--flip { + left: initial; + right: calc(100% + 0.75rem / 2); +} +.slider--active .slider__thumb { + box-shadow: 0 0 0.25rem black; + height: 1.5rem; + margin-top: 0rem; +} +.slider--active .slider__thumb__value { + line-height: 1.5rem; +} +.slider--active .slider__track { + height: 0.75rem; + margin-top: 0.375rem; +} +.text-list { + border-top: 0.125rem solid #316e7d; + margin-bottom: 0.0625rem; + min-width: 1.5rem; + overflow-x: hidden; + overflow-y: auto; +} +.text-list__textbox.textbox { + border-bottom: 0.0625rem solid #316e7d; + border-left: 0.125rem solid #316e7d; + border-right: 0.125rem solid #316e7d; + border-top: none; + box-sizing: border-box; + flex: none; + height: 1.5625rem; + width: 100%; +} +.text-list__textbox.textbox:last-child { + border-bottom: 0.125rem solid #316e7d; +} +.text-list::-webkit-scrollbar { + width: 1.25rem; +} +.text-list::-webkit-scrollbar-thumb { + border-left: 0.5rem solid #141e24; +} +.textbox { + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: content-box; + color: #53a1b3; + height: 1.5rem; + line-height: 1.5rem; + outline: none; + overflow: hidden; + padding: 0; + text-indent: 0.375rem; + transition: background-color 250ms; +} +.textbox:hover, +.textbox:focus { + background-color: #193945; + transition: background-color 125ms; +} +.textbox:focus { + color: #ffffff; +} +.textbox::placeholder { + color: #316e7d; +} +input[type="time"]::-webkit-calendar-picker-indicator { + filter: invert(54%) sepia(3%) saturate(3931%) hue-rotate(153deg) + brightness(115%) contrast(75%); +} +.time-range-picker { + display: inline-flex; + flex: auto; +} +.time-range-picker__input { + text-align: center; + text-indent: 0; + width: 100%; + background-color: #141e24; +} +.time-range-picker__input--start { + border-right: none; +} +.time-range-picker__input--end { + border-left: 0.0625rem solid #316e7d; +} +.toggle { + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: content-box; + color: #ffffff; + display: inline-flex; + height: 1.5rem; + position: relative; + -moz-user-select: none; + user-select: none; +} +.toggle__btn { + align-items: center; + cursor: pointer; + display: inline-flex; + justify-content: center; + height: 100%; + overflow: hidden; + position: relative; + transition: background-color 250ms; + white-space: nowrap; + width: 50%; +} +.toggle__btn:hover:not(.toggle__btn--active) { + background-color: #193945; +} +.toggle::before { + background-color: #316e7d; + content: ""; + display: inline-block; + height: 100%; + left: 50%; + position: absolute; + top: 0; + transition: left 125ms; + width: 50%; +} +.toggle--checked::before { + left: 0; +} +.updown { + align-items: stretch; + display: flex; + flex-direction: column; + -moz-user-select: none; + user-select: none; +} +.updown__line { + display: flex; + flex-direction: row; +} +.updown__line > :not(:first-child) { + margin-left: 0.5rem; +} +.updown__icon { + display: inline-block; + height: 100%; + position: relative; + width: 100%; +} +.updown__icon::before, +.updown__icon::after { + background-color: #ffffff; + content: ""; + display: inline-block; + height: 0.5625rem; + position: absolute; + width: 0.1875rem; +} +.updown__icon::before { + top: 0.1875rem; +} +.updown__icon::after { + top: 0.75rem; +} +.updown__icon-up::before { + left: 0.75rem; + transform: skewX(45deg); +} +.updown__icon-up::after { + left: 0.75rem; + transform: skewX(-45deg); +} +.updown__icon-down::before { + left: 0.5625rem; + transform: skewX(-45deg); +} +.updown__icon-down::after { + left: 0.5625rem; + transform: skewX(45deg); +} +.updown__button--disabled { + pointer-events: none; +} +.updown__button--disabled:hover, +.updown__button--disabled:active { + background-color: #141e24; +} +.updown__button--disabled .updown__icon::before, +.updown__button--disabled .updown__icon::after { + background-color: #316e7d; +} +.updown__value-text { + font-size: 0.625rem; + line-height: 0.875rem; + text-align: center; + white-space: nowrap; +} +.track { + align-items: center; + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: content-box; + display: inline-flex; + flex: auto; + flex-direction: row; + height: 1.5rem; + justify-content: center; + overflow: hidden; + position: relative; + transition: background-color 250ms; + -moz-user-select: none; + user-select: none; +} +.track:hover { + background-color: #193945; + transition: background-color 125ms; +} +.track--clickable { + cursor: pointer; +} +.track__value { + background-color: #316e7d; + height: 100%; + left: 0; + position: absolute; + top: 0; + transition: width 125ms; +} +.track__label { + color: #ffffff; + display: inline-block; + line-height: 0.75rem; + pointer-events: none; + position: relative; + white-space: nowrap; + z-index: 1; +} +.hsb-picker { + display: flex; + flex-direction: row; + padding: 0.5rem; + touch-action: none; +} +.hsb-picker__sb-container { + cursor: pointer; + height: 7.5rem; + position: relative; + -webkit-tap-highlight-color: transparent; + width: 7.5rem; +} +.hsb-picker__hue-container { + cursor: pointer; + height: 7.5rem; + margin-left: 0.5rem; + position: relative; + -webkit-tap-highlight-color: transparent; + width: 0.75rem; +} +.hsb-picker__sb-canvas { + height: 100%; + width: 100%; +} +.hsb-picker__hue-canvas { + height: 100%; + width: 100%; +} +.hsb-picker__hue-cursor, +.hsb-picker__sb-cursor { + border-radius: 50%; + box-shadow: 0 0 0 0.125rem #ffffff; + display: inline-block; + height: 0.75rem; + margin-top: -0.375rem; + position: absolute; + width: 0.75rem; + z-index: 2; +} +.hsb-picker__sb-cursor { + margin-left: -0.375rem; +} +.color-picker { + height: 1.5rem; + position: relative; + width: 100%; +} +.color-picker__wrapper { + background-color: #141e24; + display: inline-flex; + flex-direction: column; + left: 0; + overflow: hidden; + position: absolute; + top: 0; + width: 100%; +} +.color-picker--focused .color-picker__wrapper { + border: 0.125rem solid #316e7d; + box-sizing: border-box; + z-index: 1; +} +.color-picker__input { + background-color: #316e7d; + border: none; + box-sizing: border-box; + color: #ffffff; + height: 1.25rem; + margin-top: 0.125rem; + text-align: center; + width: 100%; +} +.color-picker--focused .color-picker__input { + margin-top: 0; +} +.color-picker__preview { + cursor: pointer; + display: inline-block; + height: 1rem; + left: 0.25rem; + position: absolute; + top: 0.25rem; + width: 1rem; +} +.color-picker--focused .color-picker__preview { + left: 0.125rem; + top: 0.125rem; +} +.color-picker__reset { + background-image: url('data:image/svg+xml;utf8,'); + background-position: 0 0; + background-repeat: no-repeat; + background-size: 1rem; + cursor: pointer; + display: inline-block; + height: 1rem; + position: absolute; + right: 0.25rem; + top: 0.25rem; + width: 1rem; +} +.color-picker--focused .color-picker__reset { + right: 0.125rem; + top: 0.125rem; +} +.color-picker__textbox-line { + width: 100%; +} +.color-picker__hsb-line { + display: none; + width: 100%; +} +.color-picker--focused .color-picker__hsb-line { + border-color: #316e7d; + display: block; +} +.color-dropdown { + height: 1.5rem; + position: relative; + width: 100%; +} +.color-dropdown__options { + width: 100%; +} +.color-dropdown__picker { + height: 100%; + position: absolute; + right: 0; + top: 0; + width: 100%; +} +.color-dropdown__picker--hidden { + display: none; +} +.nav-button { + background-image: url('data:image/svg+xml;utf8,'); + background-position: center right 0.25rem; + background-repeat: no-repeat; + background-size: 1rem; + width: calc(100% - 2 * 0.125rem); +} +.nav-button__content { + align-items: center; + display: inline-flex; + flex-direction: row; + height: 100%; +} +.reset-button { + width: calc(100% - 2 * 0.125rem); +} +.reset-button__content { + align-items: center; + display: inline-flex; + flex-direction: row; + height: 100%; +} +.reset-button__icon { + background-image: url('data:image/svg+xml;utf8,'); + background-position: 0 0; + background-size: 1rem; + display: inline-block; + height: 1rem; + margin-right: 0.125rem; + width: 1rem; +} +html { + background-color: #141e24; + color: #53a1b3; + color-scheme: dark; + font-family: Open Sans, Segoe UI, Helvetica Neue, Ubuntu, sans-serif; + font-size: 16px; +} +body { + font-family: Open Sans, Segoe UI, Helvetica Neue, Ubuntu, sans-serif; + font-size: 0.75rem; +} +input, +button { + font-family: Open Sans, Segoe UI, Helvetica Neue, Ubuntu, sans-serif; + font-size: 0.75rem; +} +::-moz-selection { + background-color: #e96c4c; + color: #ffffff; +} +::selection { + background-color: #e96c4c; + color: #ffffff; +} +::-webkit-scrollbar { + background-color: #141e24; + width: 0.75rem; +} +::-webkit-scrollbar-thumb { + background-color: #193945; +} +::-webkit-scrollbar-thumb:hover { + background-color: #255461; +} +::-webkit-scrollbar-thumb:active { + background-color: #316e7d; +} +::-webkit-scrollbar-corner { + background-color: #141e24; +} +* { + scrollbar-color: #193945 #141e24; +} +.custom-settings-toggle { + color: #53a1b3; + white-space: normal; +} +.custom-settings-toggle--checked, +.custom-settings-toggle:active, +.custom-settings-toggle--checked:hover { + background-color: #316e7d; + color: #75b4c2; + transition: background-color 125ms, color 125ms; +} +.custom-settings-toggle--disabled { + opacity: 0.5; + pointer-events: none; +} +.custom-settings-toggle__url { + color: #ffffff; + -moz-user-select: none; + user-select: none; +} +.custom-settings-toggle .button__wrapper { + align-items: center; + display: inline-flex; + justify-content: center; + min-width: 14.75rem; +} +.engine-switch { + align-items: stretch; + display: flex; + flex-direction: column; + position: relative; +} +.engine-switch__description { + font-size: 0.625rem; + line-height: 0.875rem; + text-align: center; + white-space: nowrap; +} +.engine-switch__css-edit-button { + background-color: #e96c4c; + border-radius: 0.4375rem; + color: #ffffff; + cursor: pointer; + display: none; + font-size: 0.625rem; + line-height: 0.875rem; + min-width: 0.875rem; + position: absolute; + right: 25%; + text-align: center; + top: -0.21875rem; +} +.engine-switch__css-edit-button_active { + display: inline-block; +} +.engine-switch__css-edit-button::before { + content: "✎"; + line-height: 0.875rem; +} +.engine-switch__css-edit-button:hover { + box-shadow: 0 0 0.75rem #ffffff; +} +.filter-settings { + align-items: stretch; + display: flex; + flex-direction: column; + width: 100%; +} +.filter-settings > :not(:first-child) { + margin-top: 0.5rem; +} +.mode-toggle { + align-items: stretch; + display: flex; + flex-direction: column; + -moz-user-select: none; + user-select: none; +} +.mode-toggle__line { + display: flex; + flex-direction: row; +} +.mode-toggle__line > :not(:first-child) { + margin-left: 0.5rem; +} +.mode-toggle .toggle { + flex: auto; +} +.mode-toggle__label { + font-size: 0.625rem; + line-height: 0.875rem; + text-align: center; +} +.mode-toggle__button--active { + background: #316e7d; +} +.mode-toggle__button--active:hover { + background: #316e7d; +} +.icon { + background-size: contain; + display: inline-block; + height: 100%; + width: 100%; +} +.icon--dark-mode { + background-image: url(../assets/images/mode-dark-32.svg); +} +.icon--light-mode { + background-image: url(../assets/images/mode-light-32.svg); +} +.font-settings { + display: flex; + flex-direction: column; + width: 100%; +} +.font-settings__font-select-container { + display: flex; + flex-direction: column; +} +.font-settings__font-select-container__line { + display: flex; + flex-direction: row; +} +.font-settings__font-select-container__line > :not(:first-child) { + margin-left: 0.5rem; +} +.font-settings__font-select-container__line .select { + flex: auto; +} +.font-settings__font-select-container__label { + font-size: 0.625rem; + line-height: 0.875rem; + text-align: center; + white-space: nowrap; +} +.font-settings > :not(:first-child) { + margin-top: 0.5rem; +} +.header { + display: grid; + grid: "logo logo" "site-toggle app-toggle" / 5.5fr 4.5fr; + grid-gap: 0.5rem; + width: 100%; +} +.header__logo { + background-image: url("../assets/images/darkreader-type.svg"); + background-size: 100%; + grid-area: logo; + height: 1.5rem; + outline: none; + text-indent: -999rem; + width: 15rem; +} +.header__logo:hover { + filter: brightness(1.05); +} +.header__control { + display: flex; + flex-direction: column; +} +.header__site-toggle { + grid-area: site-toggle; + min-width: 0; +} +.header__site-toggle__unable-text { + color: #e96c4c; + display: inline-block; + font-size: 0.625rem; + line-height: 0.875rem; + text-align: center; + white-space: pre; +} +.header__app-toggle { + grid-area: app-toggle; + min-width: 0; + position: relative; +} +.header__app-toggle__more-button { + background-color: #141e24; + color: #53a1b3; + cursor: pointer; + display: inline-block; + height: 1.75rem; + left: 100%; + opacity: 0.7; + position: absolute; + top: 0; + transition: opacity 250ms, background-color 250ms, color 250ms; + width: 0.75rem; +} +.header__app-toggle__more-button:hover { + background-color: #193945; + color: #ffffff; +} +.header__app-toggle__more-button::before { + content: "⋮"; + display: inline-block; + font-size: 0.875rem; + font-weight: bold; + height: 100%; + line-height: 1.5rem; + text-align: center; + width: 100%; +} +.header__app-toggle:hover .header__app-toggle__more-button { + opacity: 1; + transition: opacity 250ms 500ms, background-color 250ms, color 250ms; +} +.header__app-toggle:hover .header__app-toggle__more-button:hover { + transition: opacity 250ms, background-color 250ms, color 250ms; +} +.header__app-toggle__time { + background-color: #e96c4c; + border-radius: 50%; + color: #ffffff; + cursor: pointer; + display: none; + height: 0.875rem; + pointer-events: none; + position: absolute; + right: -0.21875rem; + top: -0.21875rem; + transition: opacity 250ms 250ms; + width: 0.875rem; +} +.header__app-toggle__time--active { + display: inline-block; +} +.header__app-toggle__more-settings { + background-color: rgba(20, 30, 36, 0.9); + border-bottom: 0.125rem solid #316e7d; + border-top: 0.125rem solid #316e7d; + display: flex; + flex-direction: column; + height: 11.875rem; + left: 0; + position: absolute; + top: 4.625rem; + transition: all 250ms; + width: 100%; + z-index: 999; +} +.header__app-toggle__more-settings:not(.header__app-toggle__more-settings--expanded) { + border-bottom-width: 0; + border-top-width: 0; + height: 0; + opacity: 0; + pointer-events: none; +} +.header__app-toggle__more-settings:not(.header__app-toggle__more-settings--expanded) + .header__app-toggle__more-settings__content { + padding-bottom: 0; + padding-top: 0; +} +.header__app-toggle__more-settings:not(.header__app-toggle__more-settings--expanded) + .header__app-toggle__more-settings::after { + height: 0; +} +.header__app-toggle__more-settings__top { + align-items: flex-end; + color: #e96c4c; + display: flex; + flex: auto; + font-size: 0.875rem; + height: 1.5rem; + justify-content: space-between; + overflow: hidden; + padding-left: 1rem; +} +.header__app-toggle__more-settings__top__text { + line-height: 1rem; +} +.header__app-toggle__more-settings__top__close { + color: #e96c4c; + cursor: pointer; + display: inline-block; + font-size: 1.125rem; + height: 1.5rem; + line-height: 1.5rem; + text-align: center; + user-select: none; + width: 1.5rem; +} +.header__app-toggle__more-settings__top__close:hover { + background-color: rgba(49, 110, 125, 0.25); +} +.header__app-toggle__more-settings__content { + flex: auto; + overflow: hidden; + padding: 0.75rem 1rem; + transition: padding 250ms; +} +.header__app-toggle__more-settings__line { + display: flex; + flex-direction: row; +} +.header__app-toggle__more-settings__line .checkbox { + border-right: none; + flex: none; +} +.header__app-toggle__more-settings__line + .time-range-picker + .time-range-picker__input--start { + border-left: 0.0625rem solid #316e7d; +} +.header__app-toggle__more-settings__description { + font-size: 0.625rem; + line-height: 0.875rem; + margin: 0; + text-align: center; + white-space: nowrap; +} +.header__app-toggle__more-settings__location-description { + font-size: 0.625rem; + line-height: 0.875rem; + margin: 0; + text-align: center; + white-space: nowrap; +} +.header__app-toggle__more-settings::after { + background-image: linear-gradient( + to bottom, + rgba(20, 30, 36, 0.9), + rgba(20, 30, 36, 0) + ); + content: ""; + display: block; + height: 1.5rem; + left: 0; + margin-top: 0.125rem; + pointer-events: none; + position: absolute; + top: 100%; + transition: height 250ms; + width: 100%; +} +.header__app-toggle__more-settings__location { + margin-top: 0.5rem; +} +.header__app-toggle__more-settings__location__latitude, +.header__app-toggle__more-settings__location__longitude { + flex: auto; + text-align: center; + text-indent: 0; + width: 100%; +} +.header__app-toggle__more-settings__location__latitude { + border-left: 0.0625rem solid #316e7d; + border-right: none; +} +.header__app-toggle__more-settings__location__longitude { + border-left: 0.0625rem solid #316e7d; +} +.header__app-toggle__more-settings__system-dark-mode { + display: flex; + flex-direction: row; + margin-top: 0.5rem; +} +.header__app-toggle__more-settings__system-dark-mode__checkbox { + flex: none; +} +.header__app-toggle__more-settings__system-dark-mode__button { + border-left-width: 0.0625rem; + flex: auto; +} +.header__app-toggle__more-settings__system-dark-mode__button:not(.header__app-toggle__more-settings__system-dark-mode__button--active) { + color: #53a1b3; +} +.header__app-toggle__more-settings__system-dark-mode:hover + .header__app-toggle__more-settings__system-dark-mode__button, +.header__app-toggle__more-settings__system-dark-mode:hover + .header__app-toggle__more-settings__system-dark-mode__checkbox { + background-color: #193945; +} +.header .shortcut { + overflow: hidden; +} +.loader { + background-color: #141e24; + height: 32rem; + left: 50%; + pointer-events: none; + position: fixed; + top: 50%; + transform: translate(-50%, -50%); + transition: background-color 125ms ease-out; + width: 17rem; + z-index: 999; +} +.loader--complete { + background-color: rgba(20, 30, 36, 0); +} +.loader--complete::before { + opacity: 0; + transition: opacity 125ms ease-in; +} +.loader--transition-end { + display: none; +} +.loader::before { + animation: 2s loading-slide 500ms ease-in-out infinite, + 4s 500ms loading-color linear infinite; + background-color: #316e7d; + content: ""; + display: block; + height: 0.0625rem; + left: 0%; + position: absolute; + top: 3rem; + width: 0%; +} +.loader__message { + animation: 125ms loading-fade-in 500ms ease-in forwards; + color: #e96c4c; + font-size: 0.625rem; + opacity: 0; + position: absolute; + right: 1rem; + bottom: 29rem; +} +.loader__error { + font-size: 0.75rem; +} +.loader--complete .loader__message { + color: rgba(233, 108, 76, 0); + transition: color 125ms ease-out; +} +@keyframes loading-slide { + 0% { + left: 0%; + width: 0%; + } + 50% { + left: 0%; + width: 100%; + } + 100% { + left: 100%; + width: 0%; + } +} +@keyframes loading-color { + 0%, + 49% { + background-color: #316e7d; + } + 50%, + 100% { + background-color: #e96c4c; + } +} +@keyframes loading-fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +.more-settings { + display: flex; + flex-direction: column; + width: 100%; +} +.more-settings__description { + font-size: 0.625rem; + line-height: 0.875rem; + margin: 0 0 0.125rem 0; + min-width: 100%; + overflow: hidden; + text-align: center; + white-space: pre; +} +.more-settings__description--warning { + color: #e96c4c; +} +.more-settings__section { + align-items: stretch; + display: flex; + flex-direction: column; +} +.more-settings__section:not(:first-child) { + margin-top: 0.75rem; +} +.news { + bottom: 2.625rem; + box-sizing: border-box; + display: flex; + flex-direction: column; + left: 0; + max-height: 0; + opacity: 0; + overflow: hidden; + pointer-events: none; + position: absolute; + text-align: left; + transition: all 250ms; + width: 100%; + z-index: 1; +} +.news--expanded { + max-height: 12rem; + opacity: 1; + pointer-events: initial; +} +.news::before { + background-image: linear-gradient(to top, #141e24, rgba(20, 30, 36, 0)); + content: ""; + display: block; + height: 1.5rem; + pointer-events: none; + width: 100%; +} +.news__header { + align-items: flex-end; + background-image: linear-gradient( + to bottom, + rgba(20, 30, 36, 0.9), + rgba(20, 30, 36, 0.95) + ); + border-top: 0.125rem solid #316e7d; + color: #e96c4c; + display: flex; + flex: none; + font-size: 0.875rem; + height: 1.5rem; + justify-content: space-between; + padding-left: 1rem; +} +.news__header__text { + line-height: 1rem; +} +.news__close { + color: #e96c4c; + cursor: pointer; + display: inline-block; + font-size: 1.125rem; + height: 1.5rem; + line-height: 1.5rem; + text-align: center; + user-select: none; + width: 1.5rem; +} +.news__close:hover { + background-color: rgba(49, 110, 125, 0.25); +} +.news__list { + background-color: rgba(20, 30, 36, 0.95); + border-bottom: 0.125rem solid #316e7d; + flex: auto; + padding: 0.75rem 1rem; + position: relative; +} +.news__list > :not(:first-child) { + margin-top: 0.5rem; +} +.news__event { + color: #53a1b3; + display: block; + flex: none; + position: relative; +} +.news__event__date { + display: block; + font-size: 0.625rem; +} +.news__event__link { + color: inherit; + display: inline-block; + text-decoration: none; +} +.news__event__link:hover { + text-decoration: underline; +} +.news__event__icon { + background-position: center; + background-repeat: no-repeat; + background-size: contain; + display: inline-block; + height: 2.5rem; + left: 0; + position: absolute; + top: calc(50% - 2.5rem / 2); + width: 2.5rem; +} +.news__event--has-icon { + padding-left: 3rem; +} +.news__event--unread { + font-weight: bold; +} +.news__event--unread:first-child { + color: #e96c4c; +} +.news__event--important { + color: #e96c4c; +} +.news__event--important.news__event--unread::before { + background-color: #e96c4c; + content: ""; + height: 100%; + position: absolute; + right: calc(100% + 0.75rem / 2); + text-align: center; + top: 0; + width: 0.125rem; +} +.news__read-more { + color: inherit; + display: block; + text-decoration: none; +} +.news__read-more:hover { + text-decoration: underline; +} +.news__read-more--unread { + font-weight: bold; +} +.news-button { + overflow: visible; + position: relative; +} +.news-button--active { + border-top: none; + padding-top: 0.125rem; + z-index: 2; +} +.news-button::after { + background-color: #e96c4c; + border-radius: 0.4375rem; + color: #ffffff; + content: attr(data-count); + font-size: 0.625rem; + line-height: 0.875rem; + min-width: 0.875rem; + position: absolute; + right: -0.29166667rem; + top: -0.29166667rem; + z-index: 3; +} +.site-list-settings { + align-items: stretch; + display: flex; + flex-direction: column; + min-height: 0; + width: 100%; +} +.site-list-settings__toggle { + border-bottom: none; + flex: none; +} +.site-list-settings__shortcut { + flex: none; + white-space: nowrap; +} +.site-list-settings__text-list { + flex: initial; +} +.site-toggle { + color: #53a1b3; + white-space: normal; +} +.site-toggle--disabled { + opacity: 0.5; + pointer-events: none; +} +.site-toggle__mark svg { + fill: currentColor; + height: 0.75rem; + vertical-align: bottom; + width: 0.75rem; +} +.site-toggle--active { + color: #ffffff; +} +body { + align-items: stretch; + box-sizing: content-box; + display: flex; + flex-direction: column; + height: 30rem; + margin: 0 auto; + padding: 1rem; + position: relative; + width: 15rem; +} +.header { + flex: none; +} +.tab-panel { + flex: auto; + margin-top: 0.75rem; +} +footer { + align-items: stretch; + display: flex; + flex: none; + flex-direction: column; + justify-content: center; + margin-top: 0.75rem; +} +footer p { + margin: 0 0 0.125rem 0; + text-align: center; + white-space: pre; +} +.footer-links { + align-items: stretch; + display: flex; + flex: none; + justify-content: center; + margin-bottom: 0.5rem; +} +.footer-links__link { + color: #53a1b3; + line-height: 1rem; + text-align: center; + text-decoration: none; +} +.footer-links__link:hover { + text-decoration: underline; +} +.footer-links > :not(:first-child) { + margin-left: 0.5rem; +} +.footer-buttons { + align-items: stretch; + display: flex; + flex-direction: row; + justify-content: stretch; + width: 100%; +} +.footer-buttons > * { + flex: auto; +} +.footer-buttons > :not(:first-child) { + margin-left: 0.5rem; +} +.donate-link { + align-items: center; + background-color: #316e7d; + color: #ffffff; + cursor: pointer; + display: inline-flex; + justify-content: center; + margin: 0; + position: relative; + text-decoration: none; + transition: all 125ms; +} +.donate-link:hover { + box-shadow: 0 0 0.75rem #316e7d; +} +.donate-link__text { + font-weight: bold; + line-height: 1.5rem; + transform: skewX(-10deg); +} +.donate-link::after { + background-image: url(../assets/images/ladybug-32.svg); + background-size: contain; + content: ""; + display: inline-block; + height: 0.75rem; + left: 0; + position: absolute; + top: -0.875rem; + width: 1.5rem; +} +.donate-link:hover::after { + filter: drop-shadow(0 0 0.125rem #e96c4c); +} +.dev-tools-button { + overflow: visible; + position: relative; +} +.ext-disabled .site-toggle--disabled { + opacity: 1; +} +.ext-disabled .header__site-toggle, +.ext-disabled .tab-panel { + opacity: 0.5; + pointer-events: none; +} +.ext-disabled .tab-panel__tab--active { + pointer-events: none; +} +body { + border: 2px solid white; +} +.overlay { + height: calc(100% - 4px); + left: 2px; + top: 2px; + width: calc(100% - 4px); +} +.built-in-horizontal-borders body { + border-bottom: none; + border-top: none; +} +.built-in-horizontal-borders .overlay { + height: 100%; + top: 0; +} +.built-in-borders body { + border: none; +} +.built-in-borders .overlay { + height: 100%; + left: 0; + top: 0; + width: 100%; +} +.mobile body { + border: none; + height: auto; + position: relative; +} +.mobile .m-section, +.preview .m-section { + width: 100%; +} +.mobile .m-section:not(:first-child), +.preview .m-section:not(:first-child) { + margin-top: 0.75rem; +} +.mobile .m-section > :not(:first-child), +.preview .m-section > :not(:first-child) { + margin-top: 0.5rem; +} +.mobile .pages-section, +.preview .pages-section { + height: 24.4375rem; +} +.mobile .m-logo, +.preview .m-logo { + background-image: url("../assets/images/darkreader-type.svg"); + background-position: center; + background-size: 100%; + display: inline-block; + grid-area: logo; + height: 1.5rem; + margin: 0 auto; + outline: none; + text-indent: -999rem; + width: 15rem; +} +.mobile .m-help-button, +.preview .m-help-button { + align-items: center; + background-image: url('data:image/svg+xml;utf8,'); + background-position: center right 0.25rem; + background-repeat: no-repeat; + background-size: 1rem; + border: 0.125rem solid #316e7d; + display: inline-flex; + justify-content: center; + height: 1.5rem; + text-decoration: none; + width: calc(100% - 2 * 0.125rem); +} +.mobile .m-help-button:hover, +.preview .m-help-button:hover { + background-color: #193945; + transition: background-color 125ms; +} +.mobile .m-help-button__text, +.preview .m-help-button__text { + color: #ffffff; + display: inline-block; + line-height: 1.5rem; + height: 1.5rem; + -moz-user-select: none; + user-select: none; +} +.mobile .m-help-button__text::before, +.preview .m-help-button__text::before { + border: 0.0625rem solid #ffffff; + border-radius: 50%; + color: #ffffff; + content: "?"; + display: inline-block; + font-weight: bold; + height: 0.875rem; + left: 0; + line-height: 0.875rem; + margin-right: 0.25rem; + text-align: center; + top: 0; + width: 0.875rem; +} +.mobile .m-donate-group, +.preview .m-donate-group { + align-items: stretch; + display: flex; + flex-direction: column; +} +.mobile .m-donate-button, +.preview .m-donate-button { + align-items: center; + background-color: #316e7d; + display: inline-flex; + height: 1.75rem; + isolation: isolate; + justify-content: center; + text-decoration: none; + position: relative; + width: 100%; +} +.mobile .m-donate-button__text, +.preview .m-donate-button__text { + color: #ffffff; + display: inline-block; + font-weight: bold; + height: 1.5rem; + line-height: 1.5rem; + text-transform: uppercase; + transform: skewX(-10deg); + -moz-user-select: none; + user-select: none; +} +.mobile .m-donate-button__icon, +.preview .m-donate-button__icon { + isolation: isolate; +} +.mobile .m-donate-button__icon::before, +.preview .m-donate-button__icon::before, +.mobile .m-donate-button__icon::after, +.preview .m-donate-button__icon::after { + border-radius: 50%; + content: ""; + display: inline-block; + height: 1rem; + mix-blend-mode: screen; + position: absolute; + top: 0.375rem; + width: 1rem; +} +.mobile .m-donate-button__icon::before, +.preview .m-donate-button__icon::before { + background-color: #e96c4c; + left: 0.375rem; +} +.mobile .m-donate-button__icon::after, +.preview .m-donate-button__icon::after { + background-color: #53a1b3; + left: 1rem; +} +.mobile .m-donate-description, +.preview .m-donate-description, +.mobile .darkreader-version, +.preview .darkreader-version { + display: inline-block; + font-size: 0.625rem; + line-height: 0.875rem; + text-align: center; + -moz-user-select: none; + user-select: none; + width: 100%; +} +.mobile .darkreader-version, +.preview .darkreader-version { + bottom: 0; + margin-bottom: 0.125rem; + position: absolute; + right: 0; +} +.mobile .darkreader-version { + position: relative; +} +.preview .dev-tools-button { + overflow: visible; + position: relative; + width: calc(100% - 2 * 0.125rem); +} +.mobile .control-group, +.preview .control-group { + align-items: stretch; + display: inline-flex; + flex-direction: column; + width: 100%; +} +.mobile .control-group__control, +.preview .control-group__control { + height: 1.75rem; +} +.mobile .control-group__description, +.preview .control-group__description { + font-size: 0.625rem; + line-height: 0.875rem; + text-align: center; + -moz-user-select: none; + user-select: none; +} +.mobile .check-button .checkbox, +.preview .check-button .checkbox { + width: calc(100% - 2 * 0.125rem); +} +.mobile .check-button .checkbox__checkmark, +.preview .check-button .checkbox__checkmark { + background-color: #316e7d; +} +.mobile .check-button .checkbox__checkmark::before, +.preview .check-button .checkbox__checkmark::before, +.mobile .check-button .checkbox__checkmark::after, +.preview .check-button .checkbox__checkmark::after { + display: none; +} +.mobile .check-button .checkbox__content, +.preview .check-button .checkbox__content { + align-items: center; + display: flex; + flex: auto; + height: 1.5rem; + justify-content: center; + -moz-user-select: none; + user-select: none; +} +.mobile .check-button .checkbox__input:checked ~ *, +.preview .check-button .checkbox__input:checked ~ * { + color: #ffffff; +} +.mobile .check-button .checkbox__input:checked ~ .checkbox__checkmark, +.preview .check-button .checkbox__input:checked ~ .checkbox__checkmark { + background-image: url('data:image/svg+xml;utf8,'); + background-position: center; + background-repeat: no-repeat; + background-size: 1rem; +} +.mobile .check-button__description, +.preview .check-button__description { + display: inline-block; + font-size: 0.625rem; + line-height: 0.875rem; + text-align: center; + -moz-user-select: none; + user-select: none; + width: 100%; +} +.mobile .app-switch__control, +.preview .app-switch__control { + width: calc(100% - 0.125rem * 2); +} +.mobile .app-switch__description--on, +.preview .app-switch__description--on { + color: #3bc077; +} +.mobile .app-switch__description--off, +.preview .app-switch__description--off { + color: #e96c4c; +} +.mobile .app-switch__time, +.preview .app-switch__time { + background-color: #e96c4c; + border-radius: 50%; + color: #ffffff; + cursor: pointer; + display: none; + height: 0.875rem; + pointer-events: none; + position: absolute; + right: calc(33% + 0.125rem / 3); + top: -0.21875rem; + transition: opacity 250ms 250ms; + width: 0.875rem; +} +.mobile .app-switch__time--active, +.preview .app-switch__time--active { + display: inline-block; +} +.mobile .settings-button-icon, +.preview .settings-button-icon { + background-image: url('data:image/svg+xml;utf8,'); + background-size: cover; + display: inline-block; + height: 1rem; + margin-right: 0.125rem; + width: 1rem; +} +.mobile .site-toggle-group .site-toggle, +.preview .site-toggle-group .site-toggle { + width: calc(100% - 0.125rem * 2); +} +.mobile .site-toggle-group__description--on, +.preview .site-toggle-group__description--on { + color: #3bc077; +} +.mobile .site-toggle-group__description--off, +.preview .site-toggle-group__description--off { + color: #e96c4c; +} +.mobile .theme-group, +.preview .theme-group { + align-items: stretch; + display: flex; + flex-direction: column; +} +.mobile .theme-group__presets-wrapper, +.preview .theme-group__presets-wrapper { + background-color: #316e7d; + border: 0.125rem solid #316e7d; + height: 1.5rem; + position: relative; +} +.mobile .theme-group__presets-wrapper::before, +.preview .theme-group__presets-wrapper::before { + border: 0.125rem solid #316e7d; + border-bottom: none; + content: ""; + display: inline-block; + height: 1.75rem; + left: -0.125rem; + position: absolute; + top: -0.125rem; + width: 100%; +} +.mobile .theme-group__controls-wrapper, +.preview .theme-group__controls-wrapper { + border-bottom: 0.125rem solid #316e7d; + border-left: 0.125rem solid #316e7d; + border-right: 0.125rem solid #316e7d; + padding: 0.5rem; +} +.mobile .theme-group__more-button, +.preview .theme-group__more-button { + background-color: #316e7d; + background-image: url('data:image/svg+xml;utf8,'); + background-position: center right 0.25rem; + background-repeat: no-repeat; + background-size: 1rem; + border: none; + height: 1.25rem; + margin-bottom: 0.125rem; + margin-top: 0.625rem; + width: 100%; +} +.mobile .theme-group__description, +.preview .theme-group__description { + display: inline-block; + font-size: 0.625rem; + line-height: 0.875rem; + text-align: center; + -moz-user-select: none; + user-select: none; + width: 100%; +} +.mobile .news-section, +.preview .news-section { + background-color: #141e24; + border-bottom-left-radius: 0.9375rem; + border-bottom-right-radius: 0.9375rem; + bottom: 0; + box-sizing: border-box; + display: flex; + flex-direction: column; + height: 1.875rem; + left: 0; + overflow: hidden; + padding: 0; + position: absolute; + text-align: center; + transition: height 250ms; + user-select: none; + white-space: nowrap; + width: 100%; +} +.mobile .news-section__popover, +.preview .news-section__popover { + align-items: stretch; + background-color: #141e24; + display: flex; + flex-direction: column; + left: 0; + height: 6rem; + opacity: 0; + pointer-events: none; + position: absolute; + top: 0; + transition: opacity 250ms; + width: 100%; +} +.mobile .news-section__popover__top, +.preview .news-section__popover__top { + border-top: 0.125rem solid #316e7d; + display: flex; + flex-direction: row; + justify-content: space-between; + margin-bottom: 0.5rem; +} +.mobile .news-section__title, +.preview .news-section__title { + color: #e96c4c; + font-size: 0.875rem; + line-height: 1.5rem; + margin-left: 1rem; +} +.mobile .news-section__news, +.preview .news-section__news { + align-items: center; + box-sizing: border-box; + color: #53a1b3; + display: flex; + flex-direction: row; + font-weight: normal; + justify-content: flex-start; + height: 2.5rem; + padding: 0 1rem; + width: 100%; +} +.mobile .news-section__news__icon, +.preview .news-section__news__icon { + background-position: center; + background-repeat: no-repeat; + background-size: contain; + display: inline-block; + flex: none; + height: 3rem; + margin-right: 0.5rem; + width: 3rem; +} +.mobile .news-section__news__text, +.preview .news-section__news__text { + flex: auto; + font-size: 0.875rem; + display: inline-block; + line-height: 0.875rem; + text-align: left; + white-space: normal; +} +.mobile .news-section__news--highlight, +.preview .news-section__news--highlight { + color: #e96c4c; + font-weight: bold; +} +.mobile .news-section__news:hover, +.preview .news-section__news:hover { + color: #ffffff; +} +.mobile .news-section__close, +.preview .news-section__close { + color: #e96c4c; + cursor: pointer; + display: inline-block; + font-size: 1.125rem; + height: 1.5rem; + line-height: 1.5rem; + text-align: center; + user-select: none; + width: 1.5rem; +} +.mobile .news-section__close:hover, +.preview .news-section__close:hover { + background-color: rgba(49, 110, 125, 0.25); +} +.mobile .news-section--expanded, +.preview .news-section--expanded { + height: 6rem; +} +.mobile .news-section--expanded .news-section__popover, +.preview .news-section--expanded .news-section__popover { + opacity: 1; + pointer-events: all; +} +.mobile .news-section__news--small, +.preview .news-section__news--small { + bottom: 0; + font-weight: bold; + height: 1.875rem; + padding: 0 1rem; +} +.mobile .news-section__news--small .news-section__news__icon, +.preview .news-section__news--small .news-section__news__icon { + height: 1.5rem; + margin-right: 0.25rem; + width: 1.5rem; +} +.mobile .news-section__news--small .news-section__news__text, +.preview .news-section__news--small .news-section__news__text { + font-size: 0.75rem; + line-height: 1rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.mobile .page-viewer, +.preview .page-viewer { + height: 100%; + position: relative; +} +.mobile .page, +.preview .page { + align-items: stretch; + background-color: #141e24; + display: none; + flex-direction: column; + height: 100%; + justify-content: stretch; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mobile .page--active, +.preview .page--active { + display: flex; +} +.mobile .page__back-button, +.preview .page__back-button { + background-image: url('data:image/svg+xml;utf8,'); + background-position: center left 0.25rem; + background-repeat: no-repeat; + background-size: 1rem; + flex: none; + margin-top: 0.5rem; + width: calc(100% - 2 * 0.125rem); +} +.mobile .automation-button-icon, +.preview .automation-button-icon { + display: inline-block; + height: 1rem; + margin-right: 0.125rem; + width: 1rem; +} +.mobile .site-list-button-icon, +.preview .site-list-button-icon { + background-image: url('data:image/svg+xml;utf8,'); + background-position: center; + background-repeat: no-repeat; + background-size: 0.75rem; + display: inline-block; + height: 1rem; + margin-right: 0.125rem; + width: 1rem; +} +.mobile .automation-page, +.preview .automation-page { + display: flex; + flex-direction: column; +} +.mobile .automation-page__button--active, +.preview .automation-page__button--active { + background: #316e7d; +} +.mobile .automation-page__button--active:hover, +.preview .automation-page__button--active:hover { + background: #316e7d; +} +.mobile .automation-page__line, +.preview .automation-page__line { + display: flex; + flex-direction: row; +} +.mobile .automation-page__line .checkbox, +.preview .automation-page__line .checkbox { + border-right: none; + flex: none; +} +.mobile .automation-page__line .checkbox__checkmark, +.preview .automation-page__line .checkbox__checkmark { + background-image: url('data:image/svg+xml;utf8,'); + background-position: 0.3125rem 0.25rem; + background-repeat: no-repeat; + background-size: 1rem; +} +.mobile .automation-page__line .checkbox__checkmark::before, +.preview .automation-page__line .checkbox__checkmark::before, +.mobile .automation-page__line .checkbox__checkmark::after, +.preview .automation-page__line .checkbox__checkmark::after { + display: none; +} +.mobile .automation-page__line .checkbox__input:checked ~ .checkbox__checkmark, +.preview + .automation-page__line + .checkbox__input:checked + ~ .checkbox__checkmark { + background-image: url('data:image/svg+xml;utf8,'); + background-position: 0.375rem 0.25rem; +} +.mobile + .automation-page__line + .time-range-picker + .time-range-picker__input--start, +.preview + .automation-page__line + .time-range-picker + .time-range-picker__input--start { + border-left: 0.0625rem solid #316e7d; +} +.mobile .automation-page__label, +.preview .automation-page__label { + font-size: 0.625rem; + line-height: 0.875rem; + text-align: center; +} +.mobile .automation-page__description, +.preview .automation-page__description { + font-size: 0.625rem; + line-height: 0.875rem; + margin: 0; + text-align: center; + white-space: nowrap; +} +.mobile .automation-page__location-description, +.preview .automation-page__location-description { + font-size: 0.625rem; + line-height: 0.875rem; + margin: 0; + text-align: center; + white-space: nowrap; +} +.mobile .automation-page::after, +.preview .automation-page::after { + background-image: linear-gradient( + to bottom, + rgba(20, 30, 36, 0.9), + rgba(20, 30, 36, 0) + ); + content: ""; + display: block; + height: 1.5rem; + left: 0; + margin-top: 0.125rem; + pointer-events: none; + position: absolute; + top: 100%; + transition: height 250ms; + width: 100%; +} +.mobile .automation-page__location, +.preview .automation-page__location { + margin-top: 0.5rem; +} +.mobile .automation-page__location__latitude, +.preview .automation-page__location__latitude, +.mobile .automation-page__location__longitude, +.preview .automation-page__location__longitude { + flex: auto; + text-align: center; + text-indent: 0; + width: 100%; +} +.mobile .automation-page__location__latitude, +.preview .automation-page__location__latitude { + border-left: 0.0625rem solid #316e7d; + border-right: none; +} +.mobile .automation-page__location__longitude, +.preview .automation-page__location__longitude { + border-left: 0.0625rem solid #316e7d; +} +.mobile .automation-page__system-dark-mode, +.preview .automation-page__system-dark-mode { + display: flex; + flex-direction: row; + margin-top: 0.5rem; +} +.mobile .automation-page__system-dark-mode__checkbox, +.preview .automation-page__system-dark-mode__checkbox { + flex: none; +} +.mobile .automation-page__system-dark-mode__button, +.preview .automation-page__system-dark-mode__button { + border-left-width: 0.0625rem; + color: #53a1b3; + flex: auto; +} +.mobile .automation-page__system-dark-mode__button--active, +.preview .automation-page__system-dark-mode__button--active { + color: #ffffff; +} +.mobile + .automation-page__system-dark-mode:hover + .mobile + .automation-page__system-dark-mode__button, +.mobile + .automation-page__system-dark-mode:hover + .preview + .automation-page__system-dark-mode__button, +.preview + .automation-page__system-dark-mode:hover + .mobile + .automation-page__system-dark-mode__button, +.preview + .automation-page__system-dark-mode:hover + .preview + .automation-page__system-dark-mode__button, +.mobile + .automation-page__system-dark-mode:hover + .mobile + .automation-page__system-dark-mode__checkbox, +.mobile + .automation-page__system-dark-mode:hover + .preview + .automation-page__system-dark-mode__checkbox, +.preview + .automation-page__system-dark-mode:hover + .mobile + .automation-page__system-dark-mode__checkbox, +.preview + .automation-page__system-dark-mode:hover + .preview + .automation-page__system-dark-mode__checkbox { + background-color: #193945; +} +.mobile .automation-page .toggle, +.preview .automation-page .toggle { + width: 100%; +} +.mobile .automation-page .dropdown, +.preview .automation-page .dropdown { + background-color: transparent; + box-shadow: inset 0 0 0 0.125rem #316e7d; + height: 1.75rem; + margin-top: 0.5rem; +} +.mobile .automation-page .dropdown__selected, +.preview .automation-page .dropdown__selected { + background-color: transparent; + background-position: center right 0.375rem; + height: 1.5rem; + margin-top: 0.125rem; +} +.mobile .automation-page .dropdown--open .dropdown__list, +.preview .automation-page .dropdown--open .dropdown__list { + border: 0.125rem solid #316e7d; + margin-top: 0; + padding-top: 0.125rem; +} +.mobile .automation-page .dropdown__list__item, +.preview .automation-page .dropdown__list__item { + height: 1.5rem; +} +.mobile .settings-button, +.preview .settings-button { + width: 100%; +} +.mobile .site-list-page, +.preview .site-list-page { + align-items: center; + display: flex; + flex-direction: column; + justify-content: stretch; +} +.mobile .site-list-page__description, +.preview .site-list-page__description { + font-size: 0.625rem; + line-height: 0.875rem; + margin: 0; + text-align: center; + white-space: nowrap; +} +.mobile .site-list-page .check-button, +.preview .site-list-page .check-button { + margin-top: 0.5rem; +} +.mobile .site-list, +.preview .site-list { + align-items: stretch; + border: 0.125rem solid #316e7d; + border-radius: 0.125rem; + display: flex; + flex-direction: column; + justify-content: flex-start; + max-height: 13.75rem; + overflow: hidden; + width: calc(100% - 2 * 0.125rem); +} +.mobile .site-list__v-scroll-root, +.preview .site-list__v-scroll-root { + overflow-x: hidden; + overflow-y: auto; +} +.mobile .site-list__v-scroll-root::-webkit-scrollbar, +.preview .site-list__v-scroll-root::-webkit-scrollbar { + width: 0.75rem; +} +.mobile .site-list__textbox, +.preview .site-list__textbox { + border: none; + position: relative; + width: 100%; +} +.mobile .site-list__textbox:focus, +.preview .site-list__textbox:focus { + box-shadow: 0 0 0 0.125rem #316e7d; + z-index: 1; +} +.mobile .site-list__item, +.preview .site-list__item { + position: relative; +} +.mobile .site-list__item__remove, +.preview .site-list__item__remove { + background-color: transparent; + background-image: url('data:image/svg+xml;utf8,'); + background-position: center; + background-repeat: no-repeat; + background-size: 0.75rem; + border-radius: 50%; + cursor: pointer; + display: none; + height: 1.25rem; + position: absolute; + right: 0.125rem; + top: 0.125rem; + width: 1.25rem; + z-index: 1; +} +.mobile .site-list__item__remove:hover, +.preview .site-list__item__remove:hover { + background-color: #316e7d; + background-image: url('data:image/svg+xml;utf8,'); +} +.mobile .site-list__item:hover .site-list__item__remove, +.preview .site-list__item:hover .site-list__item__remove { + display: inline-block; +} +.mobile .theme-control, +.preview .theme-control { + align-items: center; + display: flex; + flex-direction: row; + justify-content: center; + min-height: 1.5rem; + width: 100%; +} +.mobile .theme-control__label, +.preview .theme-control__label { + font-size: 0.75rem; + line-height: 0.75rem; + text-align: left; + -moz-user-select: none; + user-select: none; + width: 50%; +} +.mobile .static-edit-button, +.preview .static-edit-button { + background-color: #e96c4c; + border-radius: 0.4375rem; + color: #ffffff; + cursor: pointer; + font-size: 0.625rem; + line-height: 0.875rem; + left: 0.25rem; + min-width: 0.875rem; + position: absolute; + text-align: center; + top: 0.25rem; +} +.mobile .static-edit-button--hidden, +.preview .static-edit-button--hidden { + display: none; +} +.mobile .static-edit-button::before, +.preview .static-edit-button::before { + content: "\270E"; + line-height: 0.875rem; +} +.mobile .static-edit-button:hover, +.preview .static-edit-button:hover { + box-shadow: 0 0 0.75rem #ffffff; +} +.mobile .mode-control-container, +.preview .mode-control-container { + height: 1.5rem; + position: relative; + width: 100%; +} +.mobile .collapsible-panel__group__expand-button, +.preview .collapsible-panel__group__expand-button { + align-items: center; + background-color: #316e7d; + background-image: url('data:image/svg+xml;utf8,'); + background-position: center left 0.375rem; + background-repeat: no-repeat; + background-size: 0.5rem; + color: #ffffff; + cursor: pointer; + display: none; + height: 1.25rem; + justify-content: center; + line-height: 1.25rem; + text-align: center; + width: 100%; +} +.mobile + .collapsible-panel__group--collapsed + .collapsible-panel__group__expand-button, +.preview + .collapsible-panel__group--collapsed + .collapsible-panel__group__expand-button { + display: inline-flex; +} +.mobile .collapsible-panel__group--collapsed .collapsible-panel__group__content, +.preview + .collapsible-panel__group--collapsed + .collapsible-panel__group__content { + display: none; +} +.mobile + .collapsible-panel__group--collapse-top + .collapsible-panel__group__expand-button, +.preview + .collapsible-panel__group--collapse-top + .collapsible-panel__group__expand-button { + margin-bottom: 0.625rem; + margin-top: 0.125rem; +} +.mobile + .collapsible-panel__group--collapse-bottom + .collapsible-panel__group__expand-button, +.preview + .collapsible-panel__group--collapse-bottom + .collapsible-panel__group__expand-button { + margin-bottom: 0.125rem; + margin-top: 0.625rem; +} +.mobile .theme-page .theme-preset-picker.dropdown, +.preview .theme-page .theme-preset-picker.dropdown { + height: 1.75rem; +} +.mobile .theme-page .theme-preset-picker .dropdown__selected, +.preview .theme-page .theme-preset-picker .dropdown__selected { + height: 1.75rem; +} +.mobile .theme-page .theme-preset-picker .dropdown__list, +.preview .theme-page .theme-preset-picker .dropdown__list { + border: 0.125rem solid #316e7d; + border-top: none; + box-shadow: 0 0 0.25rem 0.0625rem black; + box-sizing: border-box; +} +.mobile .theme-page .theme-preset-picker .dropdown__list__item, +.preview .theme-page .theme-preset-picker .dropdown__list__item { + min-height: 1.75rem; +} +.mobile .theme-page .theme-control:not(:first-child), +.preview .theme-page .theme-control:not(:first-child) { + margin-top: 0.5rem; +} +.mobile .theme-page .font-picker, +.preview .theme-page .font-picker { + box-sizing: border-box; + height: 1.5rem; + padding-top: 0.125rem; + position: relative; + width: 100%; +} +.mobile .theme-page .font-picker--disabled, +.preview .theme-page .font-picker--disabled { + opacity: 0.5; + pointer-events: none; +} +.mobile .theme-page .font-picker .select__textbox, +.preview .theme-page .font-picker .select__textbox, +.mobile .theme-page .font-picker .select__expand, +.preview .theme-page .font-picker .select__expand, +.mobile .theme-page .font-picker .select__list, +.preview .theme-page .font-picker .select__list { + border: none; +} +.mobile .theme-page .font-picker .select__line, +.preview .theme-page .font-picker .select__line { + position: relative; +} +.mobile .theme-page .font-picker .select__textbox, +.preview .theme-page .font-picker .select__textbox { + background-color: #316e7d; + color: #ffffff; + height: 1.25rem; + line-height: 1.25rem; + text-align: center; + width: 100%; +} +.mobile .theme-page .font-picker .select__textbox:hover, +.preview .theme-page .font-picker .select__textbox:hover { + background-color: #193945; +} +.mobile .theme-page .font-picker .select__textbox:focus, +.preview .theme-page .font-picker .select__textbox:focus { + background-color: #193945; + border: 0.125rem solid #316e7d; + margin-top: -0.125rem; +} +.mobile .theme-page .font-picker .select__expand, +.preview .theme-page .font-picker .select__expand { + background-color: #316e7d; + height: 1.25rem; + min-width: 1.5rem; + position: absolute; + right: 0; + top: 0; + width: 1.5rem; +} +.mobile .theme-page .font-picker .select__expand__icon, +.preview .theme-page .font-picker .select__expand__icon { + background-image: url('data:image/svg+xml;utf8,'); + background-position: center; + background-repeat: no-repeat; + background-size: 1rem; +} +.mobile .theme-page .font-picker .select__expand__icon::before, +.preview .theme-page .font-picker .select__expand__icon::before, +.mobile .theme-page .font-picker .select__expand__icon::after, +.preview .theme-page .font-picker .select__expand__icon::after { + display: none; +} +.mobile .theme-page .font-picker .select__list, +.preview .theme-page .font-picker .select__list { + border-left: 0.125rem solid #316e7d; + border-right: 0.125rem solid #316e7d; + top: 100%; + width: 100%; +} +.mobile .theme-page .font-picker .select__list--expanded, +.preview .theme-page .font-picker .select__list--expanded { + border-bottom: 0.125rem solid #316e7d; +} +.mobile .theme-page .font-picker .select__list::-webkit-scrollbar, +.preview .theme-page .font-picker .select__list::-webkit-scrollbar { + background-color: transparent; +} +.mobile .theme-page .font-picker.select--expanded, +.preview .theme-page .font-picker.select--expanded { + background-color: #316e7d; + height: 1.5rem; + padding-top: 0; +} +.mobile .theme-page .font-picker.select--expanded .select__textbox, +.preview .theme-page .font-picker.select--expanded .select__textbox { + border: 0.125rem solid #316e7d; +} +.mobile .theme-page .font-picker.select--expanded .select__textbox:focus, +.preview .theme-page .font-picker.select--expanded .select__textbox:focus { + margin-top: 0; +} +.mobile .theme-page .font-picker.select--expanded .select__expand, +.preview .theme-page .font-picker.select--expanded .select__expand { + margin-top: 0.125rem; +} +.mobile .theme-page .font-picker.select--expanded::before, +.preview .theme-page .font-picker.select--expanded::before { + background-color: #141e24; + content: ""; + display: inline-block; + height: 0.75rem; + left: 0.125rem; + position: absolute; + top: 0.75rem; + width: calc(100% - 2 * 0.125rem); +} +.mobile .theme-preset-picker .dropdown__selected, +.preview .theme-preset-picker .dropdown__selected { + height: 1.5rem; + margin-top: 0; +} +.mobile .theme-preset-picker .dropdown__list, +.preview .theme-preset-picker .dropdown__list { + border: none; + box-shadow: 0 0 0 0.125rem #316e7d, 0 0 0.25rem 0.1875rem black; +} +.mobile .theme-preset-picker__preset, +.preview .theme-preset-picker__preset { + align-items: center; + display: inline-flex; + justify-content: center; + min-height: 1.5rem; + position: relative; + width: 100%; +} +.mobile .theme-preset-picker__preset__remove-button, +.preview .theme-preset-picker__preset__remove-button { + cursor: pointer; + display: inline-block; + height: 1.5rem; + position: absolute; + right: 0; + top: 0; + width: 1.5rem; +} +.mobile .theme-preset-picker__preset__remove-button::after, +.preview .theme-preset-picker__preset__remove-button::after { + content: "\2715"; + display: inline-block; + line-height: 1.5rem; + text-align: center; +} +.mobile .theme-preset-picker__preset__remove-button:hover, +.preview .theme-preset-picker__preset__remove-button:hover { + background-color: #316e7d; + color: #ffffff; +} +.mobile.firefox * { + font-family: Inter, Open Sans, Segoe UI, Helvetica Neue, Ubuntu, sans-serif; +} +.mobile.firefox a, +.mobile.firefox a *, +.mobile.firefox button, +.mobile.firefox button * { + font-family: Metropolis, Open Sans, Segoe UI, Helvetica Neue, Ubuntu, + sans-serif; +} +@media screen and (min-width: 21.25rem) { + .mobile { + font-size: 20px; + } +} +@media screen and (min-width: 25.5rem) { + .mobile { + font-size: 24px; + } +} +@media screen and (min-resolution: 29.75rem) { + .mobile { + font-size: 28px; + } +} +@media screen and (min-width: 34rem) { + .mobile { + font-size: 32px; + } +} +.firefox .darkreader-version { + display: none; +} +.preview:not(.mobile) body { + border-color: #8a8f92; +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/stylesheet-editor/index.html b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/stylesheet-editor/index.html new file mode 100644 index 0000000..a94c0f3 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/stylesheet-editor/index.html @@ -0,0 +1,17 @@ + + + + + Dark Reader CSS editor + + + + + + + + + diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/stylesheet-editor/index.js b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/stylesheet-editor/index.js new file mode 100644 index 0000000..7c6113e --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/stylesheet-editor/index.js @@ -0,0 +1,2699 @@ +(function () { + "use strict"; + + /* malevic@0.19.1 - Jan 8, 2022 */ + function m$1(tagOrComponent, props, ...children) { + props = props || {}; + if (typeof tagOrComponent === "string") { + const tag = tagOrComponent; + return {type: tag, props, children}; + } + if (typeof tagOrComponent === "function") { + const component = tagOrComponent; + return {type: component, props, children}; + } + throw new Error("Unsupported spec type"); + } + + /* malevic@0.19.1 - Jan 8, 2022 */ + function createPluginsStore() { + const plugins = []; + return { + add(plugin) { + plugins.push(plugin); + return this; + }, + apply(props) { + let result; + let plugin; + const usedPlugins = new Set(); + for (let i = plugins.length - 1; i >= 0; i--) { + plugin = plugins[i]; + if (usedPlugins.has(plugin)) { + continue; + } + result = plugin(props); + if (result != null) { + return result; + } + usedPlugins.add(plugin); + } + return null; + }, + delete(plugin) { + for (let i = plugins.length - 1; i >= 0; i--) { + if (plugins[i] === plugin) { + plugins.splice(i, 1); + break; + } + } + return this; + }, + empty() { + return plugins.length === 0; + } + }; + } + function iterateComponentPlugins(type, pairs, iterator) { + pairs + .filter(([key]) => type[key]) + .forEach(([key, plugins]) => { + return type[key].forEach((plugin) => iterator(plugins, plugin)); + }); + } + function addComponentPlugins(type, pairs) { + iterateComponentPlugins(type, pairs, (plugins, plugin) => + plugins.add(plugin) + ); + } + function deleteComponentPlugins(type, pairs) { + iterateComponentPlugins(type, pairs, (plugins, plugin) => + plugins.delete(plugin) + ); + } + + const XHTML_NS = "http://www.w3.org/1999/xhtml"; + const SVG_NS = "http://www.w3.org/2000/svg"; + const PLUGINS_CREATE_ELEMENT = Symbol(); + const pluginsCreateElement = createPluginsStore(); + function createElement(spec, parent) { + const result = pluginsCreateElement.apply({spec, parent}); + if (result) { + return result; + } + const tag = spec.type; + if (tag === "svg") { + return document.createElementNS(SVG_NS, "svg"); + } + const namespace = parent.namespaceURI; + if (namespace === XHTML_NS || namespace == null) { + return document.createElement(tag); + } + return document.createElementNS(namespace, tag); + } + + function classes$1(...args) { + const classes = []; + args.filter((c) => Boolean(c)).forEach((c) => { + if (typeof c === "string") { + classes.push(c); + } else if (typeof c === "object") { + classes.push( + ...Object.keys(c).filter((key) => Boolean(c[key])) + ); + } + }); + return classes.join(" "); + } + function setInlineCSSPropertyValue(element, prop, $value) { + if ($value != null && $value !== "") { + let value = String($value); + let important = ""; + if (value.endsWith("!important")) { + value = value.substring(0, value.length - 10); + important = "important"; + } + element.style.setProperty(prop, value, important); + } else { + element.style.removeProperty(prop); + } + } + + function isObject(value) { + return value != null && typeof value === "object"; + } + + const eventListeners = new WeakMap(); + function addEventListener(element, event, listener) { + let listeners; + if (eventListeners.has(element)) { + listeners = eventListeners.get(element); + } else { + listeners = new Map(); + eventListeners.set(element, listeners); + } + if (listeners.get(event) !== listener) { + if (listeners.has(event)) { + element.removeEventListener(event, listeners.get(event)); + } + element.addEventListener(event, listener); + listeners.set(event, listener); + } + } + function removeEventListener(element, event) { + if (!eventListeners.has(element)) { + return; + } + const listeners = eventListeners.get(element); + element.removeEventListener(event, listeners.get(event)); + listeners.delete(event); + } + + function setClassObject(element, classObj) { + const cls = Array.isArray(classObj) + ? classes$1(...classObj) + : classes$1(classObj); + if (cls) { + element.setAttribute("class", cls); + } else { + element.removeAttribute("class"); + } + } + function mergeValues(obj, old) { + const values = new Map(); + const newProps = new Set(Object.keys(obj)); + const oldProps = Object.keys(old); + oldProps + .filter((prop) => !newProps.has(prop)) + .forEach((prop) => values.set(prop, null)); + newProps.forEach((prop) => values.set(prop, obj[prop])); + return values; + } + function setStyleObject(element, styleObj, prev) { + let prevObj; + if (isObject(prev)) { + prevObj = prev; + } else { + prevObj = {}; + element.removeAttribute("style"); + } + const declarations = mergeValues(styleObj, prevObj); + declarations.forEach(($value, prop) => + setInlineCSSPropertyValue(element, prop, $value) + ); + } + function setEventListener(element, event, listener) { + if (typeof listener === "function") { + addEventListener(element, event, listener); + } else { + removeEventListener(element, event); + } + } + const specialAttrs = new Set([ + "key", + "oncreate", + "onupdate", + "onrender", + "onremove" + ]); + const PLUGINS_SET_ATTRIBUTE = Symbol(); + const pluginsSetAttribute = createPluginsStore(); + function getPropertyValue(obj, prop) { + return obj && obj.hasOwnProperty(prop) ? obj[prop] : null; + } + function syncAttrs(element, attrs, prev) { + const values = mergeValues(attrs, prev || {}); + values.forEach((value, attr) => { + if (!pluginsSetAttribute.empty()) { + const result = pluginsSetAttribute.apply({ + element, + attr, + value, + get prev() { + return getPropertyValue(prev, attr); + } + }); + if (result != null) { + return; + } + } + if (attr === "class" && isObject(value)) { + setClassObject(element, value); + } else if (attr === "style" && isObject(value)) { + const prevValue = getPropertyValue(prev, attr); + setStyleObject(element, value, prevValue); + } else if (attr.startsWith("on")) { + const event = attr.substring(2); + setEventListener(element, event, value); + } else if (specialAttrs.has(attr)); + else if (value == null || value === false) { + element.removeAttribute(attr); + } else { + element.setAttribute(attr, value === true ? "" : String(value)); + } + }); + } + + class LinkedList { + constructor(...items) { + this.nexts = new WeakMap(); + this.prevs = new WeakMap(); + this.first = null; + this.last = null; + items.forEach((item) => this.push(item)); + } + empty() { + return this.first == null; + } + push(item) { + if (this.empty()) { + this.first = item; + this.last = item; + } else { + this.nexts.set(this.last, item); + this.prevs.set(item, this.last); + this.last = item; + } + } + insertBefore(newItem, refItem) { + const prev = this.before(refItem); + this.prevs.set(newItem, prev); + this.nexts.set(newItem, refItem); + this.prevs.set(refItem, newItem); + prev && this.nexts.set(prev, newItem); + refItem === this.first && (this.first = newItem); + } + delete(item) { + const prev = this.before(item); + const next = this.after(item); + prev && this.nexts.set(prev, next); + next && this.prevs.set(next, prev); + item === this.first && (this.first = next); + item === this.last && (this.last = prev); + } + before(item) { + return this.prevs.get(item) || null; + } + after(item) { + return this.nexts.get(item) || null; + } + loop(iterator) { + if (this.empty()) { + return; + } + let current = this.first; + do { + if (iterator(current)) { + break; + } + } while ((current = this.after(current))); + } + copy() { + const list = new LinkedList(); + this.loop((item) => { + list.push(item); + return false; + }); + return list; + } + forEach(iterator) { + this.loop((item) => { + iterator(item); + return false; + }); + } + find(iterator) { + let result = null; + this.loop((item) => { + if (iterator(item)) { + result = item; + return true; + } + return false; + }); + return result; + } + map(iterator) { + const results = []; + this.loop((item) => { + results.push(iterator(item)); + return false; + }); + return results; + } + } + + function matchChildren(vnode, old) { + const oldChildren = old.children(); + const oldChildrenByKey = new Map(); + const oldChildrenWithoutKey = []; + oldChildren.forEach((v) => { + const key = v.key(); + if (key == null) { + oldChildrenWithoutKey.push(v); + } else { + oldChildrenByKey.set(key, v); + } + }); + const children = vnode.children(); + const matches = []; + const unmatched = new Set(oldChildren); + const keys = new Set(); + children.forEach((v) => { + let match = null; + let guess = null; + const key = v.key(); + if (key != null) { + if (keys.has(key)) { + throw new Error("Duplicate key"); + } + keys.add(key); + if (oldChildrenByKey.has(key)) { + guess = oldChildrenByKey.get(key); + } + } else if (oldChildrenWithoutKey.length > 0) { + guess = oldChildrenWithoutKey.shift(); + } + if (v.matches(guess)) { + match = guess; + } + matches.push([v, match]); + if (match) { + unmatched.delete(match); + } + }); + return {matches, unmatched}; + } + + function execute(vnode, old, vdom) { + const didMatch = vnode && old && vnode.matches(old); + if (didMatch && vnode.parent() === old.parent()) { + vdom.replaceVNode(old, vnode); + } else if (vnode) { + vdom.addVNode(vnode); + } + const context = vdom.getVNodeContext(vnode); + const oldContext = vdom.getVNodeContext(old); + if (old && !didMatch) { + old.detach(oldContext); + old.children().forEach((v) => execute(null, v, vdom)); + old.detached(oldContext); + } + if (vnode && !didMatch) { + vnode.attach(context); + vnode.children().forEach((v) => execute(v, null, vdom)); + vnode.attached(context); + } + if (didMatch) { + const result = vnode.update(old, context); + if (result !== vdom.LEAVE) { + const {matches, unmatched} = matchChildren(vnode, old); + unmatched.forEach((v) => execute(null, v, vdom)); + matches.forEach(([v, o]) => execute(v, o, vdom)); + vnode.updated(context); + } + } + } + + function m(tagOrComponent, props, ...children) { + props = props || {}; + if (typeof tagOrComponent === "string") { + const tag = tagOrComponent; + return {type: tag, props, children}; + } + if (typeof tagOrComponent === "function") { + const component = tagOrComponent; + return {type: component, props, children}; + } + throw new Error("Unsupported spec type"); + } + function isSpec(x) { + return isObject(x) && x.type != null && x.nodeType == null; + } + function isNodeSpec(x) { + return isSpec(x) && typeof x.type === "string"; + } + function isComponentSpec(x) { + return isSpec(x) && typeof x.type === "function"; + } + + class VNodeBase { + constructor(parent) { + this.parentVNode = parent; + } + key() { + return null; + } + parent(vnode) { + if (vnode) { + this.parentVNode = vnode; + return; + } + return this.parentVNode; + } + children() { + return []; + } + attach(context) {} + detach(context) {} + update(old, context) { + return null; + } + attached(context) {} + detached(context) {} + updated(context) {} + } + function nodeMatchesSpec(node, spec) { + return ( + node instanceof Element && spec.type === node.tagName.toLowerCase() + ); + } + const refinedElements = new WeakMap(); + function markElementAsRefined(element, vdom) { + let refined; + if (refinedElements.has(vdom)) { + refined = refinedElements.get(vdom); + } else { + refined = new WeakSet(); + refinedElements.set(vdom, refined); + } + refined.add(element); + } + function isElementRefined(element, vdom) { + return ( + refinedElements.has(vdom) && refinedElements.get(vdom).has(element) + ); + } + class ElementVNode extends VNodeBase { + constructor(spec, parent) { + super(parent); + this.spec = spec; + } + matches(other) { + return ( + other instanceof ElementVNode && + this.spec.type === other.spec.type + ); + } + key() { + return this.spec.props.key; + } + children() { + return [this.child]; + } + getExistingElement(context) { + const parent = context.parent; + const existing = context.node; + let element; + if (nodeMatchesSpec(existing, this.spec)) { + element = existing; + } else if ( + !isElementRefined(parent, context.vdom) && + context.vdom.isDOMNodeCaptured(parent) + ) { + const sibling = context.sibling; + const guess = sibling + ? sibling.nextElementSibling + : parent.firstElementChild; + if (guess && !context.vdom.isDOMNodeCaptured(guess)) { + if (nodeMatchesSpec(guess, this.spec)) { + element = guess; + } else { + parent.removeChild(guess); + } + } + } + return element; + } + attach(context) { + let element; + const existing = this.getExistingElement(context); + if (existing) { + element = existing; + } else { + element = createElement(this.spec, context.parent); + markElementAsRefined(element, context.vdom); + } + syncAttrs(element, this.spec.props, null); + this.child = createDOMVNode( + element, + this.spec.children, + this, + false + ); + } + update(prev, context) { + const prevContext = context.vdom.getVNodeContext(prev); + const element = prevContext.node; + syncAttrs(element, this.spec.props, prev.spec.props); + this.child = createDOMVNode( + element, + this.spec.children, + this, + false + ); + } + attached(context) { + const {oncreate, onrender} = this.spec.props; + if (oncreate) { + oncreate(context.node); + } + if (onrender) { + onrender(context.node); + } + } + detached(context) { + const {onremove} = this.spec.props; + if (onremove) { + onremove(context.node); + } + } + updated(context) { + const {onupdate, onrender} = this.spec.props; + if (onupdate) { + onupdate(context.node); + } + if (onrender) { + onrender(context.node); + } + } + } + const symbols = { + CREATED: Symbol(), + REMOVED: Symbol(), + UPDATED: Symbol(), + RENDERED: Symbol(), + ACTIVE: Symbol(), + DEFAULTS_ASSIGNED: Symbol() + }; + const domPlugins = [ + [PLUGINS_CREATE_ELEMENT, pluginsCreateElement], + [PLUGINS_SET_ATTRIBUTE, pluginsSetAttribute] + ]; + class ComponentVNode extends VNodeBase { + constructor(spec, parent) { + super(parent); + this.lock = false; + this.spec = spec; + this.prev = null; + this.store = {}; + this.store[symbols.ACTIVE] = this; + } + matches(other) { + return ( + other instanceof ComponentVNode && + this.spec.type === other.spec.type + ); + } + key() { + return this.spec.props.key; + } + children() { + return [this.child]; + } + createContext(context) { + const {parent} = context; + const {spec, prev, store} = this; + return { + spec, + prev, + store, + get node() { + return context.node; + }, + get nodes() { + return context.nodes; + }, + parent, + onCreate: (fn) => (store[symbols.CREATED] = fn), + onUpdate: (fn) => (store[symbols.UPDATED] = fn), + onRemove: (fn) => (store[symbols.REMOVED] = fn), + onRender: (fn) => (store[symbols.RENDERED] = fn), + refresh: () => { + const activeVNode = store[symbols.ACTIVE]; + activeVNode.refresh(context); + }, + leave: () => context.vdom.LEAVE, + getStore: (defaults) => { + if (defaults && !store[symbols.DEFAULTS_ASSIGNED]) { + Object.entries(defaults).forEach(([prop, value]) => { + store[prop] = value; + }); + store[symbols.DEFAULTS_ASSIGNED] = true; + } + return store; + } + }; + } + unbox(context) { + const Component = this.spec.type; + const props = this.spec.props; + const children = this.spec.children; + this.lock = true; + const prevContext = ComponentVNode.context; + ComponentVNode.context = this.createContext(context); + let unboxed = null; + try { + unboxed = Component(props, ...children); + } finally { + ComponentVNode.context = prevContext; + this.lock = false; + } + return unboxed; + } + refresh(context) { + if (this.lock) { + throw new Error( + "Calling refresh during unboxing causes infinite loop" + ); + } + this.prev = this.spec; + const latestContext = context.vdom.getVNodeContext(this); + const unboxed = this.unbox(latestContext); + if (unboxed === context.vdom.LEAVE) { + return; + } + const prevChild = this.child; + this.child = createVNode(unboxed, this); + context.vdom.execute(this.child, prevChild); + this.updated(context); + } + addPlugins() { + addComponentPlugins(this.spec.type, domPlugins); + } + deletePlugins() { + deleteComponentPlugins(this.spec.type, domPlugins); + } + attach(context) { + this.addPlugins(); + const unboxed = this.unbox(context); + const childSpec = unboxed === context.vdom.LEAVE ? null : unboxed; + this.child = createVNode(childSpec, this); + } + update(prev, context) { + this.store = prev.store; + this.prev = prev.spec; + this.store[symbols.ACTIVE] = this; + const prevContext = context.vdom.getVNodeContext(prev); + this.addPlugins(); + const unboxed = this.unbox(prevContext); + let result = null; + if (unboxed === context.vdom.LEAVE) { + result = unboxed; + this.child = prev.child; + context.vdom.adoptVNode(this.child, this); + } else { + this.child = createVNode(unboxed, this); + } + return result; + } + handle(event, context) { + const fn = this.store[event]; + if (fn) { + const nodes = + context.nodes.length === 0 ? [null] : context.nodes; + fn(...nodes); + } + } + attached(context) { + this.deletePlugins(); + this.handle(symbols.CREATED, context); + this.handle(symbols.RENDERED, context); + } + detached(context) { + this.handle(symbols.REMOVED, context); + } + updated(context) { + this.deletePlugins(); + this.handle(symbols.UPDATED, context); + this.handle(symbols.RENDERED, context); + } + } + ComponentVNode.context = null; + function getComponentContext() { + return ComponentVNode.context; + } + class TextVNode extends VNodeBase { + constructor(text, parent) { + super(parent); + this.text = text; + } + matches(other) { + return other instanceof TextVNode; + } + children() { + return [this.child]; + } + getExistingNode(context) { + const {parent} = context; + let node; + if (context.node instanceof Text) { + node = context.node; + } else if ( + !isElementRefined(parent, context.vdom) && + context.vdom.isDOMNodeCaptured(parent) + ) { + const sibling = context.sibling; + const guess = sibling ? sibling.nextSibling : parent.firstChild; + if ( + guess && + !context.vdom.isDOMNodeCaptured(guess) && + guess instanceof Text + ) { + node = guess; + } + } + return node; + } + attach(context) { + const existing = this.getExistingNode(context); + let node; + if (existing) { + node = existing; + node.textContent = this.text; + } else { + node = document.createTextNode(this.text); + } + this.child = createVNode(node, this); + } + update(prev, context) { + const prevContext = context.vdom.getVNodeContext(prev); + const {node} = prevContext; + if (this.text !== prev.text) { + node.textContent = this.text; + } + this.child = createVNode(node, this); + } + } + class InlineFunctionVNode extends VNodeBase { + constructor(fn, parent) { + super(parent); + this.fn = fn; + } + matches(other) { + return other instanceof InlineFunctionVNode; + } + children() { + return [this.child]; + } + call(context) { + const fn = this.fn; + const inlineFnContext = { + parent: context.parent, + get node() { + return context.node; + }, + get nodes() { + return context.nodes; + } + }; + const result = fn(inlineFnContext); + this.child = createVNode(result, this); + } + attach(context) { + this.call(context); + } + update(prev, context) { + const prevContext = context.vdom.getVNodeContext(prev); + this.call(prevContext); + } + } + class NullVNode extends VNodeBase { + matches(other) { + return other instanceof NullVNode; + } + } + class DOMVNode extends VNodeBase { + constructor(node, childSpecs, parent, isNative) { + super(parent); + this.node = node; + this.childSpecs = childSpecs; + this.isNative = isNative; + } + matches(other) { + return other instanceof DOMVNode && this.node === other.node; + } + wrap() { + this.childVNodes = this.childSpecs.map((spec) => + createVNode(spec, this) + ); + } + insertNode(context) { + const {parent, sibling} = context; + const shouldInsert = !( + parent === this.node.parentElement && + sibling === this.node.previousSibling + ); + if (shouldInsert) { + const target = sibling + ? sibling.nextSibling + : parent.firstChild; + parent.insertBefore(this.node, target); + } + } + attach(context) { + this.wrap(); + this.insertNode(context); + } + detach(context) { + context.parent.removeChild(this.node); + } + update(prev, context) { + this.wrap(); + this.insertNode(context); + } + cleanupDOMChildren(context) { + const element = this.node; + for (let current = element.lastChild; current != null; ) { + if (context.vdom.isDOMNodeCaptured(current)) { + current = current.previousSibling; + } else { + const prev = current.previousSibling; + element.removeChild(current); + current = prev; + } + } + } + refine(context) { + if (!this.isNative) { + this.cleanupDOMChildren(context); + } + const element = this.node; + markElementAsRefined(element, context.vdom); + } + attached(context) { + const {node} = this; + if ( + node instanceof Element && + !isElementRefined(node, context.vdom) && + context.vdom.isDOMNodeCaptured(node) + ) { + this.refine(context); + } + } + children() { + return this.childVNodes; + } + } + function isDOMVNode(v) { + return v instanceof DOMVNode; + } + function createDOMVNode(node, childSpecs, parent, isNative) { + return new DOMVNode(node, childSpecs, parent, isNative); + } + class ArrayVNode extends VNodeBase { + constructor(items, key, parent) { + super(parent); + this.items = items; + this.id = key; + } + matches(other) { + return other instanceof ArrayVNode; + } + key() { + return this.id; + } + children() { + return this.childVNodes; + } + wrap() { + this.childVNodes = this.items.map((spec) => + createVNode(spec, this) + ); + } + attach() { + this.wrap(); + } + update() { + this.wrap(); + } + } + function createVNode(spec, parent) { + if (isNodeSpec(spec)) { + return new ElementVNode(spec, parent); + } + if (isComponentSpec(spec)) { + if (spec.type === Array) { + return new ArrayVNode(spec.children, spec.props.key, parent); + } + return new ComponentVNode(spec, parent); + } + if (typeof spec === "string") { + return new TextVNode(spec, parent); + } + if (spec == null) { + return new NullVNode(parent); + } + if (typeof spec === "function") { + return new InlineFunctionVNode(spec, parent); + } + if (spec instanceof Node) { + return createDOMVNode(spec, [], parent, true); + } + if (Array.isArray(spec)) { + return new ArrayVNode(spec, null, parent); + } + throw new Error("Unable to create virtual node for spec"); + } + + function createVDOM(rootNode) { + const contexts = new WeakMap(); + const hubs = new WeakMap(); + const parentNodes = new WeakMap(); + const passingLinks = new WeakMap(); + const linkedParents = new WeakSet(); + const LEAVE = Symbol(); + function execute$1(vnode, old) { + execute(vnode, old, vdom); + } + function creatVNodeContext(vnode) { + const parentNode = parentNodes.get(vnode); + contexts.set(vnode, { + parent: parentNode, + get node() { + const linked = passingLinks + .get(vnode) + .find((link) => link.node != null); + return linked ? linked.node : null; + }, + get nodes() { + return passingLinks + .get(vnode) + .map((link) => link.node) + .filter((node) => node); + }, + get sibling() { + if (parentNode === rootNode.parentElement) { + return passingLinks.get(vnode).first.node + .previousSibling; + } + const hub = hubs.get(parentNode); + let current = passingLinks.get(vnode).first; + while ((current = hub.links.before(current))) { + if (current.node) { + return current.node; + } + } + return null; + }, + vdom + }); + } + function createRootVNodeLinks(vnode) { + const parentNode = + rootNode.parentElement || document.createDocumentFragment(); + const node = rootNode; + const links = new LinkedList({ + parentNode, + node + }); + passingLinks.set(vnode, links.copy()); + parentNodes.set(vnode, parentNode); + hubs.set(parentNode, { + node: parentNode, + links + }); + } + function createVNodeLinks(vnode) { + const parent = vnode.parent(); + const isBranch = linkedParents.has(parent); + const parentNode = isDOMVNode(parent) + ? parent.node + : parentNodes.get(parent); + parentNodes.set(vnode, parentNode); + const vnodeLinks = new LinkedList(); + passingLinks.set(vnode, vnodeLinks); + if (isBranch) { + const newLink = { + parentNode, + node: null + }; + let current = vnode; + do { + passingLinks.get(current).push(newLink); + current = current.parent(); + } while (current && !isDOMVNode(current)); + hubs.get(parentNode).links.push(newLink); + } else { + linkedParents.add(parent); + const links = isDOMVNode(parent) + ? hubs.get(parentNode).links + : passingLinks.get(parent); + links.forEach((link) => vnodeLinks.push(link)); + } + } + function connectDOMVNode(vnode) { + if (isDOMVNode(vnode)) { + const {node} = vnode; + hubs.set(node, { + node, + links: new LinkedList({ + parentNode: node, + node: null + }) + }); + passingLinks.get(vnode).forEach((link) => (link.node = node)); + } + } + function addVNode(vnode) { + const parent = vnode.parent(); + if (parent == null) { + createRootVNodeLinks(vnode); + } else { + createVNodeLinks(vnode); + } + connectDOMVNode(vnode); + creatVNodeContext(vnode); + } + function getVNodeContext(vnode) { + return contexts.get(vnode); + } + function getAncestorsLinks(vnode) { + const parentNode = parentNodes.get(vnode); + const hub = hubs.get(parentNode); + const allLinks = []; + let current = vnode; + while ((current = current.parent()) && !isDOMVNode(current)) { + allLinks.push(passingLinks.get(current)); + } + allLinks.push(hub.links); + return allLinks; + } + function replaceVNode(old, vnode) { + if (vnode.parent() == null) { + addVNode(vnode); + return; + } + const oldContext = contexts.get(old); + const {parent: parentNode} = oldContext; + parentNodes.set(vnode, parentNode); + const oldLinks = passingLinks.get(old); + const newLink = { + parentNode, + node: null + }; + getAncestorsLinks(vnode).forEach((links) => { + const nextLink = links.after(oldLinks.last); + oldLinks.forEach((link) => links.delete(link)); + if (nextLink) { + links.insertBefore(newLink, nextLink); + } else { + links.push(newLink); + } + }); + const vnodeLinks = new LinkedList(newLink); + passingLinks.set(vnode, vnodeLinks); + creatVNodeContext(vnode); + } + function adoptVNode(vnode, parent) { + const vnodeLinks = passingLinks.get(vnode); + const parentLinks = passingLinks.get(parent).copy(); + vnode.parent(parent); + getAncestorsLinks(vnode).forEach((links) => { + vnodeLinks.forEach((link) => + links.insertBefore(link, parentLinks.first) + ); + parentLinks.forEach((link) => links.delete(link)); + }); + } + function isDOMNodeCaptured(node) { + return hubs.has(node) && node !== rootNode.parentElement; + } + const vdom = { + execute: execute$1, + addVNode, + getVNodeContext, + replaceVNode, + adoptVNode, + isDOMNodeCaptured, + LEAVE + }; + return vdom; + } + + const roots = new WeakMap(); + const vdoms = new WeakMap(); + function realize(node, vnode) { + const old = roots.get(node) || null; + roots.set(node, vnode); + let vdom; + if (vdoms.has(node)) { + vdom = vdoms.get(node); + } else { + vdom = createVDOM(node); + vdoms.set(node, vdom); + } + vdom.execute(vnode, old); + return vdom.getVNodeContext(vnode); + } + function render$1(element, spec) { + const vnode = createDOMVNode( + element, + Array.isArray(spec) ? spec : [spec], + null, + false + ); + realize(element, vnode); + return element; + } + function sync(node, spec) { + const vnode = createVNode(spec, null); + const context = realize(node, vnode); + const {nodes} = context; + if (nodes.length !== 1 || nodes[0] !== node) { + throw new Error("Spec does not match the node"); + } + return nodes[0]; + } + + function normalize(attrsOrChild, ...otherChildren) { + const attrs = + isObject(attrsOrChild) && !isSpec(attrsOrChild) + ? attrsOrChild + : null; + const children = + attrs == null + ? [attrsOrChild].concat(otherChildren) + : otherChildren; + return {attrs, children}; + } + function createTagFunction(tag) { + return (attrsOrChild, ...otherChildren) => { + const {attrs, children} = normalize(attrsOrChild, otherChildren); + return m(tag, attrs, children); + }; + } + new Proxy( + {}, + { + get: (_, tag) => { + return createTagFunction(tag); + } + } + ); + + var MessageType; + (function (MessageType) { + MessageType["UI_GET_DATA"] = "ui-get-data"; + MessageType["UI_SUBSCRIBE_TO_CHANGES"] = "ui-subscribe-to-changes"; + MessageType["UI_UNSUBSCRIBE_FROM_CHANGES"] = + "ui-unsubscribe-from-changes"; + MessageType["UI_CHANGE_SETTINGS"] = "ui-change-settings"; + MessageType["UI_SET_THEME"] = "ui-set-theme"; + MessageType["UI_SET_SHORTCUT"] = "ui-set-shortcut"; + MessageType["UI_TOGGLE_ACTIVE_TAB"] = "ui-toggle-active-tab"; + MessageType["UI_MARK_NEWS_AS_READ"] = "ui-mark-news-as-read"; + MessageType["UI_MARK_NEWS_AS_DISPLAYED"] = "ui-mark-news-as-displayed"; + MessageType["UI_LOAD_CONFIG"] = "ui-load-config"; + MessageType["UI_APPLY_DEV_DYNAMIC_THEME_FIXES"] = + "ui-apply-dev-dynamic-theme-fixes"; + MessageType["UI_RESET_DEV_DYNAMIC_THEME_FIXES"] = + "ui-reset-dev-dynamic-theme-fixes"; + MessageType["UI_APPLY_DEV_INVERSION_FIXES"] = + "ui-apply-dev-inversion-fixes"; + MessageType["UI_RESET_DEV_INVERSION_FIXES"] = + "ui-reset-dev-inversion-fixes"; + MessageType["UI_APPLY_DEV_STATIC_THEMES"] = + "ui-apply-dev-static-themes"; + MessageType["UI_RESET_DEV_STATIC_THEMES"] = + "ui-reset-dev-static-themes"; + MessageType["UI_SAVE_FILE"] = "ui-save-file"; + MessageType["UI_REQUEST_EXPORT_CSS"] = "ui-request-export-css"; + MessageType["UI_COLOR_SCHEME_CHANGE"] = "ui-color-scheme-change"; + MessageType["BG_CHANGES"] = "bg-changes"; + MessageType["BG_ADD_CSS_FILTER"] = "bg-add-css-filter"; + MessageType["BG_ADD_STATIC_THEME"] = "bg-add-static-theme"; + MessageType["BG_ADD_SVG_FILTER"] = "bg-add-svg-filter"; + MessageType["BG_ADD_DYNAMIC_THEME"] = "bg-add-dynamic-theme"; + MessageType["BG_EXPORT_CSS"] = "bg-export-css"; + MessageType["BG_UNSUPPORTED_SENDER"] = "bg-unsupported-sender"; + MessageType["BG_CLEAN_UP"] = "bg-clean-up"; + MessageType["BG_RELOAD"] = "bg-reload"; + MessageType["BG_FETCH_RESPONSE"] = "bg-fetch-response"; + MessageType["BG_UI_UPDATE"] = "bg-ui-update"; + MessageType["BG_CSS_UPDATE"] = "bg-css-update"; + MessageType["CS_COLOR_SCHEME_CHANGE"] = "cs-color-scheme-change"; + MessageType["CS_FRAME_CONNECT"] = "cs-frame-connect"; + MessageType["CS_FRAME_FORGET"] = "cs-frame-forget"; + MessageType["CS_FRAME_FREEZE"] = "cs-frame-freeze"; + MessageType["CS_FRAME_RESUME"] = "cs-frame-resume"; + MessageType["CS_EXPORT_CSS_RESPONSE"] = "cs-export-css-response"; + MessageType["CS_FETCH"] = "cs-fetch"; + MessageType["CS_DARK_THEME_DETECTED"] = "cs-dark-theme-detected"; + MessageType["CS_DARK_THEME_NOT_DETECTED"] = + "cs-dark-theme-not-detected"; + MessageType["CS_LOG"] = "cs-log"; + })(MessageType || (MessageType = {})); + + const isNavigatorDefined = typeof navigator !== "undefined"; + const userAgent = isNavigatorDefined + ? navigator.userAgentData && + Array.isArray(navigator.userAgentData.brands) + ? navigator.userAgentData.brands + .map( + (brand) => `${brand.brand.toLowerCase()} ${brand.version}` + ) + .join(" ") + : navigator.userAgent.toLowerCase() + : "some useragent"; + const platform = isNavigatorDefined + ? navigator.userAgentData && + typeof navigator.userAgentData.platform === "string" + ? navigator.userAgentData.platform.toLowerCase() + : navigator.platform.toLowerCase() + : "some platform"; + const isThunderbird = userAgent.includes("thunderbird"); + const isFirefox = + userAgent.includes("firefox") || + userAgent.includes("librewolf") || + isThunderbird; + userAgent.includes("vivaldi"); + userAgent.includes("yabrowser"); + userAgent.includes("opr") || userAgent.includes("opera"); + userAgent.includes("edg"); + platform.startsWith("win"); + platform.startsWith("mac"); + isNavigatorDefined && navigator.userAgentData + ? navigator.userAgentData.mobile + : userAgent.includes("mobile"); + (() => { + const m = userAgent.match(/chrom(?:e|ium)(?:\/| )([^ ]+)/); + if (m && m[1]) { + return m[1]; + } + return ""; + })(); + (() => { + const m = userAgent.match(/(?:firefox|librewolf)(?:\/| )([^ ]+)/); + if (m && m[1]) { + return m[1]; + } + return ""; + })(); + (() => { + try { + document.querySelector(":defined"); + return true; + } catch (err) { + return false; + } + })(); + (() => { + if (typeof document === "undefined") { + return false; + } + const el = document.createElement("div"); + el.setAttribute("style", "color-scheme: dark"); + return el.style && el.style.colorScheme === "dark"; + })(); + + function classes(...args) { + const classes = []; + args.filter((c) => Boolean(c)).forEach((c) => { + if (typeof c === "string") { + classes.push(c); + } else if (typeof c === "object") { + classes.push( + ...Object.keys(c).filter((key) => Boolean(c[key])) + ); + } + }); + return classes.join(" "); + } + function throttle(callback) { + let frameId = null; + return (...args) => { + if (!frameId) { + callback(...args); + frameId = requestAnimationFrame(() => (frameId = null)); + } + }; + } + function onSwipeStart(startEventObj, startHandler) { + const isTouchEvent = + typeof TouchEvent !== "undefined" && + startEventObj instanceof TouchEvent; + const touchId = isTouchEvent + ? startEventObj.changedTouches[0].identifier + : null; + const pointerMoveEvent = isTouchEvent ? "touchmove" : "mousemove"; + const pointerUpEvent = isTouchEvent ? "touchend" : "mouseup"; + if (!isTouchEvent) { + startEventObj.preventDefault(); + } + function getSwipeEventObject(e) { + const {clientX, clientY} = isTouchEvent ? getTouch(e) : e; + return {clientX, clientY}; + } + const startSE = getSwipeEventObject(startEventObj); + const {move: moveHandler, up: upHandler} = startHandler( + startSE, + startEventObj + ); + function getTouch(e) { + return Array.from(e.changedTouches).find( + ({identifier: id}) => id === touchId + ); + } + const onPointerMove = throttle((e) => { + const se = getSwipeEventObject(e); + moveHandler(se, e); + }); + function onPointerUp(e) { + unsubscribe(); + const se = getSwipeEventObject(e); + upHandler(se, e); + } + function unsubscribe() { + window.removeEventListener(pointerMoveEvent, onPointerMove); + window.removeEventListener(pointerUpEvent, onPointerUp); + } + window.addEventListener(pointerMoveEvent, onPointerMove, { + passive: true + }); + window.addEventListener(pointerUpEvent, onPointerUp, {passive: true}); + } + function createSwipeHandler(startHandler) { + return (e) => onSwipeStart(e, startHandler); + } + + function toArray(x) { + return Array.isArray(x) ? x : [x]; + } + function mergeClass(cls, propsCls) { + const normalized = toArray(cls).concat(toArray(propsCls)); + return classes(...normalized); + } + function omitAttrs(omit, attrs) { + const result = {}; + Object.keys(attrs).forEach((key) => { + if (omit.indexOf(key) < 0) { + result[key] = attrs[key]; + } + }); + return result; + } + function isElementHidden(element) { + return element.offsetParent === null; + } + + function Button(props, ...children) { + const cls = mergeClass("button", props.class); + const attrs = omitAttrs(["class"], props); + return m$1( + "button", + {class: cls, ...attrs}, + m$1("span", {class: "button__wrapper"}, ...children) + ); + } + + function evalMath(expression) { + const rpnStack = []; + const workingStack = []; + let lastToken; + for (let i = 0, len = expression.length; i < len; i++) { + const token = expression[i]; + if (!token || token === " ") { + continue; + } + if (operators.has(token)) { + const op = operators.get(token); + while (workingStack.length) { + const currentOp = operators.get(workingStack[0]); + if (!currentOp) { + break; + } + if (op.lessOrEqualThan(currentOp)) { + rpnStack.push(workingStack.shift()); + } else { + break; + } + } + workingStack.unshift(token); + } else if (!lastToken || operators.has(lastToken)) { + rpnStack.push(token); + } else { + rpnStack[rpnStack.length - 1] += token; + } + lastToken = token; + } + rpnStack.push(...workingStack); + const stack = []; + for (let i = 0, len = rpnStack.length; i < len; i++) { + const op = operators.get(rpnStack[i]); + if (op) { + const args = stack.splice(0, 2); + stack.push(op.exec(args[1], args[0])); + } else { + stack.unshift(parseFloat(rpnStack[i])); + } + } + return stack[0]; + } + class Operator { + constructor(precedence, method) { + this.precendce = precedence; + this.execMethod = method; + } + exec(left, right) { + return this.execMethod(left, right); + } + lessOrEqualThan(op) { + return this.precendce <= op.precendce; + } + } + const operators = new Map([ + ["+", new Operator(1, (left, right) => left + right)], + ["-", new Operator(1, (left, right) => left - right)], + ["*", new Operator(2, (left, right) => left * right)], + ["/", new Operator(2, (left, right) => left / right)] + ]); + + function getParenthesesRange(input, searchStartIndex = 0) { + const length = input.length; + let depth = 0; + let firstOpenIndex = -1; + for (let i = searchStartIndex; i < length; i++) { + if (depth === 0) { + const openIndex = input.indexOf("(", i); + if (openIndex < 0) { + break; + } + firstOpenIndex = openIndex; + depth++; + i = openIndex; + } else { + const closingIndex = input.indexOf(")", i); + if (closingIndex < 0) { + break; + } + const openIndex = input.indexOf("(", i); + if (openIndex < 0 || closingIndex < openIndex) { + depth--; + if (depth === 0) { + return {start: firstOpenIndex, end: closingIndex + 1}; + } + i = closingIndex; + } else { + depth++; + i = openIndex; + } + } + } + return null; + } + + const rgbaParseCache = new Map(); + function parseColorWithCache($color) { + $color = $color.trim(); + if (rgbaParseCache.has($color)) { + return rgbaParseCache.get($color); + } + if ($color.includes("calc(")) { + $color = lowerCalcExpression($color); + } + const color = parse($color); + color && rgbaParseCache.set($color, color); + return color; + } + function hslToRGB({h, s, l, a = 1}) { + if (s === 0) { + const [r, b, g] = [l, l, l].map((x) => Math.round(x * 255)); + return {r, g, b, a}; + } + const c = (1 - Math.abs(2 * l - 1)) * s; + const x = c * (1 - Math.abs(((h / 60) % 2) - 1)); + const m = l - c / 2; + const [r, g, b] = ( + h < 60 + ? [c, x, 0] + : h < 120 + ? [x, c, 0] + : h < 180 + ? [0, c, x] + : h < 240 + ? [0, x, c] + : h < 300 + ? [x, 0, c] + : [c, 0, x] + ).map((n) => Math.round((n + m) * 255)); + return {r, g, b, a}; + } + function rgbToHSL({r: r255, g: g255, b: b255, a = 1}) { + const r = r255 / 255; + const g = g255 / 255; + const b = b255 / 255; + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + const c = max - min; + const l = (max + min) / 2; + if (c === 0) { + return {h: 0, s: 0, l, a}; + } + let h = + (max === r + ? ((g - b) / c) % 6 + : max === g + ? (b - r) / c + 2 + : (r - g) / c + 4) * 60; + if (h < 0) { + h += 360; + } + const s = c / (1 - Math.abs(2 * l - 1)); + return {h, s, l, a}; + } + function toFixed(n, digits = 0) { + const fixed = n.toFixed(digits); + if (digits === 0) { + return fixed; + } + const dot = fixed.indexOf("."); + if (dot >= 0) { + const zerosMatch = fixed.match(/0+$/); + if (zerosMatch) { + if (zerosMatch.index === dot + 1) { + return fixed.substring(0, dot); + } + return fixed.substring(0, zerosMatch.index); + } + } + return fixed; + } + function rgbToHexString({r, g, b, a}) { + return `#${(a != null && a < 1 + ? [r, g, b, Math.round(a * 255)] + : [r, g, b] + ) + .map((x) => { + return `${x < 16 ? "0" : ""}${x.toString(16)}`; + }) + .join("")}`; + } + function hslToString(hsl) { + const {h, s, l, a} = hsl; + if (a != null && a < 1) { + return `hsla(${toFixed(h)}, ${toFixed(s * 100)}%, ${toFixed( + l * 100 + )}%, ${toFixed(a, 2)})`; + } + return `hsl(${toFixed(h)}, ${toFixed(s * 100)}%, ${toFixed(l * 100)}%)`; + } + const rgbMatch = /^rgba?\([^\(\)]+\)$/; + const hslMatch = /^hsla?\([^\(\)]+\)$/; + const hexMatch = /^#[0-9a-f]+$/i; + function parse($color) { + const c = $color.trim().toLowerCase(); + if (c.match(rgbMatch)) { + return parseRGB(c); + } + if (c.match(hslMatch)) { + return parseHSL(c); + } + if (c.match(hexMatch)) { + return parseHex(c); + } + if (knownColors.has(c)) { + return getColorByName(c); + } + if (systemColors.has(c)) { + return getSystemColor(c); + } + if ($color === "transparent") { + return {r: 0, g: 0, b: 0, a: 0}; + } + return null; + } + function getNumbers($color) { + const numbers = []; + let prevPos = 0; + let isMining = false; + const startIndex = $color.indexOf("("); + $color = $color.substring(startIndex + 1, $color.length - 1); + for (let i = 0; i < $color.length; i++) { + const c = $color[i]; + if ((c >= "0" && c <= "9") || c === "." || c === "+" || c === "-") { + isMining = true; + } else if (isMining && (c === " " || c === ",")) { + numbers.push($color.substring(prevPos, i)); + isMining = false; + prevPos = i + 1; + } else if (!isMining) { + prevPos = i + 1; + } + } + if (isMining) { + numbers.push($color.substring(prevPos, $color.length)); + } + return numbers; + } + function getNumbersFromString(str, range, units) { + const raw = getNumbers(str); + const unitsList = Object.entries(units); + const numbers = raw + .map((r) => r.trim()) + .map((r, i) => { + let n; + const unit = unitsList.find(([u]) => r.endsWith(u)); + if (unit) { + n = + (parseFloat(r.substring(0, r.length - unit[0].length)) / + unit[1]) * + range[i]; + } else { + n = parseFloat(r); + } + if (range[i] > 1) { + return Math.round(n); + } + return n; + }); + return numbers; + } + const rgbRange = [255, 255, 255, 1]; + const rgbUnits = {"%": 100}; + function parseRGB($rgb) { + const [r, g, b, a = 1] = getNumbersFromString($rgb, rgbRange, rgbUnits); + return {r, g, b, a}; + } + const hslRange = [360, 1, 1, 1]; + const hslUnits = {"%": 100, "deg": 360, "rad": 2 * Math.PI, "turn": 1}; + function parseHSL($hsl) { + const [h, s, l, a = 1] = getNumbersFromString($hsl, hslRange, hslUnits); + return hslToRGB({h, s, l, a}); + } + function parseHex($hex) { + const h = $hex.substring(1); + switch (h.length) { + case 3: + case 4: { + const [r, g, b] = [0, 1, 2].map((i) => + parseInt(`${h[i]}${h[i]}`, 16) + ); + const a = + h.length === 3 ? 1 : parseInt(`${h[3]}${h[3]}`, 16) / 255; + return {r, g, b, a}; + } + case 6: + case 8: { + const [r, g, b] = [0, 2, 4].map((i) => + parseInt(h.substring(i, i + 2), 16) + ); + const a = + h.length === 6 ? 1 : parseInt(h.substring(6, 8), 16) / 255; + return {r, g, b, a}; + } + } + return null; + } + function getColorByName($color) { + const n = knownColors.get($color); + return { + r: (n >> 16) & 255, + g: (n >> 8) & 255, + b: (n >> 0) & 255, + a: 1 + }; + } + function getSystemColor($color) { + const n = systemColors.get($color); + return { + r: (n >> 16) & 255, + g: (n >> 8) & 255, + b: (n >> 0) & 255, + a: 1 + }; + } + function lowerCalcExpression(color) { + let searchIndex = 0; + const replaceBetweenIndices = (start, end, replacement) => { + color = + color.substring(0, start) + replacement + color.substring(end); + }; + while ((searchIndex = color.indexOf("calc(")) !== -1) { + const range = getParenthesesRange(color, searchIndex); + if (!range) { + break; + } + let slice = color.slice(range.start + 1, range.end - 1); + const includesPercentage = slice.includes("%"); + slice = slice.split("%").join(""); + const output = Math.round(evalMath(slice)); + replaceBetweenIndices( + range.start - 4, + range.end, + output + (includesPercentage ? "%" : "") + ); + } + return color; + } + const knownColors = new Map( + Object.entries({ + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgrey: 0xa9a9a9, + darkgreen: 0x006400, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + grey: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgrey: 0xd3d3d3, + lightgreen: 0x90ee90, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 + }) + ); + const systemColors = new Map( + Object.entries({ + "ActiveBorder": 0x3b99fc, + "ActiveCaption": 0x000000, + "AppWorkspace": 0xaaaaaa, + "Background": 0x6363ce, + "ButtonFace": 0xffffff, + "ButtonHighlight": 0xe9e9e9, + "ButtonShadow": 0x9fa09f, + "ButtonText": 0x000000, + "CaptionText": 0x000000, + "GrayText": 0x7f7f7f, + "Highlight": 0xb2d7ff, + "HighlightText": 0x000000, + "InactiveBorder": 0xffffff, + "InactiveCaption": 0xffffff, + "InactiveCaptionText": 0x000000, + "InfoBackground": 0xfbfcc5, + "InfoText": 0x000000, + "Menu": 0xf6f6f6, + "MenuText": 0xffffff, + "Scrollbar": 0xaaaaaa, + "ThreeDDarkShadow": 0x000000, + "ThreeDFace": 0xc0c0c0, + "ThreeDHighlight": 0xffffff, + "ThreeDLightShadow": 0xffffff, + "ThreeDShadow": 0x000000, + "Window": 0xececec, + "WindowFrame": 0xaaaaaa, + "WindowText": 0x000000, + "-webkit-focus-ring-color": 0xe59700 + }).map(([key, value]) => [key.toLowerCase(), value]) + ); + + function TextBox(props) { + const cls = mergeClass("textbox", props.class); + const attrs = omitAttrs(["class", "type"], props); + const type = props.type || "text"; + return m$1("input", { + class: cls, + type: type, + spellcheck: "false", + ...attrs + }); + } + + function scale(x, inLow, inHigh, outLow, outHigh) { + return ((x - inLow) * (outHigh - outLow)) / (inHigh - inLow) + outLow; + } + function clamp(x, min, max) { + return Math.min(max, Math.max(min, x)); + } + + const hsbPickerDefaults = { + wasPrevHidden: true, + hueCanvasRendered: false, + activeHSB: null, + activeChangeHandler: null, + hueTouchStartHandler: null, + sbTouchStartHandler: null + }; + function rgbToHSB({r, g, b}) { + const min = Math.min(r, g, b); + const max = Math.max(r, g, b); + return { + h: rgbToHSL({r, g, b}).h, + s: max === 0 ? 0 : 1 - min / max, + b: max / 255 + }; + } + function hsbToRGB({h: hue, s: sat, b: br}) { + let c; + if (hue < 60) { + c = [1, hue / 60, 0]; + } else if (hue < 120) { + c = [(120 - hue) / 60, 1, 0]; + } else if (hue < 180) { + c = [0, 1, (hue - 120) / 60]; + } else if (hue < 240) { + c = [0, (240 - hue) / 60, 1]; + } else if (hue < 300) { + c = [(hue - 240) / 60, 0, 1]; + } else { + c = [1, 0, (360 - hue) / 60]; + } + const max = Math.max(...c); + const [r, g, b] = c + .map((v) => v + (max - v) * (1 - sat)) + .map((v) => v * br) + .map((v) => Math.round(v * 255)); + return {r, g, b, a: 1}; + } + function hsbToString(hsb) { + const rgb = hsbToRGB(hsb); + return rgbToHexString(rgb); + } + function render(canvas, getPixel) { + const {width, height} = canvas; + const context = canvas.getContext("2d"); + const imageData = context.getImageData(0, 0, width, height); + const d = imageData.data; + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + const i = 4 * (y * width + x); + const c = getPixel(x, y); + for (let j = 0; j < 4; j++) { + d[i + j] = c[j]; + } + } + } + context.putImageData(imageData, 0, 0); + } + function renderHue(canvas) { + const {height} = canvas; + render(canvas, (_, y) => { + const hue = scale(y, 0, height, 0, 360); + const {r, g, b} = hsbToRGB({h: hue, s: 1, b: 1}); + return new Uint8ClampedArray([r, g, b, 255]); + }); + } + function renderSB(hue, canvas) { + const {width, height} = canvas; + render(canvas, (x, y) => { + const sat = scale(x, 0, width - 1, 0, 1); + const br = scale(y, 0, height - 1, 1, 0); + const {r, g, b} = hsbToRGB({h: hue, s: sat, b: br}); + return new Uint8ClampedArray([r, g, b, 255]); + }); + } + function HSBPicker(props) { + const context = getComponentContext(); + const store = context.getStore(hsbPickerDefaults); + store.activeChangeHandler = props.onChange; + const prevColor = context.prev && context.prev.props.color; + const prevActiveColor = store.activeHSB + ? hsbToString(store.activeHSB) + : null; + const didColorChange = + props.color !== prevColor && props.color !== prevActiveColor; + let activeHSB; + if (didColorChange) { + const rgb = parseColorWithCache(props.color); + activeHSB = rgbToHSB(rgb); + store.activeHSB = activeHSB; + } else { + activeHSB = store.activeHSB; + } + function onSBCanvasRender(canvas) { + if (isElementHidden(canvas)) { + return; + } + const hue = activeHSB.h; + const prevHue = + prevColor && rgbToHSB(parseColorWithCache(prevColor)).h; + if (store.wasPrevHidden || hue !== prevHue) { + renderSB(hue, canvas); + } + store.wasPrevHidden = false; + } + function onHueCanvasRender(canvas) { + if (store.hueCanvasRendered || isElementHidden(canvas)) { + return; + } + store.hueCanvasRendered = true; + renderHue(canvas); + } + function createHSBSwipeHandler(getEventHSB) { + return createSwipeHandler((startEvt, startNativeEvt) => { + const rect = + startNativeEvt.currentTarget.getBoundingClientRect(); + function onPointerMove(e) { + store.activeHSB = getEventHSB({...e, rect}); + props.onColorPreview(hsbToString(store.activeHSB)); + context.refresh(); + } + function onPointerUp(e) { + const hsb = getEventHSB({...e, rect}); + store.activeHSB = hsb; + props.onChange(hsbToString(hsb)); + } + store.activeHSB = getEventHSB({...startEvt, rect}); + context.refresh(); + return { + move: onPointerMove, + up: onPointerUp + }; + }); + } + const onSBPointerDown = createHSBSwipeHandler( + ({clientX, clientY, rect}) => { + const sat = clamp((clientX - rect.left) / rect.width, 0, 1); + const br = clamp(1 - (clientY - rect.top) / rect.height, 0, 1); + return {...activeHSB, s: sat, b: br}; + } + ); + const onHuePointerDown = createHSBSwipeHandler(({clientY, rect}) => { + const hue = clamp((clientY - rect.top) / rect.height, 0, 1) * 360; + return {...activeHSB, h: hue}; + }); + const hueCursorStyle = { + "background-color": hslToString({ + h: activeHSB.h, + s: 1, + l: 0.5, + a: 1 + }), + "left": "0%", + "top": `${(activeHSB.h / 360) * 100}%` + }; + const sbCursorStyle = { + "background-color": rgbToHexString(hsbToRGB(activeHSB)), + "left": `${activeHSB.s * 100}%`, + "top": `${(1 - activeHSB.b) * 100}%` + }; + return m$1( + "span", + {class: "hsb-picker"}, + m$1( + "span", + { + class: "hsb-picker__sb-container", + onmousedown: onSBPointerDown, + onupdate: (el) => { + if (store.sbTouchStartHandler) { + el.removeEventListener( + "touchstart", + store.sbTouchStartHandler + ); + } + el.addEventListener("touchstart", onSBPointerDown, { + passive: true + }); + store.sbTouchStartHandler = onSBPointerDown; + } + }, + m$1("canvas", { + class: "hsb-picker__sb-canvas", + onrender: onSBCanvasRender + }), + m$1("span", { + class: "hsb-picker__sb-cursor", + style: sbCursorStyle + }) + ), + m$1( + "span", + { + class: "hsb-picker__hue-container", + onmousedown: onHuePointerDown, + onupdate: (el) => { + if (store.hueTouchStartHandler) { + el.removeEventListener( + "touchstart", + store.hueTouchStartHandler + ); + } + el.addEventListener("touchstart", onHuePointerDown, { + passive: true + }); + store.hueTouchStartHandler = onHuePointerDown; + } + }, + m$1("canvas", { + class: "hsb-picker__hue-canvas", + onrender: onHueCanvasRender + }), + m$1("span", { + class: "hsb-picker__hue-cursor", + style: hueCursorStyle + }) + ) + ); + } + + function isValidColor(color) { + return Boolean(parseColorWithCache(color)); + } + const colorPickerFocuses = new WeakMap(); + function focusColorPicker(node) { + const focus = colorPickerFocuses.get(node); + focus(); + } + function ColorPicker(props) { + const context = getComponentContext(); + context.onRender((node) => colorPickerFocuses.set(node, focus)); + const store = context.store; + const isColorValid = isValidColor(props.color); + function onColorPreview(previewColor) { + store.previewNode.style.backgroundColor = previewColor; + store.textBoxNode.value = previewColor; + store.textBoxNode.blur(); + } + function onColorChange(rawValue) { + const value = rawValue.trim(); + if (isValidColor(value)) { + props.onChange(value); + } else { + props.onChange(props.color); + } + } + function focus() { + if (store.isFocused) { + return; + } + store.isFocused = true; + context.refresh(); + window.addEventListener("mousedown", onOuterClick); + } + function blur() { + if (!store.isFocused) { + return; + } + window.removeEventListener("mousedown", onOuterClick); + store.isFocused = false; + context.refresh(); + } + function toggleFocus() { + if (store.isFocused) { + blur(); + } else { + focus(); + } + } + function onOuterClick(e) { + if (!e.composedPath().some((el) => el === context.node)) { + blur(); + } + } + const textBox = m$1(TextBox, { + class: "color-picker__input", + onrender: (el) => { + store.textBoxNode = el; + store.textBoxNode.value = isColorValid ? props.color : ""; + }, + onkeypress: (e) => { + const input = e.target; + if (e.key === "Enter") { + const {value} = input; + onColorChange(value); + blur(); + onColorPreview(value); + } + }, + onfocus: focus + }); + const previewElement = m$1("span", { + class: "color-picker__preview", + onclick: toggleFocus, + onrender: (el) => { + store.previewNode = el; + el.style.backgroundColor = isColorValid + ? props.color + : "transparent"; + } + }); + const resetButton = props.canReset + ? m$1("span", { + role: "button", + class: "color-picker__reset", + onclick: () => { + props.onReset(); + blur(); + } + }) + : null; + const textBoxLine = m$1( + "span", + {class: "color-picker__textbox-line"}, + textBox, + previewElement, + resetButton + ); + const hsbLine = isColorValid + ? m$1( + "span", + {class: "color-picker__hsb-line"}, + m$1(HSBPicker, { + color: props.color, + onChange: onColorChange, + onColorPreview: onColorPreview + }) + ) + : null; + return m$1( + "span", + { + class: [ + "color-picker", + store.isFocused && "color-picker--focused", + props.class + ] + }, + m$1("span", {class: "color-picker__wrapper"}, textBoxLine, hsbLine) + ); + } + Object.assign(ColorPicker, {focus: focusColorPicker}); + + const DEFAULT_OVERLAY_KEY = Symbol(); + const overlayNodes = new Map(); + const clickListeners = new WeakMap(); + function getOverlayDOMNode(key) { + if (key == null) { + key = DEFAULT_OVERLAY_KEY; + } + if (!overlayNodes.has(key)) { + const node = document.createElement("div"); + node.classList.add("overlay"); + node.addEventListener("click", (e) => { + if (clickListeners.has(node) && e.currentTarget === node) { + const listener = clickListeners.get(node); + listener(); + } + }); + overlayNodes.set(key, node); + } + return overlayNodes.get(key); + } + function Overlay(props) { + return getOverlayDOMNode(props.key); + } + function Portal(props, ...content) { + const context = getComponentContext(); + context.onRender(() => { + const node = getOverlayDOMNode(props.key); + if (props.onOuterClick) { + clickListeners.set(node, props.onOuterClick); + } else { + clickListeners.delete(node); + } + render$1(node, content); + }); + context.onRemove(() => { + const container = getOverlayDOMNode(props.key); + render$1(container, null); + }); + return context.leave(); + } + var Overlay$1 = Object.assign(Overlay, {Portal}); + + function MessageBox(props) { + return m$1( + Overlay$1.Portal, + {key: props.portalKey, onOuterClick: props.onCancel}, + m$1( + "div", + {class: "message-box"}, + m$1("label", {class: "message-box__caption"}, props.caption), + m$1( + "div", + {class: "message-box__buttons"}, + m$1( + Button, + { + class: "message-box__button message-box__button-ok", + onclick: props.onOK + }, + "OK" + ), + m$1( + Button, + { + class: "message-box__button message-box__button-cancel", + onclick: props.onCancel + }, + "Cancel" + ) + ) + ) + ); + } + + function isIPV6(url) { + const openingBracketIndex = url.indexOf("["); + if (openingBracketIndex < 0) { + return false; + } + const queryIndex = url.indexOf("?"); + if (queryIndex >= 0 && openingBracketIndex > queryIndex) { + return false; + } + return true; + } + const ipV6HostRegex = /\[.*?\](\:\d+)?/; + function compareIPV6(firstURL, secondURL) { + const firstHost = firstURL.match(ipV6HostRegex)[0]; + const secondHost = secondURL.match(ipV6HostRegex)[0]; + return firstHost === secondHost; + } + + function getURLHostOrProtocol($url) { + const url = new URL($url); + if (url.host) { + return url.host; + } else if (url.protocol === "file:") { + return url.pathname; + } + return url.protocol; + } + function isURLInList(url, list) { + for (let i = 0; i < list.length; i++) { + if (isURLMatched(url, list[i])) { + return true; + } + } + return false; + } + function isURLMatched(url, urlTemplate) { + const isFirstIPV6 = isIPV6(url); + const isSecondIPV6 = isIPV6(urlTemplate); + if (isFirstIPV6 && isSecondIPV6) { + return compareIPV6(url, urlTemplate); + } else if (!isFirstIPV6 && !isSecondIPV6) { + const regex = createUrlRegex(urlTemplate); + return Boolean(url.match(regex)); + } + return false; + } + function createUrlRegex(urlTemplate) { + urlTemplate = urlTemplate.trim(); + const exactBeginning = urlTemplate[0] === "^"; + const exactEnding = urlTemplate[urlTemplate.length - 1] === "$"; + urlTemplate = urlTemplate + .replace(/^\^/, "") + .replace(/\$$/, "") + .replace(/^.*?\/{2,3}/, "") + .replace(/\?.*$/, "") + .replace(/\/$/, ""); + let slashIndex; + let beforeSlash; + let afterSlash; + if ((slashIndex = urlTemplate.indexOf("/")) >= 0) { + beforeSlash = urlTemplate.substring(0, slashIndex); + afterSlash = urlTemplate.replace(/\$/g, "").substring(slashIndex); + } else { + beforeSlash = urlTemplate.replace(/\$/g, ""); + } + let result = exactBeginning + ? "^(.*?\\:\\/{2,3})?" + : "^(.*?\\:\\/{2,3})?([^/]*?\\.)?"; + const hostParts = beforeSlash.split("."); + result += "("; + for (let i = 0; i < hostParts.length; i++) { + if (hostParts[i] === "*") { + hostParts[i] = "[^\\.\\/]+?"; + } + } + result += hostParts.join("\\."); + result += ")"; + if (afterSlash) { + result += "("; + result += afterSlash.replace("/", "\\/"); + result += ")"; + } + result += exactEnding ? "(\\/?(\\?[^/]*?)?)$" : "(\\/?.*?)$"; + return new RegExp(result, "i"); + } + + function Body({data, actions}) { + const context = getComponentContext(); + const host = getURLHostOrProtocol(data.activeTab.url); + const custom = data.settings.customThemes.find(({url}) => + isURLInList(data.activeTab.url, url) + ); + let textNode; + const placeholderText = [ + "* {", + " background-color: #234 !important;", + " color: #cba !important;", + "}" + ].join("\n"); + function onTextRender(node) { + textNode = node; + textNode.value = + (custom + ? custom.theme.stylesheet + : data.settings.theme.stylesheet) || ""; + if (document.activeElement !== textNode) { + textNode.focus(); + } + } + function applyStyleSheet(css) { + if (custom) { + custom.theme = {...custom.theme, ...{stylesheet: css}}; + actions.changeSettings({ + customThemes: data.settings.customThemes + }); + } else { + actions.setTheme({stylesheet: css}); + } + } + function showDialog() { + context.store.isDialogVisible = true; + context.refresh(); + } + function hideDialog() { + context.store.isDialogVisible = false; + context.refresh(); + } + const dialog = + context && context.store.isDialogVisible + ? m$1(MessageBox, { + caption: + "Are you sure you want to remove current changes? You cannot restore them later.", + onOK: reset, + onCancel: hideDialog + }) + : null; + function reset() { + context.store.isDialogVisible = false; + applyStyleSheet(""); + } + function apply() { + const css = textNode.value; + applyStyleSheet(css); + } + return m$1( + "body", + null, + m$1( + "header", + null, + m$1("img", { + id: "logo", + src: "../assets/images/darkreader-type.svg", + alt: "Dark Reader" + }), + m$1("h1", {id: "title"}, "CSS Editor") + ), + m$1("h3", {id: "sub-title"}, custom ? host : "All websites"), + m$1("textarea", { + id: "editor", + native: true, + placeholder: placeholderText, + onrender: onTextRender, + spellcheck: "false", + autocorrect: "off", + autocomplete: "off", + autocapitalize: "off" + }), + m$1( + "div", + {id: "buttons"}, + m$1(Button, {onclick: showDialog}, "Reset changes", dialog), + m$1(Button, {onclick: apply}, "Apply") + ), + m$1(Overlay$1, null) + ); + } + + class Connector { + constructor() { + this.onChangesReceived = ({type, data}) => { + if (type === MessageType.BG_CHANGES) { + this.changeSubscribers.forEach((callback) => + callback(data) + ); + } + }; + this.changeSubscribers = new Set(); + } + async sendRequest(type, data) { + return new Promise((resolve, reject) => { + chrome.runtime.sendMessage({type, data}, ({data, error}) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + }); + } + async firefoxSendRequestWithResponse(type, data) { + return new Promise((resolve, reject) => { + const dataPort = chrome.runtime.connect({name: type}); + dataPort.onDisconnect.addListener(() => reject()); + dataPort.onMessage.addListener(({data, error}) => { + if (error) { + reject(error); + } else { + resolve(data); + } + dataPort.disconnect(); + }); + data && dataPort.postMessage({data}); + }); + } + async getData() { + if (isFirefox) { + return await this.firefoxSendRequestWithResponse( + MessageType.UI_GET_DATA + ); + } + return await this.sendRequest(MessageType.UI_GET_DATA); + } + subscribeToChanges(callback) { + this.changeSubscribers.add(callback); + if (this.changeSubscribers.size === 1) { + chrome.runtime.onMessage.addListener(this.onChangesReceived); + chrome.runtime.sendMessage({ + type: MessageType.UI_SUBSCRIBE_TO_CHANGES + }); + } + } + setShortcut(command, shortcut) { + chrome.runtime.sendMessage({ + type: MessageType.UI_SET_SHORTCUT, + data: {command, shortcut} + }); + } + changeSettings(settings) { + chrome.runtime.sendMessage({ + type: MessageType.UI_CHANGE_SETTINGS, + data: settings + }); + } + setTheme(theme) { + chrome.runtime.sendMessage({ + type: MessageType.UI_SET_THEME, + data: theme + }); + } + toggleActiveTab() { + chrome.runtime.sendMessage({ + type: MessageType.UI_TOGGLE_ACTIVE_TAB, + data: {} + }); + } + markNewsAsRead(ids) { + chrome.runtime.sendMessage({ + type: MessageType.UI_MARK_NEWS_AS_READ, + data: ids + }); + } + markNewsAsDisplayed(ids) { + chrome.runtime.sendMessage({ + type: MessageType.UI_MARK_NEWS_AS_DISPLAYED, + data: ids + }); + } + loadConfig(options) { + chrome.runtime.sendMessage({ + type: MessageType.UI_LOAD_CONFIG, + data: options + }); + } + async applyDevDynamicThemeFixes(text) { + if (isFirefox) { + return await this.firefoxSendRequestWithResponse( + MessageType.UI_APPLY_DEV_DYNAMIC_THEME_FIXES, + text + ); + } + return await this.sendRequest( + MessageType.UI_APPLY_DEV_DYNAMIC_THEME_FIXES, + text + ); + } + resetDevDynamicThemeFixes() { + chrome.runtime.sendMessage({ + type: MessageType.UI_RESET_DEV_DYNAMIC_THEME_FIXES + }); + } + async applyDevInversionFixes(text) { + if (isFirefox) { + return await this.firefoxSendRequestWithResponse( + MessageType.UI_APPLY_DEV_INVERSION_FIXES, + text + ); + } + return await this.sendRequest( + MessageType.UI_APPLY_DEV_INVERSION_FIXES, + text + ); + } + resetDevInversionFixes() { + chrome.runtime.sendMessage({ + type: MessageType.UI_RESET_DEV_INVERSION_FIXES + }); + } + async applyDevStaticThemes(text) { + if (isFirefox) { + return await this.firefoxSendRequestWithResponse( + MessageType.UI_APPLY_DEV_STATIC_THEMES, + text + ); + } + return await this.sendRequest( + MessageType.UI_APPLY_DEV_STATIC_THEMES, + text + ); + } + resetDevStaticThemes() { + chrome.runtime.sendMessage({ + type: MessageType.UI_RESET_DEV_STATIC_THEMES + }); + } + disconnect() { + if (this.changeSubscribers.size > 0) { + this.changeSubscribers.clear(); + chrome.runtime.onMessage.removeListener(this.onChangesReceived); + chrome.runtime.sendMessage({ + type: MessageType.UI_UNSUBSCRIBE_FROM_CHANGES + }); + } + } + } + + function renderBody(data, actions) { + sync(document.body, m$1(Body, {data: data, actions: actions})); + } + async function start() { + const connector = new Connector(); + window.addEventListener("unload", () => connector.disconnect()); + const data = await connector.getData(); + renderBody(data, connector); + connector.subscribeToChanges((data) => renderBody(data, connector)); + } + start(); +})(); diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/stylesheet-editor/style.css b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/stylesheet-editor/style.css new file mode 100644 index 0000000..2281bb4 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0/ui/stylesheet-editor/style.css @@ -0,0 +1,1077 @@ +@font-face { + font-family: "Open Sans"; + src: url("../assets/fonts/OpenSans-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: "Open Sans"; + src: url("../assets/fonts/OpenSans-SemiBold.ttf") format("truetype"); + font-weight: bold; + font-style: normal; +} +@font-face { + font-family: "Open Sans"; + src: url("../assets/fonts/OpenSans-Light.ttf") format("truetype"); + font-weight: 100; + font-style: normal; +} +.button { + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: content-box; + color: #ffffff; + cursor: pointer; + display: inline-block; + height: 1.5rem; + line-height: 0.75rem; + min-width: 1.5rem; + outline: none; + overflow: hidden; + padding: 0; + text-align: center; + transition: background-color 250ms; + -moz-user-select: none; + user-select: none; +} +.button:hover { + background-color: #193945; + transition: background-color 125ms; +} +.button:active { + background-color: #316e7d; +} +.button__wrapper { + height: 100%; + width: 100%; +} +.checkbox { + align-items: stretch; + background-color: #141e24; + border: 0.125rem solid #316e7d; + cursor: pointer; + display: inline-flex; + flex: none; + flex-direction: row; + height: 1.5rem; + transition: background-color 250ms; + width: 1.5rem; +} +.checkbox:hover { + background-color: #193945; + transition: background-color 125ms; +} +.checkbox__input { + display: none; +} +.checkbox__checkmark { + display: inline-block; + height: 100%; + position: relative; + width: 1.5rem; +} +.checkbox__checkmark::before, +.checkbox__checkmark::after { + background-color: #316e7d; + content: ""; + display: inline-block; + height: 0.1875rem; + left: 0.1875rem; + position: absolute; + top: 0.6375rem; + transition: all 125ms; + width: 1.125rem; +} +.checkbox__checkmark::before { + transform: skewY(45deg); +} +.checkbox__checkmark::after { + transform: skewY(-45deg); +} +.checkbox__input:checked + .checkbox__checkmark::before, +.checkbox__input:checked + .checkbox__checkmark::after { + background-color: #ffffff; +} +.checkbox__input:checked + .checkbox__checkmark::before { + top: 0.825rem; + width: 0.375rem; +} +.checkbox__input:checked + .checkbox__checkmark::after { + left: 0.5625rem; + width: 0.75rem; +} +.dropdown { + display: inline-block; + height: 1.5rem; + position: relative; + -moz-user-select: none; + user-select: none; + width: 100%; +} +.dropdown__selected { + align-items: center; + background-color: #316e7d; + background-image: url('data:image/svg+xml;utf8,'); + background-position: center right 0.25rem; + background-repeat: no-repeat; + background-size: 1rem; + color: #ffffff; + display: inline-flex; + height: 1.25rem; + justify-content: center; + line-height: 1.25rem; + margin-top: 0.125rem; + position: absolute; + text-align: center; + width: 100%; +} +.dropdown__selected__text { + display: inline-block; + max-width: calc(100% - 2.5rem); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.dropdown__list { + background-color: #141e24; + border: 0.125rem solid #316e7d; + border-top: none; + box-shadow: 0 0 0.25rem black; + box-sizing: border-box; + display: none; + margin-top: 0.125rem; + overflow: hidden; + position: absolute; + width: 100%; +} +.dropdown__list__item { + align-items: center; + background-color: #141e24; + color: #ffffff; + display: inline-flex; + justify-content: center; + min-height: 1.25rem; + text-align: center; + width: 100%; +} +.dropdown__list__item:hover { + background-color: #193945; + transition: background-color 125ms; +} +.dropdown__list__item--selected { + overflow: hidden; + visibility: hidden; + white-space: nowrap; +} +.dropdown--open .dropdown__list { + display: inline-block; + margin-top: 0rem; + z-index: 1; +} +.dropdown--open .dropdown__list__item { + min-height: 1.5rem; +} +.dropdown--open .dropdown__selected { + height: 1.5rem; + margin-top: 0rem; + z-index: 2; +} +.preview .dropdown { + cursor: pointer; +} +.message-box { + background-color: #141e24; + border-bottom: 0.125rem solid #316e7d; + border-top: 0.125rem solid #316e7d; + display: flex; + flex-direction: column; + padding: 0.75rem; +} +.message-box__caption { + text-align: center; +} +.message-box__buttons { + display: flex; + flex-direction: row; + justify-content: center; + margin-top: 0.5rem; +} +.message-box__button { + min-width: 4rem; +} +.message-box__button:not(:first-child) { + margin-left: 0.5rem; +} +.message-box__button-ok { + border-color: gray; +} +.multi-switch { + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: content-box; + color: #ffffff; + display: inline-flex; + height: 1.5rem; + position: relative; + -moz-user-select: none; + user-select: none; +} +.multi-switch__option { + align-items: center; + cursor: pointer; + display: inline-flex; + justify-content: center; + height: 100%; + overflow: hidden; + position: relative; + transition: background-color 250ms; + white-space: nowrap; + width: 50%; +} +.multi-switch__option:hover:not(.multi-switch__option--selected) { + background-color: #193945; +} +.multi-switch__highlight { + background-color: #316e7d; + display: inline-block; + height: 100%; + left: 0; + position: absolute; + top: 0; + transition: left 125ms, width 125ms; + width: 0; +} +.overlay { + align-items: center; + background-color: rgba(20, 30, 36, 0.5); + flex-direction: column; + display: inline-flex; + height: 100%; + justify-content: center; + left: 0; + position: fixed; + top: 0; + width: 100%; + z-index: 2; +} +.overlay:empty { + display: none; +} +.shortcut { + color: #53a1b3; + cursor: pointer; + display: inline-block; + font-size: 0.625rem; + line-height: 0.875rem; + outline: none; + text-align: center; + text-decoration: none; + white-space: pre; +} +.shortcut:hover { + text-decoration: underline; +} +.shortcut--edit { + color: #ffffff; +} +.shortcut::before { + content: "✎"; + direction: rtl; + display: inline-block; + line-height: 0.875rem; + visibility: hidden; + width: 0; +} +.shortcut:hover::before, +.shortcut--edit::before { + visibility: visible; +} +.tab-panel { + align-items: stretch; + display: flex; + flex-direction: column; + min-height: 0; +} +.tab-panel__button { + border-bottom: 0.125rem solid #316e7d; + border-left: none; + border-right: none; + border-top: none; + box-sizing: border-box; + color: #316e7d; + font-size: 0.875rem; + font-weight: bold; + height: 1.625rem; + padding: 0 0.625rem; + white-space: pre; +} +.tab-panel__button:hover { + color: #53a1b3; +} +.tab-panel__button:active { + background-color: #193945; +} +.tab-panel__button--active { + border-bottom: none; + border-left: 0.125rem solid #316e7d; + border-right: 0.125rem solid #316e7d; + border-top: 0.125rem solid #316e7d; + color: #e96c4c; + padding: 0 0.5rem; +} +.tab-panel__button--active:hover { + color: #e96c4c; +} +.tab-panel__buttons { + display: flex; + flex: none; + flex-direction: row; + justify-content: center; +} +.tab-panel__buttons::before, +.tab-panel__buttons::after { + border-bottom: 0.125rem solid #316e7d; + content: ""; + flex: auto; +} +.tab-panel__tabs { + display: flex; + flex: auto; + flex-direction: row; + margin-top: 0.75rem; + min-height: 0; +} +.tab-panel__tab { + background-color: #141e24; + display: flex; + opacity: 0; + overflow: hidden; + pointer-events: none; + transition: width 250ms, opacity 125ms; + width: 0; +} +.tab-panel__tab--active { + opacity: 1; + pointer-events: all; + transition: width 250ms, opacity 250ms; + width: 100%; +} +.select { + display: inline-flex; + flex-direction: column; + position: relative; +} +.select__line { + display: inline-flex; + flex-direction: row; +} +.select__textbox.textbox { + border-right: none; + flex: auto; + width: 100%; +} +.select__expand { + border-left: none; + flex: none; +} +.select__expand__icon { + display: inline-block; + height: 100%; + position: relative; + width: 100%; +} +.select__expand__icon::before, +.select__expand__icon::after { + background-color: #ffffff; + content: ""; + display: inline-block; + height: 0.1875rem; + position: absolute; + top: 0.75rem; + width: 0.5625rem; + z-index: 1; +} +.select__expand__icon::before { + left: 0.1875rem; + transform: skewY(45deg); +} +.select__expand__icon::after { + left: 0.75rem; + transform: skewY(-45deg); +} +.select__list { + background-color: #141e24; + border-bottom: 0.125rem solid #316e7d; + border-left: 0.125rem solid #316e7d; + border-right: 0.125rem solid #316e7d; + box-sizing: border-box; + left: 0; + max-height: 0; + overflow-x: hidden; + overflow-y: auto; + position: absolute; + top: calc(100% - 0.125rem); + transition: max-height 125ms; + width: 100%; + z-index: 999; +} +.select__list--expanded { + max-height: 12rem; + transition: max-height 500ms; +} +.select__list--short { + overflow: hidden; +} +.select__option { + align-items: center; + background-color: #141e24; + cursor: pointer; + display: flex; + flex: none; + height: 1.5rem; + flex-direction: row; + padding-left: 0.375rem; +} +.select__option:hover { + background-color: #193945; +} +.slider { + display: inline-block; + height: 1.5rem; + position: relative; + width: 100%; +} +.slider__track { + background-color: #193945; + display: inline-block; + height: 0.625rem; + margin-left: 0.25rem; + margin-top: 0.4375rem; + position: absolute; + width: calc(100% - 0.5rem); +} +.slider__track__fill { + background-color: #316e7d; + display: inline-block; + height: 100%; + position: absolute; +} +.slider__track__fill::before { + background-color: #316e7d; + content: ""; + height: 100%; + position: absolute; + right: 100%; + width: 0.25rem; +} +.slider__track::before, +.slider__track::after { + background-color: #193945; + content: ""; + height: 100%; + position: absolute; + width: 0.25rem; +} +.slider__track::before { + right: 100%; +} +.slider__track::after { + left: 100%; +} +.slider__thumb-wrapper { + margin-left: 0.25rem; + position: absolute; + width: calc(100% - 0.5rem); +} +.slider__thumb { + background-color: #ffffff; + cursor: pointer; + display: inline-block; + height: 1.25rem; + margin-left: -0.25rem; + margin-top: 0.125rem; + position: absolute; + width: 0.5rem; +} +.slider__thumb__value { + color: #ffffff; + cursor: default; + left: calc(100% + 0.75rem / 2); + line-height: 1.25rem; + position: absolute; + -moz-user-select: none; + user-select: none; +} +.slider__thumb__value--flip { + left: initial; + right: calc(100% + 0.75rem / 2); +} +.slider--active .slider__thumb { + box-shadow: 0 0 0.25rem black; + height: 1.5rem; + margin-top: 0rem; +} +.slider--active .slider__thumb__value { + line-height: 1.5rem; +} +.slider--active .slider__track { + height: 0.75rem; + margin-top: 0.375rem; +} +.text-list { + border-top: 0.125rem solid #316e7d; + margin-bottom: 0.0625rem; + min-width: 1.5rem; + overflow-x: hidden; + overflow-y: auto; +} +.text-list__textbox.textbox { + border-bottom: 0.0625rem solid #316e7d; + border-left: 0.125rem solid #316e7d; + border-right: 0.125rem solid #316e7d; + border-top: none; + box-sizing: border-box; + flex: none; + height: 1.5625rem; + width: 100%; +} +.text-list__textbox.textbox:last-child { + border-bottom: 0.125rem solid #316e7d; +} +.text-list::-webkit-scrollbar { + width: 1.25rem; +} +.text-list::-webkit-scrollbar-thumb { + border-left: 0.5rem solid #141e24; +} +.textbox { + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: content-box; + color: #53a1b3; + height: 1.5rem; + line-height: 1.5rem; + outline: none; + overflow: hidden; + padding: 0; + text-indent: 0.375rem; + transition: background-color 250ms; +} +.textbox:hover, +.textbox:focus { + background-color: #193945; + transition: background-color 125ms; +} +.textbox:focus { + color: #ffffff; +} +.textbox::placeholder { + color: #316e7d; +} +input[type="time"]::-webkit-calendar-picker-indicator { + filter: invert(54%) sepia(3%) saturate(3931%) hue-rotate(153deg) + brightness(115%) contrast(75%); +} +.time-range-picker { + display: inline-flex; + flex: auto; +} +.time-range-picker__input { + text-align: center; + text-indent: 0; + width: 100%; + background-color: #141e24; +} +.time-range-picker__input--start { + border-right: none; +} +.time-range-picker__input--end { + border-left: 0.0625rem solid #316e7d; +} +.toggle { + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: content-box; + color: #ffffff; + display: inline-flex; + height: 1.5rem; + position: relative; + -moz-user-select: none; + user-select: none; +} +.toggle__btn { + align-items: center; + cursor: pointer; + display: inline-flex; + justify-content: center; + height: 100%; + overflow: hidden; + position: relative; + transition: background-color 250ms; + white-space: nowrap; + width: 50%; +} +.toggle__btn:hover:not(.toggle__btn--active) { + background-color: #193945; +} +.toggle::before { + background-color: #316e7d; + content: ""; + display: inline-block; + height: 100%; + left: 50%; + position: absolute; + top: 0; + transition: left 125ms; + width: 50%; +} +.toggle--checked::before { + left: 0; +} +.updown { + align-items: stretch; + display: flex; + flex-direction: column; + -moz-user-select: none; + user-select: none; +} +.updown__line { + display: flex; + flex-direction: row; +} +.updown__line > :not(:first-child) { + margin-left: 0.5rem; +} +.updown__icon { + display: inline-block; + height: 100%; + position: relative; + width: 100%; +} +.updown__icon::before, +.updown__icon::after { + background-color: #ffffff; + content: ""; + display: inline-block; + height: 0.5625rem; + position: absolute; + width: 0.1875rem; +} +.updown__icon::before { + top: 0.1875rem; +} +.updown__icon::after { + top: 0.75rem; +} +.updown__icon-up::before { + left: 0.75rem; + transform: skewX(45deg); +} +.updown__icon-up::after { + left: 0.75rem; + transform: skewX(-45deg); +} +.updown__icon-down::before { + left: 0.5625rem; + transform: skewX(-45deg); +} +.updown__icon-down::after { + left: 0.5625rem; + transform: skewX(45deg); +} +.updown__button--disabled { + pointer-events: none; +} +.updown__button--disabled:hover, +.updown__button--disabled:active { + background-color: #141e24; +} +.updown__button--disabled .updown__icon::before, +.updown__button--disabled .updown__icon::after { + background-color: #316e7d; +} +.updown__value-text { + font-size: 0.625rem; + line-height: 0.875rem; + text-align: center; + white-space: nowrap; +} +.track { + align-items: center; + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: content-box; + display: inline-flex; + flex: auto; + flex-direction: row; + height: 1.5rem; + justify-content: center; + overflow: hidden; + position: relative; + transition: background-color 250ms; + -moz-user-select: none; + user-select: none; +} +.track:hover { + background-color: #193945; + transition: background-color 125ms; +} +.track--clickable { + cursor: pointer; +} +.track__value { + background-color: #316e7d; + height: 100%; + left: 0; + position: absolute; + top: 0; + transition: width 125ms; +} +.track__label { + color: #ffffff; + display: inline-block; + line-height: 0.75rem; + pointer-events: none; + position: relative; + white-space: nowrap; + z-index: 1; +} +.hsb-picker { + display: flex; + flex-direction: row; + padding: 0.5rem; + touch-action: none; +} +.hsb-picker__sb-container { + cursor: pointer; + height: 7.5rem; + position: relative; + -webkit-tap-highlight-color: transparent; + width: 7.5rem; +} +.hsb-picker__hue-container { + cursor: pointer; + height: 7.5rem; + margin-left: 0.5rem; + position: relative; + -webkit-tap-highlight-color: transparent; + width: 0.75rem; +} +.hsb-picker__sb-canvas { + height: 100%; + width: 100%; +} +.hsb-picker__hue-canvas { + height: 100%; + width: 100%; +} +.hsb-picker__hue-cursor, +.hsb-picker__sb-cursor { + border-radius: 50%; + box-shadow: 0 0 0 0.125rem #ffffff; + display: inline-block; + height: 0.75rem; + margin-top: -0.375rem; + position: absolute; + width: 0.75rem; + z-index: 2; +} +.hsb-picker__sb-cursor { + margin-left: -0.375rem; +} +.color-picker { + height: 1.5rem; + position: relative; + width: 100%; +} +.color-picker__wrapper { + background-color: #141e24; + display: inline-flex; + flex-direction: column; + left: 0; + overflow: hidden; + position: absolute; + top: 0; + width: 100%; +} +.color-picker--focused .color-picker__wrapper { + border: 0.125rem solid #316e7d; + box-sizing: border-box; + z-index: 1; +} +.color-picker__input { + background-color: #316e7d; + border: none; + box-sizing: border-box; + color: #ffffff; + height: 1.25rem; + margin-top: 0.125rem; + text-align: center; + width: 100%; +} +.color-picker--focused .color-picker__input { + margin-top: 0; +} +.color-picker__preview { + cursor: pointer; + display: inline-block; + height: 1rem; + left: 0.25rem; + position: absolute; + top: 0.25rem; + width: 1rem; +} +.color-picker--focused .color-picker__preview { + left: 0.125rem; + top: 0.125rem; +} +.color-picker__reset { + background-image: url('data:image/svg+xml;utf8,'); + background-position: 0 0; + background-repeat: no-repeat; + background-size: 1rem; + cursor: pointer; + display: inline-block; + height: 1rem; + position: absolute; + right: 0.25rem; + top: 0.25rem; + width: 1rem; +} +.color-picker--focused .color-picker__reset { + right: 0.125rem; + top: 0.125rem; +} +.color-picker__textbox-line { + width: 100%; +} +.color-picker__hsb-line { + display: none; + width: 100%; +} +.color-picker--focused .color-picker__hsb-line { + border-color: #316e7d; + display: block; +} +.color-dropdown { + height: 1.5rem; + position: relative; + width: 100%; +} +.color-dropdown__options { + width: 100%; +} +.color-dropdown__picker { + height: 100%; + position: absolute; + right: 0; + top: 0; + width: 100%; +} +.color-dropdown__picker--hidden { + display: none; +} +.nav-button { + background-image: url('data:image/svg+xml;utf8,'); + background-position: center right 0.25rem; + background-repeat: no-repeat; + background-size: 1rem; + width: calc(100% - 2 * 0.125rem); +} +.nav-button__content { + align-items: center; + display: inline-flex; + flex-direction: row; + height: 100%; +} +.reset-button { + width: calc(100% - 2 * 0.125rem); +} +.reset-button__content { + align-items: center; + display: inline-flex; + flex-direction: row; + height: 100%; +} +.reset-button__icon { + background-image: url('data:image/svg+xml;utf8,'); + background-position: 0 0; + background-size: 1rem; + display: inline-block; + height: 1rem; + margin-right: 0.125rem; + width: 1rem; +} +html { + background-color: #141e24; + color: #53a1b3; + color-scheme: dark; + font-family: Open Sans, Segoe UI, Helvetica Neue, Ubuntu, sans-serif; + font-size: 16px; +} +body { + font-family: Open Sans, Segoe UI, Helvetica Neue, Ubuntu, sans-serif; + font-size: 0.75rem; +} +input, +button { + font-family: Open Sans, Segoe UI, Helvetica Neue, Ubuntu, sans-serif; + font-size: 0.75rem; +} +::-moz-selection { + background-color: #e96c4c; + color: #ffffff; +} +::selection { + background-color: #e96c4c; + color: #ffffff; +} +::-webkit-scrollbar { + background-color: #141e24; + width: 0.75rem; +} +::-webkit-scrollbar-thumb { + background-color: #193945; +} +::-webkit-scrollbar-thumb:hover { + background-color: #255461; +} +::-webkit-scrollbar-thumb:active { + background-color: #316e7d; +} +::-webkit-scrollbar-corner { + background-color: #141e24; +} +* { + scrollbar-color: #193945 #141e24; +} +html { + height: 100%; +} +body { + align-items: center; + display: flex; + flex-direction: column; + height: 100%; + margin: 0 auto; +} +header { + align-items: stretch; + display: flex; + flex: none; + flex-direction: row; + flex-wrap: nowrap; + justify-content: center; + margin-top: 0.75rem; +} +#logo { + display: inline-block; + font-size: 0.875rem; + height: 1.5rem; + width: 15rem; +} +#title { + align-items: stretch; + display: inline-flex; + flex-direction: row; + font-size: 2rem; + font-weight: 100; + line-height: 1.5rem; + height: 1.5rem; + margin: 0 0 0 0.5rem; + text-transform: uppercase; + transform: translateY(-0.0625rem); +} +#sub-title { + font-size: 0.75rem; + font-weight: normal; + margin: 0.75rem 0 0 0; + text-transform: uppercase; +} +#editor { + background-color: #141e24; + border: 0.125rem solid #316e7d; + box-sizing: border-box; + color: #53a1b3; + flex: auto; + font-family: monospace; + font-size: 0.75rem; + min-width: 9rem; + outline: none; + padding: 0.375rem; + resize: none; + white-space: pre; + width: 100%; +} +#editor::placeholder { + color: #316e7d; +} +#editor:hover { + background-color: #15252c; +} +#editor:hover::-webkit-scrollbar, +#editor:hover::-webkit-scrollbar-corner { + background-color: #15252c; +} +#editor:focus { + background-color: #15252c; + color: #7eb9c6; +} +#editor:focus::-webkit-scrollbar, +#editor:focus::-webkit-scrollbar-corner { + background-color: #15252c; +} +#error-text { + color: #db4245; + font-family: monospace; + white-space: pre; +} +#buttons { + display: flex; + flex: none; + flex-direction: row; + justify-content: center; + margin-bottom: 0.75rem; + margin-top: 0.5rem; + width: 100%; +} +#buttons > :not(:first-child) { + margin-left: 0.5rem; +} +#buttons .button { + min-width: 3rem; + max-width: 6rem; + width: 100%; +} +#buttons .preview-design-button { + border-color: gray; + max-width: 8rem; +} +#description { + margin: 0 0 0.75rem 0; + text-align: center; + white-space: wrap; +} +#description a { + color: #53a1b3; +} +@media screen and (max-width: 33rem) { + #title { + display: none; + } +} +@media screen and (max-height: 33rem) { + header, + #description { + display: none; + } + #sub-title { + margin-top: 0.5rem; + } + #buttons { + margin-bottom: 0.5rem; + } +} +.message-box { + border: 0.125rem solid #316e7d; +} diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Local Extension Settings/mhajlicjhgoofheldnmollgbgjheenbi/000003.log b/config/includes.chroot/etc/skel/.config/chromium/Default/Local Extension Settings/mhajlicjhgoofheldnmollgbgjheenbi/000003.log new file mode 100644 index 0000000..7c3955e Binary files /dev/null and b/config/includes.chroot/etc/skel/.config/chromium/Default/Local Extension Settings/mhajlicjhgoofheldnmollgbgjheenbi/000003.log differ diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Local Extension Settings/mhajlicjhgoofheldnmollgbgjheenbi/CURRENT b/config/includes.chroot/etc/skel/.config/chromium/Default/Local Extension Settings/mhajlicjhgoofheldnmollgbgjheenbi/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Local Extension Settings/mhajlicjhgoofheldnmollgbgjheenbi/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Local Extension Settings/mhajlicjhgoofheldnmollgbgjheenbi/LOCK b/config/includes.chroot/etc/skel/.config/chromium/Default/Local Extension Settings/mhajlicjhgoofheldnmollgbgjheenbi/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Local Extension Settings/mhajlicjhgoofheldnmollgbgjheenbi/LOG b/config/includes.chroot/etc/skel/.config/chromium/Default/Local Extension Settings/mhajlicjhgoofheldnmollgbgjheenbi/LOG new file mode 100644 index 0000000..ac8d153 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Local Extension Settings/mhajlicjhgoofheldnmollgbgjheenbi/LOG @@ -0,0 +1,2 @@ +2022/10/03-12:52:24.564 240a Creating DB /home/toto/.config/chromium/Default/Local Extension Settings/mhajlicjhgoofheldnmollgbgjheenbi since it was missing. +2022/10/03-12:52:24.564 240a Reusing MANIFEST /home/toto/.config/chromium/Default/Local Extension Settings/mhajlicjhgoofheldnmollgbgjheenbi/MANIFEST-000001 diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Local Extension Settings/mhajlicjhgoofheldnmollgbgjheenbi/MANIFEST-000001 b/config/includes.chroot/etc/skel/.config/chromium/Default/Local Extension Settings/mhajlicjhgoofheldnmollgbgjheenbi/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/config/includes.chroot/etc/skel/.config/chromium/Default/Local Extension Settings/mhajlicjhgoofheldnmollgbgjheenbi/MANIFEST-000001 differ diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Preferences b/config/includes.chroot/etc/skel/.config/chromium/Default/Preferences index 3a17d4d..b68f2d7 100644 --- a/config/includes.chroot/etc/skel/.config/chromium/Default/Preferences +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Preferences @@ -42,6 +42,13 @@ "prompt_for_download": true }, "extensions": { + "commands": { + "linux:Alt+W": { + "command_name": "addSite", + "extension": "eimadpbcbfnmbkopoojfekhnkhdbieeh", + "global": false + } + }, "pinned_extensions": [ "mhajlicjhgoofheldnmollgbgjheenbi" ], @@ -170,15 +177,140 @@ "was_installed_by_default": false, "was_installed_by_oem": false, "withholding_permissions": false - } - } - }, - "protection": { - "macs": { - "extensions": { - "settings": { - "mhajlicjhgoofheldnmollgbgjheenbi": "79B9067C67F3B5C66BEC8498F54EC7297D714BA66D30890E0768BD29FB65AE9A" - } + }, + "eimadpbcbfnmbkopoojfekhnkhdbieeh": { + "active_bit": false, + "active_permissions": { + "api": [ + "alarms", + "fontSettings", + "storage", + "tabs" + ], + "explicit_host": [ + "", + "chrome://favicon/*" + ], + "manifest_permissions": [], + "scriptable_host": [ + "" + ] + }, + "allowlist": 1, + "commands": { + "addSite": { + "suggested_key": "Alt+Shift+A" + }, + "switchEngine": { + "suggested_key": "" + }, + "toggle": { + "suggested_key": "Alt+Shift+D", + "was_assigned": true + } + }, + "content_settings": [], + "creation_flags": 9, + "events": [], + "from_webstore": true, + "granted_permissions": { + "api": [ + "alarms", + "fontSettings", + "storage", + "tabs" + ], + "explicit_host": [ + "", + "chrome://favicon/*" + ], + "manifest_permissions": [], + "scriptable_host": [ + "" + ] + }, + "incognito_content_settings": [], + "incognito_preferences": {}, + "install_time": "13309268551596710", + "location": 1, + "manifest": { + "author": "Alexander Shutau", + "background": { + "page": "background/index.html", + "persistent": true + }, + "browser_action": { + "default_icon": { + "19": "icons/dr_active_19.png", + "38": "icons/dr_active_38.png" + }, + "default_popup": "ui/popup/index.html", + "default_title": "Dark Reader" + }, + "commands": { + "addSite": { + "description": "Activer/Désactiver sur le site actuel", + "suggested_key": { + "default": "Alt+Shift+A" + } + }, + "switchEngine": { + "description": "Mode de génération de thème" + }, + "toggle": { + "description": "Activer/Désactiver l'extension", + "suggested_key": { + "default": "Alt+Shift+D" + } + } + }, + "content_scripts": [ + { + "all_frames": true, + "js": [ + "inject/fallback.js", + "inject/index.js" + ], + "match_about_blank": true, + "matches": [ + "" + ], + "run_at": "document_start" + } + ], + "current_locale": "fr", + "default_locale": "en", + "description": "Thème sombre partout sur le net. Détendez vous et vos yeux, profitez d'un thème sombre sur internet jour et nuit.", + "icons": { + "16": "icons/dr_16.png", + "48": "icons/dr_48.png", + "128": "icons/dr_128.png" + }, + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqBY2tfTtJYiVMirbII2r3WofqCDaxS2zwPddSsgxUWKRm/MW/ymL2ZaP24MmwnegGIoxHkBVyi4cps4/q76c98ViyijoQvdJjAv3ZtUOwbWlYnZ5pU6gPCeZrScHxoTJdxxJJ30DZpMc6qsc3yJVQJlABG2FQFPrhPEGFLP9sCq/M7pY1xH++KsG+jYLB6cU3ItvZ4zntUXRwG2ZBx+XZelsd6FdkVXbDXj/47TNk2Qq8PAqyiK45GgQ+KJjuISAo89ip1xI4tONLCjSHPinD3nz6HiMikQzwn4L8SsB4Wy7rBhMhPRGIWbwHed+L+W3LXhB05Lhwk0YxuOb7QNWRQIDAQAB", + "manifest_version": 2, + "name": "Dark Reader", + "optional_permissions": [ + "contextMenus" + ], + "permissions": [ + "alarms", + "fontSettings", + "storage", + "tabs", + "" + ], + "update_url": "https://clients2.google.com/service/update2/crx", + "version": "4.9.58" + }, + "needs_sync": true, + "path": "eimadpbcbfnmbkopoojfekhnkhdbieeh/4.9.58_0", + "preferences": {}, + "regular_only_preferences": {}, + "state": 1, + "uninstall_url": "https://darkreader.org/goodluck/", + "was_installed_by_default": false, + "was_installed_by_oem": false, + "withholding_permissions": false } } }, @@ -187,7 +319,7 @@ "enable_quiet_permission_ui_enabling_method": { "notifications": 1 } - }, + }, "cookie_controls_mode": 2, "default_content_setting_values": { "notifications": 2 diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/000003.log b/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/000003.log new file mode 100644 index 0000000..e223f22 Binary files /dev/null and b/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/000003.log differ diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/CURRENT b/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/LOCK b/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/LOG b/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/LOG new file mode 100644 index 0000000..1e352c2 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/LOG @@ -0,0 +1,3 @@ +2022/10/03-13:00:01.424 b23 Reusing MANIFEST /home/lionel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/MANIFEST-000001 +2022/10/03-13:00:01.425 b23 Recovering log #3 +2022/10/03-13:00:01.450 b23 Reusing old log /home/lionel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/000003.log diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/LOG.old b/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/LOG.old new file mode 100644 index 0000000..97bfe2f --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/LOG.old @@ -0,0 +1,3 @@ +2022/10/02-18:37:38.546 8eb Reusing MANIFEST /home/lionel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/MANIFEST-000001 +2022/10/02-18:37:38.546 8eb Recovering log #3 +2022/10/02-18:37:38.569 8eb Reusing old log /home/lionel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/000003.log diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/MANIFEST-000001 b/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/config/includes.chroot/etc/skel/.config/chromium/Default/Sync Extension Settings/eimadpbcbfnmbkopoojfekhnkhdbieeh/MANIFEST-000001 differ