// ==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 ChatGPT Modo Tela Larga 🖥️ // @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 tela larga/completa/alta + modos de 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 2025.7.31.3 // @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 *://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.2/dist/chatgpt.min.js#sha256-eo9NbR9z1wtCKV279LzVIkWkm60gbud2VFhAiBiaaB4= // @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@152a535/chromium/extension/lib/browser.js#sha256-7teBecqrjkazKH6oetGyxKlBkAk5U9ota/LNCB3Q+Jw= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@d065ab4/chromium/extension/lib/chatbar.js#sha256-vuaV5aYLc0ZJcj5G8vtEOUxP8CCHda1PJOygzBcxGwk= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@1e7f759/chromium/extension/lib/dom.min.js#sha256-IGNj9Eoecq7QgY7SAs75wONajgN9Wg0NmCjKTCfu9CY= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@37f09f7/chromium/extension/lib/settings.js#sha256-6fNvLTfXdoewPz3udnvOx31phfXCe++D/ZFiouVTLG4= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@f06fa5f/chromium/extension/lib/styles.js#sha256-fYNQDyrdoBJEOe6bV4a4gQmJ5fI0F5AZpgi9pexi2Es= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@f06fa5f/chromium/extension/lib/sync.js#sha256-EaURhp6pxsBsvRRIHmlfE42HVP1nBxVsnRR7OnSEb1Q= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@f06fa5f/chromium/extension/lib/ui.js#sha256-niLmd2EMi/LCgGgs0MfX7AykWzzfQ9bXCo/6X08M6Ik= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@f06fa5f/chromium/extension/components/buttons.js#sha256-/rb0HQ0NRyw5OgFVNCiLKPnp2qAjZWh1kc8+EEIdifA= // @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@77e43d3/chromium/extension/components/modals.js#sha256-51DQAJXbJueXHDzeqxEfjsgU1tXS3om7pfngPHd7vGQ= // @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-widescreen@f06fa5f/chromium/extension/components/tooltip.js#sha256-2Tgvt77rv89KaCjt4NkHaIkiWZ91QuLOhuMtJeJ6xrk= // @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://www.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–2025 KudoAI & contributors under the MIT license. (async () => { // Init ENV context 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: {} } env.browser.isPortrait = env.browser.isMobile && ( innerWidth < innerHeight ) env.scriptManager.supportsTooltips = env.scriptManager.name == 'Tampermonkey' && parseInt(env.scriptManager.version.split('.')[0]) >= 5 ui.getScheme().then(scheme => env.ui.scheme = scheme) const xhr = typeof GM != 'undefined' && GM.xmlHttpRequest || GM_xmlhttpRequest // Init APP data window.app = { version: GM_info.script.version, configKeyPrefix: `${env.site} Widescreen`, chatgptjsVer: /chatgpt\.js@([\d.]+)/.exec(GM_info.scriptMetaStr)[1], commitHashes: { app: '3fe1040' } // 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: resp => resolve(JSON.parse(resp.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 }) // Init SITE profiles window.sites = Object.assign(Object.create(null), await new Promise(resolve => xhr({ method: 'GET', url: `${app.urls.resourceHost}/assets/data/sites.json5`, onload: resp => resolve(JSON5.parse(resp.responseText)) }))) const chatbarElem = await dom.get.loadedElem(env.site == 'chatgpt' ? 'main form' : sites[env.site].selectors.input) 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 const 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 for (const id of this.entryIDs) { 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 toggles for available features if script not disabled via Site Settings : !config[`${env.site}Disabled`] ? Object.keys(settings.controls).map(key => { if (sites[env.site].availFeatures.includes(key) && !settings.controls[key].excludes?.env?.includes('greasemonkey') ) { const ctrl = settings.controls[key] const menuLabel = `${ ctrl.symbol || this.state.symbols[+settings.typeIsEnabled(key)] } ${ctrl.label} ${ ctrl.type == 'toggle' ? this.state.separator + this.state.words[+settings.typeIsEnabled(key)] : ctrl.status ? ` — ${ctrl.status}` : '' }` return GM_registerMenuCommand(menuLabel, () => { settings.save(key, !config[key]) ; sync.configToUI({ updatedKey: key }) notify(`${ctrl.label}: ${this.state.words[+settings.typeIsEnabled(key)]}`) }, env.scriptManager.supportsTooltips ? { title: ctrl.helptip || ' ' } : undefined ) } }) : [] // Add Site Settings if (!env.extensionActive) { const siteSettingsLabel = `🌐 ${settings.categories.siteSettings.label}` this.entryIDs.push(GM_registerMenuCommand(siteSettingsLabel, () => { // Show modal const siteSettingsModal = modals.alert(siteSettingsLabel, `${settings.categories.siteSettings.helptip}:`, null, null, 365 ) // Stylize toggles container const siteSettingsUL = siteSettingsModal.querySelector('ul') Object.assign(siteSettingsUL.style, { cursor: 'pointer', fontSize: '18px', margin: '16px 0 -15px', minHeight: '100px', listStyle: 'none' }) // Create toggle per site Object.keys(sites).forEach(site => { const siteHomeURL = sites[site].urls.homepage.replace(/^https?:\/\//, '') // Create/append item/label elems const toggleRow = dom.create.elem('li', { title: `${app.msgs.helptip_run} ${app.name} on ${siteHomeURL}`, style: ` color: ${getTextColor()} ; /* based on config */ 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` }) const settingLabel = dom.create.elem('label', { style: 'cursor: pointer' }) settingLabel.textContent = siteHomeURL toggleRow.append(settingLabel) ; siteSettingsUL.append(toggleRow) // Init toggle input const toggleInput = dom.create.elem('input', { type: 'checkbox', disabled: true, style: 'display: none' }) toggleInput.checked = !config[`${site}Disabled`] // Create/stylize switch const switchSpan = dom.create.elem('span') Object.assign(switchSpan.style, { position: 'relative', left: '-1px', bottom:'-8.5px', float: 'right', backgroundColor: '#ccc', width: '26px', height: '13px', borderRadius: '28px', transition: '0.4s', '-webkit-transition': '0.4s', '-moz-transition': '0.4s', '-o-transition': '0.4s', '-ms-transition': '0.4s' }) // Create/stylize knob const knobSpan = dom.create.elem('span') Object.assign(knobSpan.style, { position: 'absolute', left: '1px', bottom: '1px', content: '""', backgroundColor: 'white', width: '11px', height: '11px', borderRadius: '28px', transition: '0.2s', '-webkit-transition': '0.2s', '-moz-transition': '0.2s', '-o-transition': '0.2s', '-ms-transition': '0.2s' }) // Append elems switchSpan.append(knobSpan) ; toggleRow.append(toggleInput, switchSpan) // Update visual state w/ animation setTimeout(() => updateStyles(toggleInput), 155) // Add listeners toggleRow.onmouseenter = () => Object.assign(toggleRow.style, { padding: '4px 10px', transform: 'scale(1.15)', background: 'rgba(100,149,237,0.88)', color: 'white' }) toggleRow.onmouseleave = () => Object.assign(toggleRow.style, { padding: '', transform: '', background: '', color: getTextColor() }) toggleRow.onclick = () => { switchToggle(toggleInput) settings.save(`${site}Disabled`, !config[`${site}Disabled`]) ; sync.configToUI() if (env.site == site) // notify if setting of active site toggled notify(`${app.name} 🧩 ${ app.msgs[`state_${config[`${site}Disabled`] ? 'off' : 'on' }`].toUpperCase()}`) } function getTextColor() { return config[`${site}Disabled`] ? ( env.ui.scheme == 'dark' ? 'rgb(255,255,255,0.65)' : 'rgba(0,0,0,0.45)' ) // off : ( env.ui.scheme == 'dark' ? 'rgb(255,255,255)' : 'rgba(0,0,0)' ) // on } function switchToggle(toggleInput) { toggleInput.checked = !toggleInput.checked ; updateStyles(toggleInput) } function updateStyles(toggleInput) { // toggle show + staggered switch animations in 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 } }) }, env.scriptManager.supportsTooltips ? { title: settings.categories.siteSettings.helptip } : undefined )) } // Add About/Donate entries ['about', 'donate'].forEach(entryType => { if (entryType == 'donate' && env.extensionActive) return this.entryIDs.push(GM_registerMenuCommand( `${ entryType == 'about' ? '💡' : '💖' } ${ app.msgs[`menuLabel_${entryType}`]} ${ entryType == 'about' ? app.msgs.appName : '' }`, () => entryType == 'about' ? modals.open(entryType) : modals.safeWinOpen(app.urls.donate['ko-fi']), env.scriptManager.supportsTooltips ? { title: ' ' } : undefined )) }) } } window.updateCheck = () => xhr({ method: 'GET', url: `${app.urls.update.gm}?t=${Date.now()}`, headers: { 'Cache-Control': 'no-cache' }, onload: resp => { // Compare versions, alert if update found app.latestVer = /@version +(.*)/.exec(resp.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') }}) 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 FEEDBACK functions window.notify = function(msg, pos = '', notifDuration = '', shadow = '') { if (!styles.toast.node) styles.update({ key: 'toast' }) if (config.notifDisabled && !new RegExp(`${app.msgs.menuLabel_show} ${app.msgs.menuLabel_notifs}`, 'i').test(msg) ) return // Strip state word to append colored one later const foundState = toolbarMenu.state.words.find(word => msg.includes(word)) if (foundState) msg = msg.replace(foundState, '') // Show notification chatgpt.notify(`${app.symbol} ${msg}`, pos ||( config.notifBottom ? 'bottom' : '' ), notifDuration, shadow || env.ui.scheme == 'light') const notif = document.querySelector('.chatgpt-notif:last-child') notif.classList.add(app.slug) // for styles.toast // Append styled state word if (foundState) { const stateStyles = { on: { light: 'color: #5cef48 ; text-shadow: rgba(255,250,169,0.38) 2px 1px 5px', dark: 'color: #5cef48 ; text-shadow: rgb(55,255,0) 3px 0 10px' }, off: { light: 'color: #ef4848 ; text-shadow: rgba(255,169,225,0.44) 2px 1px 5px', dark: 'color: #ef4848 ; text-shadow: rgba(255, 116, 116, 0.87) 3px 0 9px' } } const styledStateSpan = dom.create.elem('span') styledStateSpan.style.cssText = stateStyles[ foundState == toolbarMenu.state.words[0] ? 'off' : 'on'][env.ui.scheme] styledStateSpan.append(foundState) ; notif.append(styledStateSpan) } } // 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() sync.configToUI = async function(options) { // from toolbar menu toggles // ... requires components/buttons.js + lib/.js + const { site } = env, scriptWasDisabled = !config[`${site}Disabled`] if (!scriptWasDisabled && config[`${site}Disabled`]) { // reset UI [styles.tweaks.node, styles.widescreen.node, styles.fullWin.node, buttons] .forEach(target => target.remove()) chatbar.reset() if (site != 'poe') document.body.removeEventListener('wheel', window.enableWheelScroll) } else if (!config[`${site}Disabled`]) { // sync modes/tweaks/btns if (config.widescreen ^ styles.widescreen.node.isConnected) { // sync Widescreen suppressNotifs() ; toggleMode('widescreen') } if (sites[site].hasSidebar && ( config.fullWindow ^ await ui.isFullWin() )) { // sync Full-Window suppressNotifs() ; toggleMode('fullWindow') } styles.update({ key: 'tweaks' }) // sync HH/HF/TCB/NCB/BA styles.update({ key: 'chatbar' }) // sync WCB chatbar.tweak() // update ChatGPT chatbar inner width or hack Poe btn pos buttons[config.btnsVisible ? 'insert' : 'remove']() // update button visibility if (options?.updatedKey == 'btnAnimationsDisabled' && !config.btnAnimationsDisabled) // apply/remove fx // ...to visually signal location + preview fx applied by Button Animations toggle-on buttons.animate() else if (/notifBottom|toastMode/.test(options?.updatedKey)) styles.update({ key: 'toast' }) if (site != 'poe') // toggle free wheel locked in some Spam blocks document.body[`${ config.blockSpamDisabled ? 'remove' : 'add' }EventListener`]( 'wheel', window.enableWheelScroll) } toolbarMenu.refresh() // to update state symbol/suffix + toggles visibility on site toggle function suppressNotifs() { if (config.notifDisabled) return settings.save('notifDisabled', true) // suppress notifs for cleaner UI setTimeout( // ...temporarily () => settings.save('notifDisabled', false), options?.updatedKey == 'widescreen' ? 1 : 15) } } 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 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({ key: 'widescreen' }) styles.update({ key: 'chatbar' }) prevPath = location.pathname } }).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() && notify(app.msgs.notif_chatStopped, 'bottom-right')) } catch (err) {} }) })()