// ==UserScript== // @name ChatGPT Widescreen 🖥️ // @name:af ChatGPT Widescreen Modus 🖥️ // @name:am ቻትጂፒቲ ሰፊ ስክሪን 🖥️ // @name:ar ChatGPT وضع شاشة عريضة 🖥️ // @name:az ChatGPT Geniş Ekran Rejimi 🖥️ // @name:be ChatGPT Рэжым шырокага экрана 🖥️ // @name:bem ChatGPT Icikope Icakulisha 🖥️ // @name:bg ChatGPT Широкоекранен режим 🖥️ // @name:bn ChatGPT উইডস্ক্রিন মোড 🖥️ // @name:bo ChatGPT རྒྱུ་ཆེན་གཞི་བསྒྲུབ་ རྒྱལ་བཤད། 🖥️ // @name:bs ChatGPT Režim širokog ekrana 🖥️ // @name:ca ChatGPT Mode de pantalla ampla 🖥️ // @name:ceb ChatGPT Lapadscreen 🖥️ // @name:ckb ChatGPT دەستکاری چوارچێوەی ڕووکاری 🖥️ // @name:cs ChatGPT Režim širokoúhlé obrazovky 🖥️ // @name:cy ChatGPT Mod Sgrin Lled 🖥️ // @name:da ChatGPT Bredformat-tilstand 🖥️ // @name:de ChatGPT Breitbildmodus 🖥️ // @name:dv ChatGPT ވިސްނުވެއް މޯޑި 🖥️ // @name:dz ChatGPT འབྲེལ་བ་གཞུང་ལས་སྤྱི་ཚོགས་གླེང་། 🖥️ // @name:el ChatGPT Λειτουργία ευρείας οθόνης 🖥️ // @name:eo ChatGPT Larĝekrana reĝimo 🖥️ // @name:es ChatGPT Modo de pantalla panorámica 🖥️ // @name:et ChatGPT Laiarakenduse režiim 🖥️ // @name:eu ChatGPT Pantaila Zabalaren Modua 🖥️ // @name:fa ChatGPT حالت تلویزیونی 🖥️ // @name:fi ChatGPT Laajakuva-tila 🖥️ // @name:fo ChatGPT Búðarformaður háttur 🖥️ // @name:fr ChatGPT Mode Écran Large 🖥️ // @name:fr-CA ChatGPT Mode Écran Large 🖥️ // @name:gd ChatGPT Dreach-sgrìn Leud 🖥️ // @name:gl ChatGPT Modo de pantalla ancha 🖥️ // @name:gu ChatGPT પ્રશાંત સ્ક્રીન મોડ 🖥️ // @name:haw ChatGPT Widescreen 🖥️ // @name:he ChatGPT מצב מסך רחב 🖥️ // @name:hi ChatGPT चहचटजीपटी वाइडस्क्रीन मोड 🖥️ // @name:hr ChatGPT Način širokog zaslona 🖥️ // @name:ht ChatGPT Mod Fomat Gwo 🖥️ // @name:hu ChatGPT Szélesvásznú mód 🖥️ // @name:hy ChatGPT լայնէկրանանշանի ռեժիմ 🖥️ // @name:id ChatGPT Mode Layar Lebar 🖥️ // @name:is ChatGPT Breiðskjásstilling 🖥️ // @name:it ChatGPT Modalità schermo panoramica 🖥️ // @name:ja ChatGPT ワイドスクリーンモード 🖥️ // @name:jv ChatGPT Mode Layar Lebar 🖥️ // @name:ka ChatGPT ფანტსარიშის რეჟიმი 🖥️ // @name:kab ChatGPT Amezwaru n Tikliwin Isellalen 🖥️ // @name:kk ChatGPT Көлеңкескен түрі 🖥️ // @name:km ChatGPT របៀបបង្អស្សមួយធ្វើដំបូង 🖥️ // @name:kn ChatGPT ChatGPT ವೈಡ್ಸ್ಕ್ರೀನ್ ಮೋಡ್ 🖥️ // @name:ko ChatGPT 와이드 스크린 모드 🖥️ // @name:ku ChatGPT Moda Pêlên Dirêj 🖥️ // @name:ky ChatGPT Жогорку Экрандык Режим 🖥️ // @name:la ChatGPT Modus Latus Plenus 🖥️ // @name:lb ChatGPT Breitbild-Modus 🖥️ // @name:lo ChatGPT ຮູບແບບໂປຣຟອນໃຫຍ່ 🖥️ // @name:lt ChatGPT Išplėstojo ekrano režimas 🖥️ // @name:lv ChatGPT Plašā ekrāna režīms 🖥️ // @name:mg ChatGPT Tarehimarika tamin'ny Widescreen 🖥️ // @name:mi ChatGPT Āhua Whātika ā-Raupapa 🖥️ // @name:mk ChatGPT Режим на широк екран 🖥️ // @name:ml ChatGPT വൈഡ്സ്ക്രീൻ മോഡ് 🖥️ // @name:mn ChatGPT Жинхэнэ Экранны Арга 🖥️ // @name:mr चॅटजीपीटी वाइडस्क्रीन 🖥️ // @name:ms ChatGPT Mod Skrin Lebar 🖥️ // @name:mt ChatGPT Modalità Widescreen 🖥️ // @name:my ChatGPT အများနှုန်းကျော်ဘုံ 🖥️ // @name:ne ChatGPT विस्तृत प्राण्डविक पद्धति 🖥️ // @name:nl ChatGPT Breedbeeldmodus 🖥️ // @name:no ChatGPT Bredskjermmodus 🖥️ // @name:ny ChatGPT Mawonekedwe Wathandiza 🖥️ // @name:pa ChatGPT ਵਾਇਡਸਕ੍ਰੀਨ ਮੋਡ 🖥️ // @name:pl ChatGPT Tryb szerokoekranowy 🖥️ // @name:ps ChatGPT د ډیسپلې موډ 🖥️ // @name:pt Modo Ecrã Largo do ChatGPT 🖥️ // @name:pt-BR ChatGPT Modo Tela Larga 🖥️ // @name:ro ChatGPT Mod ecran lat 🖥️ // @name:ru ChatGPT Режим широкоформатного экрана 🖥️ // @name:rw ChatGPT Ibindi by'umuhondo bw'ishusho 🖥️ // @name:sg ChatGPT Mode Écran Large 🖥️ // @name:si ChatGPT විශේෂාංග පෙළක්ෂාව 🖥️ // @name:sk ChatGPT Režim širokouhlého displeja 🖥️ // @name:sl ChatGPT Način širokega zaslona 🖥️ // @name:sm ChatGPT Laititi Fuamatala 🖥️ // @name:sn ChatGPT Zvimwe Zvitsva Mode 🖥️ // @name:so ChatGPT hab Widescreen Mode 🖥️ // @name:sq ChatGPT me ekran të gjerë 🖥️ // @name:sr ChatGPT Режим широког екрана 🖥️ // @name:st ChatGPT Skrene e Phara 🖥️ // @name:sv ChatGPT Bredbildsläge 🖥️ // @name:sw ChatGPT Njia ya Skrini Panoramio 🖥️ // @name:ta ChatGPT விரிவான திரை முறை 🖥️ // @name:te ChatGPT ChatGPT వైడ్ స్క్రీన్ మోడ్ 🖥️ // @name:tg ChatGPT Возачи Режаи Дисплеи Барнома 🖥️ // @name:th ChatGPT โหมดหน้าจอแบบเต็มจอ 🖥️ // @name:ti ቻትጂፒቲ ዋይድስክሪን ሞድ 🖥️ // @name:tk ChatGPT Giň Ekran Tertibi 🖥️ // @name:tl ChatGPT Malapad na Screen 🖥️ // @name:tn ChatGPT Nyemba Yemba Mzizo 🖥️ // @name:to ChatGPT Moli ʻo e Ngaahi Fatongi ʻo Haʻaneesi 🖥️ // @name:tr ChatGPT Geniş Ekran Modu 🖥️ // @name:tt ChatGPT киң экран 🖥️ // @name:ug ChatGPT keng ekran 🖥️ // @name:uk ChatGPT Режим широкого екрана 🖥️ // @name:ur ChatGPT وائڈ اسکرین موڈ 🖥️ // @name:uz ChatGPT Keng ekranga rejim 🖥️ // @name:vi ChatGPT Chế độ Màn hình Rộng 🖥️ // @name:wo ChatGPT écran large 🖥️ // @name:xh ChatGPT Indlela ye-Widescreen Mode 🖥️ // @name:yi ChatGPT ווידעסקרעען מאָדע 🖥️ // @name:yo Wide iboju 🖥️ ChatGPT // @name:zh ChatGPT 宽屏模式 🖥️ // @name:zh-CN ChatGPT 宽屏模式 🖥️ // @name:zh-HK ChatGPT 寬螢幕模 🖥️ // @name:zh-SG ChatGPT 宽屏模式 🖥️ // @name:zh-TW ChatGPT 寬螢幕模 🖥️ // @name:zu ChatGPT Isimo sokudlalwa emkhumbini 🖥️ // @description Enhances ChatGPT with wide/full/tall-screen + spamblock modes. Also works on poe.com! // @description:af Verbetert ChatGPT met breë/volle/lang-skerm + spamblokkeringsmodusse. Werk ook op poe.com! // @description:am ቻትጂፒቲን በትልቅ/ሙሉ/ረጅም ስክሪን + ስፓም ብሎክ ሞዶች ይማራል። በpoe.com ላይም ይሰራል! // @description:ar يعزز ChatGPT مع أوضاع الشاشة الواسعة / الكاملة / الطويلة + وضع حظر الرسائل المزعجة. يعمل أيضًا على poe.com! // @description:az ChatGPT-ni geniş/dolğu/yüksək ekran + spam bloklama rejimləri ilə təkmilləşdirir. Həmçinin poe.com-da işləyir! // @description:be Палепшыць ChatGPT з рэжымамі шырокі/поўны/высокі экран + блокаванне спаму. Таксама працуе на poe.com! // @description:bem ChatGPT ikalishe na mawodi ya kufyala/kukwata/manyefu + spamblock. Ikaba na ntchito ku poe.com! // @description:bg Подобрява ChatGPT с режими за широк екран/пълен/висок + блокиране на спам. Работи също на poe.com! // @description:bn চ্যাটজিপিটি কে প্রশস্ত/পূর্ণ/উচ্চ-স্ক্রীন + স্প্যামব্লক মোডের সাথে উন্নত করে। এটি poe.com-এও কাজ করে! // @description:bo ChatGPTའདི་ལུང་བརྗེད་འཕྲིན་སྐོར་དབྱར་ཆེན་སྐོར་འདི་ཡིན་ནི་ཁ་ལོག་+ spamblock མཉམ་སྒོའི་མཐར་ཕྱོགས་མཛད་ཡིན། poe.com་ལ་འགྱོ་ཡིན། // @description:bs Poboljšava ChatGPT s režimima širokog/punog/visokog ekrana + blokade spama. Također radi na poe.com! // @description:ca Millora ChatGPT amb modes d'écran ampli/complet/alt + modes de bloqueig de correu brossa. També funciona a poe.com! // @description:ceb Nagpalambo sa ChatGPT gamit ang lapad/puno/taas-screen + spamblock nga mga mode. Nagtrabaho usab kini sa poe.com! // @description:ckb پارەکەری دەکات ChatGPT بە ڕووکاری وشەی کەسەرە/کامل/بەرز + ڕووکاری پەڕەی ڕووكارەوە. هەروەها کاردەکاتە سەر poe.com! // @description:cs Vylepšuje ChatGPT s režimy širokého/plného/vysokého displeje + blokování spamu. Také funguje na poe.com! // @description:cy Gwella ChatGPT gyda fodiwlau sgrin eang/lawn/uchel + blocio sbam. Mae'n gweithio hefyd ar poe.com! // @description:da Forbedrer ChatGPT med brede/fulde/høje skærm + spamblock-modes. Virker også på poe.com! // @description:de Erweitert ChatGPT mit breiten/vollen/großen Bildschirm- und Spamblock-Modi. Funktioniert auch auf poe.com! // @description:dv ކަމަށް ChatGPT މެއްދައްކާ ދެއްވިފައިވަން / ފަލްލާލް / ހަމަކޮށް ބަށަލަތް + ސްޕެމބލޮކް މޮދުންގެންޓެކަށް އެލެކް ކައިވެލް poe.com! // @description:dz འཕེལ་འབྱོར་ལས ChatGPT ནི་རོགས་བཏོད་འབུལ་མཉམ་ནོར་འཛུལ་སྒོར་དབྱར་དགོན་/འཛིང་སྒོར་སྤུས་ནང་མཐར་ཕྱོགས་ལེགས་རོགས་ཡིན། poe.com་ནང་འཁོད་འཇུག་ཡིན། // @description:el Ενισχύει το ChatGPT με λειτουργίες ευρείας/πλήρους/υψηλής οθόνης + μπλοκ αποστολής ανεπιθύμητης αλληλογραφίας. Λειτουργεί επίσης στο poe.com! // @description:eo Plibonigas ChatGPT kun larĝa/plena/alta ekrano + blokado de spamo. Ankaŭ funkcias ĉe poe.com! // @description:es Mejora ChatGPT con modos de pantalla ancha/completa/alta + modo de bloqueo de spam. También funciona en poe.com! // @description:et Parandab ChatGPT lai lai/terve/täiesti-ekraani + spämmi blokeerimisrežiimid. Töötab ka poe.com! // @description:eu Hobetzen du ChatGPT zabala/oso/altua pantaila + spam blokeatzeko moduekin. poe.com-n ere funtzionatzen du! // @description:fa ChatGPT را با حالت های صفحه عریض/تمام/بلند + مسدودسازی هرزنامه بهبود می بخشد. همچنین در poe.com کار می کند! // @description:fi Parantaa ChatGPT:tä laaja/ täysi/ korkea näyttö + roskapostin estäminen -tiloilla. Toimii myös poe.com! // @description:fo Bætir ChatGPT við breiðum/fullum/háum skjá + ruslpósthemlunaraðgerðum. Virkar einnig á poe.com! // @description:fr Améliore ChatGPT avec les modes écran large/complet/grand + mode anti-spam. Fonctionne également sur poe.com ! // @description:fr-CA Améliore ChatGPT avec les modes écran large/complet/grand + mode anti-spam. Fonctionne également sur poe.com ! // @description:gd Leasaich ChatGPT le modhan scrion farsaing/làn/àrd + modan bacadh spàm. Bidh e ag obair cuideachd air poe.com! // @description:gl Mellora ChatGPT con modos de pantalla ancha/completa/alta + modo de bloqueo de spam. Tamén funciona en poe.com! // @description:gu ચેટજીપીટીને વ્યાપક/પૂર્ણ/ઊંચી સ્ક્રીન + સ્પામબ્લોક મોડ્સ સાથે સુધારે છે. તે poe.com પર પણ કાર્ય કરે છે! // @description:haw Hoʻololi i ka ChatGPT me nā ʻano pālākiō / piha / kiʻekiʻe + nā ʻano pāpā spam. Hana pū kēia ma poe.com! // @description:he משדרג את ChatGPT עם מצבי מסך רחב/מלא/גבוה + חסימת דואר זבל. עובד גם ב-poe.com! // @description:hi चैटजीपीटी को चौड़े/पूर्ण/लंबे स्क्रीन + स्पैमब्लॉक मोड के साथ सुधारता है। यह poe.com पर भी काम करता है! // @description:hr Poboljšava ChatGPT s načinima širokog/punog/visokog ekrana + blokiranje neželjene pošte. Također radi na poe.com! // @description:ht Amelyore ChatGPT ak mòd ekran laj/pou/bonè + mod blokaj spam. Li travay tou sou poe.com! // @description:hu Fejleszti a ChatGPT-t széles/teljes/magas képernyős + spamblokkoló módokkal. A poe.com oldalon is működik! // @description:hy ChatGPT-ն բարելավում է լայն/պատասխանատու/բարձր էկրանի + սպամի բլոկավորման ռեժիմներով: Այն նաև գործում է poe.com-ում! // @description:id Meningkatkan ChatGPT dengan mode layar lebar/penuh/tinggi + mode pemblokiran spam. Juga bekerja di poe.com! // @description:is Bætir ChatGPT með breiðum/fullum/háum skjá + ruslpósthemlunaraðgerðum. Virkar einnig á poe.com! // @description:it Migliora ChatGPT con modalità schermo ampio/completo/alto + modalità di blocco spam. Funziona anche su poe.com! // @description:ja ChatGPTを広い/フル/高画面+スパムブロックモードで強化します。また、poe.comでも動作します! // @description:jv Ningkataké ChatGPT nganggo mode layar jembar/penuh/tinggi + mode blokir spam. Uga bisa digunakake ing poe.com! // @description:ka აუმჯობესებს ChatGPT-ს ფართო/სრული/სიმაღლის ეკრანის + სპამ-ბლოკირების რეჟიმებით. ასევე მუშაობს poe.com-ზე! // @description:kab Yernu ChatGPT s yimezda n uferq/aṭṭas/uzelmat di tgejdit. Tura yettsen-d deg poe.com! // @description:kk ChatGPT-ні кең/толық/биік экран + спам блоктау режимдерімен жақсартады. Сонымен қатар, poe.com сайттарында жұмыс істейді! // @description:km បង្កើន ChatGPT ជាមួយម៉ូដអេក្រង់ទូលំទូលាយ/ពេញលេញ/កម្ពស់ + ម៉ូដប្លុកស្ពាម។ ក៏ដូចជាធ្វើការនៅលើ poe.com! // @description:kn ಚಾಟ್GPTನ್ನು ವಿಶಾಲ/ಪೂರ್ಣ/ಎತ್ತರದ-ಸ್ಕ್ರೀನ್ + ಸ್ಪ್ಯಾಮ್‌ಬ್ಲಾಕ್‌ ಮೋಡ್‌ಗಳೊಂದಿಗೆ ಸುಧಾರಿಸುತ್ತದೆ. ಇದು poe.com ನಲ್ಲಿ ಸಹ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ! // @description:ko ChatGPT를 와이드/풀/높은 화면 + 스팸 차단 모드로 향상시킵니다. 또한 poe.com에서도 작동합니다! // @description:ku ChatGPT-ê bi modên pêşandanê nermal/temam/dirêj + spam-block veşart dike. Hêmû de li poe.com jî dixebite! // @description:ky ChatGPT-ni keng/temam/biyik ekran + spam-block rejimderi menen jaqsyrtady. Ol poe.com-da da ishleydi! // @description:la ChatGPT cum latum/plenum/altum screen + spam blockade modis emendatur. Etiam in poe.com operatur! // @description:lb ChatGPT mat weiten/ganz/hoechst Schirm + Spamblock Modi verbessert. Et funktionnéiert och op poe.com! // @description:lo ພັກພັນ ChatGPT ກັບສະກຣີນຫຼາຍ/ຄົບຮອບ/ສູງ + ມູດກັບສະປາມ. ມັນກະທຳງານຢູ່ poe.com! // @description:lt Patobulina ChatGPT su plačiais/visiškais/aukštais ekrano + spam blokavimo režimais. Taip pat veikia ant poe.com! // @description:lv Uzlabo ChatGPT ar plaša/pilna/augsta ekrāna + surogātprogrammu bloķēšanas režīmiem. Tāpat darbojas arī poe.com! // @description:mg Manatsara ChatGPT miaraka amin'ny fomba feno/sarotra/haavo + fanakanana spam. Miasa amin'ny poe.com koa! // @description:mi Whakarei i ChatGPT me ngā huarahi rahi/paerewa/teitei + he poke pātea. Kei te mahi hoki i runga i poe.com! // @description:mk Ја подобрува ChatGPT со режими за широк/полн/висок екран + блокирање на спам. Работи и на poe.com! // @description:ml ചാറ്റ്‌ജിപിടി വിപുല/പൂര്‍ണ/ഉയര്‍ന്ന സ്ക്രീന്‍ + സ്‌പാം ബ്ലോക്ക് മോഡുകളോടെ മെച്ചപ്പെടുത്തുന്നു. ഇത് poe.com-ലും പ്രവര്‍ത്തിക്കുന്നു! // @description:mn ChatGPT-г өргөн/бүтэн/өндөр дэлгэц + спам блоклогч горимуудтай сайжруулна. Мөн poe.com дээр ажиллана! // @description:mr चैटGPTला विस्तृत/पूर्ण/उच्च-स्क्रीन + स्पॅम ब्लॉक मोडसह सुधारते. हे poe.com वर देखील कार्य करते! // @description:ms Meningkatkan ChatGPT dengan mod paparan lebar/penuh/tinggi + mod penyekatan spam. Ia juga berfungsi di poe.com! // @description:mt Ittejjeb ChatGPT bi modalità ta' skrin wiesgħa/piena/ogħla + modalità ta' blokkjar ta' spam. Jaħdem ukoll fuq poe.com! // @description:my ChatGPT ကို ကျယ်/ပြည့်/အရည်အချင်းပြည့်သော စကရင် + စပෑမ် ဘလော့ခ် မုဒ်များဖြင့် တိုးတက်စေသည်။ ဒါဟာ poe.com ပေါ်မှာလဲ အလုပ်လုပ်ပါတယ်! // @description:ne चौडाइ/पूर्ण/उचाइ-स्क्रीन + स्प्याम ब्लॉक मोडसहित ChatGPT लाई सुधार्नुहोस्। यो poe.com मा पनि काम गर्दछ! // @description:nl Verbetert ChatGPT met brede/volle/hoge scherm + spamblokkering modi. Werkt ook op poe.com! // @description:no Forbedrer ChatGPT med brede/full/høye skjerm + spamblock-modus. Også tilgjengelig på poe.com! // @description:ny Apanga ChatGPT ndi makonda a chinsalu cha ambiri/chonse/chikulu + njira zowononga spam. Imagwira ntchito pa poe.com! // @description:pa ਚੈਟਜੀਪੀਟੀ ਨੂੰ ਵਿਆਪਕ/ਪੂਰਨ/ਉੱਚ ਸਕ੍ਰੀਨ + ਸਪੈਮ ਬਲੌਕ ਮੋਡ ਨਾਲ ਸੁਧਾਰਦਾ ਹੈ। ਇਹ poe.com 'ਤੇ ਵੀ ਕੰਮ ਕਰਦਾ ਹੈ! // @description:pl Ulepsza ChatGPT za pomocą trybów szerokiego/pełnego/wysokiego ekranu + blokady spamu. Działa również na poe.com! // @description:ps ChatGPT ته د پراخ/مکمل/لوړ سکرین + سپیم بلاک کولو حالتونو سره وده ورکوي. دا په poe.com کې هم کار کوي! // @description:pt Melhora o ChatGPT com modos de ecrã largo/completo/alto e bloqueio de spam. Também funciona em poe.com! // @description:pt-BR Melhora o ChatGPT com modos de tela larga/completa/alta + modos de bloqueio de spam. Também funciona em poe.com! // @description:ro Îmbunătățește ChatGPT cu moduri de ecran larg/complet/înalt + moduri de blocare a spamului. De asemenea, funcționează pe poe.com! // @description:ru Улучшает ChatGPT с режимами широкого/полного/высокого экрана и блокировки спама. Также работает на poe.com! // @description:rw Guhuza ChatGPT hamwe n'ibimenyetso bya ekran nini/bikozwe/byinshi + uburyo bwo gukumira spam. Kandi ikora ku poe.com! // @description:sg Améliore ChatGPT avec les modes d’écran large/complet/haut + le mode de blocage de spam. Fonctionne également sur poe.com! // @description:si ChatGPT එක විශාල/සම්පූර්ණ/ඉහළ-පෙරටු + ස්පාම් බ්ලොක් ක්‍රම මඟින් වැඩිදියුණු කරයි. මෙය poe.com හිද ක්‍රියාත්මක වේ! // @description:sk Zlepšuje ChatGPT s režimami širokého/plného/vysokého displeja + blokovanie spamu. Takéto funguje aj na poe.com! // @description:sl Izboljšuje ChatGPT z načini širokega/polnega/visokega zaslona + blokado neželene pošte. Prav tako deluje na poe.com! // @description:sm Fa'amaoniga ChatGPT i auala laupapa/puni/lamava + metotia o le 'spam' fa'atekinolosi. E fa'amaoni i poe.com! // @description:sn Zvikurudzira ChatGPT nehutungamiri hwepamusoro/huzhinji/hupfumi + matanho ekudzivirira spam. Zvinotora chirevo pa poe.com! // @description:so Hagaajinta ChatGPT iyadoo la adeegsanayo hababka shaashadda ballaaran/buuxa/sare + habka xanniba spam. Waxa kale oo ay ka shaqeysaa poe.com! // @description:sq Pëmirëson ChatGPT me modulet e ekranit të gjerë/të plotë/të lartë + bllokimin e spamit. Po ashtu punon në poe.com! // @description:sr Unapređuje ChatGPT sa režimima širokog/punog/visokog ekrana + blokadom spama. Takođe funkcioniše na poe.com! // @description:st Khothaletsa ChatGPT ka mekhoa ea skrine e kholo/e felletseng/e phahameng + mekhoa ea thibelo ea spam. E sebetsa hape ho poe.com! // @description:sv Förbättrar ChatGPT med bred/full/hög skärm + spamblock-lägen. Fungerar också på poe.com! // @description:sw Inaboresha ChatGPT kwa hali ya skrini pana/kamilifu/ya juu + hali ya kuzima spam. Pia inafanya kazi kwenye poe.com! // @description:ta ChatGPTஐ விரிவான/முழு/உயர்ந்த திரை + ஸ்பாம் தடுப்பு முறைமைகளுடன் மேம்படுத்துகிறது. இது poe.com இல் செயல்படுகிறது! // @description:te చాట్GPTని విస్తృత/పూర్ణ/ఎత్తు-స్క్రీన్ + స్పామ్ బ్లాక్ మోడ్‌లతో మెరుగుపరుస్తుంది. ఇది poe.comపై కూడా పని చేస్తుంది! // @description:tg ChatGPT-ро бо режими экранҳои васеъ/комил/баланд + блоки спам такмил медиҳад. Ҳамчунин дар poe.com кор мекунад! // @description:th ปรับปรุง ChatGPT ด้วยโหมดหน้าจอกว้าง/เต็ม/สูง + โหมดบล็อกสแปม ทำงานได้ที่ poe.com! // @description:ti ቻትጂፒቲን በስፋት/ሙሉ/ረጅም ስክሪን + ስፓም ብሎክ ሞዶች ይማራል። በpoe.com ላይም ይሰራል! // @description:tk ChatGPT-ni giňişleýin/dolup/buýuk ekran + spam blokirlemek ýagdaýlarynda gowulandyrýar. Şeýle hem poe.com-da işleýär! // @description:tl Pinapabuti ang ChatGPT gamit ang mga mode ng malawak/puno/mataas na screen + mode ng pagharang sa spam. Gumagana rin ito sa poe.com! // @description:tn Tokafatsa ChatGPT ka ditsela tsa sehaweng se se pharaletseng/se felletseng/se phahameng + ditsela tsa ho thibela spam. E sebetsa hape ho poe.com! // @description:to Fa'amaonia ChatGPT i auala mata'itusi laupapa/puni/lamava + auala fa'amaoniga spam. E mafai foi ona fa'agaioi i poe.com! // @description:tr ChatGPT'yi geniş/tam/yüksek ekran + spam engelleme modlarıyla geliştirir. Ayrıca poe.com'da da çalışır! // @description:tt ChatGPT-ны киң/тулы/югары экран + спам блоклау режимнары белән яхшырта. Шул ук вакытта poe.com да эшли! // @description:ug ChatGPT'ni keng/to'liq/yuqori ekran + spam blokirovka rejimlari bilan yaxshilaydi. Shuningdek, poe.com saytlarida ishlaydi! // @description:uk Покращує ChatGPT за допомогою режимів широкого/повного/високого екрану + блокування спаму. Також працює на poe.com! // @description:ur چیٹ جی پی ٹی کو وسیع/مکمل/اونچی اسکرین + اسپام بلاک موڈ کے ساتھ بہتر کرتا ہے۔ یہ poe.com پر بھی کام کرتا ہے! // @description:uz ChatGPT-ni keng/to'liq/baland ekran + spam bloklash rejimlari bilan yaxshilaydi. Bundan tashqari, poe.com-da ham ishlaydi! // @description:vi Cải thiện ChatGPT với các chế độ màn hình rộng/toàn màn/hồ sơ cao + chế độ chặn spam. Cũng hoạt động trên poe.com! // @description:wo Jëfandikoo ChatGPT ak modu yu gëstu-gëstu/fini/gëstu guddi + mode spam-block. It works too on poe.com! // @description:xh Ukuphucula iChatGPT ngezithuba zesikrini ezibanzi/egcwele/ephezulu + imodi ye-spamblock. Isebenza ku-poe.com! // @description:yi אַוואַנסירטער ChatGPT מיט ברייט/גאַנץ/הויך-סקירן + ספּאַם בלאָק מאָדעס. עס אַרבעט אויך אויף poe.com! // @description:yo Ṣe ilọsiwaju ChatGPT pẹlu awọn ipo iboju jakejado/pipe/giga + ipo idiwọ spam. O tun n ṣiṣẹ lori poe.com! // @description:zh 通过宽屏/全屏/高屏+垃圾邮件块模式增强 ChatGPT。也可以在 poe.com 上使用! // @description:zh-CN 通过宽屏/全屏/高屏+垃圾邮件块模式增强 ChatGPT。也可以在 poe.com 上使用! // @description:zh-HK 使用寬/全/高螢幕+垃圾郵件區塊模式增強 ChatGPT。也可以在 poe.com 上使用! // @description:zh-SG 通过宽屏/全屏/高屏+垃圾邮件块模式增强 ChatGPT。也可以在 poe.com 上使用! // @description:zh-TW 使用寬/全/高螢幕+垃圾郵件區塊模式增強 ChatGPT。也可以在 poe.com 上使用! // @description:zu Thuthukisa iChatGPT ngemodi zesikrini ezibanzi/egcwele/ephezulu + imodi yokuvimbela i-spam. Futhi isebenza ku-poe.com! // @author Adam Lui // @namespace https://github.com/adamlui // @version 2026.1.16 // @license MIT // @icon https://assets.chatgptwidescreen.com/images/icons/widescreen-robot-emoji/icon48.png?v=844b16e // @icon64 https://assets.chatgptwidescreen.com/images/icons/widescreen-robot-emoji/icon64.png?v=844b16e // @compatible chrome // @compatible firefox // @compatible edge // @compatible opera // @compatible brave // @compatible vivaldi // @compatible librewolf // @compatible ghost // @compatible qq // @match *://chatgpt.com/* // @match *://github.com/* // @match *://gitlab.com/* // @match *://poe.com/* // @connect cdn.jsdelivr.net // @connect gm.chatgptwidescreen.com // @connect raw.githubusercontent.com // @require https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.5/dist/chatgpt.min.js#sha256-0NMJgflkEQlWbXxtN4SD+wogV6ss2TY6JAu4A0hmM0k= // @require https://cdn.jsdelivr.net/gh/adamlui/ai-web-extensions@1e84c2e/assets/js/lib/dom.js/dist/dom.min.js#sha256-xovdxRnmYD/eCgBiGCu5+Vd3+WWIvLUKVtU/MnRueeU= // @require https://cdn.jsdelivr.net/npm/json5@2.2.3/dist/index.min.js#sha256-S7ltnVPzgKyAGBlBG4wQhorJqYTehj5WQCrADCKJufE= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@ab7ee52/chromium/extension/lib/chatbar.js#sha256-SRE9UyuH01owWuLBPnjy0EuYAu5EdDAZtyRWogzEhno= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@882c0c5/chromium/extension/lib/feedback.js#sha256-mhqPUMG1+fq9dybeU8n5B+eXuuCeUd5lLpJXRS3en1Y= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@882c0c5/chromium/extension/lib/i18n.js#sha256-byvnlCP8l97tNJfgZeXDL+fLIKmS3GaiGwy5JNdmKYI= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@c4b372d/chromium/extension/lib/settings.js#sha256-W7Dzfld01bDMsK3OnsTBLuUdtCgdoWR3Cl6ucMbzek0= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@a18530b/chromium/extension/lib/styles.js#sha256-PE32LZgVfgPLDnLmZUdto65P1/VG+JwM/Qo5H7ej0nQ= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@60f5db4/chromium/extension/lib/sync.js#sha256-NaFv1zT/i4e/x/X5Pt7axYbZcaRCMvXWSm3ovU0TZD0= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@ab7ee52/chromium/extension/lib/ui.js#sha256-5WwgnfGRtHsRP06nmjhqARB0T508syxAh5UWFMEFA+c= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@ab7ee52/chromium/extension/components/buttons.js#sha256-B1h7ZHhgwuEy8XoER0AjnWC36Rq8MViHoaZM26k7XHY= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@511d193/chromium/extension/components/icons.js#sha256-6eK7coHHFB4zBfl8XXtjojrnfbBOFiEgYfQtz/Whv2E= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@c2cd781/chromium/extension/components/modals.js#sha256-tA+wpis09SfKIjVXAKF1y9mU9m0jDZbB/Fuvr8+waE8= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@882c0c5/chromium/extension/components/tooltip.js#sha256-KxUyK1dM/UlZkTQCoLtZl+YrmkBGXR9HryBWg23Dqm8= // @resource rpgCSS https://cdn.jsdelivr.net/gh/adamlui/ai-web-extensions@727feff/assets/styles/rising-particles/dist/gray.min.css#sha256-48sEWzNUGUOP04ur52G5VOfGZPSnZQfrF3szUr4VaRs= // @resource rpwCSS https://cdn.jsdelivr.net/gh/adamlui/ai-web-extensions@727feff/assets/styles/rising-particles/dist/white.min.css#sha256-6xBXczm7yM1MZ/v0o1KVFfJGehHk47KJjq8oTktH4KE= // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_getResourceText // @grant GM_xmlhttpRequest // @grant GM.xmlHttpRequest // @noframes // @downloadURL https://gm.chatgptwidescreen.com // @updateURL https://gm.chatgptwidescreen.com // @homepageURL https://chatgptwidescreen.com // @supportURL https://support.chatgptwidescreen.com // @contributionURL https://github.com/sponsors/adamlui // ==/UserScript== // Documentation: https://docs.chatgptwidescreen.com // NOTE: This script relies on the powerful chatgpt.js library @ https://chatgpt.js.org // © 2023–2026 KudoAI & contributors under the MIT license. (async () => { 'use strict' // Hide Perplexity notice on GH/GL if found if (location.hostname.startsWith('git')) { if (location.pathname.includes('chatgpt-widescreen')) { const alertObserver = new MutationObserver(() => { const perplexityAlert = [...document.querySelectorAll('.markdown-alert')] .find(alert => alert.textContent.includes('Perplexity')) if (perplexityAlert) { perplexityAlert.style.display = 'none' ; alertObserver.disconnect() } }) alertObserver.observe(document.body, { childList: true, subtree: true }) setTimeout(() => alertObserver.disconnect(), 5000) // don't observe forever } return } // Init DATA window.env = { browser: { language: chatgpt.getUserLanguage(), isFF: chatgpt.browser.isFirefox(), isMobile: chatgpt.browser.isMobile() }, scriptManager: { name: (() => { try { return GM_info.scriptHandler } catch (err) { return 'unknown' }})(), version: (() => { try { return GM_info.version } catch (err) { return 'unknown' }})() }, site: location.hostname.split('.').slice(-2, -1)[0], ui: {} } Object.assign(env.browser, { get isCompact() { return innerWidth <= 480 }}) env.scriptManager.supportsTooltips = env.scriptManager.name == 'Tampermonkey' && parseInt(env.scriptManager.version.split('.')[0]) >= 5 ui.getScheme().then(scheme => env.ui.scheme = scheme) window.xhr = typeof GM != 'undefined' && GM.xmlHttpRequest || GM_xmlhttpRequest window.app = { version: GM_info.script.version, configKeyPrefix: `${env.site} Widescreen`, chatgptjsVer: /chatgpt\.js@([\d.]+)/.exec(GM_info.scriptMetaStr)[1], commitHashes: { app: '547d450' } // for cached .json + sites.json5 } app.urls = { resourceHost: `https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@${app.commitHashes.app}` } const remoteData = { app: await new Promise(resolve => xhr({ method: 'GET', url: `${app.urls.resourceHost}/assets/data/app.json`, onload: ({ responseText }) => resolve(JSON.parse(responseText)) })), msgs: await new Promise(resolve => { const msgHostDir = `${app.urls.resourceHost}/chromium/extension/_locales/`, msgLocaleDir = `${ env.browser.language ? env.browser.language.replace('-', '_') : 'en' }/` let msgHref = `${ msgHostDir + msgLocaleDir }messages.json`, msgXHRtries = 0 function fetchMsgs() { xhr({ method: 'GET', url: msgHref, onload: handleMsgs })} function handleMsgs(resp) { try { // to return localized messages.json const msgs = JSON.parse(resp.responseText), flatMsgs = {} for (const key in msgs) // remove need to ref nested keys if (typeof msgs[key] == 'object' && 'message' in msgs[key]) flatMsgs[key] = msgs[key].message resolve(flatMsgs) } catch (err) { // if bad response msgXHRtries++ ; if (msgXHRtries == 3) return resolve({}) // try original/region-stripped/EN only msgHref = env.browser.language.includes('-') && msgXHRtries == 1 ? // if regional lang on 1st try... msgHref.replace(/(_locales\/[^_]+)_[^_]+(\/)/, '$1$2') // ...strip region before retrying : `${msgHostDir}en/messages.json` // else use default English messages fetchMsgs() } } fetchMsgs() }) } Object.assign(app, { ...remoteData.app, urls: { ...app.urls, ...remoteData.app.urls }, msgs: remoteData.msgs }) window.sites = Object.assign(Object.create(null), await new Promise(resolve => xhr({ method: 'GET', url: `${app.urls.resourceHost}/assets/data/sites.json5`, onload: ({ responseText }) => resolve(JSON5.parse(responseText)) }))) let chatbarElem = await dom.get.loadedElem(env.site == 'chatgpt' ? 'main form' : sites[env.site].selectors.input) if (env.site == 'poe') chatbarElem = chatbarElem.parentNode.parentNode chatbar.nativeWidth = dom.get.computedWidth(chatbarElem) // for ChatGPT WCB + styles.widescreen.css math chatbar.nativeHeight = dom.get.computedHeight(chatbarElem) // for TCB math // Init SETTINGS if (GM_getValue(`${app.configKeyPrefix}_isFirstRun`) == undefined) { // activate widescreen on install settings.save('widescreen', true) ; settings.save('isFirstRun', false) } settings.siteDisabledKeys = Object.keys(sites).map(site => `${site}Disabled`) settings.load(settings.siteDisabledKeys, sites[env.site].availFeatures) // Define MENU functions window.toolbarMenu = { state: { symbols: ['❌', '✔️'], separator: env.scriptManager.name == 'Tampermonkey' ? ' — ' : ': ', words: [app.msgs.state_off.toUpperCase(), app.msgs.state_on.toUpperCase()] }, refresh() { if (typeof GM_unregisterMenuCommand == 'undefined') return this.entryIDs.forEach(id => GM_unregisterMenuCommand(id)) this.register() }, register() { // Show "Disabled (extension active)" this.entryIDs = env.extensionActive ? [ GM_registerMenuCommand(`${this.state.symbols[0]} ${ toTitleCase(app.msgs.state_disabled)} (${app.msgs.menuLabel_extensionActive})`, () => modals.open('about'), env.scriptManager.supportsTooltips ? { title: ' ' } : undefined ) ] // ...or create settings categories : Object.entries(settings.categories) .filter(([key]) => !config[`${env.site}Disabled`] || key == 'siteSettings') .map(([key, category]) => GM_registerMenuCommand( `${ category.symbol ? category.symbol + ' ' : '' }${category.label}`, () => modals.settings(key), env.scriptManager.supportsTooltips ? { title: ' ' } : undefined )) // Add About entry this.entryIDs.push(GM_registerMenuCommand( `💡 ${app.msgs.menuLabel_about} ${app.msgs.appName}`, () => modals.open('about'), env.scriptManager.supportsTooltips ? { title: ' ' } : undefined )) } } window.updateCheck = () => xhr({ method: 'GET', url: `${app.urls.update.gm}?t=${Date.now()}`, headers: { 'Cache-Control': 'no-cache' }, onload: ({ responseText }) => { // Compare versions, alert if update found app.latestVer = /@version +(.*)/.exec(responseText)?.[1] if (app.latestVer) for (let i = 0 ; i < 4 ; i++) { // loop thru subver's const currentSubVer = parseInt(app.version.split('.')[i], 10) || 0, latestSubVer = parseInt(app.latestVer.split('.')[i], 10) || 0 if (currentSubVer > latestSubVer) break // out of comparison since not outdated else if (latestSubVer > currentSubVer) // if outdated return modals.open('update', 'available') } // Alert to no update found, nav back to About modals.open('update', 'unavailable') ; modals.open('about') }}) function toTitleCase(str) { if (!str) return '' const words = str.toLowerCase().split(' ') for (let i = 0 ; i < words.length ; i++) // for each word words[i] = words[i][0].toUpperCase() + words[i].slice(1) // title-case it return words.join(' ') // join'em back together } // Define UI functions window.toggleMode = async (mode, state) => { switch (state) { case true : activateMode(mode) ; break case false : deactivateMode(mode) ; break default : ( mode == 'widescreen' ? styles.widescreen.node?.isConnected : mode == 'fullWindow' ? await ui.isFullWin() : chatgpt.isFullScreen() ) ? deactivateMode(mode) : activateMode(mode) } async function activateMode(mode) { if (mode == 'widescreen') { document.head.append(styles.widescreen.node) ; sync.mode('widescreen') } else if (mode == 'fullWindow') { const { site } = env, { selectors } = sites[site], sidebarToggle = document.querySelector(selectors.btns.sidebar) if (site == 'chatgpt') { const sidebars = { left: document.querySelector(selectors.sidebar), right: document.querySelector(selectors.rightbar) } const sidebarsToHide = [] Object.entries(sidebars).forEach(([side, bar]) => // push fat/visible ones to hide bar && dom.get.computedWidth(bar) > 100 && sidebarsToHide.push({ side, bar })) sidebarsToHide.forEach(({ side, bar }) => { // hide'em if (side == 'left') sidebarToggle?.click() ; else bar.style.display = 'none' }) } else { // poe document.head.append(styles.fullWin.node) sync.mode('fullWindow') // since it doesn't monitor sidebar } } else if (mode == 'fullscreen') document.documentElement.requestFullscreen() } function deactivateMode(mode) { if (mode == 'widescreen') { styles.widescreen.node.remove() ; sync.mode('widescreen') } else if (mode == 'fullWindow') { const { site } = env, { selectors } = sites[site], sidebarToggle = document.querySelector(selectors.btns.sidebar) if (sidebarToggle) { sidebarToggle.click() if (site == 'chatgpt') { const rightbar = document.querySelector(selectors.rightbar) if (rightbar) rightbar.style.display = '' } } else styles.fullWin.node.remove() if (site != 'chatgpt') sync.mode('fullWindow') // since they don't monitor sidebar } else if (mode == 'fullscreen') { if (config.f11) modals.alert(app.msgs.alert_pressF11, `${app.msgs.alert_f11reason}.`) else document.exitFullscreen().catch( err => console.error(app.symbol + ' » Failed to exit fullscreen', err)) } } } env.ui.hasTallChatbar = await chatbar.is.tall() Object.assign(modals, { // userscript modals/utils settings(ctgKey) { // for categories // Stylize if (!modals.settings.style?.isConnected) document.head.append(modals.settings.style ||= dom.create.style()) modals.settings.style.textContent = ` :root { --entry-highlighted-bg: rgba(100,149,237,0.88) ; ${ env.ui.scheme == 'dark' ? ` --track-filled-color: white ; --track-empty-color: #b2b2b2 ; --thumb-color: white ; --thumb-border: black` : ` /* light scheme */ --track-filled-color: #000 ; --track-empty-color: #e0e0e0 ; --thumb-color: #000 ; --thumb-border: #fff` } } .${app.slug}-settings-modal h2 { text-align: center } .${app.slug}-settings-modal ul { /* entries list */ cursor: pointer ; font-size: 18px ; margin: 16px 0 -10px ; list-style: none } .${app.slug}-settings-modal li { /* entry row */ color: ${ env.ui.scheme == 'dark' ? 'rgb(255,255,255,0.65)' : 'rgba(0,0,0,0.45)' }; height: 37px ; padding: 6px 10px 4px ; font-size: 15.5px ; align-content: center ; border-bottom: 1px dotted ${ env.ui.scheme == 'dark' ? 'white' : 'black' }; border-radius: 3px ; /* slightly round highlight strip */ transition: 0.1s ease ; /* for hover-zoom */ -webkit-transition: 0.1s ease ; -moz-transition: 0.1s ease ; o-transition: 0.1s ease ; -ms-transition: 0.1s ease } .${app.slug}-settings-modal li.active { color: ${ env.ui.scheme == 'dark' ? 'rgb(255,255,255)' : 'rgba(0,0,0)' }} .${app.slug}-settings-modal li:not(:has(input[type=range])):hover { padding: 4px 10px ; transform: scale(1.15) ; background: var(--entry-highlighted-bg) ; color: white } .${app.slug}-settings-modal li:last-of-type { border-bottom: none } // remove last bottom-border .${app.slug}-settings-modal li > label { cursor: pointer } .${app.slug}-settings-modal li > input[type=checkbox] { display: none } .${app.slug}-settings-modal .toggle-switch { position: relative ; left: -1px ; bottom: -4px ; float: right ; background-color: #ccc ; width: 26px ; height: 13px ; border-radius: 28px ; transition: 0.4s ; -webkit-transition: 0.4s ; -moz-transition: 0.4s ; -o-transition: 0.4s ; -ms-transition: 0.4s } .${app.slug}-settings-modal .toggle-knob { position: absolute ; left: 1px ; bottom: 1px ; content: "" ; background-color: white ; width: 11px ; height: 11px ; border-radius: 28px ; transition: 0.2s ; -webkit-transition: 0.2s ; -moz-transition: 0.2s ; -o-transition: 0.2s ; -ms-transition: 0.2s } .${app.slug}-settings-modal li:has(input[type=range]) { display: flex ; flex-wrap: wrap; padding: 32px 8px } .${app.slug}-settings-modal li > input[type=range] { --track-fill-percent: 100% ; width: 100% ; cursor: pointer ; margin: 7px 0 ; -webkit-appearance: none ; appearance: none ; background: none } .${app.slug}-settings-modal li > input[type=range]::-webkit-slider-runnable-track { height: 5px ; border-radius: 10px ; background: linear-gradient(to right, var(--track-filled-color) 0%, var(--track-filled-color) var(--track-fill-percent), var(--track-empty-color) var(--track-fill-percent), var(--track-empty-color) 100% ) } .${app.slug}-settings-modal li > input[type=range]::-moz-range-track { height: 5px ; border-radius: 10px ; background: linear-gradient(to right, var(--track-filled-color) 0%, var(--track-filled-color) var(--track-fill-percent), var(--track-empty-color) var(--track-fill-percent), var(--track-empty-color) 100% ) } .${app.slug}-settings-modal li > input[type=range]::-webkit-slider-thumb { -webkit-appearance: none ; width: 12px ; height: 26.5px ; background: var(--thumb-color) ; margin-top: -10.5px ; border: 4px solid var(--thumb-border) ; border-radius: 16px ; cursor: ew-resize ; transition: transform 0.05s ease } .${app.slug}-settings-modal li > input[type=range]::-moz-range-thumb { width: 4px ; height: 19px ; background: var(--thumb-color) ; margin-top: -11px ; border: 4px solid var(--thumb-border) ; border-radius: 16px ; cursor: ew-resize ; transition: transform 0.05s ease } .${app.slug}-settings-modal li > input[type=range]::-webkit-slider-thumb:hover { transform: scaleX(1.325) } .${app.slug}-settings-modal li > input[type=range]::-moz-range-thumb:hover { transform: scaleX(1.325) } .${app.slug}-settings-modal button { display: none } .${app.slug}-settings-modal .edit-link { text-transform: uppercase ; font-size: 0.65em ; margin-left: 0.75em ; opacity: 0.7 ; cursor: pointer } .${app.slug}-settings-modal .edit-link:hover { opacity: 1 }` // Create modal const category = settings.categories[ctgKey] const settingsModal = modals.alert( `${category.symbol} ${category.label}`, '', undefined, undefined, 365) settingsModal.classList.add(`${app.slug}-settings-modal`) settingsModal.style.cssText += 'padding-bottom: 10px !important' // Create entries const settingsUL = settingsModal.querySelector('ul'), objToParse = ctgKey == 'siteSettings' ? sites : settings.controls Object.entries(objToParse).forEach(([key, entryData]) => { if (ctgKey != 'siteSettings' && entryData.category != ctgKey) return // Refine Site Settings data if (ctgKey == 'siteSettings') { const siteHomeURL = sites[key].urls.homepage.replace(/^https?:\/\//, '') entryData = { type: 'toggle', label: siteHomeURL, helptip: `${app.msgs.helptip_run} ${app.name} on ${siteHomeURL}` } } // Create/append entry/label elems const entry = { row: dom.create.elem('li', { id: key, title: entryData.helptip || '' }), label: dom.create.elem('label') } entry.label.textContent = `${entryData.label}` entry.row.append(entry.label) ; settingsUL.append(entry.row) // Create/append toggles/listeners if (entryData.type == 'toggle') { const configKeyName = ctgKey == 'siteSettings' ? `${key}Disabled` : key // Create/append toggle elems entry.toggle = { input: dom.create.elem('input', { class: 'toggle-input', type: 'checkbox', disabled: true }), switch: dom.create.elem('span', { class: 'toggle-switch' }), knob: dom.create.elem('span', { class: 'toggle-knob' }) } entry.toggle.input.checked = ( ctgKey == 'siteSettings' ? !config[configKeyName] : settings.typeIsEnabled(key) ) entry.toggle.switch.append(entry.toggle.knob) entry.row.append(entry.toggle.input, entry.toggle.switch) // Update visual state w/ animation setTimeout(() => modals.toggleUtils.updateStyles(entry.toggle.input), 155) // Add click listener entry.row.onclick = () => { modals.toggleUtils.switchToggle(entry.toggle.input) settings.save(configKeyName, !config[configKeyName]) sync.configToUI({ updatedKey: configKeyName }) if (ctgKey == 'siteSettings' && env.site == key) // notify if setting of active site toggled feedback.notify(`${app.name} 🧩 ${ app.msgs[`state_${ config[configKeyName] ? 'off' : 'on' }`].toUpperCase()}`) else if (ctgKey != 'siteSettings') feedback.notify(`${entryData.label}: ${ toolbarMenu.state.words[+settings.typeIsEnabled(key)]}`) // Enable/disable dependent entries for (const [ctrlKey, ctrlData] of Object.entries( { ...settings.categories, ...settings.controls })) if (Object.values(ctrlData.dependencies || {}).flat().includes(key)) { const depDiv = document.querySelector(`li#${ctrlKey}`) ; if (!depDiv) continue depDiv.style.display = !settings.typeIsEnabled(key) ? 'none' : '' } } } else if (entryData.type == 'slider') { const minVal = entryData.min ?? 0, maxVal = entryData.max ?? 100 // Create/append slider elems entry.row.classList.add('active') entry.row.append(entry.slider = dom.create.elem('input', { type: 'range', min: minVal, max: maxVal, value: config[key] })) if (entryData.step || env.browser.isFF) // use val from ctrl data or default to 2% in FF for being laggy entry.slider.step = entryData.step || (0.02 * entry.slider.max - entry.slider.min) entry.label.textContent += `: ${entry.slider.value}${ entryData.labelSuffix || '' }` entry.label.append(entry.editLink = dom.create.elem('span', { class: 'edit-link', role: 'button', tabindex: '0', 'aria-label': entryData.helptip })) entry.editLink.textContent = app.msgs.promptLabel_edit entry.slider.style.setProperty( '--track-fill-percent', `${ entry.slider.value / entry.slider.max *100 }%`) // Add listeners entry.editLink.onclick = () => { const promptMsg = `${app.msgs.prompt_enterNewVal} ${entryData.label} (${ app.msgs.error_between} ${minVal}–${maxVal}):` const userVal = prompt(promptMsg, entry.slider.value) if (userVal == null) return // user cancelled so do nothing if (!/\d/.test(userVal)) return alert(`${ app.msgs.error_enterValidNum} ${app.msgs.error_between} ${ minVal} ${app.msgs.error_and} ${maxVal}!`) let validVal = parseInt(userVal.replace(/\D/g, '')) ; if (isNaN(validVal)) return validVal = Math.max(minVal, Math.min(maxVal, validVal)) entry.slider.value = validVal ; settings.save(entryData.key, validVal) sync.configToUI({ updatedKey: entryData.key }) entry.label.textContent = `${entryData.label}: ${validVal}${ entryData.labelSuffix || '' }` entry.label.append(entry.editLink) entry.slider.style.setProperty('--track-fill-percent', `${ validVal / entry.slider.max *100 }%`) } entry.slider.oninput = ({ target: { value }}) => { // update UI settings.save(key, parseInt(value)) ; sync.configToUI({ updatedKey: key }) entry.label.textContent = `${entryData.label}: ${value}${ entryData.labelSuffix || '' }` entry.label.append(entry.editLink) entry.slider.style.setProperty('--track-fill-percent', `${ value / entry.slider.max *100 }%`) } entry.row.onwheel = ({ deltaY }) => { // move slider by 2 steps entry.slider.value = parseInt(entry.slider.value) - Math.sign(deltaY) *2 entry.slider.dispatchEvent(new Event('input')) } } if (entryData.dependencies) { const toDisable = Object.values(entryData.dependencies).flat() .some(dep => !settings.typeIsEnabled(dep)) entry.row.style.display = toDisable ? 'none' : '' } }) return settingsModal }, update: { width: 377, available() { // Show modal const updateAvailModal = modals.alert(`🚀 ${app.msgs.alert_updateAvail}!`, // title `${app.msgs.alert_newerVer} ${app.msgs.appName} ` // msg + `(v${app.latestVer}) ${app.msgs.alert_isAvail}! ` + '${app.msgs.link_viewChanges}`, function update() { // button modals.safeWinOpen(`${app.urls.update.gm}?t=${Date.now()}`) }, '', modals.update.width ) // Localize button labels if needed if (!env.browser.language.startsWith('en')) { const updateBtns = updateAvailModal.querySelectorAll('button') updateBtns[1].textContent = app.msgs.btnLabel_update updateBtns[0].textContent = app.msgs.btnLabel_dismiss } return updateAvailModal }, unavailable() { return modals.alert(`${app.msgs.alert_upToDate}!`, // title `${app.msgs.appName} (v${app.version}) ${app.msgs.alert_isUpToDate}!`, // msg '', '', modals.update.width ) } }, toggleUtils: { switchToggle(toggleInput) { toggleInput.checked = !toggleInput.checked ; modals.toggleUtils.updateStyles(toggleInput) }, updateStyles(toggleInput) { // toggle show + staggered switch animations in const switchSpan = toggleInput.nextElementSibling, knobSpan = switchSpan.querySelector('span'), toggleRow = toggleInput.parentNode requestAnimationFrame(() => { switchSpan.style.backgroundColor = toggleInput.checked ? '#ad68ff' : '#ccc' switchSpan.style.boxShadow = toggleInput.checked ? '2px 1px 9px #d8a9ff' : 'none' knobSpan.style.transform = toggleInput.checked ? 'translateX(14px) translateY(0)' : 'translateX(0)' toggleRow.classList.toggle('active', toggleInput.checked) // dim/brighten entry }) // to trigger 1st transition fx } } }) chatgpt.canvasIsOpen = function() { return document.querySelector('section.popover')?.getBoundingClientRect().top == 0 } // Run MAIN routine // Init EXTENSION ACTIVE state postMessage({ action: 'getExtensionInfo', source: 'chatgpt-widescreen-mode.user.js' }, location.origin) addEventListener('message', handleMsgResp) function handleMsgResp(resp) { if (resp.origin != location.origin) return const sender = resp.data.source env.extensionActive = sender.includes(app.slug) && /extension/i.test(sender) } await new Promise(resolve => setTimeout(resolve, 100)) // wait for extension response removeEventListener('message', handleMsgResp) // Create browser TOOLBAR MENU + DISABLE SCRIPT if extension active toolbarMenu.register() ; if (env.extensionActive) return // Init UI props if (env.site == 'chatgpt') { sites[env.site].hasSidebar = !!await Promise.race([ dom.get.loadedElem(sites.chatgpt.selectors.btns.sidebar), // DOM element if sidebar toggle loads dom.get.loadedElem(sites.chatgpt.selectors.btns.login).then(() => false), // null if login button loads new Promise(resolve => setTimeout(() => resolve(null), 3000)) // null if 3s passed ]) } // Init FULL-MODE states config.fullscreen = chatgpt.isFullScreen() if (sites[env.site].selectors.btns.sidebar) // site has native FW state config.fullWindow = await ui.isFullWin() // ...so match it else settings.load('fullWindow') // otherwise load CWM's saved state // Create/append STYLES ;['chatbar', 'fullWin', 'tweaks', 'widescreen'].forEach(styleType => styles.update({ key: styleType })) ;['gray', 'white'].forEach(color => document.head.append( // Rising Particles styles dom.create.elem('link', { rel: 'stylesheet', href: `https://cdn.jsdelivr.net/gh/adamlui/ai-web-extensions@727feff/assets/styles/rising-particles/dist/${ color}.min.css` }))) // Restore PREV SESSION's state if (!config[`${env.site}Disabled`]) { if (config.btnsVisible) buttons.insert() if (config.widescreen) toggleMode('widescreen', true) if (config.fullWindow && sites[env.site].hasSidebar) { if (sites[env.site].selectors.btns.sidebar) // site has own FW config sync.mode('fullWindow') // ...so sync w/ it else toggleMode('fullWindow', true) // otherwise self-toggle } if (env.site != 'poe') { // toggle free wheel locked in some Spam blocks window.enableWheelScroll = event => event.stopPropagation() document.body[`${ config.blockSpamDisabled ? 'remove' : 'add' }EventListener`]( 'wheel', window.enableWheelScroll) } } // Monitor NODE CHANGES to maintain button visibility + update colors/styles + spam block let isTempChat = false, canvasWasOpen = chatgpt.canvasIsOpen(), prevPath = location.pathname new MutationObserver(async () => { // Maintain button visibility on nav if (config[`${env.site}Disabled`] || !config.btnsVisible) return else if (!buttons.fullscreen?.isConnected && !chatgpt.canvasIsOpen() && await chatbar.get() && buttons.state.status != 'inserting' ) { buttons.state.status = 'missing' ; buttons.insert() } // Maintain button colors + Widescreen button visibility on snowflake chatgpt.com if (env.site == 'chatgpt') { // Update button + 'Attach File' colors on temp chat toggle const chatbarIsDark = await chatbar.is.dark() if (chatbarIsDark != isTempChat) { buttons.stylize() ; buttons.update.color() ; styles.update({ key: 'tweaks' }) isTempChat = chatbarIsDark } // Remove buttons on Canvas mode toggle-on if (canvasWasOpen != chatgpt.canvasIsOpen()) { buttons.remove() ; canvasWasOpen = !canvasWasOpen } // Update Widescreen styles on Poe nav } else if (location.pathname != prevPath && config.widescreen) { styles.update({ keys: ['widescreen', 'chatbar'] }) prevPath = location.pathname } // Apply Spam Block if (!config.blockSpamDisabled && sites[env.site]?.selectors?.spam) sync.spamBlock() }).observe(document[env.site == 'poe' ? 'head' : 'body'], { attributes: true, subtree: true }) // Monitor SCHEME PREF changes to update sidebar toggle + modal colors new MutationObserver(handleSchemePrefChange).observe( // for site scheme pref changes document.documentElement, { attributes: true, attributeFilter: ['class', 'data-color-scheme'] }) window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes 'change', () => requestAnimationFrame(handleSchemePrefChange)) async function handleSchemePrefChange() { const displayedScheme = await ui.getScheme() if (env.ui.scheme != displayedScheme) { env.ui.scheme = displayedScheme ; modals.stylize() ; buttons.stylize() ; buttons.update.color() } } // Monitor SIDEBARS to update config.fullWindow for sites w/ native toggle if (sites[env.site].selectors.btns.sidebar && sites[env.site].hasSidebar) { const sidebarObserver = new ResizeObserver( // sync config.fullWindow ⇆ sidebar width + update styles async () => { if ((config.fullWindow != await ui.isFullWin()) && !config.modeSynced) sync.mode('fullWindow') if (env.site == 'chatgpt' && config.widescreen) { styles.update({ key: 'widescreen' }) // for new window.wsMaxWidth if (config.widerChatbox) styles.update({ key: 'chatbar' }) } } ) observeSidebars() new MutationObserver( // re-observeSidebars() on disconnect () => getSidebars().some(bar => !sidebarObserver.targets?.includes(bar)) && observeSidebars() ).observe(document.body, { childList: true, subtree: true }) function getSidebars() { const site = env.site, selectors = sites[site].selectors, sidebars = [document.querySelector(selectors.sidebar)] if (site == 'chatgpt') sidebars.push(document.querySelector(selectors.rightbar)) return sidebars.filter(Boolean) } function observeSidebars() { const sidebars = getSidebars() ; if (!sidebars.length) return sidebarObserver.targets?.forEach(target => sidebarObserver.unobserve(target)) sidebars.forEach(sidebar => sidebarObserver.observe(sidebar)) sidebarObserver.targets = sidebars } } // Add RESIZE LISTENER to update full screen setting/button + disable F11 flag + update widescreen/chatbar styles addEventListener('resize', () => { const fullscreenState = chatgpt.isFullScreen() if (config.fullscreen && !fullscreenState) { // exiting full screen sync.mode('fullscreen') ; config.f11 = false } else if (!config.fullscreen && fullscreenState) // entering full screen sync.mode('fullscreen') if (config.widescreen) { styles.update({ key: 'widescreen' }) // for new window.wsMaxWidth if (config.widerChatbox) styles.update({ key: 'chatbar' }) } if (env.site == 'chatgpt') chatbar.tweak() // update chatgpt.com chatbar inner width }) // Add KEY LISTENER to enable flag on F11 + stop generating text on ESC document.addEventListener('keydown', event => { if ((event.key == 'F11' || event.keyCode == 122) && !config.fullscreen) config.f11 = true else if ((event.key.startsWith('Esc') || event.keyCode == 27) && chatgpt.isTyping()) try { chatgpt.stop() ; requestAnimationFrame(() => !chatgpt.isTyping() && feedback.notify(app.msgs.notif_chatStopped, 'bottom-right')) } catch (err) {} }) })()