Export ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML

Export ChatGPT, Gemini, Grok, Claude conversations to Markdown, JSON, CSV, TXT, HTML

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Export ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:af      UITVOER ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:am      ኤክስፖርት ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ar      تصدير ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:as      এক্সপোর্ট ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:az      İXRAC ET ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:be      ЭКСПАРТ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:bg      ЕКСПОРТИРАНЕ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:bn      এক্সপোর্ট ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:bs      IZVEZI ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ca      EXPORTAR ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:cs      EXPORTOVAT ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:da      EKSPORTER ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:de      EXPORTIEREN ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:dz      ཕྱིར་འདྲེན། ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:el      ΕΞΑΓΩΓΗ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:en      EXPORT ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:en-GB   EXPORT ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:en-US   EXPORT ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:eo      EKSPORTI ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:es      EXPORTAR ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:es-419  EXPORTAR ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:es-US   EXPORTAR ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:et      EKSPORDI ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:eu      ESPORTATU ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:fa      خروجی ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:fi      VIE ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:fil     I-EXPORT ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:fr      EXPORTER ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:fr-CA   EXPORTER ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ga      EASPUITÁIL ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:gl      EXPORTAR ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:gn      EXPORTA ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:gu      એક્સપોર્ટ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ha      FITARWA ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:hi      एक्सपोर्ट ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:hr      IZVEZI ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:hu      EXPORTÁLÁS ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:hy      ԱՐՏԱՀԱՆԵԼ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:id      EKSPOR ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ig      BUPỤ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:is      ÚTFLYTJA ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:it      ESPORTA ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:iw      ייצוא ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ja      エクスポート ChatGPT/Gemini/Grok/Claude チャット -> MD, JSON, CSV, TXT, HTML
// @name:jv      EKSPOR ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ka      ᲔᲥᲡᲞᲝᲠᲢᲘ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:kk      ЭКСПОРТТАУ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:km      នាំចេញ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:kn      ರಫ್ತು ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ko      내보내기 ChatGPT/Gemini/Grok/Claude 채팅 -> MD, JSON, CSV, TXT, HTML
// @name:ky      ЭКСПОРТТОО ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:lo      ສົ່ງອອກ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:lt      EKSPORTUOTI ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:lv      EKSPORTĒT ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:mg      HONDRAINA ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:mk      ЕКСПОРТ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ml      കയറ്റുമതി ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:mn      ЭКСПОРТЛОХ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:mr      निर्यात ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ms      EKSPORT ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:mt      ESPORTA ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:my      ထုတ်ယူ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ne      निर्यात ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:nl      EXPORTEREN ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:no      EKSPORTER ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:om      ERGUU ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:or      ଏକ୍ସପୋର୍ଟ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:pa      ਨਿਰਯਾਤ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:pl      EKSPORTUJ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ps      صادرول ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:pt      EXPORTAR ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:pt-BR   EXPORTAR ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:pt-PT   EXPORTAR ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ro      EXPORTĂ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ru      ЭКСПОРТ ChatGPT/Gemini/Grok/Claude Чат -> MD, JSON, CSV, TXT, HTML
// @name:rw      KOHEREZA ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:si      අපනයනය ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:sk      EXPORTOVAŤ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:sl      IZVOZI ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:sn      TUMIRA ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:so      DHOOFI ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:sq      EKSPORTO ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:sr      IZVEZI ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:sr-Latn IZVEZI ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:st      ROMELA ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:sv      EXPORTERA ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:sw      HAMISHA ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ta      ஏற்றுமதி ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:te      ఎగుమతి ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:tg      СОДИРОТ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:th      ส่งออก ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ti      ሰደድ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:tk      EKSPORT ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:tr      DIŞA AKTAR ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ug      چىقىرىش ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:uk      ЕКСПОРТУВАТИ ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:ur      برآمد ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:uz      EKSPORT ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:vi      XUẤT ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:yo      ṢE IṢIPO ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @name:zh-CN   导出 ChatGPT/Gemini/Grok/Claude 聊天记录 -> MD, JSON, CSV, TXT, HTML
// @name:zh-HK   導出 ChatGPT/Gemini/Grok/Claude 聊天紀錄 -> MD, JSON, CSV, TXT, HTML
// @name:zh-TW   導出 ChatGPT/Gemini/Grok/Claude 聊天紀錄 -> MD, JSON, CSV, TXT, HTML
// @name:zu      THUMELA ChatGPT/Gemini/Grok/Claude Chat -> MD, JSON, CSV, TXT, HTML
// @description         Export ChatGPT, Gemini, Grok, Claude conversations to Markdown, JSON, CSV, TXT, HTML
// @description:af      UITVOER ChatGPT, Gemini, Grok, Claude gesprekke na Markdown, JSON, CSV, TXT, HTML
// @description:am      ኤክስፖርት ChatGPT, Gemini, Grok, Claude ንግግሮች ወደ Markdown, JSON, CSV, TXT, HTML
// @description:ar      تصدير محادثات ChatGPT و Gemini و Grok و Claude إلى Markdown و JSON و CSV و TXT و HTML
// @description:as      এক্সপোর্ট ChatGPT, Gemini, Grok, Claude কথাবতৰা Markdown, JSON, CSV, TXT, HTML লৈ
// @description:az      ChatGPT, Gemini, Grok, Claude söhbətlərini Markdown, JSON, CSV, TXT, HTML olaraq ixrac edin
// @description:be      Экспарт размоў ChatGPT, Gemini, Grok, Claude у Markdown, JSON, CSV, TXT, HTML
// @description:bg      Експортирайте разговорите от ChatGPT, Gemini, Grok, Claude в Markdown, JSON, CSV, TXT, HTML
// @description:bn      এক্সপোর্ট ChatGPT, Gemini, Grok, Claude কথোপকথন Markdown, JSON, CSV, TXT, HTML-এ
// @description:bs      Izvezi ChatGPT, Gemini, Grok, Claude razgovore u Markdown, JSON, CSV, TXT, HTML
// @description:ca      Exporta les converses de ChatGPT, Gemini, Grok, Claude a Markdown, JSON, CSV, TXT, HTML
// @description:cs      Exportujte konverzace ChatGPT, Gemini, Grok, Claude do Markdown, JSON, CSV, TXT, HTML
// @description:da      Eksporter ChatGPT, Gemini, Grok, Claude samtaler til Markdown, JSON, CSV, TXT, HTML
// @description:de      Exportieren Sie ChatGPT-, Gemini-, Grok-, Claude-Unterhaltungen in Markdown, JSON, CSV, TXT, HTML
// @description:dz      ཕྱིར་འདྲེན། ChatGPT, Gemini, Grok, Claude ཁ་བརྡ་ Markdown, JSON, CSV, TXT, HTML ལུ།
// @description:el      Εξαγωγή συνομιλιών ChatGPT, Gemini, Grok, Claude σε Markdown, JSON, CSV, TXT, HTML
// @description:en      Export ChatGPT, Gemini, Grok, Claude conversations to Markdown, JSON, CSV, TXT, HTML
// @description:en-GB   Export ChatGPT, Gemini, Grok, Claude conversations to Markdown, JSON, CSV, TXT, HTML
// @description:en-US   Export ChatGPT, Gemini, Grok, Claude conversations to Markdown, JSON, CSV, TXT, HTML
// @description:eo      Eksportu konversaciojn de ChatGPT, Gemini, Grok, Claude al Markdown, JSON, CSV, TXT, HTML
// @description:es      Exporta conversaciones de ChatGPT, Gemini, Grok, Claude a Markdown, JSON, CSV, TXT, HTML
// @description:es-419  Exporta conversaciones de ChatGPT, Gemini, Grok, Claude a Markdown, JSON, CSV, TXT, HTML
// @description:es-US   Exporta conversaciones de ChatGPT, Gemini, Grok, Claude a Markdown, JSON, CSV, TXT, HTML
// @description:et      Ekspordi ChatGPT, Gemini, Grok, Claude vestlused Markdowni, JSONi, CSV-sse, TXTi, HTMLi
// @description:eu      Esportatu ChatGPT, Gemini, Grok, Claude elkarrizketak Markdown, JSON, CSV, TXT, HTML formatuetara
// @description:fa      خروجی مکالمات ChatGPT، Gemini، Grok، Claude به Markdown، JSON، CSV، TXT، HTML
// @description:fi      Vie ChatGPT-, Gemini-, Grok-, Claude-keskustelut Markdown-, JSON-, CSV-, TXT- tai HTML-muotoon
// @description:fil     I-export ang mga pag-uusap sa ChatGPT, Gemini, Grok, Claude sa Markdown, JSON, CSV, TXT, HTML
// @description:fr      Exportez les conversations ChatGPT, Gemini, Grok, Claude en Markdown, JSON, CSV, TXT, HTML
// @description:fr-CA   Exportez les conversations ChatGPT, Gemini, Grok, Claude en Markdown, JSON, CSV, TXT, HTML
// @description:ga      Easpórtáil comhráite ChatGPT, Gemini, Grok, Claude go Markdown, JSON, CSV, TXT, HTML
// @description:gl      Exportar conversas de ChatGPT, Gemini, Grok, Claude a Markdown, JSON, CSV, TXT, HTML
// @description:gn      Exporta ñemongeta ChatGPT, Gemini, Grok, Claude Markdown, JSON, CSV, TXT, HTML-pe
// @description:gu      ChatGPT, Gemini, Grok, Claude વાતચીતોને Markdown, JSON, CSV, TXT, HTML માં એક્સપોર્ટ કરો
// @description:ha      Fitar da tattaunawar ChatGPT, Gemini, Grok, Claude zuwa Markdown, JSON, CSV, TXT, HTML
// @description:hi      ChatGPT, Gemini, Grok, Claude वार्तालापों को Markdown, JSON, CSV, TXT, HTML में एक्सपोर्ट करें
// @description:hr      Izvezi ChatGPT, Gemini, Grok, Claude razgovore u Markdown, JSON, CSV, TXT, HTML
// @description:hu      Exportálja a ChatGPT, Gemini, Grok, Claude beszélgetéseket Markdown, JSON, CSV, TXT, HTML formátumba
// @description:hy      Արտահանել ChatGPT, Gemini, Grok, Claude խոսակցությունները Markdown, JSON, CSV, TXT, HTML
// @description:id      Ekspor percakapan ChatGPT, Gemini, Grok, Claude ke Markdown, JSON, CSV, TXT, HTML
// @description:ig      Bupụ mkparịta ụka ChatGPT, Gemini, Grok, Claude na Markdown, JSON, CSV, TXT, HTML
// @description:is      Flytja út ChatGPT, Gemini, Grok, Claude samtöl í Markdown, JSON, CSV, TXT, HTML
// @description:it      Esporta le conversazioni di ChatGPT, Gemini, Grok, Claude in Markdown, JSON, CSV, TXT, HTML
// @description:iw      ייצוא שיחות ChatGPT, Gemini, Grok, Claude ל-Markdown, JSON, CSV, TXT, HTML
// @description:ja      ChatGPT、Gemini、Grok、Claudeの会話をMarkdown、JSON、CSV、TXT、HTMLにエクスポート
// @description:jv      Ekspor obrolan ChatGPT, Gemini, Grok, Claude menyang Markdown, JSON, CSV, TXT, HTML
// @description:ka      Ექსპორტი ChatGPT, Gemini, Grok, Claude საუბრების Markdown, JSON, CSV, TXT, HTML-ში
// @description:kk      ChatGPT, Gemini, Grok, Claude сұхбаттарын Markdown, JSON, CSV, TXT, HTML форматына экспорттау
// @description:km      នាំចេញការសន្ទនា ChatGPT, Gemini, Grok, Claude ទៅជា Markdown, JSON, CSV, TXT, HTML
// @description:kn      ChatGPT, Gemini, Grok, Claude ಸಂಭಾಷಣೆಗಳನ್ನು Markdown, JSON, CSV, TXT, HTML ಗೆ ರಫ್ತು ಮಾಡಿ
// @description:ko      ChatGPT, Gemini, Grok, Claude 대화를 Markdown, JSON, CSV, TXT, HTML로 내보내기
// @description:ky      ChatGPT, Gemini, Grok, Claude баарлашууларын Markdown, JSON, CSV, TXT, HTMLге экспорттоо
// @description:lo      ສົ່ງອອກບົດສົນທະນາ ChatGPT, Gemini, Grok, Claude ເປັນ Markdown, JSON, CSV, TXT, HTML
// @description:lt      Eksportuokite ChatGPT, Gemini, Grok, Claude pokalbius į Markdown, JSON, CSV, TXT, HTML
// @description:lv      Eksportēt ChatGPT, Gemini, Grok, Claude sarunas uz Markdown, JSON, CSV, TXT, HTML
// @description:mg      Hondrana ny resaka ChatGPT, Gemini, Grok, Claude ho Markdown, JSON, CSV, TXT, HTML
// @description:mk      Експортирајте разговори од ChatGPT, Gemini, Grok, Claude во Markdown, JSON, CSV, TXT, HTML
// @description:ml      ChatGPT, Gemini, Grok, Claude സംഭാഷണങ്ങൾ Markdown, JSON, CSV, TXT, HTML എന്നിവയിലേക്ക് കയറ്റുമതി ചെയ്യുക
// @description:mn      ChatGPT, Gemini, Grok, Claude харилцан яриаг Markdown, JSON, CSV, TXT, HTML руу экспортлох
// @description:mr      ChatGPT, Gemini, Grok, Claude संभाषणे Markdown, JSON, CSV, TXT, HTML मध्ये निर्यात करा
// @description:ms      Eksport perbualan ChatGPT, Gemini, Grok, Claude ke Markdown, JSON, CSV, TXT, HTML
// @description:mt      Esporta konversazzjonijiet ChatGPT, Gemini, Grok, Claude għal Markdown, JSON, CSV, TXT, HTML
// @description:my      ChatGPT, Gemini, Grok, Claude စကားပြောများကို Markdown, JSON, CSV, TXT, HTML သို့ ထုတ်ယူပါ
// @description:ne      ChatGPT, Gemini, Grok, Claude कुराकानीहरूलाई Markdown, JSON, CSV, TXT, HTML मा निर्यात गर्नुहोस्
// @description:nl      Exporteer ChatGPT-, Gemini-, Grok-, Claude-gesprekken naar Markdown, JSON, CSV, TXT, HTML
// @description:no      Eksporter ChatGPT-, Gemini-, Grok-, Claude-samtaler til Markdown, JSON, CSV, TXT, HTML
// @description:om      Marii ChatGPT, Gemini, Grok, Claude gara Markdown, JSON, CSV, TXT, HTMLtti ergi
// @description:or      ChatGPT, Gemini, Grok, Claude କଥାବାର୍ତ୍ତାକୁ Markdown, JSON, CSV, TXT, HTML କୁ ଏକ୍ସପୋର୍ଟ କରନ୍ତୁ
// @description:pa      ChatGPT, Gemini, Grok, Claude ਗੱਲਬਾਤਾਂ ਨੂੰ Markdown, JSON, CSV, TXT, HTML ਵਿੱਚ ਨਿਰਯਾਤ ਕਰੋ
// @description:pl      Eksportuj rozmowy ChatGPT, Gemini, Grok, Claude do Markdown, JSON, CSV, TXT, HTML
// @description:ps      د ChatGPT، Gemini، Grok، Claude خبرې اترې Markdown، JSON، CSV، TXT، HTML ته صادر کړئ
// @description:pt      Exportar conversas do ChatGPT, Gemini, Grok, Claude para Markdown, JSON, CSV, TXT, HTML
// @description:pt-BR   Exportar conversas do ChatGPT, Gemini, Grok, Claude para Markdown, JSON, CSV, TXT, HTML
// @description:pt-PT   Exportar conversas do ChatGPT, Gemini, Grok, Claude para Markdown, JSON, CSV, TXT, HTML
// @description:ro      Exportați conversațiile ChatGPT, Gemini, Grok, Claude în Markdown, JSON, CSV, TXT, HTML
// @description:ru      Экспорт разговоров ChatGPT, Gemini, Grok, Claude в форматы Markdown, JSON, CSV, TXT, HTML
// @description:rw      Kohereza ibiganiro bya ChatGPT, Gemini, Grok, Claude muri Markdown, JSON, CSV, TXT, HTML
// @description:si      ChatGPT, Gemini, Grok, Claude සංවාද Markdown, JSON, CSV, TXT, HTML වෙත අපනයනය කරන්න
// @description:sk      Exportujte konverzácie ChatGPT, Gemini, Grok, Claude do Markdown, JSON, CSV, TXT, HTML
// @description:sl      Izvozite pogovore ChatGPT, Gemini, Grok, Claude v Markdown, JSON, CSV, TXT, HTML
// @description:sn      Tumira hurukuro dzeChatGPT, Gemini, Grok, Claude kuMarkdown, JSON, CSV, TXT, HTML
// @description:so      U dhoofi wada-hadallada ChatGPT, Gemini, Grok, Claude qaabka Markdown, JSON, CSV, TXT, HTML
// @description:sq      Eksporto bisedat e ChatGPT, Gemini, Grok, Claude në Markdown, JSON, CSV, TXT, HTML
// @description:sr      Izvezi ChatGPT, Gemini, Grok, Claude razgovore u Markdown, JSON, CSV, TXT, HTML
// @description:sr-Latn Izvezi ChatGPT, Gemini, Grok, Claude razgovore u Markdown, JSON, CSV, TXT, HTML
// @description:st      Romela lipuisano tsa ChatGPT, Gemini, Grok, Claude ho Markdown, JSON, CSV, TXT, HTML
// @description:sv      Exportera ChatGPT-, Gemini-, Grok-, Claude-konversationer till Markdown, JSON, CSV, TXT, HTML
// @description:sw      Hamisha mazungumzo ya ChatGPT, Gemini, Grok, Claude hadi Markdown, JSON, CSV, TXT, HTML
// @description:ta      ChatGPT, Gemini, Grok, Claude உரையாடல்களை Markdown, JSON, CSV, TXT, HTML ஆக ஏற்றுமதி செய்
// @description:te      ChatGPT, Gemini, Grok, Claude సంభాషణలను Markdown, JSON, CSV, TXT, HTMLకు ఎగుమతి చేయండి
// @description:tg      Муколамаҳои ChatGPT, Gemini, Grok, Claude-ро ба Markdown, JSON, CSV, TXT, HTML содирот кунед
// @description:th      ส่งออกบทสนทนา ChatGPT, Gemini, Grok, Claude เป็น Markdown, JSON, CSV, TXT, HTML
// @description:ti      ናይ ChatGPT, Gemini, Grok, Claude ዝርርባት ናብ Markdown, JSON, CSV, TXT, HTML ሰደድ
// @description:tk      ChatGPT, Gemini, Grok, Claude gepleşiklerini Markdown, JSON, CSV, TXT, HTML-a eksport ediň
// @description:tr      ChatGPT, Gemini, Grok, Claude konuşmalarını Markdown, JSON, CSV, TXT, HTML olarak dışa aktarın
// @description:ug      ChatGPT, Gemini, Grok, Claude سۆھبەتلىرىنى Markdown, JSON, CSV, TXT, HTML غا چىقىرىڭ
// @description:uk      Експортувати розмови ChatGPT, Gemini, Grok, Claude у формати Markdown, JSON, CSV, TXT, HTML
// @description:ur      ChatGPT، Gemini، Grok، Claude کی گفتگو کو Markdown، JSON، CSV، TXT، HTML میں برآمد کریں
// @description:uz      ChatGPT, Gemini, Grok, Claude suhbatlarini Markdown, JSON, CSV, TXT, HTML formatlariga eksport qilish
// @description:vi      Xuất các cuộc trò chuyện ChatGPT, Gemini, Grok, Claude sang Markdown, JSON, CSV, TXT, HTML
// @description:yo      Ṣe iṣipo awọn ibaraẹnisọrọ ChatGPT, Gemini, Grok, Claude si Markdown, JSON, CSV, TXT, HTML
// @description:zh-CN   将 ChatGPT、Gemini、Grok、Claude 的聊天记录导出为 Markdown、JSON、CSV、TXT、HTML 格式。
// @description:zh-HK   將 ChatGPT、Gemini、Grok、Claude 的聊天紀錄導出為 Markdown、JSON、CSV、TXT、HTML 格式。
// @description:zh-TW   將 ChatGPT、Gemini、Grok、Claude 的聊天紀錄導出為 Markdown、JSON、CSV、TXT、HTML 格式。
// @description:zu      Thumela izingxoxo ze-ChatGPT, Gemini, Grok, Claude ku-Markdown, JSON, CSV, TXT, HTML
// @namespace    AI_I18N_Final
// @version      1.0.0
// @author       Kairox
// @include      *://chatgpt.com/*
// @include      *://grok.com/*
// @include      *://gemini.google.com/*
// @include      *://claude.ai/*
// @noframes
// @license      MIT
// @run-at       document-idle
// @grant        GM_addStyle
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

