From eaf08aad46fd4038c0ed6a61b01029c31f86d694 Mon Sep 17 00:00:00 2001 From: ZStrike Date: Thu, 12 Mar 2026 11:29:26 -0400 Subject: [PATCH] import --- _locales/am/messages.json | 11 + _locales/ar/messages.json | 11 + _locales/bg/messages.json | 11 + _locales/bn/messages.json | 11 + _locales/ca/messages.json | 11 + _locales/cs/messages.json | 11 + _locales/da/messages.json | 11 + _locales/de/messages.json | 11 + _locales/el/messages.json | 11 + _locales/en/messages.json | 158 + _locales/es/messages.json | 11 + _locales/es_419/messages.json | 11 + _locales/et/messages.json | 11 + _locales/fa/messages.json | 11 + _locales/fi/messages.json | 11 + _locales/fil/messages.json | 11 + _locales/fr/messages.json | 11 + _locales/gu/messages.json | 11 + _locales/he/messages.json | 11 + _locales/hi/messages.json | 11 + _locales/hr/messages.json | 11 + _locales/hu/messages.json | 11 + _locales/id/messages.json | 11 + _locales/it/messages.json | 11 + _locales/ja/messages.json | 11 + _locales/kn/messages.json | 11 + _locales/ko/messages.json | 11 + _locales/lt/messages.json | 11 + _locales/lv/messages.json | 11 + _locales/ml/messages.json | 11 + _locales/mr/messages.json | 11 + _locales/ms/messages.json | 11 + _locales/nl/messages.json | 11 + _locales/no/messages.json | 11 + _locales/pl/messages.json | 11 + _locales/pt_BR/messages.json | 11 + _locales/pt_PT/messages.json | 11 + _locales/ro/messages.json | 11 + _locales/ru/messages.json | 11 + _locales/sk/messages.json | 11 + _locales/sl/messages.json | 11 + _locales/sr/messages.json | 11 + _locales/sv/messages.json | 11 + _locales/sw/messages.json | 11 + _locales/ta/messages.json | 11 + _locales/te/messages.json | 11 + _locales/th/messages.json | 11 + _locales/tr/messages.json | 11 + _locales/uk/messages.json | 11 + _locales/vi/messages.json | 11 + _locales/zh_CN/messages.json | 11 + _locales/zh_TW/messages.json | 11 + background.js | 5331 +++++ config/color-schemes.drconf | 74 + config/dark-sites.config | 1121 + config/dynamic-theme-fixes.config | 21004 +++++++++++++++++ config/inversion-fixes.config | 2745 +++ config/static-themes.config | 174 + icons/dm_128.png | Bin 0 -> 5958 bytes icons/dm_16.png | Bin 0 -> 373 bytes icons/dm_42.png | Bin 0 -> 1118 bytes inject/fallback.js | 31 + inject/index.js | 5124 ++++ inject/sub-success-handler.js | 33 + manifest.json | 63 + ui/assets/fonts/LICENSE.txt | 202 + ui/assets/fonts/OpenSans-Light.ttf | Bin 0 -> 101696 bytes ui/assets/fonts/OpenSans-Regular.ttf | Bin 0 -> 96932 bytes ui/assets/fonts/OpenSans-SemiBold.ttf | Bin 0 -> 100820 bytes ui/assets/images/darkreader-icon-256x256.png | Bin 0 -> 5958 bytes ui/assets/images/darkreader-type.svg | 60 + ui/assets/images/mode-dark-32.svg | 60 + ui/assets/images/mode-light-32.svg | 60 + ui/popup/app.js | 1 + ui/popup/compatibility.js | 41 + ui/popup/index.html | 23 + ui/popup/index.js | 7006 ++++++ ui/popup/style.css | 3053 +++ 78 files changed, 46925 insertions(+) create mode 100644 _locales/am/messages.json create mode 100644 _locales/ar/messages.json create mode 100644 _locales/bg/messages.json create mode 100644 _locales/bn/messages.json create mode 100644 _locales/ca/messages.json create mode 100644 _locales/cs/messages.json create mode 100644 _locales/da/messages.json create mode 100644 _locales/de/messages.json create mode 100644 _locales/el/messages.json create mode 100644 _locales/en/messages.json create mode 100644 _locales/es/messages.json create mode 100644 _locales/es_419/messages.json create mode 100644 _locales/et/messages.json create mode 100644 _locales/fa/messages.json create mode 100644 _locales/fi/messages.json create mode 100644 _locales/fil/messages.json create mode 100644 _locales/fr/messages.json create mode 100644 _locales/gu/messages.json create mode 100644 _locales/he/messages.json create mode 100644 _locales/hi/messages.json create mode 100644 _locales/hr/messages.json create mode 100644 _locales/hu/messages.json create mode 100644 _locales/id/messages.json create mode 100644 _locales/it/messages.json create mode 100644 _locales/ja/messages.json create mode 100644 _locales/kn/messages.json create mode 100644 _locales/ko/messages.json create mode 100644 _locales/lt/messages.json create mode 100644 _locales/lv/messages.json create mode 100644 _locales/ml/messages.json create mode 100644 _locales/mr/messages.json create mode 100644 _locales/ms/messages.json create mode 100644 _locales/nl/messages.json create mode 100644 _locales/no/messages.json create mode 100644 _locales/pl/messages.json create mode 100644 _locales/pt_BR/messages.json create mode 100644 _locales/pt_PT/messages.json create mode 100644 _locales/ro/messages.json create mode 100644 _locales/ru/messages.json create mode 100644 _locales/sk/messages.json create mode 100644 _locales/sl/messages.json create mode 100644 _locales/sr/messages.json create mode 100644 _locales/sv/messages.json create mode 100644 _locales/sw/messages.json create mode 100644 _locales/ta/messages.json create mode 100644 _locales/te/messages.json create mode 100644 _locales/th/messages.json create mode 100644 _locales/tr/messages.json create mode 100644 _locales/uk/messages.json create mode 100644 _locales/vi/messages.json create mode 100644 _locales/zh_CN/messages.json create mode 100644 _locales/zh_TW/messages.json create mode 100644 background.js create mode 100644 config/color-schemes.drconf create mode 100644 config/dark-sites.config create mode 100644 config/dynamic-theme-fixes.config create mode 100644 config/inversion-fixes.config create mode 100644 config/static-themes.config create mode 100644 icons/dm_128.png create mode 100644 icons/dm_16.png create mode 100644 icons/dm_42.png create mode 100644 inject/fallback.js create mode 100644 inject/index.js create mode 100644 inject/sub-success-handler.js create mode 100644 manifest.json create mode 100644 ui/assets/fonts/LICENSE.txt create mode 100644 ui/assets/fonts/OpenSans-Light.ttf create mode 100644 ui/assets/fonts/OpenSans-Regular.ttf create mode 100644 ui/assets/fonts/OpenSans-SemiBold.ttf create mode 100644 ui/assets/images/darkreader-icon-256x256.png create mode 100644 ui/assets/images/darkreader-type.svg create mode 100644 ui/assets/images/mode-dark-32.svg create mode 100644 ui/assets/images/mode-light-32.svg create mode 100644 ui/popup/app.js create mode 100644 ui/popup/compatibility.js create mode 100644 ui/popup/index.html create mode 100644 ui/popup/index.js create mode 100644 ui/popup/style.css diff --git a/_locales/am/messages.json b/_locales/am/messages.json new file mode 100644 index 0000000..b81380f --- /dev/null +++ b/_locales/am/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "በእኛ የጨለማ ሁነታ Google Docs ቅጥያ ውጤታማነትን ያሳድጉ። ለተሻሻለ አጻጻፍ እንከን የለሽ የGoogle ሰነዶች ጨለማ ሁነታን ተለማመድ።" + }, + "appName": { + "message": "ጨለማ ሁነታ ጎግል ሰነዶች" + }, + "storeDesc": { + "message": "🌟 ለምን ከተፎካካሪዎች በላይ የጨለማ ሁነታን ጎግል ሰነዶችን ይምረጡ?\n\nየጨለማ ሁነታ ተግባርን በሚያቀርቡ በርካታ የChrome ቅጥያዎች፣ የጨለማ ሁነታ ጂ ሰነዶች ዋና ምርጫዎ ምን እንደሆነ ሊያስቡ ይችላሉ። ለምን ጨለማ ሁነታ ጎግል ሰነዶች ጎልተው እንደሚወጡ እንመርምር፡-\n\n1. ለተጠቃሚ ምቹ የሆነ በይነገጽ፡ ጨለማ ሁነታ ጎግል ሰነዶች ለቀላል ዳሰሳ ቀላል የሆነ በይነገጽ ያቀርባል። ቅንብሮችን እና የማበጀት አማራጮችን መፈለግ ቀላል ነው።\n2. ፍጥነት እና ቅልጥፍና፡- የኛ ቅጥያ ለአፈጻጸም የተመቻቸ ነው፣ይህም የእርስዎን አሳሽ ወይም ጎግል ሰነዶች እንዳይዘገይ በማድረግ ፍጥነትን ሳይቀንስ ጨለማ ገጽታን ያቀርባል።\n3. መደበኛ ዝመናዎች፡ g ሰነዶች ጥቁር ሁነታ ከGoogle ሰነዶች ለውጦች ጋር እንዲራመዱ በተከታታይ ያዘምናል፣ ይህም የጨለማ ሁነታ ተሞክሮዎ ወቅታዊ እና የሚሰራ መሆኑን ያረጋግጣል።\n4. ምላሽ ሰጪ ድጋፍ፡ ጉዳዮች ካጋጠሙዎት ወይም ጥያቄዎች ካሉዎት፣ የድጋፍ ቡድናችን ፈጣን ልምድን ለማረጋገጥ ቁርጠኛ ሆኖ ለመርዳት ዝግጁ ነው።\n5. ሰፊ የተጠቃሚ መሰረት፡ google doc dire ሁነታ ጥራቱን እና አስተማማኝነቱን የሚያረጋግጡ አዎንታዊ ግምገማዎች ያለው የዳበረ የተጠቃሚ ማህበረሰብ አለው። የጎግል ሰነዶች ልምዳቸውን የቀየሩ የረኩ ተጠቃሚዎችን ይቀላቀሉ።\n \n🎨 የእርስዎን ቅጥ ለማስማማት ማበጀት።\n\nየአጻጻፍ አካባቢዎን ግላዊነት ማላበስ የጨለማ ሁነታ ጎግል ሰነዶች ቁልፍ ጥቅም ነው። ወደ ልብዎ ይዘት ያብጁ፡\n \nየጨለማ ደረጃ፡ የጨለማውን ደረጃ ከምርጫህ ጋር አስተካክል፣ ከዋህ ደብዛዛ ወደ አስማጭ ጨለማ።\nቅርጸ-ቁምፊ ማበጀት፡- ለአጻጻፍ ዘይቤዎ የሚስማማውን የቅርጸ-ቁምፊ ዘይቤ፣ መጠን እና ቀለም ይምረጡ።\nየበስተጀርባ አማራጮች፡ ዳራውን ወደ ውበትዎ የሚያሟላ ቀለም ወይም ሸካራነት ያስተካክሉት።\nየአነጋገር ቀለሞች፡ የተወሰኑ የሰነድ ክፍሎችን ለማጉላት የአነጋገር ቀለሞችን ይምረጡ።\n \n🌐 በአሳሾች ውስጥ ተኳሃኝነት\n\nChrome፣ Firefox፣ ወይም ሌላ አሳሽ ቢጠቀሙ፣ Black Mode G Docs የተነደፈው ለአሳሽ ተኳሃኝነት ነው። የድር አሳሽ ምርጫዎ ምንም ይሁን ምን ምቹ እና ፍሬያማ በሆነ ጨለማ ገጽታ ይደሰቱ።\n\n🚀 ምርታማነትን ያሳድጉ\n\nጨለማ ሁነታ ጎግል ሰነዶች ስለ ውበት ብቻ አይደለም; ምርታማነትን ስለማሳደግ እና የመፃፍ ልምድን ስለማሳደግ ነው፡-\n \nትኩረት እና ትኩረት መስጠት፡ የ Dire ጭብጥ ትኩረትን የሚከፋፍሉ ነገሮችን ይቀንሳል፣ ያለማቋረጥ በስራዎ ላይ እንዲያተኩሩ ያስችልዎታል።\nየተቀነሰ የአይን ድካም፡ ለተቀነሰ ብሩህነት አይኖችዎ ያመሰግናሉ፣ ይህም ረጅም የፅሁፍ ክፍለ ጊዜዎችን የበለጠ ምቹ እና ያነሰ ድካም ያደርገዋል።\nየኢነርጂ ውጤታማነት፡ የጨለማ ሁነታ ጂ ሰነዶችን በመጠቀም፣ አይኖችዎን ይቆጥባሉ እና ኃይልን ለመቆጠብ ይረዳሉ፣ ይህም የካርበን ዱካዎን ይቀንሳል።\n \n🌚 በማጠቃለያ ላይ\n\nጨለማ ሁነታ ጉግል ሰነዶች ምቹ፣ ሊበጅ የሚችል እና ቀልጣፋ የፅሁፍ ልምድ ለሚፈልግ ለማንኛውም ሰው የመጨረሻው የChrome ቅጥያ ነው። በአንዲት ጠቅታ ያግብሩት፣ ወደ ምርጫዎችዎ ያብጁት፣ እና በአይንዎ ላይ ቀላል በሆነ ከማዘናጋት ነፃ በሆነ አካባቢ ይደሰቱ። ለበለጠ የGoogle ሰነዶች ተሞክሮ ጨለማ ሞድ ጂ ሰነድ ምርጫቸው ያደረጉ የተጠቃሚዎችን ማህበረሰብ ይቀላቀሉ።\n\n🌙 Google ሰነዶች ጨለማ ሁነታ - የመፃፍ ልምድዎን ያሳድጉ!\n\nበGoogle ሰነዶች ላይ በሚሰሩበት ጊዜ የማያ ገጽዎን ዓይነ ስውር ብልጭታ አድካሚ ሆኖ አግኝተውታል? ለበለጠ ምቹ እና ለእይታ ደስ የሚል የአጻጻፍ አካባቢ ይፈልጋሉ? ከዚህ በላይ አትመልከቱ ምክንያቱም ጨለማ ሁነታ ጎግል ሰነዶች የእርስዎን የአጻጻፍ ልምድ ለመቀየር እዚህ አለ።\n\nሰነዶችን ሲፈጥሩ፣ ሲያስተካክሉ ወይም ሲያነቡ ለጨለማ፣ ለዓይን ተስማሚ የሆነ መልክ ለሚመርጡ ሰዎች Google docs dark mode የመጨረሻው የChrome ቅጥያ ነው። በዚህ ቅጥያ የጉግል ሰነዶችን በይነገጽ ያለምንም እንከን ወደ ቄንጠኛ እና የሚያረጋጋ ጨለማ ገጽታ መቀየር ይችላሉ፣ ይህም የአጻጻፍ ክፍለ ጊዜዎን ከመቼውም ጊዜ በበለጠ አስደሳች ያደርገዋል። ለጠንካራ ብሩህነት ደህና ሁን እና ለምርታማነት በቅጡ ሰላም ይበሉ።\n\n🌟 የጨለማ ሁነታ ጎግል ሰነዶች ቁልፍ ባህሪዎች\n\n1. ልፋት አልባ ማግበር፡ ጨለማ ሁነታ ጎግል ሰነዶች በማይታመን ሁኔታ ለመጠቀም ቀላል ነው። በአንዲት ጠቅታ ብቻ የጨለማውን ጭብጥ ለጉግል ዶክመንቱ ማግበር፣ የበለጠ ምቹ እና ትኩረት ያለው የአፃፃፍ አካባቢ መፍጠር ይችላሉ።\n\n2. የማበጀት አማራጮች፡ አንድ መጠን ሁሉንም እንደማይመጥን እንረዳለን። ለዚያም ነው ከግል ምርጫዎችዎ ጋር እንዲዛመድ ቅጥያውን እንዲያስተካክሉ የሚያስችሎት የተለያዩ የማበጀት አማራጮችን የምናቀርበው። የጨለማውን ደረጃ፣ ቅርጸ-ቁምፊ እና ዳራ ወደ ምርጫዎ ያስተካክሉ።\n\n3. አይኖችዎን ያድናል፡ ረጅም የፅሁፍ ክፍለ ጊዜዎች በአይንዎ ላይ ጉዳት ሊያስከትሉ ይችላሉ። የጨለማ ሁነታ G ሰነዶች ለእይታዎ ቀላል የሆነ ረጋ ያለ እና ጥቁር ዳራ በማቅረብ የአጻጻፍ ልምድዎን የበለጠ ምቹ በማድረግ የዓይን ድካምን ይቀንሳል።\n\n4. የተሻሻለ ትኩረት፡ የጨለማው ጭብጥ ትኩረትን የሚከፋፍሉ ነገሮችን ለማስወገድ ይረዳል እና ትኩረትዎን የት እንዳሉ ይጠብቃል - በጽሁፍዎ ላይ። ትኩረትዎን ለመሳብ ምንም ተጨማሪ አላስፈላጊ ነጸብራቅ ወይም ብሩህ ማያ ገጽ የለም።\n\n5. የኢነርጂ ቅልጥፍና፡ የጨለማ ሁነታን መጠቀም የጎግል ዶክመንቶች አይንዎን ከመጥቀም ባለፈ ሃይልን ይቆጥባል፣የመሳሪያዎን እድሜ ያራዝማል እና የኤሌክትሪክ ወጪን ይቆጥባል።\n \n🖥️ ተኳኋኝነት እና ተደራሽነት፡ ጨለማ ሞድ ጂ ሰነዶች ከሁሉም ዋና ዋና የድር አሳሾች ጋር ተኳሃኝ እና በፒሲ እና ዴስክቶፕ ላይ በቀላሉ ይገኛል። አሁን፣ በመረጡት መድረክ ላይ በGoogle ሰነዶች ጨለማ ሁነታ መደሰት ይችላሉ።\n\n🌚 ብላክ ሞድ ጎግልን እንዴት ማንቃት ይቻላል፣ Dim Modeን ማንቃት ጎግል ሰነዶች ነፋሻማ ነው። በቀላሉ ቅጥያውን ከChrome ድር መደብር ያውርዱ እና በአሳሽዎ ውስጥ ባለው የጨለማ ሁነታ ጎግል ሰነዶች አዶ ላይ ጠቅ ያድርጉ። የጉግል ዶክመንቶች ገጽዎ ወዲያውኑ ወደ አስጸያፊው ጨለማ ገጽታ ይቀየራል፣ ይህም የአጻጻፍ ልምድዎን ያሳድጋል።\n\n📜 ይህን ቅጥያ ለምን አስፈለገዎት?\n\nGoogle Docs ጨለማ ሁነታ፡ ጨለማ ሁነታ ጂ ሰነዶች የጨለማ ሁነታን ወደ ጎግል ዶክዎ ለማምጣት ትክክለኛው መፍትሄ ነው፣ ይህም በአጻጻፍ ክፍለ ጊዜዎ ዓይኖችዎ ምቾት እንዲሰማቸው ያደርጋል።\nየተሻሻለ ምርታማነት፡ ጥቁሩ ጭብጥ በሚያቀርበው ከማዘናጋት-ነጻ አካባቢ ጋር፣ በጽሁፍ ስራዎችዎ ውስጥ የበለጠ ትኩረት፣ ቀልጣፋ እና ውጤታማ ታገኛላችሁ።\n\nየአይን መከላከያ፡ ለደማቅ ስክሪን ለረጅም ጊዜ መጋለጥ ለዓይንዎ ጎጂ ሊሆን ይችላል። ጨለማ ሁነታ ጎግል ዶክመንቶች ከመሳሪያህ የሚወጣውን የብርሃን መጠን በመቀነስ ዓይንህን ይጠብቃል።\n\nየማበጀት አማራጮች፡ ጥቁር ሁነታን እንደፍላጎትህ ጎግል ዶክን አብጅ። የጨለማ ሁነታ ቅንብሮችን፣ ቅርጸ-ቁምፊዎችን እና ዳራዎችን ከግል ምርጫዎችዎ ጋር ያስተካክሉ።\n\nየአሳሽ ተሻጋሪነት፡ Chrome፣ Firefox ወይም ሌላ አሳሽ ቢመርጡ ዲም ሞድ ጎግል ሰነዶች በቦርዱ ላይ ተኳሃኝ ናቸው፣ ስለዚህ የአሳሽ ምርጫዎ ምንም ይሁን ምን በሞድ ተሞክሮ መደሰት ይችላሉ።\n \n📚 ተደጋጋሚ ጥያቄዎች፡-\n \n1. Google ሰነዶችን በዚህ ቅጥያ ጨረቃ በሌለው ሁነታ ላይ እንዴት አደርጋለሁ? የጨለማ ሁነታ ጎግል ሰነዶችን ለማንቃት በቀላሉ ቅጥያውን ከChrome ድር ማከማቻ ያውርዱ እና ከዚያ በአሳሽዎ ውስጥ ያለውን የጎግል ዶክመንቶች የጨለማ ሁነታ አዶን ጠቅ ያድርጉ።\n2. የጨለማ ሁነታ G ሰነዶች ለዴስክቶፕ ይገኛሉ? በፍፁም! ጨለማ ሞድ ጎግል ሰነዶች ለሁለቱም ፒሲዎች እና ዴስክቶፖች ይገኛሉ፣ ይህም እርስዎ በመረጡት መድረክ ላይ ምቹ የመፃፍ አካባቢ መደሰት ይችላሉ።\n3. የጨለማ ሁነታ ጎግል ሰነዶችን ገጽታ ማበጀት እችላለሁ? አዎ፣ ትችላለህ! ጨለማ ሁነታ Google ሰነዶች ቅጥያውን ከግል ምርጫዎችዎ ጋር እንዲያበጁት የሚያስችልዎ የተለያዩ የማበጀት አማራጮችን ይሰጣል።\n4. Google Docs ቤተኛ ጨለማ ሁነታ አለው? እንደ አለመታደል ሆኖ Google ሰነዶች ቤተኛ ጨለማ ሁነታን አያቀርብም።" + } +} diff --git a/_locales/ar/messages.json b/_locales/ar/messages.json new file mode 100644 index 0000000..b9b53ca --- /dev/null +++ b/_locales/ar/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "عزز الكفاءة من خلال ملحق Google Docs للوضع الداكن. استمتع بالوضع المظلم السلس لمحرّر مستندات Google لتحسين الكتابة." + }, + "appName": { + "message": "الوضع المظلم لمستندات جوجل" + }, + "storeDesc": { + "message": "🌟 لماذا تختار الوضع الداكن لمحرّر مستندات Google بدلاً من المنافسين؟\n\nمع العديد من ملحقات Chrome التي توفر وظيفة الوضع المظلم، قد تتساءل ما الذي يجعل Dark Mode G Docs خيارك الأفضل. دعنا نستكشف سبب تميز الوضع الداكن لمحرر مستندات Google:\n\n1. واجهة سهلة الاستخدام: يوفر الوضع الداكن لمحرّر مستندات Google واجهة بديهية لسهولة التنقل. يعد العثور على الإعدادات وخيارات التخصيص أمرًا سهلاً.\n2. السرعة والكفاءة: تم تحسين الامتداد الخاص بنا من أجل الأداء، مما يضمن أنه لن يؤدي إلى إبطاء متصفحك أو مستندات Google، مما يوفر سمة داكنة دون المساس بالسرعة.\n3. التحديثات المنتظمة: يتم تحديث الوضع الأسود لـ g docs باستمرار لمواكبة تغييرات محرر مستندات Google، مما يضمن أن تظل تجربة الوضع المظلم حديثة وفعالة.\n4. الدعم سريع الاستجابة: إذا واجهت مشكلات أو كانت لديك أسئلة، فإن فريق الدعم لدينا جاهز لتقديم المساعدة على الفور، وملتزم بضمان تجربة سلسة.\n5. قاعدة مستخدمين واسعة: يتمتع وضع google doc dire بمجتمع مستخدمين مزدهر مع مراجعات إيجابية تشهد على جودته وموثوقيته. انضم إلى صفوف المستخدمين الراضين الذين قاموا بتحويل تجربة مستندات Google الخاصة بهم.\n \n🎨 التخصيص ليناسب ذوقك\n\nيعد تخصيص بيئة الكتابة الخاصة بك ميزة أساسية في Dark Mode Google Docs. تخصيص لمحتوى قلبك:\n \nمستوى الظلام: اضبط مستوى الظلام ليتناسب مع تفضيلاتك، من مستوى خافت لطيف إلى ظلام غامر.\nتخصيص الخط: اختر نمط الخط وحجمه ولونه الذي يناسب أسلوب كتابتك.\nخيارات الخلفية: قم بتخصيص الخلفية حسب اللون أو الملمس الذي يكمل جمالك.\nألوان التمييز: حدد ألوان التمييز لتمييز عناصر مستند محددة.\n \n🌐 التوافق عبر المتصفحات\n\nسواء كنت تستخدم Chrome أو Firefox أو أي متصفح آخر، فقد تم تصميم Black Mode G Docs للتوافق عبر المتصفحات. استمتع بمظهر مظلم مريح ومنتج بغض النظر عن اختيار متصفح الويب الخاص بك.\n\n🚀 تعزيز إنتاجيتك\n\nلا يقتصر الوضع الداكن لمحرر مستندات Google على الجماليات فحسب؛ يتعلق الأمر بتعزيز الإنتاجية وتحسين تجربة الكتابة لديك:\n \nالتركيز والتركيز: يقلل المظهر الرهيب من عوامل التشتيت، مما يسمح لك بالتركيز على عملك دون انقطاع.\nتقليل إجهاد العين: سوف تشكرك عيناك على انخفاض السطوع، مما يجعل جلسات الكتابة الطويلة أكثر راحة وأقل إرهاقًا.\nكفاءة الطاقة: باستخدام Dark Mode G Docs، فإنك تنقذ عينيك وتساعد في الحفاظ على الطاقة، مما يقلل من البصمة الكربونية.\n \n🌚 في الختام\n\nيعد Dark Mode Google Docs امتداد Chrome النهائي لأي شخص يبحث عن تجربة كتابة مريحة وقابلة للتخصيص وفعالة. قم بتنشيطه بنقرة واحدة، وقم بتخصيصه حسب تفضيلاتك، واستمتع ببيئة خالية من التشتيت ومريحة لعينيك. انضم إلى مجتمع المستخدمين الراضين الذين جعلوا Dark Mode G Doc خيارهم المفضل للحصول على تجربة رائعة لمحرّر مستندات Google.\n\n🌙 الوضع المظلم لمستندات Google - عزز تجربة الكتابة الخاصة بك!\n\nهل تجد أن الوهج المذهل لشاشتك أثناء العمل على مُحرر مستندات Google أمر ممل؟ هل تتوق إلى بيئة كتابة أكثر راحة وإمتاعًا بصريًا؟ لا مزيد من البحث لأن Dark Mode Google Docs موجود هنا لتحويل تجربة الكتابة الخاصة بك.\n\nيعد الوضع المظلم لمحرّر مستندات Google امتداد Chrome النهائي لأولئك الذين يفضلون مظهرًا أكثر قتامة وأكثر ملاءمة للعين عند إنشاء المستندات أو تحريرها أو قراءتها. باستخدام هذا الامتداد، يمكنك بسهولة تحويل واجهة محرر مستندات Google إلى مظهر داكن أنيق ومريح، مما يجعل جلسات الكتابة الخاصة بك أكثر متعة من أي وقت مضى. قل وداعًا للسطوع القاسي ومرحبًا بالإنتاجية بأسلوب أنيق.\n\n🌟 الميزات الرئيسية لمحرر مستندات Google للوضع الداكن\n\n1. التنشيط بدون جهد: يعد الوضع الداكن لمحرّر مستندات Google سهل الاستخدام بشكل لا يصدق. بنقرة واحدة فقط، يمكنك تنشيط المظهر الداكن لمستند Google الخاص بك، مما يخلق بيئة كتابة أكثر راحة وتركيزًا.\n\n2. خيارات التخصيص: نحن ندرك أن مقاسًا واحدًا لا يناسب الجميع. ولهذا السبب نقدم خيارات تخصيص متنوعة، مما يسمح لك بتعديل الامتداد ليتوافق مع تفضيلاتك الشخصية. اضبط مستوى الظلام والخط والخلفية حسب رغبتك.\n\n3. يحفظ عينيك: جلسات الكتابة الطويلة يمكن أن تؤثر سلبًا على عينيك. يعمل الوضع الداكن G Documents على تقليل إجهاد العين من خلال توفير خلفية داكنة لطيفة تسهل رؤيتك، مما يجعل تجربة الكتابة الخاصة بك أكثر راحة.\n\n4. تحسين التركيز: يساعد المظهر الداكن على التخلص من عوامل التشتيت ويحافظ على انتباهك في المكان الذي ينتمي إليه - في كتابتك. لا مزيد من الوهج غير الضروري أو الشاشات الساطعة التي تشغل تركيزك بعيدًا.\n\n5. كفاءة الطاقة: استخدام مستندات Google ذات الوضع الداكن لا يفيد عينيك فحسب، بل يحافظ أيضًا على الطاقة، مما يطيل عمر جهازك ويوفر تكاليف الكهرباء.\n \n🖥️ التوافق وإمكانية الوصول: يتوافق Dark Mode G Docs مع جميع متصفحات الويب الرئيسية ومتوفر بسهولة على أجهزة الكمبيوتر الشخصية وأجهزة الكمبيوتر المكتبية. يمكنك الآن الاستمتاع بالوضع المظلم لمحرر مستندات Google على النظام الأساسي المفضل لديك.\n\n🌚 كيفية تنشيط الوضع الأسود في Google، يعد تنشيط الوضع الخافت لمحرر مستندات Google أمرًا سهلاً. ما عليك سوى تنزيل الامتداد من Chrome Web Store والنقر على أيقونة Dark Mode Google Docs في متصفحك. ستتحول صفحة مستندات Google الخاصة بك على الفور إلى المظهر الداكن الهادئ، مما يعزز تجربة الكتابة لديك.\n\n📜 لماذا تحتاج هذا الامتداد؟\n\nالوضع الداكن لمحرر مستندات Google: الوضع الداكن G Docs هو الحل النهائي لجلب الوضع الداكن إلى مستند Google الخاص بك، مما يضمن بقاء عينيك مرتاحتين أثناء جلسات الكتابة.\nإنتاجية محسنة: مع البيئة الخالية من التشتيت التي يوفرها المظهر الأسود، ستجد نفسك أكثر تركيزًا وفعالية وإنتاجية في مهام الكتابة الخاصة بك.\n\nحماية العين: التعرض لفترة طويلة لشاشة ساطعة يمكن أن يكون ضارًا لعينيك. يعمل الوضع الداكن لمستندات Google على حماية عينيك من خلال تقليل شدة الضوء المنبعث من جهازك.\n\nخيارات التخصيص: قم بتخصيص الوضع الأسود لمستند Google حسب رغبتك. اضبط إعدادات الوضع المظلم والخطوط والخلفيات لتناسب تفضيلاتك الفردية.\n\nالتوافق عبر المتصفحات: سواء كنت تفضل Chrome أو Firefox أو أي متصفح آخر، فإن Dim Mode Google Docs متوافق في جميع المجالات، لذا يمكنك الاستمتاع بتجربة الوضع بغض النظر عن اختيارك للمتصفح.\n \n📚 الأسئلة الشائعة:\n \n1. كيف أضع مُحرر مستندات Google في وضع عدم وجود القمر باستخدام هذا الامتداد؟ لتنشيط الوضع الداكن لمحرر مستندات Google، ما عليك سوى تنزيل الامتداد من سوق Chrome الإلكتروني، ثم النقر على أيقونة الوضع الداكن لمستندات Google في متصفحك.\n2. هل يتوفر Dark Mode G Docs لسطح المكتب؟ قطعاً! الوضع الداكن لمحرّر مستندات Google متاح لكل من أجهزة الكمبيوتر الشخصية وأجهزة سطح المكتب، مما يضمن أنه يمكنك الاستمتاع ببيئة كتابة مريحة على النظام الأساسي المفضل لديك.\n3. هل يمكنني تخصيص مظهر Dark Mode في Google Docs؟ نعم يمكنك! يوفر الوضع الداكن لمحرر مستندات Google خيارات تخصيص متنوعة، مما يسمح لك بتخصيص الامتداد حسب تفضيلاتك الشخصية.\n4. هل يحتوي محرر مستندات Google على وضع مظلم أصلي؟ لسوء الحظ، لا يوفر محرر مستندات Google وضعًا مظلمًا أصليًا." + } +} diff --git a/_locales/bg/messages.json b/_locales/bg/messages.json new file mode 100644 index 0000000..1db2cdb --- /dev/null +++ b/_locales/bg/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Повишете ефективността с нашето разширение за тъмен режим на Google Docs. Опитайте безпроблемно тъмния режим на Google Docs за по-добро писане." + }, + "appName": { + "message": "Тъмният режим на Google Docs" + }, + "storeDesc": { + "message": "🌟 Защо да изберем тъмния режим на Google Docs пред този на конкурентите?\n\nПри наличието на многобройни разширения за Chrome, предлагащи функционалност за тъмен режим, може би се чудите какво прави тъмния режим на G Docs най-добрият ви избор. Нека разгледаме защо Тъмният режим на Google Docs се откроява:\n\n1. Удобен за потребителя интерфейс: Тъмният режим на Google Docs предоставя интуитивен интерфейс за лесна навигация. Намирането на настройките и опциите за персонализиране е лесно.\n2. Бързина и ефективност: Нашето разширение е оптимизирано за производителност, като гарантира, че няма да забави браузъра ви или Google Docs, предоставяйки тъмна тема, без да прави компромис със скоростта.\n3. Редовни актуализации: g docs black mode се актуализира непрекъснато, за да е в крак с промените в Google Docs, като гарантира, че работата ви в тъмен режим остава актуална и функционална.\n4. Поддръжка на адаптивност: Ако се сблъскате с проблеми или имате въпроси, нашият екип за поддръжка е готов да ви помогне незабавно, ангажиран да осигури безпроблемно преживяване.\n5. Широка потребителска база: Google Doc dire mode има процъфтяваща потребителска общност с положителни отзиви, които свидетелстват за неговото качество и надеждност. Присъединете се към редиците на доволните потребители, които са променили своя опит с Google Docs.\n \n🎨 Персонализиране според вашия стил\n\nПерсонализирането на вашата среда за писане е ключово предимство на тъмния режим на Google Docs. Персонализирайте го според желанията си:\n \nНиво на тъмнина: Регулирайте нивото на тъмнината според предпочитанията си - от леко затъмнение до поглъщаща тъмнина.\nПерсонализиране на шрифта: Изберете стила, размера и цвета на шрифта, който отговаря на вашия стил на писане.\nОпции за фон: Приспособете фона към цвят или текстура, които допълват естетиката ви.\nАкцентни цветове: Изберете акцентни цветове, за да подчертаете определени елементи на документа.\n \n🌐 Съвместимост с различни браузъри\n\nНезависимо дали използвате Chrome, Firefox или друг браузър, Black Mode G Docs е проектиран за съвместимост с различни браузъри. Насладете се на удобна и продуктивна тъмна тема, независимо от избора на уеб браузър.\n\n🚀 Повишете продуктивността си\n\nТъмният режим на Google Docs не е само естетика, а повишаване на производителността и подобряване на преживяването ви при писане:\n \nФокус и концентрация: Темата Dire свежда до минимум разсейващите фактори, като ви позволява да се концентрирате върху работата си без прекъсвания.\nНамалено натоварване на очите: Очите ви ще ви благодарят за намалената яркост, което прави дългите сесии на писане по-удобни и по-малко уморителни.\nЕнергийна ефективност: Използвайки тъмния режим на G Docs, вие щадите очите си и помагате за пестенето на енергия, като намалявате въглеродния си отпечатък.\n \n🌚 В заключение\n\nТъмният режим на Google Docs е най-доброто разширение за Chrome за всеки, който търси удобно, персонализирано и ефективно писане. Активирайте го с едно кликване, настройте го според предпочитанията си и се насладете на среда без разсейване, която е лесна за очите ви. Присъединете се към доволната общност от потребители, които са превърнали тъмния режим на G Doc в свой избор за превъзходно изживяване в Google Docs.\n\n🌙 Тъмният режим на Google docs - подобрете преживяването си при писане!\n\nСмятате ли, че ослепителните отблясъци на екрана ви, докато работите с Google Docs, са уморителни? Жадувате за по-удобна и визуално приятна среда за писане? Не търсете повече, защото тъмният режим на Google Docs е тук, за да преобрази преживяването ви при писане.\n\nТъмният режим на Google Docs е най-доброто разширение за Chrome за тези, които предпочитат по-тъмен и приятен за очите външен вид, когато създават, редактират или четат документи. С това разширение можете безпроблемно да превключите интерфейса на Google Docs към елегантна и успокояваща тъмна тема, което ще направи писането ви по-приятно от всякога. Кажете сбогом на рязката яркост и приветствайте продуктивността със стил.\n\n🌟 Ключови функции на Dark Mode Google Docs\n\n1. Безпроблемно активиране: Тъмният режим на Google Docs е изключително лесен за използване. Само с едно щракване можете да активирате тъмната тема за вашия Google Doc, създавайки по-удобна и съсредоточена среда за писане.\n\n2. Опции за персонализиране: Ние разбираме, че един размер не е подходящ за всички. Ето защо предлагаме различни опции за персонализиране, които ви позволяват да настроите разширението според личните си предпочитания. Настройте нивото на тъмнината, шрифта и фона според предпочитанията си.\n\n3. Пести очите ви: Дългите сесии на писане могат да се отразят зле на очите ви. Тъмният режим G Documents намалява напрежението в очите, като осигурява нежен, тъмен фон, който е лесен за зрението ви, правейки писането ви по-удобно.\n\n4. Подобрен фокус: Тъмната тема помага за премахване на разсейващите фактори и задържа вниманието ви там, където му е мястото - върху писането. Вече няма ненужни отблясъци или ярки екрани, които да отвличат вниманието ви.\n\n5. Енергийна ефективност: Използването на тъмния режим на документите на Google не само е полезно за очите ви, но и пести енергия, удължавайки живота на устройството ви и спестявайки разходи за електроенергия.\n \n🖥️ Съвместимост и достъпност: Тъмният режим на G Docs е съвместим с всички основни уеб браузъри и е лесно достъпен на персонални и настолни компютри. Сега можете да се наслаждавате на тъмния режим на Google Docs на предпочитаната от вас платформа.\n\n🌚 Как да активирате черния режим на Google, Активирането на тъмния режим на Google Docs е лесно. Просто изтеглете разширението от уеб магазина на Chrome и щракнете върху иконата на Тъмния режим на Документите на Google в браузъра си. Страницата на Документите на Google моментално ще премине към успокояващата тъмна тема, което ще подобри преживяването ви при писане.\n\n📜 Защо ви трябва това разширение?\n\nТъмният режим на Документите на Google: Тъмният режим на G Docs е окончателното решение за въвеждане на тъмен режим във вашия Google Docs, което гарантира, че очите ви ще останат комфортно по време на писането.\nПовишена продуктивност: Благодарение на свободната от разсейване среда, която черната тема осигурява, ще се окажете по-съсредоточени, ефективни и продуктивни в задачите си за писане.\n\nЗащита на очите: Продължителното излагане на ярък екран може да навреди на очите ви. Тъмният режим на Документи на Google предпазва очите ви, като намалява интензивността на светлината, излъчвана от устройството ви.\n\nОпции за персонализиране: Адаптирайте Черния режим на Google Документи по свой вкус. Регулирайте настройките на тъмния режим, шрифтовете и фоновете, за да отговарят на индивидуалните ви предпочитания.\n\nСъвместимост с различни браузъри: Независимо дали предпочитате Chrome, Firefox или друг браузър, Документите в тъмен режим на Google са съвместими навсякъде, така че можете да се наслаждавате на режима независимо от избора на браузър.\n \n📚 Често задавани въпроси:\n \n1. Как мога да поставя Google Docs в безлунен режим с това разширение? За да активирате тъмния режим на Google Docs, просто изтеглете разширението от уеб магазина на Chrome и след това щракнете върху иконата за тъмен режим на документите на Google в браузъра си.\n2. Налице ли е тъмен режим на G Docs за настолни компютри? Разбира се! Тъмният режим на Google Docs е наличен както за персонални компютри, така и за настолни компютри, което гарантира, че можете да се наслаждавате на комфортна среда за писане на предпочитаната от вас платформа.\n3. Мога ли да персонализирам външния вид на Dark Mode Google Docs? Да, можете! Dark Mode Google Docs предлага различни опции за персонализиране, което ви позволява да адаптирате разширението към личните си предпочитания.\n4. Има ли Google Docs собствен тъмен режим? За съжаление, Google Docs не предлага вграден тъмен режим." + } +} diff --git a/_locales/bn/messages.json b/_locales/bn/messages.json new file mode 100644 index 0000000..7e170ea --- /dev/null +++ b/_locales/bn/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "আমাদের ডার্ক মোড Google ডক্স এক্সটেনশনের সাথে দক্ষতা বাড়ান। উন্নত লেখার জন্য বিরামহীন Google ডক্স ডার্ক মোডের অভিজ্ঞতা নিন।" + }, + "appName": { + "message": "ডার্ক মোড গুগল ডক্স" + }, + "storeDesc": { + "message": "🌟 কেন প্রতিযোগীদের চেয়ে ডার্ক মোড Google ডক্স বেছে নেবেন?\n\nডার্ক মোড কার্যকারিতা অফার করে এমন অসংখ্য ক্রোম এক্সটেনশনের সাথে, আপনি হয়তো ভাবতে পারেন যে ডার্ক মোড জি ডক্সকে আপনার সেরা পছন্দ কি করে তোলে৷ আসুন জেনে নেই কেন ডার্ক মোড Google ডক্স আলাদা:\n\n1. ব্যবহারকারী-বান্ধব ইন্টারফেস: ডার্ক মোড Google ডক্স সহজে নেভিগেশনের জন্য একটি স্বজ্ঞাত ইন্টারফেস প্রদান করে। সেটিংস এবং কাস্টমাইজেশন বিকল্পগুলি সন্ধান করা একটি হাওয়া।\n2. গতি এবং দক্ষতা: আমাদের এক্সটেনশনটি পারফরম্যান্সের জন্য অপ্টিমাইজ করা হয়েছে, এটি নিশ্চিত করে যে এটি আপনার ব্রাউজার বা Google ডক্সকে ধীর করবে না, গতির সাথে আপস না করে একটি অন্ধকার থিম সরবরাহ করে৷\n3. নিয়মিত আপডেট: g ডক্স ব্ল্যাক মোড ক্রমাগত আপডেট হয় Google ডক্সের পরিবর্তনের সাথে তাল মিলিয়ে চলতে, আপনার ডার্ক মোড অভিজ্ঞতা বর্তমান এবং কার্যকরী থাকে তা নিশ্চিত করে।\n4. প্রতিক্রিয়াশীল সমর্থন: আপনি যদি সমস্যার সম্মুখীন হন বা প্রশ্ন থাকে, আমাদের সহায়তা দল অবিলম্বে সহায়তা করতে প্রস্তুত, একটি মসৃণ অভিজ্ঞতা নিশ্চিত করতে প্রতিশ্রুতিবদ্ধ।\n5. ওয়াইড ইউজার বেস: গুগল ডক ডায়ার মোডের একটি সমৃদ্ধ ব্যবহারকারী সম্প্রদায় রয়েছে যার গুণমান এবং নির্ভরযোগ্যতার ইতিবাচক পর্যালোচনা রয়েছে। সন্তুষ্ট ব্যবহারকারীদের র‍্যাঙ্কে যোগদান করুন যারা তাদের Google ডক্স অভিজ্ঞতা পরিবর্তন করেছেন।\n \n🎨 আপনার শৈলী অনুসারে কাস্টমাইজেশন\n\nআপনার লেখার পরিবেশকে ব্যক্তিগতকৃত করা ডার্ক মোড গুগল ডক্সের একটি মূল সুবিধা। আপনার হৃদয়ের বিষয়বস্তু কাস্টমাইজ করুন:\n \nঅন্ধকার স্তর: আপনার পছন্দের সাথে মেলে অন্ধকার স্তর সামঞ্জস্য করুন, একটি মৃদু আবছা থেকে একটি নিমজ্জিত অন্ধকারে।\nফন্ট কাস্টমাইজেশন: আপনার লেখার শৈলীর সাথে মানানসই ফন্ট শৈলী, আকার এবং রঙ চয়ন করুন।\nপটভূমির বিকল্প: আপনার নান্দনিকতার পরিপূরক একটি রঙ বা টেক্সচারের সাথে পটভূমিকে সাজান।\nঅ্যাকসেন্ট রং: নির্দিষ্ট নথি উপাদান হাইলাইট করার জন্য উচ্চারণ রং নির্বাচন করুন।\n \n🌐 ব্রাউজার জুড়ে সামঞ্জস্য\n\nআপনি Chrome, Firefox বা অন্য ব্রাউজার ব্যবহার করুন না কেন, ব্ল্যাক মোড জি ডক্স ক্রস-ব্রাউজার সামঞ্জস্যের জন্য ডিজাইন করা হয়েছে। আপনার ওয়েব ব্রাউজার পছন্দ নির্বিশেষে একটি আরামদায়ক এবং উত্পাদনশীল অন্ধকার থিম উপভোগ করুন।\n\n🚀 আপনার উৎপাদনশীলতা বাড়ান\n\nডার্ক মোড গুগল ডক্স শুধুমাত্র নান্দনিকতা সম্পর্কে নয়; এটি উত্পাদনশীলতা বাড়ানো এবং আপনার লেখার অভিজ্ঞতা বাড়ানোর বিষয়ে:\n \nফোকাস এবং একাগ্রতা: ডায়ার থিম বিক্ষিপ্ততা কমিয়ে দেয়, আপনাকে বাধা ছাড়াই আপনার কাজে মনোনিবেশ করতে দেয়।\nচোখের চাপ কমানো: আপনার চোখ কম উজ্জ্বলতার জন্য আপনাকে ধন্যবাদ জানাবে, দীর্ঘ লেখার সেশনগুলি আরও আরামদায়ক এবং কম ক্লান্তিকর করে তোলে।\nশক্তি দক্ষতা: ডার্ক মোড জি ডক্স ব্যবহার করে, আপনি আপনার চোখ বাঁচান এবং শক্তি সংরক্ষণে সাহায্য করেন, আপনার কার্বন পদচিহ্ন হ্রাস করে৷\n \n🌚 উপসংহারে\n\nআরামদায়ক, কাস্টমাইজযোগ্য, এবং দক্ষ লেখার অভিজ্ঞতা খুঁজছেন এমন প্রত্যেকের জন্য ডার্ক মোড Google ডক্স হল চূড়ান্ত ক্রোম এক্সটেনশন। এটিকে একক ক্লিকের মাধ্যমে সক্রিয় করুন, এটিকে আপনার পছন্দ অনুযায়ী কাস্টমাইজ করুন এবং একটি বিভ্রান্তিমুক্ত পরিবেশ উপভোগ করুন যা আপনার চোখে সহজ৷ ব্যবহারকারীদের সন্তুষ্ট সম্প্রদায়ে যোগ দিন যারা ডার্ক মোড জি ডককে একটি উচ্চতর Google ডক্স অভিজ্ঞতার জন্য তাদের পছন্দের পছন্দ করেছেন।\n\n🌙 Google ডক্স ডার্ক মোড - আপনার লেখার অভিজ্ঞতা উন্নত করুন!\n\nGoogle ডক্সে কাজ করার সময় আপনি কি আপনার স্ক্রিনের অন্ধ ঝলক খুঁজে পান? আপনি কি আরও আরামদায়ক এবং চাক্ষুষরূপে আনন্দদায়ক লেখার পরিবেশের জন্য আকুল? আর তাকাবেন না কারণ ডার্ক মোড Google ডক্স আপনার লেখার অভিজ্ঞতাকে রূপান্তর করতে এখানে রয়েছে।\n\nGoogle ডক্স ডার্ক মোড হল চূড়ান্ত ক্রোম এক্সটেনশন যারা ডকুমেন্ট তৈরি, সম্পাদনা বা পড়ার সময় গাঢ়, আরও চোখের-বান্ধব চেহারা পছন্দ করেন। এই এক্সটেনশনের সাহায্যে, আপনি নির্বিঘ্নে আপনার Google ডক্স ইন্টারফেসকে একটি মসৃণ এবং প্রশান্তিদায়ক অন্ধকার থিমে পরিবর্তন করতে পারেন, আপনার লেখার সেশনগুলিকে আগের চেয়ে আরও উপভোগ্য করে তোলে৷ কঠোর উজ্জ্বলতাকে বিদায় বলুন এবং শৈলীতে উত্পাদনশীলতাকে হ্যালো।\n\n🌟 ডার্ক মোড গুগল ডক্সের মূল বৈশিষ্ট্য\n\n1. অনায়াসে সক্রিয়করণ: ডার্ক মোড Google ডক্স ব্যবহার করা অবিশ্বাস্যভাবে সহজ। শুধুমাত্র একটি ক্লিকের মাধ্যমে, আপনি আপনার Google ডকের জন্য অন্ধকার থিম সক্রিয় করতে পারেন, আরও আরামদায়ক এবং ফোকাসড লেখার পরিবেশ তৈরি করে৷\n\n2. কাস্টমাইজেশন বিকল্প: আমরা বুঝতে পারি যে একটি আকার সব মাপসই করা হয় না। এই কারণেই আমরা বিভিন্ন কাস্টমাইজেশন বিকল্পগুলি অফার করি, আপনাকে আপনার ব্যক্তিগত পছন্দগুলির সাথে মেলে এক্সটেনশনটি পরিবর্তন করার অনুমতি দেয়৷ আপনার পছন্দ অনুযায়ী অন্ধকার স্তর, ফন্ট এবং পটভূমি সামঞ্জস্য করুন।\n\n3. আপনার চোখ বাঁচায়: দীর্ঘ লেখার সেশন আপনার চোখের উপর একটি টোল নিতে পারে। ডার্ক মোড জি ডকুমেন্টস একটি মৃদু, গাঢ় পটভূমি প্রদান করে চোখের চাপ কমায় যা আপনার দৃষ্টিতে সহজ, আপনার লেখার অভিজ্ঞতাকে আরও আরামদায়ক করে তোলে।\n\n4. উন্নত ফোকাস: গাঢ় থিম বিক্ষিপ্ততা দূর করতে সাহায্য করে এবং আপনার মনোযোগ যেখানেই থাকে - আপনার লেখায় রাখে। আপনার ফোকাস টানতে আর অপ্রয়োজনীয় একদৃষ্টি বা উজ্জ্বল পর্দার প্রয়োজন নেই।\n\n5. শক্তি দক্ষতা: ডার্ক মোড ব্যবহার করে Google ডকুমেন্টগুলি শুধুমাত্র আপনার চোখকে উপকৃত করে না বরং শক্তি সংরক্ষণ করে, আপনার ডিভাইসের আয়ু দীর্ঘায়িত করে এবং বিদ্যুৎ খরচ সাশ্রয় করে।\n \n🖥️ সামঞ্জস্য এবং অ্যাক্সেসযোগ্যতা: ডার্ক মোড জি ডক্স সমস্ত প্রধান ওয়েব ব্রাউজারগুলির সাথে সামঞ্জস্যপূর্ণ এবং পিসি এবং ডেস্কটপে সহজেই উপলব্ধ। এখন, আপনি আপনার পছন্দের প্ল্যাটফর্মে Google ডক্স ডার্ক মোড উপভোগ করতে পারেন।\n\n🌚 কিভাবে ব্ল্যাক মোড সক্রিয় করবেন গুগল, ডিম মোড সক্রিয় করা গুগল ডক্স একটি হাওয়া। শুধু Chrome ওয়েব স্টোর থেকে এক্সটেনশনটি ডাউনলোড করুন এবং আপনার ব্রাউজারে ডার্ক মোড Google ডক্স আইকনে ক্লিক করুন। আপনার Google ডকুমেন্টস পৃষ্ঠাটি অবিলম্বে প্রশান্তিদায়ক অন্ধকার থিমে স্যুইচ করবে, আপনার লেখার অভিজ্ঞতা বাড়িয়ে দেবে।\n\n📜 কেন আপনি এই এক্সটেনশন প্রয়োজন?\n\nGoogle ডক্স ডার্ক মোড: ডার্ক মোড জি ডক্স হল আপনার Google ডক-এ ডার্ক মোড আনার সুনির্দিষ্ট সমাধান, যাতে আপনার লেখার সময় আপনার চোখ আরামদায়ক থাকে।\nবর্ধিত উত্পাদনশীলতা: কালো থিম যে বিভ্রান্তি-মুক্ত পরিবেশ প্রদান করে, আপনি আপনার লেখার কাজে নিজেকে আরও মনোযোগী, দক্ষ এবং উত্পাদনশীল দেখতে পাবেন।\n\nচোখের সুরক্ষা: একটি উজ্জ্বল পর্দায় দীর্ঘায়িত এক্সপোজার আপনার চোখের জন্য ক্ষতিকারক হতে পারে। ডার্ক মোড গুগল ডকুমেন্টস আপনার ডিভাইস থেকে নির্গত আলোর তীব্রতা কমিয়ে আপনার চোখকে সুরক্ষিত করে।\n\nকাস্টমাইজেশন বিকল্প: আপনার পছন্দ অনুযায়ী ব্ল্যাক মোড Google ডককে টেইলার করুন। আপনার ব্যক্তিগত পছন্দ অনুসারে ডার্ক মোড সেটিংস, ফন্ট এবং ব্যাকগ্রাউন্ড সামঞ্জস্য করুন।\n\nক্রস-ব্রাউজার সামঞ্জস্য: আপনি ক্রোম, ফায়ারফক্স বা অন্য ব্রাউজার পছন্দ করুন না কেন, ডিম মোড Google ডক্স বোর্ড জুড়ে সামঞ্জস্যপূর্ণ, তাই আপনি আপনার ব্রাউজার পছন্দ নির্বিশেষে মোড অভিজ্ঞতা উপভোগ করতে পারেন৷\n \n📚 FAQs:\n \n1. এই এক্সটেনশনের মাধ্যমে আমি কীভাবে Google ডক্সকে চাঁদবিহীন মোডে রাখব? ডার্ক মোড Google ডক্স সক্রিয় করতে, শুধুমাত্র Chrome ওয়েব স্টোর থেকে এক্সটেনশনটি ডাউনলোড করুন এবং তারপরে আপনার ব্রাউজারে Google ডকুমেন্টস ডার্ক মোড আইকনে ক্লিক করুন।\n2. ডার্ক মোড জি ডক্স কি ডেস্কটপের জন্য উপলব্ধ? একেবারেই! ডার্ক মোড Google ডক্স পিসি এবং ডেস্কটপ উভয়ের জন্যই উপলব্ধ, এটি নিশ্চিত করে যে আপনি আপনার পছন্দের প্ল্যাটফর্মে একটি আরামদায়ক লেখার পরিবেশ উপভোগ করতে পারেন।\n3. আমি কি ডার্ক মোড Google ডক্সের চেহারা কাস্টমাইজ করতে পারি? হ্যা, তুমি পারো! ডার্ক মোড Google ডক্স বিভিন্ন কাস্টমাইজেশন বিকল্প অফার করে, যা আপনাকে আপনার ব্যক্তিগত পছন্দ অনুযায়ী এক্সটেনশনটি সাজাতে দেয়।\n4. Google ডক্সের কি একটি নেটিভ ডার্ক মোড আছে? দুর্ভাগ্যবশত, Google ডক্স একটি নেটিভ ডার্ক মোড অফার করে না।" + } +} diff --git a/_locales/ca/messages.json b/_locales/ca/messages.json new file mode 100644 index 0000000..38b35f7 --- /dev/null +++ b/_locales/ca/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Augmenteu l'eficiència amb la nostra extensió de Google Docs en mode fosc. Experimenta el mode fosc de Google Docs sense problemes per millorar l'escriptura." + }, + "appName": { + "message": "Google Docs en mode fosc" + }, + "storeDesc": { + "message": "🌟 Per què escollir el mode fosc Google Docs sobre els competidors?\n\nAmb nombroses extensions de Chrome que ofereixen la funcionalitat del mode fosc, potser us preguntareu què fa que Dark Mode G Docs sigui la vostra millor opció. Explorem per què destaca Google Docs en mode fosc:\n\n1. Interfície fàcil d'utilitzar: Google Docs en mode fosc ofereix una interfície intuïtiva per a una navegació fàcil. Trobar opcions de configuració i personalització és molt fàcil.\n2. Velocitat i eficiència: la nostra extensió està optimitzada per al rendiment, assegurant-se que no alentirà el vostre navegador o Google Docs, oferint un tema fosc sense comprometre la velocitat.\n3. Actualitzacions periòdiques: el mode negre de g docs s'actualitza contínuament per seguir el ritme dels canvis de Google Docs, garantint que la vostra experiència en mode fosc es mantingui actual i funcional.\n4. Suport sensible: si teniu problemes o teniu preguntes, el nostre equip d'assistència està preparat per ajudar-vos ràpidament, compromès a garantir una experiència fluida.\n5. Àmplia base d'usuaris: el mode google doc dire té una comunitat d'usuaris pròspera amb crítiques positives que demostren la seva qualitat i fiabilitat. Uneix-te a les files d'usuaris satisfets que han transformat la seva experiència a Google Docs.\n \n🎨 Personalització per adaptar-se al teu estil\n\nLa personalització del vostre entorn d'escriptura és un avantatge clau de Google Docs en mode fosc. Personalitza el contingut del teu cor:\n \nNivell de foscor: ajusteu el nivell de foscor segons les vostres preferències, des d'una foscor suau fins a una foscor immersiva.\nPersonalització de la lletra: trieu l'estil, la mida i el color de la lletra que s'adaptin al vostre estil d'escriptura.\nOpcions de fons: adapteu el fons a un color o textura que complementi la vostra estètica.\nColors d'accent: seleccioneu colors d'accent per ressaltar elements específics del document.\n \n🌐 Compatibilitat entre navegadors\n\nTant si feu servir Chrome, Firefox o un altre navegador, Black Mode G Docs està dissenyat per a la compatibilitat entre navegadors. Gaudeix d'un tema fosc còmode i productiu independentment de l'opció del teu navegador web.\n\n🚀 Augmenta la teva productivitat\n\nEl mode fosc Google Docs no és només una qüestió d'estètica; es tracta d'augmentar la productivitat i millorar la teva experiència d'escriptura:\n \nEnfocament i concentració: el tema Dire minimitza les distraccions i us permet concentrar-vos en el vostre treball sense interrupcions.\nReducció de la fatiga ocular: els vostres ulls us agrairan la reducció de la brillantor, fent que les sessions d'escriptura llargues siguin més còmodes i menys fatigants.\nEficiència energètica: amb el mode fosc G Docs, estalvieu els vostres ulls i ajudeu a estalviar energia, reduint la vostra petjada de carboni.\n \n🌚 En conclusió\n\nGoogle Docs en mode fosc és l'extensió definitiva de Chrome per a qualsevol persona que busqui una experiència d'escriptura còmoda, personalitzable i eficient. Activeu-lo amb un sol clic, personalitzeu-lo segons les vostres preferències i gaudiu d'un entorn sense distraccions que és fàcil per als vostres ulls. Uneix-te a la comunitat d'usuaris satisfets que han fet de Dark Mode G Doc la seva opció preferida per a una experiència superior de Google Docs.\n\n🌙 Google docs mode fosc: millora la teva experiència d'escriptura!\n\nTrobeu cansat la brillantor encegadora de la vostra pantalla mentre treballeu a Google Docs? Esteu desitjant un entorn d'escriptura més còmode i visualment agradable? No busqueu més perquè Google Docs en mode fosc està aquí per transformar la vostra experiència d'escriptura.\n\nEl mode fosc de Google Docs és l'extensió definitiva de Chrome per a aquells que prefereixen una aparença més fosca i més agradable a l'hora de crear, editar o llegir documents. Amb aquesta extensió, podeu canviar perfectament la vostra interfície de Google Docs a un tema fosc elegant i calmant, fent que les vostres sessions d'escriptura siguin més agradables que mai. Digues adéu a la brillantor dura i hola a la productivitat amb estil.\n\n🌟 Característiques clau de Google Docs en mode fosc\n\n1. Activació sense esforç: Google Docs en mode fosc és increïblement fàcil d'utilitzar. Amb només un sol clic, podeu activar el tema fosc per al vostre Google Doc, creant un entorn d'escriptura més còmode i centrat.\n\n2. Opcions de personalització: entenem que una mida no s'adapta a totes. És per això que oferim diverses opcions de personalització, que us permeten ajustar l'extensió perquè coincideixi amb les vostres preferències personals. Ajusteu el nivell de foscor, el tipus de lletra i el fons al vostre gust.\n\n3. Salva els teus ulls: les llargues sessions d'escriptura poden afectar els teus ulls. El mode fosc G Documents redueix la fatiga visual proporcionant un fons suau i fosc que facilita la vostra visió, fent que la vostra experiència d'escriptura sigui més còmoda.\n\n4. Enfocament millorat: el tema fosc ajuda a eliminar les distraccions i manté la teva atenció on correspon: en la teva escriptura. No més enlluernaments innecessaris ni pantalles brillants per allunyar el vostre focus.\n\n5. Eficiència energètica: l'ús de documents de Google en mode fosc no només beneficia els vostres ulls, sinó que també estalvia energia, allargant la vida útil del vostre dispositiu i estalviant costos d'electricitat.\n \n🖥️ Compatibilitat i accessibilitat: el mode fosc G Docs és compatible amb tots els navegadors web principals i està disponible a ordinadors i ordinadors de sobretaula. Ara, podeu gaudir del mode fosc de Google Docs a la vostra plataforma preferida.\n\n🌚 Com activar el mode negre de Google, activar Google Docs en mode atenuat és molt fàcil. Només cal que baixeu l'extensió de Chrome Web Store i feu clic a la icona de Google Docs en mode fosc al vostre navegador. La vostra pàgina de documents de Google canviarà instantàniament al tema fosc calmant, millorant la vostra experiència d'escriptura.\n\n📜 Per què necessites aquesta extensió?\n\nMode fosc de Google Docs: el mode fosc G Docs és la solució definitiva per portar el mode fosc al vostre Google Doc, assegurant-vos que els vostres ulls es mantinguin còmodes durant les sessions d'escriptura.\nProductivitat millorada: amb l'entorn sense distraccions que ofereix el tema negre, et trobaràs més concentrat, eficient i productiu en les teves tasques d'escriptura.\n\nProtecció ocular: l'exposició prolongada a una pantalla brillant pot ser perjudicial per als ulls. Els documents de Google en mode fosc protegeixen els vostres ulls reduint la intensitat de la llum emesa pel vostre dispositiu.\n\nOpcions de personalització: adapteu el document de Google en mode negre al vostre gust. Ajusteu la configuració del mode fosc, els tipus de lletra i els fons segons les vostres preferències individuals.\n\nCompatibilitat entre navegadors: tant si preferiu Chrome, Firefox o un altre navegador, Dim Mode Google Docs és compatible a tots els nivells, de manera que podreu gaudir de l'experiència del mode sense importar el vostre navegador.\n \n📚 Preguntes freqüents:\n \n1. Com puc posar Google Docs en mode sense lluna amb aquesta extensió? Per activar Google Docs en mode fosc, només cal que baixeu l'extensió des de Chrome Web Store i, a continuació, feu clic a la icona de mode fosc dels documents de Google al vostre navegador.\n2. El mode fosc G Docs està disponible per a ordinadors? Absolutament! Google Docs en mode fosc està disponible tant per a ordinadors com per a ordinadors de sobretaula, cosa que garanteix que pugueu gaudir d'un entorn d'escriptura còmode a la vostra plataforma preferida.\n3. Puc personalitzar l'aparença de Google Docs en mode fosc? Si, tu pots! Mode fosc Google Docs ofereix diverses opcions de personalització, que us permeten adaptar l'extensió a les vostres preferències personals.\n4. Google Docs té un mode fosc natiu? Malauradament, Google Docs no ofereix un mode fosc natiu." + } +} diff --git a/_locales/cs/messages.json b/_locales/cs/messages.json new file mode 100644 index 0000000..213095b --- /dev/null +++ b/_locales/cs/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Zvyšte efektivitu pomocí našeho rozšíření Dokumenty Google v tmavém režimu. Vyzkoušejte bezproblémový tmavý režim Dokumentů Google pro lepší psaní." + }, + "appName": { + "message": "Tmavý režim Dokumentů Google" + }, + "storeDesc": { + "message": "🌟 Proč si vybrat tmavý režim Dokumentů Google a ne konkurenci?\n\nVzhledem k četným rozšířením pro Chrome, která nabízejí funkci tmavého režimu, vás možná zajímá, proč je tmavý režim G Docs tou nejlepší volbou. Pojďme prozkoumat, proč tmavý režim Dokumentů Google vyniká:\n\n1. Uživatelsky přívětivé rozhraní: Tmavý režim Dokumentů Google poskytuje intuitivní rozhraní pro snadnou navigaci. Najít nastavení a možnosti přizpůsobení je hračka.\n2. Rychlost a efektivita: Naše rozšíření je optimalizováno pro výkon, takže nezpomaluje prohlížeč ani Dokumenty Google a poskytuje tmavý motiv bez snížení rychlosti.\n3. Pravidelné aktualizace: Černý režim g docs se průběžně aktualizuje, aby držel krok se změnami v Dokumentech Google, čímž zajišťuje, že vaše prostředí tmavého režimu zůstane aktuální a funkční.\n4. Podpora reagování: Pokud narazíte na problémy nebo máte dotazy, náš tým podpory je připraven vám okamžitě pomoci a snaží se zajistit bezproblémové používání.\n5. Široká uživatelská základna: Google Doc dire mode má prosperující komunitu uživatelů s pozitivními recenzemi, které svědčí o jeho kvalitě a spolehlivosti. Připojte se k řadě spokojených uživatelů, kteří změnili své zkušenosti s Dokumenty Google.\n \n🎨 Přizpůsobení podle vašeho stylu\n\nPřizpůsobení prostředí pro psaní je hlavní výhodou tmavého režimu Dokumentů Google. Přizpůsobte si je podle svých představ:\n \nÚroveň tmavosti: Nastavte úroveň tmavosti podle svých preferencí, od jemného ztlumení až po pohlcující tmu.\nPřizpůsobení písma: Zvolte si styl, velikost a barvu písma, které vyhovují vašemu stylu psaní.\nMožnosti pozadí: Přizpůsobte pozadí barvě nebo textuře, která odpovídá vaší estetice.\nAkcentní barvy: Vyberte barvy akcentů, abyste zvýraznili konkrétní prvky dokumentu.\n \n🌐 Kompatibilita napříč prohlížeči\n\nAť už používáte Chrome, Firefox nebo jiný prohlížeč, Black Mode G Docs je navržen tak, aby byl kompatibilní napříč prohlížeči. Užívejte si pohodlné a produktivní tmavé téma bez ohledu na výběr webového prohlížeče.\n\n🚀 Zvyšte svou produktivitu\n\nTmavý režim Dokumentů Google není jen o estetice, ale také o zvýšení produktivity a vylepšení vašeho zážitku z psaní:\n \nSoustředění a koncentrace: Motiv Dire minimalizuje rušivé vlivy a umožňuje vám soustředit se na práci bez vyrušování.\nSnížení namáhání očí: Vaše oči vám poděkují za snížený jas, takže dlouhé psaní bude pohodlnější a méně únavné.\nEnergetická účinnost: Používáním tmavého režimu G Docs šetříte své oči a pomáháte šetřit energii, čímž snižujete svou uhlíkovou stopu.\n \n🌚 Závěrem\n\nTmavý režim Dokumentů Google je dokonalé rozšíření prohlížeče Chrome pro všechny, kteří hledají pohodlné, přizpůsobitelné a efektivní psaní. Aktivujte ho jediným kliknutím, přizpůsobte si ho podle svých preferencí a užívejte si prostředí bez rozptylování, které je šetrné k vašim očím. Připojte se ke spokojené komunitě uživatelů, kteří si tmavý režim G Doc zvolili jako svou volbu pro vynikající prostředí Dokumentů Google.\n\n🌙 Tmavý režim Google Docs - Zlepšete si zážitek z psaní!\n\nPřipadá vám oslepující odlesk obrazovky při práci s Dokumenty Google únavný? Toužíte po pohodlnějším a vizuálně příjemnějším prostředí pro psaní? Už nehledejte, protože tmavý režim Dokumentů Google je tu, aby změnil váš zážitek z psaní.\n\nTmavý režim Dokumenty Google je dokonalé rozšíření prohlížeče Chrome pro ty, kteří při vytváření, úpravách nebo čtení dokumentů dávají přednost tmavšímu a pro oči přívětivějšímu vzhledu. S tímto rozšířením můžete plynule přepnout rozhraní Dokumentů Google do elegantního a uklidňujícího tmavého motivu, díky čemuž bude vaše psaní příjemnější než kdykoli předtím. Rozlučte se s ostrým jasem a přivítejte stylovou produktivitu.\n\n🌟 Klíčové funkce tmavého režimu Dokumentů Google\n\n1. Aktivace bez námahy: Tmavý režim Dokumentů Google se používá neuvěřitelně snadno. Jediným kliknutím můžete aktivovat tmavé téma Dokumentů Google a vytvořit tak pohodlnější a soustředěnější prostředí pro psaní.\n\n2. Možnosti přizpůsobení: Chápeme, že jedna velikost nesedí všem. Proto nabízíme různé možnosti přizpůsobení, které vám umožní upravit rozšíření podle vašich osobních preferencí. Upravte si úroveň tmavosti, písmo a pozadí podle svých představ.\n\n3. Šetří vaše oči: Dlouhé psaní se může podepsat na vašich očích. Tmavý režim G Dokumenty snižuje namáhání očí tím, že poskytuje jemné tmavé pozadí, které je nenáročné pro váš zrak, takže psaní je pohodlnější.\n\n4. Lepší soustředění: Tmavé téma pomáhá eliminovat rozptýlení a udržuje vaši pozornost tam, kam patří - na psaní. Už žádné zbytečné odlesky nebo jasné obrazovky, které by odváděly vaši pozornost.\n\n5. Energetická účinnost: Používání tmavého režimu dokumentů Google prospívá nejen vašim očím, ale také šetří energii, čímž prodlužuje životnost vašeho zařízení a šetří náklady na elektřinu.\n \n🖥️ Kompatibilita a přístupnost: Tmavý režim Dokumentů G je kompatibilní se všemi hlavními webovými prohlížeči a je snadno dostupný na osobních a stolních počítačích. Nyní můžete tmavý režim Dokumentů Google využívat na své oblíbené platformě.\n\n🌚 Jak aktivovat černý režim Google, Aktivace tmavého režimu Dokumenty Google je hračka. Stačí si stáhnout rozšíření z webového obchodu Chrome a kliknout na ikonu Tmavý režim Dokumenty Google v prohlížeči. Stránka Dokumenty Google se okamžitě přepne do uklidňujícího tmavého motivu, což zlepší váš zážitek z psaní.\n\n📜 Proč potřebujete toto rozšíření?\n\nTmavý režim Dokumentů Google: Tmavý režim Dokumentů Google je definitivním řešením, které do vašich Dokumentů Google přináší tmavý režim a zajišťuje, že vaše oči zůstanou během psaní v pohodlí.\nZvýšená produktivita: Zvyšte produktivitu práce s dokumenty Doc: Díky prostředí bez rušivých vlivů, které černý motiv poskytuje, se při psaní úkolů budete lépe soustředit, budete efektivnější a produktivnější.\n\nOchrana očí: Dlouhodobé vystavení jasné obrazovce může být pro vaše oči škodlivé. Tmavý režim Dokumenty Google chrání vaše oči snížením intenzity světla vyzařovaného ze zařízení.\n\nMožnosti přizpůsobení: Přizpůsobte si Černý režim Dokumentů Google podle svých představ. Upravte nastavení tmavého režimu, písma a pozadí podle svých individuálních preferencí.\n\nKompatibilita napříč prohlížeči: Je jedno, jestli dáváte přednost prohlížeči Chrome, Firefox nebo jinému prohlížeči, Dokumenty Google v tmavém režimu jsou kompatibilní napříč všemi prohlížeči, takže si můžete vychutnat práci v režimu bez ohledu na to, jaký prohlížeč jste si vybrali.\n \n📚 Často kladené otázky:\n \n1. Jak pomocí tohoto rozšíření přepnu Dokumenty Google do bezměsíčního režimu? Chcete-li aktivovat tmavý režim Dokumentů Google, jednoduše si stáhněte rozšíření z webového obchodu Chrome a poté klikněte na ikonu tmavého režimu Dokumentů Google v prohlížeči.\n2. Je tmavý režim Dokumentů G k dispozici i pro počítače? Určitě! Tmavý režim Dokumentů Google je k dispozici pro počítače i stolní počítače, což vám zajistí pohodlné psaní na preferované platformě.\n3. Mohu si přizpůsobit vzhled tmavého režimu Dokumentů Google? Ano, můžete! Tmavý režim Dokumentů Google nabízí různé možnosti přizpůsobení, které vám umožní přizpůsobit rozšíření vašim osobním preferencím.\n4. Mají Dokumenty Google nativní tmavý režim? Dokumenty Google bohužel nenabízejí nativní tmavý režim." + } +} diff --git a/_locales/da/messages.json b/_locales/da/messages.json new file mode 100644 index 0000000..4eb44dd --- /dev/null +++ b/_locales/da/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Øg effektiviteten med vores Dark Mode Google Docs-udvidelse. Oplev sømløs Google Docs dark mode for forbedret skrivning." + }, + "appName": { + "message": "Mørk tilstand i Google Docs" + }, + "storeDesc": { + "message": "🌟 Hvorfor vælge Google Docs i mørk tilstand frem for konkurrenterne?\n\nMed mange Chrome-udvidelser, der tilbyder dark mode-funktionalitet, undrer du dig måske over, hvad der gør Dark Mode G Docs til dit bedste valg. Lad os undersøge, hvorfor Dark Mode Google Docs skiller sig ud:\n\n1. Brugervenlig grænseflade: Dark Mode Google Docs har en intuitiv brugerflade, der gør det nemt at navigere. Det er en leg at finde indstillinger og tilpasningsmuligheder.\n2. Hastighed og effektivitet: Vores udvidelse er optimeret til ydeevne, hvilket sikrer, at den ikke gør din browser eller Google Docs langsommere, og leverer et mørkt tema uden at gå på kompromis med hastigheden.\n3. Regelmæssige opdateringer: g docs black mode opdateres løbende for at holde trit med Google Docs' ændringer, hvilket sikrer, at din dark mode-oplevelse forbliver aktuel og funktionel.\n4. Responsiv support: Hvis du støder på problemer eller har spørgsmål, er vores supportteam klar til at hjælpe med det samme, og de er engagerede i at sikre en problemfri oplevelse.\n5. Bred brugerbase: google doc dire mode har et blomstrende brugerfællesskab med positive anmeldelser, der vidner om dets kvalitet og pålidelighed. Slut dig til rækken af tilfredse brugere, der har forvandlet deres Google Docs-oplevelse.\n \n🎨 Tilpasning, så den passer til din stil\n\nAt tilpasse dit skrivemiljø er en vigtig fordel ved Dark Mode Google Docs. Tilpas efter dit hjertes indhold:\n \nMørkeniveau: Juster mørkeniveauet, så det passer til dine præferencer, fra en blid dæmpning til et fordybende mørke.\nTilpasning af skrifttype: Vælg den skrifttype, størrelse og farve, der passer til din skrivestil.\nBaggrundsindstillinger: Skræddersy baggrunden til en farve eller tekstur, der supplerer din æstetik.\nAccentfarver: Vælg accentfarver for at fremhæve specifikke dokumentelementer.\n \n🌐 Kompatibilitet på tværs af browsere\n\nUanset om du bruger Chrome, Firefox eller en anden browser, er Black Mode G Docs designet til kompatibilitet på tværs af browsere. Nyd et behageligt og produktivt mørkt tema, uanset hvilken webbrowser du vælger.\n\n🚀 Boost din produktivitet\n\nDark Mode Google Docs handler ikke kun om æstetik; det handler om at øge produktiviteten og forbedre din skriveoplevelse:\n \nFokus og koncentration: Dire-temaet minimerer distraktioner, så du kan koncentrere dig om dit arbejde uden afbrydelser.\nReduceret belastning af øjnene: Dine øjne vil takke dig for den reducerede lysstyrke, der gør lange skrivesessioner mere behagelige og mindre trættende.\nEnergieffektivitet: Ved at bruge Dark Mode G Docs skåner du dine øjne og hjælper med at spare energi, hvilket reducerer dit CO2-fodaftryk.\n \n🌚 Konklusion\n\nDark Mode Google Docs er den ultimative Chrome-udvidelse til alle, der ønsker en behagelig, tilpasselig og effektiv skriveoplevelse. Aktivér den med et enkelt klik, tilpas den til dine præferencer, og nyd et distraktionsfrit miljø, der er skånsomt for dine øjne. Bliv en del af det tilfredse fællesskab af brugere, der har gjort Dark Mode G Doc til deres foretrukne valg for en overlegen Google Docs-oplevelse.\n\n🌙 Google docs dark mode - Forbedr din skriveoplevelse!\n\nSynes du, at det blændende skær fra din skærm er trættende, når du arbejder i Google Docs? Længes du efter et mere behageligt og visuelt tiltalende skrivemiljø? Så behøver du ikke lede længere, for Dark Mode Google Docs er her for at forvandle din skriveoplevelse.\n\nGoogle Docs Dark Mode er den ultimative Chrome-udvidelse til dem, der foretrækker et mørkere og mere øjenvenligt udseende, når de opretter, redigerer eller læser dokumenter. Med denne udvidelse kan du uden problemer skifte din Google Docs-grænseflade til et elegant og beroligende mørkt tema, der gør dine skrivesessioner sjovere end nogensinde før. Sig farvel til den skarpe lysstyrke og goddag til produktivitet med stil.\n\n🌟 Nøglefunktioner i Dark Mode Google Docs\n\n1. Ubesværet aktivering: Dark Mode Google Docs er utroligt nemt at bruge. Med blot et enkelt klik kan du aktivere det mørke tema til dit Google Doc og skabe et mere behageligt og fokuseret skrivemiljø.\n\n2. Tilpasningsmuligheder: Vi forstår, at én størrelse ikke passer til alle. Derfor tilbyder vi forskellige tilpasningsmuligheder, så du kan finjustere udvidelsen, så den passer til dine personlige præferencer. Juster mørkeniveauet, skrifttypen og baggrunden, som du vil have det.\n\n3. Sparer dine øjne: Lange skrivesessioner kan være hårde for dine øjne. Dark Mode G Documents reducerer belastningen af øjnene ved at give en blid, mørk baggrund, der skåner dit syn og gør din skriveoplevelse mere behagelig.\n\n4. Forbedret fokus: Det mørke tema hjælper med at eliminere distraktioner og holder din opmærksomhed, hvor den hører hjemme - på din skrivning. Ikke mere unødvendig blænding eller lyse skærme, der fjerner dit fokus.\n\n5. Energieffektivitet: Brug af Dark Mode Google-dokumenter er ikke kun godt for dine øjne, men sparer også energi, forlænger din enheds levetid og sparer på el-omkostningerne.\n \n🖥️ Kompatibilitet og tilgængelighed: Dark Mode G Docs er kompatibel med alle større webbrowsere og er let tilgængelig på pc'er og desktops. Nu kan du nyde Google Docs' mørke tilstand på din foretrukne platform.\n\n🌚 Sådan aktiverer du Black Mode Google, Det er en leg at aktivere Dim Mode Google Docs. Du skal blot downloade udvidelsen fra Chrome Web Store og klikke på ikonet Dark Mode Google Docs i din browser. Din Google Documents-side skifter øjeblikkeligt til det beroligende mørke tema, hvilket forbedrer din skriveoplevelse.\n\n📜 Hvorfor har du brug for denne udvidelse?\n\nGoogle Docs i mørk tilstand: Dark Mode G Docs er den endelige løsning til at bringe mørk tilstand til dit Google Doc, hvilket sikrer, at dine øjne forbliver komfortable under dine skrivesessioner.\nForbedret produktivitet: Med det distraktionsfrie miljø, som det sorte tema giver, vil du opleve, at du er mere fokuseret, effektiv og produktiv i dine skriveopgaver.\n\nBeskyttelse af øjnene: Langvarig eksponering for en lys skærm kan være skadelig for dine øjne. Dark Mode Google Documents beskytter dine øjne ved at reducere intensiteten af det lys, der udsendes fra din enhed.\n\nMuligheder for tilpasning: Skræddersy Black Mode Google Doc efter din smag. Juster indstillingerne for mørk tilstand, skrifttyper og baggrunde, så de passer til dine individuelle præferencer.\n\nKompatibilitet på tværs af browsere: Uanset om du foretrækker Chrome, Firefox eller en anden browser, er Dim Mode Google Docs kompatibel over hele linjen, så du kan nyde tilstandsoplevelsen uanset dit valg af browser.\n \n📚 Ofte stillede spørgsmål:\n \n1. Hvordan sætter jeg Google Docs i måneløs tilstand med denne udvidelse? For at aktivere Dark Mode Google Docs skal du blot downloade udvidelsen fra Chrome Web Store og derefter klikke på ikonet for Google-dokumenter i mørk tilstand i din browser.\n2. Er Dark Mode G Docs tilgængelig til desktop? Ja, absolut! Dark Mode Google Docs er tilgængelig for både pc'er og desktops, hvilket sikrer, at du kan nyde et behageligt skrivemiljø på din foretrukne platform.\n3. Kan jeg tilpasse udseendet af Dark Mode Google Docs? Ja, det kan du! Dark Mode Google Docs tilbyder forskellige tilpasningsmuligheder, så du kan skræddersy udvidelsen til dine personlige præferencer.\n4. Har Google Docs en indbygget mørk tilstand? Desværre tilbyder Google Docs ikke en indbygget dark mode." + } +} diff --git a/_locales/de/messages.json b/_locales/de/messages.json new file mode 100644 index 0000000..7b4b852 --- /dev/null +++ b/_locales/de/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Steigern Sie die Effizienz mit unserer Dark Mode Google Docs Erweiterung. Erleben Sie den nahtlosen Google Docs Dark Mode für verbessertes Schreiben." + }, + "appName": { + "message": "Dunkler Modus Google Docs" + }, + "storeDesc": { + "message": "🌟 Warum den dunklen Modus von Google Text & Tabellen den Mitbewerbern vorziehen?\n\nAngesichts der zahlreichen Chrome-Erweiterungen, die Funktionen für den dunklen Modus anbieten, fragen Sie sich vielleicht, warum der dunkle Modus von Google Text & Tabellen Ihre erste Wahl ist. Lassen Sie uns herausfinden, warum der Dark Mode Google Docs auszeichnet:\n\n1. Benutzerfreundliches Interface: Dark Mode Google Docs bietet eine intuitive Benutzeroberfläche für eine einfache Navigation. Die Suche nach Einstellungen und Anpassungsoptionen ist ein Kinderspiel.\n2. Geschwindigkeit und Effizienz: Unsere Erweiterung ist für die Leistung optimiert, so dass sie Ihren Browser oder Google Text & Tabellen nicht verlangsamt und Ihnen ein dunkles Thema bietet, ohne die Geschwindigkeit zu beeinträchtigen.\n3. Regelmäßige Updates: g docs black mode wird laufend aktualisiert, um mit den Änderungen von Google Docs Schritt zu halten und sicherzustellen, dass Ihr dunkler Modus aktuell und funktionell bleibt.\n4. Reagierender Support: Wenn Sie Probleme oder Fragen haben, ist unser Support-Team bereit, Ihnen umgehend zu helfen, um einen reibungslosen Ablauf zu gewährleisten.\n5. Breiter Nutzerkreis: Der Google-Doc-Dunkelmodus hat eine blühende Nutzergemeinschaft mit positiven Bewertungen, die seine Qualität und Zuverlässigkeit bestätigen. Schließen Sie sich den Reihen der zufriedenen Nutzer an, die ihre Google Docs-Erfahrung verändert haben.\n \n🎨 Anpassung an Ihren Stil\n\nEin wesentlicher Vorteil von Google Text & Tabellen im Dark Mode ist die Personalisierung Ihrer Schreibumgebung. Passen Sie sie nach Herzenslust an:\n \nSchwärzungsgrad: Passen Sie die Dunkelheitsstufe an Ihre Vorlieben an, von einem sanften Dimmen bis hin zu einer tiefgreifenden Dunkelheit.\nSchriftanpassung: Wählen Sie die Schriftart, -größe und -farbe, die zu Ihrem Schreibstil passt.\nHintergrund-Optionen: Passen Sie den Hintergrund in einer Farbe oder Textur an, die zu Ihrer Ästhetik passt.\nAkzentfarben: Wählen Sie Akzentfarben, um bestimmte Dokumentelemente hervorzuheben.\n \n🌐 Kompatibilität mit verschiedenen Browsern\n\nEgal, ob Sie Chrome, Firefox oder einen anderen Browser verwenden, Black Mode G Docs wurde für die Kompatibilität mit anderen Browsern entwickelt. Genießen Sie ein komfortables und produktives dunkles Thema unabhängig von der Wahl Ihres Webbrowsers.\n\n🚀 Steigern Sie Ihre Produktivität\n\nBeim dunklen Modus von Google Text & Tabellen geht es nicht nur um die Ästhetik, sondern auch um die Steigerung der Produktivität und die Verbesserung Ihres Schreibverhaltens:\n \nFokus und Konzentration: Das Dire-Thema minimiert Ablenkungen und ermöglicht es Ihnen, sich ohne Unterbrechungen auf Ihre Arbeit zu konzentrieren.\nGeringere Augenbelastung: Ihre Augen werden Ihnen für die reduzierte Helligkeit danken, die lange Schreibsessions angenehmer und weniger ermüdend macht.\nEnergie-Effizienz: Durch die Verwendung des Dark Mode von G Docs schonen Sie Ihre Augen und helfen, Energie zu sparen, um Ihren ökologischen Fußabdruck zu verringern.\n \n🌚 Fazit\n\nDer dunkle Modus von Google Text & Tabellen ist die ultimative Chrome-Erweiterung für alle, die ein komfortables, anpassbares und effizientes Schreiberlebnis suchen. Aktivieren Sie sie mit einem einzigen Klick, passen Sie sie an Ihre Vorlieben an und genießen Sie eine ablenkungsfreie Umgebung, die Ihre Augen schont. Schließen Sie sich der zufriedenen Gemeinschaft von Nutzern an, die den Dark Mode G Doc zu ihrer ersten Wahl für ein hervorragendes Google Docs-Erlebnis gemacht haben.\n\n🌙 Google Docs Dark Mode - Verbessern Sie Ihr Schreibgefühl!\n\nEmpfinden Sie die Blendung Ihres Bildschirms bei der Arbeit mit Google Text & Tabellen als lästig? Sehnen Sie sich nach einer komfortableren und visuell angenehmeren Schreibumgebung? Suchen Sie nicht weiter, denn der dunkle Modus von Google Text & Tabellen ist da, um Ihr Schreiberlebnis zu verbessern.\n\nDer dunkle Modus von Google Text & Tabellen ist die ultimative Chrome-Erweiterung für alle, die beim Erstellen, Bearbeiten oder Lesen von Dokumenten eine dunklere, augenfreundlichere Darstellung bevorzugen. Mit dieser Erweiterung können Sie die Oberfläche von Google Text & Tabellen nahtlos in ein elegantes und beruhigendes dunkles Design umwandeln, das Ihre Schreibsessions angenehmer macht als je zuvor. Verabschieden Sie sich von der grellen Helligkeit und begrüßen Sie die Produktivität mit Stil.\n\n🌟 Hauptmerkmale von Dark Mode Google Docs\n\n1. Mühelose Aktivierung: Der dunkle Modus von Google Text & Tabellen ist unglaublich einfach zu verwenden. Mit nur einem einzigen Klick können Sie das dunkle Thema für Ihre Google Docs aktivieren und so eine angenehmere und konzentriertere Schreibumgebung schaffen.\n\n2. Anpassungsoptionen: Wir wissen, dass eine Größe nicht für alle passt. Deshalb bieten wir verschiedene Anpassungsoptionen, mit denen Sie die Erweiterung an Ihre persönlichen Vorlieben anpassen können. Passen Sie die Dunkelheit, die Schriftart und den Hintergrund nach Ihren Wünschen an.\n\n3. Schont Ihre Augen: Lange Schreibsessions können Ihre Augen stark beanspruchen. Dark Mode G Documents reduziert die Belastung der Augen durch einen sanften, dunklen Hintergrund, der Ihre Augen schont und das Schreiben angenehmer macht.\n\n4. Verbesserte Konzentration: Das dunkle Thema hilft, Ablenkungen zu vermeiden und Ihre Aufmerksamkeit dort zu halten, wo sie hingehört - beim Schreiben. Keine unnötigen Blendungen oder hellen Bildschirme mehr, die Ihre Aufmerksamkeit ablenken.\n\n5. Energie-Effizienz: Die Verwendung des dunklen Modus von Google-Dokumenten ist nicht nur gut für Ihre Augen, sondern spart auch Energie, verlängert die Lebensdauer Ihres Geräts und spart Stromkosten.\n \n🖥️ Kompatibilität und Zugänglichkeit: Der dunkle Modus von Google Text & Tabellen ist mit allen gängigen Webbrowsern kompatibel und steht auf PCs und Desktops zur Verfügung. Jetzt können Sie den Dark Mode von Google Text & Tabellen auf Ihrer bevorzugten Plattform nutzen.\n\n🌚 So aktivieren Sie den dunklen Modus von Google, Das Aktivieren des dunklen Modus von Google Text & Tabellen ist ein Kinderspiel. Laden Sie einfach die Erweiterung aus dem Chrome Web Store herunter und klicken Sie auf das Symbol für den dunklen Modus von Google Text & Tabellen in Ihrem Browser. Ihre Google-Dokumente-Seite wechselt sofort in den beruhigenden dunklen Modus und verbessert so Ihr Schreibgefühl.\n\n📜 Warum brauchen Sie diese Erweiterung?\n\nGoogle Text & Tabellen Dunkler Modus: Dark Mode G Docs ist die endgültige Lösung, um den dunklen Modus in Ihre Google Docs zu bringen und sicherzustellen, dass Ihre Augen während Ihrer Schreibsitzungen bequem bleiben.\nErhöhte Produktivität: Dank der ablenkungsfreien Umgebung, die das schwarze Thema bietet, werden Sie sich bei Ihren Schreibaufgaben konzentrierter, effizienter und produktiver fühlen.\n\nSchutz der Augen: Längerer Aufenthalt auf einem hellen Bildschirm kann schädlich für Ihre Augen sein. Der dunkle Modus von Google Documents schützt Ihre Augen, indem er die Lichtintensität Ihres Geräts reduziert.\n\nAnpassungsoptionen: Passen Sie den Dunkelmodus von Google Docs an Ihre Wünsche an. Passen Sie die Einstellungen für den dunklen Modus, die Schriftarten und Hintergründe an Ihre individuellen Vorlieben an.\n\nBrowserübergreifende Kompatibilität: Egal, ob Sie Chrome, Firefox oder einen anderen Browser bevorzugen, der Dim Mode von Google Docs ist durchgängig kompatibel, so dass Sie den Modus unabhängig von der Wahl Ihres Browsers nutzen können.\n \n📚 FAQs:\n \n1. Wie versetze ich Google Docs mit dieser Erweiterung in den mondlosen Modus? Um den dunklen Modus von Google Text & Tabellen zu aktivieren, laden Sie einfach die Erweiterung aus dem Chrome Web Store herunter und klicken dann auf das Symbol für den dunklen Modus von Google-Dokumenten in Ihrem Browser.\n2. Ist Dark Mode G Docs auch für den Desktop verfügbar? Ja, natürlich! Der dunkle Modus von Google Text & Tabellen ist sowohl für PCs als auch für Desktops verfügbar, damit Sie auf Ihrer bevorzugten Plattform eine angenehme Schreibumgebung genießen können.\n3. Kann ich das Erscheinungsbild von Google Text & Tabellen im Dark Mode anpassen? Ja, das können Sie! Der Dark Mode von Google Text & Tabellen bietet verschiedene Anpassungsoptionen, mit denen Sie die Erweiterung an Ihre persönlichen Vorlieben anpassen können.\n4. Verfügt Google Text & Tabellen über einen eigenen dunklen Modus? Leider bietet Google Text & Tabellen keinen nativen dunklen Modus." + } +} diff --git a/_locales/el/messages.json b/_locales/el/messages.json new file mode 100644 index 0000000..11987e3 --- /dev/null +++ b/_locales/el/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Ενισχύστε την αποδοτικότητα με την επέκταση Dark Mode Google Docs. Απολαύστε απρόσκοπτα τη σκοτεινή λειτουργία των Google Docs για βελτιωμένη γραφή." + }, + "appName": { + "message": "Σκοτεινή λειτουργία Google Docs" + }, + "storeDesc": { + "message": "🌟 Γιατί να επιλέξετε Dark Mode Google Docs έναντι των ανταγωνιστών;\n\nΜε πολυάριθμες επεκτάσεις Chrome που προσφέρουν λειτουργίες σκοτεινής λειτουργίας, ίσως αναρωτηθείτε τι κάνει το Dark Mode G Docs την κορυφαία επιλογή σας. Ας εξερευνήσουμε γιατί το Dark Mode Google Docs ξεχωρίζει:\n\n1. Φιλικό προς το χρήστη περιβάλλον εργασίας: Το Dark Mode Google Docs παρέχει μια διαισθητική διεπαφή για εύκολη πλοήγηση. Η εύρεση των ρυθμίσεων και των επιλογών προσαρμογής είναι πανεύκολη.\n2. Ταχύτητα και αποδοτικότητα: Η επέκτασή μας είναι βελτιστοποιημένη για απόδοση, διασφαλίζοντας ότι δεν θα επιβραδύνει το πρόγραμμα περιήγησής σας ή τα Έγγραφα Google, παρέχοντας ένα σκοτεινό θέμα χωρίς συμβιβασμούς στην ταχύτητα.\n3. Τακτικές ενημερώσεις: Το g docs black mode ενημερώνεται συνεχώς για να συμβαδίζει με τις αλλαγές του Google Docs, διασφαλίζοντας ότι η εμπειρία σας στη σκοτεινή λειτουργία παραμένει επίκαιρη και λειτουργική.\n4. Responsive Support: Εάν αντιμετωπίσετε προβλήματα ή έχετε ερωτήσεις, η ομάδα υποστήριξής μας είναι έτοιμη να σας βοηθήσει άμεσα, δεσμευόμενη να διασφαλίσει μια ομαλή εμπειρία.\n5. Ευρεία βάση χρηστών: Το google doc dire mode έχει μια ακμάζουσα κοινότητα χρηστών με θετικές κριτικές που πιστοποιούν την ποιότητα και την αξιοπιστία του. Ενταχθείτε στις τάξεις των ικανοποιημένων χρηστών που έχουν μεταμορφώσει την εμπειρία τους στα Έγγραφα Google.\n \n🎨 Προσαρμογή για να ταιριάζει στο στυλ σας\n\nΗ εξατομίκευση του περιβάλλοντος γραφής σας είναι ένα βασικό πλεονέκτημα της λειτουργίας Dark Mode των Google Docs. Προσαρμόστε το κατά βούληση:\n \nΕπίπεδο σκοτεινότητας: Ρυθμίστε το επίπεδο σκοτεινότητας ανάλογα με τις προτιμήσεις σας, από ένα απαλό αμυδρό έως ένα καθηλωτικό σκοτάδι.\nΠροσαρμογή γραμματοσειράς: Επιλέξτε το στυλ, το μέγεθος και το χρώμα της γραμματοσειράς που ταιριάζει στο στυλ γραφής σας.\nΕπιλογές φόντου: Προσαρμόστε το φόντο σε ένα χρώμα ή μια υφή που συμπληρώνει την αισθητική σας.\nΧρώματα έμφασης: Επιλέξτε χρώματα έμφασης για να τονίσετε συγκεκριμένα στοιχεία του εγγράφου.\n \n🌐 Συμβατότητα σε όλα τα προγράμματα περιήγησης\n\nΕίτε χρησιμοποιείτε Chrome, Firefox ή άλλο πρόγραμμα περιήγησης, το Black Mode G Docs έχει σχεδιαστεί για συμβατότητα μεταξύ διαφορετικών προγραμμάτων περιήγησης. Απολαύστε ένα άνετο και παραγωγικό σκοτεινό θέμα, ανεξάρτητα από την επιλογή του προγράμματος περιήγησης ιστού που χρησιμοποιείτε.\n\n🚀 Ενισχύστε την παραγωγικότητά σας\n\nΗ σκοτεινή λειτουργία Google Docs δεν αφορά μόνο την αισθητική, αλλά και την ενίσχυση της παραγωγικότητας και τη βελτίωση της εμπειρίας γραφής σας:\n \nΕστίαση και συγκέντρωση: Το θέμα Dire ελαχιστοποιεί τους περισπασμούς, επιτρέποντάς σας να συγκεντρωθείτε στην εργασία σας χωρίς διακοπές.\nΜειωμένη καταπόνηση των ματιών: Τα μάτια σας θα σας ευχαριστήσουν για τη μειωμένη φωτεινότητα, κάνοντας τις μακρές συνεδρίες γραφής πιο άνετες και λιγότερο κουραστικές.\nΕνεργειακή απόδοση: Χρησιμοποιώντας τη σκοτεινή λειτουργία G Docs, σώζετε τα μάτια σας και συμβάλλετε στην εξοικονόμηση ενέργειας, μειώνοντας το αποτύπωμα άνθρακα.\n \n🌚 Συμπερασματικά\n\nΤο Dark Mode Google Docs είναι η απόλυτη επέκταση Chrome για όσους αναζητούν μια άνετη, προσαρμόσιμη και αποτελεσματική εμπειρία γραφής. Ενεργοποιήστε την με ένα μόνο κλικ, προσαρμόστε την στις προτιμήσεις σας και απολαύστε ένα περιβάλλον χωρίς περισπασμούς που είναι φιλικό προς τα μάτια σας. Γίνετε μέλος της ικανοποιημένης κοινότητας χρηστών που έχουν κάνει το Dark Mode G Doc τη δική τους επιλογή για μια ανώτερη εμπειρία στο Google Docs.\n\n🌙 Σκοτεινή λειτουργία Google docs - Βελτιώστε την εμπειρία συγγραφής σας!\n\nΘεωρείτε κουραστική την εκτυφλωτική λάμψη της οθόνης σας ενώ εργάζεστε στα Έγγραφα Google; Λαχταράτε ένα πιο άνετο και οπτικά ευχάριστο περιβάλλον γραφής; Μην ψάχνετε άλλο, γιατί η σκοτεινή λειτουργία Google Docs είναι εδώ για να μεταμορφώσει την εμπειρία της γραφής σας.\n\nΗ σκοτεινή λειτουργία Google docs είναι η απόλυτη επέκταση του Chrome για όσους προτιμούν μια πιο σκοτεινή, πιο φιλική προς τα μάτια εμφάνιση κατά τη δημιουργία, την επεξεργασία ή την ανάγνωση εγγράφων. Με αυτή την επέκταση, μπορείτε να αλλάξετε απρόσκοπτα το περιβάλλον εργασίας σας στο Google Docs σε ένα κομψό και καταπραϋντικό σκοτεινό θέμα, κάνοντας τις συνεδρίες γραφής σας πιο ευχάριστες από ποτέ. Πείτε αντίο στην σκληρή φωτεινότητα και γεια στην παραγωγικότητα με στυλ.\n\n🌟 Βασικά χαρακτηριστικά του Dark Mode Google Docs\n\n1. Αβίαστη ενεργοποίηση: Λειτουργία Dark Mode Google Docs είναι απίστευτα εύκολο στη χρήση. Με ένα μόνο κλικ, μπορείτε να ενεργοποιήσετε το σκοτεινό θέμα για το Έγγραφό σας Google, δημιουργώντας ένα πιο άνετο και συγκεντρωμένο περιβάλλον γραφής.\n\n2. Επιλογές προσαρμογής: Καταλαβαίνουμε ότι ένα μέγεθος δεν ταιριάζει σε όλους. Γι' αυτό προσφέρουμε διάφορες επιλογές προσαρμογής, επιτρέποντάς σας να προσαρμόσετε την επέκταση στις προσωπικές σας προτιμήσεις. Ρυθμίστε το επίπεδο σκοτεινότητας, τη γραμματοσειρά και το φόντο σύμφωνα με τις προτιμήσεις σας.\n\n3. Σώζει τα μάτια σας: Οι πολύωρες συνεδρίες γραφής μπορεί να επιβαρύνουν τα μάτια σας. Η σκοτεινή λειτουργία G Documents μειώνει την καταπόνηση των ματιών παρέχοντας ένα απαλό, σκούρο φόντο που είναι εύκολο για την όρασή σας, κάνοντας την εμπειρία της γραφής σας πιο άνετη.\n\n4. Βελτιωμένη εστίαση: Το σκοτεινό θέμα βοηθά στην εξάλειψη των περισπασμών και διατηρεί την προσοχή σας εκεί που πρέπει - στο γράψιμο. Δεν υπάρχουν πλέον περιττές αντανακλάσεις ή φωτεινές οθόνες που τραβούν την προσοχή σας μακριά.\n\n5. Ενεργειακή απόδοση: Η χρήση της σκοτεινής λειτουργίας των εγγράφων Google δεν ωφελεί μόνο τα μάτια σας, αλλά εξοικονομεί και ενέργεια, παρατείνοντας τη διάρκεια ζωής της συσκευής σας και εξοικονομώντας κόστος ηλεκτρικής ενέργειας.\n \n🖥️ Συμβατότητα και προσβασιμότητα: Λειτουργία Dark Mode: Τα Έγγραφα G είναι συμβατά με όλα τα κύρια προγράμματα περιήγησης στο διαδίκτυο και είναι άμεσα διαθέσιμα σε υπολογιστές και επιτραπέζιους υπολογιστές. Τώρα, μπορείτε να απολαμβάνετε τη σκοτεινή λειτουργία των Google Docs στην πλατφόρμα που προτιμάτε.\n\n🌚 Πώς να ενεργοποιήσετε τη σκοτεινή λειτουργία Google, Η ενεργοποίηση της σκοτεινής λειτουργίας των Google Docs είναι πανεύκολη. Απλά κατεβάστε την επέκταση από το Chrome Web Store και κάντε κλικ στο εικονίδιο Σκοτεινή λειτουργία Google Docs στο πρόγραμμα περιήγησής σας. Η σελίδα σας Έγγραφα Google θα μεταβεί αμέσως στο καταπραϋντικό σκοτεινό θέμα, βελτιώνοντας την εμπειρία γραφής σας.\n\n📜 Γιατί χρειάζεστε αυτή την επέκταση;\n\nGoogle Docs Dark Mode: Η σκοτεινή λειτουργία G Docs είναι η οριστική λύση για να φέρετε τη σκοτεινή λειτουργία στο Έγγραφό σας Google, εξασφαλίζοντας ότι τα μάτια σας παραμένουν άνετα κατά τη διάρκεια των συνεδριών γραφής σας.\nΕνισχυμένη παραγωγικότητα: Με το περιβάλλον χωρίς περισπασμούς που παρέχει το μαύρο θέμα, θα βρεθείτε πιο συγκεντρωμένοι, αποδοτικοί και παραγωγικοί στις εργασίες γραφής σας.\n\nΠροστασία των ματιών: Η παρατεταμένη έκθεση σε μια φωτεινή οθόνη μπορεί να είναι επιβλαβής για τα μάτια σας. Η σκοτεινή λειτουργία Google Documents προστατεύει τα μάτια σας μειώνοντας την ένταση του φωτός που εκπέμπεται από τη συσκευή σας.\n\nΕπιλογές προσαρμογής: Προσαρμόστε τη Μαύρη λειτουργία εγγράφων Google στις προτιμήσεις σας. Προσαρμόστε τις ρυθμίσεις της σκοτεινής λειτουργίας, τις γραμματοσειρές και τα φόντα ανάλογα με τις προσωπικές σας προτιμήσεις.\n\nΣυμβατότητα με διαφορετικούς φυλλομετρητές: Είτε προτιμάτε το Chrome, το Firefox ή κάποιο άλλο πρόγραμμα περιήγησης, το Έγγραφα Google σε σκοτεινή λειτουργία είναι συμβατό σε όλους τους τομείς, ώστε να μπορείτε να απολαμβάνετε την εμπειρία της λειτουργίας ανεξάρτητα από την επιλογή του προγράμματος περιήγησης.\n \n📚 Συχνές ερωτήσεις:\n \n1. Πώς μπορώ να θέσω τα Έγγραφα Google σε λειτουργία χωρίς φεγγάρι με αυτή την επέκταση; Για να ενεργοποιήσετε τη σκοτεινή λειτουργία των Google Docs, απλά κατεβάστε την επέκταση από το Chrome Web Store και, στη συνέχεια, κάντε κλικ στο εικονίδιο σκοτεινής λειτουργίας των εγγράφων Google στο πρόγραμμα περιήγησής σας.\n2. Είναι διαθέσιμη η σκοτεινή λειτουργία G Docs για την επιφάνεια εργασίας; Απολύτως! Το Dark Mode Google Docs είναι διαθέσιμο τόσο για υπολογιστές όσο και για επιτραπέζιους υπολογιστές, εξασφαλίζοντας ότι μπορείτε να απολαμβάνετε ένα άνετο περιβάλλον γραφής στην πλατφόρμα που προτιμάτε.\n3. Μπορώ να προσαρμόσω την εμφάνιση του Dark Mode Google Docs; Ναι, μπορείτε! Το Dark Mode Google Docs προσφέρει διάφορες επιλογές προσαρμογής, επιτρέποντάς σας να προσαρμόσετε την επέκταση στις προσωπικές σας προτιμήσεις.\n4. Διαθέτει το Google Docs εγγενή σκοτεινή λειτουργία; Δυστυχώς, το Google Docs δεν προσφέρει εγγενή σκοτεινή λειτουργία." + } +} diff --git a/_locales/en/messages.json b/_locales/en/messages.json new file mode 100644 index 0000000..e9026fa --- /dev/null +++ b/_locales/en/messages.json @@ -0,0 +1,158 @@ +{ + "add_site_to_list": { + "message": "Add site to list" + }, + "appDesc": { + "message": "Boost efficiency with our Dark Mode Google Docs Extension. Experience seamless Google Docs dark mode for enhanced writing." + }, + "appName": { + "message": "Dark Mode Google Docs" + }, + "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" + }, + "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": "Enable/Disable extension" + }, + "setup_hotkey_toggle_site": { + "message": "Change mode on current site" + }, + "site_list": { + "message": "Site list" + }, + "storeDesc": { + "message": "🌟 Why Choose Dark Mode Google Docs Over Competitors? \n\nWith numerous Chrome extensions offering dark mode functionality, you might wonder what makes Dark Mode G Docs your top choice. Let's explore why Dark Mode Google Docs stands out:\n\n1. User-Friendly Interface: Dark Mode Google Docs provides an intuitive interface for easy navigation. Finding settings and customization options is a breeze.\n2. Speed and Efficiency: Our extension is optimized for performance, ensuring it won't slow down your browser or Google Docs, delivering a dark theme without compromising speed.\n3. Regular Updates: g docs black mode continuously updates to keep pace with Google Docs' changes, ensuring your dark mode experience remains current and functional.\n4. Responsive Support: If you encounter issues or have questions, our support team is ready to assist promptly, committed to ensuring a smooth experience.\n5. Wide User Base: google doc dire mode has a thriving user community with positive reviews attesting to its quality and reliability. Join the ranks of satisfied users who've transformed their Google Docs experience.\n \n🎨 Customization to Suit Your Style \n\nPersonalizing your writing environment is a key advantage of Dark Mode Google Docs. Customize to your heart's content:\n \nDarkness Level: Adjust the darkness level to match your preference, from a gentle dim to an immersive darkness.\nFont Customization: Choose the font style, size, and color that suits your writing style.\nBackground Options: Tailor the background to a color or texture that complements your aesthetic.\nAccent Colors: Select accent colors to highlight specific document elements.\n \n🌐 Compatibility Across Browsers \n\nWhether you use Chrome, Firefox, or another browser, Black Mode G Docs is designed for cross-browser compatibility. Enjoy a comfortable and productive dark theme regardless of your web browser choice.\n\n🚀 Boost Your Productivity \n\nDark Mode Google Docs isn't just about aesthetics; it's about boosting productivity and enhancing your writing experience:\n \nFocus and Concentration: The Dire theme minimizes distractions, allowing you to concentrate on your work without interruptions.\nReduced Eye Strain: Your eyes will thank you for the reduced brightness, making long writing sessions more comfortable and less fatiguing.\nEnergy Efficiency: By using Dark Mode G Docs, you save your eyes and help conserve energy, reducing your carbon footprint.\n \n🌚 In Conclusion \n\nDark Mode Google Docs is the ultimate Chrome extension for anyone seeking a comfortable, customizable, and efficient writing experience. Activate it with a single click, customize it to your preferences, and enjoy a distraction-free environment that's easy on your eyes. Join the satisfied community of users who've made Dark Mode G Doc their go-to choice for a superior Google Docs experience.\n\n🌙 Google docs dark mode - Enhance Your Writing Experience! \n\nDo you find the blinding glare of your screen while working on Google Docs tiresome? Are you yearning for a more comfortable and visually pleasing writing environment? Look no further because Dark Mode Google Docs is here to transform your writing experience. \n\nGoogle docs dark mode is the ultimate Chrome extension for those who prefer a darker, more eye-friendly appearance when creating, editing, or reading documents. With this extension, you can seamlessly switch your Google Docs interface to a sleek and soothing dark theme, making your writing sessions more enjoyable than ever before. Say goodbye to the harsh brightness and hello to productivity in style. \n\n🌟 Key Features of Dark Mode Google Docs \n\n1. Effortless Activation: Dark Mode Google Docs is incredibly easy to use. With just a single click, you can activate the dark theme for your Google Doc, creating a more comfortable and focused writing environment.\n\n2. Customization Options: We understand that one size doesn't fit all. That's why we offer various customization options, allowing you to tweak the extension to match your personal preferences. Adjust the darkness level, font, and background to your liking.\n\n3. Saves Your Eyes: Long writing sessions can take a toll on your eyes. Dark Mode G Documents reduces eye strain by providing a gentle, dark background that is easy on your vision, making your writing experience more comfortable.\n\n4. Improved Focus: The dark theme helps eliminate distractions and keeps your attention where it belongs – on your writing. No more unnecessary glare or bright screens to pull your focus away.\n\n5. Energy Efficiency: Using Dark Mode Google documents not only benefits your eyes but also conserves energy, prolonging the life of your device and saving on electricity costs.\n \n🖥️ Compatibility and Accessibility: Dark Mode G Docs is compatible with all major web browsers and is readily available on PCs and desktops. Now, you can enjoy Google Docs dark mode on your preferred platform.\n\n🌚 How to Activate Black Mode Google, Activating Dim Mode Google Docs is a breeze. Simply download the extension from the Chrome Web Store and click on the Dark Mode Google Docs icon in your browser. Your Google Documents page will instantly switch to the soothing dark theme, enhancing your writing experience.\n\n📜 Why You Need this Extension?\n\nGoogle Docs Dark Mode: Dark Mode G Docs is the definitive solution to bring dark mode to your Google Doc, ensuring that your eyes remain comfortable during your writing sessions.\nEnhanced Productivity: With the distraction-free environment that the black theme provides, you'll find yourself more focused, efficient, and productive in your writing tasks.\n\nEye Protection: Prolonged exposure to a bright screen can be harmful to your eyes. Dark Mode Google Documents safeguards your eyes by reducing the intensity of light emitted from your device.\n\nCustomization Options: Tailor Black Mode Google Doc to your liking. Adjust the dark mode settings, fonts, and backgrounds to suit your individual preferences.\n\nCross-Browser Compatibility: Whether you prefer Chrome, Firefox, or another browser, Dim Mode Google Docs is compatible across the board, so you can enjoy mode experience no matter your choice of browser.\n \n📚 FAQs:\n \n1. How do I put Google Docs in moonless mode with this extension? To activate Dark Mode Google Docs, simply download the extension from the Chrome Web Store, and then click on the Google documents dark mode icon in your browser.\n2. Is Dark Mode G Docs available for desktop? Absolutely! Dark Mode Google Docs is available for both PCs and desktops, ensuring that you can enjoy a comfortable writing environment on your preferred platform.\n3. Can I customize the appearance of Dark Mode Google Docs? Yes, you can! Dark Mode Google Docs offers various customization options, allowing you to tailor the extension to your personal preferences.\n4. Does Google Docs have a native dark mode? Unfortunately, Google Docs does not offer a native dark mode." + }, + "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/_locales/es/messages.json b/_locales/es/messages.json new file mode 100644 index 0000000..bfc0299 --- /dev/null +++ b/_locales/es/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Aumenta la eficiencia con nuestra extensión para Google Docs en modo oscuro. Experimenta el modo oscuro de Google Docs para mejorar tu escritura." + }, + "appName": { + "message": "Modo oscuro Google Docs" + }, + "storeDesc": { + "message": "🌟 ¿Por qué elegir Google Docs en modo oscuro frente a la competencia?\n\nCon numerosas extensiones de Chrome que ofrecen la funcionalidad de modo oscuro, es posible que te preguntes qué hace que G Docs Modo Oscuro sea tu mejor opción. Exploremos por qué destaca Google Docs en modo oscuro:\n\n1. Interfaz fácil de usar: Google Docs en modo oscuro ofrece una interfaz intuitiva que facilita la navegación. Encontrar la configuración y las opciones de personalización es pan comido.\n2. 2. Velocidad y eficacia: Nuestra extensión está optimizada para el rendimiento, lo que garantiza que no ralentizará tu navegador ni Google Docs, ofreciendo un tema oscuro sin comprometer la velocidad.\n3. Actualizaciones periódicas: g docs black mode se actualiza continuamente para seguir el ritmo de los cambios de Google Docs, lo que garantiza que tu experiencia en modo oscuro siga siendo actual y funcional.\n4. Asistencia receptiva: Si te encuentras con problemas o tienes preguntas, nuestro equipo de soporte está listo para ayudar con prontitud, comprometido a garantizar una experiencia sin problemas.\n5. Amplia base de usuarios: google doc dire mode cuenta con una próspera comunidad de usuarios con críticas positivas que dan fe de su calidad y fiabilidad. Únete a las filas de usuarios satisfechos que han transformado su experiencia con Google Docs.\n \n🎨 Personalización para adaptarse a tu estilo\n\nLa personalización de tu entorno de escritura es una de las principales ventajas del modo oscuro de Google Docs. Personalízalo a tu gusto:\n \nNivel de oscuridad: Ajusta el nivel de oscuridad según tus preferencias, desde una suave atenuación hasta una oscuridad envolvente.\nPersonalización de la fuente: Elige el estilo, tamaño y color de fuente que mejor se adapte a tu estilo de escritura.\nOpciones de fondo: Personaliza el fondo con un color o textura que complemente tu estética.\nColores de acento: Seleccione colores de acento para resaltar elementos específicos del documento.\n \nCompatibilidad entre navegadores\n\nTanto si usas Chrome, Firefox u otro navegador, G Docs en modo negro está diseñado para ser compatible con todos los navegadores. Disfruta de un tema oscuro cómodo y productivo independientemente del navegador web que elijas.\n\nAumenta tu productividad\n\nEl modo oscuro de Google Docs no es solo una cuestión de estética; se trata de impulsar la productividad y mejorar tu experiencia de escritura:\n \nEnfoque y concentración: El tema Dire minimiza las distracciones, lo que te permite concentrarte en tu trabajo sin interrupciones.\nMenor fatiga visual: Sus ojos le agradecerán el brillo reducido, lo que hace que las largas sesiones de escritura sean más cómodas y menos fatigosas.\nEficiencia energética: Al utilizar el modo oscuro de G Docs, proteges tus ojos y ayudas a conservar energía, reduciendo tu huella de carbono.\n \n🌚 En conclusión\n\nDark Mode Google Docs es la extensión de Chrome definitiva para cualquiera que busque una experiencia de escritura cómoda, personalizable y eficiente. Actívalo con un solo clic, personalízalo según tus preferencias y disfruta de un entorno sin distracciones y agradable a la vista. Únete a la satisfecha comunidad de usuarios que han hecho del modo oscuro de G Doc su elección para disfrutar de una experiencia superior en Google Docs.\n\n🌙 Modo oscuro de Google Docs: ¡mejora tu experiencia de escritura!\n\nTe cansa el brillo cegador de tu pantalla mientras trabajas en Google Docs? Anhelas un entorno de escritura más cómodo y visualmente agradable? No busques más, porque el modo oscuro de Google Docs está aquí para transformar tu experiencia de escritura.\n\nEl modo oscuro de Google Docs es la extensión de Chrome definitiva para aquellos que prefieren un aspecto más oscuro y agradable a la vista al crear, editar o leer documentos. Con esta extensión, puedes cambiar sin problemas la interfaz de Google Docs a un tema oscuro elegante y relajante, haciendo que tus sesiones de escritura sean más agradables que nunca. Despídete del brillo intenso y da la bienvenida a la productividad con estilo.\n\nCaracterísticas principales del modo oscuro de Google Docs\n\n1. Activación sin esfuerzo: El modo oscuro de Google Docs es increíblemente fácil de usar. Con un solo clic, puedes activar el tema oscuro para tu Google Docs, creando un entorno de escritura más cómodo y centrado.\n\n2. 2. Opciones de personalización: Entendemos que una talla no sirve para todos. Por eso ofrecemos varias opciones de personalización, que te permiten ajustar la extensión a tus preferencias personales. Ajuste el nivel de oscuridad, la fuente y el fondo a su gusto.\n\n3. Salva tus ojos: Las largas sesiones de escritura pueden pasar factura a tus ojos. El Modo Oscuro de Documentos G reduce la fatiga ocular proporcionando un fondo suave y oscuro que no daña la vista, haciendo que tu experiencia de escritura sea más cómoda.\n\n4. 4. Mayor concentración: El tema oscuro ayuda a eliminar distracciones y mantiene tu atención donde debe estar: en tu escritura. Se acabaron los reflejos innecesarios y las pantallas brillantes que distraen tu atención.\n\n5. Eficiencia energética: El uso del modo oscuro de los documentos de Google no sólo beneficia a tus ojos, sino que también ahorra energía, prolongando la vida útil de tu dispositivo y ahorrando en costes de electricidad.\n \n🖥️ Compatibilidad y accesibilidad: El Modo Oscuro de G Docs es compatible con los principales navegadores web y está disponible en PC y equipos de sobremesa. Ahora, puedes disfrutar del modo oscuro de Google Docs en tu plataforma preferida.\n\n🌚 Cómo activar el modo oscuro de Google, Activar el modo oscuro de Google Docs es muy sencillo. Solo tienes que descargar la extensión de la Chrome Web Store y hacer clic en el icono del modo oscuro de Google Docs en tu navegador. Tu página de Documentos de Google cambiará instantáneamente al relajante tema oscuro, mejorando tu experiencia de escritura.\n\n¿Por qué necesitas esta extensión?\n\nModo oscuro de Google Docs: Dark Mode G Docs es la solución definitiva para llevar el modo oscuro a tu Google Doc, asegurando que tus ojos permanezcan cómodos durante tus sesiones de escritura.\nProductividad mejorada: Con el entorno libre de distracciones que proporciona el tema negro, te encontrarás más concentrado, eficiente y productivo en tus tareas de escritura.\n\nProtección ocular: La exposición prolongada a una pantalla brillante puede ser perjudicial para tus ojos. El modo oscuro de Documentos de Google protege tus ojos reduciendo la intensidad de la luz que emite tu dispositivo.\n\nOpciones de personalización: Adapta Documentos de Google en modo oscuro a tu gusto. Ajusta la configuración del modo oscuro, las fuentes y los fondos para adaptarlos a tus preferencias individuales.\n\nCompatibilidad entre navegadores: Tanto si prefieres Chrome, Firefox u otro navegador, Google Docs en modo oscuro es compatible con todos ellos, por lo que podrás disfrutar de la experiencia del modo sin importar el navegador que elijas.\n \n📚 Preguntas frecuentes:\n \n1. ¿Cómo pongo Google Docs en modo sin luna con esta extensión? Para activar el modo oscuro de Google Docs, solo tienes que descargar la extensión desde Chrome Web Store y, a continuación, hacer clic en el icono del modo oscuro de Google Docs en el navegador.\n2. ¿Está disponible el modo oscuro de Google Docs para escritorio? Por supuesto. El modo oscuro de Google Docs está disponible tanto para PC como para equipos de sobremesa, lo que garantiza que puedas disfrutar de un entorno de escritura cómodo en la plataforma que prefieras.\n3. ¿Puedo personalizar la apariencia de Google Docs en modo oscuro? Sí, puedes hacerlo. Google Docs en modo oscuro ofrece varias opciones de personalización, lo que te permite adaptar la extensión a tus preferencias personales.\n4. ¿Dispone Google Docs de un modo oscuro nativo? Lamentablemente, Google Docs no ofrece un modo oscuro nativo." + } +} diff --git a/_locales/es_419/messages.json b/_locales/es_419/messages.json new file mode 100644 index 0000000..6410118 --- /dev/null +++ b/_locales/es_419/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Aumenta la eficiencia con nuestra extensión para Google Docs en modo oscuro. Experimenta el modo oscuro de Google Docs para mejorar tu escritura." + }, + "appName": { + "message": "Modo oscuro Google Docs" + }, + "storeDesc": { + "message": "🌟 ¿Por qué elegir Google Docs en modo oscuro frente a la competencia?\n\nCon numerosas extensiones de Chrome que ofrecen la funcionalidad de modo oscuro, es posible que te preguntes qué hace que G Docs Modo Oscuro sea tu mejor opción. Exploremos por qué destaca Google Docs en modo oscuro:\n\n1. Interfaz fácil de usar: Google Docs en modo oscuro ofrece una interfaz intuitiva que facilita la navegación. Encontrar la configuración y las opciones de personalización es pan comido.\n2. 2. Velocidad y eficacia: Nuestra extensión está optimizada para el rendimiento, lo que garantiza que no ralentizará tu navegador ni Google Docs, ofreciendo un tema oscuro sin comprometer la velocidad.\n3. Actualizaciones periódicas: g docs black mode se actualiza continuamente para seguir el ritmo de los cambios de Google Docs, lo que garantiza que tu experiencia en modo oscuro siga siendo actual y funcional.\n4. Asistencia receptiva: Si te encuentras con problemas o tienes preguntas, nuestro equipo de soporte está listo para ayudar con prontitud, comprometido a garantizar una experiencia sin problemas.\n5. Amplia base de usuarios: google doc dire mode cuenta con una próspera comunidad de usuarios con críticas positivas que dan fe de su calidad y fiabilidad. Únete a las filas de usuarios satisfechos que han transformado su experiencia con Google Docs.\n \n🎨 Personalización para adaptarse a tu estilo\n\nLa personalización de tu entorno de escritura es una de las principales ventajas del modo oscuro de Google Docs. Personalízalo a tu gusto:\n \nNivel de oscuridad: Ajusta el nivel de oscuridad según tus preferencias, desde una suave atenuación hasta una oscuridad envolvente.\nPersonalización de la fuente: Elige el estilo, tamaño y color de fuente que mejor se adapte a tu estilo de escritura.\nOpciones de fondo: Personaliza el fondo con un color o textura que complemente tu estética.\nColores de acento: Seleccione colores de acento para resaltar elementos específicos del documento.\n \nCompatibilidad entre navegadores\n\nTanto si usas Chrome, Firefox u otro navegador, G Docs en modo negro está diseñado para ser compatible con todos los navegadores. Disfruta de un tema oscuro cómodo y productivo independientemente del navegador web que elijas.\n\nAumenta tu productividad\n\nEl modo oscuro de Google Docs no es solo una cuestión de estética; se trata de impulsar la productividad y mejorar tu experiencia de escritura:\n \nEnfoque y concentración: El tema Dire minimiza las distracciones, lo que te permite concentrarte en tu trabajo sin interrupciones.\nMenor fatiga visual: Sus ojos le agradecerán el brillo reducido, lo que hace que las largas sesiones de escritura sean más cómodas y menos fatigosas.\nEficiencia energética: Al utilizar el modo oscuro de G Docs, proteges tus ojos y ayudas a conservar energía, reduciendo tu huella de carbono.\n \n🌚 En conclusión\n\nDark Mode Google Docs es la extensión de Chrome definitiva para cualquiera que busque una experiencia de escritura cómoda, personalizable y eficiente. Actívalo con un solo clic, personalízalo según tus preferencias y disfruta de un entorno sin distracciones y agradable a la vista. Únete a la satisfecha comunidad de usuarios que han hecho del modo oscuro de G Doc su elección para disfrutar de una experiencia superior en Google Docs.\n\n🌙 Modo oscuro de Google Docs: ¡mejora tu experiencia de escritura!\n\nTe cansa el brillo cegador de tu pantalla mientras trabajas en Google Docs? Anhelas un entorno de escritura más cómodo y visualmente agradable? No busques más, porque el modo oscuro de Google Docs está aquí para transformar tu experiencia de escritura.\n\nEl modo oscuro de Google Docs es la extensión de Chrome definitiva para quienes prefieren un aspecto más oscuro y agradable a la vista al crear, editar o leer documentos. Con esta extensión, puedes cambiar sin problemas la interfaz de Google Docs a un tema oscuro elegante y relajante, haciendo que tus sesiones de escritura sean más agradables que nunca. Despídete del brillo intenso y da la bienvenida a la productividad con estilo.\n\nCaracterísticas principales del modo oscuro de Google Docs\n\n1. Activación sin esfuerzo: El modo oscuro de Google Docs es increíblemente fácil de usar. Con un solo clic, puedes activar el tema oscuro para tu Google Docs, creando un entorno de escritura más cómodo y centrado.\n\n2. 2. Opciones de personalización: Entendemos que una talla no sirve para todos. Por eso ofrecemos varias opciones de personalización, que te permiten ajustar la extensión a tus preferencias personales. Ajuste el nivel de oscuridad, la fuente y el fondo a su gusto.\n\n3. Salva tus ojos: Las largas sesiones de escritura pueden pasar factura a tus ojos. El Modo Oscuro de Documentos G reduce la fatiga ocular proporcionando un fondo suave y oscuro que no daña la vista, haciendo que tu experiencia de escritura sea más cómoda.\n\n4. 4. Mayor concentración: El tema oscuro ayuda a eliminar distracciones y mantiene tu atención donde debe estar: en tu escritura. Se acabaron los reflejos innecesarios y las pantallas brillantes que distraen tu atención.\n\n5. Eficiencia energética: El uso del modo oscuro de los documentos de Google no sólo beneficia a tus ojos, sino que también ahorra energía, prolongando la vida útil de tu dispositivo y ahorrando en costes de electricidad.\n \n🖥️ Compatibilidad y accesibilidad: El Modo Oscuro de G Docs es compatible con los principales navegadores web y está disponible en PC y equipos de sobremesa. Ahora, puedes disfrutar del modo oscuro de Google Docs en tu plataforma preferida.\n\n🌚 Cómo activar el modo oscuro de Google, Activar el modo oscuro de Google Docs es muy sencillo. Solo tienes que descargar la extensión de la Chrome Web Store y hacer clic en el icono del modo oscuro de Google Docs en tu navegador. Tu página de Documentos de Google cambiará instantáneamente al relajante tema oscuro, mejorando tu experiencia de escritura.\n\n¿Por qué necesitas esta extensión?\n\nModo oscuro de Google Docs: Dark Mode G Docs es la solución definitiva para llevar el modo oscuro a tu Google Doc, asegurando que tus ojos permanezcan cómodos durante tus sesiones de escritura.\nProductividad mejorada: Con el entorno libre de distracciones que proporciona el tema negro, te encontrarás más concentrado, eficiente y productivo en tus tareas de escritura.\n\nProtección ocular: La exposición prolongada a una pantalla brillante puede ser perjudicial para tus ojos. El modo oscuro de Documentos de Google protege tus ojos reduciendo la intensidad de la luz que emite tu dispositivo.\n\nOpciones de personalización: Adapta Documentos de Google en modo oscuro a tu gusto. Ajusta la configuración del modo oscuro, las fuentes y los fondos para adaptarlos a tus preferencias individuales.\n\nCompatibilidad entre navegadores: Tanto si prefieres Chrome, Firefox u otro navegador, Google Docs en modo oscuro es compatible con todos ellos, por lo que podrás disfrutar de la experiencia del modo sin importar el navegador que elijas.\n \n📚 Preguntas frecuentes:\n \n1. ¿Cómo pongo Google Docs en modo sin luna con esta extensión? Para activar el modo oscuro de Google Docs, solo tienes que descargar la extensión desde Chrome Web Store y, a continuación, hacer clic en el icono del modo oscuro de Google Docs en el navegador.\n2. ¿Está disponible el modo oscuro de Google Docs para escritorio? Por supuesto. El modo oscuro de Google Docs está disponible tanto para PC como para ordenadores de sobremesa, lo que garantiza que puedas disfrutar de un entorno de escritura cómodo en la plataforma que prefieras.\n3. ¿Puedo personalizar la apariencia de Google Docs en modo oscuro? Sí, puedes hacerlo. Google Docs en modo oscuro ofrece varias opciones de personalización, lo que te permite adaptar la extensión a tus preferencias personales.\n4. ¿Dispone Google Docs de un modo oscuro nativo? Lamentablemente, Google Docs no ofrece un modo oscuro nativo." + } +} diff --git a/_locales/et/messages.json b/_locales/et/messages.json new file mode 100644 index 0000000..2932349 --- /dev/null +++ b/_locales/et/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Suurendage tõhusust meie pimedas režiimis Google Docs laienduse abil. Kasutage sujuvat Google Docs'i tumedat režiimi täiustatud kirjutamiseks." + }, + "appName": { + "message": "Tume režiim Google Docs" + }, + "storeDesc": { + "message": "🌟 Miks valida tumedas režiimis Google Docs konkurentide asemel?\n\nKuna paljud Chrome'i laiendused pakuvad tumedas režiimis funktsionaalsust, siis võib-olla mõtled, mis teeb Dark Mode G Docs'i sinu parimaks valikuks. Uurime, miks Dark Mode Google Docs paistab silma:\n\n1. Kasutajasõbralik kasutajaliides: Dark Mode Google Docs pakub intuitiivset kasutajaliidest lihtsaks navigeerimiseks. Seadete ja kohandamisvõimaluste leidmine on imelihtne.\n2. Kiirus ja tõhusus: Meie laiendus on optimeeritud jõudluse jaoks, tagades, et see ei aeglustaks teie brauserit ega Google Docs'i, pakkudes tumedat teemat ilma kiirust kahjustamata.\n3. Regulaarsed uuendused: g docs black mode uuendatakse pidevalt, et pidada sammu Google Docs'i muudatustega, tagades, et teie tumedate režiimide kogemus jääb ajakohaseks ja funktsionaalseks.\n4. Reageeriv tugi: Kui teil tekib probleeme või küsimusi, on meie tugimeeskond valmis viivitamatult abistama, pühendunult tagades sujuva kasutuskogemuse.\n5. Lai kasutajaskond: Google Doci tumedas režiimis on edukas kasutajaskond, kelle positiivsed arvustused kinnitavad selle kvaliteeti ja usaldusväärsust. Liituda rahulolevate kasutajate hulka, kes on oma Google Docs'i kogemust muutnud.\n \n🎨 Kohandamine vastavalt teie stiilile\n\nOma kirjutamiskeskkonna isikupärastamine on Dark Mode Google Docs'i peamine eelis. Kohandage oma südame järgi:\n \nPimeduse tase: Reguleerige pimeduse taset vastavalt oma eelistustele, alates õrnast hämarusest kuni süveneva pimeduseni.\nKirjastiili kohandamine: Valige kirjastiil, suurus ja värv, mis sobib teie kirjutamisstiiliga.\nTaustavalikud: Kohandage tausta värv või tekstuur, mis sobib teie esteetikaga.\nRõhuvärvid: Valige aktsendivärvid, et rõhutada konkreetseid dokumendielemente.\n \n🌐 Ühilduvus brauserite vahel\n\nKas te kasutate Chrome'i, Firefoxi või mõnda muud brauserit, Black Mode G Docs on loodud brauserite vaheliseks ühilduvuseks. Nautige mugavat ja produktiivset tumedat teemat sõltumata teie veebilehitseja valikust.\n\n🚀 Suurendage oma tootlikkust\n\nTume režiim Google Docs ei ole ainult esteetiline; see on tootlikkuse suurendamine ja teie kirjutamiskogemuse parandamine:\n \nKeskendumine ja keskendumine: Hämarateema minimeerib segavaid asjaolusid, võimaldades teil keskenduda oma tööle ilma katkestusteta.\nVähendatud silmade koormus: Teie silmad tänavad teid vähendatud heleduse eest, mis muudab pikad kirjutamissessioonid mugavamaks ja vähem väsitavaks.\nEnergiatõhusus: Kasutades Dark Mode G Docs'i, säästate oma silmi ja aitate säästa energiat, vähendades oma süsinikujalajälge.\n \n🌚 Kokkuvõttes\n\nDark Mode Google Docs on parim Chrome'i laiendus kõigile, kes otsivad mugavat, kohandatavat ja tõhusat kirjutamiskogemust. Aktiveerige see ühe klõpsuga, kohandage see oma eelistuste järgi ja nautige häireteta keskkonda, mis säästab teie silmi. Liituge rahulolevate kasutajate kogukonnaga, kes on teinud Dark Mode G Doci oma valikuks, et Google Docs'i kasutuskogemus oleks parem.\n\n🌙 Google Docs tumedas režiimis - täiustage oma kirjutamiskogemust!\n\nKas sinu jaoks on Google Docsiga töötades ekraani pimestav pimestus tüütu? Kas igatsed mugavamat ja visuaalselt meeldivamat kirjutamiskeskkonda? Ärge otsige edasi, sest Google Docs tumedas režiimis on siin, et muuta teie kirjutamiskogemust.\n\nGoogle Docs tumedas režiimis on parim Chrome'i laiendus neile, kes eelistavad dokumentide loomisel, redigeerimisel või lugemisel tumedamat ja silmasõbralikumat väljanägemist. Selle laiendusega saate oma Google Docs'i kasutajaliidese sujuvalt ümber lülitada elegantsele ja rahustavale tumedale teemale, muutes oma kirjutamissessioonid nauditavamaks kui kunagi varem. Hüvasti karmi heledusega ja tere tulemuslikkusele stiilselt.\n\n🌟 Google Docs'i tumedas režiimis põhifunktsioonid\n\n1. Kerge aktiveerimine: Tume režiim Google Docs on uskumatult lihtne kasutada. Ainult ühe klõpsuga saate aktiveerida oma Google Doci tumedateemalise teema, luues mugavama ja keskendunuma kirjutamiskeskkonna.\n\n2. Kohandamisvõimalused: Me mõistame, et üks suurus ei sobi kõigile. Seepärast pakume erinevaid kohandamisvõimalusi, mis võimaldavad teil laiendust oma isiklike eelistuste järgi kohandada. Reguleerige tumedusastet, kirjatüüpi ja tausta vastavalt oma soovile.\n\n3. Säästab teie silmi: Pikad kirjutamissessioonid võivad teie silmi kurnata. Tume režiim G Documents vähendab silmade koormust, pakkudes õrna, tumedat tausta, mis on teie nägemist säästev, muutes teie kirjutamise kogemuse mugavamaks.\n\n4. Parem fookus: Tume teema aitab kõrvaldada segavaid asjaolusid ja hoiab teie tähelepanu seal, kuhu see kuulub - kirjutamisel. Enam ei ole tarbetut pimestamist ega heledat ekraani, mis teie tähelepanu kõrvale tõmbaks.\n\n5. Energiatõhusus: Google'i tumedas režiimis dokumentide kasutamine ei ole mitte ainult kasulik teie silmadele, vaid säästab ka energiat, pikendades teie seadme eluiga ja säästes elektrikulusid.\n \n🖥️ Ühilduvus ja juurdepääsetavus: Tume režiim G Docs ühildub kõigi peamiste veebibrauseritega ning on hõlpsasti kättesaadav arvutites ja lauaarvutites. Nüüd saate nautida Google Docsi tumedat režiimi oma eelistatud platvormil.\n\n🌚 Kuidas aktiveerida must režiim Google, Tume režiimi aktiveerimine Google Docs on imelihtne. Lihtsalt lae laiendus Chrome'i veebipoest alla ja klõpsa brauseris Google Docs'i tumedas režiimis ikoonile. Teie Google'i dokumentide lehekülg lülitub koheselt rahustavale tumedale teemale, mis parandab teie kirjutamiskogemust.\n\n📜 Miks sa seda laiendust vajad?\n\nGoogle Docs Dark Mode: Tume režiim G Docs on lõplik lahendus, mis toob sinu Google Docsi tumedasse režiimi, tagades, et su silmad jäävad kirjutamise ajal mugavaks.\nTõhustatud tootlikkus: Tänu musta teema poolt pakutavale häireteta keskkonnale leiate end oma kirjutamisülesannete täitmisel keskendunumalt, tõhusamalt ja produktiivsemalt.\n\nSilmade kaitse: Pikaajaline kokkupuude heleda ekraaniga võib olla silmadele kahjulik. Tume režiim Google Documents kaitseb teie silmi, vähendades seadme poolt kiiratava valguse intensiivsust.\n\nKohandamisvõimalused: Kohandage Mustas režiimis Google Doc oma maitse järgi. Kohandage tumedas režiimis seaded, kirjatüübid ja taustad vastavalt oma individuaalsetele eelistustele.\n\nBrauseriteülene ühilduvus: Olenemata sellest, kas eelistate Chrome'i, Firefoxi või mõnda muud brauserit, on Tume režiim Google Docs ühilduv kõikides brauserites, nii et saate nautida režiimikogemust sõltumata teie valitud brauserist.\n \n📚 KKK:\n \n1. Kuidas panna Google Docs selle laiendusega kuuvalgusrežiimi? Google Docs'i tumedas režiimis aktiveerimiseks laadige lihtsalt laiendus Chrome'i veebipoest alla ja seejärel klõpsake brauseris Google'i dokumentide tumedas režiimis ikoonil.\n2. Kas pimedas režiimis G Docs on saadaval töölauale? Absoluutselt! Dark Mode Google Docs on saadaval nii arvutitele kui ka lauaarvutitele, tagades, et saate nautida mugavat kirjutamiskeskkonda oma eelistatud platvormil.\n3. Kas ma saan kohandada Dark Mode Google Docs'i välimust? Jah, saate! Dark Mode Google Docs pakub erinevaid kohandamisvõimalusi, mis võimaldavad teil kohandada laiendust vastavalt oma isiklikele eelistustele.\n4. Kas Google Docsil on omaette tume režiim? Kahjuks ei paku Google Docs emakeelset tumedat režiimi." + } +} diff --git a/_locales/fa/messages.json b/_locales/fa/messages.json new file mode 100644 index 0000000..1c9d8aa --- /dev/null +++ b/_locales/fa/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "با برنامه افزودنی Google Docs حالت تاریک، کارایی را افزایش دهید. حالت تاریک یکپارچه Google Docs را برای نوشتن پیشرفته تجربه کنید." + }, + "appName": { + "message": "حالت تاریک Google Docs" + }, + "storeDesc": { + "message": "🌟 چرا حالت تاریک Google Docs را به جای رقبا انتخاب کنیم؟\n\nبا تعداد زیادی افزونه کروم که عملکرد حالت تاریک را ارائه می دهند، ممکن است تعجب کنید که چه چیزی Dark Mode G Docs را بهترین انتخاب شما می کند. بیایید بررسی کنیم که چرا حالت تاریک Google Docs متمایز است:\n\n1. رابط کاربر پسند: حالت تاریک Google Docs یک رابط بصری برای ناوبری آسان فراهم می کند. یافتن تنظیمات و گزینه‌های سفارشی‌سازی کار سختی است.\n2. سرعت و کارایی: برنامه افزودنی ما برای عملکرد بهینه شده است، و مطمئن می شود که سرعت مرورگر یا Google Docs شما را کاهش نمی دهد و یک تم تیره را بدون کاهش سرعت ارائه می دهد.\n3. به‌روزرسانی‌های منظم: حالت سیاه اسناد g به‌طور مداوم به‌روزرسانی می‌شود تا با تغییرات Google Docs همگام شود، و تضمین می‌کند که تجربه حالت تاریک شما جاری و کاربردی است.\n4. پشتیبانی پاسخگو: اگر با مشکلاتی مواجه شدید یا سؤالی دارید، تیم پشتیبانی ما آماده است تا به سرعت کمک کند و متعهد به اطمینان از تجربه ای روان است.\n5. پایگاه کاربر گسترده: حالت google doc dire دارای یک جامعه کاربری پررونق با نظرات مثبت است که کیفیت و قابلیت اطمینان آن را تأیید می کند. به جمع کاربران راضی که تجربه Google Docs خود را تغییر داده اند بپیوندید.\n \n🎨 سفارشی سازی متناسب با سبک شما\n\nشخصی‌سازی محیط نوشتن یکی از مزیت‌های اصلی Google Docs در حالت تاریک است. به دلخواه خود سفارشی کنید:\n \nسطح تاریکی: سطح تاریکی را برای مطابقت با ترجیح خود تنظیم کنید، از تاریکی ملایم تا تاریکی غوطه ور.\nسفارشی سازی فونت: سبک، اندازه و رنگ فونت را متناسب با سبک نوشتاری خود انتخاب کنید.\nگزینه‌های پس‌زمینه: پس‌زمینه را با رنگ یا بافتی تنظیم کنید که زیبایی‌شناسی شما را تکمیل کند.\nرنگ های تاکیدی: رنگ های تاکیدی را برای برجسته کردن عناصر سند خاص انتخاب کنید.\n \n🌐 سازگاری در بین مرورگرها\n\nچه از کروم، فایرفاکس یا مرورگر دیگری استفاده کنید، Black Mode G Docs برای سازگاری بین مرورگرها طراحی شده است. بدون توجه به انتخاب مرورگر وب خود، از یک تم تیره راحت و سازنده لذت ببرید.\n\n🚀 بهره وری خود را افزایش دهید\n\nحالت تاریک Google Docs فقط در مورد زیبایی شناسی نیست. این در مورد افزایش بهره وری و افزایش تجربه نوشتن شما است:\n \nتمرکز و تمرکز: موضوع Dire حواس پرتی را به حداقل می رساند و به شما امکان می دهد بدون وقفه روی کار خود تمرکز کنید.\nکاهش فشار چشم: چشمان شما به خاطر کاهش روشنایی از شما تشکر می کنند و باعث می شود جلسات طولانی نوشتن راحت تر و کمتر خسته شوند.\nبهره وری انرژی: با استفاده از حالت تاریک G Docs، چشمان خود را ذخیره می کنید و به صرفه جویی در انرژی کمک می کنید و ردپای کربن خود را کاهش می دهید.\n \n🌚 در نتیجه\n\nحالت تاریک Google Docs افزونه نهایی Chrome برای هر کسی است که به دنبال تجربه نوشتن راحت، قابل تنظیم و کارآمد است. آن را با یک کلیک فعال کنید، آن را مطابق با ترجیحات خود سفارشی کنید و از محیطی بدون حواس پرتی لذت ببرید که برای چشمان شما آسان است. به جامعه راضی کاربرانی بپیوندید که Dark Mode G Doc را برای تجربه ای برتر از Google Doc انتخاب کرده اند.\n\n🌙 حالت تاریک Google Docs - تجربه نوشتن خود را افزایش دهید!\n\nآیا تابش خیره کننده صفحه نمایش خود را هنگام کار بر روی Google Docs خسته کننده می دانید؟ آیا شما مشتاق یک محیط نوشتاری راحت تر و از نظر بصری دلپذیر هستید؟ دیگر به دنبال آن نباشید زیرا حالت تاریک Google Docs اینجاست تا تجربه نوشتن شما را تغییر دهد.\n\nحالت تاریک Google Docs افزونه نهایی کروم برای کسانی است که هنگام ایجاد، ویرایش یا خواندن اسناد، ظاهری تیره‌تر و چشم‌پسندتر را ترجیح می‌دهند. با استفاده از این برنامه افزودنی، می‌توانید رابط Google Docs خود را به صورت یکپارچه به یک تم تیره براق و آرامش‌بخش تغییر دهید و جلسات نوشتن خود را لذت‌بخش‌تر از همیشه کنید. با روشنایی خشن خداحافظی کنید و به بهره وری در سبک سلام کنید.\n\n🌟 ویژگی های کلیدی حالت تاریک Google Docs\n\n1. فعال سازی بدون دردسر: استفاده از Google Docs در حالت تاریک بسیار آسان است. تنها با یک کلیک، می‌توانید تم تیره را برای Google Doc خود فعال کنید و محیط نوشتاری راحت‌تر و متمرکزتری ایجاد کنید.\n\n2. گزینه های سفارشی سازی: ما درک می کنیم که یک اندازه برای همه مناسب نیست. به همین دلیل است که ما گزینه‌های سفارشی‌سازی مختلفی را ارائه می‌دهیم که به شما امکان می‌دهد برنامه افزودنی را برای مطابقت با ترجیحات شخصی خود تغییر دهید. سطح تاریکی، فونت و پس زمینه را به دلخواه تنظیم کنید.\n\n3. چشمان شما را نجات می دهد: جلسات طولانی نوشتن می تواند به چشمان شما آسیب برساند. حالت تاریک G Documents با ارائه پس‌زمینه‌ای ملایم و تیره که برای دید شما آسان‌تر است، فشار چشم را کاهش می‌دهد و تجربه نوشتن شما را راحت‌تر می‌کند.\n\n4. تمرکز بهبود یافته: تم تیره به حذف حواس‌پرتی کمک می‌کند و توجه شما را در جایی که به آن تعلق دارد - روی نوشته‌هایتان - حفظ می‌کند. دیگر نیازی به تابش خیره کننده یا صفحه نمایش روشن نیست که تمرکز شما را از بین ببرد.\n\n5. بهره وری انرژی: استفاده از اسناد Google حالت تاریک نه تنها برای چشمان شما مفید است، بلکه باعث صرفه جویی در انرژی، افزایش عمر دستگاه شما و صرفه جویی در هزینه های برق می شود.\n \n🖥️ سازگاری و دسترسی: حالت تاریک G Docs با تمام مرورگرهای وب اصلی سازگار است و به راحتی در رایانه های شخصی و دسکتاپ در دسترس است. اکنون، می‌توانید از حالت تاریک Google Docs در پلتفرم دلخواه خود لذت ببرید.\n\n🌚 نحوه فعال کردن حالت سیاه گوگل، فعال کردن حالت کم نور Google Docs بسیار سریع است. به سادگی برنامه افزودنی را از فروشگاه وب کروم دانلود کنید و روی نماد Google Docs حالت تاریک در مرورگر خود کلیک کنید. صفحه اسناد Google شما فوراً به تم تیره آرامش‌بخش تغییر می‌کند و تجربه نوشتن شما را افزایش می‌دهد.\n\n📜 چرا به این افزونه نیاز دارید؟\n\nGoogle Docs Dark Mode: حالت تاریک G Docs راه حل قطعی برای آوردن حالت تاریک به Google Doc شما است و اطمینان حاصل می کند که چشمان شما در طول جلسات نوشتن راحت می مانند.\nبهره وری پیشرفته: با محیط بدون حواس پرتی که تم مشکی فراهم می کند، در کارهای نوشتاری خود متمرکزتر، کارآمدتر و سازنده تر خواهید بود.\n\nمحافظت از چشم: قرار گرفتن طولانی مدت در معرض یک صفحه نمایش روشن می تواند برای چشم شما مضر باشد. حالت تاریک Google Documents با کاهش شدت نور ساطع شده از دستگاه شما از چشمان شما محافظت می کند.\n\nگزینه‌های سفارشی‌سازی: حالت سیاه Google Doc را مطابق میل خود تنظیم کنید. تنظیمات حالت تاریک، فونت‌ها و پس‌زمینه‌ها را مطابق با ترجیحات فردی خود تنظیم کنید.\n\nسازگاری بین مرورگرها: چه کروم، فایرفاکس یا مرورگر دیگری را ترجیح دهید، Dom Mode Google Docs در همه جا سازگار است، بنابراین می توانید بدون توجه به انتخاب مرورگر خود از تجربه حالت لذت ببرید.\n \n📚 سوالات متداول:\n \n1. چگونه Google Docs را با این افزونه در حالت بدون ماه قرار دهم؟ برای فعال کردن حالت تاریک Google Docs، کافی است افزونه را از فروشگاه وب کروم دانلود کنید و سپس روی نماد حالت تاریک اسناد Google در مرورگر خود کلیک کنید.\n2. آیا Dark Mode G Docs برای دسکتاپ موجود است؟ کاملا! حالت تاریک Google Docs هم برای رایانه‌های شخصی و هم برای رایانه‌های رومیزی در دسترس است و به شما اطمینان می‌دهد که می‌توانید از یک محیط نوشتن راحت در پلتفرم دلخواه خود لذت ببرید.\n3. آیا می توانم ظاهر Dark Mode Google Docs را سفارشی کنم؟ بله، تو میتونی! حالت تاریک Google Docs گزینه‌های سفارشی‌سازی مختلفی را ارائه می‌کند که به شما امکان می‌دهد برنامه افزودنی را مطابق با ترجیحات شخصی خود تنظیم کنید.\n4. آیا Google Docs حالت تاریک بومی دارد؟ متأسفانه، Google Docs حالت تاریک بومی را ارائه نمی دهد." + } +} diff --git a/_locales/fi/messages.json b/_locales/fi/messages.json new file mode 100644 index 0000000..73616d5 --- /dev/null +++ b/_locales/fi/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Tehosta tehokkuutta pimeän tilan Google Docs -laajennuksellamme. Koe saumaton Google Docsin pimeä tila tehostettua kirjoittamista varten." + }, + "appName": { + "message": "Tumma tila Google Docs" + }, + "storeDesc": { + "message": "🌟 Miksi valita tumma tila Google Docs kilpailijoiden sijaan?\n\nLukuisat Chrome-laajennukset tarjoavat pimeän tilan toimintoja, joten saatat ihmetellä, mikä tekee Dark Mode G Docsista parhaan valintasi. Tutkitaanpa, miksi Dark Mode Google Docs erottuu edukseen:\n\n1. Käyttäjäystävällinen käyttöliittymä: Dark Mode Google Docs tarjoaa intuitiivisen käyttöliittymän helppoa navigointia varten. Asetusten ja mukautusvaihtoehtojen löytäminen on helppoa.\n2. Nopeus ja tehokkuus: Laajennuksemme on optimoitu suorituskykyä varten, mikä takaa, ettei se hidasta selainta tai Google Docsia, ja se tarjoaa tummia teemoja nopeudesta tinkimättä.\n3. Säännölliset päivitykset: g docs black mode päivittyy jatkuvasti pysyäkseen Google Docsin muutosten tahdissa ja varmistaen, että tumman tilan käyttökokemuksesi pysyy ajankohtaisena ja toimivana.\n4. Responsiivinen tuki: Jos kohtaat ongelmia tai sinulla on kysyttävää, tukitiimimme on valmis auttamaan nopeasti ja on sitoutunut varmistamaan sujuvan käyttökokemuksen.\n5. Laaja käyttäjäkunta: Google Docin dire-tilassa on kukoistava käyttäjäyhteisö, jonka positiiviset arvostelut todistavat sen laadusta ja luotettavuudesta. Liity tyytyväisten käyttäjien joukkoon, jotka ovat muuttaneet Google Docs -kokemuksensa.\n \n🎨 Mukauttaminen tyyliisi sopivaksi\n\nKirjoitusympäristösi personointi on Dark Mode Google Docsin keskeinen etu. Mukauta mielesi mukaan:\n \nPimeyden taso: Säädä pimeystasoa mieltymystesi mukaan, lempeästä hämärästä upottavaan pimeyteen.\nFontin mukauttaminen: Valitse kirjoitustyylillesi sopiva fonttityyli, -koko ja -väri.\nTaustavaihtoehdot: Räätälöi taustan väri tai tekstuuri, joka sopii esteettiseen tyyliisi.\nKorostusvärit: Valitse aksenttivärit korostamaan tiettyjä asiakirjan elementtejä.\n \n🌐 Yhteensopivuus eri selaimissa\n\nKäytitpä sitten Chromea, Firefoxia tai muuta selainta, Black Mode G Docs on suunniteltu selaintenväliseen yhteensopivuuteen. Nauti mukavasta ja tuottavasta tummasta teemasta riippumatta selainvalinnastasi.\n\n🚀 Lisää tuottavuuttasi\n\nTumma tila Google Docsissa ei ole kyse vain estetiikasta, vaan tuottavuuden lisäämisestä ja kirjoituskokemuksen parantamisesta:\n \nKeskittyminen ja keskittyminen: Dire-teema minimoi häiriötekijät, jolloin voit keskittyä työhösi ilman keskeytyksiä.\nVähentää silmien rasitusta: Silmäsi kiittävät sinua pienemmästä kirkkaudesta, mikä tekee pitkistä kirjoitussessioista miellyttävämpiä ja vähemmän väsyttäviä.\nEnergiatehokkuus: Käyttämällä Dark Mode G Docsia säästät silmiäsi ja autat säästämään energiaa, mikä pienentää hiilijalanjälkeäsi.\n \n🌚 Yhteenveto\n\nDark Mode Google Docs on ehdoton Chrome-laajennus kaikille, jotka etsivät mukavaa, muokattavaa ja tehokasta kirjoituskokemusta. Aktivoi se yhdellä napsautuksella, mukauta se mieltymystesi mukaan ja nauti häiriöttömästä ympäristöstä, joka on silmiäsi säästävä. Liity tyytyväiseen käyttäjäkuntaan, joka on tehnyt Dark Mode G Docista parhaan Google Docs -kokemuksen tarjoavan valintansa.\n\n🌙 Google docs dark mode - Paranna kirjoituskokemustasi!\n\nKoetko näytön häikäisevän häikäisyn Google Docsia käyttäessäsi rasittavaksi? Kaipaatko mukavampaa ja visuaalisesti miellyttävämpää kirjoitusympäristöä? Älä etsi kauempaa, sillä Tumma tila Google Docs on täällä muuttamassa kirjoituskokemustasi.\n\nGoogle Docsin tumma tila on täydellinen Chrome-laajennus niille, jotka haluavat tummemman ja silmäystävällisemmän ulkoasun asiakirjoja luodessaan, muokatessaan tai lukiessaan. Tämän laajennuksen avulla voit vaihtaa Google Docsin käyttöliittymän saumattomasti tyylikkääseen ja rauhoittavaan tummaan teemaan, mikä tekee kirjoitussessioistasi nautinnollisempia kuin koskaan ennen. Sano hyvästit karulle kirkkaudelle ja tervehdi tuottavuutta tyylillä.\n\n🌟 Tumma tila Google Docs -ohjelman tärkeimmät ominaisuudet\n\n1. Vaivaton aktivointi: Tumma tila Google Docs on uskomattoman helppokäyttöinen. Vain yhdellä napsautuksella voit aktivoida Google Docin tumman teeman, mikä luo mukavamman ja keskittyneemmän kirjoitusympäristön.\n\n2. Mukauttamisvaihtoehdot: Ymmärrämme, että yksi koko ei sovi kaikille. Siksi tarjoamme erilaisia räätälöintivaihtoehtoja, joiden avulla voit säätää laajennuksen vastaamaan henkilökohtaisia mieltymyksiäsi. Säädä tummuusaste, fontti ja tausta mieleiseksesi.\n\n3. Säästää silmiäsi: Pitkät kirjoitussessiot voivat rasittaa silmiäsi. Dark Mode G Documents vähentää silmien rasitusta tarjoamalla hellävaraisen, tumman taustan, joka säästää näköäsi ja tekee kirjoittamisesta mukavampaa.\n\n4. Parempi keskittyminen: Tumma teema auttaa poistamaan häiriötekijät ja pitää huomiosi siellä, minne se kuuluu - kirjoittamisessa. Ei enää turhaa häikäisyä tai kirkkaita näyttöjä, jotka vetävät keskittymisesi pois.\n\n5. Energiatehokkuus: Tummien Google-asiakirjojen käyttö ei hyödytä vain silmiäsi, vaan säästää myös energiaa, mikä pidentää laitteesi käyttöikää ja säästää sähkökustannuksissa.\n \n🖥️ Yhteensopivuus ja saavutettavuus: G Docs on yhteensopiva kaikkien tärkeimpien verkkoselaimien kanssa, ja se on helposti käytettävissä tietokoneissa ja pöytätietokoneissa. Nyt voit nauttia Google Docsin tummasta tilasta haluamallasi alustalla.\n\n🌚 Miten aktivoida musta tila Google, Tummennetun tilan aktivointi Google Docsissa on helppoa. Lataa laajennus Chrome Web Storesta ja napsauta selaimessasi Dark Mode Google Docs -kuvaketta. Google Documents -sivusi siirtyy välittömästi rauhoittavaan tummaan teemaan, mikä parantaa kirjoituskokemustasi.\n\n📜 Miksi tarvitset tätä laajennusta?\n\nGoogle Docs Dark Mode: Dark Mode G Docs on lopullinen ratkaisu, joka tuo pimeän tilan Google-dokumenttiisi, varmistaen, että silmäsi pysyvät miellyttävinä kirjoitussessioiden aikana.\nParannettu tuottavuus: Mustan teeman tarjoaman häiriöttömän ympäristön ansiosta huomaat olevasi keskittyneempi, tehokkaampi ja tuottavampi kirjoitustehtävissäsi.\n\nSilmien suojaus: Pitkäaikainen altistuminen kirkkaalle näytölle voi olla haitallista silmillesi. Tumma tila Google Documents suojaa silmiäsi vähentämällä laitteesta lähtevän valon voimakkuutta.\n\nMukauttamisvaihtoehdot: Räätälöi Black Mode Google Docsin tila mieleiseksesi. Säädä pimeän tilan asetuksia, fontteja ja taustoja omien mieltymystesi mukaan.\n\nSelaintenvälinen yhteensopivuus: Piditpä sitten Chromesta, Firefoxista tai jostain muusta selaimesta, Hämärätila-Google Docs on yhteensopiva kautta linjan, joten voit nauttia tilakokemuksesta selainvalinnasta riippumatta.\n \n📚 Usein kysytyt kysymykset:\n \n1. Miten asetan Google Docsin kuutamotilaan tämän laajennuksen avulla? Voit ottaa Google Docsin pimeän tilan käyttöön lataamalla laajennuksen Chrome Web Storesta ja napsauttamalla sitten selaimessasi Google-asiakirjojen pimeän tilan kuvaketta.\n2. Onko Dark Mode G Docs saatavilla työpöydälle? Ehdottomasti! Dark Mode Google Docs on saatavilla sekä tietokoneille että pöytäkoneille, mikä varmistaa, että voit nauttia mukavasta kirjoitusympäristöstä haluamallasi alustalla.\n3. Voinko mukauttaa Dark Mode Google Docs -ohjelman ulkoasua? Kyllä, voit! Dark Mode Google Docs tarjoaa erilaisia mukautusvaihtoehtoja, joiden avulla voit räätälöidä laajennuksen omien mieltymystesi mukaan.\n4. Onko Google Docsissa natiivi tumma tila? Valitettavasti Google Docs ei tarjoa natiivia tummaa tilaa." + } +} diff --git a/_locales/fil/messages.json b/_locales/fil/messages.json new file mode 100644 index 0000000..b553052 --- /dev/null +++ b/_locales/fil/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Palakasin ang kahusayan gamit ang aming Dark Mode na Google Docs Extension. Damhin ang walang putol na Google Docs dark mode para sa pinahusay na pagsulat." + }, + "appName": { + "message": "Dark Mode Google Docs" + }, + "storeDesc": { + "message": "Here is the translation of the text into Filipino:\n\n🌟 Bakit Piliin ang Dark Mode Google Docs Kaysa sa Iba?\n\nDahil sa maraming Chrome extensions na nag-aalok ng dark mode functionality, maaaring magtaka ka kung ano ang nagbibigay daan para maging top choice ang Dark Mode G Docs mo. Alamin natin kung bakit naiiba ang Dark Mode Google Docs:\n\n1. User-Friendly Interface: Nagbibigay ang Dark Mode Google Docs ng intuwitibong interface para sa madaling navigasyon. Ang paghanap ng mga setting at customization options ay madali.\n2. Bilis at Epektibidad: Opitmizado ang aming extension para sa performance, tiyak na hindi ito magpapabagal sa iyong browser o Google Docs, nagbibigay ng dark theme nang hindi nagsa-sacrifice ng bilis.\n3. Regular na Updates: Ang g docs black mode ay patuloy na naa-update upang makasabay sa mga pagbabago sa Google Docs, tiyak na ang iyong dark mode experience ay laging kasalukuyan at functional.\n4. Responsive na Suporta: Kung may problema o katanungan ka, handang tumulong ang aming support team agad, nakatuon sa pagtiyak ng magaan na karanasan.\n5. Malawak na User Base: Ang google doc dire mode ay may aktibong user community na may positibong reviews na nagpapatunay sa kalidad at kahusayan nito. Sumali sa mga nasisiyahan na gumawa ng Dark Mode G Doc bilang kanilang pangunahing pagpipilian para sa superior na Google Docs experience.\n\n🎨 Pagsasaayos alinsunod sa Iyong Estilo\n\nAng personalisasyon ng iyong kapaligiran sa pagsusulat ay isang pangunahing benepisyo ng Dark Mode Google Docs. I-customize ito sa iyong puso:\n\nDarkness Level: I-adjust ang darkness level alinsunod sa iyong preference, mula sa maalab na dilim hanggang sa immersive darkness.\nFont Customization: Pumili ng estilo, laki, at kulay ng font na tugma sa iyong estilo ng pagsusulat.\nBackground Options: I-tailor ang background sa isang kulay o texture na nakakatugma sa iyong estetika.\nAccent Colors: Pumili ng accent colors upang bigyang-diin ang partikular na bahagi ng dokumento.\n\n🌐 Compatibility sa lahat ng Browsers\n\nHindi kung gamit mo ang Chrome, Firefox, o ibang browser, ang Black Mode G Docs ay disenyo para sa cross-browser compatibility. Mag-enjoy ng kumportableng at produktibong dark theme anuman ang iyong pinili na web browser.\n\n🚀 Pataasin ang Iyong Produktibidad\n\nAng Dark Mode Google Docs ay hindi lamang tungkol sa estetika; ito ay tungkol sa pagpapataas ng produktibidad at pagpapabuti sa iyong karanasan sa pagsusulat:\n\nFocus at Concentration: Ang Dire theme ay nagmimintina ng focus, nagbibigay daan sa iyo na mag-concentrate sa iyong trabaho nang walang abala.\nReduced Eye Strain: Magpapasalamat ang iyong mata sa mas mababang kislap, ginagawang mas komportable at mas kaakit-akit ang mahabang pagsusulat.\nEnergy Efficiency: Sa pamamagitan ng paggamit ng Dark Mode G Docs, iniingatan mo ang iyong mata at tumutulong sa pag-save ng energy, pagsusumikap sa iyong carbon footprint.\n\n🌚 Sa Pagwawakas\n\nAng Dark Mode Google Docs ay ang pangwakas na Chrome extension para sa sinumang naghahanap ng kumportableng, customizable, at epektibong karanasan sa pagsusulat. I-activate ito sa isang click, i-customize ito alinsunod sa iyong mga nais, at mag-enjoy ng isang distraction-free na kapaligiran na magaan sa iyong mata. Sumali sa masayang komunidad ng mga gumagamit na nag-transform ng kanilang Google Docs experience gamit ang Dark Mode G Doc.\n\n🌙 Google docs dark mode - Pahusayin ang Iyong Karanasan sa Pagsusulat!\n\nNakakakita ba ng nakasisilaw na sikat ng iyong screen habang nagtatrabaho sa Google Docs? Gusto mo ba ng mas kumportableng at maganda sa paningin na kapaligiran sa pagsusulat? Huwag nang maghanap pa dahil narito na ang Dark Mode Google Docs para gawing mas maaliwalas ang iyong karanasan sa pagsusulat.\n\nAng Google docs dark mode ay ang pangwakas na Chrome extension para sa mga nais ng mas madilim, mas mata-friendly na hitsura habang nag-gi-create, nag-e-edit, o nag-babasa ng mga dokumento. Sa extension na ito, maaari mong seamlessly na palitan ang iyong Google Docs interface sa isang maamo at nakakarelax na dark theme, ginagawa ang iyong mga writing session na mas masaya kaysa kailanman. Paalam sa matalim na kislap at hello sa produktibidad ng may estilo.\n\n🌟 Mga Pangunahing Features ng Dark Mode Google Docs\n\n1. Madaling I-activate: Ang Dark Mode Google Docs ay napakadaling gamitin. Sa isang click lang, maaari mong i-activate ang dark theme para sa iyong Google Doc, lumilikha ng mas komportableng at nakatuon na kapaligiran sa pagsusulat.\n\n2. Mga Option sa Pagsasaayos: Naiintindihan namin na hindi lahat ng sukat ay pareho. Kaya't nag-aalok kami ng iba't ibang options para sa customization, nagbibigay daan sa iyo na ayusin ang extension alinsunod sa iyong personal na mga nais. I-adjust ang darkness level, font, at background ayon sa iyong gusto.\n\n3. Iniiwasang Masaktan ang Iyong Mata: Ang mahabang pagsusulat ay maaaring magdulot ng pagod sa iyong mata. Iniibsan ng Dark Mode G Documents ang eye strain sa pamamagitan ng pagbibigay ng maamo at madilim na background na magaan sa iyong paningin, ginagawa ang iyong karanasan sa pagsusulat na mas komportable.\n\n4. Pinalakas na Fokus: Ang dark theme ay tumutulong sa pag-alis ng mga distraksyon at nag" + } +} diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json new file mode 100644 index 0000000..76231e7 --- /dev/null +++ b/_locales/fr/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Améliorez votre efficacité grâce à notre extension Google Docs en mode sombre. Faites l'expérience du mode sombre de Google Docs pour améliorer la rédaction." + }, + "appName": { + "message": "Mode sombre Google Docs" + }, + "storeDesc": { + "message": "🌟 Pourquoi choisir le mode sombre de Google Docs plutôt que ses concurrents ?\n\nAvec de nombreuses extensions Chrome offrant des fonctionnalités de mode sombre, vous pouvez vous demander ce qui fait du mode sombre de Google Docs votre meilleur choix. Voyons pourquoi Google Docs en mode sombre se démarque :\n\n1. Interface conviviale : Google Docs en mode sombre offre une interface intuitive qui facilite la navigation. La recherche des paramètres et des options de personnalisation est un jeu d'enfant.\n2. Vitesse et efficacité : Notre extension est optimisée pour les performances, ce qui garantit qu'elle ne ralentira pas votre navigateur ou Google Documents, offrant un thème sombre sans compromettre la vitesse.\n3. Mises à jour régulières : g docs black mode est continuellement mis à jour pour suivre le rythme des changements de Google Docs, garantissant que votre expérience en mode sombre reste actuelle et fonctionnelle.\n4. Assistance réactive : Si vous rencontrez des problèmes ou si vous avez des questions, notre équipe d'assistance est prête à vous aider rapidement et s'engage à vous garantir une expérience fluide.\n5. Large base d'utilisateurs : google doc dire mode a une communauté d'utilisateurs florissante avec des commentaires positifs attestant de sa qualité et de sa fiabilité. Rejoignez les rangs des utilisateurs satisfaits qui ont transformé leur expérience de Google Docs.\n \n🎨 Personnalisation pour s'adapter à votre style\n\nLa personnalisation de votre environnement de rédaction est l'un des principaux avantages du mode sombre de Google Documents. Personnalisez-le à votre guise :\n \nNiveau d'obscurité : Réglez le niveau d'obscurité en fonction de vos préférences, d'une faible luminosité à une obscurité totale.\nPersonnalisation de la police : Choisissez le style, la taille et la couleur de police qui conviennent à votre style d'écriture.\nOptions d'arrière-plan : Adaptez l'arrière-plan à une couleur ou une texture qui complète votre esthétique.\nCouleurs d'accentuation : Sélectionnez des couleurs d'accentuation pour mettre en évidence des éléments spécifiques du document.\n \nCompatibilité entre les navigateurs\n\nQue vous utilisiez Chrome, Firefox ou un autre navigateur, Black Mode G Docs est conçu pour être compatible avec tous les navigateurs. Profitez d'un thème sombre confortable et productif quel que soit votre choix de navigateur web.\n\n🚀 Augmentez votre productivité\n\nLe mode sombre de Google Docs n'est pas qu'une question d'esthétique ; il s'agit de stimuler la productivité et d'améliorer votre expérience d'écriture :\n \nConcentration : Le thème Dire minimise les distractions, ce qui vous permet de vous concentrer sur votre travail sans interruption.\nRéduction de la fatigue oculaire : Vos yeux vous remercieront pour la luminosité réduite, rendant les longues sessions d'écriture plus confortables et moins fatigantes.\nEfficacité énergétique : En utilisant le mode sombre de G Docs, vous économisez vos yeux et contribuez à la conservation de l'énergie, réduisant ainsi votre empreinte carbone.\n \n🌚 En conclusion\n\nDark Mode Google Docs est l'extension Chrome ultime pour tous ceux qui recherchent une expérience d'écriture confortable, personnalisable et efficace. Activez-la d'un simple clic, personnalisez-la selon vos préférences et profitez d'un environnement sans distraction qui ménage vos yeux. Rejoignez la communauté d'utilisateurs satisfaits qui ont fait de Dark Mode G Doc leur choix de prédilection pour une expérience Google Docs de qualité supérieure.\n\n🌙 Google docs mode sombre - Améliorez votre expérience d'écriture !\n\nLes reflets aveuglants de votre écran lorsque vous travaillez sur Google Docs vous fatiguent ? Vous aspirez à un environnement d'écriture plus confortable et visuellement agréable ? Ne cherchez plus, le mode sombre de Google Documents est là pour transformer votre expérience d'écriture.\n\nLe mode sombre de Google Docs est l'extension Chrome par excellence pour ceux qui préfèrent une apparence plus sombre et plus agréable à l'œil lorsqu'ils créent, modifient ou lisent des documents. Grâce à cette extension, vous pouvez basculer en toute transparence l'interface de Google Docs vers un thème sombre, élégant et apaisant, qui rendra vos sessions d'écriture plus agréables que jamais. Dites adieu à la luminosité trop forte et bonjour à la productivité avec style.\n\n🌟 Principales fonctionnalités de Dark Mode Google Docs\n\n1. Activation sans effort : Le mode sombre de Google Documents est incroyablement facile à utiliser. D'un simple clic, vous pouvez activer le thème sombre pour votre Google Doc, créant ainsi un environnement d'écriture plus confortable et plus concentré.\n\n2. Options de personnalisation : Nous savons qu'il n'existe pas de solution unique. C'est pourquoi nous proposons plusieurs options de personnalisation, qui vous permettent d'adapter l'extension à vos préférences personnelles. Ajustez le niveau d'obscurité, la police et l'arrière-plan à votre convenance.\n\n3. Préservez vos yeux : les longues sessions d'écriture peuvent mettre vos yeux à rude épreuve. Le mode sombre de G Documents réduit la fatigue oculaire en offrant un arrière-plan doux et sombre qui ménage votre vision, ce qui rend votre expérience d'écriture plus confortable.\n\n4. Amélioration de la concentration : Le thème sombre permet d'éliminer les distractions et de maintenir votre attention là où elle doit être : sur votre écriture. Plus d'éblouissements inutiles ni d'écrans lumineux qui détournent votre attention.\n\n5. Efficacité énergétique : L'utilisation des documents Google en mode sombre n'est pas seulement bénéfique pour vos yeux, elle permet également d'économiser de l'énergie, ce qui prolonge la durée de vie de votre appareil et vous permet de réaliser des économies d'électricité.\n \n🖥️ Compatibilité et accessibilité : Le mode sombre de Google Documents est compatible avec tous les principaux navigateurs web et est facilement disponible sur les PC et les ordinateurs de bureau. Vous pouvez désormais profiter du mode sombre de Google Docs sur votre plateforme préférée.\n\n🌚 Comment activer le mode noir Google, L'activation du mode sombre Google Docs est un jeu d'enfant. Il suffit de télécharger l'extension depuis le Chrome Web Store et de cliquer sur l'icône Mode sombre Google Docs dans votre navigateur. Votre page Google Documents basculera instantanément vers le thème sombre et apaisant, ce qui améliorera votre expérience d'écriture.\n\n📜 Pourquoi avez-vous besoin de cette extension ?\n\nGoogle Docs Dark Mode : Dark Mode G Docs est la solution définitive pour apporter le mode sombre à votre Google Doc, en veillant à ce que vos yeux restent à l'aise pendant vos sessions d'écriture.\nProductivité accrue : Grâce à l'environnement sans distraction offert par le thème noir, vous serez plus concentré, plus efficace et plus productif dans vos tâches d'écriture.\n\nProtection des yeux : L'exposition prolongée à un écran lumineux peut être nocive pour vos yeux. Le mode sombre de Google Documents protège vos yeux en réduisant l'intensité de la lumière émise par votre appareil.\n\nOptions de personnalisation : Adaptez le mode noir de Google Documents à vos préférences. Réglez les paramètres du mode noir, les polices et les arrière-plans en fonction de vos préférences.\n\nCompatibilité multi-navigateurs : Que vous préfériez Chrome, Firefox ou un autre navigateur, Google Documents en mode sombre est compatible avec tous les navigateurs, ce qui vous permet de profiter de l'expérience du mode sombre quel que soit le navigateur choisi.\n \nFAQ :\n \n1. Comment mettre Google Docs en mode sans lune avec cette extension ? Pour activer Google Docs en mode sans lune, il suffit de télécharger l'extension depuis le Chrome Web Store, puis de cliquer sur l'icône Google documents en mode sans lune dans votre navigateur.\n2. Le mode sombre de Google Documents est-il disponible pour les ordinateurs de bureau ? Absolument ! Le mode sombre de Google Documents est disponible pour les PC et les ordinateurs de bureau, ce qui vous permet de bénéficier d'un environnement d'écriture confortable sur la plateforme de votre choix.\n3. Puis-je personnaliser l'apparence de Google Documents en mode sombre ? Oui, c'est possible ! Le mode sombre de Google Documents offre plusieurs options de personnalisation, ce qui vous permet d'adapter l'extension à vos préférences personnelles.\n4. Google Docs dispose-t-il d'un mode sombre natif ? Malheureusement, Google Documents ne dispose pas d'un mode sombre natif." + } +} diff --git a/_locales/gu/messages.json b/_locales/gu/messages.json new file mode 100644 index 0000000..bdb7b12 --- /dev/null +++ b/_locales/gu/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "અમારા ડાર્ક મોડ Google ડૉક્સ એક્સ્ટેંશન વડે કાર્યક્ષમતામાં વધારો કરો. ઉન્નત લેખન માટે સીમલેસ Google ડૉક્સ ડાર્ક મોડનો અનુભવ કરો." + }, + "appName": { + "message": "ડાર્ક મોડ Google ડૉક્સ" + }, + "storeDesc": { + "message": "🌟 સ્પર્ધકો કરતાં ડાર્ક મોડ ગૂગલ ડોક્સ શા માટે પસંદ કરો?\n\nડાર્ક મોડ કાર્યક્ષમતા પ્રદાન કરતા અસંખ્ય ક્રોમ એક્સ્ટેન્શન્સ સાથે, તમે આશ્ચર્ય પામી શકો છો કે ડાર્ક મોડ જી ડૉક્સને તમારી ટોચની પસંદગી શું બનાવે છે. ચાલો અન્વેષણ કરીએ કે શા માટે ડાર્ક મોડ Google ડૉક્સ અલગ છે:\n\n1. વપરાશકર્તા મૈત્રીપૂર્ણ ઇન્ટરફેસ: ડાર્ક મોડ Google ડૉક્સ સરળ નેવિગેશન માટે સાહજિક ઇન્ટરફેસ પ્રદાન કરે છે. સેટિંગ્સ અને કસ્ટમાઇઝેશન વિકલ્પો શોધવી એ એક પવન છે.\n2. ઝડપ અને કાર્યક્ષમતા: અમારું એક્સ્ટેંશન પ્રભાવ માટે ઑપ્ટિમાઇઝ કરવામાં આવ્યું છે, તે સુનિશ્ચિત કરે છે કે તે તમારા બ્રાઉઝર અથવા Google ડૉક્સને ધીમું કરશે નહીં, ઝડપ સાથે સમાધાન કર્યા વિના ડાર્ક થીમ વિતરિત કરે છે.\n3. નિયમિત અપડેટ્સ: તમારા ડાર્ક મોડનો અનુભવ વર્તમાન અને કાર્યાત્મક રહે તેની ખાતરી કરીને, Google ડૉક્સના ફેરફારો સાથે ગતિ રાખવા માટે g docs બ્લેક મોડ સતત અપડેટ થાય છે.\n4. રિસ્પોન્સિવ સપોર્ટ: જો તમને સમસ્યાઓનો સામનો કરવો પડે અથવા પ્રશ્નો હોય, તો અમારી સપોર્ટ ટીમ તાત્કાલિક મદદ કરવા તૈયાર છે, સરળ અનુભવ સુનિશ્ચિત કરવા માટે પ્રતિબદ્ધ છે.\n5. વાઈડ યુઝર બેઝ: ગૂગલ ડોક ડાયર મોડમાં તેની ગુણવત્તા અને વિશ્વસનીયતાને પ્રમાણિત કરતી હકારાત્મક સમીક્ષાઓ સાથે સમૃદ્ધ વપરાશકર્તા સમુદાય છે. સંતુષ્ટ વપરાશકર્તાઓની રેન્કમાં જોડાઓ જેમણે તેમના Google ડૉક્સ અનુભવને બદલી નાખ્યો છે.\n \n🎨 તમારી શૈલીને અનુરૂપ કસ્ટમાઇઝેશન\n\nતમારા લેખન વાતાવરણને વ્યક્તિગત કરવું એ ડાર્ક મોડ Google ડૉક્સનો મુખ્ય ફાયદો છે. તમારા હૃદયની સામગ્રીને કસ્ટમાઇઝ કરો:\n \nઅંધકારનું સ્તર: તમારી પસંદગી સાથે મેળ કરવા માટે અંધકારના સ્તરને વ્યવસ્થિત કરો, હળવા અંધારાથી ઇમર્સિવ અંધકાર સુધી.\nફોન્ટ કસ્ટમાઇઝેશન: તમારી લેખન શૈલીને અનુરૂપ ફોન્ટ શૈલી, કદ અને રંગ પસંદ કરો.\nપૃષ્ઠભૂમિ વિકલ્પો: પૃષ્ઠભૂમિને તમારા સૌંદર્યલક્ષી રંગ અથવા ટેક્સચરને અનુરૂપ બનાવો.\nઉચ્ચાર રંગો: વિશિષ્ટ દસ્તાવેજ તત્વોને પ્રકાશિત કરવા માટે ઉચ્ચાર રંગો પસંદ કરો.\n \n🌐 સમગ્ર બ્રાઉઝર્સમાં સુસંગતતા\n\nભલે તમે Chrome, Firefox અથવા અન્ય બ્રાઉઝરનો ઉપયોગ કરો, બ્લેક મોડ G ડૉક્સ ક્રોસ-બ્રાઉઝર સુસંગતતા માટે રચાયેલ છે. તમારી વેબ બ્રાઉઝર પસંદગીને ધ્યાનમાં લીધા વિના આરામદાયક અને ઉત્પાદક ડાર્ક થીમનો આનંદ માણો.\n\n🚀 તમારી ઉત્પાદકતામાં વધારો કરો\n\nડાર્ક મોડ Google ડૉક્સ માત્ર સૌંદર્ય શાસ્ત્ર વિશે જ નથી; તે ઉત્પાદકતા વધારવા અને તમારા લેખન અનુભવને વધારવા વિશે છે:\n \nફોકસ અને એકાગ્રતા: ડાયર થીમ વિક્ષેપોને ઘટાડે છે, જેનાથી તમે કોઈપણ વિક્ષેપો વિના તમારા કામ પર ધ્યાન કેન્દ્રિત કરી શકો છો.\nઆંખનો તાણ ઓછો: તમારી આંખો ઓછી તેજ માટે આભાર માનશે, લાંબા લેખન સત્રોને વધુ આરામદાયક અને ઓછા થાકવાળું બનાવે છે.\nઉર્જા કાર્યક્ષમતા: ડાર્ક મોડ G ડૉક્સનો ઉપયોગ કરીને, તમે તમારી આંખો બચાવો છો અને તમારા કાર્બન ફૂટપ્રિન્ટને ઘટાડીને, ઊર્જા બચાવવામાં મદદ કરો છો.\n \n🌚 નિષ્કર્ષમાં\n\nડાર્ક મોડ Google ડૉક્સ એ આરામદાયક, વૈવિધ્યપૂર્ણ અને કાર્યક્ષમ લેખન અનુભવ મેળવવા માંગતા કોઈપણ માટે અંતિમ Chrome એક્સ્ટેંશન છે. તેને એક જ ક્લિકથી સક્રિય કરો, તેને તમારી પસંદગીઓ અનુસાર કસ્ટમાઇઝ કરો અને વિક્ષેપ-મુક્ત વાતાવરણનો આનંદ માણો જે તમારી આંખો પર સરળ છે. એવા વપરાશકર્તાઓના સંતુષ્ટ સમુદાયમાં જોડાઓ જેમણે ડાર્ક મોડ G ડૉકને શ્રેષ્ઠ Google ડૉક્સ અનુભવ માટે તેમની પસંદગીની પસંદગી બનાવી છે.\n\n🌙 Google ડૉક્સ ડાર્ક મોડ - તમારા લેખન અનુભવને બહેતર બનાવો!\n\nશું તમને Google ડૉક્સ પર કામ કરતી વખતે તમારી સ્ક્રીનની અંધકારમય ઝગઝગાટ કંટાળાજનક લાગે છે? શું તમે વધુ આરામદાયક અને દૃષ્ટિની રીતે આનંદદાયક લેખન વાતાવરણ માટે ઉત્સુક છો? આગળ જુઓ નહીં કારણ કે ડાર્ક મોડ Google ડૉક્સ તમારા લેખન અનુભવને બદલવા માટે અહીં છે.\n\nGoogle ડૉક્સ ડાર્ક મોડ એ તેમના માટે અંતિમ ક્રોમ એક્સ્ટેંશન છે જેઓ દસ્તાવેજો બનાવતી વખતે, સંપાદિત કરતી વખતે અથવા વાંચતી વખતે ઘાટા, વધુ આંખ માટે અનુકૂળ દેખાવ પસંદ કરે છે. આ એક્સ્ટેંશન સાથે, તમે તમારા Google ડૉક્સ ઇન્ટરફેસને એક આકર્ષક અને શાંત શ્યામ થીમ પર સ્વિચ કરી શકો છો, જે તમારા લેખન સત્રોને પહેલા કરતાં વધુ આનંદપ્રદ બનાવે છે. કઠોર તેજને ગુડબાય કહો અને શૈલીમાં ઉત્પાદકતાને હેલો.\n\n🌟 ડાર્ક મોડ Google ડૉક્સની મુખ્ય વિશેષતાઓ\n\n1. પ્રયાસરહિત સક્રિયકરણ: ડાર્ક મોડ Google ડૉક્સ વાપરવા માટે અતિ સરળ છે. માત્ર એક જ ક્લિકથી, તમે તમારા Google ડૉક માટે ડાર્ક થીમને સક્રિય કરી શકો છો, વધુ આરામદાયક અને ધ્યાન કેન્દ્રિત લેખન વાતાવરણ બનાવી શકો છો.\n\n2. કસ્ટમાઇઝેશન વિકલ્પો: અમે સમજીએ છીએ કે એક માપ બધામાં બંધબેસતું નથી. એટલા માટે અમે વિવિધ કસ્ટમાઇઝેશન વિકલ્પો ઑફર કરીએ છીએ, જે તમને તમારી વ્યક્તિગત પસંદગીઓ સાથે મેળ કરવા માટે એક્સ્ટેંશનને ટ્વિક કરવાની મંજૂરી આપે છે. તમારી રુચિ અનુસાર અંધકાર સ્તર, ફોન્ટ અને પૃષ્ઠભૂમિને સમાયોજિત કરો.\n\n3. તમારી આંખો બચાવે છે: લાંબા લેખન સત્રો તમારી આંખો પર અસર કરી શકે છે. ડાર્ક મોડ જી ડોક્યુમેન્ટ્સ તમારા લેખન અનુભવને વધુ આરામદાયક બનાવીને, તમારી દ્રષ્ટિ પર સરળ હોય તેવી હળવી, શ્યામ પૃષ્ઠભૂમિ પ્રદાન કરીને આંખનો તાણ ઘટાડે છે.\n\n4. સુધારેલ ફોકસ: ડાર્ક થીમ વિક્ષેપોને દૂર કરવામાં મદદ કરે છે અને તમારું ધ્યાન જ્યાં છે ત્યાં રાખે છે - તમારા લેખન પર. તમારું ધ્યાન દૂર કરવા માટે કોઈ વધુ બિનજરૂરી ઝગઝગાટ અથવા તેજસ્વી સ્ક્રીનો નહીં.\n\n5. ઉર્જા કાર્યક્ષમતા: ડાર્ક મોડ ગૂગલ ડોક્યુમેન્ટ્સનો ઉપયોગ કરવાથી માત્ર તમારી આંખોને જ ફાયદો થતો નથી પણ ઊર્જાની બચત પણ થાય છે, તમારા ઉપકરણનું જીવન લંબાય છે અને વીજળીના ખર્ચમાં બચત થાય છે.\n \n🖥️ સુસંગતતા અને ઍક્સેસિબિલિટી: ડાર્ક મોડ G ડૉક્સ તમામ મોટા વેબ બ્રાઉઝર્સ સાથે સુસંગત છે અને પીસી અને ડેસ્કટોપ પર સરળતાથી ઉપલબ્ધ છે. હવે, તમે તમારા મનપસંદ પ્લેટફોર્મ પર Google ડૉક્સ ડાર્ક મોડનો આનંદ માણી શકો છો.\n\n🌚 બ્લેક મોડ ગૂગલને કેવી રીતે એક્ટિવેટ કરવું, ડિમ મોડ ગૂગલ ડોક્સને એક્ટિવેટ કરવું એ એક પવન છે. ફક્ત Chrome વેબ સ્ટોર પરથી એક્સ્ટેંશન ડાઉનલોડ કરો અને તમારા બ્રાઉઝરમાં ડાર્ક મોડ Google ડૉક્સ આઇકન પર ક્લિક કરો. તમારા લેખન અનુભવને વધારતા, તમારું Google દસ્તાવેજ પૃષ્ઠ તરત જ સુખદ ઘેરી થીમ પર સ્વિચ કરશે.\n\n📜 તમને આ એક્સ્ટેંશનની કેમ જરૂર છે?\n\nGoogle ડૉક્સ ડાર્ક મોડ: ડાર્ક મોડ G ડૉક્સ એ તમારા Google ડૉકમાં ડાર્ક મોડ લાવવાનો ચોક્કસ ઉપાય છે, જે સુનિશ્ચિત કરે છે કે તમારા લેખન સત્રો દરમિયાન તમારી આંખો આરામદાયક રહે.\nઉન્નત ઉત્પાદકતા: બ્લેક થીમ પ્રદાન કરે છે તે વિક્ષેપ-મુક્ત વાતાવરણ સાથે, તમે તમારા લેખન કાર્યોમાં તમારી જાતને વધુ કેન્દ્રિત, કાર્યક્ષમ અને ઉત્પાદક જણાશો.\n\nઆંખનું રક્ષણ: તેજસ્વી સ્ક્રીનના લાંબા સમય સુધી સંપર્કમાં રહેવું તમારી આંખો માટે હાનિકારક હોઈ શકે છે. ડાર્ક મોડ ગૂગલ ડોક્યુમેન્ટ્સ તમારા ઉપકરણમાંથી ઉત્સર્જિત પ્રકાશની તીવ્રતા ઘટાડીને તમારી આંખોને સુરક્ષિત કરે છે.\n\nકસ્ટમાઇઝેશન વિકલ્પો: તમારી રુચિ પ્રમાણે બ્લેક મોડ Google ડૉકને ટેલર કરો. તમારી વ્યક્તિગત પસંદગીઓને અનુરૂપ ડાર્ક મોડ સેટિંગ્સ, ફોન્ટ્સ અને બેકગ્રાઉન્ડને સમાયોજિત કરો.\n\nક્રોસ-બ્રાઉઝર સુસંગતતા: ભલે તમે ક્રોમ, ફાયરફોક્સ અથવા અન્ય બ્રાઉઝરને પ્રાધાન્ય આપો, ડિમ મોડ Google ડૉક્સ સમગ્ર બોર્ડ પર સુસંગત છે, જેથી તમે તમારા બ્રાઉઝરની પસંદગીને ધ્યાનમાં લીધા વગર મોડનો અનુભવ માણી શકો.\n \n📚 FAQ:\n \n1. આ એક્સટેન્શન સાથે હું Google ડૉક્સને મૂનલેસ મોડમાં કેવી રીતે મૂકી શકું? ડાર્ક મોડ Google ડૉક્સને સક્રિય કરવા માટે, ફક્ત Chrome વેબ સ્ટોરમાંથી એક્સ્ટેંશન ડાઉનલોડ કરો અને પછી તમારા બ્રાઉઝરમાં Google દસ્તાવેજો ડાર્ક મોડ આઇકન પર ક્લિક કરો.\n2. શું ડાર્ક મોડ જી ડૉક્સ ડેસ્કટોપ માટે ઉપલબ્ધ છે? સંપૂર્ણપણે! ડાર્ક મોડ Google ડૉક્સ પીસી અને ડેસ્કટોપ બંને માટે ઉપલબ્ધ છે, તે સુનિશ્ચિત કરે છે કે તમે તમારા મનપસંદ પ્લેટફોર્મ પર આરામદાયક લેખન વાતાવરણનો આનંદ માણી શકો છો.\n3. શું હું ડાર્ક મોડ Google ડૉક્સના દેખાવને કસ્ટમાઇઝ કરી શકું? હા તમે કરી શકો છો! ડાર્ક મોડ Google ડૉક્સ વિવિધ કસ્ટમાઇઝેશન વિકલ્પો પ્રદાન કરે છે, જે તમને તમારી વ્યક્તિગત પસંદગીઓ અનુસાર એક્સ્ટેંશનને અનુરૂપ બનાવવાની મંજૂરી આપે છે.\n4. શું Google ડૉક્સમાં મૂળ ડાર્ક મોડ છે? કમનસીબે, Google ડૉક્સ મૂળ ડાર્ક મોડ ઑફર કરતું નથી." + } +} diff --git a/_locales/he/messages.json b/_locales/he/messages.json new file mode 100644 index 0000000..1a4f4c3 --- /dev/null +++ b/_locales/he/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "שפר את היעילות עם תוסף Google Docs במצב כהה שלנו. חווה מצב כהה חלק של Google Docs לכתיבה משופרת." + }, + "appName": { + "message": "מצב כהה Google Docs" + }, + "storeDesc": { + "message": "🌟 למה לבחור במצב כהה Google Docs על פני מתחרים?\n\nעם תוספי Chrome רבים המציעים פונקציונליות במצב כהה, אתה עשוי לתהות מה הופך את Dark Mode G Docs לבחירה הטובה ביותר שלך. בואו נחקור מדוע Google Docs במצב כהה בולט:\n\n1. ממשק ידידותי למשתמש: מצב כהה Google Docs מספק ממשק אינטואיטיבי לניווט קל. מציאת הגדרות ואפשרויות התאמה אישית היא קלה.\n2. מהירות ויעילות: התוסף שלנו מותאם לביצועים, ומבטיח שהוא לא יאט את הדפדפן או Google Docs שלך, מספק ערכת נושא כהה מבלי לפגוע במהירות.\n3. עדכונים שוטפים: מצב g docs black מתעדכן ללא הרף כדי לעמוד בקצב השינויים של Google Docs, מה שמבטיח שחוויית המצב האפל שלך תישאר עדכנית ופונקציונלית.\n4. תמיכה רספונסיבית: אם אתה נתקל בבעיות או יש לך שאלות, צוות התמיכה שלנו מוכן לסייע בהקדם, מחויב להבטיח חוויה חלקה.\n5. בסיס משתמשים רחב: google doc dire mode יש קהילת משתמשים משגשגת עם ביקורות חיוביות המעידות על האיכות והאמינות שלו. הצטרף לשורות המשתמשים המרוצים ששינו את חוויית Google Docs שלהם.\n \n🎨 התאמה אישית לסגנון שלך\n\nהתאמה אישית של סביבת הכתיבה שלך היא יתרון מרכזי של Google Docs במצב כהה. התאם אישית כאוות נפשך:\n \nרמת החושך: התאם את רמת החושך כך שתתאים להעדפותיך, מעמעום עדין לחושך סוחף.\nהתאמה אישית של גופן: בחר את סגנון הגופן, הגודל והצבע המתאימים לסגנון הכתיבה שלך.\nאפשרויות רקע: התאם את הרקע לצבע או מרקם המשלימים את האסתטיקה שלך.\nצבעי הדגשה: בחרו צבעי הדגשה כדי להדגיש רכיבי מסמך ספציפיים.\n \n🌐 תאימות בין דפדפנים\n\nבין אם אתה משתמש בכרום, בפיירפוקס או בדפדפן אחר, Black Mode G Docs מיועד לתאימות בין דפדפנים. תהנה מנושא כהה נוח ופרודוקטיבי ללא קשר לבחירת דפדפן האינטרנט שלך.\n\n🚀 שפר את הפרודוקטיביות שלך\n\nמצב כהה Google Docs עוסק לא רק באסתטיקה; מדובר בשיפור הפרודוקטיביות ושיפור חווית הכתיבה שלך:\n \nמיקוד וריכוז: הנושא של Dire ממזער הסחות דעת, ומאפשר לך להתרכז בעבודה שלך ללא הפרעות.\nעומס עיניים מופחת: העיניים שלך יודו לך על הבהירות המופחתת, מה שהופך מפגשי כתיבה ארוכים לנוחים יותר ופחות מעייפים.\nיעילות אנרגטית: על ידי שימוש ב-Dark Mode G Docs, אתה חוסך את העיניים שלך ועוזר לחסוך באנרגיה, ומפחית את טביעת הרגל הפחמנית שלך.\n \n🌚 לסיכום\n\nמצב כהה Google Docs הוא תוסף Chrome האולטימטיבי לכל מי שמחפש חווית כתיבה נוחה, ניתנת להתאמה אישית ויעילה. הפעל אותו בלחיצה אחת, התאם אותו להעדפותיך ותיהנה מסביבה נטולת הסחות דעת שקל לעיניך. הצטרפו לקהילת המשתמשים המרוצים שהפכו את Dark Mode G Doc לבחירה המתאימה להם לחוויית Google Docs מעולה.\n\n🌙 מצב כהה של Google docs - שפר את חווית הכתיבה שלך!\n\nהאם הבוהק המסנוור של המסך שלך בזמן העבודה על Google Docs מעייף בעיניך? האם אתה משתוקק לסביבת כתיבה נוחה ונעימה יותר מבחינה ויזואלית? אל תחפש עוד כי מצב כהה Google Docs כאן כדי לשנות את חווית הכתיבה שלך.\n\nמצב כהה של Google docs הוא הרחבה האולטימטיבית של Chrome עבור אלה שמעדיפים מראה כהה יותר וידידותי יותר לעיניים בעת יצירה, עריכה או קריאת מסמכים. עם תוסף זה, אתה יכול להעביר בצורה חלקה את ממשק Google Docs שלך לנושא כהה אלגנטי ומרגיע, מה שהופך את הפעלות הכתיבה שלך למהנות יותר מאי פעם. היפרד מהבהירות הקשה ושלום לפרודוקטיביות בסטייל.\n\n🌟 תכונות עיקריות של Google Docs במצב כהה\n\n1. הפעלה ללא מאמץ: מצב כהה Google Docs קל להפליא לשימוש. בלחיצה אחת בלבד, תוכל להפעיל את ערכת הנושא האפלה עבור Google Doc שלך, וליצור סביבת כתיבה נוחה וממוקדת יותר.\n\n2. אפשרויות התאמה אישית: אנו מבינים שגודל אחד לא מתאים לכולם. זו הסיבה שאנו מציעים אפשרויות התאמה אישית שונות, המאפשרות לך להתאים את התוסף כך שיתאים להעדפותיך האישיות. התאם את רמת הכהות, הגופן והרקע לטעמך.\n\n3. מציל את העיניים: מפגשי כתיבה ארוכים עלולים לגבות מחיר מעיניכם. Dark Mode G Documents מפחית את עומס העיניים על ידי מתן רקע עדין וכהה המקל על הראייה שלך, מה שהופך את חווית הכתיבה שלך לנוחה יותר.\n\n4. מיקוד משופר: הנושא האפל עוזר לבטל הסחות דעת ושומר את תשומת הלב שלך במקום שהיא שייכת - בכתיבה שלך. לא עוד בוהק מיותר או מסכים בהירים כדי להרחיק את המיקוד שלך.\n\n5. יעילות אנרגטית: שימוש במסמכים של Google במצב כהה לא רק מועיל לעיניים שלך אלא גם חוסך באנרגיה, מאריך את חיי המכשיר וחוסך בעלויות החשמל.\n \n🖥️ תאימות ונגישות: Dark Mode G Docs תואם לכל דפדפני האינטרנט הגדולים וזמין בקלות במחשבים ובשולחניים. כעת, אתה יכול ליהנות ממצב כהה של Google Docs בפלטפורמה המועדפת עליך.\n\n🌚 איך להפעיל מצב שחור של Google, הפעלת מצב עמום של Google Docs היא קלה. כל שעליך לעשות הוא להוריד את התוסף מחנות האינטרנט של Chrome ולחץ על סמל Google Docs במצב כהה בדפדפן שלך. דף Google Documents שלך יעבור באופן מיידי לנושא האפל המרגיע, וישפר את חווית הכתיבה שלך.\n\n📜 למה אתה צריך את התוסף הזה?\n\nמצב כהה של Google Docs: מצב כהה G Docs הוא הפתרון הסופי להכנסת מצב כהה ל-Google Doc שלך, כדי להבטיח שהעיניים שלך יישארו נוחות במהלך הפעלות הכתיבה שלך.\nפרודוקטיביות משופרת: עם הסביבה נטולת הסחות דעת שהנושא השחור מספק, תמצא את עצמך יותר ממוקד, יעיל ופרודוקטיבי במשימות הכתיבה שלך.\n\nהגנה על העיניים: חשיפה ממושכת למסך בהיר עלולה להזיק לעיניים שלך. מצב כהה Google Documents מגן על העיניים שלך על ידי הפחתת עוצמת האור הנפלט מהמכשיר שלך.\n\nאפשרויות התאמה אישית: התאם את מצב השחור של Google Doc לטעמך. התאם את הגדרות המצב הכהה, הגופנים והרקע כך שיתאימו להעדפותיך האישיות.\n\nתאימות בין דפדפנים: בין אם אתה מעדיף את Chrome, Firefox או דפדפן אחר, מצב עמום של Google Docs תואם בכל התחומים, כך שתוכל ליהנות מחוויית מצב ללא קשר לבחירת הדפדפן.\n \n📚 שאלות נפוצות:\n \n1. כיצד אוכל לשים את Google Docs במצב ללא ירח עם התוסף הזה? כדי להפעיל את Google Docs במצב כהה, פשוט הורד את התוסף מחנות האינטרנט של Chrome, ולאחר מכן לחץ על סמל המצב האפל של Google Documents בדפדפן שלך.\n2. האם Dark Mode G Docs זמין עבור שולחן העבודה? בהחלט! מצב כהה Google Docs זמין הן למחשבים והן למחשבים שולחניים, מה שמבטיח שתוכלו ליהנות מסביבת כתיבה נוחה בפלטפורמה המועדפת עליכם.\n3. האם אני יכול להתאים אישית את המראה של Google Docs במצב כהה? כן אתה יכול! מצב כהה Google Docs מציע אפשרויות התאמה אישית שונות, המאפשרות לך להתאים את התוסף להעדפותיך האישיות.\n4. האם ל-Google Docs יש מצב חשוך מקורי? למרבה הצער, Google Docs אינו מציע מצב חשוך מקורי." + } +} diff --git a/_locales/hi/messages.json b/_locales/hi/messages.json new file mode 100644 index 0000000..4fe4a2f --- /dev/null +++ b/_locales/hi/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "हमारे डार्क मोड Google डॉक्स एक्सटेंशन के साथ दक्षता बढ़ाएँ। उन्नत लेखन के लिए निर्बाध Google डॉक्स डार्क मोड का अनुभव करें।" + }, + "appName": { + "message": "डार्क मोड Google डॉक्स" + }, + "storeDesc": { + "message": "🌟 प्रतिस्पर्धियों की तुलना में डार्क मोड Google डॉक्स क्यों चुनें?\n\nडार्क मोड कार्यक्षमता की पेशकश करने वाले कई क्रोम एक्सटेंशन के साथ, आपको आश्चर्य हो सकता है कि डार्क मोड जी डॉक्स को आपकी शीर्ष पसंद क्या बनाती है। आइए देखें कि डार्क मोड Google डॉक्स क्यों विशिष्ट है:\n\n1. उपयोगकर्ता के अनुकूल इंटरफ़ेस: डार्क मोड Google डॉक्स आसान नेविगेशन के लिए एक सहज इंटरफ़ेस प्रदान करता है। सेटिंग्स और अनुकूलन विकल्प ढूंढना बहुत आसान है।\n2. गति और दक्षता: हमारा एक्सटेंशन प्रदर्शन के लिए अनुकूलित है, यह सुनिश्चित करते हुए कि यह आपके ब्राउज़र या Google डॉक्स को धीमा नहीं करेगा, गति से समझौता किए बिना एक डार्क थीम प्रदान करेगा।\n3. नियमित अपडेट: जी डॉक्स ब्लैक मोड Google डॉक्स के परिवर्तनों के साथ तालमेल बनाए रखने के लिए लगातार अपडेट होता है, जिससे यह सुनिश्चित होता है कि आपका डार्क मोड अनुभव चालू और कार्यात्मक बना रहे।\n4. प्रतिक्रियाशील समर्थन: यदि आपको कोई समस्या आती है या आपके कोई प्रश्न हैं, तो हमारी सहायता टीम सहज अनुभव सुनिश्चित करने के लिए प्रतिबद्ध है और तुरंत सहायता करने के लिए तैयार है।\n5. व्यापक उपयोगकर्ता आधार: गूगल डॉक डायर मोड में एक संपन्न उपयोगकर्ता समुदाय है, जिसकी सकारात्मक समीक्षाएं इसकी गुणवत्ता और विश्वसनीयता को प्रमाणित करती हैं। उन संतुष्ट उपयोगकर्ताओं की श्रेणी में शामिल हों जिन्होंने अपने Google डॉक्स अनुभव को बदल दिया है।\n \n🎨 आपकी शैली के अनुरूप अनुकूलन\n\nअपने लेखन परिवेश को निजीकृत करना डार्क मोड Google डॉक्स का एक प्रमुख लाभ है। अपने मन की इच्छानुसार अनुकूलित करें:\n \nअँधेरे का स्तर: अपनी पसंद के अनुसार अँधेरे के स्तर को समायोजित करें, हल्के धुंधले से गहरे अँधेरे तक।\nफ़ॉन्ट अनुकूलन: वह फ़ॉन्ट शैली, आकार और रंग चुनें जो आपकी लेखन शैली के अनुकूल हो।\nपृष्ठभूमि विकल्प: पृष्ठभूमि को ऐसे रंग या बनावट के अनुरूप बनाएं जो आपकी सुंदरता से मेल खाता हो।\nएक्सेंट रंग: विशिष्ट दस्तावेज़ तत्वों को हाइलाइट करने के लिए एक्सेंट रंगों का चयन करें।\n \n🌐 सभी ब्राउज़रों में अनुकूलता\n\nचाहे आप क्रोम, फ़ायरफ़ॉक्स, या किसी अन्य ब्राउज़र का उपयोग करें, ब्लैक मोड जी डॉक्स क्रॉस-ब्राउज़र संगतता के लिए डिज़ाइन किया गया है। अपने वेब ब्राउज़र की पसंद की परवाह किए बिना एक आरामदायक और उत्पादक डार्क थीम का आनंद लें।\n\n🚀 अपनी उत्पादकता बढ़ाएँ\n\nडार्क मोड Google डॉक्स केवल सौंदर्यशास्त्र के बारे में नहीं है; यह उत्पादकता बढ़ाने और आपके लेखन अनुभव को बढ़ाने के बारे में है:\n \nफोकस और एकाग्रता: डायर थीम विकर्षणों को कम करती है, जिससे आप बिना किसी रुकावट के अपने काम पर ध्यान केंद्रित कर सकते हैं।\nआंखों का तनाव कम होना: आपकी आंखें कम चमक के लिए आपको धन्यवाद देंगी, जिससे लंबे लेखन सत्र अधिक आरामदायक और कम थकाने वाले हो जाएंगे।\nऊर्जा दक्षता: डार्क मोड जी डॉक्स का उपयोग करके, आप अपनी आँखें बचाते हैं और अपने कार्बन पदचिह्न को कम करके ऊर्जा संरक्षण में मदद करते हैं।\n \n🌚निष्कर्ष में\n\nडार्क मोड Google डॉक्स आरामदायक, अनुकूलन योग्य और कुशल लेखन अनुभव चाहने वाले किसी भी व्यक्ति के लिए अंतिम क्रोम एक्सटेंशन है। इसे एक क्लिक से सक्रिय करें, इसे अपनी प्राथमिकताओं के अनुसार अनुकूलित करें, और एक व्याकुलता-मुक्त वातावरण का आनंद लें जो आपकी आंखों के लिए आसान हो। उन उपयोगकर्ताओं के संतुष्ट समुदाय में शामिल हों जिन्होंने बेहतर Google डॉक्स अनुभव के लिए डार्क मोड जी डॉक को अपनी पसंद बनाया है।\n\n🌙 Google डॉक्स डार्क मोड - अपने लेखन अनुभव को बेहतर बनाएं!\n\nक्या आपको Google डॉक्स पर काम करते समय अपनी स्क्रीन की चकाचौंध करने वाली चमक थकाऊ लगती है? क्या आप अधिक आरामदायक और दृष्टि से सुखदायक लेखन वातावरण के लिए उत्सुक हैं? अब और मत देखो क्योंकि डार्क मोड Google डॉक्स आपके लेखन अनुभव को बदलने के लिए यहां है।\n\nGoogle डॉक्स डार्क मोड उन लोगों के लिए अंतिम क्रोम एक्सटेंशन है जो दस्तावेज़ बनाते, संपादित करते या पढ़ते समय गहरा, अधिक आंखों के अनुकूल दिखना पसंद करते हैं। इस एक्सटेंशन के साथ, आप अपने Google डॉक्स इंटरफ़ेस को सहज और सुखदायक डार्क थीम पर स्विच कर सकते हैं, जिससे आपके लेखन सत्र पहले से कहीं अधिक मनोरंजक हो जाएंगे। कठोर चमक को अलविदा कहें और स्टाइल में उत्पादकता को नमस्ते कहें।\n\n🌟 डार्क मोड Google डॉक्स की मुख्य विशेषताएं\n\n1. सहज सक्रियण: डार्क मोड Google डॉक्स का उपयोग करना अविश्वसनीय रूप से आसान है। केवल एक क्लिक से, आप अपने Google Doc के लिए डार्क थीम को सक्रिय कर सकते हैं, जिससे एक अधिक आरामदायक और केंद्रित लेखन वातावरण बन सकता है।\n\n2. अनुकूलन विकल्प: हम समझते हैं कि एक आकार सभी के लिए उपयुक्त नहीं है। इसीलिए हम विभिन्न अनुकूलन विकल्प प्रदान करते हैं, जिससे आप अपनी व्यक्तिगत प्राथमिकताओं से मेल खाने के लिए एक्सटेंशन में बदलाव कर सकते हैं। अंधेरे स्तर, फ़ॉन्ट और पृष्ठभूमि को अपनी पसंद के अनुसार समायोजित करें।\n\n3. आपकी आंखें बचाता है: लंबे लेखन सत्र आपकी आंखों पर प्रतिकूल प्रभाव डाल सकते हैं। डार्क मोड जी दस्तावेज़ एक सौम्य, गहरे रंग की पृष्ठभूमि प्रदान करके आंखों के तनाव को कम करता है जो आपकी दृष्टि के लिए आसान है, जिससे आपका लेखन अनुभव अधिक आरामदायक हो जाता है।\n\n4. बेहतर फोकस: डार्क थीम विकर्षणों को खत्म करने में मदद करती है और आपका ध्यान वहीं रखती है जहां वह है - आपके लेखन पर। आपका ध्यान भटकाने के लिए अब कोई अनावश्यक चकाचौंध या चमकदार स्क्रीन नहीं।\n\n5. ऊर्जा दक्षता: डार्क मोड Google दस्तावेज़ों का उपयोग करने से न केवल आपकी आंखों को लाभ होता है, बल्कि ऊर्जा की बचत भी होती है, आपके डिवाइस का जीवन बढ़ता है और बिजली की लागत भी बचती है।\n \n🖥️ अनुकूलता और पहुंच: डार्क मोड जी डॉक्स सभी प्रमुख वेब ब्राउज़रों के साथ संगत है और पीसी और डेस्कटॉप पर आसानी से उपलब्ध है। अब, आप अपने पसंदीदा प्लेटफ़ॉर्म पर Google डॉक्स डार्क मोड का आनंद ले सकते हैं।\n\n🌚 Google में ब्लैक मोड कैसे सक्रिय करें, डिम मोड Google डॉक्स सक्रिय करना बहुत आसान है। बस क्रोम वेब स्टोर से एक्सटेंशन डाउनलोड करें और अपने ब्राउज़र में डार्क मोड Google डॉक्स आइकन पर क्लिक करें। आपका Google दस्तावेज़ पृष्ठ तुरंत सुखदायक डार्क थीम पर स्विच हो जाएगा, जिससे आपका लेखन अनुभव बेहतर हो जाएगा।\n\n📜 आपको इस एक्सटेंशन की आवश्यकता क्यों है?\n\nGoogle डॉक्स डार्क मोड: डार्क मोड जी डॉक्स आपके Google डॉक में डार्क मोड लाने का निश्चित समाधान है, जो यह सुनिश्चित करता है कि आपके लेखन सत्र के दौरान आपकी आंखें आरामदायक रहें।\nबढ़ी हुई उत्पादकता: ब्लैक थीम द्वारा प्रदान किए जाने वाले व्याकुलता-मुक्त वातावरण के साथ, आप अपने लेखन कार्यों में स्वयं को अधिक केंद्रित, कुशल और उत्पादक पाएंगे।\n\nआंखों की सुरक्षा: लंबे समय तक चमकदार स्क्रीन के संपर्क में रहना आपकी आंखों के लिए हानिकारक हो सकता है। डार्क मोड Google दस्तावेज़ आपके डिवाइस से निकलने वाली रोशनी की तीव्रता को कम करके आपकी आंखों की सुरक्षा करता है।\n\nअनुकूलन विकल्प: ब्लैक मोड Google डॉक को अपनी पसंद के अनुसार अनुकूलित करें। अपनी व्यक्तिगत प्राथमिकताओं के अनुरूप डार्क मोड सेटिंग्स, फ़ॉन्ट और पृष्ठभूमि समायोजित करें।\n\nक्रॉस-ब्राउज़र संगतता: चाहे आप क्रोम, फ़ायरफ़ॉक्स, या अन्य ब्राउज़र पसंद करते हों, डिम मोड Google डॉक्स पूरे बोर्ड में संगत है, इसलिए आप अपनी पसंद का ब्राउज़र चाहे जो भी हो, मोड अनुभव का आनंद ले सकते हैं।\n \n📚 अक्सर पूछे जाने वाले प्रश्न:\n \n1. मैं इस एक्सटेंशन के साथ Google डॉक्स को मूनलेस मोड में कैसे डालूं? डार्क मोड Google डॉक्स को सक्रिय करने के लिए, बस क्रोम वेब स्टोर से एक्सटेंशन डाउनलोड करें, और फिर अपने ब्राउज़र में Google दस्तावेज़ डार्क मोड आइकन पर क्लिक करें।\n2. क्या डार्क मोड जी डॉक्स डेस्कटॉप के लिए उपलब्ध है? बिल्कुल! डार्क मोड Google डॉक्स पीसी और डेस्कटॉप दोनों के लिए उपलब्ध है, जो यह सुनिश्चित करता है कि आप अपने पसंदीदा प्लेटफॉर्म पर आरामदायक लेखन वातावरण का आनंद ले सकें।\n3. क्या मैं डार्क मोड Google डॉक्स की उपस्थिति को अनुकूलित कर सकता हूं? हाँ तुम कर सकते हो! डार्क मोड Google डॉक्स विभिन्न अनुकूलन विकल्प प्रदान करता है, जिससे आप अपनी व्यक्तिगत प्राथमिकताओं के अनुसार एक्सटेंशन को अनुकूलित कर सकते हैं।\n4. क्या Google डॉक्स में देशी डार्क मोड है? दुर्भाग्य से, Google डॉक्स देशी डार्क मोड की पेशकश नहीं करता है।" + } +} diff --git a/_locales/hr/messages.json b/_locales/hr/messages.json new file mode 100644 index 0000000..46fbb1c --- /dev/null +++ b/_locales/hr/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Povećajte učinkovitost s našim proširenjem Google dokumenata u tamnom načinu rada. Iskusite besprijekoran tamni način rada Google dokumenata za poboljšano pisanje." + }, + "appName": { + "message": "Tamni način Google dokumenata" + }, + "storeDesc": { + "message": "🌟 Zašto odabrati Dark Mode Google Docs u odnosu na konkurente?\n\nUz brojna proširenja za Chrome koja nude funkciju tamnog načina rada, mogli biste se zapitati zašto je G dokumenti u tamnom načinu rada vaš najbolji izbor. Istražimo zašto se Google dokumenti u tamnom načinu rada ističu:\n\n1. Sučelje prilagođeno korisniku: Dark Mode Google Docs pruža intuitivno sučelje za jednostavnu navigaciju. Pronalaženje postavki i mogućnosti prilagodbe je povjetarac.\n2. Brzina i učinkovitost: Naše proširenje je optimizirano za izvedbu, osiguravajući da neće usporiti vaš preglednik ili Google dokumente, pružajući tamnu temu bez ugrožavanja brzine.\n3. Redovita ažuriranja: g docs crni način neprekidno se ažurira kako bi držao korak s promjenama Google dokumenata, osiguravajući da vaše iskustvo tamnog načina rada ostane aktualno i funkcionalno.\n4. Responzivna podrška: Ako naiđete na probleme ili imate pitanja, naš tim za podršku spreman je pomoći odmah, posvećen osiguravanju neometanog iskustva.\n5. Široka baza korisnika: google doc dire mode ima uspješnu zajednicu korisnika s pozitivnim recenzijama koje potvrđuju njegovu kvalitetu i pouzdanost. Pridružite se redovima zadovoljnih korisnika koji su promijenili svoje iskustvo s Google dokumentima.\n \n🎨 Prilagodba u skladu s vašim stilom\n\nPersonalizacija vašeg okruženja za pisanje ključna je prednost Google dokumenata u tamnom načinu rada. Prilagodite po želji:\n \nRazina zatamnjenosti: Prilagodite razinu zatamnjenosti prema svojim željama, od blago prigušene do sveobuhvatne tame.\nPrilagodba fonta: odaberite stil fonta, veličinu i boju koja odgovara vašem stilu pisanja.\nOpcije pozadine: Prilagodite pozadinu boji ili teksturi koja nadopunjuje vašu estetiku.\nBoje isticanja: Odaberite boje isticanja da biste istaknuli određene elemente dokumenta.\n \n🌐 Kompatibilnost s više preglednika\n\nBez obzira koristite li Chrome, Firefox ili neki drugi preglednik, Black Mode G Docs dizajniran je za kompatibilnost s više preglednika. Uživajte u udobnoj i produktivnoj tamnoj temi bez obzira na odabir vašeg web preglednika.\n\n🚀 Povećajte svoju produktivnost\n\nTamni način Google dokumenata nije samo estetika; radi se o povećanju produktivnosti i poboljšanju vašeg iskustva pisanja:\n \nUsredotočenost i koncentracija: Tema Dire minimalizira distrakcije, omogućujući vam da se usredotočite na svoj posao bez prekida.\nSmanjeno naprezanje očiju: Vaše oči će vam biti zahvalne na smanjenoj svjetlini, čineći duge sesije pisanja ugodnijima i manje zamornima.\nEnergetska učinkovitost: korištenjem Dark Mode G Docs štedite svoje oči i pomažete u očuvanju energije, smanjujući svoj ugljični otisak.\n \n🌚 Zaključno\n\nGoogle dokumenti u tamnom načinu vrhunsko su proširenje za Chrome za svakoga tko traži udobno, prilagodljivo i učinkovito iskustvo pisanja. Aktivirajte ga jednim klikom, prilagodite ga svojim željama i uživajte u okruženju bez ometanja koje je ugodno za vaše oči. Pridružite se zadovoljnoj zajednici korisnika koji su odabrali Dark Mode G Doc za vrhunski doživljaj Google dokumenata.\n\n🌙 Tamni način Google dokumenata - poboljšajte svoje iskustvo pisanja!\n\nSmatrate li da vas zasljepljujući odsjaj vašeg zaslona dok radite na Google dokumentima zamara? Žudite li za udobnijim i vizualno ugodnijim okruženjem za pisanje? Ne tražite dalje jer su Google dokumenti u tamnom načinu rada tu da transformiraju vaše iskustvo pisanja.\n\nTamni način rada Google dokumenata vrhunsko je proširenje za Chrome za one koji vole tamniji, oku ugodniji izgled prilikom izrade, uređivanja ili čitanja dokumenata. S ovim proširenjem možete neprimjetno prebaciti svoje sučelje Google dokumenata na elegantnu i umirujuću tamnu temu, čineći vaše sesije pisanja ugodnijima nego ikad prije. Recite zbogom gruboj svjetlini i pozdravite produktivnost u stilu.\n\n🌟 Ključne značajke tamnog načina rada Google dokumenata\n\n1. Aktivacija bez napora: Dark Mode Google Docs je nevjerojatno jednostavan za korištenje. Samo jednim klikom možete aktivirati tamnu temu za svoj Google dokument, stvarajući ugodnije i fokusiranije okruženje za pisanje.\n\n2. Mogućnosti prilagodbe: Shvaćamo da jedna veličina ne odgovara svima. Zato nudimo različite mogućnosti prilagodbe, omogućujući vam da prilagodite proširenje prema svojim osobnim preferencijama. Prilagodite razinu zatamnjenosti, font i pozadinu prema svojim željama.\n\n3. Štedi vaše oči: Dugo pisanje može uzeti danak za vaše oči. Dark Mode G Documents smanjuje naprezanje očiju pružajući nježnu, tamnu pozadinu koja je laka za vaš vid, čineći vaše iskustvo pisanja ugodnijim.\n\n4. Poboljšani fokus: Tamna tema pomaže u uklanjanju smetnji i zadržava vašu pozornost tamo gdje joj je mjesto – na vašem pisanju. Nema više nepotrebnog odsjaja ili svijetlih zaslona koji vam odvlače fokus.\n\n5. Energetska učinkovitost: Korištenje tamnog načina Google dokumenata ne samo da koristi vašim očima, već i štedi energiju, produžujući životni vijek vašeg uređaja i štedeći na troškovima električne energije.\n \n🖥️ Kompatibilnost i pristupačnost: Dark Mode G Docs je kompatibilan sa svim većim web preglednicima i dostupan je na osobnim i stolnim računalima. Sada možete uživati u tamnom načinu rada Google dokumenata na željenoj platformi.\n\n🌚 Kako aktivirati Black Mode Google, Aktivacija Dim Mode Google Docs je povjetarac. Jednostavno preuzmite proširenje iz Chrome web-trgovine i kliknite ikonu Dark Mode Google Docs u svom pregledniku. Vaša stranica Google dokumenata odmah će se prebaciti na umirujuću tamnu temu, poboljšavajući vaše iskustvo pisanja.\n\n📜 Zašto vam treba ovo proširenje?\n\nTamni način rada Google dokumenata: Tamni način rada G Docs je konačno rješenje za uvođenje tamnog načina rada u vaš Google dokument, osiguravajući da vam oči ostanu udobne tijekom pisanja.\nPoboljšana produktivnost: s okruženjem bez ometanja koje pruža crna tema, bit ćete usredotočeniji, učinkovitiji i produktivniji u svojim zadacima pisanja.\n\nZaštita očiju: Dugotrajno izlaganje svijetlom ekranu može biti štetno za vaše oči. Dark Mode Google Documents štiti vaše oči smanjujući intenzitet svjetlosti koju emitira vaš uređaj.\n\nMogućnosti prilagodbe: prilagodite Google dokument u crnom načinu prema svojim željama. Prilagodite postavke tamnog načina rada, fontove i pozadine prema svojim osobnim željama.\n\nKompatibilnost s više preglednika: Bilo da preferirate Chrome, Firefox ili neki drugi preglednik, Dim Mode Google Docs kompatibilan je na svim stranama, tako da možete uživati u iskustvu načina rada bez obzira na odabir preglednika.\n \n📚 Česta pitanja:\n \n1. Kako mogu staviti Google dokumente u način rada bez mjeseca s ovim proširenjem? Da biste aktivirali Google dokumente u tamnom načinu rada, jednostavno preuzmite proširenje iz Chrome web trgovine, a zatim kliknite ikonu tamnog načina rada Google dokumenata u svom pregledniku.\n2. Je li Dark Mode G Docs dostupan za desktop? Apsolutno! Tamni način rada Google Docs dostupan je za osobna i stolna računala, osiguravajući da možete uživati u ugodnom okruženju za pisanje na željenoj platformi.\n3. Mogu li prilagoditi izgled tamnog načina Google dokumenata? Da, možete! Tamni način rada Google Docs nudi različite mogućnosti prilagodbe, omogućujući vam da prilagodite proširenje svojim osobnim preferencijama.\n4. Imaju li Google dokumenti izvorni tamni način rada? Nažalost, Google dokumenti ne nude izvorni tamni način rada." + } +} diff --git a/_locales/hu/messages.json b/_locales/hu/messages.json new file mode 100644 index 0000000..0f38b76 --- /dev/null +++ b/_locales/hu/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Növelje a hatékonyságot a Sötét módú Google Dokumentumok bővítményünkkel. Tapasztalja meg a zökkenőmentes Google Dokumentumok sötét módot a jobb írás érdekében." + }, + "appName": { + "message": "Sötét üzemmódú Google Dokumentumok" + }, + "storeDesc": { + "message": "🌟 Miért válassza a Google Dokumentumok sötét módját a versenytársakkal szemben?\n\nMivel számos Chrome-bővítmény kínál sötét üzemmód funkciót, talán elgondolkodsz azon, hogy mi teszi a Dark Mode G Docs-t a legjobb választásoddá. Vizsgáljuk meg, miért emelkedik ki a Dark Mode Google Docs a többi közül:\n\n1. Felhasználóbarát felület: A Sötét módú Google Dokumentumok intuitív felületet biztosít a könnyű navigációhoz. A beállítások és testreszabási lehetőségek megtalálása gyerekjáték.\n2. Gyorsaság és hatékonyság: Bővítményünk teljesítményre van optimalizálva, így biztosítva, hogy nem lassítja a böngészőt vagy a Google Dokumentumokat, a sebesség csökkenése nélkül biztosítva a sötét témát.\n3. Rendszeres frissítések: A g docs black mode folyamatosan frissül, hogy lépést tartson a Google Dokumentumok változásaival, így biztosítva, hogy a sötét mód élménye mindig aktuális és működőképes maradjon.\n4. Responsive támogatás: Ha problémákkal találkozik vagy kérdései vannak, támogató csapatunk készséggel áll készen arra, hogy azonnal segítsen, és elkötelezett a zökkenőmentes élmény biztosítása mellett.\n5. Széles felhasználói bázis: A Google Doc dire módjának virágzó felhasználói közössége van, pozitív vélemények tanúsítják minőségét és megbízhatóságát. Csatlakozzon az elégedett felhasználók soraihoz, akik átalakították a Google Dokumentumok élményét.\n \n🎨 Testreszabás a stílusodnak megfelelően\n\nAz írási környezet személyre szabása a Sötét módú Google Dokumentumok egyik legfontosabb előnye. Testre szabhatja, amennyire csak kedve tartja:\n \nSötétségi szint: Állítsa be a sötétségi szintet az Ön preferenciáinak megfelelően, a gyengén halványtól a magával ragadó sötétségig.\nBetűtípus testreszabása: Válassza ki az írási stílusának megfelelő betűtípus stílusát, méretét és színét.\nHáttérbeállítások: Szabja a hátteret olyan színűre vagy textúrájúra, amely megfelel az esztétikájának.\nKiemelő színek: Válasszon akcentusszíneket a dokumentum egyes elemeinek kiemeléséhez.\n \n🌐 Kompatibilitás böngészők között\n\nAkár Chrome-ot, Firefoxot vagy más böngészőt használ, a Black Mode G Docs böngészők közötti kompatibilitásra lett tervezve. Élvezze a kényelmes és produktív sötét témát, függetlenül attól, hogy milyen böngészőt választ.\n\n🚀 Növelje a termelékenységét\n\nA Sötét módú Google Dokumentumok nem csak az esztétikáról szól, hanem a termelékenység fokozásáról és az írás élményének fokozásáról is:\n \nFókusz és koncentráció: A Dire téma minimalizálja a zavaró tényezőket, így megszakítások nélkül koncentrálhat a munkájára.\nCsökkentett szemterhelés: Szemei hálásak lesznek a csökkentett fényerőért, így a hosszú írási munkamenetek kényelmesebbé és kevésbé fárasztóvá válnak.\nEnergiahatékonyság: A Dark Mode G Docs használatával kíméli a szemét, és segít energiát takarékoskodni, csökkentve ezzel a szénlábnyomot.\n \n🌚 Összefoglalva\n\nA Sötét módú Google Dokumentumok a tökéletes Chrome-bővítmény mindazok számára, akik kényelmes, testreszabható és hatékony írási élményre vágynak. Egyetlen kattintással aktiválhatja, testre szabhatja a preferenciáinak megfelelően, és élvezheti a zavaró tényezők nélküli, szemkímélő környezetet. Csatlakozzon azon felhasználók elégedett közösségéhez, akik a Sötét módú G Doc-ot választották a kiváló Google Dokumentumok élményéért.\n\n🌙 Google docs sötét mód - Fokozza az írás élményét!\n\nFárasztónak találja a képernyő vakító vakító fényét a Google Dokumentumok munkája közben? Kényelmesebb és vizuálisan kellemesebb írási környezetre vágyik? Ne keressen tovább, mert a Google Dokumentumok sötét üzemmódja itt van, hogy átalakítsa az írás élményét.\n\nA Google Dokumentumok sötét üzemmódja a tökéletes Chrome-bővítmény azok számára, akik a dokumentumok készítése, szerkesztése vagy olvasása során a sötétebb, szemkímélőbb megjelenést részesítik előnyben. Ezzel a bővítménnyel zökkenőmentesen átállíthatja a Google Dokumentumok felületét egy elegáns és megnyugtató sötét témára, így az írási munkamenetek minden eddiginél élvezetesebbek lesznek. Mondjon búcsút a harsány fényerőnek, és üdvözölje a stílusos termelékenységet.\n\n🌟 A Google Dokumentumok sötét módjának főbb jellemzői\n\n1. Könnyed aktiválás: A Sötét módú Google Dokumentumok hihetetlenül könnyen használható. Egyetlen kattintással aktiválhatja a sötét témát a Google Dokumentumokhoz, így kényelmesebb és koncentráltabb írási környezetet hozhat létre.\n\n2. Testreszabási lehetőségek: Megértjük, hogy egy méret nem illik mindenkire. Ezért kínálunk különböző testreszabási lehetőségeket, amelyek lehetővé teszik, hogy a bővítményt a személyes preferenciáinak megfelelően alakítsa. Állítsa be a sötétségi szintet, a betűtípust és a hátteret a saját ízlése szerint.\n\n3. Megkíméli a szemét: A hosszú írási munkamenetek megviselhetik a szemét. A Dark Mode G Documents csökkenti a szem megterhelését, mivel egy gyengéd, sötét hátteret biztosít, amely kíméli a látását, így az írás élménye kényelmesebbé válik.\n\n4. Jobb fókuszálás: A sötét téma segít kiküszöbölni a zavaró tényezőket, és ott tartja a figyelmét, ahová való - az írásra. Nincs többé felesleges tükröződés vagy fényes képernyő, amely elvonja a figyelmét.\n\n5. Energiahatékonyság: A Google dokumentumok sötét módjának használata nem csak a szemének kedvez, hanem energiát is takarít meg, meghosszabbítva ezzel a készülék élettartamát és megtakarítva az áramköltségeket.\n \n🖥️ Kompatibilitás és akadálymentesítés: Sötét módú G Dokumentumok kompatibilis az összes főbb webböngészővel, és könnyen elérhető a PC-ken és asztali számítógépeken. Mostantól élvezheti a Google Dokumentumok sötét módját az Ön által preferált platformon.\n\n🌚 Hogyan lehet aktiválni a Google sötét módját, A Google Dokumentumok sötét módjának aktiválása gyerekjáték. Egyszerűen töltse le a bővítményt a Chrome Web Store-ból, és kattintson a Sötét mód Google Dokumentumok ikonra a böngészőben. A Google Dokumentumok oldala azonnal átvált a megnyugtató sötét témára, ami fokozza az írás élményét.\n\n📜 Miért van szükséged erre a bővítményre?\n\nGoogle Dokumentumok sötét mód: A Sötét mód G Dokumentumok a végleges megoldás arra, hogy sötét módot hozzon a Google Dokumentumodba, így biztosítva, hogy a szemed kényelmesen maradjon az írás közben.\nFokozott termelékenység: A fekete téma által biztosított, figyelemelterelés-mentes környezetnek köszönhetően koncentráltabb, hatékonyabb és produktívabb lesz az írási feladatai során.\n\nSzemvédelem: A fényes képernyőnek való tartós kitettség káros lehet a szemére. A Google Dokumentumok sötét mód a készülék által kibocsátott fény intenzitásának csökkentésével védi szemét.\n\nTestreszabási lehetőségek: Testre szabhatja a Fekete módú Google Dokumentumokat az Ön ízlésére. Állítsa be a sötét üzemmód beállításait, a betűtípusokat és a háttereket egyéni preferenciáinak megfelelően.\n\nCross-Browser kompatibilitás: Akár a Chrome-ot, a Firefoxot vagy más böngészőt részesíted előnyben, a Fekete módú Google Dokumentumok mindenhol kompatibilis, így a böngészőválasztástól függetlenül élvezheted a mód élményét.\n \n📚 GYIK:\n \n1. Hogyan állíthatom a Google Dokumentumokat holdfény nélküli módba ezzel a bővítménnyel? A Google Dokumentumok sötét módjának aktiválásához egyszerűen töltse le a bővítményt a Chrome Webáruházból, majd kattintson a Google dokumentumok sötét mód ikonjára a böngészőben.\n2. A Sötét üzemmódú G Dokumentumok elérhető asztali számítógépen is? Természetesen! A Sötét módú Google Dokumentumok mind a PC-k, mind az asztali számítógépek számára elérhető, így biztosítva, hogy az Ön által preferált platformon is kényelmes írási környezetet élvezhessen.\n3. Testreszabhatom a Sötét módú Google Dokumentumok megjelenését? Igen, beállíthatja! A Dark Mode Google Dokumentumok különböző testreszabási lehetőségeket kínál, így a bővítményt a személyes preferenciáihoz igazíthatja.\n4. A Google Dokumentumok rendelkezik natív sötét móddal? Sajnos a Google Dokumentumok nem kínál natív sötét módot." + } +} diff --git a/_locales/id/messages.json b/_locales/id/messages.json new file mode 100644 index 0000000..3f9354f --- /dev/null +++ b/_locales/id/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Tingkatkan efisiensi dengan Ekstensi Google Dokumen Mode Gelap kami. Rasakan pengalaman mode gelap Google Docs yang mulus untuk penulisan yang disempurnakan." + }, + "appName": { + "message": "Mode Gelap Google Dokumen" + }, + "storeDesc": { + "message": "🌟 Mengapa Memilih Mode Gelap Google Docs Ketimbang Pesaing?\n\nDengan banyaknya ekstensi Chrome yang menawarkan fungsionalitas mode gelap, Anda mungkin bertanya-tanya apa yang membuat Mode Gelap G Docs menjadi pilihan utama Anda. Mari kita telusuri mengapa Mode Gelap Google Docs lebih unggul:\n\n1. Antarmuka yang Mudah Digunakan: Mode Gelap Google Docs menyediakan antarmuka yang intuitif untuk navigasi yang mudah. Menemukan pengaturan dan opsi penyesuaian sangatlah mudah.\n2. Kecepatan dan Efisiensi: Ekstensi kami dioptimalkan untuk kinerja, memastikan tidak akan memperlambat browser atau Google Docs Anda, memberikan tema gelap tanpa mengorbankan kecepatan.\n3. Pembaruan Reguler: g docs mode gelap terus diperbarui untuk mengimbangi perubahan Google Docs, memastikan pengalaman mode gelap Anda tetap mutakhir dan fungsional.\n4. Dukungan Responsif: Jika Anda mengalami masalah atau memiliki pertanyaan, tim dukungan kami siap membantu dengan segera, berkomitmen untuk memastikan pengalaman yang lancar.\n5. Basis Pengguna yang Luas: Mode gelap google doc memiliki komunitas pengguna yang berkembang dengan ulasan positif yang membuktikan kualitas dan keandalannya. Bergabunglah dengan barisan pengguna yang puas yang telah mengubah pengalaman Google Docs mereka.\n \n🎨 Kustomisasi yang Sesuai dengan Gaya Anda\n\nMempersonalisasi lingkungan penulisan Anda adalah keunggulan utama Mode Gelap Google Dokumen. Sesuaikan dengan keinginan Anda:\n \nTingkat Kegelapan: Sesuaikan tingkat kegelapan agar sesuai dengan preferensi Anda, mulai dari redup lembut hingga gelap gulita.\nKustomisasi Font: Pilih gaya, ukuran, dan warna font yang sesuai dengan gaya penulisan Anda.\nOpsi Latar Belakang: Sesuaikan latar belakang dengan warna atau tekstur yang melengkapi estetika Anda.\nWarna Aksen: Pilih warna aksen untuk menyoroti elemen dokumen tertentu.\n \n🌐 Kompatibilitas di Semua Browser\n\nBaik Anda menggunakan Chrome, Firefox, atau browser lain, Mode Hitam G Docs dirancang untuk kompatibilitas lintas browser. Nikmati tema gelap yang nyaman dan produktif, apa pun pilihan browser web Anda.\n\n🚀 Tingkatkan Produktivitas Anda\n\nMode Gelap Google Docs bukan hanya tentang estetika; namun juga tentang meningkatkan produktivitas dan menyempurnakan pengalaman menulis Anda:\n \nFokus dan Konsentrasi: Tema Dire meminimalkan gangguan, sehingga Anda dapat berkonsentrasi pada pekerjaan tanpa gangguan.\nMengurangi Ketegangan Mata: Mata Anda akan berterima kasih atas kecerahan yang berkurang, membuat sesi menulis yang panjang menjadi lebih nyaman dan tidak melelahkan.\nEfisiensi Energi: Dengan menggunakan Mode Gelap G Docs, Anda menghemat mata dan membantu menghemat energi, sehingga mengurangi jejak karbon.\n \n🌚 Kesimpulan\n\nMode Gelap Google Docs adalah ekstensi Chrome terbaik bagi siapa saja yang mencari pengalaman menulis yang nyaman, dapat disesuaikan, dan efisien. Aktifkan dengan satu klik, sesuaikan dengan preferensi Anda, dan nikmati lingkungan bebas gangguan yang nyaman di mata Anda. Bergabunglah dengan komunitas pengguna yang puas yang menjadikan Mode Gelap G Doc sebagai pilihan utama untuk pengalaman Google Docs yang superior.\n\n🌙 Mode gelap Google docs - Tingkatkan Pengalaman Menulis Anda!\n\nApakah Anda merasa silau layar yang menyilaukan saat bekerja di Google Docs melelahkan? Apakah Anda mendambakan lingkungan menulis yang lebih nyaman dan menyenangkan secara visual? Tidak perlu mencari lagi karena Mode Gelap Google Docs hadir untuk mengubah pengalaman menulis Anda.\n\nMode gelap Google Docs adalah ekstensi Chrome terbaik bagi mereka yang lebih menyukai tampilan yang lebih gelap dan lebih ramah mata saat membuat, mengedit, atau membaca dokumen. Dengan ekstensi ini, Anda dapat dengan mudah mengganti antarmuka Google Docs ke tema gelap yang ramping dan menenangkan, membuat sesi menulis Anda lebih menyenangkan daripada sebelumnya. Ucapkan selamat tinggal pada kecerahan yang tajam dan sambutlah produktivitas dengan penuh gaya.\n\n🌟 Fitur Utama Mode Gelap Google Docs\n\n1. Aktivasi yang Mudah: Mode Gelap Google Docs sangat mudah digunakan. Hanya dengan sekali klik, Anda dapat mengaktifkan tema gelap untuk Google Doc Anda, menciptakan lingkungan penulisan yang lebih nyaman dan fokus.\n\n2. Opsi Kustomisasi: Kami memahami bahwa satu ukuran tidak cocok untuk semua. Itulah mengapa kami menawarkan berbagai opsi penyesuaian, yang memungkinkan Anda menyesuaikan ekstensi agar sesuai dengan preferensi pribadi Anda. Sesuaikan tingkat kegelapan, font, dan latar belakang sesuai keinginan Anda.\n\n3. Menyelamatkan Mata Anda: Sesi menulis yang lama dapat berdampak buruk pada mata Anda. Mode Gelap G Documents mengurangi ketegangan mata dengan memberikan latar belakang gelap yang lembut dan mudah dilihat, sehingga pengalaman menulis Anda lebih nyaman.\n\n4. Peningkatan Fokus: Tema gelap membantu menghilangkan gangguan dan menjaga perhatian Anda tetap pada tempatnya - pada tulisan Anda. Tidak ada lagi silau yang tidak perlu atau layar yang terang yang dapat mengalihkan fokus Anda.\n\n5. Efisiensi Energi: Menggunakan Mode Gelap pada dokumen Google tidak hanya menyehatkan mata Anda, tetapi juga menghemat energi, memperpanjang masa pakai perangkat, dan menghemat biaya listrik.\n \n🖥️ Kompatibilitas dan Aksesibilitas: Mode Gelap G Docs kompatibel dengan semua browser web utama dan tersedia di PC dan desktop. Kini, Anda dapat menikmati mode gelap Google Docs di platform pilihan Anda.\n\n🌚 Cara Mengaktifkan Mode Gelap Google, Mengaktifkan Mode Gelap Google Docs sangatlah mudah. Cukup unduh ekstensi dari Toko Web Chrome dan klik ikon Mode Gelap Google Docs di browser Anda. Halaman Google Documents Anda akan langsung beralih ke tema gelap yang menenangkan, meningkatkan pengalaman menulis Anda.\n\n📜 Mengapa Anda Membutuhkan Ekstensi ini?\n\nMode Gelap Google Documents: Mode Gelap G Docs adalah solusi pasti untuk menghadirkan mode gelap ke Google Doc Anda, memastikan mata Anda tetap nyaman selama sesi menulis.\nPeningkatan Produktivitas: Dengan lingkungan bebas gangguan yang disediakan oleh tema hitam, Anda akan menjadi lebih fokus, efisien, dan produktif dalam tugas menulis.\n\nPelindung Mata: Paparan layar yang terang dalam waktu lama dapat membahayakan mata Anda. Mode Gelap Google Dokumen melindungi mata Anda dengan mengurangi intensitas cahaya yang dipancarkan dari perangkat Anda.\n\nOpsi Kustomisasi: Sesuaikan Mode Gelap Google Dokumen sesuai keinginan Anda. Sesuaikan pengaturan mode gelap, font, dan latar belakang agar sesuai dengan preferensi Anda.\n\nKompatibilitas Lintas Browser: Baik Anda lebih suka Chrome, Firefox, atau browser lain, Google Docs Mode Redup kompatibel di semua browser, sehingga Anda dapat menikmati pengalaman mode apa pun pilihan browser Anda.\n \nPertanyaan yang Sering Diajukan:\n \n1. Bagaimana cara memasang Google Dokumen dalam mode tanpa cahaya dengan ekstensi ini? Untuk mengaktifkan Mode Gelap Google Dokumen, cukup unduh ekstensi dari Toko Web Chrome, lalu klik ikon Mode Gelap Google Dokumen di browser Anda.\n2. Apakah Mode Gelap Google Docs tersedia untuk desktop? Tentu saja! Mode Gelap Google Dokumen tersedia untuk PC dan desktop, sehingga Anda dapat menikmati lingkungan menulis yang nyaman di platform pilihan Anda.\n3. Dapatkah saya menyesuaikan tampilan Mode Gelap Google Dokumen? Ya, Anda bisa! Mode Gelap Google Dokumen menawarkan berbagai opsi penyesuaian, sehingga Anda dapat menyesuaikan ekstensi dengan preferensi pribadi Anda.\n4. Apakah Google Docs memiliki mode gelap asli? Sayangnya, Google Docs tidak menawarkan mode gelap asli." + } +} diff --git a/_locales/it/messages.json b/_locales/it/messages.json new file mode 100644 index 0000000..27bfa89 --- /dev/null +++ b/_locales/it/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Aumentate l'efficienza con la nostra estensione per Google Docs in modalità scura. Provate la modalità scura di Google Docs per migliorare la scrittura." + }, + "appName": { + "message": "Modalità scura di Google Docs" + }, + "storeDesc": { + "message": "🌟 Perché scegliere Google Docs in modalità scura rispetto ai concorrenti?\n\nCon numerose estensioni di Chrome che offrono funzionalità di modalità scura, ci si potrebbe chiedere che cosa rende G Docs in modalità scura la scelta migliore. Scopriamo perché la Modalità scura di Google Docs si distingue:\n\n1. Interfaccia facile da usare: Google Docs in modalità scura offre un'interfaccia intuitiva che facilita la navigazione. Trovare le impostazioni e le opzioni di personalizzazione è un gioco da ragazzi.\n2. Velocità ed efficienza: La nostra estensione è ottimizzata per le prestazioni e garantisce che non rallenti il browser o Google Docs, offrendo un tema scuro senza compromettere la velocità.\n3. Aggiornamenti regolari: g docs black mode si aggiorna continuamente per tenere il passo con i cambiamenti di Google Docs, assicurando che l'esperienza della modalità scura rimanga attuale e funzionale.\n4. Assistenza reattiva: In caso di problemi o domande, il nostro team di supporto è pronto ad assistere prontamente, impegnandosi a garantire un'esperienza senza problemi.\n5. Ampia base di utenti: google doc dire mode ha una fiorente comunità di utenti con recensioni positive che ne attestano la qualità e l'affidabilità. Unitevi alla schiera di utenti soddisfatti che hanno trasformato la loro esperienza con Google Docs.\n \n🎨 Personalizzazione per adattarsi al vostro stile\n\nLa personalizzazione dell'ambiente di scrittura è un vantaggio fondamentale di Google Docs in modalità scura. Personalizzate a vostro piacimento:\n \nLivello di oscurità: Regolate il livello di oscurità in base alle vostre preferenze, da una leggera penombra a un'oscurità coinvolgente.\nPersonalizzazione dei caratteri: Scegliete lo stile, la dimensione e il colore dei caratteri più adatti al vostro stile di scrittura.\nOpzioni di sfondo: Personalizzate lo sfondo con un colore o una texture che si adatti alla vostra estetica.\nColori d'accento: Selezionate i colori d'accento per evidenziare elementi specifici del documento.\n \n🌐 Compatibilità con tutti i browser\n\nChe si utilizzi Chrome, Firefox o un altro browser, la modalità nera di G Docs è progettata per la compatibilità cross-browser. Godetevi un tema scuro comodo e produttivo indipendentemente dalla scelta del vostro browser.\n\n🚀 Aumenta la produttività\n\nLa modalità scura di Google Docs non è solo una questione di estetica, ma anche di aumento della produttività e di miglioramento dell'esperienza di scrittura:\n \nConcentrazione e attenzione: Il tema Dire riduce al minimo le distrazioni, permettendovi di concentrarvi sul vostro lavoro senza interruzioni.\nRiduzione dell'affaticamento degli occhi: I vostri occhi vi ringrazieranno per la luminosità ridotta, che rende le lunghe sessioni di scrittura più confortevoli e meno faticose.\nEfficienza energetica: Utilizzando la modalità scura di G Docs, risparmiate i vostri occhi e contribuite a risparmiare energia, riducendo le emissioni di anidride carbonica.\n \n🌚 In conclusione\n\nLa Modalità scura di Google Docs è l'estensione Chrome definitiva per chi cerca un'esperienza di scrittura confortevole, personalizzabile ed efficiente. Attivatela con un solo clic, personalizzatela in base alle vostre preferenze e godetevi un ambiente privo di distrazioni e facile da vedere. Unitevi alla comunità di utenti soddisfatti che hanno fatto della Modalità scura di G Doc la loro scelta obbligata per un'esperienza di Google Docs superiore.\n\n🌙 Modalità scura di Google Docs - Migliora la tua esperienza di scrittura!\n\nTrovate fastidioso il bagliore accecante dello schermo mentre lavorate su Google Docs? Desiderate un ambiente di scrittura più confortevole e piacevole alla vista? Non cercate oltre, perché la modalità scura di Google Docs è qui per trasformare la vostra esperienza di scrittura.\n\nLa modalità scura di Google Docs è l'ultima estensione di Chrome per coloro che preferiscono un aspetto più scuro e gradevole alla vista quando creano, modificano o leggono documenti. Con questa estensione è possibile passare dall'interfaccia di Google Docs a un elegante e rilassante tema scuro, rendendo le sessioni di scrittura più piacevoli che mai. Dite addio alla luminosità eccessiva e date il benvenuto alla produttività con stile.\n\nCaratteristiche principali della modalità scura di Google Docs\n\n1. Attivazione semplice: Google Docs in modalità scura è incredibilmente facile da usare. Con un solo clic, è possibile attivare il tema scuro per il proprio Google Doc, creando un ambiente di scrittura più confortevole e concentrato.\n\n2. Opzioni di personalizzazione: Sappiamo che una taglia non va bene per tutti. Ecco perché offriamo diverse opzioni di personalizzazione, che consentono di adattare l'estensione alle proprie preferenze personali. Regolate il livello di oscurità, il carattere e lo sfondo a vostro piacimento.\n\n3. Salva gli occhi: lunghe sessioni di scrittura possono affaticare gli occhi. La modalità scura di G Documents riduce l'affaticamento degli occhi fornendo uno sfondo scuro e delicato che non affatica la vista, rendendo l'esperienza di scrittura più confortevole.\n\n4. Miglioramento della concentrazione: Il tema scuro aiuta a eliminare le distrazioni e a mantenere l'attenzione sulla scrittura. Niente più riflessi inutili o schermi luminosi che distolgono l'attenzione.\n\n5. Efficienza energetica: L'utilizzo della modalità scura dei documenti di Google non solo è utile per i vostri occhi, ma consente anche di risparmiare energia, prolungando la vita del vostro dispositivo e risparmiando sui costi dell'elettricità.\n \n🖥️ Compatibilità e accessibilità: G Docs in modalità scura è compatibile con tutti i principali browser web ed è facilmente disponibile su PC e desktop. Ora potete usufruire della modalità scura di Google Docs sulla vostra piattaforma preferita.\n\n🌚 Come attivare la modalità scura di Google, Attivare la modalità scura di Google Docs è un gioco da ragazzi. È sufficiente scaricare l'estensione dal Chrome Web Store e fare clic sull'icona della modalità scura di Google Docs nel browser. La pagina di Google Documenti passerà immediatamente al rilassante tema scuro, migliorando la vostra esperienza di scrittura.\n\nPerché avete bisogno di questa estensione?\n\nModalità scura di Google Documenti: Dark Mode G Docs è la soluzione definitiva per portare la modalità scura nei vostri Google Doc, assicurando che i vostri occhi rimangano tranquilli durante le vostre sessioni di scrittura.\nMaggiore produttività: Grazie all'ambiente privo di distrazioni offerto dal tema nero, sarete più concentrati, efficienti e produttivi nelle vostre attività di scrittura.\n\nProtezione degli occhi: L'esposizione prolungata a uno schermo luminoso può essere dannosa per gli occhi. La modalità scura di Google Documenti protegge gli occhi riducendo l'intensità della luce emessa dal dispositivo.\n\nOpzioni di personalizzazione: Adattate la Modalità scura di Google Documenti ai vostri gusti. Regolate le impostazioni della modalità scura, i caratteri e gli sfondi in base alle vostre preferenze individuali.\n\nCompatibilità cross-browser: Che preferiate Chrome, Firefox o un altro browser, la modalità oscura di Google Docs è compatibile con tutti i browser, in modo che possiate godere dell'esperienza della modalità indipendentemente dalla vostra scelta di browser.\n \n📚 FAQ:\n \n1. Come faccio a mettere Google Docs in modalità senza luna con questa estensione? Per attivare la modalità scura di Google Docs, è sufficiente scaricare l'estensione dal Chrome Web Store, quindi fare clic sull'icona della modalità scura di Google Documenti nel browser.\n2. La modalità scura di G Docs è disponibile per il desktop? Assolutamente sì! La modalità scura di Google Docs è disponibile sia per i PC che per i desktop, per garantire un ambiente di scrittura confortevole sulla piattaforma preferita.\n3. Posso personalizzare l'aspetto di Google Docs in modalità scura? Sì, è possibile! La Modalità scura di Google Docs offre diverse opzioni di personalizzazione che consentono di adattare l'estensione alle proprie preferenze personali.\n4. Google Docs ha una modalità scura nativa? Purtroppo Google Docs non offre una modalità scura nativa." + } +} diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json new file mode 100644 index 0000000..d0f4171 --- /dev/null +++ b/_locales/ja/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "ダークモード Google ドキュメント拡張機能で作業効率をアップ。シームレスな Google ドキュメントのダークモードを体験してください。" + }, + "appName": { + "message": "ダークモードGoogleドキュメント" + }, + "storeDesc": { + "message": "なぜダークモードのGoogleドキュメントを選ぶのか?\n\n数多くのChromeエクステンションがダークモード機能を提供している中、ダークモードGoogleドキュメントを選ぶ理由は何なのでしょうか?ダークモード Google ドキュメントが際立つ理由を探ってみましょう:\n\n1.ユーザーフレンドリーなインターフェイス:ダークモードGoogleドキュメントは直感的なインターフェイスで簡単に操作できます。設定やカスタマイズオプションを簡単に見つけることができます。\n2.スピードと効率性:Google ドキュメントのダークモードは、ブラウザや Google ドキュメントの速度を低下させることなく、パフォーマンスを最適化します。\n3.定期的な更新: g docs black mode は Google ドキュメントの変更に合わせて継続的に更新されるため、ダークモードでの使用は最新かつ機能的なものになります。\n4.迅速なサポート:問題が発生した場合やご質問がある場合は、サポートチームが迅速に対応し、スムーズな利用をお約束します。\n5.幅広いユーザーベース:google doc dire modeは、その品質と信頼性を証明する肯定的なレビューを持つ盛んなユーザーコミュニティを持っています。Google Docsの経験を一変させた満足したユーザーの仲間入りをしましょう。\n \n🎨 スタイルに合わせたカスタマイズ\n\nダークモードGoogleドキュメントの主な利点は、あなたの執筆環境をパーソナライズすることです。思いのままにカスタマイズしましょう:\n \n暗さレベル:穏やかな薄暗さから没入感のある暗さまで、好みに合わせて暗さのレベルを調整できます。\nフォントのカスタマイズ:あなたの書き方に合ったフォントのスタイル、サイズ、色をお選びください。\n背景オプション:あなたの美的感覚を引き立てる色やテクスチャーに背景を調整できます。\nアクセントカラー:特定の文書要素を強調するアクセントカラーを選択できます。\n \n🌐 ブラウザ間の互換性\n\nChrome、Firefox、その他のブラウザのいずれを使用していても、Black Mode G Docsはクロスブラウザ互換のために設計されています。ブラウザの種類に関係なく、快適で生産的なダークテーマをお楽しみください。\n\n🚀 生産性を高める\n\nGoogleドキュメントのダークモードは、美しさだけでなく、生産性を高め、執筆体験を向上させます:\n \n集中力と集中力:集中力と集中力:Direテーマは、気が散るのを最小限に抑え、邪魔されることなく作業に集中できます。\n眼精疲労の軽減:明るさを抑えたことで、長時間の執筆作業でも疲れにくく、快適です。\nエネルギー効率:ダークモードのG Docsを使用することで、目を保護し、エネルギーを節約し、二酸化炭素排出量を削減します。\n \n🌚 まとめ\n\nDark Mode Google ドキュメントは、快適でカスタマイズ可能、かつ効率的なライティング体験を求める人にとって究極の Chrome 拡張機能です。ワンクリックで有効にし、お好みに合わせてカスタマイズして、目に優しく、気が散らない環境をお楽しみください。ダークモード G ドキュメントを Google ドキュメントをより快適に利用するための最適な選択肢としている、満足度の高いユーザー コミュニティに参加しましょう。\n\n🌙 Google ドキュメントのダークモード - 執筆体験を向上させます!\n\nGoogle ドキュメントでの作業中、画面のまぶしさにうんざりしていませんか?もっと快適で視覚的に楽しいライティング環境に憧れませんか?Googleドキュメントのダークモードが、あなたのライティング体験を一変させます。\n\nGoogle ドキュメントのダークモードは、文書を作成、編集、閲覧する際に、より暗く、より目に優しい外観を好む人のための究極の Chrome 拡張機能です。この拡張機能を使えば、Google ドキュメントのインターフェイスをシームレスに滑らかで落ち着きのあるダークテーマに切り替えることができ、文章を書く作業がこれまで以上に楽しくなります。厳しい明るさにサヨナラして、スタイリッシュな生産性を手に入れましょう。\n\nダークモードGoogleドキュメントの主な機能\n\n1.簡単なアクティベーション:ダークモードのGoogleドキュメントは驚くほど簡単に使用できます。ワンクリックでGoogleドキュメントのダークテーマを有効にし、より快適で集中できる執筆環境を作ることができます。\n\n2.カスタマイズオプション:1つのサイズですべての人にフィットするわけではないことを私たちは理解しています。そのため、様々なカスタマイズオプションを提供しており、個人の好みに合わせて拡張機能を調整することができます。暗さ、フォント、背景をお好みに合わせて調整できます。\n\n3.目の負担を軽減: 長時間の文章作成は目に負担をかけます。Dark Mode G Documentsは、視覚に優しい暗い背景を提供することで、目の疲れを軽減し、より快適な執筆体験を実現します。\n\n4.集中力の向上:ダークテーマは、気が散るものを排除し、本来あるべき場所、つまり執筆に注意を向けさせます。不要なまぶしさや、集中力を削ぐような明るい画面はもう必要ありません。\n\n5.エネルギー効率:ダークモードのGoogleドキュメントを使用すると、目に良いだけでなく、エネルギーを節約し、デバイスの寿命を延ばし、電気代を節約することができます。\n \n🖥️ 互換性とアクセシビリティ:ダークモードのGドキュメントは、すべての主要なウェブブラウザと互換性があり、PCやデスクトップですぐに利用できます。Googleドキュメントのダークモードをお好みのプラットフォームでお楽しみいただけます。\n\nブラックモードを有効にする方法 🌚 薄暗いモードのGoogleドキュメントを有効にするのは簡単です。Chrome ウェブストアから拡張機能をダウンロードし、ブラウザでダーク モード Google ドキュメントのアイコンをクリックするだけです。Googleドキュメントのページが瞬時に落ち着きのあるダークテーマに切り替わり、文章作成がより快適になります。\n\n📜 なぜこの拡張機能が必要なのか?\n\nGoogle ドキュメント ダークモード:ダークモード G ドキュメントは、Google ドキュメントにダークモードを導入する決定的なソリューションです。\n生産性の向上:黒いテーマが提供する気が散らない環境で、執筆作業に集中し、効率的で生産的な作業ができます。\n\n目の保護:明るい画面を長時間見ていると、目に悪影響を及ぼすことがあります。Googleドキュメントのダークモードは、デバイスから発せられる光の強度を下げることで、目を保護します。\n\nカスタマイズ オプション:ブラックモード Google ドキュメントをお好みに合わせてカスタマイズできます。ダークモードの設定、フォント、背景を個人の好みに合わせて調整できます。\n\nクロスブラウザ互換性:Chrome、Firefox、その他のブラウザのいずれでも、ダークモードGoogleドキュメントには互換性があります。\n \n📚 FAQ:\n \n1.この拡張機能でGoogleドキュメントをムーンレスモードにする方法を教えてください。ダーク モード Google ドキュメントを有効にするには、Chrome ウェブストアから拡張機能をダウンロードし、ブラウザで Google ドキュメントのダーク モード アイコンをクリックします。\n2.ダークモードGoogleドキュメントはデスクトップでも使えますか?もちろんです!ダークモードのGoogleドキュメントはPCでもデスクトップでもご利用いただけますので、お好みのプラットフォームで快適な執筆環境をお楽しみいただけます。\n3.ダークモード Google ドキュメントの外観をカスタマイズできますか?はい、できます!ダークモード Google ドキュメントには様々なカスタマイズオプションがあり、個人の好みに合わせて拡張機能を調整することができます。\n4.Googleドキュメントにダークモードはありますか?残念ながら、Googleドキュメントにはネイティブのダークモードはありません。" + } +} diff --git a/_locales/kn/messages.json b/_locales/kn/messages.json new file mode 100644 index 0000000..2f35f59 --- /dev/null +++ b/_locales/kn/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "ನಮ್ಮ ಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಸ್ ವಿಸ್ತರಣೆಯೊಂದಿಗೆ ದಕ್ಷತೆಯನ್ನು ಹೆಚ್ಚಿಸಿ. ವರ್ಧಿತ ಬರವಣಿಗೆಗಾಗಿ ತಡೆರಹಿತ Google ಡಾಕ್ಸ್ ಡಾರ್ಕ್ ಮೋಡ್ ಅನ್ನು ಅನುಭವಿಸಿ." + }, + "appName": { + "message": "ಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಸ್" + }, + "storeDesc": { + "message": "🌟 ಸ್ಪರ್ಧಿಗಳಿಗಿಂತ ಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಸ್ ಅನ್ನು ಏಕೆ ಆರಿಸಬೇಕು?\n\nಡಾರ್ಕ್ ಮೋಡ್ ಕಾರ್ಯವನ್ನು ಒದಗಿಸುವ ಹಲವಾರು Chrome ವಿಸ್ತರಣೆಗಳೊಂದಿಗೆ, ಡಾರ್ಕ್ ಮೋಡ್ ಜಿ ಡಾಕ್ಸ್ ಅನ್ನು ನಿಮ್ಮ ಉನ್ನತ ಆಯ್ಕೆಯನ್ನಾಗಿ ಮಾಡುವುದು ನಿಮಗೆ ಆಶ್ಚರ್ಯವಾಗಬಹುದು. ಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಸ್ ಏಕೆ ಎದ್ದು ಕಾಣುತ್ತದೆ ಎಂಬುದನ್ನು ಅನ್ವೇಷಿಸೋಣ:\n\n1. ಬಳಕೆದಾರ ಸ್ನೇಹಿ ಇಂಟರ್ಫೇಸ್: ಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಸ್ ಸುಲಭ ನ್ಯಾವಿಗೇಷನ್‌ಗಾಗಿ ಅರ್ಥಗರ್ಭಿತ ಇಂಟರ್ಫೇಸ್ ಅನ್ನು ಒದಗಿಸುತ್ತದೆ. ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ಗ್ರಾಹಕೀಕರಣ ಆಯ್ಕೆಗಳನ್ನು ಹುಡುಕುವುದು ತಂಗಾಳಿಯಾಗಿದೆ.\n2. ವೇಗ ಮತ್ತು ದಕ್ಷತೆ: ನಮ್ಮ ವಿಸ್ತರಣೆಯನ್ನು ಕಾರ್ಯಕ್ಷಮತೆಗಾಗಿ ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗಿದೆ, ಇದು ನಿಮ್ಮ ಬ್ರೌಸರ್ ಅಥವಾ Google ಡಾಕ್ಸ್ ಅನ್ನು ನಿಧಾನಗೊಳಿಸುವುದಿಲ್ಲ ಎಂದು ಖಚಿತಪಡಿಸುತ್ತದೆ, ವೇಗವನ್ನು ರಾಜಿ ಮಾಡಿಕೊಳ್ಳದೆ ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ನೀಡುತ್ತದೆ.\n3. ನಿಯಮಿತ ಅಪ್‌ಡೇಟ್‌ಗಳು: ನಿಮ್ಮ ಡಾರ್ಕ್ ಮೋಡ್ ಅನುಭವವು ಪ್ರಸ್ತುತ ಮತ್ತು ಕ್ರಿಯಾತ್ಮಕವಾಗಿರುತ್ತದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು, Google ಡಾಕ್ಸ್‌ನ ಬದಲಾವಣೆಗಳೊಂದಿಗೆ ವೇಗವನ್ನು ಉಳಿಸಿಕೊಳ್ಳಲು g ಡಾಕ್ಸ್ ಕಪ್ಪು ಮೋಡ್ ನಿರಂತರವಾಗಿ ನವೀಕರಿಸುತ್ತದೆ.\n4. ರೆಸ್ಪಾನ್ಸಿವ್ ಬೆಂಬಲ: ನೀವು ಸಮಸ್ಯೆಗಳನ್ನು ಎದುರಿಸಿದರೆ ಅಥವಾ ಪ್ರಶ್ನೆಗಳನ್ನು ಹೊಂದಿದ್ದರೆ, ನಮ್ಮ ಬೆಂಬಲ ತಂಡವು ತ್ವರಿತವಾಗಿ ಸಹಾಯ ಮಾಡಲು ಸಿದ್ಧವಾಗಿದೆ, ಸುಗಮ ಅನುಭವವನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಬದ್ಧವಾಗಿದೆ.\n5. ವ್ಯಾಪಕ ಬಳಕೆದಾರ ಬೇಸ್: google ಡಾಕ್ ಡೈರ್ ಮೋಡ್ ಅದರ ಗುಣಮಟ್ಟ ಮತ್ತು ವಿಶ್ವಾಸಾರ್ಹತೆಯನ್ನು ದೃಢೀಕರಿಸುವ ಧನಾತ್ಮಕ ವಿಮರ್ಶೆಗಳೊಂದಿಗೆ ಅಭಿವೃದ್ಧಿ ಹೊಂದುತ್ತಿರುವ ಬಳಕೆದಾರರ ಸಮುದಾಯವನ್ನು ಹೊಂದಿದೆ. ತಮ್ಮ Google ಡಾಕ್ಸ್ ಅನುಭವವನ್ನು ಪರಿವರ್ತಿಸಿದ ತೃಪ್ತ ಬಳಕೆದಾರರ ಶ್ರೇಣಿಗೆ ಸೇರಿ.\n \n🎨 ನಿಮ್ಮ ಶೈಲಿಗೆ ಸರಿಹೊಂದುವಂತೆ ಗ್ರಾಹಕೀಕರಣ\n\nನಿಮ್ಮ ಬರವಣಿಗೆಯ ಪರಿಸರವನ್ನು ವೈಯಕ್ತೀಕರಿಸುವುದು ಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಸ್‌ನ ಪ್ರಮುಖ ಪ್ರಯೋಜನವಾಗಿದೆ. ನಿಮ್ಮ ಹೃದಯದ ವಿಷಯಕ್ಕೆ ಕಸ್ಟಮೈಸ್ ಮಾಡಿ:\n \nಡಾರ್ಕ್ನೆಸ್ ಮಟ್ಟ: ನಿಮ್ಮ ಆದ್ಯತೆಗೆ ಹೊಂದಿಸಲು ಡಾರ್ಕ್ನೆಸ್ ಮಟ್ಟವನ್ನು ಹೊಂದಿಸಿ, ಸೌಮ್ಯವಾದ ಮಂದದಿಂದ ತಲ್ಲೀನಗೊಳಿಸುವ ಕತ್ತಲೆಗೆ.\nಫಾಂಟ್ ಗ್ರಾಹಕೀಕರಣ: ನಿಮ್ಮ ಬರವಣಿಗೆ ಶೈಲಿಗೆ ಸರಿಹೊಂದುವ ಫಾಂಟ್ ಶೈಲಿ, ಗಾತ್ರ ಮತ್ತು ಬಣ್ಣವನ್ನು ಆರಿಸಿ.\nಹಿನ್ನೆಲೆ ಆಯ್ಕೆಗಳು: ನಿಮ್ಮ ಸೌಂದರ್ಯಕ್ಕೆ ಪೂರಕವಾಗಿರುವ ಬಣ್ಣ ಅಥವಾ ವಿನ್ಯಾಸಕ್ಕೆ ಹಿನ್ನೆಲೆಯನ್ನು ಹೊಂದಿಸಿ.\nಉಚ್ಚಾರಣಾ ಬಣ್ಣಗಳು: ನಿರ್ದಿಷ್ಟ ಡಾಕ್ಯುಮೆಂಟ್ ಅಂಶಗಳನ್ನು ಹೈಲೈಟ್ ಮಾಡಲು ಉಚ್ಚಾರಣಾ ಬಣ್ಣಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ.\n \n🌐 ಬ್ರೌಸರ್‌ಗಳಾದ್ಯಂತ ಹೊಂದಾಣಿಕೆ\n\nನೀವು Chrome, Firefox ಅಥವಾ ಇನ್ನೊಂದು ಬ್ರೌಸರ್ ಅನ್ನು ಬಳಸುತ್ತಿರಲಿ, Black Mode G ಡಾಕ್ಸ್ ಅನ್ನು ಕ್ರಾಸ್-ಬ್ರೌಸರ್ ಹೊಂದಾಣಿಕೆಗಾಗಿ ವಿನ್ಯಾಸಗೊಳಿಸಲಾಗಿದೆ. ನಿಮ್ಮ ವೆಬ್ ಬ್ರೌಸರ್ ಆಯ್ಕೆಯನ್ನು ಲೆಕ್ಕಿಸದೆ ಆರಾಮದಾಯಕ ಮತ್ತು ಉತ್ಪಾದಕ ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಆನಂದಿಸಿ.\n\n🚀 ನಿಮ್ಮ ಉತ್ಪಾದಕತೆಯನ್ನು ಹೆಚ್ಚಿಸಿ\n\nಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಸ್ ಕೇವಲ ಸೌಂದರ್ಯದ ಬಗ್ಗೆ ಅಲ್ಲ; ಇದು ಉತ್ಪಾದಕತೆಯನ್ನು ಹೆಚ್ಚಿಸುವುದು ಮತ್ತು ನಿಮ್ಮ ಬರವಣಿಗೆಯ ಅನುಭವವನ್ನು ಹೆಚ್ಚಿಸುವುದು:\n \nಗಮನ ಮತ್ತು ಏಕಾಗ್ರತೆ: ಡೈರ್ ಥೀಮ್ ಗೊಂದಲವನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ, ಅಡೆತಡೆಗಳಿಲ್ಲದೆ ನಿಮ್ಮ ಕೆಲಸದ ಮೇಲೆ ಕೇಂದ್ರೀಕರಿಸಲು ನಿಮಗೆ ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ.\nಕಡಿಮೆಯಾದ ಕಣ್ಣಿನ ಆಯಾಸ: ಕಡಿಮೆಯಾದ ಹೊಳಪಿಗಾಗಿ ನಿಮ್ಮ ಕಣ್ಣುಗಳು ನಿಮಗೆ ಧನ್ಯವಾದ ಹೇಳುತ್ತವೆ, ದೀರ್ಘ ಬರವಣಿಗೆ ಅವಧಿಗಳನ್ನು ಹೆಚ್ಚು ಆರಾಮದಾಯಕ ಮತ್ತು ಕಡಿಮೆ ಆಯಾಸಗೊಳಿಸುತ್ತವೆ.\nಶಕ್ತಿ ದಕ್ಷತೆ: ಡಾರ್ಕ್ ಮೋಡ್ ಜಿ ಡಾಕ್ಸ್ ಅನ್ನು ಬಳಸುವ ಮೂಲಕ, ನೀವು ನಿಮ್ಮ ಕಣ್ಣುಗಳನ್ನು ಉಳಿಸುತ್ತೀರಿ ಮತ್ತು ಶಕ್ತಿಯನ್ನು ಉಳಿಸಲು ಸಹಾಯ ಮಾಡುತ್ತೀರಿ, ನಿಮ್ಮ ಇಂಗಾಲದ ಹೆಜ್ಜೆಗುರುತನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತೀರಿ.\n \n🌚 ತೀರ್ಮಾನದಲ್ಲಿ\n\nಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಸ್ ಆರಾಮದಾಯಕ, ಗ್ರಾಹಕೀಯಗೊಳಿಸಬಹುದಾದ ಮತ್ತು ಪರಿಣಾಮಕಾರಿ ಬರವಣಿಗೆಯ ಅನುಭವವನ್ನು ಬಯಸುವ ಯಾರಿಗಾದರೂ ಅಂತಿಮ Chrome ವಿಸ್ತರಣೆಯಾಗಿದೆ. ಒಂದೇ ಕ್ಲಿಕ್‌ನಲ್ಲಿ ಅದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ, ಅದನ್ನು ನಿಮ್ಮ ಆದ್ಯತೆಗಳಿಗೆ ಕಸ್ಟಮೈಸ್ ಮಾಡಿ ಮತ್ತು ನಿಮ್ಮ ದೃಷ್ಟಿಗೆ ಸುಲಭವಾದ ವ್ಯಾಕುಲತೆ-ಮುಕ್ತ ಪರಿಸರವನ್ನು ಆನಂದಿಸಿ. ಉತ್ತಮವಾದ Google ಡಾಕ್ಸ್ ಅನುಭವಕ್ಕಾಗಿ ಡಾರ್ಕ್ ಮೋಡ್ ಜಿ ಡಾಕ್ ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿಕೊಂಡಿರುವ ಬಳಕೆದಾರರ ತೃಪ್ತ ಸಮುದಾಯವನ್ನು ಸೇರಿ.\n\n🌙 Google ಡಾಕ್ಸ್ ಡಾರ್ಕ್ ಮೋಡ್ - ನಿಮ್ಮ ಬರವಣಿಗೆಯ ಅನುಭವವನ್ನು ಹೆಚ್ಚಿಸಿ!\n\nGoogle ಡಾಕ್ಸ್‌ನಲ್ಲಿ ಕೆಲಸ ಮಾಡುವಾಗ ನಿಮ್ಮ ಪರದೆಯ ಕುರುಡು ಪ್ರಜ್ವಲಿಸುವಿಕೆಯನ್ನು ನೀವು ಕಂಡುಕೊಂಡಿದ್ದೀರಾ? ನೀವು ಹೆಚ್ಚು ಆರಾಮದಾಯಕ ಮತ್ತು ದೃಷ್ಟಿಗೆ ಆಹ್ಲಾದಕರ ಬರವಣಿಗೆಯ ವಾತಾವರಣಕ್ಕಾಗಿ ಹಂಬಲಿಸುತ್ತಿದ್ದೀರಾ? ನಿಮ್ಮ ಬರವಣಿಗೆಯ ಅನುಭವವನ್ನು ಪರಿವರ್ತಿಸಲು ಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಸ್ ಇಲ್ಲಿದೆ.\n\nGoogle ಡಾಕ್ಸ್ ಡಾರ್ಕ್ ಮೋಡ್ ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳನ್ನು ರಚಿಸುವಾಗ, ಎಡಿಟ್ ಮಾಡುವಾಗ ಅಥವಾ ಓದುವಾಗ ಗಾಢವಾದ, ಹೆಚ್ಚು ಕಣ್ಣಿನ ಸ್ನೇಹಿ ನೋಟವನ್ನು ಆದ್ಯತೆ ನೀಡುವವರಿಗೆ ಅಂತಿಮ Chrome ವಿಸ್ತರಣೆಯಾಗಿದೆ. ಈ ವಿಸ್ತರಣೆಯೊಂದಿಗೆ, ನೀವು ಮನಬಂದಂತೆ ನಿಮ್ಮ Google ಡಾಕ್ಸ್ ಇಂಟರ್ಫೇಸ್ ಅನ್ನು ನಯವಾದ ಮತ್ತು ಹಿತವಾದ ಡಾರ್ಕ್ ಥೀಮ್‌ಗೆ ಬದಲಾಯಿಸಬಹುದು, ನಿಮ್ಮ ಬರವಣಿಗೆ ಅವಧಿಗಳನ್ನು ಹಿಂದೆಂದಿಗಿಂತಲೂ ಹೆಚ್ಚು ಆನಂದದಾಯಕವಾಗಿಸುತ್ತದೆ. ಕಠಿಣ ಹೊಳಪಿಗೆ ವಿದಾಯ ಹೇಳಿ ಮತ್ತು ಶೈಲಿಯಲ್ಲಿ ಉತ್ಪಾದಕತೆಗೆ ಹಲೋ.\n\n🌟 ಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಸ್‌ನ ಪ್ರಮುಖ ವೈಶಿಷ್ಟ್ಯಗಳು\n\n1. ಪ್ರಯತ್ನವಿಲ್ಲದ ಸಕ್ರಿಯಗೊಳಿಸುವಿಕೆ: ಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಸ್ ಅನ್ನು ಬಳಸಲು ನಂಬಲಾಗದಷ್ಟು ಸುಲಭವಾಗಿದೆ. ಕೇವಲ ಒಂದೇ ಕ್ಲಿಕ್‌ನಲ್ಲಿ, ನಿಮ್ಮ Google ಡಾಕ್‌ಗಾಗಿ ನೀವು ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬಹುದು, ಹೆಚ್ಚು ಆರಾಮದಾಯಕ ಮತ್ತು ಕೇಂದ್ರೀಕೃತ ಬರವಣಿಗೆಯ ವಾತಾವರಣವನ್ನು ರಚಿಸಬಹುದು.\n\n2. ಗ್ರಾಹಕೀಕರಣ ಆಯ್ಕೆಗಳು: ಒಂದು ಗಾತ್ರವು ಎಲ್ಲರಿಗೂ ಸರಿಹೊಂದುವುದಿಲ್ಲ ಎಂದು ನಾವು ಅರ್ಥಮಾಡಿಕೊಂಡಿದ್ದೇವೆ. ಅದಕ್ಕಾಗಿಯೇ ನಾವು ವಿವಿಧ ಗ್ರಾಹಕೀಕರಣ ಆಯ್ಕೆಗಳನ್ನು ನೀಡುತ್ತೇವೆ, ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಆದ್ಯತೆಗಳಿಗೆ ಹೊಂದಿಸಲು ವಿಸ್ತರಣೆಯನ್ನು ತಿರುಚಲು ನಿಮಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಕತ್ತಲೆಯ ಮಟ್ಟ, ಫಾಂಟ್ ಮತ್ತು ಹಿನ್ನೆಲೆಯನ್ನು ನಿಮ್ಮ ಇಚ್ಛೆಯಂತೆ ಹೊಂದಿಸಿ.\n\n3. ನಿಮ್ಮ ಕಣ್ಣುಗಳನ್ನು ಉಳಿಸುತ್ತದೆ: ದೀರ್ಘ ಬರವಣಿಗೆ ಅವಧಿಗಳು ನಿಮ್ಮ ಕಣ್ಣುಗಳ ಮೇಲೆ ಟೋಲ್ ತೆಗೆದುಕೊಳ್ಳಬಹುದು. ಡಾರ್ಕ್ ಮೋಡ್ ಜಿ ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳು ನಿಮ್ಮ ದೃಷ್ಟಿಗೆ ಸುಲಭವಾದ ಮೃದುವಾದ, ಗಾಢವಾದ ಹಿನ್ನೆಲೆಯನ್ನು ಒದಗಿಸುವ ಮೂಲಕ ಕಣ್ಣಿನ ಆಯಾಸವನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ, ನಿಮ್ಮ ಬರವಣಿಗೆಯ ಅನುಭವವನ್ನು ಹೆಚ್ಚು ಆರಾಮದಾಯಕವಾಗಿಸುತ್ತದೆ.\n\n4. ಸುಧಾರಿತ ಫೋಕಸ್: ಡಾರ್ಕ್ ಥೀಮ್ ಗೊಂದಲವನ್ನು ತೊಡೆದುಹಾಕಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ ಮತ್ತು ನಿಮ್ಮ ಬರವಣಿಗೆಯ ಮೇಲೆ ನಿಮ್ಮ ಗಮನವನ್ನು ಇರಿಸುತ್ತದೆ. ನಿಮ್ಮ ಗಮನವನ್ನು ದೂರ ಎಳೆಯಲು ಅನಗತ್ಯ ಪ್ರಜ್ವಲಿಸುವಿಕೆ ಅಥವಾ ಪ್ರಕಾಶಮಾನವಾದ ಪರದೆಗಳಿಲ್ಲ.\n\n5. ಶಕ್ತಿಯ ದಕ್ಷತೆ: ಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳನ್ನು ಬಳಸುವುದು ನಿಮ್ಮ ಕಣ್ಣುಗಳಿಗೆ ಪ್ರಯೋಜನವನ್ನು ನೀಡುತ್ತದೆ ಆದರೆ ಶಕ್ತಿಯನ್ನು ಉಳಿಸುತ್ತದೆ, ನಿಮ್ಮ ಸಾಧನದ ಜೀವನವನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ ಮತ್ತು ವಿದ್ಯುತ್ ವೆಚ್ಚವನ್ನು ಉಳಿಸುತ್ತದೆ.\n \n🖥️ ಹೊಂದಾಣಿಕೆ ಮತ್ತು ಪ್ರವೇಶಿಸುವಿಕೆ: ಡಾರ್ಕ್ ಮೋಡ್ G ಡಾಕ್ಸ್ ಎಲ್ಲಾ ಪ್ರಮುಖ ವೆಬ್ ಬ್ರೌಸರ್‌ಗಳೊಂದಿಗೆ ಹೊಂದಿಕೊಳ್ಳುತ್ತದೆ ಮತ್ತು PC ಗಳು ಮತ್ತು ಡೆಸ್ಕ್‌ಟಾಪ್‌ಗಳಲ್ಲಿ ಸುಲಭವಾಗಿ ಲಭ್ಯವಿದೆ. ಈಗ, ನಿಮ್ಮ ಆದ್ಯತೆಯ ಪ್ಲಾಟ್‌ಫಾರ್ಮ್‌ನಲ್ಲಿ ನೀವು Google ಡಾಕ್ಸ್ ಡಾರ್ಕ್ ಮೋಡ್ ಅನ್ನು ಆನಂದಿಸಬಹುದು.\n\n🌚 ಬ್ಲ್ಯಾಕ್ ಮೋಡ್ ಗೂಗಲ್ ಅನ್ನು ಹೇಗೆ ಸಕ್ರಿಯಗೊಳಿಸುವುದು, ಡಿಮ್ ಮೋಡ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದು ಗೂಗಲ್ ಡಾಕ್ಸ್ ಒಂದು ತಂಗಾಳಿಯಾಗಿದೆ. Chrome ವೆಬ್ ಸ್ಟೋರ್‌ನಿಂದ ವಿಸ್ತರಣೆಯನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ ಮತ್ತು ನಿಮ್ಮ ಬ್ರೌಸರ್‌ನಲ್ಲಿ ಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಸ್ ಐಕಾನ್ ಕ್ಲಿಕ್ ಮಾಡಿ. ನಿಮ್ಮ Google ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳ ಪುಟವು ತಕ್ಷಣವೇ ಹಿತವಾದ ಡಾರ್ಕ್ ಥೀಮ್‌ಗೆ ಬದಲಾಗುತ್ತದೆ, ನಿಮ್ಮ ಬರವಣಿಗೆಯ ಅನುಭವವನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ.\n\n📜 ನಿಮಗೆ ಈ ವಿಸ್ತರಣೆ ಏಕೆ ಬೇಕು?\n\nGoogle ಡಾಕ್ಸ್ ಡಾರ್ಕ್ ಮೋಡ್: ಡಾರ್ಕ್ ಮೋಡ್ ಜಿ ಡಾಕ್ಸ್ ನಿಮ್ಮ Google ಡಾಕ್‌ಗೆ ಡಾರ್ಕ್ ಮೋಡ್ ಅನ್ನು ತರಲು ನಿರ್ಣಾಯಕ ಪರಿಹಾರವಾಗಿದೆ, ನಿಮ್ಮ ಬರವಣಿಗೆಯ ಅವಧಿಗಳಲ್ಲಿ ನಿಮ್ಮ ಕಣ್ಣುಗಳು ಆರಾಮದಾಯಕವಾಗಿರುತ್ತವೆ ಎಂದು ಖಚಿತಪಡಿಸುತ್ತದೆ.\nವರ್ಧಿತ ಉತ್ಪಾದಕತೆ: ಕಪ್ಪು ಥೀಮ್ ಒದಗಿಸುವ ವ್ಯಾಕುಲತೆ-ಮುಕ್ತ ಪರಿಸರದೊಂದಿಗೆ, ನಿಮ್ಮ ಬರವಣಿಗೆ ಕಾರ್ಯಗಳಲ್ಲಿ ನೀವು ಹೆಚ್ಚು ಗಮನ, ಪರಿಣಾಮಕಾರಿ ಮತ್ತು ಉತ್ಪಾದಕತೆಯನ್ನು ಕಾಣುವಿರಿ.\n\nಕಣ್ಣಿನ ರಕ್ಷಣೆ: ಪ್ರಕಾಶಮಾನವಾದ ಪರದೆಗೆ ದೀರ್ಘಕಾಲದವರೆಗೆ ಒಡ್ಡಿಕೊಳ್ಳುವುದು ನಿಮ್ಮ ಕಣ್ಣುಗಳಿಗೆ ಹಾನಿಕಾರಕವಾಗಿದೆ. ಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳು ನಿಮ್ಮ ಸಾಧನದಿಂದ ಹೊರಸೂಸುವ ಬೆಳಕಿನ ತೀವ್ರತೆಯನ್ನು ಕಡಿಮೆ ಮಾಡುವ ಮೂಲಕ ನಿಮ್ಮ ಕಣ್ಣುಗಳನ್ನು ರಕ್ಷಿಸುತ್ತದೆ.\n\nಗ್ರಾಹಕೀಕರಣ ಆಯ್ಕೆಗಳು: ನಿಮ್ಮ ಇಚ್ಛೆಗೆ ತಕ್ಕಂತೆ ಕಪ್ಪು ಮೋಡ್ Google ಡಾಕ್. ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಆದ್ಯತೆಗಳಿಗೆ ಸರಿಹೊಂದುವಂತೆ ಡಾರ್ಕ್ ಮೋಡ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು, ಫಾಂಟ್‌ಗಳು ಮತ್ತು ಹಿನ್ನೆಲೆಗಳನ್ನು ಹೊಂದಿಸಿ.\n\nಕ್ರಾಸ್-ಬ್ರೌಸರ್ ಹೊಂದಾಣಿಕೆ: ನೀವು ಕ್ರೋಮ್, ಫೈರ್‌ಫಾಕ್ಸ್ ಅಥವಾ ಇನ್ನೊಂದು ಬ್ರೌಸರ್‌ಗೆ ಆದ್ಯತೆ ನೀಡುತ್ತಿರಲಿ, ಡಿಮ್ ಮೋಡ್ ಗೂಗಲ್ ಡಾಕ್ಸ್ ಬೋರ್ಡ್‌ನಾದ್ಯಂತ ಹೊಂದಿಕೊಳ್ಳುತ್ತದೆ, ಆದ್ದರಿಂದ ನಿಮ್ಮ ಬ್ರೌಸರ್ ಆಯ್ಕೆಯ ಹೊರತಾಗಿಯೂ ನೀವು ಮೋಡ್ ಅನುಭವವನ್ನು ಆನಂದಿಸಬಹುದು.\n \n📚 FAQ ಗಳು:\n \n1. ಈ ವಿಸ್ತರಣೆಯೊಂದಿಗೆ ನಾನು Google ಡಾಕ್ಸ್ ಅನ್ನು ಚಂದ್ರರಹಿತ ಮೋಡ್‌ನಲ್ಲಿ ಹೇಗೆ ಹಾಕುವುದು? ಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಸ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು, Chrome ವೆಬ್ ಸ್ಟೋರ್‌ನಿಂದ ವಿಸ್ತರಣೆಯನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ, ತದನಂತರ ನಿಮ್ಮ ಬ್ರೌಸರ್‌ನಲ್ಲಿರುವ Google ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳ ಡಾರ್ಕ್ ಮೋಡ್ ಐಕಾನ್ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ.\n2. ಡೆಸ್ಕ್‌ಟಾಪ್‌ಗೆ ಡಾರ್ಕ್ ಮೋಡ್ ಜಿ ಡಾಕ್ಸ್ ಲಭ್ಯವಿದೆಯೇ? ಸಂಪೂರ್ಣವಾಗಿ! ಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಸ್ PC ಗಳು ಮತ್ತು ಡೆಸ್ಕ್‌ಟಾಪ್‌ಗಳೆರಡಕ್ಕೂ ಲಭ್ಯವಿದೆ, ನಿಮ್ಮ ಆದ್ಯತೆಯ ಪ್ಲಾಟ್‌ಫಾರ್ಮ್‌ನಲ್ಲಿ ನೀವು ಆರಾಮದಾಯಕ ಬರವಣಿಗೆಯ ವಾತಾವರಣವನ್ನು ಆನಂದಿಸಬಹುದು ಎಂದು ಖಚಿತಪಡಿಸುತ್ತದೆ.\n3. ಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಸ್‌ನ ನೋಟವನ್ನು ನಾನು ಕಸ್ಟಮೈಸ್ ಮಾಡಬಹುದೇ? ಹೌದು, ನೀನು ಮಾಡಬಹುದು! ಡಾರ್ಕ್ ಮೋಡ್ Google ಡಾಕ್ಸ್ ವಿವಿಧ ಗ್ರಾಹಕೀಕರಣ ಆಯ್ಕೆಗಳನ್ನು ನೀಡುತ್ತದೆ, ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಆದ್ಯತೆಗಳಿಗೆ ವಿಸ್ತರಣೆಯನ್ನು ಸರಿಹೊಂದಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ.\n4. Google ಡಾಕ್ಸ್ ಸ್ಥಳೀಯ ಡಾರ್ಕ್ ಮೋಡ್ ಅನ್ನು ಹೊಂದಿದೆಯೇ? ದುರದೃಷ್ಟವಶಾತ್, Google ಡಾಕ್ಸ್ ಸ್ಥಳೀಯ ಡಾರ್ಕ್ ಮೋಡ್ ಅನ್ನು ನೀಡುವುದಿಲ್ಲ." + } +} diff --git a/_locales/ko/messages.json b/_locales/ko/messages.json new file mode 100644 index 0000000..80ee762 --- /dev/null +++ b/_locales/ko/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "다크 모드 Google 문서 확장 프로그램으로 효율성을 높이세요. 원활한 Google 문서 도구의 다크 모드를 경험하여 글쓰기를 개선하세요." + }, + "appName": { + "message": "다크 모드 Google 문서 도구" + }, + "storeDesc": { + "message": "🌟 경쟁사보다 다크 모드 Google 문서를 선택하는 이유는 무엇인가요?\n\n수많은 Chrome 확장 프로그램이 다크 모드 기능을 제공하는 가운데, 왜 다크 모드 Google 문서 도구가 최고의 선택인지 궁금할 것입니다. 다크 모드 Google 문서 도구가 돋보이는 이유를 살펴보세요:\n\n1. 사용자 친화적인 인터페이스: 다크 모드 Google 문서 도구는 직관적인 인터페이스를 제공하여 쉽게 탐색할 수 있습니다. 설정 및 사용자 지정 옵션을 쉽게 찾을 수 있습니다.\n2. 속도와 효율성: 확장 프로그램은 성능에 최적화되어 있어 브라우저나 Google 문서 도구의 속도를 저하시키지 않으며, 속도 저하 없이 어두운 테마를 제공합니다.\n3. 정기 업데이트: Google 문서 도구의 변경사항에 맞춰 지속적으로 업데이트되므로 다크 모드 환경을 최신 상태로 유지할 수 있습니다.\n4. 반응형 지원: 문제가 발생하거나 궁금한 점이 있으면 지원팀이 즉시 도움을 드릴 준비가 되어 있으며 원활한 사용 환경을 보장하기 위해 최선을 다하고 있습니다.\n5. 폭넓은 사용자 기반: Google 문서 도우미 모드의 품질과 안정성을 입증하는 긍정적인 리뷰로 사용자 커뮤니티가 활발하게 운영되고 있습니다. Google 문서 도구 경험을 혁신한 만족스러운 사용자 대열에 합류하세요.\n \n🎨 내 스타일에 맞는 맞춤 설정\n\n작성 환경을 맞춤 설정하는 것은 다크 모드 Google 문서 도구의 주요 장점입니다. 마음껏 맞춤 설정하세요:\n \n어두운 수준: 은은한 어둡기부터 몰입감 넘치는 어두운 분위기까지 원하는 대로 어둡기 수준을 조정할 수 있습니다.\n글꼴 사용자 지정: 내 글쓰기 스타일에 맞는 글꼴 스타일, 크기, 색상을 선택하세요.\n배경 옵션: 미적 감각을 보완하는 색상이나 질감으로 배경을 조정할 수 있습니다.\n강조 색상: 강조 색상을 선택해 특정 문서 요소를 강조할 수 있습니다.\n \n🌐 브라우저 간 호환성\n\nChrome, Firefox 또는 다른 브라우저를 사용하든 상관없이 블랙 모드 G 문서 도구는 브라우저 간 호환성을 위해 설계되었습니다. 어떤 웹 브라우저를 선택하든 편안하고 생산적인 어두운 테마를 즐겨보세요.\n\n🚀 생산성 향상\n\n다크 모드 Google 문서 도구는 단순히 미적 감각을 위한 것이 아니라 생산성을 높이고 글쓰기 경험을 개선하기 위한 것입니다:\n \n바로 집중력과 집중력입니다: 어두운 테마는 방해 요소를 최소화하여 방해받지 않고 작업에 집중할 수 있도록 도와줍니다.\n눈의 피로 감소: 밝기를 낮추면 눈이 편안해져 장시간 글쓰기를 해도 피로가 덜합니다.\n에너지 효율성: 다크 모드 G 문서를 사용하면 눈을 보호하고 에너지를 절약하여 탄소 발자국을 줄일 수 있습니다.\n \n🌚 결론\n\n다크 모드 Google 문서 도구는 편안하고 맞춤 설정이 가능하며 효율적인 문서 작성 환경을 원하는 모든 사용자를 위한 최고의 Chrome 확장 프로그램입니다. 클릭 한 번으로 활성화하고, 원하는 대로 맞춤 설정하고, 방해 요소가 없는 편안한 환경을 즐겨보세요. 탁월한 Google 문서도구 경험을 위해 다크 모드 G 문서를 선택한 사용자들의 만족스러운 커뮤니티에 가입하세요.\n\n🌙 Google 문서 도구 다크 모드 - 글쓰기 경험을 향상하세요!\n\nGoogle 문서 도구에서 작업하는 동안 화면의 눈부심이 성가신가요? 더 편안하고 시각적으로 보기 좋은 글쓰기 환경을 원하시나요? 이제 더 이상 고민하지 마세요. 다크 모드 Google 문서 도구가 여러분의 글쓰기 경험을 바꿔줄 것입니다.\n\nGoogle 문서 도구 다크 모드는 문서를 작성, 편집 또는 읽을 때 더 어둡고 눈에 편한 환경을 선호하는 사용자를 위한 최고의 Chrome 확장 프로그램입니다. 이 확장 프로그램을 사용하면 Google 문서 도구 인터페이스를 매끄럽고 차분한 어두운 테마로 원활하게 전환하여 그 어느 때보다 즐거운 글쓰기 세션을 만들 수 있습니다. 거친 밝기와 작별하고 스타일리시한 생산성을 맞이하세요.\n\n🌟 다크 모드 Google 문서의 주요 기능\n\n1. 손쉬운 활성화: 다크 모드 Google 문서는 매우 사용하기 쉽습니다. 클릭 한 번으로 Google 문서 도구의 어두운 테마를 활성화하여 더욱 편안하고 집중력 있는 문서 작성 환경을 만들 수 있습니다.\n\n2. 사용자 지정 옵션: 한 가지 크기가 모든 사람에게 적합하지 않다는 것을 잘 알고 있습니다. 그렇기 때문에 다양한 사용자 지정 옵션을 제공하여 개인 취향에 맞게 확장 프로그램을 조정할 수 있습니다. 어둡기 수준, 글꼴 및 배경을 원하는 대로 조정할 수 있습니다.\n\n3. 눈 보호: 장시간 글을 쓰면 눈이 피로해질 수 있습니다. 다크 모드 G 문서에서는 눈에 편한 부드럽고 어두운 배경을 제공하여 눈의 피로를 줄여주므로 더욱 편안하게 글을 쓸 수 있습니다.\n\n4. 집중력 향상: 어두운 테마는 방해 요소를 없애고 글쓰기에 집중할 수 있도록 도와줍니다. 더 이상 불필요한 눈부심이나 밝은 화면으로 인해 집중력이 흐트러지지 않습니다.\n\n5. 에너지 효율: 어두운 모드 Google 문서를 사용하면 눈 건강에 좋을 뿐만 아니라 에너지도 절약할 수 있어 기기 수명을 연장하고 전기료를 절약할 수 있습니다.\n \n🖥️ 호환성 및 접근성: 다크 모드 G 문서 도구는 모든 주요 웹 브라우저와 호환되며 PC와 데스크톱에서 쉽게 사용할 수 있습니다. 이제 선호하는 플랫폼에서 Google 문서 도구 다크 모드를 사용할 수 있습니다.\n\n🌚 블랙 모드 활성화 방법 Google, 다크 모드 활성화 방법 Google 문서 도구는 매우 간단합니다. Chrome 웹 스토어에서 확장 프로그램을 다운로드하고 브라우저에서 다크 모드 Google 문서 도구 아이콘을 클릭하기만 하면 됩니다. Google 문서 도구 페이지가 즉시 차분한 어두운 테마로 전환되어 글쓰기 경험이 향상됩니다.\n\n이 확장 프로그램이 왜 필요한가요?\n\n구글 문서도구 다크 모드: 다크 모드 G 문서 도구는 Google 문서 도구에 다크 모드를 도입하여 문서 작성 시 눈을 편안하게 해주는 최고의 솔루션입니다.\n생산성 향상: 검은색 테마가 제공하는 산만함 없는 환경을 통해 글쓰기 작업에 더욱 집중하고 효율적이며 생산적인 작업을 할 수 있습니다.\n\n눈 보호: 밝은 화면에 장시간 노출되면 눈에 해로울 수 있습니다. 다크 모드 Google 문서 도구는 기기에서 방출되는 빛의 강도를 줄여 눈을 보호합니다.\n\n사용자 지정 옵션: 원하는 대로 어두운 모드 Google 문서를 맞춤 설정하세요. 개인 취향에 맞게 다크 모드 설정, 글꼴, 배경을 조정할 수 있습니다.\n\n브라우저 간 호환성: Chrome, Firefox 또는 다른 브라우저를 선호하든, 다크 모드 Google 문서는 전반적으로 호환되므로 어떤 브라우저를 선택하든 모드 환경을 즐길 수 있습니다.\n \n📚 자주 묻는 질문:\n \n1. 이 확장 프로그램을 사용하여 Google 문서를 어두운 모드로 설정하려면 어떻게 하나요? 어두운 모드 Google 문서를 활성화하려면 Chrome 웹 스토어에서 확장 프로그램을 다운로드한 다음 브라우저에서 Google 문서 다크 모드 아이콘을 클릭하세요.\n2. 데스크톱에서도 다크 모드 G 문서를 사용할 수 있나요? 물론입니다! 다크 모드 Google 문서 도구는 PC와 데스크톱 모두에서 사용할 수 있으므로 원하는 플랫폼에서 편안한 문서 작성 환경을 즐길 수 있습니다.\n3. 다크 모드 Google 문서의 모양을 맞춤 설정할 수 있나요? 네, 가능합니다! 다크 모드 Google 문서 도구는 다양한 사용자 지정 옵션을 제공하므로 개인 취향에 맞게 확장 프로그램을 조정할 수 있습니다.\n4. Google 문서 도구에 기본 다크 모드가 있나요? 안타깝게도 Google 문서도구에는 기본 다크 모드가 제공되지 않습니다." + } +} diff --git a/_locales/lt/messages.json b/_locales/lt/messages.json new file mode 100644 index 0000000..b6c621a --- /dev/null +++ b/_locales/lt/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Padidinkite efektyvumą naudodami \"Google\" dokumentų tamsaus režimo plėtinį. Patirkite sklandų \"Google\" dokumentų tamsųjį režimą, kad galėtumėte geriau rašyti." + }, + "appName": { + "message": "Tamsusis režimas \"Google\" dokumentai" + }, + "storeDesc": { + "message": "🌟 Kodėl verta rinktis tamsųjį režimą \"Google\" dokumentuose, o ne konkurentų?\n\nKadangi daugybė \"Chrome\" plėtinių siūlo tamsaus režimo funkcijas, jums gali kilti klausimas, kodėl tamsaus režimo \"G Docs\" yra geriausias pasirinkimas. Panagrinėkime, kodėl tamsaus režimo \"Google Docs\" išsiskiria iš kitų:\n\n1. Patogi naudotojo sąsaja: Tamsaus režimo \"Google Docs\" suteikia intuityvią sąsają, kad būtų lengva naršyti. Nustatymų ir pritaikymo parinkčių paieška yra paprasta.\n2. Greitis ir efektyvumas: Mūsų plėtinys optimizuotas našumui, todėl jis nelėtina naršyklės ir \"Google\" dokumentų, užtikrina tamsią temą nesumažindamas greičio.\n3. Reguliarūs atnaujinimai: \"g docs black mode\" nuolat atnaujinamas, kad neatsiliktų nuo \"Google Docs\" pokyčių, užtikrinant, kad jūsų tamsaus režimo patirtis išliktų aktuali ir funkcionali.\n4. Jautrus palaikymas: Jei susidursite su problemomis ar turėsite klausimų, mūsų palaikymo komanda pasiruošusi greitai padėti ir pasiryžusi užtikrinti sklandžią patirtį.\n5. Platus naudotojų ratas: \"Google Doc dire\" režimas turi klestinčią naudotojų bendruomenę su teigiamais atsiliepimais, liudijančiais apie jo kokybę ir patikimumą. Prisijunkite prie patenkintų naudotojų, kurie pakeitė savo \"Google\" dokumentų patirtį, gretų.\n \n🎨 Pritaikymas pagal jūsų stilių\n\nRašymo aplinkos personalizavimas yra pagrindinis \"Google Docs\" tamsiojo režimo privalumas. Pritaikykite pagal savo poreikius:\n \nTamsos lygis: Nustatykite tamsos lygį pagal savo pageidavimus: nuo švelnaus pritemdymo iki svaiginančios tamsos.\nŠrifto pritaikymas: Pasirinkite šrifto stilių, dydį ir spalvą, atitinkančią jūsų rašymo stilių.\nFono parinktys: Pritaikykite fono spalvą ar tekstūrą, kuri atitinka jūsų estetiką.\nAkcentinės spalvos: Pasirinkite akcento spalvas, kad išryškintumėte tam tikrus dokumento elementus.\n \n🌐 Suderinamumas su įvairiomis naršyklėmis\n\nNesvarbu, ar naudojate \"Chrome\", \"Firefox\", ar kitą naršyklę, \"Black Mode G Docs\" sukurta taip, kad būtų suderinama su įvairiomis naršyklėmis. Mėgaukitės patogia ir produktyvia tamsia tema, nepriklausomai nuo pasirinktos naršyklės.\n\n🚀 Padidinkite savo produktyvumą\n\nTamsusis režimas \"Google Docs\" - tai ne tik estetika, bet ir produktyvumo didinimas bei rašymo patirties gerinimas:\n \nSusikaupimas ir koncentracija: Tamsioji tema sumažina trukdžius, todėl galite susikaupti darbui be trukdžių.\nMažesnis akių įtempimas: Jūsų akys padėkos už sumažintą ryškumą, todėl ilgos rašymo sesijos bus patogesnės ir mažiau vargins.\nEnergijos vartojimo efektyvumas: Naudodami tamsųjį režimą \"G Docs\" tausojate akis ir padedate taupyti energiją, mažindami anglies dioksido pėdsaką.\n \n🌚 Išvada\n\nTamsusis režimas \"Google Docs\" yra geriausias \"Chrome\" plėtinys visiems, kurie siekia patogaus, pritaikomo ir efektyvaus rašymo. Įjunkite jį vienu spustelėjimu, pritaikykite jį pagal savo pageidavimus ir mėgaukitės aplinka, kuri neblaško dėmesio ir yra lengva akims. Prisijunkite prie patenkintos naudotojų bendruomenės, kurie pasirinko tamsųjį režimą \"G Doc\", norėdami gauti geresnę \"Google\" dokumentų naudojimo patirtį.\n\n🌙 Tamsusis \"Google Docs\" režimas - pagerinkite rašymo patirtį!\n\nAr dirbant su \"Google\" dokumentais vargina akinantis ekrano spindesys? Trokštate patogesnės ir vizualiai malonesnės rašymo aplinkos? Daugiau neieškokite, nes \"Google Docs\" tamsusis režimas yra čia, kad pakeistų jūsų rašymo patirtį.\n\nTamsusis \"Google\" dokumentų režimas yra geriausias \"Chrome\" plėtinys tiems, kurie, kurdami, redaguodami ar skaitydami dokumentus, pageidauja tamsesnės, akims draugiškesnės išvaizdos. Naudodami šį plėtinį galite sklandžiai perjungti \"Google\" dokumentų sąsają į elegantišką ir raminančią tamsią temą, todėl rašymo sesijos bus malonesnės nei bet kada anksčiau. Atsisveikinkite su ryškiu ryškumu ir pasveikinkite stilingą produktyvumą.\n\n🌟 Pagrindinės tamsaus režimo \"Google Docs\" funkcijos\n\n1. Lengvas įjungimas: Tamsiuoju režimu \"Google Docs\" naudotis neįtikėtinai paprasta. Vos vienu spustelėjimu galite aktyvuoti tamsiąją \"Google Doc\" temą, taip sukurdami patogesnę ir labiau sutelktą rašymo aplinką.\n\n2. Pritaikymo parinktys: Suprantame, kad vienas dydis netinka visiems. Todėl siūlome įvairias pritaikymo parinktis, leidžiančias pritaikyti plėtinį pagal savo asmeninius pageidavimus. Nustatykite tamsumo lygį, šriftą ir foną pagal savo pageidavimus.\n\n3. Tausoja jūsų akis: Ilgos rašymo sesijos gali pakenkti jūsų akims. Tamsusis režimas \"G Documents\" sumažina akių įtampą, nes suteikia švelnų, tamsų foną, kuris palengvina regėjimą, todėl rašyti patogiau.\n\n4. Geresnis dėmesio sutelkimas: Tamsus temos režimas padeda pašalinti išsiblaškymą ir išlaiko jūsų dėmesį ten, kur jis ir turi būti - ties rašymu. Daugiau jokių nereikalingų atspindžių ar ryškių ekranų, kurie atitrauktų jūsų dėmesį.\n\n5. Energijos vartojimo efektyvumas: Naudojant tamsųjį režimą \"Google\" dokumentai ne tik naudingi jūsų akims, bet ir taupo energiją, todėl pailgėja prietaiso eksploatavimo laikas ir sutaupoma elektros energijos.\n \n🖥️ suderinamumas ir prieinamumas: Tamsusis režimas \"G Docs\" suderinamas su visomis pagrindinėmis interneto naršyklėmis ir yra lengvai prieinamas asmeniniuose ir staliniuose kompiuteriuose. Dabar \"Google Docs\" tamsiuoju režimu galite mėgautis norimoje platformoje.\n\n🌚 Kaip įjungti juodąjį režimą \"Google\", įjungti tamsųjį režimą \"Google Docs\" yra paprasta. Tiesiog atsisiųskite plėtinį iš \"Chrome\" interneto parduotuvės ir naršyklėje spustelėkite tamsaus režimo \"Google Docs\" piktogramą. Jūsų \"Google\" dokumentų puslapis akimirksniu persijungs į raminančią tamsią temą ir pagerins jūsų rašymo patirtį.\n\n📜 Kodėl jums reikia šio plėtinio?\n\nTamsusis \"Google\" dokumentų režimas: Tamsusis režimas G Dokumentai yra galutinis sprendimas, leidžiantis įdiegti tamsųjį režimą į jūsų \"Google\" dokumentus, užtikrinantis, kad jūsų akys rašymo sesijų metu išliktų patogios.\nDidesnis produktyvumas: Juodos spalvos temos suteikiama aplinka neblaško dėmesio, todėl rašymo užduotis atliksite susikaupę, efektyviau ir produktyviau.\n\nAkių apsauga: Ilgalaikis buvimas ryškiame ekrane gali pakenkti akims. Tamsusis režimas \"Google Documents\" apsaugo jūsų akis sumažindamas prietaiso skleidžiamos šviesos intensyvumą.\n\nPritaikymo parinktys: Juodojo režimo \"Google\" dokumentus pritaikykite pagal savo skonį. Sureguliuokite tamsaus režimo nustatymus, šriftus ir fonus pagal savo individualius pageidavimus.\n\nSuderinamumas su įvairiomis naršyklėmis: Nesvarbu, ar mėgstate \"Chrome\", \"Firefox\", ar kitą naršyklę, tamsusis režimas \"Google Docs\" yra suderinamas su visomis naršyklėmis, todėl galėsite mėgautis režimo patirtimi, nesvarbu, kokią naršyklę pasirinksite.\n \n📚 DUK:\n \n1. Kaip su šiuo plėtiniu perjungti \"Google Docs\" į nemėnesinį režimą? Norėdami įjungti tamsųjį \"Google\" dokumentų režimą, tiesiog atsisiųskite plėtinį iš \"Chrome\" interneto parduotuvės ir naršyklėje spustelėkite \"Google\" dokumentų tamsaus režimo piktogramą.\n2. Ar tamsaus režimo \"G Docs\" galima naudoti darbalaukyje? Žinoma! Tamsusis režimas \"Google Docs\" prieinamas ir asmeniniams, ir staliniams kompiuteriams, todėl galėsite mėgautis patogia rašymo aplinka pageidaujamoje platformoje.\n3. Ar galiu pritaikyti tamsiojo režimo \"Google Docs\" išvaizdą? Taip, galite! Tamsiuoju režimu veikiantys \"Google Docs\" siūlo įvairias pritaikymo parinktis, todėl plėtinį galite pritaikyti pagal savo asmeninius pageidavimus.\n4. Ar \"Google Docs\" turi natūralų tamsųjį režimą? Deja, \"Google Docs\" nesiūlo gimtojo tamsaus režimo." + } +} diff --git a/_locales/lv/messages.json b/_locales/lv/messages.json new file mode 100644 index 0000000..abb56a5 --- /dev/null +++ b/_locales/lv/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Palieliniet efektivitāti, izmantojot mūsu tumšā režīma Google Docs paplašinājumu. Izmantojiet Google Docs tumšo režīmu, lai uzlabotu rakstīšanu." + }, + "appName": { + "message": "Tumšais režīms Google Dokumenti" + }, + "storeDesc": { + "message": "🌟 Kāpēc izvēlēties tumšo režīmu Google Dokumenti, nevis konkurentus?\n\nŅemot vērā daudzos Chrome paplašinājumus, kas piedāvā tumšā režīma funkcionalitāti, iespējams, jūs interesē, kāpēc tumšais režīms G Docs ir jūsu labākā izvēle. Izpētīsim, ar ko tumšais režīms Google Dokumenti izceļas:\n\n1. Lietotājam draudzīga saskarne: Tumšā režīma Google Dokumenti nodrošina intuitīvu saskarni, kas atvieglo navigāciju. Iestatījumu un pielāgošanas iespēju atrašana ir vienkārša.\n2. Ātrums un efektivitāte: Mūsu paplašinājums ir optimizēts veiktspējas ziņā, nodrošinot, ka tas nepalēninās pārlūkprogrammas vai Google Docs darbību, nodrošinot tumšo tēmu, nemazinot ātrumu.\n3. Regulāri atjauninājumi: g Docs melnais režīms tiek pastāvīgi atjaunināts, lai neatpaliktu no Google Docs izmaiņām, nodrošinot, ka tumšā režīma pieredze ir aktuāla un funkcionāla.\n4. Responsīvs atbalsts: Ja jums rodas problēmas vai jautājumi, mūsu atbalsta komanda ir gatava nekavējoties palīdzēt un ir apņēmības pilna nodrošināt netraucētu lietošanu.\n5. Plaša lietotāju bāze: Google Doc dire režīmā ir plaukstoša lietotāju kopiena ar pozitīvām atsauksmēm, kas apliecina tā kvalitāti un uzticamību. Pievienojieties apmierināto lietotāju rindām, kuri ir pārveidojuši savu Google Docs pieredzi.\n \n🎨 Pielāgošana atbilstoši jūsu stilam\n\nTumsas režīma Google Docs galvenā priekšrocība ir rakstīšanas vides personalizēšana. Pielāgojiet pēc sirds patikas:\n \nTumsas līmenis: Pielāgojiet tumsas līmeni atbilstoši savām vēlmēm, sākot no maiga aptumšojuma līdz visaptverošai tumsai.\nFontu pielāgošana: Izvēlēties rakstīšanas stilam atbilstošu fonta stilu, izmēru un krāsu.\nFona opcijas: Pielāgojiet fona krāsu vai tekstūru, kas atbilst jūsu estētikai.\nAkcentu krāsas: Izvēlieties akcenta krāsas, lai izceltu konkrētus dokumenta elementus.\n \n🌐 Savietojamība ar dažādiem pārlūkiem\n\nNeatkarīgi no tā, vai izmantojat Chrome, Firefox vai citu pārlūkprogrammu, melnais režīms G Docs ir izstrādāts, lai nodrošinātu saderību ar dažādām pārlūkprogrammām. Izbaudiet ērtu un produktīvu tumšo tēmu neatkarīgi no jūsu izvēlētās tīmekļa pārlūkprogrammas.\n\n🚀 Palieliniet savu produktivitāti\n\nTumšā režīma Google Dokumenti nav tikai estētisks risinājums, bet gan produktivitātes palielināšana un rakstīšanas pieredzes uzlabošana:\n \nkoncentrēšanās un koncentrēšanās: Tumsas tēma samazina traucējošos faktorus, ļaujot jums koncentrēties darbam bez pārtraukumiem.\nSamazināts acu sasprindzinājums: Jūsu acis būs pateicīgas par samazināto spilgtumu, padarot garas rakstīšanas sesijas ērtākas un mazāk nogurdinošas.\nEnergoefektivitāte: Izmantojot tumšo režīmu G Docs, jūs saudzējat acis un palīdzat taupīt enerģiju, tādējādi samazinot oglekļa dioksīda emisiju.\n \n🌚 Nobeigumā\n\nTumšā režīma Google Dokumenti ir labākais Chrome paplašinājums ikvienam, kas meklē ērtu, pielāgojamu un efektīvu rakstīšanas pieredzi. Aktivizējiet to ar vienu klikšķi, pielāgojiet to savām vēlmēm un izbaudiet vidi, kas novērš uzmanību un ir ērta acīm. Pievienojieties apmierināto lietotāju kopienai, kuri ir izvēlējušies tumšo režīmu G Doc, lai nodrošinātu izcilu Google Docs lietošanas pieredzi.\n\n🌙 Google Docs tumšais režīms - uzlabojiet rakstīšanas pieredzi!\n\nVai, strādājot ar Google Docs, jūs nogurdina ekrāna žilbinošais atspīdums? Vai ilgojaties pēc ērtākas un vizuāli patīkamākas rakstīšanas vides? Tālāk nemeklējiet, jo tumšais režīms Google Dokumenti ir šeit, lai pārveidotu jūsu rakstīšanas pieredzi.\n\nGoogle dokumenti tumšais režīms ir lielisks Chrome paplašinājums tiem, kuri, veidojot, rediģējot vai lasot dokumentus, dod priekšroku tumšākam un acīm draudzīgākam izskatam. Izmantojot šo paplašinājumu, varat nemanāmi pārslēgt savu Google Docs saskarni uz glītu un nomierinošu tumšu tēmu, padarot rakstīšanas sesijas patīkamākas nekā jebkad agrāk. Atvadieties no skarbā spilgtuma un sveiciniet produktivitāti stilā.\n\n🌟 Google Docs tumšā režīma galvenās funkcijas\n\n1. Viegla aktivizēšana: Tumsas režīms Google Dokumenti ir neticami viegli lietojams. Tikai ar vienu klikšķi varat aktivizēt tumšo tēmu savam Google dokumentam, radot ērtāku un koncentrētāku rakstīšanas vidi.\n\n2. Pielāgošanas opcijas: Mēs saprotam, ka viens izmērs nav piemērots visiem. Tāpēc mēs piedāvājam dažādas pielāgošanas iespējas, kas ļauj jums pielāgot paplašinājumu atbilstoši savām personīgajām vēlmēm. Pielāgojiet tumšuma līmeni, fontu un fonu atbilstoši savām vēlmēm.\n\n3. Saudzē acis: Ilgstošas rakstīšanas sesijas var kaitēt jūsu acīm. Tumšais režīms G Documents samazina acu nogurumu, nodrošinot maigu, tumšu fonu, kas ir viegls jūsu redzei, padarot rakstīšanu ērtāku.\n\n4. Uzlabota fokusēšanās: Tumšais temats palīdz novērst traucējošos faktorus un notur uzmanību tur, kur tai jābūt - pie rakstīšanas. Nav vairs nevajadzīgu atspīdumu vai spilgtu ekrānu, kas novērš jūsu uzmanību.\n\n5. Energoefektivitāte: Izmantojot tumšo režīmu, Google dokumenti ne tikai labvēlīgi ietekmē jūsu acis, bet arī ietaupa enerģiju, tādējādi paildzinot ierīces darbības laiku un ietaupot elektrības izmaksas.\n \n🖥️ savietojamība un pieejamība: Tumšais režīms G Dokumenti ir saderīgs ar visām galvenajām tīmekļa pārlūkprogrammām un ir viegli pieejams personālajos un galddatoros. Tagad varat izmantot Google Docs tumšo režīmu savā vēlamajā platformā.\n\n🌚 Kā aktivizēt melno režīmu Google, Aktivizēt tumšo režīmu Google Dokumenti ir pavisam vienkārši. Vienkārši lejupielādējiet paplašinājumu no Chrome interneta veikala un noklikšķiniet uz ikonas Tumšais režīms Google Dokumenti savā pārlūkprogrammā. Jūsu Google dokumentu lapa uzreiz pārslēgsies uz nomierinošu tumšo tēmu, uzlabojot rakstīšanas pieredzi.\n\n📜 Kāpēc jums nepieciešams šis paplašinājums?\n\nGoogle Dokumenti Tumšais režīms: Tumšais režīms G Docs ir galīgais risinājums, kas jūsu Google dokumentos ieviesīs tumšo režīmu, nodrošinot, ka rakstīšanas sesiju laikā jūsu acīm ir ērti.\nUzlabota produktivitāte: Ar melnā motīva nodrošināto vidi, kas novērš traucējumus, jūs varēsiet koncentrētāk, efektīvāk un produktīvāk pildīt rakstīšanas uzdevumus.\n\nAcu aizsardzība: Ilgstoša spilgta ekrāna redzamība var kaitēt jūsu acīm. Tumšais režīms Google dokumenti aizsargā acis, samazinot ierīces izstarotās gaismas intensitāti.\n\nPielāgošanas opcijas: Pielāgojiet melno režīmu Google dokumenti pēc savām vēlmēm. Pielāgojiet tumšā režīma iestatījumus, fontus un fonus atbilstoši savām individuālajām vēlmēm.\n\nSavietojamība ar dažādām pārlūkprogrammām: Neatkarīgi no tā, vai dodat priekšroku Chrome, Firefox vai citai pārlūkprogrammai, tumšais režīms Google Docs ir saderīgs ar visām pārlūkprogrammām, tāpēc varat izbaudīt režīmu neatkarīgi no jūsu izvēlētās pārlūkprogrammas.\n \n📚 Biežāk uzdotie jautājumi:\n \n1. Kā ar šo paplašinājumu pārslēgt Google Dokumenti bezmiega režīmā? Lai aktivizētu tumšo režīmu Google Dokumenti, vienkārši lejupielādējiet paplašinājumu no Chrome interneta veikala un pēc tam noklikšķiniet uz Google dokumentu tumšā režīma ikonas savā pārlūkprogrammā.\n2. Vai tumšais režīms G Docs ir pieejams darbvirsmā? Noteikti! Tumšais režīms Google Dokumenti ir pieejams gan personālajiem, gan galddatoriem, nodrošinot ērtu rakstīšanas vidi jūsu vēlamajā platformā.\n3. Vai es varu pielāgot tumšā režīma Google Dokumenti izskatu? Jā, varat! Tumšā režīma Google Dokumenti piedāvā dažādas pielāgošanas iespējas, kas ļauj jums pielāgot paplašinājumu savām personīgajām vēlmēm.\n4. Vai Google dokumentiem ir dabiskais tumšais režīms? Diemžēl Google Dokumenti nepiedāvā dabisko tumšo režīmu." + } +} diff --git a/_locales/ml/messages.json b/_locales/ml/messages.json new file mode 100644 index 0000000..9943808 --- /dev/null +++ b/_locales/ml/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "ഞങ്ങളുടെ ഡാർക്ക് മോഡ് Google ഡോക്‌സ് വിപുലീകരണം ഉപയോഗിച്ച് കാര്യക്ഷമത വർദ്ധിപ്പിക്കുക. മെച്ചപ്പെടുത്തിയ എഴുത്തിനായി തടസ്സങ്ങളില്ലാത്ത Google ഡോക്‌സ് ഡാർക്ക് മോഡ് അനുഭവിക്കുക." + }, + "appName": { + "message": "ഡാർക്ക് മോഡ് Google ഡോക്‌സ്" + }, + "storeDesc": { + "message": "🌟 എതിരാളികളെക്കാൾ ഡാർക്ക് മോഡ് Google ഡോക്‌സ് തിരഞ്ഞെടുക്കുന്നത് എന്തുകൊണ്ട്?\n\nഡാർക്ക് മോഡ് പ്രവർത്തനക്ഷമത വാഗ്ദാനം ചെയ്യുന്ന നിരവധി ക്രോം വിപുലീകരണങ്ങൾക്കൊപ്പം, ഡാർക്ക് മോഡ് ജി ഡോക്‌സിനെ നിങ്ങളുടെ മികച്ച ചോയിസ് ആക്കുന്നത് എന്താണെന്ന് നിങ്ങൾ ചിന്തിച്ചേക്കാം. എന്തുകൊണ്ടാണ് ഡാർക്ക് മോഡ് Google ഡോക്‌സ് വേറിട്ട് നിൽക്കുന്നതെന്ന് നമുക്ക് പര്യവേക്ഷണം ചെയ്യാം:\n\n1. ഉപയോക്തൃ-സൗഹൃദ ഇന്റർഫേസ്: ഡാർക്ക് മോഡ് Google ഡോക്‌സ് എളുപ്പത്തിലുള്ള നാവിഗേഷനായി ഒരു അവബോധജന്യമായ ഇന്റർഫേസ് നൽകുന്നു. ക്രമീകരണങ്ങളും ഇഷ്‌ടാനുസൃതമാക്കൽ ഓപ്ഷനുകളും കണ്ടെത്തുന്നത് ഒരു കാറ്റ് ആണ്.\n2. വേഗതയും കാര്യക്ഷമതയും: ഞങ്ങളുടെ വിപുലീകരണം പ്രകടനത്തിനായി ഒപ്റ്റിമൈസ് ചെയ്‌തിരിക്കുന്നു, ഇത് നിങ്ങളുടെ ബ്രൗസറിനോ Google ഡോക്‌സിനോ വേഗത കുറയ്‌ക്കില്ലെന്ന് ഉറപ്പാക്കുന്നു, വേഗതയിൽ വിട്ടുവീഴ്‌ച ചെയ്യാതെ ഇരുണ്ട തീം നൽകുന്നു.\n3. റെഗുലർ അപ്‌ഡേറ്റുകൾ: നിങ്ങളുടെ ഡാർക്ക് മോഡ് അനുഭവം നിലവിലുള്ളതും പ്രവർത്തനക്ഷമവുമാണെന്ന് ഉറപ്പാക്കിക്കൊണ്ട്, Google ഡോക്‌സിന്റെ മാറ്റങ്ങളുടെ വേഗത നിലനിർത്താൻ g ഡോക്‌സ് ബ്ലാക്ക് മോഡ് തുടർച്ചയായി അപ്‌ഡേറ്റ് ചെയ്യുന്നു.\n4. പ്രതികരിക്കുന്ന പിന്തുണ: നിങ്ങൾക്ക് പ്രശ്‌നങ്ങൾ നേരിടുകയോ ചോദ്യങ്ങളുണ്ടെങ്കിലോ, സുഗമമായ അനുഭവം ഉറപ്പാക്കാൻ പ്രതിജ്ഞാബദ്ധരായ ഞങ്ങളുടെ പിന്തുണാ ടീം ഉടനടി സഹായിക്കാൻ തയ്യാറാണ്.\n5. വൈഡ് യൂസർ ബേസ്: ഗൂഗിൾ ഡോക് ഡയർ മോഡിന് അതിന്റെ ഗുണമേന്മയും വിശ്വാസ്യതയും സാക്ഷ്യപ്പെടുത്തുന്ന പോസിറ്റീവ് അവലോകനങ്ങളുള്ള ഒരു അഭിവൃദ്ധി പ്രാപിക്കുന്ന ഉപയോക്തൃ സമൂഹമുണ്ട്. അവരുടെ Google ഡോക്‌സ് അനുഭവം മാറ്റിമറിച്ച സംതൃപ്തരായ ഉപയോക്താക്കളുടെ നിരയിൽ ചേരുക.\n \n🎨 നിങ്ങളുടെ ശൈലിക്ക് അനുയോജ്യമായ ഇഷ്‌ടാനുസൃതമാക്കൽ\n\nനിങ്ങളുടെ എഴുത്ത് അന്തരീക്ഷം വ്യക്തിപരമാക്കുന്നത് ഡാർക്ക് മോഡ് Google ഡോക്‌സിന്റെ ഒരു പ്രധാന നേട്ടമാണ്. നിങ്ങളുടെ ഹൃദയത്തിന്റെ ഉള്ളടക്കത്തിന് ഇഷ്‌ടാനുസൃതമാക്കുക:\n \nഡാർക്ക്‌നെസ് ലെവൽ: നിങ്ങളുടെ മുൻഗണനയുമായി പൊരുത്തപ്പെടുന്ന തരത്തിൽ ഇരുണ്ട നില ക്രമീകരിക്കുക, മൃദുവായ മങ്ങലിൽ നിന്ന് ആഴത്തിലുള്ള ഇരുട്ടിലേക്ക്.\nഫോണ്ട് ഇഷ്‌ടാനുസൃതമാക്കൽ: നിങ്ങളുടെ എഴുത്ത് ശൈലിക്ക് അനുയോജ്യമായ ഫോണ്ട് ശൈലി, വലുപ്പം, നിറം എന്നിവ തിരഞ്ഞെടുക്കുക.\nപശ്ചാത്തല ഓപ്‌ഷനുകൾ: നിങ്ങളുടെ സൗന്ദര്യത്തെ പൂരകമാക്കുന്ന ഒരു നിറത്തിനോ ടെക്‌സ്‌ചറിലോ പശ്ചാത്തലം ക്രമീകരിക്കുക.\nആക്സന്റ് നിറങ്ങൾ: നിർദ്ദിഷ്ട ഡോക്യുമെന്റ് ഘടകങ്ങൾ ഹൈലൈറ്റ് ചെയ്യുന്നതിന് ആക്സന്റ് നിറങ്ങൾ തിരഞ്ഞെടുക്കുക.\n \n🌐 ബ്രൗസറുകളിലുടനീളം അനുയോജ്യത\n\nനിങ്ങൾ Chrome, Firefox അല്ലെങ്കിൽ മറ്റൊരു ബ്രൗസർ ഉപയോഗിച്ചാലും, ബ്ലാക്ക് മോഡ് G ഡോക്‌സ് ക്രോസ് ബ്രൗസർ അനുയോജ്യതയ്‌ക്കായി രൂപകൽപ്പന ചെയ്‌തിരിക്കുന്നു. നിങ്ങളുടെ വെബ് ബ്രൗസർ ചോയ്സ് പരിഗണിക്കാതെ തന്നെ സുഖകരവും ഉൽപ്പാദനക്ഷമവുമായ ഇരുണ്ട തീം ആസ്വദിക്കൂ.\n\n🚀 നിങ്ങളുടെ ഉൽപ്പാദനക്ഷമത വർദ്ധിപ്പിക്കുക\n\nഡാർക്ക് മോഡ് ഗൂഗിൾ ഡോക്‌സ് സൗന്ദര്യശാസ്ത്രം മാത്രമല്ല; ഇത് ഉൽപ്പാദനക്ഷമത വർദ്ധിപ്പിക്കുന്നതിനും നിങ്ങളുടെ എഴുത്ത് അനുഭവം വർദ്ധിപ്പിക്കുന്നതിനും വേണ്ടിയാണ്:\n \nഫോക്കസും ഏകാഗ്രതയും: ഡൈർ തീം തടസ്സങ്ങൾ കുറയ്ക്കുന്നു, തടസ്സങ്ങളില്ലാതെ നിങ്ങളുടെ ജോലിയിൽ ശ്രദ്ധ കേന്ദ്രീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു.\nകണ്ണിന്റെ ആയാസം കുറയുന്നു: ദൈർഘ്യമേറിയ എഴുത്ത് സെഷനുകൾ കൂടുതൽ സുഖകരവും ക്ഷീണം കുറയ്‌ക്കുന്നതുമാക്കുന്ന തെളിച്ചം കുറയുന്നതിന് നിങ്ങളുടെ കണ്ണുകൾ നന്ദി പറയും.\nഎനർജി എഫിഷ്യൻസി: ഡാർക്ക് മോഡ് ജി ഡോക്‌സ് ഉപയോഗിക്കുന്നതിലൂടെ, നിങ്ങളുടെ കണ്ണുകൾ സംരക്ഷിക്കുകയും ഊർജ്ജം സംരക്ഷിക്കുകയും കാർബൺ കാൽപ്പാടുകൾ കുറയ്ക്കുകയും ചെയ്യുന്നു.\n \n🌚 സമാപനത്തിൽ\n\nഡാർക്ക് മോഡ് Google ഡോക്‌സ് എന്നത് സുഖകരവും ഇഷ്ടാനുസൃതമാക്കാവുന്നതും കാര്യക്ഷമവുമായ എഴുത്ത് അനുഭവം ആഗ്രഹിക്കുന്ന ഏതൊരാൾക്കുമുള്ള ആത്യന്തിക Chrome വിപുലീകരണമാണ്. ഒറ്റ ക്ലിക്കിലൂടെ ഇത് സജീവമാക്കുക, നിങ്ങളുടെ മുൻഗണനകൾക്കനുസൃതമായി ഇത് ഇഷ്‌ടാനുസൃതമാക്കുക, നിങ്ങളുടെ കണ്ണുകൾക്ക് എളുപ്പമുള്ള ശ്രദ്ധാശൈഥില്യമില്ലാത്ത അന്തരീക്ഷം ആസ്വദിക്കുക. മികച്ച Google ഡോക്‌സ് അനുഭവത്തിനായി ഡാർക്ക് മോഡ് ജി ഡോക് തിരഞ്ഞെടുത്ത ഉപയോക്താക്കളുടെ സംതൃപ്തരായ കമ്മ്യൂണിറ്റിയിൽ ചേരുക.\n\n🌙 Google ഡോക്‌സ് ഡാർക്ക് മോഡ് - നിങ്ങളുടെ എഴുത്ത് അനുഭവം മെച്ചപ്പെടുത്തുക!\n\nGoogle ഡോക്‌സിൽ ജോലി ചെയ്യുമ്പോൾ നിങ്ങളുടെ സ്‌ക്രീനിലെ അന്ധമായ തിളക്കം മടുപ്പിക്കുന്നതായി നിങ്ങൾ കണ്ടെത്തുന്നുണ്ടോ? കൂടുതൽ സുഖകരവും ദൃശ്യപരവുമായ ഒരു എഴുത്ത് അന്തരീക്ഷത്തിനായി നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ? നിങ്ങളുടെ എഴുത്ത് അനുഭവം രൂപാന്തരപ്പെടുത്താൻ ഡാർക്ക് മോഡ് Google ഡോക്‌സ് ഇവിടെയുള്ളതിനാൽ കൂടുതൽ നോക്കേണ്ട.\n\nഡോക്യുമെന്റുകൾ സൃഷ്‌ടിക്കുമ്പോഴോ എഡിറ്റുചെയ്യുമ്പോഴോ വായിക്കുമ്പോഴോ ഇരുണ്ടതും കൂടുതൽ കണ്ണിന് ഇണങ്ങുന്നതുമായ രൂപം ഇഷ്ടപ്പെടുന്നവർക്കുള്ള ആത്യന്തിക Chrome വിപുലീകരണമാണ് Google ഡോക്‌സ് ഡാർക്ക് മോഡ്. ഈ വിപുലീകരണം ഉപയോഗിച്ച്, നിങ്ങളുടെ Google ഡോക്‌സ് ഇന്റർഫേസ് സുഗമവും ശാന്തവുമായ ഇരുണ്ട തീമിലേക്ക് മാറ്റാനാകും, ഇത് നിങ്ങളുടെ എഴുത്ത് സെഷനുകളെ മുമ്പത്തേക്കാൾ ആസ്വാദ്യകരമാക്കുന്നു. കഠിനമായ തെളിച്ചത്തോട് വിട പറയുക, ശൈലിയിൽ ഉൽപ്പാദനക്ഷമതയോട് ഹലോ.\n\n🌟 ഡാർക്ക് മോഡ് Google ഡോക്‌സിന്റെ പ്രധാന സവിശേഷതകൾ\n\n1. ആയാസരഹിതമായ സജീവമാക്കൽ: ഡാർക്ക് മോഡ് Google ഡോക്‌സ് ഉപയോഗിക്കാൻ അവിശ്വസനീയമാംവിധം എളുപ്പമാണ്. ഒരൊറ്റ ക്ലിക്കിലൂടെ, നിങ്ങളുടെ Google ഡോക്‌സിനായി ഇരുണ്ട തീം സജീവമാക്കാം, കൂടുതൽ സൗകര്യപ്രദവും ശ്രദ്ധ കേന്ദ്രീകരിക്കുന്നതുമായ എഴുത്ത് അന്തരീക്ഷം സൃഷ്‌ടിക്കുന്നു.\n\n2. ഇഷ്‌ടാനുസൃതമാക്കൽ ഓപ്‌ഷനുകൾ: ഒരു വലുപ്പം എല്ലാവർക്കും അനുയോജ്യമല്ലെന്ന് ഞങ്ങൾ മനസ്സിലാക്കുന്നു. അതുകൊണ്ടാണ് ഞങ്ങൾ വിവിധ ഇഷ്‌ടാനുസൃതമാക്കൽ ഓപ്‌ഷനുകൾ വാഗ്ദാനം ചെയ്യുന്നത്, നിങ്ങളുടെ വ്യക്തിഗത മുൻഗണനകളുമായി പൊരുത്തപ്പെടുന്നതിന് വിപുലീകരണം മാറ്റാൻ നിങ്ങളെ അനുവദിക്കുന്നു. ഇരുണ്ട നില, ഫോണ്ട്, പശ്ചാത്തലം എന്നിവ നിങ്ങളുടെ ഇഷ്ടത്തിനനുസരിച്ച് ക്രമീകരിക്കുക.\n\n3. നിങ്ങളുടെ കണ്ണുകൾ സംരക്ഷിക്കുന്നു: നീണ്ട എഴുത്ത് സെഷനുകൾ നിങ്ങളുടെ കണ്ണുകളെ ബാധിക്കും. ഡാർക്ക് മോഡ് ജി ഡോക്യുമെന്റുകൾ നിങ്ങളുടെ രചനാനുഭവം കൂടുതൽ സുഖകരമാക്കിക്കൊണ്ട്, നിങ്ങളുടെ കാഴ്ചയിൽ എളുപ്പമുള്ള, മൃദുവും ഇരുണ്ടതുമായ പശ്ചാത്തലം നൽകിക്കൊണ്ട് കണ്ണിന്റെ ആയാസം കുറയ്ക്കുന്നു.\n\n4. മെച്ചപ്പെട്ട ഫോക്കസ്: ഡാർക്ക് തീം ശ്രദ്ധാശൈഥില്യങ്ങൾ ഇല്ലാതാക്കാനും നിങ്ങളുടെ രചനയിൽ ശ്രദ്ധ അത് ഉള്ളിടത്ത് നിലനിർത്താനും സഹായിക്കുന്നു. നിങ്ങളുടെ ഫോക്കസ് അകറ്റാൻ അനാവശ്യമായ തിളക്കമോ തെളിച്ചമുള്ള സ്‌ക്രീനുകളോ ഇല്ല.\n\n5. എനർജി എഫിഷ്യൻസി: ഡാർക്ക് മോഡ് ഗൂഗിൾ ഡോക്യുമെന്റുകൾ ഉപയോഗിക്കുന്നത് നിങ്ങളുടെ കണ്ണുകൾക്ക് ഗുണം ചെയ്യുക മാത്രമല്ല ഊർജ്ജം സംരക്ഷിക്കുകയും നിങ്ങളുടെ ഉപകരണത്തിന്റെ ആയുസ്സ് വർദ്ധിപ്പിക്കുകയും വൈദ്യുതി ചെലവ് ലാഭിക്കുകയും ചെയ്യുന്നു.\n \n🖥️ അനുയോജ്യതയും പ്രവേശനക്ഷമതയും: ഡാർക്ക് മോഡ് ജി ഡോക്‌സ് എല്ലാ പ്രധാന വെബ് ബ്രൗസറുകൾക്കും അനുയോജ്യമാണ് കൂടാതെ പിസികളിലും ഡെസ്‌ക്‌ടോപ്പുകളിലും ഇത് എളുപ്പത്തിൽ ലഭ്യമാണ്. ഇപ്പോൾ, നിങ്ങൾ തിരഞ്ഞെടുത്ത പ്ലാറ്റ്‌ഫോമിൽ Google ഡോക്‌സ് ഡാർക്ക് മോഡ് ആസ്വദിക്കാം.\n\n🌚 ബ്ലാക്ക് മോഡ് ഗൂഗിൾ എങ്ങനെ ആക്ടിവേറ്റ് ചെയ്യാം, ഡിം മോഡ് ഗൂഗിൾ ഡോക്‌സ് ആക്ടിവേറ്റ് ചെയ്യുന്നത് ഒരു സുഖമാണ്. Chrome വെബ് സ്റ്റോറിൽ നിന്ന് വിപുലീകരണം ഡൗൺലോഡ് ചെയ്‌ത് നിങ്ങളുടെ ബ്രൗസറിലെ ഡാർക്ക് മോഡ് Google ഡോക്‌സ് ഐക്കണിൽ ക്ലിക്ക് ചെയ്യുക. നിങ്ങളുടെ Google ഡോക്യുമെന്റ് പേജ് തൽക്ഷണം ശാന്തമായ ഇരുണ്ട തീമിലേക്ക് മാറും, ഇത് നിങ്ങളുടെ എഴുത്ത് അനുഭവം മെച്ചപ്പെടുത്തും.\n\n📜 നിങ്ങൾക്ക് എന്തുകൊണ്ട് ഈ വിപുലീകരണം ആവശ്യമാണ്?\n\nGoogle ഡോക്‌സ് ഡാർക്ക് മോഡ്: ഡാർക്ക് മോഡ് ജി ഡോക്‌സ് എന്നത് നിങ്ങളുടെ Google ഡോക്കിലേക്ക് ഡാർക്ക് മോഡ് കൊണ്ടുവരുന്നതിനുള്ള കൃത്യമായ പരിഹാരമാണ്, നിങ്ങളുടെ എഴുത്ത് സെഷനുകളിൽ നിങ്ങളുടെ കണ്ണുകൾ സുഖകരമായി തുടരുന്നുവെന്ന് ഉറപ്പാക്കുന്നു.\nമെച്ചപ്പെടുത്തിയ ഉൽപ്പാദനക്ഷമത: ബ്ലാക്ക് തീം നൽകുന്ന ശ്രദ്ധ വ്യതിചലിക്കാത്ത അന്തരീക്ഷം ഉപയോഗിച്ച്, നിങ്ങളുടെ എഴുത്ത് ജോലികളിൽ കൂടുതൽ ശ്രദ്ധയും കാര്യക്ഷമതയും ഉൽപ്പാദനക്ഷമതയും നിങ്ങൾ കണ്ടെത്തും.\n\nനേത്ര സംരക്ഷണം: തെളിച്ചമുള്ള സ്ക്രീനിൽ ദീർഘനേരം എക്സ്പോഷർ ചെയ്യുന്നത് നിങ്ങളുടെ കണ്ണുകൾക്ക് ദോഷം ചെയ്യും. നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് പുറപ്പെടുവിക്കുന്ന പ്രകാശത്തിന്റെ തീവ്രത കുറച്ചുകൊണ്ട് ഡാർക്ക് മോഡ് Google പ്രമാണങ്ങൾ നിങ്ങളുടെ കണ്ണുകളെ സംരക്ഷിക്കുന്നു.\n\nഇഷ്‌ടാനുസൃതമാക്കൽ ഓപ്‌ഷനുകൾ: നിങ്ങളുടെ ഇഷ്ടത്തിനനുസരിച്ച് Google ഡോക് ബ്ലാക്ക് മോഡ് ടൈലർ ചെയ്യുക. നിങ്ങളുടെ വ്യക്തിഗത മുൻഗണനകൾക്ക് അനുസൃതമായി ഡാർക്ക് മോഡ് ക്രമീകരണങ്ങൾ, ഫോണ്ടുകൾ, പശ്ചാത്തലങ്ങൾ എന്നിവ ക്രമീകരിക്കുക.\n\nക്രോസ്-ബ്രൗസർ അനുയോജ്യത: നിങ്ങൾ Chrome, Firefox അല്ലെങ്കിൽ മറ്റൊരു ബ്രൗസർ തിരഞ്ഞെടുക്കുകയാണെങ്കിൽ, ഡിം മോഡ് Google ഡോക്‌സ് ബോർഡിൽ ഉടനീളം അനുയോജ്യമാണ്, അതിനാൽ നിങ്ങൾ തിരഞ്ഞെടുത്ത ബ്രൗസർ എന്തുതന്നെയായാലും നിങ്ങൾക്ക് മോഡ് അനുഭവം ആസ്വദിക്കാനാകും.\n \n📚 പതിവുചോദ്യങ്ങൾ:\n \n1. ഈ വിപുലീകരണം ഉപയോഗിച്ച് ഞാൻ എങ്ങനെയാണ് Google ഡോക്‌സ് ചന്ദ്രനില്ലാത്ത മോഡിൽ ഇടുക? ഡാർക്ക് മോഡ് Google ഡോക്‌സ് സജീവമാക്കുന്നതിന്, Chrome വെബ് സ്റ്റോറിൽ നിന്ന് വിപുലീകരണം ഡൗൺലോഡ് ചെയ്യുക, തുടർന്ന് നിങ്ങളുടെ ബ്രൗസറിലെ Google ഡോക്യുമെന്റ്‌സ് ഡാർക്ക് മോഡ് ഐക്കണിൽ ക്ലിക്കുചെയ്യുക.\n2. ഡെസ്‌ക്‌ടോപ്പിന് ഡാർക്ക് മോഡ് ജി ഡോക്‌സ് ലഭ്യമാണോ? തികച്ചും! ഡാർക്ക് മോഡ് Google ഡോക്‌സ് പിസികൾക്കും ഡെസ്‌ക്‌ടോപ്പുകൾക്കും ലഭ്യമാണ്, നിങ്ങൾ തിരഞ്ഞെടുത്ത പ്ലാറ്റ്‌ഫോമിൽ നിങ്ങൾക്ക് സുഖപ്രദമായ എഴുത്ത് അന്തരീക്ഷം ആസ്വദിക്കാനാകുമെന്ന് ഉറപ്പാക്കുന്നു.\n3. ഡാർക്ക് മോഡ് Google ഡോക്‌സിന്റെ രൂപഭാവം എനിക്ക് ഇഷ്ടാനുസൃതമാക്കാനാകുമോ? അതെ, നിങ്ങൾക്ക് കഴിയും! ഡാർക്ക് മോഡ് Google ഡോക്‌സ് വിവിധ ഇഷ്‌ടാനുസൃതമാക്കൽ ഓപ്‌ഷനുകൾ വാഗ്ദാനം ചെയ്യുന്നു, ഇത് നിങ്ങളുടെ വ്യക്തിഗത മുൻഗണനകൾക്ക് അനുസൃതമായി വിപുലീകരണം ക്രമീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു.\n4. Google ഡോക്‌സിന് നേറ്റീവ് ഡാർക്ക് മോഡ് ഉണ്ടോ? നിർഭാഗ്യവശാൽ, Google ഡോക്‌സ് ഒരു നേറ്റീവ് ഡാർക്ക് മോഡ് വാഗ്ദാനം ചെയ്യുന്നില്ല." + } +} diff --git a/_locales/mr/messages.json b/_locales/mr/messages.json new file mode 100644 index 0000000..110b8c5 --- /dev/null +++ b/_locales/mr/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "आमच्या डार्क मोड Google डॉक्स विस्तारासह कार्यक्षमता वाढवा. वर्धित लेखनासाठी अखंड Google डॉक्स गडद मोडचा अनुभव घ्या." + }, + "appName": { + "message": "गडद मोड Google डॉक्स" + }, + "storeDesc": { + "message": "🌟 स्पर्धकांपेक्षा डार्क मोड Google डॉक्स का निवडायचा?\n\nगडद मोड कार्यक्षमता ऑफर करणार्‍या असंख्य Chrome विस्तारांसह, तुम्हाला कदाचित आश्चर्य वाटेल की डार्क मोड जी डॉक्सला तुमची सर्वोच्च निवड कशामुळे बनते. डार्क मोड Google डॉक्स वेगळे का आहे ते शोधूया:\n\n1. वापरकर्ता-अनुकूल इंटरफेस: गडद मोड Google डॉक्स सुलभ नेव्हिगेशनसाठी अंतर्ज्ञानी इंटरफेस प्रदान करतो. सेटिंग्ज आणि सानुकूलित पर्याय शोधणे एक ब्रीझ आहे.\n2. गती आणि कार्यक्षमता: आमचा विस्तार कार्यप्रदर्शनासाठी ऑप्टिमाइझ केला आहे, हे सुनिश्चित करण्यासाठी की ते आपला ब्राउझर किंवा Google डॉक्स धीमा करणार नाही, गतीशी तडजोड न करता गडद थीम वितरित करते.\n3. नियमित अद्यतने: g docs ब्लॅक मोड Google डॉक्सच्या बदलांशी ताळमेळ ठेवण्यासाठी सतत अद्यतनित होतो, तुमचा गडद मोड अनुभव वर्तमान आणि कार्यशील राहील याची खात्री करून.\n4. प्रतिसादात्मक समर्थन: तुम्हाला समस्या आल्यास किंवा प्रश्न असल्यास, आमचा समर्थन कार्यसंघ त्वरित मदत करण्यास तयार आहे, एक सहज अनुभव सुनिश्चित करण्यासाठी वचनबद्ध आहे.\n5. व्यापक वापरकर्ता आधार: google doc dire मोडमध्ये एक समृद्ध वापरकर्ता समुदाय आहे ज्याची गुणवत्ता आणि विश्वासार्हतेची पुष्टी करणारी सकारात्मक पुनरावलोकने आहेत. समाधानी वापरकर्त्यांच्या श्रेणीत सामील व्हा ज्यांनी त्यांचा Google डॉक्स अनुभव बदलला आहे.\n \n🎨 तुमच्या शैलीनुसार सानुकूलन\n\nतुमचे लेखन वातावरण वैयक्तिकृत करणे हा डार्क मोड गुगल डॉक्सचा मुख्य फायदा आहे. तुमच्या हृदयाच्या सामग्रीनुसार सानुकूलित करा:\n \nअंधाराची पातळी: तुमच्या पसंतीशी जुळण्यासाठी अंधाराची पातळी अ‍ॅडजस्ट करा, हलक्या मंद ते विसर्जित अंधारापर्यंत.\nफॉन्ट कस्टमायझेशन: तुमच्या लेखन शैलीला अनुरूप फॉन्ट शैली, आकार आणि रंग निवडा.\nपार्श्वभूमी पर्याय: पार्श्वभूमी आपल्या सौंदर्याला पूरक असलेल्या रंग किंवा पोतनुसार तयार करा.\nउच्चारण रंग: विशिष्ट दस्तऐवज घटक हायलाइट करण्यासाठी उच्चारण रंग निवडा.\n \n🌐 ब्राउझरमध्ये सुसंगतता\n\nतुम्ही Chrome, Firefox किंवा अन्य ब्राउझर वापरत असलात तरीही, Black Mode G Docs क्रॉस-ब्राउझर सुसंगततेसाठी डिझाइन केलेले आहे. तुमच्या वेब ब्राउझरच्या निवडीची पर्वा न करता आरामदायी आणि उत्पादक गडद थीमचा आनंद घ्या.\n\n🚀 तुमची उत्पादकता वाढवा\n\nडार्क मोड Google डॉक्स केवळ सौंदर्यशास्त्राविषयी नाही; हे उत्पादकता वाढवण्याबद्दल आणि तुमचा लेखन अनुभव वाढवण्याबद्दल आहे:\n \nफोकस आणि एकाग्रता: डायर थीम व्यत्यय न आणता तुमच्या कामावर लक्ष केंद्रित करण्यास अनुमती देऊन विचलित होणे कमी करते.\nडोळ्यांचा कमी झालेला ताण: तुमचे डोळे कमी झालेल्या ब्राइटनेसबद्दल तुमचे आभार मानतील, दीर्घ लेखन सत्रे अधिक आरामदायक आणि कमी थकवा आणतील.\nऊर्जा कार्यक्षमता: डार्क मोड G डॉक्स वापरून, तुम्ही तुमचे डोळे वाचवता आणि तुमचा कार्बन फूटप्रिंट कमी करून ऊर्जा वाचवण्यात मदत करता.\n \n🌚 शेवटी\n\nडार्क मोड Google डॉक्स हा आरामदायी, सानुकूल करण्यायोग्य आणि कार्यक्षम लेखन अनुभव शोधणाऱ्या प्रत्येकासाठी अंतिम Chrome विस्तार आहे. एका क्लिकवर ते सक्रिय करा, ते तुमच्या प्राधान्यांनुसार सानुकूलित करा आणि तुमच्या डोळ्यांना सहज दिसणार्‍या विचलित-मुक्त वातावरणाचा आनंद घ्या. उत्कृष्ट Google डॉक्स अनुभवासाठी डार्क मोड G डॉक निवडलेल्या वापरकर्त्यांच्या समाधानी समुदायात सामील व्हा.\n\n🌙 Google डॉक्स गडद मोड - तुमचा लेखन अनुभव वाढवा!\n\nGoogle डॉक्सवर काम करताना तुम्हाला तुमच्या स्क्रीनची अंधुक चमक थकवणारी वाटते का? तुम्हाला अधिक आरामदायक आणि दृष्यदृष्ट्या आनंददायी लेखन वातावरण हवे आहे का? पुढे पाहू नका कारण डार्क मोड Google डॉक्स तुमच्या लेखन अनुभवाचे रूपांतर करण्यासाठी येथे आहे.\n\nदस्तऐवज तयार करताना, संपादित करताना किंवा वाचताना अधिक गडद, अधिक डोळ्यांना अनुकूल दिसण्यासाठी Google डॉक्स गडद मोड हे अंतिम Chrome विस्तार आहे. या विस्तारासह, तुम्ही तुमच्या Google डॉक्स इंटरफेसला गोंडस आणि सुखदायक गडद थीमवर अखंडपणे स्विच करू शकता, ज्यामुळे तुमची लेखन सत्रे पूर्वीपेक्षा अधिक आनंददायक बनतील. कठोर ब्राइटनेसला निरोप द्या आणि शैलीमध्ये उत्पादकतेला नमस्कार करा.\n\n🌟 डार्क मोड गुगल डॉक्सची प्रमुख वैशिष्ट्ये\n\n1. प्रयत्नरहित सक्रियकरण: गडद मोड Google डॉक्स वापरण्यास आश्चर्यकारकपणे सोपे आहे. फक्त एका क्लिकने, तुम्ही तुमच्या Google डॉकसाठी गडद थीम सक्रिय करू शकता, अधिक आरामदायक आणि लक्ष केंद्रित लेखन वातावरण तयार करू शकता.\n\n2. सानुकूलित पर्याय: आम्ही समजतो की एक आकार सर्वांमध्ये बसत नाही. म्हणूनच आम्ही विविध सानुकूलित पर्याय ऑफर करतो, जे तुम्हाला तुमच्या वैयक्तिक प्राधान्यांशी जुळण्यासाठी विस्तार बदलण्याची परवानगी देतात. तुमच्या आवडीनुसार अंधाराची पातळी, फॉन्ट आणि पार्श्वभूमी समायोजित करा.\n\n3. तुमचे डोळे वाचवतात: दीर्घ लेखन सत्र तुमच्या डोळ्यांवर परिणाम करू शकतात. डार्क मोड जी डॉक्युमेंट्स तुमच्या दृष्टीवर सोपी असलेली सौम्य, गडद पार्श्वभूमी प्रदान करून डोळ्यांचा ताण कमी करते, तुमचा लेखन अनुभव अधिक आरामदायक बनवते.\n\n4. सुधारित फोकस: गडद थीम विचलित होण्यास मदत करते आणि तुमचे लक्ष जेथे आहे - तुमच्या लेखनावर ठेवते. तुमचे फोकस दूर करण्यासाठी आणखी अनावश्यक चमक किंवा चमकदार स्क्रीन नाहीत.\n\n5. ऊर्जा कार्यक्षमता: डार्क मोड Google दस्तऐवज वापरल्याने केवळ तुमच्या डोळ्यांनाच फायदा होत नाही तर ऊर्जा वाचवते, तुमच्या डिव्हाइसचे आयुष्य वाढवते आणि विजेच्या खर्चात बचत होते.\n \n🖥️ सुसंगतता आणि प्रवेशयोग्यता: गडद मोड जी डॉक्स सर्व प्रमुख वेब ब्राउझरशी सुसंगत आहे आणि पीसी आणि डेस्कटॉपवर सहज उपलब्ध आहे. आता, तुम्ही तुमच्या पसंतीच्या प्लॅटफॉर्मवर Google डॉक्स डार्क मोडचा आनंद घेऊ शकता.\n\n🌚 ब्लॅक मोड Google कसे सक्रिय करावे, डिम मोड सक्रिय करणे Google डॉक्स एक ब्रीझ आहे. फक्त Chrome वेब स्टोअरवरून विस्तार डाउनलोड करा आणि तुमच्या ब्राउझरमधील डार्क मोड Google डॉक्स चिन्हावर क्लिक करा. तुमचे Google दस्तऐवज पृष्ठ त्वरित सुखदायक गडद थीमवर स्विच करेल, तुमचा लेखन अनुभव वाढवेल.\n\n📜 तुम्हाला या विस्ताराची गरज का आहे?\n\nगुगल डॉक्स डार्क मोड: डार्क मोड जी डॉक्स हा तुमच्या गुगल डॉकमध्ये गडद मोड आणण्यासाठी निश्चित उपाय आहे, तुमच्या लेखन सत्रादरम्यान तुमचे डोळे आरामशीर राहतील याची खात्री करून.\nवर्धित उत्पादकता: ब्लॅक थीम प्रदान केलेल्या विचलित-मुक्त वातावरणासह, तुम्ही तुमच्या लेखन कार्यांमध्ये स्वतःला अधिक केंद्रित, कार्यक्षम आणि उत्पादक वाटू शकाल.\n\nडोळ्यांचे संरक्षण: चमकदार स्क्रीनवर दीर्घकाळ राहणे तुमच्या डोळ्यांसाठी हानिकारक असू शकते. गडद मोड Google दस्तऐवज तुमच्या डिव्हाइसमधून उत्सर्जित होणाऱ्या प्रकाशाची तीव्रता कमी करून तुमच्या डोळ्यांचे रक्षण करते.\n\nसानुकूलित पर्याय: आपल्या आवडीनुसार ब्लॅक मोड Google डॉक. तुमच्या वैयक्तिक प्राधान्यांनुसार गडद मोड सेटिंग्ज, फॉन्ट आणि पार्श्वभूमी समायोजित करा.\n\nक्रॉस-ब्राउझर सुसंगतता: तुम्ही क्रोम, फायरफॉक्स किंवा अन्य ब्राउझरला प्राधान्य देत असलात तरीही, डिम मोड Google डॉक्स संपूर्ण बोर्डवर सुसंगत आहे, त्यामुळे तुम्ही तुमच्या ब्राउझरची निवड केली तरी मोड अनुभवाचा आनंद घेऊ शकता.\n \n📚 वारंवार विचारले जाणारे प्रश्न:\n \n1. या विस्तारासह मी Google डॉक्सला मूनलेस मोडमध्ये कसे ठेवू? डार्क मोड Google डॉक्स सक्रिय करण्यासाठी, फक्त Chrome वेब स्टोअरवरून विस्तार डाउनलोड करा आणि नंतर तुमच्या ब्राउझरमधील Google दस्तऐवज डार्क मोड चिन्हावर क्लिक करा.\n2. डेस्कटॉपसाठी डार्क मोड G डॉक्स उपलब्ध आहे का? एकदम! डार्क मोड Google डॉक्स पीसी आणि डेस्कटॉप दोन्हीसाठी उपलब्ध आहे, हे सुनिश्चित करून तुम्ही तुमच्या पसंतीच्या प्लॅटफॉर्मवर लेखनाच्या आरामदायी वातावरणाचा आनंद घेऊ शकता.\n३. मी डार्क मोड Google डॉक्सचे स्वरूप सानुकूलित करू शकतो का? होय आपण हे करू शकता! गडद मोड Google दस्तऐवज विविध सानुकूलित पर्याय ऑफर करतो, जे तुम्हाला तुमच्या वैयक्तिक प्राधान्यांनुसार विस्तार तयार करण्यास अनुमती देते.\n4. Google डॉक्समध्ये मूळ गडद मोड आहे का? दुर्दैवाने, Google डॉक्स नेटिव्ह डार्क मोड ऑफर करत नाही." + } +} diff --git a/_locales/ms/messages.json b/_locales/ms/messages.json new file mode 100644 index 0000000..ee223f5 --- /dev/null +++ b/_locales/ms/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Tingkatkan kecekapan dengan Sambungan Dokumen Google Mod Gelap kami. Alami mod gelap Google Docs yang lancar untuk penulisan yang dipertingkatkan." + }, + "appName": { + "message": "Dokumen Google Mod Gelap" + }, + "storeDesc": { + "message": "🌟 Mengapa Pilih Google Docs Mod Gelap Daripada Pesaing?\n\nDengan banyak sambungan Chrome yang menawarkan kefungsian mod gelap, anda mungkin tertanya-tanya apakah yang menjadikan Mod Gelap G Docs pilihan utama anda. Mari kita terokai sebab Google Docs Mod Gelap menonjol:\n\n1. Antara Muka Mesra Pengguna: Google Docs Mod Gelap menyediakan antara muka intuitif untuk navigasi yang mudah. Mencari tetapan dan pilihan penyesuaian adalah mudah.\n2. Kelajuan dan Kecekapan: Sambungan kami dioptimumkan untuk prestasi, memastikan ia tidak akan memperlahankan penyemak imbas atau Dokumen Google anda, memberikan tema gelap tanpa menjejaskan kelajuan.\n3. Kemas Kini Biasa: mod hitam g docs sentiasa dikemas kini untuk mengikuti perubahan Google Docs, memastikan pengalaman mod gelap anda kekal terkini dan berfungsi.\n4. Sokongan Responsif: Jika anda menghadapi masalah atau mempunyai soalan, pasukan sokongan kami bersedia untuk membantu dengan segera, komited untuk memastikan pengalaman yang lancar.\n5. Pangkalan Pengguna Luas: mod google doc dire mempunyai komuniti pengguna yang berkembang maju dengan ulasan positif yang membuktikan kualiti dan kebolehpercayaannya. Sertai barisan pengguna yang berpuas hati yang telah mengubah pengalaman Google Docs mereka.\n \n🎨 Penyesuaian mengikut Gaya Anda\n\nMemperibadikan persekitaran penulisan anda ialah kelebihan utama Dokumen Google Mod Gelap. Sesuaikan sesuka hati anda:\n \nTahap Kegelapan: Laraskan tahap kegelapan agar sepadan dengan pilihan anda, daripada malap lembut kepada kegelapan yang mengasyikkan.\nPenyesuaian Fon: Pilih gaya fon, saiz dan warna yang sesuai dengan gaya penulisan anda.\nPilihan Latar Belakang: Sesuaikan latar belakang dengan warna atau tekstur yang melengkapkan estetika anda.\nWarna Aksen: Pilih warna aksen untuk menyerlahkan elemen dokumen tertentu.\n \n🌐 Keserasian Merentas Pelayar\n\nSama ada anda menggunakan Chrome, Firefox atau penyemak imbas lain, Black Mode G Docs direka untuk keserasian merentas penyemak imbas. Nikmati tema gelap yang selesa dan produktif tanpa mengira pilihan pelayar web anda.\n\n🚀 Tingkatkan Produktiviti Anda\n\nGoogle Docs Mod Gelap bukan sahaja mengenai estetika; ia mengenai meningkatkan produktiviti dan meningkatkan pengalaman menulis anda:\n \nFokus dan Tumpuan: Tema Dire meminimumkan gangguan, membolehkan anda menumpukan perhatian pada kerja anda tanpa gangguan.\nKetegangan Mata Berkurangan: Mata anda akan berterima kasih atas kecerahan yang berkurangan, menjadikan sesi penulisan yang panjang lebih selesa dan kurang memenatkan.\nKecekapan Tenaga: Dengan menggunakan Dark Mode G Docs, anda menjimatkan mata anda dan membantu menjimatkan tenaga, mengurangkan jejak karbon anda.\n \n🌚 Kesimpulannya\n\nGoogle Docs Mod Gelap ialah sambungan Chrome terbaik untuk sesiapa sahaja yang mencari pengalaman menulis yang selesa, boleh disesuaikan dan cekap. Aktifkannya dengan satu klik, sesuaikan mengikut keutamaan anda dan nikmati persekitaran bebas gangguan yang mudah dilihat oleh anda. Sertai komuniti pengguna yang berpuas hati yang telah menjadikan Mod Gelap G Doc pilihan mereka untuk pengalaman Google Docs yang unggul.\n\n🌙 Mod gelap dokumen Google - Tingkatkan Pengalaman Menulis Anda!\n\nAdakah anda mendapati silau skrin anda yang menyilaukan semasa bekerja pada Dokumen Google memenatkan? Adakah anda mengidamkan persekitaran penulisan yang lebih selesa dan menarik secara visual? Tidak perlu mencari lagi kerana Dokumen Google Mod Gelap hadir untuk mengubah pengalaman menulis anda.\n\nMod gelap dokumen Google ialah sambungan Chrome terbaik untuk mereka yang lebih suka penampilan yang lebih gelap dan mesra mata semasa membuat, mengedit atau membaca dokumen. Dengan sambungan ini, anda boleh menukar antara muka Google Docs anda dengan lancar kepada tema gelap yang anggun dan menenangkan, menjadikan sesi penulisan anda lebih menyeronokkan berbanding sebelum ini. Ucapkan selamat tinggal kepada kecerahan yang teruk dan hello kepada produktiviti dalam gaya.\n\n🌟 Ciri Utama Google Docs Mod Gelap\n\n1. Pengaktifan Mudah: Google Docs Mod Gelap adalah sangat mudah untuk digunakan. Dengan hanya satu klik, anda boleh mengaktifkan tema gelap untuk Dokumen Google anda, mewujudkan persekitaran penulisan yang lebih selesa dan fokus.\n\n2. Pilihan Penyesuaian: Kami faham bahawa satu saiz tidak sesuai untuk semua. Itulah sebabnya kami menawarkan pelbagai pilihan penyesuaian, membolehkan anda mengubah suai sambungan agar sepadan dengan pilihan peribadi anda. Laraskan tahap kegelapan, fon dan latar belakang mengikut keinginan anda.\n\n3. Menjimatkan Mata Anda: Sesi penulisan yang panjang boleh menjejaskan mata anda. Dokumen Mod Gelap G mengurangkan ketegangan mata dengan menyediakan latar belakang yang lembut dan gelap yang mudah pada penglihatan anda, menjadikan pengalaman menulis anda lebih selesa.\n\n4. Fokus yang Dipertingkat: Tema gelap membantu menghilangkan gangguan dan mengekalkan perhatian anda di tempat yang sepatutnya – pada tulisan anda. Tiada lagi silau atau skrin terang yang tidak perlu untuk menarik tumpuan anda.\n\n5. Kecekapan Tenaga: Menggunakan Dokumen Google Mod Gelap bukan sahaja memberi manfaat kepada mata anda tetapi juga menjimatkan tenaga, memanjangkan hayat peranti anda dan menjimatkan kos elektrik.\n \n🖥️ Keserasian dan Kebolehcapaian: Dark Mode G Docs serasi dengan semua penyemak imbas web utama dan tersedia pada PC dan desktop. Kini, anda boleh menikmati mod gelap Google Docs pada platform pilihan anda.\n\n🌚 Cara Mengaktifkan Google Mod Hitam, Mengaktifkan Mod Malap Google Docs adalah mudah.Cuma muat turun sambungan daripada Kedai Web Chrome dan klik pada ikon Google Docs Mod Gelap dalam penyemak imbas anda. Halaman Google Documents anda akan bertukar serta-merta kepada tema gelap yang menenangkan, meningkatkan pengalaman menulis anda.\n\n📜 Mengapa Anda Memerlukan Sambungan ini?\n\nMod Gelap Google Docs: Mod Gelap G Docs ialah penyelesaian muktamad untuk membawa mod gelap kepada Dokumen Google anda, memastikan mata anda kekal selesa semasa sesi penulisan anda.\nProduktiviti Dipertingkat: Dengan persekitaran bebas gangguan yang disediakan oleh tema hitam, anda akan mendapati diri anda lebih fokus, cekap dan produktif dalam tugasan penulisan anda.\n\nPerlindungan Mata: Pendedahan berpanjangan kepada skrin terang boleh membahayakan mata anda. Google Documents Mod Gelap melindungi mata anda dengan mengurangkan keamatan cahaya yang dipancarkan daripada peranti anda.\n\nPilihan Penyesuaian: Sesuaikan Mod Hitam Google Doc mengikut keinginan anda. Laraskan tetapan mod gelap, fon dan latar belakang agar sesuai dengan pilihan individu anda.\n\nKeserasian Merentas Penyemak Imbas: Sama ada anda lebih suka Chrome, Firefox atau penyemak imbas lain, Mod Malap Google Docs serasi di seluruh papan, jadi anda boleh menikmati pengalaman mod tidak kira pilihan penyemak imbas anda.\n \n📚 Soalan Lazim:\n \n1. Bagaimanakah cara saya meletakkan Dokumen Google dalam mod tanpa bulan dengan sambungan ini? Untuk mengaktifkan Dokumen Google Mod Gelap, cuma muat turun sambungan daripada Kedai Web Chrome, dan kemudian klik pada ikon mod gelap dokumen Google dalam penyemak imbas anda.\n2. Adakah Dokumen Mod Gelap G tersedia untuk desktop? Sudah tentu! Google Docs Mod Gelap tersedia untuk kedua-dua PC dan desktop, memastikan anda boleh menikmati persekitaran penulisan yang selesa pada platform pilihan anda.\n3. Bolehkah saya menyesuaikan penampilan Google Docs Mod Gelap? Ya awak boleh! Google Docs Mod Gelap menawarkan pelbagai pilihan penyesuaian, membolehkan anda menyesuaikan sambungan dengan pilihan peribadi anda.\n4. Adakah Dokumen Google mempunyai mod gelap asli? Malangnya, Dokumen Google tidak menawarkan mod gelap asli." + } +} diff --git a/_locales/nl/messages.json b/_locales/nl/messages.json new file mode 100644 index 0000000..bfa7ab2 --- /dev/null +++ b/_locales/nl/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Verhoog de efficiëntie met onze Google Docs-extensie met donkere modus. Ervaar de naadloze donkere modus van Google Docs om beter te schrijven." + }, + "appName": { + "message": "Donkere modus Google Documenten" + }, + "storeDesc": { + "message": "Waarom Google Documenten in donkere modus kiezen in plaats van die van concurrenten?\n\nMet tal van Chrome-extensies die functionaliteit voor donkere modus bieden, vraag je je misschien af waarom Google Documenten met donkere modus de beste keuze is. Laten we eens kijken waarom Google Documenten met donkere modus eruit springen:\n\n1. Gebruiksvriendelijke interface: Google Documenten in donkere modus biedt een intuïtieve interface voor eenvoudige navigatie. Het vinden van instellingen en aanpassingsopties is een fluitje van een cent.\n2. Snelheid en efficiëntie: Onze extensie is geoptimaliseerd voor prestaties, zodat uw browser of Google Documenten er niet langzamer van worden.\n3. Regelmatige updates: g docs black mode wordt voortdurend bijgewerkt om gelijke tred te houden met de wijzigingen in Google Documenten, zodat uw ervaring met de donkere modus actueel en functioneel blijft.\n4. Responsieve ondersteuning: Als u problemen ondervindt of vragen hebt, staat ons ondersteuningsteam klaar om u snel te helpen en te zorgen voor een soepele ervaring.\n5. Breed gebruikersbestand: google doc dire mode heeft een bloeiende gebruikersgemeenschap met positieve beoordelingen die getuigen van de kwaliteit en betrouwbaarheid. Sluit u aan bij de tevreden gebruikers die hun Google Docs ervaring hebben getransformeerd.\n \nAanpassing aan uw stijl\n\nHet personaliseren van uw schrijfomgeving is een belangrijk voordeel van Google Documenten in de donkere modus. Pas het naar hartenlust aan:\n \nDonkerheidsniveau: Pas het donkerheidsniveau aan uw voorkeur aan, van een zachte schemering tot een meeslepende duisternis.\nAanpassen lettertype: Kies de letterstijl, -grootte en -kleur die bij jouw schrijfstijl past.\nAchtergrondopties: Pas de achtergrond aan op een kleur of textuur die bij jouw esthetiek past.\nAccentkleuren: Selecteer accentkleuren om specifieke documentelementen te benadrukken.\n \nCompatibiliteit tussen browsers\n\nOf u nu Chrome, Firefox of een andere browser gebruikt, G Docs met zwarte modus is ontworpen voor browseroverschrijdende compatibiliteit. Geniet van een comfortabel en productief donker thema, ongeacht de keuze van je webbrowser.\n\nVerhoog uw productiviteit\n\nBij Google Documenten met donkere modus gaat het niet alleen om esthetiek, maar ook om het verhogen van uw productiviteit en het verbeteren van uw schrijfervaring:\n \nFocus en concentratie: Het donkere thema minimaliseert afleidingen, zodat u zich kunt concentreren op uw werk zonder onderbrekingen.\nMinder vermoeide ogen: Je ogen zullen je dankbaar zijn voor de verminderde helderheid, waardoor lange schrijfsessies comfortabeler en minder vermoeiend worden.\nEnergie-efficiëntie: Door de donkere modus van G Docs te gebruiken, spaart u uw ogen en helpt u energie te besparen, waardoor uw ecologische voetafdruk kleiner wordt.\n \nConclusie\n\nGoogle Documenten in donkere modus is de ultieme Chrome-extensie voor iedereen die op zoek is naar een comfortabele, aanpasbare en efficiënte schrijfervaring. Activeer de modus met één klik, pas deze aan uw voorkeuren aan en geniet van een omgeving zonder afleiding die uw ogen ontziet. Sluit u aan bij de tevreden community van gebruikers die van G Doc met donkere modus hun eerste keuze hebben gemaakt voor een superieure Google Docs-ervaring.\n\n🌙 Google Docs donkere modus - Verbeter uw schrijfervaring!\n\nVindt u de verblindende schittering van uw scherm tijdens het werken in Google Documenten vermoeiend? Verlangt u naar een meer comfortabele en visueel aangename schrijfomgeving? Zoek niet verder, want de donkere modus van Google Documenten is hier om uw schrijfervaring te transformeren.\n\nDe donkere modus van Google Documenten is de ultieme Chrome-extensie voor degenen die de voorkeur geven aan een donkerder, oogvriendelijker uiterlijk bij het maken, bewerken of lezen van documenten. Met deze extensie kunt u uw Google Docs-interface naadloos overschakelen naar een gestroomlijnd en rustgevend donker thema, waardoor uw schrijfsessies aangenamer worden dan ooit tevoren. Zeg vaarwel tegen de harde helderheid en hallo tegen productiviteit in stijl.\n\nBelangrijkste functies van Google Docs met donkere modus\n\n1. Moeiteloze activering: Google Documenten met donkere modus is ongelooflijk eenvoudig te gebruiken. Met één klik activeert u het donkere thema voor uw Google-documenten, waardoor u comfortabeler en gerichter kunt schrijven.\n\n2. Aanpassingsopties: We begrijpen dat één maat niet voor iedereen past. Daarom bieden we verschillende aanpassingsopties, zodat u de extensie kunt aanpassen aan uw persoonlijke voorkeuren. Pas het donkerheidsniveau, het lettertype en de achtergrond naar wens aan.\n\n3. Spaart je ogen: Lange schrijfsessies kunnen een tol eisen van je ogen. De donkere modus van G-documenten vermindert vermoeide ogen door een zachte, donkere achtergrond te bieden die uw zicht ontziet, waardoor u comfortabeler kunt schrijven.\n\n4. Verbeterde focus: Het donkere thema helpt afleidingen te elimineren en houdt je aandacht waar die hoort - bij het schrijven. Geen onnodige schitteringen of heldere schermen die je aandacht afleiden.\n\n5. Energie-efficiëntie: Het gebruik van Google-documenten in de donkere modus is niet alleen goed voor uw ogen, maar bespaart ook energie, waardoor uw apparaat langer meegaat en u bespaart op elektriciteitskosten.\n \n6. 🖥️ Compatibiliteit en toegankelijkheid: G Documenten in donkere modus is compatibel met alle belangrijke webbrowsers en is direct beschikbaar op pc's en desktops. U kunt nu genieten van de donkere modus van Google Documenten op het platform van uw voorkeur.\n\n🌚 Hoe activeer je de zwarte modus van Google, De donkere modus van Google Documenten activeren is een fluitje van een cent. Download de extensie gewoon uit de Chrome Web Store en klik op het pictogram voor Google Documenten in donkere modus in je browser. Uw Google Documenten-pagina schakelt direct over naar het rustgevende donkere thema, waardoor uw schrijfervaring wordt verbeterd.\n\nWaarom hebt u deze extensie nodig?\n\nGoogle Documenten donkere modus: Dark Mode G Docs is de definitieve oplossing om de donkere modus naar uw Google Docs te brengen, zodat uw ogen comfortabel blijven tijdens uw schrijfsessies.\nVerbeterde productiviteit: Met de afleidingsvrije omgeving die het zwarte thema biedt, zult u merken dat u meer gefocust, efficiënter en productiever bent tijdens uw schrijftaken.\n\nOogbescherming: Langdurige blootstelling aan een helder scherm kan schadelijk zijn voor uw ogen. De donkere modus van Google Documenten beschermt uw ogen door de intensiteit van het licht van uw apparaat te verminderen.\n\nAanpassingsopties: Pas Google Documenten in donkere modus aan uw wensen aan. Pas de instellingen voor de donkere modus, lettertypen en achtergronden aan uw persoonlijke voorkeuren aan.\n\nBrowseroverschrijdende compatibiliteit: Of u nu Chrome, Firefox of een andere browser verkiest, Google Documenten in de donkere modus is compatibel over de hele linie, zodat u kunt genieten van de moduservaring ongeacht uw browserkeuze.\n \nVeelgestelde vragen:\n \n1. Hoe zet ik Google Documenten in de donkere modus met deze extensie? Als u Google Documenten in donkere modus wilt activeren, downloadt u de extensie gewoon uit de Chrome Web Store en klikt u vervolgens op het pictogram voor de donkere modus van Google Documenten in uw browser.\n2. Is G Documenten in donkere modus beschikbaar voor desktop? Absoluut! Google Documenten in donkere modus is beschikbaar voor zowel pc's als desktops, zodat u kunt genieten van een comfortabele schrijfomgeving op het platform van uw voorkeur.\n3. Kan ik het uiterlijk van Google Documenten in donkere modus aanpassen? Ja, dat kan! Google Documenten in donkere modus biedt verschillende aanpassingsopties, zodat u de extensie kunt aanpassen aan uw persoonlijke voorkeuren.\n4. Heeft Google Documenten een eigen donkere modus? Helaas biedt Google Documenten geen eigen donkere modus." + } +} diff --git a/_locales/no/messages.json b/_locales/no/messages.json new file mode 100644 index 0000000..a4f4842 --- /dev/null +++ b/_locales/no/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Øk effektiviteten med vår utvidelse for Google Dokumenter i mørk modus. Opplev sømløs mørk modus i Google Dokumenter for bedre skriving." + }, + "appName": { + "message": "Google Dokumenter i mørk modus" + }, + "storeDesc": { + "message": "🌟 Hvorfor velge Google Docs i mørk modus fremfor konkurrentene?\n\nMed en rekke Chrome-utvidelser som tilbyr mørk modus-funksjonalitet, lurer du kanskje på hva som gjør Dark Mode G Docs til ditt førstevalg. La oss se nærmere på hvorfor Dark Mode Google Docs skiller seg ut:\n\n1. Brukervennlig grensesnitt: Dark Mode Google Docs har et intuitivt grensesnitt som gjør det enkelt å navigere. Det er enkelt å finne innstillinger og tilpasningsmuligheter.\n2. Hastighet og effektivitet: Utvidelsen vår er optimalisert for ytelse, slik at den ikke gjør nettleseren eller Google Dokumenter tregere, og gir et mørkt tema uten at det går på bekostning av hastigheten.\n3. Regelmessige oppdateringer: g docs black mode oppdateres kontinuerlig for å holde tritt med endringene i Google Docs, slik at du alltid får en oppdatert og funksjonell opplevelse i mørk modus.\n4. Responsiv kundestøtte: Hvis du støter på problemer eller har spørsmål, er supportteamet vårt klar til å hjelpe deg raskt og sørger for at du får en problemfri opplevelse.\n5. Bred brukerbase: google doc dire mode har et blomstrende brukerfellesskap med positive anmeldelser som vitner om kvalitet og pålitelighet. Slutt deg til de mange fornøyde brukerne som har fått en helt ny Google Docs-opplevelse.\n \n🎨 Tilpassing for å passe din stil\n\nEn viktig fordel med Google Dokumenter i mørk modus er at du kan tilpasse skrivemiljøet ditt. Du kan tilpasse etter eget ønske:\n \nMørkenivå: Juster mørkenivået slik at det passer til dine preferanser, fra en svak nedtoning til et oppslukende mørke.\nTilpasning av skrifttype: Velg skrifttype, størrelse og farge som passer til din skrivestil.\nBakgrunnsalternativer: Skreddersy bakgrunnen til en farge eller tekstur som passer til din estetikk.\nAksentfarger: Velg aksentfarger for å fremheve spesifikke dokumentelementer.\n \n🌐 Kompatibilitet på tvers av nettlesere\n\nEnten du bruker Chrome, Firefox eller en annen nettleser, er Black Mode G Docs designet for kompatibilitet på tvers av nettlesere. Du får et komfortabelt og produktivt mørkt tema uansett hvilken nettleser du bruker.\n\n🚀 Øk produktiviteten din\n\nGoogle Dokumenter i mørk modus handler ikke bare om estetikk, men også om å øke produktiviteten og forbedre skriveopplevelsen:\n \nFokus og konsentrasjon: Dire-temaet minimerer distraksjoner, slik at du kan konsentrere deg om arbeidet ditt uten avbrytelser.\nMindre belastning på øynene: Øynene dine vil takke deg for den reduserte lysstyrken, noe som gjør lange skriveøkter mer behagelige og mindre anstrengende.\nEnergieffektivitet: Når du bruker G Docs i mørk modus, sparer du øynene dine og bidrar til å spare energi, noe som reduserer karbonavtrykket ditt.\n \n🌚 Konklusjon\n\nDark Mode Google Docs er den ultimate Chrome-utvidelsen for alle som ønsker en komfortabel, tilpassbar og effektiv skriveopplevelse. Du aktiverer den med ett enkelt klikk, tilpasser den etter dine preferanser og nyter et miljø uten forstyrrelser som er skånsomt for øynene. Bli en del av det fornøyde brukerfellesskapet som har valgt Dark Mode G Doc for å få en overlegen Google Docs-opplevelse.\n\n🌙 Google Docs mørk modus - gjør skriveopplevelsen bedre!\n\nSynes du det er slitsomt med det blendende gjenskinnet fra skjermen når du jobber med Google Dokumenter? Lengter du etter et mer behagelig og visuelt tiltalende skrivemiljø? Da trenger du ikke lete lenger, for Google Dokumenter i mørk modus er her for å forandre skriveopplevelsen din.\n\nGoogle Docs Dark Mode er den ultimate Chrome-utvidelsen for deg som foretrekker et mørkere og mer øyevennlig utseende når du oppretter, redigerer eller leser dokumenter. Med denne utvidelsen kan du sømløst bytte Google Docs-grensesnittet til et elegant og beroligende mørkt tema, noe som gjør skriveøktene dine morsommere enn noensinne. Si farvel til den skarpe lysstyrken og hei til produktivitet med stil.\n\n🌟 Viktige funksjoner i Google Dokumenter i mørk modus\n\n1. Enkel aktivering: Google Dokumenter i mørk modus er utrolig enkelt å bruke. Med bare ett enkelt klikk kan du aktivere det mørke temaet i Google Docs og skape et mer komfortabelt og fokusert skrivemiljø.\n\n2. Muligheter for tilpasning: Vi forstår at én størrelse ikke passer alle. Derfor tilbyr vi ulike tilpasningsalternativer, slik at du kan tilpasse utvidelsen til dine personlige preferanser. Du kan justere mørketall, skrifttype og bakgrunn etter eget ønske.\n\n3. Skåner øynene: Lange skriveøkter kan være slitsomt for øynene. Dark Mode G Documents reduserer belastningen på øynene ved å gi en mild, mørk bakgrunn som er skånsom for synet, noe som gjør skriveopplevelsen mer behagelig.\n\n4. Bedre fokus: Det mørke temaet bidrar til å eliminere distraksjoner og holder oppmerksomheten der den hører hjemme - på det du skriver. Nå er det slutt på unødvendig gjenskinn og lyssterke skjermer som tar fokuset fra deg.\n\n5. Energieffektivitet: Bruk av mørk modus i Google-dokumenter er ikke bare bra for øynene dine, men sparer også energi, forlenger enhetens levetid og sparer strømutgifter.\n \n🖥️ Kompatibilitet og tilgjengelighet: Dark Mode G Docs er kompatibel med alle de store nettleserne og er lett tilgjengelig på PC-er og stasjonære datamaskiner. Nå kan du bruke Google Dokumenter i mørk modus på den plattformen du foretrekker.\n\n🌚 Slik aktiverer du Google i mørk modus: Det er enkelt å aktivere Google Dokumenter i mørk modus. Bare last ned utvidelsen fra Chrome Web Store og klikk på ikonet for Google Dokumenter i mørk modus i nettleseren din. Google Dokumenter-siden din skifter umiddelbart til et beroligende mørkt tema, noe som forbedrer skriveopplevelsen.\n\n📜 Hvorfor trenger du denne utvidelsen?\n\nGoogle Dokumenter i mørk modus: Dark Mode G Docs er den definitive løsningen for å gi Google Docs mørk modus, slik at øynene dine forblir komfortable under skriveøktene.\nØkt produktivitet: Det svarte temaet gir deg et miljø uten distraksjoner, og du vil oppleve at du er mer fokusert, effektiv og produktiv når du skriver.\n\nBeskyttelse av øynene: Langvarig eksponering for en lys skjerm kan være skadelig for øynene. Mørk modus i Google Documents beskytter øynene dine ved å redusere lysintensiteten fra enheten.\n\nMuligheter for tilpasning: Skreddersy Google Dokumenter i mørk modus etter eget ønske. Juster innstillingene for mørk modus, skrifttyper og bakgrunner slik at de passer dine individuelle preferanser.\n\nKompatibilitet på tvers av nettlesere: Uansett om du foretrekker Chrome, Firefox eller en annen nettleser, er Google Dokumenter i mørk modus kompatible på tvers av alle nettlesere, slik at du kan nyte opplevelsen uansett hvilken nettleser du bruker.\n \n📚 Vanlige spørsmål:\n \n1. Hvordan setter jeg Google Dokumenter i måneløs modus med denne utvidelsen? Du aktiverer Google Dokumenter i mørk modus ved å laste ned utvidelsen fra Chrome Web Store og deretter klikke på ikonet for Google Dokumenter i mørk modus i nettleseren.\n2. Er Dark Mode G Docs tilgjengelig for PC? Absolutt! Google Dokumenter i mørk modus er tilgjengelig for både PC-er og stasjonære datamaskiner, slik at du kan nyte et komfortabelt skrivemiljø på den plattformen du foretrekker.\n3. Kan jeg tilpasse utseendet til Google Dokumenter i mørk modus? Ja, det kan du! Dark Mode Google Docs har en rekke tilpasningsmuligheter, slik at du kan skreddersy utvidelsen etter dine personlige preferanser.\n4. Har Google Dokumenter en innebygd mørk modus? Google Dokumenter har dessverre ingen innebygd mørk modus." + } +} diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json new file mode 100644 index 0000000..87f3db0 --- /dev/null +++ b/_locales/pl/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Zwiększ wydajność dzięki naszemu rozszerzeniu do Dokumentów Google w trybie ciemnym. Korzystaj z płynnego trybu ciemnego Dokumentów Google, aby usprawnić pisanie." + }, + "appName": { + "message": "Dokumenty Google w trybie ciemnym" + }, + "storeDesc": { + "message": "Dlaczego warto wybrać tryb ciemny w Dokumentach Google?\n\nBiorąc pod uwagę liczne rozszerzenia Chrome oferujące funkcję trybu ciemnego, możesz się zastanawiać, co sprawia, że Tryb Ciemny Dokumentów Google jest najlepszym wyborem. Przyjrzyjmy się, dlaczego Tryb Ciemny Dokumentów Google wyróżnia się na tle konkurencji:\n\n1. Przyjazny dla użytkownika interfejs: Tryb ciemny Dokumentów Google zapewnia intuicyjny interfejs ułatwiający nawigację. Znalezienie ustawień i opcji dostosowywania jest dziecinnie proste.\n2. Szybkość i wydajność: Nasze rozszerzenie jest zoptymalizowane pod kątem wydajności, dzięki czemu nie spowalnia przeglądarki ani Dokumentów Google, zapewniając ciemny motyw bez uszczerbku dla szybkości.\n3. Regularne aktualizacje: czarny tryb g docs jest stale aktualizowany, aby dotrzymać kroku zmianom w Dokumentach Google, zapewniając aktualność i funkcjonalność trybu ciemnego.\n4. Responsywne wsparcie: Jeśli napotkasz problemy lub masz pytania, nasz zespół wsparcia jest gotowy do szybkiej pomocy, aby zapewnić płynne działanie.\n5. Szeroka baza użytkowników: google doc dire mode ma dobrze prosperującą społeczność użytkowników z pozytywnymi recenzjami potwierdzającymi jego jakość i niezawodność. Dołącz do grona zadowolonych użytkowników, którzy zmienili swoje doświadczenia z Dokumentami Google.\n \nDostosowanie do własnego stylu\n\nPersonalizacja środowiska pracy jest kluczową zaletą trybu ciemnego Dokumentów Google. Dostosuj je do swoich potrzeb:\n \nPoziom ciemności: Dostosuj poziom przyciemnienia do swoich preferencji, od delikatnego przyciemnienia do wciągającej ciemności.\nDostosowanie czcionki: Wybierz styl, rozmiar i kolor czcionki, który pasuje do twojego stylu pisania.\nOpcje tła: Dostosuj tło do koloru lub tekstury, która uzupełnia twoją estetykę.\nKolory akcentujące: Wybierz kolory akcentujące, aby wyróżnić określone elementy dokumentu.\n \nKompatybilność z różnymi przeglądarkami\n\nNiezależnie od tego, czy korzystasz z Chrome, Firefox czy innej przeglądarki, czarny tryb G Docs został zaprojektowany z myślą o kompatybilności między przeglądarkami. Ciesz się wygodnym i produktywnym ciemnym motywem niezależnie od wybranej przeglądarki internetowej.\n\nZwiększ swoją produktywność\n\nCiemny tryb Dokumentów Google to nie tylko estetyka; chodzi o zwiększenie produktywności i poprawę komfortu pisania:\n \nSkupienie i Koncentracja: Motyw Dire minimalizuje rozpraszanie uwagi, pozwalając skoncentrować się na pracy bez zakłóceń.\nMniejsze zmęczenie oczu: Twoje oczy będą Ci wdzięczne za zmniejszoną jasność, dzięki czemu długie sesje pisania będą bardziej komfortowe i mniej męczące.\nEnergooszczędność: Korzystając z trybu ciemnego G Docs, oszczędzasz oczy i pomagasz oszczędzać energię, zmniejszając swój ślad węglowy.\n \nPodsumowanie\n\nTryb ciemny Dokumentów Google to najlepsze rozszerzenie Chrome dla każdego, kto szuka wygodnego, konfigurowalnego i wydajnego pisania. Aktywuj go jednym kliknięciem, dostosuj do swoich preferencji i ciesz się środowiskiem bez rozpraszania uwagi, które jest przyjazne dla oczu. Dołącz do zadowolonej społeczności użytkowników, którzy wybrali Tryb Ciemny G Doc, aby uzyskać doskonałe wrażenia z korzystania z Dokumentów Google.\n\n🌙 Tryb ciemny Dokumentów Google - Zwiększ komfort pisania!\n\nCzy oślepiający blask ekranu podczas pracy w Dokumentach Google jest dla ciebie męczący? Tęsknisz za bardziej komfortowym i przyjemnym wizualnie środowiskiem do pisania? Nie szukaj dalej, ponieważ tryb ciemny Dokumentów Google jest tutaj, aby zmienić twoje wrażenia z pisania.\n\nTryb ciemny Dokumentów Google to najlepsze rozszerzenie Chrome dla tych, którzy preferują ciemniejszy, bardziej przyjazny dla oczu wygląd podczas tworzenia, edytowania lub czytania dokumentów. Dzięki temu rozszerzeniu możesz płynnie przełączyć interfejs Dokumentów Google na elegancki i kojący ciemny motyw, dzięki czemu sesje pisania będą przyjemniejsze niż kiedykolwiek wcześniej. Pożegnaj się z ostrą jasnością i przywitaj produktywność w dobrym stylu.\n\nKluczowe cechy trybu ciemnego Dokumentów Google\n\n1. Aktywacja bez wysiłku: Tryb ciemny Dokumentów Google jest niezwykle łatwy w użyciu. Wystarczy jedno kliknięcie, aby aktywować ciemny motyw dla Dokumentów Google, tworząc bardziej komfortowe i skoncentrowane środowisko do pisania.\n\n2. Opcje dostosowywania: Rozumiemy, że jeden rozmiar nie pasuje do wszystkich. Dlatego też oferujemy różne opcje dostosowywania, pozwalające na dopasowanie rozszerzenia do osobistych preferencji. Dostosuj poziom przyciemnienia, czcionkę i tło do swoich upodobań.\n\n3. Oszczędza oczy: Długie sesje pisania mogą być męczące dla oczu. Tryb ciemny G Documents zmniejsza zmęczenie oczu, zapewniając delikatne, ciemne tło, które jest łagodne dla wzroku, dzięki czemu pisanie jest bardziej komfortowe.\n\n4. Lepsze skupienie: Ciemny motyw pomaga wyeliminować czynniki rozpraszające i utrzymać uwagę tam, gdzie powinna - na pisaniu. Koniec z niepotrzebnymi odblaskami lub jasnymi ekranami, które odciągają uwagę.\n\n5. Efektywność energetyczna: Korzystanie z trybu ciemnego w Dokumentach Google nie tylko chroni oczy, ale także oszczędza energię, wydłużając żywotność urządzenia i oszczędzając na kosztach energii elektrycznej.\n \n🖥️ Kompatybilność i dostępność: Tryb ciemny Dokumentów Google jest kompatybilny ze wszystkimi głównymi przeglądarkami internetowymi i jest łatwo dostępny na komputerach PC i stacjonarnych. Teraz możesz cieszyć się trybem ciemnym Dokumentów Google na preferowanej platformie.\n\nJak aktywować tryb czarny Google, Aktywacja trybu ciemnego Dokumentów Google jest bardzo prosta. Wystarczy pobrać rozszerzenie z Chrome Web Store i kliknąć ikonę trybu ciemnego Dokumentów Google w przeglądarce. Strona Dokumentów Google natychmiast przełączy się na kojący ciemny motyw, poprawiając komfort pisania.\n\nDlaczego potrzebujesz tego rozszerzenia?\n\nTryb ciemny Dokumentów Google: Dark Mode G Docs to ostateczne rozwiązanie wprowadzające tryb ciemny do Dokumentów Google, zapewniając komfort dla oczu podczas sesji pisania.\nZwiększona produktywność: Dzięki wolnemu od rozpraszania środowisku, które zapewnia czarny motyw, będziesz bardziej skoncentrowany, wydajny i produktywny podczas pisania.\n\nOchrona oczu: Długotrwała ekspozycja na jasny ekran może być szkodliwa dla oczu. Tryb ciemny Dokumentów Google chroni oczy, zmniejszając intensywność światła emitowanego przez urządzenie.\n\nOpcje dostosowywania: Dostosuj tryb ciemny Dokumentów Google do swoich upodobań. Dostosuj ustawienia trybu ciemnego, czcionki i tła do swoich indywidualnych preferencji.\n\nKompatybilność z różnymi przeglądarkami: Niezależnie od tego, czy preferujesz Chrome, Firefox, czy inną przeglądarkę, Dokumenty Google w trybie przyciemnionym są kompatybilne ze wszystkimi przeglądarkami, dzięki czemu możesz cieszyć się trybem bez względu na wybraną przeglądarkę.\n \nNajczęściej zadawane pytania:\n \n1. Jak przełączyć Dokumenty Google w tryb bezksiężycowy za pomocą tego rozszerzenia? Aby aktywować tryb ciemny Dokumentów Google, wystarczy pobrać rozszerzenie z Chrome Web Store, a następnie kliknąć ikonę trybu ciemnego Dokumentów Google w przeglądarce.\n2. Czy tryb ciemny Dokumentów Google jest dostępny dla komputerów stacjonarnych? Jak najbardziej! Tryb ciemny Dokumentów Google jest dostępny zarówno dla komputerów PC, jak i stacjonarnych, zapewniając wygodne środowisko do pisania na preferowanej platformie.\n3. Czy mogę dostosować wygląd Dokumentów Google w trybie ciemnym? Tak, możesz! Tryb ciemny Dokumentów Google oferuje różne opcje personalizacji, pozwalając ci dostosować rozszerzenie do twoich osobistych preferencji.\n4. Czy Dokumenty Google mają natywny tryb ciemny? Niestety, Dokumenty Google nie oferują natywnego trybu ciemnego." + } +} diff --git a/_locales/pt_BR/messages.json b/_locales/pt_BR/messages.json new file mode 100644 index 0000000..6d5dee2 --- /dev/null +++ b/_locales/pt_BR/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Aumente a eficiência com a nossa extensão Dark Mode do Google Docs. Experimente o modo escuro do Google Docs sem interrupções para melhorar a escrita." + }, + "appName": { + "message": "Modo escuro do Google Docs" + }, + "storeDesc": { + "message": "🌟 Por que escolher o Google Docs no modo escuro em vez dos concorrentes?\n\nCom várias extensões do Chrome que oferecem a funcionalidade do modo escuro, você pode se perguntar o que torna o Google Docs no modo escuro a sua melhor opção. Vamos explorar por que o Google Docs no modo escuro se destaca:\n\n1. Interface amigável ao usuário: O Google Docs no modo escuro oferece uma interface intuitiva para facilitar a navegação. É muito fácil encontrar configurações e opções de personalização.\n2. Velocidade e eficiência: Nossa extensão é otimizada para desempenho, garantindo que não deixará seu navegador ou o Google Docs mais lento, oferecendo um tema escuro sem comprometer a velocidade.\n3. Atualizações regulares: o modo preto do g docs é atualizado continuamente para acompanhar as alterações do Google Docs, garantindo que sua experiência no modo escuro permaneça atualizada e funcional.\n4. Suporte ágil: Se você encontrar problemas ou tiver dúvidas, nossa equipe de suporte estará pronta para ajudar prontamente, empenhada em garantir uma experiência tranquila.\n5. Ampla base de usuários: o modo escuro do Google Doc tem uma comunidade de usuários próspera, com avaliações positivas que atestam sua qualidade e confiabilidade. Junte-se ao grupo de usuários satisfeitos que transformaram sua experiência com o Google Docs.\n \nPersonalização de acordo com seu estilo\n\nPersonalizar seu ambiente de escrita é uma das principais vantagens do Google Docs no Modo escuro. Personalize o que você quiser:\n \nNível de escuridão: Ajuste o nível de escuridão de acordo com sua preferência, desde uma suave escuridão até uma escuridão envolvente.\nPersonalização da fonte: Escolha o estilo, o tamanho e a cor da fonte que se adequam ao seu estilo de escrita.\nOpções de plano de fundo: Personalize o plano de fundo com uma cor ou textura que complemente sua estética.\nCores de destaque: Selecione cores de destaque para realçar elementos específicos do documento.\n \nCompatibilidade com vários navegadores\n\nQuer você use o Chrome, o Firefox ou outro navegador, o Black Mode G Docs foi projetado para ser compatível com vários navegadores. Desfrute de um tema escuro confortável e produtivo, independentemente de sua escolha de navegador da Web.\n\nAumente sua produtividade\n\nO modo escuro do Google Docs não se trata apenas de estética; trata-se de aumentar a produtividade e aprimorar sua experiência de escrita:\n \nFoco e concentração: O tema Dire minimiza as distrações, permitindo que você se concentre no seu trabalho sem interrupções.\nRedução da fadiga ocular: Seus olhos agradecerão pela redução do brilho, tornando as longas sessões de escrita mais confortáveis e menos cansativas.\nEficiência energética: Ao usar o modo escuro do G Docs, você poupa seus olhos e ajuda a economizar energia, reduzindo sua pegada de carbono.\n \nConclusão\n\nO Modo escuro do Google Docs é a extensão definitiva do Chrome para quem busca uma experiência de escrita confortável, personalizável e eficiente. Ative-o com um único clique, personalize-o de acordo com suas preferências e desfrute de um ambiente livre de distrações e agradável aos olhos. Junte-se à comunidade de usuários satisfeitos que fizeram do G Doc Modo escuro sua escolha para uma experiência superior no Google Docs.\n\nModo escuro do Google Docs - Melhore sua experiência de escrita!\n\nVocê acha cansativo o brilho ofuscante da tela enquanto trabalha no Google Docs? Está ansioso por um ambiente de escrita mais confortável e visualmente agradável? Não precisa mais procurar, pois o Modo escuro do Google Docs está aqui para transformar sua experiência de escrita.\n\nO modo escuro do Google Docs é a extensão definitiva do Chrome para aqueles que preferem uma aparência mais escura e agradável aos olhos ao criar, editar ou ler documentos. Com essa extensão, você pode alternar facilmente a interface do Google Docs para um tema escuro elegante e relaxante, tornando suas sessões de escrita mais agradáveis do que nunca. Diga adeus ao brilho intenso e dê as boas-vindas à produtividade com estilo.\n\nPrincipais recursos do Modo escuro do Google Docs\n\n1. Ativação sem esforço: O modo escuro do Google Docs é incrivelmente fácil de usar. Com apenas um clique, você pode ativar o tema escuro para o seu Google Doc, criando um ambiente de escrita mais confortável e concentrado.\n\n2. Opções de personalização: Entendemos que um tamanho único não serve para todos. É por isso que oferecemos várias opções de personalização, permitindo que você ajuste a extensão de acordo com suas preferências pessoais. Ajuste o nível de escuridão, a fonte e o plano de fundo de acordo com sua preferência.\n\n3. Salva seus olhos: longas sessões de escrita podem prejudicar seus olhos. O Modo Escuro do G Documents reduz o cansaço visual ao fornecer um fundo escuro e suave que não prejudica sua visão, tornando sua experiência de escrita mais confortável.\n\n4. Foco aprimorado: O tema escuro ajuda a eliminar as distrações e mantém sua atenção onde ela deve estar - na escrita. Não há mais reflexos desnecessários ou telas brilhantes para desviar sua atenção.\n\n5. Eficiência energética: Usar o modo escuro dos documentos do Google não só beneficia seus olhos, mas também conserva energia, prolongando a vida útil do dispositivo e economizando nos custos de eletricidade.\n \n🖥️ Compatibilidade e acessibilidade: O G Docs no modo escuro é compatível com todos os principais navegadores da Web e está prontamente disponível em PCs e desktops. Agora, você pode aproveitar o modo escuro do Google Docs em sua plataforma preferida.\n\nComo ativar o modo preto do Google, Ativar o modo escuro do Google Docs é muito fácil. Basta baixar a extensão da Chrome Web Store e clicar no ícone do Modo escuro do Google Docs em seu navegador. Sua página do Google Docs mudará instantaneamente para o suave tema escuro, aprimorando sua experiência de escrita.\n\nPor que você precisa desta extensão?\n\nModo escuro do Google Docs: O Dark Mode G Docs é a solução definitiva para trazer o modo escuro para o seu Google Doc, garantindo que seus olhos permaneçam confortáveis durante suas sessões de escrita.\nProdutividade aprimorada: Com o ambiente livre de distrações que o tema preto proporciona, você se sentirá mais concentrado, eficiente e produtivo em suas tarefas de redação.\n\nProteção para os olhos: A exposição prolongada a uma tela brilhante pode ser prejudicial aos seus olhos. O Modo escuro do Google Documents protege seus olhos reduzindo a intensidade da luz emitida pelo dispositivo.\n\nOpções de personalização: Personalize o modo escuro do Google Doc de acordo com suas preferências. Ajuste as configurações do modo escuro, as fontes e os planos de fundo de acordo com suas preferências individuais.\n\nCompatibilidade com vários navegadores: Independentemente de você preferir o Chrome, o Firefox ou outro navegador, o Google Docs no modo escuro é compatível com todos os navegadores, para que você possa aproveitar a experiência do modo independentemente da sua escolha de navegador.\n \nPerguntas frequentes:\n \n1. Como faço para colocar o Google Docs no modo escuro com esta extensão? Para ativar o Modo escuro do Google Docs, basta fazer o download da extensão na Chrome Web Store e, em seguida, clicar no ícone do modo escuro dos documentos do Google em seu navegador.\n2. O Modo escuro do Google Docs está disponível para desktop? Com certeza! O Modo escuro do Google Docs está disponível para PCs e desktops, garantindo que você possa desfrutar de um ambiente de escrita confortável na plataforma de sua preferência.\n3. Posso personalizar a aparência do Google Docs no Modo escuro? Sim, você pode! O Modo escuro do Google Docs oferece várias opções de personalização, permitindo que você adapte a extensão às suas preferências pessoais.\n4. O Google Docs tem um modo escuro nativo? Infelizmente, o Google Docs não oferece um modo escuro nativo." + } +} diff --git a/_locales/pt_PT/messages.json b/_locales/pt_PT/messages.json new file mode 100644 index 0000000..2bafd5f --- /dev/null +++ b/_locales/pt_PT/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Aumente a eficiência com a nossa Extensão do Google Docs para o Modo Escuro. Experimente o modo escuro do Google Docs sem interrupções para uma escrita melhorada." + }, + "appName": { + "message": "Modo escuro do Google Docs" + }, + "storeDesc": { + "message": "🌟 Porquê escolher o Google Docs em modo escuro em vez dos concorrentes?\n\nCom inúmeras extensões do Chrome que oferecem a funcionalidade de modo escuro, pode perguntar-se o que faz do Modo escuro do G Docs a sua melhor escolha. Vamos explorar porque é que o Google Docs em modo escuro se destaca:\n\n1. Interface de fácil utilização: O Google Docs em modo escuro oferece uma interface intuitiva para uma navegação fácil. Encontrar definições e opções de personalização é muito fácil.\n2. Velocidade e eficiência: A nossa extensão está optimizada para o desempenho, garantindo que não torna o seu browser ou o Google Docs mais lento, proporcionando um tema escuro sem comprometer a velocidade.\n3. Actualizações regulares: o modo preto do g docs é continuamente atualizado para acompanhar as alterações do Google Docs, garantindo que a sua experiência no modo escuro permanece atual e funcional.\n4. Suporte responsivo: Se encontrar problemas ou tiver dúvidas, a nossa equipa de suporte está pronta a ajudar prontamente, empenhada em garantir uma experiência tranquila.\n5. Ampla base de utilizadores: o modo escuro do Google Doc tem uma comunidade de utilizadores próspera, com críticas positivas que atestam a sua qualidade e fiabilidade. Junte-se ao grupo de utilizadores satisfeitos que transformaram a sua experiência com o Google Docs.\n \nPersonalização para se adequar ao seu estilo\n\nPersonalizar o seu ambiente de escrita é uma das principais vantagens do Google Docs no Modo Escuro. Personalize ao seu gosto:\n \nNível de escuridão: Ajuste o nível de escuridão de acordo com as suas preferências, desde uma suave escuridão até uma escuridão envolvente.\nPersonalização da fonte: Escolha o estilo, tamanho e cor da fonte que melhor se adapta ao seu estilo de escrita.\nOpções de fundo: Adapte o fundo a uma cor ou textura que complemente a sua estética.\nCores de destaque: Seleccione cores de destaque para realçar elementos específicos do documento.\n \n🌐 Compatibilidade entre navegadores\n\nQuer utilize o Chrome, o Firefox ou outro navegador, o Black Mode G Docs foi concebido para ser compatível com vários navegadores. Desfrute de um tema escuro confortável e produtivo, independentemente da sua escolha de navegador da Web.\n\nAumente a sua produtividade\n\nO Modo Escuro do Google Docs não se trata apenas de estética; trata-se de aumentar a produtividade e melhorar a sua experiência de escrita:\n \nFoco e concentração: O tema Dire minimiza as distracções, permitindo-lhe concentrar-se no seu trabalho sem interrupções.\nRedução da tensão ocular: Os seus olhos vão agradecer o brilho reduzido, tornando as longas sessões de escrita mais confortáveis e menos fatigantes.\nEficiência energética: Ao utilizar o Dark Mode G Docs, poupa os seus olhos e ajuda a conservar energia, reduzindo a sua pegada de carbono.\n \nConclusão\n\nO Modo Escuro do Google Docs é a derradeira extensão do Chrome para quem procura uma experiência de escrita confortável, personalizável e eficiente. Active-o com um único clique, personalize-o de acordo com as suas preferências e desfrute de um ambiente livre de distracções que é agradável para os seus olhos. Junte-se à comunidade de utilizadores satisfeitos que fizeram do G Doc Modo escuro a sua escolha para uma experiência superior no Google Docs.\n\nModo escuro do Google Docs - Melhore a sua experiência de escrita!\n\nConsidera cansativo o brilho ofuscante do seu ecrã enquanto trabalha no Google Docs? Anseia por um ambiente de escrita mais confortável e visualmente agradável? Não procure mais, porque o Modo escuro do Google Docs está aqui para transformar a sua experiência de escrita.\n\nO modo escuro do Google Docs é a melhor extensão do Chrome para quem prefere uma aparência mais escura e agradável aos olhos ao criar, editar ou ler documentos. Com esta extensão, pode mudar facilmente a interface do Google Docs para um tema escuro elegante e relaxante, tornando as suas sessões de escrita mais agradáveis do que nunca. Diga adeus ao brilho intenso e olá à produtividade em grande estilo.\n\nPrincipais recursos do modo escuro do Google Docs\n\n1. Ativação sem esforço: O modo escuro do Google Docs é incrivelmente fácil de usar. Com apenas um clique, pode ativar o tema escuro para o seu Google Doc, criando um ambiente de escrita mais confortável e concentrado.\n\n2. Opções de personalização: Compreendemos que um tamanho único não serve para todos. É por isso que oferecemos várias opções de personalização, permitindo-lhe ajustar a extensão de acordo com as suas preferências pessoais. Ajuste o nível de escuridão, o tipo de letra e o fundo a seu gosto.\n\n3. Salva os seus olhos: Longas sessões de escrita podem afetar os seus olhos. O Modo Escuro do G Documents reduz o cansaço visual, proporcionando um fundo escuro e suave que não prejudica a sua visão, tornando a sua experiência de escrita mais confortável.\n\n4. Melhoria da concentração: O tema escuro ajuda a eliminar as distracções e mantém a sua atenção onde ela deve estar - na sua escrita. Acabaram-se os brilhos desnecessários ou os ecrãs brilhantes que desviam a sua atenção.\n\n5. Eficiência energética: Utilizar o Modo escuro dos documentos do Google não só beneficia os seus olhos como também conserva energia, prolongando a vida útil do seu dispositivo e poupando nos custos de eletricidade.\n \n🖥️ Compatibilidade e acessibilidade: O modo escuro do G Docs é compatível com todos os principais navegadores da Web e está prontamente disponível em PCs e computadores de secretária. Agora, pode desfrutar do modo escuro do Google Docs na sua plataforma preferida.\n\nComo ativar o modo preto do Google, Ativar o modo escuro do Google Docs é muito fácil. Basta transferir a extensão a partir da Chrome Web Store e clicar no ícone do Modo Escuro do Google Docs no seu navegador. A sua página do Google Docs mudará instantaneamente para o suave tema escuro, melhorando a sua experiência de escrita.\n\nPorque precisa desta extensão?\n\nModo escuro do Google Docs: O Dark Mode G Docs é a solução definitiva para trazer o modo escuro para o seu Google Doc, garantindo que seus olhos permaneçam confortáveis durante suas sessões de escrita.\nProdutividade melhorada: Com o ambiente livre de distrações que o tema preto proporciona, vai ver-se mais concentrado, eficiente e produtivo nas suas tarefas de escrita.\n\nProteção dos olhos: A exposição prolongada a um ecrã brilhante pode ser prejudicial para os seus olhos. O Modo escuro do Google Documents protege os seus olhos reduzindo a intensidade da luz emitida pelo seu dispositivo.\n\nOpções de personalização: Adapte o Modo escuro do Google Doc ao seu gosto. Ajuste as definições do modo escuro, os tipos de letra e os fundos de acordo com as suas preferências individuais.\n\nCompatibilidade com vários navegadores: Quer prefira o Chrome, o Firefox ou outro navegador, o Google Docs em modo escuro é compatível com todos os navegadores, para que possa desfrutar da experiência do modo independentemente da sua escolha de navegador.\n \nFAQs:\n \n1. Como é que coloco o Google Docs no modo sem lua com esta extensão? Para ativar o Modo escuro do Google Docs, basta transferir a extensão a partir da Chrome Web Store e, em seguida, clicar no ícone do modo escuro dos documentos do Google no seu navegador.\n2. O Modo escuro do Google Docs está disponível para computador? Sem dúvida! O Modo escuro do Google Docs está disponível tanto para PCs como para computadores de secretária, garantindo que pode desfrutar de um ambiente de escrita confortável na sua plataforma preferida.\n3. Posso personalizar o aspeto do Modo Escuro do Google Docs? Sim, pode! O Google Docs no Modo Escuro oferece várias opções de personalização, permitindo-lhe adaptar a extensão às suas preferências pessoais.\n4. O Google Docs tem um modo escuro nativo? Infelizmente, o Google Docs não oferece um modo escuro nativo." + } +} diff --git a/_locales/ro/messages.json b/_locales/ro/messages.json new file mode 100644 index 0000000..84c78d3 --- /dev/null +++ b/_locales/ro/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Creșteți eficiența cu extensia noastră pentru Google Docs în modul întunecat. Experimentați modul întunecat fără întreruperi al Google Docs pentru o scriere îmbunătățită." + }, + "appName": { + "message": "Modul întunecat Google Docs" + }, + "storeDesc": { + "message": "🌟 De ce să alegi modul întunecat Google Docs față de concurenți?\n\nAvând în vedere că numeroase extensii Chrome oferă funcționalitatea modului întunecat, poate vă întrebați ce face ca G Docs Dark Mode să fie alegerea dvs. de top. Haideți să explorăm de ce se remarcă Dark Mode Google Docs:\n\n1. Interfață ușor de utilizat: Dark Mode Google Docs oferă o interfață intuitivă pentru o navigare ușoară. Găsirea setărilor și a opțiunilor de personalizare este floare la ureche.\n2. Viteză și eficiență: Extensia noastră este optimizată pentru performanță, asigurându-vă că nu vă va încetini browserul sau Google Docs, oferind o temă întunecată fără a compromite viteza.\n3. Actualizări regulate: g docs black mode se actualizează continuu pentru a ține pasul cu modificările Google Docs, asigurându-vă că experiența dvs. în modul întunecat rămâne actuală și funcțională.\n4. Suport responsiv: Dacă întâmpinați probleme sau aveți întrebări, echipa noastră de asistență este pregătită să vă ajute prompt, angajată să vă asigure o experiență fără probleme.\n5. Bază largă de utilizatori: Google Docs dire mode are o comunitate de utilizatori înfloritoare, cu recenzii pozitive care atestă calitatea și fiabilitatea sa. Alăturați-vă rândurilor de utilizatori mulțumiți care și-au transformat experiența Google Docs.\n \n🎨 Personalizare pentru a se potrivi stilului dvs.\n\nPersonalizarea mediului de scriere este un avantaj cheie al modului întunecat Google Docs. Personalizați-vă după bunul plac:\n \nNivelul de întuneric: Reglați nivelul de întuneric în funcție de preferințele dvs., de la o ușoară atenuare la un întuneric captivant.\nPersonalizarea fontului: Alegeți stilul, dimensiunea și culoarea fontului care se potrivește stilului dvs. de scriere.\nOpțiuni de fundal: Adaptați fundalul la o culoare sau o textură care să vă completeze estetica.\nCulori de accent: Selectați culori de accent pentru a evidenția elemente specifice ale documentului.\n \n🌐 Compatibilitate între browsere\n\nIndiferent dacă folosiți Chrome, Firefox sau un alt browser, Black Mode G Docs este conceput pentru compatibilitate între browsere. Bucurați-vă de o temă întunecată confortabilă și productivă, indiferent de alegerea browserului dvs. web.\n\n🚀 Stimulează-ți productivitatea\n\nModul întunecat Google Docs nu se referă doar la aspectul estetic, ci și la creșterea productivității și îmbunătățirea experienței de scriere:\n \nFocalizare și concentrare: Tema Dire minimizează distragerile, permițându-vă să vă concentrați asupra muncii dvs. fără întreruperi.\nReducerea oboselii ochilor: Ochii dvs. vă vor mulțumi pentru luminozitatea redusă, făcând sesiunile lungi de scris mai confortabile și mai puțin obositoare.\nEficiență energetică: Utilizând modul întunecat G Docs, vă economisiți ochii și contribuiți la conservarea energiei, reducând amprenta de carbon.\n \n🌚 În concluzie\n\nDark Mode Google Docs este cea mai bună extensie Chrome pentru toți cei care caută o experiență de scriere confortabilă, personalizabilă și eficientă. Activați-l cu un singur clic, personalizați-l în funcție de preferințele dvs. și bucurați-vă de un mediu lipsit de distragere a atenției și ușor pentru ochii dvs. Alăturați-vă comunității de utilizatori mulțumiți care au făcut din Dark Mode G Docs alegerea lor pentru o experiență Google Docs superioară.\n\n🌙 Modul întunecat Google Docs - Îmbunătățiți-vă experiența de scriere!\n\nConsiderați că strălucirea orbitoare a ecranului dvs. în timp ce lucrați pe Google Docs este obositoare? Tânjiți după un mediu de scriere mai confortabil și mai plăcut din punct de vedere vizual? Nu căutați mai departe, pentru că modul întunecat Google Docs este aici pentru a vă transforma experiența de scriere.\n\nModul întunecat Google Docs este cea mai bună extensie Chrome pentru cei care preferă un aspect mai întunecat și mai prietenos cu ochii atunci când creează, editează sau citesc documente. Cu această extensie, puteți trece fără probleme de la interfața Google Docs la o temă întunecată elegantă și liniștitoare, făcând sesiunile de scriere mai plăcute ca niciodată. Spuneți adio luminozității aspre și salutați productivitatea în stil.\n\n🌟 Caracteristici principale ale modului întunecat Google Docs\n\n1. Activare fără efort: Dark Mode Google Docs este incredibil de ușor de utilizat. Cu un singur clic, puteți activa tema întunecată pentru Google Doc, creând un mediu de scriere mai confortabil și mai concentrat.\n\n2. Opțiuni de personalizare: Înțelegem că o mărime unică nu se potrivește tuturor. De aceea, oferim diverse opțiuni de personalizare, permițându-vă să adaptați extensia pentru a se potrivi preferințelor dvs. personale. Reglați nivelul de întuneric, fontul și fundalul după bunul dvs. plac.\n\n3. Vă salvează ochii: Sesiunile lungi de scriere pot avea un impact asupra ochilor dvs. Modul întunecat G Documents reduce oboseala ochilor, oferind un fundal blând, întunecat, care este ușor pentru vederea dumneavoastră, ceea ce face ca experiența de scriere să fie mai confortabilă.\n\n4. Focalizare îmbunătățită: Tema întunecată ajută la eliminarea distragerilor și vă menține atenția acolo unde îi este locul - pe scrisul dumneavoastră. Gata cu strălucirea inutilă sau cu ecranele luminoase care vă distrag atenția.\n\n5. Eficiență energetică: Utilizarea documentelor Google în modul întunecat nu numai că este benefică pentru ochii dvs., dar economisește și energie, prelungind durata de viață a dispozitivului dvs. și economisind costurile de electricitate.\n \n6. 🖥️ Compatibilitate și accesibilitate: Dark Mode G Docs este compatibil cu toate browserele web importante și este disponibil cu ușurință pe PC-uri și desktop-uri. Acum, vă puteți bucura de modul întunecat Google Docs pe platforma preferată.\n\n🌚 Cum se activează modul negru Google, Activarea modului întunecat Google Docs este o nimica toată. Pur și simplu descărcați extensia din Chrome Web Store și faceți clic pe pictograma Dark Mode Google Docs din browser. Pagina dvs. de documente Google va trece instantaneu la tema întunecată liniștitoare, îmbunătățind experiența dvs. de scriere.\n\n📜 De ce aveți nevoie de această extensie?\n\nGoogle Docs Dark Mode: Dark Mode G Docs este soluția definitivă pentru a aduce modul întunecat în Google Docs, asigurându-vă că ochii dvs. rămân confortabili în timpul sesiunilor de scriere.\nProductivitate îmbunătățită: Cu mediul lipsit de distragere a atenției pe care îl oferă tema neagră, vă veți găsi mai concentrat, mai eficient și mai productiv în sarcinile dvs. de scriere.\n\nProtecția ochilor: Expunerea prelungită la un ecran luminos poate fi dăunătoare pentru ochi. Modul întunecat Google Documents vă protejează ochii prin reducerea intensității luminii emise de dispozitivul dvs.\n\nOpțiuni de personalizare: Personalizați Modul Negru Google Documente după bunul dvs. plac. Reglați setările modului întunecat, fonturile și fundalurile pentru a se potrivi preferințelor dvs. individuale.\n\nCompatibilitate între browsere: Indiferent dacă preferați Chrome, Firefox sau un alt browser, Modul Întunecat Google Docs este compatibil pe toate mediile, astfel încât vă puteți bucura de experiența modului indiferent de browserul ales.\n \n📚 Întrebări frecvente:\n \n1. Cum pun Google Docs în modul fără lună cu această extensie? Pentru a activa modul întunecat Google Docs, pur și simplu descărcați extensia din Chrome Web Store, apoi faceți clic pe pictograma modului întunecat al documentelor Google din browserul dvs.\n2. Modul întunecat G Docs este disponibil pentru desktop? Absolut! Dark Mode Google Docs este disponibil atât pentru PC-uri, cât și pentru desktop-uri, asigurându-vă că vă puteți bucura de un mediu de scriere confortabil pe platforma preferată.\n3. Pot să personalizez aspectul modului Dark Mode Google Docs? Da, puteți! Dark Mode Google Docs oferă diverse opțiuni de personalizare, permițându-vă să adaptați extensia la preferințele dvs. personale.\n4. Are Google Docs un mod întunecat nativ? Din păcate, Google Docs nu oferă un mod întunecat nativ." + } +} diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json new file mode 100644 index 0000000..612774d --- /dev/null +++ b/_locales/ru/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Повысьте эффективность работы с помощью темной темы для Google Docs. Используйте темный режим Google Docs для улучшения качества письма." + }, + "appName": { + "message": "Темная тема Google Docs" + }, + "storeDesc": { + "message": "🌟 Почему стоит выбрать темный режим Google Docs, а не конкурентов?\n\nУчитывая большое количество расширений Chrome, предлагающих функцию темного режима, вы можете задаться вопросом, почему именно темный режим G Docs стал вашим лучшим выбором. Давайте разберемся, почему темный режим Google Docs выделяется на фоне других:\n\n1. Удобный интерфейс: Темный режим Google Docs обеспечивает интуитивно понятный интерфейс для удобной навигации. Поиск настроек и параметров кастомизации не составляет труда.\n2. Скорость и эффективность: Наше расширение оптимизировано для повышения производительности, поэтому оно не замедляет работу браузера и Google Docs, обеспечивая темную тему без ущерба для скорости.\n3. Регулярные обновления: g docs black mode постоянно обновляется в соответствии с изменениями Google Docs, обеспечивая актуальность и функциональность темного режима.\n4. Оперативная поддержка: Если у вас возникнут проблемы или вопросы, наша служба поддержки готова оперативно оказать помощь и обеспечить бесперебойную работу.\n5. Широкая база пользователей: google doc dire mode имеет процветающее сообщество пользователей с положительными отзывами, свидетельствующими о его качестве и надежности. Присоединяйтесь к числу довольных пользователей, которые изменили свою работу с Документами Google.\n \n🎨 Настройка в соответствии с вашим стилем\n\nПерсонализация рабочей среды - одно из ключевых преимуществ Google Документов в темном режиме. Настраивайте ее по своему усмотрению:\n \nУровень темноты: Настройте уровень темноты в соответствии с вашими предпочтениями: от легкого приглушения до погружения в темноту.\nНастройка шрифта: Выберите стиль, размер и цвет шрифта, который соответствует вашему стилю письма.\nПараметры фона: Выберите цвет или текстуру фона, которые соответствуют вашему вкусу.\nАкцентные цвета: Выберите акцентные цвета для выделения определенных элементов документа.\n \n🌐 Совместимость с различными браузерами\n\nНезависимо от того, используете ли вы Chrome, Firefox или другой браузер, черный режим G Docs разработан с учетом кроссбраузерной совместимости. Наслаждайтесь удобной и продуктивной темной темой независимо от выбранного браузера.\n\n🚀 Повышение производительности\n\nТемный режим Google Docs - это не только эстетика, но и повышение производительности и улучшение качества работы:\n \nСосредоточенность и концентрация: Тема Dire сводит к минимуму отвлекающие факторы, позволяя сосредоточиться на работе без помех.\nСнижение напряжения глаз: Ваши глаза будут благодарны вам за уменьшенную яркость, благодаря чему длительные сеансы письма станут более комфортными и менее утомительными.\nЭнергоэффективность: Используя темный режим G Docs, вы бережете свои глаза и помогаете экономить электроэнергию, уменьшая углеродный след.\n \n🌚 В заключение\n\nТемный режим Google Docs - это лучшее расширение Chrome для тех, кто стремится к комфортной, настраиваемой и эффективной работе с документами. Активируйте его одним щелчком мыши, настройте в соответствии со своими предпочтениями и наслаждайтесь не отвлекающей от работы средой, удобной для глаз. Присоединяйтесь к сообществу довольных пользователей, которые сделали Dark Mode G Doc своим основным выбором для работы с Документами Google.\n\nТемный режим Google docs - улучшите качество работы!\n\nВас утомляют слепящие блики на экране при работе в Google Docs? Вы жаждете более комфортной и визуально приятной среды для работы? Темный режим Google Docs изменит вашу работу.\n\nТемный режим Google Docs - это расширение Chrome для тех, кто предпочитает более темный и приятный для глаз вид при создании, редактировании или чтении документов. С помощью этого расширения вы можете плавно переключить интерфейс Google Документов на гладкую и успокаивающую темную тему, сделав работу с документами более приятной, чем когда-либо прежде. Попрощайтесь с резкой яркостью и поздоровайтесь с продуктивностью в стиле.\n\n🌟 Ключевые особенности темного режима Google Docs\n\n1. Легкая активация: Темный режим Google Docs невероятно прост в использовании. Всего одним щелчком мыши вы можете активировать темную тему для своего документа Google Doc, создав более комфортную и сосредоточенную среду для работы.\n\n2. Возможности настройки: Мы понимаем, что один размер не подходит для всех. Поэтому мы предлагаем различные варианты настройки, позволяющие приспособить расширение к вашим личным предпочтениям. Настройте уровень темноты, шрифт и фон по своему вкусу.\n\n3. Спасет ваши глаза: длительная работа с текстом может негативно сказаться на состоянии глаз. Темный режим G Documents снижает напряжение глаз, обеспечивая мягкий темный фон, который не напрягает зрение и делает процесс письма более комфортным.\n\n4. Улучшение концентрации внимания: Темная тема помогает устранить отвлекающие факторы и сосредоточить внимание на написании текста. Больше нет ненужных бликов и ярких экранов, отвлекающих внимание.\n\n5. Энергоэффективность: Использование темного режима в документах Google не только полезно для глаз, но и позволяет экономить электроэнергию, продлевая срок службы устройства и экономя расходы на электричество.\n \n🖥️ Совместимость и доступность: Темный режим G Docs совместим со всеми основными веб-браузерами и легко доступен на ПК и настольных компьютерах. Теперь вы можете пользоваться темным режимом Google Docs на предпочитаемой платформе.\n\nКак активировать темный режим Google 🌚 Активировать темный режим Google Документов очень просто. Просто загрузите расширение из Интернет-магазина Chrome и щелкните на значке \"Темный режим Google Документов\" в браузере. Страница документов Google мгновенно переключится на успокаивающую темную тему, что повысит удобство работы.\n\n📜 Почему вам нужно это расширение?\n\nТемный режим Google Документов: Dark Mode G Docs - это оптимальное решение, позволяющее использовать темный режим в Документах Google, обеспечивая комфорт для глаз во время работы.\nПовышение продуктивности: Благодаря черной теме, не отвлекающей от работы, вы сможете лучше сосредоточиться, повысить эффективность и продуктивность своей работы.\n\nЗащита глаз: Длительное пребывание на ярком экране может быть вредно для глаз. Темный режим Google Документы защищает глаза, снижая интенсивность света, излучаемого устройством.\n\nПараметры настройки: Настройте темный режим Google Документов по своему вкусу. Настройте параметры темного режима, шрифты и фоны в соответствии с вашими индивидуальными предпочтениями.\n\nКроссбраузерная совместимость: Независимо от того, какой браузер вы предпочитаете - Chrome, Firefox или другой, - \"темный режим\" Google Docs совместим со всеми браузерами, поэтому вы сможете пользоваться режимом независимо от выбранного браузера.\n \n📚 Часто задаваемые вопросы:\n \n1. Как перевести Google Docs в безлунный режим с помощью этого расширения? Чтобы активировать темный режим Google Docs, просто загрузите расширение из Интернет-магазина Chrome, а затем нажмите на значок темного режима Google документов в браузере.\n2. Доступен ли темный режим G Docs для настольных компьютеров? Конечно! Темный режим Google Docs доступен как для ПК, так и для настольных компьютеров, что обеспечивает комфортную работу с документами на удобной для вас платформе.\n3. Можно ли настроить внешний вид Google Docs в темном режиме? Да, можно! Dark Mode Google Docs предлагает различные варианты настройки, позволяющие адаптировать расширение к вашим личным предпочтениям.\n4. Есть ли в Google Docs собственный темный режим? К сожалению, в Google Docs нет встроенного темного режима." + } +} \ No newline at end of file diff --git a/_locales/sk/messages.json b/_locales/sk/messages.json new file mode 100644 index 0000000..6ebd942 --- /dev/null +++ b/_locales/sk/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Zvýšte efektivitu pomocou nášho rozšírenia Dokumenty Google v tmavom režime. Vychutnajte si bezproblémový tmavý režim Dokumentov Google na zlepšenie písania." + }, + "appName": { + "message": "Dokumenty Google v tmavom režime" + }, + "storeDesc": { + "message": "🌟 Prečo si vybrať tmavý režim Dokumentov Google namiesto konkurencie?\n\nVzhľadom na množstvo rozšírení pre Chrome, ktoré ponúkajú funkciu tmavého režimu, sa možno pýtate, prečo je tmavý režim G Docs tou najlepšou voľbou. Poďme preskúmať, prečo tmavý režim Dokumentov Google vyniká:\n\n1. Používateľsky prívetivé rozhranie: Tmavý režim Dokumentov Google poskytuje intuitívne rozhranie na jednoduchú navigáciu. Nájsť nastavenia a možnosti prispôsobenia je hračka.\n2. Rýchlosť a efektivita: Naše rozšírenie je optimalizované na výkon, vďaka čomu nespomalí váš prehliadač ani Dokumenty Google a poskytuje tmavý motív bez zníženia rýchlosti.\n3. Pravidelné aktualizácie: Čierny režim g docs sa priebežne aktualizuje, aby držal krok so zmenami v Dokumentoch Google, čím zabezpečuje, že vaše prostredie tmavého režimu zostane aktuálne a funkčné.\n4. Responzívna podpora: Ak narazíte na problémy alebo máte otázky, náš tím podpory je pripravený okamžite pomôcť a snaží sa zabezpečiť bezproblémové používanie.\n5. Široká používateľská základňa: Režim Google Doc dire má prosperujúcu komunitu používateľov s pozitívnymi recenziami, ktoré svedčia o jeho kvalite a spoľahlivosti. Pridajte sa k radom spokojných používateľov, ktorí zmenili svoje skúsenosti s aplikáciou Google Docs.\n \n🎨 Prispôsobenie podľa vášho štýlu\n\nPrispôsobenie prostredia na písanie je kľúčovou výhodou tmavého režimu Dokumentov Google. Prispôsobte si ho podľa svojich predstáv:\n \nÚroveň tmavosti: Nastavte úroveň tmy podľa svojich preferencií, od jemného stmievania až po pohlcujúcu tmu.\nPrispôsobenie písma: Vyberte si štýl, veľkosť a farbu písma, ktoré vyhovujú vášmu štýlu písania.\nMožnosti pozadia: Prispôsobte si pozadie farbou alebo textúrou, ktorá zodpovedá vašej estetike.\nFarby akcentov: Vyberte farby akcentov na zvýraznenie konkrétnych prvkov dokumentu.\n \n🌐 Kompatibilita s rôznymi prehliadačmi\n\nČi už používate Chrome, Firefox alebo iný prehliadač, Black Mode G Docs je navrhnutý tak, aby bol kompatibilný s rôznymi prehliadačmi. Užívajte si pohodlný a produktívny tmavý motív bez ohľadu na výber webového prehliadača.\n\n🚀 Zvýšte svoju produktivitu\n\nTmavý režim Dokumentov Google nie je len o estetike, ale aj o zvýšení produktivity a zlepšení vášho zážitku z písania:\n \nSústredenie a koncentrácia: Téma Dire minimalizuje rušivé vplyvy a umožňuje vám sústrediť sa na prácu bez vyrušovania.\nZníženie namáhania očí: Vaše oči vám poďakujú za znížený jas, vďaka ktorému je dlhé písanie pohodlnejšie a menej únavné.\nEnergetická účinnosť: Používaním tmavého režimu G Docs šetríte svoje oči a pomáhate šetriť energiu, čím znižujete svoju uhlíkovú stopu.\n \n🌚 Na záver\n\nTmavý režim Dokumentov Google je dokonalé rozšírenie prehliadača Chrome pre každého, kto hľadá pohodlné, prispôsobiteľné a efektívne písanie. Aktivujte ho jediným kliknutím, prispôsobte si ho podľa svojich preferencií a užívajte si prostredie bez rozptyľovania, ktoré je šetrné k vašim očiam. Pridajte sa k spokojnej komunite používateľov, ktorí si z tmavého režimu G Doc urobili svoju voľbu pre vynikajúce prostredie Dokumentov Google.\n\n🌙 Tmavý režim Google Docs - vylepšite si zážitok z písania!\n\nZdá sa vám oslepujúci odlesk obrazovky pri práci v Dokumentoch Google únavný? Túžite po pohodlnejšom a vizuálne príjemnejšom prostredí na písanie? Už nemusíte hľadať ďalej, pretože tmavý režim Dokumentov Google je tu, aby zmenil váš zážitok z písania.\n\nTmavý režim Dokumenty Google je dokonalé rozšírenie prehliadača Chrome pre tých, ktorí pri vytváraní, úpravách alebo čítaní dokumentov uprednostňujú tmavší a pre oči príjemnejší vzhľad. Pomocou tohto rozšírenia môžete bez problémov prepnúť rozhranie Dokumentov Google na elegantný a upokojujúci tmavý motív, vďaka čomu bude vaše písanie príjemnejšie ako kedykoľvek predtým. Rozlúčte sa s ostrým jasom a privítajte štýlovú produktivitu.\n\n🌟 Kľúčové funkcie tmavého režimu Dokumentov Google\n\n1. Bezproblémová aktivácia: Tmavý režim Dokumentov Google sa používa neuveriteľne jednoducho. Jediným kliknutím môžete aktivovať tmavý motív pre svoje Dokumenty Google a vytvoriť tak pohodlnejšie a sústredenejšie prostredie na písanie.\n\n2. Možnosti prispôsobenia: Chápeme, že jedna veľkosť nie je vhodná pre všetkých. Preto ponúkame rôzne možnosti prispôsobenia, ktoré vám umožnia upraviť rozšírenie podľa vašich osobných preferencií. Upravte úroveň tmavosti, písmo a pozadie podľa svojich predstáv.\n\n3. Šetrí vaše oči: Dlhé písanie si môže vyžiadať daň na vašich očiach. Tmavý režim G Documents znižuje namáhanie očí tým, že poskytuje jemné tmavé pozadie, ktoré je nenáročné pre váš zrak, a tak je písanie pohodlnejšie.\n\n4. Zlepšuje sústredenie: Tmavý motív pomáha eliminovať rozptyľovanie a udržuje vašu pozornosť tam, kam patrí - na písanie. Už žiadne zbytočné odlesky alebo jasné obrazovky, ktoré by odpútavali vašu pozornosť.\n\n5. Energetická účinnosť: Používanie tmavého režimu dokumentov Google prospieva nielen vašim očiam, ale aj šetrí energiu, čím predlžuje životnosť zariadenia a šetrí náklady na elektrinu.\n \n🖥️ Kompatibilita a dostupnosť: Tmavý režim dokumentov G je kompatibilný so všetkými hlavnými webovými prehliadačmi a je ľahko dostupný na osobných a stolových počítačoch. Teraz si môžete tmavý režim Dokumentov Google užívať na svojej obľúbenej platforme.\n\n🌚 Ako aktivovať čierny režim Google, Aktivácia tmavého režimu Dokumenty Google je hračka. Stačí si stiahnuť rozšírenie z internetového obchodu Chrome a kliknúť na ikonu Tmavý režim Dokumenty Google v prehliadači. Vaša stránka Dokumenty Google sa okamžite prepne do upokojujúceho tmavého motívu, čím sa zlepší váš zážitok z písania.\n\n📜 Prečo potrebujete toto rozšírenie?\n\nTmavý režim Dokumentov Google: Tmavý režim Dokumenty G je definitívne riešenie, ktoré do vašich Dokumentov Google prinesie tmavý režim a zabezpečí, že vaše oči zostanú počas písania v pohodlí.\nZvýšená produktivita: Vďaka prostrediu bez rozptyľovania, ktoré poskytuje čierny motív, sa pri písaní úloh budete viac sústrediť, budete efektívnejší a produktívnejší.\n\nOchrana očí: Dlhodobé vystavenie jasnej obrazovke môže byť pre vaše oči škodlivé. Tmavý režim Dokumenty Google chráni vaše oči znížením intenzity svetla vyžarovaného zo zariadenia.\n\nMožnosti prispôsobenia: Čierny režim Dokumenty Google si môžete prispôsobiť podľa svojich predstáv. Upravte nastavenia tmavého režimu, písma a pozadia podľa svojich individuálnych preferencií.\n\nKompatibilita s rôznymi prehliadačmi: Prehľadávanie: Či už uprednostňujete Chrome, Firefox alebo iný prehliadač, tmavý režim Dokumenty Google je kompatibilný s všetkými prehliadačmi, takže si môžete vychutnať režim bez ohľadu na to, aký prehliadač ste si vybrali.\n \n📚 Často kladené otázky:\n \n1. Ako pomocou tohto rozšírenia prepnem Dokumenty Google do bezmesačného režimu? Ak chcete aktivovať tmavý režim Dokumentov Google, jednoducho si stiahnite rozšírenie z internetového obchodu Chrome a potom kliknite na ikonu tmavého režimu Dokumentov Google v prehliadači.\n2. Je tmavý režim G Docs k dispozícii aj pre počítače? Určite! Tmavý režim Dokumentov Google je k dispozícii pre počítače aj stolové počítače, čo zaručuje, že si môžete vychutnať pohodlné prostredie na písanie na preferovanej platforme.\n3. Môžem si prispôsobiť vzhľad Tmavého režimu Dokumentov Google? Áno, môžete! Tmavý režim Dokumentov Google ponúka rôzne možnosti prispôsobenia, ktoré vám umožnia prispôsobiť rozšírenie vašim osobným preferenciám.\n4. Má aplikácia Dokumenty Google natívny tmavý režim? Dokumenty Google bohužiaľ neponúkajú natívny tmavý režim." + } +} diff --git a/_locales/sl/messages.json b/_locales/sl/messages.json new file mode 100644 index 0000000..fb2730a --- /dev/null +++ b/_locales/sl/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Povečajte učinkovitost z našo razširitvijo Google Dokumenti v temnem načinu. Izkusite brezhiben temni način Google Dokumenti za boljše pisanje." + }, + "appName": { + "message": "Temni način Google Dokumenti" + }, + "storeDesc": { + "message": "🌟 Zakaj izbrati temni način Googlovih dokumentov pred konkurenti?\n\nKer številne razširitve za Chrome ponujajo funkcionalnost temnega načina, se morda sprašujete, zakaj je temni način G Docs vaša najboljša izbira. Raziščimo, zakaj Temni način Google Dokumenti izstopa:\n\n1. Uporabniku prijazen vmesnik: Temni način Google Dokumenti zagotavlja intuitiven vmesnik za enostavno navigacijo. Iskanje nastavitev in možnosti prilagajanja je enostavno.\n2. Hitrost in učinkovitost: Naša razširitev je optimizirana za zmogljivost, tako da ne upočasnjuje brskalnika ali dokumentov Google Docs, saj zagotavlja temno temo brez zmanjšanja hitrosti.\n3. Redne posodobitve: Črni način g docs se nenehno posodablja, da bi sledil spremembam v Google Docs, kar zagotavlja, da bo vaša izkušnja s temnim načinom ostala aktualna in funkcionalna.\n4. Podpora za odzivnost: Če naletite na težave ali imate vprašanja, vam je naša ekipa za podporo pripravljena takoj pomagati in se zavzema za nemoteno izkušnjo.\n5. Široka baza uporabnikov: Google Doc dire mode ima cvetočo skupnost uporabnikov s pozitivnimi ocenami, ki potrjujejo njegovo kakovost in zanesljivost. Pridružite se vrstam zadovoljnih uporabnikov, ki so spremenili svojo izkušnjo z dokumenti Google.\n \n🎨 Prilagajanje po meri vašega sloga\n\nPrilagajanje okolja za pisanje je ključna prednost Temnega načina Google Dokumenti. Prilagodite si ga po svojih željah:\n \nTemna stopnja: Prilagodite raven teme, da bo ustrezala vašim željam, od nežne zatemnitve do popolne teme.\nPrilagoditev pisave: Izberite temno temo, ki jo želite prilagoditi: Izberite slog, velikost in barvo pisave, ki ustreza vašemu slogu pisanja.\nMožnosti ozadja: Prilagodite ozadje z barvo ali teksturo, ki ustreza vaši estetiki.\nBarve poudarkov: Izberite poudarjene barve, da poudarite določene elemente dokumenta.\n \n🌐 Združljivost z različnimi brskalniki\n\nNe glede na to, ali uporabljate brskalnik Chrome, Firefox ali drug brskalnik, je G Docs v črnem načinu zasnovan za združljivost med brskalniki. Uživajte v udobni in produktivni temni temi ne glede na izbiro spletnega brskalnika.\n\n🚀 Povečajte svojo produktivnost\n\nTemni način Google Dokumenti ni le estetski, temveč je namenjen povečanju produktivnosti in izboljšanju vaše izkušnje pri pisanju:\n \nOsredotočenost in koncentracija: Temna tema zmanjšuje moteče dejavnike in vam omogoča, da se osredotočite na delo brez prekinitev.\nManjša obremenitev oči: Oči vam bodo hvaležne za zmanjšano svetlost, zaradi česar bodo dolge pisalne seje bolj udobne in manj utrujajoče.\nEnergetska učinkovitost: Z uporabo temnega načina G Docs varčujete svoje oči in varčujete z energijo, s čimer zmanjšujete svoj ogljični odtis.\n \n🌚 Zaključek\n\nTemni način Google Dokumenti je najboljša razširitev za Chrome za vse, ki iščejo udobno, prilagodljivo in učinkovito izkušnjo pisanja. Aktivirajte ga z enim klikom, prilagodite ga svojim željam in uživajte v okolju brez motenj, ki je prijazno za vaše oči. Pridružite se zadovoljni skupnosti uporabnikov, ki so temni način G Doc izbrali za vrhunsko izkušnjo z Googlovimi dokumenti.\n\n🌙 Temni način Google Docs - Izboljšajte svoje pisanje!\n\nSe vam zdi, da vas med delom v Google Dokumentih utruja zaslepljujoča bleščavost zaslona? Ali hrepenite po udobnejšem in vizualno prijetnejšem okolju za pisanje? Ne iščite več, saj je temni način Google Dokumenti tukaj, da spremeni vašo izkušnjo pisanja.\n\nTemni način Google Dokumenti je popolna razširitev Chrome za tiste, ki imajo pri ustvarjanju, urejanju ali branju dokumentov raje temnejši in očem prijaznejši videz. S to razširitvijo lahko brez težav preklopite vmesnik Google Dokumenti v elegantno in pomirjujočo temno temno temo, zaradi česar bo vaše pisanje prijetnejše kot kdaj koli prej. Poslovite se od ostre svetlosti in pozdravite produktivnost v slogu.\n\n🌟 Ključne funkcije temnega načina Google Dokumenti\n\n1. Enostavno aktiviranje: Temni način Google Dokumenti je izjemno enostaven za uporabo. Z enim samim klikom lahko aktivirate temno temo za svoj Google Doc in tako ustvarite udobnejše in bolj osredotočeno okolje za pisanje.\n\n2. Možnosti prilagajanja: Razumemo, da ena velikost ne ustreza vsem. Zato ponujamo različne možnosti prilagajanja, s katerimi lahko razširitev prilagodite svojim osebnim željam. Prilagodite stopnjo temnosti, pisavo in ozadje po svojih željah.\n\n3. Varuje vaše oči: Dolgotrajno pisanje lahko obremeni vaše oči. Temni način G dokumenti zmanjša obremenitev oči, saj zagotavlja nežno, temno ozadje, ki je prijazno do vašega vida, zaradi česar je vaše pisanje bolj udobno.\n\n4. Izboljšana osredotočenost: Temna tema pomaga odpraviti moteče dejavnike in ohranja vašo pozornost tam, kamor sodi - na pisanju. Nič več nepotrebnega bleščanja ali svetlih zaslonov, ki bi odvrnili vašo pozornost.\n\n5. Energetska učinkovitost: Uporaba temnega načina v Googlovih dokumentih ne koristi le vašim očem, temveč tudi varčuje z energijo, kar podaljša življenjsko dobo naprave in prihrani pri stroških za elektriko.\n \n🖥️ Združljivost in dostopnost: Temni način G Dokumenti je združljiv z vsemi glavnimi spletnimi brskalniki in je na voljo v osebnih in namiznih računalnikih. Zdaj lahko v temnem načinu Google Docs uživate na želeni platformi.\n\n🌚 Kako aktivirati črni način Google, Aktivacija temnega načina Google Dokumenti je preprosta. Preprosto prenesite razširitev iz spletne trgovine Chrome in v brskalniku kliknite ikono Temni način Google Dokumenti. Stran z dokumenti Google bo takoj preklopila na pomirjujočo temno temno temo in izboljšala vašo izkušnjo pisanja.\n\n📜 Zakaj potrebujete to razširitev?\n\nTemni način Google Dokumenti: Temni način G Docs je dokončna rešitev za uvedbo temnega načina v vaše dokumente Google, ki zagotavlja, da bodo vaše oči med pisanjem ostale udobne.\nPovečana produktivnost: Z okoljem brez motenj, ki ga zagotavlja črna tema, boste pri pisanju bolj osredotočeni, učinkoviti in produktivni.\n\nZaščita oči: Dolgotrajna izpostavljenost svetlemu zaslonu je lahko škodljiva za vaše oči. Temni način Google Documents varuje vaše oči z zmanjšanjem intenzivnosti svetlobe, ki jo oddaja vaša naprava.\n\nMožnosti prilagajanja: Prilagodite možnosti črnega načina Google Dokumenti po svojih željah. Prilagodite nastavitve temnega načina, pisave in ozadja, da bodo ustrezale vašim individualnim željam.\n\nZdružljivost z različnimi brskalniki: Ne glede na to, ali imate raje Chrome, Firefox ali drug brskalnik, je Temni način Google Dokumenti vsestransko združljiv, tako da lahko uživate v načinu ne glede na to, kateri brskalnik ste izbrali.\n \n📚 Pogosta vprašanja:\n \n1. Kako s to razširitvijo preklopim Google Dokumente v brezmesečni način? Če želite aktivirati temni način Google Dokumenti, preprosto prenesite razširitev iz spletne trgovine Chrome in nato v brskalniku kliknite ikono temnega načina Google Dokumenti.\n2. Ali je temni način G Docs na voljo tudi za namizne računalnike? Vsekakor! Temni način Google Dokumenti je na voljo za osebne in namizne računalnike, kar vam zagotavlja udobno pisalno okolje na želeni platformi.\n3. Ali lahko prilagodim videz Temnega načina Google Dokumenti? Da, lahko! Dark Mode Google Docs ponuja različne možnosti prilagajanja, ki vam omogočajo, da razširitev prilagodite svojim osebnim željam.\n4. Ali ima Google Docs izvirni temni način? Na žalost Google Dokumenti ne ponuja izvirnega temnega načina." + } +} diff --git a/_locales/sr/messages.json b/_locales/sr/messages.json new file mode 100644 index 0000000..33d9ebc --- /dev/null +++ b/_locales/sr/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Повећајте ефикасност помоћу нашег додатка за Гоогле документе у мрачном режиму. Доживите беспрекоран тамни режим Гоогле докумената за побољшано писање." + }, + "appName": { + "message": "Гоогле документи у мрачном режиму" + }, + "storeDesc": { + "message": "🌟 Zašto izabrati Dark Mode Google Docs u odnosu na konkurente?\n\nSa brojnim Chrome ekstenzijama koje nude funkcionalnost dark moda, možda ćete se zapitati šta čini Dark Mode G Docs vašim glavnim izborom. Hajde da istražimo zašto se Dark Mode Google Docs ističe:\n\n1. Korisnički friendly interfejs: Dark Mode Google Docs obezbeđuje intuitivni interfejs za laku navigaciju. Pronalaženje postavki i opcija prilagođavanja je povetarac.\n2. Brzina i efikasnost: Naša ekstenzija je optimizovana za performanse, osiguravajući da neće usporiti vaš pretraživač ili Google Docs, isporučujući tamnu temu bez kompromitujuće brzine.\n3. Redovno ažuriranje: g docs crni režim neprekidno ažurira da bi održao korak sa promenama Google Docs-a, osiguravajući da vaše iskustvo u tamnom režimu ostane aktuelno i funkcionalno.\n4. Responsive Support: Ako naiđete na probleme ili imate pitanja, naš tim za podršku je spreman da odmah pomogne, posvećen obezbeđivanju nesmetanog iskustva.\n5. Wide User Base: google doc dire mode ima uspešnu korisničku zajednicu sa pozitivnim recenzijama koje atestiraju na njen kvalitet i pouzdanost. Pridružite se redovima zadovoljnih korisnika koji su transformisali svoje Google Docs iskustvo.\n\n🎨 Prilagođavanje tako da odgovara vašem stilu\n\nPersonalizovanje vašeg okruženja za pisanje je ključna prednost Dark Mode Google Docs-a. Prilagodite sadržaju svog srca:\n\nNivo tame: Podesite nivo tame tako da odgovara vašoj želji, od nežnog prigušenja do imerzivne tame.\nPrilagođavanje fonta: Odaberite stil fonta, veličinu i boju koja odgovara vašem stilu pisanja.\nOpcije pozadine: Prilagodite pozadinu boji ili teksturi koja upotpunjuje vašu estetiku.\nBoje za naglašavanje: Izaberite boje za naglašavanje da biste istakli određene elemente dokumenta.\n\n🌐 Kompatibilnost preko pregledača\n\nBez obzira da li koristite Chrome, Firefox ili neki drugi pregledač, Black Mode G Docs je dizajniran za kompatibilnost više pregledača. Uživajte u udobnoj i produktivnoj tamnoj temi bez obzira na izbor veb pregledača.\n\n🚀 Povećajte svoju produktivnost\n\nDark Mode Google Docs nije samo estetika; radi se o povećanju produktivnosti i poboljšanju vašeg iskustva u pisanju:\n\nFokus i koncentracija: Strašna tema smanjuje smetnje, omogućavajući vam da se koncentrišete na posao bez prekida.\nSmanjeni soj očiju: Oči će vam se zahvaliti na smanjenoj svetlini, čineći duge sesije pisanja udobnijim i manje zamaskidljivim.\nEnergetska efikasnost: Korišćenjem Dark Mode G Docs- a štedite oči i pomažete u uštedi energije, smanjujući vaš ugljenični otisak.\n\n🌚 U zaključku\n\nDark Mode Google Docs je vrhunska Chrome ekstenzija za svakoga ko traži udobno, prilagodljivo i efikasno iskustvo pisanja. Aktivirajte ga jednim klikom, prilagodite ga svojim potrebama i uživajte u okruženju bez ometanja koje je lako za vaše oči. Pridružite se zadovoljnoj zajednici korisnika koji su napravili Dark Mode G Doc svoj go-to izbor za superiorno Google Docs iskustvo.\n\n🌙 Google docs dark mod - Poboljšajte svoje iskustvo pisanja!\n\nDa li vam je zaslepljujući odsjaj ekrana dok radite na Google Docs zamornom? Da li čeznete za udobnijim i vizuelno prijatnijim okruženjem za pisanje? Ne gledajte dalje jer je Dark Mode Google Docs tu da transformiše vaše iskustvo pisanja.\n\nGoogle docs dark mod je vrhunska Chrome ekstenzija za one koji preferiraju tamniji, povoljniji izgled prilikom kreiranja, uređivanja ili čitanja dokumenata. Pomoću ove ekstenzije možete neprimetno prebaciti svoj Google Docs interfejs na elegantnu i umnožnu tamnu temu, čineći vaše sesije pisanja prijatnijim nego ikada ranije. Pozdravite se sa surovom svetlinom i pozdravite se sa produktivnošću sa stilom.\n\n🌟 Ključne karakteristike Dark Mode Google Docs\n\n1. Aktivacija bez napora: Dark Mode Google Docs je neverovatno jednostavan za korišćenje. Samo jednim klikom možete aktivirati tamnu temu za vaš Google Doc, stvarajući udobnije i fokusiranije okruženje za pisanje.\n\n2. Opcije prilagođavanja: Razumemo da jedna veličina ne odgovara svima. Zato nudimo razne opcije prilagođavanja, omogućavajući vam da utisnete proširenje tako da odgovara vašim ličnim preferencijama. Podesite nivo tame, font i pozadinu po vašem ukusu.\n\n3. Čuva vaše oči: Duge sesije pisanja mogu uzeti danak vašim očima. Dark Mode G Documents smanjuje naprezanje očiju obezbeđivanjem nežne, tamne pozadine koja je laka za vaš vid, čineći vaše iskustvo pisanja udobnijim.\n\n4. Poboljšani fokus: Mračna tema pomaže u eliminisanju smetnji i drži vašu pažnju tamo gde joj je mesto – na vašem pisanju. Nema više nepotrebnog odsjaja ili svetlih ekrana koji bi odvukli vaš fokus.\n\n5. Energetska efikasnost: Korišćenje Dark Mode Google dokumenata ne samo da koristi vašim očima već i štedi energiju, produžava život vašeg uređaja i štedi na troškovima električne energije.\n\n🖥️ Kompatibilnost i pristupačnost: G dokumenti u tamnom režimu kompatibilni su sa svim glavnim Veb pregledačima i lako je dostupan na računarima i radnim površinama. Sada možete da uživate u Google Docs tamnom režimu na vašoj željenoj platformi.\n\n🌚 Kako aktivirati Black Mode Google, Activating Dim Mode Google Docs je povetarac. Jednostavno preuzmite ekstenziju sa Chrome Web prodavnice i kliknite na ikonu Dark Mode Google Docs u vašem pretraživaču. Vaša Stranica \"Google dokumenti\" će se momentalno prebaciti na utemećujuću mračnu temu, pospešujući vaše iskustvo pisanja.\n\n📜 Zašto vam je potrebna ova ekstenzija?\n\nGoogle Docs Dark Mode: Dark Mode G Docs je definitivno rešenje da donesete dark mode na svoj Google Doc, osiguravajući da vam oči ostanu udobne tokom sesija pisanja.\nPoboljšana produktivnost: Sa okruženjem bez ometanja koje pruža crna tema, videćete da ste fokusiraniji, efikasniji i produktivniji u zadacima pisanja.\n\nZaštita očiju: Produženo izlaganje svetlom ekranu može biti štetno za vaše oči. Dark Mode Google Documents čuva vaše oči tako što smanjuje intenzitet svetlosti koja se emituje sa vašeg uređaja.\n\nOpcije prilagođavanja: Prilagodite Black Mode Google Doc po vašem ukusu. Podesite postavke tamnog režima, fontove i pozadine tako da odgovaraju vašim pojedinačnim željenim postavkama.\n\nKompatibilnost više pregledača: Bez obzira da li više volite Chrome, Firefox ili neki drugi pregledač, Dim Mode Google Docs je kompatibilan na celoj tabli, tako da možete da uživate u iskustvu režima bez obzira na izbor pregledača.\n\n📚 Najčešća pitanja:\n\n1. Kako da stavim Google Docs u režim bez meseca sa ovom ekstenzijom? Da biste aktivirali Dark Mode Google Docs, jednostavno preuzmite ekstenziju sa Chrome Web prodavnice, a zatim kliknite na ikonu Google documents dark mode u vašem pretraživaču.\n2. Da li je Dark Mode G Docs dostupan za desktop? Apsolutno! Dark Mode Google Docs dostupan je i za računare i za radne površine, čime se obezbeđuje da možete da uživate u udobnom okruženju za pisanje na željenoj platformi.\n3. Da li mogu da prilagodim izgled Dark Mode Google Docs- a? Da, možeš! Dark Mode Google Docs nudi različite opcije prilagođavanja, omogućavajući vam da proširenje prilagodite svojim ličnim preferencijama.\n4. Da li Google Docs ima maternji dark mod? Nažalost, Google Docs ne nudi maternji dark mod." + } +} diff --git a/_locales/sv/messages.json b/_locales/sv/messages.json new file mode 100644 index 0000000..6fcb00b --- /dev/null +++ b/_locales/sv/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Öka effektiviteten med vårt Google Docs-tillägg för mörkt läge. Upplev sömlöst Google Docs mörka läge för förbättrat skrivande." + }, + "appName": { + "message": "Mörkt läge Google Docs" + }, + "storeDesc": { + "message": "🌟 Varför välja Google Docs i mörkt läge framför konkurrenterna?\n\nMed många Chrome-tillägg som erbjuder mörkt läge-funktionalitet kanske du undrar vad som gör Dark Mode G Docs till ditt bästa val. Låt oss utforska varför Dark Mode Google Docs sticker ut:\n\n1. Användarvänligt gränssnitt: Dark Mode Google Docs har ett intuitivt gränssnitt för enkel navigering. Det är enkelt att hitta inställningar och anpassningsalternativ.\n2. Snabbhet och effektivitet: Vårt tillägg är optimerat för prestanda, så att det inte saktar ner din webbläsare eller Google Docs, och ger ett mörkt tema utan att kompromissa med hastigheten.\n3. Regelbundna uppdateringar: g docs black mode uppdateras kontinuerligt för att hålla jämna steg med Google Docs förändringar, vilket säkerställer att din upplevelse av mörkt läge förblir aktuell och funktionell.\n4. Responsiv support: Om du stöter på problem eller har frågor är vårt supportteam redo att hjälpa till snabbt och engagerat för att säkerställa en smidig upplevelse.\n5. Bred användarbas: google doc dire mode har en blomstrande användargrupp med positiva recensioner som vittnar om dess kvalitet och tillförlitlighet. Gå med i raden av nöjda användare som har förvandlat sin Google Docs-upplevelse.\n \n🎨 Anpassning för att passa din stil\n\nAtt anpassa din skrivmiljö är en viktig fördel med Dark Mode Google Docs. Anpassa till ditt hjärtas innehåll:\n \nMörkernivå: Justera mörkernivån för att matcha dina önskemål, från en mild dimma till ett uppslukande mörker.\nAnpassning av teckensnitt: Välj den typsnittsstil, storlek och färg som passar din skrivstil.\nAlternativ för bakgrunden: Skräddarsy bakgrunden med en färg eller textur som passar din estetik.\nAccentfärger: Välj accentfärger för att framhäva specifika dokumentelement.\n \n🌐 Kompatibilitet mellan webbläsare\n\nOavsett om du använder Chrome, Firefox eller någon annan webbläsare är Black Mode G Docs utformat för kompatibilitet mellan olika webbläsare. Njut av ett bekvämt och produktivt mörkt tema oavsett vilken webbläsare du använder.\n\n🚀 Öka din produktivitet\n\nMörkt läge i Google Docs handlar inte bara om estetik - det handlar om att öka produktiviteten och förbättra din skrivupplevelse:\n \nFokus och koncentration: Dire-temat minimerar distraktioner så att du kan koncentrera dig på ditt arbete utan avbrott.\nMinskad ansträngning för ögonen: Dina ögon kommer att tacka dig för den reducerade ljusstyrkan, vilket gör långa skrivsessioner mer bekväma och mindre tröttande.\nEnergieffektivitet: Genom att använda Dark Mode G Docs skonar du dina ögon och hjälper till att spara energi, vilket minskar ditt koldioxidavtryck.\n \n🌚 Slutsats\n\nDark Mode Google Docs är det ultimata Chrome-tillägget för alla som vill ha en bekväm, anpassningsbar och effektiv skrivupplevelse. Aktivera det med ett enda klick, anpassa det efter dina preferenser och njut av en distraktionsfri miljö som är lätt för dina ögon. Gå med i den nöjda skaran användare som har gjort Dark Mode G Doc till sitt förstahandsval för en överlägsen Google Docs-upplevelse.\n\n🌙 Google docs mörkt läge - Förbättra din skrivupplevelse!\n\nTycker du att det är tröttsamt att skärmen bländar när du arbetar med Google Dokument? Längtar du efter en mer bekväm och visuellt tilltalande skrivmiljö? Då behöver du inte leta längre, för Google Dokument i mörkt läge är här för att förändra din skrivupplevelse.\n\nGoogle Docs Dark Mode är det ultimata Chrome-tillägget för dig som föredrar ett mörkare, mer ögonvänligt utseende när du skapar, redigerar eller läser dokument. Med det här tillägget kan du sömlöst byta Google Docs-gränssnitt till ett snyggt och lugnande mörkt tema, vilket gör dina skrivsessioner mer njutbara än någonsin tidigare. Säg hejdå till den starka ljusstyrkan och hej till produktivitet med stil.\n\n🌟 Viktiga funktioner i Dark Mode Google Docs\n\n1. Enkel aktivering: Dark Mode Google Docs är otroligt lätt att använda. Med bara ett enda klick kan du aktivera det mörka temat för ditt Google-dokument och skapa en bekvämare och mer fokuserad skrivmiljö.\n\n2. Alternativ för anpassning: Vi förstår att en storlek inte passar alla. Det är därför vi erbjuder olika anpassningsalternativ, så att du kan justera tillägget för att matcha dina personliga preferenser. Justera mörkernivån, teckensnittet och bakgrunden efter eget tycke.\n\n3. Skonar dina ögon: Långa skrivsessioner kan vara påfrestande för dina ögon. Dark Mode G Documents minskar ansträngningen för ögonen genom att ge en mild, mörk bakgrund som är skonsam för synen, vilket gör skrivupplevelsen bekvämare.\n\n4. Förbättrat fokus: Det mörka temat hjälper till att eliminera distraktioner och håller din uppmärksamhet där den hör hemma - på ditt skrivande. Inga fler onödiga bländningar eller ljusa skärmar som tar fokus från dig.\n\n5. Energieffektivitet: Att använda det mörka läget i Google Dokument är inte bara bra för ögonen utan sparar också energi, vilket förlänger enhetens livslängd och sparar in på elkostnaderna.\n \n🖥️ Kompatibilitet och tillgänglighet: Dark Mode G Docs är kompatibelt med alla större webbläsare och är lätt tillgängligt på datorer och stationära datorer. Nu kan du njuta av Google Docs mörka läge på den plattform du föredrar.\n\n🌚 Så här aktiverar du Black Mode Google, Att aktivera Dim Mode Google Docs är en lek. Ladda bara ner tillägget från Chrome Web Store och klicka på ikonen för Google Dokument i mörkt läge i din webbläsare. Din Google Dokument-sida kommer omedelbart att växla till det lugnande mörka temat, vilket förbättrar din skrivupplevelse.\n\n📜 Varför behöver du det här tillägget?\n\nGoogle Docs mörkt läge: Dark Mode G Docs är den definitiva lösningen för att få mörkt läge till din Google Doc, vilket säkerställer att dina ögon förblir bekväma under dina skrivsessioner.\nFörbättrad produktivitet: Med den distraktionsfria miljö som det svarta temat ger kommer du att känna dig mer fokuserad, effektiv och produktiv i dina skrivuppgifter.\n\nSkydd för ögonen: Långvarig exponering för en ljusstark skärm kan vara skadligt för ögonen. Det mörka läget i Google Dokument skyddar dina ögon genom att minska ljusintensiteten från din enhet.\n\nAlternativ för anpassning: Skräddarsy Google Dokument i svart läge efter dina önskemål. Justera inställningarna för mörkt läge, teckensnitt och bakgrunder så att de passar dina individuella preferenser.\n\nKompatibilitet med flera webbläsare: Oavsett om du föredrar Chrome, Firefox eller någon annan webbläsare är Google Dokument med dämpat läge kompatibla över hela linjen, så att du kan njuta av läget oavsett vilken webbläsare du väljer.\n \n📚 Vanliga frågor:\n \n1. Hur sätter jag Google Dokument i månlöst läge med det här tillägget? För att aktivera Google Dokument i mörkt läge laddar du ner tillägget från Chrome Web Store och klickar sedan på ikonen för Google Dokument i mörkt läge i din webbläsare.\n2. Finns Dark Mode G Docs tillgängligt för datorer? Ja, absolut! Dark Mode Google Docs är tillgängligt för både PC och stationära datorer, vilket säkerställer att du kan njuta av en bekväm skrivmiljö på din föredragna plattform.\n3. Kan jag anpassa utseendet på Google Dokument i Dark Mode? Ja, det kan du! Dark Mode Google Docs erbjuder olika anpassningsalternativ, så att du kan skräddarsy tillägget efter dina personliga preferenser.\n4. Har Google Dokument ett inbyggt mörkt läge? Tyvärr har Google Dokument inget inbyggt mörkt läge." + } +} diff --git a/_locales/sw/messages.json b/_locales/sw/messages.json new file mode 100644 index 0000000..87597b3 --- /dev/null +++ b/_locales/sw/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Ongeza ufanisi ukitumia Kiendelezi chetu cha Hati za Google cha Hali Nyeusi. Pata hali ya giza ya Hati za Google bila mshono kwa uandishi ulioboreshwa." + }, + "appName": { + "message": "Hati za Google za Hali Nyeusi" + }, + "storeDesc": { + "message": "🌟 Kwa Nini Uchague Hati za Google za Hali Nyeusi Zaidi ya Washindani?\n\nKwa viendelezi vingi vya Chrome vinavyotoa utendakazi wa hali nyeusi, unaweza kujiuliza ni nini kinafanya Hati za G za Hali Nyeusi kuwa chaguo lako kuu. Hebu tuchunguze ni kwa nini Hati za Google za Hali ya Giza:\n\n1. Kiolesura Inayofaa Mtumiaji: Hali ya Giza Hati za Google hutoa kiolesura angavu kwa usogezaji kwa urahisi. Kupata mipangilio na chaguzi za ubinafsishaji ni rahisi.\n2. Kasi na Ufanisi: Kiendelezi chetu kimeboreshwa kwa ajili ya utendakazi, na kuhakikisha kuwa hakitapunguza kasi ya kivinjari chako au Hati za Google, kwa kutoa mandhari meusi bila kuathiri kasi.\n3. Masasisho ya Mara kwa Mara: g docs modi nyeusi husasishwa kila mara ili kuendana na mabadiliko ya Hati za Google, na kuhakikisha kwamba hali yako ya giza inabaki kuwa ya sasa na inafanya kazi.\n4. Usaidizi wa Kujibu: Ukikumbana na matatizo au una maswali, timu yetu ya usaidizi iko tayari kukusaidia mara moja, imejitolea kuhakikisha matumizi rahisi.\n5. Wide User Base: google doc dire mode ina jumuiya ya watumiaji inayostawi na hakiki chanya zinazothibitisha ubora na kutegemewa kwake. Jiunge na safu ya watumiaji walioridhika ambao wamebadilisha matumizi yao ya Hati za Google.\n \n🎨 Kubinafsisha Ili Kufaa Mtindo Wako\n\nKubinafsisha mazingira yako ya uandishi ni faida kuu ya Hati za Google za Hali Nyeusi. Geuza kukufaa kwa maudhui ya moyo wako:\n \nKiwango cha Giza: Rekebisha kiwango cha giza ili kuendana na mapendeleo yako, kutoka kwa mwanga hafifu hadi giza totoro.\nKubinafsisha Fonti: Chagua mtindo wa fonti, saizi na rangi inayolingana na mtindo wako wa uandishi.\nChaguzi za Mandharinyuma: Weka mandharinyuma kulingana na rangi au umbile linalokamilisha urembo wako.\nRangi za Lafudhi: Chagua rangi za lafudhi ili kuangazia vipengele mahususi vya hati.\n \n🌐 Utangamano Kote katika Vivinjari\n\nIwe unatumia Chrome, Firefox, au kivinjari kingine, Hati za Hali Nyeusi zimeundwa ili uoanifu wa vivinjari tofauti. Furahia mandhari ya giza ya kustarehesha na yenye tija bila kujali chaguo lako la kivinjari cha wavuti.\n\n🚀 Ongeza Tija Yako\n\nHali ya Giza Hati za Google sio tu kuhusu urembo; ni juu ya kuongeza tija na kuongeza uzoefu wako wa uandishi:\n \nKuzingatia na Kuzingatia: Mandhari ya Dire hupunguza usumbufu, hukuruhusu kuzingatia kazi yako bila kukatizwa.\nKupunguza Msongo wa Macho: Macho yako yatakushukuru kwa kupungua kwa mwangaza, na kufanya vipindi virefu vya kuandika vizuri zaidi na kupunguza uchovu.\nUfanisi wa Nishati: Kwa kutumia Hati za G za Hali Nyeusi, unaokoa macho yako na kusaidia kuhifadhi nishati, na kupunguza alama ya kaboni yako.\n \n🌚 Kwa Hitimisho\n\nHali ya Giza Hati za Google ndicho kiendelezi cha mwisho cha Chrome kwa mtu yeyote anayetafuta hali ya kustarehesha, inayoweza kugeuzwa kukufaa na yenye ufanisi ya uandishi. Iwashe kwa mbofyo mmoja, ibadilishe ifae mapendeleo yako, na ufurahie mazingira yasiyo na usumbufu ambayo ni rahisi machoni pako. Jiunge na jumuiya iliyoridhika ya watumiaji ambao wamefanya Hali ya Giza G Doc chaguo lao la kwenda kwa matumizi bora ya Hati za Google.\n\n🌙 Hali ya giza ya hati za Google - Boresha Uzoefu Wako wa Kuandika!\n\nJe, unaona mng'ao wa kupofusha wa skrini yako unapofanya kazi kwenye Hati za Google kuwa wa kuchosha? Je, unatamani mazingira ya uandishi yenye starehe zaidi na yanayoonekana kupendeza? Usiangalie zaidi kwa sababu Hali ya Giza Hati za Google ziko hapa ili kubadilisha hali yako ya uandishi.\n\nHali ya giza ya Hati za Google ndio kiendelezi cha mwisho cha Chrome kwa wale wanaopendelea mwonekano mweusi zaidi, unaopendeza macho wakati wa kuunda, kuhariri au kusoma hati. Ukiwa na kiendelezi hiki, unaweza kubadilisha kiolesura chako cha Hati za Google kwa urahisi hadi mandhari maridadi na yenye kutuliza, hivyo kufanya vipindi vyako vya uandishi kufurahisha zaidi kuliko hapo awali. Sema kwaheri kwa mwangaza mkali na hello kwa tija kwa mtindo.\n\n🌟 Sifa Muhimu za Hati za Google za Hali Nyeusi\n\n1. Uwezeshaji Bila Juhudi: Hali ya Giza Hati za Google ni rahisi sana kutumia. Kwa mbofyo mmoja tu, unaweza kuwezesha mandhari meusi ya Hati yako ya Google, na kuunda mazingira ya uandishi ya kustarehesha zaidi na yanayolenga zaidi.\n\n2. Chaguzi za Kubinafsisha: Tunaelewa kuwa saizi moja haifai zote. Ndiyo sababu tunatoa chaguo mbalimbali za kubinafsisha, kukuruhusu kurekebisha kiendelezi ili kuendana na mapendeleo yako ya kibinafsi. Rekebisha kiwango cha giza, fonti, na usuli upendavyo.\n\n3. Huokoa Macho Yako: Vipindi vya kuandika kwa muda mrefu vinaweza kuchukua athari kwenye macho yako. Nyaraka za G za Hali Nyeusi hupunguza mkazo wa macho kwa kukupa mandharinyuma meusi ambayo ni rahisi kuona, na kufanya uandikaji wako uwe rahisi zaidi.\n\n4. Uzingatiaji Ulioboreshwa: Mandhari meusi husaidia kuondoa usumbufu na kuweka umakini wako unapostahili - kwenye uandishi wako. Hakuna mng'ao tena usio wa lazima au skrini angavu ili kuvuta umakini wako.\n\n5. Ufanisi wa Nishati: Kutumia Hali ya Giza Nyaraka za Google sio tu kwamba zinafaidi macho yako bali pia huhifadhi nishati, kurefusha maisha ya kifaa chako na kuokoa gharama za umeme.\n \n🖥️ Upatanifu na Ufikivu: Hati za G za Hali Nyeusi zinaoana na vivinjari vyote vikuu vya wavuti na zinapatikana kwa urahisi kwenye Kompyuta na kompyuta za mezani. Sasa, unaweza kufurahia hali nyeusi ya Hati za Google kwenye mfumo unaopendelea.\n\n🌚 Jinsi ya Kuamilisha Hali Nyeusi kwenye Google, Kuamilisha Hali Dim kwenye Hati za Google ni rahisi.Pakua kiendelezi kutoka kwa Duka la Wavuti la Chrome na ubofye ikoni ya Hati za Google ya Hali Nyeusi kwenye kivinjari chako. Ukurasa wako wa Hati za Google utabadilika papo hapo hadi mandhari meusi ya kutuliza, na kuboresha matumizi yako ya uandishi.\n\n📜 Kwa Nini Unahitaji Kiendelezi Hiki?\n\nHali ya Giza ya Hati za Google: Hati za Hali ya Giza ndilo suluhu mahususi la kuleta hali nyeusi kwenye Hati yako ya Google, na kuhakikisha kuwa macho yako yanasalia vizuri wakati wa vipindi vyako vya kuandika.\nUzalishaji Ulioimarishwa: Kwa mazingira yasiyo na usumbufu ambayo mandhari meusi hutoa, utajipata ukiwa na umakini zaidi, ufanisi na tija katika kazi zako za uandishi.\n\nUlinzi wa Macho: Mfiduo wa muda mrefu kwenye skrini angavu inaweza kuwa hatari kwa macho yako. Nyaraka za Google za Hali ya Giza hulinda macho yako kwa kupunguza mwangaza unaotoka kwenye kifaa chako.\n\nChaguo za Kubinafsisha: Tengeneza Hati Nyeusi ya Google kwa upendavyo. Rekebisha mipangilio ya hali ya giza, fonti na mandharinyuma ili kuendana na mapendeleo yako binafsi.\n\nUpatanifu wa Kivinjari Mtambuka: Iwe unapendelea Chrome, Firefox, au kivinjari kingine, Hati za Google za Dim Mode zinaoana kote, kwa hivyo unaweza kufurahia hali ya matumizi bila kujali chaguo lako la kivinjari.\n \n📚 Maswali Yanayoulizwa Mara kwa Mara:\n \n1. Je, ninawezaje kuweka Hati za Google katika hali isiyo na mwezi kwa kiendelezi hiki? Ili kuwezesha Hati za Google za Hali Nyeusi, pakua tu kiendelezi kutoka kwenye Duka la Wavuti la Chrome, kisha ubofye aikoni ya hali ya giza ya hati za Google kwenye kivinjari chako.\n2. Je, Hati za Hali ya Giza zinapatikana kwa kompyuta ya mezani? Kabisa! Hali ya Giza Hati za Google zinapatikana kwa Kompyuta na kompyuta za mezani, na hivyo kuhakikisha kuwa unaweza kufurahia mazingira mazuri ya uandishi kwenye jukwaa unalopendelea.\n3. Je, ninaweza kubinafsisha mwonekano wa Hati za Google za Hali ya Giza? Ndio unaweza! Hali ya Giza Hati za Google hutoa chaguo mbalimbali za kubinafsisha, zinazokuruhusu kurekebisha kiendelezi kulingana na mapendeleo yako ya kibinafsi.\n4. Je, Hati za Google zina hali ya asili ya giza? Kwa bahati mbaya, Hati za Google haitoi hali ya asili ya giza." + } +} diff --git a/_locales/ta/messages.json b/_locales/ta/messages.json new file mode 100644 index 0000000..e36229f --- /dev/null +++ b/_locales/ta/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "எங்கள் டார்க் மோட் கூகுள் டாக்ஸ் நீட்டிப்பு மூலம் செயல்திறனை அதிகரிக்கவும். மேம்படுத்தப்பட்ட எழுதுவதற்கு தடையற்ற Google டாக்ஸ் இருண்ட பயன்முறையை அனுபவிக்கவும்." + }, + "appName": { + "message": "டார்க் மோட் கூகுள் டாக்ஸ்" + }, + "storeDesc": { + "message": "🌟 போட்டியாளர்களை விட டார்க் மோட் கூகுள் டாக்ஸை ஏன் தேர்வு செய்ய வேண்டும்?\n\nடார்க் மோட் செயல்பாட்டை வழங்கும் பல குரோம் நீட்டிப்புகள் மூலம், டார்க் மோட் ஜி டாக்ஸை உங்களின் சிறந்த தேர்வாக மாற்றுவது எது என்று நீங்கள் யோசிக்கலாம். டார்க் மோட் Google டாக்ஸ் ஏன் தனித்து நிற்கிறது என்பதை ஆராய்வோம்:\n\n1. பயனர் நட்பு இடைமுகம்: டார்க் மோட் Google டாக்ஸ் எளிதான வழிசெலுத்தலுக்கான உள்ளுணர்வு இடைமுகத்தை வழங்குகிறது. அமைப்புகள் மற்றும் தனிப்பயனாக்குதல் விருப்பங்களைக் கண்டறிவது ஒரு காற்று.\n2. வேகம் மற்றும் செயல்திறன்: எங்கள் நீட்டிப்பு செயல்திறனுக்காக உகந்ததாக உள்ளது, இது உங்கள் உலாவி அல்லது Google டாக்ஸை மெதுவாக்காது என்பதை உறுதிசெய்கிறது, வேகத்தை சமரசம் செய்யாமல் இருண்ட தீம் வழங்குகிறது.\n3. வழக்கமான புதுப்பிப்புகள்: g டாக்ஸ் பிளாக் பயன்முறையானது, Google டாக்ஸின் மாற்றங்களுக்கு ஏற்ப தொடர்ந்து புதுப்பிக்கப்பட்டு, உங்கள் டார்க் மோட் அனுபவம் தற்போதைய மற்றும் செயல்பாட்டுடன் இருப்பதை உறுதிசெய்கிறது.\n4. பதிலளிக்கக்கூடிய ஆதரவு: நீங்கள் சிக்கல்களை எதிர்கொண்டால் அல்லது கேள்விகள் இருந்தால், எங்கள் ஆதரவு குழு உடனடியாக உதவ தயாராக உள்ளது, ஒரு சுமூகமான அனுபவத்தை உறுதிசெய்ய உறுதிபூண்டுள்ளது.\n5. பரவலான பயனர் தளம்: google doc dire mode ஆனது அதன் தரம் மற்றும் நம்பகத்தன்மைக்கு சான்றளிக்கும் நேர்மறையான மதிப்புரைகளைக் கொண்ட ஒரு செழிப்பான பயனர் சமூகத்தைக் கொண்டுள்ளது. Google டாக்ஸ் அனுபவத்தை மாற்றிய திருப்தியான பயனர்களின் வரிசையில் சேரவும்.\n \n🎨 உங்கள் பாணிக்கு ஏற்றவாறு தனிப்பயனாக்கம்\n\nஉங்கள் எழுதும் சூழலைத் தனிப்பயனாக்குவது டார்க் மோட் கூகுள் டாக்ஸின் முக்கிய நன்மையாகும். உங்கள் இதயத்திற்கு ஏற்றவாறு தனிப்பயனாக்கவும்:\n \nடார்க்னஸ் லெவல்: உங்கள் விருப்பத்திற்கேற்ப, மென்மையான மங்கலிலிருந்து மூழ்கும் இருள் வரை இருள் அளவைச் சரிசெய்யவும்.\nஎழுத்துரு தனிப்பயனாக்கம்: உங்கள் எழுத்து நடைக்கு ஏற்ற எழுத்துரு நடை, அளவு மற்றும் வண்ணத்தைத் தேர்வு செய்யவும்.\nபின்னணி விருப்பங்கள்: உங்கள் அழகியலை முழுமையாக்கும் வண்ணம் அல்லது அமைப்புக்கு பின்னணியை மாற்றவும்.\nஉச்சரிப்பு நிறங்கள்: குறிப்பிட்ட ஆவண கூறுகளை முன்னிலைப்படுத்த உச்சரிப்பு வண்ணங்களைத் தேர்ந்தெடுக்கவும்.\n \n🌐 உலாவிகள் முழுவதும் இணக்கத்தன்மை\n\nநீங்கள் குரோம், பயர்பாக்ஸ் அல்லது வேறு உலாவியைப் பயன்படுத்தினாலும், பிளாக் மோட் ஜி டாக்ஸ் குறுக்கு உலாவி இணக்கத்திற்காக வடிவமைக்கப்பட்டுள்ளது. உங்கள் இணைய உலாவித் தேர்வைப் பொருட்படுத்தாமல், வசதியான மற்றும் பயனுள்ள இருண்ட தீமினை அனுபவிக்கவும்.\n\n🚀 உங்கள் உற்பத்தித்திறனை அதிகரிக்கவும்\n\nடார்க் மோட் கூகுள் டாக்ஸ் வெறும் அழகியல் சார்ந்தது அல்ல; இது உற்பத்தித்திறனை அதிகரிப்பது மற்றும் உங்கள் எழுத்து அனுபவத்தை மேம்படுத்துவது:\n \nஃபோகஸ் மற்றும் செறிவு: டைர் தீம் கவனச்சிதறல்களைக் குறைத்து, உங்கள் வேலையில் குறுக்கீடுகள் இல்லாமல் கவனம் செலுத்த அனுமதிக்கிறது.\nகுறைக்கப்பட்ட கண் சோர்வு: குறைந்த பிரகாசத்திற்கு உங்கள் கண்கள் நன்றி தெரிவிக்கும், நீண்ட எழுதும் அமர்வுகளை மிகவும் வசதியாகவும், சோர்வாகவும் மாற்றும்.\nஆற்றல் திறன்: டார்க் மோட் ஜி டாக்ஸைப் பயன்படுத்துவதன் மூலம், உங்கள் கண்களைச் சேமித்து, ஆற்றலைச் சேமிக்க உதவுகிறீர்கள், உங்கள் கார்பன் தடத்தைக் குறைக்கிறீர்கள்.\n \n🌚 முடிவில்\n\nடார்க் மோட் கூகுள் டாக்ஸ் என்பது வசதியான, தனிப்பயனாக்கக்கூடிய மற்றும் திறமையான எழுதும் அனுபவத்தைத் தேடும் எவருக்கும் இறுதியான Chrome நீட்டிப்பாகும். ஒரே கிளிக்கில் அதைச் செயல்படுத்தவும், உங்கள் விருப்பங்களுக்கு ஏற்ப தனிப்பயனாக்கவும், உங்கள் பார்வைக்கு எளிதாக இருக்கும் கவனச்சிதறல் இல்லாத சூழலை அனுபவிக்கவும். சிறந்த கூகுள் டாக்ஸ் அனுபவத்தைப் பெற, டார்க் மோட் ஜி டாக்கைப் பயன்படுத்திய திருப்திகரமான பயனர்களின் சமூகத்தில் சேரவும்.\n\n🌙 கூகுள் டாக்ஸ் டார்க் மோட் - உங்கள் எழுத்து அனுபவத்தை மேம்படுத்துங்கள்!\n\nகூகுள் டாக்ஸில் பணிபுரியும் போது உங்கள் திரையின் கண்மூடித்தனமான கண்ணை கூசுவதை நீங்கள் கண்டீர்களா? நீங்கள் மிகவும் வசதியான மற்றும் பார்வைக்கு மகிழ்ச்சியான எழுதும் சூழலுக்காக ஏங்குகிறீர்களா? டார்க் மோட் கூகுள் டாக்ஸ் உங்கள் எழுத்து அனுபவத்தை மாற்றியமைக்க உள்ளது, மேலும் பார்க்க வேண்டாம்.\n\nஆவணங்களை உருவாக்கும்போது, திருத்தும்போது அல்லது படிக்கும்போது இருண்ட, கண்ணுக்கு ஏற்ற தோற்றத்தை விரும்புவோருக்கு Google டாக்ஸ் டார்க் மோட் என்பது இறுதியான Chrome நீட்டிப்பாகும். இந்த நீட்டிப்பு மூலம், உங்கள் Google டாக்ஸ் இடைமுகத்தை ஒரு நேர்த்தியான மற்றும் இனிமையான இருண்ட தீமுக்கு மாற்றலாம், இது உங்கள் எழுத்து அமர்வுகளை முன்பை விட மிகவும் சுவாரஸ்யமாக ஆக்குகிறது. கடுமையான பிரகாசத்திற்கு குட்பை சொல்லுங்கள் மற்றும் பாணியில் உற்பத்தித்திறனுக்கு வணக்கம்.\n\n🌟 டார்க் மோட் கூகுள் டாக்ஸின் முக்கிய அம்சங்கள்\n\n1. சிரமமின்றி செயல்படுத்துதல்: டார்க் மோட் கூகுள் டாக்ஸ் பயன்படுத்த மிகவும் எளிதானது. ஒரே கிளிக்கில், உங்கள் Google ஆவணத்திற்கான டார்க் தீமைச் செயல்படுத்தலாம், இது மிகவும் வசதியான மற்றும் கவனம் செலுத்தும் சூழலை உருவாக்குகிறது.\n\n2. தனிப்பயனாக்குதல் விருப்பங்கள்: ஒரு அளவு அனைவருக்கும் பொருந்தாது என்பதை நாங்கள் புரிந்துகொள்கிறோம். அதனால்தான் நாங்கள் பல்வேறு தனிப்பயனாக்குதல் விருப்பங்களை வழங்குகிறோம், உங்கள் தனிப்பட்ட விருப்பங்களுடன் பொருந்தக்கூடிய நீட்டிப்பை மாற்ற அனுமதிக்கிறது. இருள் நிலை, எழுத்துரு மற்றும் பின்னணி ஆகியவற்றை உங்கள் விருப்பப்படி சரிசெய்யவும்.\n\n3. உங்கள் கண்களைச் சேமிக்கிறது: நீண்ட நேரம் எழுதுவது உங்கள் கண்களுக்குப் பாதிப்பை ஏற்படுத்தும். டார்க் மோட் ஜி ஆவணங்கள் உங்கள் பார்வைக்கு எளிதான மென்மையான, இருண்ட பின்னணியை வழங்குவதன் மூலம் கண் அழுத்தத்தைக் குறைக்கிறது, இது உங்கள் எழுத்து அனுபவத்தை மிகவும் வசதியாக்குகிறது.\n\n4. மேம்படுத்தப்பட்ட கவனம்: இருண்ட தீம் கவனச்சிதறல்களை அகற்ற உதவுகிறது மற்றும் உங்கள் கவனத்தை உங்கள் எழுத்தில் வைத்திருக்க உதவுகிறது. உங்கள் கவனத்தை இழுக்க தேவையற்ற கண்ணை கூசும் அல்லது பிரகாசமான திரைகள் இல்லை.\n\n5. ஆற்றல் திறன்: டார்க் மோட் கூகுள் ஆவணங்களைப் பயன்படுத்துவது உங்கள் கண்களுக்குப் பயன் தருவது மட்டுமல்லாமல் ஆற்றலைச் சேமிக்கிறது, உங்கள் சாதனத்தின் ஆயுளை நீடிக்கிறது மற்றும் மின்சாரச் செலவைச் சேமிக்கிறது.\n \n🖥️ இணக்கத்தன்மை மற்றும் அணுகல்தன்மை: டார்க் மோட் ஜி டாக்ஸ் அனைத்து முக்கிய இணைய உலாவிகளுக்கும் இணக்கமானது மற்றும் பிசிக்கள் மற்றும் டெஸ்க்டாப்களில் எளிதாகக் கிடைக்கும். இப்போது, நீங்கள் விரும்பும் பிளாட்ஃபார்மில் Google டாக்ஸ் டார்க் மோடை அனுபவிக்கலாம்.\n\n🌚 பிளாக் மோட் கூகுளை ஆக்டிவேட் செய்வது எப்படி, டிம் மோட் கூகுள் டாக்ஸை ஆக்டிவேட் செய்வது ஒரு தென்றல். Chrome Web Store இலிருந்து நீட்டிப்பைப் பதிவிறக்கி, உங்கள் உலாவியில் உள்ள Dark Mode Google Docs ஐகானைக் கிளிக் செய்யவும். உங்கள் Google ஆவணங்கள் பக்கம் உடனடியாக அமைதியான இருண்ட தீமுக்கு மாறும், உங்கள் எழுத்து அனுபவத்தை மேம்படுத்தும்.\n\n📜 உங்களுக்கு ஏன் இந்த நீட்டிப்பு தேவை?\n\nகூகுள் டாக்ஸ் டார்க் மோட்: டார்க் மோட் ஜி டாக்ஸ் என்பது உங்கள் கூகுள் டாக்கிற்கு டார்க் மோடைக் கொண்டுவருவதற்கான உறுதியான தீர்வாகும், இது உங்கள் எழுத்து அமர்வுகளின் போது உங்கள் கண்கள் வசதியாக இருப்பதை உறுதி செய்கிறது.\nமேம்படுத்தப்பட்ட உற்பத்தித்திறன்: பிளாக் தீம் வழங்கும் கவனச்சிதறல் இல்லாத சூழலுடன், நீங்கள் எழுதும் பணிகளில் அதிக கவனம் செலுத்தி, திறமையான மற்றும் உற்பத்தித்திறனைக் காண்பீர்கள்.\n\nகண் பாதுகாப்பு: பிரகாசமான திரையில் நீண்ட நேரம் இருப்பது உங்கள் கண்களுக்கு தீங்கு விளைவிக்கும். டார்க் மோட் Google ஆவணங்கள் உங்கள் சாதனத்திலிருந்து வெளிப்படும் ஒளியின் தீவிரத்தைக் குறைப்பதன் மூலம் உங்கள் கண்களைப் பாதுகாக்கிறது.\n\nதனிப்பயனாக்குதல் விருப்பங்கள்: உங்கள் விருப்பத்திற்கு ஏற்ப பிளாக் பயன்முறை Google டாக். உங்கள் தனிப்பட்ட விருப்பங்களுக்கு ஏற்ப இருண்ட பயன்முறை அமைப்புகள், எழுத்துருக்கள் மற்றும் பின்னணிகளை சரிசெய்யவும்.\n\nகுறுக்கு உலாவி இணக்கத்தன்மை: நீங்கள் Chrome, Firefox அல்லது வேறு உலாவியை விரும்பினாலும், மங்கலான பயன்முறை Google டாக்ஸ் போர்டு முழுவதும் இணக்கமாக இருக்கும், எனவே நீங்கள் எந்த உலாவியைத் தேர்வுசெய்தாலும் பயன்முறை அனுபவத்தை அனுபவிக்க முடியும்.\n \n📚 அடிக்கடி கேட்கப்படும் கேள்விகள்:\n \n1. இந்த நீட்டிப்புடன் கூகுள் டாக்ஸை மூன்லெஸ் மோடில் வைப்பது எப்படி? டார்க் மோட் கூகுள் டாக்ஸைச் செயல்படுத்த, குரோம் வெப் ஸ்டோரிலிருந்து நீட்டிப்பைப் பதிவிறக்கவும், பின்னர் உங்கள் உலாவியில் உள்ள கூகுள் டாகுமெண்ட்ஸ் டார்க் மோட் ஐகானைக் கிளிக் செய்யவும்.\n2. டார்க் மோட் ஜி டாக்ஸ் டெஸ்க்டாப்பில் கிடைக்குமா? முற்றிலும்! டார்க் மோட் கூகுள் டாக்ஸ் பிசிக்கள் மற்றும் டெஸ்க்டாப்கள் இரண்டிற்கும் கிடைக்கிறது, இது உங்களுக்கு விருப்பமான மேடையில் வசதியான எழுத்துச் சூழலை அனுபவிக்க முடியும் என்பதை உறுதி செய்கிறது.\n3. டார்க் மோட் கூகுள் டாக்ஸின் தோற்றத்தைத் தனிப்பயனாக்க முடியுமா? ஆமாம் உன்னால் முடியும்! டார்க் மோட் Google டாக்ஸ் பல்வேறு தனிப்பயனாக்குதல் விருப்பங்களை வழங்குகிறது, இது உங்கள் தனிப்பட்ட விருப்பங்களுக்கு ஏற்ப நீட்டிப்பை மாற்ற அனுமதிக்கிறது.\n4. Google டாக்ஸில் நேட்டிவ் டார்க் மோட் உள்ளதா? துரதிர்ஷ்டவசமாக, Google டாக்ஸ் ஒரு நேட்டிவ் டார்க் பயன்முறையை வழங்கவில்லை." + } +} diff --git a/_locales/te/messages.json b/_locales/te/messages.json new file mode 100644 index 0000000..1a7932e --- /dev/null +++ b/_locales/te/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "మా డార్క్ మోడ్ Google డాక్స్ ఎక్స్‌టెన్షన్‌తో సామర్థ్యాన్ని పెంచండి. మెరుగైన రచన కోసం అతుకులు లేని Google డాక్స్ డార్క్ మోడ్‌ను అనుభవించండి." + }, + "appName": { + "message": "డార్క్ మోడ్ Google డాక్స్" + }, + "storeDesc": { + "message": "🌟 పోటీదారుల కంటే డార్క్ మోడ్ Google డాక్స్‌ను ఎందుకు ఎంచుకోవాలి?\n\nడార్క్ మోడ్ ఫంక్షనాలిటీని అందించే అనేక Chrome ఎక్స్‌టెన్షన్‌లతో, డార్క్ మోడ్ G డాక్స్‌ని మీ అగ్ర ఎంపికగా మార్చడం ఏమిటని మీరు ఆశ్చర్యపోవచ్చు. డార్క్ మోడ్ Google డాక్స్ ఎందుకు ప్రత్యేకంగా నిలుస్తుందో అన్వేషిద్దాం:\n\n1. యూజర్ ఫ్రెండ్లీ ఇంటర్‌ఫేస్: డార్క్ మోడ్ Google డాక్స్ సులభమైన నావిగేషన్ కోసం ఒక సహజమైన ఇంటర్‌ఫేస్‌ను అందిస్తుంది. సెట్టింగ్‌లు మరియు అనుకూలీకరణ ఎంపికలను కనుగొనడం చాలా కష్టం.\n2. వేగం మరియు సామర్థ్యం: మా ఎక్స్‌టెన్షన్ పనితీరు కోసం ఆప్టిమైజ్ చేయబడింది, ఇది మీ బ్రౌజర్ లేదా Google డాక్స్‌ను నెమ్మదించదని నిర్ధారిస్తుంది, వేగంతో రాజీ పడకుండా డార్క్ థీమ్‌ను అందిస్తుంది.\n3. రెగ్యులర్ అప్‌డేట్‌లు: g డాక్స్ బ్లాక్ మోడ్ Google డాక్స్ మార్పులకు అనుగుణంగా నిరంతరం అప్‌డేట్ అవుతుంది, మీ డార్క్ మోడ్ అనుభవం ప్రస్తుతానికి మరియు క్రియాత్మకంగా ఉండేలా చూస్తుంది.\n4. ప్రతిస్పందించే మద్దతు: మీకు సమస్యలు ఎదురైనప్పుడు లేదా ఏవైనా ప్రశ్నలు ఉంటే, మా మద్దతు బృందం తక్షణమే సహాయం చేయడానికి సిద్ధంగా ఉంది, సున్నితమైన అనుభవాన్ని నిర్ధారించడానికి కట్టుబడి ఉంటుంది.\n5. విస్తృత వినియోగదారు స్థావరం: గూగుల్ డాక్ డైర్ మోడ్ దాని నాణ్యత మరియు విశ్వసనీయతను ధృవీకరించే సానుకూల సమీక్షలతో అభివృద్ధి చెందుతున్న వినియోగదారు సంఘాన్ని కలిగి ఉంది. వారి Google డాక్స్ అనుభవాన్ని మార్చిన సంతృప్తి చెందిన వినియోగదారుల ర్యాంక్‌లో చేరండి.\n \n🎨 మీ శైలికి సరిపోయేలా అనుకూలీకరణ\n\nమీ రచనా వాతావరణాన్ని వ్యక్తిగతీకరించడం డార్క్ మోడ్ Google డాక్స్ యొక్క ముఖ్య ప్రయోజనం. మీ హృదయ కంటెంట్‌కు అనుకూలీకరించండి:\n \nడార్క్‌నెస్ లెవెల్: మీ ప్రాధాన్యతకు సరిపోయేలా డార్క్‌నెస్ లెవెల్‌ను సర్దుబాటు చేయండి, సున్నితమైన డిమ్ నుండి లీనమయ్యే చీకటి వరకు.\nఫాంట్ అనుకూలీకరణ: మీ రచనా శైలికి సరిపోయే ఫాంట్ శైలి, పరిమాణం మరియు రంగును ఎంచుకోండి.\nనేపథ్య ఎంపికలు: మీ సౌందర్యాన్ని పూర్తి చేసే రంగు లేదా ఆకృతికి నేపథ్యాన్ని అనుకూలీకరించండి.\nయాస రంగులు: నిర్దిష్ట డాక్యుమెంట్ ఎలిమెంట్‌లను హైలైట్ చేయడానికి యాస రంగులను ఎంచుకోండి.\n \n🌐 బ్రౌజర్‌లలో అనుకూలత\n\nమీరు Chrome, Firefox లేదా మరొక బ్రౌజర్‌ని ఉపయోగించినా, బ్లాక్ మోడ్ G డాక్స్ క్రాస్ బ్రౌజర్ అనుకూలత కోసం రూపొందించబడింది. మీ వెబ్ బ్రౌజర్ ఎంపికతో సంబంధం లేకుండా సౌకర్యవంతమైన మరియు ఉత్పాదక చీకటి థీమ్‌ను ఆస్వాదించండి.\n\n🚀 మీ ఉత్పాదకతను పెంచుకోండి\n\nడార్క్ మోడ్ Google డాక్స్ కేవలం సౌందర్యానికి సంబంధించినది కాదు; ఇది ఉత్పాదకతను పెంచడం మరియు మీ వ్రాత అనుభవాన్ని మెరుగుపరుస్తుంది:\n \nఫోకస్ మరియు ఏకాగ్రత: డైర్ థీమ్ పరధ్యానాన్ని తగ్గిస్తుంది, అంతరాయాలు లేకుండా మీ పనిపై దృష్టి పెట్టడానికి మిమ్మల్ని అనుమతిస్తుంది.\nతగ్గిన కంటి స్ట్రెయిన్: తగ్గిన ప్రకాశానికి మీ కళ్ళు మీకు కృతజ్ఞతలు తెలుపుతాయి, ఎక్కువసేపు వ్రాసే సెషన్‌లను మరింత సౌకర్యవంతంగా మరియు తక్కువ అలసటను కలిగిస్తాయి.\nశక్తి సామర్థ్యం: డార్క్ మోడ్ G డాక్స్‌ని ఉపయోగించడం ద్వారా, మీరు మీ కళ్ళను ఆదా చేస్తారు మరియు శక్తిని ఆదా చేయడంలో సహాయపడతారు, మీ కార్బన్ పాదముద్రను తగ్గించవచ్చు.\n \n🌚 ముగింపులో\n\nడార్క్ మోడ్ Google డాక్స్ అనేది సౌకర్యవంతమైన, అనుకూలీకరించదగిన మరియు సమర్థవంతమైన వ్రాత అనుభవాన్ని కోరుకునే ఎవరికైనా అంతిమ Chrome పొడిగింపు. ఒకే క్లిక్‌తో దీన్ని యాక్టివేట్ చేయండి, మీ ప్రాధాన్యతలకు అనుకూలీకరించండి మరియు మీ దృష్టికి సులభంగా ఉండే పరధ్యాన రహిత వాతావరణాన్ని ఆస్వాదించండి. ఉన్నతమైన Google డాక్స్ అనుభవం కోసం డార్క్ మోడ్ G డాక్‌ని ఎంపిక చేసుకున్న వినియోగదారుల సంతృప్తి చెందిన సంఘంలో చేరండి.\n\n🌙 Google డాక్స్ డార్క్ మోడ్ - మీ వ్రాత అనుభవాన్ని మెరుగుపరచుకోండి!\n\nGoogle డాక్స్ టైర్‌సమ్‌లో పని చేస్తున్నప్పుడు మీ స్క్రీన్ బ్లైండింగ్ గ్లేర్‌ని మీరు కనుగొంటారా? మీరు మరింత సౌకర్యవంతమైన మరియు దృశ్యమానమైన వ్రాత వాతావరణం కోసం ఆరాటపడుతున్నారా? మీ వ్రాత అనుభవాన్ని మార్చడానికి డార్క్ మోడ్ Google డాక్స్ ఇక్కడ ఉంది కాబట్టి ఇక చూడకండి.\n\nGoogle డాక్స్ డార్క్ మోడ్ అనేది డాక్యుమెంట్‌లను క్రియేట్ చేసేటప్పుడు, ఎడిట్ చేస్తున్నప్పుడు లేదా చదివేటప్పుడు చీకటిగా, మరింత కంటికి అనుకూలమైన రూపాన్ని ఇష్టపడే వారికి అంతిమ Chrome పొడిగింపు. ఈ పొడిగింపుతో, మీరు మీ Google డాక్స్ ఇంటర్‌ఫేస్‌ను సొగసైన మరియు ఓదార్పు డార్క్ థీమ్‌కి సజావుగా మార్చవచ్చు, ఇది మీ వ్రాత సెషన్‌లను మునుపెన్నడూ లేనంతగా ఆనందదాయకంగా మారుస్తుంది. కఠినమైన ప్రకాశానికి వీడ్కోలు చెప్పండి మరియు శైలిలో ఉత్పాదకతకు హలో.\n\n🌟 డార్క్ మోడ్ Google డాక్స్ యొక్క ముఖ్య లక్షణాలు\n\n1. అప్రయత్నంగా యాక్టివేషన్: డార్క్ మోడ్ Google డాక్స్ ఉపయోగించడానికి చాలా సులభం. కేవలం ఒక్క క్లిక్‌తో, మీరు మీ Google డాక్ కోసం డార్క్ థీమ్‌ని యాక్టివేట్ చేయవచ్చు, మరింత సౌకర్యవంతమైన మరియు ఫోకస్డ్ రైటింగ్ వాతావరణాన్ని సృష్టించవచ్చు.\n\n2. అనుకూలీకరణ ఎంపికలు: ఒక పరిమాణం అందరికీ సరిపోదని మేము అర్థం చేసుకున్నాము. అందుకే మేము వివిధ అనుకూలీకరణ ఎంపికలను అందిస్తున్నాము, మీ వ్యక్తిగత ప్రాధాన్యతలకు సరిపోయేలా పొడిగింపును సర్దుబాటు చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. చీకటి స్థాయి, ఫాంట్ మరియు నేపథ్యాన్ని మీకు నచ్చిన విధంగా సర్దుబాటు చేయండి.\n\n3. మీ కళ్లను ఆదా చేస్తుంది: ఎక్కువసేపు వ్రాసే సెషన్‌లు మీ కళ్లపై ప్రభావం చూపుతాయి. డార్క్ మోడ్ G డాక్యుమెంట్‌లు మీ దృష్టికి తేలికగా ఉండే సున్నితమైన, చీకటి నేపథ్యాన్ని అందించడం ద్వారా కంటి ఒత్తిడిని తగ్గిస్తుంది, మీ రచనా అనుభవాన్ని మరింత సౌకర్యవంతంగా చేస్తుంది.\n\n4. మెరుగైన ఫోకస్: డార్క్ థీమ్ పరధ్యానాన్ని తొలగించడంలో సహాయపడుతుంది మరియు మీ దృష్టిని మీ రచనపై ఉంచుతుంది. మీ దృష్టిని తీసివేయడానికి అనవసరమైన కాంతి లేదా ప్రకాశవంతమైన స్క్రీన్‌లు లేవు.\n\n5. ఎనర్జీ ఎఫిషియెన్సీ: డార్క్ మోడ్ Google డాక్యుమెంట్‌లను ఉపయోగించడం వల్ల మీ కళ్లకు ప్రయోజనం చేకూర్చడమే కాకుండా శక్తిని ఆదా చేస్తుంది, మీ పరికరం యొక్క జీవితాన్ని పొడిగిస్తుంది మరియు విద్యుత్ ఖర్చులను ఆదా చేస్తుంది.\n \n🖥️ అనుకూలత మరియు ప్రాప్యత: డార్క్ మోడ్ G డాక్స్ అన్ని ప్రధాన వెబ్ బ్రౌజర్‌లకు అనుకూలంగా ఉంటుంది మరియు PCలు మరియు డెస్క్‌టాప్‌లలో సులభంగా అందుబాటులో ఉంటుంది. ఇప్పుడు, మీరు మీ ప్రాధాన్య ప్లాట్‌ఫారమ్‌లో Google డాక్స్ డార్క్ మోడ్‌ను ఆస్వాదించవచ్చు.\n\n🌚 బ్లాక్ మోడ్ Googleని ఎలా యాక్టివేట్ చేయాలి, డిమ్ మోడ్ Google డాక్స్‌ని యాక్టివేట్ చేయడం ఒక బ్రీజ్. Chrome వెబ్ స్టోర్ నుండి పొడిగింపును డౌన్‌లోడ్ చేసి, మీ బ్రౌజర్‌లోని డార్క్ మోడ్ Google డాక్స్ చిహ్నంపై క్లిక్ చేయండి. మీ Google పత్రాల పేజీ తక్షణమే ఓదార్పు డార్క్ థీమ్‌కి మారుతుంది, మీ వ్రాత అనుభవాన్ని మెరుగుపరుస్తుంది.\n\n📜 మీకు ఈ పొడిగింపు ఎందుకు అవసరం?\n\nGoogle డాక్స్ డార్క్ మోడ్: డార్క్ మోడ్ G డాక్స్ అనేది మీ Google డాక్‌కి డార్క్ మోడ్‌ని తీసుకురావడానికి ఖచ్చితమైన పరిష్కారం, ఇది మీ వ్రాత సెషన్‌లలో మీ కళ్ళు సౌకర్యవంతంగా ఉండేలా చూస్తుంది.\nమెరుగైన ఉత్పాదకత: బ్లాక్ థీమ్ అందించే పరధ్యాన రహిత వాతావరణంతో, మీరు మీ వ్రాత పనులలో మరింత దృష్టి కేంద్రీకరించి, సమర్థవంతంగా మరియు ఉత్పాదకతను పొందుతారు.\n\nకంటి రక్షణ: ప్రకాశవంతమైన స్క్రీన్‌కు ఎక్కువసేపు బహిర్గతం కావడం మీ కళ్ళకు హానికరం. డార్క్ మోడ్ Google పత్రాలు మీ పరికరం నుండి వెలువడే కాంతి తీవ్రతను తగ్గించడం ద్వారా మీ కళ్లకు రక్షణ కల్పిస్తుంది.\n\nఅనుకూలీకరణ ఎంపికలు: మీ ఇష్టానికి తగినట్లుగా బ్లాక్ మోడ్ Google డాక్‌ను టైలర్ చేయండి. మీ వ్యక్తిగత ప్రాధాన్యతలకు అనుగుణంగా డార్క్ మోడ్ సెట్టింగ్‌లు, ఫాంట్‌లు మరియు నేపథ్యాలను సర్దుబాటు చేయండి.\n\nక్రాస్-బ్రౌజర్ అనుకూలత: మీరు Chrome, Firefox లేదా మరొక బ్రౌజర్‌ని ఎంచుకున్నా, డిమ్ మోడ్ Google డాక్స్ బోర్డు అంతటా అనుకూలంగా ఉంటుంది, కాబట్టి మీరు మీ బ్రౌజర్ ఎంపికతో సంబంధం లేకుండా మోడ్ అనుభవాన్ని ఆస్వాదించవచ్చు.\n \n📚 తరచుగా అడిగే ప్రశ్నలు:\n \n1. ఈ పొడిగింపుతో నేను Google డాక్స్‌ని మూన్‌లెస్ మోడ్‌లో ఎలా ఉంచగలను? డార్క్ మోడ్ Google డాక్స్‌ని సక్రియం చేయడానికి, Chrome వెబ్ స్టోర్ నుండి పొడిగింపును డౌన్‌లోడ్ చేసి, ఆపై మీ బ్రౌజర్‌లోని Google డాక్యుమెంట్స్ డార్క్ మోడ్ చిహ్నంపై క్లిక్ చేయండి.\n2. డెస్క్‌టాప్ కోసం డార్క్ మోడ్ G డాక్స్ అందుబాటులో ఉందా? ఖచ్చితంగా! డార్క్ మోడ్ Google డాక్స్ PCలు మరియు డెస్క్‌టాప్‌లు రెండింటికీ అందుబాటులో ఉంది, మీరు ఇష్టపడే ప్లాట్‌ఫారమ్‌లో మీరు సౌకర్యవంతమైన వ్రాత వాతావరణాన్ని ఆస్వాదించవచ్చని నిర్ధారిస్తుంది.\n3. డార్క్ మోడ్ Google డాక్స్ రూపాన్ని నేను అనుకూలీకరించవచ్చా? మీరు చెయ్యవచ్చు అవును! డార్క్ మోడ్ Google డాక్స్ వివిధ అనుకూలీకరణ ఎంపికలను అందిస్తుంది, ఇది మీ వ్యక్తిగత ప్రాధాన్యతలకు అనుగుణంగా పొడిగింపును రూపొందించడానికి మిమ్మల్ని అనుమతిస్తుంది.\n4. Google డాక్స్‌కు స్థానిక డార్క్ మోడ్ ఉందా? దురదృష్టవశాత్తూ, Google డాక్స్ స్థానిక డార్క్ మోడ్‌ను అందించడం లేదు." + } +} diff --git a/_locales/th/messages.json b/_locales/th/messages.json new file mode 100644 index 0000000..1852d1a --- /dev/null +++ b/_locales/th/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "เพิ่มประสิทธิภาพด้วยส่วนขยาย Google Docs ในโหมดมืดของเรา สัมผัสประสบการณ์โหมดมืดของ Google เอกสารที่ราบรื่นเพื่อการเขียนที่ดียิ่งขึ้น" + }, + "appName": { + "message": "Google เอกสารโหมดมืด" + }, + "storeDesc": { + "message": "🌟 เหตุใดจึงเลือก Google Docs โหมดมืดเหนือคู่แข่ง\n\nด้วยส่วนขยาย Chrome มากมายที่นำเสนอฟังก์ชันโหมดมืด คุณอาจสงสัยว่าอะไรทำให้ Dark Mode G Docs เป็นตัวเลือกอันดับต้นๆ ของคุณ มาสำรวจว่าทำไม Google Docs โหมดมืดจึงโดดเด่น:\n\n1. ส่วนต่อประสานที่ใช้งานง่าย: โหมดมืด Google Docs มอบส่วนต่อประสานที่ใช้งานง่ายเพื่อการนำทางที่ง่ายดาย การค้นหาการตั้งค่าและตัวเลือกการปรับแต่งเป็นเรื่องง่าย\n2. ความเร็วและประสิทธิภาพ: ส่วนขยายของเราได้รับการปรับให้เหมาะสมเพื่อประสิทธิภาพ รับรองว่าจะไม่ทำให้เบราว์เซอร์หรือ Google เอกสารของคุณช้าลง โดยนำเสนอธีมสีเข้มโดยไม่กระทบต่อความเร็ว\n3. การอัปเดตเป็นประจำ: โหมดสีดำ g docs อัปเดตอย่างต่อเนื่องเพื่อให้ทันกับการเปลี่ยนแปลงของ Google เอกสาร ทำให้มั่นใจได้ว่าประสบการณ์โหมดมืดของคุณจะยังคงเป็นปัจจุบันและใช้งานได้\n4. การสนับสนุนที่ตอบสนอง: หากคุณพบปัญหาหรือมีคำถาม ทีมสนับสนุนของเราพร้อมที่จะช่วยเหลือทันที โดยมุ่งมั่นที่จะรับประกันประสบการณ์ที่ราบรื่น\n5. ฐานผู้ใช้ที่กว้างขวาง: โหมด Google doc dire มีชุมชนผู้ใช้ที่เจริญรุ่งเรืองพร้อมบทวิจารณ์เชิงบวกที่ยืนยันถึงคุณภาพและความน่าเชื่อถือ เข้าร่วมกับกลุ่มผู้ใช้ที่พึงพอใจที่ได้เปลี่ยนแปลงประสบการณ์การใช้ Google เอกสาร\n \n🎨 ปรับแต่งให้เหมาะกับสไตล์ของคุณ\n\nการปรับเปลี่ยนสภาพแวดล้อมการเขียนในแบบของคุณเป็นข้อได้เปรียบหลักของ Google Docs โหมดมืด ปรับแต่งตามใจคุณ:\n \nระดับความมืด: ปรับระดับความมืดให้ตรงกับความต้องการของคุณ ตั้งแต่แสงสลัวเล็กน้อยไปจนถึงความมืดมิดที่น่าดื่มด่ำ\nการปรับแต่งแบบอักษร: เลือกรูปแบบ ขนาด และสีแบบอักษรที่เหมาะกับสไตล์การเขียนของคุณ\nตัวเลือกพื้นหลัง: ปรับแต่งพื้นหลังให้เป็นสีหรือพื้นผิวที่เสริมความสวยงามของคุณ\nสีที่ถูกเน้น: เลือกสีที่ถูกเน้นเพื่อเน้นองค์ประกอบเอกสารเฉพาะ\n \n🌐 ความเข้ากันได้ข้ามเบราว์เซอร์\n\nไม่ว่าคุณจะใช้ Chrome, Firefox หรือเบราว์เซอร์อื่น Black Mode G Docs ได้รับการออกแบบมาเพื่อความเข้ากันได้ข้ามเบราว์เซอร์ เพลิดเพลินกับธีมสีเข้มที่สะดวกสบายและมีประสิทธิภาพ ไม่ว่าคุณจะเลือกเว็บเบราว์เซอร์ใดก็ตาม\n\n🚀 เพิ่มผลผลิตของคุณ\n\nDark Mode Google Docs ไม่ใช่แค่ความสวยงามเท่านั้น มันเกี่ยวกับการเพิ่มประสิทธิภาพการทำงานและประสบการณ์การเขียนของคุณ:\n \nสมาธิและสมาธิ: ธีม Dire ช่วยลดสิ่งรบกวนสมาธิ ช่วยให้คุณมีสมาธิกับงานได้โดยไม่หยุดชะงัก\nลดอาการปวดตา: ดวงตาของคุณจะขอบคุณสำหรับความสว่างที่ลดลง ทำให้การเขียนที่ยาวนานสบายขึ้นและเมื่อยล้าน้อยลง\nประสิทธิภาพการใช้พลังงาน: ด้วยการใช้ Dark Mode G Docs คุณจะรักษาสายตาและช่วยประหยัดพลังงาน ลดการปล่อยก๊าซคาร์บอนไดออกไซด์\n \n🌚 โดยสรุป\n\nGoogle Docs โหมดมืดเป็นส่วนขยาย Chrome ขั้นสูงสุดสำหรับทุกคนที่กำลังมองหาประสบการณ์การเขียนที่สะดวกสบาย ปรับแต่งได้ และมีประสิทธิภาพ เปิดใช้งานด้วยการคลิกเพียงครั้งเดียว ปรับแต่งตามความต้องการของคุณ และเพลิดเพลินไปกับสภาพแวดล้อมที่ปราศจากสิ่งรบกวนและสบายตา เข้าร่วมชุมชนผู้ใช้ที่พึงพอใจซึ่งทำให้ Dark Mode G Doc เป็นทางเลือกสำหรับประสบการณ์ Google Docs ที่เหนือกว่า\n\n🌙 โหมดมืดของ Google เอกสาร - ยกระดับประสบการณ์การเขียนของคุณ!\n\nคุณพบว่าแสงจ้าบนหน้าจอของคุณในขณะที่ทำงานกับ Google Docs นั้นน่าเบื่อหรือไม่? คุณโหยหาสภาพแวดล้อมการเขียนที่สะดวกสบายและสวยงามยิ่งขึ้นหรือไม่? ไม่ต้องมองหาที่ไหนอีกแล้วเพราะ Google Docs โหมดมืดอยู่ที่นี่เพื่อเปลี่ยนประสบการณ์การเขียนของคุณ\n\nโหมดมืดของ Google เอกสารเป็นส่วนขยาย Chrome ขั้นสูงสุดสำหรับผู้ที่ต้องการรูปลักษณ์ที่เข้มกว่าและเป็นมิตรกับสายตามากกว่าเมื่อสร้าง แก้ไข หรืออ่านเอกสาร ด้วยส่วนขยายนี้ คุณสามารถเปลี่ยนอินเทอร์เฟซ Google เอกสารของคุณเป็นธีมสีเข้มที่ทันสมัยและผ่อนคลายได้อย่างราบรื่น ทำให้การเขียนของคุณสนุกสนานกว่าที่เคย บอกลาความสว่างที่รุนแรงและสวัสดีกับประสิทธิภาพการทำงานอย่างมีสไตล์\n\n🌟 คุณสมบัติหลักของ Google Docs โหมดมืด\n\n1. การเปิดใช้งานที่ง่ายดาย: โหมดมืด Google Docs ใช้งานง่ายอย่างไม่น่าเชื่อ ด้วยการคลิกเพียงครั้งเดียว คุณสามารถเปิดใช้งานธีมสีเข้มสำหรับ Google Doc ของคุณได้ สร้างสภาพแวดล้อมการเขียนที่สะดวกสบายและมีสมาธิมากขึ้น\n\n2. ตัวเลือกการปรับแต่ง: เราเข้าใจดีว่าขนาดเดียวไม่เหมาะกับทุกคน นั่นเป็นเหตุผลที่เราเสนอตัวเลือกการปรับแต่งที่หลากหลาย เพื่อให้คุณปรับแต่งส่วนขยายให้ตรงกับความต้องการส่วนตัวของคุณได้ ปรับระดับความมืด แบบอักษร และพื้นหลังตามที่คุณต้องการ\n\n3. ช่วยรักษาดวงตาของคุณ: การเขียนที่ยาวนานอาจส่งผลเสียต่อดวงตาของคุณได้ เอกสาร G โหมดมืดช่วยลดอาการปวดตาโดยให้พื้นหลังสีเข้มที่นุ่มนวลซึ่งมองเห็นได้ง่าย ทำให้ประสบการณ์การเขียนของคุณสะดวกสบายยิ่งขึ้น\n\n4. ปรับปรุงโฟกัส: ธีมสีเข้มช่วยขจัดสิ่งรบกวนสมาธิและดึงความสนใจของคุณไปที่จุดนั้น – ในงานเขียนของคุณ ไม่มีแสงสะท้อนหรือหน้าจอสว่างที่ไม่จำเป็นอีกต่อไปเพื่อดึงโฟกัสของคุณออกไป\n\n5. ประสิทธิภาพการใช้พลังงาน: การใช้โหมดมืด เอกสาร Google ไม่เพียงแต่เป็นประโยชน์ต่อดวงตาของคุณ แต่ยังช่วยประหยัดพลังงาน ยืดอายุการใช้งานอุปกรณ์ของคุณ และประหยัดค่าไฟฟ้าอีกด้วย\n \n🖥️ ความเข้ากันได้และการเข้าถึง: Dark Mode G Docs เข้ากันได้กับเว็บเบราว์เซอร์หลักๆ ทั้งหมด และพร้อมใช้งานบนพีซีและเดสก์ท็อป ตอนนี้คุณสามารถเพลิดเพลินกับโหมดมืดของ Google เอกสารบนแพลตฟอร์มที่คุณต้องการได้แล้ว\n\n🌚 วิธีเปิดใช้งานโหมดสีดำของ Google การเปิดใช้งานโหมดหรี่ Google เอกสารเป็นเรื่องง่าย เพียงดาวน์โหลดส่วนขยายจาก Chrome เว็บสโตร์ และคลิกที่ไอคอน Google Docs โหมดมืดในเบราว์เซอร์ของคุณ หน้า Google เอกสารของคุณจะเปลี่ยนเป็นธีมสีเข้มที่ดูผ่อนคลายทันที ช่วยเพิ่มประสบการณ์การเขียนของคุณ\n\n📜 ทำไมคุณถึงต้องการส่วนขยายนี้\n\nGoogle Docs Dark Mode: โหมดมืด G Docs เป็นโซลูชั่นที่สมบูรณ์แบบในการนำโหมดมืดมาสู่ Google Doc ของคุณ รับรองว่าดวงตาของคุณยังคงสบายตาในระหว่างการเขียน\nเพิ่มประสิทธิภาพการทำงาน: ด้วยสภาพแวดล้อมที่ปราศจากสิ่งรบกวนจากธีมสีดำ คุณจะพบว่าตัวเองมีสมาธิ มีประสิทธิภาพ และมีประสิทธิผลมากขึ้นในงานเขียนของคุณ\n\nการป้องกันดวงตา: การสัมผัสกับหน้าจอที่สว่างเป็นเวลานานอาจเป็นอันตรายต่อดวงตาของคุณได้ Google Documents โหมดมืดช่วยปกป้องดวงตาของคุณโดยการลดความเข้มของแสงที่ปล่อยออกมาจากอุปกรณ์ของคุณ\n\nตัวเลือกการปรับแต่ง: ปรับแต่งโหมดสีดำ Google Doc ตามที่คุณต้องการ ปรับการตั้งค่าโหมดมืด แบบอักษร และพื้นหลังให้เหมาะกับความต้องการส่วนบุคคลของคุณ\n\nความเข้ากันได้ข้ามเบราว์เซอร์: ไม่ว่าคุณจะชอบ Chrome, Firefox หรือเบราว์เซอร์อื่น Dim Mode Google Docs ก็เข้ากันได้ทั่วทั้งกระดาน ดังนั้นคุณจึงสามารถเพลิดเพลินกับประสบการณ์การใช้งานโหมดได้ไม่ว่าคุณจะเลือกเบราว์เซอร์ใดก็ตาม\n \n📚 คำถามที่พบบ่อย:\n \n1. ฉันจะทำให้ Google Docs อยู่ในโหมดไร้แสงจันทร์ด้วยส่วนขยายนี้ได้อย่างไร หากต้องการเปิดใช้งาน Google Docs โหมดมืด เพียงดาวน์โหลดส่วนขยายจาก Chrome เว็บสโตร์ จากนั้นคลิกที่ไอคอนโหมดมืดของเอกสาร Google ในเบราว์เซอร์ของคุณ\n2. Dark Mode G Docs ใช้งานได้กับเดสก์ท็อปหรือไม่ อย่างแน่นอน! Google Docs โหมดมืดพร้อมใช้งานสำหรับทั้งพีซีและเดสก์ท็อป คุณจึงมั่นใจได้ว่าคุณจะเพลิดเพลินกับสภาพแวดล้อมการเขียนที่สะดวกสบายบนแพลตฟอร์มที่คุณต้องการ\n3. ฉันสามารถปรับแต่งรูปลักษณ์ของ Google Docs โหมดมืดได้หรือไม่ ใช่คุณสามารถ! Google Docs โหมดมืดมีตัวเลือกการปรับแต่งที่หลากหลาย ช่วยให้คุณปรับแต่งส่วนขยายให้เหมาะกับความต้องการส่วนตัวของคุณ\n4. Google Docs มีโหมดเนทีฟมืดหรือไม่ น่าเสียดายที่ Google Docs ไม่มีโหมดมืดแบบเนทีฟ" + } +} diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json new file mode 100644 index 0000000..010da70 --- /dev/null +++ b/_locales/tr/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Karanlık Mod Google Dokümanlar Uzantımız ile verimliliği artırın. Gelişmiş yazma için sorunsuz Google Docs karanlık modunu deneyimleyin." + }, + "appName": { + "message": "Karanlık Mod Google Dokümanlar" + }, + "storeDesc": { + "message": "🌟 Neden Karanlık Mod Google Dokümanlar'ı Rakiplerine Tercih Etmelisiniz?\n\nKaranlık mod işlevi sunan çok sayıda Chrome uzantısı varken, Karanlık Mod G Docs'u en iyi tercihiniz yapan şeyin ne olduğunu merak edebilirsiniz. Karanlık Mod Google Dokümanlar'ın neden öne çıktığını keşfedelim:\n\n1. Kullanıcı Dostu Arayüz: Koyu Mod Google Docs, kolay gezinme için sezgisel bir arayüz sağlar. Ayarları ve özelleştirme seçeneklerini bulmak çocuk oyuncağı.\n2. Hız ve Verimlilik: Eklentimiz performans için optimize edilmiştir, tarayıcınızı veya Google Dokümanlar'ı yavaşlatmaz ve hızdan ödün vermeden koyu bir tema sunar.\n3. Düzenli Güncellemeler: g docs black mode, Google Docs'un değişikliklerine ayak uydurmak için sürekli güncellenerek karanlık mod deneyiminizin güncel ve işlevsel kalmasını sağlar.\n4. Duyarlı Destek: Sorunlarla karşılaşırsanız veya sorularınız olursa, destek ekibimiz derhal yardımcı olmaya hazırdır ve sorunsuz bir deneyim sağlamayı taahhüt eder.\n5. Geniş Kullanıcı Tabanı: google doc dire modu, kalitesini ve güvenilirliğini kanıtlayan olumlu yorumlarla gelişen bir kullanıcı topluluğuna sahiptir. Google Dokümanlar deneyimlerini dönüştüren memnun kullanıcılar arasına siz de katılın.\n \n🎨 Tarzınıza Uygun Özelleştirme\n\nYazma ortamınızı kişiselleştirmek, Koyu Mod Google Dokümanlar'ın önemli bir avantajıdır. Dilediğiniz gibi özelleştirin:\n \nKaranlık Seviyesi: Karanlık seviyesini, hafif bir loşluktan sürükleyici bir karanlığa kadar tercihinize uyacak şekilde ayarlayın.\nYazı Tipi Özelleştirme: Yazma tarzınıza uygun yazı tipi stilini, boyutunu ve rengini seçin.\nArka Plan Seçenekleri: Arka planı estetiğinizi tamamlayan bir renk veya dokuya göre uyarlayın.\nVurgu Renkleri: Belirli belge öğelerini vurgulamak için vurgu renklerini seçin.\n \n🌐 Tarayıcılar Arasında Uyumluluk\n\nİster Chrome, ister Firefox veya başka bir tarayıcı kullanın, Black Mode G Docs tarayıcılar arası uyumluluk için tasarlanmıştır. Web tarayıcısı seçiminizden bağımsız olarak rahat ve üretken bir karanlık temanın keyfini çıkarın.\n\n🚀 Üretkenliğinizi Artırın\n\nKoyu Mod Google Docs sadece estetikle ilgili değildir; üretkenliği artırmak ve yazma deneyiminizi geliştirmekle ilgilidir:\n \nOdaklanma ve Konsantrasyon: Dire teması dikkat dağıtıcı unsurları en aza indirerek kesinti olmadan işinize konsantre olmanızı sağlar.\nAzaltılmış Göz Yorgunluğu: Gözleriniz azaltılmış parlaklık için size teşekkür edecek, uzun yazma seanslarını daha rahat ve daha az yorucu hale getirecektir.\nEnerji Verimliliği: Karanlık Mod G Docs'u kullanarak gözlerinizi korur ve enerji tasarrufuna yardımcı olarak karbon ayak izinizi azaltırsınız.\n \n🌚 Sonuç Olarak\n\nKoyu Mod Google Docs, rahat, özelleştirilebilir ve verimli bir yazma deneyimi arayan herkes için en iyi Chrome uzantısıdır. Tek bir tıklamayla etkinleştirin, tercihlerinize göre özelleştirin ve gözlerinizi yormayan, dikkat dağıtmayan bir ortamın keyfini çıkarın. Üstün bir Google Docs deneyimi için Karanlık Mod G Doc'u tercih eden memnun kullanıcı topluluğuna katılın.\n\n🌙 Google docs karanlık mod - Yazma Deneyiminizi Geliştirin!\n\nGoogle Docs üzerinde çalışırken ekranınızın kör edici parıltısını yorucu mu buluyorsunuz? Daha rahat ve görsel olarak hoş bir yazma ortamı mı istiyorsunuz? Başka yere bakmanıza gerek yok çünkü Karanlık Mod Google Dokümanlar yazma deneyiminizi dönüştürmek için burada.\n\nGoogle docs karanlık modu, belge oluştururken, düzenlerken veya okurken daha karanlık, daha göz dostu bir görünüm tercih edenler için en iyi Chrome uzantısıdır. Bu uzantıyla, Google Dokümanlar arayüzünüzü sorunsuz bir şekilde şık ve rahatlatıcı bir koyu temaya geçirebilir ve yazma oturumlarınızı her zamankinden daha keyifli hale getirebilirsiniz. Sert parlaklığa veda edin ve şık bir üretkenliğe merhaba deyin.\n\n🌟 Karanlık Mod Google Dokümanlar'ın Temel Özellikleri\n\n1. Zahmetsiz Etkinleştirme: Koyu Mod Google Docs'un kullanımı inanılmaz derecede kolaydır. Sadece tek bir tıklamayla Google Dokümanınız için koyu temayı etkinleştirebilir, daha rahat ve odaklanmış bir yazma ortamı oluşturabilirsiniz.\n\n2. Özelleştirme Seçenekleri: Tek bir bedenin herkese uymayacağını biliyoruz. Bu nedenle, uzantıyı kişisel tercihlerinize uyacak şekilde ayarlamanıza olanak tanıyan çeşitli özelleştirme seçenekleri sunuyoruz. Koyuluk seviyesini, yazı tipini ve arka planı istediğiniz gibi ayarlayın.\n\n3. Gözlerinizi Korur: Uzun yazma seansları gözlerinize zarar verebilir. Koyu Mod G Documents, görüşünüzü kolaylaştıran yumuşak, koyu bir arka plan sağlayarak göz yorgunluğunu azaltır ve yazma deneyiminizi daha rahat hale getirir.\n\n4. Geliştirilmiş Odaklanma: Koyu tema dikkat dağıtıcı unsurları ortadan kaldırmaya yardımcı olur ve dikkatinizi ait olduğu yerde, yazınızda tutar. Artık gereksiz parlamalar veya odağınızı başka yöne çekecek parlak ekranlar yok.\n\n5. Enerji Verimliliği: Karanlık Mod Google belgelerini kullanmak yalnızca gözlerinize fayda sağlamakla kalmaz, aynı zamanda enerji tasarrufu sağlayarak cihazınızın ömrünü uzatır ve elektrik maliyetlerinden tasarruf sağlar.\n \n🖥️ Uyumluluk ve Erişilebilirlik: Koyu Mod G Docs tüm büyük web tarayıcılarıyla uyumludur ve PC'lerde ve masaüstlerinde kolayca kullanılabilir. Artık tercih ettiğiniz platformda Google Dokümanlar karanlık modunun keyfini çıkarabilirsiniz.\n\n🌚 Google Karanlık Mod Nasıl Etkinleştirilir, Google Dokümanlar Karanlık Modu Etkinleştirmek çok kolay. Uzantıyı Chrome Web Mağazası'ndan indirmeniz ve tarayıcınızdaki Karanlık Mod Google Dokümanlar simgesine tıklamanız yeterlidir. Google Dokümanlar sayfanız anında rahatlatıcı koyu temaya geçerek yazma deneyiminizi geliştirecektir.\n\n📜 Bu Uzantıya Neden İhtiyacınız Var?\n\nGoogle Dokümanlar Karanlık Modu: Karanlık Mod G Docs, Google Doc'unuza karanlık modu getiren kesin çözümdür ve yazma oturumlarınız sırasında gözlerinizin rahat kalmasını sağlar.\nGeliştirilmiş Üretkenlik: Siyah temanın sağladığı dikkat dağıtmayan ortam sayesinde, yazma görevlerinizde kendinizi daha odaklanmış, verimli ve üretken bulacaksınız.\n\nGöz Koruması: Parlak bir ekrana uzun süre maruz kalmak gözleriniz için zararlı olabilir. Karanlık Mod Google Documents, cihazınızdan yayılan ışığın yoğunluğunu azaltarak gözlerinizi korur.\n\nÖzelleştirme Seçenekleri: Kara Mod Google Doc'u beğeninize göre uyarlayın. Karanlık mod ayarlarını, yazı tiplerini ve arka planları kişisel tercihlerinize uyacak şekilde ayarlayın.\n\nÇapraz Tarayıcı Uyumluluğu: İster Chrome, ister Firefox veya başka bir tarayıcıyı tercih edin, Dim Mode Google Docs tüm tarayıcılarla uyumludur, böylece tarayıcı seçiminiz ne olursa olsun mod deneyiminin keyfini çıkarabilirsiniz.\n \n📚 SSS:\n \n1. Bu uzantı ile Google Dokümanlar'ı nasıl aysız moda geçirebilirim? Karanlık Mod Google Dokümanlar'ı etkinleştirmek için uzantıyı Chrome Web Mağazası'ndan indirmeniz ve ardından tarayıcınızdaki Google dokümanlar karanlık mod simgesine tıklamanız yeterlidir.\n2. Karanlık Mod G Docs masaüstü için kullanılabilir mi? Kesinlikle! Karanlık Mod Google Dokümanlar hem PC'ler hem de masaüstü bilgisayarlar için kullanılabilir ve tercih ettiğiniz platformda rahat bir yazma ortamının keyfini çıkarmanızı sağlar.\n3. Koyu Mod Google Dokümanlar'ın görünümünü özelleştirebilir miyim? Evet, özelleştirebilirsiniz! Koyu Mod Google Dokümanlar, çeşitli özelleştirme seçenekleri sunarak uzantıyı kişisel tercihlerinize göre uyarlamanıza olanak tanır.\n4. Google Dokümanlar'ın yerel bir karanlık modu var mı? Maalesef, Google Dokümanlar yerel bir karanlık mod sunmuyor." + } +} diff --git a/_locales/uk/messages.json b/_locales/uk/messages.json new file mode 100644 index 0000000..b2bd75c --- /dev/null +++ b/_locales/uk/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Підвищуйте ефективність роботи з нашим Розширенням Google Документів у темному режимі. Спробуйте безперебійний темний режим Google Документів для покращення написання текстів." + }, + "appName": { + "message": "Темний режим Google Документів" + }, + "storeDesc": { + "message": "Чому варто обирати темний режим Google Документів, а не конкурентів?\n\nЗважаючи на численні розширення Chrome, що пропонують функціональність темного режиму, ви можете задатися питанням, чому саме Dark Mode G Docs є вашим найкращим вибором. Давайте з'ясуємо, чому Темний режим Документів Google виділяється серед інших:\n\n1. Зручний інтерфейс: Темний режим Документів Google має інтуїтивно зрозумілий інтерфейс для легкої навігації. Пошук налаштувань і параметрів кастомізації - це просто.\n2. Швидкість та ефективність: Наше розширення оптимізовано для продуктивності, що гарантує, що воно не сповільнить роботу вашого браузера або Google Документів, надаючи темну тему без шкоди для швидкості.\n3. Регулярні оновлення: g docs black mode постійно оновлюється, щоб йти в ногу зі змінами в Google Документах, гарантуючи, що ваш досвід роботи в темному режимі залишається актуальним і функціональним.\n4. Чуйна підтримка: Якщо у вас виникнуть проблеми або запитання, наша команда підтримки готова оперативно допомогти, прагнучи забезпечити безперебійну роботу.\n5. Широка база користувачів: google doc dire mode має процвітаючу спільноту користувачів з позитивними відгуками, що свідчать про його якість та надійність. Приєднуйтесь до лав задоволених користувачів, які змінили свій досвід роботи з Документами Google.\n \n🎨 Налаштування відповідно до вашого стилю\n\nПерсоналізація середовища для письма - ключова перевага Темного режиму Google Документів. Налаштуйте його так, як вам подобається:\n \nРівень темряви: Налаштуйте рівень темряви відповідно до ваших уподобань: від м'якого приглушеного до повної темряви.\nНалаштування шрифту: Виберіть стиль, розмір і колір шрифту, який відповідає вашому стилю письма.\nПараметри тла: Налаштуйте фон за кольором або текстурою, яка доповнює вашу естетику.\nАкцентні кольори: Виберіть кольори акцентів, щоб виділити певні елементи документа.\n \nСумісність у різних браузерах\n\nНезалежно від того, чи використовуєте ви Chrome, Firefox або інший браузер, Black Mode G Docs розроблений для крос-браузерної сумісності. Насолоджуйтесь зручною та продуктивною темною темою незалежно від того, який браузер ви використовуєте.\n\nПідвищення продуктивності\n\nТемний режим Google Документів - це не лише про естетику, а й про підвищення продуктивності та покращення вашого досвіду написання документів:\n \nФокус і концентрація: Темна тема мінімізує відволікаючі фактори, дозволяючи вам зосередитися на роботі, не відволікаючись.\nЗменшення навантаження на очі: Ваші очі будуть вдячні вам за знижену яскравість, що робить тривалі сеанси письма більш комфортними та менш втомлюючими.\nЕнергоефективність: Використовуючи темний режим G Docs, ви бережете свої очі та допомагаєте заощаджувати енергію, зменшуючи свій вуглецевий слід.\n \n🌚 На завершення\n\nDark Mode Google Docs - це найкраще розширення для Chrome для тих, хто шукає зручний, настроюваний та ефективний інструмент для роботи з документами. Активуйте його одним клацанням миші, налаштуйте відповідно до своїх уподобань і насолоджуйтеся середовищем, яке не відволікає і не напружує ваші очі. Приєднуйтесь до спільноти задоволених користувачів, які обрали Dark Mode G Doc для найкращої роботи з Документами Google.\n\nТемний режим Google Документів - покращте свій досвід написання документів!\n\nСліпучі відблиски екрану під час роботи в Google Документах стомлюють вас? Ви прагнете більш комфортного та візуально приємного середовища для письма? Не шукайте більше, адже Темний режим Документів Google створений для того, щоб змінити ваш досвід написання текстів.\n\nТемний режим Google Документів - це найкраще розширення для Chrome для тих, хто віддає перевагу темному, більш приємному для очей вигляду при створенні, редагуванні або читанні документів. За допомогою цього розширення ви можете легко переключити інтерфейс Google Документів на елегантну і заспокійливу темну тему, що зробить ваші сеанси письма приємнішими, ніж будь-коли раніше. Попрощайтеся з різкою яскравістю і привітайте продуктивність у стилі.\n\n🌟 Ключові особливості Темного режиму Документів Google\n\n1. Легка активація: Темний режим Google Документів неймовірно простий у використанні. Лише одним клацанням миші ви можете активувати темну тему для свого Google Документу, створюючи більш комфортне та зосереджене середовище для письма.\n\n2. Параметри кастомізації: Ми розуміємо, що один розмір не підходить для всіх. Саме тому ми пропонуємо різні варіанти налаштування, що дозволяють налаштувати розширення відповідно до ваших особистих уподобань. Налаштуйте рівень темряви, шрифт і фон на свій смак.\n\n3. Береже ваші очі: Тривалі сеанси письма можуть негативно позначитися на ваших очах. Темний режим G Документів зменшує навантаження на очі, забезпечуючи м'яке темне тло, яке не впливає на зір, що робить процес написання документів більш комфортним.\n\n4. Покращене фокусування: Темна тема допомагає усунути відволікаючі фактори та зосередити увагу на тому, що вам потрібно - на написанні тексту. Більше ніяких непотрібних відблисків або яскравих екранів, які відволікають вашу увагу.\n\n5. Енергоефективність: Використання темного режиму в документах Google не тільки корисно для ваших очей, але й заощаджує енергію, продовжуючи термін служби вашого пристрою і заощаджуючи на витратах на електроенергію.\n \n🖥️ Сумісність і доступність: Темний режим G Docs сумісний з усіма основними веб-браузерами і легко доступний на ПК і настільних комп'ютерах. Тепер ви можете насолоджуватися темним режимом Документів Google на вашій улюбленій платформі.\n\n🌚 Як активувати темний режим Google, Активувати темний режим Документів Google простіше простого. Просто завантажте розширення з веб-магазину Chrome і натисніть на іконку Темний режим Google Документів у вашому браузері. Ваша сторінка Документів Google миттєво переключиться на заспокійливу темну тему, що покращить ваш досвід написання документів.\n\nНавіщо потрібне це розширення?\n\nТемний режим Документів Google: Темний режим G Docs - це остаточне рішення для переходу в темний режим у вашому Google Документі, що гарантує, що вашим очам буде комфортно під час написання документів.\nПідвищена продуктивність: Завдяки чорному кольору, який не відволікає увагу, ви будете більш зосередженими, ефективними та продуктивними під час роботи над письмовими завданнями.\n\nЗахист очей: Тривале перебування на яскравому екрані може бути шкідливим для очей. Темний режим Документів Google захищає ваші очі, зменшуючи інтенсивність світла, що випромінюється пристроєм.\n\nПараметри налаштування: Налаштуйте Темний режим Документів Google на свій смак. Налаштуйте параметри темного режиму, шрифти та фони відповідно до ваших індивідуальних уподобань.\n\nСумісність з іншими браузерами: Незалежно від того, чи віддаєте ви перевагу Chrome, Firefox або іншому браузеру, Темний режим Google Документів сумісний з усіма браузерами, тож ви зможете насолоджуватися роботою в ньому незалежно від того, який браузер ви обрали.\n \nПоширені запитання:\n \n1. Як перевести Документи Google у безмісячний режим за допомогою цього розширення? Щоб активувати темний режим Google Документів, просто завантажте розширення з веб-магазину Chrome, а потім натисніть на іконку темного режиму Google Документів у вашому браузері.\n2. Чи доступний Темний режим Документів Google для настільних комп'ютерів? Безумовно! Темний режим Документів Google доступний як для ПК, так і для настільних комп'ютерів, що гарантує, що ви зможете насолоджуватися комфортним середовищем для написання документів на вашій улюбленій платформі.\n3. Чи можу я налаштувати зовнішній вигляд Темних Документів Google? Так, ви можете! Темний режим Документів Google пропонує різні варіанти налаштування, що дозволяє вам пристосувати розширення до ваших особистих уподобань.\n4. Чи є в Документах Google власний темний режим? На жаль, у Документах Google немає власного темного режиму." + } +} diff --git a/_locales/vi/messages.json b/_locales/vi/messages.json new file mode 100644 index 0000000..72eaec4 --- /dev/null +++ b/_locales/vi/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "Tăng cường hiệu quả với Tiện ích mở rộng Google Docs ở Chế độ tối của chúng tôi. Trải nghiệm chế độ tối liền mạch của Google Tài liệu để nâng cao khả năng viết." + }, + "appName": { + "message": "Chế độ tối của Google Tài liệu" + }, + "storeDesc": { + "message": "🌟 Tại sao chọn Chế độ tối của Google Docs thay vì đối thủ cạnh tranh?\n\nVới nhiều tiện ích mở rộng của Chrome cung cấp chức năng chế độ tối, bạn có thể tự hỏi điều gì khiến Dark Mode G Docs trở thành lựa chọn hàng đầu của bạn. Hãy cùng khám phá lý do tại sao Chế độ tối của Google Docs lại nổi bật:\n\n1. Giao diện thân thiện với người dùng: Chế độ tối Google Docs cung cấp giao diện trực quan để điều hướng dễ dàng. Việc tìm kiếm các cài đặt và tùy chọn tùy chỉnh thật dễ dàng.\n2. Tốc độ và hiệu quả: Tiện ích mở rộng của chúng tôi được tối ưu hóa về hiệu suất, đảm bảo không làm chậm trình duyệt hoặc Google Tài liệu của bạn, cung cấp chủ đề tối mà không ảnh hưởng đến tốc độ.\n3. Cập nhật thường xuyên: chế độ đen g docs cập nhật liên tục để theo kịp những thay đổi của Google Docs, đảm bảo trải nghiệm chế độ tối của bạn vẫn cập nhật và hoạt động tốt.\n4. Hỗ trợ đáp ứng: Nếu bạn gặp sự cố hoặc có thắc mắc, nhóm hỗ trợ của chúng tôi sẵn sàng hỗ trợ kịp thời, cam kết đảm bảo trải nghiệm suôn sẻ.\n5. Cơ sở người dùng rộng rãi: google doc dire mode có cộng đồng người dùng thịnh vượng với những đánh giá tích cực chứng thực chất lượng và độ tin cậy của nó. Gia nhập hàng ngũ những người dùng hài lòng đã thay đổi trải nghiệm Google Documents của họ.\n \n🎨 Tùy chỉnh để phù hợp với phong cách của bạn\n\nCá nhân hóa môi trường viết của bạn là lợi thế chính của Google Docs ở Chế độ tối. Tùy chỉnh theo nội dung trái tim của bạn:\n \nMức độ tối: Điều chỉnh mức độ tối để phù hợp với sở thích của bạn, từ mờ nhẹ đến bóng tối chìm đắm.\nTùy chỉnh phông chữ: Chọn kiểu phông chữ, kích thước và màu sắc phù hợp với phong cách viết của bạn.\nTùy chọn nền: Điều chỉnh nền theo màu hoặc họa tiết bổ sung cho thẩm mỹ của bạn.\nMàu nhấn: Chọn màu nhấn để làm nổi bật các thành phần tài liệu cụ thể.\n \n🌐 Khả năng tương thích giữa các trình duyệt\n\nCho dù bạn sử dụng Chrome, Firefox hay trình duyệt khác, Black Mode G Docs được thiết kế để tương thích với nhiều trình duyệt. Tận hưởng chủ đề tối thoải mái và hiệu quả bất kể lựa chọn trình duyệt web của bạn là gì.\n\n🚀 Tăng năng suất của bạn\n\nChế độ tối của Google Docs không chỉ mang tính thẩm mỹ; đó là về việc tăng năng suất và nâng cao trải nghiệm viết của bạn:\n \nTập trung và tập trung: Chủ đề Dire giảm thiểu phiền nhiễu, cho phép bạn tập trung vào công việc của mình mà không bị gián đoạn.\nGiảm mỏi mắt: Đôi mắt của bạn sẽ cảm ơn bạn vì độ sáng đã giảm, giúp cho những buổi viết dài trở nên thoải mái hơn và bớt mệt mỏi hơn.\nHiệu quả năng lượng: Bằng cách sử dụng G Docs ở Chế độ tối, bạn sẽ bảo vệ đôi mắt của mình và giúp tiết kiệm năng lượng, giảm lượng khí thải carbon.\n \n🌚 Tóm lại\n\nGoogle Docs ở Chế độ tối là tiện ích mở rộng tối ưu của Chrome dành cho bất kỳ ai đang tìm kiếm trải nghiệm viết thoải mái, có thể tùy chỉnh và hiệu quả. Kích hoạt nó chỉ bằng một cú nhấp chuột, tùy chỉnh nó theo sở thích của bạn và tận hưởng một môi trường không bị phân tâm, dễ chịu cho mắt bạn. Tham gia cộng đồng những người dùng hài lòng đã chọn Dark Mode G Doc làm lựa chọn hàng đầu của họ để có trải nghiệm Google Docs vượt trội.\n\n🌙 Chế độ tối của tài liệu Google - Nâng cao trải nghiệm viết của bạn!\n\nBạn có thấy màn hình chói lóa khi làm việc trên Google Docs gây mệt mỏi không? Bạn có đang khao khát một môi trường viết thoải mái và đẹp mắt hơn không? Không cần phải tìm đâu xa vì Google Docs ở Chế độ tối luôn sẵn sàng thay đổi trải nghiệm viết của bạn.\n\nChế độ tối của tài liệu Google là tiện ích mở rộng tối ưu của Chrome dành cho những người thích giao diện tối hơn, thân thiện với mắt hơn khi tạo, chỉnh sửa hoặc đọc tài liệu. Với tiện ích mở rộng này, bạn có thể chuyển đổi liền mạch giao diện Google Tài liệu của mình sang chủ đề tối đẹp mắt và nhẹ nhàng, giúp phiên viết của bạn trở nên thú vị hơn bao giờ hết. Nói lời tạm biệt với độ sáng khắc nghiệt và chào đón năng suất trong phong cách.\n\n🌟 Các tính năng chính của Chế độ tối của Google Docs\n\n1. Kích hoạt dễ dàng: Chế độ tối của Google Docs cực kỳ dễ sử dụng. Chỉ với một cú nhấp chuột, bạn có thể kích hoạt chủ đề tối cho Google Doc của mình, tạo môi trường viết thoải mái và tập trung hơn.\n\n2. Tùy chọn tùy chỉnh: Chúng tôi hiểu rằng một kích thước không phù hợp với tất cả. Đó là lý do tại sao chúng tôi cung cấp nhiều tùy chọn tùy chỉnh khác nhau, cho phép bạn điều chỉnh tiện ích mở rộng để phù hợp với sở thích cá nhân của mình. Điều chỉnh mức độ tối, phông chữ và nền theo ý thích của bạn.\n\n3. Tiết kiệm đôi mắt của bạn: Việc viết dài có thể gây tổn hại cho đôi mắt của bạn. Dark Mode G Documents giúp giảm mỏi mắt bằng cách cung cấp nền tối, nhẹ nhàng, dễ nhìn, giúp trải nghiệm viết của bạn thoải mái hơn.\n\n4. Cải thiện tiêu điểm: Chủ đề tối giúp loại bỏ phiền nhiễu và tập trung sự chú ý của bạn vào đúng nơi – vào bài viết của bạn. Không còn ánh sáng chói hoặc màn hình sáng không cần thiết làm mất tập trung của bạn.\n\n5. Tiết kiệm năng lượng: Sử dụng Dark Mode tài liệu Google không chỉ có lợi cho mắt mà còn tiết kiệm năng lượng, kéo dài tuổi thọ của thiết bị và tiết kiệm chi phí điện.\n \n🖥️ Khả năng tương thích và khả năng truy cập: G Docs ở chế độ tối tương thích với tất cả các trình duyệt web chính và có sẵn trên PC và máy tính để bàn. Giờ đây, bạn có thể tận hưởng chế độ tối của Google Docs trên nền tảng ưa thích của mình.\n\n🌚 Cách kích hoạt Chế độ đen của Google, Kích hoạt Chế độ mờ Google Docs thật dễ dàng. Chỉ cần tải xuống tiện ích mở rộng từ Cửa hàng Chrome trực tuyến và nhấp vào biểu tượng Google Docs ở Chế độ tối trong trình duyệt của bạn. Trang Google Documents của bạn sẽ ngay lập tức chuyển sang chủ đề tối nhẹ nhàng, nâng cao trải nghiệm viết của bạn.\n\n📜 Tại sao bạn cần tiện ích mở rộng này?\n\nChế độ tối của Google Docs: Chế độ tối G Docs là giải pháp dứt khoát để đưa chế độ tối cho Google Doc của bạn, đảm bảo rằng đôi mắt của bạn vẫn thoải mái trong khi viết.\nNâng cao năng suất: Với môi trường không bị phân tâm mà chủ đề màu đen mang lại, bạn sẽ thấy mình tập trung, hiệu quả và năng suất hơn trong các tác vụ viết của mình.\n\nBảo vệ mắt: Tiếp xúc kéo dài với màn hình sáng có thể gây hại cho mắt của bạn. Chế độ tối của Google Documents bảo vệ mắt bạn bằng cách giảm cường độ ánh sáng phát ra từ thiết bị của bạn.\n\nTùy chọn tùy chỉnh: Điều chỉnh Chế độ đen của Google Doc theo ý thích của bạn. Điều chỉnh cài đặt, phông chữ và hình nền của chế độ tối để phù hợp với sở thích cá nhân của bạn.\n\nKhả năng tương thích giữa nhiều trình duyệt: Cho dù bạn thích Chrome, Firefox hay trình duyệt khác, Google Docs ở Chế độ mờ đều tương thích trên mọi thiết bị, vì vậy bạn có thể tận hưởng trải nghiệm chế độ bất kể bạn chọn trình duyệt nào.\n \n📚 Câu hỏi thường gặp:\n \n1. Làm cách nào để đặt Google Docs ở chế độ không có trăng với tiện ích mở rộng này? Để kích hoạt Google Docs ở Chế độ tối, chỉ cần tải xuống tiện ích mở rộng từ Cửa hàng Chrome trực tuyến, sau đó nhấp vào biểu tượng chế độ tối của tài liệu Google trong trình duyệt của bạn.\n2. Dark Mode G Docs có sẵn cho máy tính để bàn không? Tuyệt đối! Google Docs ở Chế độ tối có sẵn cho cả PC và máy tính để bàn, đảm bảo rằng bạn có thể tận hưởng môi trường viết thoải mái trên nền tảng ưa thích của mình.\n3. Tôi có thể tùy chỉnh giao diện của Google Docs ở Chế độ tối không? Vâng, bạn có thể! Chế độ tối của Google Docs cung cấp nhiều tùy chọn tùy chỉnh khác nhau, cho phép bạn điều chỉnh tiện ích mở rộng theo sở thích cá nhân của mình.\n4. Google Docs có chế độ tối gốc không? Thật không may, Google Docs không cung cấp chế độ tối gốc." + } +} diff --git a/_locales/zh_CN/messages.json b/_locales/zh_CN/messages.json new file mode 100644 index 0000000..5f2b01a --- /dev/null +++ b/_locales/zh_CN/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "使用我们的黑暗模式 Google 文档扩展提高效率。体验无缝 Google 文档黑暗模式,提高写作效率。" + }, + "appName": { + "message": "黑暗模式谷歌文档" + }, + "storeDesc": { + "message": "🌟 为什么选择黑暗模式 Google 文档而不是竞争对手?\n\n提供暗黑模式功能的 Chrome 浏览器扩展多不胜数,你可能会想知道是什么让暗黑模式 Google 文档成为你的首选。让我们来探讨一下为什么暗黑模式 Google 文档会脱颖而出:\n\n1.用户友好的界面:黑暗模式谷歌文档提供了一个直观的界面,便于导航。查找设置和自定义选项轻而易举。\n2.速度与效率:我们的扩展针对性能进行了优化,确保不会降低浏览器或 Google 文档的运行速度,在提供暗色主题的同时不影响速度。\n3.定期更新:G docs 黑色模式会不断更新,以跟上 Google 文档的变化步伐,确保您的黑暗模式体验保持最新和实用。\n4.响应式支持:如果您遇到问题或有疑问,我们的支持团队随时准备为您提供帮助,确保您获得流畅的使用体验。\n5.广泛的用户群:google doc 黑暗模式拥有一个蓬勃发展的用户社区,其质量和可靠性得到了积极的评价。加入满意用户的行列,改变他们的 Google 文档体验。\n \n🎨 根据您的风格进行定制\n\n个性化写作环境是黑暗模式 Google 文档的一大优势。尽情定制:\n \n黑暗程度:根据自己的喜好调整黑暗程度,从柔和的昏暗到令人沉浸的黑暗。\n字体定制:选择适合你书写风格的字体样式、大小和颜色。\n背景选项:将背景调整为符合你审美的颜色或纹理。\n强调色选择强调色来突出特定的文档元素。\n \n兼容各种浏览器\n\n无论您使用的是 Chrome、Firefox 还是其他浏览器,黑色模式 G 文档都具有跨浏览器兼容性。无论您选择何种网络浏览器,都能享受舒适、高效的深色主题。\n\n提高你的工作效率\n\n黑暗模式 Google 文档不仅美观,还能提高工作效率,增强您的写作体验:\n \n专注和集中:Dire 主题能最大限度地减少干扰,让您不受干扰地专心工作。\n减少眼睛疲劳:亮度降低后,您的眼睛会感激不尽,长时间书写会更舒适、更不疲劳。\n节能:使用黑暗模式 G 文档,不仅能保护眼睛,还能节约能源,减少碳足迹。\n \n🌚总结\n\n对于追求舒适、可定制和高效的书写体验的人来说,\"黑暗模式 \"Google 文档是一款终极的 Chrome 浏览器扩展。只需单击一下即可激活它,根据自己的喜好进行自定义,享受无干扰的环境,轻松保护眼睛。加入满意的用户社区,让黑暗模式 G 文档成为他们的首选,享受卓越的 Google 文档体验。\n\n🌙 Google docs 黑暗模式 - 增强您的写作体验!\n\n您是否觉得在 Google 文档上工作时屏幕上刺眼的强光令人厌烦?您是否渴望有一个更舒适、视觉更愉悦的写作环境?不用再找了,因为黑暗模式 Google 文档将改变您的写作体验。\n\nGoogle 文档黑暗模式是 Chrome 浏览器的终极扩展,适合那些在创建、编辑或阅读文档时喜欢更暗、更醒目外观的用户。有了这个扩展,你可以将 Google 文档界面无缝切换为时尚、舒缓的暗色主题,让你的写作过程变得前所未有的愉悦。告别刺眼的亮度,向时尚的工作效率问好。\n\n黑暗模式 Google 文档的主要功能\n\n1.轻松激活:黑暗模式 Google 文档非常易于使用。只需单击一下,您就可以激活 Google 文档的暗色主题,创造一个更舒适、更专注的写作环境。\n\n2.自定义选项:我们知道 \"一刀切 \"并不适合所有人。因此,我们提供了多种自定义选项,让你可以根据个人喜好调整扩展。您可以根据自己的喜好调整暗度、字体和背景。\n\n3.保护你的眼睛:长时间写作会对眼睛造成伤害。黑暗模式 G 文档通过提供温和的深色背景来减轻眼睛疲劳,使您的书写体验更加舒适。\n\n4.提高专注度:暗色主题有助于消除干扰,让您的注意力集中在写作上。不再有不必要的眩光或明亮的屏幕分散你的注意力。\n\n5.节能:使用暗色模式的谷歌文档不仅有利于保护眼睛,还能节约能源,延长设备的使用寿命并节省电费。\n \n🖥️ 兼容性和可访问性:暗色模式 G 文档兼容所有主流网络浏览器,并可随时在个人电脑和台式机上使用。现在,您可以在自己喜欢的平台上享受 Google 文档的黑暗模式。\n\n如何激活黑色模式 Google,激活暗淡模式 Google Docs 轻而易举。只需从 Chrome 网上商店下载扩展,然后点击浏览器中的暗黑模式谷歌文档图标。你的谷歌文档页面将立即切换到舒缓的暗色主题,增强你的书写体验。\n\n为什么需要此扩展?\n\n谷歌文档黑暗模式:黑暗模式 G 文档是将黑暗模式引入 Google 文档的权威解决方案,可确保您在写作过程中眼睛保持舒适。\n提高工作效率:有了黑色主题提供的无干扰环境,你会发现自己在写作任务中更加专注、高效、富有成效。\n\n保护眼睛:长时间暴露在明亮的屏幕下会对眼睛造成伤害。黑暗模式 Google 文档通过降低设备发出的光强度来保护你的眼睛。\n\n自定义选项:根据自己的喜好定制黑色模式 Google 文档。根据个人喜好调整黑暗模式设置、字体和背景。\n\n跨浏览器兼容性:无论你喜欢 Chrome、Firefox 还是其他浏览器,暗黑模式 Google 文档都能全面兼容,因此无论你选择哪种浏览器,都能享受模式体验。\n \n常见问题:\n \n1.如何使用此扩展将 Google 文档设置为无月模式?要激活黑暗模式谷歌文档,只需从 Chrome 网上商店下载该扩展,然后点击浏览器中的谷歌文档黑暗模式图标即可。\n2.黑暗模式谷歌文档是否适用于桌面?当然可以!黑暗模式 Google 文档适用于个人电脑和台式机,确保您可以在自己喜欢的平台上享受舒适的写作环境。\n3.我可以自定义黑暗模式 Google 文档的外观吗?可以!黑暗模式 Google 文档提供多种自定义选项,让您可以根据个人喜好定制扩展。\n4.Google 文档有原生的黑暗模式吗?很遗憾,Google Docs 没有提供原生的黑暗模式。" + } +} diff --git a/_locales/zh_TW/messages.json b/_locales/zh_TW/messages.json new file mode 100644 index 0000000..64d8905 --- /dev/null +++ b/_locales/zh_TW/messages.json @@ -0,0 +1,11 @@ +{ + "appDesc": { + "message": "使用我們的深色模式 Google 文件擴充來提高效率。體驗無縫的 Google 文件深色模式以增強寫作能力。" + }, + "appName": { + "message": "深色模式 Google 文件" + }, + "storeDesc": { + "message": "🌟 為什麼要選擇深色模式 Google Docs 而不是競爭對手?\n\n有很多 Chrome 擴充套件提供深色模式功能,您可能會想知道 Dark Mode G Docs 為什麼是您的首選。讓我們探討一下 Dark Mode Google Docs 的優勢:\n\n1. 用戶友好界面:Dark Mode Google Docs 提供直觀的界面,方便瀏覽。輕鬆查找設置和自定義選項。\n2. 速度和效能:我們的擴充套件經過優化,確保不會減慢您的瀏覽器或 Google Docs,提供一個不影響速度的深色主題。\n3. 定期更新:g docs black mode 不斷更新以跟上 Google Docs 的變化,確保您的深色模式體驗保持最新和功能齊全。\n4. 響應支持:如果您遇到問題或有疑問,我們的支持團隊隨時準備提供及時協助,致力確保流暢體驗。\n5. 廣泛用戶群:google doc dire mode 擁有一個蓬勃發展的用戶社區,積極的評價證明其品質和可靠性。加入那些改變了他們的 Google Docs 體驗的滿意用戶的行列。\n\n🎨 定制以適應您的風格\n\n將您的書寫環境個性化是 Dark Mode Google Docs 的一個關鍵優勢。根據您的喜好進行自定義:\n\n- 亮度水平:調整亮度水平以適應您的喜好,從柔和的暗淡到沉浸式的黑暗。\n- 字體定制:選擇適合您書寫風格的字體風格、大小和顏色。\n- 背景選項:定制背景顏色或質感,以匹配您的審美品味。\n- 強調顏色:選擇強調顏色以突出特定文檔元素。\n\n🌐 跨瀏覽器兼容性\n\n無論您使用 Chrome、Firefox 還是其他瀏覽器,Black Mode G Docs 都設計為跨瀏覽器兼容性。無論您的網頁瀏覽器選擇如何,都可以享受舒適且高效的深色主題。\n\n🚀 提高您的生產力\n\nDark Mode Google Docs 不僅僅是外觀,它是為提高生產力和增強您的寫作體驗而設計的:\n\n- 專注與集中:Dire 主題最小化干擾,使您能夠專注於工作而不受干擾。\n- 減輕眼睛疲勞:減少亮度,使長時間的寫作會更加舒適,減少疲勞。\n- 能源效率:通過使用 Dark Mode G Docs,您可以保護您的眼睛,幫助節約能源,降低碳足跡。\n\n🌚 總結\n\nDark Mode Google Docs 是任何追求舒適、可定制和高效寫作體驗的人的終極 Chrome 擴充套件。點擊一下啟動它,按照您的喜好進行定制,享受一個對眼睛友好的無干擾環境。加入那些將 Dark Mode G Doc 作為優越 Google Docs 體驗的首選的滿意用戶社區。\n\n🌙 Google docs dark mode - 增強您的寫作體驗!\n\n在 Google Docs 工作時,您是否覺得屏幕刺眼的耀眼光線令人疲憊?是否渴望更舒適且視覺上愉悅的書寫環境?別再找了,因為 Dark Mode Google Docs 將改變您的寫作體驗。\n\nGoogle docs dark mode 是那些在創建、編輯或閱讀文件時更喜歡深色、對眼睛更友好的人的終極 Chrome 擴充套件。使用此擴充套件,您可以將 Google Docs 界面無縫切換為時尚而令人愉悅的深色主題,使您的寫作會議比以往更加愉快。告別刺眼的亮度,迎接時尚的生產力。\n\n🌟 Dark Mode Google Docs 的主要特點\n\n1. 輕鬆啟動:Dark Mode Google Docs 使用非常簡單。只需點擊一下,即可為您的 Google Doc 啟動深色主題,營造一個更舒適和專注的寫作環境。\n2. 定制選項:我們明白\n\n一切都不是一個尺寸適合所有人。這就是為什麼我們提供各種定制選項,讓您可以根據個人喜好調整擴充套件。調整亮度、字體和背景,使其符合您的喜好。\n3. 保護您的眼睛:長時間的寫作可能對您的眼睛造成損害。Dark Mode G Documents 通過提供柔和的深色背景,減輕對您視力的壓力,使您的寫作體驗更加舒適。\n4. 提高專注力:深色主題有助於消除干擾,保持您的注意力集中在您的寫作上。不再有不必要的刺眼或明亮的屏幕分散您的注意力。\n5. 能源效率:使用 Dark Mode Google documents 不僅有益於您的眼睛,還有助於節約能源,延長設備的壽命,節省電費。\n\n🖥️ 兼容性和可訪問性:Dark Mode G Docs 兼容所有主要的網頁瀏覽器,並且可以在個人電腦和桌面上輕鬆使用。現在,您可以在首選的平台上享受 Google Docs 深色模式。\n\n🌚 如何啟動 Black Mode Google,啟動 Dim Mode Google Docs 輕而易舉。只需從 Chrome 網上應用商店下載擴充套件,然後單擊瀏覽器中的 Dark Mode Google Docs 圖標。您的 Google Documents 頁面將立即切換到令人愉悅的深色主題,增強您的寫作體驗。\n\n📜 您為什麼需要這個擴充套件?\n\nGoogle Docs Dark Mode:Dark Mode G Docs 是為您的 Google Doc 帶來深色模式的明確解決方案,確保在寫作過程中您的眼睛保持舒適。\n提高生產力:黑色主題提供無干擾的環境,使您在寫作任務中更加專注、高效和有成效。\n眼睛保護:長時間暴露在明亮的屏幕前對您的眼睛可能有害。Dark Mode Google Documents 通過減少設備發出的光的強度來保護您的眼睛。\n定制選項:定制 Black Mode Google Doc,以滿足您的喜好。根據您的個人喜好調整深色模式設置、字體和背景。\n跨瀏覽器兼容性:無論您喜歡 Chrome、Firefox 還是其他瀏覽器,Dim Mode Google Docs 都在各個方面兼容,因此無論您選擇哪種瀏覽器,都可以享受模式體驗。\n\n📚 常見問題解答:\n\n1. 如何使用此擴充套件將 Google Docs 設置為無光模式?要啟用 Dark Mode Google Docs,只需從 Chrome 網上應用商店下載擴充套件,然後點擊瀏覽器中的 Google documents dark mode 圖標。\n2. Dark Mode G Docs 是否適用於桌面?當然!Dark Mode Google Docs 適用於個人電腦和桌面,確保您可以在首選的平台上享受舒適的寫作環境。\n3. 我可以自定義 Dark Mode Google Docs 的外觀嗎?是的,您可以!Dark Mode Google Docs 提供各種定制選項,允許您根據個人喜好調整擴充套件。\n4. Google Docs 是否有原生深色模式?不幸的是,Google Docs 沒有提供原生的深色模式。" + } +} diff --git a/background.js b/background.js new file mode 100644 index 0000000..8484520 --- /dev/null +++ b/background.js @@ -0,0 +1,5331 @@ +;(function () { + 'use strict' + + const userAgent = + typeof navigator === 'undefined' + ? 'some useragent' + : navigator.userAgent.toLowerCase() + const platform = + typeof navigator === 'undefined' + ? 'some platform' + : navigator.platform.toLowerCase() + const isChromium = + userAgent.includes('chrome') || userAgent.includes('chromium') + 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') + userAgent.includes('safari') && !isChromium + const isWindows = platform.startsWith('win') + const isMacOS = platform.startsWith('mac') + userAgent.includes('mobile') + const chromiumVersion = (() => { + const m = userAgent.match(/chrom[e|ium]\/([^ ]+)/) + 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 isMV3 = + globalThis.chrome && + globalThis.chrome.runtime && + globalThis.chrome.runtime.getManifest && + globalThis.chrome.runtime.getManifest().manifest_version === 3 + 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 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() + this.alarmIsActive = false + chrome.alarms.onAlarm.addListener(async (alarm) => { + if (alarm.name === LimitedCacheStorage.ALARM_NAME) { + this.alarmIsActive = false + this.removeExpiredRecords() + } + }) + } + 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) { + this.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) { + this.ensureAlarmIsScheduled() + } + } + } + LimitedCacheStorage.QUOTA_BYTES = + (navigator.deviceMemory || 4) * 16 * 1024 * 1024 + LimitedCacheStorage.TTL = getDuration({ minutes: 10 }) + LimitedCacheStorage.ALARM_NAME = 'network' + 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)) + ) { + 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 (isThunderbird) { + return true + } + 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 ThemeEngines = { + cssFilter: 'cssFilter', + svgFilter: 'svgFilter', + staticTheme: 'staticTheme', + dynamicTheme: 'dynamicTheme', + } + + 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: ThemeEngines.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: ['docs.google.com/document'], + siteListEnabled: [], + applyToListedOnly: true, + changeBrowserTheme: false, + syncSettings: true, + syncSitesFixes: false, + automation: '', + automationBehaviour: '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: { + local: '../config/dark-sites.config', + }, + dynamicThemeFixes: { + local: '../config/dynamic-theme-fixes.config', + }, + inversionFixes: { + local: '../config/inversion-fixes.config', + }, + staticThemes: { + local: '../config/static-themes.config', + }, + colorSchemes: { + local: '../config/color-schemes.drconf', + }, + } + const REMOTE_TIMEOUT_MS = getDuration({ seconds: 10 }) + class ConfigManager { + constructor() { + this.raw = { + darkSites: null, + dynamicThemeFixes: null, + inversionFixes: null, + staticThemes: null, + colorSchemes: null, + } + this.overrides = { + darkSites: null, + dynamicThemeFixes: null, + inversionFixes: null, + staticThemes: null, + } + } + 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 + } + 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() + } + 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() + } + 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() + } + 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() + } + 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() + } + 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)) + } + 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 + } + handleDarkSites() { + const $sites = this.overrides.darkSites || this.raw.darkSites + this.DARK_SITES = parseArray($sites) + } + handleDynamicThemeFixes() { + const $fixes = + this.overrides.dynamicThemeFixes || this.raw.dynamicThemeFixes + this.DYNAMIC_THEME_FIXES_INDEX = indexSitesFixesConfig($fixes) + this.DYNAMIC_THEME_FIXES_RAW = $fixes + } + handleInversionFixes() { + const $fixes = this.overrides.inversionFixes || this.raw.inversionFixes + this.INVERSION_FIXES_INDEX = indexSitesFixesConfig($fixes) + this.INVERSION_FIXES_RAW = $fixes + } + handleStaticThemes() { + const $themes = this.overrides.staticThemes || this.raw.staticThemes + this.STATIC_THEMES_INDEX = indexSitesFixesConfig($themes) + this.STATIC_THEMES_RAW = $themes + } + } + + 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( + isChromium && compareChromeVersions(chromiumVersion, '81.0.4035.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() && 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) { + if (isChromium) { + common.css += + '\nembed[type="application/pdf"][src="about:blank"] { filter: invert(100%) contrast(90%); }' + } else { + common.css += + '\nembed[type="application/pdf"] { 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) + }) + }) + } + set(key, value) { + this.cache[key] = value + chrome.storage.local.set({ [key]: value }, () => { + if (chrome.runtime.lastError) { + console.error( + 'Failed to write DevTools data', + chrome.runtime.lastError + ) + } + }) + } + remove(key) { + this.cache[key] = undefined + chrome.storage.local.remove(key, () => { + if (chrome.runtime.lastError) { + console.error( + 'Failed to delete DevTools data', + chrome.runtime.lastError + ) + } + }) + } + 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 { + constructor(config, 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.config = config + this.loadConfigOverrides() + this.onChange = onChange + } + setDataIsMigratedForTesting(value) { + this.store.setDataIsMigratedForTesting(value) + } + async loadConfigOverrides() { + this.config.overrides.dynamicThemeFixes = + (await this.getSavedDynamicThemeFixes()) || null + this.config.overrides.inversionFixes = + (await this.getSavedInversionFixes()) || null + this.config.overrides.staticThemes = + (await this.getSavedStaticThemes()) || null + } + async getSavedDynamicThemeFixes() { + return this.store.get(DevTools.KEY_DYNAMIC) + } + saveDynamicThemeFixes(text) { + this.store.set(DevTools.KEY_DYNAMIC, text) + } + async hasCustomDynamicThemeFixes() { + return this.store.has(DevTools.KEY_DYNAMIC) + } + async getDynamicThemeFixesText() { + const $fixes = await this.getSavedDynamicThemeFixes() + const fixes = $fixes + ? parseDynamicThemeFixes($fixes) + : parseDynamicThemeFixes(this.config.DYNAMIC_THEME_FIXES_RAW) + return formatDynamicThemeFixes(fixes) + } + resetDynamicThemeFixes() { + this.store.remove(DevTools.KEY_DYNAMIC) + this.config.overrides.dynamicThemeFixes = null + this.config.handleDynamicThemeFixes() + this.onChange() + } + applyDynamicThemeFixes(text) { + try { + const formatted = formatDynamicThemeFixes(parseDynamicThemeFixes(text)) + this.config.overrides.dynamicThemeFixes = formatted + this.config.handleDynamicThemeFixes() + this.saveDynamicThemeFixes(formatted) + this.onChange() + return null + } catch (err) { + return err + } + } + async getSavedInversionFixes() { + return this.store.get(DevTools.KEY_FILTER) + } + saveInversionFixes(text) { + this.store.set(DevTools.KEY_FILTER, text) + } + async hasCustomFilterFixes() { + return this.store.has(DevTools.KEY_FILTER) + } + async getInversionFixesText() { + const $fixes = await this.getSavedInversionFixes() + const fixes = $fixes + ? parseInversionFixes($fixes) + : parseInversionFixes(this.config.INVERSION_FIXES_RAW) + return formatInversionFixes(fixes) + } + resetInversionFixes() { + this.store.remove(DevTools.KEY_FILTER) + this.config.overrides.inversionFixes = null + this.config.handleInversionFixes() + this.onChange() + } + applyInversionFixes(text) { + try { + const formatted = formatInversionFixes(parseInversionFixes(text)) + this.config.overrides.inversionFixes = formatted + this.config.handleInversionFixes() + this.saveInversionFixes(formatted) + this.onChange() + return null + } catch (err) { + return err + } + } + async getSavedStaticThemes() { + return this.store.get(DevTools.KEY_STATIC) + } + saveStaticThemes(text) { + this.store.set(DevTools.KEY_STATIC, text) + } + async hasCustomStaticFixes() { + return this.store.has(DevTools.KEY_STATIC) + } + async getStaticThemesText() { + const $themes = await this.getSavedStaticThemes() + const themes = $themes + ? parseStaticThemes($themes) + : parseStaticThemes(this.config.STATIC_THEMES_RAW) + return formatStaticThemes(themes) + } + resetStaticThemes() { + this.store.remove(DevTools.KEY_STATIC) + this.config.overrides.staticThemes = null + this.config.handleStaticThemes() + this.onChange() + } + applyStaticThemes(text) { + try { + const formatted = formatStaticThemes(parseStaticThemes(text)) + this.config.overrides.staticThemes = formatted + this.config.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' + + const ICON_PATHS = { + active_19: '../icons/dm_16.png', + active_38: '../icons/dm_42.png', + inactive_19: '../icons/dm_16.png', + inactive_38: '../icons/dm_42.png', + } + class IconManager { + setActive() { + if (!chrome.action.setIcon || isThunderbird) { + return + } + chrome.action.setIcon({ + path: { + 19: ICON_PATHS.active_19, + 38: ICON_PATHS.active_38, + }, + }) + } + setInactive() { + if (!chrome.action.setIcon || isThunderbird) { + return + } + chrome.action.setIcon({ + path: { + 19: ICON_PATHS.inactive_19, + 38: ICON_PATHS.inactive_38, + }, + }) + } + showBadge(text) { + chrome.action.setBadgeBackgroundColor({ color: '#e96c4c' }) + chrome.action.setBadgeText({ text }) + } + hideBadge() { + chrome.action.setBadgeText({ text: '' }) + } + } + + const MessageType = { + UI_GET_DATA: 'ui-get-data', + UI_SUBSCRIBE_TO_CHANGES: 'ui-subscribe-to-changes', + UI_UNSUBSCRIBE_FROM_CHANGES: 'ui-unsubscribe-from-changes', + UI_CHANGE_SETTINGS: 'ui-change-settings', + UI_SET_THEME: 'ui-set-theme', + UI_SET_SHORTCUT: 'ui-set-shortcut', + UI_TOGGLE_ACTIVE_TAB: 'ui-toggle-active-tab', + UI_MARK_NEWS_AS_READ: 'ui-mark-news-as-read', + UI_MARK_NEWS_AS_DISPLAYED: 'ui-mark-news-as-displayed', + UI_LOAD_CONFIG: 'ui-load-config', + UI_APPLY_DEV_DYNAMIC_THEME_FIXES: 'ui-apply-dev-dynamic-theme-fixes', + UI_RESET_DEV_DYNAMIC_THEME_FIXES: 'ui-reset-dev-dynamic-theme-fixes', + UI_APPLY_DEV_INVERSION_FIXES: 'ui-apply-dev-inversion-fixes', + UI_RESET_DEV_INVERSION_FIXES: 'ui-reset-dev-inversion-fixes', + UI_APPLY_DEV_STATIC_THEMES: 'ui-apply-dev-static-themes', + UI_RESET_DEV_STATIC_THEMES: 'ui-reset-dev-static-themes', + UI_SAVE_FILE: 'ui-save-file', + UI_REQUEST_EXPORT_CSS: 'ui-request-export-css', + BG_CHANGES: 'bg-changes', + BG_ADD_CSS_FILTER: 'bg-add-css-filter', + BG_ADD_STATIC_THEME: 'bg-add-static-theme', + BG_ADD_SVG_FILTER: 'bg-add-svg-filter', + BG_ADD_DYNAMIC_THEME: 'bg-add-dynamic-theme', + BG_EXPORT_CSS: 'bg-export-css', + BG_UNSUPPORTED_SENDER: 'bg-unsupported-sender', + BG_CLEAN_UP: 'bg-clean-up', + BG_RELOAD: 'bg-reload', + BG_FETCH_RESPONSE: 'bg-fetch-response', + BG_UI_UPDATE: 'bg-ui-update', + BG_CSS_UPDATE: 'bg-css-update', + CS_COLOR_SCHEME_CHANGE: 'cs-color-scheme-change', + CS_FRAME_CONNECT: 'cs-frame-connect', + CS_FRAME_FORGET: 'cs-frame-forget', + CS_FRAME_FREEZE: 'cs-frame-freeze', + CS_FRAME_RESUME: 'cs-frame-resume', + CS_EXPORT_CSS_RESPONSE: 'cs-export-css-response', + CS_FETCH: 'cs-fetch', + CS_DARK_THEME_DETECTED: 'cs-dark-theme-detected', + CS_DARK_THEME_NOT_DETECTED: 'cs-dark-theme-not-detected', + } + + class Messenger { + constructor(adapter) { + this.adapter = adapter + this.changeListenerCount = 0 + const allowedSenderURL = [ + chrome.runtime.getURL('/ui/popup/index.html'), + chrome.runtime.getURL('/ui/devtools/index.html'), + chrome.runtime.getURL('/ui/stylesheet-editor/index.html'), + ] + chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + if (allowedSenderURL.includes(sender.url)) { + this.onUIMessage(message, sendResponse) + this.adapter.onPopupOpen() + return [MessageType.UI_GET_DATA].includes(message.type) + } + }) + if (isFirefox) { + chrome.runtime.onConnect.addListener((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 })) + }) + } + } + 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 + } + } + } + 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 helpLocales = [ + 'be', + 'cs', + 'de', + 'en', + 'es', + 'fr', + 'it', + 'nl', + 'pt', + 'ru', + '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 0 + } + // 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('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 + } + } + + function isNonPersistent() { + if (!isChromium) { + return false + } + const background = chrome.runtime.getManifest().background + if ('persistent' in background) { + return background.persistent === false + } + if ('service_worker' in background) { + return true + } + } + + var StateManagerState + ;(function (StateManagerState) { + StateManagerState[(StateManagerState['INITIAL'] = 0)] = 'INITIAL' + StateManagerState[(StateManagerState['DISABLED'] = 1)] = 'DISABLED' + StateManagerState[(StateManagerState['LOADING'] = 2)] = 'LOADING' + StateManagerState[(StateManagerState['READY'] = 3)] = 'READY' + StateManagerState[(StateManagerState['SAVING'] = 4)] = 'SAVING' + StateManagerState[(StateManagerState['SAVING_OVERRIDE'] = 5)] = + 'SAVING_OVERRIDE' + })(StateManagerState || (StateManagerState = {})) + class StateManager { + constructor(localStorageKey, parent, defaults) { + this.meta = StateManagerState.INITIAL + this.loadStateBarrier = null + if (!isNonPersistent()) { + this.meta = StateManagerState.DISABLED + return + } + this.localStorageKey = localStorageKey + this.parent = parent + this.defaults = defaults + } + collectState() { + const state = {} + for (const key of Object.keys(this.defaults)) { + state[key] = this.parent[key] || this.defaults[key] + } + return state + } + async saveState() { + switch (this.meta) { + case StateManagerState.DISABLED: + return + case StateManagerState.LOADING: + case StateManagerState.INITIAL: + if (this.loadStateBarrier) { + await this.loadStateBarrier.entry() + } + this.meta = StateManagerState.SAVING + break + case StateManagerState.READY: + this.meta = StateManagerState.SAVING + break + case StateManagerState.SAVING: + this.meta = StateManagerState.SAVING_OVERRIDE + return + case StateManagerState.SAVING_OVERRIDE: + return + } + chrome.storage.local.set( + { [this.localStorageKey]: this.collectState() }, + () => { + switch (this.meta) { + case StateManagerState.INITIAL: + case StateManagerState.DISABLED: + case StateManagerState.LOADING: + case StateManagerState.READY: + case StateManagerState.SAVING: + this.meta = StateManagerState.READY + break + case StateManagerState.SAVING_OVERRIDE: + this.meta = StateManagerState.READY + this.saveState() + } + } + ) + } + async loadState() { + switch (this.meta) { + case StateManagerState.INITIAL: + this.meta = StateManagerState.LOADING + this.loadStateBarrier = new PromiseBarrier() + return new Promise((resolve) => { + chrome.storage.local.get(this.localStorageKey, (data) => { + this.meta = StateManagerState.READY + if (data[this.localStorageKey]) { + Object.assign(this.parent, data[this.localStorageKey]) + } else { + Object.assign(this.parent, this.defaults) + } + this.loadStateBarrier.resolve() + this.loadStateBarrier = null + resolve() + }) + }) + case StateManagerState.DISABLED: + case StateManagerState.READY: + case StateManagerState.SAVING: + case StateManagerState.SAVING_OVERRIDE: + return + case StateManagerState.LOADING: + return this.loadStateBarrier.entry() + } + } + } + + class Newsmaker { + constructor(onUpdate) { + this.alarmListener = (alarm) => { + if (alarm.name === Newsmaker.ALARM_NAME) { + this.updateNews() + } + } + this.stateManager = new StateManager(Newsmaker.LOCAL_STORAGE_KEY, this, { + latest: [], + latestTimestamp: null, + }) + this.latest = [] + this.latestTimestamp = null + this.onUpdate = onUpdate + } + async getLatest() { + await this.stateManager.loadState() + return this.latest + } + subscribe() { + if ( + this.latestTimestamp === null || + this.latestTimestamp + Newsmaker.UPDATE_INTERVAL < Date.now() + ) { + this.updateNews() + } + chrome.alarms.onAlarm.addListener((alarm) => this.alarmListener(alarm)) + chrome.alarms.create(Newsmaker.ALARM_NAME, { + periodInMinutes: Newsmaker.UPDATE_INTERVAL, + }) + } + unSubscribe() { + chrome.alarms.onAlarm.removeListener(this.alarmListener) + chrome.alarms.clear(Newsmaker.ALARM_NAME) + } + async updateNews() { + const news = await this.getNews() + if (Array.isArray(news)) { + this.latest = news + this.latestTimestamp = Date.now() + this.onUpdate(this.latest) + await this.stateManager.saveState() + } + } + async getReadNews() { + const sync = await readSyncStorage({ readNews: [] }) + const local = await readLocalStorage({ readNews: [] }) + return Array.from( + new Set([ + ...(sync ? sync.readNews : []), + ...(local ? local.readNews : []), + ]) + ) + } + async getDisplayedNews() { + const sync = await readSyncStorage({ displayedNews: [] }) + const local = await readLocalStorage({ displayedNews: [] }) + return Array.from( + new Set([ + ...(sync ? sync.displayedNews : []), + ...(local ? local.displayedNews : []), + ]) + ) + } + async getNews() {} + async markAsRead(...ids) { + const readNews = await this.getReadNews() + const results = readNews.slice() + let changed = false + ids.forEach((id) => { + if (readNews.indexOf(id) < 0) { + results.push(id) + changed = true + } + }) + if (changed) { + this.latest = this.latest.map((n) => { + const read = this.wasRead(n.id, results) + return { ...n, read } + }) + this.onUpdate(this.latest) + const obj = { readNews: results } + await writeLocalStorage(obj) + await writeSyncStorage(obj) + await this.stateManager.saveState() + } + } + async markAsDisplayed(...ids) { + const displayedNews = await this.getDisplayedNews() + const results = displayedNews.slice() + let changed = false + ids.forEach((id) => { + if (displayedNews.indexOf(id) < 0) { + results.push(id) + changed = true + } + }) + if (changed) { + this.latest = this.latest.map((n) => { + const displayed = this.wasDisplayed(n.id, results) + return { ...n, displayed } + }) + this.onUpdate(this.latest) + const obj = { displayedNews: results } + await writeLocalStorage(obj) + await writeSyncStorage(obj) + await this.stateManager.saveState() + } + } + wasRead(id, readNews) { + return readNews.includes(id) + } + wasDisplayed(id, displayedNews) { + return displayedNews.includes(id) + } + } + Newsmaker.UPDATE_INTERVAL = getDurationInMinutes({ hours: 4 }) + Newsmaker.ALARM_NAME = 'newsmaker' + Newsmaker.LOCAL_STORAGE_KEY = 'Newsmaker-state' + + async function queryTabs(query) { + return new Promise((resolve) => { + chrome.tabs.query(query, (tabs) => resolve(tabs)) + }) + } + 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 { + constructor({ getConnectionMessage, onColorSchemeChange, getTabMessage }) { + this.fileLoader = null + this.timestamp = null + this.stateManager = new StateManager(TabManager.LOCAL_STORAGE_KEY, this, { + tabs: {}, + timestamp: 0, + }) + this.tabs = {} + this.getTabMessage = getTabMessage + chrome.runtime.onMessage.addListener( + async (message, sender, sendResponse) => { + function addFrame(tabs, tabId, frameId, senderURL, timestamp) { + let frames + if (tabs[tabId]) { + frames = tabs[tabId] + } else { + frames = {} + tabs[tabId] = frames + } + frames[frameId] = { + url: senderURL, + state: DocumentState.ACTIVE, + timestamp, + } + } + switch (message.type) { + case MessageType.CS_FRAME_CONNECT: { + await this.stateManager.loadState() + const reply = (options) => { + const message = getConnectionMessage(options) + if (message instanceof Promise) { + message.then( + (asyncMessage) => + asyncMessage && + chrome.tabs.sendMessage(sender.tab.id, asyncMessage, { + frameId: sender.frameId, + }) + ) + } else if (message) { + chrome.tabs.sendMessage(sender.tab.id, message, { + frameId: sender.frameId, + }) + } + } + const isPanel = + typeof sender === 'undefined' || + typeof sender.tab === 'undefined' || + (isOpera && sender.tab.index === -1) + if (isPanel) { + 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 + addFrame(this.tabs, tabId, frameId, senderURL, this.timestamp) + reply({ + url: tabURL, + frameURL: frameId === 0 ? null : senderURL, + }) + this.stateManager.saveState() + sendResponse({ type: '¯\\_(ツ)_/¯' }) + break + } + case MessageType.CS_FRAME_FORGET: { + await this.stateManager.loadState() + if (!sender.tab) { + break + } + const tabId = sender.tab.id + const frameId = sender.frameId + if (frameId === 0) { + delete this.tabs[tabId] + } + if (this.tabs[tabId] && this.tabs[tabId][frameId]) { + delete this.tabs[tabId][frameId] + } + this.stateManager.saveState() + 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: { + 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 } + ) + if (isThunderbird) { + if (message.data.url.startsWith('chrome://')) { + sendResponse({ data: null }) + return + } + } + 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.CS_COLOR_SCHEME_CHANGE: { + onColorSchemeChange(message.data) + 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 + } + } + } + ) + } + getTabURL(tab) { + return tab.url || 'about:blank' + } + async updateContentScript(options) { + ;(await queryTabs({})) + .filter( + (tab) => options.runOnProtectedPages || canInjectScript(tab.url) + ) + .filter((tab) => !Boolean(this.tabs[tab.id])) + .forEach((tab) => { + if (!tab.discarded) { + if (isMV3) { + chrome.scripting.executeScript({ + target: { + tabId: tab.id, + allFrames: true, + }, + files: ['/inject/index.js'], + }) + } else { + chrome.tabs.executeScript(tab.id, { + runAt: 'document_start', + file: '/inject/index.js', + allFrames: true, + matchAboutBlank: true, + }) + } + } + }) + } + async registerMailDisplayScript() { + await chrome.messageDisplayScripts.register({ + js: [{ file: '/inject/fallback.js' }, { file: '/inject/index.js' }], + }) + } + async sendMessage() { + this.timestamp++ + ;(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(([, { url }], frameId) => { + const message = this.getTabMessage( + this.getTabURL(tab), + 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 + } + }) + }) + } + async canAccessActiveTab() { + const tab = await this.getActiveTab() + return Boolean(this.tabs[tab.id]) + } + async isActiveTabDarkThemeDetected() { + const tab = await this.getActiveTab() + return ( + this.tabs[tab.id] && + this.tabs[tab.id][0] && + this.tabs[tab.id][0].darkThemeDetected + ) + } + async getActiveTabURL() { + return this.getTabURL(await this.getActiveTab()) + } + 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.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', + isOneOf('', 'time', 'system', 'location'), + DEFAULT_SETTINGS + ) + validateProperty( + settings, + 'automationBehaviour', + isOneOf('OnOff', 'Scheme'), + DEFAULT_SETTINGS + ) + validateProperty( + settings, + '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, + '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 { + constructor() { + this.saveSettingsIntoStorage = debounce(SAVE_TIMEOUT, async () => { + if (this.saveStorageBarrier) { + await this.saveStorageBarrier.entry() + return + } + this.saveStorageBarrier = new PromiseBarrier() + const settings = this.settings + if (settings.syncSettings) { + try { + await writeSyncStorage(settings) + } catch (err) { + logWarn( + 'Settings synchronization was disabled due to error:', + chrome.runtime.lastError + ) + this.set({ syncSettings: false }) + await this.saveSyncSetting(false) + await writeLocalStorage(settings) + } + } else { + await writeLocalStorage(settings) + } + this.saveStorageBarrier.resolve() + this.saveStorageBarrier = null + }) + this.settings = null + } + async loadSettings() { + this.settings = await this.loadSettingsFromStorage() + } + 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 } + }) + } + async loadSettingsFromStorage() { + if (this.loadBarrier) { + return await this.loadBarrier.entry() + } + this.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) { + this.fillDefaults(local) + this.loadBarrier.resolve(local) + return local + } + const $sync = await readSyncStorage(DEFAULT_SETTINGS) + if (!$sync) { + local.syncSettings = false + this.set({ syncSettings: false }) + this.saveSyncSetting(false) + this.loadBarrier.resolve(local) + return local + } + const { errors: syncCfgErrors } = validateSettings($sync) + syncCfgErrors.forEach((err) => logWarn(err)) + this.fillDefaults($sync) + this.loadBarrier.resolve($sync) + return $sync + } + async saveSettings() { + await this.saveSettingsIntoStorage() + } + 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 + ) + this.set({ syncSettings: false }) + } + } + set($settings) { + 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 } + } + this.settings = { ...this.settings, ...$settings } + } + } + + 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 } + } + throw new Error(`Unable to parse ${$color}`) + } + 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 } + } + } + throw new Error(`Unable to parse ${$hex}`) + } + 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, + } + } + 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 colorParseCache = new Map() + function parseToHSLWithCache(color) { + if (colorParseCache.has(color)) { + return colorParseCache.get(color) + } + const rgb = parse(color) + const hsl = rgbToHSL(rgb) + colorParseCache.set(color, hsl) + return hsl + } + 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 = parse(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()) + } + + const matchesMediaQuery = (query) => { + if ('window' in globalThis) { + return Boolean(window.matchMedia(query).matches) + } + return false + } + const matchesDarkTheme = () => + matchesMediaQuery('(prefers-color-scheme: dark)') + const matchesLightTheme = () => + matchesMediaQuery('(prefers-color-scheme: light)') + const isColorSchemeSupported = matchesDarkTheme() || matchesLightTheme() + function isSystemDarkModeEnabled() { + if (!isColorSchemeSupported) { + return false + } + return matchesDarkTheme() + } + + class Extension { + constructor() { + this.autoState = '' + this.wasEnabledOnLastCheck = null + this.registeredContextMenus = null + this.popupOpeningListener = null + this.wasLastColorSchemeDark = null + this.startBarrier = null + this.stateManager = null + this.alarmListener = (alarm) => { + if (alarm.name === Extension.ALARM_NAME) { + this.callWhenSettingsLoaded(() => { + this.handleAutomationCheck() + }) + } + } + this.onCommandInternal = async (command, frameURL) => { + if (this.startBarrier.isPending()) { + await this.startBarrier.entry() + } + this.stateManager.loadState() + switch (command) { + case 'toggle': + this.changeSettings({ + enabled: !this.isExtensionSwitchedOn(), + automation: '', + }) + break + case 'addSite': + const url = frameURL || (await this.tabs.getActiveTabURL()) + if (isPDF(url)) { + this.changeSettings({ + enableForPDF: !this.user.settings.enableForPDF, + }) + } else { + this.toggleActiveTab() + } + break + case 'switchEngine': { + const engines = Object.values(ThemeEngines) + const index = engines.indexOf(this.user.settings.theme.engine) + const next = engines[(index + 1) % engines.length] + this.setTheme({ engine: next }) + break + } + } + } + this.onCommand = debounce(75, this.onCommandInternal) + this.onColorSchemeChange = ({ isDark }) => { + if (isFirefox) { + this.wasLastColorSchemeDark = isDark + } + if (this.user.settings.automation !== 'system') { + return + } + this.callWhenSettingsLoaded(() => { + this.handleAutomationCheck() + }) + } + this.handleAutomationCheck = () => { + this.updateAutoState() + const isSwitchedOn = this.isExtensionSwitchedOn() + if ( + this.wasEnabledOnLastCheck === null || + this.wasEnabledOnLastCheck !== isSwitchedOn || + this.autoState === 'scheme-dark' || + this.autoState === 'scheme-light' + ) { + this.wasEnabledOnLastCheck = isSwitchedOn + this.onAppToggle() + this.tabs.sendMessage() + this.reportChanges() + this.stateManager.saveState() + } + } + this.getTabMessage = (url, frameURL) => { + const settings = this.user.settings + const urlInfo = this.getURLInfo(url) + if ( + this.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 ( + this.autoState === 'scheme-dark' || + this.autoState === 'scheme-light' + ) { + const mode = this.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 ThemeEngines.cssFilter: { + return { + type: MessageType.BG_ADD_CSS_FILTER, + data: { + css: createCSSFilterStyleSheet( + theme, + url, + frameURL, + this.config.INVERSION_FIXES_RAW, + this.config.INVERSION_FIXES_INDEX + ), + detectDarkTheme, + }, + } + } + case ThemeEngines.svgFilter: { + if (isFirefox) { + return { + type: MessageType.BG_ADD_CSS_FILTER, + data: { + css: createSVGFilterStylesheet( + theme, + url, + frameURL, + this.config.INVERSION_FIXES_RAW, + this.config.INVERSION_FIXES_INDEX + ), + detectDarkTheme, + }, + } + } + return { + type: MessageType.BG_ADD_SVG_FILTER, + data: { + css: createSVGFilterStylesheet( + theme, + url, + frameURL, + this.config.INVERSION_FIXES_RAW, + this.config.INVERSION_FIXES_INDEX + ), + svgMatrix: getSVGFilterMatrixValue(theme), + svgReverseMatrix: getSVGReverseFilterMatrixValue(), + detectDarkTheme, + }, + } + } + case ThemeEngines.staticTheme: { + return { + type: MessageType.BG_ADD_STATIC_THEME, + data: { + css: + theme.stylesheet && theme.stylesheet.trim() + ? theme.stylesheet + : createStaticStylesheet( + theme, + url, + frameURL, + this.config.STATIC_THEMES_RAW, + this.config.STATIC_THEMES_INDEX + ), + detectDarkTheme: settings.detectDarkTheme, + }, + } + } + case ThemeEngines.dynamicTheme: { + const fixes = getDynamicThemeFixesFor( + url, + frameURL, + this.config.DYNAMIC_THEME_FIXES_RAW, + this.config.DYNAMIC_THEME_FIXES_INDEX, + this.user.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, + } + } + this.config = new ConfigManager() + this.devtools = new DevTools(this.config, async () => + this.onSettingsChanged() + ) + this.messenger = new Messenger(this.getMessengerAdapter()) + this.news = new Newsmaker((news) => this.onNewsUpdate(news)) + this.tabs = new TabManager({ + getConnectionMessage: ({ url, frameURL }) => + this.getConnectionMessage(url, frameURL), + getTabMessage: this.getTabMessage, + onColorSchemeChange: this.onColorSchemeChange, + }) + this.user = new UserStorage() + this.startBarrier = new PromiseBarrier() + this.stateManager = new StateManager(Extension.LOCAL_STORAGE_KEY, this, { + autoState: '', + wasEnabledOnLastCheck: null, + registeredContextMenus: null, + }) + chrome.alarms.onAlarm.addListener(this.alarmListener) + if (chrome.permissions.onRemoved) { + chrome.permissions.onRemoved.addListener((permissions) => { + if (!permissions.permissions.includes('contextMenus')) { + this.registeredContextMenus = false + } + }) + } + } + isExtensionSwitchedOn() { + return ( + this.autoState === 'turn-on' || + this.autoState === 'scheme-dark' || + this.autoState === 'scheme-light' || + (this.autoState === '' && this.user.settings.enabled) + ) + } + updateAutoState() { + const { automation, automationBehaviour: behavior } = this.user.settings + let isAutoDark + let nextCheck + switch (automation) { + case 'time': + const { time } = this.user.settings + isAutoDark = isInTimeIntervalLocal(time.activation, time.deactivation) + nextCheck = nextTimeInterval(time.activation, time.deactivation) + break + case 'system': + if (isMV3) { + isAutoDark = true + break + } + if (isFirefox) { + isAutoDark = + this.wasLastColorSchemeDark == null + ? isSystemDarkModeEnabled() + : this.wasLastColorSchemeDark + } else { + isAutoDark = isSystemDarkModeEnabled() + } + break + case 'location': { + const { latitude, longitude } = this.user.settings.location + if (latitude != null && longitude != null) { + isAutoDark = isNightAtLocation(latitude, longitude) + nextCheck = nextTimeChangeAtLocation(latitude, longitude) + } + break + } + } + let state = '' + if (automation) { + 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 }) + } + } + } + async start() { + await this.config.load({ local: true }) + await this.user.loadSettings() + if ( + this.user.settings.enableContextMenus && + !this.registeredContextMenus + ) { + chrome.permissions.contains( + { permissions: ['contextMenus'] }, + (permitted) => { + if (permitted) { + this.registerContextMenus() + } + } + ) + } + if (this.user.settings.syncSitesFixes) { + await this.config.load({ local: false }) + } + this.updateAutoState() + this.onAppToggle() + logInfo('loaded', this.user.settings) + if (isThunderbird) { + this.tabs.registerMailDisplayScript() + } else { + this.tabs.updateContentScript({ + runOnProtectedPages: this.user.settings.enableForProtectedPages, + }) + } + this.user.settings.fetchNews && this.news.subscribe() + this.startBarrier.resolve() + } + 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 this.news.markAsRead(...ids), + markNewsAsDisplayed: async (ids) => + await this.news.markAsDisplayed(...ids), + onPopupOpen: () => + this.popupOpeningListener && this.popupOpeningListener(), + loadConfig: async (options) => await this.config.load(options), + applyDevDynamicThemeFixes: (text) => + this.devtools.applyDynamicThemeFixes(text), + resetDevDynamicThemeFixes: () => this.devtools.resetDynamicThemeFixes(), + applyDevInversionFixes: (text) => + this.devtools.applyInversionFixes(text), + resetDevInversionFixes: () => this.devtools.resetInversionFixes(), + applyDevStaticThemes: (text) => this.devtools.applyStaticThemes(text), + resetDevStaticThemes: () => this.devtools.resetStaticThemes(), + } + } + registerContextMenus() { + const onCommandToggle = async () => this.onCommand('toggle') + const onCommandAddSite = async (data) => + this.onCommand('addSite', data.frameUrl) + const onCommandSwitchEngine = async () => this.onCommand('switchEngine') + 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: 'DarkReader-toggle', + parentId: 'DarkReader-top', + title: msgToggle || 'Toggle everywhere', + onclick: onCommandToggle, + }) + chrome.contextMenus.create({ + id: 'DarkReader-addSite', + parentId: 'DarkReader-top', + title: msgAddSite || 'Toggle for current site', + onclick: onCommandAddSite, + }) + chrome.contextMenus.create({ + id: 'DarkReader-switchEngine', + parentId: 'DarkReader-top', + title: msgSwitchEngine || 'Switch engine', + onclick: onCommandSwitchEngine, + }) + this.registeredContextMenus = true + } + ) + }) + } + async getShortcuts() { + const commands = await getCommands() + return commands.reduce( + (map, cmd) => Object.assign(map, { [cmd.name]: cmd.shortcut }), + {} + ) + } + setShortcut(command, shortcut) { + setShortcut(command, shortcut) + } + async collectData() { + if (!this.user.settings) { + await this.user.loadSettings() + } + await this.stateManager.loadState() + return { + isEnabled: this.isExtensionSwitchedOn(), + isReady: true, + settings: this.user.settings, + news: await this.news.getLatest(), + shortcuts: await this.getShortcuts(), + colorScheme: this.config.COLOR_SCHEMES_RAW, + forcedScheme: + this.autoState === 'scheme-dark' + ? 'dark' + : this.autoState === 'scheme-light' + ? 'light' + : null, + devtools: { + dynamicFixesText: await this.devtools.getDynamicThemeFixesText(), + filterFixesText: await this.devtools.getInversionFixesText(), + staticThemesText: await this.devtools.getStaticThemesText(), + hasCustomDynamicFixes: + await this.devtools.hasCustomDynamicThemeFixes(), + hasCustomFilterFixes: await this.devtools.hasCustomFilterFixes(), + hasCustomStaticFixes: await this.devtools.hasCustomStaticFixes(), + }, + activeTab: await this.getActiveTabInfo(), + } + } + async getActiveTabInfo() { + if (!this.user.settings) { + await this.user.loadSettings() + } + await this.stateManager.loadState() + const url = await this.tabs.getActiveTabURL() + const info = this.getURLInfo(url) + info.isInjected = await this.tabs.canAccessActiveTab() + if (this.user.settings.detectDarkTheme) { + info.isDarkThemeDetected = + await this.tabs.isActiveTabDarkThemeDetected() + } + return info + } + onNewsUpdate(news) { + if (!this.icon) { + this.icon = new IconManager() + } + const latestNews = news.length > 0 && news[0] + if ( + latestNews && + latestNews.badge && + !latestNews.read && + !latestNews.displayed + ) { + this.icon.showBadge(latestNews.badge) + return + } + this.icon.hideBadge() + } + getConnectionMessage(url, frameURL) { + if (this.user.settings) { + return this.getTabMessage(url, frameURL) + } + return new Promise((resolve) => { + this.user + .loadSettings() + .then(() => resolve(this.getTabMessage(url, frameURL))) + }) + } + callWhenSettingsLoaded(callback) { + if (this.user.settings) { + callback() + return + } + this.user.loadSettings().then(async () => { + await this.stateManager.loadState() + callback() + }) + } + changeSettings($settings) { + const prev = { ...this.user.settings } + this.user.set($settings) + if ( + prev.enabled !== this.user.settings.enabled || + prev.automation !== this.user.settings.automation || + prev.automationBehaviour !== this.user.settings.automationBehaviour || + prev.time.activation !== this.user.settings.time.activation || + prev.time.deactivation !== this.user.settings.time.deactivation || + prev.location.latitude !== this.user.settings.location.latitude || + prev.location.longitude !== this.user.settings.location.longitude + ) { + this.updateAutoState() + this.onAppToggle() + } + if (prev.syncSettings !== this.user.settings.syncSettings) { + this.user.saveSyncSetting(this.user.settings.syncSettings) + } + if ( + this.isExtensionSwitchedOn() && + $settings.changeBrowserTheme != null && + prev.changeBrowserTheme !== $settings.changeBrowserTheme + ) { + if ($settings.changeBrowserTheme) { + setWindowTheme(this.user.settings.theme) + } else { + resetWindowTheme() + } + } + if (prev.fetchNews !== this.user.settings.fetchNews) { + this.user.settings.fetchNews + ? this.news.subscribe() + : this.news.unSubscribe() + } + if (prev.enableContextMenus !== this.user.settings.enableContextMenus) { + if (this.user.settings.enableContextMenus) { + this.registerContextMenus() + } else { + chrome.contextMenus.removeAll() + } + } + this.onSettingsChanged() + } + setTheme($theme) { + this.user.set({ theme: { ...this.user.settings.theme, ...$theme } }) + if ( + this.isExtensionSwitchedOn() && + this.user.settings.changeBrowserTheme + ) { + setWindowTheme(this.user.settings.theme) + } + this.onSettingsChanged() + } + async reportChanges() { + const info = await this.collectData() + this.messenger.reportChanges(info) + } + async toggleActiveTab() { + const settings = this.user.settings + const tab = await this.getActiveTabInfo() + const { url } = tab + const isInDarkList = isURLInList(url, this.config.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 }) + return + } + const toggledList = getToggledList(settings.siteList) + this.changeSettings({ siteList: toggledList }) + } + onAppToggle() { + if (!this.icon) { + this.icon = new IconManager() + } + if (this.isExtensionSwitchedOn()) { + this.icon.setActive() + if (this.user.settings.changeBrowserTheme) { + setWindowTheme(this.user.settings.theme) + } + } else { + this.icon.setInactive() + if (this.user.settings.changeBrowserTheme) { + resetWindowTheme() + } + } + } + async onSettingsChanged() { + if (!this.user.settings) { + await this.user.loadSettings() + } + await this.stateManager.loadState() + this.wasEnabledOnLastCheck = this.isExtensionSwitchedOn() + this.tabs.sendMessage() + this.saveUserSettings() + this.reportChanges() + this.stateManager.saveState() + } + onRemoteSettingsChange() {} + getURLInfo(url) { + const { DARK_SITES } = this.config + const isInDarkList = isURLInList(url, DARK_SITES) + const isProtected = !canInjectScript(url) + return { + url, + isInDarkList, + isProtected, + isInjected: null, + isDarkThemeDetected: null, + } + } + async saveUserSettings() { + await this.user.saveSettings() + logInfo('saved', this.user.settings) + } + } + Extension.ALARM_NAME = 'auto-time-alarm' + Extension.LOCAL_STORAGE_KEY = 'Extension-state' + + function makeChromiumHappy() { + chrome.runtime.onMessage.addListener((message, _, sendResponse) => { + if ( + ![ + MessageType.CS_FRAME_CONNECT, + 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) + ) { + sendResponse({ type: '¯\\_(ツ)_/¯' }) + } + }) + } + const UNINSTALL_URL = + 'https://ext.aitools.band/dark-mode-google-docs/uninstall' + chrome.runtime.setUninstallURL(UNINSTALL_URL) + const extension = new Extension() + extension.start() + if (chrome.commands) { + chrome.commands.onCommand.addListener(async (command) => + extension.onCommand(command) + ) + } + const welcome = `Hi!` + console.log(welcome) + { + chrome.runtime.onInstalled.addListener((details) => { + if (details.reason === chrome.runtime.OnInstalledReason.INSTALL) { + // Code to be executed on first install + // eg. open a tab with a url + chrome.storage.sync.set({ + welcomePageOpened: true + }) + + chrome.tabs.create({ + url: 'https://ext.aitools.band/dark-mode-google-docs/congrats', + }) + chrome.storage.sync.set({ + deviceId: crypto.randomUUID() + }) + } else if (details.reason === chrome.runtime.OnInstalledReason.UPDATE) { + // When extension is updated + } else if ( + details.reason === chrome.runtime.OnInstalledReason.CHROME_UPDATE + ) { + // When browser is updated + } else if ( + details.reason === chrome.runtime.OnInstalledReason.SHARED_MODULE_UPDATE + ) { + // When a shared module is updated + } + }) + } + makeChromiumHappy() + + chrome.storage.sync.get(['deviceId'], (result) => { + if (!result.deviceId) { + chrome.storage.sync.set({ deviceId: crypto.randomUUID() }) + } + }) + +})() diff --git a/config/color-schemes.drconf b/config/color-schemes.drconf new file mode 100644 index 0000000..db9d693 --- /dev/null +++ b/config/color-schemes.drconf @@ -0,0 +1,74 @@ +Default + +DARK +background: #181a1b +text: #e8e6e3 + +LIGHT +background: #181a1b +text: #e8e6e3 + +================================ + +Catppuccin + +DARK +background: #161320 +text: #d9e0ee + +================================ + +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 + +================================ + +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/dark-sites.config b/config/dark-sites.config new file mode 100644 index 0000000..aa9296d --- /dev/null +++ b/config/dark-sites.config @@ -0,0 +1,1121 @@ +0bin.net +0x00sec.org +12bytes.org +1337x-forum.eu +1337x.*/$ +1lighty.github.io/BetterDiscordStuff +1nf.me +2600.com +2bqueue.info +314n.org +5stardata.info +9anime.center +9anime.club +9anime.id +9anime.to +abletonbot.me +absolucy.moe +account.bhvr.com +accounts.pubg.com +aceship.github.io +acm.sdut.edu.cn/onlinejudge3/ +addictinggames.com +adridoesthings.com +adventofcode.com +agent-stats.com +agfy.co +ajay.app +aka-pocztowe.int.pl +albony.xyz +ameliorated.info +amp-what.com +amplifi.com +andrewleguay.com +animencodes.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 +arche-dev.codeberg.page +archive.ragtag.moe +argoto.snaz.in +ari-web.xyz +arisuchan.jp +arkadia.xyz +arkenfox.github.io/TZP/ +armaforces.com +artixlinux.org +artofkeys.com +as2.aiae.ovh +asciimation.co.nz +ashcam.xyz +asherhe.com +ashishpanigrahi.xyz +asoftmurmur.com +aspenuwu.me +assassins-creed.de +ast4u.me +astronvim.github.io +astrovpn.co +atelier.net/virtual-economy +atlassurvivalshelters.com +atresplayer.com +attackontitan.fandom.com +audiolove.club +audiomass.co +audioz.download +augmentedsteam.com +avengedsevenfold.com +axyl-os.github.io +azeria-labs.com +azm.azerialabs.com +badboybill.com +batflix.org +battle.net +battlelog.battlefield.com +bbaovanc.com +bbc.co.uk/iplayer +bdeditor.dev +beastskills.com +bedrocklinux.org +beepbox.co +beeper.com +ben-herila.webflow.io +benfoster.dev +benleggiero.blog +benleggiero.me +bequiet.com +bestblackhatforum.com +beta.crunchyroll.com +beta.destinyitemmanager.com +betteranime.net +betterdiscord.app +betterttv.com +bherila.net +bin.disroot.org +binclub.dev +bip.staszic.waw.pl +birdie0.github.io +bitcoinity.org/markets +bitcoinwisdom.com +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 +block.wingysam.xyz +blog.aractus.com +blog.counter-strike.net +blog.dota2.com +blog.ja-ke.tech +blox.link +boba.best +bogleech.com +bondoer.fr +botboy.snaz.in +bouncingdvdlogo.com +brawldb.com +breaksforeyes.app +brew.sh +bri.io +brianpmaher.com +broadcasthe.net +brodierobertson.xyz +browserslist.vercel.app +brunotome.dev +btcpayserver.org +bugmenot.com +buildbot.orphis.net +bungie.net +byte.co +bytebin.lucko.me +c-saccoccio.fr +cadence.moe +caesarshiba.com +caniuse.com +captaindisillusion.com +caracal.club +carbon.now.sh +cardsity.app +carl.gg +cascadr.co +catvibers.me +cdkeys.com +cdnnow.pro +channel4.com +chat.ryzom.com +cheat.sh +checkra.in +chess.com +chessbomb.com +chitownhousemusic.com +chromatic-tuner.com +cider.sh +cinema-city.pl +cl00e9ment.gitlab.io/kingdom-blazon-generator/ +clash3d.com +clashofstats.com +clt.gg +cncnet.org +codepen.io +codesandbox.io +codestackr.com +codingame.com +coinpot.co +colean.cc +comicextra.com +comicpunch.net +conficturaindustries.com +connect-4.xyz +coolmathgames.com +copter.io +corepacks.com +coriolis.io +countermail.com +cracked.to +crackingking.com +crackwatch.com +crazygames.com +crontab.guru +cryptowat.ch +cs.rin.ru +cssbattle.dev +cswarzone.com +ctr-electronics.com +curiositystream.com +cxsecurity.com +cyanthvibes.com +cyanvibes.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 +dankmemer.gg +darckrepacks.com +daringfireball.net +dark.diatr.us +darkmodelist.com +darkreader.org +dash.cavebot.xyz +datomatic.no-intro.org +dblstatistics.com +dcards.snaz.in +deadbydaylight.com +deadbydaylight.fandom.com +deepweblinks.net +defcon.org +del.dog +deltarune.com +demonforums.net +denims.tv +denshi.org +desktop.github.com +destiny.gg +destinytracker.com +devanbuggay.com +devart.withgoogle.com +developerinsider.co +developpement-systeme-exploitation.github.io/documentation +di.fm +diablo3.com +diablogame.de +diep.io +digi77.com +digital.fashion +disasm.pro +disboard.org +discohook.org +discord.bio +discord.boats +discord.bots.gg +discord.com/app +discord.com/channels +discord.com/developers +discord.com/invite +discord.com/login +discord.com/register +discordbotlist.com +discordservers.me +discordtemplates.com +discourse.automationgame.com +discourse.cataclysmdda.org +discourse.disneyheroesgame.com +discuss.noisebridge.info +disneyplus.com +distrotube.com +djflame.tech +dlive.tv +dodi-repacks.site +doesitarm.com +dood.la +doodstream.com +dota2.ru +dotabuff.com +dotapicker.com +dplay.com +draculatheme.com +draftkings.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.freepik.com +editor.method.ac +egee.io +eggsy.xyz +elderscrolls.fandom.com +eleaks.to +elitedangerous.com +ellie-app.com +elybeatmaker.com +emanuelemilella.com +emeraldchat.com/app +emkc.org +emuparadise.me +enesgenc.gen.tr +enlightenment.org +entity.works +envs.net +epack.herokuapp.com +epack.js.org +epicgames.com/id +epicgames.com/store +erai-raws.info +ericnl.com +escapefromtarkov.com +escapefromtarkov.fandom.com +esportal.com +etcroot.pw +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 +femto.pw +fictivekin.com +filmmakermode.com +filterblade.xyz +filterlists.com +find.lolpros.gg +fireship.io +fisp.io +fleepy.tv +flixxo.com +flooxer.com +florr.io +fluxpoint.dev +flyordie.io +fmovies.to +food-le.co +fortnite-api.com +forum.cswarzone.com +forum.lastos.org +forum.privacytools.io +forum.snahp.it +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 +gameloop.fun +gaming.amazon.com +garamlee500.github.io +garudalinux.org +gatsbyjs.org +geekabit.nl +geektyper.com +gekri.com +generated.photos +genshin.gg +geocities.restorativland.org +geometry.best +getaether.net +getdweb.net +gethalfmoon.com +getsharex.com +getwacup.com +gfl.matsuda.tips +gflcorner.com +gfycat.com +ggapp.io +ghidra-sre.org +ghostpgp.com +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 +gload.cc +glow.phoesion.com +glowing-bear.org +glslsandbox.com +go.dailynow.co +goaudio.cc +gobananas.gg +god.freevar.com +gog.com/forum +gogalaxy.com +gogoanime.se +goodfirstissue.dev +goosegame.io +grapheneos.org +graydon2.dreamwidth.org +grc.arikado.ru +greatview.video +greenmangaming.com +greynoise.io +groovy.bot +gtaforums.com +gunshipmusic.com +gusted.xyz +hackaday.com +hackaday.io +hackersforcharity.org +hackertyper.com +hackforums.net +hackthebox.eu +hackthissite.org +hacktivis.me +hacktoberfest-projects.vercel.app +halowaypoint.com +hardcoregaming101.net +hardforum.com +hardstuck.gg +hardwaretimes.com +hastebin.com +hbomax.com +hdencode.com +heapmedia.com +heavybit.com +heliotrope.dk +hellofromhe.re +help.steampowered.com +hermes.ksdfg.me +herodamage.com +hexiro.me +hidive.com +himovies.to +hiserod.github.io +hiveos.farm +hoarding.me +hostedtalk.net +hotstar.com +hrmspms.sicorax.mu +htmlpasta.com +humblebundle.com/$ +humblebundle.com/accessibility +humblebundle.com/charities +humblebundle.com/refer +humblebundle.com/subscription +humblegames.com +hyper.is +hyperbeam.dev +i3wm.org +ibookpile.net +identinator.com +ieuan.tech +ieuan.xyz +illicoweb.videotron.com +imageglass.org +imgbox.com +imgops.com +imgur.com +impb.in +imperialb.in +indexmania.org +indiexpo.net +infinitezoom.net +infocon.org +inker.co +intactphone.com +intothetrenches.1917.movie +iptorrents.com +iq.com +isitchristmas.com +isthereanydeal.com +isxander.dev +itv.com +iwanttoeat.app +ixirc.com +jackdaniels.com +jakobneumann.com +jakubkaczor.com +jakubkaczor.github.io +jbzd.com.pl +jekyllrb.com +jellymar.io +jeusto.com +jhey.dev +jigsawpuzzles.io +jmoore.dev +joeydrewstudios.com +joinmastodon.org +jonahsnider.com +jqbx.fm +jsben.ch +jsfiddle.net +jsitor.com +json-diff.com +justfive.news +kadantiscam.netlify.app +kaoskrew.org +kbh.games +kbhgames.com +keezersquest.nl +kfocus.org +killabee-gaming.com +killtheradio.net +kimbatt.github.io/js-Z +kingdom-leaks.com +kittybot.de +kiwifarms.cc +kiwifarms.net +knockout.chat +kodenames.io +kreatea.space +kreato.cf +krisoneil.com/home +kristal.cc +krunker.io +ksp.mff.cuni.cz +kulbachny.com +kwejk.pl +kyleggiero.me +lagom.nl/lcd-test +lainchan.org +landchad.net +larbs.xyz +lbrynomics.com +leakedsource.ru +leakth.is +lecantiche.com +lemmi.no +letterboxd.com +libreboot.org +lightweightpdf.com +limeshark.dev/editor +link.brawlstars.com/invite +linux.org.ru +linuxgamingcentral.com +lipu-linku.github.io +liquidplus.com +listen.moe +livesplit.org +loadout.tf +lolesports.com +lollilol.xyz +lookmovie.ag +looskie.com +lootdev.com +lootgod.com +lordofthemanor.io +lospec.com +lukesmith.xyz +lumina-desktop.org +lutris.net +m2v.ru +m4rtyr.github.io +macbb.org +madiator.com +magnetoo.io +magoware.tv +manen.me +mangaplus.shueisha.co.jp +mango.pdf.zone +maroon.jonah.pw +marte.dev +mastercomfig.com +mastodon.online +mastodon.social +matteotiscia.com +mcrpw.github.io +mcskinhistory.com +mednafen.github.io +mee6.xyz +melody.ml +melonds.kuribo64.net +memory-alpha.fandom.com +merklex.io +metronom.us +metropool.nl +mewho.com/starfield47 +migueldemoura.com +mikemaximus.github.io/gbm-web +minehut.com +miniroyale2.io +misode.github.io +missions.ingress.com +mixxx.org +mkbhd.com +mmorpg.com +mobalytics.gg +monitoror.com +monkey-type.com +monkeytype.com +monkrus.ws +mope.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 +namechk.com +nanhu.ca +nationsglory.com +nationsglory.es +nationsglory.fr +nchristopher.me +neal.fun/size-of-space +nee.lv +neovim.io +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.13ad.de +nitter.42l.fr +nitter.cattube.org +nitter.dark.fail +nitter.fdn.fr +nitter.net +nitter.nixnet.services +nitter.pussthecat.org +nitter.snopyta.org +nitwhiz.xyz +nodejs.dev +noisebridge.net +nomanssky.com +northward.info +nostv.pt +notebooks.quantumstat.com +notiger.xyz +nowplayi.ng +null.media +nulledbb.com +obsproject.com +odysee.com +offshorecorptalk.com +ogusers.com +ohmyz.sh +oldergeeks.com +oldfag.org +omcar.pl +omgwtfnzbs.me +onionplay.co +online.lloydsbank.co.uk +onlyformats.netlify.app +open.spotify.com +openbase.io +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 +oxy.cannot.date +p4pirate.xyz +paimon.moe +paper-io.com +parahumans.wordpress.com +paranoid.email +parrotsec.org +passthepopcorn.me +pastes.dev +pathof.info +pathofexile.com +pathofexile.fandom.com +payday.fandom.com +peertube.co.uk +peertube.nocturlab.fr +peertube.pontostroy.gq +peertube.servebeer.com +peertube.zapashcanon.fr +peterlindbergh.obys.agency +petersalomonsen.com/webassemblymusic/livecodev2 +phineas.io +phosphorshy.com +photomosh.com +photopea.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.silkky.cloud +piped.tokhmi.xyz +piracybank.org +piskelapp.com +pitokmm.it +planetneverwinter.de +plasticuproject.com +platinumgod.co.uk +play.geforcenow.com +play.hbogo.com +play.mubert.com +playartifact.com +playcanv.as +playcanvas.com +playclassic.games +playcode.io/$ +playerdb.co +pleroma.social +plex.doorcraft.de +plexguide.com +pluto.tv +poal.co +poczta.int.pl +poe-racing.com +poe.ninja +poe.trade +poeapp.com +poelab.com +poison.gg +polsatboxgo.pl +polsatgo.pl +polychromatic.app +pony.tube +pool.pm +powercord.dev +ppluss.de +pr0gramm.com +pre.fyp.nl +premid.app +primevideo.com +progettosnaps.net +programsquared.com +projectdiscovery.io +protogen.dev +protondb.com +proxx.app +proxy.vulpes.one +psi.cynicaloptimist.me +psyoptions.io +ptt.cc +pussthecat.org +pvplegacy.net +pxseu.com +pylon.bot +qbraid.com +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 +readcomiconline.to +realgamernewz.com +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 +rythmbot.co +sa-mp.com +sacred-legends.de +sadh.life +sadistic.pl +sammcheese.net +samsai.eu +sandervanderburg.blogspot.com +sapphdavis.com +sapphdavis.me +sauce420.github.io +sauce420.gitlab.io +saznajnovo.com +sb.ltn.fi +science-news.co +seaofthieves.fandom.com +search.biboumail.fr +search.nebulacentre.net +searx.dojocasts.com +searx.ninja +searx.prvcy.eu +secrethitler.io +securegroup.com +seoringslerbhfa.club +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 +spark.lucko.me +speedrun.com +speedtest.net +sportsurge.net +spy-cards.lubar.me +spyware.neocities.org +srrdb.com +star-made.org +stargazing.net +starlink.com +starmadedock.net +staszic.waw.pl +statbot.net +stateofjs.com +steam.tv +steamcharts.com +steamchina.com +steamcommunity.com +steamdb.info +steamstat.us +steamtimeidler.com +stillu.cc +stitches.dev +stonestyle.co.th +store.steampowered.com +storyfire.com +streamelements.com +streamwat.ch +studiomaertens.com +subspaceteati.me +sufficientvelocity.com +sumo.app +sunxdcc.com +supabase.io +supinic.com +support.steampowered.com +supremacy1914.com +surviv.io +svtplay.se +sync-tube.de +szmarczak.com +t.maisputain.ovh +tabstats.com +tacoanon.github.io +takethewalk.net +talentbrick.com +tallguysfree.com +tarkov-market.com +tauri.studio +tautulli.com +teambeyond.net +teamos-hkrg.com +teaspeak.de +techwithalext.com +teddit.zaggy.nl +telecineplay.com.br +teleseer.com +televizeseznam.cz +telugucz.com +term.ooo +terminal.sexy +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 +userdiag.com +ussr.obys.agency +uwatchfree.ax +v15.studio +v3.wttr.in +v3rmillion.net +v7player.wostreaming.net +v8.dev +vakhtangov.ru +valvestore.forfansbyfans.com +vancedapp.com +vanillatweaks.net +vcjhwebdev.github.io/useless-translator/ +verify.bots.gg +vexbot.tk +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 +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 +www.ageofempires.com +www.canalplus.com +www.cc.com +www.chiefdelphi.com +www.deviantart.com +www.digikam.org +www.directvnow.com +www.gotimelinr.com +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/dynamic-theme-fixes.config b/config/dynamic-theme-fixes.config new file mode 100644 index 0000000..d3a2b77 --- /dev/null +++ b/config/dynamic-theme-fixes.config @@ -0,0 +1,21004 @@ +* + +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 { + 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"] + +================================ + +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-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 + +================================ + +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.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 + +================================ + +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; +} + +================================ + +ad.nl + +CSS +.instanews-page-main-content { + color: var(--darkreader-neutral-text) !important; +} + +================================ + +ada.org + +INVERT +.logo + +================================ + +addons.mozilla.org + +IGNORE IMAGE ANALYSIS +.Icon-youtube +span.Permission-description:before + +================================ + +adguard-dns.io + +INVERT +.animation__video + +CSS +.animation__video { + z-index: 0 !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; +} + +================================ + +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 + +================================ + +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 + +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; +} + +================================ + +alt.hololive.tv + +INVERT +video[src*="bg.mp4"] +video[src*="first.mp4"] +img[src*="logo_2line_gradient_color.svg"] +svg + +================================ + +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; +} + +================================ + +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 + +CSS +.lazy-loaded { + mix-blend-mode: normal !important; +} + +================================ + +androidpolice.com + +INVERT +.header-logo svg + +================================ + +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; +} + +================================ + +anytype.io + +IGNORE IMAGE ANALYSIS +.img.home + +================================ + +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; +} + +================================ + +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.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 + +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 + +================================ + +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 + +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; +} +#ak-main-content { + 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; +} + +================================ + +auth0.com + +INVERT +button[data-handler="authorise-github"] > img.icon.icon-default + +================================ + +autoweek.com + +INVERT +.nav-logo + +================================ + +avanti24.pl + +INVERT +.box-logo + +================================ + +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"] + +================================ + +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 + +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 + +================================ + +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"] + +================================ + +bankofamerica.com + +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; +} + +================================ + +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/weather +bbc.com/weather + +INVERT +.orb-nav-section .orb-nav-blocks +.orb-icon .orb-icon-arrow + +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"] + +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; +} + +================================ + +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; +} + +================================ + +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; +} + +================================ + +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 + +================================ + +blahdns.com + +INVERT +[src="https://cdn.blahdns.com/logo.png"] +[src="https://cdn.blahdns.com/kofi4.png"] +.liberapay-btn > span +svg + +================================ + +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 + +CSS +.c-logo .c-image { + background: ${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 { + 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 + +================================ + +boredpanda.com + +INVERT +.logotype + +================================ + +boringcompany.com + +CSS +.tweak-overlay-parallax-enabled .Parallax-item { + z-index: 1 !important; +} + +================================ + +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; +} + +================================ + +breitbart.com + +INVERT +#FootW #FWI p .parler + +================================ + +brightspace.avans.nl + +CSS +:root { + --darkreader-bg--d2l-dropdown-background-color: #1D1F20; +} + +================================ + +brilliant.org + +INVERT +[class*="b-sprite-landing"] +[class*="b-sprite-publishers"] +.logo + +================================ + +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 +* + +================================ + +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 + +================================ + +caddy.community + +INVERT +.logo-big + +================================ + +caddyserver.com + +INVERT +#logo +#zerossl-logo +#footer-logo + +CSS +.hero { + background-image: none !important; +} + +================================ + +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 + +CSS +div[role="checkbox"] > div > div > div { + border: 1px solid ${black} !important; +} + +IGNORE INLINE STYLE +div[role="checkbox"] + +================================ + +calibre-ebook.com + +IGNORE IMAGE ANALYSIS +.tooltip +#content-wrapper + +================================ + +calvinklein.us + +INVERT +.star:not(.star-active) +.star-half + +================================ + +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; +} + +================================ + +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 +} + +================================ + +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 + +IGNORE INLINE STYLE +.footer-bottom-row-margin > div > a > svg > path + +================================ + +cloudhostnews.com + +INVERT +.site-title + +================================ + +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% + } + +================================ + +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="Telegram"] { + 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; +} + +================================ + +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; +} + +================================ + +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%); +} + +================================ + +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; +} + +================================ + +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; +} + +================================ + +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 + +================================ + +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 + +================================ + +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"] + +================================ + +daily.afisha.ru + +INVERT +.sprite-logo-daily +.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 +#logo + +CSS +body { + background-image: none !important; +} + +================================ + +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_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 + +================================ + +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 + +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; +} + +================================ + +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 + +================================ + +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; +} +.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="menuitem"]) > div:not([aria-pressed]):not([role="tab"]):not([class$="highlightsgrid"]):first-of-type +#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.* + +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; +} + +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 + +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 + +================================ + +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; +} + +================================ + +edziecko.pl + +INVERT +.pageHeadBrand .col1 img +.main-navigation__logo + +================================ + +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; +} + +================================ + +etsy.com + +INVERT +.banner-container +.secondary-banner-title +.wt-radio label:before +.review-star.rating:not(.lit) +div.rating.nolit:not(:hover) > .ss-star + +================================ + +evernote.com + +INVERT +.global-logo svg + +================================ + +ewybory.eu + +INVERT +.navbar-brand + +================================ + +exmo.me + +INVERT +canvas + +================================ + +expedia.com + +INVERT +.uitk-header-brand-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; +} +._5qxm { + background-color: rgba(0, 0, 0, 0.25); + background-blend-mode: color; +} +.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; +} + +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; +} + +================================ + +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 + +================================ + +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"] + +================================ + +fosshost.org + +INVERT +img[alt="Fosshost Logo"] + +================================ + +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) + +================================ + +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"] + +================================ + +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; +} + +================================ + +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; +} + +================================ + +gain.tv + +CSS +.body-new-index .hero-img-container { + z-index: 0 !important; +} + +================================ + +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; +} + +================================ + +garmin.com + +INVERT +.gh__logo + +================================ + +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 + +INVERT +.column +.navigation__logo +.main-navigation__logo +.serviceLogo__img +.hp_redirector-circle-progress__svg +.vs__actions svg + +CSS +.top_section_bg, .bottom_section_bg { + background-color: ${#e5e5e5} !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 + +================================ + +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 + +================================ + +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; +} + +================================ + +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; +} + +================================ + +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; +} +.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; +} + +================================ + +gnu.org + +INVERT +#gnu-banner img +#search-icon + +================================ + +godaddy.com + +INVERT +.logo-mark + +================================ + +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 + +CSS +.container.game > .bg { + 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; +} + +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 + +================================ + +gov.pl/web/bip + +INVERT +.banner-promo +.banner-promo__text + +================================ + +gowork.pl + +INVERT +.city__img .city__text + +================================ + +grammarly.com + +INVERT +img[alt="Grammarly logo"] + +================================ + +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 + +================================ + +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 + +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 + +================================ + +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; +} + +================================ + +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 +.sc-iujRgT.jxLrRl +.icloud-text.image +.img.app-icon-icloud + +================================ + +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 +a.logo + +================================ + +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; +} + +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 + +================================ + +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"] + +================================ + +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"] + +CSS +div > a[tabindex], +div > span > a[tabindex] { + border-color: transparent !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; +} + +================================ + +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; +} + +================================ + +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 +.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"] + +================================ + +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; +} + +================================ + +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 + +================================ + +juwai.com + +INVERT +.c-header__logo +.c-responsive-navigation__logo + +================================ + +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; +} + +================================ + +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; +} + +================================ + +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; +} + +================================ + +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"] + +================================ + +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)}; +} + +================================ + +kinzhal.media + +INVERT +img[src$="logo.svg"] +img[src$="search.svg"] +img[src$="close.svg"] +.footer-soc +.footer__18 +.kinzhal-icon + +================================ + +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 + +================================ + +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; +} + +================================ + +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 + +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; +} + +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; +} + +================================ + +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 + +================================ + +lg.com + +INVERT +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 + +================================ + +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; +} + +================================ + +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; +} + +================================ + +loepenshop.com +bonjourfoto.nl + +CSS +body { + background-image: none !important; +} + +IGNORE IMAGE ANALYSIS +div.art-Header-jpeg + +================================ + +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 + +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 +img.Hl +img.Hk +img.Ha +.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 +.aiC +.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]) + +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 +} + +IGNORE INLINE STYLE +.at +.au +.av +.qj +.hU.hM +.hV.hM +.ajZ-Jt +.aH5 +.JA-Kn-Jr-Kw-Jt + +================================ + +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; +} + +================================ + +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 + +================================ + +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; +} + +IGNORE INLINE STYLE +[role="button"] svg +[role="button"] svg line +div svg[viewBox="0 0 36 36"] mask path +mask > rect +g > rect + +================================ + +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; +} + +================================ + +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 + +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 + +================================ + +miro.com + +INVERT +#pixiCanvasContainer > :nth-child(1) +.b-icon + +================================ + +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; +} + +================================ + +monitor.firefox.com + +INVERT +svg[class="Mozilla-logo"] > path[fill="#ffffff"] +.fx-bento-app-link.fx-bento-link.fx-mobile > span::before + +================================ + +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) + +================================ + +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 + +================================ + +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 +img[src*="handshake-logo"] + +CSS +.text-right[style*="opacity: 0.3"] { + opacity: 0.6 !important; +} +g.rsm-geographies { + filter: invert(1) hue-rotate(180deg) brightness(130%) !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 + +================================ + +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 + +================================ + +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; +} + +================================ + +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 + +CSS +.select option { + background-color: #1c1e1f !important; + color: white !important; +} + +================================ + +nerdschalk.com + +INVERT +.logo-default + +================================ + +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 + +================================ + +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 + +================================ + +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; +} + +================================ + +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 + +================================ + +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; +} + +================================ + +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 +} + +================================ + +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; +} + +================================ + +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 * + +================================ + +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 + +================================ + +outline.com + +INVERT +img[src="https://outline.com/images/wordmark.svg"] + +================================ + +outlook.live.com + +INVERT +div.o365cs-base > span.ms-Icon--WaffleOffice36 + +================================ + +overleaf.com + +INVERT +.canvasWrapper + +================================ + +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 + +================================ + +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 + +================================ + +paramountnetwork.com + +CSS +.module-container { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +park-in.gr + +CSS +.div-background { + z-index: 0 !important; +} +.container { + z-index: 1 !important; + position: relative !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 + +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; +} + +================================ + +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 { + 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; +} + +================================ + +pch24.pl + +INVERT +a[href="https://pch24.pl"] svg + +CSS +a[href="https://pch24.pl"] svg path[fill="#1d1e1d"] { + --darkreader-inline-fill: ${white} !important; +} + +================================ + +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 + +================================ + +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 + +================================ + +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 + +================================ + +prajwalkoirala.com + +INVERT +svg + +================================ + +pressgazette.co.uk + +INVERT +.site-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 > * + +================================ + +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; +} + +================================ + +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; +} + +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; +} + +================================ + +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 * + +================================ + +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 + +================================ + +render.githubusercontent.com/view/ipynb + +INVERT +img.math + +================================ + +replit.com + +CSS +.monaco-editor .cursor { + background-color: ${#000}; +} + +================================ + +reproducible.archlinux.org + +INVERT +img[src*="icons/"] + +================================ + +resmigazete.gov.tr + +CSS +img[src="/assets/img/arma.png"] { + filter: hue-rotate(180deg) invert(1) brightness(2); +} + +================================ + +respekt.cz + +INVERT +.sitelogo-link + +================================ + +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"] +svg[class^="nav-bar__arrow"] > path +svg[class^="nav-dropdown__icon"] > path + +================================ + +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 + +================================ + +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; +} + +================================ + +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 + +================================ + +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; +} + +================================ + +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 + +================================ + +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; +} + +================================ + +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; +} + +================================ + +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; +} + +================================ + +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; +} + +================================ + +southpark.cc.com + +CSS +body { + background-color: var(--darkreader-neutral-background) !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; +} + +================================ + +sport.pl + +INVERT +#pageHead img + +CSS +.top_section_bg, .bottom_section_bg { + background: ${#e5e5e5} !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 * + +================================ + +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 + +================================ + +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 +.gear::after +.week.clearfix svg +#compare-graph svg +#compare-graph canvas +div[data-cy="challenge_results_container"] svg +nav svg +.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-sm:not([class*="icon-at-pr"]):not(.icon-run) +.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; +} + +IGNORE IMAGE ANALYSIS +.app-icon.icon-fb +.app-icon.icon-rowing +.app-icon.icon-nordicski +.app-icon.icon-walk + +================================ + +streamable.com + +INVERT +.landing .features-pane .feature > span > svg +.landing .logo +.landing .start-pane .start-form .try-arrow > img +#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 + +================================ + +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"] + +================================ + +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 + +================================ + +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; +} + +================================ + +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 + +================================ + +thesaurus.com + +INVERT +img[alt^="Grammar Coach"] +[data-grammar-coach-hero="true"] + [data-promotion-page="true"] +[data-grammar-coach-hero="true"] + [data-promotion-page="true"] > div + +================================ + +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 + +CSS +body { + background-image: none !important; +} + +================================ + +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 +.play + +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 + +================================ + +towhee.io + +INVERT +.logo-wrapper + +================================ + +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 + +================================ + +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 + +================================ + +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 +.module-container, +.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.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; +} + +================================ + +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; +} + +================================ + +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 + +================================ + +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; +} + +================================ + +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; +} + +================================ + +ventusky.com + +CSS +.qo { + color: ${white} !important; +} + +================================ + +vercel.com + +INVERT +[alt="optimized-frameworks"] +[class^="features_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"] + +================================ + +vh1.com + +CSS +.module-container { + background-color: var(--darkreader-neutral-background) !important; +} + +================================ + +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 + +================================ + +vk.com + +CSS +body[scheme="vkcom_dark"] ._im_dialog_unread_ct { + background: var(--counter_primary_background) !important; +} + +================================ + +vod.tvp.pl + +INVERT +img[alt="serwisy tvp"] + +================================ + +vox.com + +INVERT +.c-app-nav__logo +.c-footer__logo-link + +================================ + +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 + +CSS +.measure { + z-index: 0 !important; +} + +IGNORE INLINE STYLE +.ia-wordmark + +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 + +================================ + +webmd.com + +INVERT +.global-nav-logo + +================================ + +webtoons.com + +CSS +.info { + color: rgb(0,0,0) !important; +} + +================================ + +wego.here.com + +INVERT +#map +.route_card_left +.route_tooltip_icon +.btn_directions + +================================ + +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; +} + +================================ + +what-if.xkcd.com + +INVERT +.illustration +.archive-image +.logo + +================================ + +whatsapp.com + +INVERT +span[data-icon="audio-download"] +.landing-main .invisible-space > span +.landing-main div[data-ref] span > svg > path +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: 5px 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"] + +================================ + +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.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"] { + 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 +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; +} + +================================ + +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.bromite.org + +CSS +body, +#container { + background-image: none !important; +} + +================================ + +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; +} +.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.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.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.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; +} + +================================ + +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"] + +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; +} +a[href="/"] > div > svg { + fill: white !important; +} +a[href="/explore"] > svg { + fill: white !important; +} +a[aria-label="Tumblr"] > svg { + fill: white !important; +} +nav.FhRnI > ul > li { + filter: invert(100%) hue-rotate(180deg) contrast(200%) !important; +} +footer[role="contentinfo"] > ul > li > a { + filter: invert(0%) hue-rotate(180deg) contrast(200%) !important; +} +ul.AohpR > 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.windy.com + +INVERT +.data-table > .forecast-table.progress-bar > canvas + +================================ + +wx.qq.com +wx2.qq.com + +CSS +body { + background-image: none !important; +} + +================================ + +wyborcza.pl +wyborcza.biz + +INVERT +#logo-wyborcza +.header-cap-holder > a > img +.header-headline +.header > .header-content > .header-items +.paywall-widget-svg-wrapper +.vin-img +.tools +img[src*="exchange/staticCharts"] +img[alt="Giełda"] +img[alt="Waluty"] + +CSS +.contianer-hp-grid .hp-grid-picture-inner { + z-index: 0 !important; +} +.plot, +.prev, +.sbt { + background-image: none !important; + color: var(--darkreader-neutral-text) !important; +} + +================================ + +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), +[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 + +================================ + +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"] + +================================ + +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"] + +================================ + +zybooks.com + +CSS +.image-content-resource img, +.zyimage { + background-color: var(--darkreader-neutral-text) !important; +} diff --git a/config/inversion-fixes.config b/config/inversion-fixes.config new file mode 100644 index 0000000..d0e50cb --- /dev/null +++ b/config/inversion-fixes.config @@ -0,0 +1,2745 @@ +* + +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 + +================================ + +audible.com + +NO INVERT +img.adbl-cp-cursor + +================================ + +avisendanmark.dk + +INVERT +.logo + +================================ + +aws.amazon.com + +INVERT +.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 + +================================ + +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 + +================================ + +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 + +================================ + +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 + +================================ + +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/static-themes.config b/config/static-themes.config new file mode 100644 index 0000000..c8f3c17 --- /dev/null +++ b/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/icons/dm_128.png b/icons/dm_128.png new file mode 100644 index 0000000000000000000000000000000000000000..6d57d2b1d5825e82d7221ea00a68569ed01bd708 GIT binary patch literal 5958 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

9!QxvEY+S7y<* zQI*Fpj*P(22SQxua9Bo{Ev0dBSa!=9#Bk?m@gO<#pvq)8Wy3g*S7wxbm=TOHlmS|4 zxC67naWt>$QjR7cu|9^f_bgvV-*N4p^1(fYSz;D3ANG}c!l>2Xy%_Xv;JFjmJcAgl z$-2yw{s11ccM&s6b#;sabrKes#=V z=x{R~^JnkIIqKx{)SxlNy7%)`nE|!u5VJW<3Mv$v9*$!csyH|-H_L_?;{(jje^d`V zXo@P=p)X}K)r!E`bFP!u_SoU9FiL?qU)BzlCuCG6hX-D@^HiVAF1%kh#1I8IEEj({ zo1MPD&yEz%f{Gsd%+8Qw1~({C2S2K%%t}V(CA&iN4;Q>K2*>|B{G_I^<| z#O6li2>aEmX)2r zIIqB$S{LP?uKo7vufJb5#JHc1J-GD0OQDXhor8mMO53yRRvHD~R$Vk4N97CPHJhBQ zoyZoF!prIX2UZR=UlD$|_+HtcUHWkufOBOK{`99$ul@7)|MicH#q7UJxpyqA`|Te$ z_*tha#mUOe^5Wq3JpSd%a& oTP)6hv{cpq|KNjPT`hz0H-~-zVt?MdQUCw|07*qoM6N<$g1=pj3jhEB literal 0 HcmV?d00001 diff --git a/icons/dm_16.png b/icons/dm_16.png new file mode 100644 index 0000000000000000000000000000000000000000..cb9857045908657382bb21910126c077a8176dc3 GIT binary patch literal 373 zcmV-*0gC>KP)sbG7C4rIl#FCqcjP&`cO(OR zS!6GK-@niEe4&(r5JL4W%leO^=w<@Yy%>h!vI1ZnN0_EbowcrE82)_(5OOf2T)b{0 zgqj9)VBhzvyUo=#2!aEI>j2#a>b7m6sw%*E=wv;&QxW#A7-N9TJsm-hgPL>x2H_?L zuIqy5d7GB8k|cpNO*hC#2NGo3iC)~)#HE#GsbC0dn&vH*F#hZ80xw<#xVklqJTWlH!b&|{|{NmB?5a0fe*3GU=c*!%R*%T0l%y#0w$PK TsyLFK00000NkvXXu0mjf)`XK5 literal 0 HcmV?d00001 diff --git a/icons/dm_42.png b/icons/dm_42.png new file mode 100644 index 0000000000000000000000000000000000000000..490ab9ca309fbcb934409d12207eb0ca550f5869 GIT binary patch literal 1118 zcmV-k1flzhP)6yHdv|7})1G%{cYixOGrQ-+8FF-Vv~+)e|9vzXeIAd;OG%QrEXyo)XSLVs_3pyL z!k4qNvtMowNvwvgt*!5a!QfD9BOnH&G9=Ar(=9JAcl~1Lf=#UkZ^=WfBPf1C*2Olj zzm%rw#m>&oC->2yZ*OnY38e+SWpdDR5vco-uxY4~Cr1b=RL76hi$RfRP{(TcR?(nn*0+b?&c3TzrvkbWs4xJ~-8RwB5Bt<`EjcXxN&?jt~X z5@|`?dbudg+Gts^z_u?hiog~EwI)O;&7X(E;Y?7qo-K)RnxBqF zL-+bRpc5}NUE69X6!kp0=4-eB>?ccFl#le>7}{K=K+$sAAhBT5f`>pYe-25hBUD?6 z^kF>vEf|0G%bi-7V@rc-a4Zs%4~3A`G1wZ7#uOG0l**ui8&R%ZtCyv`c~Ko%mRupW z?S($H&L+^z>A94+^l-pe&s8WFWk}ytwD*XIDk~{eJY2(8S!Qjg5_r z2SdRu5W5G21a+^juGEe}i)x9Oez#gJx45`C{mr^~nrSJGEJ}}@qlg536k)mC-rjcm z`}?knoSd9Y{8XDOl=!39JPnro^Y-@ERgtHsr{=At2s& z>AjMV$^rQ+lw@UP#dSKJ&?VTs0zN)II{%;6jQ`8=OM%K9iXiLj>y`5;`RK#L!*oov zYH83=%DK6@30h5#fpzTL@<8G7LlWG2Og$`jcXyKst@|gQYPir)pq2*3Ete3htE+Bp zZ7n#s%n;}2=eb4kX%~Yl1j^2>9dQI%G>?+y36$Y6XtYD66sRU_iRA_@7kE! zX;;~zXfYB#8gWny2z4-b(s)I_K!c!Ox^j|<^1n|7>kkC9EDF}KYy7utS_QOmiT))m zs->>X_;%7uZ+vyDk|Yj&pt|mEM1Qy!ZCZO?9N+q`#~AIsr(p ktnYWvYh2cn);EjiFNn@(Qex8b7XSbN07*qoM6N<$g7V54zW@LL literal 0 HcmV?d00001 diff --git a/inject/fallback.js b/inject/fallback.js new file mode 100644 index 0000000..afe90b2 --- /dev/null +++ b/inject/fallback.js @@ -0,0 +1,31 @@ +(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/inject/index.js b/inject/index.js new file mode 100644 index 0000000..9f5c970 --- /dev/null +++ b/inject/index.js @@ -0,0 +1,5124 @@ +(function () { + "use strict"; + + 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; + } + + 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 }; + } + throw new Error(`Unable to parse ${$color}`); + } + 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 }; + } + } + throw new Error(`Unable to parse ${$hex}`); + } + 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 = parse(getComputedStyle(document.documentElement).backgroundColor); + const bodyColor = document.body ? parse(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 userAgent = typeof navigator === "undefined" ? "some useragent" : navigator.userAgent.toLowerCase(); + const platform = typeof navigator === "undefined" ? "some platform" : navigator.platform.toLowerCase(); + const isChromium = userAgent.includes("chrome") || userAgent.includes("chromium"); + 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 = userAgent.includes("safari") && !isChromium; + platform.startsWith("win"); + platform.startsWith("mac"); + 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 isDefinedSelectorSupported = (() => { + try { + document.querySelector(":defined"); + return true; + } catch (err) { + return false; + } + })(); + globalThis.chrome && + globalThis.chrome.runtime && + globalThis.chrome.runtime.getManifest && + globalThis.chrome.runtime.getManifest().manifest_version === 3; + 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", + ]; + const shorthandVarDepPropRegexps = isSafari + ? shorthandVarDependantProperties.map((prop) => { + const regexp = new RegExp(`${prop}:\\s*(.*?)\\s*;`); + return [prop, regexp]; + }) + : null; + 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(")) { + if (isSafari) { + shorthandVarDepPropRegexps.forEach(([prop, regexp]) => { + const match = cssText.match(regexp); + if (match && match[1]) { + const val = match[1].trim(); + iterate(prop, val); + } + }); + } else { + 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(/^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(); + const colorParseCache$1 = new Map(); + function parseToHSLWithCache(color) { + if (colorParseCache$1.has(color)) { + return colorParseCache$1.get(color); + } + const rgb = parse(color); + const hsl = rgbToHSL(rgb); + colorParseCache$1.set(color, hsl); + return hsl; + } + function clearColorModificationCache() { + colorModificationCache.clear(); + colorParseCache$1.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)); + } + + const MessageType = { + UI_GET_DATA: "ui-get-data", + UI_SUBSCRIBE_TO_CHANGES: "ui-subscribe-to-changes", + UI_UNSUBSCRIBE_FROM_CHANGES: "ui-unsubscribe-from-changes", + UI_CHANGE_SETTINGS: "ui-change-settings", + UI_SET_THEME: "ui-set-theme", + UI_SET_SHORTCUT: "ui-set-shortcut", + UI_TOGGLE_ACTIVE_TAB: "ui-toggle-active-tab", + UI_MARK_NEWS_AS_READ: "ui-mark-news-as-read", + UI_MARK_NEWS_AS_DISPLAYED: "ui-mark-news-as-displayed", + UI_LOAD_CONFIG: "ui-load-config", + UI_APPLY_DEV_DYNAMIC_THEME_FIXES: "ui-apply-dev-dynamic-theme-fixes", + UI_RESET_DEV_DYNAMIC_THEME_FIXES: "ui-reset-dev-dynamic-theme-fixes", + UI_APPLY_DEV_INVERSION_FIXES: "ui-apply-dev-inversion-fixes", + UI_RESET_DEV_INVERSION_FIXES: "ui-reset-dev-inversion-fixes", + UI_APPLY_DEV_STATIC_THEMES: "ui-apply-dev-static-themes", + UI_RESET_DEV_STATIC_THEMES: "ui-reset-dev-static-themes", + UI_SAVE_FILE: "ui-save-file", + UI_REQUEST_EXPORT_CSS: "ui-request-export-css", + BG_CHANGES: "bg-changes", + BG_ADD_CSS_FILTER: "bg-add-css-filter", + BG_ADD_STATIC_THEME: "bg-add-static-theme", + BG_ADD_SVG_FILTER: "bg-add-svg-filter", + BG_ADD_DYNAMIC_THEME: "bg-add-dynamic-theme", + BG_EXPORT_CSS: "bg-export-css", + BG_UNSUPPORTED_SENDER: "bg-unsupported-sender", + BG_CLEAN_UP: "bg-clean-up", + BG_RELOAD: "bg-reload", + BG_FETCH_RESPONSE: "bg-fetch-response", + BG_UI_UPDATE: "bg-ui-update", + BG_CSS_UPDATE: "bg-css-update", + CS_COLOR_SCHEME_CHANGE: "cs-color-scheme-change", + CS_FRAME_CONNECT: "cs-frame-connect", + CS_FRAME_FORGET: "cs-frame-forget", + CS_FRAME_FREEZE: "cs-frame-freeze", + CS_FRAME_RESUME: "cs-frame-resume", + CS_EXPORT_CSS_RESPONSE: "cs-export-css-response", + CS_FETCH: "cs-fetch", + CS_DARK_THEME_DETECTED: "cs-dark-theme-detected", + CS_DARK_THEME_NOT_DETECTED: "cs-dark-theme-not-detected", + }; + + 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.includes("color") && property !== "-webkit-print-color-adjust") || + property === "fill" || + property === "stroke" || + property === "stop-color" + ) { + const modifier = getColorModifier(property, value); + 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" : ""); + 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 = parse(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 = parse(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"]); + const colorParseCache = new Map(); + function parseColorWithCache($color) { + $color = $color.trim(); + if (colorParseCache.has($color)) { + return colorParseCache.get($color); + } + if ($color.includes("calc(")) { + $color = lowerCalcExpression($color); + } + const color = parse($color); + colorParseCache.set($color, color); + return color; + } + function tryParseColor($color) { + try { + return parseColorWithCache($color); + } catch (err) { + return null; + } + } + function getColorModifier(prop, value) { + if (unparsableColors.has(value.toLowerCase())) { + return value; + } + try { + const rgb = parseColorWithCache(value); + if (prop.includes("background")) { + return (filter) => modifyBackgroundColor(rgb, filter); + } + if (prop.includes("border") || prop.includes("outline")) { + return (filter) => modifyBorderColor(rgb, filter); + } + return (filter) => modifyForegroundColor(rgb, filter); + } catch (err) { + return null; + } + } + 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 = /([^\(\),]+(\([^\(\)]*(\([^\(\)]*\)*[^\(\)]*)?\))?[^\(\),]*),?/g; + const colorStopRegex = /^(from|color-stop|to)\(([^\(\)]*?,\s*)?(.*?)\)$/; + const parts = getMatches(partsRegex, match, 1).map((part) => { + part = part.trim(); + let rgb = tryParseColor(part); + if (rgb) { + return (filter) => modifyGradientColor(rgb, filter); + } + const space = part.lastIndexOf(" "); + rgb = tryParseColor(part.substring(0, space)); + if (rgb) { + return (filter) => `${modifyGradientColor(rgb, filter)} ${part.substring(space + 1)}`; + } + const colorStopMatch = part.match(colorStopRegex); + if (colorStopMatch) { + rgb = tryParseColor(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 { 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) => { + 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; + matches.forEach(({ type, match, index, typeGradient, hasComma, offset }, i) => { + const matchStart = index; + const prefixStart = matchIndex; + const matchEnd = matchStart + match.length + offset; + matchIndex = matchEnd; + prefixStart !== matchStart && modifiers.push(() => value.substring(prefixStart, matchStart)); + 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(""); + }); + } + return results.join(""); + }; + } 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 = tryParseColor(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() { + colorParseCache.clear(); + 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 = property === "color" || property === "caret-color"; + 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 (property === "color" || property === "caret-color") { + 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 = tryParseColor(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 (property === "color" || property === "caret-color") { + 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?\(/); + } + 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 = tryParseColor(newColor); + if (rgb) { + const outputColor = modifyFunction(rgb, theme); + if (isRaw) { + const outputInRGB = tryParseColor(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, {}, 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; + try { + const color = parse(srcMetaThemeColor); + meta.content = modifyBackgroundColor(color, theme); + } catch (err) {} + } + 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.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 && !element.sheet) || 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 (!isThunderbird && !(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"], 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(parse(schemeBackgroundColor), filter); + schemeTextColor = modifyForegroundColor(parse(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 proxyScript = createOrUpdateScript("darkreader--proxy"); + proxyScript.append(`(${injectProxy})(!${fixes && fixes.disableStyleSheetsProxy})`); + 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 = tryParseColor($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(); + } + function createDarkReaderInstanceMarker() { + const metaElement = document.createElement("meta"); + metaElement.name = "darkreader"; + metaElement.content = INSTANCE_ID; + document.head.appendChild(metaElement); + } + function isAnotherDarkReaderInstanceActive() { + const meta = document.querySelector('meta[name="darkreader"]'); + if (meta) { + if (meta.content !== INSTANCE_ID) { + return true; + } + return false; + } + createDarkReaderInstanceMarker(); + 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); + } + function cleanDynamicThemeCache() { + variablesStore.clear(); + parsedURLCache.clear(); + stopWatchingForDocumentVisibility(); + cancelRendering(); + stopWatchingForUpdates(); + cleanModificationCache(); + } + + function watchForColorSchemeChange(callback) { + const query = matchMedia("(prefers-color-scheme: dark)"); + const onChange = () => callback({ isDark: query.matches }); + if (isMatchMediaChangeEventListenerSupported) { + query.addEventListener("change", onChange); + } else { + query.addListener(onChange); + } + return { + disconnect() { + if (isMatchMediaChangeEventListenerSupported) { + query.removeEventListener("change", onChange); + } else { + query.removeListener(onChange); + } + }, + }; + } + + 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 = `/* + _______ + / \\ + .==. .==. + (( ))==(( )) + / "==" "=="\\ + /____|| || ||___\\ + ________ ____ ________ ___ ___ + | ___ \\ / \\ | ___ \\ | | / / + | | \\ \\ / /\\ \\ | | \\ \\| |_/ / + | | ) / /__\\ \\ | |__/ /| ___ \\ + | |__/ / ______ \\| ____ \\| | \\ \\ +_______|_______/__/ ____ \\__\\__|___\\__\\__|___\\__\\____ +| ___ \\ | ____/ / \\ | ___ \\ | ____| ___ \\ +| | \\ \\| |___ / /\\ \\ | | \\ \\| |___| | \\ \\ +| |__/ /| ____/ /__\\ \\ | | ) | ____| |__/ / +| ____ \\| |__/ ______ \\| |__/ /| |___| ____ \\ +|__| \\__\\____/__/ \\__\\_______/ |______|__| \\__\\ + +*/ + +`; + 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; + let colorSchemeWatcher = watchForColorSchemeChange(({ isDark }) => { + sendMessage({ type: MessageType.CS_COLOR_SCHEME_CHANGE, data: { isDark } }); + }); + function cleanup() { + unloaded = true; + removeEventListener("pagehide", onPageHide); + removeEventListener("freeze", onFreeze); + removeEventListener("resume", onResume); + cleanDynamicThemeCache(); + stopDarkThemeDetector(); + if (colorSchemeWatcher) { + colorSchemeWatcher.disconnect(); + colorSchemeWatcher = null; + } + } + function sendMessage(message) { + if (unloaded) { + return; + } + try { + chrome.runtime.sendMessage(message, (response) => { + if (response === "unsupportedSender") { + removeStyle(); + removeSVGFilter(); + removeDynamicTheme(); + cleanup(); + } + }); + } catch (e) { + cleanup(); + } + } + 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; + } + } + chrome.runtime.onMessage.addListener(onMessage); + sendMessage({ type: MessageType.CS_FRAME_CONNECT }); + 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 }); + } + function onDarkThemeDetected() { + sendMessage({ type: MessageType.CS_DARK_THEME_DETECTED }); + } + if (!isThunderbird) { + addEventListener("pagehide", onPageHide); + addEventListener("freeze", onFreeze); + addEventListener("resume", onResume); + } +})(); diff --git a/inject/sub-success-handler.js b/inject/sub-success-handler.js new file mode 100644 index 0000000..9c7a474 --- /dev/null +++ b/inject/sub-success-handler.js @@ -0,0 +1,33 @@ +// Listen for subscription status updates from the webpage +window.addEventListener( + 'message', + function (event) { + // Validate message structure and origin + if (!event.data || typeof event.data !== 'object') return + + const { type, text } = event.data + + // Verify all required fields are present and valid + if ( + type === 'FROM_PAGE' && + text?.type === 'subscription_status' && + text?.extensionId === chrome.runtime.id && + typeof text?.status === 'string' + ) { + // Log the validated message + console.log('Subscription status update received:', text.status) + + chrome.storage.sync.set( + { dm_subscription_status: text.status.toLowerCase() }, + () => { + console.log('Subscription status updated:', text.status) + } + ) + + if (text.status.toLowerCase() === 'active') { + chrome.storage.sync.remove('dm_clicks_count', () => {}) + } + } + }, + false +) diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..a673c3d --- /dev/null +++ b/manifest.json @@ -0,0 +1,63 @@ +{ + "update_url": "https://clients2.google.com/service/update2/crx", + "manifest_version": 3, + "name": "__MSG_appName__", + "version": "4.9.61", + "description": "__MSG_appDesc__", + "default_locale": "en", + "icons": { + "16": "icons/dm_16.png", + "42": "icons/dm_42.png", + "128": "icons/dm_128.png" + }, + "background": { + "service_worker": "background.js" + }, + "content_scripts": [ + { + "matches": [""], + "js": ["inject/fallback.js", "inject/index.js"], + "run_at": "document_start", + "all_frames": true, + "match_about_blank": true + }, + { + "matches": ["https://get-premium.online/*", "http://localhost:8000/*"], + "js": ["inject/sub-success-handler.js"], + "run_at": "document_start", + "all_frames": true, + "match_about_blank": true + } + ], + "permissions": [ + "alarms", + "fontSettings", + "scripting", + "tabs", + "storage", + "unlimitedStorage" + ], + "commands": { + "toggle": { + "suggested_key": { + "default": "Alt+Shift+D" + }, + "description": "__MSG_toggle_extension__" + }, + "addSite": { + "suggested_key": { + "default": "Alt+Shift+A" + }, + "description": "__MSG_toggle_current_site__" + } + }, + "action": { + "default_title": "Dark Mode Google Docs", + "default_icon": { + "16": "icons/dm_16.png", + "42": "icons/dm_42.png" + }, + "default_popup": "ui/popup/index.html" + }, + "host_permissions": ["*://*/*"] +} diff --git a/ui/assets/fonts/LICENSE.txt b/ui/assets/fonts/LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/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/ui/assets/fonts/OpenSans-Light.ttf b/ui/assets/fonts/OpenSans-Light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6580d3a169e895d914f159c060b947e36746f275 GIT binary patch literal 101696 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

_T_kl)Xoan=RX{3lY#VQTZ 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 literal 0 HcmV?d00001 diff --git a/ui/assets/fonts/OpenSans-SemiBold.ttf b/ui/assets/fonts/OpenSans-SemiBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..54e7059cf36359cb5a3860085714a95306af0dea GIT binary patch literal 100820 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 DEZ%x^ literal 0 HcmV?d00001 diff --git a/ui/assets/images/darkreader-icon-256x256.png b/ui/assets/images/darkreader-icon-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..6d57d2b1d5825e82d7221ea00a68569ed01bd708 GIT binary patch literal 5958 zcmV-M7rE$(P){r&xG z%fr9F`|i8f%0qxz8H_7et~|RO^q=3nd2@d2)~&Ksf>k(n=&ItzfTP0jz+!rp7UA;t z#8w(;%G8U;h>v`&!OGY` z$${5cR@9006Fbe9>2_WThAF^u@PEGilY?1-9jFFU*>eo<9ehj^45XNYZG4pP6p-VO z!slhjnP7+lEIZ((rM;hHSnae*^%dNCIFm4pl?2o9taJ(!$69y&tJi3XFg=$S=>u#6 zkX4{f^RmNAFhl{q{r1}*ExqI8Yo0}p_SwcOO2)yDYo=x_56?NTax9hqfy$x$092MR z2W3Z_@2b(bTA!8~K1|92UnpeJqD@VyJ z9MpN)5hWP540N+Dt`}kjz_Tqpc4bPk{0KETD$dPzrEtnju}oagt|-9}1;{*VOk+Cg zlmo}6+DL=zGeLd}n)rM+QrYOsFPi(6a z3^M`Bnak2;juxiLs9M?j%p7r;x+%po-zkhUDbA_gRwWp=3JB+o!A=+3e5TxWpgeQ- zCo)u-vEFPe*wvlM&28I8B^agvYW6#u-g2g}Or~&5=bkl)I#d|ui&aOI5sF+9%CK1E z_aKyVIDcdtnP8X+2q=55Y`1doTDF=MC`%Jzc*Jzf7F?!t2Du%aUbUCgh7!E^;*0-N z9x#SFfsP3{4O4%Qt<{puaz4(x4oJ}+s1gic1-O|LVQzp_naXj*`r_Q>=RsvzP$p%@ zoV{m-Zz(h96(;e4DZx+^fKandIb==|FfBV|5s#gUYxD|s?lQlF>s2zdyr`JU$7uD3 zXzv42f=LuW&Hi<15@(irw2KESW;?S44wzFyMe}Y+$TD(%msW*|H1}NzhTjgZe=!@C z!-aX+Zm(Mxg6qQavpU?2bT_3?26f%*HzZ~KYUvud=-#gtIi1ecFLlhJ5`4= zImjTqjm!C+x33fpWp`lqa_Nl%{^Wis!6Z(g>lo*FIs5DeK-J9y$@ZJ;%gTtb*82;} z1h8L_`2!8+yDv&G^m%{^)fos!h0gI(rh?1lTep#h2dJ0Ql>(v+nLnc#f|bZQmK?u4 zPOb#QZwI%$U`&H)*=uh(Xk0e43;P2-vbzDnxNp9>+oeRUx|ICrvq0KOm0&mnRJa+E z+3BEMHG`Cw-SRKkEJeQ7;I))yfB$Z`Emul>MogvzlRXgP!W8|*QQ7gVK4g;21i7>< zlamF@JUl!ofBoz2k|C?Zg*np*m_!MN?*ph##Bg@D0xn!Rh$@eAtk8*5X_X9dWS<1f zy?y(3`R=>@Q*vTC%H(AZZT4U*oDWxmp(en+f`!Le_Ql3c51qP>QjS^{7YgCbhdXCe zvXr9Sym_4z%8Bu@obV5g~pjxe=8=Z;dd9%ogg#|vp99czdGjsIRE<* z^Qyn2_{%@|!N1Ht{qzs-mkn^f41jW?;^+nm^D6u7XgPrPoo6_f$+EEN>Gcr=6(8YX zDa+x~G5luvSCu#vHe@eHVQ8K>?nF(;Y5rc{g7To!E`GB7_j=g?LlgkPl&okCJDNKc zXDOy-Ho!s7d|vGrcQrq$Df zuKWw$3{qt<1Mq{Z%mgS8zcz+tIhikByto!~vHz2mpOv`@Cc7D=s6LKJ*{mdP_HtNn zXE_FlFq9dYMKJ?AZ&*g8yKv!x^=B}Q>sB(V`dHpgG4!e6b+xl6kFxXYmaDvOHX|xN ze1?{MxcaC#ckbK?CBQf*Q$XFtg8h0C>&u6>Rg}pec_(&heF*o0A;fX#uEk4-6_y9Zh} z#n8vXRYR5cjtbGzX6_K@Sm7gFssp)96{e^e>ru?&mDVS_laX2fcN|%`kmWA0&orgJ4ZErCOe{+%RI4g#)0^%Bv&Vk``E(aTn zro+*pqi4ke&OBfmJaRp1z}Q4_Sry70M475@lpp#qvUMZMXIC43%~sRA9tNQ*bDRC#K{Y-<>Roh0Q0WOT~qw9>US-+9}Pg>ZGk zK1$}tD6_=z3*!*85=6YS>)hsbU$k);{#bZ8S!zaSw5DiPbz)XO4<5#IdL=u?F|}9l z_Xt$mxJ*_)gi->DP1FifEHQPCji&JH&c$HRBwX45|WlKc79;pPAJrAIkN^0hD+7rT= zC04}obtacmE=FshBaJHG?L2arGJjkSw$0TyN(m-;BB(++Vm)cq<6xW~X_-A^NAJq_ zaGjVjjdRRgnU29+y6_2Fw7+%BzzWq^cgs{Mh?=EbHY*bjx*9lsScB6$#biZ78B`pn zQ3{du0h=K-2if};n_{RBP_d3+87pua7awV`47K~l8$Fm$F@~a9UL|mO%Kj_4UHP28 zDgm>>Xbk^K*gEuzo!A!s}LoZ>IamG`-E>L<8f2mmyblTZO6v(RA`=pRi-uDnbcH&HTW9*$8s8yfrgbI(GcB@|@XFW{T7C zY*scutGhKrm6=h>gQyBH+9#Mq0hEB;xtUV5wr%;CIbK;uvs|qIt8guY%<Z2v%rnoFH{N)o>?&S+?X~jBC!eg&omq1%wrDub)f{Y! zVGIzrbkTWoGtAjnPV+E;nJY5^JwadV^X8uA&_C#~9 z8STXo6TtQisf)wnJkYxm*kwdpoRYhxCB|b|lsN*EekH8J(G@BPYj)&&7?c19&)t`( z;1^q5zXY5@t&5=ypq#x5Y?#wx%pc~YqJEL<`t|E&SHXJ`(KfzCjvvm7csIbz8k=AU zk6gZdd9hfmx8Kca`P)3IEVaB+;P@WuRAsl?kS#T_uFT#$St?q)g%ww?UfpO6hu;l6 zE|^~AP@X@piL=4SdKQiS2Che~Ok5tf9f3(JW(HW^c3k`G13AO8d! zr{Oh!mWJW(2k;=fn>3jmu032=)^^4$S^i~IXy(E9(t5=6EZAkV`X$0LhEjgU2nHCw40Lu%*?9)r?}r7>rU%rQ zRRZXcD#v+K41FfBhnkq~S?k@WVRjWQ7E`Muo>1yDba=f9Ciy~0pf%fFUha^G0a;&Q z8fMLGDY@o33jvb^)oJJLP|oD#KGAS!*!)@HL$#Z~$1 zHEwk)-w506%I!(JE`}`wTi0rEFk(w;E6iujVE zXXYw~;5>@WHo+vXhw}hBTON&VZE)bykn=hZ*_EdlM?o#qusuq#IZd2nomeKHv&@{% zO{PsS*?R#zyVNGp%&Z<9^*P!_IAv3vjtbPv1Wq1x-72RAb;B#WJ_{zf8(4vqs0KxK zD$k-`=LqAm3^n6axH2~?+$oAu+@4wPfIbK3SMA#bL!CfHcX;k-mz_B*_o=6zDp#&t zIhD>01e*m`C{`@4GczlyY*ikX`_@};mCrx_e67K9ip_B&Fl;LrmpK(Upu8;Pyl4tI z&!dk%TAqIT>9VVMMCl$p~jnYq30^LZ#ous}G3YK65aCVwJ`DPM(SdOY@mJ6f?ymY!wK>gTrh zD5yF|M$Gzx&4O#wSuxpGa4U{GOi^A|UQc?rm5OnyL*1Z6SdrgHue$QGP- zQw;S1vVnBYAlt&Y4*U7oV~?%=*imx8{BhlK8hIvXELNSmJ9qBbSXUWc zCtU9)7`h5jgWMXd*37B*0=DTBF>k*4W_jbDowHxoE78MlPaN-SM5hZ2*3*MhzCuezlrlR$z0doJs7@ z(LTYD>Gj-m&vmP1&(doXxQ=h-sbH4E@AhQ*Fi)H-Z$6t4Tn4WWxa>G?#V2AInH|T@ zjcYa+DxV8;voI?c^F=)RFY&?4mf~<7IOv!Lk1BthJ9FTCiLG%05vZXpnrEtPQ5-j# zJCO6uX8!&H%Eq^8dpvffTrCHV+o9T@VQZa0)%h6<#5LMWWj7JoJ_FX9%|7LbqP#sb z8uPhX=-TSyxoieL7&2nkBPRRNDE4^W%*DoKZRW7Gh`4rnIrcim+2O?X) zuZ*(t+JB@H3^f5bi}{01%o5Ql?xj%9lf|5RQ(vP;`mMEp7x#R%ulmM$Y`e&|ePaM)k}HwwsP7RbEb$+0I#GX{Oi

9!QxvEY+S7y<* zQI*Fpj*P(22SQxua9Bo{Ev0dBSa!=9#Bk?m@gO<#pvq)8Wy3g*S7wxbm=TOHlmS|4 zxC67naWt>$QjR7cu|9^f_bgvV-*N4p^1(fYSz;D3ANG}c!l>2Xy%_Xv;JFjmJcAgl z$-2yw{s11ccM&s6b#;sabrKes#=V z=x{R~^JnkIIqKx{)SxlNy7%)`nE|!u5VJW<3Mv$v9*$!csyH|-H_L_?;{(jje^d`V zXo@P=p)X}K)r!E`bFP!u_SoU9FiL?qU)BzlCuCG6hX-D@^HiVAF1%kh#1I8IEEj({ zo1MPD&yEz%f{Gsd%+8Qw1~({C2S2K%%t}V(CA&iN4;Q>K2*>|B{G_I^<| z#O6li2>aEmX)2r zIIqB$S{LP?uKo7vufJb5#JHc1J-GD0OQDXhor8mMO53yRRvHD~R$Vk4N97CPHJhBQ zoyZoF!prIX2UZR=UlD$|_+HtcUHWkufOBOK{`99$ul@7)|MicH#q7UJxpyqA`|Te$ z_*tha#mUOe^5Wq3JpSd%a& oTP)6hv{cpq|KNjPT`hz0H-~-zVt?MdQUCw|07*qoM6N<$g1=pj3jhEB literal 0 HcmV?d00001 diff --git a/ui/assets/images/darkreader-type.svg b/ui/assets/images/darkreader-type.svg new file mode 100644 index 0000000..05ba2a9 --- /dev/null +++ b/ui/assets/images/darkreader-type.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/assets/images/mode-dark-32.svg b/ui/assets/images/mode-dark-32.svg new file mode 100644 index 0000000..05ba2a9 --- /dev/null +++ b/ui/assets/images/mode-dark-32.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/assets/images/mode-light-32.svg b/ui/assets/images/mode-light-32.svg new file mode 100644 index 0000000..05ba2a9 --- /dev/null +++ b/ui/assets/images/mode-light-32.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/popup/app.js b/ui/popup/app.js new file mode 100644 index 0000000..b4ed4f8 --- /dev/null +++ b/ui/popup/app.js @@ -0,0 +1 @@ +(()=>{"use strict";var e={101:function(e,t,n){var i=this&&this.__awaiter||function(e,t,n,i){return new(n||(n=Promise))((function(r,o){function s(e){try{a(i.next(e))}catch(e){o(e)}}function u(e){try{a(i.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,u)}a((i=i.apply(e,t||[])).next())}))},r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.SubscriptionManager=void 0;const o=n(167),s=n(135),u=r(n(554)),a=n(162);var c;!function(e){e.FREE="free",e.ACTIVE="active"}(c||(c={})),t.SubscriptionManager=class{constructor(){this.baseUrl="https://get-premium.online",this.storage=(0,o.getStorageAdapter)(),this.subscriptionStatusKey="dm_subscription_status",this.clicksCountKey="dm_clicks_count",this.extensionId=(0,s.getExtensionId)(),this.processUrl=`${this.baseUrl}/subscriptions/process-payment-start/?product_id=${this.extensionId}`,this.clicksAllowed=parseInt("5"),this.siteToggleClickCount=0,this.status=c.FREE,this.siteToggleButtonEl=null,this.getProButtonEl=null,this.proPopoverEl=null,this.restoreLinkEl=null,this.tabsPanelEl=null,this.toggleClickHandler=null,this.appToggleClickHandler=null,this.appTogglePanelEl=null}get isPro(){return this.status===c.ACTIVE}get isFreeClickAllowed(){return this.siteToggleClickCounti(this,void 0,void 0,(function*(){this.siteToggleClickCount+=1,yield this.updateDataInStorage(),this.checkStatusAndUpdateUI()})),this.siteToggleButtonEl.addEventListener("click",this.toggleClickHandler))}addAppToggleClickHandler(){this.appTogglePanelEl&&!this.appToggleClickHandler&&(this.appToggleClickHandler=()=>i(this,void 0,void 0,(function*(){this.siteToggleClickCount+=1,yield this.updateDataInStorage(),this.checkStatusAndUpdateUI()})),this.appTogglePanelEl.addEventListener("click",this.appToggleClickHandler))}removeToggleClickHandler(){this.siteToggleButtonEl&&this.toggleClickHandler&&(this.siteToggleButtonEl.removeEventListener("click",this.toggleClickHandler),this.toggleClickHandler=null)}removeAppToggleClickHandler(){this.appTogglePanelEl&&this.appToggleClickHandler&&(this.appTogglePanelEl.removeEventListener("click",this.appToggleClickHandler),this.appToggleClickHandler=null)}checkStatusAndUpdateUI(){var e,t,n;this.siteToggleButtonEl&&(this.isFreeClickAllowed?(null===(e=this.getProButtonEl)||void 0===e||e.remove(),null===(t=this.restoreLinkEl)||void 0===t||t.remove(),null===(n=this.proPopoverEl)||void 0===n||n.remove(),this.appTogglePanelEl&&(this.appTogglePanelEl.style.opacity="1"),this.tabsPanelEl&&(this.tabsPanelEl.style.opacity="1")):(this.renderProPopover(),this.renderProButton(),this.renderRestoreLink(),this.removeToggleClickHandler(),this.removeAppToggleClickHandler(),this.appTogglePanelEl&&(this.appTogglePanelEl.style.opacity="0.3"),this.tabsPanelEl&&(this.tabsPanelEl.style.opacity="0.3"),u.default.track({event_type:"pro_button_rendered"})))}renderSubscriptionUi(){this.siteToggleButtonEl&&(this.isFreeClickAllowed?(this.addToggleClickHandler(),this.addAppToggleClickHandler()):this.checkStatusAndUpdateUI())}renderSupportLink(){(0,a.renderSupportLink)()}}},135:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getExtensionId=t.hashToFloatWithCohort=t.generateUUID=void 0,t.generateUUID=function(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(e=>{const t=15&crypto.getRandomValues(new Uint8Array(1))[0];return("x"===e?t:3&t|8).toString(16)}))},t.hashToFloatWithCohort=function(e,t){const n=`${e}-${t}`;let i=0;for(let e=0;e>>0)/4294967295},t.getExtensionId=function(){return"undefined"!=typeof chrome&&chrome.runtime&&chrome.runtime.id?chrome.runtime.id:""}},162:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.renderSupportLink=t.createRestoreLink=t.createProPopoverElement=t.createProButton=void 0,t.createProButton=function(e,t,n){const i=document.createElement("button");return i.className="get-pro-button",i.textContent="🔥 Get Unlimited Dark Mode",i.style.position="absolute",i.style.top=e.offsetTop-2+"px",i.style.left=e.offsetLeft-2+"px",i.style.width=e.offsetWidth+4+"px",i.style.height=e.offsetHeight+2+"px",i.style.backgroundColor="#4CAF50",i.style.color="white",i.style.border="none",i.style.cursor="pointer",i.style.zIndex="1000",i.style.fontWeight="bold",i.style.borderRadius="4px",i.style.transition="all 0.3s ease",i.style.transform="scale(1)",i.style.boxShadow="0 2px 4px rgba(0,0,0,0.2)",i.addEventListener("mouseenter",(()=>{i.style.backgroundColor="#45a049",i.style.boxShadow="0 4px 8px rgba(0,0,0,0.3)"})),i.addEventListener("mouseleave",(()=>{i.style.backgroundColor="#4CAF50",i.style.boxShadow="0 2px 4px rgba(0,0,0,0.2)"})),i.addEventListener("click",(e=>{e.stopPropagation(),window.open(t,"_blank","noopener,noreferrer")})),n.appendChild(i),i},t.createProPopoverElement=function(){const e=document.createElement("div");return e.className="popover",e.style.position="absolute",e.style.top="0",e.style.left="0",e.style.width="100%",e.style.height="100%",e.style.zIndex="1000",e.style.border="none",window.document.body.appendChild(e),e},t.createRestoreLink=function(e,t){const n=document.createElement("span");n.innerHTML='',n.style.width="10px",n.style.height="10px",n.style.marginLeft="5px",n.style.fill="#4CAF50",n.style.display="inline-block";const i=document.createElement("a");i.href=e,i.target="_blank",i.rel="noopener noreferrer",i.appendChild(document.createTextNode("Restore subscription")),i.appendChild(n),i.style.display="block",i.style.textAlign="center",i.style.color="#4CAF50",i.style.textDecoration="underline",i.style.margin="10px 0",i.style.fontSize="14px",i.style.position="absolute",i.style.bottom="18px",i.style.left="0",i.style.width="100%",i.addEventListener("mouseenter",(()=>{i.style.textDecoration="underline"})),i.addEventListener("mouseleave",(()=>{i.style.textDecoration="none"})),t.appendChild(i);const r=document.createElement("span");return r.textContent="Contact us: sup@dark-mode-docs.help",r.style.display="block",r.style.textAlign="center",r.style.color="#rgb(83, 161, 179)",r.style.textDecoration="none",r.style.margin="10px 0",r.style.fontSize="11px",r.style.position="absolute",r.style.bottom="0",r.style.left="0",r.style.width="100%",t.appendChild(r),i},t.renderSupportLink=function(){if(document.querySelector(".dm-support-link"))return null;const e=document.querySelector(".tab-panel");if(!e)return null;const t=document.createElement("div");return t.className="dm-support-link",t.textContent="Contact us: sup@dark-mode-docs.help",t.style.display="block",t.style.margin="10px 0",t.style.textDecoration="none",t.style.color="#7d98ff",t.style.fontSize="12px",t.style.textAlign="center",t.style.transition="opacity 0.3s ease",t.style.paddingBottom="10px",e.appendChild(t),t}},167:function(e,t){var n=this&&this.__awaiter||function(e,t,n,i){return new(n||(n=Promise))((function(r,o){function s(e){try{a(i.next(e))}catch(e){o(e)}}function u(e){try{a(i.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,u)}a((i=i.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.getStorageAdapter=t.MemoryStorageAdapter=t.ChromeStorageSyncAdapter=void 0;class i{get(e){return n(this,void 0,void 0,(function*(){return new Promise((t=>{chrome.storage.sync.get([e],(n=>{var i;t(null!==(i=n[e])&&void 0!==i?i:null)}))}))}))}set(e,t){return n(this,void 0,void 0,(function*(){return new Promise((n=>{chrome.storage.sync.set({[e]:t},(()=>n()))}))}))}remove(e){return n(this,void 0,void 0,(function*(){return new Promise((t=>{chrome.storage.sync.remove([e],(()=>t()))}))}))}subscribe(e,t){function n(n,i){var r;"sync"===i&&n[e]&&t(null!==(r=n[e].newValue)&&void 0!==r?r:null)}return chrome.storage.onChanged.addListener(n),()=>chrome.storage.onChanged.removeListener(n)}}t.ChromeStorageSyncAdapter=i;class r{constructor(){this.store={},this.listeners={}}get(e){return n(this,void 0,void 0,(function*(){var t;return null!==(t=this.store[e])&&void 0!==t?t:null}))}set(e,t){return n(this,void 0,void 0,(function*(){this.store[e]=t,this.listeners[e]&&this.listeners[e].forEach((e=>e(t)))}))}remove(e){return n(this,void 0,void 0,(function*(){delete this.store[e],this.listeners[e]&&this.listeners[e].forEach((e=>e(null)))}))}clear(){this.store={}}subscribe(e,t){return this.listeners[e]||(this.listeners[e]=[]),this.listeners[e].push(t),()=>{this.listeners[e]=this.listeners[e].filter((e=>e!==t))}}}t.MemoryStorageAdapter=r;const o=new r;t.getStorageAdapter=function(){return"undefined"!=typeof chrome&&chrome.storage&&chrome.storage.sync?new i:o}},174:function(e,t,n){var i=this&&this.__awaiter||function(e,t,n,i){return new(n||(n=Promise))((function(r,o){function s(e){try{a(i.next(e))}catch(e){o(e)}}function u(e){try{a(i.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,u)}a((i=i.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.isFeatureEnabled=void 0;const r=n(135),o=n(167),s="dm_user_uuid",u="dm_rollout_config_cache",a=(0,o.getStorageAdapter)();function c(){return i(this,void 0,void 0,(function*(){try{const e=yield a.get(u);return e?JSON.parse(e):null}catch(e){return null}}))}t.isFeatureEnabled=function(){return i(this,void 0,void 0,(function*(){const e=yield function(){return i(this,void 0,void 0,(function*(){let e=(yield a.get(s))||"";return e||(e=(0,r.generateUUID)(),yield a.set(s,e)),e}))}();let t=null,n=null;try{t=yield function(){return i(this,void 0,void 0,(function*(){try{const e=yield fetch("https://getcountry.cloudsearch.workers.dev/");if(!e.ok)throw new Error(`Failed to fetch country: ${e.status} ${e.statusText}`);return(yield e.text()).toUpperCase()}catch(e){const t=e instanceof Error?e.message:String(e);throw new Error(`Failed to get user country: ${t}`)}}))}()}catch(e){console.warn("Failed to get user country:",e);const t=yield c();if(!t)return!1;n=t}if(!n&&t)try{n=yield function(e){return i(this,void 0,void 0,(function*(){const t=(0,r.getExtensionId)(),n=yield fetch("https://get-premium.online/api/v1/rollout-config/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({product_id:t,country_code:e})});if(!n.ok)throw new Error("Failed to fetch rollout config from server");return n.json()}))}(t),yield function(e){return i(this,void 0,void 0,(function*(){try{yield a.set(u,JSON.stringify(e))}catch(e){}}))}(n)}catch(e){n=yield c()}return!!n&&(!(!n.percent||!n.country)&&((0,r.hashToFloatWithCohort)(e,String(t))<=n.percent/100||(yield a.remove("dm_subscription_status"),!1)))}))}},292:(e,t,n)=>{n.r(t),n.d(t,{Identify:()=>M,Revenue:()=>F,Types:()=>i,add:()=>Rt,createInstance:()=>kt,extendSession:()=>Ut,flush:()=>At,getDeviceId:()=>Lt,getSessionId:()=>Dt,getUserId:()=>Nt,groupIdentify:()=>jt,identify:()=>qt,init:()=>Mt,logEvent:()=>Ft,remove:()=>Bt,reset:()=>Vt,revenue:()=>Kt,runQueuedFunctions:()=>xe,setDeviceId:()=>$t,setGroup:()=>Ht,setOptOut:()=>zt,setSessionId:()=>Wt,setTransport:()=>Qt,setUserId:()=>Jt,track:()=>Yt});var i={};n.r(i),n.d(i,{DEFAULT_ACTION_CLICK_ALLOWLIST:()=>Ct,DEFAULT_CSS_SELECTOR_ALLOWLIST:()=>xt,DEFAULT_DATA_ATTRIBUTE_PREFIX:()=>Ot,IdentifyOperation:()=>A,LogLevel:()=>s,OfflineDisabled:()=>Te,RevenueProperty:()=>L,ServerZone:()=>Tt,SpecialEventType:()=>D,Status:()=>f});var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)};function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var s,u=function(){return u=Object.assign||function(e){for(var t,n=1,i=arguments.length;n0&&r[r.length-1])||6!==u[0]&&2!==u[0])){o=0;continue}if(3===u[0]&&(!r||u[1]>r[0]&&u[1]=e.length&&(e=void 0),{value:e&&e[i++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function p(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var i,r,o=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(i=o.next()).done;)s.push(i.value)}catch(e){r={error:e}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return s}function h(e,t,n){if(n||2===arguments.length)for(var i,r=0,o=t.length;r>e/4).toString(16):(String(1e7)+String(-1e3)+String(-4e3)+String(-8e3)+String(-1e11)).replace(/[018]/g,R)};function U(e){var t="";try{"body"in e&&(t=JSON.stringify(e.body,null,2))}catch(e){}return t}var A,L,D,N=function(){function e(){this.name="amplitude",this.type="destination",this.retryTimeout=1e3,this.throttleTimeout=3e4,this.storageKey="",this.scheduleId=null,this.scheduledTimeout=0,this.flushId=null,this.queue=[]}return e.prototype.setup=function(e){var t;return c(this,void 0,void 0,(function(){var n,i=this;return l(this,(function(r){switch(r.label){case 0:return this.config=e,this.storageKey="".concat(E,"_").concat(this.config.apiKey.substring(0,10)),[4,null===(t=this.config.storageProvider)||void 0===t?void 0:t.get(this.storageKey)];case 1:return(n=r.sent())&&n.length>0&&Promise.all(n.map((function(e){return i.execute(e)}))).catch(),[2,Promise.resolve(void 0)]}}))}))},e.prototype.execute=function(e){var t=this;return e.insert_id||(e.insert_id=R()),new Promise((function(n){var i={event:e,attempts:0,callback:function(e){return n(e)},timeout:0};t.queue.push(i),t.schedule(t.config.flushIntervalMillis),t.saveEvents()}))},e.prototype.removeEventsExceedFlushMaxRetries=function(e){var t=this;return e.filter((function(e){return e.attempts+=1,e.attemptsthis.scheduledTimeout?(this.scheduleId&&clearTimeout(this.scheduleId),this.scheduledTimeout=e,void(this.scheduleId=setTimeout((function(){t.queue=t.queue.map((function(e){return e.timeout=0,e})),t.flush(!0)}),e))):void 0},e.prototype.resetSchedule=function(){this.scheduleId=null,this.scheduledTimeout=0},e.prototype.flush=function(e){return void 0===e&&(e=!1),c(this,void 0,void 0,(function(){var t,n,i=this;return l(this,(function(r){switch(r.label){case 0:return this.config.offline?(this.resetSchedule(),this.config.loggerProvider.debug("Skipping flush while offline."),[2]):this.flushId?(this.resetSchedule(),this.config.loggerProvider.debug("Skipping flush because previous flush has not resolved."),[2]):(this.flushId=this.scheduleId,this.resetSchedule(),t=[],n=[],this.queue.forEach((function(e){return 0===e.timeout?t.push(e):n.push(e)})),o=t,s=this.config.flushQueueSize,u=Math.max(s,1),[4,o.reduce((function(e,t,n){var i=Math.floor(n/u);return e[i]||(e[i]=[]),e[i].push(t),e}),[]).reduce((function(t,n){return c(i,void 0,void 0,(function(){return l(this,(function(i){switch(i.label){case 0:return[4,t];case 1:return i.sent(),[4,this.send(n,e)];case 2:return[2,i.sent()]}}))}))}),Promise.resolve())]);case 1:return r.sent(),this.flushId=null,this.scheduleEvents(this.queue),[2]}var o,s,u}))}))},e.prototype.send=function(e,t){return void 0===t&&(t=!0),c(this,void 0,void 0,(function(){var n,i,r,o,s;return l(this,(function(u){switch(u.label){case 0:if(!this.config.apiKey)return[2,this.fulfillRequest(e,400,"Event rejected due to missing API key")];n={api_key:this.config.apiKey,events:e.map((function(e){var t=e.event;return t.extra,a(t,["extra"])})),options:{min_id_length:this.config.minIdLength},client_upload_time:(new Date).toISOString(),request_metadata:this.config.requestMetadata},this.config.requestMetadata=new C,u.label=1;case 1:return u.trys.push([1,3,,4]),i=O(this.config.serverUrl,this.config.serverZone,this.config.useBatch).serverUrl,[4,this.config.transportProvider.send(i,n)];case 2:return null===(r=u.sent())?(this.fulfillRequest(e,0,"Unexpected error occurred"),[2]):t?(this.handleResponse(r,e),[3,4]):("body"in r?this.fulfillRequest(e,r.statusCode,"".concat(r.status,": ").concat(U(r))):this.fulfillRequest(e,r.statusCode,r.status),[2]);case 3:return o=u.sent(),s=(c=o)instanceof Error?c.message:String(c),this.config.loggerProvider.error(s),this.handleResponse({status:f.Failed,statusCode:0},e),[3,4];case 4:return[2]}var c}))}))},e.prototype.handleResponse=function(e,t){var n=e.status;switch(n){case f.Success:this.handleSuccessResponse(e,t);break;case f.Invalid:this.handleInvalidResponse(e,t);break;case f.PayloadTooLarge:this.handlePayloadTooLargeResponse(e,t);break;case f.RateLimit:this.handleRateLimitResponse(e,t);break;default:this.config.loggerProvider.warn("{code: 0, error: \"Status '".concat(n,"' provided for ").concat(t.length,' events"}')),this.handleOtherResponse(t)}},e.prototype.handleSuccessResponse=function(e,t){this.fulfillRequest(t,e.statusCode,"Event tracked successfully")},e.prototype.handleInvalidResponse=function(e,t){var n=this;if(e.body.missingField||e.body.error.startsWith("Invalid API key"))this.fulfillRequest(t,e.statusCode,e.body.error);else{var i=h(h(h(h([],p(Object.values(e.body.eventsWithInvalidFields)),!1),p(Object.values(e.body.eventsWithMissingFields)),!1),p(Object.values(e.body.eventsWithInvalidIdLengths)),!1),p(e.body.silencedEvents),!1).flat(),r=new Set(i),o=t.filter((function(t,i){if(!r.has(i))return!0;n.fulfillRequest([t],e.statusCode,e.body.error)}));o.length>0&&this.config.loggerProvider.warn(U(e));var s=this.removeEventsExceedFlushMaxRetries(o);this.scheduleEvents(s)}},e.prototype.handlePayloadTooLargeResponse=function(e,t){if(1!==t.length){this.config.loggerProvider.warn(U(e)),this.config.flushQueueSize/=2;var n=this.removeEventsExceedFlushMaxRetries(t);this.scheduleEvents(n)}else this.fulfillRequest(t,e.statusCode,e.body.error)},e.prototype.handleRateLimitResponse=function(e,t){var n=this,i=Object.keys(e.body.exceededDailyQuotaUsers),r=Object.keys(e.body.exceededDailyQuotaDevices),o=e.body.throttledEvents,s=new Set(i),u=new Set(r),a=new Set(o),c=t.filter((function(t,i){if(!(t.event.user_id&&s.has(t.event.user_id)||t.event.device_id&&u.has(t.event.device_id)))return a.has(i)&&(t.timeout=n.throttleTimeout),!0;n.fulfillRequest([t],e.statusCode,e.body.error)}));c.length>0&&this.config.loggerProvider.warn(U(e));var l=this.removeEventsExceedFlushMaxRetries(c);this.scheduleEvents(l)},e.prototype.handleOtherResponse=function(e){var t=this,n=e.map((function(e){return e.timeout=e.attempts*t.retryTimeout,e})),i=this.removeEventsExceedFlushMaxRetries(n);this.scheduleEvents(i)},e.prototype.fulfillRequest=function(e,t,n){this.removeEvents(e),e.forEach((function(e){return e.callback(I(e.event,t,n))}))},e.prototype.saveEvents=function(){if(this.config.storageProvider){var e=this.queue.map((function(e){return e.event}));this.config.storageProvider.set(this.storageKey,e)}},e.prototype.removeEvents=function(e){this.queue=this.queue.filter((function(t){return!e.some((function(e){return e.event.insert_id===t.event.insert_id}))})),this.saveEvents()},e}();!function(e){e.SET="$set",e.SET_ONCE="$setOnce",e.ADD="$add",e.APPEND="$append",e.PREPEND="$prepend",e.REMOVE="$remove",e.PREINSERT="$preInsert",e.POSTINSERT="$postInsert",e.UNSET="$unset",e.CLEAR_ALL="$clearAll"}(A||(A={})),function(e){e.REVENUE_PRODUCT_ID="$productId",e.REVENUE_QUANTITY="$quantity",e.REVENUE_PRICE="$price",e.REVENUE_TYPE="$revenueType",e.REVENUE_CURRENCY="$currency",e.REVENUE="$revenue"}(L||(L={})),function(e){e.IDENTIFY="$identify",e.GROUP_IDENTIFY="$groupidentify",e.REVENUE="revenue_amount"}(D||(D={}));var j=function(e){if(Object.keys(e).length>1e3)return!1;for(var t in e){var n=e[t];if(!q(t,n))return!1}return!0},q=function(e,t){var n,i;if("string"!=typeof e)return!1;if(Array.isArray(t)){var r=!0;try{for(var o=d(t),s=o.next();!s.done;s=o.next()){var u=s.value;if(Array.isArray(u))return!1;if("object"==typeof u)r=r&&j(u);else if(!["number","string"].includes(typeof u))return!1;if(!r)return!1}}catch(e){n={error:e}}finally{try{s&&!s.done&&(i=o.return)&&i.call(o)}finally{if(n)throw n.error}}}else{if(null==t)return!1;if("object"==typeof t)return j(t);if(!["number","string","boolean"].includes(typeof t))return!1}return!0},M=function(){function e(){this._propertySet=new Set,this._properties={}}return e.prototype.getUserProperties=function(){return u({},this._properties)},e.prototype.set=function(e,t){return this._safeSet(A.SET,e,t),this},e.prototype.setOnce=function(e,t){return this._safeSet(A.SET_ONCE,e,t),this},e.prototype.append=function(e,t){return this._safeSet(A.APPEND,e,t),this},e.prototype.prepend=function(e,t){return this._safeSet(A.PREPEND,e,t),this},e.prototype.postInsert=function(e,t){return this._safeSet(A.POSTINSERT,e,t),this},e.prototype.preInsert=function(e,t){return this._safeSet(A.PREINSERT,e,t),this},e.prototype.remove=function(e,t){return this._safeSet(A.REMOVE,e,t),this},e.prototype.add=function(e,t){return this._safeSet(A.ADD,e,t),this},e.prototype.unset=function(e){return this._safeSet(A.UNSET,e,"-"),this},e.prototype.clearAll=function(){return this._properties={},this._properties[A.CLEAR_ALL]="-",this},e.prototype._safeSet=function(e,t,n){if(this._validate(e,t,n)){var i=this._properties[e];return void 0===i&&(i={},this._properties[e]=i),i[t]=n,this._propertySet.add(t),!0}return!1},e.prototype._validate=function(e,t,n){return void 0===this._properties[A.CLEAR_ALL]&&!this._propertySet.has(t)&&(e===A.ADD?"number"==typeof n:e===A.UNSET||e===A.REMOVE||q(t,n))},e}(),F=function(){function e(){this.productId="",this.quantity=1,this.price=0}return e.prototype.setProductId=function(e){return this.productId=e,this},e.prototype.setQuantity=function(e){return e>0&&(this.quantity=e),this},e.prototype.setPrice=function(e){return this.price=e,this},e.prototype.setRevenueType=function(e){return this.revenueType=e,this},e.prototype.setCurrency=function(e){return this.currency=e,this},e.prototype.setRevenue=function(e){return this.revenue=e,this},e.prototype.setEventProperties=function(e){return j(e)&&(this.properties=e),this},e.prototype.getEventProperties=function(){var e=this.properties?u({},this.properties):{};return e[L.REVENUE_PRODUCT_ID]=this.productId,e[L.REVENUE_QUANTITY]=this.quantity,e[L.REVENUE_PRICE]=this.price,e[L.REVENUE_TYPE]=this.revenueType,e[L.REVENUE_CURRENCY]=this.currency,e[L.REVENUE]=this.revenue,e},e}(),B=function(){function e(e){this.client=e,this.queue=[],this.applying=!1,this.plugins=[]}return e.prototype.register=function(e,t){var n,i;return c(this,void 0,void 0,(function(){return l(this,(function(r){switch(r.label){case 0:return this.plugins.some((function(t){return t.name===e.name}))?(t.loggerProvider.warn("Plugin with name ".concat(e.name," already exists, skipping registration")),[2]):(void 0===e.name&&(e.name=R(),t.loggerProvider.warn("Plugin name is undefined. \n Generating a random UUID for plugin name: ".concat(e.name,". \n Set a name for the plugin to prevent it from being added multiple times."))),e.type=null!==(n=e.type)&&void 0!==n?n:"enrichment",[4,null===(i=e.setup)||void 0===i?void 0:i.call(e,t,this.client)]);case 1:return r.sent(),this.plugins.push(e),[2]}}))}))},e.prototype.deregister=function(e,t){var n;return c(this,void 0,void 0,(function(){var i,r;return l(this,(function(o){switch(o.label){case 0:return i=this.plugins.findIndex((function(t){return t.name===e})),-1===i?(t.loggerProvider.warn("Plugin with name ".concat(e," does not exist, skipping deregistration")),[2]):(r=this.plugins[i],this.plugins.splice(i,1),[4,null===(n=r.teardown)||void 0===n?void 0:n.call(r)]);case 1:return o.sent(),[2]}}))}))},e.prototype.reset=function(e){this.applying=!1,this.plugins.map((function(e){var t;return null===(t=e.teardown)||void 0===t?void 0:t.call(e)})),this.plugins=[],this.client=e},e.prototype.push=function(e){var t=this;return new Promise((function(n){t.queue.push([e,n]),t.scheduleApply(0)}))},e.prototype.scheduleApply=function(e){var t=this;this.applying||(this.applying=!0,setTimeout((function(){t.apply(t.queue.shift()).then((function(){t.applying=!1,t.queue.length>0&&t.scheduleApply(0)}))}),e))},e.prototype.apply=function(e){return c(this,void 0,void 0,(function(){var t,n,i,r,o,s,a,c,h,f,v,g,y,m,b,_,E,w,S,k;return l(this,(function(l){switch(l.label){case 0:if(!e)return[2];t=p(e,1),n=t[0],i=p(e,2),r=i[1],o=this.plugins.filter((function(e){return"before"===e.type})),l.label=1;case 1:l.trys.push([1,6,7,8]),s=d(o),a=s.next(),l.label=2;case 2:return a.done?[3,5]:(g=a.value).execute?[4,g.execute(u({},n))]:[3,4];case 3:if(null===(y=l.sent()))return r({event:n,code:0,message:""}),[2];n=y,l.label=4;case 4:return a=s.next(),[3,2];case 5:return[3,8];case 6:return c=l.sent(),E={error:c},[3,8];case 7:try{a&&!a.done&&(w=s.return)&&w.call(s)}finally{if(E)throw E.error}return[7];case 8:h=this.plugins.filter((function(e){return"enrichment"===e.type||void 0===e.type})),l.label=9;case 9:l.trys.push([9,14,15,16]),f=d(h),v=f.next(),l.label=10;case 10:return v.done?[3,13]:(g=v.value).execute?[4,g.execute(u({},n))]:[3,12];case 11:if(null===(y=l.sent()))return r({event:n,code:0,message:""}),[2];n=y,l.label=12;case 12:return v=f.next(),[3,10];case 13:return[3,16];case 14:return m=l.sent(),S={error:m},[3,16];case 15:try{v&&!v.done&&(k=f.return)&&k.call(f)}finally{if(S)throw S.error}return[7];case 16:return b=this.plugins.filter((function(e){return"destination"===e.type})),_=b.map((function(e){var t=u({},n);return e.execute(t).catch((function(e){return I(t,0,String(e))}))})),Promise.all(_).then((function(e){var t=p(e,1)[0]||I(n,100,"Event not tracked, no destination plugins on the instance");r(t)})),[2]}}))}))},e.prototype.flush=function(){return c(this,void 0,void 0,(function(){var e,t,n,i=this;return l(this,(function(r){switch(r.label){case 0:return e=this.queue,this.queue=[],[4,Promise.all(e.map((function(e){return i.apply(e)})))];case 1:return r.sent(),t=this.plugins.filter((function(e){return"destination"===e.type})),n=t.map((function(e){return e.flush&&e.flush()})),[4,Promise.all(n)];case 2:return r.sent(),[2]}}))}))},e}(),V=function(e,t){return u(u({},t),{event_type:D.IDENTIFY,user_properties:e.getUserProperties()})},K=function(){function e(e){void 0===e&&(e="$default"),this.initializing=!1,this.isReady=!1,this.q=[],this.dispatchQ=[],this.logEvent=this.track.bind(this),this.timeline=new B(this),this.name=e}return e.prototype._init=function(e){return c(this,void 0,void 0,(function(){return l(this,(function(t){switch(t.label){case 0:return this.config=e,this.timeline.reset(this),[4,this.runQueuedFunctions("q")];case 1:return t.sent(),this.isReady=!0,[2]}}))}))},e.prototype.runQueuedFunctions=function(e){return c(this,void 0,void 0,(function(){var t,n,i,r,o,s,u,a;return l(this,(function(c){switch(c.label){case 0:t=this[e],this[e]=[],c.label=1;case 1:c.trys.push([1,8,9,10]),n=d(t),i=n.next(),c.label=2;case 2:return i.done?[3,7]:(r=i.value,(o=r())&&"promise"in o?[4,o.promise]:[3,4]);case 3:return c.sent(),[3,6];case 4:return[4,o];case 5:c.sent(),c.label=6;case 6:return i=n.next(),[3,2];case 7:return[3,10];case 8:return s=c.sent(),u={error:s},[3,10];case 9:try{i&&!i.done&&(a=n.return)&&a.call(n)}finally{if(u)throw u.error}return[7];case 10:return this[e].length?[4,this.runQueuedFunctions(e)]:[3,12];case 11:c.sent(),c.label=12;case 12:return[2]}}))}))},e.prototype.track=function(e,t,n){var i=function(e,t,n){return u(u(u({},"string"==typeof e?{event_type:e}:e),n),t&&{event_properties:t})}(e,t,n);return b(this.dispatch(i))},e.prototype.identify=function(e,t){var n=V(e,t);return b(this.dispatch(n))},e.prototype.groupIdentify=function(e,t,n,i){var r=function(e,t,n,i){var r;return u(u({},i),{event_type:D.GROUP_IDENTIFY,group_properties:n.getUserProperties(),groups:(r={},r[e]=t,r)})}(e,t,n,i);return b(this.dispatch(r))},e.prototype.setGroup=function(e,t,n){var i=function(e,t,n){var i,r=new M;return r.set(e,t),u(u({},n),{event_type:D.IDENTIFY,user_properties:r.getUserProperties(),groups:(i={},i[e]=t,i)})}(e,t,n);return b(this.dispatch(i))},e.prototype.revenue=function(e,t){var n=function(e,t){return u(u({},t),{event_type:D.REVENUE,event_properties:e.getEventProperties()})}(e,t);return b(this.dispatch(n))},e.prototype.add=function(e){return this.isReady?this._addPlugin(e):(this.q.push(this._addPlugin.bind(this,e)),b())},e.prototype._addPlugin=function(e){return b(this.timeline.register(e,this.config))},e.prototype.remove=function(e){return this.isReady?this._removePlugin(e):(this.q.push(this._removePlugin.bind(this,e)),b())},e.prototype._removePlugin=function(e){return b(this.timeline.deregister(e,this.config))},e.prototype.dispatchWithCallback=function(e,t){if(!this.isReady)return t(I(e,0,"Client not initialized"));this.process(e).then(t)},e.prototype.dispatch=function(e){return c(this,void 0,void 0,(function(){var t=this;return l(this,(function(n){return this.isReady?[2,this.process(e)]:[2,new Promise((function(n){t.dispatchQ.push(t.dispatchWithCallback.bind(t,e,n))}))]}))}))},e.prototype.process=function(e){return c(this,void 0,void 0,(function(){var t,n,i;return l(this,(function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),this.config.optOut?[2,I(e,0,"Event skipped due to optOut config")]:[4,this.timeline.push(e)];case 1:return 200===(i=r.sent()).code?this.config.loggerProvider.log(i.message):100===i.code?this.config.loggerProvider.warn(i.message):this.config.loggerProvider.error(i.message),[2,i];case 2:return t=r.sent(),n=String(t),this.config.loggerProvider.error(n),[2,i=I(e,0,n)];case 3:return[2]}}))}))},e.prototype.setOptOut=function(e){this.isReady?this._setOptOut(e):this.q.push(this._setOptOut.bind(this,Boolean(e)))},e.prototype._setOptOut=function(e){this.config.optOut=Boolean(e)},e.prototype.flush=function(){return b(this.timeline.flush())},e}(),$=function(e,t){return"boolean"==typeof e?e:!1!==(null==e?void 0:e[t])},H=function(e){return $(e,"attribution")},z=function(e){return $(e,"pageViews")},W=function(e){return $(e,"sessions")},Q=function(e){var t,n=function(){return!1},i=void 0,r=e.pageCounter;return z(e.defaultTracking)&&(n=void 0,t=void 0,e.defaultTracking&&"object"==typeof e.defaultTracking&&e.defaultTracking.pageViews&&"object"==typeof e.defaultTracking.pageViews&&("trackOn"in e.defaultTracking.pageViews&&(n=e.defaultTracking.pageViews.trackOn),"trackHistoryChanges"in e.defaultTracking.pageViews&&(i=e.defaultTracking.pageViews.trackHistoryChanges),"eventType"in e.defaultTracking.pageViews&&e.defaultTracking.pageViews.eventType&&(t=e.defaultTracking.pageViews.eventType))),{trackOn:n,trackHistoryChanges:i,eventType:t,pageCounter:r}},J="dclid",Y="fbclid",Z="gbraid",G="gclid",X="ko_click_id",ee="li_fat_id",te="msclkid",ne="rtd_cid",ie="ttclid",re="twclid",oe="wbraid",se={utm_campaign:void 0,utm_content:void 0,utm_id:void 0,utm_medium:void 0,utm_source:void 0,utm_term:void 0,referrer:void 0,referring_domain:void 0,dclid:void 0,gbraid:void 0,gclid:void 0,fbclid:void 0,ko_click_id:void 0,li_fat_id:void 0,msclkid:void 0,rtd_cid:void 0,ttclid:void 0,twclid:void 0,wbraid:void 0},ue=function(e){var t=e.split(".");return t.length<=2?e:t.slice(t.length-2,t.length).join(".")},ae=function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=""),e.some((function(e){return e instanceof RegExp?e.test(t):e===t}))},ce=function(){var e="ampIntegrationContext";return"undefined"!=typeof globalThis&&void 0!==globalThis[e]?globalThis[e]:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof self?self:void 0!==n.g?n.g:void 0},le=function(){var e,t=ce();return(null===(e=null==t?void 0:t.location)||void 0===e?void 0:e.search)?t.location.search.substring(1).split("&").filter(Boolean).reduce((function(e,t){var n=t.split("=",2),i=de(n[0]),r=de(n[1]);return r?(e[i]=r,e):e}),{}):{}},de=function(e){void 0===e&&(e="");try{return decodeURIComponent(e)}catch(e){return""}},pe=function(){function e(){}return e.prototype.parse=function(){return c(this,void 0,void 0,(function(){return l(this,(function(e){return[2,u(u(u(u({},se),this.getUtmParam()),this.getReferrer()),this.getClickIds())]}))}))},e.prototype.getUtmParam=function(){var e=le();return{utm_campaign:e.utm_campaign,utm_content:e.utm_content,utm_id:e.utm_id,utm_medium:e.utm_medium,utm_source:e.utm_source,utm_term:e.utm_term}},e.prototype.getReferrer=function(){var e,t,n={referrer:void 0,referring_domain:void 0};try{n.referrer=document.referrer||void 0,n.referring_domain=null!==(t=null===(e=n.referrer)||void 0===e?void 0:e.split("/")[2])&&void 0!==t?t:void 0}catch(e){}return n},e.prototype.getClickIds=function(){var e,t=le();return(e={})[J]=t[J],e[Y]=t[Y],e[Z]=t[Z],e[G]=t[G],e[X]=t[X],e[ee]=t[ee],e[te]=t[te],e[ne]=t[ne],e[ie]=t[ie],e[re]=t[re],e[oe]=t[oe],e},e}(),he=function(e,t){return void 0===t&&(t=Date.now()),Date.now()-t>e},fe=function(){function e(e,t){var n,i,r,o,s,a;this.shouldTrackNewCampaign=!1,this.options=u({initialEmptyValue:"EMPTY",resetSessionOnNewCampaign:!1,excludeReferrers:(i=null===(n=t.cookieOptions)||void 0===n?void 0:n.domain,r=i,r?(r.startsWith(".")&&(r=r.substring(1)),[new RegExp("".concat(r.replace(".","\\."),"$"))]):[])},e),this.storage=t.cookieStorage,this.storageKey=(o=t.apiKey,void 0===(s="MKTG")&&(s=""),void 0===a&&(a=10),[_,s,o.substring(0,a)].filter(Boolean).join("_")),this.currentCampaign=se,this.sessionTimeout=t.sessionTimeout,this.lastEventTime=t.lastEventTime,this.logger=t.loggerProvider,t.loggerProvider.log("Installing web attribution tracking.")}return e.prototype.init=function(){return c(this,void 0,void 0,(function(){var e,t;return l(this,(function(n){switch(n.label){case 0:return[4,this.fetchCampaign()];case 1:return t=p.apply(void 0,[n.sent(),2]),this.currentCampaign=t[0],this.previousCampaign=t[1],e=!this.lastEventTime||he(this.sessionTimeout,this.lastEventTime),function(e,t,n,i,r){void 0===r&&(r=!0),e.referrer;var o=e.referring_domain,s=a(e,["referrer","referring_domain"]),u=t||{},c=(u.referrer,u.referring_domain),l=a(u,["referrer","referring_domain"]);if(ae(n.excludeReferrers,e.referring_domain))return i.debug("This is not a new campaign because ".concat(e.referring_domain," is in the exclude referrer list.")),!1;if(!r&&function(e){return Object.values(e).every((function(e){return!e}))}(e)&&t)return i.debug("This is not a new campaign because this is a direct traffic in the same session."),!1;var d=JSON.stringify(s)!==JSON.stringify(l),p=ue(o||"")!==ue(c||""),h=!t||d||p;return h?i.debug("This is a new campaign. An $identify event will be sent."):i.debug("This is not a new campaign because it's the same as the previous one."),h}(this.currentCampaign,this.previousCampaign,this.options,this.logger,e)?(this.shouldTrackNewCampaign=!0,[4,this.storage.set(this.storageKey,this.currentCampaign)]):[3,3];case 2:n.sent(),n.label=3;case 3:return[2]}}))}))},e.prototype.fetchCampaign=function(){return c(this,void 0,void 0,(function(){return l(this,(function(e){switch(e.label){case 0:return[4,Promise.all([(new pe).parse(),this.storage.get(this.storageKey)])];case 1:return[2,e.sent()]}}))}))},e.prototype.generateCampaignEvent=function(e){this.shouldTrackNewCampaign=!1;var t,n,i,r,o=(t=this.currentCampaign,n=this.options,i=u(u({},se),t),r=Object.entries(i).reduce((function(e,t){var i,r=p(t,2),o=r[0],s=r[1];return e.setOnce("initial_".concat(o),null!==(i=null!=s?s:n.initialEmptyValue)&&void 0!==i?i:"EMPTY"),s?e.set(o,s):e.unset(o)}),new M),V(r));return e&&(o.event_id=e),o},e.prototype.shouldSetSessionIdOnNewCampaign=function(){return this.shouldTrackNewCampaign&&!!this.options.resetSessionOnNewCampaign},e}(),ve=function(){function e(){}return e.prototype.getApplicationContext=function(){return{versionName:this.versionName,language:ge(),platform:"Web",os:void 0,deviceModel:void 0}},e}(),ge=function(){return"undefined"!=typeof navigator&&(navigator.languages&&navigator.languages[0]||navigator.language)||""},ye=function(){function e(){this.queue=[]}return e.prototype.logEvent=function(e){this.receiver?this.receiver(e):this.queue.length<512&&this.queue.push(e)},e.prototype.setEventReceiver=function(e){this.receiver=e,this.queue.length>0&&(this.queue.forEach((function(t){e(t)})),this.queue=[])},e}(),me=function(){return me=Object.assign||function(e){for(var t,n=1,i=arguments.length;n=e.length&&(e=void 0),{value:e&&e[i++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function _e(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var i,r,o=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(i=o.next()).done;)s.push(i.value)}catch(e){r={error:e}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return s}"function"==typeof SuppressedError&&SuppressedError;var Ee=function(e,t){var n,i,r=typeof e;if(r!==typeof t)return!1;try{for(var o=be(["string","number","boolean","undefined"]),s=o.next();!s.done;s=o.next())if(s.value===r)return e===t}catch(e){n={error:e}}finally{try{s&&!s.done&&(i=o.return)&&i.call(o)}finally{if(n)throw n.error}}if(null==e&&null==t)return!0;if(null==e||null==t)return!1;if(e.length!==t.length)return!1;var u=Array.isArray(e),a=Array.isArray(t);if(u!==a)return!1;if(!u||!a){var c=Object.keys(e).sort(),l=Object.keys(t).sort();if(!Ee(c,l))return!1;var d=!0;return Object.keys(e).forEach((function(n){Ee(e[n],t[n])||(d=!1)})),d}for(var p=0;p=200&&e<300?f.Success:429===e?f.RateLimit:413===e?f.PayloadTooLarge:408===e?f.Timeout:e>=400&&e<500?f.Invalid:e>=500?f.Failed:f.Unknown},e}(),Me=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.send=function(e,t){return c(this,void 0,void 0,(function(){var n,i,r;return l(this,(function(o){switch(o.label){case 0:if("undefined"==typeof fetch)throw new Error("FetchTransport is not supported");return n={headers:{"Content-Type":"application/json",Accept:"*/*"},body:JSON.stringify(t),method:"POST"},[4,fetch(e,n)];case 1:return[4,(i=o.sent()).text()];case 2:r=o.sent();try{return[2,this.buildResponse(JSON.parse(r))]}catch(e){return[2,this.buildResponse({code:i.status})]}return[2]}}))}))},t}(qe),Fe=function(){function e(e){this.storage=e}return e.prototype.isEnabled=function(){return c(this,void 0,void 0,(function(){var t,n,i;return l(this,(function(r){switch(r.label){case 0:if(!this.storage)return[2,!1];t=String(Date.now()),n=new e(this.storage),i="AMP_TEST",r.label=1;case 1:return r.trys.push([1,4,5,7]),[4,n.set(i,t)];case 2:return r.sent(),[4,n.get(i)];case 3:return[2,r.sent()===t];case 4:return r.sent(),[2,!1];case 5:return[4,n.remove(i)];case 6:return r.sent(),[7];case 7:return[2]}}))}))},e.prototype.get=function(e){return c(this,void 0,void 0,(function(){var t;return l(this,(function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,this.getRaw(e)];case 1:return(t=n.sent())?[2,JSON.parse(t)]:[2,void 0];case 2:return n.sent(),console.error("[Amplitude] Error: Could not get value from storage"),[2,void 0];case 3:return[2]}}))}))},e.prototype.getRaw=function(e){var t;return c(this,void 0,void 0,(function(){return l(this,(function(n){return[2,(null===(t=this.storage)||void 0===t?void 0:t.getItem(e))||void 0]}))}))},e.prototype.set=function(e,t){var n;return c(this,void 0,void 0,(function(){return l(this,(function(i){try{null===(n=this.storage)||void 0===n||n.setItem(e,JSON.stringify(t))}catch(e){}return[2]}))}))},e.prototype.remove=function(e){var t;return c(this,void 0,void 0,(function(){return l(this,(function(n){try{null===(t=this.storage)||void 0===t||t.removeItem(e)}catch(e){}return[2]}))}))},e.prototype.reset=function(){var e;return c(this,void 0,void 0,(function(){return l(this,(function(t){try{null===(e=this.storage)||void 0===e||e.clear()}catch(e){}return[2]}))}))},e}(),Be=1e3,Ve=function(e){function t(t){var n,i=this;return(i=e.call(this,null===(n=ce())||void 0===n?void 0:n.localStorage)||this).loggerProvider=null==t?void 0:t.loggerProvider,i}return o(t,e),t.prototype.set=function(t,n){var i;return c(this,void 0,void 0,(function(){var r;return l(this,(function(o){switch(o.label){case 0:return Array.isArray(n)&&n.length>Be?(r=n.length-Be,[4,e.prototype.set.call(this,t,n.slice(0,Be))]):[3,2];case 1:return o.sent(),null===(i=this.loggerProvider)||void 0===i||i.error("Failed to save ".concat(r," events because the queue length exceeded ").concat(Be,".")),[3,4];case 2:return[4,e.prototype.set.call(this,t,n)];case 3:o.sent(),o.label=4;case 4:return[2]}}))}))},t}(Fe),Ke=function(e){function t(){var t;return e.call(this,null===(t=ce())||void 0===t?void 0:t.sessionStorage)||this}return o(t,e),t}(Fe),$e=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.state={done:4},t}return o(t,e),t.prototype.send=function(e,t){return c(this,void 0,void 0,(function(){var n=this;return l(this,(function(i){return[2,new Promise((function(i,r){"undefined"==typeof XMLHttpRequest&&r(new Error("XHRTransport is not supported."));var o=new XMLHttpRequest;o.open("POST",e,!0),o.onreadystatechange=function(){if(o.readyState===n.state.done){var e=o.responseText;try{i(n.buildResponse(JSON.parse(e)))}catch(e){i(n.buildResponse({code:o.status}))}}},o.setRequestHeader("Content-Type","application/json"),o.setRequestHeader("Accept","*/*"),o.send(JSON.stringify(t))}))]}))}))},t}(qe),He=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.send=function(e,t){return c(this,void 0,void 0,(function(){var n=this;return l(this,(function(i){return[2,new Promise((function(i,r){var o=ce();if(!(null==o?void 0:o.navigator.sendBeacon))throw new Error("SendBeaconTransport is not supported");try{var s=JSON.stringify(t);return i(o.navigator.sendBeacon(e,JSON.stringify(t))?n.buildResponse({code:200,events_ingested:t.events.length,payload_size_bytes:s.length,server_upload_time:Date.now()}):n.buildResponse({code:500}))}catch(e){r(e)}}))]}))}))},t}(qe),ze=function(e,t,n){return void 0===n&&(n=!0),c(void 0,void 0,void 0,(function(){var i,r,o,s,u,a,c,d,h;return l(this,(function(l){switch(l.label){case 0:return i=function(e){return"".concat(_.toLowerCase(),"_").concat(e.substring(0,6))}(e),[4,t.getRaw(i)];case 1:return(r=l.sent())?n?[4,t.remove(i)]:[3,3]:[2,{optOut:!1}];case 2:l.sent(),l.label=3;case 3:return o=p(r.split("."),6),s=o[0],u=o[1],a=o[2],c=o[3],d=o[4],h=o[5],[2,{deviceId:s,userId:Qe(u),sessionId:We(c),lastEventId:We(h),lastEventTime:We(d),optOut:Boolean(a)}]}}))}))},We=function(e){var t=parseInt(e,32);if(!isNaN(t))return t},Qe=function(e){if(atob&&escape&&e)try{return decodeURIComponent(escape(atob(e)))}catch(e){return}},Je="[Amplitude]",Ye=("".concat(Je," Page Viewed"),"".concat(Je," Form Started")),Ze="".concat(Je," Form Submitted"),Ge="".concat(Je," File Downloaded"),Xe="session_start",et="session_end",tt="".concat(Je," File Extension"),nt="".concat(Je," File Name"),it="".concat(Je," Link ID"),rt="".concat(Je," Link Text"),ot="".concat(Je," Link URL"),st="".concat(Je," Form ID"),ut="".concat(Je," Form Name"),at="".concat(Je," Form Destination"),ct="cookie",lt=function(e){function t(t,n,i,r,o,u,a,c,l,d,p,h,f,v,g,y,m,b,_,E,w,I,S,P,T,x,O,C,R,U,A,L){void 0===i&&(i=new Ae),void 0===r&&(r={domain:"",expiration:365,sameSite:"Lax",secure:!1,upgrade:!0}),void 0===a&&(a=1e3),void 0===c&&(c=5),void 0===l&&(l=30),void 0===d&&(d=ct),void 0===g&&(g=new k),void 0===y&&(y=s.Warn),void 0===b&&(b=!1),void 0===_&&(_=!1),void 0===I&&(I=""),void 0===S&&(S="US"),void 0===T&&(T=18e5),void 0===x&&(x=new Ve({loggerProvider:g})),void 0===O&&(O={ipAddress:!0,language:!0,platform:!0}),void 0===C&&(C="fetch"),void 0===R&&(R=!1);var D=e.call(this,{apiKey:t,storageProvider:x,transportProvider:ht(C)})||this;return D.apiKey=t,D.appVersion=n,D.cookieOptions=r,D.defaultTracking=o,D.flushIntervalMillis=a,D.flushMaxRetries=c,D.flushQueueSize=l,D.identityStorage=d,D.ingestionMetadata=p,D.instanceName=h,D.loggerProvider=g,D.logLevel=y,D.minIdLength=m,D.offline=b,D.partnerId=E,D.plan=w,D.serverUrl=I,D.serverZone=S,D.sessionTimeout=T,D.storageProvider=x,D.trackingOptions=O,D.transport=C,D.useBatch=R,D._optOut=!1,D._cookieStorage=i,D.deviceId=u,D.lastEventId=f,D.lastEventTime=v,D.optOut=_,D.sessionId=P,D.pageCounter=A,D.userId=U,D.debugLogsEnabled=L,D.loggerProvider.enable(L?s.Debug:D.logLevel),D}return o(t,e),Object.defineProperty(t.prototype,"cookieStorage",{get:function(){return this._cookieStorage},set:function(e){this._cookieStorage!==e&&(this._cookieStorage=e,this.updateStorage())},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"deviceId",{get:function(){return this._deviceId},set:function(e){this._deviceId!==e&&(this._deviceId=e,this.updateStorage())},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"userId",{get:function(){return this._userId},set:function(e){this._userId!==e&&(this._userId=e,this.updateStorage())},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"sessionId",{get:function(){return this._sessionId},set:function(e){this._sessionId!==e&&(this._sessionId=e,this.updateStorage())},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"optOut",{get:function(){return this._optOut},set:function(e){this._optOut!==e&&(this._optOut=e,this.updateStorage())},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"lastEventTime",{get:function(){return this._lastEventTime},set:function(e){this._lastEventTime!==e&&(this._lastEventTime=e,this.updateStorage())},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"lastEventId",{get:function(){return this._lastEventId},set:function(e){this._lastEventId!==e&&(this._lastEventId=e,this.updateStorage())},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"pageCounter",{get:function(){return this._pageCounter},set:function(e){this._pageCounter!==e&&(this._pageCounter=e,this.updateStorage())},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"debugLogsEnabled",{set:function(e){this._debugLogsEnabled!==e&&(this._debugLogsEnabled=e,this.updateStorage())},enumerable:!1,configurable:!0}),t.prototype.updateStorage=function(){var e={deviceId:this._deviceId,userId:this._userId,sessionId:this._sessionId,optOut:this._optOut,lastEventTime:this._lastEventTime,lastEventId:this._lastEventId,pageCounter:this._pageCounter,debugLogsEnabled:this._debugLogsEnabled};this.cookieStorage.set(Le(this.apiKey),e)},t}(T),dt=function(e,t,n){return void 0===t&&(t={}),c(void 0,void 0,void 0,(function(){var i,r,o,s,a,c,d,p,h,f,v,g,y,m,b,_,E,w,I,S,k,P,T,x,O,C,U,A,L,D,N,j,q,M,F,B,V,K,$,H,z,W;return l(this,(function(l){switch(l.label){case 0:return i=t.identityStorage||ct,w={},i===ct?[3,1]:(o="",[3,5]);case 1:return null===(S=null===(I=t.cookieOptions)||void 0===I?void 0:I.domain)||void 0===S?[3,2]:(s=S,[3,4]);case 2:return[4,ft()];case 3:s=l.sent(),l.label=4;case 4:o=s,l.label=5;case 5:return r=u.apply(void 0,[(w.domain=o,w.expiration=365,w.sameSite="Lax",w.secure=!1,w.upgrade=!0,w),t.cookieOptions]),a=pt(t.identityStorage,r),[4,ze(e,a,null===(P=null===(k=t.cookieOptions)||void 0===k?void 0:k.upgrade)||void 0===P||P)];case 6:return c=l.sent(),[4,a.get(Le(e))];case 7:return d=l.sent(),p=le(),h=null!==(U=null!==(C=null!==(O=null!==(x=null!==(T=t.deviceId)&&void 0!==T?T:p.ampDeviceId)&&void 0!==x?x:p.deviceId)&&void 0!==O?O:null==d?void 0:d.deviceId)&&void 0!==C?C:c.deviceId)&&void 0!==U?U:R(),f=null!==(A=null==d?void 0:d.lastEventId)&&void 0!==A?A:c.lastEventId,v=null!==(L=null==d?void 0:d.lastEventTime)&&void 0!==L?L:c.lastEventTime,g=null!==(N=null!==(D=t.optOut)&&void 0!==D?D:null==d?void 0:d.optOut)&&void 0!==N?N:c.optOut,y=null!==(j=null==d?void 0:d.sessionId)&&void 0!==j?j:c.sessionId,m=null!==(M=null!==(q=t.userId)&&void 0!==q?q:null==d?void 0:d.userId)&&void 0!==M?M:c.userId,n.previousSessionDeviceId=null!==(F=null==d?void 0:d.deviceId)&&void 0!==F?F:c.deviceId,n.previousSessionUserId=null!==(B=null==d?void 0:d.userId)&&void 0!==B?B:c.userId,b={ipAddress:null===(K=null===(V=t.trackingOptions)||void 0===V?void 0:V.ipAddress)||void 0===K||K,language:null===(H=null===($=t.trackingOptions)||void 0===$?void 0:$.language)||void 0===H||H,platform:null===(W=null===(z=t.trackingOptions)||void 0===z?void 0:z.platform)||void 0===W||W},_=null==d?void 0:d.pageCounter,E=null==d?void 0:d.debugLogsEnabled,[2,new lt(e,t.appVersion,a,r,t.defaultTracking,h,t.flushIntervalMillis,t.flushMaxRetries,t.flushQueueSize,i,t.ingestionMetadata,t.instanceName,f,v,t.loggerProvider,t.logLevel,t.minIdLength,t.offline,g,t.partnerId,t.plan,t.serverUrl,t.serverZone,y,t.sessionTimeout,t.storageProvider,b,t.transport,t.useBatch,m,_,E)]}}))}))},pt=function(e,t){switch(void 0===e&&(e=ct),void 0===t&&(t={}),e){case"localStorage":return new Ve;case"sessionStorage":return new Ke;case"none":return new Ae;default:return new De(u(u({},t),{expirationDays:t.expiration}))}},ht=function(e){return"xhr"===e?new $e:"beacon"===e?new He:new Me},ft=function(e){return c(void 0,void 0,void 0,(function(){var t,n,i,r,o,s,u;return l(this,(function(a){switch(a.label){case 0:return[4,(new De).isEnabled()];case 1:if(!a.sent()||!e&&("undefined"==typeof location||!location.hostname))return[2,""];for(t=null!=e?e:location.hostname,n=t.split("."),i=[],r="AMP_TLDTEST",o=n.length-2;o>=0;--o)i.push(n.slice(o).join("."));o=0,a.label=2;case 2:return o2?(i=t,r=n):"string"==typeof t?(i=t,r=void 0):(i=null==t?void 0:t.userId,r=t),b(this._init(u(u({},r),{userId:i,apiKey:e})))},t.prototype._init=function(t){var n,i,r;return c(this,void 0,void 0,(function(){var o,s,a,d,p,h=this;return l(this,(function(f){switch(f.label){case 0:return this.initializing?[2]:(this.initializing=!0,[4,dt(t.apiKey,t,this)]);case 1:return o=f.sent(),[4,e.prototype._init.call(this,o)];case 2:return f.sent(),this.logBrowserOptions(t),H(this.config.defaultTracking)?(b=this.config,s=H(b.defaultTracking)&&b.defaultTracking&&"object"==typeof b.defaultTracking&&b.defaultTracking.attribution&&"object"==typeof b.defaultTracking.attribution?u({},b.defaultTracking.attribution):{},this.webAttribution=new fe(s,this.config),[4,this.webAttribution.init()]):[3,4];case 3:f.sent(),f.label=4;case 4:return a=le(),d=Number.isNaN(Number(a.ampSessionId))?void 0:Number(a.ampSessionId),this.setSessionId(null!==(r=null!==(i=null!==(n=t.sessionId)&&void 0!==n?n:d)&&void 0!==i?i:this.config.sessionId)&&void 0!==r?r:Date.now()),(p=ke(t.instanceName)).identityStore.setIdentity({userId:this.config.userId,deviceId:this.config.deviceId}),this.config.offline===Te?[3,6]:[4,this.add((v=ce(),g=[],y=function(e,t){v&&(v.addEventListener(e,t),g.push({type:e,handler:t}))},{name:"@amplitude/plugin-network-checker-browser",type:"before",setup:function(e,t){return c(void 0,void 0,void 0,(function(){return l(this,(function(n){return e.offline=!navigator.onLine,y("online",(function(){e.loggerProvider.debug("Network connectivity changed to online."),e.offline=!1,setTimeout((function(){t.flush()}),e.flushIntervalMillis)})),y("offline",(function(){e.loggerProvider.debug("Network connectivity changed to offline."),e.offline=!0})),[2]}))}))},teardown:function(){return c(void 0,void 0,void 0,(function(){return l(this,(function(e){return g.forEach((function(e){var t=e.type,n=e.handler;v&&v.removeEventListener(t,n)})),g=[],[2]}))}))}})).promise];case 5:f.sent(),f.label=6;case 6:return[4,this.add(new N).promise];case 7:return f.sent(),[4,this.add(new Ue).promise];case 8:return f.sent(),[4,this.add(new Pe).promise];case 9:return f.sent(),function(e){It||void 0!==e.defaultTracking||(e.loggerProvider.warn("`options.defaultTracking` is set to undefined. This implicitly configures your Amplitude instance to track Page Views, Sessions, File Downloads, and Form Interactions. You can suppress this warning by explicitly setting a value to `options.defaultTracking`. The value must either be a boolean, to enable and disable all default events, or an object, for advanced configuration. For example:\n\namplitude.init(, {\n defaultTracking: true,\n});\n\nVisit https://www.docs.developers.amplitude.com/data/sdks/browser-2/#tracking-default-events for more details."),It=!0)}(this.config),m=this.config.defaultTracking,$(m,"fileDownloads")?(this.config.loggerProvider.debug("Adding file download tracking plugin"),[4,this.add(wt()).promise]):[3,11];case 10:f.sent(),f.label=11;case 11:return function(e){return $(e,"formInteractions")}(this.config.defaultTracking)?(this.config.loggerProvider.debug("Adding form interaction plugin"),[4,this.add(_t()).promise]):[3,13];case 12:f.sent(),f.label=13;case 13:return z(this.config.defaultTracking)?(this.config.loggerProvider.debug("Adding page view tracking plugin"),[4,this.add(gt(Q(this.config))).promise]):[3,15];case 14:f.sent(),f.label=15;case 15:return this.initializing=!1,[4,this.runQueuedFunctions("dispatchQ")];case 16:return f.sent(),p.eventBridge.setEventReceiver((function(e){h.track(e.eventType,e.eventProperties)})),[2]}var v,g,y,m,b}))}))},t.prototype.getUserId=function(){var e;return null===(e=this.config)||void 0===e?void 0:e.userId},t.prototype.setUserId=function(e){this.config?(this.config.loggerProvider.debug("function setUserId: ",e),e===this.config.userId&&void 0!==e||(this.config.userId=e,function(e,t){ke(t).identityStore.editIdentity().setUserId(e).commit()}(e,this.config.instanceName))):this.q.push(this.setUserId.bind(this,e))},t.prototype.getDeviceId=function(){var e;return null===(e=this.config)||void 0===e?void 0:e.deviceId},t.prototype.setDeviceId=function(e){this.config?(this.config.loggerProvider.debug("function setDeviceId: ",e),this.config.deviceId=e,function(e,t){ke(t).identityStore.editIdentity().setDeviceId(e).commit()}(e,this.config.instanceName)):this.q.push(this.setDeviceId.bind(this,e))},t.prototype.reset=function(){this.setDeviceId(R()),this.setUserId(void 0)},t.prototype.getSessionId=function(){var e;return null===(e=this.config)||void 0===e?void 0:e.sessionId},t.prototype.setSessionId=function(e){var t,n=[];if(!this.config)return this.q.push(this.setSessionId.bind(this,e)),b(Promise.resolve());if(e===this.config.sessionId)return b(Promise.resolve());this.config.loggerProvider.debug("function setSessionId: ",e);var i=this.getSessionId(),r=this.config.lastEventTime,o=null!==(t=this.config.lastEventId)&&void 0!==t?t:-1;this.config.sessionId=e,this.config.lastEventTime=void 0,this.config.pageCounter=0,W(this.config.defaultTracking)&&(i&&r&&n.push(this.track(et,void 0,{device_id:this.previousSessionDeviceId,event_id:++o,session_id:i,time:r+1,user_id:this.previousSessionUserId}).promise),this.config.lastEventTime=this.config.sessionId);var s=this.trackCampaignEventIfNeeded(++o,n);return W(this.config.defaultTracking)&&n.push(this.track(Xe,void 0,{event_id:s?++o:o,session_id:this.config.sessionId,time:this.config.lastEventTime}).promise),this.previousSessionDeviceId=this.config.deviceId,this.previousSessionUserId=this.config.userId,b(Promise.all(n))},t.prototype.extendSession=function(){this.config?this.config.lastEventTime=Date.now():this.q.push(this.extendSession.bind(this))},t.prototype.setTransport=function(e){this.config?this.config.transportProvider=ht(e):this.q.push(this.setTransport.bind(this,e))},t.prototype.identify=function(t,n){if(Ce(t)){var i=t._q;t._q=[],t=Oe(new M,i)}return(null==n?void 0:n.user_id)&&this.setUserId(n.user_id),(null==n?void 0:n.device_id)&&this.setDeviceId(n.device_id),e.prototype.identify.call(this,t,n)},t.prototype.groupIdentify=function(t,n,i,r){if(Ce(i)){var o=i._q;i._q=[],i=Oe(new M,o)}return e.prototype.groupIdentify.call(this,t,n,i,r)},t.prototype.revenue=function(t,n){if(Ce(t)){var i=t._q;t._q=[],t=Oe(new F,i)}return e.prototype.revenue.call(this,t,n)},t.prototype.trackCampaignEventIfNeeded=function(e,t){if(!this.webAttribution||!this.webAttribution.shouldTrackNewCampaign)return!1;var n=this.webAttribution.generateCampaignEvent(e);return t?t.push(this.track(n).promise):this.track(n),this.config.loggerProvider.log("Tracking attribution."),!0},t.prototype.process=function(t){return c(this,void 0,void 0,(function(){var n,i,r;return l(this,(function(o){return n=Date.now(),i=he(this.config.sessionTimeout,this.config.lastEventTime),r=this.webAttribution&&this.webAttribution.shouldSetSessionIdOnNewCampaign(),t.event_type===Xe||t.event_type===et||t.session_id&&t.session_id!==this.getSessionId()||(i||r?(this.setSessionId(n),r&&this.config.loggerProvider.log("Created a new session for new campaign.")):i||this.trackCampaignEventIfNeeded()),[2,e.prototype.process.call(this,t)]}))}))},t.prototype.logBrowserOptions=function(e){try{var t=u(u({},e),{apiKey:e.apiKey.substring(0,10)+"********"});this.config.loggerProvider.debug("Initialized Amplitude with BrowserConfig:",JSON.stringify(t))}catch(e){this.config.loggerProvider.error("Error logging browser config",e)}},t}(K),kt=function(){var e=new St;return{init:m(e.init.bind(e),"init",v(e),y(e,["config"])),add:m(e.add.bind(e),"add",v(e),y(e,["config.apiKey","timeline.plugins"])),remove:m(e.remove.bind(e),"remove",v(e),y(e,["config.apiKey","timeline.plugins"])),track:m(e.track.bind(e),"track",v(e),y(e,["config.apiKey","timeline.queue.length"])),logEvent:m(e.logEvent.bind(e),"logEvent",v(e),y(e,["config.apiKey","timeline.queue.length"])),identify:m(e.identify.bind(e),"identify",v(e),y(e,["config.apiKey","timeline.queue.length"])),groupIdentify:m(e.groupIdentify.bind(e),"groupIdentify",v(e),y(e,["config.apiKey","timeline.queue.length"])),setGroup:m(e.setGroup.bind(e),"setGroup",v(e),y(e,["config.apiKey","timeline.queue.length"])),revenue:m(e.revenue.bind(e),"revenue",v(e),y(e,["config.apiKey","timeline.queue.length"])),flush:m(e.flush.bind(e),"flush",v(e),y(e,["config.apiKey","timeline.queue.length"])),getUserId:m(e.getUserId.bind(e),"getUserId",v(e),y(e,["config","config.userId"])),setUserId:m(e.setUserId.bind(e),"setUserId",v(e),y(e,["config","config.userId"])),getDeviceId:m(e.getDeviceId.bind(e),"getDeviceId",v(e),y(e,["config","config.deviceId"])),setDeviceId:m(e.setDeviceId.bind(e),"setDeviceId",v(e),y(e,["config","config.deviceId"])),reset:m(e.reset.bind(e),"reset",v(e),y(e,["config","config.userId","config.deviceId"])),getSessionId:m(e.getSessionId.bind(e),"getSessionId",v(e),y(e,["config"])),setSessionId:m(e.setSessionId.bind(e),"setSessionId",v(e),y(e,["config"])),extendSession:m(e.extendSession.bind(e),"extendSession",v(e),y(e,["config"])),setOptOut:m(e.setOptOut.bind(e),"setOptOut",v(e),y(e,["config"])),setTransport:m(e.setTransport.bind(e),"setTransport",v(e),y(e,["config"]))}};const Pt=kt();var Tt;!function(e){e.US="US",e.EU="EU"}(Tt||(Tt={}));var xt=["a","button","input","select","textarea","label","video","audio",'[contenteditable="true" i]',"[data-amp-default-track]",".amp-default-track"],Ot="data-amp-track-",Ct=["div","span","h1","h2","h3","h4","h5","h6"],Rt=Pt.add,Ut=Pt.extendSession,At=Pt.flush,Lt=Pt.getDeviceId,Dt=Pt.getSessionId,Nt=Pt.getUserId,jt=Pt.groupIdentify,qt=Pt.identify,Mt=Pt.init,Ft=Pt.logEvent,Bt=Pt.remove,Vt=Pt.reset,Kt=Pt.revenue,$t=Pt.setDeviceId,Ht=Pt.setGroup,zt=Pt.setOptOut,Wt=Pt.setSessionId,Qt=Pt.setTransport,Jt=Pt.setUserId,Yt=Pt.track},554:function(e,t,n){var i=this&&this.__createBinding||(Object.create?function(e,t,n,i){void 0===i&&(i=n);var r=Object.getOwnPropertyDescriptor(t,n);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,i,r)}:function(e,t,n,i){void 0===i&&(i=n),e[i]=t[n]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&i(t,e,n);return r(t,e),t};Object.defineProperty(t,"__esModule",{value:!0});const s=o(n(292)),u=(["US","EU"].includes("US"),"US");s.init("39d277da47b4f68f0f19f9e32ba89bce",{defaultTracking:{sessions:!1,pageViews:!1,formInteractions:!1,fileDownloads:!1},fetchRemoteConfig:!0,autocapture:!1,serverZone:u}),t.default=s},859:function(e,t,n){var i=this&&this.__awaiter||function(e,t,n,i){return new(n||(n=Promise))((function(r,o){function s(e){try{a(i.next(e))}catch(e){o(e)}}function u(e){try{a(i.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,u)}a((i=i.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const r=n(174),o=n(101),s=n(971);!function(e){if(document.querySelector(".tab-panel"))return void e();const t=new MutationObserver((()=>{document.querySelector(".tab-panel")&&(t.disconnect(),e())}));t.observe(document.body,{childList:!0,subtree:!0})}((()=>{!function(){i(this,void 0,void 0,(function*(){const e=new o.SubscriptionManager;yield e.init(),e.isPro?(e.renderSupportLink(),(0,s.amplitudeStart)()):(yield(0,r.isFeatureEnabled)())&&(e.renderSubscriptionUi(),(0,s.amplitudeStart)(),(0,s.handleFeatureEnabled)())}))}()}))},971:function(e,t,n){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.amplitudeStart=t.handleFeatureEnabled=t.handleProButtonClick=t.handleChangeSiteThemeMode=t.handleChangeEnableApp=t.handleChangeDisableApp=t.handlePopupOpen=void 0;const r=i(n(554)),o=n(167),s=(e,t)=>{new MutationObserver(((n,i)=>{const o=document.querySelector(e);o&&(i.disconnect(),o.addEventListener("click",(()=>{r.default.track({event_type:t})})))})).observe(document.body,{childList:!0,subtree:!0})};t.handlePopupOpen=()=>{r.default.track({event_type:"popup_opened"})},t.handleChangeDisableApp=()=>{s(".header__app-toggle .toggle__off","app_disabled")},t.handleChangeEnableApp=()=>{s(".header__app-toggle .toggle__on","app_enabled")},t.handleChangeSiteThemeMode=()=>{s(".header__site-toggle .site-toggle","site_theme_mode_changed")},t.handleProButtonClick=()=>{s(".get-pro-button","pro_button_clicked")},t.handleFeatureEnabled=()=>{r.default.track({event_type:"feature_enabled"})},t.amplitudeStart=()=>{(()=>{const e=(0,o.getStorageAdapter)();e.get("deviceId").then((e=>{e&&r.default.setDeviceId(e)})),e.get("welcomePageOpened").then((t=>{t&&(r.default.track({event_type:"welcome_page_opened"}),e.remove("welcomePageOpened"))}))})(),(0,t.handlePopupOpen)(),(0,t.handleChangeDisableApp)(),(0,t.handleChangeEnableApp)(),(0,t.handleChangeSiteThemeMode)(),(0,t.handleProButtonClick)()}}},t={};function n(i){var r=t[i];if(void 0!==r)return r.exports;var o=t[i]={exports:{}};return e[i].call(o.exports,o,o.exports,n),o.exports}n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n(859)})(); \ No newline at end of file diff --git a/ui/popup/compatibility.js b/ui/popup/compatibility.js new file mode 100644 index 0000000..449ea4c --- /dev/null +++ b/ui/popup/compatibility.js @@ -0,0 +1,41 @@ +(function () { + 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/iabnclnclchijjckhdljmocghgmgnnii"; + 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/ui/popup/index.html b/ui/popup/index.html new file mode 100644 index 0000000..ee43366 --- /dev/null +++ b/ui/popup/index.html @@ -0,0 +1,23 @@ + + + + + Dark Reader settings + + + + + + + + + + +

+ +
+ + diff --git a/ui/popup/index.js b/ui/popup/index.js new file mode 100644 index 0000000..01f3d5a --- /dev/null +++ b/ui/popup/index.js @@ -0,0 +1,7006 @@ +(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 userAgent = + typeof navigator === "undefined" + ? "some useragent" + : navigator.userAgent.toLowerCase(); + const platform = + typeof navigator === "undefined" + ? "some platform" + : navigator.platform.toLowerCase(); + const isChromium = + userAgent.includes("chrome") || userAgent.includes("chromium"); + 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"); + userAgent.includes("safari") && !isChromium; + const isWindows = platform.startsWith("win"); + const isMacOS = platform.startsWith("mac"); + const isMobile = userAgent.includes("mobile"); + const chromiumVersion = (() => { + const m = userAgent.match(/chrom[e|ium]\/([^ ]+)/); + 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; + } + globalThis.chrome && + globalThis.chrome.runtime && + globalThis.chrome.runtime.getManifest && + globalThis.chrome.runtime.getManifest().manifest_version === 3; + 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"; + })(); + + const MessageType = { + UI_GET_DATA: "ui-get-data", + UI_SUBSCRIBE_TO_CHANGES: "ui-subscribe-to-changes", + UI_UNSUBSCRIBE_FROM_CHANGES: "ui-unsubscribe-from-changes", + UI_CHANGE_SETTINGS: "ui-change-settings", + UI_SET_THEME: "ui-set-theme", + UI_SET_SHORTCUT: "ui-set-shortcut", + UI_TOGGLE_ACTIVE_TAB: "ui-toggle-active-tab", + UI_MARK_NEWS_AS_READ: "ui-mark-news-as-read", + UI_MARK_NEWS_AS_DISPLAYED: "ui-mark-news-as-displayed", + UI_LOAD_CONFIG: "ui-load-config", + UI_APPLY_DEV_DYNAMIC_THEME_FIXES: "ui-apply-dev-dynamic-theme-fixes", + UI_RESET_DEV_DYNAMIC_THEME_FIXES: "ui-reset-dev-dynamic-theme-fixes", + UI_APPLY_DEV_INVERSION_FIXES: "ui-apply-dev-inversion-fixes", + UI_RESET_DEV_INVERSION_FIXES: "ui-reset-dev-inversion-fixes", + UI_APPLY_DEV_STATIC_THEMES: "ui-apply-dev-static-themes", + UI_RESET_DEV_STATIC_THEMES: "ui-reset-dev-static-themes", + UI_SAVE_FILE: "ui-save-file", + UI_REQUEST_EXPORT_CSS: "ui-request-export-css", + BG_CHANGES: "bg-changes", + BG_ADD_CSS_FILTER: "bg-add-css-filter", + BG_ADD_STATIC_THEME: "bg-add-static-theme", + BG_ADD_SVG_FILTER: "bg-add-svg-filter", + BG_ADD_DYNAMIC_THEME: "bg-add-dynamic-theme", + BG_EXPORT_CSS: "bg-export-css", + BG_UNSUPPORTED_SENDER: "bg-unsupported-sender", + BG_CLEAN_UP: "bg-clean-up", + BG_RELOAD: "bg-reload", + BG_FETCH_RESPONSE: "bg-fetch-response", + BG_UI_UPDATE: "bg-ui-update", + BG_CSS_UPDATE: "bg-css-update", + CS_COLOR_SCHEME_CHANGE: "cs-color-scheme-change", + CS_FRAME_CONNECT: "cs-frame-connect", + CS_FRAME_FORGET: "cs-frame-forget", + CS_FRAME_FREEZE: "cs-frame-freeze", + CS_FRAME_RESUME: "cs-frame-resume", + CS_EXPORT_CSS_RESPONSE: "cs-export-css-response", + CS_FETCH: "cs-fetch", + CS_DARK_THEME_DETECTED: "cs-dark-theme-detected", + CS_DARK_THEME_NOT_DETECTED: "cs-dark-theme-not-detected", + }; + + 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); + }); + }); + } + + 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 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 }; + } + throw new Error(`Unable to parse ${$color}`); + } + 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 }; + } + } + throw new Error(`Unable to parse ${$hex}`); + } + 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, + }; + } + 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); + return m$1("input", { + class: cls, + type: "text", + 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 = parse(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(parse(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) { + try { + parse(color); + return true; + } catch (err) { + return false; + } + } + 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); + } + let isPickerVisible; + try { + parse(props.value); + isPickerVisible = true; + } catch (err) { + isPickerVisible = false; + } + 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__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 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 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); + } + + const is12H = new Date().toLocaleTimeString(getUILanguage()).endsWith("M"); + function toLocaleTime($time) { + const [hours, minutes] = parseTime($time); + const mm = `${minutes < 10 ? "0" : ""}${minutes}`; + if (is12H) { + const h = hours === 0 ? "12" : hours > 12 ? hours - 12 : hours; + return `${h}:${mm}${hours < 12 ? "AM" : "PM"}`; + } + return `${hours}:${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 = toLocaleTime(props.startTime); + } + function setEndTime(node) { + node.value = toLocaleTime(props.endTime); + } + return m$1( + "span", + { class: "time-range-picker" }, + m$1(TextBox, { + class: "time-range-picker__input time-range-picker__input--start", + placeholder: toLocaleTime("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", + placeholder: toLocaleTime("9: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 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)) + ) { + 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 (isThunderbird) { + return true; + } + 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}`), + [] + ); + } + + 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 || isThunderbird, + }, + onclick: onSiteToggleClick, + }, + m$1( + "span", + { class: "site-toggle__mark" }, + m$1(CheckmarkIcon, { isChecked: isSiteEnabled }) + ), + " ", + m$1("span", { class: "site-toggle__url" }, pdf ? "PDF" : urlText) + ); + } + + function MoreToggleSettings({ data, actions, isExpanded, onClose }) { + const isSystemAutomation = data.settings.automation === "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, + }, + }); + } + 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 === "time", + onchange: (e) => + actions.changeSettings({ + automation: e.target.checked ? "time" : "", + }), + }), + 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 === "location", + onchange: (e) => + actions.changeSettings({ + automation: e.target.checked ? "location" : "", + }), + }), + 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) => + actions.changeSettings({ + automation: e.target.checked ? "system" : "", + }), + }), + 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: () => + actions.changeSettings({ + automation: isSystemAutomation ? "" : "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: "", + }); + } + const tab = data.activeTab; + const isAutomation = Boolean(data.settings.automation); + const isTimeAutomation = data.settings.automation === "time"; + const isLocationAutomation = data.settings.automation === "location"; + const now = new Date(); + return m$1( + "header", + { class: "header" }, + + 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) => + 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); + + function AutomationPage(props) { + const isSystemAutomation = props.data.settings.automation === "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, + }, + }); + } + return m$1( + "div", + { class: "automation-page" }, + m$1( + "div", + { class: "automation-page__line" }, + m$1(CheckBox, { + checked: props.data.settings.automation === "time", + onchange: (e) => + props.actions.changeSettings({ + automation: e.target.checked ? "time" : "", + }), + }), + 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 === "location", + onchange: (e) => + props.actions.changeSettings({ + automation: e.target.checked ? "location" : "", + }), + }), + 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) => + props.actions.changeSettings({ + automation: e.target.checked ? "system" : "", + }), + }), + m$1( + Button, + { + class: { + "automation-page__system-dark-mode__button": true, + "automation-page__system-dark-mode__button--active": + isSystemAutomation, + }, + onclick: () => + props.actions.changeSettings({ + automation: isSystemAutomation ? "" : "system", + }), + }, + getLocalMessage("system_dark_mode") + ) + ), + m$1( + "p", + { class: "automation-page__description" }, + getLocalMessage("system_dark_mode_description") + ), + m$1(DropDown, { + onChange: (selected) => + props.actions.changeSettings({ automationBehaviour: selected }), + selected: props.data.settings.automationBehaviour, + 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; + const isOff = + props.data.settings.enabled === false && !props.data.settings.automation; + const isAutomation = Boolean(props.data.settings.automation); + const isTimeAutomation = props.data.settings.automation === "time"; + const isLocationAutomation = props.data.settings.automation === "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: "", + }); + } else if (index === 2) { + props.actions.changeSettings({ + enabled: false, + automation: "", + }); + } else if (index === 1) { + props.actions.changeSettings({ + automation: "system", + }); + } + } + 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 ThemeEngines = { + cssFilter: "cssFilter", + svgFilter: "svgFilter", + staticTheme: "staticTheme", + dynamicTheme: "dynamicTheme", + }; + + function Mode(props) { + function openCSSEditor() { + chrome.windows.create({ + type: "panel", + url: isFirefox + ? "../stylesheet-editor/index.html" + : "ui/stylesheet-editor/index.html", + width: 600, + height: 600, + }); + } + const modes = [ + { + id: ThemeEngines.dynamicTheme, + content: getLocalMessage("engine_dynamic"), + }, + { id: ThemeEngines.cssFilter, content: getLocalMessage("engine_filter") }, + { + id: ThemeEngines.svgFilter, + content: getLocalMessage("engine_filter_plus"), + }, + { + id: ThemeEngines.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 !== ThemeEngines.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: ThemeEngines.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: "", + automationBehaviour: "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 && + props.data.settings.automationBehaviour === "Scheme" + ) { + props.actions.changeSettings({ + automation: "", + }); + } + } + 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) {} + 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") + ); + } + + function getExistingDevToolsObject() { + if (isMobile) { + return new Promise((resolve) => { + chrome.tabs.query({}, (t) => { + for (const tab of t) { + if (tab.url.endsWith("ui/devtools/index.html")) { + 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("ui/devtools/index.html")) { + resolve(window); + return; + } + } + resolve(null); + } + ); + }); + } + async function openDevTools$1() { + const devToolsObject = await getExistingDevToolsObject(); + if (isMobile) { + if (devToolsObject) { + chrome.tabs.update(devToolsObject.id, { active: true }); + window.close(); + } else { + chrome.tabs.create({ + url: "../devtools/index.html", + }); + window.close(); + } + } else if (devToolsObject) { + chrome.windows.update(devToolsObject.id, { focused: true }); + } else { + chrome.windows.create({ + type: "popup", + url: isFirefox ? "../devtools/index.html" : "ui/devtools/index.html", + width: 600, + height: 600, + }); + } + } + function DevToolsGroup(props) { + const globalThemeEngine = props.data.settings.theme.engine; + const devtoolsData = props.data.devtools; + const hasCustomFixes = + (globalThemeEngine === ThemeEngines.dynamicTheme && + devtoolsData.hasCustomDynamicFixes) || + ([ThemeEngines.cssFilter, ThemeEngines.svgFilter].includes( + globalThemeEngine + ) && + devtoolsData.hasCustomFilterFixes) || + (globalThemeEngine === ThemeEngines.staticTheme && + devtoolsData.hasCustomStaticFixes); + return m$1( + ControlGroup$1, + null, + m$1( + ControlGroup$1.Control, + null, + m$1( + ResetButton$1, + { + onClick: openDevTools$1, + class: { + "dev-tools-button": true, + "dev-tools-button--has-custom-fixes": hasCustomFixes, + }, + }, + "\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, { ...props }), + 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("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(`DarkMode-${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 0; + } + + 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 === ThemeEngines.dynamicTheme ? m$1(ExportTheme, null) : null, + m$1(ResetButtonGroup, { ...props }) + ); + } + + function Logo() { + // return m$1("a", { class: "m-logo", href: "", target: "_blank", rel: "noopener noreferrer" }, ""); + } + 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 = [ + [ThemeEngines.cssFilter, getLocalMessage("engine_filter")], + [ThemeEngines.svgFilter, getLocalMessage("engine_filter_plus")], + [ThemeEngines.staticTheme, getLocalMessage("engine_static")], + [ThemeEngines.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 === ThemeEngines.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 + ); + } + + function NewsGroup({ news, expanded, onNewsOpen, onClose }) { + return 0; + } + 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; + } + } + const globalThemeEngine = props.data.settings.theme.engine; + const devtoolsData = props.data.devtools; + const hasCustomFixes = + (globalThemeEngine === ThemeEngines.dynamicTheme && + devtoolsData.hasCustomDynamicFixes) || + ([ThemeEngines.cssFilter, ThemeEngines.svgFilter].includes( + globalThemeEngine + ) && + devtoolsData.hasCustomFilterFixes) || + (globalThemeEngine === ThemeEngines.staticTheme && + devtoolsData.hasCustomStaticFixes); + 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: isThunderbird + ? { + Filter: m$1(FilterSettings, { + data: props.data, + actions: props.actions, + }), + More: m$1(MoreSettings, { + data: props.data, + actions: props.actions, + fonts: props.fonts, + }), + } + : { + 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"), + }, + }) + ); + } + 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(); + if (!isThunderbird) { + 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/ui/popup/style.css b/ui/popup/style.css new file mode 100644 index 0000000..56648b1 --- /dev/null +++ b/ui/popup/style.css @@ -0,0 +1,3053 @@ +@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: none; + text-transform: uppercase; + box-sizing: content-box; + color: #ffffff; + cursor: pointer; + display: inline-flex; + justify-content: center; + align-items: center; + height: 2.25rem; + line-height: 2.125rem; + border-radius: 0.25rem; + outline: none; + overflow: hidden; + padding: 0 0.5rem; + 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: #43b6dc; +} +.button__wrapper { + height: 100%; + width: 100%; +} +.checkbox { + align-items: stretch; + background-color: #414143; + border: 0.125rem solid #43b6dc; + cursor: pointer; + display: inline-flex; + flex: none; + flex-direction: row; + height: 1.5625rem; + transition: background-color 250ms; + width: 1.5625rem; + border-bottom-left-radius: 0.3125rem; + border-top-left-radius: 0.3125rem; +} +.checkbox:hover { + background-color: #565658; + transition: background-color 125ms; +} +.checkbox__input { + display: none; +} +.checkbox__checkmark { + display: inline-block; + height: 100%; + position: relative; + width: 1.5625rem; +} +.checkbox__checkmark::before { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f070"; + direction: rtl; + padding: 0.3125rem 0 0.3125rem 0.3125rem; +} +.checkbox__checkmark--active::before { + color: #ffffff; + padding: 0.3125rem 0 0.3125rem 0.3125rem; + content: "\f06e"; +} +.checkbox__input:checked + .checkbox__checkmark::before { + color: #ffffff; + content: "\f06e"; +} +.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: #43b6dc; + background-image: url('data:image/svg+xml;utf8,'); + background-position: center right 0.25rem; + background-repeat: no-repeat; + background-size: 1rem; + border-radius: 0.625rem; + 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: #414143; + border: 0.125rem solid #316e7d; + border-top: none; + border-radius: 0.625rem; + 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: #414143; + color: #ffffff; + display: inline-flex; + justify-content: center; + min-height: 1.25rem; + text-align: center; + width: 100%; +} +.dropdown__list__item:hover { + background-color: #565658; + transition: background-color 125ms; +} +.dropdown__list__item--selected { + overflow: hidden; + visibility: hidden; + white-space: nowrap; +} +.dropdown--open .dropdown__list { + border-radius: 0.75rem; + display: inline-block; + margin-top: 0rem; + z-index: 1; +} +.dropdown--open .dropdown__list__item { + min-height: 1.5rem; +} +.dropdown--open .dropdown__selected { + border-radius: 0.75rem; + height: 1.5rem; + margin-top: 0rem; + z-index: 2; +} +.preview .dropdown { + cursor: pointer; +} +.message-box { + background-color: #353535; + 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: #414143; + border: 0.125rem solid #316e7d; + box-sizing: content-box; + color: #ffffff; + display: inline-flex; + height: 1.5625rem; + 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: #565658; +} +.multi-switch__highlight { + background-color: #43b6dc; + 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(53, 53, 53, 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; + margin-top: 0.5rem; + pointer-events: none; +} + +.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.6875rem; + padding: 0 0.625rem; + white-space: pre; +} +.tab-panel__button:hover { + color: #53a1b3; +} +.tab-panel__button:active { + background-color: #565658; +} +.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: #353535; + 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.1953125rem; + position: absolute; + top: 0.78125rem; + width: 0.5859375rem; + z-index: 1; +} +.select__expand__icon::before { + left: 0.1953125rem; + transform: skewY(45deg); +} +.select__expand__icon::after { + left: 0.78125rem; + transform: skewY(-45deg); +} +.select__list { + background-color: #353535; + 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: #414143; + cursor: pointer; + display: flex; + flex: none; + height: 1.5625rem; + flex-direction: row; + padding-left: 0.40625rem; +} +.select__option:hover { + background-color: #565658; +} +.slider { + display: inline-block; + height: 1.5rem; + position: relative; + width: 100%; +} +.slider__track { + background-color: #565658; + display: inline-block; + height: 0.875rem; + margin-left: 0.625rem; + margin-top: 0.3125rem; + position: absolute; + width: calc(100% - 1.25rem); +} +.slider__track__fill { + background-color: #43b6dc; + display: inline-block; + height: 100%; + position: absolute; +} +.slider__track__fill::before { + background-color: #43b6dc; + border-bottom-left-radius: 0.4375rem; + border-top-left-radius: 0.4375rem; + content: ""; + height: 0.875rem; + position: absolute; + right: 100%; + width: 0.4375rem; +} +.slider__track::before, +.slider__track::after { + background-color: #565658; + content: ""; + height: 0.875rem; + position: absolute; + width: 0.4375rem; +} +.slider__track::before { + border-bottom-left-radius: 0.4375rem; + border-top-left-radius: 0.4375rem; + right: 100%; +} +.slider__track::after { + border-bottom-right-radius: 0.4375rem; + border-top-right-radius: 0.4375rem; + left: 100%; +} +.slider__thumb-wrapper { + margin-left: 0.625rem; + position: absolute; + width: calc(100% - 1.25rem); +} +.slider__thumb { + background-color: #ffffff; + border-radius: 50%; + cursor: pointer; + display: inline-block; + height: 1.25rem; + margin-left: -0.625rem; + margin-top: 0.125rem; + position: absolute; + width: 1.25rem; +} +.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-left: -0.75rem; + margin-top: 0rem; + width: 1.5rem; +} +.slider--active .slider__thumb__value { + line-height: 1.5rem; +} +.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.625rem; + 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 #353535; +} +.textbox { + background-color: #141e24; + border: 0.125rem solid #43b6dc; + box-sizing: content-box; + color: #53a1b3; + height: 1.5625rem; + line-height: 1.5625rem; + outline: none; + overflow: hidden; + padding: 0; + text-indent: 0.40625rem; + transition: background-color 250ms; +} +.textbox:hover, +.textbox:focus { + background-color: #193945; + transition: background-color 125ms; +} +.textbox:focus { + color: #ffffff; +} +.textbox::placeholder { + color: #316e7d; +} +.time-range-picker { + display: inline-flex; +} +.time-range-picker__input { + flex: auto; + text-align: center; + text-indent: 0; + width: 100%; +} +.time-range-picker__input--start { + border-right: none; +} +.time-range-picker__input--end { + border-left: 0.0625rem solid #43b6dc; + border-top-right-radius: 0.3125rem; + border-bottom-right-radius: 0.3125rem; +} +.toggle { + background-color: #414143; + box-sizing: content-box; + color: #ffffff; + display: inline-flex; + height: 1.5625rem; + position: relative; + -moz-user-select: none; + user-select: none; + border-radius: 3.125rem; +} +.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) { + color: #43b6dc; +} +.toggle::before { + background-color: #43b6dc; + content: ""; + display: inline-block; + height: 100%; + left: 50%; + position: absolute; + top: 0; + transition: left 125ms; + width: 50%; + border-radius: 3.125rem; +} +.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; + align-items: center; +} +.updown__line > :not(:first-child) { + margin-left: 0.5rem; +} +.updown__icon { + display: inline-block; + height: 100%; + position: relative; + width: 100%; +} +.updown__icon::before { + top: 0.1953125rem; +} +.updown__icon::after { + top: 0.78125rem; +} +.updown__icon-up::before { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "+"; +} +.updown__icon-down::before { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "-"; +} +.updown__button--disabled { + pointer-events: none; +} +.updown__button--disabled:hover, +.updown__button--disabled:active { + background-color: #414143; +} +/* .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; + margin-top: 0.05rem; +} +.track { + align-items: center; + background-color: #414143; + box-sizing: content-box; + display: inline-flex; + flex: auto; + flex-direction: row; + height: 1.5625rem; + justify-content: center; + overflow: hidden; + position: relative; + transition: background-color 250ms; + -moz-user-select: none; + user-select: none; + border-radius: 3.125rem; +} +.track:hover { + background-color: #565658; + transition: background-color 125ms; +} +.track--clickable { + cursor: pointer; +} +.track__value { + background-color: #43b6dc; + height: 100%; + left: 0; + position: absolute; + top: 0; + transition: width 125ms; + border-radius: 3.125rem; +} +.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: #353535; + border-radius: 0.75rem; + 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: #43b6dc; + border: none; + border-radius: 0.625rem; + 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 { + border-radius: 50%; + 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; + border-radius: 50%; + 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; + border-radius: 0.90625rem; + width: calc(100% - 2 * 0.125rem); +} +.nav-button__content { + align-items: center; + display: inline-flex; + flex-direction: row; + height: 100%; +} +.reset-button { + border-radius: 0.90625rem; + 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: #353535; + color: #53a1b3; + 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.875rem; + font-weight: 300; +} +::-moz-selection { + background-color: #e96c4c; + color: #ffffff; +} +::selection { + background-color: #e96c4c; + color: #ffffff; +} +::-webkit-scrollbar { + background-color: #353535; + width: 0.75rem; +} +::-webkit-scrollbar-thumb { + background-color: #565658; +} +::-webkit-scrollbar-thumb:hover { + background-color: #4d869a; +} +::-webkit-scrollbar-thumb:active { + background-color: #43b6dc; +} +::-webkit-scrollbar-corner { + background-color: #353535; +} +* { + scrollbar-color: #565658 #353535; +} +.custom-settings-toggle { + color: #53a1b3; + white-space: normal; +} +.custom-settings-toggle--checked, +.custom-settings-toggle:active, +.custom-settings-toggle--checked:hover { + background-color: #43b6dc; + 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 { + line-height: 1 !important; + align-items: center; + display: inline-flex; + justify-content: center; + min-width: 17.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:hover { + box-shadow: 0 0 0.75rem #ffffff; +} +.filter-settings { + margin-top: 0.3rem; + align-items: stretch; + display: flex; + flex-direction: column; + width: 100%; +} +.filter-settings > :not(:first-child) { + margin-top: 0.9375rem; +} +.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; + align-items: center; +} +.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; + margin-top: 0.05rem; +} +.mode-toggle__button--active { + background: #43b6dc; +} +.mode-toggle__button--active:hover { + background: #43b6dc; +} +.icon { + background-size: contain; + display: inline-block; + height: 100%; + width: 100%; +} +.icon--dark-mode::before { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "-"; +} +.icon--light-mode::before { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "+"; +} +.manage-subscription { + width: 100%; + text-align: center; + color: #fff; + text-decoration: underline; + cursor: pointer; +} +.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: "app-toggle" "apply-to-listed-only-toggle" "site-toggle"; + grid-gap: 0.5rem; + width: 100%; +} +.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__apply-to-listed-only-toggle { + grid-area: apply-to-listed-only-toggle; +} +.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; + border-radius: 0.3125rem; + height: 1.625rem; + left: 90%; + opacity: 1; + position: absolute; + top: 0; + transition: opacity 250ms, background-color 250ms, color 250ms; + width: 1.5625rem; + display: none; +} +.header__app-toggle__more-button:hover { + background-color: #193945; + color: #ffffff; +} +.header__app-toggle__more-button::before { + content: "\f017"; + display: inline-block; + font-family: "Font Awesome 5 Free"; + font-size: 0.875rem; + font-weight: bold; + height: 100%; + line-height: 1.625rem; + 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(53, 53, 53, 0.9); + border-bottom: 0.125rem solid #43b6dc; + border-top: 0.125rem solid #43b6dc; + display: flex; + flex-direction: column; + height: 5.5rem; + left: 0; + position: absolute; + top: 5.9375rem; + 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.5625rem; + justify-content: space-between; + overflow: hidden; + padding-left: 2.1875rem; +} +.header__app-toggle__more-settings__top__text { + line-height: 1rem; +} +.header__app-toggle__more-settings__top__close { + color: #ffffff; + cursor: pointer; + display: inline-block; + font-size: 1.171875rem; + height: 1.5625rem; + line-height: 1.5625rem; + text-align: center; + user-select: none; + width: 1.5625rem; +} +.header__app-toggle__more-settings__top__close:hover { + background-color: rgba(67, 182, 220, 0.25); +} +.header__app-toggle__more-settings__content { + flex: auto; + overflow: hidden; + padding: 0.75rem 2.1875rem; + 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(53, 53, 53, 0.9), rgba(53, 53, 53, 0)); + content: ""; + display: block; + height: 1.5625rem; + 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: #565658; +} +.header .shortcut { + overflow: hidden; +} +.loader { + background-color: #353535; + height: 36.375rem; + left: 50%; + pointer-events: none; + position: fixed; + top: 50%; + transform: translate(-50%, -50%); + transition: background-color 125ms ease-out; + width: 22.375rem; + z-index: 999; +} +.loader--complete { + background-color: rgba(53, 53, 53, 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: 4.25rem; + width: 0%; +} +.loader__message { + animation: 125ms loading-fade-in 500ms ease-in forwards; + color: #e96c4c; + font-size: 0.625rem; + opacity: 0; + position: absolute; + right: 2.1875rem; + bottom: 32.125rem; +} +.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: 3.875rem; + 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, #353535, rgba(53, 53, 53, 0)); + content: ""; + display: block; + height: 1.5625rem; + pointer-events: none; + width: 100%; +} +.news__header { + align-items: flex-end; + background-image: linear-gradient(to bottom, rgba(53, 53, 53, 0.9), rgba(53, 53, 53, 0.95)); + border-top: 0.125rem solid #316e7d; + color: #e96c4c; + display: flex; + flex: none; + font-size: 0.875rem; + height: 1.5625rem; + justify-content: space-between; + padding-left: 2.1875rem; +} +.news__header__text { + line-height: 1rem; +} +.news__close { + color: #e96c4c; + cursor: pointer; + display: inline-block; + font-size: 1.171875rem; + height: 1.5625rem; + line-height: 1.5625rem; + text-align: center; + user-select: none; + width: 1.5625rem; +} +.news__close:hover { + background-color: rgba(67, 182, 220, 0.25); +} +.news__list { + background-color: rgba(53, 53, 53, 0.95); + border-bottom: 0.125rem solid #316e7d; + flex: auto; + padding: 0.75rem 2.1875rem; + 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--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: center; + width: 0.75rem; +} +.site-toggle__mark::before { + color: #53a1b3; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + direction: rtl; + top: -70px; +} +.site-toggle__mark--active::before { + color: #ffffff; + content: "\f06e"; + display: inline-block; +} +.site-toggle--active { + color: #ffffff; +} +.paywall { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 1000; + background: rgba(0, 0, 0, 0.9); + --color-base-003: hsla(0, 0%, 100%, 0.03); + --slide-animation-time: 0.35s; + --default-animation-time: 0.15s; + --default-animation: cubic-bezier(0, 0.4, 0.6, 1); + --font-family-default: "Inter", sans-serif; + --font-family-title: "Manrope", sans-serif; + --color-default-100: #fff; + --color-default-075: hsla(0, 0%, 100%, 0.75); + --color-default-050: hsla(0, 0%, 100%, 0.5); + --color-default-025: hsla(0, 0%, 100%, 0.25); + --color-default-015: hsla(0, 0%, 100%, 0.15); + --color-default-010: hsla(0, 0%, 100%, 0.1); + --color-default-005: hsla(0, 0%, 100%, 0.05); + --color-default-003: hsla(0, 0%, 100%, 0.03); + --color-default-001: hsla(0, 0%, 100%, 0.01); + --color-default-000: hsla(0, 0%, 100%, 0); + --color-base-100: #151b1e; + --color-base-075: rgba(21, 27, 30, 0.75); + --color-base-050: rgba(21, 27, 30, 0.5); + --color-base-025: rgba(21, 27, 30, 0.25); + --color-base-015: rgba(21, 27, 30, 0.15); + --color-base-010: rgba(21, 27, 30, 0.1); + --color-base-005: rgba(21, 27, 30, 0.05); + --color-base-000: rgba(21, 27, 30, 0); + --fixed-color-black-010: rgba(0, 0, 0, 0.1); + --fixed-color-white-100: #fff; + --color-hex-03: #1976d2; + --shadow-inset: 0px 1px 0px #151b1e, inset 0px 1px 2px rgba(21, 27, 30, 0.1); + --shadow-grounded: 0px 1px 3px rgba(0, 0, 0, 0.5); + --shadow-elevated: 0px 0px 0px 1px hsla(0, 0%, 100%, 0.1), 0px 0px 0px 1px #151b1e, 0px 1px 2px rgba(0, 0, 0, 0.1), + 0px 8px 32px rgba(0, 0, 0, 0.15); + -webkit-font-smoothing: antialiased; + display: flex; + flex-flow: column; + justify-content: center; +} +.paywall-container-title { + color: #fff; + font-size: 24px; + width: 100%; + text-align: center; +} +.paywall-container-subtitle { + color: #fff; + font-size: 16px; + width: 100%; + text-align: center; +} +.paywall.paywall-license { + align-items: center; +} +.paywall-container, +.paywall-global-container { + box-sizing: border-box; + display: flex; + flex-direction: column; +} +.paywall-global-container { + grid-gap: 16px; + background: linear-gradient(180deg, var(--color-base-100) 0, var(--color-base-000) 100%), + linear-gradient(90deg, var(--color-base-100) 0, var(--color-base-000) 100%), var(--components-plus-bg); + background-size: 24px, cover; + padding: 16px 16px; +} +.paywall-container { + background-color: var(--color-base-100); + border: 1px solid var(--color-default-010); + border-radius: 8px; + overflow: hidden; + padding: 18px 16px; + position: relative; +} +.paywall-exp-container { + color: var(--color-default-100); + font-family: var(--font-family-default); + text-align: left; + user-select: none; + grid-gap: 8px; + align-items: center; + display: flex; +} +.paywall-exp-title { + text-align: left; + user-select: none; + display: inline-flex; + font-style: normal; + color: var(--color-default-100); + font-family: var(--font-family-default) !important; + font-weight: 500; + line-height: 10px; + font-size: 10px; + letter-spacing: 0.1em; + text-transform: uppercase; +} +.paywall-price-button-container { + font-size: 75%; + -webkit-font-smoothing: antialiased; + color: var(--color-default-100); + font-family: var(--font-family-default); + text-align: left; + user-select: none; + align-items: end; + display: flex; + justify-content: space-between; + margin-top: 31px; +} +.paywall-price-container { + font-size: 75%; + -webkit-font-smoothing: antialiased; + color: var(--color-default-100); + font-family: var(--font-family-default); + text-align: left; + user-select: none; + grid-gap: 9px; + display: flex; + flex-direction: column; +} +.paywall-price { + -webkit-font-smoothing: antialiased; + text-align: left; + user-select: none; + display: inline-flex; + font-style: normal; + letter-spacing: normal; + color: var(--color-default-100); + font-family: var(--font-family-default) !important; + font-weight: 500; + line-height: 24px; + font-size: 24px; +} +.paywall-price-exp { + -webkit-font-smoothing: antialiased; + text-align: left; + user-select: none; + display: inline-flex; + font-style: normal; + letter-spacing: normal; + color: var(--color-default-050); + font-family: var(--font-family-default) !important; + font-weight: 400; + line-height: 17px; + font-size: 14px; +} +.paywall-button { + -webkit-font-smoothing: antialiased; + user-select: none; + box-sizing: border-box; + cursor: pointer; + display: flex; + outline: none; + padding: 0; + position: relative; + text-decoration: none; + transition: background-color var(--default-animation-time) var(--default-animation), + border var(--default-animation-time) var(--default-animation), color var(--default-animation-time) var(--default-animation); + width: fit-content; + border-radius: 3px; + font-size: 14px; + line-height: 14px; + height: 40px; + box-shadow: var(--shadow-grounded); + background-color: var(--color-base-100); + border: 1px solid var(--color-default-010); + color: var(--color-default-100); + min-width: 124px; +} +.paywall-button-annual { + background-color: var(--color-hex-03); +} +.paywall-button:hover { + background-color: #193945; + transition: background-color 125ms; +} +.paywall-button:active { + background-color: #43b6dc; +} +.paywall-button-div { + -webkit-font-smoothing: antialiased; + user-select: none; + cursor: pointer; + font-size: 14px; + line-height: 14px; + color: var(--color-default-100); + background: transparent; + height: calc(100% + 2px); + left: -1px; + position: absolute; + top: -1px; + transition: background-color var(--default-animation-time) var(--default-animation), + border-color var(--default-animation-time) var(--default-animation), color var(--default-animation-time) var(--default-animation); + width: calc(100% + 2px); + z-index: 0; + border-radius: 3px; +} +.paywall-button-text { + -webkit-font-smoothing: antialiased; + user-select: none; + cursor: pointer; + font-size: 14px; + line-height: 14px; + color: var(--color-default-100); + align-items: center; + box-sizing: border-box; + display: inline-flex; + font-family: var(--font-family-default); + font-weight: 400; + height: 100%; + position: relative; + width: 100%; + z-index: 1; + justify-content: center; + text-align: center; +} +.paywall-input-container { + font-size: 75%; + -webkit-font-smoothing: antialiased; + color: var(--color-default-100); + font-family: var(--font-family-default); + text-align: left; + border-bottom: 1px solid transparent; + padding: 16px; + transition: border-color var(--default-animation-time) var(--default-animation); + width: 80%; +} +.paywall-input-label { + font-size: 75%; + -webkit-font-smoothing: antialiased; + color: var(--color-default-100); + font-family: var(--font-family-default); + text-align: left; + box-sizing: border-box; + display: inline-flex; + transition: border-color var(--default-animation-time) var(--default-animation), + background-color var(--default-animation-time) var(--default-animation); + height: 40px; + border-radius: 8px; + background: var(--color-base-100); + border: 1px solid var(--color-default-010); + box-shadow: inset 0 1px 4px var(--fixed-color-black-010); + position: relative; + width: 100%; +} +.paywall-input-div { + font-size: 75%; + -webkit-font-smoothing: antialiased; + color: var(--color-default-100); + font-family: var(--font-family-default); + position: relative; + z-index: 1; + display: flex; + width: 100%; + text-align: left; +} +.paywall-input { + -webkit-font-smoothing: antialiased; + text-align: left; + background: transparent; + border: none; + color: var(--color-default-100); + font-family: var(--font-family-default); + font-size: 14px; + font-weight: 400; + padding: 0; + width: 100%; + padding: 0 16px; + border-radius: 8px; + height: 40px; +} +.paywall-save-label { + -webkit-font-smoothing: antialiased; + text-align: left; + user-select: none; + display: inline-flex; + font-style: normal; + letter-spacing: normal; + font-family: var(--font-family-default) !important; + font-weight: 500; + line-height: 12px; + font-size: 12px; + border-radius: 4px; + background: var(--color-hex-03); + color: var(--fixed-color-white-100); + padding: 4px 6px; +} +.paywall-restore-purchase { + color: var(--fixed-color-white-100); +} +.paywall-restore-purchase-container { + width: 100%; + text-align: center; +} +.paywall-error-container { + width: 100%; + display: flex; + justify-content: center; + flex-flow: column; + align-items: center; + color: var(--fixed-color-white-100); + font-size: 16px; +} +.paywall-write-email { + width: 100%; + display: flex; + justify-content: center; + flex-flow: column; + align-items: center; + color: var(--fixed-color-white-100); + font-size: 16px; + margin-bottom: 16px; + text-align: center; +} +.paywall-back-button { + position: absolute; + top: 12px; + left: 12px; + font-size: 16px; + cursor: pointer; +} +.paywall-spinner { + justify-content: center; + align-items: center; +} +#html-spinner { + width: 40px; + height: 40px; + border: 4px solid #b1b1b1; + border-top: 4px solid white; + border-radius: 50%; +} +#html-spinner, +#svg-spinner { + -webkit-transition-property: -webkit-transform; + -webkit-transition-duration: 1.2s; + -webkit-animation-name: rotate; + -webkit-animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; + -moz-transition-property: -moz-transform; + -moz-animation-name: rotate; + -moz-animation-duration: 1.2s; + -moz-animation-iteration-count: infinite; + -moz-animation-timing-function: linear; + transition-property: transform; + animation-name: rotate; + animation-duration: 1.2s; + animation-iteration-count: infinite; + animation-timing-function: linear; +} +@-webkit-keyframes rotate { + from { + -webkit-transform: rotate(0deg); + } + to { + -webkit-transform: rotate(360deg); + } +} +@-moz-keyframes rotate { + from { + -moz-transform: rotate(0deg); + } + to { + -moz-transform: rotate(360deg); + } +} +@keyframes rotate { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} +body { + align-items: stretch; + box-sizing: content-box; + display: flex; + flex-direction: column; + height: 29rem; + margin: 0 auto; + padding: 2.1875rem; + position: relative; + width: 18rem; + padding-bottom: 0px; +} +.header { + flex: none; +} +.tab-panel { + flex: auto; + margin-top: 0.6rem; +} +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: #43b6dc; + 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 #43b6dc; +} +.donate-link__text { + font-weight: bold; + line-height: 1.5625rem; + transform: skewX(-10deg); +} + +.donate-link:hover::after { + filter: drop-shadow(0 0 0.125rem #e96c4c); +} +.dev-tools-button { + overflow: visible; + position: relative; +} +.dev-tools-button--has-custom-fixes::after { + background-color: #e96c4c; + border-radius: 0.4375rem; + color: #ffffff; + content: "!"; + font-size: 0.625rem; + line-height: 0.875rem; + min-width: 0.875rem; + position: absolute; + right: -0.29166667rem; + top: -0.29166667rem; + z-index: 3; +} +.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%; +} +.header .header__app-toggle .toggle { + /* margin-right: 1.875rem; */ +} +.mobile body { + border: none; + box-sizing: border-box; + height: auto; + margin: 2.1875rem auto; + padding: 0; +} +.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-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; + border-radius: 0.90625rem; + display: inline-flex; + justify-content: center; + height: 1.5625rem; + text-decoration: none; + width: calc(100% - 2 * 0.125rem); +} +.mobile .m-help-button:hover, +.preview .m-help-button:hover { + background-color: #565658; + transition: background-color 125ms; +} +.mobile .m-help-button__text, +.preview .m-help-button__text { + line-height: 1.5625rem; + height: 1.5625rem; + -moz-user-select: none; + user-select: none; + 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: #43b6dc; + border-radius: 0.90625rem; + display: inline-flex; + justify-content: center; + height: 1.8125rem; + text-decoration: none; + width: 100%; +} +.mobile .m-donate-button__text, +.preview .m-donate-button__text { + color: #ffffff; + display: inline-block; + font-weight: bold; + line-height: 1.5625rem; + height: 1.5625rem; + text-transform: uppercase; + transform: skewX(-10deg); + -moz-user-select: none; + user-select: none; +} +.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); +} +.preview .dev-tools-button--has-custom-fixes::after { + background-color: #e96c4c; + border-radius: 0.4375rem; + color: #ffffff; + content: "!"; + font-size: 0.625rem; + line-height: 0.875rem; + min-width: 0.875rem; + position: absolute; + right: -0.29166667rem; + top: -0.29166667rem; + z-index: 3; +} +.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.8125rem; +} +.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 { + border-radius: 0.90625rem; + width: calc(100% - 2 * 0.125rem); +} +.mobile .check-button .checkbox__checkmark, +.preview .check-button .checkbox__checkmark { + background-color: #43b6dc; + border-radius: 0.78125rem; +} +.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.5625rem; + 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 { + border-radius: 0.90625rem; + width: calc(100% - 0.125rem * 2); +} +.mobile .app-switch__control .multi-switch__highlight, +.preview .app-switch__control .multi-switch__highlight, +.mobile .app-switch__control .multi-switch__option, +.preview .app-switch__control .multi-switch__option { + border-radius: 0.78125rem; +} +.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 { + border-radius: 0.90625rem; + 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: #43b6dc; + border: 0.125rem solid #316e7d; + border-radius: 0.90625rem; + height: 1.5625rem; + position: relative; +} +.mobile .theme-group__presets-wrapper::before, +.preview .theme-group__presets-wrapper::before { + border: 0.125rem solid #316e7d; + border-bottom: none; + border-top-left-radius: 0.90625rem; + border-top-right-radius: 0.90625rem; + content: ""; + display: inline-block; + height: 1.8125rem; + 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-bottom-left-radius: 0.90625rem; + border-bottom-right-radius: 0.90625rem; + 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: #43b6dc; + background-image: url('data:image/svg+xml;utf8,'); + background-position: center right 0.25rem; + background-repeat: no-repeat; + background-size: 1rem; + border: none; + border-radius: 0.78125rem; + height: 1.3125rem; + 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 .page-viewer, +.preview .page-viewer { + height: 100%; + position: relative; +} +.mobile .page, +.preview .page { + align-items: stretch; + background-color: #353535; + 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; + border-radius: 0.90625rem; + 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__button--active, +.preview .automation-page__button--active { + background: #43b6dc; +} +.mobile .automation-page__button--active:hover, +.preview .automation-page__button--active:hover { + background: #43b6dc; +} +.mobile .automation-page__line, +.preview .automation-page__line { + display: flex; + flex-direction: row; +} +.mobile .automation-page__line .checkbox, +.preview .automation-page__line .checkbox { + border-bottom-left-radius: 0.90625rem; + border-right: none; + border-top-left-radius: 0.90625rem; + 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__line .time-range-picker .time-range-picker__input--end, +.preview .automation-page__line .time-range-picker .time-range-picker__input--end { + border-bottom-right-radius: 0.90625rem; + border-top-right-radius: 0.90625rem; +} +.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(53, 53, 53, 0.9), rgba(53, 53, 53, 0)); + content: ""; + display: block; + height: 1.5625rem; + 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-bottom-right-radius: 0.90625rem; + border-left: 0.0625rem solid #316e7d; + border-top-right-radius: 0.90625rem; +} +.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-bottom-right-radius: 0.90625rem; + border-left-width: 0.0625rem; + border-top-right-radius: 0.90625rem; + 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: #565658; +} +.mobile .automation-page .toggle, +.preview .automation-page .toggle { + width: 100%; +} +.mobile .settings-button, +.preview .settings-button { + border-radius: 0.78125rem; + 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: #43b6dc; + 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.5625rem; + 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.5625rem; + position: relative; + width: 100%; +} +.mobile .collapsible-panel__group__expand-button, +.preview .collapsible-panel__group__expand-button { + align-items: center; + background-color: #43b6dc; + background-image: url('data:image/svg+xml;utf8,'); + background-position: center left 0.375rem; + background-repeat: no-repeat; + background-size: 0.5rem; + border-radius: 0.625rem; + 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 { + border-radius: 0.90625rem; + height: 1.8125rem; +} +.mobile .theme-page .theme-preset-picker .dropdown__selected, +.preview .theme-page .theme-preset-picker .dropdown__selected { + border-radius: 0.90625rem; + height: 1.8125rem; +} +.mobile .theme-page .theme-preset-picker .dropdown__list, +.preview .theme-page .theme-preset-picker .dropdown__list { + border: 0.125rem solid #316e7d; + border-top: none; + border-radius: 0.90625rem; + 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.8125rem; +} +.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: #43b6dc; + border-radius: 0.625rem; + 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; + border-radius: 0.75rem; + margin-top: -0.125rem; +} +.mobile .theme-page .font-picker .select__expand, +.preview .theme-page .font-picker .select__expand { + background-color: #43b6dc; + border-radius: 0.625rem; + 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-bottom-left-radius: 0.625rem; + border-bottom-right-radius: 0.625rem; + 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__list::-webkit-scrollbar-thumb, +.preview .theme-page .font-picker .select__list::-webkit-scrollbar-thumb { + border-radius: 0.375rem; +} +.mobile .theme-page .font-picker.select--expanded, +.preview .theme-page .font-picker.select--expanded { + background-color: #316e7d; + border-top-left-radius: 0.75rem; + border-top-right-radius: 0.75rem; + 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; + border-radius: 0.75rem; +} +.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: #353535; + 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, +.preview .theme-preset-picker { + border-radius: 0.75rem; +} +.mobile .theme-preset-picker .dropdown__selected, +.preview .theme-preset-picker .dropdown__selected { + border-radius: 0.75rem; + height: 1.5625rem; + margin-top: 0; +} +.mobile .theme-preset-picker .dropdown__list, +.preview .theme-preset-picker .dropdown__list { + border: none; + border-radius: 0.75rem; + 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 { + border-radius: 50%; + 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: #43b6dc; + 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; + } +} + +.mode-toggle { + display: none; +}