(function () {
    'use strict';

    const i18n = {
        "af": "UITVOER", "am": "ኤክስፖርት", "ar": "تصدير", "as": "এক্সপোর্ট", "az": "İXRAC ET",
        "be": "ЭКСПАРТ", "bg": "ЕКСПОРТИРАНЕ", "bn": "এক্সপোর্ট", "bs": "IZVEZI", "ca": "EXPORTAR",
        "cs": "EXPORTOVAT", "da": "EKSPORTER", "de": "EXPORTIEREN", "dz": "ཕྱིར་འདྲེན།", "el": "ΕΞΑΓΩΓΗ",
        "en": "EXPORT", "en-GB": "EXPORT", "en-US": "EXPORT", "eo": "EKSPORTI", "es": "EXPORTAR",
        "es-419": "EXPORTAR", "es-US": "EXPORTAR", "et": "EKSPORDI", "eu": "ESPORTATU", "fa": "خروجی",
        "fi": "VIE", "fil": "I-EXPORT", "fr": "EXPORTER", "fr-CA": "EXPORTER", "ga": "EASPUITÁIL",
        "gl": "EXPORTAR", "gn": "EXPORTA", "gu": "એક્સપોર્ટ", "ha": "FITARWA", "hi": "एक्सपोर्ट",
        "hr": "IZVEZI", "hu": "EXPORTÁLÁS", "hy": "ԱՐՏԱՀԱՆԵԼ", "id": "EKSPOR", "ig": "BUPỤ",
        "is": "ÚTFLYTJA", "it": "ESPORTA", "iw": "ייצוא", "ja": "エクスポート", "jv": "EKSPOR",
        "ka": "ᲔᲥᲡᲞᲝᲠᲢᲘ", "kk": "ЭКСПОРТТАУ", "km": "នាំចេញ", "kn": "ರಫ್ತು", "ko": "내보내기",
        "ky": "ЭКСПОРТТОО", "lo": "ສົ່ງອອກ", "lt": "EKSPORTUOTI", "lv": "EKSPORTĒT", "mg": "HONDRAINA",
        "mk": "ЕКСПОРТ", "ml": "കയറ്റുമതി", "mn": "ЭКСПОРТЛОХ", "mr": "निर्यात", "ms": "EKSPORT",
        "mt": "ESPORTA", "my": "ထုတ်ယူ", "ne": "निर्यात", "nl": "EXPORTEREN", "no": "EKSPORTER",
        "om": "ERGUU", "or": "ଏକ୍ସପୋର୍ଟ", "pa": "ਨਿਰਯਾਤ", "pl": "EKSPORTUJ", "ps": "صادرول",
        "pt": "EXPORTAR", "pt-BR": "EXPORTAR", "pt-PT": "EXPORTAR", "ro": "EXPORTĂ", "ru": "ЭКСПОРТ",
        "rw": "KOHEREZA", "si": "අපනයනය", "sk": "EXPORTOVAŤ", "sl": "IZVOZI", "sn": "TUMIRA",
        "so": "DHOOFI", "sq": "EKSPORTO", "sr": "IZVEZI", "sr-Latn": "IZVEZI", "st": "ROMELA",
        "sv": "EXPORTERA", "sw": "HAMISHA", "ta": "ஏற்றுமதி", "te": "ఎగుమతి", "tg": "СОДИРОТ",
        "th": "ส่งออก", "ti": "ሰደድ", "tk": "EKSPORT", "tr": "DIŞA AKTAR", "ug": "چىقىرىش",
        "uk": "ЕКСПОРТУВАТИ", "ur": "برآمد", "uz": "EKSPORT", "vi": "XUẤT", "yo": "ṢE IṢIPO",
        "zh-CN": "导出", "zh-HK": "導出", "zh-TW": "導出", "zu": "THUMELA"
    };

    const sysLang = navigator.language || 'en';
    const langKey = i18n[sysLang] ? sysLang : sysLang.split('-')[0];
    const exportLabel = i18n[langKey] || i18n['en'];

    const CommonUtil = {
        createElement: function(tag, opts = {}) {
            const el = document.createElement(tag);
            if (opts.html) el.innerHTML = opts.html;
            if (opts.text) el.textContent = opts.text;
            if (opts.className) el.className = opts.className;
            if (opts.style) Object.assign(el.style, opts.style);
            if (opts.childrens) opts.childrens.forEach(c => el.appendChild(c));
            return el;
        }
    };

    const HtmlToMarkdown = {
        to: function(html, platform) {
            const parser = new DOMParser();
            const doc = parser.parseFromString(html, "text/html");
            const isChatGPT = platform === "chatGPT", isGemini = platform === "gemini", isGrok = platform === "grok", isClaude = platform === "claude";

            if (!isGemini) doc.querySelectorAll("span.katex-html").forEach(el => el.remove());
            doc.querySelectorAll("mrow").forEach(m => m.remove());
            doc.querySelectorAll('annotation[encoding="application/x-tex"]').forEach(el => {
                if (el.closest(".katex-display")) el.replaceWith(`\n$$\n${el.textContent.trim()}\n$$\n`);
                else el.replaceWith(`$${el.textContent.trim()}$`);
            });

            doc.querySelectorAll("strong, b").forEach(b => b.parentNode.replaceChild(document.createTextNode(`**${b.textContent}**`), b));
            doc.querySelectorAll("em, i").forEach(i => i.parentNode.replaceChild(document.createTextNode(`*${i.textContent}*`), i));
            doc.querySelectorAll("p code").forEach(c => c.parentNode.replaceChild(document.createTextNode(`\`${c.textContent}\``), c));
            doc.querySelectorAll("a").forEach(a => a.parentNode.replaceChild(document.createTextNode(`[${a.textContent}](${a.href})`), a));
            doc.querySelectorAll("img").forEach(img => img.parentNode.replaceChild(document.createTextNode(`![${img.alt}](${img.src})`), img));

            if (isChatGPT) {
                doc.querySelectorAll("pre").forEach(pre => {
                    const type = pre.querySelector("div > div:first-child")?.textContent || "";
                    const code = pre.querySelector("div > div:nth-child(3) > code")?.textContent || pre.textContent;
                    pre.innerHTML = `\n\`\`\`${type}\n${code}\n\`\`\`\n`;
                });
            } else if (isGrok) {
                doc.querySelectorAll("div.not-prose").forEach(div => {
                    const type = div.querySelector("div > div > span")?.textContent || "";
                    const code = div.querySelector("div > div:nth-child(3) > code")?.textContent || div.textContent;
                    div.innerHTML = `\n\`\`\`${type}\n${code}\n\`\`\`\n`;
                });
            } else if (isGemini) {
                doc.querySelectorAll("code-block").forEach(div => {
                    const type = div.querySelector("div > div > span")?.textContent || "";
                    const code = div.querySelector("div > div:nth-child(2) > div > pre")?.textContent || div.textContent;
                    div.innerHTML = `\n\`\`\`${type}\n${code}\n\`\`\`\n`;
                });
            } else if (isClaude) {
                doc.querySelectorAll("pre").forEach(pre => {
                    const code = pre.querySelector("code");
                    const type = code ? Array.from(code.classList).find(c => c.startsWith('language-'))?.replace('language-', '') : "";
                    pre.innerHTML = `\n\`\`\`${type || ''}\n${code ? code.textContent : pre.textContent}\n\`\`\`\n`;
                });
            }

            doc.querySelectorAll("ul").forEach(ul => {
                let m = "";
                ul.querySelectorAll(":scope > li").forEach(li => m += `- ${li.textContent.trim()}\n`);
                ul.parentNode.replaceChild(document.createTextNode("\n" + m.trim()), ul);
            });
            doc.querySelectorAll("ol").forEach(ol => {
                let m = "";
                ol.querySelectorAll(":scope > li").forEach((li, idx) => m += `${idx + 1}. ${li.textContent.trim()}\n`);
                ol.parentNode.replaceChild(document.createTextNode("\n" + m.trim()), ol);
            });
            for (let i = 1; i <= 6; i++) {
                doc.querySelectorAll(`h${i}`).forEach(h => h.parentNode.replaceChild(document.createTextNode(`\n${"#".repeat(i)} ${h.textContent}\n`), h));
            }
            doc.querySelectorAll("p").forEach(p => p.parentNode.replaceChild(document.createTextNode("\n" + p.textContent + "\n"), p));
            return doc.body.innerHTML.replace(/<[^>]*>/g, "").replace(/&amp;/g, "&").trim();
        }
    };

    const Chat = {
        getElements: function() {
            const h = window.location.href, res = [];
            let p = "", t = document.title || "Export";
            if (h.includes("chatgpt.com")) {
                p = "chatGPT"; t = document.querySelector("#history a[data-active]")?.textContent || t;
                res.push(...document.querySelectorAll("div[data-message-id]"));
            } else if (h.includes("grok.com")) {
                p = "grok"; res.push(...document.querySelectorAll("div.message-bubble"));
            } else if (h.includes("gemini.google.com")) {
                p = "gemini"; t = document.querySelector("conversations-list div.selected")?.textContent || t;
                const qs = document.querySelectorAll("user-query-content"), rs = document.querySelectorAll("model-response");
                for (let i = 0; i < qs.length; i++) { res.push(qs[i]); if (rs[i]) res.push(rs[i]); }
            } else if (h.includes("claude.ai")) {
                p = "claude"; res.push(...document.querySelectorAll('[data-testid="user-message"], .font-claude-response'));
            }
            return { res, p, t: t.replace(/[\/\\\?\%\*\:\|"<>\.]/g, "_") };
        },
        export: function(fmt) {
            const { res, p, t } = this.getElements();
            if (!res.length) return;
            let c = "", m = 'text/plain';
            if (fmt === 'json') {
                c = JSON.stringify(res.reduce((a, x, i) => { if(i%2===0 && res[i+1]) a.push({q: HtmlToMarkdown.to(x.innerHTML,p), a: HtmlToMarkdown.to(res[i+1].innerHTML,p)}); return a; }, []), null, 2);
                m = 'application/json';
            } else if (fmt === 'csv') {
                c = "Q,A\n" + res.reduce((a, x, i) => { if(i%2===0 && res[i+1]) a += `"${HtmlToMarkdown.to(x.innerHTML,p).replace(/"/g,'""')}","${HtmlToMarkdown.to(res[i+1].innerHTML,p).replace(/"/g,'""')}"\n`; return a; }, "");
                m = 'text/csv';
            } else if (fmt === 'html') {
                c = `<html><body style="font-family:sans-serif;max-width:800px;margin:auto;padding:30px;line-height:1.7;">${res.reduce((a, x, i) => { if(i%2===0 && res[i+1]) a += `<div style="background:#f4f4f5;padding:15px;border-radius:12px;margin:20px 0;"><b>Q:</b> ${x.innerHTML}</div><div><b>A:</b> ${res[i+1].innerHTML}</div><hr/>`; return a; }, "")}</body></html>`;
                m = 'text/html';
            } else if (fmt === 'md') {
                c = res.reduce((a, x, i) => { if(i%2===0 && res[i+1]) a += `\n# Q:\n${HtmlToMarkdown.to(x.innerHTML,p)}\n\n# A:\n${HtmlToMarkdown.to(res[i+1].innerHTML,p)}\n\n---\n`; return a; }, "");
                m = 'text/markdown';
            } else {
                c = res.reduce((a, x, i) => { if(i%2===0 && res[i+1]) a += `\nQ:\n${x.textContent.trim()}\n\nA:\n${res[i+1].textContent.trim()}\n\n---\n`; return a; }, "");
            }
            const b = new Blob([c.replace(/&amp;/g, "&")], { type: m });
            const u = URL.createObjectURL(b), a = document.createElement("a");
            a.href = u; a.download = `${t}.${fmt}`; document.body.appendChild(a); a.click();
            setTimeout(() => { document.body.removeChild(a); URL.revokeObjectURL(u); }, 0);
        }
    };

    GM_addStyle(`
        .ai-export-drag-box { position: fixed; z-index: 2147483646; display: flex; flex-direction: column; align-items: center; justify-content: center; background: rgba(28,28,30,0.85); backdrop-filter: blur(12px); color: #fff; border-radius: 100px; box-shadow: 0 8px 32px rgba(0,0,0,0.2); cursor: move; user-select: none; border: 1px solid rgba(255,255,255,0.1); padding: 10px 20px; font-family: system-ui; font-size: 14px; font-weight: 600; transition: transform 0.2s ease, opacity 0.2s; white-space: nowrap; }
        .ai-export-drag-box:hover { transform: scale(1.05); }
        .ai-export-menu-panel { position: absolute; width: max-content; min-width: 150px; background: rgba(255,255,255,0.95); backdrop-filter: blur(20px); border-radius: 16px; padding: 6px; display: none; flex-direction: column; }
        .pos-bottom-right { bottom: calc(100% + 15px); right: 0; transform-origin: bottom right; animation: aiPopUp 0.3s cubic-bezier(0.16, 1, 0.3, 1); box-shadow: 0 -10px 50px rgba(0,0,0,0.2); }
        .pos-bottom-left { bottom: calc(100% + 15px); left: 0; transform-origin: bottom left; animation: aiPopUp 0.3s cubic-bezier(0.16, 1, 0.3, 1); box-shadow: 0 -10px 50px rgba(0,0,0,0.2); }
        .pos-top-right { top: calc(100% + 15px); right: 0; transform-origin: top right; animation: aiPopDown 0.3s cubic-bezier(0.16, 1, 0.3, 1); box-shadow: 0 10px 50px rgba(0,0,0,0.2); }
        .pos-top-left { top: calc(100% + 15px); left: 0; transform-origin: top left; animation: aiPopDown 0.3s cubic-bezier(0.16, 1, 0.3, 1); box-shadow: 0 10px 50px rgba(0,0,0,0.2); }
        @media (prefers-color-scheme: dark) {
            .ai-export-menu-panel { background: rgba(30,30,34,0.9); }
            .pos-bottom-right, .pos-bottom-left { box-shadow: 0 -10px 50px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.1); }
            .pos-top-right, .pos-top-left { box-shadow: 0 10px 50px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.1); }
        }
        @keyframes aiPopUp { 0% { opacity: 0; transform: scale(0.9) translateY(10px); } 100% { opacity: 1; transform: scale(1) translateY(0); } }
        @keyframes aiPopDown { 0% { opacity: 0; transform: scale(0.9) translateY(-10px); } 100% { opacity: 1; transform: scale(1) translateY(0); } }
        .ai-export-menu-item { display: flex; align-items: center; padding: 12px 14px; background: transparent; border: none; border-radius: 10px; text-align: left; cursor: pointer; color: #333; font-size: 13px; font-weight: 500; transition: 0.15s ease; width: 100%; white-space: nowrap; }
        @media (prefers-color-scheme: dark) { .ai-export-menu-item { color: #eee; } }
        .ai-export-menu-item:hover { background: rgba(16,163,127,0.15); color: #10a37f; }
        .ai-export-menu-item.clicked { transform: scale(0.92); background: rgba(16,163,127,0.3); opacity: 0.7; }
    `);

    function init() {
        if (document.querySelector('.ai-export-drag-box')) return;
        const box = CommonUtil.createElement("div", { className: "ai-export-drag-box" });
        box.innerHTML = `<div style="display:flex;align-items:center;gap:8px;pointer-events:none;"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3"/></svg><span>${exportLabel}</span></div>`;
        const menu = CommonUtil.createElement("div", { className: "ai-export-menu-panel" });
        ['md', 'json', 'csv', 'txt', 'html'].forEach(ext => {
            const btn = CommonUtil.createElement("button", { className: "ai-export-menu-item", text: `${exportLabel} .${ext.toUpperCase()}` });
            btn.onclick = (e) => {
                e.stopPropagation();
                btn.classList.add('clicked');
                setTimeout(() => {
                    btn.classList.remove('clicked');
                    Chat.export(ext);
                    menu.style.display = 'none';
                }, 200);
            };
            menu.appendChild(btn);
        });
        box.appendChild(menu);
        document.body.appendChild(box);
        const sX = GM_getValue('x', window.innerWidth - 160), sY = GM_getValue('y', window.innerHeight - 100);
        box.style.left = Math.max(0, Math.min(sX, window.innerWidth - 120)) + 'px'; box.style.top = Math.max(0, Math.min(sY, window.innerHeight - 60)) + 'px';
        let drag = false, moved = false, sX0, sY0, iL, iT;
        box.onmousedown = (e) => { drag = true; moved = false; sX0 = e.clientX; sY0 = e.clientY; iL = box.offsetLeft; iT = box.offsetTop; e.preventDefault(); };
        document.onmousemove = (e) => {
            if (!drag) return;
            const dx = e.clientX - sX0, dy = e.clientY - sY0;
            if (Math.abs(dx) > 3 || Math.abs(dy) > 3) moved = true;
            box.style.left = (iL + dx) + 'px'; box.style.top = (iT + dy) + 'px';
        };
        document.onmouseup = () => { if (drag && moved) { GM_setValue('x', box.offsetLeft); GM_setValue('y', box.offsetTop); } drag = false; };
        box.onclick = () => {
            if (!moved) {
                if (menu.style.display !== 'flex') {
                    const rect = box.getBoundingClientRect();
                    const isBottom = rect.top > window.innerHeight / 2;
                    const isRight = rect.left > window.innerWidth / 2;

                    menu.className = 'ai-export-menu-panel';
                    if (isBottom && isRight) menu.classList.add('pos-bottom-right');
                    else if (isBottom && !isRight) menu.classList.add('pos-bottom-left');
                    else if (!isBottom && isRight) menu.classList.add('pos-top-right');
                    else if (!isBottom && !isRight) menu.classList.add('pos-top-left');

                    menu.style.display = 'flex';
                } else {
                    menu.style.display = 'none';
                }
            }
        };
        document.addEventListener("click", (e) => { if (!box.contains(e.target)) menu.style.display = 'none'; });
    }

    if (typeof trustedTypes !== "undefined" && trustedTypes.defaultPolicy === null) {
        trustedTypes.createPolicy("default", { createHTML: s => s, createScriptURL: s => s, createScript: s => s });
    }
    setTimeout(init, 1000);
    setInterval(init, 3000);
})();